summaryrefslogtreecommitdiff
path: root/network_server.c
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-01-25 18:11:06 +0000
committerDarkvater <Darkvater@openttd.org>2006-01-25 18:11:06 +0000
commit082aa38f79930b31a5b9177e507a74cba0738e7a (patch)
tree2e2b02a496376c4fb097825d484c2c4a6f6f5492 /network_server.c
parent063aa48b0bad3a8e8f046b9dc8e51f8a67b9678c (diff)
downloadopenttd-082aa38f79930b31a5b9177e507a74cba0738e7a.tar.xz
(svn r3427) - Feature: Allow seeing and setting the maximum amount of companies and spectators for a server. This can be changed/viewed during runtime as well in the console.
Diffstat (limited to 'network_server.c')
-rw-r--r--network_server.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/network_server.c b/network_server.c
index ad0b42f26..8dd6c36c7 100644
--- a/network_server.c
+++ b/network_server.c
@@ -156,13 +156,13 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo
NetworkSend_uint8(p, error);
NetworkSend_Packet(p, cs);
+ GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + error);
+
// Only send when the current client was in game
if (cs->status > STATUS_AUTH) {
NetworkGetClientName(client_name, sizeof(client_name), cs);
- GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + error);
-
- DEBUG(net, 2)("[NET] %s made an error (%s) and his connection is closed", client_name, str);
+ DEBUG(net, 2) ("[NET] '%s' made an error and has been disconnected. Reason: %s", client_name, str);
NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
@@ -177,7 +177,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo
}
}
} else {
- DEBUG(net, 2)("[NET] Clientno %d has made an error and his connection is closed", cs->index);
+ DEBUG(net, 2) ("[NET] Client %d made an error and has been disconnected. Reason: %s", cs->index, str);
}
cs->quited = true;
@@ -213,14 +213,16 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
//
Packet *p;
- NetworkClientState *new_cs;
+ const NetworkClientState *new_cs;
+ const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
// Invalid packet when status is AUTH or higher
- if (cs->status >= STATUS_AUTH)
- return;
+ if (cs->status >= STATUS_AUTH) return;
cs->status = STATUS_AUTH;
_network_game_info.clients_on++;
+ /* increment spectator; defer company addition for when player is actually created */
+ if (ci->client_playas == OWNER_SPECTATOR) _network_game_info.spectators_on++;
p = NetworkSend_Init(PACKET_SERVER_WELCOME);
NetworkSend_uint16(p, cs->index);
@@ -585,12 +587,10 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
char name[NETWORK_NAME_LENGTH];
char unique_id[NETWORK_NAME_LENGTH];
NetworkClientInfo *ci;
- char test_name[NETWORK_NAME_LENGTH];
byte playas;
NetworkLanguage client_lang;
char client_revision[NETWORK_REVISION_LENGTH];
-
NetworkRecv_string(cs, p, client_revision, sizeof(client_revision));
#if defined(WITH_REV) || defined(WITH_REV_HACK)
@@ -610,18 +610,28 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
client_lang = NetworkRecv_uint8(cs, p);
NetworkRecv_string(cs, p, unique_id, sizeof(unique_id));
- if (cs->quited)
- return;
-
- // Check if someone else already has that name
- snprintf(test_name, sizeof(test_name), "%s", name);
+ if (cs->quited) return;
- if (test_name[0] == '\0') {
- // We need a valid name.. make it Player
- snprintf(test_name, sizeof(test_name), "Player");
+ // join another company does not affect these values
+ switch (playas) {
+ case 0: /* New company */
+ if (_network_game_info.companies_max >= _network_game_info.companies_on) {
+ SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
+ return;
+ }
+ break;
+ case OWNER_SPECTATOR: /* Spectator */
+ if (_network_game_info.spectators_on >= _network_game_info.spectators_max) {
+ SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
+ return;
+ }
+ break;
}
- if (!NetworkFindName(test_name)) {
+ // We need a valid name.. make it Player
+ if (name[0] == '\0') snprintf(name, sizeof(name), "Player");
+
+ if (!NetworkFindName(name)) { // Change name if duplicate
// We could not create a name for this player
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NAME_IN_USE);
return;
@@ -629,7 +639,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
ci = DEREF_CLIENT_INFO(cs);
- snprintf(ci->client_name, sizeof(ci->client_name), "%s", test_name);
+ snprintf(ci->client_name, sizeof(ci->client_name), "%s", name);
snprintf(ci->unique_id, sizeof(ci->unique_id), "%s", unique_id);
ci->client_playas = playas;
ci->client_lang = client_lang;