From 5aa1e75cdfe4750c886ac0b223a607eabfa89130 Mon Sep 17 00:00:00 2001 From: cypress Date: Sat, 18 Nov 2023 15:17:40 -0500 Subject: [PATCH] SERVER: Improved stance changing with bounding box changes, player collision deaths --- source/client/defs/custom.qc | 2 + source/client/main.qc | 6 +- source/server/clientfuncs.qc | 7 ++ source/server/damage.qc | 20 ++++- source/server/player.qc | 123 +++++++++++++++++---------- source/server/weapons/weapon_core.qc | 57 ++++++++++--- 6 files changed, 151 insertions(+), 64 deletions(-) diff --git a/source/client/defs/custom.qc b/source/client/defs/custom.qc index 85f6b83..495d792 100644 --- a/source/client/defs/custom.qc +++ b/source/client/defs/custom.qc @@ -168,6 +168,8 @@ vector TEXT_RED = [1, 0, 0]; float fade_time; float fade_type; +.float stance; + float menu_initialized; float customs_interact; diff --git a/source/client/main.qc b/source/client/main.qc index 8c92c88..e9fa03d 100644 --- a/source/client/main.qc +++ b/source/client/main.qc @@ -596,10 +596,14 @@ noref void(float isnew) CSQC_Ent_Update = self.frame = readbyte(); self.movetype = readshort(); self.flags = readfloat(); + self.stance = readbyte(); self.scale = 1.4; setmodel(self, self.model); - setsize(self, [-16, -16, -32], [16, 16, 40]); + if (self.stance == 2) + setsize(self, [-16, -16, -32], [16, 16, 40]); + else + setsize(self, [-16, -16, -32], [16, 16, 4]); setorigin(self, self.origin); } else { if(isnew) diff --git a/source/server/clientfuncs.qc b/source/server/clientfuncs.qc index 103b0a2..91c3669 100644 --- a/source/server/clientfuncs.qc +++ b/source/server/clientfuncs.qc @@ -559,6 +559,13 @@ float Player_SendEntity( entity ePVEnt, float flChanged ) { WriteByte( MSG_ENTITY, self.frame ); // Player's Frame WriteShort( MSG_ENTITY, self.movetype ); // Player Movetype WriteFloat( MSG_ENTITY, self.flags ); // Flags, important for physics + WriteByte( MSG_ENTITY, self.stance ); // Player Stance + // WriteCoord( MSG_ENTITY, self.mins_x ); // Min Size X + // WriteCoord( MSG_ENTITY, self.mins_y ); // Min Size Y + // WriteCoord( MSG_ENTITY, self.maxs_z ); // Max Size Z + // WriteCoord( MSG_ENTITY, self.maxs_x ); // Max Size X + // WriteCoord( MSG_ENTITY, self.maxs_y ); // Max Size Y + // WriteCoord( MSG_ENTITY, self.maxs_z ); // Max Size Z return TRUE; } diff --git a/source/server/damage.qc b/source/server/damage.qc index d4a264a..c5803b4 100644 --- a/source/server/damage.qc +++ b/source/server/damage.qc @@ -188,9 +188,10 @@ void() GetDown = push_away_zombies(); // Force the player to prone. - if (self.stance == 2) self.new_ofs_z = self.view_ofs_z - 42; - if (self.stance == 1) self.new_ofs_z = self.view_ofs_z - 24; + if (self.stance == 2) self.new_ofs_z = self.view_ofs_z - (PLAYER_CROUCH_HEIGHT + PLAYER_PRONE_HEIGHT); + if (self.stance == 1) self.new_ofs_z = self.view_ofs_z - PLAYER_CROUCH_HEIGHT; self.stance = 0; + setsize(self, PLAYER_MINS_CROUCHING, PLAYER_MAXS_CROUCHING); // Get rid of Mule Kick Weapon for(float i = 0; i < MAX_PLAYER_WEAPONS; i++) { @@ -337,9 +338,20 @@ void () GetUp = { // Play Getting Up Animation PAnim_GetUp(); + + // Player is able to get up from here + if (Player_CanStandHere(self)) { + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT + PLAYER_PRONE_HEIGHT; + self.stance = 2; + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); + } + // They can't, so make them crouch instead + else { + self.new_ofs_z = self.view_ofs_z + PLAYER_PRONE_HEIGHT; + self.stance = 1; + PAnim_CrouchWalk7(); // bad hack so they dont just end up fucking standing in a wall. + } - self.new_ofs_z = self.view_ofs_z + 42; - self.stance = 2; self.health = 100; self.downedloop = 0; // used for death timing vs endgame self.downed = 0; diff --git a/source/server/player.qc b/source/server/player.qc index 53a073d..267b4d2 100644 --- a/source/server/player.qc +++ b/source/server/player.qc @@ -35,6 +35,17 @@ void() rec_downed; #define PLAYER_START_HEALTH 100 +// 32x32x72 +#define PLAYER_MINS_STANDING '-16 -16 -32' +#define PLAYER_MAXS_STANDING '16 16 40' + +// 32x32x36 +#define PLAYER_MINS_CROUCHING '-16 -16 -32' +#define PLAYER_MAXS_CROUCHING '16 16 4' + +#define PLAYER_CROUCH_HEIGHT 25 +#define PLAYER_PRONE_HEIGHT 23 + #define PLAYER_ANIM_WALK 1 #define PLAYER_ANIM_SPRINT 2 @@ -43,7 +54,7 @@ void() rec_downed; // // Walking -void() PAnim_Walk =[ 1, PAnim_Walk1 ] {self.frame = 0;} +void() PAnim_Walk =[ 1, PAnim_Walk1 ] {self.frame = 0; self.tp_anim_time = time + 0.5;} void() PAnim_Walk1 =[ 2, PAnim_Walk2 ] {self.frame = 1;} void() PAnim_Walk2 =[ 3, PAnim_Walk3 ] {self.frame = 2;} void() PAnim_Walk3 =[ 4, PAnim_Walk4 ] {self.frame = 3;} @@ -54,7 +65,7 @@ void() PAnim_Walk7 =[ 8, PAnim_Walk8 ] {self.frame = 7;} void() PAnim_Walk8 =[ 9, SUB_Null ] {self.frame = 8;} // Sprinting -void() PAnim_Sprint =[ 1, PAnim_Sprint1 ] {self.frame = 25;} +void() PAnim_Sprint =[ 1, PAnim_Sprint1 ] {self.frame = 25; self.tp_anim_time = time + 0.65;} void() PAnim_Sprint1 =[ 2, PAnim_Sprint2 ] {self.frame = 26;} void() PAnim_Sprint2 =[ 3, PAnim_Sprint3 ] {self.frame = 27;} void() PAnim_Sprint3 =[ 4, PAnim_Sprint4 ] {self.frame = 28;} @@ -63,7 +74,7 @@ void() PAnim_Sprint5 =[ 6, PAnim_Sprint6 ] {self.frame = 30;} void() PAnim_Sprint6 =[ 7, SUB_Null ] {self.frame = 31;} // Reloading -void() PAnim_Reload =[ 1, PAnim_Reload1 ] {self.frame = 11;} +void() PAnim_Reload =[ 1, PAnim_Reload1 ] {self.frame = 11; self.tp_anim_time = time + 1;} void() PAnim_Reload1 =[ 2, PAnim_Reload2 ] {self.frame = 12;} void() PAnim_Reload2 =[ 3, PAnim_Reload3 ] {self.frame = 13;} void() PAnim_Reload3 =[ 4, PAnim_Reload4 ] {self.frame = 14;} @@ -79,11 +90,11 @@ void() PAnim_Reload12 =[ 13, PAnim_Reload13 ] {self.frame = 23;} void() PAnim_Reload13 =[ 14, SUB_Null ] {self.frame = 24;} // Firing -void() PAnim_Fire =[ 1, PAnim_Fire1 ] {self.frame = 9;} +void() PAnim_Fire =[ 1, PAnim_Fire1 ] {self.frame = 9; self.tp_anim_time = time + 0.25;} void() PAnim_Fire1 =[ 2, SUB_Null ] {self.frame = 10;} // Melee -void() PAnim_Melee =[ 1, PAnim_Melee1 ] {self.frame = 49;} +void() PAnim_Melee =[ 1, PAnim_Melee1 ] {self.frame = 49; self.tp_anim_time = time + 0.65;} void() PAnim_Melee1 =[ 2, PAnim_Melee2 ] {self.frame = 50;} void() PAnim_Melee2 =[ 3, PAnim_Melee3 ] {self.frame = 51;} void() PAnim_Melee3 =[ 4, PAnim_Melee4 ] {self.frame = 52;} @@ -92,7 +103,7 @@ void() PAnim_Melee5 =[ 6, PAnim_Melee6 ] {self.frame = 54;} void() PAnim_Melee6 =[ 7, SUB_Null ] {self.frame = 55;} // Weapon Swap -void() PAnim_Swap =[ 1, PAnim_Swap1 ] {self.frame = 56;} +void() PAnim_Swap =[ 1, PAnim_Swap1 ] {self.frame = 56; self.tp_anim_time = time + 1;} void() PAnim_Swap1 =[ 2, PAnim_Swap2 ] {self.frame = 57;} void() PAnim_Swap2 =[ 3, PAnim_Swap3 ] {self.frame = 58;} void() PAnim_Swap3 =[ 4, PAnim_Swap4 ] {self.frame = 59;} @@ -103,30 +114,30 @@ void() PAnim_Swap7 =[ 8, PAnim_Swap8 ] {self.frame = 63;} void() PAnim_Swap8 =[ 9, SUB_Null ] {self.frame = 64;} // Enter Dolphin Dive -void() PAnim_EnterDive =[ 1, PAnim_EnterDive1 ] {self.frame = 203;} +void() PAnim_EnterDive =[ 1, PAnim_EnterDive1 ] {self.frame = 203; self.tp_anim_time = time + 5;} void() PAnim_EnterDive1 =[ 2, PAnim_EnterDive2 ] {self.frame = 204;} void() PAnim_EnterDive2 =[ 3, PAnim_EnterDive3 ] {self.frame = 205;} void() PAnim_EnterDive3 =[ 4, PAnim_EnterDive4 ] {self.frame = 206;} void() PAnim_EnterDive4 =[ 5, SUB_Null ] {self.frame = 207;} // Flop from Dive -void() PAnim_Flop =[ 1, PAnim_Flop1 ] {self.frame = 208;} +void() PAnim_Flop =[ 1, PAnim_Flop1 ] {self.frame = 208; self.tp_anim_time = time + 1;} void() PAnim_Flop1 =[ 2, PAnim_Flop2 ] {self.frame = 209;} void() PAnim_Flop2 =[ 3, PAnim_Flop3 ] {self.frame = 210;} void() PAnim_Flop3 =[ 4, SUB_Null ] {self.frame = 211;} // Enter Stand -void() PAnim_Stand =[ 1, PAnim_Stand1 ] {self.frame = 114;} +void() PAnim_Stand =[ 1, PAnim_Stand1 ] {self.frame = 114; self.tp_anim_time = time + 1;} void() PAnim_Stand1 =[ 2, PAnim_Stand2 ] {self.frame = 113;} void() PAnim_Stand2 =[ 3, SUB_Null ] {self.frame = 0;} // Enter Crouch -void() PAnim_Crouch =[ 1, PAnim_Crouch1 ] {self.frame = 113;} +void() PAnim_Crouch =[ 1, PAnim_Crouch1 ] {self.frame = 113; self.tp_anim_time = time + 0.5;} void() PAnim_Crouch1 =[ 2, PAnim_Crouch2 ] {self.frame = 114;} void() PAnim_Crouch2 =[ 3, SUB_Null ] {self.frame = 115;} // Walking, while Crouch -void() PAnim_CrouchWalk =[ 1, PAnim_CrouchWalk1 ] {self.frame = 116;} +void() PAnim_CrouchWalk =[ 1, PAnim_CrouchWalk1 ] {self.frame = 116; self.tp_anim_time = time + 0.5;} void() PAnim_CrouchWalk1=[ 2, PAnim_CrouchWalk2 ] {self.frame = 117;} void() PAnim_CrouchWalk2=[ 3, PAnim_CrouchWalk3 ] {self.frame = 118;} void() PAnim_CrouchWalk3=[ 4, PAnim_CrouchWalk4 ] {self.frame = 119;} @@ -137,7 +148,7 @@ void() PAnim_CrouchWalk7=[ 8, PAnim_CrouchWalk8 ] {self.frame = 123;} void() PAnim_CrouchWalk8=[ 9, SUB_Null ] {self.frame = 124;} // Reloading, while Crouch -void() PAnim_CrReload =[ 1, PAnim_CrReload1 ] {self.frame = 128;} +void() PAnim_CrReload =[ 1, PAnim_CrReload1 ] {self.frame = 128; self.tp_anim_time = time + 1;} void() PAnim_CrReload1 =[ 2, PAnim_CrReload2 ] {self.frame = 129;} void() PAnim_CrReload2 =[ 3, PAnim_CrReload3 ] {self.frame = 130;} void() PAnim_CrReload3 =[ 4, PAnim_CrReload4 ] {self.frame = 131;} @@ -149,11 +160,11 @@ void() PAnim_CrReload8 =[ 9, PAnim_CrReload9 ] {self.frame = 136;} void() PAnim_CrReload9 =[ 10, SUB_Null ] {self.frame = 115;} // Firing, while Crouch -void() PAnim_CrouchFire =[ 1, PAnim_CrouchFire1 ] {self.frame = 126;} +void() PAnim_CrouchFire =[ 1, PAnim_CrouchFire1 ] {self.frame = 126; self.tp_anim_time = time + 0.25;} void() PAnim_CrouchFire1=[ 2, SUB_Null ] {self.frame = 127;} // Enter Prone -void() PAnim_Prone =[ 1, PAnim_Prone1 ] {self.frame = 154;} +void() PAnim_Prone =[ 1, PAnim_Prone1 ] {self.frame = 154; self.tp_anim_time = time + 1.5;} void() PAnim_Prone1 =[ 2, PAnim_Prone2 ] {self.frame = 155;} void() PAnim_Prone2 =[ 3, PAnim_Prone3 ] {self.frame = 156;} void() PAnim_Prone3 =[ 4, PAnim_Prone4 ] {self.frame = 157;} @@ -164,7 +175,7 @@ void() PAnim_Prone7 =[ 8, PAnim_Prone8 ] {self.frame = 161;} void() PAnim_Prone8 =[ 9, SUB_Null ] {self.frame = 162;} // Walking, while Prone -void() PAnim_ProneWalk =[ 1, PAnim_ProneWalk1 ] {self.frame = 162;} +void() PAnim_ProneWalk =[ 1, PAnim_ProneWalk1 ] {self.frame = 162; self.tp_anim_time = time + 1.5;} void() PAnim_ProneWalk1 =[ 2, PAnim_ProneWalk2 ] {self.frame = 163;} void() PAnim_ProneWalk2 =[ 3, PAnim_ProneWalk3 ] {self.frame = 164;} void() PAnim_ProneWalk3 =[ 4, PAnim_ProneWalk4 ] {self.frame = 165;} @@ -178,8 +189,8 @@ void() PAnim_ProneWalk10=[ 11, PAnim_ProneWalk11 ] {self.frame = 172;} void() PAnim_ProneWalk11=[ 12, PAnim_ProneWalk12 ] {self.frame = 173;} void() PAnim_ProneWalk12=[ 13, SUB_Null ] {self.frame = 174;} -// Reloading, while Prone 176-181 -void() PAnim_PrReload =[ 1, PAnim_PrReload1 ] {self.frame = 176;} +// Reloading, while Prone +void() PAnim_PrReload =[ 1, PAnim_PrReload1 ] {self.frame = 176; self.tp_anim_time = time + 1;} void() PAnim_PrReload1 =[ 2, PAnim_PrReload2 ] {self.frame = 177;} void() PAnim_PrReload2 =[ 3, PAnim_PrReload3 ] {self.frame = 178;} void() PAnim_PrReload3 =[ 4, PAnim_PrReload4 ] {self.frame = 179;} @@ -188,7 +199,7 @@ void() PAnim_PrReload5 =[ 6, PAnim_PrReload6 ] {self.frame = 181;} void() PAnim_PrReload6 =[ 7, SUB_Null ] {self.frame = 162;} // Enter Crouch, from Prone -void() PAnim_UpCrouch =[ 1, PAnim_UpCrouch1 ] {self.frame = 161;} +void() PAnim_UpCrouch =[ 1, PAnim_UpCrouch1 ] {self.frame = 161; self.tp_anim_time = time + 1;} void() PAnim_UpCrouch1 =[ 2, PAnim_UpCrouch2 ] {self.frame = 160;} void() PAnim_UpCrouch2 =[ 3, PAnim_UpCrouch3 ] {self.frame = 159;} void() PAnim_UpCrouch3 =[ 4, PAnim_UpCrouch4 ] {self.frame = 158;} @@ -199,7 +210,7 @@ void() PAnim_UpCrouch7 =[ 8, PAnim_UpCrouch8 ] {self.frame = 154;} void() PAnim_UpCrouch8 =[ 9, SUB_Null ] {self.frame = 115;} // Enter Last Stand -void() PAnim_GetDown =[ 1, PAnim_GetDown1 ] {self.frame = 32;}; +void() PAnim_GetDown =[ 1, PAnim_GetDown1 ] {self.frame = 32; self.tp_anim_time = time + 1;}; void() PAnim_GetDown1 =[ 2, PAnim_GetDown2 ] {self.frame = 33;}; void() PAnim_GetDown2 =[ 3, PAnim_GetDown3 ] {self.frame = 34;}; void() PAnim_GetDown3 =[ 4, PAnim_GetDown4 ] {self.frame = 35;}; @@ -207,11 +218,11 @@ void() PAnim_GetDown4 =[ 5, PAnim_GetDown5 ] {self.frame = 36;}; void() PAnim_GetDown5 =[ 6, SUB_Null ] {self.frame = 37; rec_downed();}; // Firing, while in Last Stand -void() PAnim_LastFire =[ 1, PAnim_LastFire1 ] {self.frame = 36;} +void() PAnim_LastFire =[ 1, PAnim_LastFire1 ] {self.frame = 36; self.tp_anim_time = time + 0.25;} void() PAnim_LastFire1 =[ 2, SUB_Null ] {self.frame = 37;} // Leave Last Stand -void() PAnim_GetUp =[ 1, PAnim_GetUp1 ] {self.frame = 39;} +void() PAnim_GetUp =[ 1, PAnim_GetUp1 ] {self.frame = 39; self.tp_anim_time = time + 1;} void() PAnim_GetUp1 =[ 2, PAnim_GetUp2 ] {self.frame = 40;} void() PAnim_GetUp2 =[ 3, PAnim_GetUp3 ] {self.frame = 41;} void() PAnim_GetUp3 =[ 4, PAnim_GetUp4 ] {self.frame = 42;} @@ -257,6 +268,19 @@ float(float dir) checkMovement = } } +// +// Player_CanStandHere +// Performs a tracebox and will return true +// if the player can stance in their current +// space. +// +float(entity who) Player_CanStandHere = +{ + tracebox(who.origin, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING, who.origin, true, who); + + return !trace_startsolid; +} + void() PlayerJump = { if (!(self.flags & FL_ONGROUND) @@ -295,18 +319,19 @@ void(float override) JumpCheck = W_SprintStop(); } PlayerJump(); - } else if (self.view_ofs_z == self.new_ofs_z && (self.flags & FL_ONGROUND)) { + } else if (self.view_ofs_z == self.new_ofs_z && (self.flags & FL_ONGROUND) && Player_CanStandHere(self)) { switch(self.stance) { case 0: - self.new_ofs_z = self.view_ofs_z + 42; + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT + PLAYER_PRONE_HEIGHT; self.stance = 2; break; case 1: - self.new_ofs_z = self.view_ofs_z + 24; + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT; self.stance = 2; break; default: break; } + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); } } else self.flags = self.flags | FL_JUMPRELEASED; @@ -459,6 +484,31 @@ void() PlayerPostThink = sound(self, CHAN_BODY, "sounds/player/land.wav", 0.6, 1.75); self.lastsound_time = time - 0.15; } + + // Walking Animations + if (self.tp_anim_time < time && self.reload_delay < time && self.reload_delay2 < time + && self.fire_delay < time && self.fire_delay2 < time && self.knife_delay < time) { + if (vlen(self.velocity) > 20) { + if (self.sprinting) { + PAnim_Sprint(); + self.tp_anim_type = PLAYER_ANIM_SPRINT; + } else { + self.tp_anim_type = PLAYER_ANIM_WALK; + switch(self.stance) { + case 2: PAnim_Walk(); break; + case 1: PAnim_CrouchWalk(); break; + case 0: PAnim_ProneWalk(); break; + } + } + } else { + // Stand still so Crouch Walk isn't stuck in place + switch(self.stance) { + case 2: self.frame = 0; break; + case 1: self.frame = 115; break; + case 0: self.frame = 162; break; + } + } + } #ifdef FTE @@ -467,24 +517,7 @@ void() PlayerPostThink = { float movelen = vlen(input_movevalues); if(movelen > 300) - { - if (self.tp_anim_time < time && self.reload_delay < time && self.reload_delay2 < time && self.fire_delay < time && - self.fire_delay2 < time && self.knife_delay < time) { - if (self.sprinting) { - PAnim_Sprint(); - self.tp_anim_time = time + 0.5; - self.tp_anim_type = PLAYER_ANIM_SPRINT; - } else { - self.tp_anim_time = time + 0.5; - self.tp_anim_type = PLAYER_ANIM_WALK; - switch(self.stance) { - case 2: PAnim_Walk(); break; - case 1: PAnim_CrouchWalk(); break; - case 0: PAnim_ProneWalk(); self.tp_anim_time += 0.65; break; - } - } - } - + { local float ran = random(); if(ran > 0.8) sound(self, CHAN_BODY, "sounds/player/footstep1.wav", 0.6, 2.5); @@ -744,7 +777,7 @@ void() PlayerSpawn = Player_PickSpawnPoint(); self.fixangle = true; - setsize(self, [-16, -16, -32], [16, 16, 40]); + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); self.view_ofs = VEC_VIEW_OFS; // naievil -- set view_ofs to 32 to maintain half life (64) sizes self.stance = 2; self.new_ofs_z = self.view_ofs_z; @@ -804,7 +837,7 @@ void() PlayerSpawn = if (G_STARTROUND != 1) { rounds = G_STARTROUND - 1; } - + self.perks = 8; }; void() SpectatorSpawn = @@ -820,7 +853,7 @@ void() SpectatorSpawn = self.movetype = MOVETYPE_FLY; self.origin = spawnpoint.origin + [0,0,1]; self.fixangle = TRUE; - setsize(self, [-16, -16, -24], [16, 16, 32]); + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); self.view_ofs = '0 0 22'; self.aiment = world; }; diff --git a/source/server/weapons/weapon_core.qc b/source/server/weapons/weapon_core.qc index 779d653..91d1bc1 100644 --- a/source/server/weapons/weapon_core.qc +++ b/source/server/weapons/weapon_core.qc @@ -1539,29 +1539,44 @@ void() Change_Stance = { switch(self.stance) { case 2: - self.new_ofs_z = self.view_ofs_z - 24; + self.new_ofs_z = self.view_ofs_z - PLAYER_CROUCH_HEIGHT; self.stance = 1; PAnim_Crouch(); + setsize(self, PLAYER_MINS_CROUCHING, PLAYER_MAXS_CROUCHING); break; case 1: - if (self.isBuying) { //don't want to prone while buying a perk.. + // Prohibit Proning if Drinking a Perk-A-Cola + if (self.isBuying && Player_CanStandHere(self)) { self.stance = 2; - self.new_ofs_z = self.view_ofs_z + 24; + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT; PAnim_Stand(); - } else if (!self.stancereset) { - self.new_ofs_z = self.view_ofs_z - 18; + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); + } + // Stance flag isn't set, so go Prone. + else if (!self.stancereset) { + self.new_ofs_z = self.view_ofs_z - PLAYER_PRONE_HEIGHT; self.stance = 0; PAnim_Prone(); - } else { - self.new_ofs_z = self.view_ofs_z + 24; + } + // Stance flag IS set, so stand if applicable. + else if (Player_CanStandHere(self)) { + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT; self.stance = 2; self.stancereset = 0; PAnim_Stand(); + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); + } + // There's no room to stand, just prone again. + else { + self.new_ofs_z = self.view_ofs_z - PLAYER_PRONE_HEIGHT; + self.stance = 0; + PAnim_Prone(); } break; case 0: - self.new_ofs_z = self.view_ofs_z + 18; + self.new_ofs_z = self.view_ofs_z + PLAYER_PRONE_HEIGHT; self.stance = self.stancereset = 1; + setsize(self, PLAYER_MINS_CROUCHING, PLAYER_MAXS_CROUCHING); PAnim_UpCrouch(); break; default: break; @@ -1609,8 +1624,9 @@ void() dolphin_dive = //naievil sound(self, CHAN_VOICE, "sounds/player/jump.wav", 1, 1); self.oldz = self.origin_z; - self.new_ofs_z = self.view_ofs_z - 42; + self.new_ofs_z = self.view_ofs_z - (PLAYER_CROUCH_HEIGHT + PLAYER_PRONE_HEIGHT); self.stance = 0; + setsize(self, PLAYER_MINS_CROUCHING, PLAYER_MAXS_CROUCHING); } @@ -1643,16 +1659,18 @@ void () Impulse_Functions = #endif // FTE - if (self.dive || self.downed) + if (self.dive || self.downed || !Player_CanStandHere(self)) return; switch(self.stance) { case 0: - self.new_ofs_z = self.view_ofs_z + 42; + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT + PLAYER_PRONE_HEIGHT; self.stance = 2; + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); break; case 1: - self.new_ofs_z = self.view_ofs_z + 24; + self.new_ofs_z = self.view_ofs_z + PLAYER_CROUCH_HEIGHT; self.stance = 2; + setsize(self, PLAYER_MINS_STANDING, PLAYER_MAXS_STANDING); break; default: break; } @@ -1802,10 +1820,10 @@ void() CheckPlayer = // FIXME - can't do frame independent stance changing.. ofs starts spazzing.. if (self.view_ofs_z > self.new_ofs_z) { self.changestance = true; - self.view_ofs_z = self.view_ofs_z - 1.5; + self.view_ofs_z = self.view_ofs_z - 1; } else if (self.view_ofs_z < self.new_ofs_z) { self.changestance = true; - self.view_ofs_z = self.view_ofs_z + 1.5; + self.view_ofs_z = self.view_ofs_z + 1; } else { self.changestance = false; } @@ -1814,6 +1832,17 @@ void() CheckPlayer = self.view_ofs_z = 32; self.changestance = false; } + + // Diving on top of other players :) + if (self.dive && !(self.flags & FL_ONGROUND)) { + makevectors(self.angles); + traceline(self.origin, self.origin + (v_up * -40), 0, self); + + if (trace_ent.classname == "player") { + DamageHandler(self, trace_ent, 100000, S_NORMAL); + DamageHandler(trace_ent, self, 100000, S_NORMAL); + } + } if (!self.button2 && self.flags & FL_ONGROUND) { if (self.dive) {