code is no longer based :(
[carveJwlIkooP6JGAAIwe30JlM.git] / player.c
index 9938de6507c7aa7963e32906424c6c32b051963c..23cb5fcaf4ceeaae7f8d09c020be987e08d5fba0 100644 (file)
--- a/player.c
+++ b/player.c
@@ -10,6 +10,8 @@
 #include "player_replay.h"
 #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;
@@ -65,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, 
@@ -134,19 +132,13 @@ static void player__pass_gate( u32 id ){
    m4x3_mulv( gate->transport, cc->tpv_lpf, cc->tpv_lpf );
    m3x3_mulv( gate->transport, cc->cam_velocity_smooth, 
                                cc->cam_velocity_smooth );
-   m3x3_copy( localplayer.basis, localplayer.basis_gate );
-
-   v4f q;
-   m3x3_q( gate->transport, q );
-   q_mul( q, localplayer.qbasis, localplayer.qbasis );
-   q_normalize( localplayer.qbasis );
-   q_m3x3( localplayer.qbasis, localplayer.basis );
-   m3x3_transpose( localplayer.basis, localplayer.invbasis );
 
    m4x3_mulv( gate->transport, localplayer.cam.pos, localplayer.cam.pos );
-
-   if( gate->flags & k_ent_gate_nonlocal )
-      world_set_active_instance( gate->target );
+   
+   v3f v0;
+   v3_angles_vector( localplayer.angles, v0 );
+   m3x3_mulv( gate->transport, v0, v0 );
+   v3_angles( v0, localplayer.angles );
 
    audio_lock();
    audio_oneshot( &audio_gate_pass, 1.0f, 0.0f );
@@ -192,20 +184,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",
@@ -218,7 +206,6 @@ static void player__im_gui(void){
 
    player__debugtext( 2, "player" );
    player__debugtext( 1, "angles: " PRINTF_v3f( localplayer.cam.angles ) );
-   player__debugtext( 1, "basis:  " PRINTF_v4f( localplayer.qbasis ) );
 
    if( player_subsystems[ localplayer.subsystem ]->im_gui )
       player_subsystems[ localplayer.subsystem ]->im_gui();
@@ -226,46 +213,61 @@ 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 );
-   rb_update_transform( &localplayer.rb );
+   
+   f32 l = v4_length( localplayer.rb.q );
+   if( (l < 0.9f) || (l > 1.1f) )
+      q_identity( localplayer.rb.q );
 
-   q_identity( localplayer.qbasis );
-   m3x3_identity( localplayer.basis );
-   m3x3_identity( localplayer.invbasis );
+   rb_update_transform( &localplayer.rb );
 
    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++ ){
+      world_instance *instance = &world_static.instances[i];
+      if( instance->status == k_world_status_loaded ){
+         world_routes_clear( instance );
+      }
+   }
+}
+
+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;
 }