Core/AI: some tweaks on boundary functionality:
- Moved SetBoundary to public scope to allow for greater flexibility (ie set from external script) - Extended to allow checking inverted boundaries
This commit is contained in:
1 parent
8070e6ad29
commit
e53e8b8437
3 files changed
+19
-16
No files matched your search
@@ -353,23 +353,18 @@ int32 CreatureAI::VisualizeBoundary(uint32 duration, Unit* owner, bool fill) con
|
||||
|
||||
bool CreatureAI::CheckBoundary(Position const* who) const
|
||||
{
|
||||
if (!_boundary)
|
||||
return true;
|
||||
|
||||
if (!who)
|
||||
who = me;
|
||||
|
||||
if (_boundary)
|
||||
for (AreaBoundary const* areaBoundary : *_boundary)
|
||||
if (!areaBoundary->IsWithinBoundary(who))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return (CreatureAI::IsInBounds(*_boundary, who) != _negateBoundary);
|
||||
}
|
||||
|
||||
bool CreatureAI::IsInBounds(CreatureBoundary const* boundary, Position const* pos)
|
||||
bool CreatureAI::IsInBounds(CreatureBoundary const& boundary, Position const* pos)
|
||||
{
|
||||
if (!boundary)
|
||||
return true;
|
||||
|
||||
for (AreaBoundary const* areaBoundary : *boundary)
|
||||
for (AreaBoundary const* areaBoundary : boundary)
|
||||
if (!areaBoundary->IsWithinBoundary(pos))
|
||||
return false;
|
||||
|
||||
@@ -387,6 +382,13 @@ bool CreatureAI::CheckInRoom()
|
||||
}
|
||||
}
|
||||
|
||||
void CreatureAI::SetBoundary(CreatureBoundary const* boundary, bool negateBoundaries /*= false*/)
|
||||
{
|
||||
_boundary = boundary;
|
||||
_negateBoundary = negateBoundaries;
|
||||
me->DoImmediateBoundaryCheck();
|
||||
}
|
||||
|
||||
Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType)
|
||||
{
|
||||
return me->SummonCreature(entry, pos, summonType, despawnTime);
|
||||
|
||||
@@ -82,7 +82,6 @@ class TC_GAME_API CreatureAI : public UnitAI
|
||||
|
||||
bool CheckBoundary(Position const* who = nullptr) const;
|
||||
|
||||
void SetBoundary(CreatureBoundary const* boundary) { _boundary = boundary; me->DoImmediateBoundaryCheck(); }
|
||||
public:
|
||||
enum EvadeReason
|
||||
{
|
||||
@@ -95,7 +94,7 @@ class TC_GAME_API CreatureAI : public UnitAI
|
||||
|
||||
void Talk(uint8 id, WorldObject const* whisperTarget = nullptr);
|
||||
|
||||
explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), _boundary(nullptr), m_MoveInLineOfSight_locked(false) { }
|
||||
explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), _boundary(nullptr), _negateBoundary(false), m_MoveInLineOfSight_locked(false) { }
|
||||
|
||||
virtual ~CreatureAI() { }
|
||||
|
||||
@@ -200,11 +199,12 @@ class TC_GAME_API CreatureAI : public UnitAI
|
||||
virtual PlayerAI* GetAIForCharmedPlayer(Player* /*who*/) { return nullptr; }
|
||||
|
||||
// intended for encounter design/debugging. do not use for other purposes. expensive.
|
||||
int32 VisualizeBoundary(uint32 duration, Unit* owner=nullptr, bool fill=false) const;
|
||||
int32 VisualizeBoundary(uint32 duration, Unit* owner = nullptr, bool fill = false) const;
|
||||
virtual bool CheckInRoom();
|
||||
CreatureBoundary const* GetBoundary() const { return _boundary; }
|
||||
void SetBoundary(CreatureBoundary const* boundary, bool negativeBoundaries = false);
|
||||
|
||||
static bool IsInBounds(CreatureBoundary const* boundary, Position const* who);
|
||||
static bool IsInBounds(CreatureBoundary const& boundary, Position const* who);
|
||||
|
||||
protected:
|
||||
virtual void MoveInLineOfSight(Unit* /*who*/);
|
||||
@@ -212,6 +212,7 @@ class TC_GAME_API CreatureAI : public UnitAI
|
||||
bool _EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER);
|
||||
|
||||
CreatureBoundary const* _boundary;
|
||||
bool _negateBoundary;
|
||||
|
||||
private:
|
||||
bool m_MoveInLineOfSight_locked;
|
||||
|
||||
@@ -492,7 +492,7 @@ class npc_anubarak_anub_ar_assassin : public CreatureScript
|
||||
Position jumpTo;
|
||||
do
|
||||
jumpTo = GetRandomPositionAround(anubarak);
|
||||
while (!CreatureAI::IsInBounds(boundary, &jumpTo));
|
||||
while (!CreatureAI::IsInBounds(*boundary, &jumpTo));
|
||||
me->GetMotionMaster()->MoveJump(jumpTo, 40.0f, 40.0f);
|
||||
DoCastSelf(SPELL_ASSASSIN_VISUAL, true);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user