[9529] Make Player::IsValidPos const
[getmangos.git] / src / game / GameEventMgr.cpp
blob77d1d417a9a3dddd37e0123a30db568df9a958c5
1 /*
2 * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "GameEventMgr.h"
20 #include "World.h"
21 #include "ObjectMgr.h"
22 #include "ObjectDefines.h"
23 #include "PoolManager.h"
24 #include "ProgressBar.h"
25 #include "Language.h"
26 #include "Log.h"
27 #include "MapManager.h"
28 #include "Policies/SingletonImp.h"
30 INSTANTIATE_SINGLETON_1(GameEventMgr);
32 bool GameEventMgr::CheckOneGameEvent(uint16 entry) const
34 // Get the event information
35 time_t currenttime = time(NULL);
36 if( mGameEvent[entry].start < currenttime && currenttime < mGameEvent[entry].end &&
37 ((currenttime - mGameEvent[entry].start) % (mGameEvent[entry].occurence * MINUTE)) < (mGameEvent[entry].length * MINUTE) )
38 return true;
39 else
40 return false;
43 uint32 GameEventMgr::NextCheck(uint16 entry) const
45 time_t currenttime = time(NULL);
47 // outdated event: we return max
48 if (currenttime > mGameEvent[entry].end)
49 return max_ge_check_delay;
51 // never started event, we return delay before start
52 if (mGameEvent[entry].start > currenttime)
53 return uint32(mGameEvent[entry].start - currenttime);
55 uint32 delay;
56 // in event, we return the end of it
57 if ((((currenttime - mGameEvent[entry].start) % (mGameEvent[entry].occurence * 60)) < (mGameEvent[entry].length * 60)))
58 // we return the delay before it ends
59 delay = (mGameEvent[entry].length * MINUTE) - ((currenttime - mGameEvent[entry].start) % (mGameEvent[entry].occurence * MINUTE));
60 else // not in window, we return the delay before next start
61 delay = (mGameEvent[entry].occurence * MINUTE) - ((currenttime - mGameEvent[entry].start) % (mGameEvent[entry].occurence * MINUTE));
62 // In case the end is before next check
63 if (mGameEvent[entry].end < time_t(currenttime + delay))
64 return uint32(mGameEvent[entry].end - currenttime);
65 else
66 return delay;
69 void GameEventMgr::StartEvent( uint16 event_id, bool overwrite )
71 AddActiveEvent(event_id);
72 ApplyNewEvent(event_id);
73 if(overwrite)
75 mGameEvent[event_id].start = time(NULL);
76 if(mGameEvent[event_id].end <= mGameEvent[event_id].start)
77 mGameEvent[event_id].end = mGameEvent[event_id].start+mGameEvent[event_id].length;
81 void GameEventMgr::StopEvent( uint16 event_id, bool overwrite )
83 RemoveActiveEvent(event_id);
84 UnApplyEvent(event_id);
85 if(overwrite)
87 mGameEvent[event_id].start = time(NULL) - mGameEvent[event_id].length * MINUTE;
88 if(mGameEvent[event_id].end <= mGameEvent[event_id].start)
89 mGameEvent[event_id].end = mGameEvent[event_id].start+mGameEvent[event_id].length;
93 void GameEventMgr::LoadFromDB()
96 QueryResult *result = WorldDatabase.Query("SELECT MAX(entry) FROM game_event");
97 if( !result )
99 sLog.outString(">> Table game_event is empty.");
100 sLog.outString();
101 return;
104 Field *fields = result->Fetch();
106 uint32 max_event_id = fields[0].GetUInt16();
107 delete result;
109 mGameEvent.resize(max_event_id+1);
112 QueryResult *result = WorldDatabase.Query("SELECT entry,UNIX_TIMESTAMP(start_time),UNIX_TIMESTAMP(end_time),occurence,length,holiday,description FROM game_event");
113 if( !result )
115 mGameEvent.clear();
116 sLog.outString(">> Table game_event is empty!");
117 sLog.outString();
118 return;
121 uint32 count = 0;
124 barGoLink bar( (int)result->GetRowCount() );
127 ++count;
128 Field *fields = result->Fetch();
130 bar.step();
132 uint16 event_id = fields[0].GetUInt16();
133 if(event_id==0)
135 sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id);
136 continue;
139 GameEventData& pGameEvent = mGameEvent[event_id];
140 uint64 starttime = fields[1].GetUInt64();
141 pGameEvent.start = time_t(starttime);
142 uint64 endtime = fields[2].GetUInt64();
143 pGameEvent.end = time_t(endtime);
144 pGameEvent.occurence = fields[3].GetUInt32();
145 pGameEvent.length = fields[4].GetUInt32();
146 pGameEvent.holiday_id = fields[5].GetUInt32();
149 if(pGameEvent.length==0) // length>0 is validity check
151 sLog.outErrorDb("`game_event` game event id (%i) have length 0 and can't be used.",event_id);
152 continue;
155 if(pGameEvent.holiday_id)
157 if(!sHolidaysStore.LookupEntry(pGameEvent.holiday_id))
159 sLog.outErrorDb("`game_event` game event id (%i) have not existed holiday id %u.",event_id,pGameEvent.holiday_id);
160 pGameEvent.holiday_id = 0;
164 pGameEvent.description = fields[6].GetCppString();
166 } while( result->NextRow() );
167 delete result;
169 sLog.outString();
170 sLog.outString( ">> Loaded %u game events", count );
173 mGameEventCreatureGuids.resize(mGameEvent.size()*2-1);
174 // 1 2
175 result = WorldDatabase.Query("SELECT creature.guid, game_event_creature.event "
176 "FROM creature JOIN game_event_creature ON creature.guid = game_event_creature.guid");
178 count = 0;
179 if( !result )
181 barGoLink bar(1);
182 bar.step();
184 sLog.outString();
185 sLog.outString(">> Loaded %u creatures in game events", count );
187 else
190 barGoLink bar( (int)result->GetRowCount() );
193 Field *fields = result->Fetch();
195 bar.step();
197 uint32 guid = fields[0].GetUInt32();
198 int16 event_id = fields[1].GetInt16();
200 int32 internal_event_id = mGameEvent.size() + event_id - 1;
202 if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size())
204 sLog.outErrorDb("`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
205 continue;
208 ++count;
209 GuidList& crelist = mGameEventCreatureGuids[internal_event_id];
210 crelist.push_back(guid);
212 } while( result->NextRow() );
213 delete result;
215 sLog.outString();
216 sLog.outString( ">> Loaded %u creatures in game events", count );
219 mGameEventGameobjectGuids.resize(mGameEvent.size()*2-1);
220 // 1 2
221 result = WorldDatabase.Query("SELECT gameobject.guid, game_event_gameobject.event "
222 "FROM gameobject JOIN game_event_gameobject ON gameobject.guid=game_event_gameobject.guid");
224 count = 0;
225 if( !result )
227 barGoLink bar(1);
228 bar.step();
230 sLog.outString();
231 sLog.outString(">> Loaded %u gameobjects in game events", count );
233 else
236 barGoLink bar( (int)result->GetRowCount() );
239 Field *fields = result->Fetch();
241 bar.step();
243 uint32 guid = fields[0].GetUInt32();
244 int16 event_id = fields[1].GetInt16();
246 int32 internal_event_id = mGameEvent.size() + event_id - 1;
248 if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size())
250 sLog.outErrorDb("`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
251 continue;
254 ++count;
255 GuidList& golist = mGameEventGameobjectGuids[internal_event_id];
256 golist.push_back(guid);
258 } while( result->NextRow() );
259 delete result;
261 sLog.outString();
262 sLog.outString( ">> Loaded %u gameobjects in game events", count );
265 mGameEventModelEquip.resize(mGameEvent.size());
266 // 0 1 2
267 result = WorldDatabase.Query("SELECT creature.guid, game_event_model_equip.event, game_event_model_equip.modelid,"
268 // 3
269 "game_event_model_equip.equipment_id "
270 "FROM creature JOIN game_event_model_equip ON creature.guid=game_event_model_equip.guid");
272 count = 0;
273 if( !result )
275 barGoLink bar(1);
276 bar.step();
278 sLog.outString();
279 sLog.outString(">> Loaded %u model/equipment changes in game events", count );
281 else
284 barGoLink bar( (int)result->GetRowCount() );
287 Field *fields = result->Fetch();
289 bar.step();
290 uint32 guid = fields[0].GetUInt32();
291 uint16 event_id = fields[1].GetUInt16();
293 if(event_id >= mGameEventModelEquip.size())
295 sLog.outErrorDb("`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`",event_id);
296 continue;
299 ++count;
300 ModelEquipList& equiplist = mGameEventModelEquip[event_id];
301 ModelEquip newModelEquipSet;
302 newModelEquipSet.modelid = fields[2].GetUInt32();
303 newModelEquipSet.equipment_id = fields[3].GetUInt32();
304 newModelEquipSet.equipement_id_prev = 0;
305 newModelEquipSet.modelid_prev = 0;
307 if(newModelEquipSet.equipment_id > 0)
309 if(!sObjectMgr.GetEquipmentInfo(newModelEquipSet.equipment_id))
311 sLog.outErrorDb("Table `game_event_model_equip` have creature (Guid: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", guid, newModelEquipSet.equipment_id);
312 continue;
316 equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet));
318 } while( result->NextRow() );
319 delete result;
321 sLog.outString();
322 sLog.outString( ">> Loaded %u model/equipment changes in game events", count );
325 mGameEventQuests.resize(mGameEvent.size());
326 // 0 1 2
327 result = WorldDatabase.Query("SELECT id, quest, event FROM game_event_creature_quest");
329 count = 0;
330 if( !result )
332 barGoLink bar(1);
333 bar.step();
335 sLog.outString();
336 sLog.outString(">> Loaded %u quests additions in game events", count );
338 else
341 barGoLink bar( (int)result->GetRowCount() );
344 Field *fields = result->Fetch();
346 bar.step();
347 uint32 id = fields[0].GetUInt32();
348 uint32 quest = fields[1].GetUInt32();
349 uint16 event_id = fields[2].GetUInt16();
351 if(event_id >= mGameEventQuests.size())
353 sLog.outErrorDb("`game_event_creature_quest` game event id (%u) is out of range compared to max event id in `game_event`",event_id);
354 continue;
357 ++count;
358 QuestRelList& questlist = mGameEventQuests[event_id];
359 questlist.push_back(QuestRelation(id, quest));
361 } while( result->NextRow() );
362 delete result;
364 sLog.outString();
365 sLog.outString( ">> Loaded %u quests additions in game events", count );
368 mGameEventPoolIds.resize(mGameEvent.size()*2-1);
369 // 1 2
370 result = WorldDatabase.Query("SELECT pool_template.entry, game_event_pool.event "
371 "FROM pool_template JOIN game_event_pool ON pool_template.entry = game_event_pool.pool_entry");
373 count = 0;
374 if( !result )
376 barGoLink bar2(1);
377 bar2.step();
379 sLog.outString();
380 sLog.outString(">> Loaded %u pools in game events", count );
382 else
385 barGoLink bar2( (int)result->GetRowCount() );
388 Field *fields = result->Fetch();
390 bar2.step();
392 uint32 entry = fields[0].GetUInt16();
393 int16 event_id = fields[1].GetInt16();
395 int32 internal_event_id = mGameEvent.size() + event_id - 1;
397 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventPoolIds.size())
399 sLog.outErrorDb("`game_event_pool` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
400 continue;
403 if (!sPoolMgr.CheckPool(entry))
405 sLog.outErrorDb("Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry);
406 continue;
409 ++count;
410 IdList& poollist = mGameEventPoolIds[internal_event_id];
411 poollist.push_back(entry);
413 } while( result->NextRow() );
414 sLog.outString();
415 sLog.outString( ">> Loaded %u pools in game events", count );
416 delete result;
420 uint32 GameEventMgr::Initialize() // return the next event delay in ms
422 m_ActiveEvents.clear();
423 uint32 delay = Update();
424 sLog.outBasic("Game Event system initialized." );
425 m_IsGameEventsInit = true;
426 return delay;
429 uint32 GameEventMgr::Update() // return the next event delay in ms
431 uint32 nextEventDelay = max_ge_check_delay; // 1 day
432 uint32 calcDelay;
433 for (uint16 itr = 1; itr < mGameEvent.size(); ++itr)
435 //sLog.outErrorDb("Checking event %u",itr);
436 if (CheckOneGameEvent(itr))
438 //sLog.outDebug("GameEvent %u is active",itr->first);
439 if (!IsActiveEvent(itr))
440 StartEvent(itr);
442 else
444 //sLog.outDebug("GameEvent %u is not active",itr->first);
445 if (IsActiveEvent(itr))
446 StopEvent(itr);
447 else
449 if (!m_IsGameEventsInit)
451 int16 event_nid = (-1) * (itr);
452 // spawn all negative ones for this event
453 GameEventSpawn(event_nid);
455 // disable any event specific quest (for cases where creature is spawned, but event not active).
456 UpdateEventQuests(itr, false);
460 calcDelay = NextCheck(itr);
461 if (calcDelay < nextEventDelay)
462 nextEventDelay = calcDelay;
464 sLog.outBasic("Next game event check in %u seconds.", nextEventDelay + 1);
465 return (nextEventDelay + 1) * IN_MILISECONDS; // Add 1 second to be sure event has started/stopped at next call
468 void GameEventMgr::UnApplyEvent(uint16 event_id)
470 sLog.outString("GameEvent %u \"%s\" removed.", event_id, mGameEvent[event_id].description.c_str());
471 // un-spawn positive event tagged objects
472 GameEventUnspawn(event_id);
473 // spawn negative event tagget objects
474 int16 event_nid = (-1) * event_id;
475 GameEventSpawn(event_nid);
476 // restore equipment or model
477 ChangeEquipOrModel(event_id, false);
478 // Remove quests that are events only to non event npc
479 UpdateEventQuests(event_id, false);
482 void GameEventMgr::ApplyNewEvent(uint16 event_id)
484 if (sWorld.getConfig(CONFIG_BOOL_EVENT_ANNOUNCE))
485 sWorld.SendWorldText(LANG_EVENTMESSAGE, mGameEvent[event_id].description.c_str());
487 sLog.outString("GameEvent %u \"%s\" started.", event_id, mGameEvent[event_id].description.c_str());
488 // spawn positive event tagget objects
489 GameEventSpawn(event_id);
490 // un-spawn negative event tagged objects
491 int16 event_nid = (-1) * event_id;
492 GameEventUnspawn(event_nid);
493 // Change equipement or model
494 ChangeEquipOrModel(event_id, true);
495 // Add quests that are events only to non event npc
496 UpdateEventQuests(event_id, true);
499 void GameEventMgr::GameEventSpawn(int16 event_id)
501 int32 internal_event_id = mGameEvent.size() + event_id - 1;
503 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size())
505 sLog.outError("GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventCreatureGuids.size());
506 return;
509 for (GuidList::iterator itr = mGameEventCreatureGuids[internal_event_id].begin();itr != mGameEventCreatureGuids[internal_event_id].end();++itr)
511 // Add to correct cell
512 CreatureData const* data = sObjectMgr.GetCreatureData(*itr);
513 if (data)
515 sObjectMgr.AddCreatureToGrid(*itr, data);
517 // Spawn if necessary (loaded grids only)
518 Map* map = const_cast<Map*>(sMapMgr.CreateBaseMap(data->mapid));
519 // We use spawn coords to spawn
520 if(!map->Instanceable() && map->IsLoaded(data->posX,data->posY))
522 Creature* pCreature = new Creature;
523 //sLog.outDebug("Spawning creature %u",*itr);
524 if (!pCreature->LoadFromDB(*itr, map))
526 delete pCreature;
528 else
530 map->Add(pCreature);
536 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size())
538 sLog.outError("GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventGameobjectGuids.size());
539 return;
542 for (GuidList::iterator itr = mGameEventGameobjectGuids[internal_event_id].begin();itr != mGameEventGameobjectGuids[internal_event_id].end();++itr)
544 // Add to correct cell
545 GameObjectData const* data = sObjectMgr.GetGOData(*itr);
546 if (data)
548 sObjectMgr.AddGameobjectToGrid(*itr, data);
549 // Spawn if necessary (loaded grids only)
550 // this base map checked as non-instanced and then only existed
551 Map* map = const_cast<Map*>(sMapMgr.CreateBaseMap(data->mapid));
552 // We use current coords to unspawn, not spawn coords since creature can have changed grid
553 if(!map->Instanceable() && map->IsLoaded(data->posX, data->posY))
555 GameObject* pGameobject = new GameObject;
556 //sLog.outDebug("Spawning gameobject %u", *itr);
557 if (!pGameobject->LoadFromDB(*itr, map))
559 delete pGameobject;
561 else
563 if(pGameobject->isSpawnedByDefault())
564 map->Add(pGameobject);
570 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventPoolIds.size())
572 sLog.outError("GameEventMgr::GameEventSpawn attempt access to out of range mGameEventPoolIds element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventPoolIds.size());
573 return;
576 for (IdList::iterator itr = mGameEventPoolIds[internal_event_id].begin();itr != mGameEventPoolIds[internal_event_id].end();++itr)
577 sPoolMgr.SpawnPool(*itr, true);
580 void GameEventMgr::GameEventUnspawn(int16 event_id)
582 int32 internal_event_id = mGameEvent.size() + event_id - 1;
584 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size())
586 sLog.outError("GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventCreatureGuids element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventCreatureGuids.size());
587 return;
590 for (GuidList::iterator itr = mGameEventCreatureGuids[internal_event_id].begin();itr != mGameEventCreatureGuids[internal_event_id].end();++itr)
592 // Remove the creature from grid
593 if( CreatureData const* data = sObjectMgr.GetCreatureData(*itr) )
595 sObjectMgr.RemoveCreatureFromGrid(*itr, data);
597 if( Creature* pCreature = ObjectAccessor::GetCreatureInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_UNIT)) )
598 pCreature->AddObjectToRemoveList();
602 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size())
604 sLog.outError("GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventGameobjectGuids element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventGameobjectGuids.size());
605 return;
608 for (GuidList::iterator itr = mGameEventGameobjectGuids[internal_event_id].begin();itr != mGameEventGameobjectGuids[internal_event_id].end();++itr)
610 // Remove the gameobject from grid
611 if(GameObjectData const* data = sObjectMgr.GetGOData(*itr))
613 sObjectMgr.RemoveGameobjectFromGrid(*itr, data);
615 if( GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_GAMEOBJECT)) )
616 pGameobject->AddObjectToRemoveList();
619 if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventPoolIds.size())
621 sLog.outError("GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element %i (size: " SIZEFMTD ")",internal_event_id,mGameEventPoolIds.size());
622 return;
625 for (IdList::iterator itr = mGameEventPoolIds[internal_event_id].begin();itr != mGameEventPoolIds[internal_event_id].end();++itr)
627 sPoolMgr.DespawnPool(*itr);
631 void GameEventMgr::ChangeEquipOrModel(int16 event_id, bool activate)
633 for(ModelEquipList::iterator itr = mGameEventModelEquip[event_id].begin();itr != mGameEventModelEquip[event_id].end();++itr)
635 // Remove the creature from grid
636 CreatureData const* data = sObjectMgr.GetCreatureData(itr->first);
637 if(!data)
638 continue;
640 // Update if spawned
641 Creature* pCreature = ObjectAccessor::GetCreatureInWorld(MAKE_NEW_GUID(itr->first, data->id,HIGHGUID_UNIT));
642 if (pCreature)
644 if (activate)
646 itr->second.equipement_id_prev = pCreature->GetCurrentEquipmentId();
647 itr->second.modelid_prev = pCreature->GetDisplayId();
648 pCreature->LoadEquipment(itr->second.equipment_id, true);
649 if (itr->second.modelid >0 && itr->second.modelid_prev != itr->second.modelid)
651 CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelInfo(itr->second.modelid);
652 if (minfo)
654 pCreature->SetDisplayId(itr->second.modelid);
655 pCreature->SetNativeDisplayId(itr->second.modelid);
656 pCreature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS,minfo->bounding_radius);
657 pCreature->SetFloatValue(UNIT_FIELD_COMBATREACH,minfo->combat_reach );
661 else
663 pCreature->LoadEquipment(itr->second.equipement_id_prev, true);
664 if (itr->second.modelid_prev >0 && itr->second.modelid_prev != itr->second.modelid)
666 CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelInfo(itr->second.modelid_prev);
667 if (minfo)
669 pCreature->SetDisplayId(itr->second.modelid_prev);
670 pCreature->SetNativeDisplayId(itr->second.modelid_prev);
671 pCreature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS,minfo->bounding_radius);
672 pCreature->SetFloatValue(UNIT_FIELD_COMBATREACH,minfo->combat_reach );
677 else // If not spawned
679 CreatureData const* data2 = sObjectMgr.GetCreatureData(itr->first);
680 if (data2 && activate)
682 CreatureInfo const *cinfo = ObjectMgr::GetCreatureTemplate(data2->id);
683 uint32 display_id = sObjectMgr.ChooseDisplayId(0,cinfo,data2);
684 CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelRandomGender(display_id);
685 if (minfo)
686 display_id = minfo->modelid;
688 if (data2->equipmentId == 0)
689 itr->second.equipement_id_prev = cinfo->equipmentId;
690 else if (data2->equipmentId != -1)
691 itr->second.equipement_id_prev = data->equipmentId;
692 itr->second.modelid_prev = display_id;
695 // now last step: put in data
696 // just to have write access to it
697 CreatureData& data2 = sObjectMgr.NewOrExistCreatureData(itr->first);
698 if (activate)
700 data2.displayid = itr->second.modelid;
701 data2.equipmentId = itr->second.equipment_id;
703 else
705 data2.displayid = itr->second.modelid_prev;
706 data2.equipmentId = itr->second.equipement_id_prev;
711 void GameEventMgr::UpdateEventQuests(uint16 event_id, bool Activate)
713 QuestRelList::iterator itr;
714 for (itr = mGameEventQuests[event_id].begin();itr != mGameEventQuests[event_id].end();++itr)
716 QuestRelations &CreatureQuestMap = sObjectMgr.mCreatureQuestRelations;
717 if (Activate) // Add the pair(id,quest) to the multimap
718 CreatureQuestMap.insert(QuestRelations::value_type(itr->first, itr->second));
719 else
720 { // Remove the pair(id,quest) from the multimap
721 QuestRelations::iterator qitr = CreatureQuestMap.find(itr->first);
722 if (qitr == CreatureQuestMap.end())
723 continue;
724 QuestRelations::iterator lastElement = CreatureQuestMap.upper_bound(itr->first);
725 for ( ;qitr != lastElement;++qitr)
727 if (qitr->second == itr->second)
729 CreatureQuestMap.erase(qitr); // iterator is now no more valid
730 break; // but we can exit loop since the element is found
737 GameEventMgr::GameEventMgr()
739 m_IsGameEventsInit = false;
742 MANGOS_DLL_SPEC bool IsHolidayActive( HolidayIds id )
744 GameEventMgr::GameEventDataMap const& events = sGameEventMgr.GetEventMap();
745 GameEventMgr::ActiveEvents const& ae = sGameEventMgr.GetActiveEventList();
747 for(GameEventMgr::ActiveEvents::const_iterator itr = ae.begin(); itr != ae.end(); ++itr)
748 if (events[*itr].holiday_id == id)
749 return true;
751 return false;