dtQueryFilter PathInfo::createFilter() { dtQueryFilter filter; if (m_sourceUnit->GetTypeId() != TYPEID_UNIT) return filter; Creature* creature = (Creature*)m_sourceUnit; unsigned short includeFlags = 0; unsigned short excludeFlags = 0; if (creature->canWalk()) includeFlags |= NAV_GROUND; // walk // creatures don't take environmental damage if (creature->canSwim() || creature->isPet()) includeFlags |= (NAV_WATER | NAV_MAGMA | NAV_SLIME); // swim // allow creatures to cheat and use different movement types if they are moved // forcefully into terrain they can't normally move in if (creature->IsInWater() || creature->IsUnderWater()) includeFlags |= getNavTerrain(creature->GetPositionX(),creature->GetPositionY(),creature->GetPositionZ()); filter.setIncludeFlags(includeFlags); filter.setExcludeFlags(excludeFlags); return filter; }
void PathInfo::updateFilter() { // allow creatures to cheat and use different movement types if they are moved // forcefully into terrain they can't normally move in if (m_sourceUnit->IsInWater() || m_sourceUnit->IsUnderWater()) { unsigned short includedFlags = m_filter.getIncludeFlags(); includedFlags |= getNavTerrain(m_sourceUnit->GetPositionX(), m_sourceUnit->GetPositionY(), m_sourceUnit->GetPositionZ()); m_filter.setIncludeFlags(includedFlags); } }
dtQueryFilter PathInfo::createFilter() { dtQueryFilter filter; if(m_sourceObject->GetTypeId() != TYPEID_UNIT) return filter; Creature* creature = (Creature*)m_sourceObject; filter.includeFlags = 0; filter.excludeFlags = 0; if(creature->canWalk()) { filter.includeFlags |= NAV_GROUND; // walk filter.includeFlags |= NAV_SHALLOW_WATER; // any creature can walk through shallow water } if(creature->canSwim()) filter.includeFlags |= NAV_WATER; // swim else { // TODO: check size of creature to determine NAV_AVERAGE_WATER and NAV_DEEP_WATER } // TODO: check for NAV_MAGMA //if(creature->IsImmunedToDamage(SPELL_SCHOOL_MASK_FIRE)) // immune to fire damage - valid? // TODO: check for NAV_SLIME // allow creatures to cheat and use different movement types if they are moved // forcefully into terrain they can't normally move in if(creature->IsInWater() || creature->IsUnderWater()) filter.includeFlags |= getNavTerrain(creature->GetPositionX(),creature->GetPositionY(),creature->GetPositionZ()); return filter; }