ff85f0f6e05d73d09f705f8c4822816b8ed42ec7
[oweals/minetest_game.git] / mods / default / player.lua
1 -- Minetest 0.4 mod: player
2 -- See README.txt for licensing and other information.
3
4 -- Animation speed
5 animation_speed = 30
6 -- Animation blending
7 -- Note: This is currently broken due to a bug in Irrlicht, leave at 0
8 animation_blend = 0
9
10 -- Default player appearance
11 default_model = "character.x"
12 default_texture = "character.png"
13
14 -- Player states
15 local player_model = {}
16 local player_anim = {}
17 local ANIM_STAND = 0
18 local ANIM_WALK_FORWARD = 1
19 local ANIM_WALK_BACKWARD = 2
20 local ANIM_WALK_LEFT = 3
21 local ANIM_WALK_RIGHT = 4
22 local ANIM_MINE = 5
23 local ANIM_DEATH = 6
24
25 -- Frame ranges for each player model
26 function player_get_animations(model)
27         if model == "character.x" then
28                 return {
29                 stand_START = 0,
30                 stand_END = 79,
31                 walk_forward_START = 81,
32                 walk_forward_END = 100,
33                 walk_backward_START = 102,
34                 walk_backward_END = 121,
35                 walk_right_START = 123,
36                 walk_right_END = 142,
37                 walk_left_START = 144,
38                 walk_left_END = 163,
39                 mine_START = 165,
40                 mine_END = 179,
41                 death_START = 181,
42                 death_END = 200
43                 }
44         end
45 end
46
47 -- Called whenever a player's appearance needs to be updated
48 function player_update_visuals(player)
49         player_model[player:get_player_name()] = default_model
50         player_anim[player:get_player_name()] = ANIM_STAND
51
52         local name = player:get_player_name()
53         local anim = player_get_animations(player_model[name])
54         prop = {
55                 mesh = default_model,
56                 textures = {default_texture, },
57                 visual = "mesh",
58                 visual_size = {x=1, y=1},
59         }
60         player:set_properties(prop)
61         player:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed, animation_blend) -- initial animation
62 end
63
64 -- Update appearance when the player joins
65 minetest.register_on_joinplayer(player_update_visuals)
66
67 -- Global environment step function
68 function on_step(dtime)
69         for _, pl in pairs(minetest.get_connected_players()) do
70                 local name = pl:get_player_name()
71                 local anim = player_get_animations(player_model[name])
72                 local controls = pl:get_player_control()
73
74                 if controls.up then
75                         if player_anim[name] ~= ANIM_WALK_FORWARD then
76                                 pl:set_animation({x=anim.walk_forward_START, y=anim.walk_forward_END}, animation_speed, animation_blend)
77                                 player_anim[name] = ANIM_WALK_FORWARD
78                         end
79                 elseif controls.down then
80                         if player_anim[name] ~= ANIM_WALK_BACKWARD then
81                                 pl:set_animation({x=anim.walk_backward_START, y=anim.walk_backward_END}, animation_speed, animation_blend)
82                                 player_anim[name] = ANIM_WALK_BACKWARD
83                         end
84                 elseif controls.left then
85                         if player_anim[name] ~= ANIM_WALK_LEFT then
86                                 pl:set_animation({x=anim.walk_left_START, y=anim.walk_left_END}, animation_speed, animation_blend)
87                                 player_anim[name] = ANIM_WALK_LEFT
88                         end
89                 elseif controls.right then
90                         if player_anim[name] ~= ANIM_WALK_RIGHT then
91                                 pl:set_animation({x=anim.walk_right_START, y=anim.walk_right_END}, animation_speed, animation_blend)
92                                 player_anim[name] = ANIM_WALK_RIGHT
93                         end
94                 elseif controls.LMB then
95                         if player_anim[name] ~= ANIM_MINE then
96                                 pl:set_animation({x=anim.mine_START, y=anim.mine_END}, animation_speed, animation_blend)
97                                 player_anim[name] = ANIM_MINE
98                         end
99                 elseif player_anim[name] ~= ANIM_WALK_STAND then
100                         pl:set_animation({x=anim.stand_START, y=anim.stand_END}, animation_speed, animation_blend)
101                         player_anim[name] = ANIM_WALK_STAND
102                 end
103         end
104 end
105 minetest.register_globalstep(on_step)
106
107 -- END