added new explosion mob functionality (thanks to Yukitty)

This commit is contained in:
TenPlus1 2018-03-12 11:32:21 +00:00
parent 2109814805
commit 609d52100c
2 changed files with 48 additions and 12 deletions

44
api.lua
View File

@ -1798,7 +1798,7 @@ local do_states = function(self, dtime)
local p = self.attack:get_pos() or s local p = self.attack:get_pos() or s
local dist = get_distance(p, 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 if dist > self.view_range
or not self.attack or not self.attack
or not self.attack:get_pos() or not self.attack:get_pos()
@ -1830,16 +1830,35 @@ local do_states = function(self, dtime)
yaw = set_yaw(self.object, yaw) yaw = set_yaw(self.object, yaw)
-- start timer when inside reach local node_break_radius = self.explosion_radius or 1
if dist < self.reach and not self.v_start then 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.v_start = true
self.timer = 0 self.timer = 0
self.blinktimer = 0 self.blinktimer = 0
mob_sound(self, self.sounds.fuse)
-- print ("=== explosion timer started", self.explosion_timer) -- 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 end
-- walk right up to player when timer active -- 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) set_velocity(self, 0)
else else
set_velocity(self, self.run_velocity) set_velocity(self, self.run_velocity)
@ -1851,7 +1870,8 @@ local do_states = function(self, dtime)
set_animation(self, "walk") set_animation(self, "walk")
end 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.timer = self.timer + dtime
self.blinktimer = (self.blinktimer or 0) + 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 if self.timer > self.explosion_timer then
local pos = self.object:get_pos() 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 -- dont damage anything if area protected or next to water
if minetest.find_node_near(pos, 1, {"group:water"}) if minetest.find_node_near(pos, 1, {"group:water"})
or minetest.is_protected(pos, "") then or minetest.is_protected(pos, "") then
damage_radius = 0 damage_radius = 0
node_break_radius = 0
end end
self.object:remove() self.object:remove()
@ -1890,8 +1909,8 @@ local do_states = function(self, dtime)
and not minetest.is_protected(pos, "") then and not minetest.is_protected(pos, "") then
tnt.boom(pos, { tnt.boom(pos, {
radius = radius, radius = node_break_radius,
damage_radius = damage_radius, damage_radius = entity_damage_radius,
sound = self.sounds.explode, sound = self.sounds.explode,
}) })
else else
@ -1902,8 +1921,8 @@ local do_states = function(self, dtime)
max_hear_distance = self.sounds.distance or 32 max_hear_distance = self.sounds.distance or 32
}) })
entity_physics(pos, damage_radius) entity_physics(pos, entity_damage_radius)
effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0)
end end
return return
@ -2889,7 +2908,10 @@ minetest.register_entity(name, {
pathfinding = def.pathfinding, pathfinding = def.pathfinding,
immune_to = def.immune_to or {}, immune_to = def.immune_to or {},
explosion_radius = def.explosion_radius, explosion_radius = def.explosion_radius,
explosion_damage_radius = def.explosion_damage_radius,
explosion_timer = def.explosion_timer or 3, 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, custom_attack = def.custom_attack,
double_melee_attack = def.double_melee_attack, double_melee_attack = def.double_melee_attack,
dogshoot_switch = def.dogshoot_switch, dogshoot_switch = def.dogshoot_switch,

16
api.txt
View File

@ -86,7 +86,20 @@ functions needed for the mob to work properly which contains the following:
view_range. view_range.
'dogshoot' has melee attack when inside reach and shoot attack 'dogshoot' has melee attack when inside reach and shoot attack
when inside view_range. 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_radius' has the radius of the explosion which defaults to 1.
'explosion_timer' number of seconds before mob explodes while still 'explosion_timer' number of seconds before mob explodes while still
inside view range. 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. 'damage' sound heard when mob is hurt.
'death' played when mob is killed. 'death' played when mob is killed.
'jump' played when mob jumps. 'jump' played when mob jumps.
'fuse' sound played when mob explode timer starts.
'explode' sound played when mob explodes. 'explode' sound played when mob explodes.
'drops' table of items that are dropped when mob is killed, fields are: 'drops' table of items that are dropped when mob is killed, fields are: