fixes sync bug.
This commit is contained in:
@@ -90,7 +90,7 @@ namespace OpenRA.Server
|
||||
State = Session.ClientState.NotReady
|
||||
});
|
||||
|
||||
DispatchOrdersToClient(newConn, 0,
|
||||
DispatchOrdersToClient(newConn, 0, 0,
|
||||
new ServerOrder(newConn.PlayerIndex, "AssignPlayer", "").Serialize());
|
||||
|
||||
Console.WriteLine("Accepted connection from {0}.",
|
||||
@@ -192,7 +192,7 @@ namespace OpenRA.Server
|
||||
Data = Convert.ToBase64String(data)
|
||||
};
|
||||
|
||||
DispatchOrdersToClient(c, 0,
|
||||
DispatchOrdersToClient(c, 0, 0,
|
||||
new ServerOrder(0, "FileChunk",
|
||||
FieldSaver.Save(chunk).Nodes.WriteToString()).Serialize());
|
||||
}
|
||||
@@ -210,12 +210,13 @@ namespace OpenRA.Server
|
||||
catch (Exception e) { DropClient(c, e); }
|
||||
}
|
||||
|
||||
static void DispatchOrdersToClient(Connection c, int frame, byte[] data)
|
||||
static void DispatchOrdersToClient(Connection c, int client, int frame, byte[] data)
|
||||
{
|
||||
try
|
||||
{
|
||||
c.socket.Blocking = true;
|
||||
c.socket.Send(BitConverter.GetBytes(data.Length + 4));
|
||||
c.socket.Send(BitConverter.GetBytes(data.Length + 8));
|
||||
c.socket.Send(BitConverter.GetBytes(client));
|
||||
c.socket.Send(BitConverter.GetBytes(frame));
|
||||
c.socket.Send(data);
|
||||
c.socket.Blocking = false;
|
||||
@@ -228,8 +229,11 @@ namespace OpenRA.Server
|
||||
if (frame == 0 && conn != null)
|
||||
InterpretServerOrders(conn, data);
|
||||
else
|
||||
{
|
||||
var from = conn != null ? conn.PlayerIndex : 0;
|
||||
foreach (var c in conns.Except(conn).ToArray())
|
||||
DispatchOrdersToClient(c, frame, data);
|
||||
DispatchOrdersToClient(c, from, frame, data);
|
||||
}
|
||||
}
|
||||
|
||||
static void InterpretServerOrders(Connection conn, byte[] data)
|
||||
@@ -278,7 +282,7 @@ namespace OpenRA.Server
|
||||
{
|
||||
if (GameStarted)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't change your race after the game has started" ).Serialize() );
|
||||
return true;
|
||||
@@ -300,7 +304,7 @@ namespace OpenRA.Server
|
||||
{
|
||||
if (GameStarted)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't change your color after the game has started" ).Serialize() );
|
||||
return true;
|
||||
@@ -315,7 +319,7 @@ namespace OpenRA.Server
|
||||
|
||||
if (lobbyInfo.Clients.Where( c => c != GetClient(conn) ).Any( c => c.Palette == pal ))
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't be the same color as another player" ).Serialize() );
|
||||
return true;
|
||||
@@ -330,7 +334,7 @@ namespace OpenRA.Server
|
||||
{
|
||||
if (conn.PlayerIndex != 0)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"Only the host can change the map" ).Serialize() );
|
||||
return true;
|
||||
@@ -338,7 +342,7 @@ namespace OpenRA.Server
|
||||
|
||||
if (GameStarted)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't change the map after the game has started" ).Serialize() );
|
||||
return true;
|
||||
@@ -353,7 +357,7 @@ namespace OpenRA.Server
|
||||
{
|
||||
if (GameStarted)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't change packages after the game has started" ).Serialize() );
|
||||
}
|
||||
@@ -370,7 +374,7 @@ namespace OpenRA.Server
|
||||
catch
|
||||
{
|
||||
Console.WriteLine("That went horribly wrong.");
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"Adding the package failed." ).Serialize() );
|
||||
return true;
|
||||
@@ -381,7 +385,7 @@ namespace OpenRA.Server
|
||||
{
|
||||
if (GameStarted)
|
||||
{
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"You can't change mods after the game has started" ).Serialize() );
|
||||
}
|
||||
@@ -392,7 +396,7 @@ namespace OpenRA.Server
|
||||
lobbyInfo.GlobalSettings.Mods =
|
||||
lobbyInfo.GlobalSettings.Mods.Concat( new[] { s } ).ToArray();
|
||||
SyncLobbyInfo();
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"Added mod: " + s ).Serialize() );
|
||||
return true;
|
||||
@@ -400,7 +404,7 @@ namespace OpenRA.Server
|
||||
catch
|
||||
{
|
||||
Console.WriteLine("That went horribly wrong.");
|
||||
DispatchOrdersToClient(conn, 0,
|
||||
DispatchOrdersToClient(conn, 0, 0,
|
||||
new ServerOrder( conn.PlayerIndex, "Chat",
|
||||
"Adding the mod failed." ).Serialize() );
|
||||
return true;
|
||||
@@ -459,12 +463,12 @@ namespace OpenRA.Server
|
||||
if (!InterpretCommand(conn, so.Data.Substring(1)))
|
||||
{
|
||||
Console.WriteLine("Bad server command: {0}", so.Data.Substring(1));
|
||||
DispatchOrdersToClient(conn, 0, new ServerOrder(conn.PlayerIndex, "Chat", "Bad server command.").Serialize());
|
||||
DispatchOrdersToClient(conn, 0, 0, new ServerOrder(conn.PlayerIndex, "Chat", "Bad server command.").Serialize());
|
||||
}
|
||||
}
|
||||
else
|
||||
foreach (var c in conns.Except(conn).ToArray())
|
||||
DispatchOrdersToClient(c, 0, so.Serialize());
|
||||
DispatchOrdersToClient(c, 0, 0, so.Serialize());
|
||||
break;
|
||||
|
||||
case "RequestFile":
|
||||
|
||||
@@ -44,6 +44,8 @@ namespace OpenRa.Network
|
||||
|
||||
public virtual void Send( byte[] packet )
|
||||
{
|
||||
if( packet.Length == 0 )
|
||||
throw new NotImplementedException();
|
||||
lock( this )
|
||||
receivedPackets.Add( new ReceivedPacket { FromClient = LocalClientId, Data = packet } );
|
||||
}
|
||||
@@ -82,9 +84,12 @@ namespace OpenRa.Network
|
||||
for( ; ; )
|
||||
{
|
||||
var len = reader.ReadInt32();
|
||||
var client = reader.ReadInt32();
|
||||
var buf = reader.ReadBytes( len );
|
||||
if( len == 0 )
|
||||
throw new NotImplementedException();
|
||||
lock( this )
|
||||
receivedPackets.Add( new ReceivedPacket { FromClient = -1, Data = buf } );
|
||||
receivedPackets.Add( new ReceivedPacket { FromClient = client, Data = buf } );
|
||||
}
|
||||
}
|
||||
catch
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace OpenRa.Network
|
||||
{
|
||||
@@ -129,8 +130,8 @@ namespace OpenRa.Network
|
||||
}
|
||||
|
||||
var ss = sync.SerializeSync( FrameNumber );
|
||||
CheckSync( ss );
|
||||
Connection.Send( ss );
|
||||
CheckSync( ss );
|
||||
|
||||
++frameNumber;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user