mirror of
https://codeberg.org/tenplus1/mobs_redo.git
synced 2024-12-24 01:30:22 +01:00
added new explosion mob functionality (thanks to Yukitty)
This commit is contained in:
parent
2109814805
commit
609d52100c
44
api.lua
44
api.lua
@ -1798,7 +1798,7 @@ local do_states = function(self, dtime)
|
||||
local p = self.attack:get_pos() or s
|
||||
local dist = get_distance(p, s)
|
||||
|
||||
-- stop attacking if player or out of range
|
||||
-- stop attacking if player invisible or out of range
|
||||
if dist > self.view_range
|
||||
or not self.attack
|
||||
or not self.attack:get_pos()
|
||||
@ -1830,16 +1830,35 @@ local do_states = function(self, dtime)
|
||||
|
||||
yaw = set_yaw(self.object, yaw)
|
||||
|
||||
-- start timer when inside reach
|
||||
if dist < self.reach and not self.v_start then
|
||||
local node_break_radius = self.explosion_radius or 1
|
||||
local entity_damage_radius = self.explosion_damage_radius
|
||||
or (node_break_radius * 2)
|
||||
|
||||
-- start timer when in reach and line of sight
|
||||
if not self.v_start
|
||||
and dist <= self.reach
|
||||
and line_of_sight(self, s, p, 2) then
|
||||
|
||||
self.v_start = true
|
||||
self.timer = 0
|
||||
self.blinktimer = 0
|
||||
mob_sound(self, self.sounds.fuse)
|
||||
-- print ("=== explosion timer started", self.explosion_timer)
|
||||
|
||||
-- stop timer if out of blast radius or direct line of sight
|
||||
elseif self.allow_fuse_reset
|
||||
and self.v_start
|
||||
and (dist > max(self.reach, entity_damage_radius) + 0.5
|
||||
or not line_of_sight(self, s, p, 2)) then
|
||||
self.v_start = false
|
||||
self.timer = 0
|
||||
self.blinktimer = 0
|
||||
self.blinkstatus = false
|
||||
self.object:settexturemod("")
|
||||
end
|
||||
|
||||
-- walk right up to player when timer active
|
||||
if dist < 1.5 and self.v_start then
|
||||
if dist < 1.5 then
|
||||
set_velocity(self, 0)
|
||||
else
|
||||
set_velocity(self, self.run_velocity)
|
||||
@ -1851,7 +1870,8 @@ local do_states = function(self, dtime)
|
||||
set_animation(self, "walk")
|
||||
end
|
||||
|
||||
if self.v_start then
|
||||
-- walk right up to player unless the timer is active
|
||||
if self.v_start and (self.stop_to_explode or dist < 1.5) then
|
||||
|
||||
self.timer = self.timer + dtime
|
||||
self.blinktimer = (self.blinktimer or 0) + dtime
|
||||
@ -1874,14 +1894,13 @@ local do_states = function(self, dtime)
|
||||
if self.timer > self.explosion_timer then
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
local radius = self.explosion_radius or 1
|
||||
local damage_radius = radius
|
||||
|
||||
-- dont damage anything if area protected or next to water
|
||||
if minetest.find_node_near(pos, 1, {"group:water"})
|
||||
or minetest.is_protected(pos, "") then
|
||||
|
||||
damage_radius = 0
|
||||
node_break_radius = 0
|
||||
end
|
||||
|
||||
self.object:remove()
|
||||
@ -1890,8 +1909,8 @@ local do_states = function(self, dtime)
|
||||
and not minetest.is_protected(pos, "") then
|
||||
|
||||
tnt.boom(pos, {
|
||||
radius = radius,
|
||||
damage_radius = damage_radius,
|
||||
radius = node_break_radius,
|
||||
damage_radius = entity_damage_radius,
|
||||
sound = self.sounds.explode,
|
||||
})
|
||||
else
|
||||
@ -1902,8 +1921,8 @@ local do_states = function(self, dtime)
|
||||
max_hear_distance = self.sounds.distance or 32
|
||||
})
|
||||
|
||||
entity_physics(pos, damage_radius)
|
||||
effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0)
|
||||
entity_physics(pos, entity_damage_radius)
|
||||
effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0)
|
||||
end
|
||||
|
||||
return
|
||||
@ -2889,7 +2908,10 @@ minetest.register_entity(name, {
|
||||
pathfinding = def.pathfinding,
|
||||
immune_to = def.immune_to or {},
|
||||
explosion_radius = def.explosion_radius,
|
||||
explosion_damage_radius = def.explosion_damage_radius,
|
||||
explosion_timer = def.explosion_timer or 3,
|
||||
allow_fuse_reset = def.allow_fuse_reset or true,
|
||||
stop_to_explode = def.stop_to_explode or true,
|
||||
custom_attack = def.custom_attack,
|
||||
double_melee_attack = def.double_melee_attack,
|
||||
dogshoot_switch = def.dogshoot_switch,
|
||||
|
16
api.txt
16
api.txt
@ -86,7 +86,20 @@ functions needed for the mob to work properly which contains the following:
|
||||
view_range.
|
||||
'dogshoot' has melee attack when inside reach and shoot attack
|
||||
when inside view_range.
|
||||
'explode' causes mob to explode when inside reach.
|
||||
'explode' causes mob to stop and explode when inside reach.
|
||||
'explosion_radius' the radius of explosion node destruction,
|
||||
defaults to 1
|
||||
'explosion_damage_radius' the radius of explosion entity & player damage,
|
||||
defaults to explosion_radius * 2
|
||||
'explosion_timer' number of seconds before mob explodes while its target
|
||||
is still inside reach or explosion_damage_radius,
|
||||
defaults to 3.
|
||||
'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume
|
||||
chasing if target leaves the blast radius or line of
|
||||
sight. Defaults to true.
|
||||
'stop_to_explode' When set to true (default), mob must stop and wait for
|
||||
explosion_timer in order to explode. If false, mob will
|
||||
continue chasing.
|
||||
'explosion_radius' has the radius of the explosion which defaults to 1.
|
||||
'explosion_timer' number of seconds before mob explodes while still
|
||||
inside view range.
|
||||
@ -129,6 +142,7 @@ functions needed for the mob to work properly which contains the following:
|
||||
'damage' sound heard when mob is hurt.
|
||||
'death' played when mob is killed.
|
||||
'jump' played when mob jumps.
|
||||
'fuse' sound played when mob explode timer starts.
|
||||
'explode' sound played when mob explodes.
|
||||
|
||||
'drops' table of items that are dropped when mob is killed, fields are:
|
||||
|
Loading…
Reference in New Issue
Block a user