Skip to content

Commit

Permalink
Implement OnEventHappened
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Oct 10, 2017
1 parent fe88336 commit bbd40ba
Show file tree
Hide file tree
Showing 17 changed files with 131 additions and 7 deletions.
8 changes: 8 additions & 0 deletions src/game/AI/BaseAI/CreatureAI.h
Expand Up @@ -352,6 +352,14 @@ class CreatureAI
*/
virtual void ReceiveAIEvent(AIEventType /*eventType*/, Creature* /*pSender*/, Unit* /*pInvoker*/, uint32 /*miscValue*/) {}

/**
* Called when a Game Event starts or ends
* @param eventId to specify id of event from database
* @param activate to specify if it started or stopped
* @param resume to specify whether it launched normally or was resumed after a restart
*/
virtual void OnEventHappened(uint16 /*eventId*/, bool /*activate*/, bool /*resume*/) {}

protected:
void HandleMovementOnAttackStart(Unit* victim) const;

Expand Down
2 changes: 2 additions & 0 deletions src/game/AI/BaseAI/GameObjectAI.h
Expand Up @@ -13,6 +13,8 @@ class GameObjectAI

virtual void UpdateAI(const uint32 /*diff*/) {}

virtual void OnEventHappened(uint16 /*eventId*/, bool /*activate*/, bool /*resume*/) {}

protected:
GameObject* m_go;
};
Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Corpse.cpp
Expand Up @@ -50,7 +50,7 @@ void Corpse::AddToWorld()
if (!IsInWorld())
sObjectAccessor.AddObject(this);

Object::AddToWorld();
WorldObject::AddToWorld();
}

void Corpse::RemoveFromWorld()
Expand Down
2 changes: 2 additions & 0 deletions src/game/Entities/Creature.h
Expand Up @@ -786,6 +786,8 @@ class Creature : public Unit

void SetVirtualItem(VirtualItemSlot slot, uint32 item_id) { SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot, item_id); }

void OnEventHappened(uint16 eventId, bool activate, bool resume) override { return AI()->OnEventHappened(eventId, activate, resume); }

protected:
bool MeetsSelectAttackingRequirement(Unit* pTarget, SpellEntry const* pSpellInfo, uint32 selectFlags, SelectAttackingTargetParams params) const;

Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/DynamicObject.cpp
Expand Up @@ -41,7 +41,7 @@ void DynamicObject::AddToWorld()
if (!IsInWorld())
GetMap()->GetObjectsStore().insert<DynamicObject>(GetObjectGuid(), (DynamicObject*)this);

Object::AddToWorld();
WorldObject::AddToWorld();
}

void DynamicObject::RemoveFromWorld()
Expand Down
5 changes: 4 additions & 1 deletion src/game/Entities/GameObject.cpp
Expand Up @@ -88,7 +88,7 @@ void GameObject::AddToWorld()
if (m_model)
GetMap()->InsertGameObjectModel(*m_model);

Object::AddToWorld();
WorldObject::AddToWorld();

// After Object::AddToWorld so that for initial state the GO is added to the world (and hence handled correctly)
UpdateCollisionState();
Expand Down Expand Up @@ -706,6 +706,8 @@ bool GameObject::LoadFromDB(uint32 guid, Map* map)
}
}

AIM_Initialize();

return true;
}

Expand Down Expand Up @@ -985,6 +987,7 @@ void GameObject::SummonLinkedTrapIfAny() const
}

GetMap()->Add(linkedGO);
linkedGO->AIM_Initialize();
}

void GameObject::TriggerLinkedGameObject(Unit* target) const
Expand Down
1 change: 1 addition & 0 deletions src/game/Entities/GameObject.h
Expand Up @@ -799,6 +799,7 @@ class GameObject : public WorldObject

uint32 GetScriptId() const;
void AIM_Initialize();
void OnEventHappened(uint16 eventId, bool activate, bool resume) override { return m_AI->OnEventHappened(eventId, activate, resume); }

GameObjectModel* m_model;

Expand Down
38 changes: 35 additions & 3 deletions src/game/Entities/Object.cpp
Expand Up @@ -1034,9 +1034,9 @@ void Object::ForceValuesUpdateAtIndex(uint32 index)
}

WorldObject::WorldObject() :
m_transportInfo(nullptr), m_currMap(nullptr),
m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL),
m_isActiveObject(false)
m_transportInfo(nullptr), m_isOnEventNotified(false),
m_currMap(nullptr), m_mapId(0),
m_InstanceId(0), m_isActiveObject(false), m_phaseMask(PHASEMASK_NORMAL)
{
}

Expand Down Expand Up @@ -1674,6 +1674,22 @@ void WorldObject::SetMap(Map* map)
m_InstanceId = map->GetInstanceId();
}

void WorldObject::AddToWorld()
{
if (m_isOnEventNotified)
m_currMap->AddToOnEventNotified(this);

Object::AddToWorld();
}

void WorldObject::RemoveFromWorld()
{
if (m_isOnEventNotified)
m_currMap->RemoveFromOnEventNotified(this);

Object::RemoveFromWorld();
}

TerrainInfo const* WorldObject::GetTerrain() const
{
MANGOS_ASSERT(m_currMap);
Expand Down Expand Up @@ -2074,6 +2090,22 @@ void WorldObject::SetActiveObjectState(bool active)
m_isActiveObject = active;
}

void WorldObject::SetNotifyOnEventState(bool state)
{
if (state == m_isOnEventNotified)
return;

m_isOnEventNotified = state;

if (!IsInWorld())
return;

if (state)
GetMap()->AddToOnEventNotified(this);
else
GetMap()->RemoveFromOnEventNotified(this);
}

void WorldObject::AddGCD(SpellEntry const& spellEntry, uint32 forcedDuration /*= 0*/, bool /*updateClient = false*/)
{
uint32 gcdRecTime = forcedDuration ? forcedDuration : spellEntry.StartRecoveryTime;
Expand Down
10 changes: 10 additions & 0 deletions src/game/Entities/Object.h
Expand Up @@ -812,6 +812,14 @@ class WorldObject : public Object
// ASSERT print helper
bool PrintCoordinatesError(float x, float y, float z, char const* descr) const;

// Game Event Notification system
virtual bool IsNotifyOnEventObject() { return m_isOnEventNotified; }
virtual void OnEventHappened(uint16 event_id, bool activate, bool resume) {}
void SetNotifyOnEventState(bool state);

virtual void AddToWorld() override;
virtual void RemoveFromWorld() override;

// cooldown system
virtual void AddGCD(SpellEntry const& spellEntry, uint32 forcedDuration = 0, bool updateClient = false);
virtual bool HaveGCD(SpellEntry const* spellEntry) const;
Expand Down Expand Up @@ -850,6 +858,8 @@ class WorldObject : public Object

TransportInfo* m_transportInfo;

bool m_isOnEventNotified;

private:
Map* m_currMap; // current object's Map location

Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Unit.cpp
Expand Up @@ -10395,7 +10395,7 @@ uint32 Unit::GetCreatePowers(Powers power) const

void Unit::AddToWorld()
{
Object::AddToWorld();
WorldObject::AddToWorld();
ScheduleAINotify(0);
}

Expand Down
13 changes: 13 additions & 0 deletions src/game/GameEvents/GameEventMgr.cpp
Expand Up @@ -695,6 +695,8 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
UpdateEventQuests(event_id, false);
UpdateWorldStates(event_id, false);
SendEventMails(event_nid);

OnEventHappened(event_id, false, false);
}

void GameEventMgr::ApplyNewEvent(uint16 event_id, bool resume)
Expand Down Expand Up @@ -725,6 +727,8 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id, bool resume)
// Not send mails at game event startup, if game event just resume after server shutdown (has been active at server before shutdown)
if (!resume)
SendEventMails(event_id);

OnEventHappened(event_id, true, resume);
}

void GameEventMgr::GameEventSpawn(int16 event_id)
Expand Down Expand Up @@ -1059,3 +1063,12 @@ bool IsHolidayActive(HolidayIds id)
{
return sGameEventMgr.IsActiveHoliday(id);
}

void GameEventMgr::OnEventHappened(uint16 event_id, bool activate, bool resume)
{
sMapMgr.DoForAllMaps([event_id, activate, resume](Map* map) -> void
{
if (map->GetInstanceData())
map->OnEventHappened(event_id, activate, resume);
});
}
1 change: 1 addition & 0 deletions src/game/GameEvents/GameEventMgr.h
Expand Up @@ -103,6 +103,7 @@ class GameEventMgr
void UpdateEventQuests(uint16 event_id, bool activate);
void UpdateWorldStates(uint16 event_id, bool activate);
void SendEventMails(int16 event_id);
void OnEventHappened(uint16 event_id, bool activate, bool resume);
protected:
typedef std::list<uint32> GuidList;
typedef std::list<uint16> IdList;
Expand Down
3 changes: 3 additions & 0 deletions src/game/Maps/InstanceData.h
Expand Up @@ -114,6 +114,9 @@ class InstanceData
// called on creature despawn
virtual void OnCreatureDespawn(Creature* /*creature*/) {}

// called on game event
virtual void OnEventHappened(uint16 /*event_id*/, bool /*activate*/, bool /*resume*/) {}

// All-purpose data storage 64 bit
virtual uint64 GetData64(uint32 /*Data*/) const { return 0; }
virtual void SetData64(uint32 /*Data*/, uint64 /*Value*/) { }
Expand Down
28 changes: 28 additions & 0 deletions src/game/Maps/Map.cpp
Expand Up @@ -1153,6 +1153,24 @@ void Map::RemoveFromActive(WorldObject* obj)
}
}

void Map::AddToOnEventNotified(WorldObject* obj)
{
m_onEventNotifiedObjects.insert(obj);
}

void Map::RemoveFromOnEventNotified(WorldObject* obj)
{
if (m_onEventNotifiedIter != m_onEventNotifiedObjects.end())
{
auto itr = m_onEventNotifiedObjects.find(obj);
if (itr == m_onEventNotifiedIter)
++m_onEventNotifiedIter;
m_onEventNotifiedObjects.erase(obj);
}
else
m_onEventNotifiedObjects.erase(obj);
}

void Map::CreateInstanceData(bool load)
{
if (i_data != nullptr)
Expand Down Expand Up @@ -2282,3 +2300,13 @@ bool Map::IsMountAllowed() const

return true;
}

void Map::OnEventHappened(uint16 event_id, bool activate, bool resume)
{
if (i_data)
i_data->OnEventHappened(event_id, activate, resume);

for (m_onEventNotifiedIter = m_onEventNotifiedObjects.begin(); m_onEventNotifiedIter != m_onEventNotifiedObjects.end(); ++m_onEventNotifiedIter)
if ((*m_onEventNotifiedIter)->IsInWorld())
(*m_onEventNotifiedIter)->OnEventHappened(event_id, activate, resume);
}
8 changes: 8 additions & 0 deletions src/game/Maps/Map.h
Expand Up @@ -232,6 +232,11 @@ class Map : public GridRefManager<NGridType>
// must called with RemoveFromWorld
void RemoveFromActive(WorldObject* obj);

// Game Event notification system
void AddToOnEventNotified(WorldObject * obj);
void RemoveFromOnEventNotified(WorldObject * obj);
void OnEventHappened(uint16 event_id, bool activate, bool resume);

Player* GetPlayer(ObjectGuid guid);
Creature* GetCreature(ObjectGuid guid);
Pet* GetPet(ObjectGuid guid);
Expand Down Expand Up @@ -355,6 +360,9 @@ class Map : public GridRefManager<NGridType>
ActiveNonPlayers::iterator m_activeNonPlayersIter;
MapStoredObjectTypesContainer m_objectsStore;

std::set<WorldObject*> m_onEventNotifiedObjects;
std::set<WorldObject*>::iterator m_onEventNotifiedIter;

private:
time_t i_gridExpiry;

Expand Down
6 changes: 6 additions & 0 deletions src/game/Maps/MapManager.h
Expand Up @@ -149,6 +149,12 @@ class MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::ClassLevelLockab
template<typename Do>
void DoForAllMapsWithMapId(uint32 mapId, Do& _do);

void DoForAllMaps(std::function<void(Map*)> worker)
{
for (MapMapType::const_iterator itr = i_maps.begin(); itr != i_maps.end(); ++itr)
worker(itr->second);
}

private:

// debugging code, should be deleted some day
Expand Down
7 changes: 7 additions & 0 deletions src/game/Spells/SpellEffects.cpp
Expand Up @@ -1081,6 +1081,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)
pGameObj->SetSpellId(m_spellInfo->Id);

map->Add(pGameObj);
pGameObj->AIM_Initialize();
return;
}
case 19869: // Dragon Orb
Expand Down Expand Up @@ -1186,6 +1187,7 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx)

DEBUG_LOG("AddObject at SpellEfects.cpp EffectDummy");
map->Add(pGameObj);
pGameObj->AIM_Initialize();

return;
}
Expand Down Expand Up @@ -7462,6 +7464,7 @@ void Spell::EffectSummonObjectWild(SpellEffectIndex eff_idx)

// Wild object not have owner and check clickable by players
map->Add(pGameObj);
pGameObj->AIM_Initialize();

// Store the GO to the caster
m_caster->AddWildGameObject(pGameObj);
Expand Down Expand Up @@ -10618,6 +10621,8 @@ void Spell::EffectDuel(SpellEffectIndex eff_idx)

m_caster->AddGameObject(pGameObj);
map->Add(pGameObj);
pGameObj->AIM_Initialize();

// END

// Send request
Expand Down Expand Up @@ -11088,6 +11093,7 @@ void Spell::EffectSummonObject(SpellEffectIndex eff_idx)
m_caster->AddGameObject(pGameObj);

map->Add(pGameObj);
pGameObj->AIM_Initialize();

m_caster->m_ObjectSlotGuid[slot] = pGameObj->GetObjectGuid();

Expand Down Expand Up @@ -11708,6 +11714,7 @@ void Spell::EffectTransmitted(SpellEffectIndex eff_idx)
// m_ObjToDel.push_back(pGameObj);

cMap->Add(pGameObj);
pGameObj->AIM_Initialize();

pGameObj->SummonLinkedTrapIfAny();

Expand Down

0 comments on commit bbd40ba

Please sign in to comment.