process triggers on leave world
[carveJwlIkooP6JGAAIwe30JlM.git] / player.c
index 7a31eda047382aba659f289a36f156494b77d5c4..fce9c488aaabf58f4e341881d497de9ede7c296e 100644 (file)
--- a/player.c
+++ b/player.c
@@ -11,6 +11,7 @@
 #include "network.h"
 #include "network_common.h"
 #include "world_routes.h"
+#include "ent_miniworld.h"
 
 static int localplayer_cmd_respawn( int argc, const char *argv[] ){
    ent_spawn *rp = NULL, *r;
@@ -66,10 +67,6 @@ static void player__debugtext( int size, const char *fmt, ... ){
 /* 
  * Appearence
  */
-static void player__use_avatar( struct player_avatar *av ){
-   localplayer.playeravatar = av;
-   player_setup_ragdoll_from_avatar( &localplayer.ragdoll, av );
-}
 
 static void player__use_model( u16 reg_id ){
    addon_cache_unwatch( k_addon_type_player, 
@@ -146,9 +143,6 @@ static void player__pass_gate( u32 id ){
 
    m4x3_mulv( gate->transport, localplayer.cam.pos, localplayer.cam.pos );
 
-   if( gate->flags & k_ent_gate_nonlocal )
-      world_set_active_instance( gate->target );
-
    audio_lock();
    audio_oneshot( &audio_gate_pass, 1.0f, 0.0f );
    audio_unlock();
@@ -193,20 +187,16 @@ static void player__im_gui(void){
 
    player__debugtext( 2, "instance #%u", world_static.active_instance );
 
-   char buf_hub[96],
-        buf_client[96];
-   if( world_static.addon_client )
-      addon_alias_uid( &world_static.addon_client->alias, buf_client );
-   else
-      strcpy( buf_client, "none" );
+   char buf[96];
+   for( u32 i=0; i<k_world_max; i++ ){
+      if( world_static.instance_addons[ i ] )
+         addon_alias_uid( &world_static.instance_addons[ i ]->alias, buf );
+      else
+         strcpy( buf, "none" );
 
-   if( world_static.addon_hub )
-      addon_alias_uid( &world_static.addon_hub->alias, buf_hub );
-   else
-      strcpy( buf_hub, "none" );
+      player__debugtext( 1, "world #%u: %s", i, buf );
+   }
 
-   player__debugtext( 1, "hub uid: %s", buf_hub );
-   player__debugtext( 1, "client uid: %s", buf_client );
    player__debugtext( 2, "director" );
    player__debugtext( 1, "activity: %s", 
                      (const char *[]){ [k_skaterift_menu]      = "menu",
@@ -227,18 +217,22 @@ static void player__im_gui(void){
    skaterift_replay_debug_info();
 }
 
-
 static void player__setpos( v3f pos ){
    v3_copy( pos, localplayer.rb.co );
    v3_zero( localplayer.rb.v );
    rb_update_transform( &localplayer.rb );
 }
 
-static void player__spawn( ent_spawn *rp ){
+static void player__reset(void){
    replay_clear( &skaterift.replay );
-   player__setpos( rp->transform.co );
+
+   v3_zero( localplayer.rb.v );
    v3_zero( localplayer.rb.w );
-   q_identity( localplayer.rb.q );
+   
+   f32 l = v4_length( localplayer.rb.q );
+   if( (l < 0.9f) || (l > 1.1f) )
+      q_identity( localplayer.rb.q );
+
    rb_update_transform( &localplayer.rb );
 
    q_identity( localplayer.qbasis );
@@ -246,17 +240,19 @@ static void player__spawn( ent_spawn *rp ){
    m3x3_identity( localplayer.invbasis );
 
    localplayer.subsystem = k_player_subsystem_walk;
+   player__walk_reset();
+
    localplayer.immobile = 0;
    localplayer.gate_waiting = NULL;
-   world_static.last_use = 0.0;
-   world_static.focused_entity = 0;
+   localplayer.viewable_world = world_current_instance();
+
    world_static.challenge_target = NULL;
    world_static.challenge_timer = 0.0f;
+   world_static.focused_entity = 0;
+   world_static.active_trigger_volume_count = 0;
+   world_static.last_use = 0.0;
    world_entity_unfocus();
 
-   if( player_subsystems[ localplayer.subsystem ]->reset )
-      player_subsystems[ localplayer.subsystem ]->reset( rp );
-
    localplayer.boundary_hash ^= NETMSG_BOUNDARY_BIT;
 
    for( u32 i=0; i<vg_list_size(world_static.instances); i++ ){
@@ -267,13 +263,19 @@ static void player__spawn( ent_spawn *rp ){
    }
 }
 
+static void player__spawn( ent_spawn *rp ){
+   player__setpos( rp->transform.co );
+   player__reset();
+}
+
 
 static void player__kill(void){
 }
 
-static void player__begin_holdout(void){
+static void player__begin_holdout( v3f offset ){
    memcpy( &localplayer.holdout_pose, &localplayer.pose, 
             sizeof(localplayer.pose) );
+   v3_copy( offset, localplayer.holdout_pose.root_co );
    localplayer.holdout_time = 1.0f;
 }