dungeon/mods/mobf/harvesting.lua

220 lines
6.7 KiB
Lua

-------------------------------------------------------------------------------
-- Mob Framework Mod by Sapier
--
-- You may copy, use, modify or do nearly anything except removing this
-- copyright notice.
-- And of course you are NOT allow to pretend you have written it.
--
--! @file harvesting.lua
--! @brief component for all harvesting related mob features
--! @copyright Sapier
--! @author Sapier
--! @date 2012-08-09
--
--! @defgroup harvesting Harvesting subcomponent
--! @brief Component handling harvesting
--! @ingroup framework_int
--! @{
-- Contact sapier a t gmx net
-------------------------------------------------------------------------------
--! @class harvesting
--! @brief harvesting features
harvesting = {}
--!@}
-------------------------------------------------------------------------------
-- name: init_dynamic_data(entity,now)
--
--! @brief initialize dynamic data required by harvesting
--! @memberof harvesting
--
--! @param entity mob to initialize harvest dynamic data
--! @param now current time
-------------------------------------------------------------------------------
function harvesting.init_dynamic_data(entity,now)
dbg_mobf.harvesting_lvl1("MOBF: " .. entity.data.name
.. " initializing harvesting dynamic data")
local data = {
ts_last = now,
}
entity.dynamic_data.harvesting = data
end
-------------------------------------------------------------------------------
-- name: callback(entity,player,now)
--
--! @brief callback handler for harvest by player
--! @memberof harvesting
--
--! @param entity mob being harvested
--! @param player player harvesting
--! @param now the current time
--! @return true/false if handled by harvesting or not
-------------------------------------------------------------------------------
function harvesting.callback(entity,player,now)
dbg_mobf.harvesting_lvl1("MOBF: harvest function called")
local now = mobf_get_current_time()
--handle catching of mob
if entity.data.catching ~= nil and
entity.data.catching.tool ~= "" then
-- what's wielded by player
local tool = player:get_wielded_item()
if tool:get_name() == entity.data.catching.tool then
dbg_mobf.harvesting_lvl1("MOBF: player wearing ".. entity.data.catching.tool)
--play catch sound
if entity.data.sound ~= nil then
sound.play(entity.object:getpos(),entity.data.sound.catch);
end
if entity.data.catching.consumed == true then
if player:get_inventory():contains_item("main",entity.data.catching.tool.." 1") then
dbg_mobf.harvesting_lvl2("MOBF: removing: "
.. entity.data.catching.tool.." 1")
player:get_inventory():remove_item("main",
entity.data.catching.tool.." 1")
else
mobf_bug_warning(LOGLEVEL_ERROR,"MOBF: BUG!!! player is"
.. " wearing a item he doesn't have in inventory!!!")
--handled but not ok so don't attack
return true
end
end
if entity.data.generic.addoncatch ~= nil then
player:get_inventory():add_item("main",
entity.data.generic.addoncatch.." 1")
else
player:get_inventory():add_item("main",
entity.data.modname ..":"..entity.data.name.." 1")
end
spawning.remove(entity, "cought")
return true
end
end
--handle harvestable mobs, check if player is wearing correct tool
if entity.data.harvest ~= nil then
dbg_mobf.harvesting_lvl1("MOBF: trying to harvest harvestable mob")
if (entity.data.harvest.tool ~= "") then
local tool = player:get_wielded_item()
if tool ~= nil then
dbg_mobf.harvesting_lvl1("MOBF: Player is wearing >"
.. tool:get_name() .. "< required is >".. entity.data.harvest.tool
.. "< wear: " .. tool:get_wear())
if (tool:get_name() ~= entity.data.harvest.tool) then
--player is wearing wrong tool do an attack
return false
else
--tool is completely consumed
if entity.data.harvest.tool_consumed == true then
if player:get_inventory():contains_item("main",entity.data.harvest.tool.." 1") == false then
dbg_mobf.harvesting_lvl1("MOBF: Player doesn't have"
.. " at least 1 of ".. entity.data.harvest.tool)
--handled but not ok so don't attack
return true
end
else
--damage tool
local tool_wear = tool:get_wear()
dbg_mobf.harvesting_lvl1("MOBF: tool " .. tool:get_name()
.. " wear: " .. tool_wear)
-- damage used tool
if tool_wear ~= nil and
entity.data.harvest.max_tool_usage ~= nil then
local todamage = (65535/entity.data.harvest.max_tool_usage)
dbg_mobf.harvesting_lvl1("MOBF: tool damage calculated: "
.. todamage);
if tool:add_wear(todamage) ~= true then
dbg_mobf.harvesting_lvl3("MOBF: Tried to damage non tool item "
.. tool:get_name() .. "!");
end
player:set_wielded_item(tool)
end
end
end
else
--player isn't wearing a tool so this has to be an attack
return false
end
else
--no havest tool defined so this has to be an attack
return false
end
--transformation and harvest delay is exclusive
--harvest delay mode
if entity.data.harvest.min_delay < 0 or
entity.dynamic_data.harvesting.ts_last + entity.data.harvest.min_delay < now then
player:get_inventory():add_item("main", entity.data.harvest.result.." 1")
--check if tool is consumed by action
if entity.data.harvest.tool_consumed then
dbg_mobf.harvesting_lvl2("MOBF: removing "
..entity.data.harvest.tool.." 1")
player:get_inventory():remove_item("main",entity.data.harvest.tool.." 1")
end
else
dbg_mobf.harvesting_lvl1("MOBF: " .. entity.data.name
.. " not ready to be harvested")
end
-- check if mob is transformed by harvest
if entity.data.harvest.transforms_to ~= "" then
local transformed = spawning.replace_entity(entity,
entity.data.harvest.transforms_to)
else
entity.dynamic_data.harvesting.ts_last = mobf_get_current_time()
end
--play harvest sound
if entity.data.sound ~= nil then
sound.play(entity.object:getpos(),entity.data.sound.harvest);
end
--harvest done
return true
end
return false
end
-------------------------------------------------------------------------------
-- name: transform(entity)
--
--! @brief self transform callback for mob
--! @ingroup harvesting
--
--! @param entity mob calling
--! @param now current time
-------------------------------------------------------------------------------
function transform(entity,now)
--check if it's a transformable mob
if entity.data.auto_transform ~= nil then
if now - entity.dynamic_data.spawning.original_spawntime
> entity.data.auto_transform.delay then
spawning.replace_entity(entity,entity.data.auto_transform.result)
end
end
end