From b94c33b50dc445c447328bd484cfa0aa4dd09279 Mon Sep 17 00:00:00 2001 From: mrbougo Date: Tue, 8 Sep 2009 16:10:52 +0000 Subject: [PATCH] define localcmd correctly in svqc; add client- and serverside alias hooks on start and end of a match, as well as a serverside ready-restart hook git-svn-id: svn://svn.icculus.org/nexuiz/trunk@7697 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 39 +++++++++++++++++++++++++++++ data/qcsrc/client/Main.qc | 16 ++++++++++++ data/qcsrc/client/View.qc | 7 ++++++ data/qcsrc/client/main.qh | 5 ++++ data/qcsrc/server/builtins.qh | 2 +- data/qcsrc/server/clientcommands.qc | 2 ++ data/qcsrc/server/g_world.qc | 4 +++ 7 files changed, 74 insertions(+), 1 deletion(-) diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index 7a8b7f009..d9cf15055 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -1646,6 +1646,45 @@ seta cl_playerdetailreduction 0 "the higher, the less detailed player models are set g_mapinfo_settemp_acl "+*" "ACL for mapinfo setting cvars" +// hooks +alias _cl_hook_gamestart "set _cl_hook_gametype $1; _cl_hook_gamestart_stage2" +alias _cl_hook_gamestart_stage2 "cl_hook_gamestart_all; cl_hook_gamestart_${_cl_hook_gametype}" +alias cl_hook_gamestart_all +alias cl_hook_gamestart_nop //is only called when CSQC unloads before knowing the gametype, very unlikely +alias cl_hook_gamestart_dm +alias cl_hook_gamestart_tdm +alias cl_hook_gamestart_dom +alias cl_hook_gamestart_ctf +alias cl_hook_gamestart_rune +alias cl_hook_gamestart_lms +alias cl_hook_gamestart_arena +alias cl_hook_gamestart_kh +alias cl_hook_gamestart_ons +alias cl_hook_gamestart_as +alias cl_hook_gamestart_rc +alias cl_hook_gamestart_nexball +alias cl_hook_gamestart_cts +alias cl_hook_gameend + +alias _sv_hook_gamestart "set _sv_hook_gametype $1; _sv_hook_gamestart_stage2" +alias _sv_hook_gamestart_stage2 "sv_hook_gamestart_all; sv_hook_gamestart_${_sv_hook_gametype}" +alias sv_hook_gamestart_all +alias sv_hook_gamestart_dm +alias sv_hook_gamestart_tdm +alias sv_hook_gamestart_dom +alias sv_hook_gamestart_ctf +alias sv_hook_gamestart_rune +alias sv_hook_gamestart_lms +alias sv_hook_gamestart_arena +alias sv_hook_gamestart_kh +alias sv_hook_gamestart_ons +alias sv_hook_gamestart_as +alias sv_hook_gamestart_rc +alias sv_hook_gamestart_nexball +alias sv_hook_gamestart_cts +alias sv_hook_gamerestart +alias sv_hook_gameend + cl_netfps 60 // moar seta cl_casings_maxcount 100 "maximum amount of shell casings (must be at least 1)" diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index 28f5fd823..c77fd39ac 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -115,6 +115,8 @@ void CSQC_Init(void) postinit = false; + calledhooks = 0; + teams = Sort_Spawn(); players = Sort_Spawn(); @@ -170,6 +172,14 @@ void CSQC_Shutdown(void) if(camera_active) cvar_set("chase_active",ftos(chase_active_backup)); + + if not(isdemo()) + { + if not(calledhooks & HOOK_START) + localcmd("\n_cl_hook_gamestart nop;"); + if not(calledhooks & HOOK_END) + localcmd("\ncl_hook_gameend;"); + } } .float has_team; @@ -853,6 +863,12 @@ void Gamemode_Init() precache_pic("gfx/sb_key_carrying"); precache_pic("gfx/sb_key_carrying_outline"); } + + if not(isdemo()) + { + localcmd("\n_cl_hook_gamestart ", GametypeNameFromType(gametype), ";"); + calledhooks |= HOOK_START; + } } // CSQC_Parse_StuffCmd : Provides the stuffcmd string in the first parameter that the server provided. To execute standard behavior, simply execute localcmd with the string. void CSQC_Parse_StuffCmd(string strMessage) diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index 32abab88a..596158930 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -383,6 +383,13 @@ void CSQC_UpdateView(float w, float h) if(!postinit) PostInit(); + if(intermission && !isdemo() && !(calledhooks & HOOK_END)) + if(calledhooks & HOOK_START) + { + localcmd("\ncl_hook_gameend;"); + calledhooks |= HOOK_END; + } + CheckForGamestartChange(); maptimeAnnouncer(); diff --git a/data/qcsrc/client/main.qh b/data/qcsrc/client/main.qh index a053d4526..71b09a22e 100644 --- a/data/qcsrc/client/main.qh +++ b/data/qcsrc/client/main.qh @@ -152,3 +152,8 @@ void centerprint(string strMessage); #define ALPHA_MIN_VISIBLE 0.003 float armorblockpercent; + +//hooks +float calledhooks; +#define HOOK_START 1 +#define HOOK_END 2 diff --git a/data/qcsrc/server/builtins.qh b/data/qcsrc/server/builtins.qh index e28406bf8..8abca4ab4 100644 --- a/data/qcsrc/server/builtins.qh +++ b/data/qcsrc/server/builtins.qh @@ -44,7 +44,7 @@ float pointcontents (vector v) = #41; float fabs (float f) = #43; vector(entity e, float speed) aim = #44; float cvar (string s) = #45; -void localcmd (string s) = #46; +void localcmd (string s, ...) = #46; entity nextent (entity e) = #47; void particle (vector v, vector d, float colour, float count) = #48; void ChangeYaw (void) = #49; diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index 774b8c53a..2e19741fb 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -781,6 +781,8 @@ void ReadyRestart() // no arena, assault support yet... if(g_arena | g_assault | gameover | intermission_running | race_completing) localcmd("restart\n"); + else + localcmd("\nsv_hook_gamerestart;"); ReadyRestartForce(); diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index 76a00b5a1..100f04074 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -645,6 +645,8 @@ void spawnfunc_worldspawn (void) ClientInit_Spawn(); RandomSeed_Spawn(); + localcmd("\n_sv_hook_gamestart ", GetGametype(), ";"); + world_initialized = 1; } @@ -1354,6 +1356,8 @@ void NextLevel() if(cvar("g_campaign")) CampaignPreIntermission(); + localcmd("\nsv_hook_gameend;"); + // WriteByte (MSG_ALL, SVC_INTERMISSION); }; -- 2.39.2