Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issue with pillar ability's cover not updating properly on units spawned next to the actor #1293

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
123 changes: 123 additions & 0 deletions X2WOTCCommunityHighlander/Src/XComGame/Classes/X2Effect_Pillar.uc
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
class X2Effect_Pillar extends X2Effect_SpawnDestructible;

function int GetStartingNumTurns(const out EffectAppliedData ApplyEffectParameters)
{
local XComGameState_Unit SourceUnit;

SourceUnit = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID));
return SourceUnit.GetTemplarFocusLevel();
}

// Start Issue #1288
/// HL-Docs: ref:Bugfixes; issue:1288
/// Update tile data for all adjacent units when the Pillar is spawned or expires to make the cover change update immediately.
simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState)
{
local Vector Position;
local TTile TileLocation;

`LOG("Pillar effect applied to:" @ XComGameState_Unit(kNewTargetState).GetFullName() @ "num target locations:" @ ApplyEffectParameters.AbilityInputContext.TargetLocations.Length,, 'IRITEST');

super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState);

if (ApplyEffectParameters.AbilityInputContext.TargetLocations.Length > 0)
{
Position = ApplyEffectParameters.AbilityInputContext.TargetLocations[0];
TileLocation = `XWORLD.GetTileCoordinatesFromPosition(Position);
UpdateWorldDataForTile(TileLocation, NewGameState);
}
}

simulated function OnEffectRemoved(const out EffectAppliedData ApplyEffectParameters, XComGameState NewGameState, bool bCleansed, XComGameState_Effect RemovedEffectState)
{
local Vector Position;
local TTile TileLocation;

super.OnEffectRemoved(ApplyEffectParameters, NewGameState, bCleansed, RemovedEffectState);

if (ApplyEffectParameters.AbilityInputContext.TargetLocations.Length > 0)
{
Position = ApplyEffectParameters.AbilityInputContext.TargetLocations[0];
TileLocation = `XWORLD.GetTileCoordinatesFromPosition(Position);
UpdateWorldDataForTile(TileLocation, NewGameState);
}
}

static private function GetTilesAdjacentToTile(TTile Tile, out array<TTile> Tiles)
{
Tiles.AddItem(Tile);

Tile.X -= 1;
Tiles.AddItem(Tile);

Tile.X += 2;
Tiles.AddItem(Tile);

Tile.X -= 1;
Tile.Y -= 1;
Tiles.AddItem(Tile);

Tile.Y += 2;
Tiles.AddItem(Tile);
}

static private function UpdateWorldDataForTile(const out TTile PillarTile, XComGameState NewGameState)
{
local XComGameStateHistory History;
local XComWorldData WorldData;
local TTile RebuildTile;
local array<TTile> AdjacentTiles;
local array<StateObjectReference> UnitRefs;
local StateObjectReference UnitRef;
local XComGameState_BaseObject UnitOnTile;

History = `XCOMHISTORY;
WorldData = `XWORLD;

WorldData.UpdateTileDataCache(NewGameState,, true);
//WorldData.FlushCachedVisibility();

`LOG("Updating data for target tile:" @ PillarTile.X @ PillarTile.Y @ PillarTile.Z,, 'IRITEST');

GetTilesAdjacentToTile(PillarTile, AdjacentTiles);

`LOG("Got adjacent tiles:" @ AdjacentTiles.Length,, 'IRITEST');

foreach AdjacentTiles(RebuildTile)
{
`LOG("Rebuilding tile:" @ RebuildTile.X @ RebuildTile.Y @ RebuildTile.Z,, 'IRITEST');

WorldData.DebugRebuildTileData(RebuildTile);
WorldData.ClearVisibilityDataAroundTile(RebuildTile);

UnitRefs = WorldData.GetUnitsOnTile(RebuildTile);

`LOG("Num units on tile:" @ UnitRefs.Length,, 'IRITEST');

foreach UnitRefs(UnitRef)
{
UnitOnTile = History.GetGameStateForObjectID(UnitRef.ObjectID);
`LOG("Unit on tile:" @ XComGameState_Unit(UnitOnTile).GetFullName(),, 'IRITEST');
if (UnitOnTile == none)
continue;

UnitOnTile = NewGameState.ModifyStateObject(UnitOnTile.Class, UnitOnTile.ObjectID);
UnitOnTile.bRequiresVisibilityUpdate = true;

`LOG("Unit requires visibility update",, 'IRITEST');
}
}

WorldData.FlushCachedVisibility();
WorldData.ForceUpdateAllFOWViewers();
`TACTICALRULES.VisibilityMgr.ActorVisibilityMgr.OnVisualizationIdle(); //Force all visualizers to update their visualization state
`PRES.m_kTacticalHUD.ForceUpdate(-1);
}
// End Issue #1288

DefaultProperties
{
EffectName = "Pillar"
DuplicateResponse = eDupe_Allow
bDestroyOnRemoval = true
}
3 changes: 3 additions & 0 deletions X2WOTCCommunityHighlander/X2WOTCCommunityHighlander.x2proj
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,9 @@
<Content Include="Src\XComGame\Classes\X2Effect_LaserSight.uc">
<SubType>Content</SubType>
</Content>
<Content Include="Src\XComGame\Classes\X2Effect_Pillar.uc">
<SubType>Content</SubType>
</Content>
<Content Include="Src\XComGame\Classes\X2EncyclopediaTemplate.uc">
<SubType>Content</SubType>
</Content>
Expand Down
Loading