From 7a2fc8b0dc1849a5fd81837d978939ddf4b1af31 Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 24 Mar 2009 10:06:51 +0000 Subject: [PATCH] make the campaign cheatproof by ignoring the cvars, and using ONLY the settings from the campaign file (PLEASE TEST) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6264 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/common/campaign_setup.qc | 4 --- data/qcsrc/common/mapinfo.qc | 19 +++++++++++ data/qcsrc/common/mapinfo.qh | 1 + data/qcsrc/server/bots.qc | 5 ++- data/qcsrc/server/campaign.qc | 49 ++++++++++++++++++++++++++--- data/qcsrc/server/g_world.qc | 9 +++++- data/qcsrc/server/progs.src | 2 ++ 7 files changed, 77 insertions(+), 12 deletions(-) diff --git a/data/qcsrc/common/campaign_setup.qc b/data/qcsrc/common/campaign_setup.qc index 7ad426212..3623edb98 100644 --- a/data/qcsrc/common/campaign_setup.qc +++ b/data/qcsrc/common/campaign_setup.qc @@ -1,6 +1,5 @@ void CampaignSetup(float n) { - localcmd("exec mutator_reset.cfg\n"); localcmd("set g_campaign 1\n"); localcmd("set _campaign_name \""); localcmd(campaign_name); @@ -8,8 +7,5 @@ void CampaignSetup(float n) localcmd("set _campaign_index "); localcmd(ftos(campaign_offset + n)); localcmd("\n"); - localcmd(campaign_mutators[n]); - localcmd("\n"); - MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[n])); MapInfo_LoadMap(campaign_mapname[n]); } diff --git a/data/qcsrc/common/mapinfo.qc b/data/qcsrc/common/mapinfo.qc index f9763c7bc..19db1e59d 100644 --- a/data/qcsrc/common/mapinfo.qc +++ b/data/qcsrc/common/mapinfo.qc @@ -892,6 +892,25 @@ float MapInfo_CheckMap(string s) // returns 0 if the map can't be played with th return r; } +string MapInfo_GetGameTypeCvar(float t) +{ + switch(t) + { + case MAPINFO_TYPE_DEATHMATCH: return "g_dm"; + case MAPINFO_TYPE_TEAM_DEATHMATCH: return "g_tdm"; + case MAPINFO_TYPE_DOMINATION: return "g_domination"; + case MAPINFO_TYPE_CTF: return "g_ctf"; + case MAPINFO_TYPE_RUNEMATCH: return "g_runematch"; + case MAPINFO_TYPE_LMS: return "g_lms"; + case MAPINFO_TYPE_ARENA: return "g_arena"; + case MAPINFO_TYPE_KEYHUNT: return "g_kh"; + case MAPINFO_TYPE_ASSAULT: return "g_assault"; + case MAPINFO_TYPE_ONSLAUGHT: return "g_onslaught"; + case MAPINFO_TYPE_RACE: return "g_race"; + default: return ""; + } +} + void MapInfo_SwitchGameType(float t) { cvar_set("gamecfg", "0"); diff --git a/data/qcsrc/common/mapinfo.qh b/data/qcsrc/common/mapinfo.qh index ebe6d6f26..636c43b25 100644 --- a/data/qcsrc/common/mapinfo.qh +++ b/data/qcsrc/common/mapinfo.qh @@ -62,6 +62,7 @@ string MapInfo_ListAllowedMaps(float pFlagsRequired, float pFlagsForbidden); // gets a gametype from a string float MapInfo_Type_FromString(string t); +string MapInfo_GetGameTypeCvar(float t); void MapInfo_SwitchGameType(float t); // to be called from worldspawn to set up cvars diff --git a/data/qcsrc/server/bots.qc b/data/qcsrc/server/bots.qc index a4370cb82..d41dfe9c0 100644 --- a/data/qcsrc/server/bots.qc +++ b/data/qcsrc/server/bots.qc @@ -2317,9 +2317,8 @@ void bot_serverframe() { float a; a = cvar("skill_auto"); - if(!cvar("g_campaign")) - if(a) - autoskill(a); + if(a) + autoskill(a); autoskill_nextthink = time + 5; } diff --git a/data/qcsrc/server/campaign.qc b/data/qcsrc/server/campaign.qc index c1d0d4ca7..8315335aa 100644 --- a/data/qcsrc/server/campaign.qc +++ b/data/qcsrc/server/campaign.qc @@ -12,10 +12,41 @@ float checkrules_equality; void CampaignBailout(string s) { cvar_set("g_campaign", "0"); + cvar = cvar_builtin; + cvar_string = cvar_string_builtin; + cvar_set = cvar_set_builtin; print("campaign initialization failed: ", s, "\n"); return; } +string cvar_campaignwrapper_list; // string of format ; var value; var value; var value; +string cvar_string_campaignwrapper(string theCvar) +{ + float p, q; + p = strstrofs(cvar_campaignwrapper_list, strcat("; ", theCvar, " "), 0); + if(p < 0) + return cvar_defstring(theCvar); + p += strlen(theCvar) + 3; + q = strstrofs(cvar_campaignwrapper_list, ";", p); + if(q < 0) + return cvar_defstring(theCvar); + return substring(cvar_campaignwrapper_list, p, q - p); +} +float cvar_campaignwrapper(string theCvar) +{ + return stof(cvar_string_campaignwrapper(theCvar)); +} +void cvar_set_campaignwrapper(string theCvar, string theValue) +{ + if(cvar_string_campaignwrapper(theCvar) == theValue) + return; + string s; + s = cvar_campaignwrapper_list; + cvar_campaignwrapper_list = strzone(strcat("; ", theCvar, " ", theValue, s)); + strunzone(s); + //print(cvar_campaignwrapper_list, "\n"); +} + void CampaignPreInit() { float baseskill; @@ -26,17 +57,27 @@ void CampaignPreInit() CampaignFile_Load(campaign_level, 2); if(campaign_entries < 1) return CampaignBailout("unknown map"); - cvar_set("bot_number", ftos(campaign_bots[0])); baseskill = cvar("g_campaign_skill"); baseskill = baseskill + campaign_botskill[0]; if(baseskill < 0) baseskill = 0; - cvar_set("skill", ftos(baseskill)); cvar_set("sv_public", "0"); cvar_set("pausable", "1"); + cvar_campaignwrapper_list = strzone(strcat("; ", campaign_mutators[0], "; ")); + + cvar = cvar_campaignwrapper; + cvar_string = cvar_string_campaignwrapper; + cvar_set = cvar_set_campaignwrapper; + + cvar_set("g_campaign", "1"); + cvar_set("g_dm", "0"); + cvar_set("skill", ftos(baseskill)); + cvar_set("bot_number", ftos(campaign_bots[0])); + MapInfo_SwitchGameType(MapInfo_Type_FromString(campaign_gametype[0])); + title = campaign_shortdesc[0]; title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title)); campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game")); @@ -67,7 +108,7 @@ void CampaignSaveCvar(string cvarname, float value) string l; registercvar(cvarname, ftos(value)); - cvar_set(cvarname, ftos(value)); + cvar_set_builtin(cvarname, ftos(value)); // note: cvarname must be remembered fh = fopen("campaign.cfg", FILE_READ); @@ -144,7 +185,7 @@ void CampaignPreIntermission() // advance level (for menu to show it right) CampaignSaveCvar(campaign_index_var, campaign_level + 1); } - else if(campaign_level == cvar(campaign_index_var)) + else if(campaign_level == cvar_builtin(campaign_index_var)) { // advance level CampaignSaveCvar(campaign_index_var, campaign_level + 1); diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index e36b272f6..1fdc01970 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -341,8 +341,12 @@ void spawnfunc___init_dedicated_server(void) { // handler for _init/_init map (only for dedicated server initialization) - dprint_load(); // load dprint status from cvar world_initialized = -1; // don't complain + cvar = cvar_builtin; + cvar_string = cvar_string_builtin; + cvar_set = cvar_set_builtin; + dprint_load(); // load dprint status from cvar + remove = remove_unsafely; entity e; @@ -370,6 +374,9 @@ void spawnfunc_worldspawn (void) float fd, l, i, j, n; string s, col; + cvar = cvar_builtin; + cvar_string = cvar_string_builtin; + cvar_set = cvar_set_builtin; dprint_load(); // load dprint status from cvar if(world_already_spawned) diff --git a/data/qcsrc/server/progs.src b/data/qcsrc/server/progs.src index e06122580..5050ffaaa 100644 --- a/data/qcsrc/server/progs.src +++ b/data/qcsrc/server/progs.src @@ -2,8 +2,10 @@ ../common/util-pre.qh sys.qh +pre-builtins.qh builtins.qh extensions.qh +post-builtins.qh constants.qh ../common/constants.qh ../common/util.qh -- 2.39.2