player_api/mods/default/player.lua
MirceaKitsune 91da5d1308 Model - Get rid of the 4 walk animations and only leave one, which looks good for all directions. Also add a Walk + Mine animation, since Irrlicht doesn't support blending the two animations otherwise
Update player script to match the animations in the previous commit

Shorten the still mine animation so the hand matches the speed of the walk-mine animation

Reduce animation speed to half when sneaking
2012-11-25 21:02:01 +02:00

114 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 player_sneak = {}
local ANIM_STAND = 0
local ANIM_WALK = 1
local ANIM_WALK_MINE = 2
local ANIM_MINE = 3
local ANIM_DEATH = 4
-- Frame ranges for each player model
function player_get_animations(model)
if model == "character.x" then
return {
stand_START = 0,
stand_END = 79,
walk_START = 81,
walk_END = 100,
mine_START = 102,
mine_END = 111,
walk_mine_START = 113,
walk_mine_END = 132,
death_START = 134,
death_END = 153
}
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()
local walking = false
if controls.up or controls.down or controls.left or controls.right then
walking = true
end
local animation_speed_modified = animation_speed
if controls.sneak and (walking or controls.LMB) then
animation_speed_modified = animation_speed_modified / 2
-- Refresh player animation below
if not player_sneak[name] then
player_anim[name] = -1
player_sneak[name] = true
end
else
-- Refresh player animation below
if player_sneak[name] then
player_anim[name] = -1
player_sneak[name] = false
end
end
if walking and controls.LMB then
if player_anim[name] ~= ANIM_WALK_MINE then
pl:set_animation({x=anim.walk_mine_START, y=anim.walk_mine_END}, animation_speed_modified, animation_blend)
player_anim[name] = ANIM_WALK_MINE
end
elseif walking then
if player_anim[name] ~= ANIM_WALK then
pl:set_animation({x=anim.walk_START, y=anim.walk_END}, animation_speed_modified, animation_blend)
player_anim[name] = ANIM_WALK
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_modified, animation_blend)
player_anim[name] = ANIM_MINE
end
elseif player_anim[name] ~= ANIM_STAND then
pl:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed_modified, animation_blend)
player_anim[name] = ANIM_STAND
end
end
end
minetest.register_globalstep(on_step)
-- END