diff options
author | Shocker <shocker@freakz.ro> | 2013-05-26 04:28:19 +0300 |
---|---|---|
committer | Shocker <shocker@freakz.ro> | 2013-05-26 04:28:19 +0300 |
commit | 1ef3dd29b84f48eb61f4d0104cb3277aa9a6a807 (patch) | |
tree | d91db646e8f9870fb070f37206f3089366618ed1 /src | |
parent | c0f94d944ff44f194e9b9d3a3fad6d91bde17029 (diff) |
Core/Misc: Implement AreaTrigger entity
(might need some cleanup)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 110 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 47 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 13 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.h | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Grids/GridDefines.h | 7 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 14 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 49 | ||||
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.h | 1 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 5 |
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 ******* */ |