diff --git a/OpenRA.Server/Server.cs b/OpenRA.Server/Server.cs index ba9143262f..45983d2f0a 100644 --- a/OpenRA.Server/Server.cs +++ b/OpenRA.Server/Server.cs @@ -350,12 +350,12 @@ namespace OpenRA.Server static void SendChatTo(Connection conn, string text) { DispatchOrdersToClient(conn, 0, 0, - new ServerOrder(conn.PlayerIndex, "Chat", text).Serialize()); + new ServerOrder(-1, "Chat", text).Serialize()); } static void SendChat(Connection asConn, string text) { - DispatchOrders(null, 0, new ServerOrder(asConn.PlayerIndex, "Chat", text).Serialize()); + DispatchOrders(null, 0, new ServerOrder(-1, "Chat", text).Serialize()); } static void InterpretServerOrder(Connection conn, ServerOrder so) diff --git a/OpenRa.Game/Chat.cs b/OpenRa.Game/Chat.cs index c9767918fc..2074073558 100644 --- a/OpenRa.Game/Chat.cs +++ b/OpenRa.Game/Chat.cs @@ -15,7 +15,7 @@ namespace OpenRa public void Toggle() { if (isChatting && typing.Length > 0) - Game.orderManager.IssueOrder(Order.Chat(Game.world.LocalPlayer, typing)); + Game.orderManager.IssueOrder(Order.Chat(typing)); typing = ""; isChatting ^= true; diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 7545488411..2da6386970 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -257,7 +257,7 @@ namespace OpenRa _ => { Game.orderManager.IssueOrder( - Order.Chat(Game.world.LocalPlayer, "/map " + currentMap)); + Order.Chat("/map " + currentMap)); showMapChooser = false; }); diff --git a/OpenRa.Game/Network/Order.cs b/OpenRa.Game/Network/Order.cs index 9576366d95..9a29e14327 100755 --- a/OpenRa.Game/Network/Order.cs +++ b/OpenRa.Game/Network/Order.cs @@ -47,7 +47,7 @@ namespace OpenRa var ret = new MemoryStream(); var w = new BinaryWriter(ret); w.Write((byte)0xfe); - w.Write((uint)Player.Index); + w.Write(Subject == null ? uint.MaxValue : (uint)Player.Index); w.Write(OrderString); w.Write(TargetString); return ret.ToArray(); @@ -113,7 +113,9 @@ namespace OpenRa var name = r.ReadString(); var data = r.ReadString(); - return new Order( name, LookupPlayer( world, playerID ).PlayerActor, data ) { IsImmediate = true }; + var player = (playerID == uint.MaxValue) ? null : LookupPlayer( world, playerID ).PlayerActor; + + return new Order( name, player, data ) { IsImmediate = true }; } default: @@ -148,9 +150,9 @@ namespace OpenRa // Named constructors for Orders. // Now that Orders are resolved by individual Actors, these are weird; you unpack orders manually, but not pack them. - public static Order Chat(Player subject, string text) + public static Order Chat(string text) { - return new Order("Chat", subject.PlayerActor, text) { IsImmediate = true }; + return new Order("Chat", null, text) { IsImmediate = true }; } public static Order StartProduction(Player subject, string item) diff --git a/OpenRa.Game/Network/OrderManager.cs b/OpenRa.Game/Network/OrderManager.cs index ecc2cfbc23..1e0ec62224 100755 --- a/OpenRa.Game/Network/OrderManager.cs +++ b/OpenRa.Game/Network/OrderManager.cs @@ -79,7 +79,7 @@ namespace OpenRa.Network foreach( var p in immediatePackets ) foreach( var o in p.Second.ToOrderList( world ) ) - UnitOrders.ProcessOrder( p.First, o ); + UnitOrders.ProcessOrder( world, p.First, o ); } Dictionary syncForFrame = new Dictionary(); @@ -126,7 +126,7 @@ namespace OpenRa.Network foreach( var order in frameData.OrderBy( p => p.Key ).SelectMany( o => o.Value.ToOrderList( world ).Select( a => new { Client = o.Key, Order = a } ) ) ) { - UnitOrders.ProcessOrder( order.Client, order.Order ); + UnitOrders.ProcessOrder( world, order.Client, order.Order ); sync.Add( world.SyncHash() ); } diff --git a/OpenRa.Game/Network/UnitOrders.cs b/OpenRa.Game/Network/UnitOrders.cs index 489e33b589..d951986b81 100755 --- a/OpenRa.Game/Network/UnitOrders.cs +++ b/OpenRa.Game/Network/UnitOrders.cs @@ -1,4 +1,5 @@ using System.Drawing; +using System.Linq; using OpenRa.FileFormats; using OpenRa.GameRules; using OpenRa.Graphics; @@ -8,13 +9,14 @@ namespace OpenRa.Network { static class UnitOrders { - public static void ProcessOrder( int clientId, Order order ) + public static void ProcessOrder( World world, int clientId, Order order ) { switch( order.OrderString ) { case "Chat": { - Game.chat.AddLine(order.Player, order.TargetString); + var player = world.players.Values.Where( p => p.Index == clientId ).Single(); + Game.chat.AddLine(player, order.TargetString); break; } case "StartGame": diff --git a/OpenRa.Game/PackageDownloader.cs b/OpenRa.Game/PackageDownloader.cs index 5ea68abfa8..e408df4bfc 100644 --- a/OpenRa.Game/PackageDownloader.cs +++ b/OpenRa.Game/PackageDownloader.cs @@ -68,7 +68,7 @@ namespace OpenRa Game.chat.AddLine(Color.White, "Debug", "Requesting package: {0}".F(currentPackage)); Game.orderManager.IssueOrder( - new Order("RequestFile", Game.world.LocalPlayer.PlayerActor, currentPackage) { IsImmediate = true }); + new Order("RequestFile", null, currentPackage) { IsImmediate = true }); Fraction = 0f; } diff --git a/OpenRa.Game/Traits/NukePower.cs b/OpenRa.Game/Traits/NukePower.cs index 226e6b855d..93cd9bc739 100644 --- a/OpenRa.Game/Traits/NukePower.cs +++ b/OpenRa.Game/Traits/NukePower.cs @@ -62,7 +62,7 @@ namespace OpenRa.Traits { if (mi.Button == MouseButton.Left) { - yield return new Order("NuclearMissile", Game.world.LocalPlayer.PlayerActor, xy); + yield return new Order("NuclearMissile", world.LocalPlayer.PlayerActor, xy); } yield break; diff --git a/OpenRa.Game/Traits/SpyPlanePower.cs b/OpenRa.Game/Traits/SpyPlanePower.cs index d13ed824fd..9316f784f2 100644 --- a/OpenRa.Game/Traits/SpyPlanePower.cs +++ b/OpenRa.Game/Traits/SpyPlanePower.cs @@ -68,7 +68,7 @@ namespace OpenRa.Traits yield break; } - yield return new Order("SpyPlane", Game.world.LocalPlayer.PlayerActor, xy); + yield return new Order("SpyPlane", world.LocalPlayer.PlayerActor, xy); } public void Tick(World world) {}