From 639ff52aeb3d7f0f0bd86e97976c1c00deb74b61 Mon Sep 17 00:00:00 2001 From: Lyberta Date: Sun, 18 Mar 2018 12:41:35 +0300 Subject: [PATCH] Move random stuff away from teamplay. --- qcsrc/server/client.qc | 74 +++++++++++++++++++++++ qcsrc/server/g_world.qc | 51 ++++++++++++++++ qcsrc/server/g_world.qh | 3 + qcsrc/server/teamplay.qc | 125 --------------------------------------- qcsrc/server/teamplay.qh | 11 ---- 5 files changed, 128 insertions(+), 136 deletions(-) diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index e7003c1d9..abd3cb179 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -1161,6 +1161,80 @@ void ClientPreConnect(entity this) } #endif +string GetClientVersionMessage(entity this) +{ + if (CS(this).version_mismatch) { + if(CS(this).version < autocvar_gameversion) { + return strcat("This is Xonotic ", autocvar_g_xonoticversion, + "\n^3Your client version is outdated.\n\n\n### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###\n\n\nPlease update!!!^8"); + } else { + return strcat("This is Xonotic ", autocvar_g_xonoticversion, + "\n^3This server is using an outdated Xonotic version.\n\n\n ### THIS SERVER IS INCOMPATIBLE AND THUS YOU CANNOT JOIN ###.^8"); + } + } else { + return strcat("Welcome to Xonotic ", autocvar_g_xonoticversion); + } +} + +string getwelcomemessage(entity this) +{ + MUTATOR_CALLHOOK(BuildMutatorsPrettyString, ""); + string modifications = M_ARGV(0, string); + + if(g_weaponarena) + { + if(g_weaponarena_random) + modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena"); + else + modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena"); + } + else if(cvar("g_balance_blaster_weaponstartoverride") == 0) + modifications = strcat(modifications, ", No start weapons"); + if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity"))) + modifications = strcat(modifications, ", Low gravity"); + if(g_weapon_stay && !g_cts) + modifications = strcat(modifications, ", Weapons stay"); + if(g_jetpack) + modifications = strcat(modifications, ", Jet pack"); + if(autocvar_g_powerups == 0) + modifications = strcat(modifications, ", No powerups"); + if(autocvar_g_powerups > 0) + modifications = strcat(modifications, ", Powerups"); + modifications = substring(modifications, 2, strlen(modifications) - 2); + + string versionmessage = GetClientVersionMessage(this); + string s = strcat(versionmessage, "^8\n^8\nmatch type is ^1", gamemode_name, "^8\n"); + + if(modifications != "") + s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n"); + + if(cache_lastmutatormsg != autocvar_g_mutatormsg) + { + if(cache_lastmutatormsg) + strunzone(cache_lastmutatormsg); + if(cache_mutatormsg) + strunzone(cache_mutatormsg); + cache_lastmutatormsg = strzone(autocvar_g_mutatormsg); + cache_mutatormsg = strzone(cache_lastmutatormsg); + } + + if (cache_mutatormsg != "") { + s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg); + } + + string mutator_msg = ""; + MUTATOR_CALLHOOK(BuildGameplayTipsString, mutator_msg); + mutator_msg = M_ARGV(0, string); + + s = strcat(s, mutator_msg); // trust that the mutator will do proper formatting + + string motd = autocvar_sv_motd; + if (motd != "") { + s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd)); + } + return s; +} + /** ============= ClientConnect diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index b0a033391..d770c2d9c 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -613,6 +613,57 @@ STATIC_INIT_EARLY(maxclients) } } +void default_delayedinit(entity this) +{ + if(!scores_initialized) + ScoreRules_generic(); +} + +void InitGameplayMode() +{ + VoteReset(); + + // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds + get_mi_min_max(1); + // assign reflectively to avoid "assignment to world" warning + int done = 0; for (int i = 0, n = numentityfields(); i < n; ++i) { + string k = entityfieldname(i); vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0'; + if (v) { + putentityfieldstring(i, world, sprintf("%v", v)); + if (++done == 2) break; + } + } + // currently, NetRadiant's limit is 131072 qu for each side + // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu + // set the distance according to map size but don't go over the limit to avoid issues with float precision + // in case somebody makes extremely large maps + max_shot_distance = min(230000, vlen(world.maxs - world.mins)); + + MapInfo_LoadMapSettings(mapname); + GameRules_teams(false); + + if (!cvar_value_issafe(world.fog)) + { + LOG_INFO("The current map contains a potentially harmful fog setting, ignored"); + world.fog = string_null; + } + if(MapInfo_Map_fog != "") + if(MapInfo_Map_fog == "none") + world.fog = string_null; + else + world.fog = strzone(MapInfo_Map_fog); + clientstuff = strzone(MapInfo_Map_clientstuff); + + MapInfo_ClearTemps(); + + gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype); + + cache_mutatormsg = strzone(""); + cache_lastmutatormsg = strzone(""); + + InitializeEntity(NULL, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK); +} + void Map_MarkAsRecent(string m); float world_already_spawned; void Nagger_Init(); diff --git a/qcsrc/server/g_world.qh b/qcsrc/server/g_world.qh index 034407bc1..1633d419a 100644 --- a/qcsrc/server/g_world.qh +++ b/qcsrc/server/g_world.qh @@ -5,6 +5,9 @@ float checkrules_suddendeathwarning; float checkrules_suddendeathend; float checkrules_overtimesadded; //how many overtimes have been already added +string cache_mutatormsg; +string cache_lastmutatormsg; + const int WINNING_NO = 0; // no winner, but time limits may terminate the game const int WINNING_YES = 1; // winner found const int WINNING_NEVER = 2; // no winner, enter overtime if time limit is reached diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index d3fba6107..ffa1399d4 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -139,131 +139,6 @@ void LogTeamchange(float player_id, float team_number, float type) GameLogEcho(strcat(":team:", ftos(player_id), ":", ftos(team_number), ":", ftos(type))); } -void default_delayedinit(entity this) -{ - if(!scores_initialized) - ScoreRules_generic(); -} - -void InitGameplayMode() -{ - VoteReset(); - - // find out good world mins/maxs bounds, either the static bounds found by looking for solid, or the mapinfo specified bounds - get_mi_min_max(1); - // assign reflectively to avoid "assignment to world" warning - int done = 0; for (int i = 0, n = numentityfields(); i < n; ++i) { - string k = entityfieldname(i); vector v = (k == "mins") ? mi_min : (k == "maxs") ? mi_max : '0 0 0'; - if (v) { - putentityfieldstring(i, world, sprintf("%v", v)); - if (++done == 2) break; - } - } - // currently, NetRadiant's limit is 131072 qu for each side - // distance from one corner of a 131072qu cube to the opposite corner is approx. 227023 qu - // set the distance according to map size but don't go over the limit to avoid issues with float precision - // in case somebody makes extremely large maps - max_shot_distance = min(230000, vlen(world.maxs - world.mins)); - - MapInfo_LoadMapSettings(mapname); - GameRules_teams(false); - - if (!cvar_value_issafe(world.fog)) - { - LOG_INFO("The current map contains a potentially harmful fog setting, ignored"); - world.fog = string_null; - } - if(MapInfo_Map_fog != "") - if(MapInfo_Map_fog == "none") - world.fog = string_null; - else - world.fog = strzone(MapInfo_Map_fog); - clientstuff = strzone(MapInfo_Map_clientstuff); - - MapInfo_ClearTemps(); - - gamemode_name = MapInfo_Type_ToText(MapInfo_LoadedGametype); - - cache_mutatormsg = strzone(""); - cache_lastmutatormsg = strzone(""); - - InitializeEntity(NULL, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK); -} - -string GetClientVersionMessage(entity this) -{ - if (CS(this).version_mismatch) { - if(CS(this).version < autocvar_gameversion) { - return strcat("This is Xonotic ", autocvar_g_xonoticversion, - "\n^3Your client version is outdated.\n\n\n### YOU WON'T BE ABLE TO PLAY ON THIS SERVER ###\n\n\nPlease update!!!^8"); - } else { - return strcat("This is Xonotic ", autocvar_g_xonoticversion, - "\n^3This server is using an outdated Xonotic version.\n\n\n ### THIS SERVER IS INCOMPATIBLE AND THUS YOU CANNOT JOIN ###.^8"); - } - } else { - return strcat("Welcome to Xonotic ", autocvar_g_xonoticversion); - } -} - -string getwelcomemessage(entity this) -{ - MUTATOR_CALLHOOK(BuildMutatorsPrettyString, ""); - string modifications = M_ARGV(0, string); - - if(g_weaponarena) - { - if(g_weaponarena_random) - modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena"); - else - modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena"); - } - else if(cvar("g_balance_blaster_weaponstartoverride") == 0) - modifications = strcat(modifications, ", No start weapons"); - if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity"))) - modifications = strcat(modifications, ", Low gravity"); - if(g_weapon_stay && !g_cts) - modifications = strcat(modifications, ", Weapons stay"); - if(g_jetpack) - modifications = strcat(modifications, ", Jet pack"); - if(autocvar_g_powerups == 0) - modifications = strcat(modifications, ", No powerups"); - if(autocvar_g_powerups > 0) - modifications = strcat(modifications, ", Powerups"); - modifications = substring(modifications, 2, strlen(modifications) - 2); - - string versionmessage = GetClientVersionMessage(this); - string s = strcat(versionmessage, "^8\n^8\nmatch type is ^1", gamemode_name, "^8\n"); - - if(modifications != "") - s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n"); - - if(cache_lastmutatormsg != autocvar_g_mutatormsg) - { - if(cache_lastmutatormsg) - strunzone(cache_lastmutatormsg); - if(cache_mutatormsg) - strunzone(cache_mutatormsg); - cache_lastmutatormsg = strzone(autocvar_g_mutatormsg); - cache_mutatormsg = strzone(cache_lastmutatormsg); - } - - if (cache_mutatormsg != "") { - s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg); - } - - string mutator_msg = ""; - MUTATOR_CALLHOOK(BuildGameplayTipsString, mutator_msg); - mutator_msg = M_ARGV(0, string); - - s = strcat(s, mutator_msg); // trust that the mutator will do proper formatting - - string motd = autocvar_sv_motd; - if (motd != "") { - s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd)); - } - return s; -} - void setcolor(entity this, int clr) { #if 0 diff --git a/qcsrc/server/teamplay.qh b/qcsrc/server/teamplay.qh index a4310b3e5..396a45d89 100644 --- a/qcsrc/server/teamplay.qh +++ b/qcsrc/server/teamplay.qh @@ -1,8 +1,5 @@ #pragma once -string cache_mutatormsg; -string cache_lastmutatormsg; - /// \brief Returns the global team entity at the given index. /// \param[in] index Index of the team. /// \return Global team entity at the given index. @@ -56,14 +53,6 @@ void TeamchangeFrags(entity e); void LogTeamchange(float player_id, float team_number, float type); -void default_delayedinit(entity this); - -void InitGameplayMode(); - -string GetClientVersionMessage(entity this); - -string getwelcomemessage(entity this); - void setcolor(entity this, int clr); /// \brief Returns whether the given entity belongs to a valid team. -- 2.39.2