X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=4e2113f53fe3baf148c7c7308c371c51efc45c87;hb=e824d4612617171b932bba08f1a5a50500d4a603;hp=a59f4afa231380a58cc9f5e24fd6b7e76dd6e0b5;hpb=99262bf5759010457a3331ec08e985c3924a2b3f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index a59f4afa2..4e2113f53 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -7,6 +7,7 @@ #include "ipban.qh" #include #include "../common/t_items.qh" +#include "mapvoting.qh" #include "resources.qh" #include "items.qh" #include "player.qh" @@ -32,6 +33,7 @@ #include "../common/state.qh" #include "../common/effects/qc/globalsound.qh" #include "../common/wepent.qh" +#include #include "../lib/csqcmodel/sv_model.qh" #include "../lib/warpzone/anglestransform.qh" #include "../lib/warpzone/server.qh" @@ -82,6 +84,13 @@ void dedicated_print(string input) if (server_is_dedicated) print(input); } +string GameLog_ProcessIP(string s) +{ + if(!autocvar_sv_eventlog_ipv6_delimiter) + return s; + return strreplace(":", "_", s); +} + void GameLogEcho(string s) { string fn; @@ -213,19 +222,28 @@ string NearestLocation(vector p) return ret; } -string AmmoNameFromWeaponentity(Weapon wep) +string PlayerHealth(entity this) { - string ammoitems = "batteries"; - switch (wep.ammo_type) - { - case RES_SHELLS: ammoitems = ITEM_Shells.m_name; break; - case RES_BULLETS: ammoitems = ITEM_Bullets.m_name; break; - case RES_ROCKETS: ammoitems = ITEM_Rockets.m_name; break; - case RES_CELLS: ammoitems = ITEM_Cells.m_name; break; - case RES_PLASMA: ammoitems = ITEM_Plasma.m_name; break; - case RES_FUEL: ammoitems = ITEM_JetpackFuel.m_name; break; - } - return ammoitems; + float myhealth = floor(GetResource(this, RES_HEALTH)); + if(myhealth == -666) + return "spectating"; + else if(myhealth == -2342 || (myhealth == 2342 && mapvote_initialized)) + return "observing"; + else if(myhealth <= 0 || IS_DEAD(this)) + return "dead"; + return ftos(myhealth); +} + +string WeaponNameFromWeaponentity(entity this, .entity weaponentity) +{ + entity wepent = this.(weaponentity); + if(!wepent) + return "none"; + else if(wepent.m_weapon != WEP_Null) + return wepent.m_weapon.m_name; + else if(wepent.m_switchweapon != WEP_Null) + return wepent.m_switchweapon.m_name; + return "none"; //Weapons_from(wepent.cnt).m_name; } string formatmessage(entity this, string msg) @@ -281,12 +299,12 @@ string formatmessage(entity this, string msg) case "\\":replacement = "\\"; break; case "n": replacement = "\n"; break; case "a": replacement = ftos(floor(GetResource(this, RES_ARMOR))); break; - case "h": replacement = ftos(floor(GetResource(this, RES_HEALTH))); break; + case "h": replacement = PlayerHealth(this); break; case "l": replacement = NearestLocation(this.origin); break; case "y": replacement = NearestLocation(cursor); break; case "d": replacement = NearestLocation(this.death_origin); break; - case "w": replacement = ((this.(weaponentity).m_weapon == WEP_Null) ? ((this.(weaponentity).m_switchweapon == WEP_Null) ? Weapons_from(this.(weaponentity).cnt) : this.(weaponentity).m_switchweapon) : this.(weaponentity).m_weapon).m_name; break; - case "W": replacement = AmmoNameFromWeaponentity(this.(weaponentity).m_weapon); break; + case "w": replacement = WeaponNameFromWeaponentity(this, weaponentity); break; + case "W": replacement = GetAmmoName(this.(weaponentity).m_weapon.ammo_type); break; case "x": replacement = ((cursor_ent.netname == "" || !cursor_ent) ? "nothing" : cursor_ent.netname); break; case "s": replacement = ftos(vlen(this.velocity - this.velocity_z * '0 0 1')); break; case "S": replacement = ftos(vlen(this.velocity)); break; @@ -390,6 +408,8 @@ REPLICATE(autoswitch, bool, "cl_autoswitch"); REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name"); +REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking"); + REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot"); REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt"); @@ -398,6 +418,8 @@ REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating"); REPLICATE(cvar_cl_handicap, float, "cl_handicap"); +REPLICATE(cvar_cl_gunalign, int, "cl_gunalign"); + REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump"); REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump"); @@ -471,6 +493,8 @@ void GetCvars(entity this, entity store, int f) } if (s == "cl_allow_uidtracking") PlayerStats_GameReport_AddPlayer(this); + //if (s == "cl_gunalign") + //W_ResetGunAlign(this, store.cvar_cl_gunalign); } } @@ -607,8 +631,6 @@ void weaponarena_available_most_update(entity this) void readplayerstartcvars() { - float i, t; - // initialize starting values for players start_weapons = '0 0 0'; start_weapons_default = '0 0 0'; @@ -692,11 +714,11 @@ void readplayerstartcvars() else { g_weaponarena = 1; - t = tokenize_console(s); + float t = tokenize_console(s); g_weaponarena_list = ""; - for (i = 0; i < t; ++i) + for (int j = 0; j < t; ++j) { - s = argv(i); + s = argv(j); Weapon wep = Weapons_fromstr(s); if(wep != WEP_Null) { @@ -711,7 +733,7 @@ void readplayerstartcvars() { g_weapon_stay = 0; // incompatible start_weapons = g_weaponarena_weapons; - start_items |= IT_UNLIMITED_AMMO; + start_items |= IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS; } else { @@ -733,7 +755,7 @@ void readplayerstartcvars() if(!cvar("g_use_ammunition")) start_items |= IT_UNLIMITED_AMMO; - if(start_items & IT_UNLIMITED_WEAPON_AMMO) + if(start_items & IT_UNLIMITED_AMMO) { start_ammo_shells = 999; start_ammo_nails = 999; @@ -879,10 +901,8 @@ void precache_playermodels(string s) FOREACH_WORD(s, true, { precache_playermodel(it); }); } -void precache() +PRECACHE(PlayerModels) { - // gamemode related things - // Precache all player models if desired if (autocvar_sv_precacheplayermodels) { @@ -902,20 +922,6 @@ void precache() precache_playermodels(autocvar_sv_defaultplayermodel_pink); precache_playermodels(autocvar_sv_defaultplayermodel); } - -#if 0 - // Disabled this code because it simply does not work (e.g. ignores bgmvolume, overlaps with "cd loop" controlled tracks). - - if (!this.noise && this.music) // quake 3 uses the music field - this.noise = this.music; - - // plays music for the level if there is any - if (this.noise) - { - precache_sound (this.noise); - ambientsound ('0 0 0', this.noise, VOL_BASE, ATTEN_NONE); - } -#endif } @@ -1180,11 +1186,10 @@ bool SUB_NoImpactCheck(entity this, entity toucher) return false; } -#define SUB_OwnerCheck(ent,oth) ((oth) && ((oth) == (ent).owner)) - bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher) { - if(SUB_OwnerCheck(this, toucher)) + // owner check + if(toucher && toucher == this.owner) return true; if(SUB_NoImpactCheck(this, toucher)) { @@ -1192,11 +1197,6 @@ bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher return false; // no checks here else if(this.classname == "grapplinghook") RemoveHook(this); - else if(this.classname == "spike") - { - W_Crylink_Dequeue(this); - delete(this); - } else delete(this); return true; @@ -1237,9 +1237,9 @@ void URI_Get_Callback(float id, float status, string data) } } -string uid2name(string myuid) { - string s; - s = db_get(ServerProgsDB, strcat("/uid2name/", myuid)); +string uid2name(string myuid) +{ + string s = db_get(ServerProgsDB, strcat("/uid2name/", myuid)); // FIXME remove this later after 0.6 release // convert old style broken records to correct style @@ -1258,20 +1258,18 @@ string uid2name(string myuid) { return s; } -float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance) +bool MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundmax, float goodcontents, float badcontents, float badsurfaceflags, int attempts, float maxaboveground, float minviewdistance) { - float m, i; - vector start, org, delta, end, enddown, mstart; - - m = e.dphitcontentsmask; + float m = e.dphitcontentsmask; e.dphitcontentsmask = goodcontents | badcontents; - org = boundmin; - delta = boundmax - boundmin; + vector org = boundmin; + vector delta = boundmax - boundmin; + vector start, end; start = end = org; - - for (i = 0; i < attempts; ++i) + int j; // used after the loop + for(j = 0; j < attempts; ++j) { start.x = org.x + random() * delta.x; start.y = org.y + random() * delta.y; @@ -1293,13 +1291,13 @@ float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundma // rule 2: if we are too high, lower the point if (trace_fraction * delta.z > maxaboveground) start = trace_endpos + '0 0 1' * maxaboveground; - enddown = trace_endpos; + vector enddown = trace_endpos; // rule 3: make sure we aren't outside the map. This only works // for somewhat well formed maps. A good rule of thumb is that // the map should have a convex outside hull. // these can be traceLINES as we already verified the starting box - mstart = start + 0.5 * (e.mins + e.maxs); + vector mstart = start + 0.5 * (e.mins + e.maxs); traceline(mstart, mstart + '1 0 0' * delta.x, MOVE_NORMAL, e); if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk") continue; @@ -1316,35 +1314,35 @@ float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundma if (trace_fraction >= 1 || trace_dphittexturename == "common/caulk") continue; - // rule 4: we must "see" some spawnpoint or item - entity sp = NULL; - IL_EACH(g_spawnpoints, checkpvs(mstart, it), - { - if((traceline(mstart, it.origin, MOVE_NORMAL, e), trace_fraction) >= 1) - { - sp = it; - break; - } - }); - if(!sp) - { - int items_checked = 0; - IL_EACH(g_items, checkpvs(mstart, it), + // rule 4: we must "see" some spawnpoint or item + entity sp = NULL; + IL_EACH(g_spawnpoints, checkpvs(mstart, it), + { + if((traceline(mstart, it.origin, MOVE_NORMAL, e), trace_fraction) >= 1) + { + sp = it; + break; + } + }); + if(!sp) { - if((traceline(mstart, it.origin + (it.mins + it.maxs) * 0.5, MOVE_NORMAL, e), trace_fraction) >= 1) + int items_checked = 0; + IL_EACH(g_items, checkpvs(mstart, it), { - sp = it; - break; - } + if((traceline(mstart, it.origin + (it.mins + it.maxs) * 0.5, MOVE_NORMAL, e), trace_fraction) >= 1) + { + sp = it; + break; + } - ++items_checked; - if(items_checked >= attempts) - break; // sanity - }); + ++items_checked; + if(items_checked >= attempts) + break; // sanity + }); - if(!sp) - continue; - } + if(!sp) + continue; + } // find a random vector to "look at" end.x = org.x + random() * delta.x; @@ -1354,17 +1352,17 @@ float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundma // rule 4: start TO end must not be too short tracebox(start, e.mins, e.maxs, end, MOVE_NORMAL, e); - if (trace_startsolid) + if(trace_startsolid) continue; - if (trace_fraction < minviewdistance / vlen(delta)) + if(trace_fraction < minviewdistance / vlen(delta)) continue; // rule 5: don't want to look at sky - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY) + if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY) continue; // rule 6: we must not end up in trigger_hurt - if (tracebox_hits_trigger_hurt(start, e.mins, e.maxs, enddown)) + if(tracebox_hits_trigger_hurt(start, e.mins, e.maxs, enddown)) continue; break; @@ -1372,15 +1370,14 @@ float MoveToRandomLocationWithinBounds(entity e, vector boundmin, vector boundma e.dphitcontentsmask = m; - if (i < attempts) + if(j < attempts) { setorigin(e, start); e.angles = vectoangles(end - start); - LOG_DEBUG("Needed ", ftos(i + 1), " attempts"); + LOG_DEBUG("Needed ", ftos(j + 1), " attempts"); return true; } - else - return false; + return false; } float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance) @@ -1462,24 +1459,13 @@ void follow_sameorigin(entity e, entity to) e.v_angle = e.angles - to.angles; // relative angles } +#if 0 +// TODO: unused, likely for a reason, possibly needs extensions (allow setting the new movetype as a parameter?) void unfollow_sameorigin(entity e) { set_movetype(e, MOVETYPE_NONE); } - -entity gettaginfo_relative_ent; -vector gettaginfo_relative(entity e, float tag) -{ - if (!gettaginfo_relative_ent) - { - gettaginfo_relative_ent = spawn(); - gettaginfo_relative_ent.effects = EF_NODRAW; - } - gettaginfo_relative_ent.model = e.model; - gettaginfo_relative_ent.modelindex = e.modelindex; - gettaginfo_relative_ent.frame = e.frame; - return gettaginfo(gettaginfo_relative_ent, tag); -} +#endif .string aiment_classname; .float aiment_deadflag;