54 #define OO_MAX_SIZE 480
57 #define OO_POS_UPDATE_TOLERANCE 100.0f
60 #define OO_POS_NEW (1<<0) //
61 #define OO_ORIENT_NEW (1<<1) //
62 #define OO_HULL_NEW (1<<2) // Hull AND shields
63 #define OO_AFTERBURNER_NEW (1<<3) //
64 #define OO_SUBSYSTEMS_AND_AI_NEW (1<<4) //
65 #define OO_PRIMARY_BANK (1<<5) // if this is set, fighter has selected bank one
66 #define OO_PRIMARY_LINKED (1<<6) // if this is set, banks are linked
67 #define OO_TRIGGER_DOWN (1<<7) // if this is set, trigger is DOWN
69 #define OO_VIEW_CONE_DOT (0.1f)
70 #define OO_VIEW_DIFF_TOL (0.15f) // if the dotproducts differ this far between frames, he's coming into view
73 #define OO_MAX_TIMESTAMP 2500
77 #define OO_NEAR_DIST (200.0f)
79 #define OO_MIDRANGE_DIST (600.0f)
81 #define OO_FAR_DIST (1400.0f)
84 #define OO_HULL_SHIELD_TIME 600
85 #define OO_SUBSYS_TIME 1000
171 if((index1 < 0) || (index2 < 0) || (
Ships[index1].objnum < 0) || (
Ships[index2].objnum < 0)){
177 obj2 = &
Objects[Ships[index2].objnum];
188 if((dot1 < 0.0
f) && (dot2 >= 0.0
f)){
190 }
else if((dot2 < 0.0
f) && (dot1 >= 0.0
f)){
195 return (dist1 < dist2);
256 if(ship_index < MAX_SHIPS){
262 OO_player_obj = player_obj;
273 char t_subsys, l_subsys;
348 #define PACK_PERCENT(v) { ubyte upercent; if(v < 0.0f){v = 0.0f;} upercent = (v * 255.0f) <= 255.0f ? (ubyte)(v * 255.0f) : (ubyte)255; memcpy(data + packet_size + header_bytes, &upercent, sizeof(ubyte)); packet_size++; }
349 #define PACK_BYTE(v) { memcpy( data + packet_size + header_bytes, &v, 1 ); packet_size += 1; }
350 #define PACK_USHORT(v) { short swap = INTEL_SHORT(v); memcpy( data + packet_size + header_bytes, &swap, sizeof(short) ); packet_size += sizeof(short); }
351 #define PACK_SHORT(v) { ushort swap = INTEL_SHORT(v); memcpy( data + packet_size + header_bytes, &swap, sizeof(ushort) ); packet_size += sizeof(ushort); }
352 #define PACK_INT(v) { int swap = INTEL_INT(v); memcpy( data + packet_size + header_bytes, &swap, sizeof(int) ); packet_size += sizeof(int); }
448 if ( (temp < 0.004
f) && (temp > 0.0
f) ) {
497 target_signature = 0;
520 ubyte support_extra = 0;
546 Assert(packet_size < 255-1);
547 if(packet_size >= 255-1){
550 data_size = (
ubyte)packet_size;
569 packet_size += data_size;
572 memcpy(data_out, data, packet_size);
586 Error(
LOCATION,
"Invalid net_player pointer passed to multi_oo_unpack_client\n");
588 memcpy(&in_flags, data,
sizeof(
ubyte));
639 if((shipp != NULL) && (shipp->
ai_index != -1)){
656 char t_subsys,l_subsys;
670 if((tobj != NULL) && (pl != NULL) && (pl->
m_player->
objnum != -1)){
697 #define UNPACK_PERCENT(v) { ubyte temp_byte; memcpy(&temp_byte, data + offset, sizeof(ubyte)); v = (float)temp_byte / 255.0f; offset++;}
703 ubyte data_size, oo_flags;
784 for(idx=0; idx<4; idx++){
824 if(oo_flags & OO_POS_NEW){
829 pobjp->
pos = new_pos;
836 oo_interp_points[shipp -
Ships][0] = oo_interp_points[shipp -
Ships][1];
837 oo_interp_points[shipp -
Ships][1] = new_pos;
847 if(oo_flags & OO_ORIENT_NEW){
848 pobjp->
orient = new_orient;
873 ubyte n_subsystems, subsys_count;
881 for ( i = 0; i < n_subsystems; i++ ){
890 val = subsystem_percent[subsys_count] * subsysp->
max_hits;
902 if(subsys_count >= n_subsystems){
926 if ( target_objp == NULL ){
934 float weapon_energy_pct;
944 int ai_flags, ai_mode, ai_submode;
1087 float eye_dot, dist;
1092 ushort cur_pos_chksum = 0;
1093 ushort cur_orient_chksum = 0;
1097 if(!(player_index >= 0) || !(player_index <
MAX_PLAYERS)){
1272 memcpy(data + packet_size, data_add, add_size);
1273 packet_size += add_size;
1285 nprintf((
"Network",
"Capping client\n"));
1316 memcpy(data + packet_size,data_add,add_size);
1317 packet_size += add_size;
1325 if(packet_size > 3){
1366 if(player_index != -1){
1376 while(stop == 0xff){
1388 int cur, s_idx,
idx;
1408 shipp = &
Ships[s_idx];
1465 memcpy(data + packet_size, data_add, add_size);
1466 packet_size += add_size;
1494 nprintf((
"Network",
"Attempting to affect player object.\n"));
1503 nprintf((
"Network",
"Index for changed object found: [%d].\n",idx));
1505 if( idx >= MAX_PLAYERS ) {
1524 memcpy(data + packet_size, data_add, add_size);
1525 packet_size += add_size;
1553 #define OO_LIMIT_LOW 1800
1554 #define OO_LIMIT_MED 3400
1555 #define OO_LIMIT_HIGH 100000000
1558 #define OO_CIRATE 85 // 15x a second
1567 #define RATE_UPDATE_TIME 1250 // in ms
1572 DCF(oog,
"Sets bandwidth granularity (Multiplayer)")
1576 dc_printf(
"Sets bandwidth granularity\n");
1767 int num_connections;
1780 if(num_connections <= 0){
1781 num_connections = 1;
1907 float u = 0.5f + (t * 0.5f);
1908 vec3d p_bad, p_good;
1953 DCF(
oo_error,
"Sets error factor for flight path prediction physics (Multiplayer)")
1988 *new_pos = *cur_pos;
1993 a = oo_interp_points[ship_index][0];
1996 m_copy = *cur_orient;
1997 p_copy = *cur_phys_info;
2002 a = oo_interp_points[ship_index][0];
2003 b = oo_interp_points[ship_index][1];
2004 c = oo_interp_points[ship_index][1];
2005 m_copy = *new_orient;
2006 p_copy = *new_phys_info;
2019 DCF(bez,
"Toggles rendering of player ship trajectory interpolation splines (Multiplayer) *disabled*")
int fire_countermeasure_count
#define OOC_LOCKING_ON_CENTER
int oo_interp_count[MAX_SHIPS]
int timestamp(int delta_ms)
#define MY_NET_PLAYER_NUM
float get_max_shield_quad(object *objp)
model_subsystem * system_info
void multi_oo_server_process()
int multi_oo_rate_exceeded(net_player *pl)
#define timestamp_elapsed_safe(_a, _b)
int multi_oo_maybe_update(net_player *pl, object *obj, ubyte *data)
void bez_set_points(int _num_pts, vec3d *_pts[MAX_BEZ_PTS])
#define OO_HULL_SHIELD_TIME
np_update np_updates[MAX_PLAYERS]
int Multi_oo_rear_medium_update_times[MAX_OBJ_UPDATE_LEVELS]
int multi_num_connections()
int multi_pack_unpack_orient(int write, ubyte *data, matrix *orient)
float vm_vec_mag(const vec3d *v)
#define PACKET_SET_SIZE()
#define OOC_TARGET_SEEK_LOCK
#define MULTI_STANDALONE(np)
void multi_io_send(net_player *pl, ubyte *data, int len)
int ship_fire_primary(object *obj, int stream_weapons, int force)
float oo_arrive_time[MAX_SHIPS][5]
int find_player_id(short player_id)
GLuint GLenum GLsizei GLsizei GLint GLint GLboolean packed
int Multi_cirate_can_send
ai_info Ai_info[MAX_AI_INFO]
int multi_oo_unpack_data(net_player *pl, ubyte *data)
#define END_OF_LIST(head)
int multi_pack_unpack_vel(int write, ubyte *data, matrix *orient, vec3d *pos, physics_info *pi)
ship_subsys * targeted_subsys
void multi_oo_reset_sequencing()
bez_spline oo_interp_splines[MAX_SHIPS][2]
GLfloat GLfloat GLfloat v2
char stamp[STAMP_STRING_LENGTH]
void multi_oo_send_control_info()
float oo_arrive_time_next[MAX_SHIPS]
ship_subsys_info subsys_info[SUBSYSTEM_MAX]
void multi_oo_process_all(net_player *pl)
#define STANDALONE_SHIP_SIG
void obj_player_fire_stuff(object *objp, control_info ci)
#define DCF(function_name, help_text)
The potent DCF macro, used to define new debug commands for the console.
#define IS_VEC_NULL_SQ_SAFE(v)
#define OOC_AFTERBURNER_ON
int multi_oo_cirate_can_send()
bool Multi_oo_afterburn_hack
void multi_oo_build_ship_list(net_player *pl)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
#define OOC_PRIMARY_LINKED
void afterburners_stop(object *objp, int key_released)
#define NET_PLAYER_INDEX(np)
void multi_oo_process_update(ubyte *data, header *hinfo)
ship_subsys * ship_get_indexed_subsys(ship *sp, int index, vec3d *attacker_pos)
void multi_oo_reset_status_timestamp(object *objp, int player_index)
struct matrix::@228::@230 vec
#define NETINFO_FLAG_AM_MASTER
float ship_max_hull_strength
void vm_vec_scale(vec3d *dest, float s)
dc_printf("Ganularity set to %i", OO_gran)
GLboolean GLboolean GLboolean GLboolean a
vec3d oo_interp_points[MAX_SHIPS][2]
void bez_get_point(vec3d *out, float u)
float get_hull_pct(object *objp)
int ship_get_index_from_subsys(ship_subsys *ssp, int objnum, int error_bypass)
void physics_sim_rot(matrix *orient, physics_info *pi, float sim_time)
#define MAX_OBJ_UPDATE_LEVELS
int multi_oo_is_interp_object(object *objp)
#define MAX_MODEL_SUBSYSTEMS
int multi_pack_unpack_position(int write, ubyte *data, vec3d *pos)
#define OO_SUBSYSTEMS_AND_AI_NEW
bool multi_oo_sort_func(const short &index1, const short &index2)
int Multi_oo_front_near_update_times[MAX_OBJ_UPDATE_LEVELS]
#define SF_PRIMARY_LINKED
short OO_ship_index[MAX_SHIPS]
net_player_server_info s_info
int Multi_oo_front_medium_update_times[MAX_OBJ_UPDATE_LEVELS]
float vm_vec_dist(const vec3d *v0, const vec3d *v1)
float aggregate_current_hits
bool dc_optional_string_either(const char *str1, const char *str2)
Searches for an optional string and it's alias.
#define OO_PRIMARY_LINKED
#define OO_ORIENT_RET_SIZE
#define OO_ROTVEL_RET_SIZE
void ship_recalc_subsys_strength(ship *shipp)
void multi_oo_send_changed_object(object *changedobj)
#define OO_AFTERBURNER_NEW
#define OO_POS_UPDATE_TOLERANCE
object Objects[MAX_OBJECTS]
int multi_rate_add(int np_index, char *type, int size)
#define NETINFO_FLAG_LIMBO
void multi_oo_reset_subsys_timestamp(object *objp, int player_index)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define GM_STANDALONE_SERVER
void dc_stuff_float(float *f)
Stuffs a float to the given variable.
#define OOC_FIRE_SECONDARY
void multi_oo_rate_init(net_player *pl)
void dc_stuff_int(int *i)
Stuffs an int to the given variable. Supports binary (0b), hexadecimal (0x), and octal (0o) formats...
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
GLboolean GLboolean GLboolean b
void multi_oo_update_server_rate()
void physics_sim(vec3d *position, matrix *orient, physics_info *pi, float sim_time)
void afterburners_start(object *objp)
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
void multi_oo_client_process()
int multi_oo_unpack_client_data(net_player *pl, ubyte *data)
void multi_oo_interp(object *objp)
#define MULTI_CONNECTED(np)
#define OBJ_UPDATE_MEDIUM
#define NETINFO_FLAG_RESPAWNING
float vm_vec_copy_normalize(vec3d *dest, const vec3d *src)
ship_subsys * locking_subsys
#define MULTIPLAYER_MASTER
An overhauled/updated debug console to allow monitoring, testing, and general debugging of new featur...
SCP_vector< ship_info > Ship_info
#define SIF_KNOSSOS_DEVICE
void multi_oo_reset_timestamp(net_player *pl, object *objp, int range, int in_cone)
GLenum GLsizei GLenum GLenum const GLvoid * data
SCP_vector< float > shield_quadrant
#define OF_SHOULD_BE_DEAD
#define OOC_TARGET_LOCKED
GLsizei GLsizei GLuint * obj
object * multi_get_network_object(ushort net_signature)
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
void multi_oo_gameplay_init()
float oo_arrive_time_avg_diff[MAX_SHIPS]
int Multi_oo_rear_far_update_times[MAX_OBJ_UPDATE_LEVELS]
#define PF_AFTERBURNER_ON
int Multi_oo_front_far_update_times[MAX_OBJ_UPDATE_LEVELS]
void multi_oo_rate_init_all()
#define UNPACK_PERCENT(v)
void multi_oo_rate_process()
int oo_arrive_time_count[MAX_SHIPS]
int Multi_oo_target_update_times[MAX_OBJ_UPDATE_LEVELS]
net_player Net_players[MAX_PLAYERS]
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
void multi_oo_calc_interp_splines(int ship_index, vec3d *cur_pos, matrix *cur_orient, physics_info *cur_phys_info, vec3d *new_pos, matrix *new_orient, physics_info *new_phys_info)
multi_global_options Multi_options_g
int Multi_oo_rear_near_update_times[MAX_OBJ_UPDATE_LEVELS]
int multi_oo_pack_client_data(ubyte *data)
#define NET_PLAYER_NUM(np)
multi_local_options options
int current_target_is_locked
ushort cf_add_chksum_short(ushort seed, ubyte *buffer, int size)
float vm_vec_normalize(vec3d *v)
int multi_oo_pack_data(net_player *pl, object *objp, ubyte oo_flags, ubyte *data_out)
int multi_pack_unpack_rotvel(int write, ubyte *data, matrix *orient, vec3d *pos, physics_info *pi)