Skip to content

Commit

Permalink
Added a way for the client to handle entities that aren't owned by th…
Browse files Browse the repository at this point in the history
…e controlling faction and aren't sensor contacts
  • Loading branch information
behindcurtain3 committed Apr 17, 2024
1 parent fc2a344 commit 361a339
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 4 deletions.
3 changes: 3 additions & 0 deletions Pulsar4X/GameEngine/Datablobs/VisibleByDefaultDB.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Pulsar4X.Datablobs;

public class VisibleByDefaultDB : BaseDataBlob { }
47 changes: 47 additions & 0 deletions Pulsar4X/GameEngine/Engine/Entities/EntityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ internal bool HaveAllListnersProcessed()
[JsonProperty("FactionSensorContacts")]
private Dictionary<int, SystemSensorContacts> _factionSensorContacts = new ();

/// <summary>
/// List of neutral entities per faction that the given
/// faction knows about.
/// </summary>
[JsonProperty]
private Dictionary<int, List<int>> _factionNeutralContacts = new ();

/// <summary>
/// Static reference to an invalid manager.
/// </summary>
Expand Down Expand Up @@ -582,6 +589,46 @@ public SystemSensorContacts GetSensorContacts(int factionId)
return _factionSensorContacts[factionId];
}

/// <summary>
/// Return any entities the faction knows about that aren't
/// owned by the faction and aren't sensor contacts
/// </summary>
/// <param name="factionId"></param>
/// <returns></returns>
public List<int> GetNonOwnedEntititesForFaction(int factionId)
{
SetupDefaultNeutralEntitiesForFaction(factionId);

return _factionNeutralContacts[factionId];
}

public void HideNeutralEntityFromFaction(int factionId, int entityId)
{
SetupDefaultNeutralEntitiesForFaction(factionId);

_factionNeutralContacts[factionId].Remove(entityId);
}

public void ShowNeutralEntityToFaction(int factionId, int entityId)
{
SetupDefaultNeutralEntitiesForFaction(factionId);

_factionNeutralContacts[factionId].Add(entityId);
}

private void SetupDefaultNeutralEntitiesForFaction(int factionId)
{
if(!_factionNeutralContacts.ContainsKey(factionId))
{
_factionNeutralContacts[factionId] = new List<int>();
var defaultVisible = GetAllEntitiesWithDataBlob<VisibleByDefaultDB>();
foreach(var entity in defaultVisible)
{
_factionNeutralContacts[factionId].Add(entity.Id);
}
}
}

/// <summary>
/// Gets the Entity with the specified Id from any EntityManager
/// in the game. This can be much slower than looking up the
Expand Down
9 changes: 5 additions & 4 deletions Pulsar4X/GameEngine/Engine/Factories/JPSurveyFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,12 @@ private static ProtoEntity CreateSurveyPoint(double x, double y, int nameNumber)
var posDB = new PositionDB(x, y, 0, String.Empty);
var nameDB = new NameDB($"Survey Point #{nameNumber}");
//for testing purposes
var sensorProfileDB = new SensorProfileDB();
sensorProfileDB.EmittedEMSpectra.Add(new Sensors.EMWaveForm(0, 500, 1000), 1E9);
sensorProfileDB.Reflectivity = 0;
// var sensorProfileDB = new SensorProfileDB();
// sensorProfileDB.EmittedEMSpectra.Add(new Sensors.EMWaveForm(0, 500, 1000), 1E9);
// sensorProfileDB.Reflectivity = 0;
var visibleByDefaultDB = new VisibleByDefaultDB();

var protoEntity = new ProtoEntity(new List<BaseDataBlob>() { surveyDB, posDB, nameDB, sensorProfileDB });
var protoEntity = new ProtoEntity(new List<BaseDataBlob>() { surveyDB, posDB, nameDB, visibleByDefaultDB });

return protoEntity;
}
Expand Down
13 changes: 13 additions & 0 deletions Pulsar4X/Pulsar4X.Client/MapRendering/SystemState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,19 @@ public SystemState(StarSystem system, Entity faction)
if(!EntityStatesWithPosition.ContainsKey(sensorContact.ActualEntityId))
EntityStatesWithPosition.Add(sensorContact.ActualEntityId, entityState);
}

foreach(var entityId in StarSystem.GetNonOwnedEntititesForFaction(faction.Id))
{
if(StarSystem.TryGetEntityById(entityId, out var entity))
{
var entityState = new EntityState(entity) { Name = "Unknown" };
if(!EntityStatesWithNames.ContainsKey(entity.Id))
EntityStatesWithNames.Add(entity.Id, entityState);

if(!EntityStatesWithPosition.ContainsKey(entity.Id))
EntityStatesWithPosition.Add(entity.Id, entityState);
}
}
}
}

Expand Down

0 comments on commit 361a339

Please sign in to comment.