예제 #1
0
void MotionMaster::MoveChase(Unit* target, float dist, float angle)
{
	if (GetCurrentMovementGeneratorType() == ASSISTANCE_MOTION_TYPE ||
		GetCurrentMovementGeneratorType() == FLEEING_MOTION_TYPE ||
		GetCurrentMovementGeneratorType() == TIMED_FLEEING_MOTION_TYPE)
		return;

    // ignore movement request if target not exist
    if (!target || target == _owner || _owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE))
        return;

    //_owner->ClearUnitState(UNIT_STATE_FOLLOW);
    if (_owner->GetTypeId() == TYPEID_PLAYER)
    {
        TC_LOG_DEBUG("misc", "Player (GUID: %u) chase to %s (GUID: %u)",
            _owner->GetGUIDLow(),
            target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
            target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : target->ToCreature()->GetDBTableGUIDLow());
        Mutate(new ChaseMovementGenerator<Player>(target, dist, angle), MOTION_SLOT_ACTIVE);
    }
    else
    {
        TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) chase to %s (GUID: %u)",
            _owner->GetEntry(), _owner->GetGUIDLow(),
            target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature",
            target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : target->ToCreature()->GetDBTableGUIDLow());
        Mutate(new ChaseMovementGenerator<Creature>(target, dist, angle), MOTION_SLOT_ACTIVE);
    }
}
예제 #2
0
void MotionMaster::MoveChase(Unit* target, float dist, float angle, bool moveFurther)
{
    // ignore movement request if target not exist
    if (!target)
        return;

    if (GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
    {
        if (m_owner->GetTypeId() == TYPEID_PLAYER)
        {
            auto gen = (ChaseMovementGenerator<Player>*)top();
            gen->SetMovementParameters(dist, angle, moveFurther);
            gen->SetNewTarget(*target);
        }
        else
        {
            auto gen = (ChaseMovementGenerator<Creature>*)top();
            gen->SetMovementParameters(dist, angle, moveFurther);
            gen->SetNewTarget(*target);
        }
        top()->Reset(*m_owner);
        return;
    }

    DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s chase to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str());

    if (m_owner->GetTypeId() == TYPEID_PLAYER)
        Mutate(new ChaseMovementGenerator<Player>(*target, dist, angle, moveFurther));
    else
        Mutate(new ChaseMovementGenerator<Creature>(*target, dist, angle, moveFurther));
}
예제 #3
0
void MotionMaster::UpdateMotion(uint32 diff)
{
    if (!_owner)
        return;
	// zhang hong chao add flee condition
	if (_owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED) && 
		GetCurrentMovementGeneratorType() != ASSISTANCE_MOTION_TYPE &&
		GetCurrentMovementGeneratorType() != TIMED_FLEEING_MOTION_TYPE &&
		GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE) {  // what about UNIT_STATE_DISTRACTED? Why is this not included?
		return;
	}

    ASSERT(!empty());

    _cleanFlag |= MMCF_UPDATE;
    if (!top()->Update(_owner, diff))
    {
        _cleanFlag &= ~MMCF_UPDATE;
        MovementExpired();
    }
    else
        _cleanFlag &= ~MMCF_UPDATE;

    if (_expList)
    {
        for (size_t i = 0; i < _expList->size(); ++i)
        {
            MovementGenerator* mg = (*_expList)[i];
            DirectDelete(mg);
        }

        delete _expList;
        _expList = NULL;

        if (empty())
            Initialize();
        else if (needInitTop())
            InitTop();
        else if (_cleanFlag & MMCF_RESET)
            top()->Reset(_owner);

        _cleanFlag &= ~MMCF_RESET;
    }

    // probably not the best place to pu this but im not really sure where else to put it.
    _owner->UpdateUnderwaterState(_owner->GetMap(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ());
}
예제 #4
0
void MotionMaster::MoveCharge(float x, float y, float z, float speed /*= BASE_CHARGE_SPEED*/, uint32 id /*= EVENT_CHARGE*/, bool generatePath /*= false*/)
{
    if (GetCurrentMovementGeneratorType() != DISTRACT_MOTION_TYPE)
        return;

    if (m_owner->GetTypeId() == TYPEID_PLAYER)
    {
        DEBUG_LOG("misc", "Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", m_owner->GetGUIDLow(), x, y, z);
        Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath, speed));
    }
    else
    {
        DEBUG_LOG("misc", "Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)",
            m_owner->GetEntry(), m_owner->GetGUIDLow(), x, y, z);
        Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath, speed));
    }
}
예제 #5
0
void
MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id)
{
    if (GetCurrentMovementGeneratorType() != DISTRACT_MOTION_TYPE)
        return;

    i_owner->addUnitState(UNIT_STAT_FLEEING_MOVE);
    if (i_owner->GetTypeId() == TYPEID_PLAYER)
    {
        //sLog->outStaticDebug("Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", i_owner->GetGUIDLow(), x, y, z);
        Mutate(new PointMovementGenerator<Player>(id,x,y,z));
    }
    else
    {
        /*sLog->outStaticDebug("Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)",
            i_owner->GetEntry(), i_owner->GetGUIDLow(), x, y, z);*/
        Mutate(new PointMovementGenerator<Creature>(id,x,y,z));
    }
}
예제 #6
0
void MotionMaster::MoveWaypoint()
{
    if (m_owner->GetTypeId() == TYPEID_UNIT)
    {
        if (GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
        {
            sLog.outError("Creature %s (Entry %u) attempt to MoveWaypoint() but creature is already using waypoint", m_owner->GetGuidStr().c_str(), m_owner->GetEntry());
            return;
        }

        Creature* creature = (Creature*)m_owner;

        DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "Creature %s (Entry %u) start MoveWaypoint()", m_owner->GetGuidStr().c_str(), m_owner->GetEntry());
        Mutate(new WaypointMovementGenerator<Creature>(*creature));
    }
    else
    {
        sLog.outError("Non-creature %s attempt to MoveWaypoint()", m_owner->GetGuidStr().c_str());
    }
}
예제 #7
0
void MotionMaster::MoveWaypoint(int32 id /*=0*/, uint32 source /*=0==PATH_NO_PATH*/, uint32 initialDelay /*=0*/, uint32 overwriteEntry /*=0*/)
{
    if (m_owner->GetTypeId() == TYPEID_UNIT)
    {
        if (GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
        {
            sLog.outError("%s attempt to MoveWaypoint() but is already using waypoint", m_owner->GetGuidStr().c_str());
            return;
        }

        Creature* creature = (Creature*)m_owner;

        DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s start MoveWaypoint()", m_owner->GetGuidStr().c_str());
        WaypointMovementGenerator<Creature>* newWPMMgen = new WaypointMovementGenerator<Creature>(*creature);
        Mutate(newWPMMgen);
        newWPMMgen->InitializeWaypointPath(*creature, id, (WaypointPathOrigin)source, initialDelay, overwriteEntry);
    }
    else
    {
        sLog.outError("Non-creature %s attempt to MoveWaypoint()", m_owner->GetGuidStr().c_str());
    }
}