add network view for glider
[carveJwlIkooP6JGAAIwe30JlM.git] / player_dead.c
index 8c558eeb33f1e77e12f00018f480c98aeaf50c60..625ff0e7643cae2dfb8c0d4c5a4cb9dc93cd1789 100644 (file)
@@ -2,35 +2,50 @@
 #define PLAYER_DEAD_C
 
 #include "player.h"
+#include "gui.h"
 
 static void player__dead_update(void){
    player_ragdoll_iter( &localplayer.ragdoll );
 }
 
 static void player__dead_post_update(void){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct ragdoll_part *part = &localplayer.ragdoll.parts[ av->id_hip-1 ];
+   struct ragdoll_part *part = 
+      &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
    struct player_dead *d = &player_dead;
 
    v3f ext_co;
    v4f ext_q;
-   rb_extrapolate( &part->obj.rb, ext_co, ext_q );
+   rb_extrapolate( &part->rb, ext_co, ext_q );
 
    v3_lerp( d->co_lpf, ext_co, vg.time_frame_delta*4.0f, d->co_lpf );
-   v3_lerp( d->v_lpf,  part->obj.rb.v,  vg.time_frame_delta*4.0f, d->v_lpf );
-   v3_lerp( d->w_lpf,  part->obj.rb.w,  vg.time_frame_delta*4.0f, d->w_lpf );
+   v3_lerp( d->v_lpf,  part->rb.v,  vg.time_frame_delta*4.0f, d->v_lpf );
+   v3_lerp( d->w_lpf,  part->rb.w,  vg.time_frame_delta*4.0f, d->w_lpf );
    
    v3_copy( d->co_lpf, localplayer.rb.co );
    v3_zero( localplayer.rb.v );
    v3_zero( localplayer.rb.w );
+
+   if( (skaterift.activity == k_skaterift_default) && 
+         button_down(k_srbind_dead_respawn) ){
+      ent_spawn *spawn = world_find_closest_spawn( 
+            world_current_instance(), localplayer.rb.co );
+
+      if( spawn ){
+         v3_copy( spawn->transform.co, localplayer.rb.co );
+         player__reset();
+         srinput.state = k_input_state_resume;
+      }
+      else {
+         vg_error( "No spawns!\n" );
+      }
+   }
 }
 
 static void player__dead_animate(void){
    struct player_dead *d = &player_dead;
    struct player_dead_animator *animator = &d->animator;
    struct player_ragdoll *rd = &localplayer.ragdoll;
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    m4x3f transforms[ 32 ];
 
@@ -51,9 +66,9 @@ static void player__dead_animate(void){
       v3f co_int;
 
       float substep = vg.time_fixed_extrapolate;
-      v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int );
-      q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int );
-      v4_copy( part->obj.rb.q, q_int );
+      v3_lerp( part->prev_co, part->rb.co, substep, co_int );
+      q_nlerp( part->prev_q, part->rb.q, substep, q_int );
+      v4_copy( part->rb.q, q_int );
 
       q_m3x3( q_int, mtx );
       v3_copy( co_int, mtx[3] );
@@ -101,8 +116,7 @@ static void player__dead_animate(void){
 static void player__dead_pose( void *_animator, player_pose *pose ){
    struct player_dead_animator *animator = _animator;
    struct player_ragdoll *rd = &localplayer.ragdoll;
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
 
    pose->type = k_player_pose_type_fk_2;
    pose->board.lean = 0.0f;
@@ -124,25 +138,43 @@ static void player__dead_post_animate(void){
 static void player__dead_im_gui(void){
 }
 
-static void player__dead_transition(void){
+static void player__dead_transition( enum player_die_type type ){
    localplayer.subsystem = k_player_subsystem_dead;
-   copy_avatar_pose_to_ragdoll( localplayer.playeravatar, &localplayer.ragdoll, 
-                                localplayer.rb.v );
-
-   struct player_avatar *av = localplayer.playeravatar;
-   struct ragdoll_part *part = &localplayer.ragdoll.parts[ av->id_hip-1 ];
-   v3_copy( part->obj.rb.co, player_dead.co_lpf );
-   v3_copy( part->obj.rb.v,  player_dead.v_lpf );
-   v3_copy( part->obj.rb.w,  player_dead.w_lpf );
+   copy_localplayer_to_ragdoll( &localplayer.ragdoll, type );
+
+   struct ragdoll_part *part = 
+      &localplayer.ragdoll.parts[ localplayer.id_hip-1 ];
+   v3_copy( part->rb.co, player_dead.co_lpf );
+   v3_copy( part->rb.v,  player_dead.v_lpf );
+   v3_copy( part->rb.w,  player_dead.w_lpf );
+
+   gui_helper_clear();
+   vg_str str;
+
+   struct gui_helper *h;
+   if( (h = gui_new_helper(input_button_list[k_srbind_reset], &str) )){
+      vg_strcat( &str, "rewind" );
+
+      if( world_static.active_instance == k_world_purpose_hub )
+         h->greyed = 1;
+   }
+
+   if( gui_new_helper(input_button_list[k_srbind_dead_respawn], &str ))
+      vg_strcat( &str, "spawn" );
 }
 
 static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){
    struct player_dead_animator *animator = data;
 
-   for( u32 i=0; i<localplayer.playeravatar->sk.bone_count; i ++ ){
+   for( u32 i=0; i<localplayer.skeleton.bone_count; i ++ ){
       bitpack_qv3f( ctx, 24, -1024.0f, 1024.0f, animator->transforms[i].co );
       bitpack_qquat( ctx, animator->transforms[i].q );
    }
 }
 
+static void player__dead_bind(void){
+   struct skeleton *sk = &localplayer.skeleton;
+   player_dead.anim_bail = skeleton_get_anim( sk, "pose_bail_ball" );
+}
+
 #endif /* PLAYER_DEAD_C */