void ipx_send_broadcast_packet_data( ubyte * data, int datasize ) { int i, j; ubyte broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ubyte local_address[6]; // Set to all networks besides mine for (i=0; i<Ipx_num_networks; i++ ) { if ( memcmp( &Ipx_networks[i], &ipx_network, 4 ) ) { ipx_get_local_target( (ubyte *)&Ipx_networks[i], broadcast, local_address ); ipx_send_packet_data( data, datasize, (ubyte *)&Ipx_networks[i], broadcast, local_address ); } else { ipx_send_packet_data( data, datasize, (ubyte *)&Ipx_networks[i], broadcast, broadcast ); } } //OLDipx_send_packet_data( data, datasize, (ubyte *)&ipx_network, broadcast, broadcast ); // Send directly to all users not on my network or in the network list. for (i=0; i<Ipx_num_users; i++ ) { if ( memcmp( Ipx_users[i].network, &ipx_network, 4 ) ) { for (j=0; j<Ipx_num_networks; j++ ) { if (!memcmp( Ipx_users[i].network, &Ipx_networks[j], 4 )) goto SkipUser; } ipx_send_packet_data( data, datasize, Ipx_users[i].network, Ipx_users[i].node, Ipx_users[i].address ); SkipUser: j = 0; } } }
// Sends a non-localized packet... needs 4 byte server, 6 byte address void ipx_send_internetwork_packet_data( ubyte * data, int datasize, ubyte * server, ubyte *address ) { ubyte local_address[6]; if ( (*(uint *)server) != 0 ) { ipx_get_local_target( server, address, local_address ); ipx_send_packet_data( data, datasize, server, address, local_address ); } else { // Old method, no server info. ipx_send_packet_data( data, datasize, server, address, address ); } }
void send_sequence_packet(sequence_packet seq, ubyte *server, ubyte *node, ubyte *net_address) { short tmps; int loc; loc = 0; memset(out_buffer, 0, sizeof(out_buffer)); out_buffer[0] = seq.type; loc++; memcpy(&(out_buffer[loc]), seq.player.callsign, CALLSIGN_LEN+1); loc += CALLSIGN_LEN+1; memcpy(&(out_buffer[loc]), seq.player.server, 4); loc += 4; memcpy(&(out_buffer[loc]), seq.player.node, 6); loc += 6; tmps = swapshort(seq.player.socket); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; out_buffer[loc] = seq.player.connected; loc++; out_buffer[loc] = MULTI_PROTO_D1X_MINOR; loc++; if (net_address != NULL) ipx_send_packet_data( out_buffer, loc, server, node, net_address); else if ((server == NULL) && (node == NULL)) ipx_send_broadcast_packet_data( out_buffer, loc ); else ipx_send_internetwork_packet_data( out_buffer, loc, server, node); }
void send_frameinfo_packet(ubyte *server, ubyte *node, ubyte *address, int short_packet) { int loc, tmpi; short tmps; #ifndef SHAREWARE ushort tmpus; #endif object *pl_obj = &Objects[Players[Player_num].objnum]; loc = 0; memset(out_buffer, 0, IPX_MAX_DATA_SIZE); #ifdef SHAREWARE out_buffer[0] = PID_PDATA; loc++; tmpi = swapint(MySyncPack.numpackets); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmps = swapshort(Players[Player_num].objnum); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; out_buffer[loc] = Player_num; loc++; tmps = swapshort(pl_obj->segnum); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; tmpi = swapint((int)pl_obj->pos.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->pos.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->pos.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.thrust.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.thrust.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.thrust.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.mass); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.drag); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.brakes); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotthrust.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotthrust.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotthrust.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmps = swapshort((short)pl_obj->mtype.phys_info.turnroll); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; tmps = swapshort(pl_obj->mtype.phys_info.flags); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; out_buffer[loc] = pl_obj->render_type; loc++; out_buffer[loc] = Current_level_num; loc++; tmps = swapshort(MySyncPack.data_size); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; memcpy(&(out_buffer[loc]), MySyncPack.data, MySyncPack.data_size); loc += MySyncPack.data_size; #else 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); loc += 9+2*3+2+2*3; // go past shortpos structure *(ushort *)(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); loc += 9+2*3+2+2*3; // go past shortpos structure tmpus = MySyncPack.data_size | (Player_num << 12) | (pl_obj->render_type << 15); *(ushort *)(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 tmpi = swapint(MySyncPack.numpackets); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->pos.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->pos.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->pos.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.rvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.uvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->orient.fvec.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.velocity.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.x); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.y); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmpi = swapint((int)pl_obj->mtype.phys_info.rotvel.z); memcpy(&(out_buffer[loc]), &tmpi, 4); loc += 4; tmps = swapshort(pl_obj->segnum); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; tmps = swapshort(MySyncPack.data_size); memcpy(&(out_buffer[loc]), &tmps, 2); loc += 2; 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; } #endif #if 0 // adb: not possible (always array passed) if (address == NULL) ipx_send_internetwork_packet_data( out_buffer, loc, server, node ); else #endif ipx_send_packet_data( out_buffer, loc, server, node, address); }