All pastes #772661 Raw Edit

Miscellany

public cpp v1 · immutable
·published 2007-11-13 23:20 UTC
rendered paste body
float moveAngle = m_target->GetAngle(caster)+M_PI;float moveSpeed = m_target->GetSpeed(MOVE_RUN);float currentX = m_target->GetPositionX();float currentY = m_target->GetPositionY();float currentZ = MapManager::Instance().GetBaseMap(m_target->GetMapId())->GetHeight(currentX,currentY, m_target->GetPositionZ());// Control the max Distance; 28 for temp.//Need to Find out the correct range into DBC since not all are same i think so, GSif(m_target->IsWithinDistInMap(caster, 28)){    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}