X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=241dc3a99a1e921d853a6f90f1c99e296f2a5487;hb=bf43d3bacbf203b31200280d27a1a52912801795;hp=0c8162b54464275c9df9537dd1aad11d4f9af682;hpb=a2c8a61e10b6a1daac13b4a369875f4c2195e32e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 0c8162b54..241dc3a99 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -460,11 +460,6 @@ string formatmessage(string msg) replacement = cursor_ent.netname; if (!replacement || !cursor_ent) replacement = "nothing"; - } else if (escape == "p") { - if (self.last_selected_player) - replacement = self.last_selected_player.netname; - else - replacement = "(nobody)"; } else if (escape == "s") replacement = ftos(vlen(self.velocity - self.velocity_z * '0 0 1')); else if (escape == "S") @@ -585,7 +580,6 @@ void GetCvars(float f) GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch"); GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction"); GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime"); - GetCvars_handleFloat(s, f, cvar_cl_shownames, "cl_shownames"); GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion"); GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap"); GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList); @@ -623,19 +617,11 @@ void GetCvars(float f) { if (s == "cl_weaponpriority") self.switchweapon = w_getbestweapon(self); + if (s == "cl_allow_uidtracking") + PlayerStats_AddPlayer(self); } } -float fexists(string f) -{ - float fh; - fh = fopen(f, FILE_READ); - if (fh < 0) - return FALSE; - fclose(fh); - return TRUE; -} - void backtrace(string msg) { float dev, war; @@ -776,7 +762,7 @@ void centerprint(entity e, string s) string playername(entity p) { string t; - if (teams_matter && !intermission_running && p.classname == "player") + if (teamplay && !intermission_running && p.classname == "player") { t = Team_ColorCode(p.team); return strcat(t, strdecolorize(p.netname)); @@ -1571,7 +1557,6 @@ void precache() { // gamemode related things precache_model ("models/misc/chatbubble.spr"); - precache_model ("models/misc/teambubble.spr"); if (g_runematch) { precache_model ("models/runematch/curse.mdl"); @@ -2001,7 +1986,8 @@ float SUB_NoImpactCheck() // these stop the projectile from moving, so... if(trace_dphitcontents == 0) { - dprint("A hit happened with zero hit contents... DEBUG THIS, this should never happen for projectiles! Projectile will self-destruct.\n"); + //dprint("A hit happened with zero hit contents... DEBUG THIS, this should never happen for projectiles! Projectile will self-destruct.\n"); + dprint(sprintf(_("A hit from a projectile happened with no hit contents! DEBUG THIS, this should never happen for projectiles! Profectile will self-destruct. (edict: %d, classname: %s, origin: %s)\n"), num_for_edict(self), self.classname, vtos(self.origin))); checkclient(); } if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) @@ -2028,13 +2014,17 @@ float SUB_NoImpactCheck() #define SUB_OwnerCheck() (other && (other == self.owner)) +void RemoveGrapplingHook(entity pl); float WarpZone_Projectile_Touch_ImpactFilter_Callback() { if(SUB_OwnerCheck()) return TRUE; if(SUB_NoImpactCheck()) { - remove(self); + if(self.classname == "grapplinghook") + RemoveGrapplingHook(self.realowner); + else + remove(self); return TRUE; } if(trace_ent && trace_ent.solid > SOLID_TRIGGER) @@ -2637,15 +2627,15 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter { switch(algn) { - case 1: // right + default: + case 3: // right break; - case 2: // left + case 4: // left vecs_y = -vecs_y; break; - default: - case 3: + case 1: if(allowcenter) // 2: allow center handedness { // center @@ -2658,7 +2648,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter } break; - case 4: + case 2: if(allowcenter) // 2: allow center handedness { // center @@ -2684,7 +2674,8 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float { if (visual) { - vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn); + vecs_y = 0; + vecs_z -= 2; } else { @@ -2694,15 +2685,8 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float } else if (autocvar_g_shootfromcenter) { - if (visual) - { - vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn); - } - else - { - vecs_y = 0; - vecs_z -= 2; - } + vecs_y = 0; + vecs_z -= 2; } else if ((s = autocvar_g_shootfromfixedorigin) != "") { @@ -3106,3 +3090,61 @@ void defer(float fdelay, void() func) e.think = defer_think; e.nextthink = time + fdelay; } + +.string aiment_classname; +.float aiment_deadflag; +void SetMovetypeFollow(entity ent, entity e) +{ + // FIXME this may not be warpzone aware + ent.movetype = MOVETYPE_FOLLOW; // make the hole follow + ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported. + ent.aiment = e; // make the hole follow bmodel + ent.punchangle = e.angles; // the original angles of bmodel + ent.view_ofs = ent.origin - e.origin; // relative origin + ent.v_angle = ent.angles - e.angles; // relative angles + ent.aiment_classname = strzone(e.classname); + ent.aiment_deadflag = e.deadflag; +} +void UnsetMovetypeFollow(entity ent) +{ + ent.movetype = MOVETYPE_FLY; + PROJECTILE_MAKETRIGGER(ent); + ent.aiment = world; +} +float LostMovetypeFollow(entity ent) +{ +/* + if(ent.movetype != MOVETYPE_FOLLOW) + if(ent.aiment) + error("???"); +*/ + if(ent.aiment) + { + if(ent.aiment.classname != ent.aiment_classname) + return 1; + if(ent.aiment.deadflag != ent.aiment_deadflag) + return 1; + } + return 0; +} + +float isPushable(entity e) +{ + if(e.iscreature) + return TRUE; + switch(e.classname) + { + case "body": + case "corpse": + case "droppedweapon": + case "keepawayball": + case "nexball_basketball": + case "nexball_football": + return TRUE; + case "bullet": + return FALSE; + } + if (e.projectiledeathtype) + return TRUE; + return FALSE; +}