#include "network_common.h"
#include "world_routes.h"
#include "ent_miniworld.h"
+#include "gui.h"
static int localplayer_cmd_respawn( int argc, const char *argv[] ){
ent_spawn *rp = NULL, *r;
*/
static void player__pre_update(void){
- if( button_down( k_srbind_camera ) && !localplayer.immobile ){
+ if( button_down( k_srbind_camera ) && !localplayer.immobile &&
+ (localplayer.subsystem != k_player_subsystem_dead) ){
if( localplayer.cam_control.camera_mode == k_cam_firstperson )
localplayer.cam_control.camera_mode = k_cam_thirdperson;
else
localplayer.boundary_hash ^= NETMSG_GATE_BOUNDARY_BIT;
localplayer.boundary_hash &= ~NETMSG_BOUNDARY_MASK;
localplayer.boundary_hash |= index;
-
+
ent_gate *gate = mdl_arritm( &world->ent_gate, mdl_entity_id_id(id) );
world_routes_fracture( world, gate, localplayer.rb.co, localplayer.rb.v );
localplayer.gate_waiting = gate;
- world_routes_activate_entry_gate( world_current_instance(), gate );
struct player_cam_controller *cc = &localplayer.cam_control;
m4x3_mulv( gate->transport, cc->tpv_lpf, cc->tpv_lpf );
cc->cam_velocity_smooth );
m4x3_mulv( gate->transport, localplayer.cam.pos, localplayer.cam.pos );
+
+ if( gate->flags & k_ent_gate_nonlocal ){
+ /* FIXME: Code dupe with world_load.c */
+ ent_spawn *rp = world_find_spawn_by_name( world, "start" );
+ if( !rp ) rp = world_find_closest_spawn( world, (v3f){0.0f,0.0f,0.0f} );
+ /* TODO: fallback to searching for a safe location using raycasts */
+ assert(rp);
+ v3_copy( rp->transform.co, world->player_co );
+
+ world_static.active_instance = gate->target;
+ player__clean_refs();
+ }
+ else
+ world_routes_activate_entry_gate( world, gate );
v3f v0;
v3_angles_vector( localplayer.angles, v0 );
[k_skaterift_replay] = "replay",
[k_skaterift_ent_focus] = "ent_focus",
[k_skaterift_default] = "default",
- [k_skaterift_respawning]= "respawning",
+ [k_skaterift_respawning]= "map"
} [skaterift.activity] );
player__debugtext( 1, "time_rate: %.4f", skaterift.time_rate );
rb_update_transform( &localplayer.rb );
}
-static void player__reset(void){
+static void player__clean_refs(void){
replay_clear( &skaterift.replay );
-
- v3_zero( localplayer.rb.v );
- v3_zero( localplayer.rb.w );
-
- f32 l = v4_length( localplayer.rb.q );
- if( (l < 0.9f) || (l > 1.1f) )
- q_identity( localplayer.rb.q );
-
- rb_update_transform( &localplayer.rb );
-
- localplayer.subsystem = k_player_subsystem_walk;
- player__walk_reset();
-
- localplayer.immobile = 0;
- localplayer.gate_waiting = NULL;
+ gui_helper_clear();
world_static.challenge_target = NULL;
world_static.challenge_timer = 0.0f;
world_routes_clear( instance );
}
}
+}
+
+static void player__reset(void){
+ v3_zero( localplayer.rb.v );
+ v3_zero( localplayer.rb.w );
+
+ f32 l = v4_length( localplayer.rb.q );
+ if( (l < 0.9f) || (l > 1.1f) )
+ q_identity( localplayer.rb.q );
+
+ rb_update_transform( &localplayer.rb );
+
+ localplayer.subsystem = k_player_subsystem_walk;
+ player__walk_reset();
+
+ localplayer.immobile = 0;
+ localplayer.gate_waiting = NULL;
v3_copy( localplayer.rb.co, localplayer.cam_control.tpv_lpf );
+ player__clean_refs();
}
static void player__spawn( ent_spawn *rp ){
/* implementation */
#include "player_common.c"
+
#include "player_walk.c"
#include "player_skate.c"
#include "player_dead.c"
#include "player_drive.c"
+#include "player_basic_info.c"
+
#include "player_render.c"
#include "player_ragdoll.c"
#include "player_replay.c"