From 7ef98b794df456a72f208db9a3bf8d2e529e3b65 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 1 Oct 2021 18:08:16 -0400 Subject: [PATCH] Fixes a server freeze --- .../Movement/Generators/MovementGenerators.cs | 18 +++++++++++++++--- Source/Game/Movement/MotionMaster.cs | 8 ++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Source/Game/Movement/Generators/MovementGenerators.cs b/Source/Game/Movement/Generators/MovementGenerators.cs index 74cc6e72f..df239735e 100644 --- a/Source/Game/Movement/Generators/MovementGenerators.cs +++ b/Source/Game/Movement/Generators/MovementGenerators.cs @@ -16,13 +16,12 @@ */ using Framework.Constants; -using Framework.Dynamic; using Game.Entities; -using Framework.GameMath; +using System; namespace Game.Movement { - public abstract class MovementGenerator + public abstract class MovementGenerator : IEquatable { public MovementGeneratorMode Mode; public MovementGeneratorPriority Priority; @@ -64,6 +63,19 @@ namespace Game.Movement public void AddFlag(MovementGeneratorFlags flag) { Flags |= flag; } public bool HasFlag(MovementGeneratorFlags flag) { return (Flags & flag) != 0; } public void RemoveFlag(MovementGeneratorFlags flag) { Flags &= ~flag; } + + public bool Equals(MovementGenerator other) + { + if (Mode == other.Mode && Priority == other.Priority) + return true; + + return false; + } + + public int GetHashCode(MovementGenerator obj) + { + return obj.Mode.GetHashCode() ^ obj.Priority.GetHashCode(); + } } public abstract class MovementGeneratorMedium : MovementGenerator where T : Unit diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index 0e4e30894..c9b1e7951 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -30,12 +30,15 @@ namespace Game.Movement { public int Compare(MovementGenerator a, MovementGenerator b) { + if (a.Equals(b)) + return 0; + if (a.Mode > b.Mode) return 1; else if (a.Mode == b.Mode) - return a.Priority > b.Priority ? 1 : -1; + return a.Priority.CompareTo(b.Priority); - return 0; + return -1; } } @@ -77,6 +80,7 @@ namespace Game.Movement Unit _owner { get; } MovementGenerator _defaultGenerator { get; set; } SortedSet _generators { get; } = new(new MovementGeneratorComparator()); + MultiMap _baseUnitStatesMap { get; } = new(); Queue _delayedActions { get; } = new(); MotionMasterFlags _flags { get; set; }