/** * Prepare a DoCommand to be send over the network * @param tile The tile to perform a command on (see #CommandProc) * @param p1 Additional data for the command (see #CommandProc) * @param p2 Additional data for the command (see #CommandProc) * @param cmd The command to execute (a CMD_* value) * @param callback A callback function to call after the command is finished * @param text The text to pass * @param company The company that wants to send the command */ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, CompanyID company) { assert((cmd & CMD_FLAGS_MASK) == 0); CommandPacket c; c.company = company; c.tile = tile; c.p1 = p1; c.p2 = p2; c.cmd = cmd; c.callback = callback; strecpy(c.text, (text != NULL) ? text : "", lastof(c.text)); if (_network_server) { /* If we are the server, we queue the command in our 'special' queue. * In theory, we could execute the command right away, but then the * client on the server can do everything 1 tick faster than others. * So to keep the game fair, we delay the command with 1 tick * which gives about the same speed as most clients. */ c.frame = _frame_counter_max + 1; c.my_cmd = true; _local_wait_queue.Append(&c); return; } c.frame = 0; // The client can't tell which frame, so just make it 0 /* Clients send their command to the server and forget all about the packet */ MyClient::SendCommand(&c); }
/** * "Send" a particular CommandPacket to all clients. * @param cp The command that has to be distributed. * @param owner The client that owns the command, */ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket *owner) { CommandCallback *callback = cp.callback; cp.frame = _frame_counter_max + 1; NetworkClientSocket *cs; FOR_ALL_CLIENT_SOCKETS(cs) { if (cs->status >= NetworkClientSocket::STATUS_MAP) { /* Callbacks are only send back to the client who sent them in the * first place. This filters that out. */ cp.callback = (cs != owner) ? NULL : callback; cp.my_cmd = (cs == owner); cs->outgoing_queue.Append(&cp); } } cp.callback = (cs != owner) ? NULL : callback; cp.my_cmd = (cs == owner); _local_execution_queue.Append(&cp); }