X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics%2Fmovetypes%2Fmovetypes.qc;h=e207551838e03cd6bbe0f363f1677d17a1a6738f;hp=7e7945e1c920d0f0bc19b487c96f94805bec5891;hb=52575743c833ba5456bddde8738a468e7236a9b4;hpb=e020e5aa918d17b0b9b247f702b8e9b1c9196d38 diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 7e7945e1c..e20755183 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -25,7 +25,7 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV for(int bump = 0; bump < 6; bump++) { int coord = 2 - (bump >> 1); - bool dir = (bump & 1); + int dir = (bump & 1); for(int subbump = 0; ; ++subbump) { @@ -54,7 +54,6 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV tracebox(stuckorigin, goodmins, goodmaxs, testorigin, MOVE_NOMONSTERS, this); if(trace_startsolid && trace_ent.solid == SOLID_BSP) // NOTE: this checks for bmodelstartsolid in the engine { - // BAD BAD, can't fix that return false; } @@ -70,7 +69,7 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV // we hit something... let's move out of it vector move = trace_endpos - testorigin; - float nudge = (trace_plane_normal * move) + 0.03125f; // FIXME cvar this constant + float nudge = (trace_plane_normal * move) + 0.03125; // FIXME cvar this constant stuckorigin = stuckorigin + nudge * trace_plane_normal; } @@ -425,7 +424,7 @@ void _Movetype_LinkEdict_TouchAreaGrid(entity this) // SV_LinkEdict_TouchAreaGr if(this.solid == SOLID_NOT) return; - FOREACH_ENTITY_RADIUS(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin), true, { + FOREACH_ENTITY_RADIUS_ORDERED(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin), true, { if (it.solid == SOLID_TRIGGER && it != this) if (it.move_nomonsters != MOVE_NOMONSTERS && it.move_nomonsters != MOVE_WORLDONLY) if (gettouch(it) && boxesoverlap(it.absmin, it.absmax, this.absmin, this.absmax)) @@ -505,7 +504,7 @@ int _Movetype_ContentsMask(entity this) // SV_GenericHitSuperContentsMask return this.dphitcontentsmask; else if(this.solid == SOLID_SLIDEBOX) { - if(this.flags & 32) // TODO: FL_MONSTER + if(this.flags & FL_MONSTER) return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_MONSTERCLIP; else return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; @@ -724,17 +723,23 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) this.angles = this.angles + movedt * this.avelocity; break; case MOVETYPE_STEP: + if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2) + _Movetype_CheckStuck(this); _Movetype_Physics_Step(this, movedt); break; case MOVETYPE_WALK: case MOVETYPE_FLY: case MOVETYPE_FLY_WORLDONLY: + if (movedt > 0 && GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2) + _Movetype_CheckStuck(this); _Movetype_Physics_Walk(this, movedt); break; case MOVETYPE_TOSS: case MOVETYPE_BOUNCE: case MOVETYPE_BOUNCEMISSILE: case MOVETYPE_FLYMISSILE: + if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2) + _Movetype_CheckStuck(this); _Movetype_Physics_Toss(this, movedt); break; case MOVETYPE_PHYSICS: @@ -750,12 +755,24 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient) // to be run every move frame { + bool didmove = (this.move_time != 0); this.move_time = time; if(isclient) _Movetype_Physics_ClientFrame(this, movedt); else + { + // this doesn't apply to clients, and only applies to unmatched entities + // don't run think/move on newly spawned projectiles as it messes up + // movement interpolation and rocket trails, and is inconsistent with + // respect to entities spawned in the same frame + // (if an ent spawns a higher numbered ent, it moves in the same frame, + // but if it spawns a lower numbered ent, it doesn't - this never moves + // ents in the first frame regardless) + if(!didmove && GAMEPLAYFIX_DELAYPROJECTILES(this) > 0) + return; _Movetype_Physics_Frame(this, movedt); + } if(wasfreed(this)) return;