From a644165a7a0ef16bf1b6563c05ee4e92b321f874 Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 2 Mar 2013 04:57:07 +0000 Subject: [PATCH] changed MOVETYPE_STEP and MOVETYPE_WALK to match Quake behavior (unable to move when allsolid - but also check SUPERCONTENTS_SOLID), this makes hip2m3 shalrath work again git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11923 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=16e9ca434b1e9f5f0977506d63a86649402cbc7b --- server.h | 4 ++++ sv_phys.c | 17 ++++++++++++++--- svvm_cmds.c | 14 +++++--------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/server.h b/server.h index ce3fcfa1..669174bc 100644 --- a/server.h +++ b/server.h @@ -566,6 +566,10 @@ void SV_LinkEdict_TouchAreaGrid_Call(prvm_edict_t *touch, prvm_edict_t *ent); // * returns true if it found a better place */ qboolean SV_UnstickEntity (prvm_edict_t *ent); +/*! move an entity that is stuck out of the surface it is stuck in (can move large amounts) + * returns true if it found a better place + */ +qboolean SV_NudgeOutOfSolid(prvm_edict_t *ent); /// calculates hitsupercontentsmask for a generic qc entity int SV_GenericHitSuperContentsMask(const prvm_edict_t *edict); diff --git a/sv_phys.c b/sv_phys.c index 7a158800..6b1c8c6c 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -1248,7 +1248,7 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo int i, j, numplanes; float d, time_left, gravity; vec3_t dir, push, planes[MAX_CLIP_PLANES]; - prvm_vec3_t primal_velocity, original_velocity, new_velocity; + prvm_vec3_t primal_velocity, original_velocity, new_velocity, restore_velocity; #if 0 vec3_t end; #endif @@ -1257,6 +1257,8 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo return 0; gravity = 0; + VectorCopy(PRVM_serveredictvector(ent, velocity), restore_velocity); + if(applygravity) { gravity = SV_Gravity(ent); @@ -1281,7 +1283,7 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo break; VectorScale(PRVM_serveredictvector(ent, velocity), time_left, push); - if(!SV_PushEntity(&trace, ent, push, false, false)) + if(!SV_PushEntity(&trace, ent, push, true, false)) { // we got teleported by a touch function // let's abort the move @@ -1289,6 +1291,15 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo break; } + // this code is used by MOVETYPE_WALK and MOVETYPE_STEP and SV_UnstickEntity + // abort move if it started in SUPERCONTENTS_SOLID (not SUPERCONTENTS_BODY used by SOLID_BBOX) + // note the SV_PushEntity call above must pass true for failonbmodelstartsolid + if (trace.allsolid && (trace.startsupercontents & SUPERCONTENTS_SOLID)) + { + VectorCopy(restore_velocity, PRVM_serveredictvector(ent, velocity)); + return 3; + } + if (trace.fraction == 1) break; if (trace.plane.normal[2]) @@ -1575,7 +1586,7 @@ static qboolean SV_NudgeOutOfSolid_PivotIsKnownGood(prvm_edict_t *ent, vec3_t pi return true; } -static qboolean SV_NudgeOutOfSolid(prvm_edict_t *ent) +qboolean SV_NudgeOutOfSolid(prvm_edict_t *ent) { prvm_prog_t *prog = SVVM_prog; int bump; diff --git a/svvm_cmds.c b/svvm_cmds.c index 73394e99..e9d51fdf 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -1151,8 +1151,7 @@ static void VM_SV_droptofloor(prvm_prog_t *prog) end[2] -= 256; if (sv_gameplayfix_droptofloorstartsolid_nudgetocorrect.integer) - if (sv_gameplayfix_unstickentities.integer) - SV_UnstickEntity(ent); + SV_NudgeOutOfSolid(ent); VectorCopy(PRVM_serveredictvector(ent, origin), entorigin); VectorCopy(PRVM_serveredictvector(ent, mins), entmins); @@ -1168,8 +1167,6 @@ static void VM_SV_droptofloor(prvm_prog_t *prog) if (trace.startsolid) { Con_DPrintf("droptofloor at %f %f %f - COULD NOT FIX BADLY PLACED ENTITY\n", PRVM_serveredictvector(ent, origin)[0], PRVM_serveredictvector(ent, origin)[1], PRVM_serveredictvector(ent, origin)[2]); - if (sv_gameplayfix_unstickentities.integer) - SV_UnstickEntity(ent); SV_LinkEdict(ent); PRVM_serveredictfloat(ent, flags) = (int)PRVM_serveredictfloat(ent, flags) | FL_ONGROUND; PRVM_serveredictedict(ent, groundentity) = 0; @@ -1179,8 +1176,8 @@ static void VM_SV_droptofloor(prvm_prog_t *prog) { Con_DPrintf("droptofloor at %f %f %f - FIXED BADLY PLACED ENTITY\n", PRVM_serveredictvector(ent, origin)[0], PRVM_serveredictvector(ent, origin)[1], PRVM_serveredictvector(ent, origin)[2]); VectorCopy (trace.endpos, PRVM_serveredictvector(ent, origin)); - if (sv_gameplayfix_unstickentities.integer) - SV_UnstickEntity(ent); + if (sv_gameplayfix_droptofloorstartsolid_nudgetocorrect.integer) + SV_NudgeOutOfSolid(ent); SV_LinkEdict(ent); PRVM_serveredictfloat(ent, flags) = (int)PRVM_serveredictfloat(ent, flags) | FL_ONGROUND; PRVM_serveredictedict(ent, groundentity) = PRVM_EDICT_TO_PROG(trace.ent); @@ -1191,10 +1188,9 @@ static void VM_SV_droptofloor(prvm_prog_t *prog) } else { - if (trace.fraction != 1) + if (!trace.allsolid && trace.fraction < 1) { - if (trace.fraction < 1) - VectorCopy (trace.endpos, PRVM_serveredictvector(ent, origin)); + VectorCopy (trace.endpos, PRVM_serveredictvector(ent, origin)); SV_LinkEdict(ent); PRVM_serveredictfloat(ent, flags) = (int)PRVM_serveredictfloat(ent, flags) | FL_ONGROUND; PRVM_serveredictedict(ent, groundentity) = PRVM_EDICT_TO_PROG(trace.ent); -- 2.39.2