|
@@ -216,49 +216,49 @@ static void ClientStartError(const char
|
|
|
NetworkError(STR_NETWORK_ERR_CLIENT_START);
|
|
|
}
|
|
|
|
|
|
static void ServerStartError(const char *error)
|
|
|
{
|
|
|
DEBUG(net, 0)("[NET] Server could not start network: %s",error);
|
|
|
NetworkError(STR_NETWORK_ERR_SERVER_START);
|
|
|
}
|
|
|
|
|
|
static void NetworkClientError(byte res, NetworkClientState *cs) {
|
|
|
// First, send a CLIENT_ERROR to the server, so he knows we are
|
|
|
// disconnection (and why!)
|
|
|
NetworkErrorCode errorno;
|
|
|
|
|
|
// We just want to close the connection..
|
|
|
if (res == NETWORK_RECV_STATUS_CLOSE_QUERY) {
|
|
|
cs->quited = true;
|
|
|
NetworkCloseClient(cs);
|
|
|
_networking = false;
|
|
|
|
|
|
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
switch(res) {
|
|
|
switch (res) {
|
|
|
case NETWORK_RECV_STATUS_DESYNC: errorno = NETWORK_ERROR_DESYNC; break;
|
|
|
case NETWORK_RECV_STATUS_SAVEGAME: errorno = NETWORK_ERROR_SAVEGAME_FAILED; break;
|
|
|
default: errorno = NETWORK_ERROR_GENERAL;
|
|
|
}
|
|
|
// This means we fucked up and the server closed the connection
|
|
|
if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL &&
|
|
|
res != NETWORK_RECV_STATUS_SERVER_BANNED) {
|
|
|
SEND_COMMAND(PACKET_CLIENT_ERROR)(errorno);
|
|
|
|
|
|
// Dequeue all commands before closing the socket
|
|
|
NetworkSend_Packets(DEREF_CLIENT(0));
|
|
|
}
|
|
|
|
|
|
_switch_mode = SM_MENU;
|
|
|
NetworkCloseClient(cs);
|
|
|
_networking = false;
|
|
|
}
|
|
|
|
|
|
// Find all IP-aliases for this host
|
|
|
static void NetworkFindIPs(void)
|
|
|
{
|
|
|
int i, last;
|
|
|
|
|
|
#if defined(BEOS_NET_SERVER) /* doesn't have neither getifaddrs or net/if.h */
|
|
@@ -1147,49 +1147,49 @@ static void NetworkHandleLocalQueue(void
|
|
|
while ( (cp = *cp_prev) != NULL) {
|
|
|
|
|
|
// The queue is always in order, which means
|
|
|
// that the first element will be executed first.
|
|
|
if (_frame_counter < cp->frame)
|
|
|
break;
|
|
|
|
|
|
if (_frame_counter > cp->frame) {
|
|
|
// If we reach here, it means for whatever reason, we've already executed
|
|
|
// past the command we need to execute.
|
|
|
DEBUG(net, 0)("[NET] Trying to execute a packet in the past!");
|
|
|
assert(0);
|
|
|
}
|
|
|
|
|
|
// We can execute this command
|
|
|
NetworkExecuteCommand(cp);
|
|
|
|
|
|
*cp_prev = cp->next;
|
|
|
free(cp);
|
|
|
}
|
|
|
|
|
|
// Just a safety check, to be removed in the future.
|
|
|
// Make sure that no older command appears towards the end of the queue
|
|
|
// In that case we missed executing it. This will never happen.
|
|
|
for(cp = _local_command_queue; cp; cp = cp->next) {
|
|
|
for (cp = _local_command_queue; cp; cp = cp->next) {
|
|
|
assert(_frame_counter < cp->frame);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
static bool NetworkDoClientLoop(void)
|
|
|
{
|
|
|
_frame_counter++;
|
|
|
|
|
|
NetworkHandleLocalQueue();
|
|
|
|
|
|
StateGameLoop();
|
|
|
|
|
|
// Check if we are in sync!
|
|
|
if (_sync_frame != 0) {
|
|
|
if (_sync_frame == _frame_counter) {
|
|
|
#ifdef NETWORK_SEND_DOUBLE_SEED
|
|
|
if (_sync_seed_1 != _random_seeds[0][0] || _sync_seed_2 != _random_seeds[0][1]) {
|
|
|
#else
|
|
|
if (_sync_seed_1 != _random_seeds[0][0]) {
|
|
|
#endif
|
|
|
NetworkError(STR_NETWORK_ERR_DESYNC);
|
|
|
DEBUG(net, 0)("[NET] Sync error detected!");
|
|
|
NetworkClientError(NETWORK_RECV_STATUS_DESYNC, DEREF_CLIENT(0));
|