From c782fec486da6a560aec831c6eaf781ad1dd0700 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 30 Dec 2021 01:52:21 +0100 Subject: [PATCH] Weapon swap adjustments for dual-wieldables. Weapon swap fix for Candygun. --- language.version | 4 +- modeldef.explodiumgun2 | 13 ++ models/ExplodiumGunPickupDual_a.3d | Bin 0 -> 2212 bytes models/ExplodiumGunPickupDual_d.3d | Bin 0 -> 13072 bytes zscript/weapons/swwm_baseweapon.zsc | 223 ++++++++++++++++++++++++++-- zscript/weapons/swwm_tastytreat.zsc | 4 +- 6 files changed, 232 insertions(+), 12 deletions(-) create mode 100644 models/ExplodiumGunPickupDual_a.3d create mode 100644 models/ExplodiumGunPickupDual_d.3d diff --git a/language.version b/language.version index ed16a6c7c..3ff93378d 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r101 \cu(Wed 29 Dec 21:46:20 CET 2021)\c-"; -SWWM_SHORTVER="\cw1.2pre r101 \cu(2021-12-29 21:46:20)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.2pre r102 \cu(Thu 30 Dec 01:52:21 CET 2021)\c-"; +SWWM_SHORTVER="\cw1.2pre r102 \cu(2021-12-30 01:52:21)\c-"; diff --git a/modeldef.explodiumgun2 b/modeldef.explodiumgun2 index 91faa2578..eeec5cb05 100644 --- a/modeldef.explodiumgun2 +++ b/modeldef.explodiumgun2 @@ -570,3 +570,16 @@ Model "DualExplodiumGun" FrameIndex XZWN O 1 306 FrameIndex XZWN P 1 307 } + +Model "SWWMDualWeaponGiver" +{ + Path "models" + + Model 0 "ExplodiumGunPickupDual_d.3d" + Skin 0 "ExplodiumGun.png" + Scale 0.05 0.05 0.05 + ZOffset 16 + ROTATING + + FrameIndex XZW1 A 0 0 +} diff --git a/models/ExplodiumGunPickupDual_a.3d b/models/ExplodiumGunPickupDual_a.3d new file mode 100644 index 0000000000000000000000000000000000000000..a7e512b885e32e05909e98ee9d44dfdb2928eec0 GIT binary patch literal 2212 zcmZQ%SiljrxJmryBWI?lZ*E}!TUhqhAzR-|7 z`TEEUH|AatmhfagBH_vW@T42lLrYJl<0st?9Jlm5aQs#4f#XtL2kyUeWx6lr#dP`m z(W95ePaQQo#89`LBL{hXm=6ARX1cle$dOa~j~sdQ-mMD zz1T@@skxil((9gT?(4kO+~Zu-F0S`hb4~SCyBP1Hc6W-e{M|L&UUy?yyzZ7b$uB8( zlD`_w;(m2CxBHUGzVh#NJU#D*^y%H*bJq5*&mr5pTN?G=dLOcVySY)1(a+2M?e4R- zZ-e{vn0&p$-rsTaWZdWK{(g#!=lc?GPhUSTC#JowVZQrZo!ra1Z7xo4vAGcMqIR*o z+vdV`Pqho?ZfY0Oebp{3cT!tge@yE_{V}bj{U^09^qsoI$*H{;| zrTNEoFXSKBT{{1S?uGd$beG=mR9L#7L+(O}x6_3wE>0IfW=?Oh@r+|}zZlQresMjw zyXQJ?_lx__+IsFgYwPKE$o8WDA=``FeVjbE`8auoIXhhpcXo20)?#yOiIdu`6koMl zQ(A0pm2}%&SnsX&aF46gLmw}vt&3UQw~E*H0XBsOyq-=xdcdP~Rncpubhtq0e=fL!H;I1O2YM z4%B8{Foxc1^qc+BNMSYv;4EZ<^1>xha92eNzHE=O%{s<0~23Ppo8M_uRn1 z?!F(5?rv1dl`E188&SyJ$F@gQ~#RT?~7pn@}Usg@*c-dEYoT+c( z38uG&?JwU>?0ESW%s$T4SLpt&Z=%Pyw}tNC-cI!RcG28T?c#M$wOcVRYPZ&StGO<9 zQgik7v3K3;Z0}v_?c_bx#c8QOyWCR!Hif14UDcNAd#RZn^Lk|F=KAR5aj!=w-CZAD z_4jhRy5H5w+t(myTi}h`a7xUfaFV6Rnzu4cY=xOGr=6TIi&9kme z(KF9o-gBOZyk}ph;st##wF~!M)h_6_DO~Vpm%9Lp|NET^!Y)U3gmc^sg;_X^h39x0 z3LiP8BW%*GCVYfTL3mE5v@pvFN#UF}X<-*u1>q|#YQiiXY7eips6BK!s`D_%&F~=$ zhw;NXo`w&PoYHw{(yjLJ2$#acIi1oESx!hk%xRN;=)$TH&hD{!1)Ila2KEyh!`V-q zU%__b{IZn2;_Rw5Ov{#R5@&x}%=B(+HPgG$5+;k#Y9@=VB~1L^sz5r`4ZF^0HEcb@v8{S9M_9>Tak-r@#pQNB5r4N0gkRo}`}z8doaKuz@62A@c=zqK zjeI3@F$ljeW43u;#w>4F$s~WSjLFij@_^;JvICZ~yAD{s-FiS#wu(vdZ7Gwkz^|ja zAHE(vVkv<%s>SVkUd88YXqG-$%?mejkzJs9`eO@#Tozk7B0MB}HmBi;L83l55pUQ)<DZc~ymN_N;Q+IdO}Pe!*@VgB8_k`V+R;7#NhP z8CQTErW`0S~k0j?QOhk>~}|%sO?@=trk7whpxel zAG*;Q-*pW#zUxM7Y*UE#Fqbo!T;gO>^l}q-zI|2!$$P80eL3S^n$vW%eKEcC%M7^V|Jg z&wuXQdff{@4(S?vKXjmTtL%ZwU9t`xTV)+8cF7*7tlD*;vvik3Mb$2cj?!Ig8!OhX zZ7g3K(onHBq@jFmBBSM|L`L&X3m7anEnqO;#L)O-B}3!)l?;sK8yFZXH>_>^adB$|5Uo+A7JZ{s?UZBbqf-Z~9+^9oJ~BU0^+qAH_L&v(+cV4M zw^wdcG`LZ!W}s1}W^iMtg24_8IRjAqYiv_^d-#{m+u4$;$N-fj)4!tfB5S$0|P4q zKZ8621H+qNuOEGQ2;$2#$b$JF9)9@6z`(}9#h}2zz;JWtjSJV$f%pmxN?`u=b2oM{ zFt9UlGw?GoFr43U;lhavAU;0>E0}-c!m*toz9IuRn1Auy1+cs_gCdxJVaLUD3=A9$ zDhx|O=3Tw<^Xg9!e<{OaF#qb$YgZW=ZfBxs`uORvP zVEfNqJ^dAAKNkZBSpSU+H?M;9b20ESa4;}1+_-T6!p*A;4BQNyVD%R+oVyBA&&|LE zR)68bjSC?4+zbi~Tnr2h7cN{scjE#`y&~BE7cN{p2l78R!(y;|E?l^F733Zs1{H<{ z3=9l+e%|&nzW{?UgE#{N!;AVi^>4Zu7z7x^8AKrbt`}Vl41x>-VE)g# z-}S%1d=Umw1_p+ob-%iPfcc^fVqpG{uCHLe7=sX)|F!E&9Rq_9gBaNSFLhtLK6irn z;tawJ3=CiDK6ieqXJ8Oz5Mhu2rH`&(UB9P-_!10~VE*r^Kc+J%~-%f5aK2!S=oB zdNcLKR0aka23c@;eEId^7brYr805j}_sg#j4?*cyjzOMbA;`TCKRo<&jDbOpVF5Tj ze|h-*C@4KEGbn)5*M%L|&wN=rGI#*_UCIp_j(MpusQ`tlm3AFAbvp4#QoL{mNUVw<GD+UGz15RU3VN`@MUy!2(Td<{brn15ONJec3a;1A}Xmp;S7z~Ii{#?S*Q52u`+a$y39-^0)i z=3kg_a{>c{2SXr38v_HwgStm;51JSlJQ;i#!WbABPR)Ke`_U2*Ka3$5%zw1x#1aMu zFNPq7P*8cl@zk1!Ye4)^25&I`;hMV}LHsI)76t}}M`e#po|-T)_%OIK_%Sdr>@D8I za)brM_XC^1xA+Ll(Fz6zUxsjoXi)qeP&g}kfPuk}!Ihz%fq~&f+sV3lph z>wnbtpbw-!kRh0%0j&N*#S0UVd_6+|nEz7xB@2k(z)%n7zc6_z4dPz}hwr1dJ58YQ z4Px*DhtG?OM`fV!31SEa`|s466H7qh9mEg@4&PI29xVZdZxBNR*gY>QUYLN~6T%SA z;LE_kpzuiHto8v0hERq^aQL6CxL|U*jDaDHp%$$FXvGs5e%^mkqitBvR?$B z3teJhh-8Rmh+<%15V|Dzob3w(Lo`D;LkI%{gXjT;vkH$G7-AUW!RgDuSI5iPlYt?Y zAp)#k@VV?4koq`=N`_WYdW|%W(TQPTNMLXT^Hn$vlvI>Jd>3$fR^c?@1f}N$h9rgy z3=9l{F@j$5ejxb^;QSyMBku>w4~YyP88R3c7;Ix~BOJmR7?Kzq7@Qaw82mV$m7F<2 z{CEZjFyBwfS&4xmmBE0)8I)g7Z2h_J69Yp!Lkfc($o(=>3Ze=ieg;DdgfAln=I1jM zfcc^lQW7Bf0pK>Q+xLI__( zRD^*ci@}~DnSp^pieHpRiU-6`X7~UqZ~SfjY<)reOa^<1JijOp14A~0HMo3R5WFY> zRK8_1*f8WUFfc3#?n&qi2FW{v%e#fY)_q#{3&hW1CihA#{Z47>uoq8y?i{uhR?U_OT^hX4aZ3BwJB&mg`iuM~$Ai2oU) zUX()$q`s7)jNvf@1H-(Z6Mjzm$iPs_@R;Edm_O;`oR16)WenHB@)Lee_z03OXUJmc z0@dGM4*s^D3=9}hzoZ{AKb2-+sAPx%=Lh2$17A>nsAPy^ zh+$x0Fpe>ZH1GwF% z;04aFmrWj(f%0oLgEvDXsJu40Tz0{PfuWkAiopxae`NBgjDewsAs$@58++<_8Mrer z)G{=J^Y`3-5;dnr{u@Uz|h2y1a@zb zk{@RfCj&z>Lju_U3Q8)Rp#0y=P!BF2pGv=!29=M^3=LrWpGv;~*9XlEE#UA`P*UJj z;bdTFVWcaLE+WGaFHPpR6q6JX?oPgz|hIi!{7$0UwSW0I6H-bp^G64oZoCc z9sEK0t&1U-;Ryo+LxfQTM+yf>{s}n!MHr=Uq!=+UbTf2-%ln%X?)2W7!obkSFo~g; zfq^0PN8*>%pCJBZhDl(4;lAEz_S1h9|67#Q@@*vi>b7#LiQR<}U>I7v3HHbPUvASirym?hoAgdh_c2 z3k(bk805g_e?R&K++SG0paSj>-uZgtC#XNTfMGVnJO&1a??=C_|Fs^ZejWo4nEz}2 zucHhM3mN8s-Sg?#`}H9AEM%Auw*S+ycSk|?FJ)K)?mu4rc@f;-T*|Nv+&{ef^U_aH z|8N-tCzyZf=Q(hHaT$Xu11AFm!=<0+f1bO_z;Kk|G{ad?{XO^N;x~&x{Id+F!2CCh z-pplSIL2_2;T!`4!{@m_=Kfd&;-6zU1K}_FyqJOEG{a$r;~@2mKdyMa0>nQKF>mqf z6(IA@FdSw$4N|}Okik|5)^M1p~t+20w87>1@-9HcUd*K9Wi zhN}!V;P!9dr^a8P_U~1O9B}>C_o?q!<1dhW8MuDy`!wNaADDj~T%YxQn(%SLPX>l- z45g6r`QyBwpz`@9!zW1jF2^AUD&KE1d}g=-Dxc&yqaBsXw@R1wi%3ZH5ov`kI%UgPQ{^{}o(*@N#nq zaBwp)JYc8*mlyuN-qE1?>H)(;aDC

mLECuO2Ww0@oiIMj0H193b_N86Gk)Fk~1N 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 literal 0 HcmV?d00001 diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index 695c6182f..0a686de37 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -26,6 +26,13 @@ Class SWWMWeapon : Weapon abstract let w = SWWMWeapon(i); if ( w && !w.bNoSwapWeapon && (SlotNumber != -1) && (w.SlotNumber == SlotNumber) ) return true; + let wg = SWWMDualWeaponGiver(i); + if ( wg ) + { + let w = wg.giveme[0]; + if ( w && !w.bNoSwapWeapon && (SlotNumber != -1) & (w.SlotNumber == SlotNumber) ) + return true; + } return false; } @@ -79,20 +86,33 @@ Class SWWMWeapon : Weapon abstract SWWMWeapon sw; if ( swwm_swapweapons && (sw = HasSwapWeapon(user)) ) { + // special case, otherwise candy gun won't drop itself + if ( sw is 'CandyGun' ) CandyGun(sw).swapdrop = true; if ( (sw == user.player.ReadyWeapon) || (sw.SisterWeapon && (sw.SisterWeapon == user.player.ReadyWeapon)) ) swapto = true; int ngun = sw.Amount; - double ang = -15*(ngun-1); - for ( int i=0; i 1) ) + Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),sw.SisterWeapon.GetTag(),GetTag())); + else Console.MidPrint(SmallFont,String.Format(StringTable.Localize("$SWWM_SWAPWEAPON"),sw.GetTag(),GetTag())); + } + return; + } + // explicit use-to pickup, function must be called from Used() virtual + if ( toucher.player && swwm_usetopickup && !bUsePickup ) + return; + Super.Touch(toucher); + } + + override bool Used( Actor user ) + { + // can't pick up + if ( !bSPECIAL ) return false; + // no use through melee + if ( (user.player.ReadyWeapon is 'SWWMWeapon') && SWWMWeapon(user.player.ReadyWeapon).wallponch && !swwm_meleepickup ) + return false; + Vector3 itempos = Vec3Offset(0,0,Height/2), + userpos = user.Vec2OffsetZ(0,0,user.player.viewz); + // test vertical range + Vector3 diff = level.Vec3Diff(user.Vec3Offset(0,0,user.Height/2),Vec3Offset(0,0,Height/2)); + double rang = user.player?PlayerPawn(user.player.mo).UseRange:(user.Height/2); + if ( abs(diff.z) > rang ) return false; + // if the toucher owns our SwapWeapon, drop it before picking us up + bool swapto = false; + SWWMWeapon sw; + if ( swwm_swapweapons && (sw = giveme[0].HasSwapWeapon(user)) ) + { + // no need for candygun check here + if ( (sw == user.player.ReadyWeapon) || (sw.SisterWeapon && (sw.SisterWeapon == user.player.ReadyWeapon)) ) + swapto = true; + int ngun = sw.Amount; + if ( ngun == 2 ) + { + // create a dual giver + let dg = SWWMDualWeaponGiver(Spawn("SWWMDualWeaponGiver",pos)); + dg.angle = angle; + dg.vel = vel; + dg.FloatBobPhase = FloatBobPhase; + // transfer both guns + dg.giveme[0] = SWWMWeapon(sw.CreateTossable(1)); + dg.giveme[0].AttachToOwner(dg); + dg.giveme[1] = SWWMWeapon(sw.CreateTossable(1)); + dg.giveme[1].AttachToOwner(dg); + dg.SetPickupState(); + } + else + { + // swap in-place + let d = user.DropInventory(sw); + d.SetOrigin(pos,false); + d.angle = angle; + d.vel = vel; + d.FloatBobPhase = FloatBobPhase; + } + // don't autoswitch just yet (hacky) + if ( swapto ) + { + user.player.ReadyWeapon = null; + user.player.PendingWeapon = WP_NOCHANGE; + } + } + bUsePickup = true; + Touch(user); + bUsePickup = false; + // we got picked up + if ( bDestroyed || Owner || !bSPECIAL ) + { + // autoswitch to us if we got swapped + if ( swapto ) user.A_SelectWeapon(giveme[0].GetClass()); + Vector3 tracedir = level.Vec3Diff(userpos,itempos); + double dist = tracedir.length(); + tracedir /= dist; + let cf = new("CrossLineFinder"); + cf.Trace(userpos,level.PointInSector(userpos.xy),tracedir,dist,0); + // trigger all player cross lines found between user and item + for ( int i=0; i 0 ) + if ( (Ammo2.Amount > 0) && !swapdrop ) { // drop an empty spare let spare = Inventory(Spawn('CandyGun',Owner.Pos,NO_REPLACE)); @@ -339,6 +340,7 @@ Class CandyGun : SWWMWeapon Ammo2.Amount--; return spare; } + swapdrop = false; return Super.CreateTossable(amt); }