diff --git a/decaldef.txt b/decaldef.txt index b5e781f..a8fc503 100644 --- a/decaldef.txt +++ b/decaldef.txt @@ -135,3 +135,38 @@ decal ImpactMark x-scale 0.25 y-scale 0.25 } + +decal Pock1 +{ + pic pock0_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} +decal Pock2 +{ + pic pock2_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} +decal Pock3 +{ + pic pock4_t + shade "00 00 00" + x-scale 0.1 + y-scale 0.1 + randomflipx + randomflipy +} + +decalgroup Pock +{ + Pock1 1 + Pock2 1 + Pock3 1 +} diff --git a/modeldef.enforcer b/modeldef.enforcer index bb1fb95..ec1a99c 100644 --- a/modeldef.enforcer +++ b/modeldef.enforcer @@ -10,6 +10,22 @@ Model "EClip" FrameIndex ECLP A 0 0 } +Model "UTCasing" +{ + Path "models" + Model 0 "Shellc_d.3d" + Skin 0 "Shellcase1.png" + Scale -0.014 0.014 0.0168 + ZOffset 1 + USEACTORPITCH + USEACTORROLL + DONTCULLBACKFACES + USEROTATIONCENTER + Rotation-Center 0 0 1 + + FrameIndex PCAS A 0 0 +} + Model "Enforcer" { Path "models" @@ -35,3 +51,342 @@ Model "Enforcer" FrameIndex ENFP B 1 0 } + +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset 10.4 -25.0 -2.9 + + FrameIndex EMUZ A 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset 1.9 -25.0 -9.3 + + FrameIndex EMUZ B 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset -10.4 -25.0 -2.9 + + FrameIndex EMUZ C 3 0 +} +Model "Enforcer" +{ + Path "models" + Model 3 "Flat_d.3d" + Skin 3 "EMuz1.png" + PitchOffset 90 + Scale 0.04 0.04 0.04 + Offset -1.9 -25.0 -9.3 + + FrameIndex EMUZ D 3 0 +} + +Model "Enforcer" +{ + Path "models" + Model 0 "AutoMR_d.3d" + SurfaceSkin 0 0 "Jtutot1.png" + SurfaceSkin 0 1 "Jtutot2.png" + SurfaceSkin 0 2 "Jtutot3.png" + SurfaceSkin 0 3 "Jtutot4.png" + Scale 0.14 0.08 0.12 + Offset 8.6 -12.8 -13.5 + PitchOffset 90 + + // Fire + FrameIndex ENFF A 0 6 + FrameIndex ENFF B 0 7 + FrameIndex ENFF C 0 8 + FrameIndex ENFF D 0 9 + FrameIndex ENFF E 0 10 + FrameIndex ENFF F 0 11 + FrameIndex ENFF G 0 12 + FrameIndex ENFF H 0 13 + FrameIndex ENFF I 0 14 + FrameIndex ENFF J 0 15 + // Reload + FrameIndex ENFR A 0 22 + FrameIndex ENFR B 0 23 + FrameIndex ENFR C 0 24 + FrameIndex ENFR D 0 25 + FrameIndex ENFR E 0 26 + FrameIndex ENFR F 0 27 + FrameIndex ENFR G 0 28 + FrameIndex ENFR H 0 29 + FrameIndex ENFR I 0 30 + FrameIndex ENFR J 0 31 + FrameIndex ENFR K 0 32 + FrameIndex ENFR L 0 33 + FrameIndex ENFR M 0 34 + FrameIndex ENFR N 0 35 + FrameIndex ENFR O 0 36 + FrameIndex ENFR P 0 37 + FrameIndex ENFR Q 0 38 + FrameIndex ENFR R 0 39 + FrameIndex ENFR S 0 40 + FrameIndex ENFR T 0 41 + FrameIndex ENFR U 0 42 + FrameIndex ENFR V 0 43 + FrameIndex ENFR W 0 44 + FrameIndex ENFR X 0 45 + FrameIndex ENFR Y 0 46 + FrameIndex ENFR Z 0 47 + FrameIndex ENR2 A 0 48 + FrameIndex ENR2 B 0 49 + // Select + FrameIndex ENFS A 0 60 + FrameIndex ENFS B 0 61 + FrameIndex ENFS C 0 62 + FrameIndex ENFS D 0 63 + FrameIndex ENFS E 0 64 + FrameIndex ENFS F 0 65 + FrameIndex ENFS G 0 66 + FrameIndex ENFS H 0 67 + FrameIndex ENFS I 0 68 + FrameIndex ENFS J 0 69 + FrameIndex ENFS K 0 70 + FrameIndex ENFS L 0 71 + FrameIndex ENFS M 0 72 + FrameIndex ENFS N 0 73 + FrameIndex ENFS O 0 74 + FrameIndex ENFS P 0 75 + FrameIndex ENFS Q 0 76 + FrameIndex ENFS R 0 77 + FrameIndex ENFS S 0 78 + FrameIndex ENFS T 0 79 + FrameIndex ENFS U 0 80 + FrameIndex ENFS V 0 81 + FrameIndex ENFS W 0 82 + FrameIndex ENFS X 0 83 + FrameIndex ENFS Y 0 84 + FrameIndex ENFS Z 0 85 + // Idle + FrameIndex ENFI A 0 86 + FrameIndex ENFI B 0 87 + // Twiddle + FrameIndex ENFT A 0 87 + FrameIndex ENFT B 0 88 + FrameIndex ENFT C 0 89 + FrameIndex ENFT D 0 90 + FrameIndex ENFT E 0 91 + FrameIndex ENFT F 0 92 + FrameIndex ENFT G 0 93 + FrameIndex ENFT H 0 94 + FrameIndex ENFT I 0 95 + FrameIndex ENFT J 0 96 + FrameIndex ENFT K 0 97 + FrameIndex ENFT L 0 98 + FrameIndex ENFT M 0 99 + FrameIndex ENFT N 0 100 + FrameIndex ENFT O 0 101 + FrameIndex ENFT P 0 102 + FrameIndex ENFT Q 0 103 + FrameIndex ENFT R 0 104 + FrameIndex ENFT S 0 105 + FrameIndex ENFT T 0 106 + FrameIndex ENFT U 0 107 + FrameIndex ENFT V 0 108 + FrameIndex ENFT W 0 109 + FrameIndex ENFT X 0 110 + FrameIndex ENFT Y 0 111 + // Down + FrameIndex ENFD A 0 115 + FrameIndex ENFD B 0 116 + FrameIndex ENFD C 0 117 + FrameIndex ENFD D 0 118 + FrameIndex ENFD E 0 119 + FrameIndex ENFD F 0 120 + FrameIndex ENFD G 0 121 + FrameIndex ENFD H 0 122 + FrameIndex ENFD I 0 123 + FrameIndex ENFD J 0 124 + FrameIndex ENFD K 0 125 + FrameIndex ENFD L 0 126 + // T1 + FrameIndex ENFA A 0 130 + FrameIndex ENFA B 0 131 + FrameIndex ENFA C 0 132 + FrameIndex ENFA D 0 133 + FrameIndex ENFA E 0 134 + FrameIndex ENFA F 0 135 + // Alt Fire + FrameIndex ENFA G 0 136 + FrameIndex ENFA H 0 137 + FrameIndex ENFA I 0 138 + FrameIndex ENFA J 0 139 + FrameIndex ENFA K 0 140 + FrameIndex ENFA L 0 141 + FrameIndex ENFA M 0 142 + FrameIndex ENFA N 0 143 + // T2 + FrameIndex ENFA O 0 144 + FrameIndex ENFA P 0 145 + FrameIndex ENFA Q 0 146 + FrameIndex ENFA R 0 147 + FrameIndex ENFA S 0 148 + FrameIndex ENFA T 0 149 + FrameIndex ENFA U 0 150 +} + +Model "Enforcer" +{ + Path "models" + Model 2 "AutoML_d.3d" + SurfaceSkin 2 0 "Jtutot1.png" + SurfaceSkin 2 1 "Jtutot2.png" + SurfaceSkin 2 2 "Jtutot3.png" + SurfaceSkin 2 3 "Jtutot4.png" + Scale 0.14 0.08 0.12 + Offset -8.8 -12.8 -13.5 + PitchOffset 90 + + // Fire + FrameIndex 2NFF A 2 6 + FrameIndex 2NFF B 2 7 + FrameIndex 2NFF C 2 8 + FrameIndex 2NFF D 2 9 + FrameIndex 2NFF E 2 10 + FrameIndex 2NFF F 2 11 + FrameIndex 2NFF G 2 12 + FrameIndex 2NFF H 2 13 + FrameIndex 2NFF I 2 14 + FrameIndex 2NFF J 2 15 + // Reload + FrameIndex 2NFR A 2 22 + FrameIndex 2NFR B 2 23 + FrameIndex 2NFR C 2 24 + FrameIndex 2NFR D 2 25 + FrameIndex 2NFR E 2 26 + FrameIndex 2NFR F 2 27 + FrameIndex 2NFR G 2 28 + FrameIndex 2NFR H 2 29 + FrameIndex 2NFR I 2 30 + FrameIndex 2NFR J 2 31 + FrameIndex 2NFR K 2 32 + FrameIndex 2NFR L 2 33 + FrameIndex 2NFR M 2 34 + FrameIndex 2NFR N 2 35 + FrameIndex 2NFR O 2 36 + FrameIndex 2NFR P 2 37 + FrameIndex 2NFR Q 2 38 + FrameIndex 2NFR R 2 39 + FrameIndex 2NFR S 2 40 + FrameIndex 2NFR T 2 41 + FrameIndex 2NFR U 2 42 + FrameIndex 2NFR V 2 43 + FrameIndex 2NFR W 2 44 + FrameIndex 2NFR X 2 45 + FrameIndex 2NFR Y 2 46 + FrameIndex 2NFR Z 2 47 + FrameIndex 2NR2 A 2 48 + FrameIndex 2NR2 B 2 49 + // Select + FrameIndex 2NFS A 2 60 + FrameIndex 2NFS B 2 61 + FrameIndex 2NFS C 2 62 + FrameIndex 2NFS D 2 63 + FrameIndex 2NFS E 2 64 + FrameIndex 2NFS F 2 65 + FrameIndex 2NFS G 2 66 + FrameIndex 2NFS H 2 67 + FrameIndex 2NFS I 2 68 + FrameIndex 2NFS J 2 69 + FrameIndex 2NFS K 2 70 + FrameIndex 2NFS L 2 71 + FrameIndex 2NFS M 2 72 + FrameIndex 2NFS N 2 73 + FrameIndex 2NFS O 2 74 + FrameIndex 2NFS P 2 75 + FrameIndex 2NFS Q 2 76 + FrameIndex 2NFS R 2 77 + FrameIndex 2NFS S 2 78 + FrameIndex 2NFS T 2 79 + FrameIndex 2NFS U 2 80 + FrameIndex 2NFS V 2 81 + FrameIndex 2NFS W 2 82 + FrameIndex 2NFS X 2 83 + FrameIndex 2NFS Y 2 84 + FrameIndex 2NFS Z 2 85 + // Idle + FrameIndex 2NFI A 2 86 + FrameIndex 2NFI B 2 87 + // Twiddle + FrameIndex 2NFT A 2 87 + FrameIndex 2NFT B 2 88 + FrameIndex 2NFT C 2 89 + FrameIndex 2NFT D 2 90 + FrameIndex 2NFT E 2 91 + FrameIndex 2NFT F 2 92 + FrameIndex 2NFT G 2 93 + FrameIndex 2NFT H 2 94 + FrameIndex 2NFT I 2 95 + FrameIndex 2NFT J 2 96 + FrameIndex 2NFT K 2 97 + FrameIndex 2NFT L 2 98 + FrameIndex 2NFT M 2 99 + FrameIndex 2NFT N 2 100 + FrameIndex 2NFT O 2 101 + FrameIndex 2NFT P 2 102 + FrameIndex 2NFT Q 2 103 + FrameIndex 2NFT R 2 104 + FrameIndex 2NFT S 2 105 + FrameIndex 2NFT T 2 106 + FrameIndex 2NFT U 2 107 + FrameIndex 2NFT V 2 108 + FrameIndex 2NFT W 2 109 + FrameIndex 2NFT X 2 110 + FrameIndex 2NFT Y 2 111 + // Down + FrameIndex 2NFD A 2 115 + FrameIndex 2NFD B 2 116 + FrameIndex 2NFD C 2 117 + FrameIndex 2NFD D 2 118 + FrameIndex 2NFD E 2 119 + FrameIndex 2NFD F 2 120 + FrameIndex 2NFD G 2 121 + FrameIndex 2NFD H 2 122 + FrameIndex 2NFD I 2 123 + FrameIndex 2NFD J 2 124 + FrameIndex 2NFD K 2 125 + FrameIndex 2NFD L 2 126 + // T1 + FrameIndex 2NFA A 2 130 + FrameIndex 2NFA B 2 131 + FrameIndex 2NFA C 2 132 + FrameIndex 2NFA D 2 133 + FrameIndex 2NFA E 2 134 + FrameIndex 2NFA F 2 135 + // Alt Fire + FrameIndex 2NFA G 2 136 + FrameIndex 2NFA H 2 137 + FrameIndex 2NFA I 2 138 + FrameIndex 2NFA J 2 139 + FrameIndex 2NFA K 2 140 + FrameIndex 2NFA L 2 141 + FrameIndex 2NFA M 2 142 + FrameIndex 2NFA N 2 143 + // T2 + FrameIndex 2NFA O 2 144 + FrameIndex 2NFA P 2 145 + FrameIndex 2NFA Q 2 146 + FrameIndex 2NFA R 2 147 + FrameIndex 2NFA S 2 148 + FrameIndex 2NFA T 2 149 + FrameIndex 2NFA U 2 150 +} \ No newline at end of file diff --git a/modeldef.flak b/modeldef.flak index 32d20ca..04a6dfd 100644 --- a/modeldef.flak +++ b/modeldef.flak @@ -44,7 +44,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 A 0 0 } @@ -58,7 +58,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 B 0 0 } @@ -72,7 +72,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 C 0 0 } @@ -86,7 +86,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 D 0 0 } @@ -100,7 +100,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 E 0 0 } @@ -114,7 +114,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 F 0 0 } @@ -128,7 +128,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 G 0 0 } @@ -142,7 +142,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 H 0 0 } @@ -156,7 +156,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 I 0 0 } @@ -170,7 +170,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 J 0 0 } @@ -184,7 +184,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 K 0 0 } @@ -198,7 +198,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH1 L 0 0 } @@ -213,7 +213,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 A 1 0 } @@ -227,7 +227,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 B 1 0 } @@ -241,7 +241,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 C 1 0 } @@ -255,7 +255,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 D 1 0 } @@ -269,7 +269,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 E 1 0 } @@ -283,7 +283,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 F 1 0 } @@ -297,7 +297,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 G 1 0 } @@ -311,7 +311,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 H 1 0 } @@ -325,7 +325,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 I 1 0 } @@ -339,7 +339,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 J 1 0 } @@ -353,7 +353,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 K 1 0 } @@ -367,7 +367,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH2 L 1 0 } @@ -382,7 +382,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 A 2 0 } @@ -396,7 +396,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 B 2 0 } @@ -410,7 +410,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 C 2 0 } @@ -424,7 +424,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 D 2 0 } @@ -438,7 +438,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 E 2 0 } @@ -452,7 +452,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 F 2 0 } @@ -466,7 +466,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 G 2 0 } @@ -480,7 +480,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 H 2 0 } @@ -494,7 +494,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 I 2 0 } @@ -508,7 +508,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 J 2 0 } @@ -522,7 +522,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 K 2 0 } @@ -536,7 +536,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH3 L 2 0 } @@ -551,7 +551,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 A 3 0 } @@ -565,7 +565,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 B 3 0 } @@ -579,7 +579,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 C 3 0 } @@ -593,7 +593,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 D 3 0 } @@ -607,7 +607,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 E 3 0 } @@ -621,7 +621,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 F 3 0 } @@ -635,7 +635,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 G 3 0 } @@ -649,7 +649,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 H 3 0 } @@ -663,7 +663,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 I 3 0 } @@ -677,7 +677,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 J 3 0 } @@ -691,7 +691,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 K 3 0 } @@ -705,7 +705,7 @@ Model "FlakChunk" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 + Rotation-Center 0 0 2 FrameIndex FCH4 L 3 0 } @@ -747,7 +747,7 @@ Model "FlakCannon" Scale 0.08 0.08 0.08 Offset 4.0 -25.0 -7.5 - FrameIndex FMUZ A 0 0 + FrameIndex FMUZ A 2 0 } Model "FlakCannon" diff --git a/modeldef.misc b/modeldef.misc index abc79ec..3018f42 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -331,8 +331,8 @@ Model "UTChip" USEACTORPITCH USEACTORROLL USEROTATIONCENTER - Rotation-Center 0 0 0.5 - ZOffset 2 + Rotation-Center 0 0 0 + ZOffset 1 FrameIndex CHIP A 0 0 FrameIndex CHIP B 0 1 diff --git a/modeldef.pulse b/modeldef.pulse index c2254e7..e21553c 100644 --- a/modeldef.pulse +++ b/modeldef.pulse @@ -45,7 +45,7 @@ Model "PulseGun" Scale 0.08 0.08 0.08 Offset 8.5 -25.0 -4.5 - FrameIndex PMUZ A 0 0 + FrameIndex PMUZ A 2 0 } Model "PulseGun" diff --git a/models/EMuz1.png b/models/EMuz1.png new file mode 100644 index 0000000..c5b182c Binary files /dev/null and b/models/EMuz1.png differ diff --git a/readme.txt b/readme.txt index cb2f981..c1cafb5 100644 --- a/readme.txt +++ b/readme.txt @@ -33,11 +33,11 @@ Currently implemented: - Impact Hammer (slot 1) - Chainsaw (slot 1) - Translocator (slot 1) + - Enforcer (slot 2) + - Dual Enforcers (slot 2) In progress: - - Enforcer (slot 2) - - Dual Enforcers (slot 2) - Ripper (slot 6) - Minigun (slot 7) - Rocket Launcher (slot 9) diff --git a/sndinfo.txt b/sndinfo.txt index 5bbcb66..936e932 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -139,6 +139,16 @@ transloc/spark tdisrupt transloc/bounce hit1 transloc/hum targeth +enforcer/select cocking +enforcer/shoot e_shot +enforcer/reload reload +enforcer/click click + +bullet/casing shell2 +bullet/hit1 impact1 +bullet/hit2 impact2 +$random bullet/hit { bullet/hit1 bullet/hit2 } + ges/hit gelhit ges/select gelselec ges/fire gelshot diff --git a/textures.enforcer b/textures.enforcer index cbcd74b..8fe10fc 100644 --- a/textures.enforcer +++ b/textures.enforcer @@ -1,3 +1,255 @@ Sprite "ECLPA0",1,1{} Sprite "ENFPA0",1,1{} Sprite "ENFPB0",1,1{} +Sprite "ENFFA0",1,1{} +Sprite "ENFFB0",1,1{} +Sprite "ENFFC0",1,1{} +Sprite "ENFFD0",1,1{} +Sprite "ENFFE0",1,1{} +Sprite "ENFFF0",1,1{} +Sprite "ENFFG0",1,1{} +Sprite "ENFFH0",1,1{} +Sprite "ENFFI0",1,1{} +Sprite "ENFFJ0",1,1{} +Sprite "ENFRA0",1,1{} +Sprite "ENFRB0",1,1{} +Sprite "ENFRC0",1,1{} +Sprite "ENFRD0",1,1{} +Sprite "ENFRE0",1,1{} +Sprite "ENFRF0",1,1{} +Sprite "ENFRG0",1,1{} +Sprite "ENFRH0",1,1{} +Sprite "ENFRI0",1,1{} +Sprite "ENFRJ0",1,1{} +Sprite "ENFRK0",1,1{} +Sprite "ENFRL0",1,1{} +Sprite "ENFRM0",1,1{} +Sprite "ENFRN0",1,1{} +Sprite "ENFRO0",1,1{} +Sprite "ENFRP0",1,1{} +Sprite "ENFRQ0",1,1{} +Sprite "ENFRR0",1,1{} +Sprite "ENFRS0",1,1{} +Sprite "ENFRT0",1,1{} +Sprite "ENFRU0",1,1{} +Sprite "ENFRV0",1,1{} +Sprite "ENFRW0",1,1{} +Sprite "ENFRX0",1,1{} +Sprite "ENFRY0",1,1{} +Sprite "ENFRZ0",1,1{} +Sprite "ENR2A0",1,1{} +Sprite "ENR2B0",1,1{} +Sprite "ENFSA0",1,1{} +Sprite "ENFSB0",1,1{} +Sprite "ENFSC0",1,1{} +Sprite "ENFSD0",1,1{} +Sprite "ENFSE0",1,1{} +Sprite "ENFSF0",1,1{} +Sprite "ENFSG0",1,1{} +Sprite "ENFSH0",1,1{} +Sprite "ENFSI0",1,1{} +Sprite "ENFSJ0",1,1{} +Sprite "ENFSK0",1,1{} +Sprite "ENFSL0",1,1{} +Sprite "ENFSM0",1,1{} +Sprite "ENFSN0",1,1{} +Sprite "ENFSO0",1,1{} +Sprite "ENFSP0",1,1{} +Sprite "ENFSQ0",1,1{} +Sprite "ENFSR0",1,1{} +Sprite "ENFSS0",1,1{} +Sprite "ENFST0",1,1{} +Sprite "ENFSU0",1,1{} +Sprite "ENFSV0",1,1{} +Sprite "ENFSW0",1,1{} +Sprite "ENFSX0",1,1{} +Sprite "ENFSY0",1,1{} +Sprite "ENFSZ0",1,1{} +Sprite "ENFIA0",1,1{} +Sprite "ENFIB0",1,1{} +Sprite "ENFTA0",1,1{} +Sprite "ENFTB0",1,1{} +Sprite "ENFTC0",1,1{} +Sprite "ENFTD0",1,1{} +Sprite "ENFTE0",1,1{} +Sprite "ENFTF0",1,1{} +Sprite "ENFTG0",1,1{} +Sprite "ENFTH0",1,1{} +Sprite "ENFTI0",1,1{} +Sprite "ENFTJ0",1,1{} +Sprite "ENFTK0",1,1{} +Sprite "ENFTL0",1,1{} +Sprite "ENFTM0",1,1{} +Sprite "ENFTN0",1,1{} +Sprite "ENFTO0",1,1{} +Sprite "ENFTP0",1,1{} +Sprite "ENFTQ0",1,1{} +Sprite "ENFTR0",1,1{} +Sprite "ENFTS0",1,1{} +Sprite "ENFTT0",1,1{} +Sprite "ENFTU0",1,1{} +Sprite "ENFTV0",1,1{} +Sprite "ENFTW0",1,1{} +Sprite "ENFTX0",1,1{} +Sprite "ENFTY0",1,1{} +Sprite "ENFDA0",1,1{} +Sprite "ENFDB0",1,1{} +Sprite "ENFDC0",1,1{} +Sprite "ENFDD0",1,1{} +Sprite "ENFDE0",1,1{} +Sprite "ENFDF0",1,1{} +Sprite "ENFDG0",1,1{} +Sprite "ENFDH0",1,1{} +Sprite "ENFDI0",1,1{} +Sprite "ENFDJ0",1,1{} +Sprite "ENFDK0",1,1{} +Sprite "ENFDL0",1,1{} +Sprite "ENFAA0",1,1{} +Sprite "ENFAB0",1,1{} +Sprite "ENFAC0",1,1{} +Sprite "ENFAD0",1,1{} +Sprite "ENFAE0",1,1{} +Sprite "ENFAF0",1,1{} +Sprite "ENFAG0",1,1{} +Sprite "ENFAH0",1,1{} +Sprite "ENFAI0",1,1{} +Sprite "ENFAJ0",1,1{} +Sprite "ENFAK0",1,1{} +Sprite "ENFAL0",1,1{} +Sprite "ENFAM0",1,1{} +Sprite "ENFAN0",1,1{} +Sprite "ENFAO0",1,1{} +Sprite "ENFAP0",1,1{} +Sprite "ENFAQ0",1,1{} +Sprite "ENFAR0",1,1{} +Sprite "ENFAS0",1,1{} +Sprite "ENFAT0",1,1{} +Sprite "ENFAU0",1,1{} +Sprite "2NFFA0",1,1{} +Sprite "2NFFB0",1,1{} +Sprite "2NFFC0",1,1{} +Sprite "2NFFD0",1,1{} +Sprite "2NFFE0",1,1{} +Sprite "2NFFF0",1,1{} +Sprite "2NFFG0",1,1{} +Sprite "2NFFH0",1,1{} +Sprite "2NFFI0",1,1{} +Sprite "2NFFJ0",1,1{} +Sprite "2NFRA0",1,1{} +Sprite "2NFRB0",1,1{} +Sprite "2NFRC0",1,1{} +Sprite "2NFRD0",1,1{} +Sprite "2NFRE0",1,1{} +Sprite "2NFRF0",1,1{} +Sprite "2NFRG0",1,1{} +Sprite "2NFRH0",1,1{} +Sprite "2NFRI0",1,1{} +Sprite "2NFRJ0",1,1{} +Sprite "2NFRK0",1,1{} +Sprite "2NFRL0",1,1{} +Sprite "2NFRM0",1,1{} +Sprite "2NFRN0",1,1{} +Sprite "2NFRO0",1,1{} +Sprite "2NFRP0",1,1{} +Sprite "2NFRQ0",1,1{} +Sprite "2NFRR0",1,1{} +Sprite "2NFRS0",1,1{} +Sprite "2NFRT0",1,1{} +Sprite "2NFRU0",1,1{} +Sprite "2NFRV0",1,1{} +Sprite "2NFRW0",1,1{} +Sprite "2NFRX0",1,1{} +Sprite "2NFRY0",1,1{} +Sprite "2NFRZ0",1,1{} +Sprite "2NR2A0",1,1{} +Sprite "2NR2B0",1,1{} +Sprite "2NFSA0",1,1{} +Sprite "2NFSB0",1,1{} +Sprite "2NFSC0",1,1{} +Sprite "2NFSD0",1,1{} +Sprite "2NFSE0",1,1{} +Sprite "2NFSF0",1,1{} +Sprite "2NFSG0",1,1{} +Sprite "2NFSH0",1,1{} +Sprite "2NFSI0",1,1{} +Sprite "2NFSJ0",1,1{} +Sprite "2NFSK0",1,1{} +Sprite "2NFSL0",1,1{} +Sprite "2NFSM0",1,1{} +Sprite "2NFSN0",1,1{} +Sprite "2NFSO0",1,1{} +Sprite "2NFSP0",1,1{} +Sprite "2NFSQ0",1,1{} +Sprite "2NFSR0",1,1{} +Sprite "2NFSS0",1,1{} +Sprite "2NFST0",1,1{} +Sprite "2NFSU0",1,1{} +Sprite "2NFSV0",1,1{} +Sprite "2NFSW0",1,1{} +Sprite "2NFSX0",1,1{} +Sprite "2NFSY0",1,1{} +Sprite "2NFSZ0",1,1{} +Sprite "2NFIA0",1,1{} +Sprite "2NFIB0",1,1{} +Sprite "2NFTA0",1,1{} +Sprite "2NFTB0",1,1{} +Sprite "2NFTC0",1,1{} +Sprite "2NFTD0",1,1{} +Sprite "2NFTE0",1,1{} +Sprite "2NFTF0",1,1{} +Sprite "2NFTG0",1,1{} +Sprite "2NFTH0",1,1{} +Sprite "2NFTI0",1,1{} +Sprite "2NFTJ0",1,1{} +Sprite "2NFTK0",1,1{} +Sprite "2NFTL0",1,1{} +Sprite "2NFTM0",1,1{} +Sprite "2NFTN0",1,1{} +Sprite "2NFTO0",1,1{} +Sprite "2NFTP0",1,1{} +Sprite "2NFTQ0",1,1{} +Sprite "2NFTR0",1,1{} +Sprite "2NFTS0",1,1{} +Sprite "2NFTT0",1,1{} +Sprite "2NFTU0",1,1{} +Sprite "2NFTV0",1,1{} +Sprite "2NFTW0",1,1{} +Sprite "2NFTX0",1,1{} +Sprite "2NFTY0",1,1{} +Sprite "2NFDA0",1,1{} +Sprite "2NFDB0",1,1{} +Sprite "2NFDC0",1,1{} +Sprite "2NFDD0",1,1{} +Sprite "2NFDE0",1,1{} +Sprite "2NFDF0",1,1{} +Sprite "2NFDG0",1,1{} +Sprite "2NFDH0",1,1{} +Sprite "2NFDI0",1,1{} +Sprite "2NFDJ0",1,1{} +Sprite "2NFDK0",1,1{} +Sprite "2NFDL0",1,1{} +Sprite "2NFAA0",1,1{} +Sprite "2NFAB0",1,1{} +Sprite "2NFAC0",1,1{} +Sprite "2NFAD0",1,1{} +Sprite "2NFAE0",1,1{} +Sprite "2NFAF0",1,1{} +Sprite "2NFAG0",1,1{} +Sprite "2NFAH0",1,1{} +Sprite "2NFAI0",1,1{} +Sprite "2NFAJ0",1,1{} +Sprite "2NFAK0",1,1{} +Sprite "2NFAL0",1,1{} +Sprite "2NFAM0",1,1{} +Sprite "2NFAN0",1,1{} +Sprite "2NFAO0",1,1{} +Sprite "2NFAP0",1,1{} +Sprite "2NFAQ0",1,1{} +Sprite "2NFAR0",1,1{} +Sprite "2NFAS0",1,1{} +Sprite "2NFAT0",1,1{} +Sprite "2NFAU0",1,1{} +Sprite "EMUZA0",1,1{} +Sprite "EMUZB0",1,1{} +Sprite "EMUZC0",1,1{} +Sprite "EMUZD0",1,1{} diff --git a/zscript/chainsaw.zsc b/zscript/chainsaw.zsc index 04404c7..fb03288 100644 --- a/zscript/chainsaw.zsc +++ b/zscript/chainsaw.zsc @@ -58,7 +58,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,20,'slashed'); + int dmg = Random[Chainsaw](16,22); + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed'); d.HitActor.vel -= x*(500/d.HitActor.mass); vel += x*(100/mass); if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25); @@ -70,8 +71,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw } else { - d.HitActor.TraceBleed(20,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),20); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) @@ -94,7 +95,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,110,'Decapitated'); + int dmg = Random[Chainsaw](100,110); + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Decapitated'); d.HitActor.vel = -y*(1200/d.HitActor.mass); vel += x*(100/mass); if ( d.HitActor.player ) d.HitActor.A_QuakeEx(5,5,5,6,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.25); @@ -106,8 +108,8 @@ Class UTChainsaw : UTWeapon replaces Chainsaw } else { - d.HitActor.TraceBleed(110,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),110); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index aebfb5a..2fe71e4 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -15,23 +15,154 @@ Class EClip : MiniAmmo replaces Clip } } +Class EnforcerLight : DynamicLight +{ + int cnt; + Default + { + DynamicLight.Type "Point"; + args 255,224,64,150; + } + override void Tick() + { + Super.Tick(); + if ( !target ) + { + Destroy(); + return; + } + if ( target.player ) SetOrigin(target.Vec2OffsetZ(0,0,target.player.viewz),true); + else SetOrigin(target.pos,true); + if ( cnt++ > 2 ) Destroy(); + } +} + +Class BulletImpact : Actor +{ + Default + { + Radius 0.1; + Height 0; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_SprayDecal("Pock",20); + int numpt = Random[Enforcer](5,10); + Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + for ( int i=0; i 300 ) A_FadeOut(0.05); + return; + } + } + States + { + Spawn: + PCAS A 1 + { + A_SetAngle(angle+anglevel,SPF_INTERPOLATE); + A_SetPitch(pitch+pitchvel,SPF_INTERPOLATE); + } + Loop; + Bounce: + PCAS A 0 + { + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + vel = (vel.unit()+(FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2),FRandom[Junk](-.2,.2))).unit()*vel.length(); + } + Goto Spawn; + Death: + PCAS A -1 + { + A_SetPitch(0); + A_SetRoll(FRandom[Junk](0,360)); + } + Stop; + } +} + Class Enforcer : UTWeapon replaces Pistol { - bool Akimbo; + int ClipCount, SlaveClipCount; + bool SlaveActive, SlaveDown, SlaveReload, SlaveAltFire; + int SlaveRefire; - override string PickupMessage() + property ClipCount : ClipCount; + property SlaveClipCount : SlaveClipCount; + + override void PostRender() { - if ( Owner.CountInv(GetClass()) ) return "You picked up another Enforcer!"; - else return PickupMsg; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() ) return; + if ( Amount > 1 ) Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("L Clip: % 2d / 20\nR Clip: % 2d / 20",slaveclipcount,clipcount)); + else Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 20",clipcount)); } override bool HandlePickup (Inventory item) { - if (item.GetClass() == GetClass()) + if ( item.GetClass() == GetClass() ) { - if ( !Enforcer(item).Akimbo ) + if ( item.Amount == 1 ) { - Enforcer(item).Akimbo = true; item.bPickupGood = true; item.SetTag("Dual Enforcers"); } @@ -42,15 +173,183 @@ Class Enforcer : UTWeapon replaces Pistol override Inventory CreateTossable( int amt ) { - // TODO separate drops - return Super.CreateTossable(amt); + Inventory inv = Super.CreateTossable(amt); + if ( inv ) + { + SetTag("Enforcer"); + inv.SetTag("Enforcer"); + if ( Owner && (Owner.player.ReadyWeapon == self) ) + { + // delete the slave overlay + PSprite psp; + for ( psp = Owner.player.psprites; psp; psp = psp.next ) + { + if ( (psp.Caller == self) && (psp.id == 2) ) psp.Destroy(); + slaveactive = false; + slavedown = false; + } + } + } + return inv; + } + + action void A_EnforcerRefire( statelabel flash = null, bool slave = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap || !player ) return; + if ( slave ) + { + if ( invoker.slaveclipcount < 5 ) A_PlaySound("enforcer/click",CHAN_7); + if ( (invoker.slaveclipcount <= 0) || (weap.Ammo1.Amount <= 0) ) + { + invoker.slaverefire = 0; + return; + } + bool pending = (player.PendingWeapon != WP_NOCHANGE) && (player.WeaponState & WF_REFIRESWITCHOK); + if ( (player.cmd.buttons&BT_ATTACK) && !invoker.slavealtfire && !pending && (player.health > 0) ) + { + invoker.slaverefire++; + if ( player.ReadyWeapon.CheckAmmo(Weapon.PrimaryFire,true) ) + player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftHold")); + } + else if ( (player.cmd.buttons&BT_ALTATTACK) && invoker.slavealtfire && !pending && (player.health > 0) ) + { + invoker.slaverefire++; + if ( player.ReadyWeapon.CheckAmmo(Weapon.AltFire,true) ) + player.setpsprite(2,flash?ResolveState(flash):ResolveState("LeftAltHold")); + } + else + { + invoker.slaverefire = 0; + player.ReadyWeapon.CheckAmmo(invoker.slavealtfire?Weapon.AltFire:Weapon.PrimaryFire,true); + } + } + else + { + if ( invoker.clipcount < 5 ) A_PlaySound("enforcer/click",CHAN_WEAPON); + if ( (invoker.clipcount <= 0) || (weap.Ammo1.Amount <= 0) ) + { + A_ClearRefire(); + return; + } + A_Refire(flash); + } + } + + action void A_LeftWeaponReady() + { + Weapon weap = Weapon(invoker); + if ( !weap || !player ) return; + if ( player.cmd.buttons&BT_ATTACK && !player.ReadyWeapon.bAltFire ) + { + invoker.slaverefire = 0; + invoker.slavealtfire = false; + player.setpsprite(2,ResolveState("LeftFire")); + } + else if ( player.cmd.buttons&BT_ALTATTACK && player.ReadyWeapon.bAltFire ) + { + invoker.slaverefire = 0; + invoker.slavealtfire = true; + player.setpsprite(2,ResolveState("LeftAltFire")); + } + } + + action void A_EnforcerFire( bool alt = false, bool slave = false ) + { + Weapon weap = Weapon(invoker); + if ( !weap ) return; + if ( weap.Ammo1.Amount <= 0 ) return; + if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; + if ( slave ) + { + invoker.slaveclipcount--; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slaveclipcount <=0) ) invoker.slaveclipcount = Min(20,weap.Ammo1.Amount); + } + else + { + invoker.clipcount--; + if ( !CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.clipcount <=0) ) invoker.clipcount = Min(20,weap.Ammo1.Amount); + } + invoker.FireEffect(); + UTMainHandler.DoFlash(self,Color(32,255,128,0),1); + A_PlaySound("enforcer/shoot",slave?CHAN_7:CHAN_WEAPON); + A_AlertMonsters(); + A_QuakeEx(2,2,2,4,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.08); + if ( slave ) + { + if ( alt ) A_Overlay(-3,"LeftAltMuzzleFlash"); + else A_Overlay(-3,"LeftMuzzleFlash"); + A_OverlayFlags(-3,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-3,STYLE_Add); + } + else + { + if ( alt ) A_Overlay(-2,"AltMuzzleFlash"); + else A_Overlay(-2,"MuzzleFlash"); + A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); + A_OverlayRenderstyle(-2,STYLE_Add); + } + Vector3 x, y, z; + double a; + [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); + } + FLineTraceData d; + LineTrace(ang,10000,pt,TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); + if ( d.HitType == TRACE_HitActor ) + { + int dmg = Random[Enforcer](15,20); + 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); + } + origin += x*8.0+ydir*y*6.0-z*2.0; + let c = Spawn("UTCasing",origin); + c.vel = x*FRandom[Junk](-2,2)+y*ydir*FRandom[Junk](3,6)+z*FRandom[Junk](3,5); + } + + override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) + { + if ( Amount > 1 ) return "%k riddled %o full of holes with the Dual Enforcers."; + return "%k riddled %o full of holes with the Enforcer."; } Default { Tag "Enforcer"; - Inventory.PickupMessage "You picked up an Enforcer."; - Weapon.UpSound ""; + Inventory.PickupMessage "You picked up another Enforcer!"; + Inventory.MaxAmount 2; + Weapon.UpSound "enforcer/select"; Weapon.SlotNumber 2; Weapon.SelectionOrder 8; Weapon.AmmoType "MiniAmmo"; @@ -58,6 +357,8 @@ Class Enforcer : UTWeapon replaces Pistol Weapon.AmmoType2 "MiniAmmo"; Weapon.AmmoUse2 1; Weapon.AmmoGive 30; + Enforcer.ClipCount 20; + Enforcer.SlaveClipCount 20; } States { @@ -66,5 +367,168 @@ Class Enforcer : UTWeapon replaces Pistol Stop; ENFP B -1; Stop; + Select: + ENFS A 1 A_Raise(int.max); + Ready: + ENFS A 0 + { + invoker.slavedown = false; + if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) ) + A_Overlay(2,"LeftReady"); + } + ENFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + Idle: + ENFI A 0 A_Overlay(-9999,"Dummy"); + ENFI AB 30; + ENFI A 0 A_Jump(50,"Twiddle"); + Goto Idle+1; + LeftReady: + 2NFS A 0 + { + A_PlaySound("enforcer/select",CHAN_7); + invoker.slaveactive = true; + } + 2NFS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + LeftIdle: + 2NFI A 0 A_Overlay(-9998,"LeftDummy"); + 2NFI AB 30; + 2NFI A 0 A_Jump(50,"LeftTwiddle"); + Goto LeftIdle+1; + Twiddle: + ENFT ABCDEFGHIJKLMNOPQRSTUVWXY 2; + Goto Idle+1; + LeftTwiddle: + 2NFT ABCDEFGHIJKLMNOPQRSTUVWXY 2; + Goto LeftIdle+1; + Dummy: + TNT1 A 1 + { + if ( (invoker.clipcount <= 0) && (invoker.Ammo1.Amount > 0) ) A_Overlay(PSP_WEAPON,"Reload"); + if ( CVar.GetCVar('flak_enforcerreload').GetBool() && ((invoker.clipcount < min(20,invoker.Ammo1.Amount)) || (invoker.slaveclipcount < min(20,invoker.Ammo1.Amount))) ) A_WeaponReady(WRF_ALLOWRELOAD); + else A_WeaponReady(); + if ( !invoker.slaveactive && (CountInv("Enforcer") > 1) ) A_Overlay(2,"LeftReady"); + } + Wait; + LeftDummy: + TNT1 A 1 + { + if ( health <= 0 ) + { + invoker.slaveactive = false; + A_Overlay(2,"LeftDeselect"); + } + if ( CVar.GetCVar('flak_enforcerreload').GetBool() && (invoker.slavereload || (invoker.slaveclipcount < 0)) ) A_Overlay(2,"LeftReload"); + if ( invoker.slavedown ) A_Overlay(2,"LeftDeselect"); + A_LeftWeaponReady(); + } + Wait; + Fire: + ENFF A 0 A_Overlay(-9999,"Null"); + Hold: + ENFF A 0 A_EnforcerFire(); + ENFF ABCDEFGHI 1; + ENFF J 3 A_EnforcerRefire(); + Goto Idle; + LeftFire: + 2NFI A 0 A_Overlay(-9998,"Null"); + 2NFI A 1 A_SetTics(Random[Enforcer](0,5)); + LeftHold: + 2NFF A 0 A_EnforcerFire(false,true); + 2NFF ABCDEFGHI 1; + 2NFF J 3 A_EnforcerRefire("LeftHold",true); + Goto LeftIdle; + AltFire: + ENFA A 0 A_Overlay(-9999,"Null"); + ENFA ABCDEF 1; + AltHold: + ENFA G 0 A_EnforcerFire(true); + ENFA GHIJKLMN 1; + ENFA G 0 A_EnforcerRefire(); + ENFA OPQRSTU 1; + Goto Idle; + LeftAltFire: + 2NFI A 0 A_Overlay(-9998,"Null"); + 2NFI A 1 A_SetTics(Random[Enforcer](0,5)); + 2NFI A 0; + 2NFA ABCDEF 1; + LeftAltHold: + 2NFA G 0 A_EnforcerFire(true,true); + 2NFA GHIJKLMN 1; + 2NFA G 0 A_EnforcerRefire("LeftAltHold",true); + 2NFA OPQRSTU 1; + Goto LeftIdle; + Reload: + ENFR A 0 + { + invoker.slavereload = ((player.cmd.buttons&BT_RELOAD)&&(invoker.slaveclipcount < min(20,invoker.Ammo1.Amount)))||(invoker.slaveclipcount <= 0); + return A_JumpIf(invoker.clipcount>=min(20,invoker.Ammo1.Amount),"Idle"); + } + ENFR A 0 + { + invoker.clipcount = Min(20,invoker.Ammo1.Amount); + A_Overlay(-9999,"Null"); + A_PlaySound("enforcer/click",CHAN_WEAPON); + } + ENFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + ENR2 AB 1; + ENR2 B 30 A_PlaySound("enforcer/reload",CHAN_WEAPON); + ENFS A 0 A_PlaySound("enforcer/select",CHAN_WEAPON); + Goto Ready; + LeftReload: + 2NFR A 0 + { + invoker.slaveclipcount = Min(20,invoker.Ammo1.Amount); + invoker.slavereload = false; + A_Overlay(-9998,"Null"); + A_PlaySound("enforcer/click",CHAN_7); + } + 2NFR ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; + 2NR2 AB 1; + 2NR2 B 30 A_PlaySound("enforcer/reload",CHAN_7); + 2NFS A 0 A_PlaySound("enforcer/select",CHAN_7); + Goto LeftReady; + Deselect: + ENFI A 1 { invoker.slavedown = true; } + ENFD A 0 A_Overlay(-9999,"Null"); + ENFD A 0 A_JumpIf(invoker.slaveactive,"Deselect"); + ENFD ABCDEFGHIJKL 1; + ENFD L 1 A_Lower(int.max); + Wait; + LeftDeselect: + 2NFD A 0 + { + A_Overlay(-9998,"Null"); + invoker.slaveactive = false; + } + 2NFD ABCDEFGHIJKL 1; + Stop; + MuzzleFlash: + EMUZ A 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + AltMuzzleFlash: + EMUZ B 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + LeftMuzzleFlash: + EMUZ C 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; + LeftAltMuzzleFlash: + EMUZ D 2 Bright + { + let l = Spawn("EnforcerLight",pos); + l.target = self; + } + Stop; } } diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index be80c62..fb23324 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -461,14 +461,7 @@ Class FlakLight : DynamicLight Default { DynamicLight.Type "Point"; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - args[LIGHT_INTENSITY] = 150; - args[LIGHT_RED] = 255; - args[LIGHT_GREEN] = 224; - args[LIGHT_BLUE] = 128; + args 255,224,128,150; } override void Tick() { diff --git a/zscript/impacthammer.zsc b/zscript/impacthammer.zsc index bb5e072..5d766f5 100644 --- a/zscript/impacthammer.zsc +++ b/zscript/impacthammer.zsc @@ -75,7 +75,8 @@ Class ImpactHammer : UTWeapon replaces Fist LineTrace(angle,80,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,60*realcharge,'impact'); + int dmg = Random[Impact](50,60)*realcharge; + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact'); d.HitActor.vel = x*(1000/d.HitActor.mass)*realcharge; if ( d.HitActor.bNOBLOOD ) { @@ -85,15 +86,16 @@ Class ImpactHammer : UTWeapon replaces Fist } else { - d.HitActor.TraceBleed(60*realcharge,invoker); - d.HitActor.SpawnBlood(d.HitLocation,atan2(-d.HitDir.y,-d.HitDir.x),60*realcharge); + d.HitActor.TraceBleed(dmg,invoker); + d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg); } } else if ( d.HitType != TRACE_HitNone ) { realcharge = max(1.0,realcharge); - DamageMobj(invoker,self,24*realcharge,'impact'); // It's a flat damage of 36 on UT, but I think it's more fair for it to scale - TraceBleed(24*realcharge,invoker); + int dmg = Random[Impact](16,24)*realcharge; // It's a flat damage of 36 on UT, but I think it's more fair for it to scale + dmg = DamageMobj(invoker,self,dmg,'impact'); + TraceBleed(dmg,invoker); vel -= x*(1200/mass)*realcharge; let p = Spawn("HammerImpact",d.HitLocation-d.HitDir*4); p.angle = atan2(d.HitDir.y,d.HitDir.x); @@ -135,12 +137,14 @@ Class ImpactHammer : UTWeapon replaces Fist double dscale = d.Distance/180.; if ( d.HitType == TRACE_HitActor ) { - d.HitActor.DamageMobj(invoker,self,20*dscale,'impact'); + int dmg = Random[Impact](16,20)*dscale; + dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact'); d.HitActor.vel = x*(500/d.HitActor.mass)*dscale; } else if ( d.HitType != TRACE_HitNone ) { - DamageMobj(invoker,self,24*dscale,'impact'); + int dmg = Random[Impact](16,24)*dscale; + dmg = DamageMobj(invoker,self,dmg,'impact'); vel -= x*(600/mass)*dscale; if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4); } diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 8336f6f..3f79509 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -330,6 +330,12 @@ Class PulseGun : UTWeapon Property ClipCount : clipcount; + override void PostRender() + { + if ( !CVar.GetCVar('flak_pulsereload').GetBool() ) return; + Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,Screen.GetHeight()*0.88,String.Format("Clip: % 2d / 50",clipcount)); + } + action void A_Reloading() { Weapon weap = Weapon(invoker); diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index 289f62f..b3c85b1 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -2,9 +2,10 @@ Class UTPlayer : DoomPlayer { Default { - Player.StartItem "ImpactHammer"; - Player.StartItem "Translocator"; + Player.StartItem "MiniAmmo", 30; Player.StartItem "Enforcer"; + Player.StartItem "Translocator"; + Player.StartItem "ImpactHammer"; } // Have to modify the give cheat to handle UT armor