dungeon/mods/mobf/mgen_jordan4ibanez/mgen_jordan4ibanez.lua

139 lines
5.6 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 main_follow.lua
--! @brief component containing a movement generator based uppon jordan4ibanez code
--! @copyright Sapier
--! @author Sapier
--! @date 2012-08-09
--
--! @defgroup mgen_jordan4ibanez MGEN: a velocity based movement generator
--! @brief A movement generator creating simple random movement
--! @ingroup framework_int
--! @{
-- Contact sapier a t gmx net
-------------------------------------------------------------------------------
--! @class mgen_jordan4ibanez
--! @brief a movement generator trying to follow or reach a target
mgen_jordan4ibanez = {}
mgen_jordan4ibanez.chillaxin_speed = 0.1
--!@}
--! @brief movement generator identifier
--! @memberof mgen_jordan4ibanez
mgen_jordan4ibanez.name = "jordan4ibanez_mov_gen"
-------------------------------------------------------------------------------
-- name: callback(entity,now)
--
--! @brief main callback to make a mob follow its target
--! @memberof mgen_jordan4ibanez
--
--! @param entity mob to generate movement for
--! @param now current time
-------------------------------------------------------------------------------
function mgen_jordan4ibanez.callback(entity,now)
--update timers
entity.dynamic_data.movement.timer = entity.dynamic_data.movement.timer + 0.01
entity.dynamic_data.movement.turn_timer = entity.dynamic_data.movement.turn_timer + 0.01
entity.dynamic_data.movement.jump_timer = entity.dynamic_data.movement.jump_timer + 0.01
entity.dynamic_data.movement.door_timer = entity.dynamic_data.movement.door_timer + 0.01
if entity.dynamic_data.movement.direction ~= nil then
entity.object:setvelocity({x=entity.dynamic_data.movement.direction.x*mgen_jordan4ibanez.chillaxin_speed,
y=entity.object:getvelocity().y,
z=entity.dynamic_data.movement.direction.z*mgen_jordan4ibanez.chillaxin_speed})
end
if entity.dynamic_data.movement.turn_timer > math.random(1,4) then
entity.dynamic_data.movement.yaw = 360 * math.random()
entity.object:setyaw(entity.dynamic_data.movement.yaw)
entity.dynamic_data.movement.turn_timer = 0
entity.dynamic_data.movement.direction = {x = math.sin(entity.dynamic_data.movement.yaw)*-1,
y = -10,
z = math.cos(entity.dynamic_data.movement.yaw)}
--entity.object:setvelocity({x=entity.dynamic_data.movement.direction.x,y=entity.object:getvelocity().y,z=entity.dynamic_data.movement.direction.z})
--entity.object:setacceleration(entity.dynamic_data.movement.direction)
end
--TODO update animation
--open a door [alpha]
if entity.dynamic_data.movement.direction ~= nil then
if entity.dynamic_data.movement.door_timer > 2 then
local is_a_door = minetest.env:get_node({x=entity.object:getpos().x + entity.dynamic_data.movement.direction.x,
y=entity.object:getpos().y,z=entity.object:getpos().
z + entity.dynamic_data.movement.direction.z}).name
if is_a_door == "doors:door_wood_t_1" then
minetest.env:punch_node({x=entity.object:getpos().x + entity.dynamic_data.movement.direction.x,
y=entity.object:getpos().y-1,
z=entity.object:getpos().z + entity.dynamic_data.movement.direction.z})
entity.dynamic_data.movement.door_timer = 0
end
local is_in_door = minetest.env:get_node(entity.object:getpos()).name
if is_in_door == "doors:door_wood_t_1" then
minetest.env:punch_node(entity.object:getpos())
end
end
end
--jump
if entity.dynamic_data.movement.direction ~= nil then
if entity.dynamic_data.movement.jump_timer > 0.3 then
if minetest.registered_nodes[minetest.env:get_node({x=entity.object:getpos().x + entity.dynamic_data.movement.direction.x,
y=entity.object:getpos().y-1,
z=entity.object:getpos().z + entity.dynamic_data.movement.direction.z}).name].walkable then
entity.object:setvelocity({x=entity.object:getvelocity().x,y=5,z=entity.object:getvelocity().z})
entity.dynamic_data.movement.jump_timer = 0
end
end
end
end
-------------------------------------------------------------------------------
-- name: initialize()
--
--! @brief initialize movement generator
--! @memberof mgen_jordan4ibanez
--! @public
-------------------------------------------------------------------------------
function mgen_jordan4ibanez.initialize(entity,now)
--intentionaly doing nothing this function is for symmetry reasons only
end
-------------------------------------------------------------------------------
-- name: init_dynamic_data(entity,now)
--
--! @brief initialize dynamic data required by movement generator
--! @memberof mgen_jordan4ibanez
--! @public
--
--! @param entity mob to initialize dynamic data
--! @param now current time
-------------------------------------------------------------------------------
function mgen_jordan4ibanez.init_dynamic_data(entity,now)
local data = {
timer = 0,
turn_timer = 0,
jump_timer = 0,
door_timer = 0,
direction = nil,
yaw = nil,
orientation_fix_needed = false,
}
entity.dynamic_data.movement = data
end
--register this movement generator
registerMovementGen(mgen_jordan4ibanez.name,mgen_jordan4ibanez)