From 81d7553f7c8f505781ba1bfdaed3950c4aadbffd Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Sat, 12 Sep 2020 20:10:40 -0700 Subject: [PATCH] Add Sticky grenades (#677) * Improved grenade API * Added sticky grenade * Improved grenade textures --- mods/ctf/ctf_crafting/init.lua | 8 +++ mods/pvp/grenades/api.md | 1 + mods/pvp/grenades/grenades.lua | 13 +++- mods/pvp/grenades/init.lua | 63 +++++++++--------- mods/pvp/grenades/textures/grenades_frag.png | Bin 225 -> 1922 bytes .../textures/grenades_frag_sticky.png | Bin 0 -> 2041 bytes 6 files changed, 50 insertions(+), 35 deletions(-) create mode 100644 mods/pvp/grenades/textures/grenades_frag_sticky.png diff --git a/mods/ctf/ctf_crafting/init.lua b/mods/ctf/ctf_crafting/init.lua index 33a9516..4a8188d 100644 --- a/mods/ctf/ctf_crafting/init.lua +++ b/mods/ctf/ctf_crafting/init.lua @@ -279,6 +279,14 @@ crafting.register_recipe({ level = 1, }) +crafting.register_recipe({ + type = "inv", + output = "grenades:frag_sticky 1", + items = { "grenades:frag", "default:stick 4" }, + always_known = true, + level = 1, +}) + crafting.register_recipe({ type = "inv", output = "grenades:smoke 1", diff --git a/mods/pvp/grenades/api.md b/mods/pvp/grenades/api.md index e808d96..a26f9b5 100644 --- a/mods/pvp/grenades/api.md +++ b/mods/pvp/grenades/api.md @@ -18,6 +18,7 @@ grenades.register_grenade("name", { -- Name of the grenade (Like 'smoke' or 'fla -- the grenade object -- the name of the player that threw the grenade -- return true to cause grenade explosion + -- return "stop" to stop the grenade from moving end, clock = 3, -- Optional, controls how long until grenade detonates. Default is 3 particle = { -- Adds particles in the grenade's trail diff --git a/mods/pvp/grenades/grenades.lua b/mods/pvp/grenades/grenades.lua index 06aa946..72d57a7 100644 --- a/mods/pvp/grenades/grenades.lua +++ b/mods/pvp/grenades/grenades.lua @@ -9,7 +9,7 @@ local function remove_flora(pos, radius) end end -grenades.register_grenade("grenades:frag", { +local fragdef = { description = "Frag grenade (Kills anyone near blast)", image = "grenades_frag.png", on_explode = function(pos, name) @@ -71,7 +71,16 @@ grenades.register_grenade("grenades:frag", { end end end, -}) +} + +grenades.register_grenade("grenades:frag", table.copy(fragdef)) + +fragdef.description = "Sticky Frag grenade (Sticks to surfaces)" +fragdef.image = "grenades_frag_sticky.png" +fragdef.on_collide = function(obj) + return "stop" +end +grenades.register_grenade("grenades:frag_sticky", fragdef) -- Flashbang Grenade diff --git a/mods/pvp/grenades/init.lua b/mods/pvp/grenades/init.lua index a9fa222..8053b16 100644 --- a/mods/pvp/grenades/init.lua +++ b/mods/pvp/grenades/init.lua @@ -34,7 +34,7 @@ function grenades.register_grenade(name, def) sliding = 1, particle = 0, timer = 0, - on_step = function(self, dtime) + on_step = function(self, dtime, moveresult) local obj = self.object local vel = obj:get_velocity() local pos = obj:get_pos() @@ -48,27 +48,29 @@ function grenades.register_grenade(name, def) -- Check for a collision on the x/y/z axis - if not vector.equals(self.last_vel, vel) and vector.distance(self.last_vel, vel) > 4 then - if def.on_collide and def.on_collide(obj, self.thrower_name) then - if self.thrower_name then - minetest.log("action", "[Grenades] A grenade thrown by " .. self.thrower_name .. - " explodes at " .. minetest.pos_to_string(vector.round(pos))) - def.on_explode(pos, self.thrower_name) + if moveresult.collides and moveresult.collisions then + if def.on_collide then + local c_result = def.on_collide(obj, self.thrower_name) + + if c_result == true then + if self.thrower_name then + minetest.log("action", "[Grenades] A grenade thrown by " .. self.thrower_name .. + " explodes at " .. minetest.pos_to_string(vector.round(pos))) + def.on_explode(pos, self.thrower_name) + end + obj:remove() + elseif c_result == "stop" then + vel = vector.new() + self.last_vel = vector.new() + obj:set_velocity(vector.new()) + obj:set_acceleration(vector.new(0, 0, 0)) end - - obj:remove() end - if math.abs(self.last_vel.x - vel.x) > 5 then -- Check for a large reduction in velocity - vel.x = self.last_vel.x * -0.3 -- Invert velocity and reduce it a bit - end + if moveresult.collisions[1] and moveresult.collisions[1].axis then + local axis = moveresult.collisions[1].axis - if math.abs(self.last_vel.y - vel.y) > 5 then -- Check for a large reduction in velocity - vel.y = self.last_vel.y * -0.2 -- Invert velocity and reduce it a bit - end - - if math.abs(self.last_vel.z - vel.z) > 5 then -- Check for a large reduction in velocity - vel.z = self.last_vel.z * -0.3 -- Invert velocity and reduce it a bit + vel[axis] = self.last_vel[axis] * -0.3 end obj:set_velocity(vel) @@ -76,27 +78,22 @@ function grenades.register_grenade(name, def) self.last_vel = vel - if self.sliding == 1 and vel.y == 0 then -- Check if grenade is sliding - self.sliding = 2 -- Multiplies drag by 2 - elseif self.sliding > 1 and vel.y ~= 0 then - self.sliding = 1 -- Doesn't affect drag - end - - if self.sliding > 1 then -- Is the grenade sliding? - if vector.distance(vector.new(), vel) <= 1 and not vector.equals(vel, vector.new()) then -- Grenade is barely moving, make sure it stays that way - obj:set_velocity(vector.new()) - obj:set_acceleration(vector.new(0, -9.8, 0)) - end - else - norm_vel = vector.normalize(vel) + norm_vel = vector.normalize(vel) + if not vector.equals(vel, vector.new()) then obj:set_acceleration({ - x = -norm_vel.x * grenades.grenade_deaccel * self.sliding, + x = -norm_vel.x * grenades.grenade_deaccel * (moveresult.touching_ground and 2 or 1), y = -9.8, - z = -norm_vel.z * grenades.grenade_deaccel * self.sliding, + z = -norm_vel.z * grenades.grenade_deaccel * (moveresult.touching_ground and 2 or 1), }) end + if moveresult.touching_ground then -- Is the grenade sliding? + if vector.distance(vector.new(), vel) <= 2 and not vector.equals(vel, vector.new()) then -- Grenade is barely moving, make sure it stays that way + obj:set_velocity(vector.new()) + obj:set_acceleration(vector.new(0, -9.8, 0)) + end + end -- Grenade Particles diff --git a/mods/pvp/grenades/textures/grenades_frag.png b/mods/pvp/grenades/textures/grenades_frag.png index 5de47958a8081fe9b2bccc44c6c81db440eade68..f781a6273a60dba6b2b6621c43c6ebe6b5c26374 100644 GIT binary patch delta 1908 zcmV-)2aEXO0fG;ZBYy;SdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+T~YSvg9ZX z{O1&N1P};`<6xGEzQG)SlEtp&b-k+BGk;^khC*19Gn1uE`}w11p>|zqKAjEoxqsNR@z8HB1EI^K_UotQJwBtKZ!erN+<)=dZ**Hox1-bZcIZcB zLZjX%iGEuBE^J4stwu~L_o*JV>aqvURQByve z7JHx+mmGnWZd`EHW!GJsb#VnL25Kazi3<7Ir(P&g@q?!@it8j`uX+WSg_`jm-E`&R zX52L66{mmV9dUCkF-02PSerluV>Su6!TbVQAu#kKL7}0{o&z&S z7FNTFbAR+PM2;~^9E)5QFF{zMh^QpV>NO~9R8iHWIZ^Uh13AScNmEKWlgS8_;VWZ& zM$bWqKf=LBJmky2lcp`T+@ZDZ zd+6L_m##hae6hA!{Zf9wn%k_=WNM6)i#7Bbk$=;L8_Nj~&cGN22gYSE0728>%&H54 z26KZmn+TJF2}$zc##A>L1BIbE;_fc)Zp?ken_>NkH+sjM8Pxq3%o$MkmABupR>wY9 zCSz+B4ot1b?1Q~&Hl%rMYWd&R{~Jd=NSt*xjX*@3x1ET)qG3L7R$#?mLW%W4K zHr^lnlG=M_IiI$6+8TB_9&=3?e|3J4nDQ+#ck*!3PjdRd#B?ndO9$A_<1?`_Zhw;` z6PEiLVtKok+!h4M*NoemH8*bE5k6a-E;?_MI?Tl%atg22^hI5pfyb$r&8gb0wR`gN zPi$t$+;5rdALdos!03Snp_3v1%+NO`9Db*co>zpA_mz!yv89Biqa4yTFE62Id7kvI zO)i@06ZehEjhOgw#qKyC;eW6B2Y+6y$Un&c1Ofm60fcEoLr_UWLm+T+Z)Rz1WdHzp zoPCi!NW(xJ#a~;cepDPRBI1ytcCsKU;;2<9LWNK(wCZ4T=@&FY!gGAx!^hXV7|-%P_vh$SawY?O0`V-<4U2e#czV;)IqwsPSy57m z&xywjx*+i**JYRAI2RoD^USc3PR$dCiG@NN%WcexhDtm|98pw_^8Fc?70z3n)pC_J z@5x^n%4sXhT&FpL1QxLb5q|b`5kz)ZBsE`~# z_#gc4*33^%xJjWn(D`E9AEQ8U7iiRM`}^3o8z(^E8Mx9~{z@H~`6Rv8(jrGd|2A-O z-O}Ve;Bp5TdeS9Ba-;xFe?AYqpV2pEfq`3~XU*-cxsTHaAWdB*Z-0P;Lm*n9>~)WK zceVHS@0n(QKTrj7nF|UOp#T5?24YJ`L;yzsM*v5T{cunK000SaNLh0L01FcU01FcV z0GgZ_00007bV*G`2jmG07Yi{kQ+hxE0090;L_t(I%f(YcYQr!P9GTc^+B7r|=vR7a zK!o1>fZp=4{-K9G6n}j1cXA0f&PHO@lT}NVaw=3H7*?9unMDHrd#TcaF~;ZWL=ihneK$Viau2TST|6D~oM-DSE#sGjPBK7wE>TeD0 z^W#fp9RNUkJou_ou+~EB1}SD{w8w)l3Rr8we9hu%x&&Ml5N-JppUEj6hOsQ5bpx#% z0KjJR5aIRu4gj#*J>l;o5D@^VWrS(EKtv!SfqXLp5rqgMg6;M(*k0l^Li&`|FpPe- uI(J**^#4RNIG@J(LUEr@Blhh};CusKZJQn_79nN;0000i_@%07*qoM6N<$f|9aO AJpcdz diff --git a/mods/pvp/grenades/textures/grenades_frag_sticky.png b/mods/pvp/grenades/textures/grenades_frag_sticky.png new file mode 100644 index 0000000000000000000000000000000000000000..422dd1fbf390e89c2fc15731587a0f9f192966f9 GIT binary patch literal 2041 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YCwgV>&+;fT?0SUx#9LD!@gB(A_&~3YIfBPrd z#kd*8Xp^Nl5djw4Lw$Lm!O?xjH)-B7@qj zpFVB<1i9P>96l&N%2n7s9JV1k4bP7mo=3ahgM^%yoa{Cf+iJKN{5{mX4VA4pq3p+= zuvRsGs|SHcl&ZjyVQz+up6{>_nDrz)5pOaCJu+^!6)G`@F$CmcdS?LjeSjW4xten-dW~b`0j9rn8^kYv{eL*(K``QMWT{2Ad8u zP|OIqnZq24$0KO_St3f%Nf%IFb#y$ zYrq)HjW@JF2=&dI%m5!{)35LH2dN4MWrjImf=TCPA`9Je%S@gP^aS-)-g)nXk3IzxY>?oB4m zB1eNgP@;=Ih8SZ?tP&h0*h{rE(N8f-Y1%0n!(y_FD0LylpPV=WggcJu846es&VB!CZEsFx^e;w zCG3Tg-Y=B79xe%4S0}s_yK~N+>)7^fo@+gMG%?N~D}WC^-zlB24&&LJ@D_xZ@YD|* zSj}hj3gLP;#a(oFrxRBX64Yx}o>)pNq&_+y8oqmOIG6jEX>4Tx0C=2zkv&MmKpe$iTcv(f94sQ@kfC<6AS&Xh zRVYG*P%E_RU~=gfG-*guTpR`0f`cE6RR%KKJM7 zQ*tH)d;;+-(+!JwgLrz=(mC%Fhgnflh|h_~47wokBiCh@-#8Z>_VdiJkxtDMhlzzk z8_R9XiiS!&MI2F7jq?2&mle)ioYiubHSft^7|LlY%Uq{9f&><^1Q7ycR8c}17Gkt& zq?kz2e%!-9?D$1;$>b`5kz)ZBsE`~#_#gc4*33^%xJjWn(D`E9AEQ8U7iiRM`}^3o z8z(^E8Mx9~{z@H~`6Rv8(jrGd|2A-O-O}Ve;Bp5TdeS9Ba-;xFe?AYqpV2pEfq`3~ zXU*-cxsTHaAWdB*Z-9eCAX=d8b&q#)sA7M6jDkN zMbU8rF&>Z0KOuzyQLon#mnviM`0yl3ci_4%K%$fq%i%ORwY1s&Dq~bRJS>OP zEvn?oyz3?>mk99r3=}!I{)$D8~2Y>q-Oox^F!JPFmXZ_q|m7)aJ!p1OK zIByOBhS8$gJOg0xF(@~1Ru0yS4L}%%ykEa+9RxeAa|WL00f-a;2!b6K&sW58tYLt| znOuV2+(gO-aU9d>v~}!5-J6@m25E}TX3KuRCk#W1^zr|bN#L)y=|E}u>n*pV8_oOz XK%R&2S<|p`00000NkvXXu0mjfonE$D literal 0 HcmV?d00001