mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-16 00:12:51 +00:00
(svn r982) -Fix: [Network] Because dparams are misused as a char, we had some
endian-problems. To fix this, we are sending dparams byte by byte (instead of an uint32). Because of this dparam is sent not-uint32-endian-safe, but char-endian-safe. Too bad dparam can no longer be used for normal stuff (which is currently not the case) (tnx to Tron and Bjarni)
This commit is contained in:
parent
747d69f9b2
commit
d86b06a7f5
@ -146,6 +146,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
//
|
||||
|
||||
int i;
|
||||
char *dparam_char;
|
||||
Packet *p = NetworkSend_Init(PACKET_CLIENT_COMMAND);
|
||||
|
||||
NetworkSend_uint8(p, cp->player);
|
||||
@ -153,8 +154,13 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
NetworkSend_uint32(p, cp->p1);
|
||||
NetworkSend_uint32(p, cp->p2);
|
||||
NetworkSend_uint32(p, (uint32)cp->tile);
|
||||
for (i = 0; i < lengthof(cp->dp); i++) {
|
||||
NetworkSend_uint32(p, cp->dp[i]);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
NetworkSend_uint8(p, *dparam_char);
|
||||
dparam_char++;
|
||||
}
|
||||
NetworkSend_uint8(p, cp->callback);
|
||||
|
||||
@ -548,14 +554,21 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
|
||||
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
|
||||
{
|
||||
int i;
|
||||
char *dparam_char;
|
||||
CommandPacket *cp = malloc(sizeof(CommandPacket));
|
||||
cp->player = NetworkRecv_uint8(p);
|
||||
cp->cmd = NetworkRecv_uint32(p);
|
||||
cp->p1 = NetworkRecv_uint32(p);
|
||||
cp->p2 = NetworkRecv_uint32(p);
|
||||
cp->tile = NetworkRecv_uint32(p);
|
||||
for (i = 0; i < lengthof(cp->dp); i++)
|
||||
cp->dp[i] = NetworkRecv_uint32(p);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
*dparam_char = NetworkRecv_uint8(p);
|
||||
dparam_char++;
|
||||
}
|
||||
cp->callback = NetworkRecv_uint8(p);
|
||||
cp->frame = NetworkRecv_uint32(p);
|
||||
cp->next = NULL;
|
||||
|
@ -445,6 +445,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(ClientState *cs, CommandPac
|
||||
//
|
||||
|
||||
int i;
|
||||
char *dparam_char;
|
||||
Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
|
||||
|
||||
NetworkSend_uint8(p, cp->player);
|
||||
@ -452,8 +453,13 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(ClientState *cs, CommandPac
|
||||
NetworkSend_uint32(p, cp->p1);
|
||||
NetworkSend_uint32(p, cp->p2);
|
||||
NetworkSend_uint32(p, cp->tile);
|
||||
for (i = 0; i < lengthof(cp->dp); i++) {
|
||||
NetworkSend_uint32(p, cp->dp[i]);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
NetworkSend_uint8(p, *dparam_char);
|
||||
dparam_char++;
|
||||
}
|
||||
NetworkSend_uint8(p, cp->callback);
|
||||
NetworkSend_uint32(p, cp->frame);
|
||||
@ -732,6 +738,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
||||
byte callback;
|
||||
ClientState *new_cs;
|
||||
NetworkClientInfo *ci;
|
||||
char *dparam_char;
|
||||
|
||||
CommandPacket *cp = malloc(sizeof(CommandPacket));
|
||||
|
||||
@ -747,8 +754,14 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
||||
cp->p1 = NetworkRecv_uint32(p);
|
||||
cp->p2 = NetworkRecv_uint32(p);
|
||||
cp->tile = NetworkRecv_uint32(p);
|
||||
for (i = 0; i < lengthof(cp->dp); i++)
|
||||
cp->dp[i] = NetworkRecv_uint32(p);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
*dparam_char = NetworkRecv_uint8(p);
|
||||
dparam_char++;
|
||||
}
|
||||
|
||||
callback = NetworkRecv_uint8(p);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user