diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 516a006348..51436e01ff 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -28,8 +28,9 @@ namespace OpenRA internal struct SyncHash { public readonly ISync Trait; - public readonly int Hash; - public SyncHash(ISync trait, int hash) { Trait = trait; Hash = hash; } + readonly Func hashFunction; + public SyncHash(ISync trait) { Trait = trait; hashFunction = Sync.GetHashFunction(trait); } + public int Hash() { return hashFunction(Trait); } } public readonly ActorInfo Info; @@ -70,7 +71,7 @@ namespace OpenRA } } - internal IEnumerable SyncHashes { get; private set; } + internal SyncHash[] SyncHashes { get; private set; } readonly IFacing facing; readonly IHealth health; @@ -129,11 +130,7 @@ namespace OpenRA defaultVisibility = Trait(); Targetables = TraitsImplementing().ToArray(); - SyncHashes = - TraitsImplementing() - .Select(sync => Pair.New(sync, Sync.GetHashFunction(sync))) - .ToArray() - .Select(pair => new SyncHash(pair.First, pair.Second(pair.First))); + SyncHashes = TraitsImplementing().Select(sync => new SyncHash(sync)).ToArray(); } Rectangle DetermineRenderBounds() diff --git a/OpenRA.Game/Network/SyncReport.cs b/OpenRA.Game/Network/SyncReport.cs index 21a108b567..cc93f4db48 100644 --- a/OpenRA.Game/Network/SyncReport.cs +++ b/OpenRA.Game/Network/SyncReport.cs @@ -68,28 +68,37 @@ namespace OpenRA.Network report.Effects.Clear(); foreach (var actor in orderManager.World.ActorsHavingTrait()) + { foreach (var syncHash in actor.SyncHashes) - if (syncHash.Hash != 0) + { + var hash = syncHash.Hash(); + if (hash != 0) + { report.Traits.Add(new TraitReport() { ActorID = actor.ActorID, Type = actor.Info.Name, Owner = (actor.Owner == null) ? "null" : actor.Owner.PlayerName, Trait = syncHash.Trait.GetType().Name, - Hash = syncHash.Hash, + Hash = hash, NamesValues = DumpSyncTrait(syncHash.Trait) }); + } + } + } foreach (var sync in orderManager.World.SyncedEffects) { var hash = Sync.Hash(sync); if (hash != 0) + { report.Effects.Add(new EffectReport() { Name = sync.GetType().Name, Hash = hash, NamesValues = DumpSyncTrait(sync) }); + } } } diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 570a110b1f..0c9013f5f6 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -404,7 +404,7 @@ namespace OpenRA // Hash fields marked with the ISync interface. foreach (var actor in ActorsHavingTrait()) foreach (var syncHash in actor.SyncHashes) - ret += n++ * (int)(1 + actor.ActorID) * syncHash.Hash; + ret += n++ * (int)(1 + actor.ActorID) * syncHash.Hash(); // Hash game state relevant effects such as projectiles. foreach (var sync in SyncedEffects)