//++ BulliT
# include "extdll.h"
# include "util.h"
# include "cbase.h"
# include "player.h"
# include "trains.h"
# include "nodes.h"
# include "weapons.h"
# include "soundent.h"
# include "monsters.h"
# include "../engine/shake.h"
# include "agglobal.h"
# include "agcommand.h"
# include "agwallhack.h"
# include "gamerules.h"
# include <time.h>
# ifndef _WIN32
# include <sys/types.h>
# include <dirent.h>
# include <unistd.h>
# endif
void AgInitTimer ( ) ;
# ifdef AG_NO_CLIENT_DLL
DLL_GLOBAL cvar_t ag_version = { " sv_ag_version " , " 6.6mini " , FCVAR_SERVER } ;
# else
DLL_GLOBAL cvar_t ag_version = { " sv_ag_version " , " 6.6 " , FCVAR_SERVER } ;
# endif
DLL_GLOBAL cvar_t ag_gamemode = { " sv_ag_gamemode " , " ffa " , FCVAR_SERVER } ; //The current gamemode
DLL_GLOBAL cvar_t ag_allowed_gamemodes = { " sv_ag_allowed_gamemodes " , " " } ;
DLL_GLOBAL cvar_t ag_pure = { " sv_ag_pure " , " 0 " , FCVAR_SERVER } ; //Default off.
DLL_GLOBAL cvar_t ag_match_running = { " sv_ag_match_running " , " 0 " , FCVAR_SERVER | FCVAR_UNLOGGED } ; //Default not match. Protects players from wondering into the server.
DLL_GLOBAL cvar_t ag_oldphysics = { " sv_ag_oldphysics " , " 1 " } ;
DLL_GLOBAL cvar_t ag_allow_timeout = { " sv_ag_allow_timeout " , " 1 " } ; //Allow timeout.
DLL_GLOBAL cvar_t ag_allow_vote = { " sv_ag_allow_vote " , " 1 " , FCVAR_SERVER | FCVAR_UNLOGGED } ; //Voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_start = { " sv_ag_vote_start " , " 1 " , FCVAR_SERVER | FCVAR_UNLOGGED } ; //Start voting enabled by default
DLL_GLOBAL cvar_t ag_vote_setting = { " sv_ag_vote_setting " , " 1 " } ; //Setting voting enabled by default
DLL_GLOBAL cvar_t ag_vote_gamemode = { " sv_ag_vote_gamemode " , " 1 " , FCVAR_SERVER | FCVAR_UNLOGGED } ; //Gamemode voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_kick = { " sv_ag_vote_kick " , " 0 " } ; //Kick voting is disabled by default.
DLL_GLOBAL cvar_t ag_vote_allow = { " sv_ag_vote_allow " , " 1 " } ; //All voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_admin = { " sv_ag_vote_admin " , " 0 " } ; //Admin voting is disabled by default.
DLL_GLOBAL cvar_t ag_vote_map = { " sv_ag_vote_map " , " 1 " , FCVAR_SERVER | FCVAR_UNLOGGED } ; //Map voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_failed_time = { " sv_ag_vote_failed_time " , " 30 " } ;
DLL_GLOBAL cvar_t ag_start_minplayers = { " sv_ag_start_minplayers " , " 2 " } ;
DLL_GLOBAL cvar_t ag_vote_mp_timelimit_low = { " sv_ag_vote_mp_timelimit_low " , " 10 " } ;
DLL_GLOBAL cvar_t ag_vote_mp_timelimit_high = { " sv_ag_vote_mp_timelimit_high " , " 40 " } ;
DLL_GLOBAL cvar_t ag_vote_mp_fraglimit_low = { " sv_ag_vote_mp_fraglimit_low " , " 0 " } ;
DLL_GLOBAL cvar_t ag_vote_mp_fraglimit_high = { " sv_ag_vote_mp_fraglimit_high " , " 100 " } ;
DLL_GLOBAL cvar_t ag_floodmsgs = { " sv_ag_floodmsgs " , " 4 " } ;
DLL_GLOBAL cvar_t ag_floodpersecond = { " sv_ag_floodpersecond " , " 4 " } ;
DLL_GLOBAL cvar_t ag_floodwaitdelay = { " sv_ag_floodwaitdelay " , " 10 " } ;
DLL_GLOBAL cvar_t ag_player_id = { " sv_ag_player_id " , " 5 " } ; //Default 5 seconds.
DLL_GLOBAL cvar_t ag_auto_admin = { " sv_ag_auto_admin " , " 1 " } ; //Default 1 = Autoauthenticate admins based on won id.
DLL_GLOBAL cvar_t ag_lj_timer = { " sv_ag_lj_timer " , " 0 " } ; //Default 0 = turned off.
DLL_GLOBAL cvar_t ag_wallgauss = { " sv_ag_wallgauss " , " 1 " } ; //Default 1 = Lame wallgauss on.
DLL_GLOBAL cvar_t ag_headshot = { " sv_ag_headshot " , " 3 " } ; //Default 3 = 3 times damage
DLL_GLOBAL cvar_t ag_blastradius = { " sv_ag_blastradius " , " 1 " } ; //Default 1 = Standard radius
DLL_GLOBAL cvar_t ag_ban_crowbar = { " sv_ag_ban_crowbar " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_glock = { " sv_ag_ban_glock " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_357 = { " sv_ag_ban_357 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_mp5 = { " sv_ag_ban_mp5 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_shotgun = { " sv_ag_ban_shotgun " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_crossbow = { " sv_ag_ban_crossbow " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_rpg = { " sv_ag_ban_rpg " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_gauss = { " sv_ag_ban_gauss " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_egon = { " sv_ag_ban_egon " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_hornet = { " sv_ag_ban_hornet " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_hgrenade = { " sv_ag_ban_hgrenade " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_satchel = { " sv_ag_ban_satchel " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_tripmine = { " sv_ag_ban_tripmine " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_snark = { " sv_ag_ban_snark " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_longjump = { " sv_ag_ban_longjump " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_m203 = { " sv_ag_ban_m203 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_9mmar = { " sv_ag_ban_9mmar " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_bockshot = { " sv_ag_ban_bockshot " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_uranium = { " sv_ag_ban_uranium " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_bolts = { " sv_ag_ban_bolts " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_rockets = { " sv_ag_ban_rockets " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_357ammo = { " sv_ag_ban_357ammo " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_armour = { " sv_ag_ban_armour " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_health = { " sv_ag_ban_health " , " 0 " } ;
DLL_GLOBAL cvar_t ag_ban_recharg = { " sv_ag_ban_recharg " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_crowbar = { " sv_ag_start_crowbar " , " 1 " } ;
DLL_GLOBAL cvar_t ag_start_glock = { " sv_ag_start_glock " , " 1 " } ;
DLL_GLOBAL cvar_t ag_start_357 = { " sv_ag_start_357 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_mp5 = { " sv_ag_start_mp5 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_shotgun = { " sv_ag_start_shotgun " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_crossbow = { " sv_ag_start_crossbow " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_rpg = { " sv_ag_start_rpg " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_gauss = { " sv_ag_start_gauss " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_egon = { " sv_ag_start_egon " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_hornet = { " sv_ag_start_hornet " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_hgrenade = { " sv_ag_start_hgrenade " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_satchel = { " sv_ag_start_satchel " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_tripmine = { " sv_ag_start_tripmine " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_snark = { " sv_ag_start_snark " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_longjump = { " sv_ag_start_longjump " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_m203 = { " sv_ag_start_m203 " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_9mmar = { " sv_ag_start_9mmar " , " 68 " } ;
DLL_GLOBAL cvar_t ag_start_bockshot = { " sv_ag_start_bockshot " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_uranium = { " sv_ag_start_uranium " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_bolts = { " sv_ag_start_bolts " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_rockets = { " sv_ag_start_rockets " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_357ammo = { " sv_ag_start_357ammo " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_armour = { " sv_ag_start_armour " , " 0 " } ;
DLL_GLOBAL cvar_t ag_start_health = { " sv_ag_start_health " , " 100 " } ;
DLL_GLOBAL cvar_t ag_dmg_crowbar = { " sv_ag_dmg_crowbar " , " 25 " } ;
DLL_GLOBAL cvar_t ag_dmg_glock = { " sv_ag_dmg_glock " , " 12 " } ;
DLL_GLOBAL cvar_t ag_dmg_357 = { " sv_ag_dmg_357 " , " 40 " } ;
DLL_GLOBAL cvar_t ag_dmg_mp5 = { " sv_ag_dmg_mp5 " , " 12 " } ;
DLL_GLOBAL cvar_t ag_dmg_shotgun = { " sv_ag_dmg_shotgun " , " 20 " } ;
DLL_GLOBAL cvar_t ag_dmg_crossbow = { " sv_ag_dmg_crossbow " , " 20 " } ;
DLL_GLOBAL cvar_t ag_dmg_bolts = { " sv_ag_dmg_bolts " , " 50 " } ;
DLL_GLOBAL cvar_t ag_dmg_rpg = { " sv_ag_dmg_rpg " , " 120 " } ;
DLL_GLOBAL cvar_t ag_dmg_gauss = { " sv_ag_dmg_gauss " , " 20 " } ;
DLL_GLOBAL cvar_t ag_dmg_egon_wide = { " sv_ag_dmg_egon_wide " , " 20 " } ;
DLL_GLOBAL cvar_t ag_dmg_egon_narrow = { " sv_ag_dmg_egon_narrow " , " 10 " } ;
DLL_GLOBAL cvar_t ag_dmg_hornet = { " sv_ag_dmg_hornet " , " 10 " } ;
DLL_GLOBAL cvar_t ag_dmg_hgrenade = { " sv_ag_dmg_hgrenade " , " 100 " } ;
DLL_GLOBAL cvar_t ag_dmg_satchel = { " sv_ag_dmg_satchel " , " 120 " } ;
DLL_GLOBAL cvar_t ag_dmg_tripmine = { " sv_ag_dmg_tripmine " , " 150 " } ;
DLL_GLOBAL cvar_t ag_dmg_m203 = { " sv_ag_dmg_m203 " , " 100 " } ;
DLL_GLOBAL cvar_t ag_max_spectators = { " sv_ag_max_spectators " , " 5 " } ;
DLL_GLOBAL cvar_t ag_spec_enable_disable = { " sv_ag_spec_enable_disable " , " 0 " } ;
DLL_GLOBAL cvar_t ag_spectalk = { " ag_spectalk " , " 1 " } ;
DLL_GLOBAL cvar_t ag_spawn_volume = { " sv_ag_spawn_volume " , " 1 " } ;
DLL_GLOBAL cvar_t ag_show_gibs = { " sv_ag_show_gibs " , " 1 " } ;
DLL_GLOBAL cvar_t ag_gametype = { " sv_ag_gametype " , " " } ;
DLL_GLOBAL cvar_t ag_ctf_flag_resettime = { " sv_ag_ctf_flag_resettime " , " 30 " } ; //the time that a dropped flag lays in the world before respawning
DLL_GLOBAL cvar_t ag_ctf_capture_limit = { " sv_ag_ctf_capturelimit " , " 10 " , FCVAR_SERVER } ; //the number of captures before map ends.
DLL_GLOBAL cvar_t ag_ctf_teamcapturepoints = { " sv_ag_ctf_teamcapturepoints " , " 1 " } ; //the ammount of points his teammates get
DLL_GLOBAL cvar_t ag_ctf_capturepoints = { " sv_ag_ctf_capturepoints " , " 4 " } ; //the amount of points the capturer gets
DLL_GLOBAL cvar_t ag_ctf_returnpoints = { " sv_ag_ctf_returnpoints " , " 1 " } ; //the amount of points the returner gets.
DLL_GLOBAL cvar_t ag_ctf_carrierkillpoints = { " sv_ag_ctf_carrierkillpoints " , " 1 " } ; //the amount of points the killer gets.
DLL_GLOBAL cvar_t ag_ctf_stealpoints = { " sv_ag_ctf_stealpoints " , " 1 " } ; //the amount of points the stealer gets.
DLL_GLOBAL cvar_t ag_ctf_defendpoints = { " sv_ag_ctf_defendpoints " , " 1 " } ; //the amount of points the defender gets.
DLL_GLOBAL cvar_t ag_ctf_roundbased = { " sv_ag_ctf_roundbased " , " 0 " } ; //1 for roundbased CTF game.
//++ muphicks
DLL_GLOBAL cvar_t ag_dom_mincontroltime = { " sv_ag_dom_mincontroltime " , " 5 " } ; // number of seconds team must control point to score
DLL_GLOBAL cvar_t ag_dom_controlpoints = { " sv_ag_dom_controlpoints " , " 1 " } ; // number of points scored when under teams control
DLL_GLOBAL cvar_t ag_dom_resetscorelimit = { " sv_ag_dom_resetscorelimit " , " 6 " } ; // max time under 1 teams control 5*6 = 30 seconds
DLL_GLOBAL cvar_t ag_dom_scorelimit = { " sv_ag_dom_scorelimit " , " 200 " } ; // max points a team needs to get to win the game
//-- muphicks
DLL_GLOBAL cvar_t ag_gauss_fix = { " ag_gauss_fix " , " 0 " } ; //Default 0 - no fix.
DLL_GLOBAL cvar_t ag_rpg_fix = { " ag_rpg_fix " , " 0 " } ; //Default 0 - no fix.
DLL_GLOBAL cvar_t mm_agsay = { " mm_agsay " , " 1 " , FCVAR_SERVER } ;
DLL_GLOBAL bool g_bLangame = false ;
DLL_GLOBAL bool g_bUseTeamColors = false ;
extern AgString g_sGamemode ;
void LoadGreetingMessages ( ) ;
void AgInitGame ( )
{
AgInitTimer ( ) ;
CVAR_REGISTER ( & ag_version ) ;
CVAR_REGISTER ( & ag_gamemode ) ;
CVAR_REGISTER ( & ag_allowed_gamemodes ) ;
CVAR_REGISTER ( & ag_allow_vote ) ;
CVAR_REGISTER ( & ag_pure ) ;
CVAR_REGISTER ( & ag_match_running ) ;
CVAR_REGISTER ( & ag_oldphysics ) ;
CVAR_REGISTER ( & ag_player_id ) ;
CVAR_REGISTER ( & ag_lj_timer ) ;
CVAR_REGISTER ( & ag_auto_admin ) ;
CVAR_REGISTER ( & ag_wallgauss ) ;
CVAR_REGISTER ( & ag_headshot ) ;
CVAR_REGISTER ( & ag_blastradius ) ;
CVAR_REGISTER ( & ag_ban_crowbar ) ;
CVAR_REGISTER ( & ag_ban_glock ) ;
CVAR_REGISTER ( & ag_ban_357 ) ;
CVAR_REGISTER ( & ag_ban_mp5 ) ;
CVAR_REGISTER ( & ag_ban_shotgun ) ;
CVAR_REGISTER ( & ag_ban_crossbow ) ;
CVAR_REGISTER ( & ag_ban_rpg ) ;
CVAR_REGISTER ( & ag_ban_gauss ) ;
CVAR_REGISTER ( & ag_ban_egon ) ;
CVAR_REGISTER ( & ag_ban_hornet ) ;
CVAR_REGISTER ( & ag_ban_hgrenade ) ;
CVAR_REGISTER ( & ag_ban_satchel ) ;
CVAR_REGISTER ( & ag_ban_tripmine ) ;
CVAR_REGISTER ( & ag_ban_snark ) ;
CVAR_REGISTER ( & ag_ban_m203 ) ;
CVAR_REGISTER ( & ag_ban_longjump ) ;
CVAR_REGISTER ( & ag_ban_9mmar ) ;
CVAR_REGISTER ( & ag_ban_bockshot ) ;
CVAR_REGISTER ( & ag_ban_uranium ) ;
CVAR_REGISTER ( & ag_ban_bolts ) ;
CVAR_REGISTER ( & ag_ban_rockets ) ;
CVAR_REGISTER ( & ag_ban_357ammo ) ;
CVAR_REGISTER ( & ag_ban_armour ) ;
CVAR_REGISTER ( & ag_ban_health ) ;
CVAR_REGISTER ( & ag_ban_recharg ) ;
CVAR_REGISTER ( & ag_start_crowbar ) ;
CVAR_REGISTER ( & ag_start_glock ) ;
CVAR_REGISTER ( & ag_start_357 ) ;
CVAR_REGISTER ( & ag_start_mp5 ) ;
CVAR_REGISTER ( & ag_start_shotgun ) ;
CVAR_REGISTER ( & ag_start_crossbow ) ;
CVAR_REGISTER ( & ag_start_rpg ) ;
CVAR_REGISTER ( & ag_start_gauss ) ;
CVAR_REGISTER ( & ag_start_egon ) ;
CVAR_REGISTER ( & ag_start_hornet ) ;
CVAR_REGISTER ( & ag_start_hgrenade ) ;
CVAR_REGISTER ( & ag_start_satchel ) ;
CVAR_REGISTER ( & ag_start_tripmine ) ;
CVAR_REGISTER ( & ag_start_snark ) ;
CVAR_REGISTER ( & ag_start_m203 ) ;
CVAR_REGISTER ( & ag_start_longjump ) ;
CVAR_REGISTER ( & ag_start_9mmar ) ;
CVAR_REGISTER ( & ag_start_bockshot ) ;
CVAR_REGISTER ( & ag_start_uranium ) ;
CVAR_REGISTER ( & ag_start_bolts ) ;
CVAR_REGISTER ( & ag_start_rockets ) ;
CVAR_REGISTER ( & ag_start_357ammo ) ;
CVAR_REGISTER ( & ag_start_armour ) ;
CVAR_REGISTER ( & ag_start_health ) ;
CVAR_REGISTER ( & ag_dmg_crowbar ) ;
CVAR_REGISTER ( & ag_dmg_glock ) ;
CVAR_REGISTER ( & ag_dmg_357 ) ;
CVAR_REGISTER ( & ag_dmg_mp5 ) ;
CVAR_REGISTER ( & ag_dmg_shotgun ) ;
CVAR_REGISTER ( & ag_dmg_crossbow ) ;
CVAR_REGISTER ( & ag_dmg_bolts ) ;
CVAR_REGISTER ( & ag_dmg_rpg ) ;
CVAR_REGISTER ( & ag_dmg_gauss ) ;
CVAR_REGISTER ( & ag_dmg_egon_wide ) ;
CVAR_REGISTER ( & ag_dmg_egon_narrow ) ;
CVAR_REGISTER ( & ag_dmg_hornet ) ;
CVAR_REGISTER ( & ag_dmg_hgrenade ) ;
CVAR_REGISTER ( & ag_dmg_satchel ) ;
CVAR_REGISTER ( & ag_dmg_tripmine ) ;
CVAR_REGISTER ( & ag_dmg_m203 ) ;
CVAR_REGISTER ( & ag_allow_timeout ) ;
CVAR_REGISTER ( & ag_vote_start ) ;
CVAR_REGISTER ( & ag_vote_setting ) ;
CVAR_REGISTER ( & ag_vote_gamemode ) ;
CVAR_REGISTER ( & ag_vote_kick ) ;
CVAR_REGISTER ( & ag_vote_allow ) ;
CVAR_REGISTER ( & ag_vote_admin ) ;
CVAR_REGISTER ( & ag_vote_map ) ;
CVAR_REGISTER ( & ag_vote_failed_time ) ;
CVAR_REGISTER ( & ag_start_minplayers ) ;
CVAR_REGISTER ( & ag_vote_mp_timelimit_low ) ;
CVAR_REGISTER ( & ag_vote_mp_timelimit_high ) ;
CVAR_REGISTER ( & ag_vote_mp_fraglimit_low ) ;
CVAR_REGISTER ( & ag_vote_mp_fraglimit_high ) ;
CVAR_REGISTER ( & ag_floodmsgs ) ;
CVAR_REGISTER ( & ag_floodpersecond ) ;
CVAR_REGISTER ( & ag_floodwaitdelay ) ;
CVAR_REGISTER ( & ag_max_spectators ) ;
CVAR_REGISTER ( & ag_spec_enable_disable ) ;
CVAR_REGISTER ( & ag_spectalk ) ;
CVAR_REGISTER ( & ag_spawn_volume ) ;
CVAR_REGISTER ( & ag_show_gibs ) ;
CVAR_REGISTER ( & ag_gametype ) ;
CVAR_REGISTER ( & ag_ctf_flag_resettime ) ;
CVAR_REGISTER ( & ag_ctf_capturepoints ) ;
CVAR_REGISTER ( & ag_ctf_teamcapturepoints ) ;
CVAR_REGISTER ( & ag_ctf_capture_limit ) ;
CVAR_REGISTER ( & ag_ctf_returnpoints ) ;
CVAR_REGISTER ( & ag_ctf_carrierkillpoints ) ;
CVAR_REGISTER ( & ag_ctf_stealpoints ) ;
CVAR_REGISTER ( & ag_ctf_defendpoints ) ;
CVAR_REGISTER ( & ag_ctf_roundbased ) ;
//++ muphicks
CVAR_REGISTER ( & ag_dom_mincontroltime ) ;
CVAR_REGISTER ( & ag_dom_controlpoints ) ;
CVAR_REGISTER ( & ag_dom_resetscorelimit ) ;
CVAR_REGISTER ( & ag_dom_scorelimit ) ;
//-- muphicks
CVAR_REGISTER ( & ag_gauss_fix ) ;
CVAR_REGISTER ( & ag_rpg_fix ) ;
CVAR_REGISTER ( & mm_agsay ) ;
Command . Init ( ) ;
//Set up initial settings. Add "startup_" before
char * servercfgfile = ( char * ) CVAR_GET_STRING ( " servercfgfile " ) ;
if ( servercfgfile & & servercfgfile [ 0 ] )
{
char szCommand [ 256 ] ;
ALERT ( at_console , " Executing dedicated server startup config file \n " ) ;
sprintf ( szCommand , " exec startup_%s \n " , servercfgfile ) ;
SERVER_COMMAND ( szCommand ) ;
SERVER_EXECUTE ( ) ;
}
g_bLangame = 0 < CVAR_GET_FLOAT ( " sv_lan " ) ;
GameMode . Init ( ) ;
Wallhack . Init ( ) ;
LoadGreetingMessages ( ) ;
}
//TITLES FOR HALF-LIFE
// Position command $position x y
// x & y are from 0 to 1 to be screen resolution independent
// -1 means center in each dimension
// Effect command $effect <effect number>
// effect 0 is fade in/fade out
// effect 1 is flickery credits
// effect 2 is write out (training room)
// Text color r g b command $color
// fadein time fadeout time / hold time
// $fadein (message fade in time - per character in effect 2)
// $fadeout (message fade out time)
// $holdtime (stay on the screen for this long)
void AgSay ( CBasePlayer * pPlayer , const AgString & sText , float * pfFloodProtected , float fHoldTime , float x , float y , int iChannel )
{
if ( g_fGameOver )
return ;
if ( pfFloodProtected )
{
if ( * pfFloodProtected > gpGlobals - > time )
return ;
* pfFloodProtected = gpGlobals - > time + fHoldTime ;
}
hudtextparms_t hText ;
memset ( & hText , 0 , sizeof ( hText ) ) ;
hText . channel = iChannel ;
// These X and Y coordinates are just above
// the health meter.
hText . x = x ;
hText . y = y ;
hText . r1 = hText . g1 = hText . b1 = 180 ;
hText . a1 = 0 ;
hText . r2 = hText . g2 = hText . b2 = 0 ;
hText . a2 = 0 ;
hText . holdTime = fHoldTime - 0.30 ;
hText . effect = 2 ; // Fade in/out
hText . fadeinTime = 0.01 ;
hText . fadeoutTime = fHoldTime / 5 ;
hText . fxTime = 0.25 ;
if ( pPlayer )
{
UTIL_HudMessage ( pPlayer , hText , sText . c_str ( ) ) ;
}
else
{
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + )
{
CBasePlayer * pPlayerLoop = AgPlayerByIndex ( i ) ;
if ( pPlayerLoop )
UTIL_HudMessage ( pPlayerLoop , hText , sText . c_str ( ) ) ;
}
}
}
CBasePlayer * AgPlayerByIndex ( int iPlayerIndex )
{
CBasePlayer * pPlayer = NULL ;
if ( iPlayerIndex > 0 & & iPlayerIndex < = gpGlobals - > maxClients )
{
edict_t * pPlayerEdict = INDEXENT ( iPlayerIndex ) ;
if ( pPlayerEdict & & ! pPlayerEdict - > free & & pPlayerEdict - > pvPrivateData )
{
CBaseEntity * pEnt = ( CBaseEntity * ) CBaseEntity : : Instance ( pPlayerEdict ) ;
if ( pEnt & & pEnt - > pev & & CLASS_PLAYER = = pEnt - > Classify ( ) )
{
if ( pEnt - > pev - > netname & & 0 ! = STRING ( pEnt - > pev - > netname ) [ 0 ] )
{
pPlayer = ( CBasePlayer * ) pEnt ;
}
}
}
}
return pPlayer ;
}
CBasePlayer * AgPlayerByName ( const AgString & sNameOrPlayerNumber )
{
if ( 0 = = sNameOrPlayerNumber . size ( ) )
return NULL ;
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + )
{
CBasePlayer * pPlayerLoop = AgPlayerByIndex ( i ) ;
if ( pPlayerLoop )
if ( 0 = = stricmp ( pPlayerLoop - > GetName ( ) , sNameOrPlayerNumber . c_str ( ) ) | |
( " # " = = sNameOrPlayerNumber . substr ( 0 , 1 ) & &
GETPLAYERUSERID ( pPlayerLoop - > edict ( ) ) = = atoi ( sNameOrPlayerNumber . substr ( 1 ) . c_str ( ) ) )
)
return pPlayerLoop ;
}
return NULL ;
}
void AgChangelevel ( const AgString & sLevelname )
{
if ( 32 < sLevelname . size ( ) | | 0 = = sLevelname . size ( ) )
return ;
char szTemp [ 64 ] ;
strcpy ( szTemp , sLevelname . c_str ( ) ) ;
//Check if it exists.
if ( IS_MAP_VALID ( szTemp ) )
//Change the level
CHANGE_LEVEL ( szTemp , NULL ) ;
}
void AgConsole ( const AgString & sText , CBasePlayer * pPlayer )
{
if ( pPlayer & & pPlayer - > pev )
{
ClientPrint ( pPlayer - > pev , HUD_PRINTCONSOLE , UTIL_VarArgs ( " %s \n " , sText . c_str ( ) ) ) ;
}
else
{
g_engfuncs . pfnServerPrint ( UTIL_VarArgs ( " %s \n " , sText . c_str ( ) ) ) ;
}
}
void AgResetMap ( )
{
CBaseEntity * pEntity = NULL ;
edict_t * pEdict = g_engfuncs . pfnPEntityOfEntIndex ( 1 ) ;
for ( int i = 1 ; i < gpGlobals - > maxEntities ; i + + , pEdict + + )
{
pEntity = CBaseEntity : : Instance ( pEdict ) ;
if ( pEntity & & pEntity - > pev )
{
const char * pszClass = STRING ( pEntity - > pev - > classname ) ;
if ( pszClass & & ' \0 ' ! = pszClass [ 0 ] )
{
if ( 0 = = strncmp ( pszClass , " weapon_ " , 7 ) | |
0 = = strncmp ( pszClass , " ammo_ " , 5 ) | |
0 = = strncmp ( pszClass , " item_ " , 5 ) )
{
pEntity - > pev - > nextthink = gpGlobals - > time ;
}
}
}
}
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " weaponbox " ) ) ! = NULL )
UTIL_Remove ( pEntity ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " monster_satchel " ) ) ! = NULL )
UTIL_Remove ( pEntity ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " monster_tripmine " ) ) ! = NULL )
UTIL_Remove ( pEntity ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " monster_snark " ) ) ! = NULL )
UTIL_Remove ( pEntity ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " beam " ) ) ! = NULL )
UTIL_Remove ( pEntity ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " func_healthcharger " ) ) ! = NULL )
( ( CBaseToggle * ) pEntity ) - > Reset ( ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " func_recharge " ) ) ! = NULL )
( ( CBaseToggle * ) pEntity ) - > Reset ( ) ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " rpg_rocket " ) ) ! = NULL )
pEntity - > pev - > dmg = 0 ;
pEntity = NULL ;
while ( ( pEntity = UTIL_FindEntityByClassname ( pEntity , " grenade " ) ) ! = NULL )
pEntity - > pev - > dmg = 0 ;
}
char * AgStringToLower ( char * pszString )
{
if ( NULL = = pszString )
return pszString ;
char * pszTemp = pszString ;
while ( ' \0 ' ! = pszTemp [ 0 ] )
{
* pszTemp = tolower ( * pszTemp ) ;
pszTemp + + ;
}
return pszString ;
}
void AgToLower ( AgString & strLower )
{
size_t i = 0 ;
while ( i < strLower . size ( ) )
{
strLower [ i ] = tolower ( strLower [ i ] ) ;
i + + ;
}
}
void AgTrim ( AgString & sTrim )
{
if ( 0 = = sTrim . size ( ) )
return ;
int b = sTrim . find_first_not_of ( " \t \r \n " ) ;
int e = sTrim . find_last_not_of ( " \t \r \n " ) ;
if ( b = = - 1 ) // No non-whitespaces
sTrim = " " ;
else
sTrim = string ( sTrim , b , e - b + 1 ) ;
}
void AgLog ( const char * pszLog )
{
char szFile [ MAX_PATH ] ;
sprintf ( szFile , " %s/agslog.txt " , AgGetDirectory ( ) ) ;
FILE * pFile = fopen ( szFile , " a+ " ) ;
if ( ! pFile )
{
g_engfuncs . pfnServerPrint ( UTIL_VarArgs ( " Couldn't create/save %s. " , szFile ) ) ;
return ;
}
time_t clock ;
time ( & clock ) ;
fprintf ( pFile , " %s : %s " , pszLog , asctime ( localtime ( & clock ) ) ) ;
fflush ( pFile ) ;
fclose ( pFile ) ;
g_engfuncs . pfnServerPrint ( pszLog ) ;
}
# ifndef WIN32
# include <sys/times.h>
# endif
/*
float AgTime ( )
{
# ifdef WIN32
return ( ( float ) clock ( ) ) / ( ( float ) CLOCKS_PER_SEC ) ;
# else
static tms t ;
return ( ( float ) times ( & t ) ) / 100.0 ; //Should be CLK_TCK defined in limits.h.
# endif
}
*/
void AgDirList ( const AgString & sDir , AgStringSet & setFiles )
{
# ifdef _WIN32
WIN32_FIND_DATA FindData ;
char szSearchDirectory [ _MAX_PATH ] ;
sprintf ( szSearchDirectory , " %s/*.* " , sDir . c_str ( ) ) ;
HANDLE hFind = FindFirstFile ( szSearchDirectory , & FindData ) ;
if ( INVALID_HANDLE_VALUE ! = hFind )
{
do
{
if ( ! ( FindData . dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
{
AgString sFile ;
sFile = FindData . cFileName ;
setFiles . insert ( sFile ) ;
}
}
while ( FindNextFile ( hFind , & FindData ) ) ;
FindClose ( hFind ) ;
}
# else
DIR * pDirectory = opendir ( sDir . c_str ( ) ) ;
if ( pDirectory )
{
struct dirent * pFile = NULL ;
while ( NULL ! = ( pFile = readdir ( pDirectory ) ) )
{
AgString sFile ;
sFile = pFile - > d_name ;
setFiles . insert ( sFile ) ;
}
closedir ( pDirectory ) ;
}
# endif
}
void AgStripColors ( char * pszString )
{
char * pszIt = pszString ;
while ( ' \0 ' ! = * pszIt )
{
if ( ' ^ ' = = * pszIt )
{
+ + pszIt ;
if ( * pszIt > = ' 0 ' & & * pszIt < = ' 9 ' )
{
- - pszIt ;
memmove ( pszIt , pszIt + 2 , strlen ( pszIt + 2 ) + 1 ) ;
}
}
else
+ + pszIt ;
}
}
void AgGetDetails ( char * pszDetails , int iMaxSize , int * piSize )
{
int iBytes = 0 ;
char * pszBuffer = pszDetails ;
//Write Match running
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " match \\ %d " , ag_match_running . value > 0 ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
* piSize = iBytes ;
}
void AgGetPlayerInfo ( char * pszDetails , int iMaxSize , int * piSize )
{
int iBytes = 0 ;
char * pszBuffer = pszDetails ;
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + )
{
if ( iBytes + 100 > iMaxSize )
break ;
CBasePlayer * pPlayerLoop = AgPlayerByIndex ( i ) ;
if ( pPlayerLoop )
{
if ( ! pPlayerLoop - > IsSpectator ( ) )
{
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " %s " , pPlayerLoop - > GetName ( ) ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " \t %s " , pPlayerLoop - > TeamID ( ) ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " \t %d " , ( int ) pPlayerLoop - > pev - > frags ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " \t %d " , ( int ) pPlayerLoop - > m_iDeaths ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
iBytes + = sprintf ( & pszBuffer [ iBytes ] , " \t %s " , pPlayerLoop - > GetAuthID ( ) ) ;
pszBuffer [ iBytes ] = ' \0 ' ;
iBytes + + ;
}
}
}
* piSize = iBytes ;
}
# ifndef _WIN32
# include <sys/utsname.h>
# endif
char * AgOSVersion ( )
{
# ifdef _WIN32
static char verbuf [ 256 ] ;
# else
static char verbuf [ 4 * SYS_NMLN + 4 ] ;
# endif
# ifdef _WIN32
OSVERSIONINFO VersionInfo ;
VersionInfo . dwOSVersionInfoSize = sizeof ( VersionInfo ) ;
if ( GetVersionEx ( & VersionInfo ) )
{
if ( strlen ( VersionInfo . szCSDVersion ) > 200 )
VersionInfo . szCSDVersion [ 100 ] = 0 ;
sprintf ( verbuf , " Windows %d.%d build%d PlatformId %d SP= \" %s \" \n " ,
VersionInfo . dwMajorVersion ,
VersionInfo . dwMinorVersion ,
VersionInfo . dwBuildNumber ,
VersionInfo . dwPlatformId ,
VersionInfo . szCSDVersion ) ;
}
else
{
strcpy ( verbuf , " WINDOWS UNKNOWN \n " ) ;
}
# else
struct utsname ubuf ;
if ( uname ( & ubuf ) )
{
strcpy ( verbuf , " LINUX UNKNOWN \n " ) ;
}
else
{
sprintf ( verbuf , " %s %s %s %s \n " ,
ubuf . sysname ,
ubuf . release ,
ubuf . version ,
ubuf . machine ) ;
}
# endif
return verbuf ;
}
# ifdef _WIN32
static LARGE_INTEGER liTimerFreq ;
void AgInitTimer ( )
{
QueryPerformanceFrequency ( & liTimerFreq ) ;
}
double AgTime ( )
{
LARGE_INTEGER liTime ;
QueryPerformanceCounter ( & liTime ) ;
return ( ( double ) liTime . QuadPart ) / ( ( double ) liTimerFreq . QuadPart ) ;
}
# else
# include <sys/time.h>
# include <unistd.h>
# include <sys/times.h>
static double dClockTicsPerSecond ;
void AgInitTimer ( )
{
dClockTicsPerSecond = sysconf ( _SC_CLK_TCK ) ;
}
double AgTime ( )
{
tms t ;
clock_t time = times ( & t ) ;
if ( ( ( clock_t ) - 1 ) = = time )
{
struct timeval tod ;
gettimeofday ( & tod , NULL ) ;
return tod . tv_sec + tod . tv_usec * 0.000001 ;
}
return ( ( double ) time ) / dClockTicsPerSecond ;
}
# endif
AgString AgReadFile ( const char * pszFile )
{
AgString sData ;
char szFile [ MAX_PATH ] ;
char szData [ 4096 ] ;
sprintf ( szFile , " %s/%s " , AgGetDirectory ( ) , pszFile ) ;
FILE * pFile = fopen ( szFile , " r " ) ;
if ( ! pFile )
return " " ;
int iRead = 0 ;
while ( 0 ! = ( iRead = fread ( szData , sizeof ( char ) , sizeof ( szData ) - 2 , pFile ) ) )
{
szData [ iRead ] = ' \0 ' ;
sData + = szData ;
szData [ 0 ] = ' \0 ' ;
}
fclose ( pFile ) ;
return sData ;
}
typedef map < AgString , AgString , less < AgString > > AgAuthIDToGreeting ;
static AgAuthIDToGreeting s_mapGreeting ;
void LoadGreetingMessages ( )
{
AgString sGreetingMessages = AgReadFile ( " greeting.txt " ) ;
int iPosNewLine = sGreetingMessages . find_first_of ( " \n " ) ;
while ( - 1 ! = iPosNewLine )
{
AgString sAuthID , sGreeting ;
int iPosGreeting = sGreetingMessages . find_first_of ( " \t " ) ;
sAuthID = sGreetingMessages . substr ( 0 , iPosGreeting ) ;
sGreeting = sGreetingMessages . substr ( iPosGreeting + 1 , iPosNewLine - iPosGreeting - 1 ) ;
AgTrim ( sGreeting ) ;
AgTrim ( sAuthID ) ;
sGreeting + = " \n " ;
s_mapGreeting . insert ( AgAuthIDToGreeting : : value_type ( sAuthID , sGreeting ) ) ;
sGreetingMessages = sGreetingMessages . substr ( iPosNewLine + 1 ) ;
iPosNewLine = sGreetingMessages . find_first_of ( " \n " ) ;
}
}
void AgDisplayGreetingMessage ( const char * pszAuthID )
{
AgAuthIDToGreeting : : iterator itrGreeting = s_mapGreeting . find ( pszAuthID ) ;
if ( itrGreeting ! = s_mapGreeting . end ( ) )
UTIL_ClientPrintAll ( HUD_PRINTNOTIFY , ( * itrGreeting ) . second . c_str ( ) ) ;
}
bool AgIsCTFMap ( const char * pszMap )
{
# define LUMP_ENTITIES 0
# define HEADER_LUMPS 15
# define MAX_MAP_ENTSTRING (128*1024)
typedef struct
{
int fileofs , filelen ;
} lump_t ;
typedef struct
{
int version ;
lump_t lumps [ HEADER_LUMPS ] ;
} dheader_t ;
if ( 0 = = strncmp ( pszMap , " agctf_ " , 6 ) )
return true ;
else if ( 0 = = strncmp ( pszMap , " hlectf_ " , 6 ) )
return true ;
char szMapFile [ MAX_PATH ] ;
int iMapLength = 0 ;
sprintf ( szMapFile , " maps/%s.bsp " , STRING ( gpGlobals - > mapname ) ) ;
byte * pMapData = LOAD_FILE_FOR_ME ( szMapFile , & iMapLength ) ;
if ( ! pMapData )
return false ;
AgString sMapEntityData ;
dheader_t * pHeader = ( dheader_t * ) pMapData ;
if ( pHeader - > version = = 29 | | pHeader - > version = = 30 )
{
int iMapDataLength = pHeader - > lumps [ LUMP_ENTITIES ] . filelen ;
int iMapDataOffset = pHeader - > lumps [ LUMP_ENTITIES ] . fileofs ;
pMapData [ iMapDataLength ] = ' \0 ' ;
if ( NULL ! = strstr ( ( const char * ) & pMapData [ iMapDataOffset ] , " info_hmctfdetect " )
| | NULL ! = strstr ( ( const char * ) & pMapData [ iMapDataOffset ] , " info_ctfdetect " ) )
{
FREE_FILE ( pMapData ) ;
return true ;
}
}
FREE_FILE ( pMapData ) ;
return false ;
}
//++ muphicks
// Check to see if we have a DOM map
bool AgIsDOMMap ( const char * pszMap )
{
# define LUMP_ENTITIES 0
# define HEADER_LUMPS 15
# define MAX_MAP_ENTSTRING (128*1024)
typedef struct
{
int fileofs , filelen ;
} lump_t ;
typedef struct
{
int version ;
lump_t lumps [ HEADER_LUMPS ] ;
} dheader_t ;
if ( 0 = = strncmp ( pszMap , " agdom_ " , 6 ) )
return true ;
char szMapFile [ MAX_PATH ] ;
int iMapLength = 0 ;
sprintf ( szMapFile , " maps/%s.bsp " , STRING ( gpGlobals - > mapname ) ) ;
byte * pMapData = LOAD_FILE_FOR_ME ( szMapFile , & iMapLength ) ;
if ( ! pMapData )
return false ;
AgString sMapEntityData ;
dheader_t * pHeader = ( dheader_t * ) pMapData ;
if ( pHeader - > version = = 29 | | pHeader - > version = = 30 )
{
int iMapDataLength = pHeader - > lumps [ LUMP_ENTITIES ] . filelen ;
int iMapDataOffset = pHeader - > lumps [ LUMP_ENTITIES ] . fileofs ;
pMapData [ iMapDataLength ] = ' \0 ' ;
if ( NULL ! = strstr ( ( const char * ) & pMapData [ iMapDataOffset ] , " info_hmdomdetect " )
| | NULL ! = strstr ( ( const char * ) & pMapData [ iMapDataOffset ] , " info_domdetect " ) )
{
FREE_FILE ( pMapData ) ;
return true ;
}
}
FREE_FILE ( pMapData ) ;
return false ;
}
//--muphicks
void AgSound ( CBasePlayer * pPlayer , const char * pszWave )
{
ASSERT ( NULL ! = pPlayer ) ;
if ( ! pPlayer )
return ;
ASSERT ( NULL ! = pPlayer - > pev ) ;
if ( ! pPlayer - > pev )
return ;
if ( ! pPlayer - > edict ( ) | | 0 = = strlen ( pszWave ) )
return ;
CLIENT_COMMAND ( pPlayer - > edict ( ) , " play %s \n " , pszWave ) ;
}
void AgPlayCountdown ( CBasePlayer * pPlayer , int iSeconds )
{
ASSERT ( NULL ! = pPlayer ) ;
if ( ! pPlayer )
return ;
ASSERT ( NULL ! = pPlayer - > pev ) ;
if ( ! pPlayer - > pev )
return ;
if ( 0 = = iSeconds )
{
AgSound ( pPlayer , " barney/ba_bring.wav " ) ;
}
else
{
if ( ! g_bLangame )
{
AgSound ( pPlayer , " fvox/beep.wav " ) ;
}
else
{
if ( 1 = = iSeconds )
AgSound ( pPlayer , " fvox/one.wav " ) ;
else if ( 2 = = iSeconds )
AgSound ( pPlayer , " fvox/two.wav " ) ;
else if ( 3 = = iSeconds )
AgSound ( pPlayer , " fvox/three.wav " ) ;
else if ( 4 = = iSeconds )
AgSound ( pPlayer , " fvox/four.wav " ) ;
else if ( 5 = = iSeconds )
AgSound ( pPlayer , " fvox/five.wav " ) ;
else if ( 6 = = iSeconds )
AgSound ( pPlayer , " fvox/six.wav " ) ;
else if ( 7 = = iSeconds )
AgSound ( pPlayer , " fvox/seven.wav " ) ;
else if ( 8 = = iSeconds )
AgSound ( pPlayer , " fvox/eight.wav " ) ;
else if ( 9 = = iSeconds )
AgSound ( pPlayer , " fvox/nine.wav " ) ;
else if ( 10 = = iSeconds )
AgSound ( pPlayer , " fvox/ten.wav " ) ;
}
}
}
bool AgIsLocalServer ( )
{
return ! ( IS_DEDICATED_SERVER ( ) & & 0 = = CVAR_GET_FLOAT ( " sv_lan " ) ) ;
}
const char * AgGetGame ( )
{
static char szGame [ MAX_PATH ] ;
GET_GAME_DIR ( szGame ) ;
char * pszGameDir = strrchr ( szGame , ' / ' ) ;
if ( pszGameDir )
return pszGameDir + 1 ;
return szGame ;
}
const char * AgGetDirectory ( )
{
static char szGame [ MAX_PATH ] ;
GET_GAME_DIR ( szGame ) ;
char * pszGameDir = strrchr ( szGame , ' / ' ) ;
if ( pszGameDir )
{
return szGame ;
}
else
{
static char szDirectory [ MAX_PATH ] = " " ;
if ( strlen ( szDirectory ) )
return szDirectory ;
# ifndef _WIN32
getcwd ( szDirectory , MAX_PATH ) ;
# else
: : GetCurrentDirectory ( MAX_PATH , szDirectory ) ;
# endif
strcat ( szDirectory , " / " ) ;
strcat ( szDirectory , szGame ) ;
return szDirectory ;
}
}
const char * AgGetDirectoryValve ( )
{
static char szDirectory [ MAX_PATH ] = " " ;
if ( szDirectory [ 0 ] ! = ' \0 ' )
return szDirectory ;
strcpy ( szDirectory , AgGetDirectory ( ) ) ;
int iStart = strlen ( szDirectory ) - 1 ;
while ( ' / ' ! = szDirectory [ iStart ] )
{
szDirectory [ iStart ] = ' \0 ' ;
iStart - - ;
if ( iStart = = 0 )
{
break ;
}
}
szDirectory [ iStart ] = ' \0 ' ;
return szDirectory ;
}
//-- Martin Webrant