Repixture/mods/rp_mobs/capture.lua
2024-02-22 19:33:37 +01:00

91 lines
2.8 KiB
Lua

-- TODO: Change to rp_mobs when ready
local S = minetest.get_translator("mobs")
local capture_tools = {}
rp_mobs.register_capture_tool = function(toolname, def)
capture_tools[toolname] = { uses = def.tool_uses, sound = def.sound, sound_gain = def.sound_gain, sound_max_hear_distance = def.sound_max_hear_distance }
end
rp_mobs.call_on_capture = function(self, capturer)
if not capturer:is_player() or not rp_mobs.is_alive(self) then
return false
end
if self._on_capture then
return self._on_capture(self, capturer)
else
minetest.log("error", "[rp_mobs] rp_mobs.call_on_capture called for mob of type '"..self.name.."' but it has no _on_capture function!")
return false
end
end
rp_mobs.attempt_capture = function(self, clicker, capture_chances, force_take, replace_with)
if clicker:is_player() and clicker:get_inventory() and not self._child and rp_mobs.is_alive(self) then
local mobname = self.name
-- Change what item will be added to inventory
if replace_with then
mobname = replace_with
end
-- Using a capture tool?
local name = clicker:get_player_name()
local tool = clicker:get_wielded_item()
local toolname = tool:get_name()
if not (capture_tools[toolname]) then
return
end
-- Is mob tamed?
if self._tamed == false and force_take == false then
minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Not tamed!")))
return
end
local chance = capture_chances[toolname]
local ctoolinfo = capture_tools[toolname]
if not chance then
return
end
local pitch = 1 + math.random(-100, 100)*0.0005
minetest.sound_play(ctoolinfo.sound, {
object = clicker,
gain = ctoolinfo.sound_gain,
max_hear_distance = ctoolinfo.sound_max_hear_distance,
pitch = pitch}, true)
if not minetest.is_creative_enabled(name) and ctoolinfo.uses ~= nil and ctoolinfo.uses ~= 0 then
tool:add_wear_by_uses(ctoolinfo.uses)
end
clicker:set_wielded_item(tool)
-- Fail if 0 chance
if chance == 0 then
minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Missed!")))
return
end
-- Calculate chance ... was capture successful?
if math.random(100) <= chance then
minetest.sound_play("mobs_capture_succeed", {
pos = clicker:get_pos(),
gain = 0.2, max_hear_distance = 16}, true)
-- Successful capture ... add to inventory
if clicker:get_inventory():room_for_item("main", mobname) then
clicker:get_inventory():add_item("main", mobname)
else
-- or drop as item entity if no room
minetest.add_item(self.object:get_pos(), mobname)
end
minetest.log("action", "[rp_mobs] Mob of type '"..self.name.."' captured by " .. name .. " at "..minetest.pos_to_string(self.object:get_pos(), 1))
self.object:remove()
achievements.trigger_achievement(clicker, "ranger")
return
else
minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Missed!")))
end
end
end