diff --git a/modeldef.chainsaw b/modeldef.chainsaw index faf11c1..12016cd 100644 --- a/modeldef.chainsaw +++ b/modeldef.chainsaw @@ -32,7 +32,7 @@ Model "UTChainsaw" SurfaceSkin 0 2 "Jchainsaw3.png" SurfaceSkin 0 3 "Jchainsaw4.png" Scale -0.24 0.12 0.24 - Offset 5.6 -14.8 -7.2 + Offset 6.4 -14.8 -7.2 // these adjustments are my own so it looks right, otherwise it just clips through the screen // this kinda happens in UT too, since it was made without widescreen in mind AngleOffset 5 diff --git a/modeldef.flak b/modeldef.flak index 19b578a..9d4ba85 100644 --- a/modeldef.flak +++ b/modeldef.flak @@ -758,8 +758,8 @@ Model "FlakCannon" SurfaceSkin 0 4 "flakammoledbase.png" AngleOffset 90 PitchOffset 180 - RollOffset 174.35 - Scale 0.28 -0.12 0.28 + RollOffset 174.375 + Scale 0.28 -0.14 0.28 Offset 8.6 -10.4 -12.8 // select diff --git a/modeldef.ges b/modeldef.ges index a748699..d18f08c 100644 --- a/modeldef.ges +++ b/modeldef.ges @@ -262,7 +262,7 @@ Model "BioRifle" AngleOffset 94.21875 RollOffset 8.4375 Scale 0.125 -0.06 0.125 - Offset 9.8 -17.6 -10.4 + Offset 9.8 -17.6 -9.4 // select FrameIndex BIOS A 0 0 diff --git a/modeldef.impact b/modeldef.impact index 8a80ec7..b0f3ae3 100644 --- a/modeldef.impact +++ b/modeldef.impact @@ -33,7 +33,7 @@ Model "ImpactHammer" AngleOffset 90 RollOffset -85 Scale 0.1 -0.05 0.1 - Offset 5.8 -12.8 -7.7 + Offset 4.8 -11.8 -6.7 // select FrameIndex IMPS A 0 0 diff --git a/modeldef.minigun b/modeldef.minigun index fcfb3ee..6f960f3 100644 --- a/modeldef.minigun +++ b/modeldef.minigun @@ -10,6 +10,19 @@ Model "MiniAmmo" FrameIndex MAMO A 0 0 } +Model "MinigunTracer" +{ + Path "models" + Model 0 "MiniTrace_d.3d" + Skin 0 "JUT_Tracer_01.png" + Scale 0.6 0.2 0.24 + USEACTORPITCH + USEACTORROLL + DONTCULLBACKFACES + + FrameIndex TRAC A 0 0 +} + Model "Minigun" { Path "models" @@ -33,3 +46,239 @@ Model "Minigun" FrameIndex MGNP B 1 0 } + +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz1.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ A 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz2.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ B 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz3.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ C 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz4.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ D 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz5.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ E 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz6.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ F 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz7.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ G 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz8.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ H 2 0 +} +Model "Minigun" +{ + Path "models" + Model 2 "Flat_d.3d" + Skin 2 "Muz9.png" + Scale 0.08 0.08 0.08 + Offset 5.0 -32.0 -8.0 + AngleOffset 90 + PitchOffset 90 + + FrameIndex MMUZ I 2 0 +} + +Model "Minigun" +{ + Path "models" + Model 0 "Minigun2m_d.3d" + SurfaceSkin 0 0 "Mini_t1.png" + SurfaceSkin 0 1 "Mini_t2.png" + SurfaceSkin 0 2 "Mini_t3.png" + SurfaceSkin 0 3 "Mini_t4.png" + SurfaceSkin 0 4 "miniammoledbase.png" + Scale 0.12 -0.06 0.12 + Offset 0.0 -15.5 -12.8 + AngleOffset 90 + + // Select + FrameIndex MGNS A 0 0 + FrameIndex MGNS B 0 1 + FrameIndex MGNS C 0 2 + FrameIndex MGNS D 0 3 + FrameIndex MGNS E 0 4 + FrameIndex MGNS F 0 5 + FrameIndex MGNS G 0 6 + FrameIndex MGNS H 0 7 + FrameIndex MGNS I 0 8 + FrameIndex MGNS J 0 9 + FrameIndex MGNS K 0 10 + FrameIndex MGNS L 0 11 + FrameIndex MGNS M 0 12 + FrameIndex MGNS N 0 13 + FrameIndex MGNS O 0 14 + FrameIndex MGNS P 0 15 + FrameIndex MGNS Q 0 16 + FrameIndex MGNS R 0 17 + FrameIndex MGNS S 0 18 + FrameIndex MGNS T 0 19 + // Fire + FrameIndex MGNF A 0 61 + FrameIndex MGNF B 0 62 + FrameIndex MGNF C 0 63 + FrameIndex MGNF D 0 64 + FrameIndex MGNF E 0 65 + FrameIndex MGNF F 0 66 + FrameIndex MGNF G 0 67 + FrameIndex MGNF H 0 68 + FrameIndex MGNF I 0 69 + FrameIndex MGNF J 0 70 + FrameIndex MGNF K 0 71 + FrameIndex MGNF L 0 72 + FrameIndex MGNF M 0 73 + FrameIndex MGNF N 0 74 + FrameIndex MGNF O 0 75 + FrameIndex MGNF P 0 76 + FrameIndex MGNF Q 0 77 + FrameIndex MGNF R 0 78 + FrameIndex MGNF S 0 79 + // Unwind + FrameIndex MGNU A 0 80 + FrameIndex MGNU B 0 81 + FrameIndex MGNU C 0 82 + FrameIndex MGNU D 0 83 + FrameIndex MGNU E 0 84 + FrameIndex MGNU F 0 85 + FrameIndex MGNU G 0 86 + FrameIndex MGNU H 0 87 + FrameIndex MGNU I 0 88 + FrameIndex MGNU J 0 89 + FrameIndex MGNU K 0 90 + FrameIndex MGNU L 0 91 + FrameIndex MGNU M 0 92 + FrameIndex MGNU N 0 93 + FrameIndex MGNU O 0 94 + FrameIndex MGNU P 0 95 + FrameIndex MGNU Q 0 96 + FrameIndex MGNU R 0 97 + FrameIndex MGNU S 0 98 + FrameIndex MGNU T 0 99 + FrameIndex MGNU U 0 100 + FrameIndex MGNU V 0 101 + FrameIndex MGNU W 0 102 + FrameIndex MGNU X 0 103 + FrameIndex MGNU Y 0 104 + FrameIndex MGNU Z 0 105 + FrameIndex MGU2 A 0 106 + FrameIndex MGU2 B 0 107 + FrameIndex MGU2 C 0 108 + FrameIndex MGU2 D 0 109 + FrameIndex MGU2 E 0 110 + FrameIndex MGU2 F 0 111 + FrameIndex MGU2 G 0 112 + FrameIndex MGU2 H 0 113 + FrameIndex MGU2 I 0 114 + FrameIndex MGU2 J 0 115 + FrameIndex MGU2 K 0 116 + FrameIndex MGU2 L 0 117 + FrameIndex MGU2 M 0 118 + // Idle + FrameIndex MGNI A 0 121 + FrameIndex MGNI B 0 122 + FrameIndex MGNI C 0 123 + FrameIndex MGNI D 0 124 + FrameIndex MGNI E 0 125 + FrameIndex MGNI F 0 126 + FrameIndex MGNI G 0 127 + FrameIndex MGNI H 0 128 + FrameIndex MGNI I 0 129 + FrameIndex MGNI J 0 130 + FrameIndex MGNI K 0 131 + FrameIndex MGNI L 0 132 + FrameIndex MGNI M 0 133 + FrameIndex MGNI N 0 134 + FrameIndex MGNI O 0 135 + FrameIndex MGNI P 0 136 + FrameIndex MGNI Q 0 137 + FrameIndex MGNI R 0 138 + FrameIndex MGNI S 0 139 + // Down + FrameIndex MGND A 0 141 + FrameIndex MGND B 0 142 + FrameIndex MGND C 0 143 + FrameIndex MGND D 0 144 + FrameIndex MGND E 0 145 + FrameIndex MGND F 0 146 + FrameIndex MGND G 0 147 + FrameIndex MGND H 0 148 + FrameIndex MGND I 0 149 + FrameIndex MGND J 0 150 +} \ No newline at end of file diff --git a/modeldef.ripper b/modeldef.ripper index 22050d7..79b4ec0 100644 --- a/modeldef.ripper +++ b/modeldef.ripper @@ -86,7 +86,7 @@ Model "Ripper2" SurfaceSkin 0 3 "JRazor5.png" SurfaceSkin 0 4 "JRazor3.png" Scale 0.16 -0.08 0.16 - Offset 7.4 -10.8 -8.9 + Offset 6.4 -9.8 -7.9 AngleOffset 90 // Select diff --git a/modeldef.shock b/modeldef.shock index 23a1cf1..e96e87c 100644 --- a/modeldef.shock +++ b/modeldef.shock @@ -167,7 +167,7 @@ Model "ShockRifle" SurfaceSkin 0 4 "asmd_t4.png" AngleOffset 90 Scale 0.15 -0.12 0.15 - Offset 4.9 -16.6 -7.1 + Offset 3.9 -17.6 -6.1 // select FrameIndex ASMS A 0 0 @@ -254,7 +254,7 @@ Model "EnhancedShockRifle" SurfaceSkin 0 4 "sasmd_t4.png" AngleOffset 90 Scale 0.15 -0.12 0.15 - Offset 4.9 -16.6 -7.1 + Offset 3.9 -17.6 -6.1 // select FrameIndex ASMS A 0 0 diff --git a/modeldef.transloc b/modeldef.transloc index 4c64280..15d86da 100644 --- a/modeldef.transloc +++ b/modeldef.transloc @@ -47,7 +47,7 @@ Model "Translocator" SurfaceSkin 0 2 "tloc3.png" SurfaceSkin 0 3 "tloc4.png" Scale 0.11 -0.055 0.11 - Offset -19.8 -22.8 -33.2 + Offset -19.8 -22.8 -31.2 AngleOffset -94.21875 PitchOffset 3.55555555556 diff --git a/modeldef.warhead b/modeldef.warhead index c7e3866..e7494b4 100644 --- a/modeldef.warhead +++ b/modeldef.warhead @@ -82,9 +82,9 @@ Model "WarheadLauncher" SurfaceSkin 0 3 "jwarhead4.png" Scale 0.2 -0.12 0.2 AngleOffset 90 - PitchOffset 22.5 + PitchOffset 33.5 RollOffset -87.1875 - Offset 7.9 -15.6 -9.2 + Offset 6.2 -15.6 -6.2 // select FrameIndex WARS A 0 0 diff --git a/models/Muz1.png b/models/Muz1.png new file mode 100644 index 0000000..c5b182c Binary files /dev/null and b/models/Muz1.png differ diff --git a/models/Muz2.png b/models/Muz2.png new file mode 100644 index 0000000..3eb8c53 Binary files /dev/null and b/models/Muz2.png differ diff --git a/models/Muz3.png b/models/Muz3.png new file mode 100644 index 0000000..4c2980b Binary files /dev/null and b/models/Muz3.png differ diff --git a/models/Muz4.png b/models/Muz4.png new file mode 100644 index 0000000..4c10648 Binary files /dev/null and b/models/Muz4.png differ diff --git a/models/Muz5.png b/models/Muz5.png new file mode 100644 index 0000000..386e52b Binary files /dev/null and b/models/Muz5.png differ diff --git a/models/Muz6.png b/models/Muz6.png new file mode 100644 index 0000000..bff92ca Binary files /dev/null and b/models/Muz6.png differ diff --git a/models/Muz7.png b/models/Muz7.png new file mode 100644 index 0000000..093540b Binary files /dev/null and b/models/Muz7.png differ diff --git a/models/Muz8.png b/models/Muz8.png new file mode 100644 index 0000000..9a19852 Binary files /dev/null and b/models/Muz8.png differ diff --git a/models/Muz9.png b/models/Muz9.png new file mode 100644 index 0000000..e3046cf Binary files /dev/null and b/models/Muz9.png differ diff --git a/readme.txt b/readme.txt index a74e2fd..e605b5f 100644 --- a/readme.txt +++ b/readme.txt @@ -36,10 +36,10 @@ Currently implemented: - Dual Enforcers (slot 2) - Ripper (slot 6) - Jump Boots (radsuit, has "iron boots" powerup effect to compensate) + - Minigun (slot 7) In progress: - - Minigun (slot 7) - Rocket Launcher (slot 9) - Sniper Rifle (slot 0) diff --git a/sndinfo.txt b/sndinfo.txt index 4c10500..b3dd564 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -183,6 +183,11 @@ ripper/hit bladehit ripper/flesh bladethk ripper/althit expl03 +minigun/select minisel +minigun/fire m2regf +minigun/altfire m2altf +minigun/unwind m2wdown + flak/select pdown flak/load hidraul2 flak/reload load1 diff --git a/textures.minigun b/textures.minigun index d816882..5bee219 100644 --- a/textures.minigun +++ b/textures.minigun @@ -1,3 +1,120 @@ Sprite "MAMOA0",1,1{} Sprite "MGNPA0",1,1{} Sprite "MGNPB0",1,1{} +Sprite "MGNSA0",1,1{} +Sprite "MGNSB0",1,1{} +Sprite "MGNSC0",1,1{} +Sprite "MGNSD0",1,1{} +Sprite "MGNSE0",1,1{} +Sprite "MGNSF0",1,1{} +Sprite "MGNSG0",1,1{} +Sprite "MGNSH0",1,1{} +Sprite "MGNSI0",1,1{} +Sprite "MGNSJ0",1,1{} +Sprite "MGNSK0",1,1{} +Sprite "MGNSL0",1,1{} +Sprite "MGNSM0",1,1{} +Sprite "MGNSN0",1,1{} +Sprite "MGNSO0",1,1{} +Sprite "MGNSP0",1,1{} +Sprite "MGNSQ0",1,1{} +Sprite "MGNSR0",1,1{} +Sprite "MGNSS0",1,1{} +Sprite "MGNST0",1,1{} +Sprite "MGNFA0",1,1{} +Sprite "MGNFB0",1,1{} +Sprite "MGNFC0",1,1{} +Sprite "MGNFD0",1,1{} +Sprite "MGNFE0",1,1{} +Sprite "MGNFF0",1,1{} +Sprite "MGNFG0",1,1{} +Sprite "MGNFH0",1,1{} +Sprite "MGNFI0",1,1{} +Sprite "MGNFJ0",1,1{} +Sprite "MGNFK0",1,1{} +Sprite "MGNFL0",1,1{} +Sprite "MGNFM0",1,1{} +Sprite "MGNFN0",1,1{} +Sprite "MGNFO0",1,1{} +Sprite "MGNFP0",1,1{} +Sprite "MGNFQ0",1,1{} +Sprite "MGNFR0",1,1{} +Sprite "MGNFS0",1,1{} +Sprite "MGNUA0",1,1{} +Sprite "MGNUB0",1,1{} +Sprite "MGNUC0",1,1{} +Sprite "MGNUD0",1,1{} +Sprite "MGNUE0",1,1{} +Sprite "MGNUF0",1,1{} +Sprite "MGNUG0",1,1{} +Sprite "MGNUH0",1,1{} +Sprite "MGNUI0",1,1{} +Sprite "MGNUJ0",1,1{} +Sprite "MGNUK0",1,1{} +Sprite "MGNUL0",1,1{} +Sprite "MGNUM0",1,1{} +Sprite "MGNUN0",1,1{} +Sprite "MGNUO0",1,1{} +Sprite "MGNUP0",1,1{} +Sprite "MGNUQ0",1,1{} +Sprite "MGNUR0",1,1{} +Sprite "MGNUS0",1,1{} +Sprite "MGNUT0",1,1{} +Sprite "MGNUU0",1,1{} +Sprite "MGNUV0",1,1{} +Sprite "MGNUW0",1,1{} +Sprite "MGNUX0",1,1{} +Sprite "MGNUY0",1,1{} +Sprite "MGNUZ0",1,1{} +Sprite "MGU2A0",1,1{} +Sprite "MGU2B0",1,1{} +Sprite "MGU2C0",1,1{} +Sprite "MGU2D0",1,1{} +Sprite "MGU2E0",1,1{} +Sprite "MGU2F0",1,1{} +Sprite "MGU2G0",1,1{} +Sprite "MGU2H0",1,1{} +Sprite "MGU2I0",1,1{} +Sprite "MGU2J0",1,1{} +Sprite "MGU2K0",1,1{} +Sprite "MGU2L0",1,1{} +Sprite "MGU2M0",1,1{} +Sprite "MGNIA0",1,1{} +Sprite "MGNIB0",1,1{} +Sprite "MGNIC0",1,1{} +Sprite "MGNID0",1,1{} +Sprite "MGNIE0",1,1{} +Sprite "MGNIF0",1,1{} +Sprite "MGNIG0",1,1{} +Sprite "MGNIH0",1,1{} +Sprite "MGNII0",1,1{} +Sprite "MGNIJ0",1,1{} +Sprite "MGNIK0",1,1{} +Sprite "MGNIL0",1,1{} +Sprite "MGNIM0",1,1{} +Sprite "MGNIN0",1,1{} +Sprite "MGNIO0",1,1{} +Sprite "MGNIP0",1,1{} +Sprite "MGNIQ0",1,1{} +Sprite "MGNIR0",1,1{} +Sprite "MGNIS0",1,1{} +Sprite "MGNDA0",1,1{} +Sprite "MGNDB0",1,1{} +Sprite "MGNDC0",1,1{} +Sprite "MGNDD0",1,1{} +Sprite "MGNDE0",1,1{} +Sprite "MGNDF0",1,1{} +Sprite "MGNDG0",1,1{} +Sprite "MGNDH0",1,1{} +Sprite "MGNDI0",1,1{} +Sprite "MGNDJ0",1,1{} +Sprite "MMUZA0",1,1{} +Sprite "MMUZB0",1,1{} +Sprite "MMUZC0",1,1{} +Sprite "MMUZD0",1,1{} +Sprite "MMUZE0",1,1{} +Sprite "MMUZF0",1,1{} +Sprite "MMUZG0",1,1{} +Sprite "MMUZH0",1,1{} +Sprite "MMUZI0",1,1{} +Sprite "TRACA0",1,1{} diff --git a/zscript/armoritems.zsc b/zscript/armoritems.zsc index b896374..b4a3849 100644 --- a/zscript/armoritems.zsc +++ b/zscript/armoritems.zsc @@ -31,8 +31,6 @@ Class UTArmorBonus : UTArmor replaces ArmorBonus { Tag "Armor Bonus"; +COUNTITEM; - +INVENTORY.AUTOACTIVATE; - +INVENTORY.UNTOSSABLE; +INVENTORY.ALWAYSPICKUP; Inventory.Amount 5; Inventory.MaxAmount 50; @@ -114,14 +112,21 @@ Class UTShieldBelt : UTArmor replaces Megasphere } override bool HandlePickup( Inventory item ) { - if ( (item is 'UTThighPads') || (item is 'UTBodyArmor') ) return true; + if ( (item is 'UTThighPads') || (item is 'UTBodyArmor') ) + { + if ( amount < maxamount ) + { + DepleteOrDestroy(); + return Super.HandlePickup(item); + } + else return true; + } return Super.HandlePickup(item); } Default { Tag "Shield Belt"; +COUNTITEM; - +INVENTORY.ALWAYSPICKUP; +INVENTORY.BIGPOWERUP; Inventory.Amount 150; Inventory.MaxAmount 150; diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index 5add0a3..ea46c2b 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -285,27 +285,17 @@ Class Enforcer : UTWeapon replaces Pistol A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); A_OverlayRenderstyle(-2,STYLE_Add); } - Vector3 x, y, z; - double a; + Vector3 x, y, z, x2, y2, z2; [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); Vector3 origin = pos+(0,0,player.viewheight)+10.0*x; int ydir = slave?-1:1; if ( alt ) origin = origin-z*9.0+ydir*y*1.0; else origin = origin-z*2.0+ydir*y*6.0; - double ang = angle; - double pt = BulletSlope(); - if ( alt ) - { - ang += FRandom[Enforcer](-3,3); - pt += FRandom[Enforcer](-3,3); - } - else - { - ang += FRandom[Enforcer](-0.4,0.4); - pt += FRandom[Enforcer](-0.4,0.4); - } + double a = FRandom[Enforcer](0,360), s = FRandom[Enforcer](0,alt?0.08:0.004); + [x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll); + Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); FLineTraceData d; - LineTrace(ang,10000,pt,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { int dmg = Random[Enforcer](15,20); diff --git a/zscript/minigun.zsc b/zscript/minigun.zsc index d956e45..e45b472 100644 --- a/zscript/minigun.zsc +++ b/zscript/minigun.zsc @@ -44,13 +44,137 @@ Class MiniAmmo : Ammo } } +Class MinigunLight : EnforcerLight +{ + override void PostBeginPlay() + { + Super.PostBeginPlay(); + args[LIGHT_INTENSITY] = Random[Minigun](120,180); + } +} + +Class MinigunTracer : Actor +{ + Vector3 dest; + Default + { + RenderStyle "Add"; + Radius 0.1; + Height 0; + +NOCLIP; + +NOGRAVITY; + +DONTSPLASH; + } + override void Tick() + { + Super.Tick(); + Vector3 dir = level.Vec3Diff(pos,dest); + if ( dir.length() < 200 ) + { + Destroy(); + return; + } + dir = dir.unit(); + SetOrigin(Vec3Offset(dir.x*200,dir.y*200,dir.z*200),true); + A_SetAngle(atan2(dir.y,dir.x),SPF_INTERPOLATE); + A_SetPitch(asin(-dir.z),SPF_INTERPOLATE); + A_SetRoll(roll+60,SPF_INTERPOLATE); + } + States + { + Spawn: + TRAC A -1 Bright; + Stop; + } +} + Class Minigun : UTWeapon { + int bcnt; + + action void A_FireBullet( bool alt = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + A_Overlay(-2,"MuzzleFlash",true); + A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-2,STYLE_Add); + if ( alt ) invoker.bcnt = min(invoker.bcnt,3); + if ( invoker.bcnt-- > 0 ) return; + invoker.bcnt = alt?3:5; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(64,255,255,0),1); + A_AlertMonsters(); + if ( alt ) A_QuakeEx(3,3,3,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.12); + else A_QuakeEx(2,2,2,5,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08); + let l = Spawn("MinigunLight",pos); + l.target = self; + if ( !alt ) MinigunLight(l).cnt--; + Vector3 x, y, z, x2, y2, z2; + [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); + Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+y*4.0-z*6.0; + double a = FRandom[Minigun](0,360), s = FRandom[Minigun](0,alt?0.05:0.02); + [x2, y2, z2] = Matrix4.GetAxes(BulletSlope(),angle,roll); + Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + FLineTraceData d; + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + if ( d.HitType == TRACE_HitActor ) + { + int dmg = Random[Minigun](9,15); // fun fact: the Minigun is one of the few weapons that has actual RNG damage in UT (and it's exactly this damage) + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot'); + if ( d.HitActor.bNOBLOOD ) + { + let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4); + p.angle = atan2(d.HitDir.y,d.HitDir.x); + p.pitch = asin(-d.HitDir.z); + } + else + { + d.HitActor.TraceBleed(dmg,self); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); + } + } + else if ( d.HitType != TRACE_HitNone ) + { + let p = Spawn("BulletImpact",d.HitLocation-d.HitDir*4); + p.angle = atan2(d.HitDir.y,d.HitDir.x); + p.pitch = asin(-d.HitDir.z); + if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + } + if ( !Random[Minigun](0,1) ) + { + let t = Spawn("MinigunTracer",origin+x*20.0); + t.angle = atan2(dir.y,dir.x); + t.pitch = asin(-dir.z); + MinigunTracer(t).dest = d.HitLocation; + } + origin += x*8.0+y*4.0-z*2.0; + let c = Spawn("UTCasing",origin); + c.vel = x*FRandom[Junk](-2,2)+y*FRandom[Junk](3,6)+z*FRandom[Junk](3,5); + c.Scale *= 0.5; + } + + action void A_MinigunRefire( statelabel flash = null ) + { + Weapon weap = Weapon(invoker); + if ( !weap || !player ) return; + if ( weap.Ammo1.Amount <= 0 ) + { + A_ClearRefire(); + player.setpsprite(PSP_WEAPON,weap.FindState("Unwind")); + return; + } + A_Refire(flash); + } + Default { Tag "Minigun"; + Obituary "%k's Minigun turned %o into a leaky piece of meat."; Inventory.PickupMessage "You got the Minigun."; - Weapon.UpSound ""; + Weapon.UpSound "minigun/select"; Weapon.SlotNumber 7; Weapon.SelectionOrder 3; Weapon.AmmoType "MiniAmmo"; @@ -66,5 +190,239 @@ Class Minigun : UTWeapon Stop; MGNP B -1; Stop; + Select: + MGNS A 1 A_Raise(int.max); + Wait; + Ready: + MGNS ABCDEFGHIJKLMNOPQRST 1; + Idle: + MGNI ABCDEFGHIJKLMNOPQRS 5 + { + A_CheckReload(); + A_WeaponReady(); + } + Loop; + Fire: + AltFire: + MGNI A 3 { invoker.bcnt = 5; } + Hold: + MGNF A 1 + { + A_PlaySound("minigun/fire",CHAN_WEAPON,1.0,true); + A_FireBullet(); + } + MGNF B 0 A_MinigunRefire(1); + Goto Unwind; + MGNF B 1 A_FireBullet(); + MGNF C 0 A_MinigunRefire(1); + Goto Unwind; + MGNF C 1 A_FireBullet(); + MGNF D 0 A_MinigunRefire(1); + Goto Unwind; + MGNF D 1 A_FireBullet(); + MGNF E 0 A_MinigunRefire(1); + Goto Unwind; + MGNF E 1 A_FireBullet(); + MGNF F 0 A_MinigunRefire(1); + Goto Unwind; + MGNF F 1 A_FireBullet(); + MGNF G 0 A_MinigunRefire(1); + Goto Unwind; + MGNF G 1 A_FireBullet(); + MGNF H 0 A_MinigunRefire(1); + Goto Unwind; + MGNF H 1 A_FireBullet(); + MGNF I 0 A_MinigunRefire(1); + Goto Unwind; + MGNF I 1 A_FireBullet(); + MGNF J 0 A_MinigunRefire(1); + Goto Unwind; + MGNF J 1 A_FireBullet(); + MGNF K 0 A_MinigunRefire(1); + Goto Unwind; + MGNF K 1 A_FireBullet(); + MGNF L 0 A_MinigunRefire(1); + Goto Unwind; + MGNF L 1 A_FireBullet(); + MGNF M 0 A_MinigunRefire(1); + Goto Unwind; + MGNF M 1 A_FireBullet(); + MGNF N 0 A_MinigunRefire(1); + Goto Unwind; + MGNF N 1 A_FireBullet(); + MGNF O 0 A_MinigunRefire(1); + Goto Unwind; + MGNF O 1 A_FireBullet(); + MGNF P 0 A_MinigunRefire(1); + Goto Unwind; + MGNF P 1 A_FireBullet(); + MGNF Q 0 A_MinigunRefire(1); + Goto Unwind; + MGNF Q 1 A_FireBullet(); + MGNF R 0 A_MinigunRefire(1); + Goto Unwind; + MGNF R 1 A_FireBullet(); + MGNF S 0 A_MinigunRefire(1); + Goto Unwind; + MGNF S 1 A_FireBullet(); + MGNF A 0 + { + if ( invoker.bAltFire ) A_MinigunRefire(1); + else A_MinigunRefire("Hold"); + } + Goto Unwind; + AltFire2: + MGNF A 1 A_FireBullet(); + MGNF B 0 A_MinigunRefire(1); + Goto Unwind; + MGNF B 1 A_FireBullet(); + MGNF C 0 A_MinigunRefire(1); + Goto Unwind; + MGNF C 1 A_FireBullet(); + MGNF D 0 A_MinigunRefire(1); + Goto Unwind; + MGNF D 1 A_FireBullet(); + MGNF E 0 A_MinigunRefire(1); + Goto Unwind; + MGNF E 1 A_FireBullet(); + MGNF F 0 A_MinigunRefire(1); + Goto Unwind; + MGNF F 1 A_FireBullet(); + MGNF G 0 A_MinigunRefire(1); + Goto Unwind; + MGNF G 1 A_FireBullet(); + MGNF H 0 A_MinigunRefire(1); + Goto Unwind; + MGNF H 1 A_FireBullet(); + MGNF I 0 A_MinigunRefire(1); + Goto Unwind; + MGNF I 1 A_FireBullet(); + MGNF J 0 A_MinigunRefire(1); + Goto Unwind; + MGNF J 1 A_FireBullet(); + MGNF K 0 A_MinigunRefire(1); + Goto Unwind; + MGNF K 1 A_FireBullet(); + MGNF L 0 A_MinigunRefire(1); + Goto Unwind; + MGNF L 1 A_FireBullet(); + MGNF M 0 A_MinigunRefire(1); + Goto Unwind; + MGNF M 1 A_FireBullet(); + MGNF N 0 A_MinigunRefire(1); + Goto Unwind; + MGNF N 1 A_FireBullet(); + MGNF O 0 A_MinigunRefire(1); + Goto Unwind; + MGNF O 1 A_FireBullet(); + MGNF P 0 A_MinigunRefire(1); + Goto Unwind; + MGNF P 1 A_FireBullet(); + MGNF Q 0 A_MinigunRefire(1); + Goto Unwind; + MGNF Q 1 A_FireBullet(); + MGNF R 0 A_MinigunRefire(1); + Goto Unwind; + MGNF R 1 A_FireBullet(); + MGNF S 0 A_MinigunRefire(1); + Goto Unwind; + MGNF S 1 A_FireBullet(); + MGNF A 0 A_MinigunRefire(1); + Goto Unwind; + AltHold: + MGNF A 1 + { + A_PlaySound("minigun/altfire",CHAN_WEAPON,1.0,true); + A_FireBullet(true); + } + MGNF D 0 A_MinigunRefire(1); + Goto Unwind; + MGNF D 1 A_FireBullet(true); + MGNF G 0 A_MinigunRefire(1); + Goto Unwind; + MGNF G 1 A_FireBullet(true); + MGNF J 0 A_MinigunRefire(1); + Goto Unwind; + MGNF J 1 A_FireBullet(true); + MGNF M 0 A_MinigunRefire(1); + Goto Unwind; + MGNF M 1 A_FireBullet(true); + MGNF P 0 A_MinigunRefire(1); + Goto Unwind; + MGNF P 1 A_FireBullet(true); + MGNF S 0 A_MinigunRefire(1); + Goto Unwind; + MGNF S 1 A_FireBullet(true); + MGNF C 0 A_MinigunRefire(1); + Goto Unwind; + MGNF C 1 A_FireBullet(true); + MGNF F 0 A_MinigunRefire(1); + Goto Unwind; + MGNF F 1 A_FireBullet(true); + MGNF I 0 A_MinigunRefire(1); + Goto Unwind; + MGNF I 1 A_FireBullet(true); + MGNF L 0 A_MinigunRefire(1); + Goto Unwind; + MGNF L 1 A_FireBullet(true); + MGNF O 0 A_MinigunRefire(1); + Goto Unwind; + MGNF O 1 A_FireBullet(true); + MGNF R 0 A_MinigunRefire(1); + Goto Unwind; + MGNF R 1 A_FireBullet(true); + MGNF B 0 A_MinigunRefire(1); + Goto Unwind; + MGNF B 1 A_FireBullet(true); + MGNF E 0 A_MinigunRefire(1); + Goto Unwind; + MGNF E 1 A_FireBullet(true); + MGNF H 0 A_MinigunRefire(1); + Goto Unwind; + MGNF H 1 A_FireBullet(true); + MGNF K 0 A_MinigunRefire(1); + Goto Unwind; + MGNF K 1 A_FireBullet(true); + MGNF N 0 A_MinigunRefire(1); + Goto Unwind; + MGNF N 1 A_FireBullet(true); + MGNF Q 0 A_MinigunRefire(1); + Goto Unwind; + MGNF Q 1 A_FireBullet(true); + MGNF A 0 A_MinigunRefire("AltHold"); + Goto Unwind; + Unwind: + MGNU A 0 A_PlaySound("minigun/unwind",CHAN_WEAPON); + MGNU ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + MGU2 ABCDEFGHIJKLM 1; + Goto Idle; + Deselect: + MGND ABCDEFGHIJ 2; + MGND J 1 A_Lower(int.max); + Wait; + MuzzleFlash: + TNT1 A 0 A_Jump(256,1,2,3,4,5,6,7,8,9); + Stop; + MMUZ A 2 Bright; + Stop; + MMUZ B 2 Bright; + Stop; + MMUZ C 2 Bright; + Stop; + MMUZ D 2 Bright; + Stop; + MMUZ E 2 Bright; + Stop; + MMUZ F 2 Bright; + Stop; + MMUZ G 2 Bright; + Stop; + MMUZ H 2 Bright; + Stop; + MMUZ I 2 Bright; + Stop; + Dummy: + MMUZ ABCDEFGHI -1; + Stop; } }