diff --git a/Source/FreeCS-CE.prj b/Source/FreeCS-CE.prj index e2da290f..56868f07 100755 --- a/Source/FreeCS-CE.prj +++ b/Source/FreeCS-CE.prj @@ -25,7 +25,7 @@ - + @@ -71,7 +71,7 @@ - + @@ -113,20 +113,11 @@ - - - - - - - - - - - - - - - + + + + + + diff --git a/Source/Math.h b/Source/Math.h index 7162e487..aeb145a9 100644 --- a/Source/Math.h +++ b/Source/Math.h @@ -25,6 +25,19 @@ float Math_LerpAngle( float fStart, float fEnd, float fAmount ) { return shortest_angle * fAmount; } +float Math_Lerp( float fA, float fB, float fPercent ) { + return ( fA * ( 1 - fPercent ) ) + ( fB * fPercent ); +} + +float Math_FixDelta( float fDelta ) { + if ( fDelta >= 180 ) { + fDelta -= 360; + } else if ( fDelta <= -180 ) { + fDelta += 360; + } + return fDelta; +} + float Math_CRandom( void ) { return 2 * ( random() - 0.5 ); } diff --git a/Source/Server/EntHostage.c b/Source/Server/EntHostage.c index 9703dd9e..10bfdcd8 100755 --- a/Source/Server/EntHostage.c +++ b/Source/Server/EntHostage.c @@ -41,7 +41,7 @@ entity hostage_waypoint( void ) { setsize( ePoint, self.mins, self.maxs ); ePoint.classname = "remove_me"; ePoint.movetype = MOVETYPE_TOSS; -// setmodel( ePoint, "models/chick.mdl" ); // Visual feedback... + //setmodel( ePoint, "models/chick.mdl" ); // Visual feedback... return ePoint; } @@ -53,10 +53,16 @@ Determines when we need to spawn a new waypoint ================= */ float hostage_waypoint_needed( void ) { - if ( self.eUser.fStepTime > time ) { - return FALSE; + float fState; + if ( self.eUser.movement == self.movement ) { + fState = FALSE; + } else { + fState = TRUE; } - return TRUE; + + self.movement = self.eUser.movement; + + return fState; } /* @@ -125,7 +131,6 @@ void hostage_physics( void ) { input_movevalues = '0 0 0'; input_impulse = 0; input_buttons = 0; - input_angles = self.angles; // Are we meant to follow someone and AREN'T dead? if ( ( self.eUser != world ) && ( self.health > 0 ) ) { @@ -133,8 +138,10 @@ void hostage_physics( void ) { vector vEndAngle = vectoangles( self.eTargetPoint.origin - self.origin ); // Slowly turn towards target - float fTurn = Math_LerpAngle( self.angles_y, vEndAngle_y, frametime * 4 ); - self.angles_y += fTurn; + float fTurn = Math_LerpAngle( self.v_angle_y, vEndAngle_y, frametime * 4 ); + self.v_angle_y += fTurn; + + self.v_angle_y = Math_FixDelta( self.v_angle_y ); // Is the waypoint close? if so, remove and go set the next one! float fDist1 = vlen( self.eTargetPoint.origin - self.origin ); @@ -177,7 +184,6 @@ void hostage_physics( void ) { self.eLastCreated.eTargetPoint = hostage_waypoint(); self.eLastCreated = self.eLastCreated.eTargetPoint; } - self.fStepTime = time + 0.2; } } } @@ -203,8 +209,13 @@ void hostage_physics( void ) { } input_timelength = frametime; + input_angles = self.v_angle; self.movetype = MOVETYPE_WALK; + runstandardplayerphysics( self ); + Footsteps_Update(); + + self.angles = self.v_angle; self.movetype = MOVETYPE_NONE; } @@ -218,6 +229,10 @@ Entry function for the hostages. void hostage_entity( void ) { static void hostage_entity_respawn( void ) { + self.v_angle_x = Math_FixDelta ( self.angles_x ); + self.v_angle_y = Math_FixDelta ( self.angles_y ); + self.v_angle_z = Math_FixDelta ( self.angles_z ); + setorigin( self, self.origin ); self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_NONE; diff --git a/freecs/csprogs.dat b/freecs/csprogs.dat index cc0876b9..8095d62c 100644 Binary files a/freecs/csprogs.dat and b/freecs/csprogs.dat differ diff --git a/freecs/menu.dat b/freecs/menu.dat index 25832c29..9afa65d0 100755 Binary files a/freecs/menu.dat and b/freecs/menu.dat differ diff --git a/freecs/progs.dat b/freecs/progs.dat index e61a9eb6..fe081e94 100644 Binary files a/freecs/progs.dat and b/freecs/progs.dat differ