From 6d6a435b2dc1847d15c28af1be030e6648be68e8 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 20 Jan 2010 14:25:51 +1300 Subject: [PATCH] fixes bug in prev. --- OpenRa.Game/Orders/Order.cs | 25 +++++++++++++++++++++---- OpenRa.Game/Orders/OrderIO.cs | 8 ++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/OpenRa.Game/Orders/Order.cs b/OpenRa.Game/Orders/Order.cs index b6a4b013b6..d8d0b33027 100644 --- a/OpenRa.Game/Orders/Order.cs +++ b/OpenRa.Game/Orders/Order.cs @@ -86,7 +86,11 @@ namespace OpenRa if (r.ReadBoolean()) targetString = r.ReadString(); - return new Order( order, ActorFromUInt( subjectId ), ActorFromUInt( targetActorId ), targetLocation, targetString); + Actor subject, targetActor; + if( !TryGetActorFromUInt( subjectId, out subject ) || !TryGetActorFromUInt( targetActorId, out targetActor ) ) + return null; + + return new Order( order, subject, targetActor, targetLocation, targetString); } case 0xfe: @@ -109,10 +113,23 @@ namespace OpenRa return a.ActorID; } - static Actor ActorFromUInt(uint aID) + static bool TryGetActorFromUInt(uint aID, out Actor ret ) { - if (aID == 0xFFFFFFFF) return null; - return Game.world.Actors.SingleOrDefault(x => x.ActorID == aID); + if( aID == 0xFFFFFFFF ) + { + ret = null; + return true; + } + else + { + foreach( var a in Game.world.Actors.Where( x => x.ActorID == aID ) ) + { + ret = a; + return true; + } + ret = null; + return false; + } } // Named constructors for Orders. diff --git a/OpenRa.Game/Orders/OrderIO.cs b/OpenRa.Game/Orders/OrderIO.cs index 0adf49745b..cc2d52fe69 100644 --- a/OpenRa.Game/Orders/OrderIO.cs +++ b/OpenRa.Game/Orders/OrderIO.cs @@ -27,8 +27,12 @@ namespace OpenRa.Orders var ms = new MemoryStream(bytes); var reader = new BinaryReader(ms); var ret = new List(); - while (ms.Position < ms.Length) - ret.Add(Order.Deserialize(reader)); + while( ms.Position < ms.Length ) + { + var o = Order.Deserialize( reader ); + if( o != null ) + ret.Add( o ); + } return ret; } }