X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=c66a6328f65903d6d5d5e077a9ec06ae0a480209;hp=7f4899f127faed3c1d53e77e9ad15a4d236f197b;hb=8a336668045070d910c34b62f80a16c2042a1a7b;hpb=ffb677bba14c81963045d979714dd5cce8053d20 diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 7f4899f12..c66a6328f 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -26,13 +26,14 @@ #include "../common/items/_mod.qh" #include "../common/state.qh" #include "../common/effects/qc/globalsound.qh" +#include "../common/wepent.qh" #include "../lib/csqcmodel/sv_model.qh" #include "../lib/warpzone/anglestransform.qh" #include "../lib/warpzone/server.qh" void crosshair_trace(entity pl) { - traceline_antilag(pl, pl.cursor_trace_start, pl.cursor_trace_start + normalize(pl.cursor_trace_endpos - pl.cursor_trace_start) * MAX_SHOT_DISTANCE, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); + traceline_antilag(pl, pl.cursor_trace_start, pl.cursor_trace_start + normalize(pl.cursor_trace_endpos - pl.cursor_trace_start) * max_shot_distance, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); } .bool ctrace_solidchanged; void crosshair_trace_plusvisibletriggers(entity pl) @@ -43,29 +44,23 @@ void crosshair_trace_plusvisibletriggers(entity pl) { it.solid = SOLID_BSP; it.ctrace_solidchanged = true; + IL_PUSH(g_ctrace_changed, it); } }); crosshair_trace(pl); - FOREACH_ENTITY_FLOAT(ctrace_solidchanged, true, + IL_EACH(g_ctrace_changed, it.ctrace_solidchanged, { it.solid = SOLID_TRIGGER; it.ctrace_solidchanged = false; }); + + IL_CLEAR(g_ctrace_changed); } void WarpZone_crosshair_trace(entity pl) { - WarpZone_traceline_antilag(pl, pl.cursor_trace_start, pl.cursor_trace_start + normalize(pl.cursor_trace_endpos - pl.cursor_trace_start) * MAX_SHOT_DISTANCE, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); -} - - -string admin_name() -{ - if(autocvar_sv_adminnick != "") - return autocvar_sv_adminnick; - else - return "SERVER ADMIN"; + WarpZone_traceline_antilag(pl, pl.cursor_trace_start, pl.cursor_trace_start + normalize(pl.cursor_trace_endpos - pl.cursor_trace_start) * max_shot_distance, MOVE_NORMAL, pl, ANTILAG_LATENCY(pl)); } @@ -117,65 +112,53 @@ void GameLogClose() } } -entity findnearest(vector point, .string field, string value, vector axismod) +entity findnearest(vector point, bool checkitems, vector axismod) { - entity localhead; - float i; - float j; - float len; vector dist; + int num_nearest = 0; - float num_nearest; - num_nearest = 0; - - localhead = find(NULL, field, value); - while (localhead) + IL_EACH(((checkitems) ? g_items : g_locations), ((checkitems) ? (it.target == "###item###") : (it.classname == "target_location")), { - if ((localhead.items == IT_KEY1 || localhead.items == IT_KEY2) && localhead.target == "###item###") - dist = localhead.oldorigin; + if ((it.items == IT_KEY1 || it.items == IT_KEY2) && it.target == "###item###") + dist = it.oldorigin; else - dist = localhead.origin; + dist = it.origin; dist = dist - point; dist = dist.x * axismod.x * '1 0 0' + dist.y * axismod.y * '0 1 0' + dist.z * axismod.z * '0 0 1'; - len = vlen(dist); + float len = vlen2(dist); - for (i = 0; i < num_nearest; ++i) + int l; + for (l = 0; l < num_nearest; ++l) { - if (len < nearest_length[i]) + if (len < nearest_length[l]) break; } // now i tells us where to insert at // INSERTION SORT! YOU'VE SEEN IT! RUN! - if (i < NUM_NEAREST_ENTITIES) + if (l < NUM_NEAREST_ENTITIES) { - for (j = NUM_NEAREST_ENTITIES - 1; j >= i; --j) + for (int j = NUM_NEAREST_ENTITIES - 1; j >= l; --j) { nearest_length[j + 1] = nearest_length[j]; nearest_entity[j + 1] = nearest_entity[j]; } - nearest_length[i] = len; - nearest_entity[i] = localhead; + nearest_length[l] = len; + nearest_entity[l] = it; if (num_nearest < NUM_NEAREST_ENTITIES) num_nearest = num_nearest + 1; } - - localhead = find(localhead, field, value); - } + }); // now use the first one from our list that we can see - for (i = 0; i < num_nearest; ++i) + for (int j = 0; j < num_nearest; ++j) { - traceline(point, nearest_entity[i].origin, true, NULL); + traceline(point, nearest_entity[j].origin, true, NULL); if (trace_fraction == 1) { - if (i != 0) - { - LOG_TRACE("Nearest point ("); - LOG_TRACE(nearest_entity[0].netname); - LOG_TRACE(") is not visible, using a visible one."); - } - return nearest_entity[i]; + if (j != 0) + LOG_TRACEF("Nearest point (%s) is not visible, using a visible one.", nearest_entity[0].netname); + return nearest_entity[j]; } } @@ -199,23 +182,34 @@ entity findnearest(vector point, .string field, string value, vector axismod) string NearestLocation(vector p) { - entity loc; - string ret; - ret = "somewhere"; - loc = findnearest(p, classname, "target_location", '1 1 1'); + string ret = "somewhere"; + entity loc = findnearest(p, false, '1 1 1'); if (loc) - { ret = loc.message; - } else { - loc = findnearest(p, target, "###item###", '1 1 4'); + loc = findnearest(p, true, '1 1 4'); if (loc) ret = loc.netname; } return ret; } +string AmmoNameFromWeaponentity(entity wpn) +{ + string ammoitems = "batteries"; + switch((wpn.m_weapon).ammo_field) + { + case ammo_shells: ammoitems = ITEM_Shells.m_name; break; + case ammo_nails: ammoitems = ITEM_Bullets.m_name; break; + case ammo_rockets: ammoitems = ITEM_Rockets.m_name; break; + case ammo_cells: ammoitems = ITEM_Cells.m_name; break; + case ammo_plasma: ammoitems = ITEM_Plasma.m_name; break; + case ammo_fuel: ammoitems = ITEM_JetpackFuel.m_name; break; + } + return ammoitems; +} + string formatmessage(entity this, string msg) { float p, p1, p2; @@ -224,16 +218,9 @@ string formatmessage(entity this, string msg) entity cursor_ent; string escape; string replacement; - string ammoitems; p = 0; n = 7; - ammoitems = "batteries"; - if(this.items & ITEM_Plasma.m_itemid) ammoitems = ITEM_Plasma.m_name; - if(this.items & ITEM_Cells.m_itemid) ammoitems = ITEM_Cells.m_name; - if(this.items & ITEM_Rockets.m_itemid) ammoitems = ITEM_Rockets.m_name; - if(this.items & ITEM_Shells.m_itemid) ammoitems = ITEM_Shells.m_name; - WarpZone_crosshair_trace(this); cursor = trace_endpos; cursor_ent = trace_ent; @@ -263,6 +250,8 @@ string formatmessage(entity this, string msg) replacement = substring(msg, p, 2); escape = substring(msg, p + 1, 1); + .entity weaponentity = weaponentities[0]; // TODO: unhardcode + switch(escape) { case "%": replacement = "%"; break; @@ -273,8 +262,8 @@ string formatmessage(entity this, string msg) case "l": replacement = NearestLocation(this.origin); break; case "y": replacement = NearestLocation(cursor); break; case "d": replacement = NearestLocation(this.death_origin); break; - case "w": replacement = ((PS(this).m_weapon == WEP_Null) ? ((PS(this).m_switchweapon == WEP_Null) ? Weapons_from(this.cnt) : PS(this).m_switchweapon) : PS(this).m_weapon).m_name; break; - case "W": replacement = ammoitems; 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)); 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; @@ -451,23 +440,30 @@ void GetCvars(entity this, int f) if (f > 0) { if (s == "cl_weaponpriority") - if (PS(this)) PS(this).m_switchweapon = w_getbestweapon(this); + { + 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); } } // decolorizes and team colors the player name when needed -string playername(entity p) +string playername(entity p, bool team_colorize) { string t; - if (teamplay && !intermission_running && IS_PLAYER(p)) + if (team_colorize && teamplay && !intermission_running && IS_PLAYER(p)) { t = Team_ColorCode(p.team); return strcat(t, strdecolorize(p.netname)); } else - return p.netname; + return ColorTranslateRGB(p.netname); } float want_weapon(entity weaponinfo, float allguns) // WEAPONTODO: what still needs done? @@ -556,6 +552,15 @@ void readplayerstartcvars() g_weaponarena_weapons |= (it.m_wepset); )); } + else if (s == "devall") + { + g_weaponarena = 1; + g_weaponarena_list = "All Weapons"; // TODO: report as more than just all weapons? + FOREACH(Weapons, it != WEP_Null, + { + g_weaponarena_weapons |= (it.m_wepset); + }); + } else if (s == "most") { g_weaponarena = 1; @@ -1077,7 +1082,7 @@ bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher if(this.classname == "nade") return false; // no checks here else if(this.classname == "grapplinghook") - RemoveGrapplingHook(this.realowner); + RemoveHook(this); else if(this.classname == "spike") { W_Crylink_Dequeue(this); @@ -1286,7 +1291,7 @@ void attach_sameorigin(entity e, entity to, string tag) float tagscale; org = e.origin - gettaginfo(to, gettagindex(to, tag)); - tagscale = pow(vlen(v_forward), -2); // undo a scale on the tag + tagscale = (vlen(v_forward) ** -2); // undo a scale on the tag t_forward = v_forward * tagscale; t_left = v_right * -tagscale; t_up = v_up * tagscale;