mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[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:
parent
f8921dbca8
commit
3ff5ff2e6f
5 changed files with 72 additions and 98 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue