From a12b583c43866f353bd938bb85d6f2b0244c81c6 Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Sun, 18 Jun 2023 12:42:59 -0300 Subject: [PATCH] added destruction effects --- LICENSE | 7 +++ lib_planes/entities.lua | 9 ++-- lib_planes/utilities.lua | 85 +++++++++++++++++++++++++++++++++++- sounds/airutils_explode.ogg | Bin 0 -> 13580 bytes textures/airutils_boom.png | Bin 0 -> 5174 bytes textures/airutils_smoke.png | Bin 0 -> 5051 bytes 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 sounds/airutils_explode.ogg create mode 100644 textures/airutils_boom.png create mode 100644 textures/airutils_smoke.png diff --git a/LICENSE b/LICENSE index 0db227f..80de37a 100755 --- a/LICENSE +++ b/LICENSE @@ -20,3 +20,10 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Media Licence: + +CC0-1.0 for all media +the "airutils_explode.ogg" comes from minetest game tnt mod + + diff --git a/lib_planes/entities.lua b/lib_planes/entities.lua index 68992ba..edfd7eb 100644 --- a/lib_planes/entities.lua +++ b/lib_planes/entities.lua @@ -214,9 +214,12 @@ function airutils.logic(self) end --is an stall, force a recover - if longit_speed < self._min_speed and climb_rate < -4 and is_flying then + if longit_speed < (self._min_speed+0.5) and climb_rate < -1.5 and is_flying then + if player and self.driver_name then + minetest.chat_send_player(self.driver_name,core.colorize('#ff0000', " >>> STALL")) + end self._elevator_angle = 0 - self._angle_of_attack = -2 + self._angle_of_attack = -1 newpitch = math.rad(self._angle_of_attack) else --ajustar angulo de ataque @@ -455,7 +458,7 @@ end function airutils.on_punch(self, puncher, ttime, toolcaps, dir, damage) if self.hp_max <= 0 then - airutils.destroy(self) + airutils.destroy(self, true) end if not puncher or not puncher:is_player() then diff --git a/lib_planes/utilities.lua b/lib_planes/utilities.lua index 8719ad0..57f861c 100644 --- a/lib_planes/utilities.lua +++ b/lib_planes/utilities.lua @@ -147,7 +147,8 @@ function airutils.checkAttach(self, player) end -- destroy the boat -function airutils.destroy(self) +function airutils.destroy(self, effects) + effects = effects or false if self.sound_handle then minetest.sound_stop(self.sound_handle) self.sound_handle = nil @@ -168,6 +169,7 @@ function airutils.destroy(self) end local pos = self.object:get_pos() + if effects then airutils.add_destruction_effects(pos, 5) end if self._destroy_parts_method then self._destroy_parts_method(self) @@ -196,6 +198,9 @@ function airutils.destroy(self) end function airutils.testImpact(self, velocity, position) + if self.hp_max < 0 then --if acumulated damage is greater than 50, adieu + airutils.destroy(self, true) + end local p = position --self.object:get_pos() local collision = false if self._last_vel == nil then return end @@ -233,6 +238,32 @@ function airutils.testImpact(self, velocity, position) end end + --damage by speed + if self._speed_not_exceed then + if self._last_speed_damage_time == nil then self._last_speed_damage_time = 0 end + self._last_speed_damage_time = self._last_speed_damage_time + self.dtime + if self._last_speed_damage_time > 2 then self._last_speed_damage_time = 2 end + if self._longit_speed > self._speed_not_exceed and self._last_speed_damage_time >= 2 then + self._last_speed_damage_time = 0 + minetest.sound_play("airutils_collision", { + --to_player = self.driver_name, + object = self.object, + max_hear_distance = 15, + gain = 1.0, + fade = 0.0, + pitch = 1.0, + }, true) + self.hp_max = self.hp_max - 5 + if self.driver_name then + local player_name = self.driver_name + airutils.setText(self, self.infotext) + end + if self.hp_max < 0 then --if acumulated damage is greater than 50, adieu + airutils.destroy(self, true) + end + end + end + if collision then --self.object:set_velocity({x=0,y=0,z=0}) local damage = impact / 2 @@ -252,7 +283,7 @@ function airutils.testImpact(self, velocity, position) --minetest.chat_send_all('damage: '.. damage .. ' - hp: ' .. self.hp_max) if self.hp_max < 0 then --if acumulated damage is greater than 50, adieu - airutils.destroy(self) + airutils.destroy(self, true) end local player = minetest.get_player_by_name(player_name) @@ -419,3 +450,53 @@ function airutils.paint_with_mask(self, colstr, target_texture, mask_texture) end end +function airutils.add_destruction_effects(pos, radius) + minetest.sound_play("airutils_explode", { + pos = pos, + max_hear_distance = 100, + gain = 2.0, + fade = 0.0, + pitch = 1.0, + }, true) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "airutils_boom.png", + glow = 15, + }) + minetest.add_particlespawner({ + amount = 32, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "airutils_boom.png", + }) + minetest.add_particlespawner({ + amount = 64, + time = 1.0, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "airutils_smoke.png", + }) +end diff --git a/sounds/airutils_explode.ogg b/sounds/airutils_explode.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e00a16c1a332404379bc5dfeb74007d6bd3d701d GIT binary patch literal 13580 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 AJOBUy literal 0 HcmV?d00001 diff --git a/textures/airutils_smoke.png b/textures/airutils_smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..18ed052cee247c6d126c4f660125379577079697 GIT binary patch literal 5051 zcmeHKX;>3i7Y;6Lf-M39t|9VO6q3wj&qzcFOM-%_P-L;yNiu;EvXBH4unMBG3KVdm zD(-?JB8pT2MO!xn1jJH`1&bnLaY2+8MXBE;pyKoOkI(bfGv}W3-gDk_?wQRu4rk8ic`UtqhHEYGwm-91+_J84Q$Jy(;@Z9NNd#GJjZE=epw{jmJHaCcw zXz%ra$Gd*9(A(UzSmdxdrKrSllcZ>#?N-Z44|*djqV6}`JR4ZTyHV>g1)madBiN44 z%YmLtu6B~#av2%;iiT66TRAqnFMi>VW=^%J0GDjKv$?;v+im&E2WwA_D@$DvShHB1 zkU=w4iIVJW?^GxDN)k@@zcBm8+N^T@v+(Q*tLpCVXH|DhfGm#z>Y(kj?llD(B^d9U znd8O`GK?tB$w8Ufiv|NHgc~{ zROHe&I7iIvo%?Ibv|7LX=!RIE73yoq@!N4d=RRAvB8?qhYPI62{YKkmHD4acAPw0H zH_yB8z>h*J@A>nbHTU$@G|%v8`sVNtV>ZT+#mv)*AveD4H)<&VK#Kib-!vP^$?Hp=@X z0Oh@!d)x8X@$zR*D%#)#Xex3@;$e_;Q6mRa>r+3Vm3X5K^X z$g|a5#faD3>eXbGdKZ0Jiye zt?L!yC-0d9EncL&d~OiLyjxlTPg znbc4ToiR=9G)g&|p1VJN%Zu{|n+R7nbgesEHF#!?(Tj&j!H$_-2}QwP(D$F8tgyC! zkwzM@-wa>+kEFM3e_mqGi^}Az;~H>x_u40o7J<*c82|0KezTkA>Dqkl>YL5%K1=T) z{<4(D)T?Hd`2IPq$oAh^HZ%WvUZ0Z9Z?y1E*(97^C$0BM@^RtM_$nad*>Lc7>xR%> zEy}I*zH2LOYa{9wuP9`1beLLdY%xw8aAG~h`BHcb56mtY-k2QU)SrGY=UTaeS7vO$ zUU%i|&iJQQp=E%DCfD6$@AJz)xOydYl9~>;{WW+(%JfUPKvf(nf4vm~hWT;F4tZuJ z+?ICUtvqyX&4upCz|(_^lkV{hcKq#bpmjYUuQeDxy{NJ1w@}sW!p{~ZRr++`jFK;e zXP<0!x!uum`?vF9JBEjGd8?E^9B=cF!}|3!6zj`DzDppHTuOq)av?&}N)=e&#^GFC zwF+1ifvE99Bn*{t2z^!O33yb@AuOl+0=^0^5{~lXl!$+vUw|ksLc|smTo;B3c=#4@WE_Baw&{Q&nNBf*&mD&G!|& zv(QlxhDsHBD~#+9G}Wl&Jy{?4rkl}+Gu9Ez{2lHG+HYgmD`Q%|zL1Ap6s>cQ@4+GH z)`!G$5h{lCw{($&E*6VuL_orZi8L6b5!nm|jR;eOVuZ?IAT*Y63>06cQo}M4qJzS~ zNhpRR5&|?Dh$Rz%5gL&umQaX7HpsvRu|$HL^_=gA~Xh546~?uD6t6gk}IV!mQGX(haqHzEKEP4BOG!Q z@Hqqu33x9NM8awbX22mVL1od}_Y(oA6!BNXIyONDiwUq9Y!G0w*i1J4y;2~eRAH5< z!vp~mbp%(J76=OlBNo=xDF&doz+!>8N(5HRl>u^jB!{4L39qx%mp9&JBq=;pg=xg< zDt@%){gJ4Vr;#lXiR!2DczxMIuxMlv6&!<%(23cNOo_r_Sr~%t@6m#KD@Xq!S!|F( zhgl*P5oRECB8`bKiEIkC2`N+%WC22KfEoHQ-l41H614_aB5q+=q*ydq0qLW`JL;*N z_o22X9MSOvP^d(JK?GR=AP4~<_ zOy3`P5E=F_NP`_`{0he1#EwFS!o}VmxMtn=QNiU-Ok$$o1*>qlNtU|H0Jme8EhaQl z^L;&ydJLybHlU!}3%W5;8sEb$fK`|8f5Q9%VEp`zzh8~XOMC8?qs=Bq&e+~Mi6@k1 zSmP|#^r;%p4Q`lUTv2|Xa=wwhXVn$p3JX{Ii<0hi0@_knKfg+_#PEu#|3v59Yr>%OL3l^SzAfH?flnuk#x#Hq)$ literal 0 HcmV?d00001