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=cbb54cd26e575c8cb6e67740b0b48fa2f02516bf;hp=407a703cfc03c4c7aea711a0e4be505a42c58de7;hb=057a30619b24b998bb9502aaaf6fd4fc757f9979;hpb=63ab06764e6e0a20481ab406863eb7bca32cb669 diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 407a703cfc..cbb54cd26e 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -1,16 +1,4 @@ #include "movetypes.qh" -#include "../player.qh" - -#if defined(CSQC) - #include - #include - #include - #include - #include -#elif defined(MENUQC) -#elif defined(SVQC) - #include -#endif #ifdef SVQC void set_movetype(entity this, int mt) @@ -48,11 +36,15 @@ void _Movetype_WallFriction(entity this, vector stepnormal) // SV_WallFriction vector planes[MAX_CLIP_PLANES]; int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight) // SV_FlyMove { - int blocked = 0, bumpcount; + if(dt <= 0) + return 0; + + int blocked = 0; int i, j, numplanes = 0; float time_left = dt, grav = 0; vector push; - vector primal_velocity, original_velocity, restore_velocity; + vector primal_velocity, original_velocity; + vector restore_velocity = this.velocity; for(i = 0; i < MAX_CLIP_PLANES; ++i) planes[i] = '0 0 0'; @@ -71,16 +63,15 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma } } - original_velocity = primal_velocity = restore_velocity = this.velocity; + original_velocity = primal_velocity = this.velocity; - for(bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++) + for(int bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++) { if(this.velocity == '0 0 0') break; push = this.velocity * time_left; - _Movetype_PushEntity(this, push, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, push, true, false)) { // we got teleported by a touch function // let's abort the move @@ -125,29 +116,26 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma vector org = this.origin; vector steppush = '0 0 1' * stepheight; - _Movetype_PushEntity(this, steppush, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, steppush, true, false)) { blocked |= 8; break; } - _Movetype_PushEntity(this, push, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, push, true, false)) { blocked |= 8; break; } float trace2_fraction = trace_fraction; - steppush = '0 0 1' * (org_z - this.origin_z); - _Movetype_PushEntity(this, steppush, true); - if(trace_startsolid) + steppush = vec3(0, 0, org.z - this.origin_z); + if(!_Movetype_PushEntity(this, steppush, true, false)) { blocked |= 8; break; } // accept the new position if it made some progress... - if(fabs(this.origin_x - org_x) >= 0.03125 || fabs(this.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.origin; time_left *= 1 - trace2_fraction; @@ -244,6 +232,9 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma if(GAMEPLAYFIX_EASIERWATERJUMP(this) && (this.flags & FL_WATERJUMP) && !(blocked & 8)) this.velocity = primal_velocity; + if(PHYS_WALLCLIP(this) && this.pm_time && !(this.flags & FL_WATERJUMP) && !(blocked & 8)) + this.velocity = primal_velocity; + if(applygravity) { if(!GAMEPLAYFIX_NOGRAVITYONGROUND || !IS_ONGROUND(this)) @@ -363,37 +354,50 @@ void _Movetype_LinkEdict_TouchAreaGrid(entity this) // SV_LinkEdict_TouchAreaGr }); } +bool autocvar__movetype_debug = false; void _Movetype_LinkEdict(entity this, bool touch_triggers) // SV_LinkEdict { - vector mi, ma; - if(this.solid == SOLID_BSP) + if(autocvar__movetype_debug) { - // TODO set the absolute bbox - mi = this.mins; - ma = this.maxs; - } - else - { - mi = this.mins; - ma = this.maxs; - } - mi += this.origin; - ma += this.origin; + vector mi, ma; + if(this.solid == SOLID_BSP) + { + // TODO set the absolute bbox + mi = this.mins; + ma = this.maxs; + } + else + { + mi = this.mins; + ma = this.maxs; + } + mi += this.origin; + ma += this.origin; - if(this.flags & FL_ITEM) - { - mi -= '15 15 1'; - ma += '15 15 1'; + if(this.flags & FL_ITEM) + { + mi -= '15 15 1'; + ma += '15 15 1'; + } + else + { + mi -= '1 1 1'; + ma += '1 1 1'; + } + + this.absmin = mi; + this.absmax = ma; } else { - mi -= '1 1 1'; - ma += '1 1 1'; + setorigin(this, this.origin); // calls SV_LinkEdict + #ifdef CSQC + // NOTE: CSQC's version of setorigin doesn't expand + this.absmin -= '1 1 1'; + this.absmax += '1 1 1'; + #endif } - this.absmin = mi; - this.absmax = ma; - if(touch_triggers) _Movetype_LinkEdict_TouchAreaGrid(this); } @@ -402,11 +406,11 @@ entity _Movetype_TestEntityPosition_ent; bool _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition { entity this = _Movetype_TestEntityPosition_ent; -// vector org = this.origin + ofs; + vector org = this.origin + ofs; int cont = this.dphitcontentsmask; this.dphitcontentsmask = DPCONTENTS_SOLID; - tracebox(this.origin, this.mins, this.maxs, this.origin, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); + tracebox(org, this.mins, this.maxs, org, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); this.dphitcontentsmask = cont; if(trace_startsolid) @@ -417,11 +421,11 @@ bool _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition return false; } -bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity +int _Movetype_UnstickEntity(entity this) // SV_UnstickEntity { _Movetype_TestEntityPosition_ent = this; if (!_Movetype_TestEntityPosition(' 0 0 0')) { - return true; + return UNSTICK_FINE; } #define X(v) if (_Movetype_TestEntityPosition(v)) X('-1 0 0') X(' 1 0 0') @@ -433,20 +437,39 @@ bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity #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(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8) + X(9) 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; + return UNSTICK_STUCK; } } 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; + return UNSTICK_FIXED; +} + +void _Movetype_CheckStuck(entity this) // SV_CheckStuck +{ + int unstick = _Movetype_UnstickEntity(this); // sets test position entity + switch(unstick) + { + case UNSTICK_FINE: + this.oldorigin = this.origin; + break; + case UNSTICK_FIXED: + break; // already sorted + case UNSTICK_STUCK: + vector offset = this.oldorigin - this.origin; + if(!_Movetype_TestEntityPosition(offset)) + _Movetype_LinkEdict(this, false); + // couldn't unstick, should we warn about this? + break; + } } vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVelocity @@ -478,20 +501,32 @@ void _Movetype_PushEntityTrace(entity this, vector push) tracebox(this.origin, this.mins, this.maxs, end, type, this); } -float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid) // SV_PushEntity +bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool dolink) // SV_PushEntity { _Movetype_PushEntityTrace(this, push); if(trace_startsolid && failonstartsolid) - return trace_fraction; + { + int oldtype = this.move_nomonsters; + this.move_nomonsters = MOVE_NOMONSTERS; + _Movetype_PushEntityTrace(this, push); + this.move_nomonsters = oldtype; + if(trace_startsolid) + return true; + } this.origin = trace_endpos; + vector last_origin = this.origin; + + if(dolink) + _Movetype_LinkEdict(this, true); + if(trace_fraction < 1) if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent))) _Movetype_Impact(this, trace_ent); - return trace_fraction; + return (this.origin == last_origin); // false if teleported by touch } @@ -505,7 +540,7 @@ void _Movetype_Physics_Frame(entity this, float movedt) { case MOVETYPE_PUSH: case MOVETYPE_FAKEPUSH: - LOG_DEBUGF("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); + LOG_DEBUG("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); break; case MOVETYPE_NONE: break; @@ -531,6 +566,8 @@ void _Movetype_Physics_Frame(entity this, float movedt) case MOVETYPE_FLY: case MOVETYPE_FLY_WORLDONLY: _Movetype_Physics_Toss(this, movedt); + if(wasfreed(this)) + return; _Movetype_LinkEdict(this, true); break; case MOVETYPE_PHYSICS: @@ -545,7 +582,7 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) { case MOVETYPE_PUSH: case MOVETYPE_FAKEPUSH: - LOG_DEBUGF("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); + LOG_DEBUG("Physics: Lacking QuakeC support for Push movetype, FIX ME by using engine physics!"); break; case MOVETYPE_NONE: break; @@ -556,7 +593,6 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) _Movetype_CheckWater(this); this.origin = this.origin + movedt * this.velocity; this.angles = this.angles + movedt * this.avelocity; - _Movetype_LinkEdict(this, false); break; case MOVETYPE_STEP: _Movetype_Physics_Step(this, movedt); @@ -575,6 +611,12 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt) case MOVETYPE_PHYSICS: break; } + + //_Movetype_CheckVelocity(this); + + _Movetype_LinkEdict(this, true); + + //_Movetype_CheckVelocity(this); } void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient) // to be run every move frame