From f4ff5c5fdce5406ad8e090cef68f733666630076 Mon Sep 17 00:00:00 2001 From: driAn Date: Sat, 17 Nov 2007 11:48:42 +0000 Subject: [PATCH] crouch on mapmodels git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@1430 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/physics.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/source/src/physics.cpp b/source/src/physics.cpp index bf4757e9..c129b20e 100644 --- a/source/src/physics.cpp +++ b/source/src/physics.cpp @@ -96,6 +96,7 @@ bool cornertest(int mip, int x, int y, int dx, int dy, int &bx, int &by, int &bs void mmcollide(physent *d, float &hi, float &lo) // collide with a mapmodel { + float eyeheight = d->dyneyeheight(); loopv(ents) { entity &e = ents[i]; @@ -106,7 +107,8 @@ void mmcollide(physent *d, float &hi, float &lo) // collide with a map if(fabs(e.x-d->o.x)o.y)floor+mmi.zoff+e.attr3); - if(d->o.z-d->dyneyeheight()o.z+(-eyeheight+d->aboveeye)/2.0f; + if(dzlo) lo = mmz+mmi.h; } } @@ -186,25 +188,25 @@ bool collide(physent *d, bool spawn, float drop, float rise) } else { - const float spacetop = d->o.z-d->dyneyeheight()-lo; - if(spacetop<0) + const float spacelo = d->o.z-d->dyneyeheight()-lo; + if(spacelo<0) { - if(spacetop>-0.01) + if(spacelo>-0.01) { d->o.z = lo+d->dyneyeheight(); // stick on step } - else if(spacetop>-1.26f && d->type!=ENT_BOUNCE) d->o.z += rise; // rise thru stair + else if(spacelo>-1.26f && d->type!=ENT_BOUNCE) d->o.z += rise; // rise thru stair else return false; } else { - d->o.z -= min(min(drop, spacetop), headspace); // gravity + d->o.z -= min(min(drop, spacelo), headspace); // gravity } - const float spacebottom = hi-(d->o.z+d->aboveeye); - if(spacebottom<0) + const float spacehi = hi-(d->o.z+d->aboveeye); + if(spacehi<0) { - if(spacebottom<-0.1) return false; // hack alert! + if(spacehi<-0.1) return false; // hack alert! d->o.z = hi-d->aboveeye; // glue to ceiling d->vel.z = 0; // cancel out jumping velocity } @@ -482,7 +484,7 @@ void jumpn(bool on) void crouch(bool on) { - if(intermission || player1->onladder) return; + if(intermission || player1->onladder || !player1->onfloor) return; player1->crouching = on; }