Cleaned a frameinfo-packet related code and introduced more of D2X - especially for short packets (which is thankfully covered by Version checking)
This commit is contained in:
parent
c87b860595
commit
53efe6c01a
|
@ -1,5 +1,9 @@
|
|||
D1X-Rebirth Changelog
|
||||
|
||||
20081212
|
||||
--------
|
||||
main/netpkt.c, main/netpkt.h, main/network.c, main/network.h: Cleaned a frameinfo-packet related code and introduced more of D2X - especially for short packets (which is thankfully covered by Version checking)
|
||||
|
||||
20081208
|
||||
--------
|
||||
main/multi.h: Made MULTI_D1X_PROTO use D1X-IVER so no different releases can play together with Version checking enabled
|
||||
|
|
202
main/netpkt.c
202
main/netpkt.c
|
@ -532,146 +532,86 @@ void receive_d1x_netgame_packet(ubyte *data, netgame_info *netgame) {
|
|||
}
|
||||
}
|
||||
|
||||
void send_frameinfo_packet(ubyte *server, ubyte *node, ubyte *address, int short_packet)
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
void send_frameinfo_packet(frame_info *info, ubyte *server, ubyte *node, ubyte *net_address)
|
||||
{
|
||||
int loc;
|
||||
ushort tmpus;
|
||||
object *pl_obj = &Objects[Players[Player_num].objnum];
|
||||
int loc = 0;
|
||||
|
||||
loc = 0;
|
||||
memset(out_buffer, 0, MAX_DATA_SIZE);
|
||||
if (short_packet == 1) {
|
||||
loc = 0;
|
||||
out_buffer[loc] = PID_SHORTPDATA; loc++;
|
||||
out_buffer[loc] = Player_num; loc++;
|
||||
out_buffer[loc] = pl_obj->render_type; loc++;
|
||||
out_buffer[loc] = Current_level_num; loc++;
|
||||
create_shortpos((shortpos *)(out_buffer + loc), pl_obj,1);
|
||||
loc += 9+2*3+2+2*3; // go past shortpos structure
|
||||
PUT_INTEL_SHORT(out_buffer + loc, MySyncPack.data_size); loc += 2;
|
||||
memcpy(out_buffer + loc, MySyncPack.data, MySyncPack.data_size);
|
||||
loc += MySyncPack.data_size;
|
||||
} else if (short_packet == 2) {
|
||||
loc = 0;
|
||||
out_buffer[loc] = PID_PDATA_SHORT2; loc++;
|
||||
out_buffer[loc] = MySyncPack.numpackets & 255; loc++;
|
||||
create_shortpos((shortpos *)(out_buffer + loc), pl_obj,1);
|
||||
loc += 9+2*3+2+2*3; // go past shortpos structure
|
||||
tmpus = MySyncPack.data_size | (Player_num << 12) | (pl_obj->render_type << 15);
|
||||
PUT_INTEL_SHORT(out_buffer + loc, tmpus); loc += 2;
|
||||
out_buffer[loc] = Current_level_num; loc++;
|
||||
memcpy(out_buffer + loc, MySyncPack.data, MySyncPack.data_size);
|
||||
loc += MySyncPack.data_size;
|
||||
} else {
|
||||
out_buffer[0] = PID_PDATA; loc++; loc += 3; // skip three for pad byte
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), MySyncPack.numpackets); loc += 4;
|
||||
out_buffer[loc] = info->type; loc++;
|
||||
/*3 bytes of padding */ loc += 3;
|
||||
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->pos.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->pos.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->pos.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], info->numpackets); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_pos.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_pos.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_pos.z); loc += 4;
|
||||
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.rvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.rvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.rvec.z); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.uvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.uvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.uvec.z); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.fvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.fvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->orient.fvec.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.rvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.rvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.rvec.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.uvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.uvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.uvec.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.fvec.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.fvec.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->obj_orient.fvec.z); loc += 4;
|
||||
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.velocity.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.velocity.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.velocity.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_velocity.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_velocity.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_velocity.z); loc += 4;
|
||||
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.rotvel.x); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.rotvel.y); loc += 4;
|
||||
PUT_INTEL_INT(&(out_buffer[loc]), (int)pl_obj->mtype.phys_info.rotvel.z); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_rotvel.x); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_rotvel.y); loc += 4;
|
||||
PUT_INTEL_INT(&out_buffer[loc], (int)info->phys_rotvel.z); loc += 4;
|
||||
|
||||
PUT_INTEL_SHORT(&(out_buffer[loc]), pl_obj->segnum); loc += 2;
|
||||
PUT_INTEL_SHORT(&(out_buffer[loc]), MySyncPack.data_size); loc += 2;
|
||||
PUT_INTEL_SHORT(&out_buffer[loc], info->obj_segnum); loc += 2;
|
||||
PUT_INTEL_SHORT(&out_buffer[loc], info->data_size); loc += 2;
|
||||
out_buffer[loc] = info->playernum; loc++;
|
||||
out_buffer[loc] = info->obj_render_type; loc++;
|
||||
out_buffer[loc] = info->level_num; loc++;
|
||||
memcpy(&out_buffer[loc], info->data, info->data_size); loc += info->data_size;
|
||||
|
||||
out_buffer[loc] = Player_num; loc++;
|
||||
out_buffer[loc] = pl_obj->render_type; loc++;
|
||||
out_buffer[loc] = Current_level_num; loc++;
|
||||
memcpy(&(out_buffer[loc]), MySyncPack.data, MySyncPack.data_size);
|
||||
loc += MySyncPack.data_size;
|
||||
}
|
||||
#if 0 // adb: not possible (always array passed)
|
||||
if (address == NULL)
|
||||
NetDrvSendInternetworkPacketData( out_buffer, loc, server, node );
|
||||
else
|
||||
// Always array passed
|
||||
NetDrvSendPacketData(out_buffer, loc, server, node, net_address);
|
||||
}
|
||||
|
||||
void receive_frameinfo_packet(ubyte *data, frame_info *info)
|
||||
{
|
||||
int loc = 0;
|
||||
|
||||
info->type = data[loc]; loc++;
|
||||
/*3 bytes of padding */ loc += 3;
|
||||
|
||||
info->numpackets = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_pos.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_pos.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_pos.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
|
||||
info->obj_orient.rvec.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.rvec.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.rvec.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.uvec.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.uvec.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.uvec.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.fvec.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.fvec.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->obj_orient.fvec.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
|
||||
info->phys_velocity.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->phys_velocity.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->phys_velocity.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
|
||||
info->phys_rotvel.x = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->phys_rotvel.y = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
info->phys_rotvel.z = GET_INTEL_INT(&data[loc]); loc += 4;
|
||||
|
||||
info->obj_segnum = GET_INTEL_SHORT(&data[loc]); loc += 2;
|
||||
info->data_size = GET_INTEL_SHORT(&data[loc]); loc += 2;
|
||||
info->playernum = data[loc]; loc++;
|
||||
info->obj_render_type = data[loc]; loc++;
|
||||
info->level_num = data[loc]; loc++;
|
||||
memcpy(info->data, &data[loc], info->data_size); loc += info->data_size;
|
||||
}
|
||||
#endif
|
||||
NetDrvSendPacketData( out_buffer, loc, server, node, address);
|
||||
}
|
||||
|
||||
void receive_frameinfo_packet(ubyte *data, frame_info *info, int short_packet)
|
||||
{
|
||||
int loc;
|
||||
|
||||
if (short_packet == 1) {
|
||||
loc = 0;
|
||||
info->type = data[loc]; loc++;
|
||||
info->playernum = data[loc]; loc++;
|
||||
info->obj_render_type = data[loc]; loc++;
|
||||
info->level_num = data[loc]; loc++;
|
||||
loc += 9+2*3+2+2*3; // skip shortpos structure
|
||||
info->data_size = GET_INTEL_SHORT(data + loc); loc+=2;
|
||||
memcpy(info->data, &(data[loc]), info->data_size);
|
||||
} else if (short_packet == 2) {
|
||||
ushort tmpus;
|
||||
|
||||
loc = 0;
|
||||
info->type = data[loc]; loc++;
|
||||
info->numpackets = data[loc]; loc++;
|
||||
loc += 9+2*3+2+2*3; // skip shortpos structure
|
||||
tmpus = GET_INTEL_SHORT(data + loc); loc+=2;
|
||||
info->data_size = tmpus & 0xfff;
|
||||
info->playernum = (tmpus >> 12) & 7;
|
||||
info->obj_render_type = tmpus >> 15;
|
||||
info->numpackets |= Players[info->playernum].n_packets_got & (~255);
|
||||
if (info->numpackets - Players[info->playernum].n_packets_got > 224)
|
||||
info->numpackets -= 256;
|
||||
else if (Players[info->playernum].n_packets_got - info->numpackets > 128)
|
||||
info->numpackets += 256;
|
||||
info->level_num = data[loc]; loc++;
|
||||
memcpy(info->data, &(data[loc]), info->data_size);
|
||||
} else {
|
||||
loc = 0;
|
||||
info->type = data[loc]; loc++; loc += 3; // skip three for pad byte
|
||||
info->numpackets = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
|
||||
info->obj_pos.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_pos.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_pos.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
|
||||
info->obj_orient.rvec.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.rvec.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.rvec.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.uvec.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.uvec.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.uvec.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.fvec.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.fvec.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->obj_orient.fvec.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
|
||||
info->phys_velocity.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->phys_velocity.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->phys_velocity.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
|
||||
info->phys_rotvel.x = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->phys_rotvel.y = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
info->phys_rotvel.z = GET_INTEL_INT(&(data[loc])); loc += 4;
|
||||
|
||||
info->obj_segnum = GET_INTEL_SHORT(&(data[loc])); loc += 2;
|
||||
info->data_size = GET_INTEL_SHORT(&(data[loc])); loc += 2;
|
||||
|
||||
info->playernum = data[loc]; loc++;
|
||||
info->obj_render_type = data[loc]; loc++;
|
||||
info->level_num = data[loc]; loc++;
|
||||
memcpy(info->data, &(data[loc]), info->data_size);
|
||||
}
|
||||
}
|
||||
|
||||
void swap_object(object *obj)
|
||||
{
|
||||
|
|
|
@ -18,8 +18,17 @@ void send_sequence_packet(sequence_packet seq, ubyte *server, ubyte *node, ubyte
|
|||
void receive_sequence_packet(ubyte *data, sequence_packet *seq);
|
||||
void send_netgame_packet(ubyte *server, ubyte *node);
|
||||
void receive_netgame_packet(ubyte *data, netgame_info *netgame, int d1x);
|
||||
void send_frameinfo_packet(ubyte *server, ubyte *node, ubyte *address, int short_packet);
|
||||
void receive_frameinfo_packet(ubyte *data, frame_info *info, int short_packet);
|
||||
void swap_object(object *obj);
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
void send_frameinfo_packet(frame_info *info, ubyte *server, ubyte *node, ubyte *net_address);
|
||||
void receive_frameinfo_packet(ubyte *data, frame_info *info);
|
||||
#else // !WORDS_BIGENDIAN
|
||||
#define send_frameinfo_packet(info, server, node, net_address) \
|
||||
NetDrvSendPacketData((ubyte *)info, sizeof(frame_info) - NET_XDATA_SIZE + (info)->data_size, server, node, net_address)
|
||||
#define receive_frameinfo_packet(data, info) \
|
||||
do { memcpy((ubyte *)(info), data, sizeof(frame_info) - NET_XDATA_SIZE); \
|
||||
memcpy((info)->data, &data[sizeof(frame_info) - NET_XDATA_SIZE], (info)->data_size); } while(0)
|
||||
#endif // WORDS_BIGENDIAN
|
||||
|
||||
#endif
|
||||
|
|
332
main/network.c
332
main/network.c
|
@ -71,7 +71,9 @@ void network_read_sync_packet( ubyte * sp, int d1x );
|
|||
void network_flush();
|
||||
void network_listen();
|
||||
void network_ping(ubyte flag, int pnum);
|
||||
void network_read_pdata_packet( ubyte *data, int short_pos );
|
||||
void network_process_pdata(char *data);
|
||||
void network_read_pdata_packet(ubyte *data);
|
||||
void network_read_pdata_short_packet(short_frame_info *pd);
|
||||
int network_compare_players(netplayer_info *pl1, netplayer_info *pl2);
|
||||
void DoRefuseStuff(sequence_packet *their);
|
||||
int show_game_stats(int choice);
|
||||
|
@ -1383,17 +1385,10 @@ void network_process_packet(ubyte *data, int length )
|
|||
network_read_sync_packet(data, 0);
|
||||
break;
|
||||
case PID_PDATA:
|
||||
if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) )) {
|
||||
network_read_pdata_packet(data, 0);
|
||||
if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) || Network_status==NETSTAT_WAITING)) {
|
||||
network_process_pdata((char *)data);
|
||||
}
|
||||
break;
|
||||
//added on 8/4/98 by Matt Mueller
|
||||
case PID_SHORTPDATA:
|
||||
if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) )) {
|
||||
network_read_pdata_packet(data, 1);
|
||||
}
|
||||
break;
|
||||
//end modified section - Matt Mueller
|
||||
case PID_OBJECT_DATA:
|
||||
if (Network_status == NETSTAT_WAITING)
|
||||
network_read_object_packet(data);
|
||||
|
@ -1426,10 +1421,6 @@ void network_process_packet(ubyte *data, int length )
|
|||
if (Network_status == NETSTAT_WAITING)
|
||||
network_read_sync_packet(data, 1);
|
||||
break;
|
||||
case PID_PDATA_SHORT2:
|
||||
if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) )) {
|
||||
network_read_pdata_packet(data, 2);
|
||||
}break;
|
||||
//added 03/04/99 Matt Mueller - new direct data packets..
|
||||
case PID_DIRECTDATA:
|
||||
if ((Game_mode&GM_NETWORK) && ((Network_status == NETSTAT_PLAYING)||(Network_status == NETSTAT_ENDLEVEL) )) {
|
||||
|
@ -3275,6 +3266,7 @@ fix last_timeout_check = 0;
|
|||
void network_do_frame(int force, int listen)
|
||||
{
|
||||
int i;
|
||||
short_frame_info ShortSyncPack;
|
||||
|
||||
if (!(Game_mode&GM_NETWORK)) return;
|
||||
|
||||
|
@ -3291,6 +3283,7 @@ void network_do_frame(int force, int listen)
|
|||
if ( (last_send_time > (F1_0 / Network_pps)) ||
|
||||
(Network_laser_fired) || force || PacketUrgent ) {
|
||||
if ( Players[Player_num].connected ) {
|
||||
int objnum = Players[Player_num].objnum;
|
||||
PacketUrgent = 0;
|
||||
|
||||
if (listen) {
|
||||
|
@ -3302,12 +3295,71 @@ void network_do_frame(int force, int listen)
|
|||
|
||||
last_send_time = 0;
|
||||
|
||||
for (i=0; i<N_players; i++ ) {
|
||||
if ( (Players[i].connected) && (i!=Player_num ) ) {
|
||||
MySyncPack.numpackets = ++Players[i].n_packets_sent; // adb: changed ...++ to ++... to prevent bogus missed packets msg
|
||||
send_frameinfo_packet(Netgame.players[i].server, Netgame.players[i].node, Players[i].net_address, (Netgame.flags & NETFLAG_SHORTPACKETS) ? 2 : 0);
|
||||
if (Netgame.flags & NETFLAG_SHORTPACKETS)
|
||||
{
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
ubyte send_data[MAX_DATA_SIZE];
|
||||
//int squished_size;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
memset(&ShortSyncPack,0,sizeof(short_frame_info));
|
||||
create_shortpos(&ShortSyncPack.thepos, Objects+objnum, 0);
|
||||
ShortSyncPack.type = PID_PDATA;
|
||||
ShortSyncPack.playernum = Player_num;
|
||||
ShortSyncPack.obj_render_type = Objects[objnum].render_type;
|
||||
ShortSyncPack.level_num = Current_level_num;
|
||||
ShortSyncPack.data_size = MySyncPack.data_size;
|
||||
memcpy (&ShortSyncPack.data[0],&MySyncPack.data[0],MySyncPack.data_size);
|
||||
|
||||
MySyncPack.numpackets = INTEL_INT(Players[0].n_packets_sent++);
|
||||
ShortSyncPack.numpackets = MySyncPack.numpackets;
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
// NetDrvSendGamePacket((ubyte*)&ShortSyncPack, sizeof(short_frame_info) - NET_XDATA_SIZE + MySyncPack.data_size);
|
||||
for(i=0; i<N_players; i++) {
|
||||
if(Players[i].connected && (i != Player_num))
|
||||
NetDrvSendPacketData((ubyte*)&ShortSyncPack, sizeof(short_frame_info) - NET_XDATA_SIZE + MySyncPack.data_size, Netgame.players[i].server, Netgame.players[i].node,Players[i].net_address);
|
||||
}
|
||||
#else
|
||||
squish_short_frame_info(ShortSyncPack, send_data);
|
||||
// NetDrvSendGamePacket((ubyte*)send_data, IPX_SHORT_INFO_SIZE-NET_XDATA_SIZE+MySyncPack.data_size);
|
||||
for(i=0; i<N_players; i++) {
|
||||
if(Players[i].connected && (i != Player_num))
|
||||
NetDrvSendPacketData((ubyte*)send_data, IPX_SHORT_INFO_SIZE-NET_XDATA_SIZE+MySyncPack.data_size, Netgame.players[i].server, Netgame.players[i].node,Players[i].net_address);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
else // If long packets
|
||||
{
|
||||
int send_data_size, i;
|
||||
|
||||
MySyncPack.numpackets = Players[0].n_packets_sent++;
|
||||
MySyncPack.type = PID_PDATA;
|
||||
MySyncPack.playernum = Player_num;
|
||||
MySyncPack.obj_render_type = Objects[objnum].render_type;
|
||||
MySyncPack.level_num = Current_level_num;
|
||||
MySyncPack.obj_segnum = Objects[objnum].segnum;
|
||||
MySyncPack.obj_pos = Objects[objnum].pos;
|
||||
MySyncPack.obj_orient = Objects[objnum].orient;
|
||||
MySyncPack.phys_velocity = Objects[objnum].mtype.phys_info.velocity;
|
||||
MySyncPack.phys_rotvel = Objects[objnum].mtype.phys_info.rotvel;
|
||||
|
||||
send_data_size = MySyncPack.data_size; // do this so correct size data is sent
|
||||
|
||||
// NetDrvSendGamePacket((ubyte*)&MySyncPack, sizeof(frame_info) - NET_XDATA_SIZE + send_data_size);
|
||||
for(i=0; i<N_players; i++)
|
||||
{
|
||||
if(Players[i].connected && (i != Player_num))
|
||||
{
|
||||
send_frameinfo_packet(&MySyncPack, Netgame.players[i].server, Netgame.players[i].node,Players[i].net_address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
MySyncPack.data_size = 0; // Start data over at 0 length.
|
||||
if (Fuelcen_control_center_destroyed)
|
||||
network_send_endlevel_packet();
|
||||
|
@ -3376,6 +3428,7 @@ void network_consistency_error(void)
|
|||
multi_reset_stuff();
|
||||
}
|
||||
|
||||
#if 0
|
||||
void network_read_pdata_packet(ubyte *data, int short_packet)
|
||||
{
|
||||
int TheirPlayernum;
|
||||
|
@ -3484,6 +3537,249 @@ void network_read_pdata_packet(ubyte *data, int short_packet)
|
|||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
void network_process_pdata (char *data)
|
||||
{
|
||||
Assert (Game_mode & GM_NETWORK);
|
||||
|
||||
if (Netgame.flags & NETFLAG_SHORTPACKETS)
|
||||
network_read_pdata_short_packet ((short_frame_info *)data);
|
||||
else
|
||||
network_read_pdata_packet ((ubyte *) data);
|
||||
}
|
||||
|
||||
void network_read_pdata_packet(ubyte *data )
|
||||
{
|
||||
int TheirPlayernum;
|
||||
int TheirObjnum;
|
||||
object * TheirObj = NULL;
|
||||
frame_info *pd;
|
||||
frame_info frame_data;
|
||||
|
||||
pd = &frame_data;
|
||||
receive_frameinfo_packet(data, &frame_data);
|
||||
|
||||
TheirPlayernum = pd->playernum;
|
||||
TheirObjnum = Players[pd->playernum].objnum;
|
||||
|
||||
if (TheirPlayernum < 0) {
|
||||
Int3(); // This packet is bogus!!
|
||||
return;
|
||||
}
|
||||
|
||||
if (!multi_quit_game && (TheirPlayernum >= N_players))
|
||||
{
|
||||
if (Network_status!=NETSTAT_WAITING)
|
||||
{
|
||||
Int3(); // We missed an important packet!
|
||||
network_consistency_error();
|
||||
return;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
if (Endlevel_sequence || (Network_status == NETSTAT_ENDLEVEL) ) {
|
||||
int old_Endlevel_sequence = Endlevel_sequence;
|
||||
Endlevel_sequence = 1;
|
||||
if ( pd->data_size>0 )
|
||||
{
|
||||
// pass pd->data to some parser function....
|
||||
multi_process_bigdata( pd->data, pd->data_size );
|
||||
}
|
||||
Endlevel_sequence = old_Endlevel_sequence;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((sbyte)pd->level_num != Current_level_num)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TheirObj = &Objects[TheirObjnum];
|
||||
|
||||
//------------- Keep track of missed packets -----------------
|
||||
Players[TheirPlayernum].n_packets_got++;
|
||||
LastPacketTime[TheirPlayernum] = timer_get_approx_seconds();
|
||||
if ( pd->numpackets != Players[TheirPlayernum].n_packets_got ) {
|
||||
missed_packets += pd->numpackets-Players[TheirPlayernum].n_packets_got;
|
||||
|
||||
Players[TheirPlayernum].n_packets_got = pd->numpackets;
|
||||
}
|
||||
|
||||
//------------ Read the player's ship's object info ----------------------
|
||||
TheirObj->pos = pd->obj_pos;
|
||||
TheirObj->orient = pd->obj_orient;
|
||||
TheirObj->mtype.phys_info.velocity = pd->phys_velocity;
|
||||
TheirObj->mtype.phys_info.rotvel = pd->phys_rotvel;
|
||||
|
||||
if ((TheirObj->render_type != pd->obj_render_type) && (pd->obj_render_type == RT_POLYOBJ))
|
||||
multi_make_ghost_player(TheirPlayernum);
|
||||
|
||||
obj_relink(TheirObjnum,pd->obj_segnum);
|
||||
|
||||
if (TheirObj->movement_type == MT_PHYSICS)
|
||||
set_thrust_from_velocity(TheirObj);
|
||||
|
||||
//------------ Welcome them back if reconnecting --------------
|
||||
if (!Players[TheirPlayernum].connected) {
|
||||
Players[TheirPlayernum].connected = 1;
|
||||
|
||||
if (Newdemo_state == ND_STATE_RECORDING)
|
||||
newdemo_record_multi_reconnect(TheirPlayernum);
|
||||
|
||||
multi_make_ghost_player(TheirPlayernum);
|
||||
|
||||
create_player_appearance_effect(&Objects[TheirObjnum]);
|
||||
|
||||
digi_play_sample( SOUND_HUD_MESSAGE, F1_0);
|
||||
|
||||
HUD_init_message( "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN );
|
||||
|
||||
multi_send_score();
|
||||
}
|
||||
|
||||
//------------ Parse the extra data at the end ---------------
|
||||
|
||||
if ( pd->data_size>0 ) {
|
||||
// pass pd->data to some parser function....
|
||||
multi_process_bigdata( pd->data, pd->data_size );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
void get_short_frame_info(ubyte *old_info, short_frame_info *new_info)
|
||||
{
|
||||
int loc = 0;
|
||||
|
||||
new_info->type = old_info[loc]; loc++;
|
||||
/* skip three for pad byte */ loc += 3;
|
||||
memcpy(&(new_info->numpackets), &(old_info[loc]), 4); loc += 4;
|
||||
new_info->numpackets = INTEL_INT(new_info->numpackets);
|
||||
memcpy(new_info->thepos.bytemat, &(old_info[loc]), 9); loc += 9;
|
||||
memcpy(&(new_info->thepos.xo), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.yo), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.zo), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.segment), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.velx), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.vely), &(old_info[loc]), 2); loc += 2;
|
||||
memcpy(&(new_info->thepos.velz), &(old_info[loc]), 2); loc += 2;
|
||||
new_info->thepos.xo = INTEL_SHORT(new_info->thepos.xo);
|
||||
new_info->thepos.yo = INTEL_SHORT(new_info->thepos.yo);
|
||||
new_info->thepos.zo = INTEL_SHORT(new_info->thepos.zo);
|
||||
new_info->thepos.segment = INTEL_SHORT(new_info->thepos.segment);
|
||||
new_info->thepos.velx = INTEL_SHORT(new_info->thepos.velx);
|
||||
new_info->thepos.vely = INTEL_SHORT(new_info->thepos.vely);
|
||||
new_info->thepos.velz = INTEL_SHORT(new_info->thepos.velz);
|
||||
|
||||
memcpy(&(new_info->data_size), &(old_info[loc]), 2); loc += 2;
|
||||
new_info->data_size = INTEL_SHORT(new_info->data_size);
|
||||
new_info->playernum = old_info[loc]; loc++;
|
||||
new_info->obj_render_type = old_info[loc]; loc++;
|
||||
new_info->level_num = old_info[loc]; loc++;
|
||||
memcpy(new_info->data, &(old_info[loc]), new_info->data_size);
|
||||
}
|
||||
#else
|
||||
#define get_short_frame_info(old_info, new_info) \
|
||||
memcpy(new_info, old_info, sizeof(short_frame_info))
|
||||
#endif
|
||||
|
||||
void network_read_pdata_short_packet(short_frame_info *pd )
|
||||
{
|
||||
int TheirPlayernum;
|
||||
int TheirObjnum;
|
||||
object * TheirObj = NULL;
|
||||
short_frame_info new_pd;
|
||||
|
||||
// short frame info is not aligned because of shortpos. The mac
|
||||
// will call totally hacked and gross function to fix this up.
|
||||
|
||||
get_short_frame_info((ubyte *)pd, &new_pd);
|
||||
|
||||
TheirPlayernum = new_pd.playernum;
|
||||
TheirObjnum = Players[new_pd.playernum].objnum;
|
||||
|
||||
if (TheirPlayernum < 0) {
|
||||
Int3(); // This packet is bogus!!
|
||||
return;
|
||||
}
|
||||
if (!multi_quit_game && (TheirPlayernum >= N_players)) {
|
||||
if (Network_status!=NETSTAT_WAITING)
|
||||
{
|
||||
Int3(); // We missed an important packet!
|
||||
network_consistency_error();
|
||||
return;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
if (Endlevel_sequence || (Network_status == NETSTAT_ENDLEVEL) ) {
|
||||
int old_Endlevel_sequence = Endlevel_sequence;
|
||||
Endlevel_sequence = 1;
|
||||
if ( new_pd.data_size>0 ) {
|
||||
// pass pd->data to some parser function....
|
||||
multi_process_bigdata( new_pd.data, new_pd.data_size );
|
||||
}
|
||||
Endlevel_sequence = old_Endlevel_sequence;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((sbyte)new_pd.level_num != Current_level_num)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TheirObj = &Objects[TheirObjnum];
|
||||
|
||||
//------------- Keep track of missed packets -----------------
|
||||
Players[TheirPlayernum].n_packets_got++;
|
||||
LastPacketTime[TheirPlayernum] = timer_get_approx_seconds();
|
||||
if ( pd->numpackets != Players[TheirPlayernum].n_packets_got ) {
|
||||
missed_packets += pd->numpackets-Players[TheirPlayernum].n_packets_got;
|
||||
|
||||
Players[TheirPlayernum].n_packets_got = pd->numpackets;
|
||||
}
|
||||
|
||||
//------------ Read the player's ship's object info ----------------------
|
||||
|
||||
extract_shortpos(TheirObj, &new_pd.thepos, 0);
|
||||
|
||||
if ((TheirObj->render_type != new_pd.obj_render_type) && (new_pd.obj_render_type == RT_POLYOBJ))
|
||||
multi_make_ghost_player(TheirPlayernum);
|
||||
|
||||
if (TheirObj->movement_type == MT_PHYSICS)
|
||||
set_thrust_from_velocity(TheirObj);
|
||||
|
||||
//------------ Welcome them back if reconnecting --------------
|
||||
if (!Players[TheirPlayernum].connected) {
|
||||
Players[TheirPlayernum].connected = 1;
|
||||
|
||||
if (Newdemo_state == ND_STATE_RECORDING)
|
||||
newdemo_record_multi_reconnect(TheirPlayernum);
|
||||
|
||||
multi_make_ghost_player(TheirPlayernum);
|
||||
|
||||
create_player_appearance_effect(&Objects[TheirObjnum]);
|
||||
|
||||
digi_play_sample( SOUND_HUD_MESSAGE, F1_0);
|
||||
|
||||
HUD_init_message( "'%s' %s", Players[TheirPlayernum].callsign, TXT_REJOIN );
|
||||
|
||||
multi_send_score();
|
||||
}
|
||||
|
||||
//------------ Parse the extra data at the end ---------------
|
||||
|
||||
if ( new_pd.data_size>0 ) {
|
||||
// pass pd->data to some parser function....
|
||||
multi_process_bigdata( new_pd.data, new_pd.data_size );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
int network_who_is_master(void)
|
||||
{
|
||||
|
|
|
@ -86,6 +86,22 @@ typedef struct frame_info {
|
|||
} __pack__ frame_info;
|
||||
#endif
|
||||
|
||||
// short_frame_info is not aligned -- 01/18/96 -- MWA
|
||||
// won't align because of shortpos. Shortpos needs
|
||||
// to stay in current form.
|
||||
|
||||
typedef struct short_frame_info {
|
||||
ubyte type; // What type of packet
|
||||
ubyte pad[3]; // Pad out length of frame_info packet
|
||||
int numpackets;
|
||||
shortpos thepos;
|
||||
ushort data_size; // Size of data appended to the net packet
|
||||
ubyte playernum;
|
||||
ubyte obj_render_type;
|
||||
ubyte level_num;
|
||||
char data[NET_XDATA_SIZE]; // extra data to be tacked on the end
|
||||
} __pack__ short_frame_info;
|
||||
|
||||
void network_start_game();
|
||||
void network_join_game();
|
||||
void network_rejoin_game();
|
||||
|
@ -187,13 +203,11 @@ void network_send_game_info(sequence_packet *their, int light);
|
|||
#define PID_GAME_INFO 37
|
||||
#endif
|
||||
|
||||
#define PID_SHORTPDATA 48
|
||||
#define PID_D1X_GAME_INFO_REQ 65
|
||||
#define PID_D1X_GAME_INFO 66
|
||||
#define PID_D1X_GAME_LITE_REQ 67
|
||||
#define PID_D1X_GAME_LITE 68
|
||||
#define PID_D1X_SYNC 69
|
||||
#define PID_PDATA_SHORT2 70
|
||||
#define PID_D1X_REQUEST 71
|
||||
//added 03/04/99 Matt Mueller - send multi data, without extra baggage
|
||||
#define PID_DIRECTDATA 72
|
||||
|
|
Loading…
Reference in a new issue