X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics%2Fmovetypes%2Fmovetypes.qc;h=f0df80cd5d52c044dd46563eb248ea976f3692ed;hp=ef9f059814c4632f277ab247bb0d65458c21bfc4;hb=a394baa72a77a2db64709e44caa89a6fb4aaf5f4;hpb=6ba37d06b4afe2b08882f5cc5b211441227586b2 diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index ef9f059814..f0df80cd5d 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -1,10 +1,10 @@ +#include "movetypes.qh" #include "../player.qh" #if defined(CSQC) #include #include #include - #include "movetypes.qh" #include #include #elif defined(MENUQC) @@ -12,6 +12,22 @@ #include #endif +#ifdef SVQC +void set_movetype(entity this, int mt) +{ + this.move_movetype = mt; + if (mt == MOVETYPE_PHYSICS || mt == MOVETYPE_PUSH || mt == MOVETYPE_FAKEPUSH) { + this.move_qcphysics = false; + } + this.movetype = (this.move_qcphysics) ? MOVETYPE_NONE : mt; +} +#elif defined(CSQC) +void set_movetype(entity this, int mt) +{ + this.move_movetype = mt; +} +#endif + void _Movetype_WallFriction(entity this, vector stepnormal) // SV_WallFriction { /*float d, i; @@ -21,11 +37,11 @@ void _Movetype_WallFriction(entity this, vector stepnormal) // SV_WallFriction if(d < 0) { - i = (stepnormal * this.move_velocity); + i = (stepnormal * this.velocity); into = i * stepnormal; - side = this.move_velocity - into; - this.move_velocity_x = side.x * (1 * d); - this.move_velocity_y = side.y * (1 * d); + side = this.velocity - into; + this.velocity_x = side.x * (1 * d); + this.velocity_y = side.y * (1 * d); }*/ } @@ -46,23 +62,23 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma this.move_didgravity = 1; grav = dt * (PHYS_ENTGRAVITY(this) ? PHYS_ENTGRAVITY(this) : 1) * PHYS_GRAVITY(this); - if(!GAMEPLAYFIX_NOGRAVITYONGROUND || !(this.move_flags & FL_ONGROUND)) + if(!GAMEPLAYFIX_NOGRAVITYONGROUND || !IS_ONGROUND(this)) { if(GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE) - this.move_velocity_z -= grav * 0.5; + this.velocity_z -= grav * 0.5; else - this.move_velocity_z -= grav; + this.velocity_z -= grav; } } - original_velocity = primal_velocity = restore_velocity = this.move_velocity; + original_velocity = primal_velocity = restore_velocity = this.velocity; for(bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++) { - if(this.move_velocity == '0 0 0') + if(this.velocity == '0 0 0') break; - push = this.move_velocity * time_left; + push = this.velocity * time_left; _Movetype_PushEntity(this, push, true); if(trace_startsolid) { @@ -76,7 +92,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma // abort move if we're stuck in the world (and didn't make it out) if(trace_startsolid && trace_allsolid) { - this.move_velocity = restore_velocity; + this.velocity = restore_velocity; return 3; } @@ -96,17 +112,17 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma if(!trace_ent) { //dprint("_Movetype_FlyMove: !trace_ent\n"); - trace_ent = world; + trace_ent = NULL; } - this.move_flags |= FL_ONGROUND; - this.move_groundentity = trace_ent; + SET_ONGROUND(this); + this.groundentity = trace_ent; } } else if(stepheight) { // step - handle it immediately - vector org = this.move_origin; + vector org = this.origin; vector steppush = '0 0 1' * stepheight; _Movetype_PushEntity(this, steppush, true); @@ -122,7 +138,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma break; } float trace2_fraction = trace_fraction; - steppush = '0 0 1' * (org_z - this.move_origin_z); + steppush = '0 0 1' * (org_z - this.origin_z); _Movetype_PushEntity(this, steppush, true); if(trace_startsolid) { @@ -131,15 +147,15 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma } // accept the new position if it made some progress... - if(fabs(this.move_origin_x - org_x) >= 0.03125 || fabs(this.move_origin_y - org_y) >= 0.03125) + if(fabs(this.origin_x - org_x) >= 0.03125 || fabs(this.origin_y - org_y) >= 0.03125) { - trace_endpos = this.move_origin; + trace_endpos = this.origin; time_left *= 1 - trace2_fraction; numplanes = 0; continue; } else - this.move_origin = org; + this.origin = org; } else { @@ -153,7 +169,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma if(my_trace_fraction >= 0.001) { // actually covered some distance - original_velocity = this.move_velocity; + original_velocity = this.velocity; numplanes = 0; } @@ -163,7 +179,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma if(numplanes >= MAX_CLIP_PLANES) { // this shouldn't really happen - this.move_velocity = '0 0 0'; + this.velocity = '0 0 0'; blocked = 3; break; } @@ -192,14 +208,14 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma if(i != numplanes) { // go along this plane - this.move_velocity = new_velocity; + this.velocity = new_velocity; } else { // go along the crease if(numplanes != 2) { - this.move_velocity = '0 0 0'; + this.velocity = '0 0 0'; blocked = 7; break; } @@ -211,29 +227,29 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma dir.x *= ilength; dir.y *= ilength; dir.z *= ilength; - float d = (dir * this.move_velocity); - this.move_velocity = dir * d; + float d = (dir * this.velocity); + this.velocity = dir * d; } // if current velocity is against the original velocity, // stop dead to avoid tiny occilations in sloping corners - if((this.move_velocity * primal_velocity) <= 0) + if((this.velocity * primal_velocity) <= 0) { - this.move_velocity = '0 0 0'; + this.velocity = '0 0 0'; break; } } // LordHavoc: this came from QW and allows you to get out of water more easily - if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.move_flags & FL_WATERJUMP) && !(blocked & 8)) - this.move_velocity = primal_velocity; + if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blocked & 8)) + this.velocity = primal_velocity; if(applygravity) { - if(!GAMEPLAYFIX_NOGRAVITYONGROUND || !(this.move_flags & FL_ONGROUND)) + if(!GAMEPLAYFIX_NOGRAVITYONGROUND || !IS_ONGROUND(this)) { if(GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE) - this.move_velocity_z -= grav * 0.5f; + this.velocity_z -= grav * 0.5f; } } @@ -242,126 +258,109 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma void _Movetype_CheckVelocity(entity this) // SV_CheckVelocity { - // if(vlen(this.move_velocity) < 0.0001) - // this.move_velocity = '0 0 0'; + // if(vlen(this.velocity) < 0.0001) + // this.velocity = '0 0 0'; } bool _Movetype_CheckWater(entity this) // SV_CheckWater { - vector point = this.move_origin; + vector point = this.origin; point.z += this.mins.z + 1; int nativecontents = pointcontents(point); - if(this.move_watertype && this.move_watertype != nativecontents) + if(this.watertype && this.watertype != nativecontents) { - // dprintf("_Movetype_CheckWater(): Original: '%d', New: '%d'\n", this.move_watertype, nativecontents); + // dprintf("_Movetype_CheckWater(): Original: '%d', New: '%d'\n", this.watertype, nativecontents); if(this.contentstransition) - this.contentstransition(this.move_watertype, nativecontents); + this.contentstransition(this.watertype, nativecontents); } - this.move_waterlevel = WATERLEVEL_NONE; - this.move_watertype = CONTENT_EMPTY; + this.waterlevel = WATERLEVEL_NONE; + this.watertype = CONTENT_EMPTY; int supercontents = Mod_Q1BSP_SuperContentsFromNativeContents(nativecontents); if(supercontents & DPCONTENTS_LIQUIDSMASK) { - this.move_watertype = nativecontents; - this.move_waterlevel = WATERLEVEL_WETFEET; - point.z = this.move_origin.z + (this.mins.z + this.maxs.z) * 0.5; + this.watertype = nativecontents; + this.waterlevel = WATERLEVEL_WETFEET; + point.z = this.origin.z + (this.mins.z + this.maxs.z) * 0.5; if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(point)) & DPCONTENTS_LIQUIDSMASK) { - this.move_waterlevel = WATERLEVEL_SWIMMING; - point.z = this.move_origin.z + this.view_ofs.z; + this.waterlevel = WATERLEVEL_SWIMMING; + point.z = this.origin.z + this.view_ofs.z; if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(point)) & DPCONTENTS_LIQUIDSMASK) - this.move_waterlevel = WATERLEVEL_SUBMERGED; + this.waterlevel = WATERLEVEL_SUBMERGED; } } - return this.move_waterlevel > 1; + return this.waterlevel > 1; } void _Movetype_CheckWaterTransition(entity ent) // SV_CheckWaterTransition { - int contents = pointcontents(ent.move_origin); + int contents = pointcontents(ent.origin); - if(!ent.move_watertype) + if(!ent.watertype) { // just spawned here - if(!autocvar_cl_gameplayfix_fixedcheckwatertransition) + if(!GAMEPLAYFIX_WATERTRANSITION(ent)) { - ent.move_watertype = contents; - ent.move_waterlevel = 1; + ent.watertype = contents; + ent.waterlevel = 1; return; } } - else if(ent.move_watertype != contents) + else if(ent.watertype != contents) { - // dprintf("_Movetype_CheckWaterTransition(): Origin: %s, Direct: '%d', Original: '%d', New: '%d'\n", vtos(ent.move_origin), pointcontents(ent.move_origin), ent.move_watertype, contents); + // dprintf("_Movetype_CheckWaterTransition(): Origin: %s, Direct: '%d', Original: '%d', New: '%d'\n", vtos(ent.origin), pointcontents(ent.origin), ent.watertype, contents); if(ent.contentstransition) - ent.contentstransition(ent.move_watertype, contents); + ent.contentstransition(ent.watertype, contents); } if(contents <= CONTENT_WATER) { - ent.move_watertype = contents; - ent.move_waterlevel = 1; + ent.watertype = contents; + ent.waterlevel = 1; } else { - ent.move_watertype = CONTENT_EMPTY; - ent.move_waterlevel = (autocvar_cl_gameplayfix_fixedcheckwatertransition ? 0 : contents); + ent.watertype = CONTENT_EMPTY; + ent.waterlevel = (GAMEPLAYFIX_WATERTRANSITION(ent) ? 0 : contents); } } void _Movetype_Impact(entity this, entity oth) // SV_Impact { - entity oldother = other; - - if(this.move_touch) - { - other = oth; + if(gettouch(this)) + gettouch(this)(this, oth); - WITH(entity, self, this, this.move_touch()); - - other = oldother; - } - - if(oth.move_touch) - { - other = this; - - WITH(entity, self, oth, oth.move_touch()); - - other = oldother; - } + if(gettouch(oth)) + gettouch(oth)(oth, this); } void _Movetype_LinkEdict_TouchAreaGrid(entity this) // SV_LinkEdict_TouchAreaGrid { - entity oldother = other; + if(this.solid == SOLID_NOT) + return; - for (entity e = findradius(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin)); e; e = e.chain) - { - if(e.move_nomonsters != MOVE_NOMONSTERS && e.move_nomonsters != MOVE_WORLDONLY) - if(e.move_touch && boxesoverlap(e.absmin, e.absmax, this.absmin, this.absmax)) + FOREACH_ENTITY_RADIUS(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)) { - other = this; - trace_allsolid = false; trace_startsolid = false; trace_fraction = 1; trace_inwater = false; trace_inopen = true; - trace_endpos = e.move_origin; + trace_endpos = it.origin; trace_plane_normal = '0 0 1'; trace_plane_dist = 0; trace_ent = this; - WITH(entity, self, e, e.move_touch()); + gettouch(it)(it, this); } - } - - other = oldother; + }); } void _Movetype_LinkEdict(entity this, bool touch_triggers) // SV_LinkEdict @@ -378,10 +377,10 @@ void _Movetype_LinkEdict(entity this, bool touch_triggers) // SV_LinkEdict mi = this.mins; ma = this.maxs; } - mi += this.move_origin; - ma += this.move_origin; + mi += this.origin; + ma += this.origin; - if(this.move_flags & FL_ITEM) + if(this.flags & FL_ITEM) { mi.x -= 15; mi.y -= 15; @@ -407,45 +406,53 @@ void _Movetype_LinkEdict(entity this, bool touch_triggers) // SV_LinkEdict _Movetype_LinkEdict_TouchAreaGrid(this); } -bool _Movetype_TestEntityPosition(entity this, vector ofs) // SV_TestEntityPosition +entity _Movetype_TestEntityPosition_ent; +bool _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition { -// vector org = this.move_origin + ofs; + entity this = _Movetype_TestEntityPosition_ent; +// vector org = this.origin + ofs; int cont = this.dphitcontentsmask; this.dphitcontentsmask = DPCONTENTS_SOLID; - tracebox(this.move_origin, this.mins, this.maxs, this.move_origin, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); + tracebox(this.origin, this.mins, this.maxs, this.origin, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); this.dphitcontentsmask = cont; if(trace_startsolid) return true; - if(vlen(trace_endpos - this.move_origin) > 0.0001) - this.move_origin = trace_endpos; + if(vdist(trace_endpos - this.origin, >, 0.0001)) + this.origin = trace_endpos; return false; } bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity { - if(!_Movetype_TestEntityPosition(this, '0 0 0')) return true; - if(!_Movetype_TestEntityPosition(this, '-1 0 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 0 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '0 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '0 1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '-1 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '-1 1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 1 0')) goto success; - for (int i = 1; i <= 17; ++i) + _Movetype_TestEntityPosition_ent = this; + if (!_Movetype_TestEntityPosition(' 0 0 0')) { + return true; + } + #define X(v) if (_Movetype_TestEntityPosition(v)) + X('-1 0 0') X(' 1 0 0') + X(' 0 -1 0') X(' 0 1 0') + X('-1 -1 0') X(' 1 -1 0') + X('-1 1 0') X(' 1 1 0') + #undef X { - if(!_Movetype_TestEntityPosition(this, '0 0 -1' * i)) goto success; - if(!_Movetype_TestEntityPosition(this, '0 0 1' * i)) goto success; + #define X(i) \ + if (_Movetype_TestEntityPosition('0 0 -1' * i)) \ + if (_Movetype_TestEntityPosition('0 0 1' * i)) + X(01) X(02) X(03) X(04) X(05) X(06) X(07) X(08) + X(09) X(10) X(11) X(12) X(13) X(14) X(15) X(16) + X(17) + #undef X + { + LOG_DEBUGF("Can't unstick an entity (edict: %d, classname: %s, origin: %s)", + etof(this), this.classname, vtos(this.origin)); + return false; + } } - LOG_DEBUGF("Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n", - etof(this), this.classname, vtos(this.move_origin)); - return false; - : success; - LOG_DEBUGF("Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n", - etof(this), this.classname, vtos(this.move_origin)); + LOG_DEBUGF("Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)", + etof(this), this.classname, vtos(this.origin)); _Movetype_LinkEdict(this, true); return true; } @@ -463,7 +470,7 @@ vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVeloc void _Movetype_PushEntityTrace(entity this, vector push) { - vector end = this.move_origin + push; + vector end = this.origin + push; int type; if(this.move_nomonsters) type = max(0, this.move_nomonsters); @@ -476,7 +483,7 @@ void _Movetype_PushEntityTrace(entity this, vector push) else type = MOVE_NORMAL; - tracebox(this.move_origin, this.mins, this.maxs, end, type, this); + tracebox(this.origin, this.mins, this.maxs, end, type, this); } float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid) // SV_PushEntity @@ -486,10 +493,10 @@ float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid) // if(trace_startsolid && failonstartsolid) return trace_fraction; - this.move_origin = trace_endpos; + this.origin = trace_endpos; if(trace_fraction < 1) - if(this.solid >= SOLID_TRIGGER && (!(this.move_flags & FL_ONGROUND) || (this.move_groundentity != trace_ent))) + if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent))) _Movetype_Impact(this, trace_ent); return trace_fraction; @@ -503,9 +510,9 @@ void makevectors_matrix(vector myangles) // AngleVectorsFLU { v_forward = v_right = v_up = '0 0 0'; - float y = myangles.y * (M_PI * 2 / 360); - float sy = sin(y); - float cy = cos(y); + float yy = myangles.y * (M_PI * 2 / 360); + float sy = sin(yy); + float cy = cos(yy); float p = myangles.x * (M_PI * 2 / 360); float sp = sin(p); float cp = cos(p); @@ -560,7 +567,7 @@ void _Movetype_Physics_Frame(entity this, float movedt) { case MOVETYPE_PUSH: case MOVETYPE_FAKEPUSH: - _Movetype_Physics_Pusher(this, movedt); + LOG_DEBUGF("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); break; case MOVETYPE_NONE: break; @@ -569,8 +576,8 @@ void _Movetype_Physics_Frame(entity this, float movedt) break; case MOVETYPE_NOCLIP: _Movetype_CheckWater(this); - this.move_origin = this.move_origin + TICRATE * this.move_velocity; - this.move_angles = this.move_angles + TICRATE * this.move_avelocity; + this.origin = this.origin + movedt * this.velocity; + this.angles = this.angles + movedt * this.avelocity; _Movetype_LinkEdict(this, false); break; case MOVETYPE_STEP: @@ -600,7 +607,7 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) { case MOVETYPE_PUSH: case MOVETYPE_FAKEPUSH: - _Movetype_Physics_Pusher(this, movedt); + LOG_DEBUGF("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); break; case MOVETYPE_NONE: break; @@ -609,8 +616,8 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) break; case MOVETYPE_NOCLIP: _Movetype_CheckWater(this); - this.move_origin = this.move_origin + TICRATE * this.move_velocity; - this.move_angles = this.move_angles + TICRATE * this.move_avelocity; + this.origin = this.origin + movedt * this.velocity; + this.angles = this.angles + movedt * this.avelocity; _Movetype_LinkEdict(this, false); break; case MOVETYPE_STEP: @@ -632,6 +639,20 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) } } +void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient) // to be run every move frame +{ + this.move_time = time; + + if(isclient) + _Movetype_Physics_ClientFrame(this, movedt); + else + _Movetype_Physics_Frame(this, movedt); + if(wasfreed(this)) + return; + + setorigin(this, this.origin); +} + void Movetype_Physics_NoMatchServer(entity this) // optimized { float movedt = time - this.move_time; @@ -641,10 +662,7 @@ void Movetype_Physics_NoMatchServer(entity this) // optimized if(wasfreed(this)) return; - this.avelocity = this.move_avelocity; - this.velocity = this.move_velocity; - this.angles = this.move_angles; - setorigin(this, this.move_origin); + setorigin(this, this.origin); } void Movetype_Physics_MatchServer(entity this, bool sloppy) @@ -652,11 +670,49 @@ void Movetype_Physics_MatchServer(entity this, bool sloppy) Movetype_Physics_MatchTicrate(this, TICRATE, sloppy); } +.vector tic_origin; +.vector tic_velocity; +.int tic_flags; +.vector tic_avelocity; +.vector tic_angles; + +.vector tic_saved_origin; +.vector tic_saved_velocity; +.int tic_saved_flags; +.vector tic_saved_avelocity; +.vector tic_saved_angles; void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy) // SV_Physics_Entity { +#define X(s) \ + if(this.(s) != this.tic_saved_##s) \ + this.tic_##s = this.(s) + + X(origin); + X(velocity); + X(flags); + X(avelocity); + X(angles); +#undef X + if(tr <= 0) { + this.flags = this.tic_flags; + this.velocity = this.tic_velocity; + this.origin = this.tic_origin; + this.avelocity = this.tic_avelocity; + this.angles = this.tic_angles; Movetype_Physics_NoMatchServer(this); + this.tic_origin = this.origin; + this.tic_velocity = this.velocity; + this.tic_avelocity = this.avelocity; + this.tic_angles = this.angles; + this.tic_flags = this.flags; + + this.tic_saved_flags = this.flags; + this.tic_saved_velocity = this.velocity; + this.tic_saved_origin = this.origin; + this.tic_saved_avelocity = this.avelocity; + this.tic_saved_angles = this.angles; return; } @@ -667,21 +723,31 @@ void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy) // SV_Ph this.move_time += n * tr; if(!this.move_didgravity) - this.move_didgravity = ((this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) && !(this.move_flags & FL_ONGROUND)); + this.move_didgravity = ((this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) && !(this.tic_flags & FL_ONGROUND)); for (int i = 0; i < n; ++i) { + this.flags = this.tic_flags; + this.velocity = this.tic_velocity; + setorigin(this, this.tic_origin); + this.avelocity = this.tic_avelocity; + this.angles = this.tic_angles; _Movetype_Physics_Frame(this, tr); + this.tic_origin = this.origin; + this.tic_velocity = this.velocity; + this.tic_avelocity = this.avelocity; + this.tic_angles = this.angles; + this.tic_flags = this.flags; if(wasfreed(this)) return; } - this.avelocity = this.move_avelocity; + this.avelocity = this.tic_avelocity; - if(dt > 0 && this.move_movetype != MOVETYPE_NONE && !(this.move_flags & FL_ONGROUND)) + if(dt > 0 && this.move_movetype != MOVETYPE_NONE && !(this.tic_flags & FL_ONGROUND)) { // now continue the move from move_time to time - this.velocity = this.move_velocity; + this.velocity = this.tic_velocity; if(this.move_didgravity > 0) { @@ -691,15 +757,18 @@ void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy) // SV_Ph * PHYS_GRAVITY(this); } - this.angles = this.move_angles + dt * this.avelocity; + this.angles = this.tic_angles + dt * this.avelocity; if(sloppy || this.move_movetype == MOVETYPE_NOCLIP) { - setorigin(this, this.move_origin + dt * this.velocity); + setorigin(this, this.tic_origin + dt * this.velocity); } else { + vector oldorg = this.origin; + this.origin = this.tic_origin; _Movetype_PushEntityTrace(this, dt * this.velocity); + this.origin = oldorg; if(!trace_startsolid) setorigin(this, trace_endpos); } @@ -709,8 +778,14 @@ void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy) // SV_Ph } else { - this.velocity = this.move_velocity; - this.angles = this.move_angles; - setorigin(this, this.move_origin); + this.velocity = this.tic_velocity; + this.angles = this.tic_angles; + setorigin(this, this.tic_origin); } + + this.tic_saved_flags = this.flags; + this.tic_saved_velocity = this.velocity; + this.tic_saved_origin = this.origin; + this.tic_saved_avelocity = this.avelocity; + this.tic_saved_angles = this.angles; }