1 -- Minetest 0.4 mod: player
2 -- See README.txt for licensing and other information.
5 -- Start of configuration area:
8 -- Player animation speed
11 -- Player animation blending
12 -- Note: This is currently broken due to a bug in Irrlicht, leave at 0
15 -- Default player appearance
16 default_model = "character.x"
17 default_textures = {"character.png", }
19 -- Frame ranges for each player model
20 function player_get_animations(model)
21 if model == "character.x" then
33 walk_mine_START = 200,
40 -- End of configuration area.
43 -- Player stats and animations
44 local player_model = {}
45 local player_anim = {}
46 local player_sneak = {}
51 local ANIM_WALK_MINE = 5
54 -- Called when a player's appearance needs to be updated
55 function player_update_visuals(pl)
56 local name = pl:get_player_name()
58 player_model[name] = default_model
59 player_anim[name] = 0 -- Animation will be set further below immediately
60 player_sneak[name] = false
63 textures = default_textures,
65 visual_size = {x=1, y=1},
67 pl:set_properties(prop)
70 -- Update appearance when the player joins
71 minetest.register_on_joinplayer(player_update_visuals)
73 -- Check each player and apply animations
74 function player_step(dtime)
75 for _, pl in pairs(minetest.get_connected_players()) do
76 local name = pl:get_player_name()
77 local anim = player_get_animations(player_model[name])
78 local controls = pl:get_player_control()
80 local animation_speed_mod = animation_speed
82 -- Determine if the player is walking
83 if controls.up or controls.down or controls.left or controls.right then
87 -- Determine if the player is sneaking, and reduce animation speed if so
88 if controls.sneak and pl:get_hp() ~= 0 and (walking or controls.LMB) then
89 animation_speed_mod = animation_speed_mod / 2
90 -- Refresh player animation below if sneak state changed
91 if not player_sneak[name] then
93 player_sneak[name] = true
96 -- Refresh player animation below if sneak state changed
97 if player_sneak[name] then
99 player_sneak[name] = false
103 -- Apply animations based on what the player is doing
104 if pl:get_hp() == 0 then
105 if player_anim[name] ~= ANIM_LAY then
106 pl:set_animation({x=anim.lay_START, y=anim.lay_END}, animation_speed_mod, animation_blend)
107 player_anim[name] = ANIM_LAY
109 elseif walking and controls.LMB then
110 if player_anim[name] ~= ANIM_WALK_MINE then
111 pl:set_animation({x=anim.walk_mine_START, y=anim.walk_mine_END}, animation_speed_mod, animation_blend)
112 player_anim[name] = ANIM_WALK_MINE
115 if player_anim[name] ~= ANIM_WALK then
116 pl:set_animation({x=anim.walk_START, y=anim.walk_END}, animation_speed_mod, animation_blend)
117 player_anim[name] = ANIM_WALK
119 elseif controls.LMB then
120 if player_anim[name] ~= ANIM_MINE then
121 pl:set_animation({x=anim.mine_START, y=anim.mine_END}, animation_speed_mod, animation_blend)
122 player_anim[name] = ANIM_MINE
124 elseif player_anim[name] ~= ANIM_STAND then
125 pl:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed_mod, animation_blend)
126 player_anim[name] = ANIM_STAND
130 minetest.register_globalstep(player_step)