Skip to content
Closed
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
b2edaec
Remove MaxMind.dll - fixes windows build
kienanstewart Jan 22, 2021
78c7427
Fix macosx build
kienanstewart Jan 22, 2021
7e5344d
Copy dylibs from engine to package for MacOS
kienanstewart Jan 22, 2021
1309141
Start of engine update to playtest-20201213
kienanstewart Jan 26, 2021
8faa0de
Fix content loading
kienanstewart Jan 27, 2021
94b173a
Replace SelfHealing with ChangesHealth
kienanstewart Jan 27, 2021
a760065
Add dimensions and footprint for chronosphere and iron curtain
kienanstewart Jan 27, 2021
4e74dcc
Add placeholder entries in chrome.yaml to load menu
kienanstewart Jan 27, 2021
cf99405
Fix crash loading streams from audio bag
kienanstewart Jan 27, 2021
92f1d0a
Add capacity pips to harvesters
kienanstewart Jan 27, 2021
74c9576
Add default cargo pips back for vehicles that require them
kienanstewart Jan 28, 2021
ccbad9f
Update FacingTolerance to match WAngle extents
kienanstewart Jan 28, 2021
708da9a
Rename ValidStaqnces to ValidRelationships
kienanstewart Jan 28, 2021
e04612c
Update InitialFacing and PreviewFacing
kienanstewart Jan 28, 2021
a646203
Update TurnSpeed
kienanstewart Jan 28, 2021
d232678
Fix crash when Nighthawk attacks
kienanstewart Jan 28, 2021
9780675
Fix dock angle's for refineries
kienanstewart Jan 29, 2021
527b1d4
Update Facing values
kienanstewart Jan 29, 2021
c667662
Replace Left/Right Color with Min/Max Color
kienanstewart Jan 29, 2021
d041776
Remove MuzzleSplitFacings
kienanstewart Jan 29, 2021
31ccac8
Replace AmmoPool/PipCount with WithAmmomPipsDecoration
kienanstewart Jan 29, 2021
f11f65d
Use yellow pips for ore in harvesters
kienanstewart Jan 29, 2021
2558a87
Use inherited cargopips definition for transports
kienanstewart Jan 29, 2021
0b6fdb2
Fix destroyers attacking with osprey
kienanstewart Jan 30, 2021
cdcd9ff
Replace all ReferencePoint with Position
kienanstewart Jan 30, 2021
f76e88c
Add selection decorations back to vehicles
kienanstewart Jan 30, 2021
63426ca
Update launch-game.cmd for new engine location
kienanstewart Jan 31, 2021
abdfae4
Update utility and stylecheck exe paths in make.ps1
kienanstewart Jan 31, 2021
144fbc1
Update OpenRA.Utility.exe path
kienanstewart Jan 31, 2021
6856600
Add dependencies to the test target
kienanstewart Jan 31, 2021
d4490a8
Fix unknown trait field 'ForceRelationships'
kienanstewart Jan 31, 2021
c53a478
Fix combined muzzle sequences
kienanstewart Jan 31, 2021
da806e2
Remove PipColor from resources
kienanstewart Jan 31, 2021
f18a779
Rename SmokeType and SmokePercentage
kienanstewart Jan 31, 2021
d450377
Rename DisplayTimerStances to DisplayTimeRelationships
kienanstewart Jan 31, 2021
cb7aeaa
Replace FlashType with FlashPaletteEffect for nukes
kienanstewart Jan 31, 2021
5650540
Replace Notification with InfiltratedNotification
kienanstewart Jan 31, 2021
fcce71e
Allow null images for a number of projectile sequences
kienanstewart Jan 31, 2021
3d7b373
Fix missing muzzle on allied fv
kienanstewart Jan 31, 2021
7a466bc
Fix warning about missing animation for dog DefaultAttackSequence
kienanstewart Jan 31, 2021
02be2f4
Fix last warnings from test command
kienanstewart Feb 2, 2021
09a3413
Fix frame-end behaviour for carrier parents (eg. destroyers)
kienanstewart Feb 2, 2021
c722267
Import OpenRAModSDK changes since 20200503
kienanstewart Feb 2, 2021
20f09d5
Copy glyphs.png from RA temporarily
kienanstewart Feb 2, 2021
ad2ff61
Ignore .so files everywhere
kienanstewart Feb 2, 2021
c1a46d3
Add scaled glyphs from RA
kienanstewart Feb 2, 2021
51f50b0
Fix harvester pip colouration
kienanstewart Feb 2, 2021
d0555ef
Fix pip colours for transports
kienanstewart Feb 2, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 9 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -102,16 +102,12 @@ check-variables:
exit 1; \
fi

engine-dependencies: check-variables check-sdk-scripts
@./fetch-engine.sh || (printf "Unable to continue without engine files\n"; exit 1)
@cd $(ENGINE_DIRECTORY) && make dependencies WIN32=$(WIN32)

engine: check-variables check-sdk-scripts
@./fetch-engine.sh || (printf "Unable to continue without engine files\n"; exit 1)
@cd $(ENGINE_DIRECTORY) && make core WIN32=$(WIN32)
@cd $(ENGINE_DIRECTORY) && make all

utility: engine-dependencies engine
@test -f "$(ENGINE_DIRECTORY)/OpenRA.Utility.exe" || (printf "OpenRA.Utility.exe not found!\n"; exit 1)
utility: engine
@test -f "$(ENGINE_DIRECTORY)/bin/OpenRA.Utility.exe" || (printf "OpenRA.Utility.exe not found!\n"; exit 1)

core:
@command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 5.4."; exit 1)
Expand All @@ -125,7 +121,7 @@ else
endif
endif

all: engine-dependencies engine core
all: engine core

clean: engine
@command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 5.4."; exit 1)
Expand Down Expand Up @@ -157,12 +153,12 @@ ifneq ("$(MOD_SOLUTION_FILES)","")
@$(MSBUILD) -t:build -p:Configuration=Debug
endif
@echo "Checking runtime assemblies..."
@MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/OpenRA.Utility.exe" $(MOD_ID) --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES) $(WHITELISTED_MOD_ASSEMBLIES)
@ENGINE_DIR='..' MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/bin/OpenRA.Utility.exe" $(MOD_ID) --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES) $(WHITELISTED_MOD_ASSEMBLIES)
@echo "Checking for explicit interface violations..."
@MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/OpenRA.Utility.exe" $(MOD_ID) --check-explicit-interfaces
@ENGINE_DIR='..' MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/bin/OpenRA.Utility.exe" $(MOD_ID) --check-explicit-interfaces
@echo "Checking for incorrect conditional trait interface overrides..."
@MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/OpenRA.Utility.exe" $(MOD_ID) --check-conditional-trait-interface-overrides
@ENGINE_DIR='..' MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/bin/OpenRA.Utility.exe" $(MOD_ID) --check-conditional-trait-interface-overrides

test: utility
test: utility engine core
@echo "Testing $(MOD_ID) mod MiniYAML..."
@MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/OpenRA.Utility.exe" $(MOD_ID) --check-yaml
@ENGINE_DIR='..' MOD_SEARCH_PATHS="$(MOD_SEARCH_PATHS)" mono --debug "$(ENGINE_DIRECTORY)/bin/OpenRA.Utility.exe" $(MOD_ID) --check-yaml
1 change: 0 additions & 1 deletion OpenRA.Mods.RA2/FileSystem/BagFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ public Stream GetStream(string filename)
// Construct a merged stream
var waveStream = SegmentStream.CreateWithoutOwningStream(s, entry.Offset, (int)entry.Length);
var mergedStream = new MergedStream(waveHeaderMemoryStream, waveStream);
mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length);

return mergedStream;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,20 @@ public ExtendedTilesetSpecificSpriteSequenceLoader(ModData modData)
TilesetSuffixes = yaml.ToDictionary(kv => kv.Value);
}

public override ISpriteSequence CreateSequence(ModData modData, TileSet tileSet, SpriteCache cache, string sequence, string animation, MiniYaml info)
public override ISpriteSequence CreateSequence(ModData modData, string tileSet, SpriteCache cache, string sequence, string animation, MiniYaml info)
{
return new ExtendedTilesetSpecificSpriteSequence(modData, tileSet, cache, this, sequence, animation, info);
}
}

public class ExtendedTilesetSpecificSpriteSequence : DefaultSpriteSequence
{
public ExtendedTilesetSpecificSpriteSequence(ModData modData, TileSet tileSet, SpriteCache cache, ISpriteSequenceLoader loader, string sequence, string animation, MiniYaml info)
public ExtendedTilesetSpecificSpriteSequence(ModData modData, string tileSet, SpriteCache cache, ISpriteSequenceLoader loader, string sequence, string animation, MiniYaml info)
: base(modData, tileSet, cache, loader, sequence, animation, info) { }

string ResolveTilesetId(TileSet tileSet, Dictionary<string, MiniYaml> d)
string ResolveTilesetId(string tileSet, Dictionary<string, MiniYaml> d)
{
var tsId = tileSet.Id;
var tsId = tileSet;

MiniYaml yaml;
if (d.TryGetValue("TilesetOverrides", out yaml))
Expand All @@ -68,7 +68,7 @@ string ResolveTilesetId(TileSet tileSet, Dictionary<string, MiniYaml> d)
return tsId;
}

protected override string GetSpriteSrc(ModData modData, TileSet tileSet, string sequence, string animation, string sprite, Dictionary<string, MiniYaml> d)
protected override string GetSpriteSrc(ModData modData, string tileSet, string sequence, string animation, string sprite, Dictionary<string, MiniYaml> d)
{
var loader = (ExtendedTilesetSpecificSpriteSequenceLoader)Loader;

Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA2/Graphics/TintedCell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public void Render(WorldRenderer wr)
var ti = tileSet.GetTileInfo(tile);
var ramp = ti != null ? ti.RampType : 0;

var corners = map.Grid.CellCorners[ramp];
var corners = map.Grid.Ramps[ramp].Corners;
screen = corners.Select(c => wr.Screen3DPxPosition(centeredLocation + c + new WVec(0, 0, ZOffset))).ToArray();
SetLevel(Level);
firstTime = false;
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net461</TargetFramework>
<TargetFramework>net472</TargetFramework>
<Optimize>true</Optimize>
<LangVersion>5</LangVersion>
<LangVersion>7.3</LangVersion>
<DebugSymbols>true</DebugSymbols>
<OutputPath>../mods/ra2</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public class ArcLaserZapInfo : IProjectileInfo
public readonly string HitAnim = null;

[Desc("Sequence of impact animation to use.")]
[SequenceReference("HitAnim")]
[SequenceReference(nameof(HitAnim), allowNullImage: true)]
public readonly string HitAnimSequence = "idle";

[PaletteReference]
Expand Down
12 changes: 6 additions & 6 deletions OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public class ElectricBoltInfo : IProjectileInfo
public readonly string LaunchEffectImage = null;

[Desc("Launch effect sequence to play.")]
[SequenceReference("LaunchEffectImage")]
[SequenceReference(nameof(LaunchEffectImage), allowNullImage: true)]
public readonly string LaunchEffectSequence = null;

[Desc("Palette to use for launch effect.")]
Expand All @@ -77,7 +77,7 @@ public class ElectricBolt : IProjectile, ISync
readonly WVec upVector;
readonly MersenneTwister random;
readonly bool hasLaunchEffect;
readonly HashSet<Pair<Color, WPos[]>> zaps;
readonly HashSet<KeyValuePair<Color, WPos[]>> zaps;

[Sync]
readonly WPos target, source;
Expand Down Expand Up @@ -117,7 +117,7 @@ public ElectricBolt(ElectricBoltInfo info, ProjectileArgs args)
upVector = 1024 * upVector / upVector.Length;
}

zaps = new HashSet<Pair<Color, WPos[]>>();
zaps = new HashSet<KeyValuePair<Color, WPos[]>>();
foreach (var c in colors)
{
var numSegments = (direction.Length - 1) / info.SegmentLength.Length + 1;
Expand All @@ -130,7 +130,7 @@ public ElectricBolt(ElectricBoltInfo info, ProjectileArgs args)
for (var i = 1; i < numSegments; i++)
offsets[i] = WPos.LerpQuadratic(source, target, angle, i, numSegments);

zaps.Add(Pair.New(c, offsets));
zaps.Add(new KeyValuePair<Color, WPos[]>(c, offsets));
}
}

Expand All @@ -157,7 +157,7 @@ public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
foreach (var zap in zaps)
{
var offsets = zap.Second;
var offsets = zap.Value;
for (var i = 1; i < offsets.Length - 1; i++)
{
var angle = WAngle.FromDegrees(random.Next(360));
Expand All @@ -169,7 +169,7 @@ public IEnumerable<IRenderable> Render(WorldRenderer wr)
offsets[i] += offset;
}

yield return new ElectricBoltRenderable(offsets, info.ZOffset, info.Width, zap.First);
yield return new ElectricBoltRenderable(offsets, info.ZOffset, info.Width, zap.Key);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.RA2/Projectiles/RadBeam.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public class RadBeamInfo : IProjectileInfo
public readonly string HitAnim = null;

[Desc("Sequence of impact animation to use.")]
[SequenceReference("HitAnim")]
[SequenceReference(nameof(HitAnim), allowNullImage: true)]
public readonly string HitAnimSequence = "idle";

[PaletteReference]
Expand Down
12 changes: 5 additions & 7 deletions OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
namespace OpenRA.Mods.RA2.Traits
{
[Desc("Can be bound to a SpawnerParent.")]
public class BaseSpawnerChildInfo : ITraitInfo
public class BaseSpawnerChildInfo : TraitInfo
{
[GrantedConditionReference]
[Desc("The condition to grant to childs when the parent actor is killed.")]
Expand All @@ -29,17 +29,16 @@ public class BaseSpawnerChildInfo : ITraitInfo
[Desc("Types of damage this actor explodes with due to an unallowed child action. Leave empty for no damage types.")]
public readonly BitSet<DamageType> DamageTypes = default(BitSet<DamageType>);

public virtual object Create(ActorInitializer init) { return new BaseSpawnerChild(init, this); }
public override object Create(ActorInitializer init) { return new BaseSpawnerChild(init, this); }
}

public class BaseSpawnerChild : INotifyCreated, INotifyKilled, INotifyOwnerChanged
{
protected AttackBase[] attackBases;
protected ConditionManager conditionManager;

readonly BaseSpawnerChildInfo info;

int parentDeadToken = ConditionManager.InvalidConditionToken;
int parentDeadToken = Actor.InvalidConditionToken;
BaseSpawnerParent spawnerParent = null;

public Actor Parent { get; private set; }
Expand All @@ -59,7 +58,6 @@ void INotifyCreated.Created(Actor self)
protected virtual void Created(Actor self)
{
attackBases = self.TraitsImplementing<AttackBase>().ToArray();
conditionManager = self.Trait<ConditionManager>();
}

void INotifyKilled.Killed(Actor self, AttackInfo e)
Expand Down Expand Up @@ -123,8 +121,8 @@ public virtual void Attack(Actor self, Target target)

public virtual void OnParentKilled(Actor self, Actor attacker, SpawnerChildDisposal disposal)
{
if (conditionManager != null && !string.IsNullOrEmpty(info.ParentDeadCondition))
parentDeadToken = conditionManager.GrantCondition(self, info.ParentDeadCondition);
if (!string.IsNullOrEmpty(info.ParentDeadCondition))
parentDeadToken = self.GrantCondition(info.ParentDeadCondition);

switch (disposal)
{
Expand Down
10 changes: 5 additions & 5 deletions OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,16 +225,16 @@ public virtual void SpawnIntoWorld(Actor self, Actor child, WPos centerPosition)

void SetSpawnedFacing(Actor spawned, Actor spawner, Exit exit)
{
var facingOffset = facing == null ? 0 : facing.Facing;
var facingOffset = facing == null ? new WAngle(0) : facing.Facing;

var exitFacing = exit != null ? exit.Info.Facing : 0;
var exitFacing = (exit != null && exit.Info.Facing != null) ? exit.Info.Facing.Value : new WAngle(0);

var spawnFacing = spawned.TraitOrDefault<IFacing>();
if (spawnFacing != null)
spawnFacing.Facing = (facingOffset + exitFacing) % 256;
spawnFacing.Facing = new WAngle(facingOffset.Angle + exitFacing.Angle);

foreach (var t in spawned.TraitsImplementing<Turreted>())
t.TurretFacing = (facingOffset + exitFacing) % 256;
//foreach (var t in spawned.TraitsImplementing<Turreted>())
// facing.Facing = new WAngle(facingOffset.Angle + exitFacing.Angle);
}

public void Stopchildren()
Expand Down
69 changes: 22 additions & 47 deletions OpenRA.Mods.RA2/Traits/CarrierParent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ public class CarrierParentInfo : BaseSpawnerParentInfo
[Desc("After this many ticks, we remove the condition.")]
public readonly int LaunchingTicks = 15;

[Desc("Pip color for the spawn count.")]
public readonly PipType PipType = PipType.Green;

[Desc("Instantly repair children when they return?")]
public readonly bool InstantRepair = true;

Expand All @@ -45,7 +42,7 @@ public class CarrierParentInfo : BaseSpawnerParentInfo
public override object Create(ActorInitializer init) { return new CarrierParent(init, this); }
}

public class CarrierParent : BaseSpawnerParent, IPips, ITick, INotifyAttack, INotifyBecomingIdle
public class CarrierParent : BaseSpawnerParent, ITick, INotifyAttack, INotifyBecomingIdle
{
class CarrierChildEntry : BaseSpawnerChildEntry
{
Expand All @@ -59,11 +56,10 @@ class CarrierChildEntry : BaseSpawnerChildEntry
readonly Stack<int> loadedTokens = new Stack<int>();

CarrierChildEntry[] childEntries;
ConditionManager conditionManager;

int respawnTicks = 0;

int launchCondition = ConditionManager.InvalidConditionToken;
int launchCondition = Actor.InvalidConditionToken;
int launchConditionTicks;

public CarrierParent(ActorInitializer init, CarrierParentInfo info)
Expand All @@ -75,7 +71,6 @@ public CarrierParent(ActorInitializer init, CarrierParentInfo info)
protected override void Created(Actor self)
{
base.Created(self);
conditionManager = self.Trait<ConditionManager>();

var burst = Info.InitialActorCount == -1 ? Info.Actors.Length : Info.InitialActorCount;
for (var i = 0; i < burst; i++)
Expand All @@ -102,9 +97,9 @@ public override void InitializeChildEntry(Actor child, BaseSpawnerChildEntry ent
carrierChildEntry.SpawnerChild = child.Trait<CarrierChild>();
}

void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel) { }

void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel)
void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel)
{
if (IsTraitDisabled)
return;
Expand All @@ -125,8 +120,8 @@ void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barre

if (info.LaunchingCondition != null)
{
if (launchCondition == ConditionManager.InvalidConditionToken)
launchCondition = conditionManager.GrantCondition(self, info.LaunchingCondition);
if (launchCondition == Actor.InvalidConditionToken)
launchCondition = self.GrantCondition(info.LaunchingCondition);

launchConditionTicks = info.LaunchingTicks;
}
Expand All @@ -135,19 +130,18 @@ void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barre

Stack<int> spawnContainToken;
if (spawnContainTokens.TryGetValue(a.Info.Name, out spawnContainToken) && spawnContainToken.Any())
conditionManager.RevokeCondition(self, spawnContainToken.Pop());
self.RevokeCondition(spawnContainToken.Pop());

if (loadedTokens.Any())
conditionManager.RevokeCondition(self, loadedTokens.Pop());

self.World.AddFrameEndTask(w =>
{
// The actor might had been trying to do something before entering the carrier.
// Cancel whatever it was trying to do.
carrierChildEntry.SpawnerChild.Stop(carrierChildEntry.Actor);

carrierChildEntry.SpawnerChild.Attack(carrierChildEntry.Actor, target);
});
self.RevokeCondition(loadedTokens.Pop());

// Hack around 'in' variables not being able to be used in lambdas
var _target = target;
self.World.AddFrameEndTask(w =>
{
carrierChildEntry.SpawnerChild.Stop(carrierChildEntry.Actor);
carrierChildEntry.SpawnerChild.Attack(carrierChildEntry.Actor, _target);
});
}

void INotifyBecomingIdle.OnBecomingIdle(Actor self)
Expand Down Expand Up @@ -178,25 +172,6 @@ CarrierChildEntry GetLaunchable()
return null;
}

public IEnumerable<PipType> GetPips(Actor self)
{
if (IsTraitDisabled)
yield break;

var inside = 0;
foreach (var carrierChildEntry in childEntries)
if (carrierChildEntry.IsValid && !carrierChildEntry.IsLaunched)
inside++;

for (var i = 0; i < Info.Actors.Length; i++)
{
if (i < inside)
yield return info.PipType;
else
yield return PipType.Transparent;
}
}

public void PickupChild(Actor self, Actor child)
{
if (info.InstantRepair)
Expand All @@ -222,22 +197,22 @@ public void PickupChild(Actor self, Actor child)

childEntry.RearmTicks = Util.ApplyPercentageModifiers(info.RearmTicks, reloadModifiers.Select(rm => rm.GetReloadModifier()));

if (conditionManager != null && !string.IsNullOrEmpty(info.LoadedCondition))
loadedTokens.Push(conditionManager.GrantCondition(self, info.LoadedCondition));
if (!string.IsNullOrEmpty(info.LoadedCondition))
loadedTokens.Push(self.GrantCondition(info.LoadedCondition));
}

public override void Replenish(Actor self, BaseSpawnerChildEntry entry)
{
base.Replenish(self, entry);

if (conditionManager != null && !string.IsNullOrEmpty(info.LoadedCondition))
loadedTokens.Push(conditionManager.GrantCondition(self, info.LoadedCondition));
if (!string.IsNullOrEmpty(info.LoadedCondition))
loadedTokens.Push(self.GrantCondition(info.LoadedCondition));
}

void ITick.Tick(Actor self)
{
if (launchCondition != ConditionManager.InvalidConditionToken && --launchConditionTicks < 0)
launchCondition = conditionManager.RevokeCondition(self, launchCondition);
if (launchCondition != Actor.InvalidConditionToken && --launchConditionTicks < 0)
launchCondition = self.RevokeCondition(launchCondition);

if (respawnTicks > 0)
{
Expand Down
Loading