Cleanup
This commit is contained in:
parent
18144fecb5
commit
c577252f44
2 changed files with 223 additions and 202 deletions
src/network
|
@ -63,14 +63,14 @@
|
|||
// Variables
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
global char *NetworkArg; /// Network command line argument
|
||||
global char* NetworkArg; /// Network command line argument
|
||||
global int NetPlayers; /// How many network players
|
||||
global int NetworkPort = NetworkDefaultPort; /// Local network port to use
|
||||
|
||||
IfDebug(
|
||||
#ifdef DEBUG
|
||||
extern unsigned long MyHost; /// My host number.
|
||||
extern int MyPort; /// My port number.
|
||||
);
|
||||
#endif
|
||||
|
||||
global int HostsCount; /// Number of hosts.
|
||||
global NetworkHost Hosts[PlayerMax]; /// Host and ports of all players.
|
||||
|
@ -111,7 +111,7 @@ local int NetworkServerPort = NetworkDefaultPort; /// Server network port to use
|
|||
** @todo FIXME: we don't need to put the header into all messages.
|
||||
** (header = msg->Stratagus ... )
|
||||
*/
|
||||
local int NetworkSendICMessage(unsigned long host, int port, InitMessage *msg)
|
||||
local int NetworkSendICMessage(unsigned long host, int port, InitMessage* msg)
|
||||
{
|
||||
msg->Stratagus = htonl(StratagusVersion);
|
||||
msg->Version = htonl(NetworkProtocolVersion);
|
||||
|
@ -122,7 +122,7 @@ local int NetworkSendICMessage(unsigned long host, int port, InitMessage *msg)
|
|||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
local const char *ncconstatenames[] = {
|
||||
local const char* ncconstatenames[] = {
|
||||
"ccs_unused",
|
||||
"ccs_connecting", // new client
|
||||
"ccs_connected", // has received slot info
|
||||
|
@ -143,7 +143,7 @@ local const char *ncconstatenames[] = {
|
|||
"ccs_incompatiblenetwork", // incompatible network version
|
||||
};
|
||||
|
||||
local const char *icmsgsubtypenames[] = {
|
||||
local const char* icmsgsubtypenames[] = {
|
||||
"Hello", // Client Request
|
||||
"Config", // Setup message configure clients
|
||||
|
||||
|
@ -177,7 +177,7 @@ local const char *icmsgsubtypenames[] = {
|
|||
** @param msg The message to send
|
||||
** @param msecs microseconds to delay
|
||||
*/
|
||||
local void NetworkSendRateLimitedClientMessage(InitMessage * msg, unsigned long msecs)
|
||||
local void NetworkSendRateLimitedClientMessage(InitMessage* msg, unsigned long msecs)
|
||||
{
|
||||
unsigned long now;
|
||||
int n;
|
||||
|
@ -186,7 +186,7 @@ local void NetworkSendRateLimitedClientMessage(InitMessage * msg, unsigned long
|
|||
if (now - NetLastPacketSent >= msecs) {
|
||||
NetLastPacketSent = now;
|
||||
if (msg->SubType == LastStateMsgType) {
|
||||
NetStateMsgCnt++;
|
||||
++NetStateMsgCnt;
|
||||
} else {
|
||||
NetStateMsgCnt = 0;
|
||||
LastStateMsgType = msg->SubType;
|
||||
|
@ -210,7 +210,7 @@ local void NetworkSendRateLimitedClientMessage(InitMessage * msg, unsigned long
|
|||
**
|
||||
** @return True, if error; otherwise false.
|
||||
*/
|
||||
global int NetworkSetupServerAddress(const char *serveraddr)
|
||||
global int NetworkSetupServerAddress(const char* serveraddr)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
|
@ -221,7 +221,7 @@ global int NetworkSetupServerAddress(const char *serveraddr)
|
|||
NetworkServerIP = addr;
|
||||
|
||||
DebugLevel1Fn("SELECTED SERVER: %s (%d.%d.%d.%d)\n" _C_ serveraddr _C_
|
||||
NIPQUAD(ntohl(addr)));
|
||||
NIPQUAD(ntohl(addr)));
|
||||
|
||||
sprintf(NetServerText, "%d.%d.%d.%d", NIPQUAD(ntohl(addr)));
|
||||
return 0;
|
||||
|
@ -294,19 +294,21 @@ global void NetworkInitServerConnect(void)
|
|||
*/
|
||||
global void NetworkExitServerConnect(void)
|
||||
{
|
||||
int h, i, n;
|
||||
int h;
|
||||
int i;
|
||||
int n;
|
||||
InitMessage message;
|
||||
|
||||
message.Type = MessageInitReply;
|
||||
message.SubType = ICMServerQuit;
|
||||
for (h = 1; h < PlayerMax-1; ++h) {
|
||||
for (h = 1; h < PlayerMax - 1; ++h) {
|
||||
// Spew out 5 and trust in God that they arrive
|
||||
// Clients will time out otherwise anyway
|
||||
if (Hosts[h].PlyNr) {
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 5; ++i) {
|
||||
n = NetworkSendICMessage(Hosts[h].Host, Hosts[h].Port, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message ServerQuit: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(Hosts[h].Host)) _C_ ntohs(Hosts[h].Port));
|
||||
n _C_ NIPQUAD(ntohl(Hosts[h].Host)) _C_ ntohs(Hosts[h].Port));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -324,7 +326,7 @@ global void NetworkServerResyncClients(void)
|
|||
int i;
|
||||
|
||||
if (NetConnectRunning) {
|
||||
for (i = 1; i < PlayerMax-1; ++i) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
if (Hosts[i].PlyNr && NetStates[i].State == ccs_synced) {
|
||||
NetStates[i].State = ccs_async;
|
||||
}
|
||||
|
@ -337,11 +339,17 @@ global void NetworkServerResyncClients(void)
|
|||
*/
|
||||
global void NetworkServerStartGame(void)
|
||||
{
|
||||
int h, i, j, n;
|
||||
int num[PlayerMax], org[PlayerMax], rev[PlayerMax];
|
||||
int h;
|
||||
int i;
|
||||
int j;
|
||||
int n;
|
||||
int num[PlayerMax];
|
||||
int org[PlayerMax];
|
||||
int rev[PlayerMax];
|
||||
char buf[1024];
|
||||
InitMessage *msg;
|
||||
InitMessage message, statemsg;
|
||||
InitMessage* msg;
|
||||
InitMessage message;
|
||||
InitMessage statemsg;
|
||||
|
||||
DebugCheck(ServerSetupState.CompOpt[0] != 0);
|
||||
|
||||
|
@ -349,25 +357,27 @@ global void NetworkServerStartGame(void)
|
|||
LocalSetupState = ServerSetupState;
|
||||
|
||||
// Make a list of the available player slots.
|
||||
for (h = i = 0; i < PlayerMax; i++) {
|
||||
for (h = i = 0; i < PlayerMax; ++i) {
|
||||
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
|
||||
rev[i] = h;
|
||||
num[h++] = i;
|
||||
DebugLevel0Fn("Slot %d is available for an interactive player (%d)\n" _C_ i _C_ rev[i]);
|
||||
DebugLevel0Fn("Slot %d is available for an interactive player (%d)\n" _C_
|
||||
i _C_ rev[i]);
|
||||
}
|
||||
}
|
||||
// Make a list of the available computer slots.
|
||||
n = h;
|
||||
for (i = 0; i < PlayerMax; i++) {
|
||||
for (i = 0; i < PlayerMax; ++i) {
|
||||
if (MenuMapInfo->PlayerType[i] == PlayerComputer) {
|
||||
rev[i] = n++;
|
||||
DebugLevel0Fn("Slot %d is available for an ai computer player (%d)\n" _C_ i _C_ rev[i]);
|
||||
DebugLevel0Fn("Slot %d is available for an ai computer player (%d)\n" _C_
|
||||
i _C_ rev[i]);
|
||||
}
|
||||
}
|
||||
// Make a list of the remaining slots.
|
||||
for (i = 0; i < PlayerMax; i++) {
|
||||
for (i = 0; i < PlayerMax; ++i) {
|
||||
if (MenuMapInfo->PlayerType[i] != PlayerPerson &&
|
||||
MenuMapInfo->PlayerType[i] != PlayerComputer) {
|
||||
MenuMapInfo->PlayerType[i] != PlayerComputer) {
|
||||
rev[i] = n++;
|
||||
// PlayerNobody - not available to anything..
|
||||
}
|
||||
|
@ -375,20 +385,20 @@ global void NetworkServerStartGame(void)
|
|||
|
||||
#if 0
|
||||
printf("INITIAL ServerSetupState:\n");
|
||||
for (i = 0; i < PlayerMax-1; i++) {
|
||||
for (i = 0; i < PlayerMax - 1; ++i) {
|
||||
printf("%02d: CO: %d Race: %d Host: ", i, ServerSetupState.CompOpt[i], ServerSetupState.Race[i]);
|
||||
if (ServerSetupState.CompOpt[i] == 0) {
|
||||
printf(" %d.%d.%d.%d:%d %s", NIPQUAD(ntohl(Hosts[i].Host)),
|
||||
ntohs(Hosts[i].Port), Hosts[i].PlyName);
|
||||
ntohs(Hosts[i].Port), Hosts[i].PlyName);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Reverse to assign slots to menu setup state positions.
|
||||
for (i = 0; i < PlayerMax; i++) {
|
||||
for (i = 0; i < PlayerMax; ++i) {
|
||||
org[i] = -1;
|
||||
for (j = 0; j < PlayerMax; j++) {
|
||||
for (j = 0; j < PlayerMax; ++j) {
|
||||
if (rev[j] == i) {
|
||||
org[i] = j;
|
||||
break;
|
||||
|
@ -397,9 +407,9 @@ global void NetworkServerStartGame(void)
|
|||
}
|
||||
|
||||
// Compact host list.. (account for computer/closed slots in the middle..)
|
||||
for (i = 1; i < h; i++) {
|
||||
for (i = 1; i < h; ++i) {
|
||||
if (Hosts[i].PlyNr == 0) {
|
||||
for (j = i + 1; j < PlayerMax - 1; j++) {
|
||||
for (j = i + 1; j < PlayerMax - 1; ++j) {
|
||||
if (Hosts[j].PlyNr) {
|
||||
DebugLevel0Fn("Compact: Hosts %d -> Hosts %d\n" _C_ j _C_ i);
|
||||
Hosts[i] = Hosts[j];
|
||||
|
@ -426,15 +436,19 @@ global void NetworkServerStartGame(void)
|
|||
// Randomize the position.
|
||||
// ARI: FIXME: should be possible to disable! Top vs Bottom et al.
|
||||
j = h;
|
||||
for (i = 0; i < NetPlayers; i++) {
|
||||
for (i = 0; i < NetPlayers; ++i) {
|
||||
if (j > 0) {
|
||||
int k, o, chosen = MyRand() % j;
|
||||
int k;
|
||||
int o;
|
||||
int chosen;
|
||||
|
||||
chosen = MyRand() % j;
|
||||
|
||||
n = num[chosen];
|
||||
Hosts[i].PlyNr = n;
|
||||
k = org[i];
|
||||
if (k != n) {
|
||||
for (o = 0; o < PlayerMax; o++) {
|
||||
for (o = 0; o < PlayerMax; ++o) {
|
||||
if (org[o] == n) {
|
||||
org[o] = k;
|
||||
break;
|
||||
|
@ -442,7 +456,8 @@ global void NetworkServerStartGame(void)
|
|||
}
|
||||
org[i] = n;
|
||||
}
|
||||
DebugLevel0Fn("Assigning player %d to slot %d (%d)\n" _C_ i _C_ n _C_ org[i]);
|
||||
DebugLevel0Fn("Assigning player %d to slot %d (%d)\n" _C_
|
||||
i _C_ n _C_ org[i]);
|
||||
|
||||
num[chosen] = num[--j];
|
||||
} else {
|
||||
|
@ -457,7 +472,7 @@ global void NetworkServerStartGame(void)
|
|||
}
|
||||
|
||||
// Complete all setup states for the assigned slots.
|
||||
for (i = 0; i < PlayerMax; i++) {
|
||||
for (i = 0; i < PlayerMax; ++i) {
|
||||
num[i] = 1;
|
||||
n = org[i];
|
||||
ServerSetupState.CompOpt[n] = LocalSetupState.CompOpt[i];
|
||||
|
@ -501,7 +516,7 @@ global void NetworkServerStartGame(void)
|
|||
statemsg.u.State = ServerSetupState;
|
||||
statemsg.MapUID = htonl(MenuMapInfo->MapUID);
|
||||
|
||||
msg = (InitMessage *)buf;
|
||||
msg = (InitMessage*)buf;
|
||||
DebugLevel1Fn("Ready, sending InitConfig to %d host(s)\n" _C_ HostsCount);
|
||||
//
|
||||
// Send all clients host:ports to all clients.
|
||||
|
@ -520,7 +535,7 @@ breakout:
|
|||
message.u.Hosts[i].Host = message.u.Hosts[i].Port = 0;
|
||||
n = NetworkSendICMessage(host, port, &message);
|
||||
DebugLevel0Fn("Sending InitConfig Message Config (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
message.u.Hosts[i].Host = host;
|
||||
message.u.Hosts[i].Port = port;
|
||||
} else if (num[Hosts[i].PlyNr] == 2) {
|
||||
|
@ -528,7 +543,7 @@ breakout:
|
|||
port = message.u.Hosts[i].Port;
|
||||
n = NetworkSendICMessage(host, port, &statemsg);
|
||||
DebugLevel0Fn("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -536,7 +551,7 @@ breakout:
|
|||
while (j && NetSocketReady(NetworkFildes, 1000)) {
|
||||
if ((n = NetRecvUDP(NetworkFildes, &buf, sizeof(buf))) < 0) {
|
||||
DebugLevel0Fn("*Receive ack failed: (%d) from %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -545,7 +560,7 @@ breakout:
|
|||
|
||||
case ICMConfig:
|
||||
DebugLevel0Fn("Got ack for InitConfig: (%d) from %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
|
||||
for (i = 0; i < HostsCount; ++i) {
|
||||
if (NetLastHost == Hosts[i].Host && NetLastPort == Hosts[i].Port) {
|
||||
|
@ -559,13 +574,13 @@ breakout:
|
|||
|
||||
case ICMGo:
|
||||
DebugLevel0Fn("Got ack for InitState: (%d) from %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
|
||||
for (i = 0; i < HostsCount; ++i) {
|
||||
if (NetLastHost == Hosts[i].Host && NetLastPort == Hosts[i].Port) {
|
||||
if (num[Hosts[i].PlyNr] == 2) {
|
||||
num[Hosts[i].PlyNr] = 0;
|
||||
j--;
|
||||
--j;
|
||||
DebugLevel0Fn("Removing host %d from waiting list\n" _C_ j);
|
||||
}
|
||||
break;
|
||||
|
@ -595,7 +610,7 @@ breakout:
|
|||
port = message.u.Hosts[i].Port;
|
||||
n = NetworkSendICMessage(host, port, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message Go: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
n _C_ NIPQUAD(ntohl(host)) _C_ ntohs(port));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -627,7 +642,7 @@ changed:
|
|||
message.Type = MessageInitHello;
|
||||
message.SubType = ICMSeeYou;
|
||||
// Spew out 5 and trust in God that they arrive
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 5; ++i) {
|
||||
NetworkSendICMessage(NetworkServerIP, htons(NetworkServerPort), &message);
|
||||
}
|
||||
NetLocalState = ccs_usercanceled;
|
||||
|
@ -776,7 +791,7 @@ local void KickDeadClient(int c)
|
|||
ServerSetupState.LastFrame[c] = 0L;
|
||||
|
||||
// Resync other clients
|
||||
for (n = 1; n < PlayerMax-1; n++) {
|
||||
for (n = 1; n < PlayerMax - 1; ++n) {
|
||||
if (n != c && Hosts[n].PlyNr) {
|
||||
NetStates[n].State = ccs_async;
|
||||
}
|
||||
|
@ -789,7 +804,8 @@ local void KickDeadClient(int c)
|
|||
*/
|
||||
global void NetworkProcessServerRequest(void)
|
||||
{
|
||||
int i, n;
|
||||
int i;
|
||||
int n;
|
||||
unsigned long fcd;
|
||||
InitMessage message;
|
||||
|
||||
|
@ -798,7 +814,7 @@ global void NetworkProcessServerRequest(void)
|
|||
// Game already started...
|
||||
}
|
||||
|
||||
for (i = 1; i < PlayerMax-1; ++i) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
if (Hosts[i].PlyNr && Hosts[i].Host && Hosts[i].Port) {
|
||||
fcd = FrameCounter - ServerSetupState.LastFrame[i];
|
||||
if (fcd >= CLIENT_LIVE_BEAT) {
|
||||
|
@ -810,27 +826,27 @@ global void NetworkProcessServerRequest(void)
|
|||
message.MapUID = 0L;
|
||||
n = NetworkSendICMessage(Hosts[i].Host, Hosts[i].Port, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message AreYouThere: (%d) to %d.%d.%d.%d:%d (%ld:%ld)\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(Hosts[i].Host)) _C_ ntohs(Hosts[i].Port) _C_
|
||||
FrameCounter _C_ ServerSetupState.LastFrame[i]);
|
||||
n _C_ NIPQUAD(ntohl(Hosts[i].Host)) _C_ ntohs(Hosts[i].Port) _C_
|
||||
FrameCounter _C_ ServerSetupState.LastFrame[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IfDebug(
|
||||
#ifdef DEBUG
|
||||
/**
|
||||
** Parse a network menu packet in client disconnected state.
|
||||
**
|
||||
** @param msg message received
|
||||
*/
|
||||
local void ClientParseDisconnected(
|
||||
const InitMessage* msg __attribute__((unused)))
|
||||
const InitMessage* msg __attribute__((unused)))
|
||||
{
|
||||
DebugLevel0Fn("ccs_disconnected: Server sending GoodBye dups %d\n" _C_
|
||||
msg->SubType);
|
||||
msg->SubType);
|
||||
}
|
||||
);
|
||||
#endif
|
||||
|
||||
/**
|
||||
** Parse a network menu packet in client detaching state.
|
||||
|
@ -866,31 +882,31 @@ local void ClientParseConnecting(const InitMessage* msg)
|
|||
|
||||
case ICMEngineMismatch: // Stratagus engine version doesn't match
|
||||
fprintf(stderr, "Incompatible Stratagus version "
|
||||
StratagusFormatString " <-> "
|
||||
StratagusFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
StratagusFormatArgs((int)ntohl(msg->Stratagus)),
|
||||
StratagusFormatArgs(StratagusVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
StratagusFormatString " <-> "
|
||||
StratagusFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
StratagusFormatArgs((int)ntohl(msg->Stratagus)),
|
||||
StratagusFormatArgs(StratagusVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)), ntohs(NetLastPort));
|
||||
NetLocalState = ccs_incompatibleengine;
|
||||
NetConnectRunning = 0; // End the menu..
|
||||
return;
|
||||
|
||||
case ICMProtocolMismatch: // Network protocol version doesn't match
|
||||
fprintf(stderr, "Incompatible network protocol version "
|
||||
NetworkProtocolFormatString " <-> "
|
||||
NetworkProtocolFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
NetworkProtocolFormatArgs((int)ntohl(msg->Version)),
|
||||
NetworkProtocolFormatArgs(NetworkProtocolVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
NetworkProtocolFormatString " <-> "
|
||||
NetworkProtocolFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
NetworkProtocolFormatArgs((int)ntohl(msg->Version)),
|
||||
NetworkProtocolFormatArgs(NetworkProtocolVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)), ntohs(NetLastPort));
|
||||
NetLocalState = ccs_incompatiblenetwork;
|
||||
NetConnectRunning = 0; // End the menu..
|
||||
return;
|
||||
|
||||
case ICMGameFull: // Game is full - server rejected connnection
|
||||
fprintf(stderr, "Server at %d.%d.%d.%d:%d is full!\n",
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
NIPQUAD(ntohl(NetLastHost)), ntohs(NetLastPort));
|
||||
NetLocalState = ccs_nofreeslots;
|
||||
NetConnectRunning = 0; // End the menu..
|
||||
return;
|
||||
|
@ -905,7 +921,7 @@ local void ClientParseConnecting(const InitMessage* msg)
|
|||
|
||||
Hosts[0].Host = NetworkServerIP;
|
||||
Hosts[0].Port = htons(NetworkServerPort);
|
||||
for (i = 1; i < PlayerMax; i++) {
|
||||
for (i = 1; i < PlayerMax; ++i) {
|
||||
if (i != NetLocalHostsSlot) {
|
||||
Hosts[i].Host = msg->u.Hosts[i].Host;
|
||||
Hosts[i].Port = msg->u.Hosts[i].Port;
|
||||
|
@ -936,22 +952,21 @@ local void ClientParseConnected(const InitMessage* msg)
|
|||
{
|
||||
int pathlen;
|
||||
|
||||
switch(msg->SubType) {
|
||||
switch (msg->SubType) {
|
||||
|
||||
case ICMMap: // Server has sent us new map info
|
||||
pathlen = sprintf(MenuMapFullPath, "%s/", StratagusLibPath);
|
||||
memcpy(MenuMapFullPath+pathlen, msg->u.MapPath, 256);
|
||||
MenuMapFullPath[pathlen+255] = 0;
|
||||
memcpy(MenuMapFullPath + pathlen, msg->u.MapPath, 256);
|
||||
MenuMapFullPath[pathlen + 255] = 0;
|
||||
if (NetClientSelectScenario()) {
|
||||
NetLocalState = ccs_badmap;
|
||||
break;
|
||||
}
|
||||
if (ntohl(msg->MapUID) != MenuMapInfo->MapUID) {
|
||||
NetLocalState = ccs_badmap;
|
||||
fprintf(stderr,
|
||||
"Stratagus maps do not match (0x%08x) <-> (0x%08x)\n",
|
||||
(unsigned int)MenuMapInfo->MapUID,
|
||||
(unsigned int)ntohl(msg->MapUID));
|
||||
fprintf(stderr, "Stratagus maps do not match (0x%08x) <-> (0x%08x)\n",
|
||||
(unsigned int)MenuMapInfo->MapUID,
|
||||
(unsigned int)ntohl(msg->MapUID));
|
||||
break;
|
||||
}
|
||||
NetLocalState = ccs_mapinfo;
|
||||
|
@ -1035,11 +1050,11 @@ local void ClientParseSynced(const InitMessage* msg)
|
|||
Hosts[HostsCount].Port = NetLastPort;
|
||||
Hosts[HostsCount].PlyNr = ntohs(msg->u.Hosts[i].PlyNr);
|
||||
memcpy(Hosts[HostsCount].PlyName, msg->u.Hosts[i].PlyName, 16);
|
||||
HostsCount++;
|
||||
++HostsCount;
|
||||
NetPlayers = HostsCount + 1;
|
||||
DebugLevel0Fn("Server %d = %d.%d.%d.%d:%d [%s]\n" _C_
|
||||
ntohs(msg->u.Hosts[i].PlyNr) _C_ NIPQUAD(ntohl(NetLastHost)) _C_
|
||||
ntohs(NetLastPort) _C_ msg->u.Hosts[i].PlyName);
|
||||
ntohs(msg->u.Hosts[i].PlyNr) _C_ NIPQUAD(ntohl(NetLastHost)) _C_
|
||||
ntohs(NetLastPort) _C_ msg->u.Hosts[i].PlyName);
|
||||
|
||||
// put ourselves to the end, like on the server..
|
||||
Hosts[HostsCount].Host = 0;
|
||||
|
@ -1069,7 +1084,7 @@ local void ClientParseAsync(const InitMessage* msg)
|
|||
switch(msg->SubType) {
|
||||
|
||||
case ICMResync: // Server has resynced with us and sends resync data
|
||||
for (i = 1; i < PlayerMax-1; i++) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
if (i != NetLocalHostsSlot) {
|
||||
Hosts[i].Host = msg->u.Hosts[i].Host;
|
||||
Hosts[i].Port = msg->u.Hosts[i].Port;
|
||||
|
@ -1166,7 +1181,7 @@ local void ClientParseBadMap(const InitMessage* msg __attribute__((unused)))
|
|||
message.Type = MessageInitHello;
|
||||
message.SubType = ICMSeeYou;
|
||||
// Spew out 5 and trust in God that they arrive
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 5; ++i) {
|
||||
NetworkSendICMessage(NetworkServerIP, htons(NetworkServerPort), &message);
|
||||
}
|
||||
NetConnectRunning = 0; // End the menu..
|
||||
|
@ -1185,7 +1200,7 @@ local void ServerParseHello(int h, const InitMessage* msg)
|
|||
InitMessage message;
|
||||
|
||||
if (h == -1) { // it is a new client
|
||||
for (i = 1; i < PlayerMax-1; i++) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
// occupy first available slot
|
||||
if (ServerSetupState.CompOpt[i] == 0) {
|
||||
if (Hosts[i].PlyNr == 0) {
|
||||
|
@ -1209,7 +1224,7 @@ local void ServerParseHello(int h, const InitMessage* msg)
|
|||
message.MapUID = 0L;
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message GameFull: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1220,7 +1235,7 @@ local void ServerParseHello(int h, const InitMessage* msg)
|
|||
message.u.Hosts[0].PlyNr = htons(h); // Host array slot number
|
||||
memcpy(message.u.Hosts[0].PlyName, LocalPlayerName, 16); // Name of server player
|
||||
message.MapUID = 0L;
|
||||
for (i = 1; i < PlayerMax-1; i++) { // Info about other clients
|
||||
for (i = 1; i < PlayerMax - 1; ++i) { // Info about other clients
|
||||
if (i != h) {
|
||||
if (Hosts[i].PlyNr) {
|
||||
message.u.Hosts[i].Host = Hosts[i].Host;
|
||||
|
@ -1236,7 +1251,7 @@ local void ServerParseHello(int h, const InitMessage* msg)
|
|||
}
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message Welcome: (%d) [PlyNr: %d] to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ h _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ h _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 48) {
|
||||
// Detects UDP input firewalled or behind NAT firewall clients
|
||||
|
@ -1254,7 +1269,8 @@ local void ServerParseHello(int h, const InitMessage* msg)
|
|||
*/
|
||||
local void ServerParseResync(const int h)
|
||||
{
|
||||
int i, n;
|
||||
int i;
|
||||
int n;
|
||||
InitMessage message;
|
||||
|
||||
ServerSetupState.LastFrame[h] = FrameCounter;
|
||||
|
@ -1271,7 +1287,7 @@ local void ServerParseResync(const int h)
|
|||
// (indicating Resync has completed)
|
||||
message.Type = MessageInitReply;
|
||||
message.SubType = ICMResync;
|
||||
for (i = 1; i < PlayerMax-1; i++) { // Info about other clients
|
||||
for (i = 1; i < PlayerMax - 1; ++i) { // Info about other clients
|
||||
if (i != h) {
|
||||
if (Hosts[i].PlyNr) {
|
||||
message.u.Hosts[i].Host = Hosts[i].Host;
|
||||
|
@ -1287,7 +1303,7 @@ local void ServerParseResync(const int h)
|
|||
}
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message Resync: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 50) {
|
||||
// FIXME: Client sends resync, but doesn't receive our resync ack....
|
||||
|
@ -1297,7 +1313,7 @@ local void ServerParseResync(const int h)
|
|||
|
||||
default:
|
||||
DebugLevel0Fn("Server: ICMResync: Unhandled state %d Host %d\n" _C_
|
||||
NetStates[h].State _C_ h);
|
||||
NetStates[h].State _C_ h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1309,7 +1325,8 @@ local void ServerParseResync(const int h)
|
|||
*/
|
||||
local void ServerParseWaiting(const int h)
|
||||
{
|
||||
int i, n;
|
||||
int i;
|
||||
int n;
|
||||
InitMessage message;
|
||||
int pathlen;
|
||||
|
||||
|
@ -1327,11 +1344,11 @@ local void ServerParseWaiting(const int h)
|
|||
message.Type = MessageInitReply;
|
||||
message.SubType = ICMMap; // Send Map info to the client
|
||||
pathlen = strlen(StratagusLibPath) + 1;
|
||||
memcpy(message.u.MapPath, MenuMapFullPath+pathlen, 256);
|
||||
memcpy(message.u.MapPath, MenuMapFullPath + pathlen, 256);
|
||||
message.MapUID = htonl(MenuMapInfo->MapUID);
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message Map: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 50) {
|
||||
// FIXME: Client sends waiting, but doesn't receive our map....
|
||||
|
@ -1341,7 +1358,7 @@ local void ServerParseWaiting(const int h)
|
|||
case ccs_mapinfo:
|
||||
NetStates[h].State = ccs_synced;
|
||||
NetStates[h].MsgCnt = 0;
|
||||
for (i = 1; i < PlayerMax-1; i++) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
if (i != h && Hosts[i].PlyNr) {
|
||||
// Notify other clients
|
||||
NetStates[i].State = ccs_async;
|
||||
|
@ -1365,7 +1382,7 @@ local void ServerParseWaiting(const int h)
|
|||
message.MapUID = htonl(MenuMapInfo->MapUID);
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 50) {
|
||||
// FIXME: Client sends waiting, but doesn't receive our state info....
|
||||
|
@ -1375,7 +1392,7 @@ local void ServerParseWaiting(const int h)
|
|||
|
||||
default:
|
||||
DebugLevel0Fn("Server: ICMWaiting: Unhandled state %d Host %d\n" _C_
|
||||
NetStates[h].State _C_ h);
|
||||
NetStates[h].State _C_ h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1406,7 +1423,7 @@ local void ServerParseMap(const int h)
|
|||
message.MapUID = htonl(MenuMapInfo->MapUID);
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 50) {
|
||||
// FIXME: Client sends mapinfo, but doesn't receive our state info....
|
||||
|
@ -1415,7 +1432,7 @@ local void ServerParseMap(const int h)
|
|||
break;
|
||||
default:
|
||||
DebugLevel0Fn("Server: ICMMap: Unhandled state %d Host %d\n" _C_
|
||||
NetStates[h].State _C_ h);
|
||||
NetStates[h].State _C_ h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1428,7 +1445,8 @@ local void ServerParseMap(const int h)
|
|||
*/
|
||||
local void ServerParseState(const int h, const InitMessage* msg)
|
||||
{
|
||||
int i, n;
|
||||
int i;
|
||||
int n;
|
||||
InitMessage message;
|
||||
|
||||
ServerSetupState.LastFrame[h] = FrameCounter;
|
||||
|
@ -1444,11 +1462,11 @@ local void ServerParseState(const int h, const InitMessage* msg)
|
|||
ServerSetupState.Ready[h] = msg->u.State.Ready[h];
|
||||
ServerSetupState.Race[h] = msg->u.State.Race[h];
|
||||
DebugLevel3Fn("Server: ICMState: Client[%d]: Ready: %d Race: %d\n" _C_
|
||||
h _C_ ServerSetupState.Ready[h] _C_ ServerSetupState.Race[h]);
|
||||
h _C_ ServerSetupState.Ready[h] _C_ ServerSetupState.Race[h]);
|
||||
// Add additional info usage here!
|
||||
|
||||
// Resync other clients (and us..)
|
||||
for (i = 1; i < PlayerMax-1; i++) {
|
||||
for (i = 1; i < PlayerMax - 1; ++i) {
|
||||
if (Hosts[i].PlyNr) {
|
||||
NetStates[i].State = ccs_async;
|
||||
}
|
||||
|
@ -1464,7 +1482,7 @@ local void ServerParseState(const int h, const InitMessage* msg)
|
|||
message.MapUID = htonl(MenuMapInfo->MapUID);
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 50) {
|
||||
// FIXME: Client sends State, but doesn't receive our state info....
|
||||
|
@ -1473,7 +1491,7 @@ local void ServerParseState(const int h, const InitMessage* msg)
|
|||
break;
|
||||
default:
|
||||
DebugLevel0Fn("Server: ICMState: Unhandled state %d Host %d\n" _C_
|
||||
NetStates[h].State _C_ h);
|
||||
NetStates[h].State _C_ h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1502,7 +1520,7 @@ local void ServerParseGoodBye(const int h)
|
|||
message.SubType = ICMGoodBye;
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message GoodBye: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
NetStates[h].MsgCnt++;
|
||||
if (NetStates[h].MsgCnt > 10) {
|
||||
// FIXME: Client sends GoodBye, but doesn't receive our GoodBye....
|
||||
|
@ -1526,7 +1544,7 @@ local void ServerParseSeeYou(const int h)
|
|||
|
||||
default:
|
||||
DebugLevel0Fn("Server: ICMSeeYou: Unhandled state %d Host %d\n" _C_
|
||||
NetStates[h].State _C_ h);
|
||||
NetStates[h].State _C_ h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1556,37 +1574,37 @@ local int CheckVersions(const InitMessage* msg)
|
|||
|
||||
if (ntohl(msg->Stratagus) != StratagusVersion) {
|
||||
fprintf(stderr, "Incompatible Stratagus version "
|
||||
StratagusFormatString " <-> "
|
||||
StratagusFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
StratagusFormatArgs((int)ntohl(msg->Stratagus)),
|
||||
StratagusFormatArgs(StratagusVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
StratagusFormatString " <-> "
|
||||
StratagusFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
StratagusFormatArgs((int)ntohl(msg->Stratagus)),
|
||||
StratagusFormatArgs(StratagusVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
|
||||
message.Type = MessageInitReply;
|
||||
message.SubType = ICMEngineMismatch; // Stratagus engine version doesn't match
|
||||
message.MapUID = 0L;
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message EngineMismatch: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ntohl(msg->Version) != NetworkProtocolVersion) {
|
||||
fprintf(stderr, "Incompatible network protocol version "
|
||||
NetworkProtocolFormatString " <-> "
|
||||
NetworkProtocolFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
NetworkProtocolFormatArgs((int)ntohl(msg->Version)),
|
||||
NetworkProtocolFormatArgs(NetworkProtocolVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
NetworkProtocolFormatString " <-> "
|
||||
NetworkProtocolFormatString "\n"
|
||||
"from %d.%d.%d.%d:%d\n",
|
||||
NetworkProtocolFormatArgs((int)ntohl(msg->Version)),
|
||||
NetworkProtocolFormatArgs(NetworkProtocolVersion),
|
||||
NIPQUAD(ntohl(NetLastHost)),ntohs(NetLastPort));
|
||||
|
||||
message.Type = MessageInitReply;
|
||||
message.SubType = ICMProtocolMismatch; // Network protocol version doesn't match
|
||||
message.MapUID = 0L;
|
||||
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
|
||||
DebugLevel0Fn("Sending InitReply Message ProtocolMismatch: (%d) to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1598,11 +1616,11 @@ local int CheckVersions(const InitMessage* msg)
|
|||
**
|
||||
** @param msg message received
|
||||
*/
|
||||
local void NetworkParseMenuPacket(const InitMessage *msg)
|
||||
local void NetworkParseMenuPacket(const InitMessage* msg)
|
||||
{
|
||||
DebugLevel0Fn("Received %s Init Message %d:%d from %d.%d.%d.%d:%d (%ld)\n" _C_
|
||||
icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ NIPQUAD(ntohl(NetLastHost)) _C_
|
||||
ntohs(NetLastPort) _C_ FrameCounter);
|
||||
icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ NIPQUAD(ntohl(NetLastHost)) _C_
|
||||
ntohs(NetLastPort) _C_ FrameCounter);
|
||||
|
||||
if (NetConnectRunning == 2) { // client
|
||||
if (msg->Type == MessageInitReply) {
|
||||
|
@ -1618,9 +1636,9 @@ local void NetworkParseMenuPacket(const InitMessage *msg)
|
|||
}
|
||||
switch(NetLocalState) {
|
||||
case ccs_disconnected:
|
||||
IfDebug(
|
||||
#ifdef DEBUG
|
||||
ClientParseDisconnected(msg);
|
||||
);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case ccs_detaching:
|
||||
|
@ -1667,7 +1685,6 @@ IfDebug(
|
|||
}
|
||||
|
||||
} else if (NetConnectRunning == 1) { // server
|
||||
|
||||
int i;
|
||||
|
||||
if (CheckVersions(msg)) {
|
||||
|
@ -1675,7 +1692,7 @@ IfDebug(
|
|||
}
|
||||
|
||||
// look up the host - avoid last player slot (15) which is special
|
||||
for (i = 0; i < PlayerMax-1; ++i) {
|
||||
for (i = 0; i < PlayerMax - 1; ++i) {
|
||||
if (Hosts[i].Host == NetLastHost && Hosts[i].Port == NetLastPort) {
|
||||
switch(msg->SubType) {
|
||||
case ICMHello: // a new client has arrived
|
||||
|
@ -1718,7 +1735,7 @@ IfDebug(
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerMax-1 && msg->SubType == ICMHello) {
|
||||
if (i == PlayerMax - 1 && msg->SubType == ICMHello) {
|
||||
// Special case: a new client has arrived
|
||||
ServerParseHello(-1, msg);
|
||||
}
|
||||
|
@ -1733,9 +1750,9 @@ IfDebug(
|
|||
**
|
||||
** @return 1 if packet is an InitConfig message, 0 otherwise
|
||||
*/
|
||||
global int NetworkParseSetupEvent(const char *buf, int size)
|
||||
global int NetworkParseSetupEvent(const char* buf, int size)
|
||||
{
|
||||
const InitMessage *msg = (const InitMessage *)buf;
|
||||
const InitMessage* msg = (const InitMessage*)buf;
|
||||
|
||||
if (msg->Type > MessageInitConfig || size != sizeof(*msg)) {
|
||||
if (NetConnectRunning == 2 && NetLocalState == ccs_started) {
|
||||
|
|
|
@ -282,10 +282,10 @@ global int NetworkTimeout = 45; /// Number of seconds until player times out
|
|||
|
||||
local char NetMsgBuf[PlayerMax][128]; /// Chat message buffers
|
||||
local int NetMsgBufLen[PlayerMax]; /// Stored chat message length
|
||||
IfDebug(
|
||||
#ifdef DEBUG
|
||||
global unsigned long MyHost; /// My host number.
|
||||
global int MyPort; /// My port number.
|
||||
);
|
||||
#endif
|
||||
local unsigned long NetworkDelay; /// Delay counter for recover.
|
||||
local int NetworkSyncSeeds[256]; /// Network sync seeds.
|
||||
local int NetworkSyncHashs[256]; /// Network sync hashs.
|
||||
|
@ -322,7 +322,7 @@ local int PlayerQuit[PlayerMax]; /// Player quit
|
|||
**
|
||||
** @todo FIXME: should support multicast and proxy clients/server.
|
||||
*/
|
||||
global void NetworkBroadcast(const void *buf, int len)
|
||||
global void NetworkBroadcast(const void* buf, int len)
|
||||
{
|
||||
int i;
|
||||
#if 0
|
||||
|
@ -352,7 +352,7 @@ global void NetworkBroadcast(const void *buf, int len)
|
|||
|
||||
n = NetSendUDP(NetworkFildes, Hosts[i].Host, Hosts[i].Port, buf, len);
|
||||
DebugLevel3Fn("Sending %d to %d.%d.%d.%d:%d\n" _C_
|
||||
n _C_ NIPQUAD(ntohl(Hosts[i].Host)) _C_ ntohs(Hosts[i].Port));
|
||||
n _C_ NIPQUAD(ntohl(Hosts[i].Host)) _C_ ntohs(Hosts[i].Port));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -362,12 +362,14 @@ global void NetworkBroadcast(const void *buf, int len)
|
|||
**
|
||||
** @param ncq Outgoing network queue start.
|
||||
*/
|
||||
local void NetworkSendPacket(const NetworkCommandQueue *ncq)
|
||||
local void NetworkSendPacket(const NetworkCommandQueue* ncq)
|
||||
{
|
||||
NetworkPacket packet;
|
||||
int i;
|
||||
|
||||
IfDebug( ++NetworkSendPackets );
|
||||
#ifdef DEBUG
|
||||
++NetworkSendPackets;
|
||||
#endif
|
||||
|
||||
DebugLevel3Fn("In cycle %lu sending: " _C_ GameCycle);
|
||||
|
||||
|
@ -378,7 +380,7 @@ local void NetworkSendPacket(const NetworkCommandQueue *ncq)
|
|||
DebugLevel3("%d %d," _C_ ncq->Data.Type _C_ ncq->Time);
|
||||
packet.Commands[i] = ncq->Data;
|
||||
if (ncq->List->next->next) {
|
||||
ncq = (NetworkCommandQueue *)(ncq->List->next);
|
||||
ncq = (NetworkCommandQueue*)(ncq->List->next);
|
||||
}
|
||||
}
|
||||
DebugLevel3("\n");
|
||||
|
@ -437,7 +439,7 @@ global void InitNetwork1(void)
|
|||
}
|
||||
if (i == 9) {
|
||||
fprintf(stderr,"NETWORK: No free ports %d-%d available, aborting\n",
|
||||
port, port + i);
|
||||
port, port + i);
|
||||
NetExit(); // machine dependent network exit
|
||||
return;
|
||||
}
|
||||
|
@ -460,7 +462,8 @@ global void InitNetwork1(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
IfDebug({
|
||||
#ifdef DEBUG
|
||||
{
|
||||
char buf[128];
|
||||
|
||||
gethostname(buf, sizeof(buf));
|
||||
|
@ -468,8 +471,9 @@ global void InitNetwork1(void)
|
|||
MyHost = NetResolveHost(buf);
|
||||
MyPort = NetLastPort;
|
||||
DebugLevel0Fn("My host:port %d.%d.%d.%d:%d\n" _C_
|
||||
NIPQUAD(ntohl(MyHost)) _C_ ntohs(MyPort));
|
||||
});
|
||||
NIPQUAD(ntohl(MyHost)) _C_ ntohs(MyPort));
|
||||
}
|
||||
#endif
|
||||
|
||||
MasterInit();
|
||||
|
||||
|
@ -488,10 +492,10 @@ global void ExitNetwork1(void)
|
|||
}
|
||||
#ifdef DEBUG
|
||||
DebugLevel0("Received: %d packets, %d early, %d late, %d dups, %d lost.\n" _C_
|
||||
NetworkReceivedPackets _C_ NetworkReceivedEarly _C_ NetworkReceivedLate _C_
|
||||
NetworkReceivedDups _C_ NetworkReceivedLost);
|
||||
NetworkReceivedPackets _C_ NetworkReceivedEarly _C_ NetworkReceivedLate _C_
|
||||
NetworkReceivedDups _C_ NetworkReceivedLost);
|
||||
DebugLevel0("Send: %d packets, %d resend\n" _C_
|
||||
NetworkSendPackets _C_ NetworkSendResend);
|
||||
NetworkSendPackets _C_ NetworkSendResend);
|
||||
#endif
|
||||
NetCloseUDP(NetworkFildes);
|
||||
|
||||
|
@ -512,8 +516,8 @@ global void InitNetwork2(void)
|
|||
|
||||
NetworkConnectSetupGame();
|
||||
|
||||
DebugLevel0Fn("Lag %d, Updates %d, Hosts %d\n"
|
||||
_C_ NetworkLag _C_ NetworkUpdates _C_ HostsCount);
|
||||
DebugLevel0Fn("Lag %d, Updates %d, Hosts %d\n" _C_
|
||||
NetworkLag _C_ NetworkUpdates _C_ HostsCount);
|
||||
|
||||
//
|
||||
// Prepare first time without syncs.
|
||||
|
@ -554,10 +558,10 @@ global void InitNetwork2(void)
|
|||
** @warning
|
||||
** Destination and unit-type shares the same network slot.
|
||||
*/
|
||||
global void NetworkSendCommand(int command, const Unit *unit, int x, int y,
|
||||
const Unit *dest, const UnitType *type, int status)
|
||||
global void NetworkSendCommand(int command, const Unit* unit, int x, int y,
|
||||
const Unit* dest, const UnitType* type, int status)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkCommandQueue* ncq;
|
||||
|
||||
DebugLevel3Fn("%d,%d,(%d,%d),%d,%s,%s\n" _C_
|
||||
command _C_ unit->Slot _C_ x _C_ y _C_ dest ? dest->Slot : -1 _C_
|
||||
|
@ -600,10 +604,10 @@ global void NetworkSendCommand(int command, const Unit *unit, int x, int y,
|
|||
** @param arg4 optional argument #4
|
||||
** @param status Append command or flush old commands.
|
||||
*/
|
||||
global void NetworkSendExtendedCommand(int command,int arg1,int arg2,int arg3,
|
||||
int arg4,int status)
|
||||
global void NetworkSendExtendedCommand(int command, int arg1, int arg2, int arg3,
|
||||
int arg4, int status)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkCommandQueue* ncq;
|
||||
NetworkExtendedCommand* nec;
|
||||
|
||||
//
|
||||
|
@ -639,7 +643,7 @@ local void NetworkRemovePlayer(int player)
|
|||
// Remove player from Hosts and clear NetworkIn
|
||||
for (i = 0; i < HostsCount; ++i) {
|
||||
if (Hosts[i].PlyNr == player) {
|
||||
Hosts[i] = Hosts[HostsCount-1];
|
||||
Hosts[i] = Hosts[HostsCount - 1];
|
||||
--HostsCount;
|
||||
break;
|
||||
}
|
||||
|
@ -688,8 +692,10 @@ global void NetworkEvent(void)
|
|||
return;
|
||||
}
|
||||
|
||||
packet = (NetworkPacket *)buf;
|
||||
IfDebug( ++NetworkReceivedPackets );
|
||||
packet = (NetworkPacket*)buf;
|
||||
#ifdef DEBUG
|
||||
++NetworkReceivedPackets;
|
||||
#endif
|
||||
|
||||
//
|
||||
// Setup messages
|
||||
|
@ -725,7 +731,7 @@ global void NetworkEvent(void)
|
|||
// Parse the packet commands.
|
||||
//
|
||||
for (i = 0; i < NetworkDups; ++i) {
|
||||
const NetworkCommand *nc;
|
||||
const NetworkCommand* nc;
|
||||
|
||||
nc = &packet->Commands[i];
|
||||
|
||||
|
@ -737,7 +743,7 @@ global void NetworkEvent(void)
|
|||
}
|
||||
|
||||
if (nc->Type == MessageResend) {
|
||||
const NetworkCommandQueue *ncq;
|
||||
const NetworkCommandQueue* ncq;
|
||||
int j;
|
||||
|
||||
// Destination cycle (time to execute).
|
||||
|
@ -754,7 +760,7 @@ global void NetworkEvent(void)
|
|||
//
|
||||
// Find the commands to resend
|
||||
//
|
||||
ncq = (NetworkCommandQueue *)(CommandsOut->first);
|
||||
ncq = (NetworkCommandQueue*)(CommandsOut->first);
|
||||
while (ncq->List->next) {
|
||||
DebugLevel3Fn("resend %d? %d\n" _C_ ncq->Time _C_ n);
|
||||
if (ncq->Time == n) {
|
||||
|
@ -763,7 +769,7 @@ global void NetworkEvent(void)
|
|||
break;
|
||||
}
|
||||
|
||||
ncq = (NetworkCommandQueue *)(ncq->List->next);
|
||||
ncq = (NetworkCommandQueue*)(ncq->List->next);
|
||||
}
|
||||
if (!ncq->List->next) {
|
||||
DebugLevel3Fn("no packets for resend\n");
|
||||
|
@ -801,7 +807,7 @@ global void NetworkEvent(void)
|
|||
|
||||
if (NetworkIn[nc->Cycle][player].Time != n) {
|
||||
DebugLevel3Fn("Command %3d for %8d(%02X) got\n" _C_
|
||||
nc->Type _C_ n _C_ nc->Cycle);
|
||||
nc->Type _C_ n _C_ nc->Cycle);
|
||||
}
|
||||
|
||||
// Receive statistic
|
||||
|
@ -852,7 +858,7 @@ global void NetworkEvent(void)
|
|||
*/
|
||||
global void NetworkQuit(void)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkCommandQueue* ncq;
|
||||
|
||||
if (!ThisPlayer) {
|
||||
return;
|
||||
|
@ -861,8 +867,7 @@ global void NetworkQuit(void)
|
|||
ncq = malloc(sizeof(NetworkCommandQueue));
|
||||
dl_insert_first(CommandsOut, ncq->List);
|
||||
|
||||
ncq->Time = (GameCycle + NetworkUpdates) / NetworkUpdates * NetworkUpdates
|
||||
+ NetworkLag;
|
||||
ncq->Time = (GameCycle + NetworkUpdates) / NetworkUpdates * NetworkUpdates + NetworkLag;
|
||||
ncq->Data.Cycle = ncq->Time & 0xFF;
|
||||
ncq->Data.Type = MessageQuit;
|
||||
ncq->Data.X = ThisPlayer->Player;
|
||||
|
@ -875,11 +880,11 @@ global void NetworkQuit(void)
|
|||
**
|
||||
** @param msg Text message to send.
|
||||
*/
|
||||
global void NetworkChatMessage(const char *msg)
|
||||
global void NetworkChatMessage(const char* msg)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkChat *ncm;
|
||||
const char *cp;
|
||||
NetworkCommandQueue* ncq;
|
||||
NetworkChat* ncm;
|
||||
const char* cp;
|
||||
int n;
|
||||
|
||||
if (NetworkFildes != (Socket)-1) {
|
||||
|
@ -898,7 +903,7 @@ global void NetworkChatMessage(const char *msg)
|
|||
ncq = malloc(sizeof(NetworkCommandQueue));
|
||||
dl_insert_first(MsgCommandsIn, ncq->List);
|
||||
ncq->Data.Type = MessageChatTerm;
|
||||
ncm = (NetworkChat *)(&ncq->Data);
|
||||
ncm = (NetworkChat*)(&ncq->Data);
|
||||
ncm->Player = ThisPlayer->Player;
|
||||
memcpy(ncm->Text, cp, n + 1); // see >= above :)
|
||||
}
|
||||
|
@ -909,7 +914,7 @@ global void NetworkChatMessage(const char *msg)
|
|||
**
|
||||
** @param ncq Network command from queue
|
||||
*/
|
||||
local void ParseNetworkCommand(const NetworkCommandQueue *ncq)
|
||||
local void ParseNetworkCommand(const NetworkCommandQueue* ncq)
|
||||
{
|
||||
int ply;
|
||||
|
||||
|
@ -917,23 +922,22 @@ local void ParseNetworkCommand(const NetworkCommandQueue *ncq)
|
|||
case MessageSync:
|
||||
ply = ntohs(ncq->Data.X) << 16;
|
||||
ply |= ntohs(ncq->Data.Y);
|
||||
if (ply != NetworkSyncSeeds[GameCycle & 0xFF]
|
||||
|| ntohs(ncq->Data.Unit)
|
||||
!= NetworkSyncHashs[GameCycle & 0xFF]) {
|
||||
if (ply != NetworkSyncSeeds[GameCycle & 0xFF] ||
|
||||
ntohs(ncq->Data.Unit) != NetworkSyncHashs[GameCycle & 0xFF]) {
|
||||
|
||||
SetMessage("Network out of sync");
|
||||
DebugLevel0Fn("\nNetwork out of sync %x!=%x!\n\n" _C_
|
||||
ply _C_ NetworkSyncSeeds[GameCycle & 0xFF]);
|
||||
ply _C_ NetworkSyncSeeds[GameCycle & 0xFF]);
|
||||
}
|
||||
return;
|
||||
case MessageChat:
|
||||
case MessageChatTerm: {
|
||||
const NetworkChat *ncm;
|
||||
const NetworkChat* ncm;
|
||||
|
||||
ncm = (NetworkChat *)(&ncq->Data);
|
||||
ncm = (NetworkChat*)(&ncq->Data);
|
||||
ply = ncm->Player;
|
||||
if (NetMsgBufLen[ply] + sizeof(ncm->Text) < 128) {
|
||||
memcpy(((char *)NetMsgBuf[ply]) + NetMsgBufLen[ply], ncm->Text,
|
||||
memcpy(((char*)NetMsgBuf[ply]) + NetMsgBufLen[ply], ncm->Text,
|
||||
sizeof(ncm->Text));
|
||||
}
|
||||
NetMsgBufLen[ply] += sizeof(ncm->Text);
|
||||
|
@ -946,7 +950,7 @@ local void ParseNetworkCommand(const NetworkCommandQueue *ncq)
|
|||
break;
|
||||
case MessageQuit:
|
||||
NetworkRemovePlayer(ncq->Data.X);
|
||||
CommandLog("quit",NoUnitP,FlushCommands,ncq->Data.X,-1,NoUnitP,NULL,-1);
|
||||
CommandLog("quit", NoUnitP, FlushCommands, ncq->Data.X, -1, NoUnitP, NULL, -1);
|
||||
CommandQuit(ncq->Data.X);
|
||||
break;
|
||||
case MessageExtendedCommand: {
|
||||
|
@ -954,14 +958,12 @@ local void ParseNetworkCommand(const NetworkCommandQueue *ncq)
|
|||
|
||||
nec = (NetworkExtendedCommand *)(&ncq->Data);
|
||||
ParseExtendedCommand(nec->ExtendedType, (nec->Type & 0x80) >> 7,
|
||||
nec->Arg1, ntohs(nec->Arg2), ntohs(nec->Arg3),
|
||||
ntohs(nec->Arg4));
|
||||
nec->Arg1, ntohs(nec->Arg2), ntohs(nec->Arg3), ntohs(nec->Arg4));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ParseCommand(ncq->Data.Type, ntohs(ncq->Data.Unit),
|
||||
ntohs(ncq->Data.X), ntohs(ncq->Data.Y),
|
||||
ntohs(ncq->Data.Dest));
|
||||
ntohs(ncq->Data.X), ntohs(ncq->Data.Y), ntohs(ncq->Data.Dest));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -978,34 +980,36 @@ local void ParseNetworkCommand(const NetworkCommandQueue *ncq)
|
|||
local void NetworkResendCommands(void)
|
||||
{
|
||||
NetworkPacket packet;
|
||||
const NetworkCommandQueue *ncq;
|
||||
const NetworkCommandQueue* ncq;
|
||||
int i;
|
||||
|
||||
IfDebug( ++NetworkSendResend );
|
||||
#ifdef DEBUG
|
||||
++NetworkSendResend;
|
||||
#endif
|
||||
|
||||
//
|
||||
// Build packet of 4 messages.
|
||||
//
|
||||
packet.Commands[0].Type = MessageResend;
|
||||
packet.Commands[0].Cycle =
|
||||
(GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates;
|
||||
(GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates;
|
||||
|
||||
DebugLevel2Fn("In cycle %lu for cycle %lu(%x):" _C_ GameCycle _C_
|
||||
(GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates _C_
|
||||
packet.Commands[0].Cycle);
|
||||
(GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates _C_
|
||||
packet.Commands[0].Cycle);
|
||||
|
||||
ncq = (NetworkCommandQueue *)(CommandsOut->last);
|
||||
ncq = (NetworkCommandQueue*)(CommandsOut->last);
|
||||
|
||||
for (i = 1; i < NetworkDups; ++i) {
|
||||
DebugLevel2("%d %lu," _C_ ncq->Data.Type _C_ ncq->Time);
|
||||
packet.Commands[i] = ncq->Data;
|
||||
if (ncq->List->prev->prev) {
|
||||
ncq = (NetworkCommandQueue *)(ncq->List->prev);
|
||||
ncq = (NetworkCommandQueue*)(ncq->List->prev);
|
||||
}
|
||||
}
|
||||
DebugLevel2("<%d %lu\n" _C_ ncq->Data.Type _C_ ncq->Time);
|
||||
|
||||
// if(0 || !(rand() & 15))
|
||||
// if (0 || !(rand() & 15))
|
||||
NetworkBroadcast(&packet, sizeof(packet));
|
||||
}
|
||||
|
||||
|
@ -1014,7 +1018,7 @@ local void NetworkResendCommands(void)
|
|||
*/
|
||||
local void NetworkSendCommands(void)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkCommandQueue* ncq;
|
||||
|
||||
//
|
||||
// No command available, send sync.
|
||||
|
@ -1029,19 +1033,19 @@ local void NetworkSendCommands(void)
|
|||
} else {
|
||||
DebugLevel3Fn("command in remove\n");
|
||||
if (!dl_empty(CommandsIn)) {
|
||||
ncq = (NetworkCommandQueue *)CommandsIn->last;
|
||||
IfDebug(
|
||||
ncq = (NetworkCommandQueue*)CommandsIn->last;
|
||||
#ifdef DEBUG
|
||||
if (ncq->Data.Type != MessageExtendedCommand) {
|
||||
// FIXME: we can send destoyed units over network :(
|
||||
if (UnitSlots[ntohs(ncq->Data.Unit)]->Destroyed) {
|
||||
DebugLevel0Fn("Sending destroyed unit %d over network!!!!!!\n" _C_
|
||||
ntohs(ncq->Data.Unit));
|
||||
ntohs(ncq->Data.Unit));
|
||||
}
|
||||
}
|
||||
);
|
||||
#endif
|
||||
dl_remove_last(CommandsIn);
|
||||
} else {
|
||||
ncq = (NetworkCommandQueue *)MsgCommandsIn->last;
|
||||
ncq = (NetworkCommandQueue*)MsgCommandsIn->last;
|
||||
dl_remove_last(MsgCommandsIn);
|
||||
}
|
||||
}
|
||||
|
@ -1065,7 +1069,7 @@ local void NetworkSendCommands(void)
|
|||
*/
|
||||
local void NetworkExecCommands(void)
|
||||
{
|
||||
NetworkCommandQueue *ncq;
|
||||
NetworkCommandQueue* ncq;
|
||||
int i;
|
||||
|
||||
//
|
||||
|
@ -1077,7 +1081,7 @@ local void NetworkExecCommands(void)
|
|||
// Remove outdated commands from queue
|
||||
//
|
||||
while (!dl_empty(CommandsOut)) {
|
||||
ncq = (NetworkCommandQueue *)(CommandsOut->last);
|
||||
ncq = (NetworkCommandQueue*)(CommandsOut->last);
|
||||
// FIXME: how many packets must be kept exactly?
|
||||
// if (ncq->Time + NetworkLag + NetworkUpdates >= GameCycle)
|
||||
// THIS is too much if (ncq->Time >= GameCycle)
|
||||
|
@ -1091,14 +1095,14 @@ local void NetworkExecCommands(void)
|
|||
//
|
||||
// Execute local commands from queue
|
||||
//
|
||||
ncq = (NetworkCommandQueue *)(CommandsOut->last);
|
||||
ncq = (NetworkCommandQueue*)(CommandsOut->last);
|
||||
while (ncq->List->prev) {
|
||||
if (ncq->Time == GameCycle) {
|
||||
DebugLevel3Fn("execute loc %lu,%d\n" _C_ GameCycle _C_ ncq->Time);
|
||||
ParseNetworkCommand(ncq);
|
||||
break;
|
||||
}
|
||||
ncq = (NetworkCommandQueue *)(ncq->List->prev);
|
||||
ncq = (NetworkCommandQueue*)(ncq->List->prev);
|
||||
}
|
||||
} else {
|
||||
//
|
||||
|
@ -1107,10 +1111,10 @@ local void NetworkExecCommands(void)
|
|||
ncq = &NetworkIn[GameCycle & 0xFF][i];
|
||||
if (ncq->Time) {
|
||||
DebugLevel3Fn("execute net %lu,%d(%lx),%d\n" _C_
|
||||
GameCycle _C_ i _C_ GameCycle & 0xFF _C_ ncq->Time);
|
||||
GameCycle _C_ i _C_ GameCycle & 0xFF _C_ ncq->Time);
|
||||
if (ncq->Time != GameCycle) {
|
||||
DebugLevel2Fn("cycle %lu idx %lu time %lu\n" _C_
|
||||
GameCycle _C_ GameCycle & 0xFF _C_ ncq->Time);
|
||||
GameCycle _C_ GameCycle & 0xFF _C_ ncq->Time);
|
||||
DebugCheck(ncq->Time != GameCycle);
|
||||
}
|
||||
ParseNetworkCommand(ncq);
|
||||
|
@ -1124,7 +1128,7 @@ local void NetworkExecCommands(void)
|
|||
*/
|
||||
local void NetworkSyncCommands(void)
|
||||
{
|
||||
const NetworkCommandQueue *ncq;
|
||||
const NetworkCommandQueue* ncq;
|
||||
int i;
|
||||
unsigned long n;
|
||||
|
||||
|
@ -1185,17 +1189,17 @@ global void NetworkRecover(void)
|
|||
}
|
||||
|
||||
secs = (FrameCounter - NetworkLastFrame[Hosts[i].PlyNr]) /
|
||||
(FRAMES_PER_SECOND * VideoSyncSpeed / 100);
|
||||
(FRAMES_PER_SECOND * VideoSyncSpeed / 100);
|
||||
// FIXME: display a menu while we wait
|
||||
if (secs >= 3 && secs < NetworkTimeout) {
|
||||
if (FrameCounter % FRAMES_PER_SECOND < (unsigned long)NetworkUpdates) {
|
||||
SetMessage("Waiting for player \"%s\": %d:%02d", Hosts[i].PlyName,
|
||||
(NetworkTimeout - secs) / 60, (NetworkTimeout - secs) % 60);
|
||||
(NetworkTimeout - secs) / 60, (NetworkTimeout - secs) % 60);
|
||||
}
|
||||
}
|
||||
if (secs >= NetworkTimeout) {
|
||||
NetworkCommand nc;
|
||||
const NetworkCommandQueue *ncq;
|
||||
const NetworkCommandQueue* ncq;
|
||||
unsigned long n;
|
||||
NetworkPacket np;
|
||||
int j;
|
||||
|
|
Loading…
Add table
Reference in a new issue