FS2_Open
Open source remastering of the Freespace 2 engine
multi_observer.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 
13 #include "network/multi_observer.h"
14 #include "network/multi.h"
15 #include "network/multiutil.h"
16 #include "ship/ship.h"
17 #include "object/object.h"
18 #include "observer/observer.h"
19 #include "hud/hudconfig.h"
20 #include "playerman/managepilot.h"
21 #include "mission/missionparse.h"
22 #include "playerman/player.h"
23 #include "io/timer.h"
24 
25 
26 
27 // ---------------------------------------------------------------------------------------
28 // MULTI OBSERVER DEFINES/VARS
29 //
30 
31 
32 // ---------------------------------------------------------------------------------------
33 // MULTI OBSERVER FUNCTIONS
34 //
35 
36 // create a _permanent_ observer player
37 int multi_obs_create_player(int player_num,char *name,net_addr *addr,player *pl)
38 {
39  // blast the player struct
40  memset(&Net_players[player_num],0,sizeof(net_player));
41 
42  // Net_players[player_num].flags |= (NETINFO_FLAG_CONNECTED | NETINFO_FLAG_OBSERVER);
43  // DOH!!! The lack of this caused many bugs.
45  // memcpy(&Net_players[player_num].p_info.addr, addr, sizeof(net_addr));
46  Net_players[player_num].m_player = pl;
47 
48  // 6/3/98 -- don't set observer to update high...let it be whatever player set it at.
49  //Net_players[player_num].p_info.options.obj_update_level = OBJ_UPDATE_HIGH;
50 
51  // set up the net_player structure
52  pl->reset();
53 
54  stuff_netplayer_info( &Net_players[player_num], addr, 0, pl );
57  Net_players[player_num].s_info.kick_timestamp = -1;
58  Net_players[player_num].s_info.voice_token_timestamp = -1;
59  Net_players[player_num].s_info.tracker_security_last = -1;
60  Net_players[player_num].s_info.target_objnum = -1;
61  Net_players[player_num].s_info.accum_buttons = 0;
62 
63  // reset the ping for this player
64  multi_ping_reset(&Net_players[player_num].s_info.ping);
65 
66  // timestamp his last_full_update_time
68  Net_players[player_num].m_player->objnum = -1;
69 
70  // nil his file xfer handle
71  Net_players[player_num].s_info.xfer_handle = -1;
72 
73  // zero out his object update and control info sequencing data
74  Net_players[player_num].client_cinfo_seq = 0;
75  Net_players[player_num].client_server_seq = 0;
76 
77  // his kick timestamp
78  Net_players[player_num].s_info.kick_timestamp = -1;
79 
80  // nil his data rate timestamp stuff
81  Net_players[player_num].s_info.rate_stamp = -1;
82  Net_players[player_num].s_info.rate_bytes = 0;
83 
84  // nil packet buffer stuff
86  Net_players[player_num].s_info.reliable_buffer_size = 0;
87 
88  // callsign and short callsign
89  strcpy_s(pl->callsign,name);
92 
93  Net_players[player_num].sv_bytes_sent = 0;
94  Net_players[player_num].sv_last_pl = -1;
95  Net_players[player_num].cl_bytes_recvd = 0;
96  Net_players[player_num].cl_last_pl = -1;
97 
98  return 1;
99 }
100 
101 // create an explicit observer object and assign it to the passed player
103 {
104  int objnum;
105 
106  // create the basic observer object
108  Assert(objnum != -1);
109  Objects[objnum].flags |= OF_PLAYER_SHIP;
110  Objects[objnum].net_signature = 0;
111 
112  // put it a 1,1,1
113  Objects[objnum].pos.xyz.x = 1.0f;
114  Objects[objnum].pos.xyz.y = 1.0f;
115  Objects[objnum].pos.xyz.z = 1.0f;
116 
117  // assign this object to the player
118  pl->m_player->objnum = objnum;
119 }
120 
121 // create observer object locally, and additionally, setup some other information
122 // ( client-side equivalent of multi_obs_create_observer() )
124 {
125  int pobj_num;
126 
128 
129  // make me an observer object
131 
132  // set my object to be the observer object
134 
135  // create the default player ship object and use that as my default virtual "ship", and make it "invisible"
137  Assert(pobj_num != -1);
139  Player_ship = &Ships[Objects[pobj_num].instance];
140 
141  // make ship hidden from sensors so that this observer cannot target it. Observers really have two ships
142  // one observer, and one "Player_ship". Observer needs to ignore the Player_ship.
144  strcpy_s(Player_ship->ship_name, XSTR("Observer Ship",688));
145  Player_ai = &Ai_info[Ships[Objects[pobj_num].instance].ai_index];
146 
147  // configure the hud to be in "observer" mode
149 
150  // set some flags for myself
152 
153  // reset the control info structure
154  memset(&Player->ci,0,sizeof(control_info));
155 }
156 
157 // create objects for all known observers in the game at level start
158 // call this before entering a mission
159 // this implies for the local player in the case of a client or for _all_ players in the case of a server
161 {
162  int idx;
163 
164  // unset the OBS_PLAYER flag here for all net players
165  for(idx=0;idx<MAX_PLAYERS;idx++){
167  }
168 
169  // if i'm a client and I'm an observer, create an object for myself
171  // create my own observer object and setup other misc. data
173  }
174  // otherwise create stuff for all (permanent) observers in the game
175  else {
176  for(idx=0;idx<MAX_PLAYERS;idx++){
178  // make an observer object for the guy
180  }
181  }
182  }
183 }
184 
185 // if i'm an observer, zoom to near my targted object (if any)
187 {
188  vec3d direct;
189  float dist;
190 
191  // if i'm not an observer, do nothing
193  return;
194  }
195 
196  // if I have no targeted object, do nothing
197  if(Player_ai->target_objnum == -1){
198  return;
199  }
200 
201  // get the normalized direction vector between the observer and the targeted object
203  dist = vm_vec_mag(&direct);
204  vm_vec_normalize(&direct);
205 
206  // orient the guy correctly
207  vm_vec_ang_2_matrix(&Player_obj->orient,&direct,0.0f);
208 
209  // keep about 3 object radii away when moving
210  dist -= (Objects[Player_ai->target_objnum].radius * 3.0f);
211 
212  // get the movement vector
213  vm_vec_scale(&direct,dist);
214 
215  // move
216  vm_vec_add2(&Player_obj->pos,&direct);
217 }
int timestamp(int delta_ms)
Definition: timer.cpp:226
void obj_set_flags(object *obj, uint new_flags)
Definition: object.cpp:1000
int observer_create(matrix *orient, vec3d *pos)
Definition: observer.cpp:32
ushort client_server_seq
Definition: multi.h:468
ai_info * Player_ai
Definition: ai.cpp:24
control_info ci
Definition: player.h:126
int flags
Definition: player.h:104
int Game_mode
Definition: systemvars.cpp:24
net_player * Net_player
Definition: multi.cpp:94
ushort client_cinfo_seq
Definition: multi.h:467
float vm_vec_mag(const vec3d *v)
Definition: vecmat.cpp:325
#define NETINFO_FLAG_DO_NETWORKING
Definition: multi.h:610
player * m_player
Definition: multi.h:459
Assert(pm!=NULL)
int target_objnum
Definition: ai.h:339
int multi_obs_create_player(int player_num, char *name, net_addr *addr, player *pl)
matrix * vm_vec_ang_2_matrix(matrix *m, const vec3d *v, float a)
Definition: vecmat.cpp:801
Definition: pstypes.h:88
void multi_obs_create_observer_client()
int ai_index
Definition: ship.h:538
#define NETINFO_FLAG_OBSERVER
Definition: multi.h:605
ushort net_signature
Definition: object.h:163
struct vec3d::@225::@227 xyz
ai_info Ai_info[MAX_AI_INFO]
Definition: ai.cpp:23
#define INVALID_SOCKET
Definition: psnet2.h:53
void multi_obs_zoom_to_target()
#define NETINFO_FLAG_OBS_PLAYER
Definition: multi.h:606
uint flags
Definition: ship.h:644
int flags
Definition: multi.h:463
#define OF_PLAYER_SHIP
Definition: object.h:109
void reset()
#define OBJ_OBSERVER
Definition: object.h:43
vec3d pos
Definition: object.h:152
char callsign[CALLSIGN_LEN+1]
Definition: player.h:91
void multi_ping_reset(ping_struct *ps)
Definition: multi_ping.cpp:41
int instance
Definition: object.h:150
Definition: player.h:85
void vm_vec_add2(vec3d *dest, const vec3d *src)
Definition: vecmat.cpp:178
#define NETINFO_FLAG_AM_MASTER
Definition: multi.h:599
void vm_vec_scale(vec3d *dest, float s)
Definition: vecmat.cpp:248
#define GM_MULTIPLAYER
Definition: systemvars.h:18
PSNET_SOCKET_RELIABLE reliable_socket
Definition: multi.h:465
void multi_obs_level_init()
int unreliable_buffer_size
Definition: multi.h:441
fix last_heard_time
Definition: multi.h:470
#define SF_HIDDEN_FROM_SENSORS
Definition: ship.h:464
#define MULTI_OBSERVER(np)
Definition: multi.h:140
void pilot_set_short_callsign(player *p, int max_width)
net_player_server_info s_info
Definition: multi.h:472
#define MAX_PLAYERS
Definition: pstypes.h:32
int idx
Definition: multiui.cpp:761
object Objects[MAX_OBJECTS]
Definition: object.cpp:62
const char * XSTR(const char *str, int index)
Definition: localize.cpp:851
void hud_config_as_observer(ship *shipp, ai_info *aif)
Definition: hudconfig.cpp:1595
int objnum
Definition: player.h:124
int cl_last_pl
Definition: multi.h:482
ship * Player_ship
Definition: ship.cpp:124
matrix orient
Definition: object.h:153
void stuff_netplayer_info(net_player *nplayer, net_addr *addr, int ship_class, player *pplayer)
Definition: multiutil.cpp:664
GLuint const GLchar * name
Definition: Glext.h:5608
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
Definition: vecmat.cpp:168
ship Ships[MAX_SHIPS]
Definition: ship.cpp:122
#define MULTI_CONNECTED(np)
Definition: multi.h:136
fix timer_get_fixed_seconds()
Definition: timer.cpp:116
player * Player
#define PLAYER_FLAGS_STRUCTURE_IN_USE
Definition: player.h:40
object * Player_obj
Definition: object.cpp:56
uint flags
Definition: object.h:151
float radius
Definition: object.h:154
int cl_bytes_recvd
Definition: multi.h:481
GLenum const GLvoid * addr
Definition: Glext.h:9092
char type
Definition: object.h:146
vec3d vmd_zero_vector
Definition: vecmat.cpp:24
int parse_create_object(p_object *pobjp)
net_player Net_players[MAX_PLAYERS]
Definition: multi.cpp:93
int sv_bytes_sent
Definition: multi.h:477
int sv_last_pl
Definition: multi.h:478
#define SHORT_CALLSIGN_PIXEL_W
Definition: globals.h:32
matrix vmd_identity_matrix
Definition: vecmat.cpp:28
char ship_name[NAME_LENGTH]
Definition: ship.h:604
void multi_obs_create_observer(net_player *pl)
p_object * Player_start_pobject
float vm_vec_normalize(vec3d *v)
Definition: vecmat.cpp:460
#define strcpy_s(...)
Definition: safe_strings.h:67