X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=98bd7756a435844daf520e25fba77de9059bca51;hp=ded47a6387f97920ce32f2fa41851a7b8ec32dea;hb=c1c5a398025611690a8d7d6bd64219ccf452e673;hpb=4b615d6ea3ee6794ea9368c782393c66ef55c170 diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index ded47a6387..98bd7756a4 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -4,9 +4,11 @@ #include "command/common.qh" #include "constants.qh" #include "g_hook.qh" +#include #include "ipban.qh" #include #include "../common/t_items.qh" +#include "mapvoting.qh" #include "resources.qh" #include "items.qh" #include "player.qh" @@ -32,6 +34,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,54 +85,6 @@ void dedicated_print(string input) if (server_is_dedicated) print(input); } -void GameLogEcho(string s) -{ - string fn; - int matches; - - if (autocvar_sv_eventlog_files) - { - if (!logfile_open) - { - logfile_open = true; - matches = autocvar_sv_eventlog_files_counter + 1; - cvar_set("sv_eventlog_files_counter", itos(matches)); - fn = ftos(matches); - if (strlen(fn) < 8) - fn = strcat(substring("00000000", 0, 8 - strlen(fn)), fn); - fn = strcat(autocvar_sv_eventlog_files_nameprefix, fn, autocvar_sv_eventlog_files_namesuffix); - logfile = fopen(fn, FILE_APPEND); - fputs(logfile, ":logversion:3\n"); - } - if (logfile >= 0) - { - if (autocvar_sv_eventlog_files_timestamps) - fputs(logfile, strcat(":time:", strftime(true, "%Y-%m-%d %H:%M:%S", "\n", s, "\n"))); - else - fputs(logfile, strcat(s, "\n")); - } - } - if (autocvar_sv_eventlog_console) - { - dedicated_print(strcat(s, "\n")); - } -} - -void GameLogInit() -{ - logfile_open = 0; - // will be opened later -} - -void GameLogClose() -{ - if (logfile_open && logfile >= 0) - { - fclose(logfile); - logfile = -1; - } -} - entity findnearest(vector point, bool checkitems, vector axismod) { vector dist; @@ -213,19 +168,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"; //REGISTRY_GET(Weapons, wepent.cnt).m_name; } string formatmessage(entity this, string msg) @@ -281,12 +245,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 +439,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 +577,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,12 +660,12 @@ 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); - Weapon wep = Weapons_fromstr(s); + s = argv(j); + Weapon wep = Weapon_from_name(s); if(wep != WEP_Null) { g_weaponarena_weapons |= (wep.m_wepset); @@ -838,9 +802,14 @@ void readplayerstartcvars() void precache_playermodel(string m) { - float globhandle, i, n; + int globhandle, i, n; string f; + // remove : suffix + int j = strstrofs(m, ":", 0); + if(j >= 0) + m = substring(m, 0, j); + if(substring(m, -9, 5) == "_lod1") return; if(substring(m, -9, 5) == "_lod2") @@ -883,10 +852,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) { @@ -906,20 +873,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 } @@ -1184,11 +1137,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 +1188,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 +1209,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 +1242,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 +1265,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 +1303,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 +1321,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 +1410,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;