mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-21 21:49:10 +00:00
(svn r14421) -Codechange: rename all player variables/types to company *or* client so it is immediatelly clear which one you are working with.
This commit is contained in:
@@ -29,8 +29,8 @@ enum {
|
||||
NETWORK_UNIQUE_ID_LENGTH = 33, ///< The maximum length of the unique id of the clients, in bytes including '\0'
|
||||
NETWORK_REVISION_LENGTH = 15, ///< The maximum length of the revision, in bytes including '\0'
|
||||
NETWORK_PASSWORD_LENGTH = 33, ///< The maximum length of the password, in bytes including '\0' (must be >= NETWORK_UNIQUE_ID_LENGTH)
|
||||
NETWORK_PLAYERS_LENGTH = 200, ///< The maximum length for the list of players that controls a company, in bytes including '\0'
|
||||
NETWORK_CLIENT_NAME_LENGTH = 25, ///< The maximum length of a player, in bytes including '\0'
|
||||
NETWORK_CLIENTS_LENGTH = 200, ///< The maximum length for the list of clients that controls a company, in bytes including '\0'
|
||||
NETWORK_CLIENT_NAME_LENGTH = 25, ///< The maximum length of a client's name, in bytes including '\0'
|
||||
NETWORK_RCONCOMMAND_LENGTH = 500, ///< The maximum length of a rconsole command, in bytes including '\0'
|
||||
NETWORK_CHAT_LENGTH = 900, ///< The maximum length of a chat message, in bytes including '\0'
|
||||
|
||||
|
@@ -17,7 +17,7 @@
|
||||
/**
|
||||
* This is the struct used by both client and server
|
||||
* some fields will be empty on the client (like game_password) by default
|
||||
* and only filled with data a player enters.
|
||||
* and only filled with data a client enters.
|
||||
*/
|
||||
struct NetworkServerGameInfo {
|
||||
byte clients_on; ///< Current count of clients on server
|
||||
|
@@ -61,7 +61,7 @@ enum {
|
||||
/** Packet that wraps a command */
|
||||
struct CommandPacket {
|
||||
CommandPacket *next; ///< the next command packet (if in queue)
|
||||
PlayerByte player; ///< player that is executing the command
|
||||
CompanyByte company; ///< company that is executing the command
|
||||
uint32 cmd; ///< command being executed
|
||||
uint32 p1; ///< parameter p1
|
||||
uint32 p2; ///< parameter p2
|
||||
@@ -81,7 +81,7 @@ enum ClientStatus {
|
||||
STATUS_MAP, ///< The client is downloading the map
|
||||
STATUS_DONE_MAP, ///< The client has downloaded the map
|
||||
STATUS_PRE_ACTIVE, ///< The client is catching up the delayed frames
|
||||
STATUS_ACTIVE, ///< The client is an active player in the game
|
||||
STATUS_ACTIVE, ///< The client is active within in the game
|
||||
};
|
||||
|
||||
/** Base socket handler for all TCP sockets */
|
||||
|
@@ -47,7 +47,7 @@ bool _network_available; ///< is network mode available?
|
||||
bool _network_dedicated; ///< are we a dedicated server?
|
||||
bool _is_network_server; ///< Does this client wants to be a network-server?
|
||||
NetworkServerGameInfo _network_game_info;
|
||||
NetworkPlayerInfo _network_player_info[MAX_PLAYERS];
|
||||
NetworkCompanyInfo _network_company_info[MAX_COMPANIES];
|
||||
NetworkClientInfo _network_client_info[MAX_CLIENT_INFO];
|
||||
uint16 _network_own_client_index;
|
||||
uint16 _redirect_console_to_client;
|
||||
@@ -155,7 +155,7 @@ byte NetworkSpectatorCount()
|
||||
byte count = 0;
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
if (DEREF_CLIENT_INFO(cs)->client_playas == PLAYER_SPECTATOR) count++;
|
||||
if (DEREF_CLIENT_INFO(cs)->client_playas == COMPANY_SPECTATOR) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
@@ -335,54 +335,54 @@ char* GetNetworkErrorMsg(char* buf, NetworkErrorCode err, const char* last)
|
||||
}
|
||||
|
||||
/* Count the number of active clients connected */
|
||||
static uint NetworkCountPlayers()
|
||||
static uint NetworkCountActiveClients()
|
||||
{
|
||||
NetworkTCPSocketHandler *cs;
|
||||
uint count = 0;
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
if (IsValidPlayerID(ci->client_playas)) count++;
|
||||
if (IsValidCompanyID(ci->client_playas)) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static bool _min_players_paused = false;
|
||||
static bool _min_active_clients_paused = false;
|
||||
|
||||
/* Check if the minimum number of players has been reached and pause or unpause the game as appropriate */
|
||||
void CheckMinPlayers()
|
||||
/* Check if the minimum number of active clients has been reached and pause or unpause the game as appropriate */
|
||||
void CheckMinActiveClients()
|
||||
{
|
||||
if (!_network_dedicated) return;
|
||||
|
||||
if (NetworkCountPlayers() < _settings_client.network.min_players) {
|
||||
if (_min_players_paused) return;
|
||||
if (NetworkCountActiveClients() < _settings_client.network.min_active_clients) {
|
||||
if (_min_active_clients_paused) return;
|
||||
|
||||
_min_players_paused = true;
|
||||
_min_active_clients_paused = true;
|
||||
DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
|
||||
NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "Game paused (not enough players)", NETWORK_SERVER_INDEX);
|
||||
} else {
|
||||
if (!_min_players_paused) return;
|
||||
if (!_min_active_clients_paused) return;
|
||||
|
||||
_min_players_paused = false;
|
||||
_min_active_clients_paused = false;
|
||||
DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
|
||||
NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "Game unpaused (enough players)", NETWORK_SERVER_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
/** Converts a string to ip/port/player
|
||||
* Format: IP#player:port
|
||||
/** Converts a string to ip/port/company
|
||||
* Format: IP#company:port
|
||||
*
|
||||
* connection_string will be re-terminated to seperate out the hostname, and player and port will
|
||||
* be set to the player and port strings given by the user, inside the memory area originally
|
||||
* connection_string will be re-terminated to seperate out the hostname, and company and port will
|
||||
* be set to the company and port strings given by the user, inside the memory area originally
|
||||
* occupied by connection_string. */
|
||||
void ParseConnectionString(const char **player, const char **port, char *connection_string)
|
||||
void ParseConnectionString(const char **company, const char **port, char *connection_string)
|
||||
{
|
||||
char *p;
|
||||
for (p = connection_string; *p != '\0'; p++) {
|
||||
switch (*p) {
|
||||
case '#':
|
||||
*player = p + 1;
|
||||
*company = p + 1;
|
||||
*p = '\0';
|
||||
break;
|
||||
case ':':
|
||||
@@ -421,7 +421,7 @@ static NetworkTCPSocketHandler *NetworkAllocClient(SOCKET s)
|
||||
|
||||
cs->index = _network_client_index++;
|
||||
ci->client_index = cs->index;
|
||||
ci->client_playas = PLAYER_INACTIVE_CLIENT;
|
||||
ci->client_playas = COMPANY_INACTIVE_CLIENT;
|
||||
ci->join_date = _date;
|
||||
|
||||
InvalidateWindow(WC_CLIENT_LIST, 0);
|
||||
@@ -495,7 +495,7 @@ void NetworkCloseClient(NetworkTCPSocketHandler *cs)
|
||||
cs->index = NETWORK_EMPTY_INDEX;
|
||||
ci->client_index = NETWORK_EMPTY_INDEX;
|
||||
|
||||
CheckMinPlayers();
|
||||
CheckMinActiveClients();
|
||||
}
|
||||
|
||||
// A client wants to connect to a server
|
||||
@@ -688,7 +688,7 @@ static void NetworkInitialize()
|
||||
|
||||
// Clean the client_info memory
|
||||
memset(&_network_client_info, 0, sizeof(_network_client_info));
|
||||
memset(&_network_player_info, 0, sizeof(_network_player_info));
|
||||
memset(&_network_company_info, 0, sizeof(_network_company_info));
|
||||
|
||||
_sync_frame = 0;
|
||||
_network_first_time = true;
|
||||
@@ -729,7 +729,7 @@ void NetworkAddServer(const char *b)
|
||||
{
|
||||
if (*b != '\0') {
|
||||
const char *port = NULL;
|
||||
const char *player = NULL;
|
||||
const char *company = NULL;
|
||||
char host[NETWORK_HOSTNAME_LENGTH];
|
||||
uint16 rport;
|
||||
|
||||
@@ -738,7 +738,7 @@ void NetworkAddServer(const char *b)
|
||||
ttd_strlcpy(_settings_client.network.connect_to_ip, b, lengthof(_settings_client.network.connect_to_ip));
|
||||
rport = NETWORK_DEFAULT_PORT;
|
||||
|
||||
ParseConnectionString(&player, &port, host);
|
||||
ParseConnectionString(&company, &port, host);
|
||||
if (port != NULL) rport = atoi(port);
|
||||
|
||||
NetworkUDPQueryServer(host, rport, true);
|
||||
@@ -812,9 +812,9 @@ static void NetworkInitGameInfo()
|
||||
memset(ci, 0, sizeof(*ci));
|
||||
|
||||
ci->client_index = NETWORK_SERVER_INDEX;
|
||||
ci->client_playas = _network_dedicated ? PLAYER_SPECTATOR : _local_player;
|
||||
ci->client_playas = _network_dedicated ? COMPANY_SPECTATOR : _local_company;
|
||||
|
||||
ttd_strlcpy(ci->client_name, _settings_client.network.player_name, sizeof(ci->client_name));
|
||||
ttd_strlcpy(ci->client_name, _settings_client.network.client_name, sizeof(ci->client_name));
|
||||
ttd_strlcpy(ci->unique_id, _settings_client.network.network_id, sizeof(ci->unique_id));
|
||||
}
|
||||
|
||||
@@ -841,8 +841,8 @@ bool NetworkServerStart()
|
||||
_last_sync_frame = 0;
|
||||
_network_own_client_index = NETWORK_SERVER_INDEX;
|
||||
|
||||
/* Non-dedicated server will always be player #1 */
|
||||
if (!_network_dedicated) _network_playas = PLAYER_FIRST;
|
||||
/* Non-dedicated server will always be company #1 */
|
||||
if (!_network_dedicated) _network_playas = COMPANY_FIRST;
|
||||
|
||||
_network_clients_connected = 0;
|
||||
|
||||
@@ -853,8 +853,8 @@ bool NetworkServerStart()
|
||||
// if the server is dedicated ... add some other script
|
||||
if (_network_dedicated) IConsoleCmdExec("exec scripts/on_dedicated.scr 0");
|
||||
|
||||
_min_players_paused = false;
|
||||
CheckMinPlayers();
|
||||
_min_active_clients_paused = false;
|
||||
CheckMinActiveClients();
|
||||
|
||||
/* Try to register us to the master server */
|
||||
_network_last_advertise_frame = 0;
|
||||
@@ -1077,7 +1077,7 @@ void NetworkGameLoop()
|
||||
|
||||
while (f != NULL && !feof(f)) {
|
||||
if (cp != NULL && _date == next_date && _date_fract == next_date_fract) {
|
||||
_current_player = cp->player;
|
||||
_current_company = cp->company;
|
||||
_cmd_text = cp->text;
|
||||
DoCommandP(cp->tile, cp->p1, cp->p2, NULL, cp->cmd);
|
||||
free(cp);
|
||||
@@ -1090,9 +1090,9 @@ void NetworkGameLoop()
|
||||
if (fgets(buff, lengthof(buff), f) == NULL) break;
|
||||
if (strncmp(buff, "ddc:cmd:", 8) != 0) continue;
|
||||
cp = MallocT<CommandPacket>(1);
|
||||
int player;
|
||||
sscanf(&buff[8], "%d;%d;%d;%d;%d;%d;%d;%s", &next_date, &next_date_fract, &player, &cp->tile, &cp->p1, &cp->p2, &cp->cmd, cp->text);
|
||||
cp->player = (Owner)player;
|
||||
int company;
|
||||
sscanf(&buff[8], "%d;%d;%d;%d;%d;%d;%d;%s", &next_date, &next_date_fract, &company, &cp->tile, &cp->p1, &cp->p2, &cp->cmd, cp->text);
|
||||
cp->company = (CompanyID)company;
|
||||
}
|
||||
#endif /* DEBUG_DUMP_COMMANDS */
|
||||
|
||||
@@ -1238,4 +1238,4 @@ bool IsNetworkCompatibleVersion(const char *other)
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
/* NOTE: this variable needs to be always available */
|
||||
PlayerID _network_playas;
|
||||
CompanyID _network_playas;
|
||||
|
@@ -34,7 +34,7 @@ static inline void NetworkDrawChatMessage() {}
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
/** As which player do we play? */
|
||||
extern PlayerID _network_playas;
|
||||
/** As which company do we play? */
|
||||
extern CompanyID _network_playas;
|
||||
|
||||
#endif /* NETWORK_H */
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "table/strings.h"
|
||||
|
||||
/* The draw buffer must be able to contain the chat message, player name and the "[All]" message,
|
||||
/* The draw buffer must be able to contain the chat message, client name and the "[All]" message,
|
||||
* some spaces and possible translations of [All] to other languages. */
|
||||
assert_compile((int)DRAW_STRING_BUFFER >= (int)NETWORK_CHAT_LENGTH + NETWORK_NAME_LENGTH + 40);
|
||||
|
||||
@@ -99,7 +99,7 @@ void CDECL NetworkAddChatMessage(uint16 color, uint8 duration, const char *messa
|
||||
ChatMessage *cmsg = &_chatmsg_list[msg_count++];
|
||||
ttd_strlcpy(cmsg->message, bufp, sizeof(cmsg->message));
|
||||
|
||||
/* The default colour for a message is player colour. Replace this with
|
||||
/* The default colour for a message is company colour. Replace this with
|
||||
* white for any additional lines */
|
||||
cmsg->color = (bufp == buf && color & IS_PALETTE_COLOR) ? color : (0x1D - 15) | IS_PALETTE_COLOR;
|
||||
cmsg->end_date = _date + duration;
|
||||
|
@@ -77,17 +77,17 @@ static const char *GenerateCompanyPasswordHash(const char *password)
|
||||
}
|
||||
|
||||
/**
|
||||
* Hash the current company password; used when the server 'player' sets his/her password.
|
||||
* Hash the current company password; used when the server 'company' sets his/her password.
|
||||
*/
|
||||
void HashCurrentCompanyPassword()
|
||||
{
|
||||
if (StrEmpty(_network_player_info[_local_player].password)) return;
|
||||
if (StrEmpty(_network_company_info[_local_company].password)) return;
|
||||
|
||||
_password_game_seed = _settings_game.game_creation.generation_seed;
|
||||
ttd_strlcpy(_password_server_unique_id, _settings_client.network.network_id, sizeof(_password_server_unique_id));
|
||||
|
||||
const char *new_pw = GenerateCompanyPasswordHash(_network_player_info[_local_player].password);
|
||||
ttd_strlcpy(_network_player_info[_local_player].password, new_pw, sizeof(_network_player_info[_local_player].password));
|
||||
const char *new_pw = GenerateCompanyPasswordHash(_network_company_info[_local_company].password);
|
||||
ttd_strlcpy(_network_company_info[_local_company].password, new_pw, sizeof(_network_company_info[_local_company].password));
|
||||
}
|
||||
|
||||
|
||||
@@ -119,10 +119,10 @@ DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_JOIN)
|
||||
// Function: Try to join the server
|
||||
// Data:
|
||||
// String: OpenTTD Revision (norev000 if no revision)
|
||||
// String: Player Name (max NETWORK_NAME_LENGTH)
|
||||
// uint8: Play as Player id (1..MAX_PLAYERS)
|
||||
// String: Client Name (max NETWORK_NAME_LENGTH)
|
||||
// uint8: Play as Company id (1..MAX_COMPANIES)
|
||||
// uint8: Language ID
|
||||
// String: Unique id to find the player back in server-listing
|
||||
// String: Unique id to find the client back in server-listing
|
||||
//
|
||||
|
||||
Packet *p;
|
||||
@@ -131,7 +131,7 @@ DEF_CLIENT_SEND_COMMAND(PACKET_CLIENT_JOIN)
|
||||
|
||||
p = NetworkSend_Init(PACKET_CLIENT_JOIN);
|
||||
p->Send_string(_openttd_revision);
|
||||
p->Send_string(_settings_client.network.player_name); // Player name
|
||||
p->Send_string(_settings_client.network.client_name); // Client name
|
||||
p->Send_uint8 (_network_playas); // PlayAs
|
||||
p->Send_uint8 (NETLANG_ANY); // Language
|
||||
p->Send_string(_settings_client.network.network_id);
|
||||
@@ -213,7 +213,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
// Packet: CLIENT_COMMAND
|
||||
// Function: Send a DoCommand to the Server
|
||||
// Data:
|
||||
// uint8: PlayerID (0..MAX_PLAYERS-1)
|
||||
// uint8: CompanyID (0..MAX_COMPANIES-1)
|
||||
// uint32: CommandID (see command.h)
|
||||
// uint32: P1 (free variables used in DoCommand)
|
||||
// uint32: P2
|
||||
@@ -224,7 +224,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
|
||||
Packet *p = NetworkSend_Init(PACKET_CLIENT_COMMAND);
|
||||
|
||||
p->Send_uint8 (cp->player);
|
||||
p->Send_uint8 (cp->company);
|
||||
p->Send_uint32(cp->cmd);
|
||||
p->Send_uint32(cp->p1);
|
||||
p->Send_uint32(cp->p2);
|
||||
@@ -244,7 +244,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_CHAT)(NetworkAction action, DestType
|
||||
// Data:
|
||||
// uint8: ActionID (see network_data.h, NetworkAction)
|
||||
// uint8: Destination Type (see network_data.h, DestType);
|
||||
// uint16: Destination Player
|
||||
// uint16: Destination Company/Client
|
||||
// String: Message (max NETWORK_CHAT_LENGTH)
|
||||
//
|
||||
|
||||
@@ -290,7 +290,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_SET_NAME)(const char *name)
|
||||
{
|
||||
//
|
||||
// Packet: PACKET_CLIENT_SET_NAME
|
||||
// Function: Gives the player a new name
|
||||
// Function: Gives the client a new name
|
||||
// Data:
|
||||
// String: Name
|
||||
//
|
||||
@@ -359,7 +359,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMPANY_INFO)
|
||||
|
||||
if (!MY_CLIENT->has_quit && company_info_version == NETWORK_COMPANY_INFO_VERSION) {
|
||||
byte total;
|
||||
PlayerID current;
|
||||
CompanyID current;
|
||||
|
||||
total = p->Recv_uint8();
|
||||
|
||||
@@ -367,21 +367,21 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMPANY_INFO)
|
||||
if (total == 0) return NETWORK_RECV_STATUS_CLOSE_QUERY;
|
||||
|
||||
current = (Owner)p->Recv_uint8();
|
||||
if (current >= MAX_PLAYERS) return NETWORK_RECV_STATUS_CLOSE_QUERY;
|
||||
if (current >= MAX_COMPANIES) return NETWORK_RECV_STATUS_CLOSE_QUERY;
|
||||
|
||||
p->Recv_string(_network_player_info[current].company_name, sizeof(_network_player_info[current].company_name));
|
||||
_network_player_info[current].inaugurated_year = p->Recv_uint32();
|
||||
_network_player_info[current].company_value = p->Recv_uint64();
|
||||
_network_player_info[current].money = p->Recv_uint64();
|
||||
_network_player_info[current].income = p->Recv_uint64();
|
||||
_network_player_info[current].performance = p->Recv_uint16();
|
||||
_network_player_info[current].use_password = p->Recv_bool();
|
||||
p->Recv_string(_network_company_info[current].company_name, sizeof(_network_company_info[current].company_name));
|
||||
_network_company_info[current].inaugurated_year = p->Recv_uint32();
|
||||
_network_company_info[current].company_value = p->Recv_uint64();
|
||||
_network_company_info[current].money = p->Recv_uint64();
|
||||
_network_company_info[current].income = p->Recv_uint64();
|
||||
_network_company_info[current].performance = p->Recv_uint16();
|
||||
_network_company_info[current].use_password = p->Recv_bool();
|
||||
for (i = 0; i < NETWORK_VEHICLE_TYPES; i++)
|
||||
_network_player_info[current].num_vehicle[i] = p->Recv_uint16();
|
||||
_network_company_info[current].num_vehicle[i] = p->Recv_uint16();
|
||||
for (i = 0; i < NETWORK_STATION_TYPES; i++)
|
||||
_network_player_info[current].num_station[i] = p->Recv_uint16();
|
||||
_network_company_info[current].num_station[i] = p->Recv_uint16();
|
||||
|
||||
p->Recv_string(_network_player_info[current].players, sizeof(_network_player_info[current].players));
|
||||
p->Recv_string(_network_company_info[current].clients, sizeof(_network_company_info[current].clients));
|
||||
|
||||
InvalidateWindow(WC_NETWORK_WINDOW, 0);
|
||||
|
||||
@@ -398,7 +398,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO)
|
||||
{
|
||||
NetworkClientInfo *ci;
|
||||
uint16 index = p->Recv_uint16();
|
||||
PlayerID playas = (Owner)p->Recv_uint8();
|
||||
CompanyID playas = (CompanyID)p->Recv_uint8();
|
||||
char name[NETWORK_NAME_LENGTH];
|
||||
|
||||
p->Recv_string(name, sizeof(name));
|
||||
@@ -414,7 +414,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO)
|
||||
// Client name changed, display the change
|
||||
NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, "%s", name);
|
||||
} else if (playas != ci->client_playas) {
|
||||
// The player changed from client-player..
|
||||
// The client changed from client-player..
|
||||
// Do not display that for now
|
||||
}
|
||||
|
||||
@@ -451,7 +451,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR)
|
||||
/* We made an error in the protocol, and our connection is closed.... */
|
||||
case NETWORK_ERROR_NOT_AUTHORIZED:
|
||||
case NETWORK_ERROR_NOT_EXPECTED:
|
||||
case NETWORK_ERROR_PLAYER_MISMATCH:
|
||||
case NETWORK_ERROR_COMPANY_MISMATCH:
|
||||
_switch_mode_errorstr = STR_NETWORK_ERR_SERVER_ERROR;
|
||||
break;
|
||||
case NETWORK_ERROR_FULL:
|
||||
@@ -622,21 +622,21 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_MAP)
|
||||
// Say we received the map and loaded it correctly!
|
||||
SEND_COMMAND(PACKET_CLIENT_MAP_OK)();
|
||||
|
||||
/* New company/spectator (invalid player) or company we want to join is not active
|
||||
* Switch local player to spectator and await the server's judgement */
|
||||
if (_network_playas == PLAYER_NEW_COMPANY || !IsValidPlayerID(_network_playas)) {
|
||||
SetLocalPlayer(PLAYER_SPECTATOR);
|
||||
/* New company/spectator (invalid company) or company we want to join is not active
|
||||
* Switch local company to spectator and await the server's judgement */
|
||||
if (_network_playas == COMPANY_NEW_COMPANY || !IsValidCompanyID(_network_playas)) {
|
||||
SetLocalCompany(COMPANY_SPECTATOR);
|
||||
|
||||
if (_network_playas != PLAYER_SPECTATOR) {
|
||||
/* We have arrived and ready to start playing; send a command to make a new player;
|
||||
if (_network_playas != COMPANY_SPECTATOR) {
|
||||
/* We have arrived and ready to start playing; send a command to make a new company;
|
||||
* the server will give us a client-id and let us in */
|
||||
_network_join_status = NETWORK_JOIN_STATUS_REGISTERING;
|
||||
ShowJoinStatusWindow();
|
||||
NetworkSend_Command(0, 0, 0, CMD_PLAYER_CTRL, NULL);
|
||||
NetworkSend_Command(0, 0, 0, CMD_COMPANY_CTRL, NULL);
|
||||
}
|
||||
} else {
|
||||
// take control over an existing company
|
||||
SetLocalPlayer(_network_playas);
|
||||
SetLocalCompany(_network_playas);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -685,7 +685,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
|
||||
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
|
||||
{
|
||||
CommandPacket *cp = MallocT<CommandPacket>(1);
|
||||
cp->player = (PlayerID)p->Recv_uint8();
|
||||
cp->company = (CompanyID)p->Recv_uint8();
|
||||
cp->cmd = p->Recv_uint32();
|
||||
cp->p1 = p->Recv_uint32();
|
||||
cp->p2 = p->Recv_uint32();
|
||||
@@ -733,12 +733,12 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)
|
||||
ci = NetworkFindClientInfoFromIndex(_network_own_client_index);
|
||||
break;
|
||||
|
||||
/* For speaking to company or giving money, we need the player-name */
|
||||
/* For speaking to company or giving money, we need the company-name */
|
||||
case NETWORK_ACTION_GIVE_MONEY:
|
||||
if (!IsValidPlayerID(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY;
|
||||
if (!IsValidCompanyID(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY;
|
||||
/* fallthrough */
|
||||
case NETWORK_ACTION_CHAT_COMPANY: {
|
||||
StringID str = IsValidPlayerID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS;
|
||||
StringID str = IsValidCompanyID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS;
|
||||
SetDParam(0, ci_to->client_playas);
|
||||
|
||||
GetString(name, str, lastof(name));
|
||||
@@ -754,7 +754,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)
|
||||
}
|
||||
|
||||
if (ci != NULL)
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci->client_playas), self_send, name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci->client_playas), self_send, name, "%s", msg);
|
||||
return NETWORK_RECV_STATUS_OKAY;
|
||||
}
|
||||
|
||||
@@ -831,10 +831,10 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SHUTDOWN)
|
||||
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEWGAME)
|
||||
{
|
||||
// To trottle the reconnects a bit, every clients waits
|
||||
// his _local_player value before reconnecting
|
||||
// PLAYER_SPECTATOR is currently 255, so to avoid long wait periods
|
||||
// his _local_company value before reconnecting
|
||||
// COMPANY_SPECTATOR is currently 255, so to avoid long wait periods
|
||||
// set the max to 10.
|
||||
_network_reconnect = min(_local_player + 1, 10);
|
||||
_network_reconnect = min(_local_company + 1, 10);
|
||||
_switch_mode_errorstr = STR_NETWORK_SERVER_REBOOT;
|
||||
|
||||
return NETWORK_RECV_STATUS_SERVER_ERROR;
|
||||
@@ -938,20 +938,20 @@ void NetworkClientSendRcon(const char *password, const char *command)
|
||||
SEND_COMMAND(PACKET_CLIENT_RCON)(password, command);
|
||||
}
|
||||
|
||||
void NetworkUpdatePlayerName()
|
||||
void NetworkUpdateClientName()
|
||||
{
|
||||
NetworkClientInfo *ci = NetworkFindClientInfoFromIndex(_network_own_client_index);
|
||||
|
||||
if (ci == NULL) return;
|
||||
|
||||
/* Don't change the name if it is the same as the old name */
|
||||
if (strcmp(ci->client_name, _settings_client.network.player_name) != 0) {
|
||||
if (strcmp(ci->client_name, _settings_client.network.client_name) != 0) {
|
||||
if (!_network_server) {
|
||||
SEND_COMMAND(PACKET_CLIENT_SET_NAME)(_settings_client.network.player_name);
|
||||
SEND_COMMAND(PACKET_CLIENT_SET_NAME)(_settings_client.network.client_name);
|
||||
} else {
|
||||
if (NetworkFindName(_settings_client.network.player_name)) {
|
||||
NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, "%s", _settings_client.network.player_name);
|
||||
ttd_strlcpy(ci->client_name, _settings_client.network.player_name, sizeof(ci->client_name));
|
||||
if (NetworkFindName(_settings_client.network.client_name)) {
|
||||
NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, "%s", _settings_client.network.client_name);
|
||||
ttd_strlcpy(ci->client_name, _settings_client.network.client_name, sizeof(ci->client_name));
|
||||
NetworkUpdateClientInfo(NETWORK_SERVER_INDEX);
|
||||
}
|
||||
}
|
||||
@@ -965,7 +965,7 @@ void NetworkClientSendChat(NetworkAction action, DestType type, int dest, const
|
||||
|
||||
void NetworkClientSetPassword()
|
||||
{
|
||||
SEND_COMMAND(PACKET_CLIENT_SET_PASSWORD)(_network_player_info[_local_player].password);
|
||||
SEND_COMMAND(PACKET_CLIENT_SET_PASSWORD)(_network_company_info[_local_company].password);
|
||||
}
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
@@ -36,12 +36,12 @@ void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comma
|
||||
{
|
||||
CommandPacket c;
|
||||
|
||||
c.player = _local_player;
|
||||
c.next = NULL;
|
||||
c.tile = tile;
|
||||
c.p1 = p1;
|
||||
c.p2 = p2;
|
||||
c.cmd = cmd;
|
||||
c.company = _local_company;
|
||||
c.next = NULL;
|
||||
c.tile = tile;
|
||||
c.p1 = p1;
|
||||
c.p2 = p2;
|
||||
c.cmd = cmd;
|
||||
|
||||
c.callback = 0;
|
||||
while (c.callback < _callback_table_count && _callback_table[c.callback] != callback) {
|
||||
@@ -95,7 +95,7 @@ void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comma
|
||||
// Execute a DoCommand we received from the network
|
||||
void NetworkExecuteCommand(CommandPacket *cp)
|
||||
{
|
||||
_current_player = cp->player;
|
||||
_current_company = cp->company;
|
||||
_cmd_text = cp->text;
|
||||
/* cp->callback is unsigned. so we don't need to do lower bounds checking. */
|
||||
if (cp->callback > _callback_table_count) {
|
||||
@@ -103,7 +103,7 @@ void NetworkExecuteCommand(CommandPacket *cp)
|
||||
cp->callback = 0;
|
||||
}
|
||||
|
||||
DebugDumpCommands("ddc:cmd:%d;%d;%d;%d;%d;%d;%d;%s\n", _date, _date_fract, (int)cp->player, cp->tile, cp->p1, cp->p2, cp->cmd, cp->text);
|
||||
DebugDumpCommands("ddc:cmd:%d;%d;%d;%d;%d;%d;%d;%s\n", _date, _date_fract, (int)cp->company, cp->tile, cp->p1, cp->p2, cp->cmd, cp->text);
|
||||
|
||||
DoCommandP(cp->tile, cp->p1, cp->p2, _callback_table[cp->callback], cp->cmd | CMD_NETWORK_COMMAND, cp->my_cmd);
|
||||
}
|
||||
|
@@ -11,7 +11,7 @@
|
||||
#include "../console_type.h"
|
||||
|
||||
extern NetworkServerGameInfo _network_game_info;
|
||||
extern NetworkPlayerInfo _network_player_info[MAX_PLAYERS];
|
||||
extern NetworkCompanyInfo _network_company_info[MAX_COMPANIES];
|
||||
extern NetworkClientInfo _network_client_info[MAX_CLIENT_INFO];
|
||||
|
||||
extern uint16 _network_own_client_index;
|
||||
@@ -23,16 +23,16 @@ extern char *_network_host_list[10];
|
||||
extern char *_network_ban_list[25];
|
||||
|
||||
byte NetworkSpectatorCount();
|
||||
void CheckMinPlayers();
|
||||
void NetworkUpdatePlayerName();
|
||||
bool NetworkCompanyHasPlayers(PlayerID company);
|
||||
void CheckMinActiveClients();
|
||||
void NetworkUpdateClientName();
|
||||
bool NetworkCompanyHasClients(CompanyID company);
|
||||
bool NetworkChangeCompanyPassword(byte argc, char *argv[]);
|
||||
void NetworkReboot();
|
||||
void NetworkDisconnect();
|
||||
void NetworkGameLoop();
|
||||
void NetworkUDPGameLoop();
|
||||
void NetworkUDPCloseAll();
|
||||
void ParseConnectionString(const char **player, const char **port, char *connection_string);
|
||||
void ParseConnectionString(const char **company, const char **port, char *connection_string);
|
||||
void NetworkStartDebugLog(const char *hostname, uint16 port);
|
||||
void NetworkPopulateCompanyInfo();
|
||||
|
||||
@@ -45,13 +45,13 @@ void NetworkClientSetPassword();
|
||||
/*** Commands ran by the server ***/
|
||||
void NetworkServerMonthlyLoop();
|
||||
void NetworkServerYearlyLoop();
|
||||
void NetworkServerChangeOwner(PlayerID current_player, PlayerID new_player);
|
||||
void NetworkServerChangeOwner(Owner current_owner, Owner new_owner);
|
||||
void NetworkServerShowStatusToConsole();
|
||||
bool NetworkServerStart();
|
||||
|
||||
NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index);
|
||||
NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip);
|
||||
const char* GetPlayerIP(const NetworkClientInfo *ci);
|
||||
const char* GetClientIP(const NetworkClientInfo *ci);
|
||||
|
||||
void NetworkServerSendRcon(uint16 client_index, ConsoleColour colour_code, const char *string);
|
||||
void NetworkServerSendError(uint16 client_index, NetworkErrorCode error);
|
||||
|
@@ -87,7 +87,7 @@ enum NetworkGameWindowWidgets {
|
||||
|
||||
NGWW_CONNECTION, ///< Label in from of connection droplist
|
||||
NGWW_CONN_BTN, ///< 'Connection' droplist button
|
||||
NGWW_PLAYER, ///< Panel with editbox to set player name
|
||||
NGWW_CLIENT, ///< Panel with editbox to set client name
|
||||
|
||||
NGWW_NAME, ///< 'Name' button
|
||||
NGWW_CLIENTS, ///< 'Clients' button
|
||||
@@ -286,7 +286,7 @@ protected:
|
||||
public:
|
||||
NetworkGameWindow(const WindowDesc *desc) : QueryStringBaseWindow(NETWORK_NAME_LENGTH, desc)
|
||||
{
|
||||
ttd_strlcpy(this->edit_str_buf, _settings_client.network.player_name, this->edit_str_size);
|
||||
ttd_strlcpy(this->edit_str_buf, _settings_client.network.client_name, this->edit_str_size);
|
||||
this->afilter = CS_ALPHANUMERAL;
|
||||
InitializeTextBuffer(&this->text, this->edit_str_buf, this->edit_str_size, 120);
|
||||
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
this->vscroll.cap = 11;
|
||||
this->resize.step_height = NET_PRC__SIZE_OF_ROW;
|
||||
|
||||
this->field = NGWW_PLAYER;
|
||||
this->field = NGWW_CLIENT;
|
||||
this->server = NULL;
|
||||
|
||||
this->servers.SetListing(this->last_sorting);
|
||||
@@ -339,10 +339,10 @@ public:
|
||||
SetDParam(1, _lan_internet_types_dropdown[_settings_client.network.lan_internet]);
|
||||
this->DrawWidgets();
|
||||
|
||||
/* Edit box to set player name */
|
||||
this->DrawEditBox(NGWW_PLAYER);
|
||||
/* Edit box to set client name */
|
||||
this->DrawEditBox(NGWW_CLIENT);
|
||||
|
||||
DrawString(this->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
|
||||
DrawString(this->widget[NGWW_CLIENT].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
|
||||
|
||||
/* Sort based on widgets: name, clients, compatibility */
|
||||
switch (this->servers.SortType()) {
|
||||
@@ -446,8 +446,8 @@ public:
|
||||
{
|
||||
this->field = widget;
|
||||
switch (widget) {
|
||||
case NGWW_PLAYER:
|
||||
ShowOnScreenKeyboard(this, NGWW_PLAYER, 0, 0);
|
||||
case NGWW_CLIENT:
|
||||
ShowOnScreenKeyboard(this, NGWW_CLIENT, 0, 0);
|
||||
break;
|
||||
|
||||
case NGWW_CANCEL: // Cancel button
|
||||
@@ -554,7 +554,7 @@ public:
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
if (this->field == NGWW_PLAYER) this->HandleEditBox(NGWW_PLAYER);
|
||||
if (this->field == NGWW_CLIENT) this->HandleEditBox(NGWW_CLIENT);
|
||||
}
|
||||
|
||||
virtual void OnInvalidateData(int data)
|
||||
@@ -567,7 +567,7 @@ public:
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
{
|
||||
EventState state = ES_NOT_HANDLED;
|
||||
if (this->field != NGWW_PLAYER) {
|
||||
if (this->field != NGWW_CLIENT) {
|
||||
if (this->server != NULL) {
|
||||
if (keycode == WKC_DELETE) { // Press 'delete' to remove servers
|
||||
NetworkGameListRemoveItem(this->server);
|
||||
@@ -578,13 +578,13 @@ public:
|
||||
return state;
|
||||
}
|
||||
|
||||
if (this->HandleEditBoxKey(NGWW_PLAYER, key, keycode, state) == 1) return state; // enter pressed
|
||||
if (this->HandleEditBoxKey(NGWW_CLIENT, key, keycode, state) == 1) return state; // enter pressed
|
||||
|
||||
/* The name is only allowed when it starts with a letter! */
|
||||
if (!StrEmpty(this->edit_str_buf) && this->edit_str_buf[0] != ' ') {
|
||||
ttd_strlcpy(_settings_client.network.player_name, this->edit_str_buf, lengthof(_settings_client.network.player_name));
|
||||
ttd_strlcpy(_settings_client.network.client_name, this->edit_str_buf, lengthof(_settings_client.network.client_name));
|
||||
} else {
|
||||
ttd_strlcpy(_settings_client.network.player_name, "Player", lengthof(_settings_client.network.player_name));
|
||||
ttd_strlcpy(_settings_client.network.client_name, "Player", lengthof(_settings_client.network.client_name));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
@@ -670,7 +670,7 @@ static const Widget _network_game_window_widgets[] = {
|
||||
{ WWT_TEXT, RESIZE_NONE, COLOUR_LIGHT_BLUE, 9, 85, 23, 35, STR_NETWORK_CONNECTION, STR_NULL}, // NGWW_CONNECTION
|
||||
{ WWT_DROPDOWNIN, RESIZE_NONE, COLOUR_LIGHT_BLUE, 90, 181, 22, 33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NGWW_CONN_BTN
|
||||
|
||||
{ WWT_EDITBOX, RESIZE_LR, COLOUR_LIGHT_BLUE, 290, 440, 22, 33, STR_NETWORK_PLAYER_NAME_OSKTITLE, STR_NETWORK_ENTER_NAME_TIP}, // NGWW_PLAYER
|
||||
{ WWT_EDITBOX, RESIZE_LR, COLOUR_LIGHT_BLUE, 290, 440, 22, 33, STR_NETWORK_PLAYER_NAME_OSKTITLE, STR_NETWORK_ENTER_NAME_TIP}, // NGWW_CLIENT
|
||||
|
||||
/* LEFT SIDE */
|
||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_WHITE, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, // NGWW_NAME
|
||||
@@ -864,7 +864,7 @@ struct NetworkStartServerWindow : public QueryStringBaseWindow {
|
||||
_settings_client.network.max_clients = Clamp(_settings_client.network.max_clients + widget - NSSW_CLIENTS_TXT, 2, MAX_CLIENTS);
|
||||
break;
|
||||
case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
|
||||
_settings_client.network.max_companies = Clamp(_settings_client.network.max_companies + widget - NSSW_COMPANIES_TXT, 1, MAX_PLAYERS);
|
||||
_settings_client.network.max_companies = Clamp(_settings_client.network.max_companies + widget - NSSW_COMPANIES_TXT, 1, MAX_COMPANIES);
|
||||
break;
|
||||
case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
|
||||
_settings_client.network.max_spectators = Clamp(_settings_client.network.max_spectators + widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
|
||||
@@ -874,7 +874,7 @@ struct NetworkStartServerWindow : public QueryStringBaseWindow {
|
||||
_left_button_clicked = false;
|
||||
break;
|
||||
|
||||
case NSSW_CLIENTS_TXT: // Click on number of players
|
||||
case NSSW_CLIENTS_TXT: // Click on number of clients
|
||||
this->widget_id = NSSW_CLIENTS_TXT;
|
||||
SetDParam(0, _settings_client.network.max_clients);
|
||||
ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, this, CS_NUMERAL, QSF_NONE);
|
||||
@@ -977,7 +977,7 @@ struct NetworkStartServerWindow : public QueryStringBaseWindow {
|
||||
switch (this->widget_id) {
|
||||
default: NOT_REACHED();
|
||||
case NSSW_CLIENTS_TXT: _settings_client.network.max_clients = Clamp(value, 2, MAX_CLIENTS); break;
|
||||
case NSSW_COMPANIES_TXT: _settings_client.network.max_companies = Clamp(value, 1, MAX_PLAYERS); break;
|
||||
case NSSW_COMPANIES_TXT: _settings_client.network.max_companies = Clamp(value, 1, MAX_COMPANIES); break;
|
||||
case NSSW_SPECTATORS_TXT: _settings_client.network.max_spectators = Clamp(value, 0, MAX_CLIENTS); break;
|
||||
}
|
||||
}
|
||||
@@ -1046,16 +1046,16 @@ static void ShowNetworkStartServerWindow()
|
||||
new NetworkStartServerWindow(&_network_start_server_window_desc);
|
||||
}
|
||||
|
||||
static PlayerID NetworkLobbyFindCompanyIndex(byte pos)
|
||||
static CompanyID NetworkLobbyFindCompanyIndex(byte pos)
|
||||
{
|
||||
/* Scroll through all _network_player_info and get the 'pos' item that is not empty */
|
||||
for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
|
||||
if (_network_player_info[i].company_name[0] != '\0') {
|
||||
/* Scroll through all _network_company_info and get the 'pos' item that is not empty */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
if (!StrEmpty(_network_company_info[i].company_name)) {
|
||||
if (pos-- == 0) return i;
|
||||
}
|
||||
}
|
||||
|
||||
return PLAYER_FIRST;
|
||||
return COMPANY_FIRST;
|
||||
}
|
||||
|
||||
/** Enum for NetworkLobbyWindow, referring to _network_lobby_window_widgets */
|
||||
@@ -1071,11 +1071,11 @@ enum NetworkLobbyWindowWidgets {
|
||||
};
|
||||
|
||||
struct NetworkLobbyWindow : public Window {
|
||||
PlayerID company; ///< Select company
|
||||
CompanyID company; ///< Select company
|
||||
NetworkGameList *server; ///< Selected server
|
||||
|
||||
NetworkLobbyWindow(const WindowDesc *desc, NetworkGameList *ngl) :
|
||||
Window(desc), company(INVALID_PLAYER), server(ngl)
|
||||
Window(desc), company(INVALID_COMPANY), server(ngl)
|
||||
{
|
||||
this->vscroll.cap = 10;
|
||||
|
||||
@@ -1088,7 +1088,7 @@ struct NetworkLobbyWindow : public Window {
|
||||
int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
|
||||
|
||||
/* Join button is disabled when no company is selected */
|
||||
this->SetWidgetDisabledState(NLWW_JOIN, this->company == INVALID_PLAYER);
|
||||
this->SetWidgetDisabledState(NLWW_JOIN, this->company == INVALID_COMPANY);
|
||||
/* Cannot start new company if there are too many */
|
||||
this->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
|
||||
/* Cannot spectate if there are too many spectators */
|
||||
@@ -1107,11 +1107,11 @@ struct NetworkLobbyWindow : public Window {
|
||||
GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
|
||||
}
|
||||
|
||||
DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
|
||||
if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
|
||||
DoDrawStringTruncated(_network_company_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
|
||||
if (_network_company_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
|
||||
|
||||
/* If the company's income was positive puts a green dot else a red dot */
|
||||
if (_network_player_info[company].income >= 0) income = true;
|
||||
if (_network_company_info[company].income >= 0) income = true;
|
||||
DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
|
||||
|
||||
pos++;
|
||||
@@ -1122,7 +1122,7 @@ struct NetworkLobbyWindow : public Window {
|
||||
/* Draw info about selected company when it is selected in the left window */
|
||||
GfxFillRect(174, 39, 403, 75, 157);
|
||||
DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
|
||||
if (this->company != INVALID_PLAYER) {
|
||||
if (this->company != INVALID_COMPANY) {
|
||||
const uint x = 183;
|
||||
const uint trunc_width = this->widget[NLWW_DETAILS].right - x;
|
||||
y = 80;
|
||||
@@ -1134,47 +1134,47 @@ struct NetworkLobbyWindow : public Window {
|
||||
DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
|
||||
y += 10;
|
||||
|
||||
SetDParamStr(0, _network_player_info[this->company].company_name);
|
||||
SetDParamStr(0, _network_company_info[this->company].company_name);
|
||||
DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].inaugurated_year);
|
||||
SetDParam(0, _network_company_info[this->company].inaugurated_year);
|
||||
DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].company_value);
|
||||
SetDParam(0, _network_company_info[this->company].company_value);
|
||||
DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].money);
|
||||
SetDParam(0, _network_company_info[this->company].money);
|
||||
DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].income);
|
||||
SetDParam(0, _network_company_info[this->company].income);
|
||||
DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].performance);
|
||||
SetDParam(0, _network_company_info[this->company].performance);
|
||||
DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].num_vehicle[0]);
|
||||
SetDParam(1, _network_player_info[this->company].num_vehicle[1]);
|
||||
SetDParam(2, _network_player_info[this->company].num_vehicle[2]);
|
||||
SetDParam(3, _network_player_info[this->company].num_vehicle[3]);
|
||||
SetDParam(4, _network_player_info[this->company].num_vehicle[4]);
|
||||
SetDParam(0, _network_company_info[this->company].num_vehicle[0]);
|
||||
SetDParam(1, _network_company_info[this->company].num_vehicle[1]);
|
||||
SetDParam(2, _network_company_info[this->company].num_vehicle[2]);
|
||||
SetDParam(3, _network_company_info[this->company].num_vehicle[3]);
|
||||
SetDParam(4, _network_company_info[this->company].num_vehicle[4]);
|
||||
DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, _network_player_info[this->company].num_station[0]);
|
||||
SetDParam(1, _network_player_info[this->company].num_station[1]);
|
||||
SetDParam(2, _network_player_info[this->company].num_station[2]);
|
||||
SetDParam(3, _network_player_info[this->company].num_station[3]);
|
||||
SetDParam(4, _network_player_info[this->company].num_station[4]);
|
||||
SetDParam(0, _network_company_info[this->company].num_station[0]);
|
||||
SetDParam(1, _network_company_info[this->company].num_station[1]);
|
||||
SetDParam(2, _network_company_info[this->company].num_station[2]);
|
||||
SetDParam(3, _network_company_info[this->company].num_station[3]);
|
||||
SetDParam(4, _network_company_info[this->company].num_station[4]);
|
||||
DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
|
||||
y += 10;
|
||||
|
||||
SetDParamStr(0, _network_player_info[this->company].players);
|
||||
SetDParamStr(0, _network_company_info[this->company].clients);
|
||||
DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
|
||||
}
|
||||
}
|
||||
@@ -1193,7 +1193,7 @@ struct NetworkLobbyWindow : public Window {
|
||||
if (id_v >= this->vscroll.cap) break;
|
||||
|
||||
id_v += this->vscroll.pos;
|
||||
this->company = (id_v >= this->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
|
||||
this->company = (id_v >= this->server->info.companies_on) ? INVALID_COMPANY : NetworkLobbyFindCompanyIndex(id_v);
|
||||
this->SetDirty();
|
||||
} break;
|
||||
|
||||
@@ -1204,12 +1204,12 @@ struct NetworkLobbyWindow : public Window {
|
||||
break;
|
||||
|
||||
case NLWW_NEW: // New company
|
||||
_network_playas = PLAYER_NEW_COMPANY;
|
||||
_network_playas = COMPANY_NEW_COMPANY;
|
||||
NetworkClientConnectGame(_settings_client.network.last_host, _settings_client.network.last_port);
|
||||
break;
|
||||
|
||||
case NLWW_SPECTATE: // Spectate game
|
||||
_network_playas = PLAYER_SPECTATOR;
|
||||
_network_playas = COMPANY_SPECTATOR;
|
||||
NetworkClientConnectGame(_settings_client.network.last_host, _settings_client.network.last_port);
|
||||
break;
|
||||
|
||||
@@ -1240,7 +1240,7 @@ static const Widget _network_lobby_window_widgets[] = {
|
||||
{ WWT_MATRIX, RESIZE_NONE, COLOUR_LIGHT_BLUE, 10, 155, 50, 190, (10 << 8) + 1, STR_NETWORK_COMPANY_LIST_TIP}, // NLWW_MATRIX
|
||||
{ WWT_SCROLLBAR, RESIZE_NONE, COLOUR_LIGHT_BLUE, 156, 167, 38, 190, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
|
||||
|
||||
/* company/player info */
|
||||
/* company info */
|
||||
{ WWT_PANEL, RESIZE_NONE, COLOUR_LIGHT_BLUE, 173, 404, 38, 190, 0x0, STR_NULL}, // NLWW_DETAILS
|
||||
|
||||
/* buttons */
|
||||
@@ -1276,7 +1276,7 @@ static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
|
||||
// and also makes able to give money to them, kick them (if server)
|
||||
// and stuff like that.
|
||||
|
||||
extern void DrawPlayerIcon(PlayerID pid, int x, int y);
|
||||
extern void DrawCompanyIcon(CompanyID cid, int x, int y);
|
||||
|
||||
// Every action must be of this form
|
||||
typedef void ClientList_Action_Proc(byte client_no);
|
||||
@@ -1326,7 +1326,7 @@ static const NetworkClientInfo *NetworkFindClientInfo(byte client_no)
|
||||
// Here we start to define the options out of the menu
|
||||
static void ClientList_Kick(byte client_no)
|
||||
{
|
||||
if (client_no < MAX_PLAYERS)
|
||||
if (client_no < MAX_COMPANIES)
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(DEREF_CLIENT(client_no), NETWORK_ERROR_KICKED);
|
||||
}
|
||||
|
||||
@@ -1341,7 +1341,7 @@ static void ClientList_Ban(byte client_no)
|
||||
}
|
||||
}
|
||||
|
||||
if (client_no < MAX_PLAYERS) {
|
||||
if (client_no < MAX_COMPANIES) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(DEREF_CLIENT(client_no), NETWORK_ERROR_KICKED);
|
||||
}
|
||||
}
|
||||
@@ -1402,7 +1402,7 @@ struct NetworkClientListPopupWindow : Window {
|
||||
this->proc[i++] = &ClientList_SpeakToClient;
|
||||
}
|
||||
|
||||
if (IsValidPlayerID(ci->client_playas) || ci->client_playas == PLAYER_SPECTATOR) {
|
||||
if (IsValidCompanyID(ci->client_playas) || ci->client_playas == COMPANY_SPECTATOR) {
|
||||
GetString(this->action[i], STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY, lastof(this->action[i]));
|
||||
this->proc[i++] = &ClientList_SpeakToCompany;
|
||||
}
|
||||
@@ -1410,8 +1410,8 @@ struct NetworkClientListPopupWindow : Window {
|
||||
this->proc[i++] = &ClientList_SpeakToAll;
|
||||
|
||||
if (_network_own_client_index != ci->client_index) {
|
||||
/* We are no spectator and the player we want to give money to is no spectator and money gifts are allowed */
|
||||
if (IsValidPlayerID(_network_playas) && IsValidPlayerID(ci->client_playas) && _settings_game.economy.give_money) {
|
||||
/* We are no spectator and the company we want to give money to is no spectator and money gifts are allowed */
|
||||
if (IsValidCompanyID(_network_playas) && IsValidCompanyID(ci->client_playas) && _settings_game.economy.give_money) {
|
||||
GetString(this->action[i], STR_NETWORK_CLIENTLIST_GIVE_MONEY, lastof(this->action[i]));
|
||||
this->proc[i++] = &ClientList_GiveMoney;
|
||||
}
|
||||
@@ -1600,7 +1600,7 @@ struct NetworkClientListWindow : Window
|
||||
}
|
||||
|
||||
/* Filter out spectators */
|
||||
if (IsValidPlayerID(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1);
|
||||
if (IsValidCompanyID(ci->client_playas)) DrawCompanyIcon(ci->client_playas, 64, y + 1);
|
||||
|
||||
DoDrawString(ci->client_name, 81, y, colour);
|
||||
|
||||
|
@@ -11,7 +11,7 @@
|
||||
#include "network_type.h"
|
||||
|
||||
void ShowNetworkNeedPassword(NetworkPasswordType npt);
|
||||
void ShowNetworkGiveMoneyWindow(PlayerID player); // PlayerID
|
||||
void ShowNetworkGiveMoneyWindow(CompanyID company);
|
||||
void ShowNetworkChatQueryWindow(DestType type, int dest);
|
||||
void ShowJoinStatusWindow();
|
||||
void ShowNetworkGameWindow();
|
||||
|
@@ -91,7 +91,7 @@ enum NetworkLanguage {
|
||||
NETLANG_COUNT
|
||||
};
|
||||
|
||||
extern NetworkPlayerInfo _network_player_info[MAX_PLAYERS];
|
||||
extern NetworkCompanyInfo _network_company_info[MAX_COMPANIES];
|
||||
|
||||
extern uint32 _frame_counter_server; // The frame_counter of the server, if in network-mode
|
||||
extern uint32 _frame_counter_max; // To where we may go with our clients
|
||||
|
@@ -47,7 +47,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CLIENT_INFO)(NetworkTCPSocketHandler
|
||||
// Function: Sends info about a client
|
||||
// Data:
|
||||
// uint16: The index of the client (always unique on a server. 1 = server)
|
||||
// uint8: As which player the client is playing
|
||||
// uint8: As which company the client is playing
|
||||
// String: The name of the client
|
||||
//
|
||||
|
||||
@@ -71,10 +71,10 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
|
||||
|
||||
int i;
|
||||
|
||||
Player *player;
|
||||
Company *company;
|
||||
Packet *p;
|
||||
|
||||
byte active = ActivePlayerCount();
|
||||
byte active = ActiveCompanyCount();
|
||||
|
||||
if (active == 0) {
|
||||
p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
|
||||
@@ -88,35 +88,35 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
|
||||
|
||||
NetworkPopulateCompanyInfo();
|
||||
|
||||
FOR_ALL_PLAYERS(player) {
|
||||
FOR_ALL_COMPANIES(company) {
|
||||
p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
|
||||
|
||||
p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
|
||||
p->Send_uint8 (active);
|
||||
p->Send_uint8 (player->index);
|
||||
p->Send_uint8 (company->index);
|
||||
|
||||
p->Send_string(_network_player_info[player->index].company_name);
|
||||
p->Send_uint32(_network_player_info[player->index].inaugurated_year);
|
||||
p->Send_uint64(_network_player_info[player->index].company_value);
|
||||
p->Send_uint64(_network_player_info[player->index].money);
|
||||
p->Send_uint64(_network_player_info[player->index].income);
|
||||
p->Send_uint16(_network_player_info[player->index].performance);
|
||||
p->Send_string(_network_company_info[company->index].company_name);
|
||||
p->Send_uint32(_network_company_info[company->index].inaugurated_year);
|
||||
p->Send_uint64(_network_company_info[company->index].company_value);
|
||||
p->Send_uint64(_network_company_info[company->index].money);
|
||||
p->Send_uint64(_network_company_info[company->index].income);
|
||||
p->Send_uint16(_network_company_info[company->index].performance);
|
||||
|
||||
/* Send 1 if there is a passord for the company else send 0 */
|
||||
p->Send_bool(!StrEmpty(_network_player_info[player->index].password));
|
||||
p->Send_bool(!StrEmpty(_network_company_info[company->index].password));
|
||||
|
||||
for (i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
|
||||
p->Send_uint16(_network_player_info[player->index].num_vehicle[i]);
|
||||
p->Send_uint16(_network_company_info[company->index].num_vehicle[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i < NETWORK_STATION_TYPES; i++) {
|
||||
p->Send_uint16(_network_player_info[player->index].num_station[i]);
|
||||
p->Send_uint16(_network_company_info[company->index].num_station[i]);
|
||||
}
|
||||
|
||||
if (_network_player_info[player->index].players[0] == '\0') {
|
||||
if (StrEmpty(_network_company_info[company->index].clients)) {
|
||||
p->Send_string("<none>");
|
||||
} else {
|
||||
p->Send_string(_network_player_info[player->index].players);
|
||||
p->Send_string(_network_company_info[company->index].clients);
|
||||
}
|
||||
|
||||
cs->Send_Packet(p);
|
||||
@@ -276,7 +276,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WAIT)
|
||||
NetworkTCPSocketHandler *new_cs;
|
||||
Packet *p;
|
||||
|
||||
// Count how many players are waiting in the queue
|
||||
// Count how many clients are waiting in the queue
|
||||
FOR_ALL_CLIENTS(new_cs) {
|
||||
if (new_cs->status == STATUS_MAP_WAIT) waiting++;
|
||||
}
|
||||
@@ -300,9 +300,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
|
||||
// if MAP_PACKET_NORMAL:
|
||||
// piece of the map (till max-size of packet)
|
||||
// if MAP_PACKET_END:
|
||||
// uint32: seed0 of player
|
||||
// uint32: seed1 of player
|
||||
// last 2 are repeated MAX_PLAYERS time
|
||||
// nothing
|
||||
//
|
||||
|
||||
static FILE *file_pointer;
|
||||
@@ -476,7 +474,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs
|
||||
// Packet: SERVER_COMMAND
|
||||
// Function: Sends a DoCommand to the client
|
||||
// Data:
|
||||
// uint8: PlayerID (0..MAX_PLAYERS-1)
|
||||
// uint8: CompanyID (0..MAX_COMPANIES-1)
|
||||
// uint32: CommandID (see command.h)
|
||||
// uint32: P1 (free variables used in DoCommand)
|
||||
// uint32: P2
|
||||
@@ -488,7 +486,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs
|
||||
|
||||
Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
|
||||
|
||||
p->Send_uint8 (cp->player);
|
||||
p->Send_uint8 (cp->company);
|
||||
p->Send_uint32(cp->cmd);
|
||||
p->Send_uint32(cp->p1);
|
||||
p->Send_uint32(cp->p2);
|
||||
@@ -619,7 +617,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)
|
||||
if (!StrEmpty(_settings_client.network.server_password)) {
|
||||
SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_GAME_PASSWORD);
|
||||
} else {
|
||||
if (IsValidPlayerID(ci->client_playas) && _network_player_info[ci->client_playas].password[0] != '\0') {
|
||||
if (IsValidCompanyID(ci->client_playas) && _network_company_info[ci->client_playas].password[0] != '\0') {
|
||||
SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD);
|
||||
} else {
|
||||
SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
|
||||
@@ -638,7 +636,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
|
||||
char name[NETWORK_CLIENT_NAME_LENGTH];
|
||||
char unique_id[NETWORK_UNIQUE_ID_LENGTH];
|
||||
NetworkClientInfo *ci;
|
||||
PlayerID playas;
|
||||
CompanyID playas;
|
||||
NetworkLanguage client_lang;
|
||||
char client_revision[NETWORK_REVISION_LENGTH];
|
||||
|
||||
@@ -660,31 +658,31 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
|
||||
|
||||
// join another company does not affect these values
|
||||
switch (playas) {
|
||||
case PLAYER_NEW_COMPANY: /* New company */
|
||||
if (ActivePlayerCount() >= _settings_client.network.max_companies) {
|
||||
case COMPANY_NEW_COMPANY: /* New company */
|
||||
if (ActiveCompanyCount() >= _settings_client.network.max_companies) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case PLAYER_SPECTATOR: /* Spectator */
|
||||
case COMPANY_SPECTATOR: /* Spectator */
|
||||
if (NetworkSpectatorCount() >= _settings_client.network.max_spectators) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default: /* Join another company (companies 1-8 (index 0-7)) */
|
||||
if (!IsValidPlayerID(playas)) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH);
|
||||
if (!IsValidCompanyID(playas)) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_COMPANY_MISMATCH);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// We need a valid name.. make it Player
|
||||
if (*name == '\0') ttd_strlcpy(name, "Player", sizeof(name));
|
||||
if (StrEmpty(name)) ttd_strlcpy(name, "Player", sizeof(name));
|
||||
|
||||
if (!NetworkFindName(name)) { // Change name if duplicate
|
||||
// We could not create a name for this player
|
||||
// We could not create a name for this client
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NAME_IN_USE);
|
||||
return;
|
||||
}
|
||||
@@ -697,7 +695,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
|
||||
ci->client_lang = client_lang;
|
||||
|
||||
/* Make sure companies to which people try to join are not autocleaned */
|
||||
if (IsValidPlayerID(playas)) _network_player_info[playas].months_empty = 0;
|
||||
if (IsValidCompanyID(playas)) _network_company_info[playas].months_empty = 0;
|
||||
|
||||
if (_grfconfig == NULL) {
|
||||
RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)(cs, NULL);
|
||||
@@ -725,7 +723,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
|
||||
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
|
||||
if (IsValidPlayerID(ci->client_playas) && _network_player_info[ci->client_playas].password[0] != '\0') {
|
||||
if (IsValidCompanyID(ci->client_playas) && _network_company_info[ci->client_playas].password[0] != '\0') {
|
||||
SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD);
|
||||
return;
|
||||
}
|
||||
@@ -736,7 +734,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
|
||||
} else if (cs->status == STATUS_AUTHORIZING && type == NETWORK_COMPANY_PASSWORD) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
|
||||
if (strcmp(password, _network_player_info[ci->client_playas].password) != 0) {
|
||||
if (strcmp(password, _network_company_info[ci->client_playas].password) != 0) {
|
||||
// Password is invalid
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
|
||||
return;
|
||||
@@ -828,17 +826,17 @@ static bool CheckCommandFlags(const CommandPacket *cp, const NetworkClientInfo *
|
||||
byte flags = GetCommandFlags(cp->cmd);
|
||||
|
||||
if (flags & CMD_SERVER && ci->client_index != NETWORK_SERVER_INDEX) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: server only command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci));
|
||||
IConsolePrintF(CC_ERROR, "WARNING: server only command from client %d (IP: %s), kicking...", ci->client_index, GetClientIP(ci));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (flags & CMD_OFFLINE) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: offline only command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci));
|
||||
IConsolePrintF(CC_ERROR, "WARNING: offline only command from client %d (IP: %s), kicking...", ci->client_index, GetClientIP(ci));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cp->cmd != CMD_PLAYER_CTRL && !IsValidPlayerID(cp->player) && ci->client_index != NETWORK_SERVER_INDEX) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: spectator issueing command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci));
|
||||
if (cp->cmd != CMD_COMPANY_CTRL && !IsValidCompanyID(cp->company) && ci->client_index != NETWORK_SERVER_INDEX) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: spectator issueing command from client %d (IP: %s), kicking...", ci->client_index, GetClientIP(ci));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -863,11 +861,11 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
||||
}
|
||||
|
||||
CommandPacket *cp = MallocT<CommandPacket>(1);
|
||||
cp->player = (Owner)p->Recv_uint8();
|
||||
cp->cmd = p->Recv_uint32();
|
||||
cp->p1 = p->Recv_uint32();
|
||||
cp->p2 = p->Recv_uint32();
|
||||
cp->tile = p->Recv_uint32();
|
||||
cp->company = (CompanyID)p->Recv_uint8();
|
||||
cp->cmd = p->Recv_uint32();
|
||||
cp->p1 = p->Recv_uint32();
|
||||
cp->p2 = p->Recv_uint32();
|
||||
cp->tile = p->Recv_uint32();
|
||||
p->Recv_string(cp->text, lengthof(cp->text));
|
||||
|
||||
callback = p->Recv_uint8();
|
||||
@@ -881,7 +879,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
||||
|
||||
/* Check if cp->cmd is valid */
|
||||
if (!IsValidCommand(cp->cmd)) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: invalid command from client %d (IP: %s).", ci->client_index, GetPlayerIP(ci));
|
||||
IConsolePrintF(CC_ERROR, "WARNING: invalid command from client %d (IP: %s).", ci->client_index, GetClientIP(ci));
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
|
||||
free(cp);
|
||||
return;
|
||||
@@ -893,35 +891,35 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
||||
return;
|
||||
}
|
||||
|
||||
/** Only CMD_PLAYER_CTRL is always allowed, for the rest, playas needs
|
||||
* to match the player in the packet. If it doesn't, the client has done
|
||||
/** Only CMD_COMPANY_CTRL is always allowed, for the rest, playas needs
|
||||
* to match the company in the packet. If it doesn't, the client has done
|
||||
* something pretty naughty (or a bug), and will be kicked
|
||||
*/
|
||||
if (!(cp->cmd == CMD_PLAYER_CTRL && cp->p1 == 0 && ci->client_playas == PLAYER_NEW_COMPANY) && ci->client_playas != cp->player) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: player %d (IP: %s) tried to execute a command as player %d, kicking...",
|
||||
ci->client_playas + 1, GetPlayerIP(ci), cp->player + 1);
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH);
|
||||
if (!(cp->cmd == CMD_COMPANY_CTRL && cp->p1 == 0 && ci->client_playas == COMPANY_NEW_COMPANY) && ci->client_playas != cp->company) {
|
||||
IConsolePrintF(CC_ERROR, "WARNING: client %d (IP: %s) tried to execute a command as company %d, kicking...",
|
||||
ci->client_playas + 1, GetClientIP(ci), cp->company + 1);
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_COMPANY_MISMATCH);
|
||||
free(cp);
|
||||
return;
|
||||
}
|
||||
|
||||
/** @todo CMD_PLAYER_CTRL with p1 = 0 announces a new player to the server. To give the
|
||||
* player the correct ID, the server injects p2 and executes the command. Any other p1
|
||||
/** @todo CMD_COMPANY_CTRL with p1 = 0 announces a new company to the server. To give the
|
||||
* company the correct ID, the server injects p2 and executes the command. Any other p1
|
||||
* is prohibited. Pretty ugly and should be redone together with its function.
|
||||
* @see CmdPlayerCtrl() players.c:655
|
||||
* @see CmdCompanyCtrl()
|
||||
*/
|
||||
if (cp->cmd == CMD_PLAYER_CTRL) {
|
||||
if (cp->cmd == CMD_COMPANY_CTRL) {
|
||||
if (cp->p1 != 0) {
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER);
|
||||
free(cp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* XXX - Execute the command as a valid player. Normally this would be done by a
|
||||
/* XXX - Execute the command as a valid company. Normally this would be done by a
|
||||
* spectator, but that is not allowed any commands. So do an impersonation. The drawback
|
||||
* of this is that the first company's last_built_tile is also updated... */
|
||||
cp->player = OWNER_BEGIN;
|
||||
cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl
|
||||
cp->company = OWNER_BEGIN;
|
||||
cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdCompanyCtrl
|
||||
}
|
||||
|
||||
// The frame can be executed in the same frame as the next frame-packet
|
||||
@@ -1038,7 +1036,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK)
|
||||
NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "Game unpaused (client connected)", NETWORK_SERVER_INDEX);
|
||||
}
|
||||
|
||||
CheckMinPlayers();
|
||||
CheckMinActiveClients();
|
||||
|
||||
/* Execute script for, e.g. MOTD */
|
||||
IConsoleCmdExec("exec scripts/on_server_connect.scr 0");
|
||||
@@ -1064,7 +1062,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
||||
ci = NetworkFindClientInfoFromIndex(from_index);
|
||||
/* Display the text locally, and that is it */
|
||||
if (ci != NULL)
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
} else {
|
||||
/* Else find the client to send the message to */
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
@@ -1081,7 +1079,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
||||
ci = NetworkFindClientInfoFromIndex(from_index);
|
||||
ci_to = NetworkFindClientInfoFromIndex(dest);
|
||||
if (ci != NULL && ci_to != NULL)
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci->client_playas), true, ci_to->client_name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci->client_playas), true, ci_to->client_name, "%s", msg);
|
||||
} else {
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
if (cs->index == from_index) {
|
||||
@@ -1095,7 +1093,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
||||
case DESTTYPE_TEAM: {
|
||||
bool show_local = true; // If this is false, the message is already displayed
|
||||
// on the client who did sent it.
|
||||
/* Find all clients that belong to this player */
|
||||
/* Find all clients that belong to this company */
|
||||
ci_to = NULL;
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
@@ -1109,22 +1107,22 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
||||
ci = NetworkFindClientInfoFromIndex(from_index);
|
||||
ci_own = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
|
||||
if (ci != NULL && ci_own != NULL && ci_own->client_playas == dest) {
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
if (from_index == NETWORK_SERVER_INDEX) show_local = false;
|
||||
ci_to = ci_own;
|
||||
}
|
||||
|
||||
/* There is no such player */
|
||||
/* There is no such client */
|
||||
if (ci_to == NULL) break;
|
||||
|
||||
// Display the message locally (so you know you have sent it)
|
||||
if (ci != NULL && show_local) {
|
||||
if (from_index == NETWORK_SERVER_INDEX) {
|
||||
char name[NETWORK_NAME_LENGTH];
|
||||
StringID str = IsValidPlayerID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS;
|
||||
StringID str = IsValidCompanyID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS;
|
||||
SetDParam(0, ci_to->client_playas);
|
||||
GetString(name, str, lastof(name));
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci_own->client_playas), true, name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci_own->client_playas), true, name, "%s", msg);
|
||||
} else {
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
if (cs->index == from_index) {
|
||||
@@ -1144,7 +1142,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
||||
}
|
||||
ci = NetworkFindClientInfoFromIndex(from_index);
|
||||
if (ci != NULL)
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
NetworkTextMessage(action, (ConsoleColour)GetDrawStringCompanyColor(ci->client_playas), false, ci->client_name, "%s", msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1167,7 +1165,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
switch (action) {
|
||||
case NETWORK_ACTION_GIVE_MONEY:
|
||||
if (!IsValidPlayerID(ci->client_playas)) break;
|
||||
if (!IsValidCompanyID(ci->client_playas)) break;
|
||||
/* Fall-through */
|
||||
case NETWORK_ACTION_CHAT:
|
||||
case NETWORK_ACTION_CHAT_CLIENT:
|
||||
@@ -1175,7 +1173,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
|
||||
NetworkServerSendChat(action, desttype, dest, msg, cs->index);
|
||||
break;
|
||||
default:
|
||||
IConsolePrintF(CC_ERROR, "WARNING: invalid chat action from client %d (IP: %s).", ci->client_index, GetPlayerIP(ci));
|
||||
IConsolePrintF(CC_ERROR, "WARNING: invalid chat action from client %d (IP: %s).", ci->client_index, GetClientIP(ci));
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
|
||||
break;
|
||||
}
|
||||
@@ -1195,8 +1193,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
|
||||
p->Recv_string(password, sizeof(password));
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
|
||||
if (IsValidPlayerID(ci->client_playas)) {
|
||||
ttd_strlcpy(_network_player_info[ci->client_playas].password, password, sizeof(_network_player_info[0].password));
|
||||
if (IsValidCompanyID(ci->client_playas)) {
|
||||
ttd_strlcpy(_network_company_info[ci->client_playas].password, password, sizeof(_network_company_info[0].password));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1301,7 +1299,7 @@ assert_compile(lengthof(_network_server_packet) == PACKET_END);
|
||||
void NetworkPopulateCompanyInfo()
|
||||
{
|
||||
char password[NETWORK_PASSWORD_LENGTH];
|
||||
const Player *p;
|
||||
const Company *c;
|
||||
const Vehicle *v;
|
||||
const Station *s;
|
||||
NetworkTCPSocketHandler *cs;
|
||||
@@ -1309,44 +1307,44 @@ void NetworkPopulateCompanyInfo()
|
||||
uint i;
|
||||
uint16 months_empty;
|
||||
|
||||
for (PlayerID pid = PLAYER_FIRST; pid < MAX_PLAYERS; pid++) {
|
||||
if (!IsValidPlayerID(pid)) memset(&_network_player_info[pid], 0, sizeof(NetworkPlayerInfo));
|
||||
for (CompanyID cid = COMPANY_FIRST; cid < MAX_COMPANIES; cid++) {
|
||||
if (!IsValidCompanyID(cid)) memset(&_network_company_info[cid], 0, sizeof(NetworkCompanyInfo));
|
||||
}
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
// Clean the info but not the password
|
||||
ttd_strlcpy(password, _network_player_info[p->index].password, sizeof(password));
|
||||
months_empty = _network_player_info[p->index].months_empty;
|
||||
memset(&_network_player_info[p->index], 0, sizeof(NetworkPlayerInfo));
|
||||
_network_player_info[p->index].months_empty = months_empty;
|
||||
ttd_strlcpy(_network_player_info[p->index].password, password, sizeof(_network_player_info[p->index].password));
|
||||
ttd_strlcpy(password, _network_company_info[c->index].password, sizeof(password));
|
||||
months_empty = _network_company_info[c->index].months_empty;
|
||||
memset(&_network_company_info[c->index], 0, sizeof(NetworkCompanyInfo));
|
||||
_network_company_info[c->index].months_empty = months_empty;
|
||||
ttd_strlcpy(_network_company_info[c->index].password, password, sizeof(_network_company_info[c->index].password));
|
||||
|
||||
// Grap the company name
|
||||
SetDParam(0, p->index);
|
||||
GetString(_network_player_info[p->index].company_name, STR_COMPANY_NAME, lastof(_network_player_info[p->index].company_name));
|
||||
SetDParam(0, c->index);
|
||||
GetString(_network_company_info[c->index].company_name, STR_COMPANY_NAME, lastof(_network_company_info[c->index].company_name));
|
||||
|
||||
// Check the income
|
||||
if (_cur_year - 1 == p->inaugurated_year) {
|
||||
// The player is here just 1 year, so display [2], else display[1]
|
||||
for (i = 0; i < lengthof(p->yearly_expenses[2]); i++) {
|
||||
_network_player_info[p->index].income -= p->yearly_expenses[2][i];
|
||||
if (_cur_year - 1 == c->inaugurated_year) {
|
||||
// The company is here just 1 year, so display [2], else display[1]
|
||||
for (i = 0; i < lengthof(c->yearly_expenses[2]); i++) {
|
||||
_network_company_info[c->index].income -= c->yearly_expenses[2][i];
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < lengthof(p->yearly_expenses[1]); i++) {
|
||||
_network_player_info[p->index].income -= p->yearly_expenses[1][i];
|
||||
for (i = 0; i < lengthof(c->yearly_expenses[1]); i++) {
|
||||
_network_company_info[c->index].income -= c->yearly_expenses[1][i];
|
||||
}
|
||||
}
|
||||
|
||||
// Set some general stuff
|
||||
_network_player_info[p->index].inaugurated_year = p->inaugurated_year;
|
||||
_network_player_info[p->index].company_value = p->old_economy[0].company_value;
|
||||
_network_player_info[p->index].money = p->player_money;
|
||||
_network_player_info[p->index].performance = p->old_economy[0].performance_history;
|
||||
_network_company_info[c->index].inaugurated_year = c->inaugurated_year;
|
||||
_network_company_info[c->index].company_value = c->old_economy[0].company_value;
|
||||
_network_company_info[c->index].money = c->money;
|
||||
_network_company_info[c->index].performance = c->old_economy[0].performance_history;
|
||||
}
|
||||
|
||||
// Go through all vehicles and count the type of vehicles
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (!IsValidPlayerID(v->owner) || !v->IsPrimaryVehicle()) continue;
|
||||
if (!IsValidCompanyID(v->owner) || !v->IsPrimaryVehicle()) continue;
|
||||
byte type = 0;
|
||||
switch (v->type) {
|
||||
case VEH_TRAIN: type = 0; break;
|
||||
@@ -1355,13 +1353,13 @@ void NetworkPopulateCompanyInfo()
|
||||
case VEH_SHIP: type = 4; break;
|
||||
default: continue;
|
||||
}
|
||||
_network_player_info[v->owner].num_vehicle[type]++;
|
||||
_network_company_info[v->owner].num_vehicle[type]++;
|
||||
}
|
||||
|
||||
// Go through all stations and count the types of stations
|
||||
FOR_ALL_STATIONS(s) {
|
||||
if (IsValidPlayerID(s->owner)) {
|
||||
NetworkPlayerInfo *npi = &_network_player_info[s->owner];
|
||||
if (IsValidCompanyID(s->owner)) {
|
||||
NetworkCompanyInfo *npi = &_network_company_info[s->owner];
|
||||
|
||||
if (s->facilities & FACIL_TRAIN) npi->num_station[0]++;
|
||||
if (s->facilities & FACIL_TRUCK_STOP) npi->num_station[1]++;
|
||||
@@ -1372,9 +1370,9 @@ void NetworkPopulateCompanyInfo()
|
||||
}
|
||||
|
||||
ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
|
||||
// Register local player (if not dedicated)
|
||||
if (ci != NULL && IsValidPlayerID(ci->client_playas))
|
||||
ttd_strlcpy(_network_player_info[ci->client_playas].players, ci->client_name, sizeof(_network_player_info[0].players));
|
||||
// Register local company (if not dedicated)
|
||||
if (ci != NULL && IsValidCompanyID(ci->client_playas))
|
||||
ttd_strlcpy(_network_company_info[ci->client_playas].clients, ci->client_name, sizeof(_network_company_info[0].clients));
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
char client_name[NETWORK_CLIENT_NAME_LENGTH];
|
||||
@@ -1382,12 +1380,12 @@ void NetworkPopulateCompanyInfo()
|
||||
NetworkGetClientName(client_name, sizeof(client_name), cs);
|
||||
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
if (ci != NULL && IsValidPlayerID(ci->client_playas)) {
|
||||
if (!StrEmpty(_network_player_info[ci->client_playas].players)) {
|
||||
ttd_strlcat(_network_player_info[ci->client_playas].players, ", ", lengthof(_network_player_info[0].players));
|
||||
if (ci != NULL && IsValidCompanyID(ci->client_playas)) {
|
||||
if (!StrEmpty(_network_company_info[ci->client_playas].clients)) {
|
||||
ttd_strlcat(_network_company_info[ci->client_playas].clients, ", ", lengthof(_network_company_info[0].clients));
|
||||
}
|
||||
|
||||
ttd_strlcat(_network_player_info[ci->client_playas].players, client_name, lengthof(_network_player_info[0].players));
|
||||
ttd_strlcat(_network_company_info[ci->client_playas].clients, client_name, lengthof(_network_company_info[0].clients));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1424,8 +1422,8 @@ static void NetworkAutoCleanCompanies()
|
||||
{
|
||||
NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
const Player *p;
|
||||
bool clients_in_company[MAX_PLAYERS];
|
||||
const Company *c;
|
||||
bool clients_in_company[MAX_COMPANIES];
|
||||
|
||||
if (!_settings_client.network.autoclean_companies) return;
|
||||
|
||||
@@ -1434,39 +1432,39 @@ static void NetworkAutoCleanCompanies()
|
||||
/* Detect the active companies */
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
if (IsValidPlayerID(ci->client_playas)) clients_in_company[ci->client_playas] = true;
|
||||
if (IsValidCompanyID(ci->client_playas)) clients_in_company[ci->client_playas] = true;
|
||||
}
|
||||
|
||||
if (!_network_dedicated) {
|
||||
ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
|
||||
if (IsValidPlayerID(ci->client_playas)) clients_in_company[ci->client_playas] = true;
|
||||
if (IsValidCompanyID(ci->client_playas)) clients_in_company[ci->client_playas] = true;
|
||||
}
|
||||
|
||||
/* Go through all the comapnies */
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
/* Skip the non-active once */
|
||||
if (p->is_ai) continue;
|
||||
if (c->is_ai) continue;
|
||||
|
||||
if (!clients_in_company[p->index]) {
|
||||
if (!clients_in_company[c->index]) {
|
||||
/* The company is empty for one month more */
|
||||
_network_player_info[p->index].months_empty++;
|
||||
_network_company_info[c->index].months_empty++;
|
||||
|
||||
/* Is the company empty for autoclean_unprotected-months, and is there no protection? */
|
||||
if (_settings_client.network.autoclean_unprotected != 0 && _network_player_info[p->index].months_empty > _settings_client.network.autoclean_unprotected && _network_player_info[p->index].password[0] == '\0') {
|
||||
if (_settings_client.network.autoclean_unprotected != 0 && _network_company_info[c->index].months_empty > _settings_client.network.autoclean_unprotected && StrEmpty(_network_company_info[c->index].password)) {
|
||||
/* Shut the company down */
|
||||
DoCommandP(0, 2, p->index, NULL, CMD_PLAYER_CTRL);
|
||||
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d", p->index + 1);
|
||||
DoCommandP(0, 2, c->index, NULL, CMD_COMPANY_CTRL);
|
||||
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d", c->index + 1);
|
||||
}
|
||||
/* Is the compnay empty for autoclean_protected-months, and there is a protection? */
|
||||
if (_settings_client.network.autoclean_protected != 0 && _network_player_info[p->index].months_empty > _settings_client.network.autoclean_protected && _network_player_info[p->index].password[0] != '\0') {
|
||||
/* Is the company empty for autoclean_protected-months, and there is a protection? */
|
||||
if (_settings_client.network.autoclean_protected != 0 && _network_company_info[c->index].months_empty > _settings_client.network.autoclean_protected && !StrEmpty(_network_company_info[c->index].password)) {
|
||||
/* Unprotect the company */
|
||||
_network_player_info[p->index].password[0] = '\0';
|
||||
IConsolePrintF(CC_DEFAULT, "Auto-removed protection from company #%d", p->index+1);
|
||||
_network_player_info[p->index].months_empty = 0;
|
||||
_network_company_info[c->index].password[0] = '\0';
|
||||
IConsolePrintF(CC_DEFAULT, "Auto-removed protection from company #%d", c->index + 1);
|
||||
_network_company_info[c->index].months_empty = 0;
|
||||
}
|
||||
} else {
|
||||
/* It is not empty, reset the date */
|
||||
_network_player_info[p->index].months_empty = 0;
|
||||
_network_company_info[c->index].months_empty = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1625,30 +1623,30 @@ void NetworkServerMonthlyLoop()
|
||||
NetworkAutoCleanCompanies();
|
||||
}
|
||||
|
||||
void NetworkServerChangeOwner(PlayerID current_player, PlayerID new_player)
|
||||
void NetworkServerChangeOwner(Owner current_owner, Owner new_owner)
|
||||
{
|
||||
/* The server has to handle all administrative issues, for example
|
||||
* updating and notifying all clients of what has happened */
|
||||
NetworkTCPSocketHandler *cs;
|
||||
NetworkClientInfo *ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX);
|
||||
|
||||
/* The server has just changed from player */
|
||||
if (current_player == ci->client_playas) {
|
||||
ci->client_playas = new_player;
|
||||
/* The server has just changed from owner */
|
||||
if (current_owner == ci->client_playas) {
|
||||
ci->client_playas = new_owner;
|
||||
NetworkUpdateClientInfo(NETWORK_SERVER_INDEX);
|
||||
}
|
||||
|
||||
/* Find all clients that were in control of this company, and mark them as new_player */
|
||||
/* Find all clients that were in control of this company, and mark them as new_owner */
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
if (current_player == ci->client_playas) {
|
||||
ci->client_playas = new_player;
|
||||
if (current_owner == ci->client_playas) {
|
||||
ci->client_playas = new_owner;
|
||||
NetworkUpdateClientInfo(ci->client_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char* GetPlayerIP(const NetworkClientInfo* ci)
|
||||
const char* GetClientIP(const NetworkClientInfo* ci)
|
||||
{
|
||||
struct in_addr addr;
|
||||
|
||||
@@ -1678,8 +1676,8 @@ void NetworkServerShowStatusToConsole()
|
||||
status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown");
|
||||
IConsolePrintF(CC_INFO, "Client #%1d name: '%s' status: '%s' frame-lag: %3d company: %1d IP: %s unique-id: '%s'",
|
||||
cs->index, ci->client_name, status, lag,
|
||||
ci->client_playas + (IsValidPlayerID(ci->client_playas) ? 1 : 0),
|
||||
GetPlayerIP(ci), ci->unique_id);
|
||||
ci->client_playas + (IsValidCompanyID(ci->client_playas) ? 1 : 0),
|
||||
GetClientIP(ci), ci->unique_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1693,7 +1691,7 @@ void NetworkServerSendError(uint16 client_index, NetworkErrorCode error)
|
||||
SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(client_index), error);
|
||||
}
|
||||
|
||||
bool NetworkCompanyHasPlayers(PlayerID company)
|
||||
bool NetworkCompanyHasClients(CompanyID company)
|
||||
{
|
||||
const NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
|
@@ -14,11 +14,11 @@
|
||||
|
||||
enum {
|
||||
/**
|
||||
* How many clients can we have? Like.. MAX_PLAYERS - 1 is the amount of
|
||||
* players that can really play.. so.. a max of 4 spectators.. gives us..
|
||||
* MAX_PLAYERS + 3
|
||||
* How many clients can we have? Like.. MAX_COMPANIES is the amount of
|
||||
* companies that can really play.. so.. a max of 3 spectators.. gives us..
|
||||
* MAX_COMPANIES + 3
|
||||
*/
|
||||
MAX_CLIENTS = MAX_PLAYERS + 3,
|
||||
MAX_CLIENTS = MAX_COMPANIES + 3,
|
||||
|
||||
/** Do not change this next line. It should _ALWAYS_ be MAX_CLIENTS + 1 */
|
||||
MAX_CLIENT_INFO = MAX_CLIENTS + 1,
|
||||
@@ -34,9 +34,9 @@ enum {
|
||||
NETWORK_EMPTY_INDEX = 0,
|
||||
};
|
||||
|
||||
struct NetworkPlayerInfo {
|
||||
struct NetworkCompanyInfo {
|
||||
char company_name[NETWORK_COMPANY_NAME_LENGTH]; ///< Company name
|
||||
char password[NETWORK_PASSWORD_LENGTH]; ///< The password for the player
|
||||
char password[NETWORK_PASSWORD_LENGTH]; ///< The password for the company
|
||||
Year inaugurated_year; ///< What year the company started in
|
||||
Money company_value; ///< The company value
|
||||
Money money; ///< The amount of money the company has
|
||||
@@ -45,7 +45,7 @@ struct NetworkPlayerInfo {
|
||||
bool use_password; ///< Is there a password
|
||||
uint16 num_vehicle[NETWORK_VEHICLE_TYPES]; ///< How many vehicles are there of this type?
|
||||
uint16 num_station[NETWORK_STATION_TYPES]; ///< How many stations are there of this type?
|
||||
char players[NETWORK_PLAYERS_LENGTH]; ///< The players that control this company (Name1, name2, ..)
|
||||
char clients[NETWORK_CLIENTS_LENGTH]; ///< The clients that control this company (Name1, name2, ..)
|
||||
uint16 months_empty; ///< How many months the company is empty
|
||||
};
|
||||
|
||||
@@ -53,9 +53,9 @@ struct NetworkClientInfo {
|
||||
uint16 client_index; ///< Index of the client (same as ClientState->index)
|
||||
char client_name[NETWORK_CLIENT_NAME_LENGTH]; ///< Name of the client
|
||||
byte client_lang; ///< The language of the client
|
||||
PlayerID client_playas; ///< As which player is this client playing (PlayerID)
|
||||
CompanyID client_playas; ///< As which company is this client playing (CompanyID)
|
||||
uint32 client_ip; ///< IP-address of the client (so he can be banned)
|
||||
Date join_date; ///< Gamedate the player has joined
|
||||
Date join_date; ///< Gamedate the client has joined
|
||||
char unique_id[NETWORK_UNIQUE_ID_LENGTH]; ///< Every play sends an unique id so we can indentify him
|
||||
};
|
||||
|
||||
@@ -65,9 +65,9 @@ enum NetworkPasswordType {
|
||||
};
|
||||
|
||||
enum DestType {
|
||||
DESTTYPE_BROADCAST, ///< Send message/notice to all players (All)
|
||||
DESTTYPE_BROADCAST, ///< Send message/notice to all clients (All)
|
||||
DESTTYPE_TEAM, ///< Send message/notice to everyone playing the same company (Team)
|
||||
DESTTYPE_CLIENT, ///< Send message/notice to only a certain player (Private)
|
||||
DESTTYPE_CLIENT, ///< Send message/notice to only a certain client (Private)
|
||||
};
|
||||
|
||||
/** Actions that can be used for NetworkTextMessage */
|
||||
@@ -98,7 +98,7 @@ enum NetworkErrorCode {
|
||||
NETWORK_ERROR_WRONG_REVISION,
|
||||
NETWORK_ERROR_NAME_IN_USE,
|
||||
NETWORK_ERROR_WRONG_PASSWORD,
|
||||
NETWORK_ERROR_PLAYER_MISMATCH, // Happens in CLIENT_COMMAND
|
||||
NETWORK_ERROR_COMPANY_MISMATCH, // Happens in CLIENT_COMMAND
|
||||
NETWORK_ERROR_KICKED,
|
||||
NETWORK_ERROR_CHEATER,
|
||||
NETWORK_ERROR_FULL,
|
||||
|
@@ -83,7 +83,7 @@ DEF_UDP_RECEIVE_COMMAND(Server, PACKET_UDP_CLIENT_FIND_SERVER)
|
||||
ngi.server_lang = _settings_client.network.server_lang;
|
||||
ngi.use_password = !StrEmpty(_settings_client.network.server_password);
|
||||
ngi.clients_max = _settings_client.network.max_clients;
|
||||
ngi.companies_on = ActivePlayerCount();
|
||||
ngi.companies_on = ActiveCompanyCount();
|
||||
ngi.companies_max = _settings_client.network.max_companies;
|
||||
ngi.spectators_on = NetworkSpectatorCount();
|
||||
ngi.spectators_max = _settings_client.network.max_spectators;
|
||||
@@ -116,36 +116,36 @@ DEF_UDP_RECEIVE_COMMAND(Server, PACKET_UDP_CLIENT_DETAIL_INFO)
|
||||
|
||||
/* Send the amount of active companies */
|
||||
packet.Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
|
||||
packet.Send_uint8 (ActivePlayerCount());
|
||||
packet.Send_uint8 (ActiveCompanyCount());
|
||||
|
||||
/* Fetch the latest version of everything */
|
||||
NetworkPopulateCompanyInfo();
|
||||
|
||||
Player *player;
|
||||
Company *company;
|
||||
byte current = 0;
|
||||
/* Go through all the players */
|
||||
FOR_ALL_PLAYERS(player) {
|
||||
/* Go through all the companies */
|
||||
FOR_ALL_COMPANIES(company) {
|
||||
current++;
|
||||
|
||||
/* Send the information */
|
||||
packet.Send_uint8 (current);
|
||||
|
||||
packet.Send_string(_network_player_info[player->index].company_name);
|
||||
packet.Send_uint32(_network_player_info[player->index].inaugurated_year);
|
||||
packet.Send_uint64(_network_player_info[player->index].company_value);
|
||||
packet.Send_uint64(_network_player_info[player->index].money);
|
||||
packet.Send_uint64(_network_player_info[player->index].income);
|
||||
packet.Send_uint16(_network_player_info[player->index].performance);
|
||||
packet.Send_string(_network_company_info[company->index].company_name);
|
||||
packet.Send_uint32(_network_company_info[company->index].inaugurated_year);
|
||||
packet.Send_uint64(_network_company_info[company->index].company_value);
|
||||
packet.Send_uint64(_network_company_info[company->index].money);
|
||||
packet.Send_uint64(_network_company_info[company->index].income);
|
||||
packet.Send_uint16(_network_company_info[company->index].performance);
|
||||
|
||||
/* Send 1 if there is a passord for the company else send 0 */
|
||||
packet.Send_bool (!StrEmpty(_network_player_info[player->index].password));
|
||||
packet.Send_bool (!StrEmpty(_network_company_info[company->index].password));
|
||||
|
||||
for (int i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
|
||||
packet.Send_uint16(_network_player_info[player->index].num_vehicle[i]);
|
||||
packet.Send_uint16(_network_company_info[company->index].num_vehicle[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < NETWORK_STATION_TYPES; i++) {
|
||||
packet.Send_uint16(_network_player_info[player->index].num_station[i]);
|
||||
packet.Send_uint16(_network_company_info[company->index].num_station[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user