Skip to content

Commit

Permalink
Lock instanceList
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMeepso committed Nov 30, 2024
1 parent 7354134 commit 806f280
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 40 deletions.
35 changes: 18 additions & 17 deletions Cove/Server/HostedServices/ActorUpdate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,31 +69,32 @@ private void DoWork(object state)

try
{

foreach (WFActor actor in server.serverOwnedInstances.ToList())
lock (server.serverActorListLock)
{
actor.onUpdate();

if (!pastTransforms.ContainsKey(actor.InstanceID))
foreach (WFActor actor in server.serverOwnedInstances.ToList())
{
pastTransforms[actor.InstanceID] = Vector3.zero;
}
actor.onUpdate();

if (actor.pos != pastTransforms[actor.InstanceID] || (updateI == idelUpdateCount))
{
if (!pastTransforms.ContainsKey(actor.InstanceID))
{
pastTransforms[actor.InstanceID] = Vector3.zero;
}

if (actor.pos != pastTransforms[actor.InstanceID] || (updateI == idelUpdateCount))
{

Dictionary<string, object> packet = new Dictionary<string, object>();
packet["type"] = "actor_update";
packet["actor_id"] = actor.InstanceID;
packet["pos"] = actor.pos;
packet["rot"] = actor.rot;
Dictionary<string, object> packet = new Dictionary<string, object>();
packet["type"] = "actor_update";
packet["actor_id"] = actor.InstanceID;
packet["pos"] = actor.pos;
packet["rot"] = actor.rot;

pastTransforms[actor.InstanceID] = actor.pos; // crude
pastTransforms[actor.InstanceID] = actor.pos; // crude

server.sendPacketToPlayers(packet);
server.sendPacketToPlayers(packet);
}
}
}

}
catch (InvalidOperationException e)
{
Expand Down
13 changes: 8 additions & 5 deletions Cove/Server/HostedServices/HostSpawn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,16 @@ private void DoWork(object state)
// remove old instances!
try
{
foreach (WFActor inst in server.serverOwnedInstances.ToList())
lock (server.serverActorListLock)
{
float instanceAge = DateTimeOffset.UtcNow.ToUnixTimeSeconds() - inst.SpawnTime.ToUnixTimeSeconds();
if (inst.despawn && instanceAge >= inst.despawnTime)
foreach (WFActor inst in server.serverOwnedInstances.ToList())
{
server.removeServerActor(inst);
//Console.WriteLine($"Removed {inst.Type}, Decayed");
float instanceAge = DateTimeOffset.UtcNow.ToUnixTimeSeconds() - inst.SpawnTime.ToUnixTimeSeconds();
if (inst.despawn && instanceAge >= inst.despawnTime)
{
server.removeServerActor(inst);
//Console.WriteLine($"Removed {inst.Type}, Decayed");
}
}
}
}
Expand Down
39 changes: 23 additions & 16 deletions Cove/Server/Server.Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ public void spawnRainCloud()
RainCloud cloud = new RainCloud(IId, pos);
cloud.despawn = true;

serverOwnedInstances.Add(cloud);
lock (serverActorListLock)
serverOwnedInstances.Add(cloud);

allActors.Add(cloud);
}

Expand Down Expand Up @@ -131,7 +133,8 @@ public WFActor spawnGenericActor(string type, Vector3 pos = null)
pos = Vector3.zero;

WFActor actor = new WFActor(IId, type, pos);
serverOwnedInstances.Add(actor);
lock (serverActorListLock)
serverOwnedInstances.Add(actor);
allActors.Add(actor);

instanceSpacePrams["actor_type"] = type;
Expand Down Expand Up @@ -159,28 +162,32 @@ public void removeServerActor(WFActor instance)

sendPacketToPlayers(removePacket); // remove

serverOwnedInstances.Remove(instance);
lock (serverActorListLock)
serverOwnedInstances.Remove(instance);
}

private void sendPlayerAllServerActors(CSteamID id)
{
foreach (WFActor actor in serverOwnedInstances)
lock (serverActorListLock)
{
Dictionary<string, object> spawnPacket = new Dictionary<string, object>();
spawnPacket["type"] = "instance_actor";
foreach (WFActor actor in serverOwnedInstances)
{
Dictionary<string, object> spawnPacket = new Dictionary<string, object>();
spawnPacket["type"] = "instance_actor";

Dictionary<string, object> instanceSpacePrams = new Dictionary<string, object>();
spawnPacket["params"] = instanceSpacePrams;
Dictionary<string, object> instanceSpacePrams = new Dictionary<string, object>();
spawnPacket["params"] = instanceSpacePrams;

instanceSpacePrams["actor_type"] = actor.Type;
instanceSpacePrams["at"] = actor.pos;
instanceSpacePrams["rot"] = new Vector3(0, 0, 0);
instanceSpacePrams["zone"] = "main_zone";
instanceSpacePrams["zone_owner"] = -1;
instanceSpacePrams["actor_id"] = actor.InstanceID;
instanceSpacePrams["creator_id"] = (long)SteamUser.GetSteamID().m_SteamID;
instanceSpacePrams["actor_type"] = actor.Type;
instanceSpacePrams["at"] = actor.pos;
instanceSpacePrams["rot"] = new Vector3(0, 0, 0);
instanceSpacePrams["zone"] = "main_zone";
instanceSpacePrams["zone_owner"] = -1;
instanceSpacePrams["actor_id"] = actor.InstanceID;
instanceSpacePrams["creator_id"] = (long)SteamUser.GetSteamID().m_SteamID;

sendPacketToPlayer(spawnPacket, id);
sendPacketToPlayer(spawnPacket, id);
}
}
}

Expand Down
5 changes: 3 additions & 2 deletions Cove/Server/Server.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public partial class CoveServer
List<Vector3> hidden_spot;

Dictionary<string, IHostedService> services = new();
public readonly object serverActorListLock = new();

public void Init()
{
Expand Down Expand Up @@ -196,7 +197,7 @@ public void Init()

if (!SteamAPI.Init())
{
Console.WriteLine("SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.");
Console.WriteLine("SteamAPI_Init() failed.");
Console.WriteLine("Is Steam running?");
return;
}
Expand Down Expand Up @@ -371,7 +372,7 @@ void runSteamworksUpdate()
{
while (true)
{
Thread.Sleep(25);
Thread.Sleep(1000/24); // 24hz
SteamAPI.RunCallbacks();
}
}
Expand Down

0 comments on commit 806f280

Please sign in to comment.