forked from minetest/minetest_game
39e4bf0346
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
108 lines
3.2 KiB
Lua
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
|