2 minetest,math,pairs,ipairs,type
4 minetest,math,pairs,ipairs,type
6 local add_item = minetest.add_item
7 local random = math.random
8 local play_sound = minetest.sound_play
9 local add_ps = minetest.add_particlespawner
11 local ceil = math.ceil
12 local new_vec = vector.new
13 local multiply_vec = vector.multiply
15 --hurt sound and disable fall damage group handling
16 minetest.register_on_player_hpchange(function(player, hp_change, reason)
17 if reason.type == "fall" then
18 --fall damage is handled on another globalstep calc
20 elseif hp_change < 0 and reason.reason ~= "correction" then
21 play_sound("hurt", {object=player, gain = 1.0, max_hear_distance = 60,pitch = random(80,100)/100})
26 --throw all items on death
32 minetest.register_on_dieplayer(function(player, reason)
33 pos = player:get_pos()
34 inv = player:get_inventory()
36 for i = 1,inv:get_size("main") do
37 stack = inv:get_stack("main", i)
38 name = stack:get_name()
39 count = stack:get_count()
41 obj = add_item(pos, stack)
43 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
45 inv:set_stack("main", i, ItemStack(""))
49 stack = inv:get_stack("armor_head", 1)
50 name = stack:get_name()
52 obj = add_item(pos, stack)
54 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
56 inv:set_stack("armor_head", 1, ItemStack(""))
59 stack = inv:get_stack("armor_torso", 1)
60 name = stack:get_name()
62 obj = add_item(pos, stack)
64 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
66 inv:set_stack("armor_torso", 1, ItemStack(""))
69 stack = inv:get_stack("armor_legs", 1)
70 name = stack:get_name()
72 obj = add_item(pos, stack)
74 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
76 inv:set_stack("armor_legs", 1, ItemStack(""))
80 stack = inv:get_stack("armor_feet", 1)
81 name = stack:get_name()
83 obj = add_item(pos, stack)
85 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
87 inv:set_stack("armor_feet", 1, ItemStack(""))
92 recalculate_armor(player)
96 --this dumps the players crafting table on closing the inventory
97 dump_craft = function(player)
98 pos = player:get_pos()
99 inv = player:get_inventory()
100 for i = 1,inv:get_size("craft") do
101 stack = inv:get_stack("craft", i)
102 name = stack:get_name()
103 count = stack:get_count()
105 obj = add_item(pos, stack)
107 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
109 inv:set_stack("craft", i, ItemStack(""))
115 local registered_nodes
116 minetest.register_on_mods_loaded(function()
117 registered_nodes = minetest.registered_nodes
120 --play sound to keep up with player's placing vs inconsistent client placing sound
124 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
125 node = registered_nodes[newnode.name]
129 placing = sound.placing
131 --only play the sound when is defined
132 if type(placing) == "table" then
133 play_sound(placing.name, {
136 max_hear_distance = 32,
137 --pitch = random(60,100)/100
142 --replace stack when empty (building)
147 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
148 old = itemstack:get_name()
149 --pass through to check
150 minetest.after(0,function(pos, newnode, placer, oldnode, itemstack, pointed_thing,old)
154 new = placer:get_wielded_item():get_name()
155 if old ~= new and new == "" then
156 inv = placer:get_inventory()
157 --check if another stack
158 if inv:contains_item("main", old) then
159 --print("moving stack")
160 --run through inventory
161 for i = 1,inv:get_size("main") do
162 --if found set wielded item and remove old stack
163 if inv:get_stack("main", i):get_name() == old then
164 count = inv:get_stack("main", i):get_count()
165 placer:set_wielded_item(old.." "..count)
166 inv:set_stack("main",i,ItemStack(""))
167 play_sound("pickup", {
170 pitch = random(60,100)/100
177 end,pos, newnode, placer, oldnode, itemstack, pointed_thing,old)
180 local do_critical_particles = function(pos)
186 minvel = new_vec(-2,-2,-2),
187 maxvel = new_vec(2,8,2),
188 minacc = {x=0, y=4, z=0},
189 maxacc = {x=0, y=12, z=0},
194 collisiondetection = false,
196 texture = "critical.png",
200 --we need to do this to override the default damage mechanics
204 minetest.register_on_joinplayer(function(player)
205 name = player:get_player_name()
206 pool[name] = minetest.get_us_time()/1000000
210 function player_can_be_punched(player)
211 name = player:get_player_name()
212 return((minetest.get_us_time()/1000000)-pool[name] >= 0.5)
215 --this throws the player when they're punched and activates the custom damage mechanics
226 minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
227 name = player:get_player_name()
228 temp_pool = pool[name]
230 punch_diff = (minetest.get_us_time()/1000000)-temp_pool
232 hurt = tool_capabilities.damage_groups.damage
235 if punch_diff >= 0.5 and hp > 0 then
237 temp_pool = minetest.get_us_time()/1000000
239 if hitter:is_player() and hitter ~= player then
240 puncher_vel = hitter:get_player_velocity().y
241 if puncher_vel < 0 then
243 do_critical_particles(player:get_pos())
244 play_sound("critical", {pos=player:get_pos(), gain = 0.1, max_hear_distance = 16,pitch = random(80,100)/100})
248 dir = multiply_vec(dir,10)
249 vel = player:get_player_velocity()
255 hp_modifier = ceil(calculate_armor_absorbtion(player)/3)
256 --print("hp_modifier:",hp_modifier)
257 damage_armor(player,abs(hurt))
259 --print("hurt:",hurt,"|","hp_modifier:",hp_modifier)
260 modify_output = (hurt == 0)
262 hurt = hurt - hp_modifier
264 if not modify_output and hurt <= 0 then
266 elseif modify_output then
269 player:add_player_velocity(dir)
270 player:set_hp(hp-hurt)
275 minetest.register_on_respawnplayer(function(player)
276 player:add_player_velocity(multiply_vec(player:get_player_velocity(),-1))
277 inv = player:get_inventory()
278 inv:set_list("main", {})
279 inv:set_list("craft", {})
280 inv:set_list("craftpreview", {})
281 inv:set_list("armor_head", {})
282 inv:set_list("armor_torso", {})
283 inv:set_list("armor_legs", {})
284 inv:set_list("armor_feet", {})