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=d8320cc27bad0d3ac55dc569aa2c2fac7fd96ddb;hb=52575743c833ba5456bddde8738a468e7236a9b4;hpb=53ca13d99c04cd9994b3ef53450cb290e471300e diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index d8320cc27..e20755183 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -4,7 +4,7 @@ void set_movetype(entity this, int mt) { this.move_movetype = mt; - if (mt == MOVETYPE_PHYSICS /*|| mt == MOVETYPE_PUSH || mt == MOVETYPE_FAKEPUSH*/) { + if (mt == MOVETYPE_PHYSICS) { this.move_qcphysics = false; } if(!IL_CONTAINS(g_moveables, this)) @@ -52,9 +52,8 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV } tracebox(stuckorigin, goodmins, goodmaxs, testorigin, MOVE_NOMONSTERS, this); - if(trace_startsolid) // NOTE: this checks for bmodelstartsolid in the engine + 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; } @@ -127,7 +126,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno if(dt <= 0) return 0; - int blocked = 0; + int blockedflag = 0; int i, j, numplanes = 0; float time_left = dt, grav = 0; vector push; @@ -163,7 +162,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno { // we got teleported by a touch function // let's abort the move - blocked |= 8; + blockedflag |= 8; break; } @@ -186,7 +185,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno if(trace_plane_normal.z > 0.7) { // floor - blocked |= 1; + blockedflag |= 1; if(!trace_ent) { @@ -206,19 +205,19 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno if(!_Movetype_PushEntity(this, steppush, true, false)) { - blocked |= 8; + blockedflag |= 8; break; } if(!_Movetype_PushEntity(this, push, true, false)) { - blocked |= 8; + blockedflag |= 8; break; } float trace2_fraction = trace_fraction; steppush = vec3(0, 0, org.z - this.origin_z); if(!_Movetype_PushEntity(this, steppush, true, false)) { - blocked |= 8; + blockedflag |= 8; break; } @@ -236,7 +235,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno else { // step - return it to caller - blocked |= 2; + blockedflag |= 2; // save the trace for player extrafriction if(applystepnormal) move_stepnormal = trace_plane_normal; @@ -256,7 +255,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno { // this shouldn't really happen this.velocity = '0 0 0'; - blocked = 3; + blockedflag = 3; break; } @@ -292,7 +291,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno if(numplanes != 2) { this.velocity = '0 0 0'; - blocked = 7; + blockedflag = 7; break; } vector dir = cross(planes[0], planes[1]); @@ -317,10 +316,10 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno } // LordHavoc: this came from QW and allows you to get out of water more easily - if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blocked & 8)) + if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blockedflag & 8)) this.velocity = primal_velocity; - if(PHYS_WALLCLIP(this) && this.pm_time && !(this.flags & FL_WATERJUMP) && !(blocked & 8)) + if(PHYS_WALLCLIP(this) && this.pm_time && !(this.flags & FL_WATERJUMP) && !(blockedflag & 8)) this.velocity = primal_velocity; if(applygravity) @@ -332,7 +331,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno } } - return blocked; + return blockedflag; } void _Movetype_CheckVelocity(entity this) // SV_CheckVelocity @@ -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; @@ -662,10 +661,6 @@ bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool return (this.origin == last_origin); // false if teleported by touch } - -.float ltime; -.void() blocked; - void _Movetype_Physics_Frame(entity this, float movedt) { this.move_didgravity = -1; @@ -728,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: @@ -754,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;