]> git.lizzy.rs Git - Crafter.git/blob - mods/player_api/api.lua
Make hand damage other players
[Crafter.git] / mods / player_api / api.lua
1 -- Minetest 0.4 mod: player
2 -- See README.txt for licensing and other information.
3
4 player_api = {}
5
6 -- Player animation blending
7 -- Note: This is currently broken due to a bug in Irrlicht, leave at 0
8 local animation_blend = 0
9
10 player_api.registered_models = { }
11
12 -- Local for speed.
13 local models = player_api.registered_models
14
15 function player_api.register_model(name, def)
16         models[name] = def
17 end
18
19 -- Player stats and animations
20 local player_model = {}
21 local player_textures = {}
22 local wielded_item = {}
23 local player_anim = {}
24 local player_sneak = {}
25 player_api.player_attached = {}
26
27
28 --modify the player's wielded item
29 function player_api.set_wielded_item(player)
30         local name = player:get_player_name()
31         
32         
33         --local model = models[model_name]
34         if not wielded_item[name] or not wielded_item[name]:get_luaentity() then
35                 wielded_item[name] = nil
36                 --we give the player an item to hold
37                 local itemstring = player:get_wielded_item():get_name()
38                 
39                 local wield_item = minetest.add_entity(player:get_pos(),"player_api:item")
40                 if wield_item then
41                 
42                         wield_item:get_luaentity():set_item(itemstring)
43                         
44                         wield_item:get_luaentity().wielder = player:get_player_name()
45                         
46                         wield_item:set_attach(player, "Right_Hand", vector.new(0,0,0), vector.new(0,0,0))
47                         
48                         wielded_item[name] = wield_item
49                 end
50                 return
51         end
52         
53         
54         local itemstring = wielded_item[name]:get_luaentity().itemstring
55         local player_wield_item = player:get_wielded_item():get_name()
56         
57         if itemstring ~= player_wield_item then
58                 wielded_item[name]:get_luaentity().itemstring = player_wield_item
59                 wielded_item[name]:get_luaentity():set_item(player_wield_item)
60         end
61 end
62
63
64
65 function player_api.get_animation(player)
66         local name = player:get_player_name()
67         return {
68                 model = player_model[name],
69                 textures = player_textures[name],
70                 animation = player_anim[name],
71         }
72 end
73
74 -- Called when a player's appearance needs to be updated
75 function player_api.set_model(player, model_name)
76         local name = player:get_player_name()
77         local model = models[model_name]
78         if player_model[name] == model_name then
79                 return
80         end
81         player:set_properties({
82                 mesh = model_name,
83                 textures = player_textures[name] or model.textures,
84                 visual = "mesh",
85                 visual_size = model.visual_size or {x = 1, y = 1},
86                 collisionbox = model.collisionbox or {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
87                 stepheight = model.stepheight or 0.6,
88                 eye_height = model.eye_height or 1.47,
89         })
90         player_api.set_animation(player, "stand")
91         player_model[name] = model_name
92 end
93
94 function player_api.set_textures(player, textures)
95         local name = player:get_player_name()
96         local model = models[player_model[name]]
97         local model_textures = model and model.textures or nil
98         player_textures[name] = textures or model_textures
99         player:set_properties({textures = textures or model_textures,})
100 end
101
102 function player_api.set_animation(player, anim_name, speed)
103         local name = player:get_player_name()
104         if player_anim[name] == anim_name then
105                 return
106         end
107         local model = player_model[name] and models[player_model[name]]
108         if not (model and model.animations[anim_name]) then
109                 return
110         end
111         local anim = model.animations[anim_name]
112         
113         
114         --calculate local animation
115         --update player's frame speed
116         
117         local local_player_animation = player:get_local_animation()
118         local idle_animation = {x = 0,   y = 79}
119         local walk_animation = {x = 168, y = 187}
120         local dig_animation =  {x = 189, y = 198}
121         local walk_and_dig =   {x = 200, y = 219}
122         local sneak_speed = nil
123         local opacity = 255
124         if anim_name == "sneak" or anim_name == "sneak_mine_stand" or anim_name == "sneak_walk" or anim_name == "sneak_mine_walk" then
125                 idle_animation = model.animations.sneak
126                 walk_animation = model.animations.sneak_walk
127                 dig_animation =  model.animations.sneak_mine_stand
128                 walk_and_dig =   model.animations.sneak_mine_walk
129                 sneak_speed = 16
130                 opacity = 0
131         end
132         
133         --update the external animation speed that other players see
134         local sneaker_speed = speed
135         if sneak_speed then
136                 sneaker_speed = sneak_speed
137         end
138         
139         player:set_local_animation(
140                 idle_animation,--idle
141                 walk_animation,--walk
142                 dig_animation,--dig
143                 walk_and_dig,--walk and dig
144                 speed
145         )
146         player:set_nametag_attributes(
147         {color = {
148                 r = 255,
149                 b = 255,
150                 a = opacity,
151                 g = 255
152         }
153         })
154         player_api.set_model(player, "character.b3d")
155         player_anim[name] = anim_name
156         player:set_animation(anim, sneaker_speed, animation_blend)
157 end
158
159 minetest.register_on_leaveplayer(function(player)
160         local name = player:get_player_name()
161         player_model[name] = nil
162         player_anim[name] = nil
163         player_textures[name] = nil
164 end)
165
166 -- Localize for better performance.
167 local player_set_animation = player_api.set_animation
168 local player_attached = player_api.player_attached
169
170 -- Prevent knockback for attached players
171 local old_calculate_knockback = minetest.calculate_knockback
172 function minetest.calculate_knockback(player, ...)
173         if player_attached[player:get_player_name()] then
174                 return 0
175         end
176         return old_calculate_knockback(player, ...)
177 end
178
179 -- Check each player and apply animations
180 minetest.register_globalstep(function()
181         for _, player in pairs(minetest.get_connected_players()) do
182                 --update the player wielded item model
183                 player_api.set_wielded_item(player)
184                 
185                 local name = player:get_player_name()
186                 local model_name = player_model[name]
187                 local model = model_name and models[model_name]
188                 if model and not player_attached[name] then
189                         local controls = player:get_player_control()
190                         local animation_speed_mod = model.animation_speed or 30
191
192                         -- Determine if the player is sneaking, and reduce animation speed if so
193                         --if controls.sneak then
194                         --      animation_speed_mod = 0
195                         --end
196                         
197                         local meta = player:get_meta()
198                         local movement_state = meta:get_string("player.player_movement_state")
199
200                         -- Apply animations based on what the player is doing
201                         if player:get_hp() == 0 then
202                                 player_set_animation(player, "lay")
203                         elseif movement_state == "0" then
204                                 --walking normal
205                                 if controls.up or controls.down or controls.left or controls.right then
206                                         if controls.LMB or controls.RMB then
207                                                 player_set_animation(player, "walk_mine", animation_speed_mod)
208                                         else
209                                                 player_set_animation(player, "walk", animation_speed_mod)
210                                         end
211                                 else
212                                         if controls.LMB or controls.RMB then
213                                                 player_set_animation(player, "mine", animation_speed_mod)
214                                         else
215                                                 player_set_animation(player, "stand", animation_speed_mod)
216                                         end
217                                 end
218                         elseif movement_state == "1" then
219                                 --running
220                                 if controls.up or controls.down or controls.left or controls.right then
221                                         if controls.LMB or controls.RMB then
222                                                 player_set_animation(player, "walk_mine", animation_speed_mod*1.5)
223                                         else
224                                                 player_set_animation(player, "walk", animation_speed_mod*1.5)
225                                         end
226                                 else
227                                         if controls.LMB or controls.RMB then
228                                                 player_set_animation(player, "mine", animation_speed_mod*1.5)
229                                         else
230                                                 player_set_animation(player, "stand", animation_speed_mod*1.5)
231                                         end
232                                 end
233                         elseif movement_state == "2" then
234                                 --bunnyhopping
235                                 if controls.up or controls.down or controls.left or controls.right then
236                                         if controls.LMB or controls.RMB then
237                                                 player_set_animation(player, "walk_mine", animation_speed_mod*1.75)
238                                         else
239                                                 player_set_animation(player, "walk", animation_speed_mod*1.75)
240                                         end
241                                 else
242                                         if controls.LMB or controls.RMB then
243                                                 player_set_animation(player, "mine", animation_speed_mod*1.75)
244                                         else
245                                                 player_set_animation(player, "stand", animation_speed_mod*1.75)
246                                         end
247                                 end
248                         elseif movement_state == "3" then
249                                 --sneaking
250                                 if controls.up or controls.down or controls.left or controls.right then
251                                         if controls.LMB or controls.RMB then
252                                                 player_set_animation(player, "sneak_mine_walk", 30)
253                                         else
254                                                 player_set_animation(player, "sneak_walk", 30)
255                                         end
256                                 else
257                                         if controls.LMB or controls.RMB then
258                                                 player_set_animation(player, "sneak_mine_stand", 30)
259                                         else
260                                                 player_set_animation(player, "sneak", 30)
261                                         end
262                                 end
263                         --safety catches
264                         elseif controls.LMB or controls.RMB then
265                                 player_set_animation(player, "mine", animation_speed_mod)
266                         else
267                                 player_set_animation(player, "sneak", animation_speed_mod)
268                         end
269                 end
270         end
271 end)