X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmiscfunctions.qc;h=b669b041f51f765b10c8875b3e2d5c89d8fe6308;hb=8b2a456d83da008b5d17ec6092716a20718c0798;hp=84dd07d94a185f3c065296f49cc3e2af6b79a017;hpb=611c9e4ecde2bef434f19cd60e279f4151579586;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 84dd07d94a..b669b041f5 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -236,8 +236,7 @@ void relocate_spawnpoint() if (have_team_spawns != 0) if (self.team) have_team_spawns = 1; - if (!self.team) - have_noteam_spawns = 1; + have_team_spawns_forteam[self.team] = 1; if (autocvar_r_showbboxes) { @@ -461,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") @@ -586,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); @@ -624,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; @@ -777,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)); @@ -1328,7 +1313,6 @@ void readlevelcvars(void) // Sound functions string precache_sound (string s) = #19; -void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8; float precache_sound_index (string s) = #19; #define SND_VOLUME 1 @@ -1360,12 +1344,24 @@ float sound_allowed(float dest, entity e) return TRUE; } +#ifdef COMPAT_XON010_CHANNELS +void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8; void sound(entity e, float chan, string samp, float vol, float atten) { if (!sound_allowed(MSG_BROADCAST, e)) return; sound_builtin(e, chan, samp, vol, atten); } +#else +#undef sound +void sound(entity e, float chan, string samp, float vol, float atten) +{ + if (!sound_allowed(MSG_BROADCAST, e)) + return; + sound7(e, chan, samp, vol, atten, 0, 0); +} +#endif + void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten) { float entno, idx; @@ -1386,7 +1382,7 @@ void soundtoat(float dest, entity e, vector o, float chan, string samp, float vo sflags |= SND_VOLUME; if (atten != 64) sflags |= SND_ATTENUATION; - if (entno >= 8192) + if (entno >= 8192 || chan < 0 || chan > 7) sflags |= SND_LARGEENTITY; if (idx >= 256) sflags |= SND_LARGESOUND; @@ -1427,7 +1423,7 @@ void soundto(float dest, entity e, float chan, string samp, float vol, float att } void soundat(entity e, vector o, float chan, string samp, float vol, float atten) { - soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten); + soundtoat(((chan & 8) ? MSG_ALL : MSG_BROADCAST), e, o, chan, samp, vol, atten); } void stopsoundto(float dest, entity e, float chan) { @@ -1438,7 +1434,7 @@ void stopsoundto(float dest, entity e, float chan) entno = num_for_edict(e); - if (entno >= 8192) + if (entno >= 8192 || chan < 0 || chan > 7) { float idx, sflags; idx = precache_sound_index("misc/null.wav"); @@ -1476,7 +1472,7 @@ void play2(entity e, string filename) { //stuffcmd(e, strcat("play2 ", filename, "\n")); msg_entity = e; - soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE); + soundtoat(MSG_ONE, world, '0 0 0', CH_INFO, filename, VOL_BASE, ATTN_NONE); } // use this one if you might be causing spam (e.g. from touch functions that might get called more than once per frame) @@ -1514,7 +1510,7 @@ void play2all(string samp) if (autocvar_bot_sound_monopoly) return; - sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE); + sound(world, CH_INFO, samp, VOL_BASE, ATTN_NONE); } void PrecachePlayerSounds(string f); @@ -1572,7 +1568,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"); @@ -2002,7 +1997,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) @@ -2029,13 +2025,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) @@ -2638,15 +2638,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 @@ -2659,7 +2659,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter } break; - case 4: + case 2: if(allowcenter) // 2: allow center handedness { // center @@ -2685,7 +2685,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 { @@ -2695,15 +2696,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) != "") { @@ -3107,3 +3101,60 @@ 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 "droppedweapon": + case "keepawayball": + case "nexball_basketball": + case "nexball_football": + return TRUE; + case "bullet": // antilagged bullets can't hit this either + return FALSE; + } + if (e.projectiledeathtype) + return TRUE; + return FALSE; +}