From 52b4ac0aed8771683d60d39441a4e4dede93d899 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 5 Apr 2014 16:27:39 +1300 Subject: [PATCH 1/4] Update neighbours when walls are destroyed or sold. Fixes #2351. --- OpenRA.Mods.RA/Render/RenderBuildingWall.cs | 84 ++++++++++++++------- 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs index ee1bdddc20..7a25fe890e 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -15,56 +15,86 @@ namespace OpenRA.Mods.RA.Render { class RenderBuildingWallInfo : RenderBuildingInfo { - public override object Create(ActorInitializer init) { return new RenderBuildingWall( init, this ); } + public readonly string Sequence = "idle"; + + public override object Create(ActorInitializer init) { return new RenderBuildingWall(init, this); } } - class RenderBuildingWall : RenderBuilding, INotifyBuildComplete + class RenderBuildingWall : RenderBuilding, INotifyBuildComplete, INotifyAddedToWorld, INotifyRemovedFromWorld { - string seqName; - int adjacentWalls = 0; + readonly RenderBuildingWallInfo info; + int adjacent = 0; + bool dirty = true; - public RenderBuildingWall( ActorInitializer init, RenderBuildingInfo info ) + public RenderBuildingWall(ActorInitializer init, RenderBuildingWallInfo info) : base(init, info) { - seqName = "idle"; + this.info = info; } - public void BuildingComplete( Actor self ) + public void BuildingComplete(Actor self) { - anim.PlayFetchIndex(seqName, () => adjacentWalls); + anim.PlayFetchIndex(info.Sequence, () => adjacent); } public override void DamageStateChanged(Actor self, AttackInfo e) { - anim.PlayFetchIndex(NormalizeSequence(anim, e.DamageState, "idle"), () => adjacentWalls); + anim.PlayFetchIndex(NormalizeSequence(anim, e.DamageState, info.Sequence), () => adjacent); } - bool hasTicked = false; public override void Tick(Actor self) { base.Tick(self); - if (!hasTicked) - { - var vec = new CVec(1, 1); - var adjWalls = self.World.FindActorsInBox(self.Location - vec, self.Location + vec) - .Where(a => a.Info == self.Info && a != self); + if (!dirty) + return; - foreach (var w in adjWalls) - { - w.Trait().AddAdjacentWall(w.Location, self.Location); - AddAdjacentWall(self.Location, w.Location); - } - hasTicked = true; + // Update connection to neighbours + var vec = new CVec(1, 1); + var adjacentActors = self.World.FindActorsInBox(self.Location - vec, self.Location + vec); + + adjacent = 0; + foreach (var a in adjacentActors) + { + var rb = a.TraitOrDefault(); + if (rb == null) + continue; + + var location = self.Location; + var otherLocation = a.Location; + + if (otherLocation == location + new CVec(0, -1)) + adjacent |= 1; + else if (otherLocation == location + new CVec(+1, 0)) + adjacent |= 2; + else if (otherLocation == location + new CVec(0, +1)) + adjacent |= 4; + else if (otherLocation == location + new CVec(-1, 0)) + adjacent |= 8; } + + dirty = false; } - void AddAdjacentWall(CPos location, CPos otherLocation) + void UpdateNeighbours(Actor self) { - if (otherLocation == location + new CVec(0, -1)) adjacentWalls |= 1; - if (otherLocation == location + new CVec(+1, 0)) adjacentWalls |= 2; - if (otherLocation == location + new CVec(0, +1)) adjacentWalls |= 4; - if (otherLocation == location + new CVec(-1, 0)) adjacentWalls |= 8; + var vec = new CVec(1, 1); + var neighbours = self.World.FindActorsInBox(self.Location - vec, self.Location + vec) + .Select(a => a.TraitOrDefault()) + .Where(a => a != null); + + foreach (var rb in neighbours) + rb.dirty = true; + } + + public void AddedToWorld(Actor self) + { + UpdateNeighbours(self); + } + + public void RemovedFromWorld(Actor self) + { + UpdateNeighbours(self); } } } From 82ac8d8d809d232d9f8f68702cb47de79f846306 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 5 Apr 2014 17:05:42 +1300 Subject: [PATCH 2/4] Support multiple wall-type connections for D2K. --- OpenRA.Mods.RA/Render/RenderBuildingWall.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs index 7a25fe890e..a967180a99 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs @@ -15,6 +15,7 @@ namespace OpenRA.Mods.RA.Render { class RenderBuildingWallInfo : RenderBuildingInfo { + public readonly string Type = "wall"; public readonly string Sequence = "idle"; public override object Create(ActorInitializer init) { return new RenderBuildingWall(init, this); } @@ -57,7 +58,7 @@ namespace OpenRA.Mods.RA.Render foreach (var a in adjacentActors) { var rb = a.TraitOrDefault(); - if (rb == null) + if (rb == null || rb.info.Type != info.Type) continue; var location = self.Location; From 15c2930eebf2a66134a7cb372c835b018bc7b8c8 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 5 Apr 2014 17:06:00 +1300 Subject: [PATCH 3/4] Allow turrets to connect to walls in D2K. Fixes #5032. --- mods/d2k/rules/structures.yaml | 14 +-- mods/d2k/sequences/structures.yaml | 156 ++++++++--------------------- 2 files changed, 50 insertions(+), 120 deletions(-) diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 87f8da53b7..7b349988fd 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -452,7 +452,7 @@ WALL: BuildSounds: CHUNG.WAV SellSounds: CHUNG.WAV Selectable: - Bounds: 32,32 + Bounds: 32,40,0,-8 Priority: 3 -GivesBuildableArea: Health: @@ -462,7 +462,8 @@ WALL: RevealsShroud: Range: 8c0 RenderRangeCircle: - RenderBuilding: + -RenderBuilding: + RenderBuildingWall: HasMakeAnimation: false BodyOrientation: QuantizedFacings: 32 @@ -473,7 +474,7 @@ WALL: InitialFacing: 128 Armament: Weapon: TurretGun - LocalOffset: 448,0,128 + LocalOffset: 672,0,480 MuzzleSequence: muzzle AttackTurreted: AutoTarget: @@ -502,7 +503,7 @@ WALL: BuildSounds: CHUNG.WAV SellSounds: CHUNG.WAV Selectable: - Bounds: 32,32 + Bounds: 32,40,0,-8 Priority: 3 -GivesBuildableArea: Health: @@ -512,14 +513,15 @@ WALL: RevealsShroud: Range: 10c0 RenderRangeCircle: - RenderBuilding: + -RenderBuilding: + RenderBuildingWall: HasMakeAnimation: false BodyOrientation: QuantizedFacings: 32 WithTurret: Armament: Weapon: TowerMissile - LocalOffset: 256,384,448, 256,-384,448 + LocalOffset: 256,384,768, 256,-384,768 AttackTurreted: Turreted: ROT: 8 diff --git a/mods/d2k/sequences/structures.yaml b/mods/d2k/sequences/structures.yaml index 119d4eb75f..855540c00f 100644 --- a/mods/d2k/sequences/structures.yaml +++ b/mods/d2k/sequences/structures.yaml @@ -13,18 +13,10 @@ walla: Frames: 2527, 2530, 2528, 2538, 2531, 2532, 2542, 2535, 2529, 2539, 2533, 2534, 2540, 2536, 2537, 2541 Length: 16 Offset: -16,16 - scratched-idle: DATA - Frames: 2527, 2530, 2528, 2538, 2531, 2532, 2542, 2535, 2529, 2539, 2533, 2534, 2540, 2536, 2537, 2541 - Length: 16 - Offset: -16,16 damaged-idle: DATA Frames: 2543, 2546, 2544, 2554, 2547, 2548, 2558, 2551, 2545, 2555, 2549, 2550, 2556, 2552, 2553, 2557 Length: 16 Offset: -16,16 - critical-idle: DATA - Frames: 2543, 2546, 2544, 2554, 2547, 2548, 2558, 2551, 2545, 2555, 2549, 2550, 2556, 2552, 2553, 2557 - Length: 16 - Offset: -16,16 icon: DATA Start: 4063 Offset: -30,-24 @@ -34,18 +26,10 @@ wallh: Frames: 2687, 2690, 2688, 2698, 2691, 2692, 2702, 2695, 2689, 2699, 2693, 2694, 2700, 2696, 2697, 2701 Length: 16 Offset: -16,16 - scratched-idle: DATA - Frames: 2687, 2690, 2688, 2698, 2691, 2692, 2702, 2695, 2689, 2699, 2693, 2694, 2700, 2696, 2697, 2701 - Length: 16 - Offset: -16,16 damaged-idle: DATA Frames: 2703, 2706, 2704, 2714, 2707, 2708, 2718, 2711, 2705, 2715, 2709, 2710, 2716, 2712, 2713, 2717 Length: 16 Offset: -16,16 - critical-idle: DATA - Frames: 2703, 2706, 2704, 2714, 2707, 2708, 2718, 2711, 2705, 2715, 2709, 2710, 2716, 2712, 2713, 2717 - Length: 16 - Offset: -16,16 icon: DATA Start: 4064 Offset: -30,-24 @@ -55,43 +39,27 @@ wallo: Frames: 2847, 2850, 2848, 2858, 2851, 2852, 2862, 2855, 2849, 2859, 2853, 2854, 2860, 2856, 2857, 2861 Length: 16 Offset: -16,16 - scratched-idle: DATA - Frames: 2847, 2850, 2848, 2858, 2851, 2852, 2862, 2855, 2849, 2859, 2853, 2854, 2860, 2856, 2857, 2861 - Length: 16 - Offset: -16,16 damaged-idle: DATA Frames: 2863, 2866, 2864, 2874, 2867, 2868, 2878, 2871, 2865, 2875, 2869, 2870, 2876, 2872, 2873, 2877 Length: 16 Offset: -16,16 - critical-idle: DATA - Frames: 2863, 2866, 2864, 2874, 2867, 2868, 2878, 2871, 2865, 2875, 2869, 2870, 2876, 2872, 2873, 2877 - Length: 16 - Offset: -16,16 icon: DATA Start: 4065 Offset: -30,-24 guntowera: idle: DATA - Start: 2573 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2573 - Facings: 1 - Offset: -24,24 + Frames: 2573, 2576, 2574, 2584, 2577, 2578, 2588, 2581, 2575, 2585, 2579, 2580, 2586, 2582, 2583, 2587 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2573 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2573 - Facings: 1 - Offset: -24,24 + Frames: 2621, 2624, 2622, 2632, 2625, 2626, 2636, 2629, 2623, 2633, 2627, 2628, 2634, 2630, 2631, 2635 + Length: 16 + Offset: -24,16 turret: DATA Start: 2589 Facings: -32 - Offset: -24,24 + Offset: -24,16 muzzle: DATA Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 Facings: -32 @@ -103,25 +71,17 @@ guntowera: guntowerh: idle: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 + Frames: 2733, 2736, 2734, 2744, 2737, 2738, 2748, 2741, 2735, 2745, 2739, 2740, 2746, 2742, 2743, 2747 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 + Frames: 2781, 2784, 2782, 2792, 2785, 2786, 2796, 2789, 2783, 2793, 2787, 2788, 2794, 2790, 2791, 2795 + Length: 16 + Offset: -24,16 turret: DATA Start: 2749 Facings: -32 - Offset: -24,24 + Offset: -24,16 muzzle: DATA Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 Facings: -32 @@ -133,25 +93,17 @@ guntowerh: guntowero: idle: DATA - Start: 2893 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2893 - Facings: 1 - Offset: -24,24 + Frames: 2893, 2896, 2894, 2904, 2897, 2898, 2908, 2901, 2895, 2905, 2899, 2900, 2906, 2902, 2903, 2907 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2893 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2893 - Facings: 1 - Offset: -24,24 + Frames: 2941, 2944, 2942, 2952, 2945, 2946, 2956, 2949, 2943, 2953, 2947, 2948, 2954, 2950, 2951, 2955 + Length: 16 + Offset: -24,16 turret: DATA Start: 2909 Facings: -32 - Offset: -24,24 + Offset: -24,16 muzzle: DATA Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 Facings: -32 @@ -163,75 +115,51 @@ guntowero: rockettowera: idle: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 + Frames: 2573, 2576, 2574, 2584, 2577, 2578, 2588, 2581, 2575, 2585, 2579, 2580, 2586, 2582, 2583, 2587 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2733 - Facings: 1 - Offset: -24,24 + Frames: 2621, 2624, 2622, 2632, 2625, 2626, 2636, 2629, 2623, 2633, 2627, 2628, 2634, 2630, 2631, 2635 + Length: 16 + Offset: -24,16 turret: DATA Start: 2637 Facings: -32 - Offset: -24,24 + Offset: -24,16 icon: DATA Start: 4075 Offset: -30,-24 rockettowerh: idle: DATA - Start: 2781 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2781 - Facings: 1 - Offset: -24,24 + Frames: 2733, 2736, 2734, 2744, 2737, 2738, 2748, 2741, 2735, 2745, 2739, 2740, 2746, 2742, 2743, 2747 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2781 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2781 - Facings: 1 - Offset: -24,24 + Frames: 2781, 2784, 2782, 2792, 2785, 2786, 2796, 2789, 2783, 2793, 2787, 2788, 2794, 2790, 2791, 2795 + Length: 16 + Offset: -24,16 turret: DATA Start: 2797 Facings: -32 - Offset: -24,24 + Offset: -24,16 icon: DATA Start: 4076 Offset: -30,-24 rockettowero: idle: DATA - Start: 2941 - Facings: 1 - Offset: -24,24 - recoil: DATA - Start: 2941 - Facings: 1 - Offset: -24,24 + Frames: 2893, 2896, 2894, 2904, 2897, 2898, 2908, 2901, 2895, 2905, 2899, 2900, 2906, 2902, 2903, 2907 + Length: 16 + Offset: -24,16 damaged-idle: DATA - Start: 2941 - Facings: 1 - Offset: -24,24 - damaged-recoil: DATA - Start: 2941 - Facings: 1 - Offset: -24,24 + Frames: 2941, 2944, 2942, 2952, 2945, 2946, 2956, 2949, 2943, 2953, 2947, 2948, 2954, 2950, 2951, 2955 + Length: 16 + Offset: -24,16 turret: DATA Start: 2957 Facings: -32 - Offset: -24,24 + Offset: -24,16 icon: DATA Start: 4077 Offset: -30,-24 From 4025db45a3814cad6b0d746d1a53fff97df3cebf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 5 Apr 2014 17:57:50 +1300 Subject: [PATCH 4/4] Fix turret muzzleflash. --- OpenRA.Mods.RA/Render/WithMuzzleFlash.cs | 9 ++++++--- mods/d2k/rules/structures.yaml | 1 + mods/d2k/sequences/structures.yaml | 9 ++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs b/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs index 0b2e099fda..c35c3c68c2 100644 --- a/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs +++ b/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs @@ -19,7 +19,10 @@ namespace OpenRA.Mods.RA.Render { class WithMuzzleFlashInfo : ITraitInfo, Requires, Requires, Requires { - public object Create(ActorInitializer init) { return new WithMuzzleFlash(init.self); } + [Desc("Ignore the weapon position, and always draw relative to the center of the actor")] + public readonly bool IgnoreOffset = false; + + public object Create(ActorInitializer init) { return new WithMuzzleFlash(init.self, this); } } class WithMuzzleFlash : INotifyAttack, IRender, ITick @@ -28,7 +31,7 @@ namespace OpenRA.Mods.RA.Render Dictionary anims = new Dictionary(); Func getFacing; - public WithMuzzleFlash(Actor self) + public WithMuzzleFlash(Actor self, WithMuzzleFlashInfo info) { var render = self.Trait(); var facing = self.TraitOrDefault(); @@ -52,7 +55,7 @@ namespace OpenRA.Mods.RA.Render visible.Add(barrel, false); anims.Add(barrel, new AnimationWithOffset(muzzleFlash, - () => arm.MuzzleOffset(self, barrel), + () => info.IgnoreOffset ? WVec.Zero : arm.MuzzleOffset(self, barrel), () => !visible[barrel], p => WithTurret.ZOffsetFromCenter(self, p, 2))); } diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 7b349988fd..6de76a261e 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -469,6 +469,7 @@ WALL: QuantizedFacings: 32 WithTurret: WithMuzzleFlash: + IgnoreOffset: true Turreted: ROT: 6 InitialFacing: 128 diff --git a/mods/d2k/sequences/structures.yaml b/mods/d2k/sequences/structures.yaml index 855540c00f..e33614a649 100644 --- a/mods/d2k/sequences/structures.yaml +++ b/mods/d2k/sequences/structures.yaml @@ -61,9 +61,10 @@ guntowera: Facings: -32 Offset: -24,16 muzzle: DATA - Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 + Frames: 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, 3868, 3869, 3869, 3870, 3870 Facings: -32 Length: 2 + Offset: 0,-12 BlendMode: Additive icon: DATA Start: 4069 @@ -83,9 +84,10 @@ guntowerh: Facings: -32 Offset: -24,16 muzzle: DATA - Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 + Frames: 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, 3868, 3869, 3869, 3870, 3870 Facings: -32 Length: 2 + Offset: 0,-12 BlendMode: Additive icon: DATA Frames: 4070 @@ -105,9 +107,10 @@ guntowero: Facings: -32 Offset: -24,16 muzzle: DATA - Frames: 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, 3779, 3779, 3780, 3780, 3781, 3781, 3782, 3782, 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806 + Frames: 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, 3868, 3869, 3869, 3870, 3870 Facings: -32 Length: 2 + Offset: 0,-12 BlendMode: Additive icon: DATA Start: 4071