X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcommand%2Fgetreplies.qc;h=d0f882dce312d496ca97d28cd5c041506c78a628;hb=2f553b6be14a316d31fe5c35df47c300ce6a1561;hp=b768ccb7e8510355d99068660661fd901dd96054;hpb=f785b8a76c2336cb00e78fe9e738d55512a086f5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/command/getreplies.qc b/qcsrc/server/command/getreplies.qc index b768ccb7e..d0f882dce 100644 --- a/qcsrc/server/command/getreplies.qc +++ b/qcsrc/server/command/getreplies.qc @@ -1,26 +1,31 @@ #include "getreplies.qh" -#include -#include - #include -#include "getreplies.qh" - -#include "../race.qh" - #include +#include +#include #include -#include +#include +#include +#include #include - -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // ========================================================= // Reply messages for common commands, re-worked by Samual // Last updated: December 30th, 2011 // ========================================================= -// These strings are set usually during init in g_world.qc, +// These strings are set usually during init in world.qc, // or also by some game modes or other functions manually, // and their purpose is to output information to clients // without using any extra processing time. @@ -297,3 +302,137 @@ string getmonsterlist() return sprintf("^7Monsters available: %s\n", monsterlist); } + +/* +============= +GetCvars +============= +Called with: + 0: sends the request + >0: receives a cvar from name=argv(f) value=argv(f+1) +*/ +void GetCvars_handleString(entity this, entity store, string thisname, float f, .string field, string name) +{ + if (f < 0) + { + strfree(store.(field)); + } + else if (f > 0) + { + if (thisname == name) + { + strcpy(store.(field), argv(f + 1)); + } + } + else + stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n")); +} +void GetCvars_handleString_Fixup(entity this, entity store, string thisname, float f, .string field, string name, string(entity, string) func) +{ + GetCvars_handleString(this, store, thisname, f, field, name); + if (f >= 0) // also initialize to the fitting value for "" when sending cvars out + if (thisname == name) + { + string s = func(this, strcat1(store.(field))); + if (s != store.(field)) + { + strcpy(store.(field), s); + } + } +} +void GetCvars_handleFloat(entity this, entity store, string thisname, float f, .float field, string name) +{ + if (f < 0) + { + } + else if (f > 0) + { + if (thisname == name) + store.(field) = stof(argv(f + 1)); + } + else + stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n")); +} +void GetCvars_handleFloatOnce(entity this, entity store, string thisname, float f, .float field, string name) +{ + if (f < 0) + { + } + else if (f > 0) + { + if (thisname == name) + { + if (!store.(field)) + { + store.(field) = stof(argv(f + 1)); + if (!store.(field)) + store.(field) = -1; + } + } + } + else + { + if (!store.(field)) + stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n")); + } +} +string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList(entity this, string wo) +{ + string o = W_FixWeaponOrder_ForceComplete(wo); + strcpy(CS(this).weaponorder_byimpulse, W_FixWeaponOrder_BuildImpulseList(o)); + return o; +} + +/** + * @param f -1: cleanup, 0: request, 1: receive + */ +void GetCvars(entity this, entity store, int f) +{ + string s = string_null; + + if (f == 0) + LOG_INFO("Warning: requesting cvar values is deprecated. Client should send them automatically using REPLICATE.\n"); + + if (f > 0) + s = strcat1(argv(f)); + + get_cvars_f = f; + get_cvars_s = s; + MUTATOR_CALLHOOK(GetCvars); + + Notification_GetCvars(this); + + ReplicateVars(this, store, s, f); + + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[0], "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[1], "cl_weaponpriority1", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[2], "cl_weaponpriority2", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[3], "cl_weaponpriority3", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[4], "cl_weaponpriority4", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[5], "cl_weaponpriority5", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[6], "cl_weaponpriority6", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[7], "cl_weaponpriority7", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[8], "cl_weaponpriority8", W_FixWeaponOrder_AllowIncomplete); + GetCvars_handleString_Fixup(this, store, s, f, cvar_cl_weaponpriorities[9], "cl_weaponpriority9", W_FixWeaponOrder_AllowIncomplete); + + GetCvars_handleFloat(this, store, s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking"); + + // fixup of switchweapon (needed for LMS or when spectating is disabled, as PutClientInServer comes too early) + if (f > 0) + { + if (s == "cl_weaponpriority") + { + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + if (this.(weaponentity) && (this.(weaponentity).m_weapon != WEP_Null || slot == 0)) + this.(weaponentity).m_switchweapon = w_getbestweapon(this, weaponentity); + } + } + if (s == "cl_allow_uidtracking") + PlayerStats_GameReport_AddPlayer(this); + //if (s == "cl_gunalign") + //W_ResetGunAlign(this, store.cvar_cl_gunalign); + } +}