diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 9737f8aa9..c7d409ff3 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4183,16 +4183,26 @@ bool DLevelScript::DoCheckActorTexture(int tid, AActor *activator, int string, b if (floor) { + fixed_t z = actor->Z(); // Looking through planes from top to bottom for (i = 0; i < numff; ++i) { F3DFloor *ff = sec->e->XFloor.ffloors[i]; + if (!(ff->flags & FF_EXISTS)) + continue; - if ((ff->flags & (FF_EXISTS | FF_SOLID)) == (FF_EXISTS | FF_SOLID) && - actor->Z() >= ff->top.plane->ZatPoint(actor)) - { // This floor is beneath our feet. + if (ff->flags & FF_SOLID && + secpic.isNull() && + z >= ff->top.plane->ZatPoint(actor)) + { // This is the highest solid floor beneath our feet secpic = *ff->top.texture; - break; + } + else if (!(ff->flags & FF_SOLID) && + tex == TexMan[*ff->top.texture] && + z <= ff->top.plane->ZatPoint(actor) && + z >= ff->bottom.plane->ZatPoint(actor)) + { // Having your feet within a liquid counts as being "on" it + return true; } } if (i == numff) @@ -4208,11 +4218,21 @@ bool DLevelScript::DoCheckActorTexture(int tid, AActor *activator, int string, b { F3DFloor *ff = sec->e->XFloor.ffloors[i]; - if ((ff->flags & (FF_EXISTS | FF_SOLID)) == (FF_EXISTS | FF_SOLID) && + if (!(ff->flags & FF_EXISTS)) + continue; + + if (ff->flags & FF_SOLID && + secpic.isNull() && z <= ff->bottom.plane->ZatPoint(actor)) - { // This floor is above our eyes. - secpic = *ff->bottom.texture; - break; + { // This is the lowest solid ceiling above our eyes + secpic = *ff->top.texture; + } + else if (!(ff->flags & FF_SOLID) && + tex == TexMan[*ff->bottom.texture] && + z <= ff->top.plane->ZatPoint(actor) && + z >= ff->bottom.plane->ZatPoint(actor)) + { // Having your eyes within a liquid counts as being "under" it + return true; } } if (i < 0)