Since when you are inside a wall or most WMO, you Z value will not be the value of the Wall Intercection with Floor, cause inside a wall there is no Floor same for most WMO entering under the floor. So what im doing is searching for the first Hole i saw on my Route... The code is very far from perfect... was just to make fast testing and see the result. The result is: Mob Follow Wall don't go thought.. and offcourse they won't fall or climb from high slope should check the low too.. but was just for exposing so... DON'T CORRECT THE CODE, WAS JUST TO EXPOSE A IDEA... i used the current fearAura to make my test on Mob... Im not saying replace LOS but where we can't use LOS cause cpu usage maybe we can use this one.... Im not sure about CPU implication since i don't know well LOS... so comment on that are very welcome... Maybe all that is wrong but at least worked :) [code] float x[2]; float y[2]; float z[2]; float distance = 0.5f; //Minimun Range from Obstacle uint8 interlevingSide = 0; float leftAngle, rightAngle; leftAngle = rightAngle = 0.0f; float slope = 0.0f; bool canDoMove = true; bool goodMoveFound = false; bool interleavedMove = false; //Not really required was for my first idea. do { distance += 0.05; if(interleavedMove) interleavedMove = false; else interleavedMove = true; x[interleavedMove] = currentX + distance+m_target->GetObjectSize() * cos(moveAngle); y[interleavedMove] = currentY + distance+m_target->GetObjectSize() * sin(moveAngle); z[interleavedMove] = MapManager::Instance().GetBaseMap(m_target->GetMapId())->GetHeight(x[interleavedMove],y[interleavedMove], currentZ); //should be made without fabs so we can check swimg or fly. float _vertical = fabs(sqrt(currentZ*currentZ) - sqrt(z[interleavedMove]*z[interleavedMove])); slope = sqrt(distance*distance + _vertical*_vertical); slope = distance / slope * _vertical; //Should have the minimun slope too... for lower bound if(fabs(slope) > 0.25 && !goodMoveFound) { do { if ( !(interlevingSide & 1)) //Pair Number { leftAngle += 0.05; if(moveAngle + leftAngle - rightAngle > (M_PI*2)) moveAngle = moveAngle + leftAngle - rightAngle - (M_PI*2); else moveAngle += leftAngle - rightAngle; ++interlevingSide; } else //Impair Number { rightAngle -= 0.05; if( moveAngle + rightAngle - leftAngle < 0) moveAngle = moveAngle - leftAngle + rightAngle + (M_PI*2); else moveAngle += rightAngle - leftAngle; ++interlevingSide; } x[interleavedMove] = currentX + distance+m_target->GetObjectSize() * cos(moveAngle); y[interleavedMove] = currentY + distance+m_target->GetObjectSize() * sin(moveAngle); z[interleavedMove] = MapManager::Instance().GetBaseMap(m_target->GetMapId())->GetHeight(x[interleavedMove],y[interleavedMove], currentZ); float _vertical = fabs(sqrt(currentZ*currentZ) - sqrt(z[interleavedMove]*z[interleavedMove])); slope = sqrt(distance*distance + _vertical*_vertical); slope = distance / slope * _vertical; if(fabs(slope) < 0.45) { goodMoveFound = true; break; } if(interlevingSide > 118) { canDoMove = false; break; } }while( abs(slope) > 0.25 ); } else if( distance > 0.5f && !goodMoveFound) goodMoveFound = true; else if(abs(slope) > 0.25 || goodMoveFound && distance > 5.0f) //GoodMV Found just before that one { if(interleavedMove) interleavedMove = false; else interleavedMove = true; float _x,_y,_z; _x = currentX + distance * cos(moveAngle); _y = currentY + distance * sin(moveAngle); _z = MapManager::Instance().GetBaseMap(m_target->GetMapId())->GetHeight(_x,_y, currentZ); m_target->addUnitState(UNIT_STAT_SEARCHING); m_target->SetOrientation(moveAngle); float timeMoving = 1000*distance/moveSpeed; m_target->SendMonsterMove(_x,_y,_z,0,true,timeMoving); if(m_target->GetTypeId() != TYPEID_PLAYER) MapManager::Instance().GetMap(m_target->GetMapId(), m_target)->CreatureRelocation((Creature*)m_target,_x,_y,_z,m_target->GetOrientation()); else MapManager::Instance().GetMap(m_target->GetMapId(), m_target)->PlayerRelocation((Player*)m_target,_x,_y,_z,m_target->GetOrientation()); m_fearMovementTimer = timeMoving; break; } else if(!canDoMove || distance > 5.01f) { m_target->clearUnitState(UNIT_STAT_SEARCHING); m_fearMovementTimer = 1000; break; } //zDiff = ((pos_z*pos_z)-(z*z)); }while( 1 ); //interlevingSide 63 gave me about 90 Degree each Side }[/code] P.S. made without sleep since 36 hours ... so :) haha!