rendered paste body 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 }P.S. made without sleep since 36 hours ... so :) haha!