aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShocker <shocker@freakz.ro>2013-05-26 04:28:19 +0300
committerShocker <shocker@freakz.ro>2013-05-26 04:28:19 +0300
commit1ef3dd29b84f48eb61f4d0104cb3277aa9a6a807 (patch)
treed91db646e8f9870fb070f37206f3089366618ed1 /src/server
parentc0f94d944ff44f194e9b9d3a3fad6d91bde17029 (diff)
Core/Misc: Implement AreaTrigger entity
(might need some cleanup)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp110
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h47
-rw-r--r--src/server/game/Entities/Object/Object.cpp5
-rw-r--r--src/server/game/Entities/Object/Object.h6
-rw-r--r--src/server/game/Entities/Object/ObjectDefines.h13
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp9
-rw-r--r--src/server/game/Globals/ObjectAccessor.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp6
-rw-r--r--src/server/game/Globals/ObjectMgr.h1
-rw-r--r--src/server/game/Grids/GridDefines.h7
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.cpp1
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h14
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h49
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp3
-rw-r--r--src/server/game/Grids/ObjectGridLoader.h1
-rw-r--r--src/server/game/Maps/Map.cpp5
16 files changed, 272 insertions, 6 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
new file mode 100644
index 00000000000..e50ea02ec84
--- /dev/null
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Common.h"
+#include "UpdateMask.h"
+#include "Opcodes.h"
+#include "World.h"
+#include "ObjectAccessor.h"
+#include "AreaTrigger.h"
+
+AreaTrigger::AreaTrigger() : WorldObject(false), _duration(0)
+{
+ m_objectType |= TYPEMASK_AREATRIGGER;
+ m_objectTypeId = TYPEID_AREATRIGGER;
+
+ m_updateFlag = UPDATEFLAG_STATIONARY_POSITION;
+
+ m_valuesCount = AREATRIGGER_END;
+}
+
+AreaTrigger::~AreaTrigger()
+{
+}
+
+void AreaTrigger::AddToWorld()
+{
+ ///- Register the AreaTrigger for guid lookup and for caster
+ if (!IsInWorld())
+ {
+ sObjectAccessor->AddObject(this);
+ WorldObject::AddToWorld();
+ }
+}
+
+void AreaTrigger::RemoveFromWorld()
+{
+ ///- Remove the AreaTrigger from the accessor and from all lists of objects in world
+ if (IsInWorld())
+ {
+ if (!IsInWorld())
+ return;
+
+ WorldObject::RemoveFromWorld();
+ sObjectAccessor->RemoveObject(this);
+ }
+}
+
+bool AreaTrigger::CreateAreaTrigger(uint32 guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos)
+{
+ SetMap(caster->GetMap());
+ Relocate(pos);
+ if (!IsPositionValid())
+ {
+ sLog->outError(LOG_FILTER_GENERAL, "AreaTrigger (spell %u) not created. Invalid coordinates (X: %f Y: %f)", spell->Id, GetPositionX(), GetPositionY());
+ return false;
+ }
+
+ WorldObject::_Create(guidlow, HIGHGUID_AREATRIGGER, caster->GetPhaseMask());
+
+ SetEntry(triggerEntry);
+ SetDuration(spell->GetDuration());
+ SetObjectScale(1);
+
+ SetUInt32Value(AREATRIGGER_SPELLVISUALID, spell->SpellVisual[0]);
+ SetUInt32Value(AREATRIGGER_SPELLID, spell->Id);
+ SetUInt32Value(AREATRIGGER_DURATION, spell->GetDuration());
+ SetFloatValue(AREATRIGGER_FINAL_POS + 0, pos.GetPositionX() + 5.0f);
+ SetFloatValue(AREATRIGGER_FINAL_POS + 1, pos.GetPositionY() + 5.0f);
+ SetFloatValue(AREATRIGGER_FINAL_POS + 2, pos.GetPositionZ());
+
+ if (!GetMap()->AddToMap(this))
+ return false;
+
+ return true;
+}
+
+void AreaTrigger::Update(uint32 p_time)
+{
+ if (GetDuration() > int32(p_time))
+ _duration -= p_time;
+ else
+ Remove(); // expired
+
+ Object::Update(p_time);
+}
+
+void AreaTrigger::Remove()
+{
+ if (IsInWorld())
+ {
+ SendObjectDeSpawnAnim(GetGUID());
+ RemoveFromWorld();
+ AddObjectToRemoveList();
+ }
+}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
new file mode 100644
index 00000000000..8f4507cfe40
--- /dev/null
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITYCORE_AREATRIGGER_H
+#define TRINITYCORE_AREATRIGGER_H
+
+#include "Object.h"
+
+class Unit;
+class SpellInfo;
+
+class AreaTrigger : public WorldObject, public GridObject<AreaTrigger>
+{
+ public:
+ AreaTrigger();
+ ~AreaTrigger();
+
+ void AddToWorld();
+ void RemoveFromWorld();
+
+ bool CreateAreaTrigger(uint32 guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos);
+ void Update(uint32 p_time);
+ void Remove();
+ uint32 GetSpellId() const { return GetUInt32Value(AREATRIGGER_SPELLID); }
+ int32 GetDuration() const { return _duration; }
+ void SetDuration(int32 newDuration) { _duration = newDuration; }
+ void Delay(int32 delaytime) { SetDuration(GetDuration() - delaytime); }
+
+ protected:
+ int32 _duration;
+};
+#endif
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 06c9b76c6d8..bcd09c4cfde 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -64,6 +64,7 @@ uint32 GuidHigh2TypeId(uint32 guid_hi)
case HIGHGUID_GAMEOBJECT: return TYPEID_GAMEOBJECT;
case HIGHGUID_DYNAMICOBJECT:return TYPEID_DYNAMICOBJECT;
case HIGHGUID_CORPSE: return TYPEID_CORPSE;
+ case HIGHGUID_AREATRIGGER: return TYPEID_AREATRIGGER;
case HIGHGUID_MO_TRANSPORT: return TYPEID_GAMEOBJECT;
case HIGHGUID_VEHICLE: return TYPEID_UNIT;
}
@@ -197,6 +198,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
case HIGHGUID_PET:
case HIGHGUID_CORPSE:
case HIGHGUID_DYNAMICOBJECT:
+ case HIGHGUID_AREATRIGGER:
updateType = UPDATETYPE_CREATE_OBJECT2;
break;
case HIGHGUID_UNIT:
@@ -1046,6 +1048,9 @@ uint32 Object::GetUpdateFieldData(Player const* target, uint32*& flags) const
if (ToCorpse()->GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER;
break;
+ case TYPEID_AREATRIGGER:
+ flags = AreaTriggerUpdateFieldFlags;
+ break;
case TYPEID_OBJECT:
break;
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 324a454de55..6e9c403a630 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -54,6 +54,7 @@ enum TypeMask
TYPEMASK_GAMEOBJECT = 0x0020,
TYPEMASK_DYNAMICOBJECT = 0x0040,
TYPEMASK_CORPSE = 0x0080,
+ TYPEMASK_AREATRIGGER = 0x0100,
TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
@@ -66,10 +67,11 @@ enum TypeID
TYPEID_PLAYER = 4,
TYPEID_GAMEOBJECT = 5,
TYPEID_DYNAMICOBJECT = 6,
- TYPEID_CORPSE = 7
+ TYPEID_CORPSE = 7,
+ TYPEID_AREATRIGGER = 8
};
-#define NUM_CLIENT_OBJECT_TYPES 8
+#define NUM_CLIENT_OBJECT_TYPES 9
uint32 GuidHigh2TypeId(uint32 guid_hi);
diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h
index bf167510c38..5cbcde20bea 100644
--- a/src/server/game/Entities/Object/ObjectDefines.h
+++ b/src/server/game/Entities/Object/ObjectDefines.h
@@ -33,6 +33,7 @@ enum HighGuid
HIGHGUID_VEHICLE = 0xF15, // blizz F550
HIGHGUID_DYNAMICOBJECT = 0xF10, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100
+ HIGHGUID_AREATRIGGER = 0xF102, // blizz F100
HIGHGUID_BATTLEGROUND = 0x1F1, // new 4.x
HIGHGUID_MO_TRANSPORT = 0x1FC, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
HIGHGUID_GROUP = 0x1F5,
@@ -64,6 +65,7 @@ inline bool IS_CORPSE_GUID(uint64 guid);
inline bool IS_TRANSPORT_GUID(uint64 guid);
inline bool IS_MO_TRANSPORT_GUID(uint64 guid);
inline bool IS_GROUP_GUID(uint64 guid);
+inline bool IS_AREATRIGGER_GUID(uint64 guid);
// l - OBJECT_FIELD_GUID
// e - OBJECT_FIELD_ENTRY for GO (except GAMEOBJECT_TYPE_MO_TRANSPORT) and creatures or UNIT_FIELD_PETNUMBER for pets
@@ -193,15 +195,20 @@ bool IS_GROUP_GUID(uint64 guid)
return GUID_HIPART(guid) == HIGHGUID_GROUP;
}
+bool IS_AREATRIGGER_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_AREATRIGGER;
+}
+
uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h)
{
- return uint64(uint64(l) | (uint64(e) << 32) | (uint64(h) << ((h == HIGHGUID_CORPSE) ? 48 : 52)));
+ return uint64(uint64(l) | (uint64(e) << 32) | (uint64(h) << ((h == HIGHGUID_CORPSE || h == HIGHGUID_AREATRIGGER) ? 48 : 52)));
}
uint32 GUID_HIPART(uint64 guid)
{
uint32 t = ((uint64(guid) >> 48) & 0x0000FFFF);
- return (t == HIGHGUID_CORPSE) ? t : ((t >> 4) & 0x00000FFF);
+ return (t == HIGHGUID_CORPSE || t == HIGHGUID_AREATRIGGER) ? t : ((t >> 4) & 0x00000FFF);
}
uint32 GUID_ENPART(uint64 x)
@@ -234,6 +241,7 @@ bool IsGuidHaveEnPart(uint64 guid)
case HIGHGUID_PET:
case HIGHGUID_VEHICLE:
case HIGHGUID_MO_TRANSPORT:
+ case HIGHGUID_AREATRIGGER:
default:
return true;
}
@@ -255,6 +263,7 @@ char const* GetLogNameForGuid(uint64 guid)
case HIGHGUID_MO_TRANSPORT: return "mo_transport";
case HIGHGUID_GROUP: return "group";
case HIGHGUID_GUILD: return "guild";
+ case HIGHGUID_AREATRIGGER: return "areatrigger";
default:
return "<unknown>";
}
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp
index afc27b74ecc..e9c8ea57ce2 100644
--- a/src/server/game/Globals/ObjectAccessor.cpp
+++ b/src/server/game/Globals/ObjectAccessor.cpp
@@ -94,6 +94,7 @@ WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, uint64 guid)
case HIGHGUID_UNIT: return GetCreature(p, guid);
case HIGHGUID_PET: return GetPet(p, guid);
case HIGHGUID_DYNAMICOBJECT: return GetDynamicObject(p, guid);
+ case HIGHGUID_AREATRIGGER: return GetAreaTrigger(p, guid);
case HIGHGUID_CORPSE: return GetCorpse(p, guid);
default: return NULL;
}
@@ -130,6 +131,9 @@ Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const& p, uint64 guid, u
if (typemask & TYPEMASK_DYNAMICOBJECT)
return GetDynamicObject(p, guid);
break;
+ case HIGHGUID_AREATRIGGER:
+ if (typemask & TYPEMASK_AREATRIGGER)
+ return GetAreaTrigger(p, guid);
case HIGHGUID_CORPSE:
break;
}
@@ -152,6 +156,11 @@ DynamicObject* ObjectAccessor::GetDynamicObject(WorldObject const& u, uint64 gui
return GetObjectInMap(guid, u.GetMap(), (DynamicObject*)NULL);
}
+AreaTrigger* ObjectAccessor::GetAreaTrigger(WorldObject const& u, uint64 guid)
+{
+ return GetObjectInMap(guid, u.GetMap(), (AreaTrigger*)NULL);
+}
+
Unit* ObjectAccessor::GetUnit(WorldObject const& u, uint64 guid)
{
return GetObjectInMap(guid, u.GetMap(), (Unit*)NULL);
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index 1abe3550729..67af4ba0218 100644
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -146,6 +146,7 @@ class ObjectAccessor
static Corpse* GetCorpse(WorldObject const& u, uint64 guid);
static GameObject* GetGameObject(WorldObject const& u, uint64 guid);
static DynamicObject* GetDynamicObject(WorldObject const& u, uint64 guid);
+ static AreaTrigger* GetAreaTrigger(WorldObject const& u, uint64 guid);
static Unit* GetUnit(WorldObject const&, uint64 guid);
static Creature* GetCreature(WorldObject const& u, uint64 guid);
static Pet* GetPet(WorldObject const&, uint64 guid);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 48f8cdab927..f140e3147fb 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -239,6 +239,7 @@ ObjectMgr::ObjectMgr():
_hiGoGuid(1),
_hiDoGuid(1),
_hiCorpseGuid(1),
+ _hiAreaTriggerGuid(1),
_hiMoTransGuid(1)
{
for (uint8 i = 0; i < MAX_CLASSES; ++i)
@@ -6210,6 +6211,11 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
ASSERT(_hiCorpseGuid < 0xFFFFFFFE && "Corpse guid overflow!");
return _hiCorpseGuid++;
}
+ case HIGHGUID_AREATRIGGER:
+ {
+ ASSERT(_hiAreaTriggerGuid < 0xFFFFFFFE && "AreaTrigger guid overflow!");
+ return _hiAreaTriggerGuid++;
+ }
case HIGHGUID_DYNAMICOBJECT:
{
ASSERT(_hiDoGuid < 0xFFFFFFFE && "DynamicObject guid overflow!");
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index e5a57d81321..793f32de6bf 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1260,6 +1260,7 @@ class ObjectMgr
uint32 _hiGoGuid;
uint32 _hiDoGuid;
uint32 _hiCorpseGuid;
+ uint32 _hiAreaTriggerGuid;
uint32 _hiMoTransGuid;
QuestMap _questTemplates;
diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h
index ad48e4fd128..0cb2f32f621 100644
--- a/src/server/game/Grids/GridDefines.h
+++ b/src/server/game/Grids/GridDefines.h
@@ -30,6 +30,7 @@ class DynamicObject;
class GameObject;
class Pet;
class Player;
+class AreaTrigger;
#define MAX_NUMBER_OF_CELLS 8
@@ -57,13 +58,14 @@ class Player;
// Creature used instead pet to simplify *::Visit templates (not required duplicate code for Creature->Pet case)
typedef TYPELIST_4(Player, Creature/*pets*/, Corpse/*resurrectable*/, DynamicObject/*farsight target*/) AllWorldObjectTypes;
-typedef TYPELIST_4(GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/) AllGridObjectTypes;
+typedef TYPELIST_5(GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger) AllGridObjectTypes;
typedef GridRefManager<Corpse> CorpseMapType;
typedef GridRefManager<Creature> CreatureMapType;
typedef GridRefManager<DynamicObject> DynamicObjectMapType;
typedef GridRefManager<GameObject> GameObjectMapType;
typedef GridRefManager<Player> PlayerMapType;
+typedef GridRefManager<AreaTrigger> AreaTriggerMapType;
enum GridMapTypeMask
{
@@ -72,7 +74,8 @@ enum GridMapTypeMask
GRID_MAP_TYPE_MASK_DYNAMICOBJECT = 0x04,
GRID_MAP_TYPE_MASK_GAMEOBJECT = 0x08,
GRID_MAP_TYPE_MASK_PLAYER = 0x10,
- GRID_MAP_TYPE_MASK_ALL = 0x1F
+ GRID_MAP_TYPE_MASK_AREATRIGGER = 0x20,
+ GRID_MAP_TYPE_MASK_ALL = 0x3F
};
typedef Grid<Player, AllWorldObjectTypes, AllGridObjectTypes> GridType;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index 24f8cbda1a2..088189737a9 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
@@ -362,3 +362,4 @@ bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Creature* u)
template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &);
template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &);
+template void ObjectUpdater::Visit<AreaTrigger>(AreaTriggerMapType &);
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 72889216e93..073546d7764 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -25,6 +25,7 @@
#include "Corpse.h"
#include "Object.h"
+#include "AreaTrigger.h"
#include "DynamicObject.h"
#include "GameObject.h"
#include "Player.h"
@@ -118,6 +119,7 @@ namespace Trinity
void Visit(GameObjectMapType &m) { updateObjects<GameObject>(m); }
void Visit(DynamicObjectMapType &m) { updateObjects<DynamicObject>(m); }
void Visit(CorpseMapType &m) { updateObjects<Corpse>(m); }
+ void Visit(AreaTriggerMapType &m) { updateObjects<AreaTrigger>(m); }
};
struct MessageDistDeliverer
@@ -183,6 +185,7 @@ namespace Trinity
void Visit(CreatureMapType &m);
void Visit(CorpseMapType &m);
void Visit(DynamicObjectMapType &m);
+ void Visit(AreaTriggerMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
@@ -203,6 +206,7 @@ namespace Trinity
void Visit(CreatureMapType &m);
void Visit(CorpseMapType &m);
void Visit(DynamicObjectMapType &m);
+ void Visit(AreaTriggerMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
@@ -223,6 +227,7 @@ namespace Trinity
void Visit(CorpseMapType &m);
void Visit(GameObjectMapType &m);
void Visit(DynamicObjectMapType &m);
+ void Visit(AreaTriggerMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
@@ -281,6 +286,15 @@ namespace Trinity
i_do(itr->getSource());
}
+ void Visit(AreaTriggerMapType &m)
+ {
+ if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER))
+ return;
+ for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
+ if (itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
+ }
+
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
index 40b2df3706b..6c7d69e57a0 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
@@ -164,6 +164,28 @@ void Trinity::WorldObjectSearcher<Check>::Visit(DynamicObjectMapType &m)
}
}
+template<class Check>
+void Trinity::WorldObjectSearcher<Check>::Visit(AreaTriggerMapType &m)
+{
+ if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER))
+ return;
+
+ // already found
+ if (i_object)
+ return;
+
+ for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
+ {
+ if (!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
+ if (i_check(itr->getSource()))
+ {
+ i_object = itr->getSource();
+ return;
+ }
+ }
+}
template<class Check>
void Trinity::WorldObjectLastSearcher<Check>::Visit(GameObjectMapType &m)
@@ -246,6 +268,22 @@ void Trinity::WorldObjectLastSearcher<Check>::Visit(DynamicObjectMapType &m)
}
template<class Check>
+void Trinity::WorldObjectLastSearcher<Check>::Visit(AreaTriggerMapType &m)
+{
+ if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER))
+ return;
+
+ for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
+ {
+ if (!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
+ if (i_check(itr->getSource()))
+ i_object = itr->getSource();
+ }
+}
+
+template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(PlayerMapType &m)
{
if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER))
@@ -300,6 +338,17 @@ void Trinity::WorldObjectListSearcher<Check>::Visit(DynamicObjectMapType &m)
i_objects.push_back(itr->getSource());
}
+template<class Check>
+void Trinity::WorldObjectListSearcher<Check>::Visit(AreaTriggerMapType &m)
+{
+ if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER))
+ return;
+
+ for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
+ if (i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
+}
+
// Gameobject searchers
template<class Check>
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index 09c9f40899b..3c7833baf15 100644
--- a/src/server/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
@@ -24,6 +24,7 @@
#include "GameObject.h"
#include "DynamicObject.h"
#include "Corpse.h"
+#include "AreaTrigger.h"
#include "World.h"
#include "CellImpl.h"
#include "CreatureAI.h"
@@ -234,7 +235,9 @@ template void ObjectGridUnloader::Visit(CreatureMapType &);
template void ObjectGridUnloader::Visit(GameObjectMapType &);
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
template void ObjectGridUnloader::Visit(CorpseMapType &);
+template void ObjectGridUnloader::Visit(AreaTriggerMapType &);
template void ObjectGridCleaner::Visit(CreatureMapType &);
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
template void ObjectGridCleaner::Visit<DynamicObject>(DynamicObjectMapType &);
template void ObjectGridCleaner::Visit<Corpse>(CorpseMapType &);
+template void ObjectGridCleaner::Visit<AreaTrigger>(AreaTriggerMapType &);
diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h
index 11f91670a5f..dfd308f187e 100644
--- a/src/server/game/Grids/ObjectGridLoader.h
+++ b/src/server/game/Grids/ObjectGridLoader.h
@@ -40,6 +40,7 @@ class ObjectGridLoader
void Visit(CreatureMapType &m);
void Visit(CorpseMapType &) const {}
void Visit(DynamicObjectMapType&) const {}
+ void Visit(AreaTriggerMapType &) const {}
void LoadN(void);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 45ce43bc3fc..54a9fdea264 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2166,6 +2166,9 @@ void Map::RemoveAllObjectsInRemoveList()
case TYPEID_DYNAMICOBJECT:
RemoveFromMap((DynamicObject*)obj, true);
break;
+ case TYPEID_AREATRIGGER:
+ RemoveFromMap((AreaTrigger*)obj, true);
+ break;
case TYPEID_GAMEOBJECT:
RemoveFromMap((GameObject*)obj, true);
break;
@@ -2284,11 +2287,13 @@ template bool Map::AddToMap(Corpse*);
template bool Map::AddToMap(Creature*);
template bool Map::AddToMap(GameObject*);
template bool Map::AddToMap(DynamicObject*);
+template bool Map::AddToMap(AreaTrigger*);
template void Map::RemoveFromMap(Corpse*, bool);
template void Map::RemoveFromMap(Creature*, bool);
template void Map::RemoveFromMap(GameObject*, bool);
template void Map::RemoveFromMap(DynamicObject*, bool);
+template void Map::RemoveFromMap(AreaTrigger*, bool);
/* ******* Dungeon Instance Maps ******* */