From 2acddc369d079b5b2485a6192fd03dc87ca66d5c Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 4 Dec 2016 15:56:41 +0100 Subject: [PATCH] Implemented info_hostage_rescue and Game_CreateRescueZone --- Source/Client/HUD.c | 14 ++++++++--- Source/Server/Defs.h | 1 + Source/Server/FuncHostageRescue.c | 42 ++++++++++++++++++++++++++++++- Source/Server/Main.c | 5 ++++ Source/Server/Rules.c | 2 +- Source/Server/progs.src | 4 ++- 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/Source/Client/HUD.c b/Source/Client/HUD.c index 39737714..6471c37d 100644 --- a/Source/Client/HUD.c +++ b/Source/Client/HUD.c @@ -140,13 +140,13 @@ void HUD_DrawIcons( void ) { // Hostage-Rescue Area Icon if( getstatf( STAT_HOSTAGEZONE ) == TRUE ) { - vector vRIconPos = [ 16, ( vVideoResolution_y / 2 ) + 48 ]; + vector vRIconPos = [ 16, ( vVideoResolution_y / 2 ) + 24 ]; drawsubpic( vRIconPos, '32 32 0', HUD_NUMFILE_LAYER, [ 0.125 * 2, 0.125 * 5 - 0.046875], [ 0.125, 0.125 ], '0 1 0', 1, DRAWFLAG_ADDITIVE ); } // Bomb-Area if( getstatf( STAT_BOMBZONE ) == TRUE ) { - vector vBIconPos = [ 16, ( vVideoResolution_y / 2 ) + 48 ]; + vector vBIconPos = [ 16, ( vVideoResolution_y / 2 ) + 24 ]; drawsubpic( vBIconPos, '32 32 0', HUD_NUMFILE_LAYER, [ 0, 0.125 * 5 - 0.046875], [ 0.125, 0.125 ], '0 1 0', 1, DRAWFLAG_ADDITIVE ); } } @@ -181,7 +181,15 @@ void HUD_DrawTimer( void ) { // Flashing red numbers if ( ( iMinutes == 0 ) && ( iTens <= 1 ) ) { - float fAlpha = fabs( sin( time * 20 ) ); + float fAlpha; + + // 0:00 is fully red + if ( ( iTens == 0 ) && ( iUnits == 0 ) ) { + fAlpha = 1; + } else { + fAlpha = fabs( sin( time * 20 ) ); + } + HUD_DrawRedNumber( iMinutes, vTimePos + '48 0 0', fAlpha); HUD_DrawRedNumber( iTens, vTimePos + '70 0 0', fAlpha); HUD_DrawRedNumber( iUnits, vTimePos + '94 0 0',fAlpha ); diff --git a/Source/Server/Defs.h b/Source/Server/Defs.h index b10c8db1..d8ca3e81 100644 --- a/Source/Server/Defs.h +++ b/Source/Server/Defs.h @@ -58,6 +58,7 @@ int iHostagesMax; int iHostagesRescued; int iBombZones; +int iRescueZones; // Generic entity fields .int iUsable; diff --git a/Source/Server/FuncHostageRescue.c b/Source/Server/FuncHostageRescue.c index f593308b..af2d0663 100644 --- a/Source/Server/FuncHostageRescue.c +++ b/Source/Server/FuncHostageRescue.c @@ -36,6 +36,10 @@ void func_hostage_rescue_touch( void ) { remove( other.eTargetPoint ); } remove( other ); + + if ( iHostagesRescued >= iHostagesMax ) { + Rules_RoundOver( TEAM_CT ); + } } } @@ -50,7 +54,43 @@ void func_hostage_rescue( void ) { self.angles = '0 0 0'; self.movetype = MOVETYPE_NONE; self.solid = SOLID_TRIGGER; - setmodel( self, self.model ); + + if ( self.model ) { + setmodel( self, self.model ); + } else { + setsize( self, self.mins, self.maxs ); + } + self.model = 0; self.touch = func_hostage_rescue_touch; + + iRescueZones++; +} + +void info_hostage_rescue( void ) { + self.mins = '-128 -128 -36'; + self.maxs = '128 128 36'; + func_hostage_rescue(); +} + +/* +================= +Game_CreateRescueZones + +Called by StartFrame if we somehow got no rescue zones +================= +*/ +void Game_CreateRescueZones( void ) { + entity eFind = findchain( classname, "info_player_start" ); + + while ( eFind ) { + entity eRescueZone = spawn(); + setorigin( eRescueZone, eFind.origin ); + + entity eOldSelf = self; + self = eRescueZone; + info_hostage_rescue(); + self = eOldSelf; + eFind = eFind.chain; + } } diff --git a/Source/Server/Main.c b/Source/Server/Main.c index 7f40b4f6..e3b2f5b6 100644 --- a/Source/Server/Main.c +++ b/Source/Server/Main.c @@ -25,6 +25,11 @@ void SetChangeParms( void ) {} // Run every frame... by world? void StartFrame( void ) { + // We've got hostages, but no rescue zones, create some + if ( !iRescueZones && iHostagesMax > 0 ) { + Game_CreateRescueZones(); + } + // Global amount of players etc. int iInGamePlayers = ( iInGamePlayers_T + iInGamePlayers_CT ); diff --git a/Source/Server/Rules.c b/Source/Server/Rules.c index 3756cd42..5bdbf7c3 100644 --- a/Source/Server/Rules.c +++ b/Source/Server/Rules.c @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Loop through all players and respawn them void Rules_Restart( void ) { - //localcmd( "restart_ents" ); + localcmd( "restart_ents" ); entity eFind = findchain( classname, "player" ); diff --git a/Source/Server/progs.src b/Source/Server/progs.src index ef3b906f..0906d0fe 100644 --- a/Source/Server/progs.src +++ b/Source/Server/progs.src @@ -38,7 +38,7 @@ Damage.c TraceAttack.c Rules.c Timer.c -Main.c + EntHostage.c Entities.c Triggers.c @@ -49,6 +49,8 @@ FuncLadder.c FuncHostageRescue.c FuncBombTarget.c FuncBuyZone.c + +Main.c Player.c Spawn.c Footsteps.c