[10929] Move game event creature morphing code to Creature::UpdateEntry

* This is allow have more clean logic in feature work.
* Prevent modify static creature data.
This commit is contained in:
VladimirMangos 2010-12-28 20:34:49 +03:00
parent f8921dbca8
commit 3ff5ff2e6f
5 changed files with 72 additions and 98 deletions

View file

@ -343,7 +343,7 @@ void GameEventMgr::LoadFromDB()
sPoolMgr.CheckEventLinkAndReport(pool_id, event_id, creature2event, go2event);
}
mGameEventModelEquip.resize(mGameEvent.size());
mGameEventCreatureData.resize(mGameEvent.size());
// 0 1 2
result = WorldDatabase.Query("SELECT creature.guid, game_event_model_equip.event, game_event_model_equip.modelid,"
// 3
@ -371,19 +371,17 @@ void GameEventMgr::LoadFromDB()
uint32 guid = fields[0].GetUInt32();
uint16 event_id = fields[1].GetUInt16();
if(event_id >= mGameEventModelEquip.size())
if(event_id >= mGameEventCreatureData.size())
{
sLog.outErrorDb("`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`",event_id);
continue;
}
++count;
ModelEquipList& equiplist = mGameEventModelEquip[event_id];
ModelEquip newModelEquipSet;
GameEventCreatureDataList& equiplist = mGameEventCreatureData[event_id];
GameEventCreatureData newModelEquipSet;
newModelEquipSet.modelid = fields[2].GetUInt32();
newModelEquipSet.equipment_id = fields[3].GetUInt32();
newModelEquipSet.equipement_id_prev = 0;
newModelEquipSet.modelid_prev = 0;
if(newModelEquipSet.equipment_id > 0)
{
@ -394,7 +392,8 @@ void GameEventMgr::LoadFromDB()
}
}
equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet));
equiplist.push_back(GameEventCreatureDataPair(guid, newModelEquipSet));
mGameEventCreatureDataPerGuid[guid] = event_id;
} while( result->NextRow() );
delete result;
@ -513,7 +512,7 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
int16 event_nid = (-1) * event_id;
GameEventSpawn(event_nid);
// restore equipment or model
ChangeEquipOrModel(event_id, false);
UpdateCreatureData(event_id, false);
// Remove quests that are events only to non event npc
UpdateEventQuests(event_id, false);
UpdateWorldStates(event_id, false);
@ -531,7 +530,7 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
int16 event_nid = (-1) * event_id;
GameEventUnspawn(event_nid);
// Change equipement or model
ChangeEquipOrModel(event_id, true);
UpdateCreatureData(event_id, true);
// Add quests that are events only to non event npc
UpdateEventQuests(event_id, true);
UpdateWorldStates(event_id, true);
@ -727,9 +726,26 @@ void GameEventMgr::GameEventUnspawn(int16 event_id)
}
}
void GameEventMgr::ChangeEquipOrModel(int16 event_id, bool activate)
GameEventCreatureData const* GameEventMgr::GetCreatureUpdateDataForActiveEvent(uint32 lowguid) const
{
for(ModelEquipList::iterator itr = mGameEventModelEquip[event_id].begin();itr != mGameEventModelEquip[event_id].end();++itr)
// only for active event
GameEventCreatureDataPerGuidMap::const_iterator itr = mGameEventCreatureDataPerGuid.find(lowguid);
if (itr == mGameEventCreatureDataPerGuid.end() || !IsActiveEvent(itr->second))
return NULL;
uint32 event_id = itr->second;
for(GameEventCreatureDataList::const_iterator itr = mGameEventCreatureData[event_id].begin();itr != mGameEventCreatureData[event_id].end();++itr)
if (itr->first == lowguid)
return &itr->second;
return NULL;
}
void GameEventMgr::UpdateCreatureData(int16 event_id, bool activate)
{
for(GameEventCreatureDataList::iterator itr = mGameEventCreatureData[event_id].begin();itr != mGameEventCreatureData[event_id].end();++itr)
{
// Remove the creature from grid
CreatureData const* data = sObjectMgr.GetCreatureData(itr->first);
@ -738,67 +754,7 @@ void GameEventMgr::ChangeEquipOrModel(int16 event_id, bool activate)
// Update if spawned
if (Creature* pCreature = ObjectAccessor::GetCreatureInWorld(ObjectGuid(HIGHGUID_UNIT, data->id, itr->first)))
{
if (activate)
{
itr->second.equipement_id_prev = pCreature->GetCurrentEquipmentId();
itr->second.modelid_prev = pCreature->GetDisplayId();
pCreature->LoadEquipment(itr->second.equipment_id, true);
if (itr->second.modelid >0 && itr->second.modelid_prev != itr->second.modelid)
{
CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelInfo(itr->second.modelid);
if (minfo)
{
pCreature->SetDisplayId(itr->second.modelid);
pCreature->SetNativeDisplayId(itr->second.modelid);
}
}
}
else
{
pCreature->LoadEquipment(itr->second.equipement_id_prev, true);
if (itr->second.modelid_prev >0 && itr->second.modelid_prev != itr->second.modelid)
{
CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelInfo(itr->second.modelid_prev);
if (minfo)
{
pCreature->SetDisplayId(itr->second.modelid_prev);
pCreature->SetNativeDisplayId(itr->second.modelid_prev);
}
}
}
}
else // If not spawned
{
CreatureData const* data2 = sObjectMgr.GetCreatureData(itr->first);
if (data2 && activate)
{
CreatureInfo const *cinfo = ObjectMgr::GetCreatureTemplate(data2->id);
uint32 display_id = Creature::ChooseDisplayId(cinfo,data2);
CreatureModelInfo const *minfo = sObjectMgr.GetCreatureModelRandomGender(display_id);
if (minfo)
display_id = minfo->modelid;
if (data2->equipmentId == 0)
itr->second.equipement_id_prev = cinfo->equipmentId;
else if (data2->equipmentId != -1)
itr->second.equipement_id_prev = data->equipmentId;
itr->second.modelid_prev = display_id;
}
}
// now last step: put in data
// just to have write access to it
CreatureData& data2 = sObjectMgr.NewOrExistCreatureData(itr->first);
if (activate)
{
data2.modelid_override = itr->second.modelid;
data2.equipmentId = itr->second.equipment_id;
}
else
{
data2.modelid_override = itr->second.modelid_prev;
data2.equipmentId = itr->second.equipement_id_prev;
}
pCreature->UpdateEntry(data->id, TEAM_NONE, data, activate ? &itr->second : NULL);
}
}