X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=fb0ef23538fb0a804534b335b2612d0f894b53b1;hp=ded47a6387f97920ce32f2fa41851a7b8ec32dea;hb=2eeb83b158abb062ce25cb18da0bca0d9c9f28be;hpb=87390523a589c3bb63ee6826efe4a261544d7241 diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index ded47a6387..fb0ef23538 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,11 @@ void dedicated_print(string input) if (server_is_dedicated) print(input); } +string GameLog_ProcessIP(string s) +{ + return strreplace(":", autocvar_sv_eventlog_ipv6_delimiter, s); +} + void GameLogEcho(string s) { string fn; @@ -213,19 +220,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 +297,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; @@ -475,6 +491,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); } } @@ -611,8 +629,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'; @@ -696,11 +712,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) { @@ -1184,11 +1200,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)) { @@ -1236,9 +1251,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 @@ -1257,20 +1272,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; @@ -1292,13 +1305,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; @@ -1315,35 +1328,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; @@ -1353,17 +1366,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; @@ -1371,15 +1384,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) @@ -1461,24 +1473,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;