minetest_game/mods/default/player.lua
MirceaKitsune 39e4bf0346 Get player walking and standing animations working! The player will play the proper animation when walking or standing.
Also get the mine animation working when holding the left mouse button. Walk animations have priority over it, and sadly you can't play both at the same time

Set initial player animation to stand
2012-11-25 21:02:01 +02:00

108 lines
3.2 KiB
Lua

-- Minetest 0.4 mod: player
-- See README.txt for licensing and other information.
-- Animation speed
animation_speed = 30
-- Animation blending
-- Note: This is currently broken due to a bug in Irrlicht, leave at 0
animation_blend = 0
-- Default player appearance
default_model = "character.x"
default_texture = "character.png"
-- Player states
local player_model = {}
local player_anim = {}
local ANIM_STAND = 0
local ANIM_WALK_FORWARD = 1
local ANIM_WALK_BACKWARD = 2
local ANIM_WALK_LEFT = 3
local ANIM_WALK_RIGHT = 4
local ANIM_MINE = 5
local ANIM_DEATH = 6
-- Frame ranges for each player model
function player_get_animations(model)
if model == "character.x" then
return {
stand_START = 0,
stand_END = 79,
walk_forward_START = 81,
walk_forward_END = 100,
walk_backward_START = 102,
walk_backward_END = 121,
walk_right_START = 123,
walk_right_END = 142,
walk_left_START = 144,
walk_left_END = 163,
mine_START = 165,
mine_END = 179,
death_START = 181,
death_END = 200
}
end
end
-- Called whenever a player's appearance needs to be updated
function player_update_visuals(player)
player_model[player:get_player_name()] = default_model
player_anim[player:get_player_name()] = ANIM_STAND
local name = player:get_player_name()
local anim = player_get_animations(player_model[name])
prop = {
mesh = default_model,
textures = {default_texture, },
visual = "mesh",
visual_size = {x=1, y=1},
}
player:set_properties(prop)
player:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed, animation_blend) -- initial animation
end
-- Update appearance when the player joins
minetest.register_on_joinplayer(player_update_visuals)
-- Global environment step function
function on_step(dtime)
for _, pl in pairs(minetest.get_connected_players()) do
local name = pl:get_player_name()
local anim = player_get_animations(player_model[name])
local controls = pl:get_player_control()
if controls.up then
if player_anim[name] ~= ANIM_WALK_FORWARD then
pl:set_animation({x=anim.walk_forward_START, y=anim.walk_forward_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_WALK_FORWARD
end
elseif controls.down then
if player_anim[name] ~= ANIM_WALK_BACKWARD then
pl:set_animation({x=anim.walk_backward_START, y=anim.walk_backward_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_WALK_BACKWARD
end
elseif controls.left then
if player_anim[name] ~= ANIM_WALK_LEFT then
pl:set_animation({x=anim.walk_left_START, y=anim.walk_left_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_WALK_LEFT
end
elseif controls.right then
if player_anim[name] ~= ANIM_WALK_RIGHT then
pl:set_animation({x=anim.walk_right_START, y=anim.walk_right_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_WALK_RIGHT
end
elseif controls.LMB then
if player_anim[name] ~= ANIM_MINE then
pl:set_animation({x=anim.mine_START, y=anim.mine_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_MINE
end
elseif player_anim[name] ~= ANIM_WALK_STAND then
pl:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed, animation_blend)
player_anim[name] = ANIM_WALK_STAND
end
end
end
minetest.register_globalstep(on_step)
-- END