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
33 minetest.register_on_dieplayer(function(player, reason)
34 pos = player:get_pos()
35 inv = player:get_inventory()
37 for i = 1,inv:get_size("main") do
38 stack = inv:get_stack("main", i)
39 name = stack:get_name()
40 count = stack:get_count()
42 obj = add_item(pos, stack)
44 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
46 inv:set_stack("main", i, ItemStack(""))
50 stack = inv:get_stack("armor_head", 1)
51 name = stack:get_name()
53 obj = add_item(pos, stack)
55 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
57 inv:set_stack("armor_head", 1, ItemStack(""))
60 stack = inv:get_stack("armor_torso", 1)
61 name = stack:get_name()
63 obj = add_item(pos, stack)
65 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
67 inv:set_stack("armor_torso", 1, ItemStack(""))
70 stack = inv:get_stack("armor_legs", 1)
71 name = stack:get_name()
73 obj = add_item(pos, stack)
75 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
77 inv:set_stack("armor_legs", 1, ItemStack(""))
81 stack = inv:get_stack("armor_feet", 1)
82 name = stack:get_name()
84 obj = add_item(pos, stack)
86 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
88 inv:set_stack("armor_feet", 1, ItemStack(""))
93 recalculate_armor(player)
97 --this dumps the players crafting table on closing the inventory
98 dump_craft = function(player)
99 pos = player:get_pos()
100 inv = player:get_inventory()
101 for i = 1,inv:get_size("craft") do
102 stack = inv:get_stack("craft", i)
103 name = stack:get_name()
104 count = stack:get_count()
106 obj = add_item(pos, stack)
108 obj:set_velocity(new_vec(random(-3,3),random(4,8),random(-3,3)))
110 inv:set_stack("craft", i, ItemStack(""))
116 local registered_nodes
117 minetest.register_on_mods_loaded(function()
118 registered_nodes = minetest.registered_nodes
121 --play sound to keep up with player's placing vs inconsistent client placing sound
125 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
126 node = registered_nodes[newnode.name]
130 placing = sound.placing
132 --only play the sound when is defined
133 if type(placing) == "table" then
134 play_sound(placing.name, {
137 max_hear_distance = 32,
138 --pitch = random(60,100)/100
143 --replace stack when empty (building)
148 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
149 old = itemstack:get_name()
150 --pass through to check
151 minetest.after(0,function(pos, newnode, placer, oldnode, itemstack, pointed_thing,old)
155 new = placer:get_wielded_item():get_name()
156 if old ~= new and new == "" then
157 inv = placer:get_inventory()
158 --check if another stack
159 if inv:contains_item("main", old) then
160 --print("moving stack")
161 --run through inventory
162 for i = 1,inv:get_size("main") do
163 --if found set wielded item and remove old stack
164 if inv:get_stack("main", i):get_name() == old then
165 count = inv:get_stack("main", i):get_count()
166 placer:set_wielded_item(old.." "..count)
167 inv:set_stack("main",i,ItemStack(""))
168 play_sound("pickup", {
171 pitch = random(60,100)/100
178 end,pos, newnode, placer, oldnode, itemstack, pointed_thing,old)
181 local do_critical_particles = function(pos)
187 minvel = new_vec(-2,-2,-2),
188 maxvel = new_vec(2,8,2),
189 minacc = {x=0, y=4, z=0},
190 maxacc = {x=0, y=12, z=0},
195 collisiondetection = false,
197 texture = "critical.png",
201 --we need to do this to override the default damage mechanics
205 minetest.register_on_joinplayer(function(player)
206 name = player:get_player_name()
207 pool[name] = minetest.get_us_time()/1000000
211 function player_can_be_punched(player)
212 name = player:get_player_name()
213 return((minetest.get_us_time()/1000000)-pool[name] >= 0.5)
216 --this throws the player when they're punched and activates the custom damage mechanics
227 minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
228 name = player:get_player_name()
229 temp_pool = pool[name]
231 punch_diff = (minetest.get_us_time()/1000000)-temp_pool
234 hurt = tool_capabilities.damage_groups.damage
237 if punch_diff >= 0.5 and hp > 0 then
239 temp_pool = minetest.get_us_time()/1000000
241 if hitter:is_player() and hitter ~= player then
242 puncher_vel = hitter:get_player_velocity().y
243 if puncher_vel < 0 then
245 do_critical_particles(player:get_pos())
246 play_sound("critical", {pos=player:get_pos(), gain = 0.1, max_hear_distance = 16,pitch = random(80,100)/100})
250 dir = multiply_vec(dir,10)
251 vel = player:get_player_velocity()
257 hp_modifier = ceil(calculate_armor_absorbtion(player)/3)
258 --print("hp_modifier:",hp_modifier)
259 damage_armor(player,abs(hurt))
261 --print("hurt:",hurt,"|","hp_modifier:",hp_modifier)
262 modify_output = (hurt == 0)
264 hurt = hurt - hp_modifier
266 if not modify_output and hurt <= 0 then
268 elseif modify_output then
272 player:add_player_velocity(dir)
274 player:set_hp(hp-hurt)
279 minetest.register_on_respawnplayer(function(player)
280 player:add_player_velocity(multiply_vec(player:get_player_velocity(),-1))
281 inv = player:get_inventory()
282 inv:set_list("main", {})
283 inv:set_list("craft", {})
284 inv:set_list("craftpreview", {})
285 inv:set_list("armor_head", {})
286 inv:set_list("armor_torso", {})
287 inv:set_list("armor_legs", {})
288 inv:set_list("armor_feet", {})