2024-12-09 16:32:23 -06:00

109 lines
3.0 KiB
Lua

PyuTest.deal_damage = function(target, damage, reason)
local hp = target:get_hp()
if hp > 0 then
target:set_hp(hp - damage, reason)
end
end
local function custom_damage(table)
return {
type = "set_hp",
_pyutest = table or {
type = "unknown"
}
}
end
PyuTest.DAMAGE_TYPES = {
explosion = function (range)
return custom_damage{
type = "explosion",
range = range
}
end,
fireworks = function ()
return custom_damage{
type = "fireworks",
}
end,
burning = function ()
return custom_damage{
type = "burning"
}
end,
projectile = function (projectile, shooter)
local name
local entity = shooter:get_luaentity()
if entity ~= nil then
name = entity:get_properties().nametag
else
name = shooter:get_player_name()
end
return custom_damage{
type = "projectile",
projectile = projectile,
owner = name
}
end,
magic = function ()
return custom_damage{
type = "magic",
}
end
}
PyuTest.mt_damage_to_pyutest_damage = function(reason)
return reason._pyutest or reason
end
core.register_on_dieplayer(function(player, reason)
local playername = player:get_player_name()
local message = string.format("%s died", playername)
if reason.type == "fall" then
message = string.format("%s fell from a high place", playername)
elseif reason.type == "drown" then
message = string.format("%s drowned", playername)
elseif reason.type == "respawn" then
return
elseif reason.type == "punch" then
local entity = reason.object:get_luaentity()
if entity ~= nil then
local name = reason.object:get_properties().nametag
if name == "" then
name = "an unnamed monster!"
end
message = string.format("%s was slain by %s", playername, name)
elseif reason.object:is_player() then
local name = reason.object:get_player_name()
message = string.format("%s was slain by %s", playername, name)
end
elseif reason.type == "set_hp" then
local newreason = PyuTest.mt_damage_to_pyutest_damage(reason)
if newreason.type == "explosion" then
message = string.format("%s blew up", playername)
elseif newreason.type == "fireworks" then
message = string.format("%s went off with a bang", playername)
elseif newreason.type == "burning" then
message = string.format("%s burned to death", playername)
elseif newreason.type == "projectile" then
local p = newreason.owner or newreason.projectile
if p ~= nil then
message = string.format("%s was shot by %s", playername, p)
else
message = string.format("%s was shot by something", playername)
end
elseif newreason.type == "magic" then
message = string.format("%s was killed by magic", playername)
end
elseif reason.type == "node_damage" then
local desc = core.registered_nodes[reason.node].description or "a block"
message = string.format("%s was killed by %s", playername, desc)
end
core.chat_send_all(message)
end)