From a900660e551ccce5d78b9f619d705cb142fd2b49 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Thu, 5 Sep 2019 12:23:54 +0200 Subject: [PATCH] Eightball implemented. Adjustments to SMP 7243 recoil. --- Readme.md | 2 +- modeldef.eightball | 111 +++++++++ models/GrenadeM_a.3d | Bin 984 -> 80 bytes models/GrenadeM_d.3d | Bin 896 -> 592 bytes models/RocketM_a.3d | Bin 984 -> 676 bytes models/RocketM_d.3d | Bin 896 -> 736 bytes sounds/BarrelMv.ogg | Bin 6380 -> 0 bytes zscript/olsmp.zsc | 2 +- zscript/ueightball.zsc | 523 ++++++++++++++++++++++++++++++++++++++++- 9 files changed, 635 insertions(+), 3 deletions(-) delete mode 100644 sounds/BarrelMv.ogg diff --git a/Readme.md b/Readme.md index 13d1583..9841859 100644 --- a/Readme.md +++ b/Readme.md @@ -13,6 +13,7 @@ Doom Tournament (currently the devel branch is required). - Dual Automags - Stinger (slot 3) (replaces shotguns) - ASMD (slot 4) (replaces shotguns) + - Eightball (slot 5) (replaces rocket launcher) - Flak Cannon (slot 6) (replaces rocket launcher) - Backpack (replaces backpack, identical to Doom Tournament version) - Unreal 1 HUD @@ -38,7 +39,6 @@ Doom Tournament (currently the devel branch is required). ## In progress - - Eightball (slot 5) (replaces rocket launcher) - Razorjack (slot 7) (replaces chaingun) - GES Bio Rifle (slot 8) (replaces plasma rifle) - Rifle (slot 9) (replaces plasma rifle) diff --git a/modeldef.eightball b/modeldef.eightball index 84203ea..f9cc9e8 100644 --- a/modeldef.eightball +++ b/modeldef.eightball @@ -46,3 +46,114 @@ Model "Eightball" ROTATING FrameIndex EBLP A 1 0 } + +Model "URocket" +{ + Path "models" + Model 0 "RocketM_d.3d" + Skin 0 "JRocket1.png" + AngleOffset 90 + Offset 5 0 0 + Scale 0.05 0.05 0.06 + USEACTORPITCH + + FrameIndex RCKT A 0 1 + FrameIndex RCKT B 0 2 + FrameIndex RCKT C 0 3 +} + +Model "UGrenade" +{ + Path "models" + Model 0 "GrenadeM_d.3d" + Skin 0 "JRocket1.png" + AngleOffset 90 + Offset -2 0 0 + Scale 0.05 0.05 0.06 + USEACTORPITCH + + FrameIndex RCKT A 0 0 +} + +Model "Eightball" +{ + Path "models" + Model 0 "EightB_d.3d" + Skin 0 "JEightB1.png" + AngleOffset -90 + RollOffset -11.25 + Scale 0.1 -0.1 0.1 + Offset 0 -5.75 -4 + + // Select + FrameIndex EBLS A 0 0 + FrameIndex EBLS B 0 1 + FrameIndex EBLS C 0 2 + FrameIndex EBLS D 0 3 + FrameIndex EBLS E 0 4 + FrameIndex EBLS F 0 5 + FrameIndex EBLS G 0 6 + FrameIndex EBLS H 0 7 + FrameIndex EBLS I 0 8 + FrameIndex EBLS J 0 9 + FrameIndex EBLS K 0 10 + FrameIndex EBLS L 0 11 + FrameIndex EBLS M 0 12 + FrameIndex EBLS N 0 13 + FrameIndex EBLS O 0 14 + // Down + FrameIndex EBLD A 0 15 + FrameIndex EBLD B 0 16 + FrameIndex EBLD C 0 17 + FrameIndex EBLD D 0 18 + FrameIndex EBLD E 0 19 + FrameIndex EBLD F 0 20 + FrameIndex EBLD G 0 21 + FrameIndex EBLD H 0 22 + FrameIndex EBLD I 0 23 + FrameIndex EBLD J 0 24 + FrameIndex EBLD K 0 25 + FrameIndex EBLD L 0 26 + // Idle + FrameIndex EBLI A 0 27 + FrameIndex EBLI B 0 28 + // Idle2 + FrameIndex EBLI C 0 29 + // Loading + FrameIndex EBLL A 0 30 + FrameIndex EBLL B 0 31 + FrameIndex EBLL C 0 32 + FrameIndex EBLL D 0 33 + FrameIndex EBLL E 0 34 + FrameIndex EBLL F 0 35 + FrameIndex EBLL G 0 36 + FrameIndex EBLL H 0 37 + FrameIndex EBLL I 0 38 + FrameIndex EBLL J 0 39 + FrameIndex EBLL K 0 40 + FrameIndex EBLL L 0 41 + FrameIndex EBLL M 0 42 + FrameIndex EBLL N 0 43 + FrameIndex EBLL O 0 44 + FrameIndex EBLL P 0 45 + FrameIndex EBLL Q 0 46 + FrameIndex EBLL R 0 47 + FrameIndex EBLL S 0 48 + FrameIndex EBLL T 0 49 + FrameIndex EBLL U 0 50 + FrameIndex EBLL V 0 51 + FrameIndex EBLL W 0 52 + FrameIndex EBLL X 0 53 + FrameIndex EBLL Y 0 54 + FrameIndex EBLL Z 0 55 + FrameIndex EBLL [ 0 56 + // Fire + FrameIndex EBLF A 0 57 + FrameIndex EBLF B 0 58 + FrameIndex EBLF C 0 59 + FrameIndex EBLF D 0 60 + FrameIndex EBLF E 0 61 + FrameIndex EBLF F 0 62 + FrameIndex EBLF G 0 63 + FrameIndex EBLF H 0 64 +} \ No newline at end of file diff --git a/models/GrenadeM_a.3d b/models/GrenadeM_a.3d index 3321ffbae494886e1e2a6e03a310ba92b68ab605..0e7a48d85a004239cfdc316c31033cbaebc552c0 100644 GIT binary patch delta 32 pcmcb?9>BuL;KML+f`!Q5_xnCNzu5P2@B4jxRqyQ>+FsZ(007|#4(g>?YSLM#maK3&w*ZKP0U-!DVe{^lhU+nw1_x(OT<_=<^-Gk&C(TWA?B^Ujz5VA!C~z!YJ{ zFz@_!c2FF}oG@n)KC%5XERKXvZ08{uM=zNe9A{D%N94FgCx7Q_SbDjWZ>jW4;MZrT f0dmW|{Gaz=Zc)qsDe_&QiWk`}2@K3Ug9QTsa?^yb diff --git a/models/GrenadeM_d.3d b/models/GrenadeM_d.3d index d8cdb4064449c7f1129fcceb1c9348b2d2b049a8..9181c5d30d34265edf46e6dae6773579eba0d05f 100644 GIT binary patch delta 380 zcmZo*zrez*#2`FTP=2BUUp*Ux5CaPX14D3V{=EE91_oXRAqF-Oe_sB);7|qz9tK`8 z|6%Cgd4EG07z7x28F&~N7#`01JMUpA0|PsQ0GNLy^dXop$RNPL&cMKMWZuJhM?x7G zxEKV%{1u@`z$j?7yT%805@6tG;A7xsU|{H;w_;v* zC<6lv13#FbAKDG(3o-D69h^U}8|q*t1|f)p_vX)IU|?ooV&G+9U;AN0xU<2{z<`|9)>b7urr8(`A0$@g832*VhrpI3=Bu+J)CzWl!1YZK?2NQ5qbp7 z7h;fL;9_84STXO&ycMAg4BQMtV19S#3NT-kL5P8yfq|iW-imqMp$rTx45DCuerPwC zFUcSZc5nW?Zm@fW8AKQa7#JAh?xy}Jf6Txj!obhK$H2hAc}VAv{ALiJ4=m4lNPaWh z0+9ch7$hP7+nYa+fq|KUiGi1afgx;f{@&nuApbFg`48v)-1~PP0|N&GGlLid1H*&8 zKleVI$G{-LzyanTnfCz9XJp`DkYHe7IK214-XrrE7=#!Y!Tc5T4ukoe42%py3=9m* z_a5H6Vjcs7C<7;$-#u?Rn9s_<$sh{y@80EmyXP@5NHVa3`T6s@!F(nLRWMDWF`Vh?L0>>T$!-~)&U_LiEwipc2J`tC_!$Hl7#QR?>-@3Y!oa}CAP5eB`OTJFbS5$|2r}?9h%+!SSZ>kz z<9`^$7YEB*Zt*`Hw2*;8oPnP~n1O-8|FF)VxVs>}Fj(IIaNOOj0}Kqp4Ezit;P}@0 zllq5&L6$*=fro*a!J*2*jeh|HgA6!5GBY^1350|Ak__?;iVVyQZp?;U*7ghxiVO-2 zEDX#H*7nH`^(>(9Rs{3in62$Wd}#(D1}O$+25}34a0fRA1|)y^+VZTFmuY3E)z3=yZ ztg!#_D8B!YQha~Y-FW}KN(ugZ?>cU@Wk{~DW-zSS&Go+j-#-QkTLuOOdxrP@b&Q4; zyT1x_*fB77{QK+d(9T!o&d$KxVaIg7em9r1L;J_`^}D}1zu3p;{9@n7s`qvbB_C`U zx*QmBy5;ElKRhtE99_TX^DcQt{@wD7A9r83hZ2g3$^2BrurhI!|=vxDL&=7c$e@QLl8VR0mUVmlA6IQk{<>$4Lcx7^9MRD#8k oPX5l<80m$IZuu@y#f#4^YWY7!U~ajW|MMO#-IBn-%rjUp07n9ZuK)l5 diff --git a/models/RocketM_d.3d b/models/RocketM_d.3d index 8afb23a6f78a2715566fadc14b9f97283f6f3cb4..670eaa6822db40b8cf0d55bacf6ab2b7b37c273e 100644 GIT binary patch literal 736 zcmdO9kYOMNh%hiQFf%YP1c&C&%MWE>kYr$D5CQS$<a zjX{!uoq>Vj;k>`|9)>b7h%&H&`A0$@g89-6Yz(3d3=Bu+J)CzWl!1YhK^n|o5qbp7 z=VFj%;ACK6STXO&ycMAg4B`x2V19S#3NT-afr~+$fq|iW-imqMp$rVn3{qfzerPwC z&%_`Fc5nW?Zm4?&8JHmM-J3s;fkB8tkU^4xfgx;f{@&nuAomJ^`48v)-1~PP1A`cY z5Ca6F^ECT|8waM1A`!g5LkZspTmD3^1=*) zVELJMmj7X35Mf|uU;+6*G(U6&3n;!s!2E}yf5CiF26iz2Na#Z_pOZlp%wG|D1k4v_ z-~{u#Lsx+L%nagSetu{-n9sw&$H30O%-~Sv;Ksjzfq@Sk-^>gSZUW&TJ}B%37?>H{ zm<_qC?HL#Z7#JCt8JHQY?UNnqSwQ{=$%5pq?LmBQ1}+AE24)6v3xRM4HwFe?27U%k TB=h;f=>cIr2Ll@eACh_i5+RTn literal 896 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 QBj=^Quex zvZVYbD=G_#h$l~abSzYTw)>rpR!Vl+TWlF-I6RTLtL7}_^jvkygRoAf&5jRZ%QOFG zum4#&*IYo2qjT!)m4B0hXPYqxJ~8t=`qVK@lUrx!yr~yXw70LAvu~o;se`QHyxV`D zT4FC*%9lFnM7{5=NoqF(n;*Car8gb@xaIas9nWYR->EX+Q?h?+X4F>ZJv(RNZNPj& zcCXG{BXyVFEB7_(y0@4LEns{+nW390d5yrm`nR|4S!eg0Y~8fXJj&zC+f`C)&(z(} z4HerFzATu_9jj^=!p}WFc-hcnHY+6A2i77VUny<~uF%nt&a!vI7 z?q?JK|L3S|KD6X$)bm>#T{9=2US9gQF6Z#1Ek7q+(&s)cwc~N1lI9YZlK~IsOl?VG z`M2v$+y?w@|*AfkB;;4VsKbFJ-ghjv|KFP?XOQJ%d+K6_o}am9c8I) zsEFMW)~0qbbh=3DA;k+pmU6Sx&%K_v`1Admr<2VR&sW&z9Jg5?T72VAq1IZPik~l3 z@9gJH6v%nA=F;=i$KIQVOBCV@4Wc`Re}GrNp0L+3=xaF;tv&=#m4o$3@A(Ccipzzh1Jxgll_FecY<2-A;DXc zCF@kzOV{g6p1Qbto@l=Pj!WWd$B(VwyKi;;+@!71u`xASt3E2$+)!QrV&k*G)l7=6 zt*#%^UT@BEH9G2^+LX3@uED)~&o9jF57O~!q;oog 0 ) + { + double MagnitudeVel = Vel.length(); + SeekingDir = (SeekingDir*0.5*MagnitudeVel+Vel).unit(); + Vel = MagnitudeVel * SeekingDir; + invoker.Acceleration = 25 * SeekingDir; + } + } + } + States + { + Spawn: + RCKT ABC 1 + { + roll += 30; + if ( invoker.ticcnt++ > 3 ) + { + invoker.ticcnt = 0; + A_RocketSeek(); + } + vel += invoker.Acceleration/TICRATE; + if ( vel.length() > 30. ) vel = Vel.unit()*30.; + Vector3 dir = vel.unit(); + if ( waterlevel <= 0 ) vel = dir*min(vel.length()+1,24); + angle = atan2(dir.y,dir.x); + pitch = asin(-dir.z); + for ( int i=0; i<3; i++ ) + { + let s = Spawn("UTSmoke",pos); + s.vel = (FRandom[Eightball](-0.2,0.2),FRandom[Eightball](-0.2,0.2),FRandom[Eightball](-0.2,0.2)); + s.vel += vel*0.1; + } + } + Wait; + Death: + TNT1 A 0 + { + A_RocketExplode(100,200); + return A_Jump(256,"Explo1","Explo2","Explo3","Explo4","Explo5"); + } + Explo1: + EXP1 ABCDEFGH 3 Bright; + Stop; + Explo2: + EXP2 ABCDEFGH 3 Bright; + Stop; + Explo3: + EXP3 ABCDEFGH 3 Bright; + Stop; + Explo4: + EXP4 ABCDEFGH 3 Bright; + Stop; + Explo5: + EXP5 ABCDEFGH 3 Bright; + Stop; + } +} + +Class UGrenade : URocket +{ + double rollvel, pitchvel, anglevel; + + Default + { + DamageType 'GrenadeDeath'; + -NOGRAVITY; + +USEBOUNCESTATE; + -EXPLODEONWATER; + +CANBOUNCEWATER; + +NOEXPLODEFLOOR; + +DONTBOUNCEONSHOOTABLES; + BounceType "Hexen"; + WallBounceFactor 0.75; + BounceFactor 0.75; + ReactionTime 85; + Speed 15; + Gravity 0.35; + } + override void PostBeginPlay() + { + Actor.PostBeginPlay(); + rollvel = FRandom[Eightball](-8,8); + pitchvel = FRandom[Eightball](-8,8); + anglevel = FRandom[Eightball](-8,8); + ReactionTime += Random[Eightball](0,20); + } + States + { + Spawn: + RCKT A 1 + { + if ( !bNOGRAVITY ) + { + angle += anglevel; + pitch += pitchvel; + roll += rollvel; + } + let s = Spawn("UTSmoke",pos); + s.scale *= 2.0; + s.alpha *= 0.6; + s.vel = (FRandom[Eightball](-0.1,0.1),FRandom[Eightball](-0.1,0.1),FRandom[Eightball](-0.1,0.3)); + s.vel += vel*0.05; + s.SetShade("000000"); + A_Countdown(); + } + Wait; + Bounce: + RCKT A 0 + { + bHITOWNER = true; + A_PlaySound("utrl/bounce"); + rollvel = FRandom[Eightball](-16,16); + pitchvel = FRandom[Eightball](-16,16); + anglevel = FRandom[Eightball](-16,16); + if ( vel.z > 10 ) vel.z = 0.5*(10+vel.z); + else if ( BlockingFloor && (vel.xy.length() < 0.5) ) + { + vel *= 0; + bNOGRAVITY = true; + bMOVEWITHSECTOR = true; + ClearBounce(); + } + } + Goto Spawn; + Death: + TNT1 A 0 A_RocketExplode(120,200); + Goto Super::Death+1; + } +} + Class Eightball : UnrealWeapon { + bool LockedOn; + Actor LockedTarget; + TextureID lockontex; + int locktics; + bool bSingleRocket; + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + lockontex = TexMan.CheckForTexture("Crosshr6",TexMan.Type_Any); + } + + override void PreRender( double lbottom ) + { + if ( LockedTarget ) Screen.DrawTexture(lockontex,false,Screen.GetWidth()*0.5,Screen.GetHeight()*0.5); + } + + override void Tick() + { + Super.Tick(); + if ( !Owner ) return; + if ( Owner.Health <= 0 ) + { + LockedTarget = null; + LockedOn = false; + crosshair = 0; + return; + } + if ( LockedOn && (!LockedTarget || (LockedTarget.Health <= 0) || !LockedTarget.bIsMonster || LockedTarget.bKilled || LockedTarget.bCorpse || !LockedTarget.bShootable || (Owner.player.ReadyWeapon != self)) ) + { + LockedTarget = null; + LockedOn = false; + if ( Owner.player.ReadyWeapon == self ) + { + Owner.A_PlaySound("utrl/seeklost",CHAN_WEAPON,Dampener.Active(Owner)?.1:1.); + if ( !Dampener.Active(Owner) ) Owner.A_AlertMonsters(); + } + } + if ( LockedTarget ) crosshair = 99; + else crosshair = 0; + } + + // consumes 1 ammo + action void A_LoadRocket( bool checktarget = true ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + if ( weap.bAltFire ) + { + invoker.LockedTarget = null; + invoker.LockedOn = false; + } + if ( checktarget && !weap.bAltFire ) A_CheckTarget(); + invoker.special1++; + } + + // refire that is ignored if there's no ammo + action void A_LoadedRefire( statelabel flash = null ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + A_Refire(flash); + } + + // fire all the rockets (or grenades) + action void A_FireRockets( int num ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + invoker.special1 = 0; + if ( weap.bAltFire ) + { + A_PlaySound("utrl/altfire",CHAN_WEAPON,Dampener.Active(self)?.3:3.); + if ( !Dampener.Active(self) ) A_AlertMonsters(); + } + else + { + A_PlaySound("utrl/fire",CHAN_WEAPON); + A_AlertMonsters(); + } + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(64,255,0,0),1); + if ( self is 'UTPlayer' ) + UTPlayer(self).PlayAttacking3(); + A_QuakeEx(2+num,2+num,2+num,6+num,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1+num*0.05); + for ( int i=0; i1)?12:0); + Vector3 dir = (x2+cos(a)*y2*s*0.004+sin(a)*z2*s*0.004).unit(); + p = Spawn("UGrenade",origin+cos(a)*y*s+sin(a)*z*s); + p.vel = x*(vel dot x)*0.4 + dir*p.speed*FRandom[Eightball](1.0,1.2); + p.vel.z += 3.5; + p.target = self; + } + } + else if ( num <= 1 ) + { + // single rocket + p = Spawn("URocket",origin+cos(a)*y*s+sin(a)*z*s); + p.vel = x2*p.speed; + p.target = self; + p.tracer = invoker.LockedTarget; + } + else if ( player.cmd.buttons&BT_ALTATTACK ) + { + // rockets ("tight wad" as UT calls it) + double step = 360/num; + a = 90; + s = (num>1)?6:0; + for ( int i=0; i 2000 ) continue; + if ( reldir.unit() dot viewdir < 0.99 ) continue; + if ( reldist < closest ) + { + closest = reldist; + invoker.LockedTarget = a; + } + } + if ( invoker.LockedTarget ) + { + A_PlaySound("utrl/seeklock",CHAN_WEAPON,Dampener.Active(self)?.1:1.); + if ( !Dampener.Active(self) ) A_AlertMonsters(); + } + else if ( invoker.LockedOn ) + { + A_PlaySound("utrl/seeklost",CHAN_WEAPON,Dampener.Active(self)?.1:1.); + if ( !Dampener.Active(self) ) A_AlertMonsters(); + } + if ( invoker.LockedTarget ) invoker.LockedOn = true; + } + Default { Tag "$T_EIGHTBALL"; Inventory.PickupMessage "$I_EIGHTBALL"; - Weapon.UpSound "eightball/select"; + Weapon.UpSound "utrl/select"; Weapon.SlotNumber 5; Weapon.SelectionOrder 5; Weapon.AmmoType "URocketAmmo"; @@ -74,5 +509,91 @@ Class Eightball : UnrealWeapon Stop; EBLP B -1; Stop; + Select: + EBLS A 1 A_Raise(int.max); + Wait; + Ready: + EBLS ABCDEFGHIJKLMNO 1 A_WeaponReady(WRF_NOFIRE); + Ready2: + EBLS O 0 A_CheckReload(); + EBLL A 0 A_PlaySound("utrl/load",CHAN_ITEM,Dampener.Active(self)?.1:1.); + EBLL ABCDEFGHIJK 2 A_WeaponReady(WRF_NOFIRE); + EBLL L 0 A_PlaySound("utrl/rotate",CHAN_ITEM,Dampener.Active(self)?.01:.1); + EBLL LMNOPQRSTUVWXYZ[ 1 A_WeaponReady(WRF_NOFIRE); + EBLL Z 0; // force no tweening + EBLI A 0; + Goto Idle; + Idle: + #### # 0 A_Overlay(-9999,"Dummy"); + EBLI AB 50; + Goto Idle+1; + Dummy: + TNT1 A 1 + { + invoker.locktics = 0; + invoker.special1 = 0; + A_CheckReload(); + A_WeaponReady(WRF_ALLOWRELOAD); + } + TNT1 A 1 + { + A_CheckReload(); + A_WeaponReady(WRF_ALLOWRELOAD); + invoker.locktics++; + if ( invoker.locktics > 42 ) + { + invoker.locktics = 0; + A_CheckTarget(); + } + } + Wait; + Reload: + #### # 5 + { + A_Overlay(-9999,"Null"); + A_PlaySound("utrl/load",CHAN_6,Dampener.Active(self)?.03:.3); + if ( invoker.bSingleRocket = !invoker.bSingleRocket ) + A_Print(StringTable.Localize("$M_SINGLEROCKETON")); + else A_Print(StringTable.Localize("$M_SINGLEROCKETOFF")); + } + Goto Idle; + Fire: + AltFire: + // one is loaded already + #### # 1 + { + A_Overlay(-9999,"Null"); + A_LoadRocket(false); + } + #### # 3 A_JumpIf(!invoker.bAltFire&&invoker.bSingleRocket,"Release"); + #### # 0 A_LoadedRefire(1); + Goto Release; + Loading: + EBLI A 0; + EBLL A 0 A_LoadRocket(); + EBLL A 0 A_PlaySound("utrl/load",CHAN_ITEM,Dampener.Active(self)?.1:1.); + EBLL ABCDEFGHIJK 2; + EBLL L 0 A_PlaySound("utrl/rotate",CHAN_ITEM,Dampener.Active(self)?.01:.1); + EBLL LMNOPQRSTUVWXYZ[ 1; + EBLL Z 0; + EBLI A 0; + EBLI A 1 A_JumpIf(invoker.special1>=6,2); + EBLI A 0 A_LoadedRefire("Loading"); + Goto Release; + EBLI A 2; + LoadHold: + EBLI C 2; + EBLI C 0 A_LoadedRefire("LoadHold"); + Goto Release; + Release: + EBLF A 0 A_FireRockets(invoker.special1); + EBLF ABCDEFGH 3; + EBLS S 0; + Goto Ready2; + Deselect: + EBLD A 1 A_Overlay(-9999,"Null"); + EBLD BCDEFGHIJKL 1; + EBLD L 1 A_Lower(int.max); + Wait; } }