summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTenPlus1 <kinsellaja@yahoo.com>2018-09-05 10:33:17 +0100
committerTenPlus1 <kinsellaja@yahoo.com>2018-09-05 10:33:17 +0100
commit9737bde6fb57f0e7481cff1c8052a0997ef24ede (patch)
tree68c52e4430edc0c79466ca368a5d055d2a71f69b
parent082bf0cf86c50d9d3cef2e0f8111111d3b745b81 (diff)
tweak mob damage function, add {fire=1} weapon damage check
-rw-r--r--api.lua157
-rw-r--r--api.txt1
2 files changed, 69 insertions, 89 deletions
diff --git a/api.lua b/api.lua
index ae50e3e..f628cde 100644
--- a/api.lua
+++ b/api.lua
@@ -6,7 +6,7 @@ local use_cmi = minetest.global_exists("cmi")
mobs = {
mod = "redo",
- version = "20180904",
+ version = "20180905",
intllib = S,
invis = minetest.global_exists("invisibility") and invisibility or {},
}
@@ -2292,19 +2292,16 @@ local tr = minetest.get_modpath("toolranks")
-- deal damage and effects when mob punched
local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
- -- custom punch function
- if self.do_punch then
-
- -- when false skip going any further
- if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then
- return
- end
+ -- mob health check
+ if self.health <= 0 then
+ return
end
- -- mob health check
--- if self.health <= 0 then
--- return
--- end
+ -- custom punch function
+ if self.do_punch
+ and self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then
+ return
+ end
-- error checking when mod profiling is enabled
if not tool_capabilities then
@@ -2319,9 +2316,8 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
return
end
-
- -- weapon wear
local weapon = hitter:get_wielded_item()
+ local weapon_def = weapon:get_definition() or {}
local punch_interval = 1.4
-- calculate mob damage
@@ -2356,7 +2352,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
-- check for tool immunity or special damage
for n = 1, #self.immune_to do
- if self.immune_to[n][1] == weapon:get_name() then
+ if self.immune_to[n][1] == weapon_def.name then
damage = self.immune_to[n][2] or 0
break
@@ -2375,67 +2371,57 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
-- print ("Mob Damage is", damage)
- if use_cmi then
-
- local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage)
-
- if cancel then return end
+ if use_cmi
+ and cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) then
+ return
end
-- add weapon wear
- if tool_capabilities then
- punch_interval = tool_capabilities.full_punch_interval or 1.4
- end
-
- if weapon:get_definition()
- and weapon:get_definition().tool_capabilities then
+ punch_interval = tool_capabilities.full_punch_interval or 1.4
- -- toolrank support
- local wear = floor((punch_interval / 75) * 9000)
+ -- toolrank support
+ local wear = floor((punch_interval / 75) * 9000)
- if mobs.is_creative(hitter:get_player_name()) then
-
- if tr then
- wear = 1
- else
- wear = 0
- end
- end
+ if mobs.is_creative(hitter:get_player_name()) then
if tr then
- if weapon:get_definition()
- and weapon:get_definition().original_description then
- weapon:add_wear(toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}))
- end
+ wear = 1
else
- weapon:add_wear(wear)
+ wear = 0
end
+ end
- hitter:set_wielded_item(weapon)
+ if tr then
+ if weapon_def.original_description then
+ weapon:add_wear(toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}))
+ end
+ else
+ weapon:add_wear(wear)
end
+ hitter:set_wielded_item(weapon)
+
-- only play hit sound and show blood effects if damage is 1 or over
if damage >= 1 then
-- weapon sounds
- if weapon:get_definition().sounds ~= nil then
+ if weapon_def.sounds then
- local s = random(0, #weapon:get_definition().sounds)
+ local s = random(0, #weapon_def.sounds)
- minetest.sound_play(weapon:get_definition().sounds[s], {
- object = self.object, --hitter,
+ minetest.sound_play(weapon_def.sounds[s], {
+ object = self.object,
max_hear_distance = 8
})
else
minetest.sound_play("default_punch", {
- object = self.object, --hitter,
+ object = self.object,
max_hear_distance = 5
})
end
-- blood_particles
- if self.blood_amount > 0
- and not disable_blood then
+ if not disable_blood and self.blood_amount > 0 then
local pos = self.object:get_pos()
@@ -2455,17 +2441,13 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
-- do damage
self.health = self.health - floor(damage)
- -- exit here if dead, special item check
- if weapon:get_name() == "mobs:pick_lava" then
- if check_for_death(self, "hit", {type = "punch",
- puncher = hitter, hot = true}) then
- return
- end
- else
- if check_for_death(self, "hit", {type = "punch",
- puncher = hitter}) then
- return
- end
+ -- exit here if dead, check for tools with fire damage
+ local hot = tool_capabilities and tool_capabilities.damage_groups
+ and tool_capabilities.damage_groups.fire
+
+ if check_for_death(self, "hit", {type = "punch",
+ puncher = hitter, hot = hot}) then
+ return
end
--[[ add healthy afterglow when hit (can cause hit lag with larger textures)
@@ -2480,43 +2462,40 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
end)
end) ]]
- -- knock back effect (only on full punch)
- if self.knock_back
- and tflp >= punch_interval then
+ end -- END if damage
- local v = self.object:get_velocity()
- local r = 1.4 - min(punch_interval, 1.4)
- local kb = r * 5
- local up = 2
+ -- knock back effect (only on full punch)
+ if self.knock_back
+ and tflp >= punch_interval then
- -- if already in air then dont go up anymore when hit
- if v.y > 0
- or self.fly then
- up = 0
- end
+ local v = self.object:get_velocity()
+ local kb = damage or 1
+ local up = 2
- -- direction error check
- dir = dir or {x = 0, y = 0, z = 0}
+ -- if already in air then dont go up anymore when hit
+ if v.y > 0
+ or self.fly then
+ up = 0
+ end
- -- check if tool already has specific knockback value
- if tool_capabilities.damage_groups["knockback"] then
- kb = tool_capabilities.damage_groups["knockback"]
- else
- kb = kb * 1.5
- end
+ -- direction error check
+ dir = dir or {x = 0, y = 0, z = 0}
- self.object:set_velocity({
- x = dir.x * kb,
- y = up,
- z = dir.z * kb
- })
+ -- use tool knockback value or default
+ kb = tool_capabilities.damage_groups["knockback"] or (kb * 1.5)
- self.pause_timer = 0.25
- end
- end -- END if damage
+ self.object:set_velocity({
+ x = dir.x * kb,
+ y = up,
+ z = dir.z * kb
+ })
+
+ self.pause_timer = 0.25
+ end
-- if skittish then run away
- if self.runaway == true then
+ if self.runaway == true
+ and self.order ~= "stand" then
local lp = hitter:get_pos()
local s = self.object:get_pos()
diff --git a/api.txt b/api.txt
index 707417b..4ac5d49 100644
--- a/api.txt
+++ b/api.txt
@@ -148,6 +148,7 @@ functions needed for the mob to work properly which contains the following:
'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc.
'min' minimum number of items dropped, set to 0 for rare drops.
'max' maximum number of items dropped.
+ Note: If weapon has {fire=1} damage group set then cooked items will drop.
'visual' holds the look of the mob you wish to create:
'cube' looks like a normal node