[11077] Game event fixes and condition improvments.

* At game events table loading checked not only allowed event ids range but also event existance.
* Renamed CONDITION_ACTIVE_EVENT -> CONDITION_ACTIVE_GAME_EVENT
* Implemented new conditions:
   - CONDITION_NOT_ACTIVE_GAME_EVENT
   - CONDITION_ACTIVE_HOLIDAY
   - CONDITION_NOT_ACTIVE_HOLIDAY

Recomended use holiday version where possible as more portable.
This commit is contained in:
VladimirMangos 2011-01-28 23:29:04 +03:00
parent 84dd2e4393
commit 2fd536fe43
9 changed files with 90 additions and 62 deletions

View file

@ -130,7 +130,7 @@ void GameEventMgr::LoadFromDB()
bar.step();
uint16 event_id = fields[0].GetUInt16();
if(event_id==0)
if (event_id == 0)
{
sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id);
continue;
@ -206,18 +206,18 @@ void GameEventMgr::LoadFromDB()
if (event_id == 0)
{
sLog.outErrorDb("`game_event_creature` game event id (%i) not allowed",event_id);
sLog.outErrorDb("`game_event_creature` game event id (%i) not allowed", event_id);
continue;
}
if (!IsValidEvent(std::abs(event_id)))
{
sLog.outErrorDb("`game_event_creature` game event id (%i) not exist in `game_event`", event_id);
continue;
}
int32 internal_event_id = mGameEvent.size() + event_id - 1;
if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size())
{
sLog.outErrorDb("`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
continue;
}
++count;
// spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case
@ -284,18 +284,18 @@ void GameEventMgr::LoadFromDB()
if (event_id == 0)
{
sLog.outErrorDb("`game_event_gameobject` game event id (%i) not allowed",event_id);
sLog.outErrorDb("`game_event_gameobject` game event id (%i) not allowed", event_id);
continue;
}
if (!IsValidEvent(std::abs(event_id)))
{
sLog.outErrorDb("`game_event_gameobject` game event id (%i) not exist in `game_event`", event_id);
continue;
}
int32 internal_event_id = mGameEvent.size() + event_id - 1;
if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size())
{
sLog.outErrorDb("`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
continue;
}
++count;
// spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case
@ -372,15 +372,15 @@ void GameEventMgr::LoadFromDB()
uint32 guid = fields[0].GetUInt32();
uint16 event_id = fields[1].GetUInt16();
if(event_id==0)
if (event_id == 0)
{
sLog.outErrorDb("`game_event_creature_data` game event id (%i) is reserved and can't be used.",event_id);
sLog.outErrorDb("`game_event_creature_data` game event id (%i) is reserved and can't be used." ,event_id);
continue;
}
if(event_id >= mGameEventCreatureData.size())
if (!IsValidEvent(event_id))
{
sLog.outErrorDb("`game_event_creature_data` game event id (%u) is out of range compared to max event id in `game_event`",event_id);
sLog.outErrorDb("`game_event_creature_data` game event id (%u) not exist in `game_event`", event_id);
continue;
}
@ -452,9 +452,15 @@ void GameEventMgr::LoadFromDB()
uint32 quest = fields[0].GetUInt32();
uint16 event_id = fields[1].GetUInt16();
if(event_id >= mGameEventQuests.size())
if (event_id == 0)
{
sLog.outErrorDb("`game_event_quest` game event id (%u) is out of range compared to max event id in `game_event`",event_id);
sLog.outErrorDb("`game_event_quest` game event id (%i) is reserved and can't be used.", event_id);
continue;
}
if (!IsValidEvent(event_id))
{
sLog.outErrorDb("`game_event_quest` game event id (%u) not exist in `game_event`", event_id);
continue;
}
@ -517,14 +523,14 @@ void GameEventMgr::LoadFromDB()
continue;
}
int32 internal_event_id = mGameEvent.size() + event_id - 1;
if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventMails.size())
if (!IsValidEvent(event_id))
{
sLog.outErrorDb("`game_event_mail` game event id (%i) is out of range compared to max event id in `game_event`", event_id);
sLog.outErrorDb("`game_event_mail` game event id (%u) not exist in `game_event`", event_id);
continue;
}
int32 internal_event_id = mGameEvent.size() + event_id - 1;
if (!(mail.raceMask & RACEMASK_ALL_PLAYABLE))
{
sLog.outErrorDb("Table `game_event_mail` have raceMask (%u) requirement for game event %i that not include any player races, ignoring.", mail.raceMask, event_id);
@ -1007,17 +1013,19 @@ GameEventMgr::GameEventMgr()
m_IsGameEventsInit = false;
}
MANGOS_DLL_SPEC bool IsHolidayActive( HolidayIds id )
bool GameEventMgr::IsActiveHoliday( HolidayIds id )
{
if (id == HOLIDAY_NONE)
return false;
GameEventMgr::GameEventDataMap const& events = sGameEventMgr.GetEventMap();
GameEventMgr::ActiveEvents const& ae = sGameEventMgr.GetActiveEventList();
for(GameEventMgr::ActiveEvents::const_iterator itr = ae.begin(); itr != ae.end(); ++itr)
if (events[*itr].holiday_id == id)
for(GameEventMgr::ActiveEvents::const_iterator itr = m_ActiveEvents.begin(); itr != m_ActiveEvents.end(); ++itr)
if (mGameEvent[*itr].holiday_id == id)
return true;
return false;
}
MANGOS_DLL_SPEC bool IsHolidayActive( HolidayIds id )
{
return sGameEventMgr.IsActiveHoliday(id);
}