summaryrefslogtreecommitdiff
path: root/network.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-12 15:29:37 +0000
committerdarkvater <darkvater@openttd.org>2004-09-12 15:29:37 +0000
commit99687cf513905a04ae18dfbcbe6fd13c6cbe9694 (patch)
tree6a2158dce07948cb902981f67daff0a278fe73f2 /network.c
parentf64c1bda4ba0d4723974117e27452a68611d5db4 (diff)
downloadopenttd-99687cf513905a04ae18dfbcbe6fd13c6cbe9694.tar.xz
(svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
-Fix: Only server can pause in network, action disabled for clients -Fix: Direct Connect editbox can handle up to max ~35 characters
Diffstat (limited to 'network.c')
-rw-r--r--network.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/network.c b/network.c
index 27f2d3065..fa09e4702 100644
--- a/network.c
+++ b/network.c
@@ -235,6 +235,7 @@ enum {
};
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet);
+static void HandleCommandPacket(ClientState *cs, CommandPacket *np);
static void CloseClient(ClientState *cs);
void NetworkSendWelcome(ClientState *cs, bool direct);
@@ -451,7 +452,11 @@ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comman
QueuedCommand *qp;
ClientState *cs;
- qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
+ if (!(cmd & CMD_NET_INSTANT)) {
+ qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
+ } else {
+ qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
+ }
qp->cp.packet_type = PACKET_TYPE_COMMAND;
qp->cp.tile = tile;
qp->cp.p1 = p1;
@@ -487,6 +492,9 @@ void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comman
for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, &qp->cp, qp->cp.packet_length);
#endif
+ if (cmd & CMD_NET_INSTANT) {
+ free(qp);
+ }
}
// client:
@@ -505,13 +513,22 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
QueuedCommand *qp;
ClientState *c;
AckPacket ap;
+ uint16 cmd;
DEBUG(net, 2) ("[NET] cmd size %d", np->packet_length);
-
assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
- // put it into the command queue
- qp = AllocQueuedCommand(&_command_queue);
+ cmd = np->cmd;
+#if defined(TTD_BIG_ENDIAN)
+ cmd = TO_LE16(cmd);
+#endif
+
+ if (!(cmd & CMD_NET_INSTANT)) {
+ // put it into the command queue
+ qp = AllocQueuedCommand(&_command_queue);
+ } else {
+ qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
+ }
qp->cp = *np;
qp->frame = _frame_counter_max - GetNextSyncFrame();
@@ -530,7 +547,7 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
if (_networking_server) {
for(c=_clients; c->socket != INVALID_SOCKET; c++) {
if (c == cs) {
- SendDirectBytes(c, &ap, ap.packet_length);
+ if (!(cmd & CMD_NET_INSTANT)) SendDirectBytes(c, &ap, ap.packet_length);
} else {
if (!cs->inactive) SendBytes(c, &qp->cp, qp->cp.packet_length);
}
@@ -546,6 +563,15 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
#endif
qp->cmd = qp->cp.cmd;
+
+ if (cmd & CMD_NET_INSTANT) {
+ byte p = _current_player;
+ _current_player = qp->cp.player;
+ memcpy(_decode_parameters, qp->cp.dp, (qp->cp.packet_length - COMMAND_PACKET_BASE_SIZE));
+ DoCommandP(qp->cp.tile, qp->cp.p1, qp->cp.p2, qp->callback, qp->cmd | CMD_DONT_NETWORK);
+ free(qp);
+ _current_player = p;
+ }
}
// sent from server -> client periodically to tell the client about the current tick in the server