Core/GameObjects: Updated GameObjectTemplate data structure
This commit is contained in:
@@ -0,0 +1 @@
|
||||
ALTER TABLE `gameobject_template` ADD `data31` int(10) not null default '0' AFTER `data31`;
|
||||
@@ -854,9 +854,9 @@ bool BfCapturePoint::HandlePlayerEnter(Player* player)
|
||||
{
|
||||
if (GameObject* capturePoint = m_Bf->GetGameObject(m_capturePointGUID))
|
||||
{
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate2, uint32(ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f)));
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct);
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldState1, 1);
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldstate2, uint32(ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f)));
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldstate3, m_neutralValuePct);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -867,7 +867,7 @@ GuidSet::iterator BfCapturePoint::HandlePlayerLeave(Player* player)
|
||||
{
|
||||
if (!m_capturePointGUID.IsEmpty())
|
||||
if (GameObject* capturePoint = m_Bf->GetGameObject(m_capturePointGUID))
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldState1, 0);
|
||||
player->SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldState1, 0);
|
||||
|
||||
GuidSet::iterator current = m_activePlayers[player->GetTeamId()].find(player->GetGUID());
|
||||
|
||||
@@ -886,11 +886,11 @@ void BfCapturePoint::SendChangePhase()
|
||||
if (GameObject* capturePoint = m_Bf->GetGameObject(m_capturePointGUID))
|
||||
{
|
||||
// send this too, sometimes the slider disappears, dunno why :(
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldState1, 1);
|
||||
// send these updates to only the ones in this objective
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32) std::ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldstate2, (uint32)std::ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
// send this too, sometimes it resets :S
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct);
|
||||
SendUpdateWorldState(capturePoint->GetGOInfo()->controlZone.worldstate3, m_neutralValuePct);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -911,10 +911,10 @@ bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint)
|
||||
}
|
||||
|
||||
// get the needed values from goinfo
|
||||
m_maxValue = goinfo->capturePoint.maxTime;
|
||||
m_maxSpeed = m_maxValue / (goinfo->capturePoint.minTime ? goinfo->capturePoint.minTime : 60);
|
||||
m_neutralValuePct = goinfo->capturePoint.neutralPercent;
|
||||
m_minValue = m_maxValue * goinfo->capturePoint.neutralPercent / 100;
|
||||
m_maxValue = goinfo->controlZone.maxTime;
|
||||
m_maxSpeed = m_maxValue / (goinfo->controlZone.minTime ? goinfo->controlZone.minTime : 60);
|
||||
m_neutralValuePct = goinfo->controlZone.neutralPercent;
|
||||
m_minValue = m_maxValue * goinfo->controlZone.neutralPercent / 100;
|
||||
m_capturePointEntry = capturePoint->GetEntry();
|
||||
if (m_team == TEAM_ALLIANCE)
|
||||
{
|
||||
@@ -958,7 +958,7 @@ bool BfCapturePoint::Update(uint32 diff)
|
||||
|
||||
if (GameObject* capturePoint = m_Bf->GetGameObject(m_capturePointGUID))
|
||||
{
|
||||
float radius = capturePoint->GetGOInfo()->capturePoint.radius;
|
||||
float radius = capturePoint->GetGOInfo()->controlZone.radius;
|
||||
|
||||
for (uint8 team = 0; team < 2; ++team)
|
||||
{
|
||||
|
||||
@@ -930,9 +930,9 @@ void BattlefieldWG::ProcessEvent(WorldObject* obj, uint32 eventId)
|
||||
{
|
||||
if (GameObject* buildingGo = GetGameObject(building->GetGUID()))
|
||||
{
|
||||
if (buildingGo->GetGOInfo()->building.damagedEvent == eventId)
|
||||
if (buildingGo->GetGOInfo()->destructibleBuilding.DamagedEvent == eventId)
|
||||
building->Damaged();
|
||||
else if (buildingGo->GetGOInfo()->building.destroyedEvent == eventId)
|
||||
else if (buildingGo->GetGOInfo()->destructibleBuilding.DestroyedEvent == eventId)
|
||||
building->Destroyed();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -571,7 +571,7 @@ void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject*
|
||||
uint8 gateId = gate->GateId;
|
||||
|
||||
// damaged
|
||||
if (eventId == go->GetGOInfo()->building.damagedEvent)
|
||||
if (eventId == go->GetGOInfo()->destructibleBuilding.DamagedEvent)
|
||||
{
|
||||
GateStatus[gateId] = BG_SA_GATE_DAMAGED;
|
||||
|
||||
@@ -581,7 +581,7 @@ void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject*
|
||||
PlaySoundToAll(Attackers == TEAM_ALLIANCE ? SOUND_WALL_ATTACKED_ALLIANCE : SOUND_WALL_ATTACKED_HORDE);
|
||||
}
|
||||
// destroyed
|
||||
else if (eventId == go->GetGOInfo()->building.destroyedEvent)
|
||||
else if (eventId == go->GetGOInfo()->destructibleBuilding.DestroyedEvent)
|
||||
{
|
||||
GateStatus[gate->GateId] = BG_SA_GATE_DESTROYED;
|
||||
_gateDestroyed = true;
|
||||
|
||||
@@ -231,13 +231,14 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u
|
||||
{
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE:
|
||||
SetGoAnimProgress(animprogress);
|
||||
m_goValue.FishingHole.MaxOpens = urand(GetGOInfo()->fishinghole.minSuccessOpens, GetGOInfo()->fishinghole.maxSuccessOpens);
|
||||
m_goValue.FishingHole.MaxOpens = urand(GetGOInfo()->fishingHole.minRestock, GetGOInfo()->fishingHole.maxRestock);
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING:
|
||||
m_goValue.Building.Health = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
|
||||
// TODO: Get the values somehow, no longer in gameobject_template
|
||||
m_goValue.Building.Health = 20000/*goinfo->destructibleBuilding.intactNumHits + goinfo->destructibleBuilding.damagedNumHits*/;
|
||||
m_goValue.Building.MaxHealth = m_goValue.Building.Health;
|
||||
SetGoAnimProgress(255);
|
||||
SetUInt32Value(GAMEOBJECT_PARENTROTATION, m_goInfo->building.destructibleData);
|
||||
SetUInt32Value(GAMEOBJECT_PARENTROTATION, m_goInfo->destructibleBuilding.DestructibleModelRec);
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_TRANSPORT:
|
||||
{
|
||||
@@ -248,14 +249,24 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u
|
||||
m_goValue.Transport.CurrentSeg = 0;
|
||||
m_goValue.Transport.StateUpdateTimer = 0;
|
||||
m_goValue.Transport.StopFrames = new std::vector<uint32>();
|
||||
if (goinfo->transport.stopFrame1 > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame1);
|
||||
if (goinfo->transport.stopFrame2 > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame2);
|
||||
if (goinfo->transport.stopFrame3 > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame3);
|
||||
if (goinfo->transport.stopFrame4 > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.stopFrame4);
|
||||
if (goinfo->transport.Timeto2ndfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto2ndfloor);
|
||||
if (goinfo->transport.Timeto3rdfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto3rdfloor);
|
||||
if (goinfo->transport.Timeto4thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto4thfloor);
|
||||
if (goinfo->transport.Timeto5thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto5thfloor);
|
||||
if (goinfo->transport.Timeto6thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto6thfloor);
|
||||
if (goinfo->transport.Timeto7thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto7thfloor);
|
||||
if (goinfo->transport.Timeto8thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto8thfloor);
|
||||
if (goinfo->transport.Timeto9thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto9thfloor);
|
||||
if (goinfo->transport.Timeto10thfloor > 0)
|
||||
m_goValue.Transport.StopFrames->push_back(goinfo->transport.Timeto10thfloor);
|
||||
if (goinfo->transport.startOpen)
|
||||
SetTransportState(GO_STATE_TRANSPORT_STOPPED, goinfo->transport.startOpen - 1);
|
||||
else
|
||||
@@ -274,7 +285,7 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u
|
||||
m_stealth.AddValue(STEALTH_TRAP, 70);
|
||||
}
|
||||
|
||||
if (GetGOInfo()->trap.invisible)
|
||||
if (GetGOInfo()->trap.stealthAffected)
|
||||
{
|
||||
m_invisibility.AddFlag(INVISIBILITY_TRAP);
|
||||
m_invisibility.AddValue(INVISIBILITY_TRAP, 300);
|
||||
@@ -312,7 +323,7 @@ void GameObject::Update(uint32 diff)
|
||||
// Arming Time for GAMEOBJECT_TYPE_TRAP (6)
|
||||
GameObjectTemplate const* goInfo = GetGOInfo();
|
||||
// Bombs
|
||||
if (goInfo->trap.type == 2)
|
||||
if (goInfo->trap.charges == 2)
|
||||
// Hardcoded tooltip value
|
||||
m_cooldownTime = time(NULL) + 10;
|
||||
else if (Unit* owner = GetOwner())
|
||||
@@ -445,7 +456,7 @@ void GameObject::Update(uint32 diff)
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE:
|
||||
// Initialize a new max fish count on respawn
|
||||
m_goValue.FishingHole.MaxOpens = urand(GetGOInfo()->fishinghole.minSuccessOpens, GetGOInfo()->fishinghole.maxSuccessOpens);
|
||||
m_goValue.FishingHole.MaxOpens = urand(GetGOInfo()->fishingHole.minRestock, GetGOInfo()->fishingHole.maxRestock);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -477,7 +488,7 @@ void GameObject::Update(uint32 diff)
|
||||
break;
|
||||
|
||||
// Type 2 (bomb) does not need to be triggered by a unit and despawns after casting its spell.
|
||||
if (goInfo->trap.type == 2)
|
||||
if (goInfo->trap.charges == 2)
|
||||
{
|
||||
SetLootState(GO_ACTIVATED);
|
||||
break;
|
||||
@@ -486,7 +497,7 @@ void GameObject::Update(uint32 diff)
|
||||
// Type 0 despawns after being triggered, type 1 does not.
|
||||
/// @todo This is activation radius. Casting radius must be selected from spell data.
|
||||
float radius;
|
||||
if (!goInfo->trap.diameter)
|
||||
if (!goInfo->trap.radius)
|
||||
{
|
||||
// Battleground traps: data2 == 0 && data5 == 3
|
||||
if (goInfo->trap.cooldown != 3)
|
||||
@@ -495,7 +506,7 @@ void GameObject::Update(uint32 diff)
|
||||
radius = 3.f;
|
||||
}
|
||||
else
|
||||
radius = goInfo->trap.diameter / 2.f;
|
||||
radius = goInfo->trap.radius / 2.f;
|
||||
|
||||
// Pointer to appropriate target if found any
|
||||
Unit* target = NULL;
|
||||
@@ -572,28 +583,28 @@ void GameObject::Update(uint32 diff)
|
||||
case GAMEOBJECT_TYPE_TRAP:
|
||||
{
|
||||
GameObjectTemplate const* goInfo = GetGOInfo();
|
||||
if (goInfo->trap.type == 2 && goInfo->trap.spellId)
|
||||
if (goInfo->trap.charges == 2 && goInfo->trap.spell)
|
||||
{
|
||||
/// @todo NULL target won't work for target type 1
|
||||
CastSpell(NULL, goInfo->trap.spellId);
|
||||
CastSpell(NULL, goInfo->trap.spell);
|
||||
SetLootState(GO_JUST_DEACTIVATED);
|
||||
}
|
||||
else if (Unit* target = ObjectAccessor::GetUnit(*this, m_lootStateUnitGUID))
|
||||
{
|
||||
// Some traps do not have a spell but should be triggered
|
||||
if (goInfo->trap.spellId)
|
||||
CastSpell(target, goInfo->trap.spellId);
|
||||
if (goInfo->trap.spell)
|
||||
CastSpell(target, goInfo->trap.spell);
|
||||
|
||||
// Template value or 4 seconds
|
||||
m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4));
|
||||
|
||||
if (goInfo->trap.type == 1)
|
||||
if (goInfo->trap.charges == 1)
|
||||
SetLootState(GO_JUST_DEACTIVATED);
|
||||
else if (!goInfo->trap.type)
|
||||
else if (!goInfo->trap.charges)
|
||||
SetLootState(GO_READY);
|
||||
|
||||
// Battleground gameobjects have data2 == 0 && data5 == 3
|
||||
if (!goInfo->trap.diameter && goInfo->trap.cooldown == 3)
|
||||
if (!goInfo->trap.radius && goInfo->trap.cooldown == 3)
|
||||
if (Player* player = target->ToPlayer())
|
||||
if (Battleground* bg = player->GetBattleground())
|
||||
bg->HandleTriggerBuff(GetGUID());
|
||||
@@ -610,7 +621,7 @@ void GameObject::Update(uint32 diff)
|
||||
//if Gameobject should cast spell, then this, but some GOs (type = 10) should be destroyed
|
||||
if (GetGoType() == GAMEOBJECT_TYPE_GOOBER)
|
||||
{
|
||||
uint32 spellId = GetGOInfo()->goober.spellId;
|
||||
uint32 spellId = GetGOInfo()->goober.spell;
|
||||
|
||||
if (spellId)
|
||||
{
|
||||
@@ -1079,13 +1090,13 @@ bool GameObject::ActivateToQuest(Player* target) const
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GENERIC:
|
||||
{
|
||||
if (GetGOInfo()->_generic.questID == -1 || target->GetQuestStatus(GetGOInfo()->_generic.questID) == QUEST_STATUS_INCOMPLETE)
|
||||
if (GetGOInfo()->generic.questID == -1 || target->GetQuestStatus(GetGOInfo()->generic.questID) == QUEST_STATUS_INCOMPLETE)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GOOBER:
|
||||
{
|
||||
if (GetGOInfo()->goober.questId == -1 || target->GetQuestStatus(GetGOInfo()->goober.questId) == QUEST_STATUS_INCOMPLETE)
|
||||
if (GetGOInfo()->goober.questID == -1 || target->GetQuestStatus(GetGOInfo()->goober.questID) == QUEST_STATUS_INCOMPLETE)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
@@ -1102,7 +1113,7 @@ void GameObject::TriggeringLinkedGameObject(uint32 trapEntry, Unit* target)
|
||||
if (!trapInfo || trapInfo->type != GAMEOBJECT_TYPE_TRAP)
|
||||
return;
|
||||
|
||||
SpellInfo const* trapSpell = sSpellMgr->GetSpellInfo(trapInfo->trap.spellId);
|
||||
SpellInfo const* trapSpell = sSpellMgr->GetSpellInfo(trapInfo->trap.spell);
|
||||
if (!trapSpell) // checked at load already
|
||||
return;
|
||||
|
||||
@@ -1124,7 +1135,7 @@ void GameObject::TriggeringLinkedGameObject(uint32 trapEntry, Unit* target)
|
||||
|
||||
// found correct GO
|
||||
if (trapGO)
|
||||
trapGO->CastSpell(target, trapInfo->trap.spellId);
|
||||
trapGO->CastSpell(target, trapInfo->trap.spell);
|
||||
}
|
||||
|
||||
GameObject* GameObject::LookupFishingHoleAround(float range)
|
||||
@@ -1248,12 +1259,12 @@ void GameObject::Use(Unit* user)
|
||||
case GAMEOBJECT_TYPE_TRAP: //6
|
||||
{
|
||||
GameObjectTemplate const* goInfo = GetGOInfo();
|
||||
if (goInfo->trap.spellId)
|
||||
CastSpell(user, goInfo->trap.spellId);
|
||||
if (goInfo->trap.spell)
|
||||
CastSpell(user, goInfo->trap.spell);
|
||||
|
||||
m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)); // template or 4 seconds
|
||||
|
||||
if (goInfo->trap.type == 1) // Deactivate after trigger
|
||||
if (goInfo->trap.charges == 1) // Deactivate after trigger
|
||||
SetLootState(GO_JUST_DEACTIVATED);
|
||||
|
||||
return;
|
||||
@@ -1270,8 +1281,8 @@ void GameObject::Use(Unit* user)
|
||||
|
||||
if (ChairListSlots.empty()) // this is called once at first chair use to make list of available slots
|
||||
{
|
||||
if (info->chair.slots > 0) // sometimes chairs in DB have error in fields and we dont know number of slots
|
||||
for (uint32 i = 0; i < info->chair.slots; ++i)
|
||||
if (info->chair.chairslots > 0) // sometimes chairs in DB have error in fields and we dont know number of slots
|
||||
for (uint32 i = 0; i < info->chair.chairslots; ++i)
|
||||
ChairListSlots[i].Clear(); // Last user of current slot set to 0 (none sit here yet)
|
||||
else
|
||||
ChairListSlots[0].Clear(); // error in DB, make one default slot
|
||||
@@ -1295,7 +1306,7 @@ void GameObject::Use(Unit* user)
|
||||
for (ChairSlotAndUser::iterator itr = ChairListSlots.begin(); itr != ChairListSlots.end(); ++itr)
|
||||
{
|
||||
// the distance between this slot and the center of the go - imagine a 1D space
|
||||
float relativeDistance = (info->size*itr->first)-(info->size*(info->chair.slots-1)/2.0f);
|
||||
float relativeDistance = (info->size*itr->first) - (info->size*(info->chair.chairslots - 1) / 2.0f);
|
||||
|
||||
float x_i = GetPositionX() + relativeDistance * std::cos(orthogonalOrientation);
|
||||
float y_i = GetPositionY() + relativeDistance * std::sin(orthogonalOrientation);
|
||||
@@ -1334,7 +1345,7 @@ void GameObject::Use(Unit* user)
|
||||
{
|
||||
itr->second = player->GetGUID(); //this slot in now used by player
|
||||
player->TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
|
||||
player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR+info->chair.height);
|
||||
player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR + info->chair.chairheight);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1348,7 +1359,7 @@ void GameObject::Use(Unit* user)
|
||||
|
||||
if (Player* player = user->ToPlayer())
|
||||
{
|
||||
if (info->goober.pageId) // show page...
|
||||
if (info->goober.pageID) // show page...
|
||||
{
|
||||
WorldPacket data(SMSG_GAMEOBJECT_PAGETEXT, 8);
|
||||
data << GetGUID();
|
||||
@@ -1360,25 +1371,25 @@ void GameObject::Use(Unit* user)
|
||||
player->SendPreparedGossip(this);
|
||||
}
|
||||
|
||||
if (info->goober.eventId)
|
||||
if (info->goober.eventID)
|
||||
{
|
||||
TC_LOG_DEBUG("maps.script", "Goober ScriptStart id %u for GO entry %u (GUID " UI64FMTD ").", info->goober.eventId, GetEntry(), GetDBTableGUIDLow());
|
||||
GetMap()->ScriptsStart(sEventScripts, info->goober.eventId, player, this);
|
||||
EventInform(info->goober.eventId, user);
|
||||
TC_LOG_DEBUG("maps.script", "Goober ScriptStart id %u for GO entry %u (GUID " UI64FMTD ").", info->goober.eventID, GetEntry(), GetDBTableGUIDLow());
|
||||
GetMap()->ScriptsStart(sEventScripts, info->goober.eventID, player, this);
|
||||
EventInform(info->goober.eventID, user);
|
||||
}
|
||||
|
||||
// possible quest objective for active quests
|
||||
if (info->goober.questId && sObjectMgr->GetQuestTemplate(info->goober.questId))
|
||||
if (info->goober.questID && sObjectMgr->GetQuestTemplate(info->goober.questID))
|
||||
{
|
||||
//Quest require to be active for GO using
|
||||
if (player->GetQuestStatus(info->goober.questId) != QUEST_STATUS_INCOMPLETE)
|
||||
if (player->GetQuestStatus(info->goober.questID) != QUEST_STATUS_INCOMPLETE)
|
||||
break;
|
||||
}
|
||||
|
||||
player->KillCreditGO(info->entry, GetGUID());
|
||||
}
|
||||
|
||||
if (uint32 trapEntry = info->goober.linkedTrapId)
|
||||
if (uint32 trapEntry = info->goober.linkedTrap)
|
||||
TriggeringLinkedGameObject(trapEntry, user);
|
||||
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
|
||||
@@ -1393,7 +1404,7 @@ void GameObject::Use(Unit* user)
|
||||
m_cooldownTime = time(NULL) + info->GetAutoCloseTime();
|
||||
|
||||
// cast this spell later if provided
|
||||
spellId = info->goober.spellId;
|
||||
spellId = info->goober.spell;
|
||||
spellCaster = NULL;
|
||||
|
||||
break;
|
||||
@@ -1409,8 +1420,8 @@ void GameObject::Use(Unit* user)
|
||||
|
||||
Player* player = user->ToPlayer();
|
||||
|
||||
if (info->camera.cinematicId)
|
||||
player->SendCinematicStart(info->camera.cinematicId);
|
||||
if (info->camera.camera)
|
||||
player->SendCinematicStart(info->camera.camera);
|
||||
|
||||
if (info->camera.eventID)
|
||||
GetMap()->ScriptsStart(sEventScripts, info->camera.eventID, player, this);
|
||||
@@ -1527,7 +1538,7 @@ void GameObject::Use(Unit* user)
|
||||
return;
|
||||
|
||||
// accept only use by player from same group as owner, excluding owner itself (unique use already added in spell effect)
|
||||
if (player == owner->ToPlayer() || (info->summoningRitual.castersGrouped && !player->IsInSameRaidWith(owner->ToPlayer())))
|
||||
if (player == owner->ToPlayer() || (info->ritual.castersGrouped && !player->IsInSameRaidWith(owner->ToPlayer())))
|
||||
return;
|
||||
|
||||
// expect owner to already be channeling, so if not...
|
||||
@@ -1539,7 +1550,7 @@ void GameObject::Use(Unit* user)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player != m_ritualOwner && (info->summoningRitual.castersGrouped && !player->IsInSameRaidWith(m_ritualOwner)))
|
||||
if (player != m_ritualOwner && (info->ritual.castersGrouped && !player->IsInSameRaidWith(m_ritualOwner)))
|
||||
return;
|
||||
|
||||
spellCaster = player;
|
||||
@@ -1547,21 +1558,21 @@ void GameObject::Use(Unit* user)
|
||||
|
||||
AddUniqueUse(player);
|
||||
|
||||
if (info->summoningRitual.animSpell)
|
||||
if (info->ritual.animSpell)
|
||||
{
|
||||
player->CastSpell(player, info->summoningRitual.animSpell, true);
|
||||
player->CastSpell(player, info->ritual.animSpell, true);
|
||||
|
||||
// for this case, summoningRitual.spellId is always triggered
|
||||
triggered = true;
|
||||
}
|
||||
|
||||
// full amount unique participants including original summoner
|
||||
if (GetUniqueUseCount() == info->summoningRitual.reqParticipants)
|
||||
if (GetUniqueUseCount() == info->ritual.casters)
|
||||
{
|
||||
if (m_ritualOwner)
|
||||
spellCaster = m_ritualOwner;
|
||||
|
||||
spellId = info->summoningRitual.spellId;
|
||||
spellId = info->ritual.spell;
|
||||
|
||||
if (spellId == 62330) // GO store nonexistent spell, replace by expected
|
||||
{
|
||||
@@ -1574,18 +1585,18 @@ void GameObject::Use(Unit* user)
|
||||
// Cast casterTargetSpell at a random GO user
|
||||
// on the current DB there is only one gameobject that uses this (Ritual of Doom)
|
||||
// and its required target number is 1 (outter for loop will run once)
|
||||
if (info->summoningRitual.casterTargetSpell && info->summoningRitual.casterTargetSpell != 1) // No idea why this field is a bool in some cases
|
||||
for (uint32 i = 0; i < info->summoningRitual.casterTargetSpellTargets; i++)
|
||||
if (info->ritual.casterTargetSpell && info->ritual.casterTargetSpell != 1) // No idea why this field is a bool in some cases
|
||||
for (uint32 i = 0; i < info->ritual.casterTargetSpellTargets; i++)
|
||||
// m_unique_users can contain only player GUIDs
|
||||
if (Player* target = ObjectAccessor::GetPlayer(*this, Trinity::Containers::SelectRandomContainerElement(m_unique_users)))
|
||||
spellCaster->CastSpell(target, info->summoningRitual.casterTargetSpell, true);
|
||||
spellCaster->CastSpell(target, info->ritual.casterTargetSpell, true);
|
||||
|
||||
// finish owners spell
|
||||
if (owner)
|
||||
owner->FinishSpell(CURRENT_CHANNELED_SPELL);
|
||||
|
||||
// can be deleted now, if
|
||||
if (!info->summoningRitual.ritualPersistent)
|
||||
if (!info->ritual.ritualPersistent)
|
||||
SetLootState(GO_JUST_DEACTIVATED);
|
||||
else
|
||||
{
|
||||
@@ -1607,7 +1618,7 @@ void GameObject::Use(Unit* user)
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
if (info->spellcaster.partyOnly)
|
||||
if (info->spellCaster.partyOnly)
|
||||
{
|
||||
Unit* caster = GetOwner();
|
||||
if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
|
||||
@@ -1618,7 +1629,7 @@ void GameObject::Use(Unit* user)
|
||||
}
|
||||
|
||||
user->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
||||
spellId = info->spellcaster.spellId;
|
||||
spellId = info->spellCaster.spell;
|
||||
|
||||
AddUse();
|
||||
break;
|
||||
@@ -1640,10 +1651,10 @@ void GameObject::Use(Unit* user)
|
||||
|
||||
//required lvl checks!
|
||||
uint8 level = player->getLevel();
|
||||
if (level < info->meetingstone.minLevel)
|
||||
if (level < info->meetingStone.minLevel)
|
||||
return;
|
||||
level = targetPlayer->getLevel();
|
||||
if (level < info->meetingstone.minLevel)
|
||||
if (level < info->meetingStone.minLevel)
|
||||
return;
|
||||
|
||||
if (info->entry == 194097)
|
||||
@@ -1967,7 +1978,7 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= NULL*/, u
|
||||
|
||||
if (!m_goValue.Building.Health)
|
||||
newState = GO_DESTRUCTIBLE_DESTROYED;
|
||||
else if (m_goValue.Building.Health <= GetGOInfo()->building.damagedNumHits)
|
||||
else if (m_goValue.Building.Health <= 10000/*GetGOInfo()->destructibleBuilding.damagedNumHits*/) // TODO: Get health somewhere
|
||||
newState = GO_DESTRUCTIBLE_DAMAGED;
|
||||
else if (m_goValue.Building.Health == m_goValue.Building.MaxHealth)
|
||||
newState = GO_DESTRUCTIBLE_INTACT;
|
||||
@@ -1998,21 +2009,21 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
|
||||
break;
|
||||
case GO_DESTRUCTIBLE_DAMAGED:
|
||||
{
|
||||
EventInform(m_goInfo->building.damagedEvent, eventInvoker);
|
||||
EventInform(m_goInfo->destructibleBuilding.DamagedEvent, eventInvoker);
|
||||
sScriptMgr->OnGameObjectDamaged(this, eventInvoker);
|
||||
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.damagedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
uint32 modelId = m_goInfo->displayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec))
|
||||
if (modelData->DamagedDisplayId)
|
||||
modelId = modelData->DamagedDisplayId;
|
||||
SetDisplayId(modelId);
|
||||
|
||||
if (setHealth)
|
||||
{
|
||||
m_goValue.Building.Health = m_goInfo->building.damagedNumHits;
|
||||
m_goValue.Building.Health = 10000/*m_goInfo->destructibleBuilding.damagedNumHits*/;
|
||||
uint32 maxHealth = m_goValue.Building.MaxHealth;
|
||||
// in this case current health is 0 anyway so just prevent crashing here
|
||||
if (!maxHealth)
|
||||
@@ -2024,7 +2035,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
|
||||
case GO_DESTRUCTIBLE_DESTROYED:
|
||||
{
|
||||
sScriptMgr->OnGameObjectDestroyed(this, eventInvoker);
|
||||
EventInform(m_goInfo->building.destroyedEvent, eventInvoker);
|
||||
EventInform(m_goInfo->destructibleBuilding.DestroyedEvent, eventInvoker);
|
||||
if (eventInvoker)
|
||||
if (Battleground* bg = eventInvoker->GetBattleground())
|
||||
bg->DestroyGate(eventInvoker, this);
|
||||
@@ -2032,8 +2043,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
|
||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
|
||||
|
||||
uint32 modelId = m_goInfo->building.destroyedDisplayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
uint32 modelId = m_goInfo->displayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec))
|
||||
if (modelData->DestroyedDisplayId)
|
||||
modelId = modelData->DestroyedDisplayId;
|
||||
SetDisplayId(modelId);
|
||||
@@ -2048,11 +2059,11 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
|
||||
}
|
||||
case GO_DESTRUCTIBLE_REBUILDING:
|
||||
{
|
||||
EventInform(m_goInfo->building.rebuildingEvent, eventInvoker);
|
||||
EventInform(m_goInfo->destructibleBuilding.RebuildingEvent, eventInvoker);
|
||||
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
|
||||
|
||||
uint32 modelId = m_goInfo->displayId;
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
|
||||
if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec))
|
||||
if (modelData->RebuildingDisplayId)
|
||||
modelId = modelData->RebuildingDisplayId;
|
||||
SetDisplayId(modelId);
|
||||
@@ -2243,7 +2254,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
|
||||
return;
|
||||
|
||||
bool isStoppableTransport = GetGoType() == GAMEOBJECT_TYPE_TRANSPORT && !m_goValue.Transport.StopFrames->empty();
|
||||
bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.groupLootRules && HasLootRecipient();
|
||||
bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.usegrouplootrules && HasLootRecipient();
|
||||
bool targetIsGM = target->IsGameMaster();
|
||||
|
||||
ByteBuffer fieldBuffer;
|
||||
@@ -2308,7 +2319,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
|
||||
{
|
||||
uint32 flags = m_uint32Values[GAMEOBJECT_FLAGS];
|
||||
if (GetGoType() == GAMEOBJECT_TYPE_CHEST)
|
||||
if (GetGOInfo()->chest.groupLootRules && !IsLootAllowedFor(target))
|
||||
if (GetGOInfo()->chest.usegrouplootrules && !IsLootAllowedFor(target))
|
||||
flags |= GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE;
|
||||
|
||||
fieldBuffer << flags;
|
||||
|
||||
@@ -47,358 +47,563 @@ struct GameObjectTemplate
|
||||
float size;
|
||||
uint32 questItems[MAX_GAMEOBJECT_QUEST_ITEMS];
|
||||
int32 unkInt32;
|
||||
union // different GO types have different data field
|
||||
union
|
||||
{
|
||||
//0 GAMEOBJECT_TYPE_DOOR
|
||||
// 0 GAMEOBJECT_TYPE_DOOR
|
||||
struct
|
||||
{
|
||||
uint32 startOpen; //0 used client side to determine GO_ACTIVATED means open/closed
|
||||
uint32 lockId; //1 -> Lock.dbc
|
||||
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
|
||||
uint32 noDamageImmune; //3 break opening whenever you recieve damage?
|
||||
uint32 openTextID; //4 can be used to replace castBarCaption?
|
||||
uint32 closeTextID; //5
|
||||
uint32 ignoredByPathing; //6
|
||||
uint32 startOpen; // 0 startOpen, enum { false, true, }; Default: false
|
||||
uint32 open; // 1 open, References: Lock_, NoValue = 0
|
||||
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000
|
||||
uint32 noDamageImmune; // 3 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 4 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 closeTextID; // 5 closeTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 IgnoredByPathing; // 6 Ignored By Pathing, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 7 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 EnablePortalsonopen; // 8 Enable Portals on open, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 InfiniteAOI; // 10 Infinite AOI, enum { false, true, }; Default: false
|
||||
} door;
|
||||
//1 GAMEOBJECT_TYPE_BUTTON
|
||||
// 1 GAMEOBJECT_TYPE_BUTTON
|
||||
struct
|
||||
{
|
||||
uint32 startOpen; //0
|
||||
uint32 lockId; //1 -> Lock.dbc
|
||||
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
|
||||
uint32 linkedTrap; //3
|
||||
uint32 noDamageImmune; //4 isBattlegroundObject
|
||||
uint32 large; //5
|
||||
uint32 openTextID; //6 can be used to replace castBarCaption?
|
||||
uint32 closeTextID; //7
|
||||
uint32 losOK; //8
|
||||
uint32 startOpen; // 0 startOpen, enum { false, true, }; Default: false
|
||||
uint32 open; // 1 open, References: Lock_, NoValue = 0
|
||||
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000
|
||||
uint32 linkedTrap; // 3 linkedTrap, References: GameObjects, NoValue = 0
|
||||
uint32 noDamageImmune; // 4 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 requireLOS; // 8 require LOS, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 9 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} button;
|
||||
//2 GAMEOBJECT_TYPE_QUESTGIVER
|
||||
// 2 GAMEOBJECT_TYPE_QUESTGIVER
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0 -> Lock.dbc
|
||||
uint32 questList; //1
|
||||
uint32 pageMaterial; //2
|
||||
uint32 gossipID; //3
|
||||
uint32 customAnim; //4
|
||||
uint32 noDamageImmune; //5
|
||||
uint32 openTextID; //6 can be used to replace castBarCaption?
|
||||
uint32 losOK; //7
|
||||
uint32 allowMounted; //8 Is usable while on mount/vehicle. (0/1)
|
||||
uint32 large; //9
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 questGiver; // 1 questGiver, References: QuestGiver, NoValue = 0
|
||||
uint32 pageMaterial; // 2 pageMaterial, References: PageTextMaterial, NoValue = 0
|
||||
uint32 gossipID; // 3 gossipID, References: Gossip, NoValue = 0
|
||||
uint32 customAnim; // 4 customAnim, int, Min value: 0, Max value: 4, Default value: 0
|
||||
uint32 noDamageImmune; // 5 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 requireLOS; // 7 require LOS, enum { false, true, }; Default: false
|
||||
uint32 allowMounted; // 8 allowMounted, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 10 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 NeverUsableWhileMounted; // 11 Never Usable While Mounted, enum { false, true, }; Default: false
|
||||
} questgiver;
|
||||
//3 GAMEOBJECT_TYPE_CHEST
|
||||
// 3 GAMEOBJECT_TYPE_CHEST
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0 -> Lock.dbc
|
||||
uint32 lootId; //1
|
||||
uint32 chestRestockTime; //2
|
||||
uint32 consumable; //3
|
||||
uint32 minSuccessOpens; //4 Deprecated, pre 3.0 was used for mining nodes but since WotLK all mining nodes are usable once and grant all loot with a single use
|
||||
uint32 maxSuccessOpens; //5 Deprecated, pre 3.0 was used for mining nodes but since WotLK all mining nodes are usable once and grant all loot with a single use
|
||||
uint32 eventId; //6 lootedEvent
|
||||
uint32 linkedTrapId; //7
|
||||
uint32 questId; //8 not used currently but store quest required for GO activation for player
|
||||
uint32 level; //9
|
||||
uint32 losOK; //10
|
||||
uint32 leaveLoot; //11
|
||||
uint32 notInCombat; //12
|
||||
uint32 logLoot; //13
|
||||
uint32 openTextID; //14 can be used to replace castBarCaption?
|
||||
uint32 groupLootRules; //15
|
||||
uint32 floatingTooltip; //16
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 chestLoot; // 1 chestLoot, References: Treasure, NoValue = 0
|
||||
uint32 chestRestockTime; // 2 chestRestockTime, int, Min value: 0, Max value: 1800000, Default value: 0
|
||||
uint32 consumable; // 3 consumable, enum { false, true, }; Default: false
|
||||
uint32 minRestock; // 4 minRestock, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 maxRestock; // 5 maxRestock, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 triggeredEvent; // 6 triggeredEvent, References: GameEvents, NoValue = 0
|
||||
uint32 linkedTrap; // 7 linkedTrap, References: GameObjects, NoValue = 0
|
||||
uint32 questID; // 8 questID, References: QuestV2, NoValue = 0
|
||||
uint32 level; // 9 level, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 requireLOS; // 10 require LOS, enum { false, true, }; Default: false
|
||||
uint32 leaveLoot; // 11 leaveLoot, enum { false, true, }; Default: false
|
||||
uint32 notInCombat; // 12 notInCombat, enum { false, true, }; Default: false
|
||||
uint32 logloot; // 13 log loot, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 14 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false
|
||||
uint32 floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 xpLevel; // 18 xpLevel, int, Min value: -1, Max value: 100, Default value: 0
|
||||
uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, Placeholder2, }; Default: No Exp
|
||||
uint32 lootLevel; // 20 lootLevel, int, Min value: 0, Max value: 100, Default value: 0
|
||||
uint32 GroupXP; // 21 Group XP, enum { false, true, }; Default: false
|
||||
uint32 DamageImmuneOK; // 22 Damage Immune OK, enum { false, true, }; Default: false
|
||||
uint32 trivialSkillLow; // 23 trivialSkillLow, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 trivialSkillHigh; // 24 trivialSkillHigh, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 DungeonEncounter; // 25 Dungeon Encounter, References: DungeonEncounter, NoValue = 0
|
||||
uint32 spell; // 26 spell, References: Spell, NoValue = 0
|
||||
uint32 GiganticAOI; // 27 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 LargeAOI; // 28 Large AOI, enum { false, true, }; Default: false
|
||||
uint32 SpawnVignette; // 29 Spawn Vignette, References: vignette, NoValue = 0
|
||||
uint32 chestPersonalLoot; // 30 chest Personal Loot, References: Treasure, NoValue = 0
|
||||
uint32 turnpersonallootsecurityoff; // 31 turn personal loot security off, enum { false, true, }; Default: false
|
||||
uint32 ChestProperties; // 32 Chest Properties, References: ChestProperties, NoValue = 0
|
||||
} chest;
|
||||
//4 GAMEOBJECT_TYPE_BINDER - empty
|
||||
//5 GAMEOBJECT_TYPE_GENERIC
|
||||
// 4 GAMEOBJECT_TYPE_BINDER
|
||||
struct
|
||||
{
|
||||
uint32 floatingTooltip; //0
|
||||
uint32 highlight; //1
|
||||
uint32 serverOnly; //2
|
||||
uint32 large; //3
|
||||
uint32 floatOnWater; //4
|
||||
int32 questID; //5
|
||||
} _generic;
|
||||
//6 GAMEOBJECT_TYPE_TRAP
|
||||
} binder;
|
||||
// 5 GAMEOBJECT_TYPE_GENERIC
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0 -> Lock.dbc
|
||||
uint32 level; //1
|
||||
uint32 diameter; //2 diameter for trap activation
|
||||
uint32 spellId; //3
|
||||
uint32 type; //4 0 trap with no despawn after cast. 1 trap despawns after cast. 2 bomb casts on spawn.
|
||||
uint32 cooldown; //5 time in secs
|
||||
int32 autoCloseTime; //6
|
||||
uint32 startDelay; //7
|
||||
uint32 serverOnly; //8
|
||||
uint32 stealthed; //9
|
||||
uint32 large; //10
|
||||
uint32 invisible; //11
|
||||
uint32 openTextID; //12 can be used to replace castBarCaption?
|
||||
uint32 closeTextID; //13
|
||||
uint32 ignoreTotems; //14
|
||||
uint32 floatingTooltip; // 0 floatingTooltip, enum { false, true, }; Default: false
|
||||
uint32 highlight; // 1 highlight, enum { false, true, }; Default: true
|
||||
uint32 serverOnly; // 2 serverOnly, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 3 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 floatOnWater; // 4 floatOnWater, enum { false, true, }; Default: false
|
||||
uint32 questID; // 5 questID, References: QuestV2, NoValue = 0
|
||||
uint32 conditionID1; // 6 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 LargeAOI; // 7 Large AOI, enum { false, true, }; Default: false
|
||||
uint32 UseGarrisonOwnerGuildColors; // 8 Use Garrison Owner Guild Colors, enum { false, true, }; Default: false
|
||||
} generic;
|
||||
// 6 GAMEOBJECT_TYPE_TRAP
|
||||
struct
|
||||
{
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 level; // 1 level, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 radius; // 2 radius, int, Min value: 0, Max value: 100, Default value: 0
|
||||
uint32 spell; // 3 spell, References: Spell, NoValue = 0
|
||||
uint32 charges; // 4 charges, int, Min value: 0, Max value: 65535, Default value: 1
|
||||
uint32 cooldown; // 5 cooldown, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 autoClose; // 6 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 startDelay; // 7 startDelay, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 serverOnly; // 8 serverOnly, enum { false, true, }; Default: false
|
||||
uint32 stealthed; // 9 stealthed, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 10 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 stealthAffected; // 11 stealthAffected, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 12 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 closeTextID; // 13 closeTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 IgnoreTotems; // 14 Ignore Totems, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 15 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 playerCast; // 16 playerCast, enum { false, true, }; Default: false
|
||||
uint32 SummonerTriggered; // 17 Summoner Triggered, enum { false, true, }; Default: false
|
||||
} trap;
|
||||
//7 GAMEOBJECT_TYPE_CHAIR
|
||||
// 7 GAMEOBJECT_TYPE_CHAIR
|
||||
struct
|
||||
{
|
||||
uint32 slots; //0
|
||||
uint32 height; //1
|
||||
uint32 onlyCreatorUse; //2
|
||||
uint32 triggeredEvent; //3
|
||||
uint32 chairslots; // 0 chairslots, int, Min value: 1, Max value: 5, Default value: 1
|
||||
uint32 chairheight; // 1 chairheight, int, Min value: 0, Max value: 2, Default value: 1
|
||||
uint32 onlyCreatorUse; // 2 onlyCreatorUse, enum { false, true, }; Default: false
|
||||
uint32 triggeredEvent; // 3 triggeredEvent, References: GameEvents, NoValue = 0
|
||||
uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} chair;
|
||||
//8 GAMEOBJECT_TYPE_SPELL_FOCUS
|
||||
// 8 GAMEOBJECT_TYPE_SPELL_FOCUS
|
||||
struct
|
||||
{
|
||||
uint32 focusId; //0
|
||||
uint32 dist; //1
|
||||
uint32 linkedTrapId; //2
|
||||
uint32 serverOnly; //3
|
||||
uint32 questID; //4
|
||||
uint32 large; //5
|
||||
uint32 floatingTooltip; //6
|
||||
uint32 spellFocusType; // 0 spellFocusType, References: SpellFocusObject, NoValue = 0
|
||||
uint32 radius; // 1 radius, int, Min value: 0, Max value: 50, Default value: 10
|
||||
uint32 linkedTrap; // 2 linkedTrap, References: GameObjects, NoValue = 0
|
||||
uint32 serverOnly; // 3 serverOnly, enum { false, true, }; Default: false
|
||||
uint32 questID; // 4 questID, References: QuestV2, NoValue = 0
|
||||
uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 floatingTooltip; // 6 floatingTooltip, enum { false, true, }; Default: false
|
||||
uint32 floatOnWater; // 7 floatOnWater, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} spellFocus;
|
||||
//9 GAMEOBJECT_TYPE_TEXT
|
||||
// 9 GAMEOBJECT_TYPE_TEXT
|
||||
struct
|
||||
{
|
||||
uint32 pageID; //0
|
||||
uint32 language; //1
|
||||
uint32 pageMaterial; //2
|
||||
uint32 allowMounted; //3 Is usable while on mount/vehicle. (0/1)
|
||||
uint32 pageID; // 0 pageID, References: PageText, NoValue = 0
|
||||
uint32 language; // 1 language, References: Languages, NoValue = 0
|
||||
uint32 pageMaterial; // 2 pageMaterial, References: PageTextMaterial, NoValue = 0
|
||||
uint32 allowMounted; // 3 allowMounted, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 NeverUsableWhileMounted; // 5 Never Usable While Mounted, enum { false, true, }; Default: false
|
||||
} text;
|
||||
//10 GAMEOBJECT_TYPE_GOOBER
|
||||
// 10 GAMEOBJECT_TYPE_GOOBER
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0 -> Lock.dbc
|
||||
int32 questId; //1
|
||||
uint32 eventId; //2
|
||||
uint32 autoCloseTime; //3
|
||||
uint32 customAnim; //4
|
||||
uint32 consumable; //5
|
||||
uint32 cooldown; //6
|
||||
uint32 pageId; //7
|
||||
uint32 language; //8
|
||||
uint32 pageMaterial; //9
|
||||
uint32 spellId; //10
|
||||
uint32 noDamageImmune; //11
|
||||
uint32 linkedTrapId; //12
|
||||
uint32 large; //13
|
||||
uint32 openTextID; //14 can be used to replace castBarCaption?
|
||||
uint32 closeTextID; //15
|
||||
uint32 losOK; //16 isBattlegroundObject
|
||||
uint32 allowMounted; //17 Is usable while on mount/vehicle. (0/1)
|
||||
uint32 floatingTooltip; //18
|
||||
uint32 gossipID; //19
|
||||
uint32 WorldStateSetsState; //20
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 questID; // 1 questID, References: QuestV2, NoValue = 0
|
||||
uint32 eventID; // 2 eventID, References: GameEvents, NoValue = 0
|
||||
uint32 autoClose; // 3 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000
|
||||
uint32 customAnim; // 4 customAnim, int, Min value: 0, Max value: 4, Default value: 0
|
||||
uint32 consumable; // 5 consumable, enum { false, true, }; Default: false
|
||||
uint32 cooldown; // 6 cooldown, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 pageID; // 7 pageID, References: PageText, NoValue = 0
|
||||
uint32 language; // 8 language, References: Languages, NoValue = 0
|
||||
uint32 pageMaterial; // 9 pageMaterial, References: PageTextMaterial, NoValue = 0
|
||||
uint32 spell; // 10 spell, References: Spell, NoValue = 0
|
||||
uint32 noDamageImmune; // 11 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 linkedTrap; // 12 linkedTrap, References: GameObjects, NoValue = 0
|
||||
uint32 GiganticAOI; // 13 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 14 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 closeTextID; // 15 closeTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 requireLOS; // 16 require LOS, enum { false, true, }; Default: false
|
||||
uint32 allowMounted; // 17 allowMounted, enum { false, true, }; Default: false
|
||||
uint32 floatingTooltip; // 18 floatingTooltip, enum { false, true, }; Default: false
|
||||
uint32 gossipID; // 19 gossipID, References: Gossip, NoValue = 0
|
||||
uint32 WorldStateSetsState; // 20 WorldStateSetsState, enum { false, true, }; Default: false
|
||||
uint32 floatOnWater; // 21 floatOnWater, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 22 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 playerCast; // 23 playerCast, enum { false, true, }; Default: false
|
||||
uint32 SpawnVignette; // 24 Spawn Vignette, References: vignette, NoValue = 0
|
||||
uint32 startOpen; // 25 startOpen, enum { false, true, }; Default: false
|
||||
uint32 DontPlayOpenAnim; // 26 Dont Play Open Anim, enum { false, true, }; Default: false
|
||||
uint32 IgnoreBoundingBox; // 27 Ignore Bounding Box, enum { false, true, }; Default: false
|
||||
uint32 NeverUsableWhileMounted; // 28 Never Usable While Mounted, enum { false, true, }; Default: false
|
||||
uint32 SortFarZ; // 29 Sort Far Z, enum { false, true, }; Default: false
|
||||
uint32 SyncAnimationtoObjectLifetime; // 30 Sync Animation to Object Lifetime (global track only), enum { false, true, }; Default: false
|
||||
} goober;
|
||||
//11 GAMEOBJECT_TYPE_TRANSPORT
|
||||
// 11 GAMEOBJECT_TYPE_TRANSPORT
|
||||
struct
|
||||
{
|
||||
int32 stopFrame1; //0
|
||||
uint32 startOpen; //1
|
||||
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
|
||||
uint32 pause1EventID; //3
|
||||
uint32 pause2EventID; //4
|
||||
uint32 mapId; //5
|
||||
int32 stopFrame2; //6
|
||||
uint32 unknown;
|
||||
int32 stopFrame3; //8
|
||||
uint32 unknown2;
|
||||
int32 stopFrame4; //10
|
||||
uint32 Timeto2ndfloor; // 0 Time to 2nd floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false
|
||||
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached1stfloor; // 3 Reached 1st floor, References: GameEvents, NoValue = 0
|
||||
uint32 Reached2ndfloor; // 4 Reached 2nd floor, References: GameEvents, NoValue = 0
|
||||
uint32 mapID; // 5 mapID, References: Map, NoValue = -1
|
||||
uint32 Timeto3rdfloor; // 6 Time to 3rd floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached3rdfloor; // 7 Reached 3rd floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto4thfloor; // 8 Time to 4th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached4thfloor; // 9 Reached 4th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto5thfloor; // 10 Time to 5th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached5thfloor; // 11 Reached 5th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto6thfloor; // 12 Time to 6th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached6thfloor; // 13 Reached 6th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto7thfloor; // 14 Time to 7th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached7thfloor; // 15 Reached 7th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto8thfloor; // 16 Time to 8th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached8thfloor; // 17 Reached 8th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto9thfloor; // 18 Time to 9th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached9thfloor; // 19 Reached 9th floor, References: GameEvents, NoValue = 0
|
||||
uint32 Timeto10thfloor; // 20 Time to 10th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 Reached10thfloor; // 21 Reached 10th floor, References: GameEvents, NoValue = 0
|
||||
uint32 onlychargeheightcheck; // 22 only charge height check. (yards), int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 onlychargetimecheck; // 23 only charge time check, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
} transport;
|
||||
//12 GAMEOBJECT_TYPE_AREADAMAGE
|
||||
// 12 GAMEOBJECT_TYPE_AREADAMAGE
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0
|
||||
uint32 radius; //1
|
||||
uint32 damageMin; //2
|
||||
uint32 damageMax; //3
|
||||
uint32 damageSchool; //4
|
||||
uint32 autoCloseTime; //5 secs till autoclose = autoCloseTime / 0x10000
|
||||
uint32 openTextID; //6
|
||||
uint32 closeTextID; //7
|
||||
} areadamage;
|
||||
//13 GAMEOBJECT_TYPE_CAMERA
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 radius; // 1 radius, int, Min value: 0, Max value: 50, Default value: 3
|
||||
uint32 damageMin; // 2 damageMin, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 damageMax; // 3 damageMax, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 damageSchool; // 4 damageSchool, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 autoClose; // 5 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0
|
||||
} areaDamage;
|
||||
// 13 GAMEOBJECT_TYPE_CAMERA
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0 -> Lock.dbc
|
||||
uint32 cinematicId; //1
|
||||
uint32 eventID; //2
|
||||
uint32 openTextID; //3 can be used to replace castBarCaption?
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 camera; // 1 camera, References: CinematicSequences, NoValue = 0
|
||||
uint32 eventID; // 2 eventID, References: GameEvents, NoValue = 0
|
||||
uint32 openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} camera;
|
||||
//14 GAMEOBJECT_TYPE_MAPOBJECT - empty
|
||||
//15 GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
|
||||
// 14 GAMEOBJECT_TYPE_MAP_OBJECT
|
||||
struct
|
||||
{
|
||||
uint32 taxiPathId; //0
|
||||
uint32 moveSpeed; //1
|
||||
uint32 accelRate; //2
|
||||
uint32 startEventID; //3
|
||||
uint32 stopEventID; //4
|
||||
uint32 transportPhysics; //5
|
||||
uint32 mapID; //6
|
||||
uint32 worldState1; //7
|
||||
uint32 canBeStopped; //8
|
||||
} mapobject;
|
||||
// 15 GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
|
||||
struct
|
||||
{
|
||||
uint32 taxiPathID; // 0 taxiPathID, References: TaxiPath, NoValue = 0
|
||||
uint32 moveSpeed; // 1 moveSpeed, int, Min value: 1, Max value: 60, Default value: 1
|
||||
uint32 accelRate; // 2 accelRate, int, Min value: 1, Max value: 20, Default value: 1
|
||||
uint32 startEventID; // 3 startEventID, References: GameEvents, NoValue = 0
|
||||
uint32 stopEventID; // 4 stopEventID, References: GameEvents, NoValue = 0
|
||||
uint32 transportPhysics; // 5 transportPhysics, References: TransportPhysics, NoValue = 0
|
||||
uint32 mapID; // 6 mapID, References: Map, NoValue = -1
|
||||
uint32 worldState1; // 7 worldState1, References: WorldState, NoValue = 0
|
||||
uint32 allowstopping; // 8 allow stopping, enum { false, true, }; Default: false
|
||||
uint32 InitStopped; // 9 Init Stopped, enum { false, true, }; Default: false
|
||||
uint32 TrueInfiniteAOI; // 10 True Infinite AOI (programmer only!), enum { false, true, }; Default: false
|
||||
} moTransport;
|
||||
//16 GAMEOBJECT_TYPE_DUELFLAG - empty
|
||||
//17 GAMEOBJECT_TYPE_FISHINGNODE - empty
|
||||
//18 GAMEOBJECT_TYPE_RITUAL
|
||||
// 16 GAMEOBJECT_TYPE_DUEL_ARBITER
|
||||
struct
|
||||
{
|
||||
uint32 reqParticipants; //0
|
||||
uint32 spellId; //1
|
||||
uint32 animSpell; //2
|
||||
uint32 ritualPersistent; //3
|
||||
uint32 casterTargetSpell; //4
|
||||
uint32 casterTargetSpellTargets; //5
|
||||
uint32 castersGrouped; //6
|
||||
uint32 ritualNoTargetCheck; //7
|
||||
} summoningRitual;
|
||||
//19 GAMEOBJECT_TYPE_MAILBOX - empty
|
||||
//20 GAMEOBJECT_TYPE_DONOTUSE - empty
|
||||
//21 GAMEOBJECT_TYPE_GUARDPOST
|
||||
} duelFlag;
|
||||
// 17 GAMEOBJECT_TYPE_FISHINGNODE
|
||||
struct
|
||||
{
|
||||
uint32 creatureID; //0
|
||||
uint32 charges; //1
|
||||
} guardpost;
|
||||
//22 GAMEOBJECT_TYPE_SPELLCASTER
|
||||
} fishingNode;
|
||||
// 18 GAMEOBJECT_TYPE_RITUAL
|
||||
struct
|
||||
{
|
||||
uint32 spellId; //0
|
||||
uint32 charges; //1
|
||||
uint32 partyOnly; //2
|
||||
uint32 allowMounted; //3 Is usable while on mount/vehicle. (0/1)
|
||||
uint32 large; //4
|
||||
} spellcaster;
|
||||
//23 GAMEOBJECT_TYPE_MEETINGSTONE
|
||||
uint32 casters; // 0 casters, int, Min value: 1, Max value: 10, Default value: 1
|
||||
uint32 spell; // 1 spell, References: Spell, NoValue = 0
|
||||
uint32 animSpell; // 2 animSpell, References: Spell, NoValue = 0
|
||||
uint32 ritualPersistent; // 3 ritualPersistent, enum { false, true, }; Default: false
|
||||
uint32 casterTargetSpell; // 4 casterTargetSpell, References: Spell, NoValue = 0
|
||||
uint32 casterTargetSpellTargets; // 5 casterTargetSpellTargets, int, Min value: 1, Max value: 10, Default value: 1
|
||||
uint32 castersGrouped; // 6 castersGrouped, enum { false, true, }; Default: true
|
||||
uint32 ritualNoTargetCheck; // 7 ritualNoTargetCheck, enum { false, true, }; Default: true
|
||||
uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} ritual;
|
||||
// 19 GAMEOBJECT_TYPE_MAILBOX
|
||||
struct
|
||||
{
|
||||
uint32 minLevel; //0
|
||||
uint32 maxLevel; //1
|
||||
uint32 areaID; //2
|
||||
} meetingstone;
|
||||
//24 GAMEOBJECT_TYPE_FLAGSTAND
|
||||
uint32 conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} mailbox;
|
||||
// 20 GAMEOBJECT_TYPE_DO_NOT_USE
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0
|
||||
uint32 pickupSpell; //1
|
||||
uint32 radius; //2
|
||||
uint32 returnAura; //3
|
||||
uint32 returnSpell; //4
|
||||
uint32 noDamageImmune; //5
|
||||
uint32 openTextID; //6
|
||||
uint32 losOK; //7
|
||||
} flagstand;
|
||||
//25 GAMEOBJECT_TYPE_FISHINGHOLE
|
||||
} DONOTUSE;
|
||||
// 21 GAMEOBJECT_TYPE_GUARDPOST
|
||||
struct
|
||||
{
|
||||
uint32 radius; //0 how close bobber must land for sending loot
|
||||
uint32 lootId; //1
|
||||
uint32 minSuccessOpens; //2
|
||||
uint32 maxSuccessOpens; //3
|
||||
uint32 lockId; //4 -> Lock.dbc; possibly 1628 for all?
|
||||
} fishinghole;
|
||||
//26 GAMEOBJECT_TYPE_FLAGDROP
|
||||
uint32 creatureID; // 0 creatureID, References: Creature, NoValue = 0
|
||||
uint32 charges; // 1 charges, int, Min value: 0, Max value: 65535, Default value: 1
|
||||
} guardPost;
|
||||
// 22 GAMEOBJECT_TYPE_SPELLCASTER
|
||||
struct
|
||||
{
|
||||
uint32 lockId; //0
|
||||
uint32 eventID; //1
|
||||
uint32 pickupSpell; //2
|
||||
uint32 noDamageImmune; //3
|
||||
uint32 openTextID; //4
|
||||
} flagdrop;
|
||||
//27 GAMEOBJECT_TYPE_MINI_GAME
|
||||
uint32 spell; // 0 spell, References: Spell, NoValue = 0
|
||||
uint32 charges; // 1 charges, int, Min value: -1, Max value: 65535, Default value: 1
|
||||
uint32 partyOnly; // 2 partyOnly, enum { false, true, }; Default: false
|
||||
uint32 allowMounted; // 3 allowMounted, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 4 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 conditionID1; // 5 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 playerCast; // 6 playerCast, enum { false, true, }; Default: false
|
||||
uint32 NeverUsableWhileMounted; // 7 Never Usable While Mounted, enum { false, true, }; Default: false
|
||||
} spellCaster;
|
||||
// 23 GAMEOBJECT_TYPE_MEETINGSTONE
|
||||
struct
|
||||
{
|
||||
uint32 gameType; //0
|
||||
} miniGame;
|
||||
//29 GAMEOBJECT_TYPE_CAPTURE_POINT
|
||||
uint32 minLevel; // 0 minLevel, int, Min value: 0, Max value: 65535, Default value: 1
|
||||
uint32 maxLevel; // 1 maxLevel, int, Min value: 1, Max value: 65535, Default value: 60
|
||||
uint32 areaID; // 2 areaID, References: AreaTable, NoValue = 0
|
||||
} meetingStone;
|
||||
// 24 GAMEOBJECT_TYPE_FLAGSTAND
|
||||
struct
|
||||
{
|
||||
uint32 radius; //0
|
||||
uint32 spell; //1
|
||||
uint32 worldState1; //2
|
||||
uint32 worldstate2; //3
|
||||
uint32 winEventID1; //4
|
||||
uint32 winEventID2; //5
|
||||
uint32 contestedEventID1; //6
|
||||
uint32 contestedEventID2; //7
|
||||
uint32 progressEventID1; //8
|
||||
uint32 progressEventID2; //9
|
||||
uint32 neutralEventID1; //10
|
||||
uint32 neutralEventID2; //11
|
||||
uint32 neutralPercent; //12
|
||||
uint32 worldstate3; //13
|
||||
uint32 minSuperiority; //14
|
||||
uint32 maxSuperiority; //15
|
||||
uint32 minTime; //16
|
||||
uint32 maxTime; //17
|
||||
uint32 large; //18
|
||||
uint32 highlight; //19
|
||||
uint32 startingValue; //20
|
||||
uint32 unidirectional; //21
|
||||
} capturePoint;
|
||||
//30 GAMEOBJECT_TYPE_AURA_GENERATOR
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 pickupSpell; // 1 pickupSpell, References: Spell, NoValue = 0
|
||||
uint32 radius; // 2 radius, int, Min value: 0, Max value: 50, Default value: 0
|
||||
uint32 returnAura; // 3 returnAura, References: Spell, NoValue = 0
|
||||
uint32 returnSpell; // 4 returnSpell, References: Spell, NoValue = 0
|
||||
uint32 noDamageImmune; // 5 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 requireLOS; // 7 require LOS, enum { false, true, }; Default: true
|
||||
uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 playerCast; // 9 playerCast, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 10 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 InfiniteAOI; // 11 Infinite AOI, enum { false, true, }; Default: false
|
||||
uint32 cooldown; // 12 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000
|
||||
} flagStand;
|
||||
// 25 GAMEOBJECT_TYPE_FISHINGHOLE
|
||||
struct
|
||||
{
|
||||
uint32 startOpen; //0
|
||||
uint32 radius; //1
|
||||
uint32 auraID1; //2
|
||||
uint32 conditionID1; //3
|
||||
uint32 auraID2; //4
|
||||
uint32 conditionID2; //5
|
||||
uint32 serverOnly; //6
|
||||
uint32 radius; // 0 radius, int, Min value: 0, Max value: 50, Default value: 0
|
||||
uint32 chestLoot; // 1 chestLoot, References: Treasure, NoValue = 0
|
||||
uint32 minRestock; // 2 minRestock, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 maxRestock; // 3 maxRestock, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 open; // 4 open, References: Lock_, NoValue = 0
|
||||
} fishingHole;
|
||||
// 26 GAMEOBJECT_TYPE_FLAGDROP
|
||||
struct
|
||||
{
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 eventID; // 1 eventID, References: GameEvents, NoValue = 0
|
||||
uint32 pickupSpell; // 2 pickupSpell, References: Spell, NoValue = 0
|
||||
uint32 noDamageImmune; // 3 noDamageImmune, enum { false, true, }; Default: false
|
||||
uint32 openTextID; // 4 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 playerCast; // 5 playerCast, enum { false, true, }; Default: false
|
||||
uint32 ExpireDuration; // 6 Expire Duration, int, Min value: 0, Max value: 60000, Default value: 10000
|
||||
uint32 GiganticAOI; // 7 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 InfiniteAOI; // 8 Infinite AOI, enum { false, true, }; Default: false
|
||||
uint32 cooldown; // 9 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000
|
||||
} flagDrop;
|
||||
// 27 GAMEOBJECT_TYPE_MINI_GAME
|
||||
struct
|
||||
{
|
||||
} DONOTUSE3;
|
||||
// 28 GAMEOBJECT_TYPE_DO_NOT_USE_2
|
||||
struct
|
||||
{
|
||||
} DONOTUSE2;
|
||||
// 29 GAMEOBJECT_TYPE_CONTROL_ZONE
|
||||
struct
|
||||
{
|
||||
uint32 radius; // 0 radius, int, Min value: 0, Max value: 100, Default value: 10
|
||||
uint32 spell; // 1 spell, References: Spell, NoValue = 0
|
||||
uint32 worldState1; // 2 worldState1, References: WorldState, NoValue = 0
|
||||
uint32 worldstate2; // 3 worldstate2, References: WorldState, NoValue = 0
|
||||
uint32 CaptureEventHorde; // 4 Capture Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 CaptureEventAlliance; // 5 Capture Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 ContestedEventHorde; // 6 Contested Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 ContestedEventAlliance; // 7 Contested Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 ProgressEventHorde; // 8 Progress Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 ProgressEventAlliance; // 9 Progress Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 NeutralEventHorde; // 10 Neutral Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 NeutralEventAlliance; // 11 Neutral Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 neutralPercent; // 12 neutralPercent, int, Min value: 0, Max value: 100, Default value: 0
|
||||
uint32 worldstate3; // 13 worldstate3, References: WorldState, NoValue = 0
|
||||
uint32 minSuperiority; // 14 minSuperiority, int, Min value: 1, Max value: 65535, Default value: 1
|
||||
uint32 maxSuperiority; // 15 maxSuperiority, int, Min value: 1, Max value: 65535, Default value: 1
|
||||
uint32 minTime; // 16 minTime, int, Min value: 1, Max value: 65535, Default value: 1
|
||||
uint32 maxTime; // 17 maxTime, int, Min value: 1, Max value: 65535, Default value: 1
|
||||
uint32 GiganticAOI; // 18 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 highlight; // 19 highlight, enum { false, true, }; Default: true
|
||||
uint32 startingValue; // 20 startingValue, int, Min value: 0, Max value: 100, Default value: 50
|
||||
uint32 unidirectional; // 21 unidirectional, enum { false, true, }; Default: false
|
||||
uint32 killbonustime; // 22 kill bonus time %, int, Min value: 0, Max value: 100, Default value: 0
|
||||
uint32 speedWorldState1; // 23 speedWorldState1, References: WorldState, NoValue = 0
|
||||
uint32 speedWorldState2; // 24 speedWorldState2, References: WorldState, NoValue = 0
|
||||
uint32 UncontestedTime; // 25 Uncontested Time, int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 FrequentHeartbeat; // 26 Frequent Heartbeat, enum { false, true, }; Default: false
|
||||
} controlZone;
|
||||
// 30 GAMEOBJECT_TYPE_AURA_GENERATOR
|
||||
struct
|
||||
{
|
||||
uint32 startOpen; // 0 startOpen, enum { false, true, }; Default: true
|
||||
uint32 radius; // 1 radius, int, Min value: 0, Max value: 100, Default value: 10
|
||||
uint32 auraID1; // 2 auraID1, References: Spell, NoValue = 0
|
||||
uint32 conditionID1; // 3 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 auraID2; // 4 auraID2, References: Spell, NoValue = 0
|
||||
uint32 conditionID2; // 5 conditionID2, References: PlayerCondition, NoValue = 0
|
||||
uint32 serverOnly; // 6 serverOnly, enum { false, true, }; Default: false
|
||||
} auraGenerator;
|
||||
//31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY
|
||||
// 31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY
|
||||
struct
|
||||
{
|
||||
uint32 mapID; //0
|
||||
uint32 difficulty; //1
|
||||
uint32 InstanceType; // 0 Instance Type, enum { Not Instanced, Party Dungeon, Raid Dungeon, PVP Battlefield, Arena Battlefield, Scenario, }; Default: Party Dungeon
|
||||
uint32 DifficultyNormal; // 1 Difficulty Normal, References: animationdata, NoValue = 0
|
||||
uint32 DifficultyHeroic; // 2 Difficulty Heroic, References: animationdata, NoValue = 0
|
||||
uint32 DifficultyEpic; // 3 Difficulty Epic, References: animationdata, NoValue = 0
|
||||
uint32 DifficultyLegendary; // 4 Difficulty Legendary, References: animationdata, NoValue = 0
|
||||
uint32 HeroicAttachment; // 5 Heroic Attachment, References: gameobjectdisplayinfo, NoValue = 0
|
||||
uint32 ChallengeAttachment; // 6 Challenge Attachment, References: gameobjectdisplayinfo, NoValue = 0
|
||||
uint32 DifficultyAnimations; // 7 Difficulty Animations, References: GameObjectDiffAnim, NoValue = 0
|
||||
uint32 LargeAOI; // 8 Large AOI, enum { false, true, }; Default: false
|
||||
uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 Legacy; // 10 Legacy, enum { false, true, }; Default: false
|
||||
} dungeonDifficulty;
|
||||
//32 GAMEOBJECT_TYPE_BARBER_CHAIR
|
||||
// 32 GAMEOBJECT_TYPE_BARBER_CHAIR
|
||||
struct
|
||||
{
|
||||
uint32 chairheight; //0
|
||||
uint32 heightOffset; //1
|
||||
uint32 chairheight; // 0 chairheight, int, Min value: 0, Max value: 2, Default value: 1
|
||||
uint32 HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0
|
||||
} barberChair;
|
||||
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
|
||||
// 33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
|
||||
struct
|
||||
{
|
||||
uint32 intactNumHits; //0
|
||||
uint32 creditProxyCreature; //1
|
||||
uint32 state1Name; //2
|
||||
uint32 intactEvent; //3
|
||||
uint32 damagedDisplayId; //4
|
||||
uint32 damagedNumHits; //5
|
||||
uint32 empty3; //6
|
||||
uint32 empty4; //7
|
||||
uint32 empty5; //8
|
||||
uint32 damagedEvent; //9
|
||||
uint32 destroyedDisplayId; //10
|
||||
uint32 empty7; //11
|
||||
uint32 empty8; //12
|
||||
uint32 empty9; //13
|
||||
uint32 destroyedEvent; //14
|
||||
uint32 empty10; //15
|
||||
uint32 debuildingTimeSecs; //16
|
||||
uint32 empty11; //17
|
||||
uint32 destructibleData; //18
|
||||
uint32 rebuildingEvent; //19
|
||||
uint32 empty12; //20
|
||||
uint32 empty13; //21
|
||||
uint32 damageEvent; //22
|
||||
uint32 empty14; //23
|
||||
} building;
|
||||
//34 GAMEOBJECT_TYPE_GUILDBANK - empty
|
||||
//35 GAMEOBJECT_TYPE_TRAPDOOR
|
||||
uint32 Unused; // 0 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 CreditProxyCreature; // 1 Credit Proxy Creature, References: Creature, NoValue = 0
|
||||
uint32 HealthRec; // 2 Health Rec, References: DestructibleHitpoint, NoValue = 0
|
||||
uint32 IntactEvent; // 3 Intact Event, References: GameEvents, NoValue = 0
|
||||
uint32 PVPEnabling; // 4 PVP Enabling, enum { false, true, }; Default: false
|
||||
uint32 InteriorVisible; // 5 Interior Visible, enum { false, true, }; Default: false
|
||||
uint32 InteriorLight; // 6 Interior Light, enum { false, true, }; Default: false
|
||||
uint32 Unused1; // 7 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 Unused2; // 8 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 DamagedEvent; // 9 Damaged Event, References: GameEvents, NoValue = 0
|
||||
uint32 Unused3; // 10 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 Unused4; // 11 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 Unused5; // 12 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 Unused6; // 13 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 DestroyedEvent; // 14 Destroyed Event, References: GameEvents, NoValue = 0
|
||||
uint32 Unused7; // 15 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 RebuildingTime; // 16 Rebuilding: Time (secs), int, Min value: 0, Max value: 65535, Default value: 0
|
||||
uint32 Unused8; // 17 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 DestructibleModelRec; // 18 Destructible Model Rec, References: DestructibleModelData, NoValue = 0
|
||||
uint32 RebuildingEvent; // 19 Rebuilding: Event, References: GameEvents, NoValue = 0
|
||||
uint32 Unused9; // 20 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 Unused10; // 21 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 DamageEvent; // 22 Damage Event, References: GameEvents, NoValue = 0
|
||||
} destructibleBuilding;
|
||||
// 34 GAMEOBJECT_TYPE_GUILD_BANK
|
||||
struct
|
||||
{
|
||||
uint32 whenToPause; // 0
|
||||
uint32 startOpen; // 1
|
||||
uint32 autoClose; // 2
|
||||
} trapDoor;
|
||||
|
||||
// not use for specific field access (only for output with loop by all filed), also this determinate max union size
|
||||
uint32 conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
} guildbank;
|
||||
// 35 GAMEOBJECT_TYPE_TRAPDOOR
|
||||
struct
|
||||
{
|
||||
uint32 Unused; // 0 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false
|
||||
uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
|
||||
uint32 BlocksPathsDown; // 3 Blocks Paths Down, enum { false, true, }; Default: false
|
||||
} trapdoor;
|
||||
// 36 GAMEOBJECT_TYPE_NEW_FLAG
|
||||
struct
|
||||
{
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
uint32 pickupSpell; // 1 pickupSpell, References: Spell, NoValue = 0
|
||||
uint32 openTextID; // 2 openTextID, References: BroadcastText, NoValue = 0
|
||||
uint32 requireLOS; // 3 require LOS, enum { false, true, }; Default: true
|
||||
uint32 conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
|
||||
uint32 GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 InfiniteAOI; // 6 Infinite AOI, enum { false, true, }; Default: false
|
||||
uint32 ExpireDuration; // 7 Expire Duration, int, Min value: 0, Max value: 3600000, Default value: 10000
|
||||
uint32 RespawnTime; // 8 Respawn Time, int, Min value: 0, Max value: 3600000, Default value: 20000
|
||||
uint32 FlagDrop; // 9 Flag Drop, References: GameObjects, NoValue = 0
|
||||
uint32 ExclusiveCategory; // 10 Exclusive Category (BGs Only), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
uint32 worldState1; // 11 worldState1, References: WorldState, NoValue = 0
|
||||
uint32 ReturnonDefenderInteract; // 12 Return on Defender Interact, enum { false, true, }; Default: false
|
||||
} newflag;
|
||||
// 37 GAMEOBJECT_TYPE_NEW_FLAG_DROP
|
||||
struct
|
||||
{
|
||||
uint32 open; // 0 open, References: Lock_, NoValue = 0
|
||||
} newflagdrop;
|
||||
// 38 GAMEOBJECT_TYPE_GARRISON_BUILDING
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 0 mapID, References: Map, NoValue = -1
|
||||
} garrisonBuilding;
|
||||
// 39 GAMEOBJECT_TYPE_GARRISON_PLOT
|
||||
struct
|
||||
{
|
||||
uint32 PlotInstance; // 0 Plot Instance, References: GarrPlotInstance, NoValue = 0
|
||||
uint32 mapID; // 1 mapID, References: Map, NoValue = -1
|
||||
} garrisonPlot;
|
||||
// 40 GAMEOBJECT_TYPE_CLIENT_CREATURE
|
||||
struct
|
||||
{
|
||||
uint32 CreatureDisplayInfo; // 0 Creature Display Info, References: CreatureDisplayInfo, NoValue = 0
|
||||
uint32 AnimKit; // 1 Anim Kit, References: AnimKit, NoValue = 0
|
||||
uint32 creatureID; // 2 creatureID, References: Creature, NoValue = 0
|
||||
} clientCreature;
|
||||
// 41 GAMEOBJECT_TYPE_CLIENT_ITEM
|
||||
struct
|
||||
{
|
||||
uint32 Item; // 0 Item, References: Item, NoValue = 0
|
||||
} clientItem;
|
||||
// 42 GAMEOBJECT_TYPE_CAPTURE_POINT
|
||||
struct
|
||||
{
|
||||
uint32 CaptureTime; // 0 Capture Time (ms), int, Min value: 0, Max value: 2147483647, Default value: 60000
|
||||
uint32 GiganticAOI; // 1 Gigantic AOI, enum { false, true, }; Default: false
|
||||
uint32 highlight; // 2 highlight, enum { false, true, }; Default: true
|
||||
uint32 open; // 3 open, References: Lock_, NoValue = 0
|
||||
uint32 AssaultBroadcastHorde; // 4 Assault Broadcast (Horde), References: BroadcastText, NoValue = 0
|
||||
uint32 CaptureBroadcastHorde; // 5 Capture Broadcast (Horde), References: BroadcastText, NoValue = 0
|
||||
uint32 DefendedBroadcastHorde; // 6 Defended Broadcast (Horde), References: BroadcastText, NoValue = 0
|
||||
uint32 AssaultBroadcastAlliance; // 7 Assault Broadcast (Alliance), References: BroadcastText, NoValue = 0
|
||||
uint32 CaptureBroadcastAlliance; // 8 Capture Broadcast (Alliance), References: BroadcastText, NoValue = 0
|
||||
uint32 DefendedBroadcastAlliance; // 9 Defended Broadcast (Alliance), References: BroadcastText, NoValue = 0
|
||||
uint32 worldState1; // 10 worldState1, References: WorldState, NoValue = 0
|
||||
uint32 ContestedEventHorde; // 11 Contested Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 CaptureEventHorde; // 12 Capture Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 DefendedEventHorde; // 13 Defended Event (Horde), References: GameEvents, NoValue = 0
|
||||
uint32 ContestedEventAlliance; // 14 Contested Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 CaptureEventAlliance; // 15 Capture Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 DefendedEventAlliance; // 16 Defended Event (Alliance), References: GameEvents, NoValue = 0
|
||||
uint32 SpellVisual1; // 17 Spell Visual 1, References: SpellVisual, NoValue = 0
|
||||
uint32 SpellVisual2; // 18 Spell Visual 2, References: SpellVisual, NoValue = 0
|
||||
uint32 SpellVisual3; // 19 Spell Visual 3, References: SpellVisual, NoValue = 0
|
||||
uint32 SpellVisual4; // 20 Spell Visual 4, References: SpellVisual, NoValue = 0
|
||||
uint32 SpellVisual5; // 21 Spell Visual 5, References: SpellVisual, NoValue = 0
|
||||
} capturePoint;
|
||||
// 43 GAMEOBJECT_TYPE_PHASEABLE_MO
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 0 mapID, References: Map, NoValue = -1
|
||||
uint32 namedset; // 1 named set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
|
||||
} phaseableMO;
|
||||
// 44 GAMEOBJECT_TYPE_GARRISON_MONUMENT
|
||||
struct
|
||||
{
|
||||
uint32 TrophyTypeID; // 0 Trophy Type ID, References: TrophyType, NoValue = 0
|
||||
uint32 TrophyInstanceID; // 1 Trophy Instance ID, References: TrophyInstance, NoValue = 0
|
||||
} garrisonMonument;
|
||||
// 45 GAMEOBJECT_TYPE_GARRISON_SHIPMENT
|
||||
struct
|
||||
{
|
||||
uint32 ShipmentContainer; // 0 Shipment Container, References: CharShipmentContainer, NoValue = 0
|
||||
} garrisonShipment;
|
||||
// 46 GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE
|
||||
struct
|
||||
{
|
||||
uint32 TrophyInstanceID; // 0 Trophy Instance ID, References: TrophyInstance, NoValue = 0
|
||||
} garrisonMonumentPlaque;
|
||||
struct
|
||||
{
|
||||
uint32 data[MAX_GAMEOBJECT_DATA];
|
||||
@@ -426,7 +631,7 @@ struct GameObjectTemplate
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.allowMounted != 0;
|
||||
case GAMEOBJECT_TYPE_TEXT: return text.allowMounted != 0;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.allowMounted != 0;
|
||||
case GAMEOBJECT_TYPE_SPELLCASTER: return spellcaster.allowMounted != 0;
|
||||
case GAMEOBJECT_TYPE_SPELLCASTER: return spellCaster.allowMounted != 0;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
@@ -435,17 +640,20 @@ struct GameObjectTemplate
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_DOOR: return door.lockId;
|
||||
case GAMEOBJECT_TYPE_BUTTON: return button.lockId;
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.lockId;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.lockId;
|
||||
case GAMEOBJECT_TYPE_TRAP: return trap.lockId;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.lockId;
|
||||
case GAMEOBJECT_TYPE_AREADAMAGE: return areadamage.lockId;
|
||||
case GAMEOBJECT_TYPE_CAMERA: return camera.lockId;
|
||||
case GAMEOBJECT_TYPE_FLAGSTAND: return flagstand.lockId;
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE:return fishinghole.lockId;
|
||||
case GAMEOBJECT_TYPE_FLAGDROP: return flagdrop.lockId;
|
||||
case GAMEOBJECT_TYPE_DOOR: return door.open;
|
||||
case GAMEOBJECT_TYPE_BUTTON: return button.open;
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.open;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.open;
|
||||
case GAMEOBJECT_TYPE_TRAP: return trap.open;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.open;
|
||||
case GAMEOBJECT_TYPE_AREADAMAGE: return areaDamage.open;
|
||||
case GAMEOBJECT_TYPE_CAMERA: return camera.open;
|
||||
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.open;
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE: return fishingHole.open;
|
||||
case GAMEOBJECT_TYPE_FLAGDROP: return flagDrop.open;
|
||||
case GAMEOBJECT_TYPE_NEW_FLAG: return newflag.open;
|
||||
case GAMEOBJECT_TYPE_NEW_FLAG_DROP: return newflagdrop.open;
|
||||
case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.open;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
@@ -458,8 +666,8 @@ struct GameObjectTemplate
|
||||
case GAMEOBJECT_TYPE_BUTTON: return button.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_FLAGSTAND: return flagstand.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_FLAGDROP: return flagdrop.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.noDamageImmune != 0;
|
||||
case GAMEOBJECT_TYPE_FLAGDROP: return flagDrop.noDamageImmune != 0;
|
||||
default: return true;
|
||||
}
|
||||
}
|
||||
@@ -469,8 +677,8 @@ struct GameObjectTemplate
|
||||
switch (type)
|
||||
{
|
||||
//case GAMEOBJECT_TYPE_TRAP: return trap.charges;
|
||||
case GAMEOBJECT_TYPE_GUARDPOST: return guardpost.charges;
|
||||
case GAMEOBJECT_TYPE_SPELLCASTER: return spellcaster.charges;
|
||||
case GAMEOBJECT_TYPE_GUARDPOST: return guardPost.charges;
|
||||
case GAMEOBJECT_TYPE_SPELLCASTER: return spellCaster.charges;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
@@ -479,9 +687,10 @@ struct GameObjectTemplate
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.linkedTrapId;
|
||||
case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.linkedTrapId;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.linkedTrapId;
|
||||
case GAMEOBJECT_TYPE_BUTTON: return button.linkedTrap;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.linkedTrap;
|
||||
case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.linkedTrap;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.linkedTrap;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
@@ -491,12 +700,13 @@ struct GameObjectTemplate
|
||||
uint32 autoCloseTime = 0;
|
||||
switch (type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_DOOR: autoCloseTime = door.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_BUTTON: autoCloseTime = button.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_TRAP: autoCloseTime = trap.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_GOOBER: autoCloseTime = goober.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_TRANSPORT: autoCloseTime = transport.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_AREADAMAGE: autoCloseTime = areadamage.autoCloseTime; break;
|
||||
case GAMEOBJECT_TYPE_DOOR: autoCloseTime = door.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_BUTTON: autoCloseTime = button.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_TRAP: autoCloseTime = trap.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_GOOBER: autoCloseTime = goober.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_TRANSPORT: autoCloseTime = transport.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_AREADAMAGE: autoCloseTime = areaDamage.autoClose; break;
|
||||
case GAMEOBJECT_TYPE_TRAPDOOR: autoCloseTime = trapdoor.autoClose; break;
|
||||
default: break;
|
||||
}
|
||||
return autoCloseTime / IN_MILLISECONDS; // prior to 3.0.3, conversion was / 0x10000;
|
||||
@@ -506,8 +716,8 @@ struct GameObjectTemplate
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.lootId;
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE: return fishinghole.lootId;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.chestLoot;
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE: return fishingHole.chestLoot;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
@@ -526,8 +736,8 @@ struct GameObjectTemplate
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.eventId;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.eventId;
|
||||
case GAMEOBJECT_TYPE_GOOBER: return goober.eventID;
|
||||
case GAMEOBJECT_TYPE_CHEST: return chest.triggeredEvent;
|
||||
case GAMEOBJECT_TYPE_CAMERA: return camera.eventID;
|
||||
default: return 0;
|
||||
}
|
||||
|
||||
@@ -8958,7 +8958,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)
|
||||
loot->clear();
|
||||
|
||||
Group* group = GetGroup();
|
||||
bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
|
||||
bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.usegrouplootrules);
|
||||
|
||||
// check current RR player and get next if necessary
|
||||
if (groupRules)
|
||||
@@ -8976,7 +8976,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)
|
||||
else if (loot_type == LOOT_FISHING_JUNK)
|
||||
go->getFishLootJunk(loot, this);
|
||||
|
||||
if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules)
|
||||
if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.usegrouplootrules)
|
||||
{
|
||||
if (Group* group = GetGroup())
|
||||
{
|
||||
|
||||
@@ -92,7 +92,7 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid,
|
||||
SetPeriod(tInfo->pathTime);
|
||||
SetEntry(goinfo->entry);
|
||||
SetDisplayId(goinfo->displayId);
|
||||
SetGoState(!goinfo->moTransport.canBeStopped ? GO_STATE_READY : GO_STATE_ACTIVE);
|
||||
SetGoState(!goinfo->moTransport.allowstopping ? GO_STATE_READY : GO_STATE_ACTIVE);
|
||||
SetGoType(GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT);
|
||||
SetGoAnimProgress(animprogress);
|
||||
SetName(goinfo->name);
|
||||
@@ -169,7 +169,7 @@ void Transport::Update(uint32 diff)
|
||||
SetMoving(true);
|
||||
|
||||
// Enable movement
|
||||
if (GetGOInfo()->moTransport.canBeStopped)
|
||||
if (GetGOInfo()->moTransport.allowstopping)
|
||||
SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime)
|
||||
@@ -548,7 +548,7 @@ void Transport::UnloadStaticPassengers()
|
||||
|
||||
void Transport::EnableMovement(bool enabled)
|
||||
{
|
||||
if (!GetGOInfo()->moTransport.canBeStopped)
|
||||
if (!GetGOInfo()->moTransport.allowstopping)
|
||||
return;
|
||||
|
||||
_pendingStop = !enabled;
|
||||
|
||||
@@ -6506,7 +6506,7 @@ inline void CheckGOLockId(GameObjectTemplate const* goInfo, uint32 dataN, uint32
|
||||
return;
|
||||
|
||||
TC_LOG_ERROR("sql.sql", "Gameobject (Entry: %u GoType: %u) have data%d=%u but lock (Id: %u) not found.",
|
||||
goInfo->entry, goInfo->type, N, goInfo->door.lockId, goInfo->door.lockId);
|
||||
goInfo->entry, goInfo->type, N, goInfo->door.open, goInfo->door.open);
|
||||
}
|
||||
|
||||
inline void CheckGOLinkedTrapId(GameObjectTemplate const* goInfo, uint32 dataN, uint32 N)
|
||||
@@ -6569,8 +6569,8 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
"questItem4, questItem5, questItem6, data0, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12, "
|
||||
// 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
||||
"data13, data14, data15, data16, data17, data18, data19, data20, data21, data22, data23, data24, data25, data26, data27, data28, "
|
||||
// 45 46 47 48 49 50
|
||||
"data29, data30, data31, unkInt32, AIName, ScriptName "
|
||||
// 45 46 47 48 49 50 51
|
||||
"data29, data30, data31, data32, unkInt32, AIName, ScriptName "
|
||||
"FROM gameobject_template");
|
||||
|
||||
if (!result)
|
||||
@@ -6606,9 +6606,9 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
|
||||
got.raw.data[i] = fields[16 + i].GetUInt32();
|
||||
|
||||
got.unkInt32 = fields[48].GetInt32();
|
||||
got.AIName = fields[49].GetString();
|
||||
got.ScriptId = GetScriptId(fields[50].GetCString());
|
||||
got.unkInt32 = fields[49].GetInt32();
|
||||
got.AIName = fields[50].GetString();
|
||||
got.ScriptId = GetScriptId(fields[51].GetCString());
|
||||
|
||||
// Checks
|
||||
|
||||
@@ -6616,95 +6616,95 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
{
|
||||
case GAMEOBJECT_TYPE_DOOR: //0
|
||||
{
|
||||
if (got.door.lockId)
|
||||
CheckGOLockId(&got, got.door.lockId, 1);
|
||||
if (got.door.open)
|
||||
CheckGOLockId(&got, got.door.open, 1);
|
||||
CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_BUTTON: //1
|
||||
{
|
||||
if (got.button.lockId)
|
||||
CheckGOLockId(&got, got.button.lockId, 1);
|
||||
if (got.button.open)
|
||||
CheckGOLockId(&got, got.button.open, 1);
|
||||
CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_QUESTGIVER: //2
|
||||
{
|
||||
if (got.questgiver.lockId)
|
||||
CheckGOLockId(&got, got.questgiver.lockId, 0);
|
||||
if (got.questgiver.open)
|
||||
CheckGOLockId(&got, got.questgiver.open, 0);
|
||||
CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_CHEST: //3
|
||||
{
|
||||
if (got.chest.lockId)
|
||||
CheckGOLockId(&got, got.chest.lockId, 0);
|
||||
if (got.chest.open)
|
||||
CheckGOLockId(&got, got.chest.open, 0);
|
||||
|
||||
CheckGOConsumable(&got, got.chest.consumable, 3);
|
||||
|
||||
if (got.chest.linkedTrapId) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
|
||||
if (got.chest.linkedTrap) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.chest.linkedTrap, 7);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_TRAP: //6
|
||||
{
|
||||
if (got.trap.lockId)
|
||||
CheckGOLockId(&got, got.trap.lockId, 0);
|
||||
if (got.trap.open)
|
||||
CheckGOLockId(&got, got.trap.open, 0);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_CHAIR: //7
|
||||
CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
|
||||
CheckAndFixGOChairHeightId(&got, got.chair.chairheight, 1);
|
||||
break;
|
||||
case GAMEOBJECT_TYPE_SPELL_FOCUS: //8
|
||||
{
|
||||
if (got.spellFocus.focusId)
|
||||
if (got.spellFocus.spellFocusType)
|
||||
{
|
||||
if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
|
||||
if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.spellFocusType))
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data0=%u but SpellFocus (Id: %u) not exist.",
|
||||
entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
|
||||
entry, got.type, got.spellFocus.spellFocusType, got.spellFocus.spellFocusType);
|
||||
}
|
||||
|
||||
if (got.spellFocus.linkedTrapId) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
|
||||
if (got.spellFocus.linkedTrap) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrap, 2);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GOOBER: //10
|
||||
{
|
||||
if (got.goober.lockId)
|
||||
CheckGOLockId(&got, got.goober.lockId, 0);
|
||||
if (got.goober.open)
|
||||
CheckGOLockId(&got, got.goober.open, 0);
|
||||
|
||||
CheckGOConsumable(&got, got.goober.consumable, 3);
|
||||
|
||||
if (got.goober.pageId) // pageId
|
||||
if (got.goober.pageID) // pageId
|
||||
{
|
||||
if (!GetPageText(got.goober.pageId))
|
||||
if (!GetPageText(got.goober.pageID))
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data7=%u but PageText (Entry %u) not exist.",
|
||||
entry, got.type, got.goober.pageId, got.goober.pageId);
|
||||
entry, got.type, got.goober.pageID, got.goober.pageID);
|
||||
}
|
||||
CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
|
||||
if (got.goober.linkedTrapId) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
|
||||
if (got.goober.linkedTrap) // linked trap
|
||||
CheckGOLinkedTrapId(&got, got.goober.linkedTrap, 12);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_AREADAMAGE: //12
|
||||
{
|
||||
if (got.areadamage.lockId)
|
||||
CheckGOLockId(&got, got.areadamage.lockId, 0);
|
||||
if (got.areaDamage.open)
|
||||
CheckGOLockId(&got, got.areaDamage.open, 0);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_CAMERA: //13
|
||||
{
|
||||
if (got.camera.lockId)
|
||||
CheckGOLockId(&got, got.camera.lockId, 0);
|
||||
if (got.camera.open)
|
||||
CheckGOLockId(&got, got.camera.open, 0);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT: //15
|
||||
{
|
||||
if (got.moTransport.taxiPathId)
|
||||
if (got.moTransport.taxiPathID)
|
||||
{
|
||||
if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
|
||||
if (got.moTransport.taxiPathID >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathID].empty())
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data0=%u but TaxiPath (Id: %u) not exist.",
|
||||
entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
|
||||
entry, got.type, got.moTransport.taxiPathID, got.moTransport.taxiPathID);
|
||||
}
|
||||
if (uint32 transportMap = got.moTransport.mapID)
|
||||
_transportMaps.insert(transportMap);
|
||||
@@ -6715,27 +6715,27 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
case GAMEOBJECT_TYPE_SPELLCASTER: //22
|
||||
{
|
||||
// always must have spell
|
||||
CheckGOSpellId(&got, got.spellcaster.spellId, 0);
|
||||
CheckGOSpellId(&got, got.spellCaster.spell, 0);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_FLAGSTAND: //24
|
||||
{
|
||||
if (got.flagstand.lockId)
|
||||
CheckGOLockId(&got, got.flagstand.lockId, 0);
|
||||
CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
|
||||
if (got.flagStand.open)
|
||||
CheckGOLockId(&got, got.flagStand.open, 0);
|
||||
CheckGONoDamageImmuneId(&got, got.flagStand.noDamageImmune, 5);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE: //25
|
||||
{
|
||||
if (got.fishinghole.lockId)
|
||||
CheckGOLockId(&got, got.fishinghole.lockId, 4);
|
||||
if (got.fishingHole.open)
|
||||
CheckGOLockId(&got, got.fishingHole.open, 4);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_FLAGDROP: //26
|
||||
{
|
||||
if (got.flagdrop.lockId)
|
||||
CheckGOLockId(&got, got.flagdrop.lockId, 0);
|
||||
CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
|
||||
if (got.flagDrop.open)
|
||||
CheckGOLockId(&got, got.flagDrop.open, 0);
|
||||
CheckGONoDamageImmuneId(&got, got.flagDrop.noDamageImmune, 3);
|
||||
break;
|
||||
}
|
||||
case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
|
||||
@@ -7724,7 +7724,7 @@ void ObjectMgr::LoadGameObjectForQuests()
|
||||
uint32 loot_id = (itr->second.GetLootId());
|
||||
|
||||
// find quest loot for GO
|
||||
if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
|
||||
if (itr->second.chest.questID || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
|
||||
{
|
||||
_gameObjectForQuestStore.insert(itr->second.entry);
|
||||
++count;
|
||||
@@ -7733,7 +7733,7 @@ void ObjectMgr::LoadGameObjectForQuests()
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GENERIC:
|
||||
{
|
||||
if (itr->second._generic.questID > 0) //quests objects
|
||||
if (itr->second.generic.questID > 0) //quests objects
|
||||
{
|
||||
_gameObjectForQuestStore.insert(itr->second.entry);
|
||||
++count;
|
||||
@@ -7742,7 +7742,7 @@ void ObjectMgr::LoadGameObjectForQuests()
|
||||
}
|
||||
case GAMEOBJECT_TYPE_GOOBER:
|
||||
{
|
||||
if (itr->second.goober.questId > 0) //quests objects
|
||||
if (itr->second.goober.questID > 0) //quests objects
|
||||
{
|
||||
_gameObjectForQuestStore.insert(itr->second.entry);
|
||||
++count;
|
||||
|
||||
@@ -630,10 +630,10 @@ namespace Trinity
|
||||
if (go->GetGOInfo()->type != GAMEOBJECT_TYPE_SPELL_FOCUS)
|
||||
return false;
|
||||
|
||||
if (go->GetGOInfo()->spellFocus.focusId != i_focusId)
|
||||
if (go->GetGOInfo()->spellFocus.spellFocusType != i_focusId)
|
||||
return false;
|
||||
|
||||
float dist = go->GetGOInfo()->spellFocus.dist / 2.f;
|
||||
float dist = go->GetGOInfo()->spellFocus.radius / 2.f;
|
||||
|
||||
return go->IsWithinDistInMap(i_unit, dist);
|
||||
}
|
||||
@@ -649,7 +649,7 @@ namespace Trinity
|
||||
NearestGameObjectFishingHole(WorldObject const& obj, float range) : i_obj(obj), i_range(range) { }
|
||||
bool operator()(GameObject* go)
|
||||
{
|
||||
if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_FISHINGHOLE && go->isSpawned() && i_obj.IsWithinDistInMap(go, i_range) && i_obj.IsWithinDistInMap(go, (float)go->GetGOInfo()->fishinghole.radius))
|
||||
if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_FISHINGHOLE && go->isSpawned() && i_obj.IsWithinDistInMap(go, i_range) && i_obj.IsWithinDistInMap(go, (float)go->GetGOInfo()->fishingHole.radius))
|
||||
{
|
||||
i_range = i_obj.GetDistance(go);
|
||||
return true;
|
||||
|
||||
@@ -66,13 +66,13 @@ void TransportMgr::LoadTransportTemplates()
|
||||
continue;
|
||||
}
|
||||
|
||||
if (goInfo->moTransport.taxiPathId >= sTaxiPathNodesByPath.size())
|
||||
if (goInfo->moTransport.taxiPathID >= sTaxiPathNodesByPath.size())
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Transport %u (name: %s) has an invalid path specified in `gameobject_template`.`data0` (%u) field, skipped.", entry, goInfo->name.c_str(), goInfo->moTransport.taxiPathId);
|
||||
TC_LOG_ERROR("sql.sql", "Transport %u (name: %s) has an invalid path specified in `gameobject_template`.`data0` (%u) field, skipped.", entry, goInfo->name.c_str(), goInfo->moTransport.taxiPathID);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!goInfo->moTransport.taxiPathId)
|
||||
if (!goInfo->moTransport.taxiPathID)
|
||||
continue;
|
||||
|
||||
// paths are generated per template, saves us from generating it again in case of instanced transports
|
||||
@@ -109,7 +109,7 @@ public:
|
||||
|
||||
void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTemplate* transport)
|
||||
{
|
||||
uint32 pathId = goInfo->moTransport.taxiPathId;
|
||||
uint32 pathId = goInfo->moTransport.taxiPathID;
|
||||
TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId];
|
||||
std::vector<KeyFrame>& keyFrames = transport->keyFrames;
|
||||
Movement::PointsArray splinePath, allPoints;
|
||||
|
||||
@@ -1860,58 +1860,59 @@ enum SpellPreventionType
|
||||
SPELL_PREVENTION_TYPE_UNK = 3 // Only a few spells have this, but most of the should be interruptable.
|
||||
};
|
||||
|
||||
enum GameobjectTypes // (6.0.2.18988)
|
||||
enum GameobjectTypes // (6.0.3.19103)
|
||||
{
|
||||
GAMEOBJECT_TYPE_DOOR = 0,
|
||||
GAMEOBJECT_TYPE_BUTTON = 1,
|
||||
GAMEOBJECT_TYPE_QUESTGIVER = 2,
|
||||
GAMEOBJECT_TYPE_CHEST = 3,
|
||||
GAMEOBJECT_TYPE_BINDER = 4,
|
||||
GAMEOBJECT_TYPE_GENERIC = 5,
|
||||
GAMEOBJECT_TYPE_TRAP = 6,
|
||||
GAMEOBJECT_TYPE_CHAIR = 7,
|
||||
GAMEOBJECT_TYPE_SPELL_FOCUS = 8,
|
||||
GAMEOBJECT_TYPE_TEXT = 9,
|
||||
GAMEOBJECT_TYPE_GOOBER = 10,
|
||||
GAMEOBJECT_TYPE_TRANSPORT = 11,
|
||||
GAMEOBJECT_TYPE_AREADAMAGE = 12,
|
||||
GAMEOBJECT_TYPE_CAMERA = 13,
|
||||
GAMEOBJECT_TYPE_MAP_OBJECT = 14,
|
||||
GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT = 15,
|
||||
GAMEOBJECT_TYPE_DUEL_ARBITER = 16,
|
||||
GAMEOBJECT_TYPE_FISHINGNODE = 17,
|
||||
GAMEOBJECT_TYPE_RITUAL = 18,
|
||||
GAMEOBJECT_TYPE_MAILBOX = 19,
|
||||
GAMEOBJECT_TYPE_DO_NOT_USE = 20,
|
||||
GAMEOBJECT_TYPE_GUARDPOST = 21,
|
||||
GAMEOBJECT_TYPE_SPELLCASTER = 22,
|
||||
GAMEOBJECT_TYPE_MEETINGSTONE = 23,
|
||||
GAMEOBJECT_TYPE_FLAGSTAND = 24,
|
||||
GAMEOBJECT_TYPE_FISHINGHOLE = 25,
|
||||
GAMEOBJECT_TYPE_FLAGDROP = 26,
|
||||
GAMEOBJECT_TYPE_MINI_GAME = 27,
|
||||
GAMEOBJECT_TYPE_DO_NOT_USE_2 = 28,
|
||||
GAMEOBJECT_TYPE_CONTROL_ZONE = 29,
|
||||
GAMEOBJECT_TYPE_AURA_GENERATOR = 30,
|
||||
GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31,
|
||||
GAMEOBJECT_TYPE_BARBER_CHAIR = 32,
|
||||
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
|
||||
GAMEOBJECT_TYPE_GUILD_BANK = 34,
|
||||
GAMEOBJECT_TYPE_TRAPDOOR = 35,
|
||||
GAMEOBJECT_TYPE_NEW_FLAG = 36,
|
||||
GAMEOBJECT_TYPE_NEW_FLAG_DROP = 37,
|
||||
GAMEOBJECT_TYPE_GARRISON_BUILDING = 38,
|
||||
GAMEOBJECT_TYPE_GARRISON_PLOT = 39,
|
||||
GAMEOBJECT_TYPE_CLIENT_CREATURE = 40,
|
||||
GAMEOBJECT_TYPE_CLIENT_ITEM = 41,
|
||||
GAMEOBJECT_TYPE_CAPTURE_POINT = 42,
|
||||
GAMEOBJECT_TYPE_TROPHY = 43,
|
||||
GAMEOBJECT_TYPE_PHASEABLE_MO = 44,
|
||||
GAMEOBJECT_TYPE_SHIPMENT = 45
|
||||
GAMEOBJECT_TYPE_DOOR = 0,
|
||||
GAMEOBJECT_TYPE_BUTTON = 1,
|
||||
GAMEOBJECT_TYPE_QUESTGIVER = 2,
|
||||
GAMEOBJECT_TYPE_CHEST = 3,
|
||||
GAMEOBJECT_TYPE_BINDER = 4,
|
||||
GAMEOBJECT_TYPE_GENERIC = 5,
|
||||
GAMEOBJECT_TYPE_TRAP = 6,
|
||||
GAMEOBJECT_TYPE_CHAIR = 7,
|
||||
GAMEOBJECT_TYPE_SPELL_FOCUS = 8,
|
||||
GAMEOBJECT_TYPE_TEXT = 9,
|
||||
GAMEOBJECT_TYPE_GOOBER = 10,
|
||||
GAMEOBJECT_TYPE_TRANSPORT = 11,
|
||||
GAMEOBJECT_TYPE_AREADAMAGE = 12,
|
||||
GAMEOBJECT_TYPE_CAMERA = 13,
|
||||
GAMEOBJECT_TYPE_MAP_OBJECT = 14,
|
||||
GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT = 15,
|
||||
GAMEOBJECT_TYPE_DUEL_ARBITER = 16,
|
||||
GAMEOBJECT_TYPE_FISHINGNODE = 17,
|
||||
GAMEOBJECT_TYPE_RITUAL = 18,
|
||||
GAMEOBJECT_TYPE_MAILBOX = 19,
|
||||
GAMEOBJECT_TYPE_DO_NOT_USE = 20,
|
||||
GAMEOBJECT_TYPE_GUARDPOST = 21,
|
||||
GAMEOBJECT_TYPE_SPELLCASTER = 22,
|
||||
GAMEOBJECT_TYPE_MEETINGSTONE = 23,
|
||||
GAMEOBJECT_TYPE_FLAGSTAND = 24,
|
||||
GAMEOBJECT_TYPE_FISHINGHOLE = 25,
|
||||
GAMEOBJECT_TYPE_FLAGDROP = 26,
|
||||
GAMEOBJECT_TYPE_MINI_GAME = 27,
|
||||
GAMEOBJECT_TYPE_DO_NOT_USE_2 = 28,
|
||||
GAMEOBJECT_TYPE_CONTROL_ZONE = 29,
|
||||
GAMEOBJECT_TYPE_AURA_GENERATOR = 30,
|
||||
GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31,
|
||||
GAMEOBJECT_TYPE_BARBER_CHAIR = 32,
|
||||
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
|
||||
GAMEOBJECT_TYPE_GUILD_BANK = 34,
|
||||
GAMEOBJECT_TYPE_TRAPDOOR = 35,
|
||||
GAMEOBJECT_TYPE_NEW_FLAG = 36,
|
||||
GAMEOBJECT_TYPE_NEW_FLAG_DROP = 37,
|
||||
GAMEOBJECT_TYPE_GARRISON_BUILDING = 38,
|
||||
GAMEOBJECT_TYPE_GARRISON_PLOT = 39,
|
||||
GAMEOBJECT_TYPE_CLIENT_CREATURE = 40,
|
||||
GAMEOBJECT_TYPE_CLIENT_ITEM = 41,
|
||||
GAMEOBJECT_TYPE_CAPTURE_POINT = 42,
|
||||
GAMEOBJECT_TYPE_PHASEABLE_MO = 43,
|
||||
GAMEOBJECT_TYPE_GARRISON_MONUMENT = 44,
|
||||
GAMEOBJECT_TYPE_GARRISON_SHIPMENT = 45,
|
||||
GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE = 46
|
||||
};
|
||||
|
||||
#define MAX_GAMEOBJECT_TYPE 46 // sending to client this or greater value can crash client.
|
||||
#define MAX_GAMEOBJECT_DATA 32 // Max number of uint32 vars in gameobject_template data field
|
||||
#define MAX_GAMEOBJECT_TYPE 47 // sending to client this or greater value can crash client.
|
||||
#define MAX_GAMEOBJECT_DATA 33 // Max number of uint32 vars in gameobject_template data field
|
||||
|
||||
enum GameObjectFlags
|
||||
{
|
||||
|
||||
@@ -58,9 +58,9 @@ bool OPvPCapturePoint::HandlePlayerEnter(Player* player)
|
||||
{
|
||||
if (m_capturePoint)
|
||||
{
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct);
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldState1, 1);
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldstate3, m_neutralValuePct);
|
||||
}
|
||||
return m_activePlayers[player->GetTeamId()].insert(player->GetGUID()).second;
|
||||
}
|
||||
@@ -68,7 +68,7 @@ bool OPvPCapturePoint::HandlePlayerEnter(Player* player)
|
||||
void OPvPCapturePoint::HandlePlayerLeave(Player* player)
|
||||
{
|
||||
if (m_capturePoint)
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 0);
|
||||
player->SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldState1, 0);
|
||||
m_activePlayers[player->GetTeamId()].erase(player->GetGUID());
|
||||
}
|
||||
|
||||
@@ -78,11 +78,11 @@ void OPvPCapturePoint::SendChangePhase()
|
||||
return;
|
||||
|
||||
// send this too, sometimes the slider disappears, dunno why :(
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 1);
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldState1, 1);
|
||||
// send these updates to only the ones in this objective
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f));
|
||||
// send this too, sometimes it resets :S
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct);
|
||||
SendUpdateWorldState(m_capturePoint->GetGOInfo()->controlZone.worldstate3, m_neutralValuePct);
|
||||
}
|
||||
|
||||
void OPvPCapturePoint::AddGO(uint32 type, uint32 mapId, ObjectGuid::LowType guid, uint32 entry /*= 0*/)
|
||||
@@ -152,9 +152,9 @@ bool OPvPCapturePoint::SetCapturePointData(uint32 entry, uint32 map, float x, fl
|
||||
return false;
|
||||
|
||||
// get the needed values from goinfo
|
||||
m_maxValue = (float)goinfo->capturePoint.maxTime;
|
||||
m_maxSpeed = m_maxValue / (goinfo->capturePoint.minTime ? goinfo->capturePoint.minTime : 60);
|
||||
m_neutralValuePct = goinfo->capturePoint.neutralPercent;
|
||||
m_maxValue = (float)goinfo->controlZone.maxTime;
|
||||
m_maxSpeed = m_maxValue / (goinfo->controlZone.minTime ? goinfo->controlZone.minTime : 60);
|
||||
m_neutralValuePct = goinfo->controlZone.neutralPercent;
|
||||
m_minValue = CalculatePct(m_maxValue, m_neutralValuePct);
|
||||
|
||||
return true;
|
||||
@@ -294,7 +294,7 @@ bool OPvPCapturePoint::Update(uint32 diff)
|
||||
if (!m_capturePoint)
|
||||
return false;
|
||||
|
||||
float radius = (float)m_capturePoint->GetGOInfo()->capturePoint.radius;
|
||||
float radius = (float)m_capturePoint->GetGOInfo()->controlZone.radius;
|
||||
|
||||
for (uint32 team = 0; team < 2; ++team)
|
||||
{
|
||||
|
||||
@@ -29,7 +29,7 @@ void WorldPackets::AuctionHousePackets::AuctionCommandResult::InitializeAuction(
|
||||
AuctionId = auction->Id;
|
||||
Bid = auction->bid;
|
||||
AuctionOutBid = auction->GetAuctionOutBid();
|
||||
Bidder = ObjectGuid(HIGHGUID_PLAYER, auction->bidder);
|
||||
Bidder = ObjectGuid::Create<HighGuid::Player>(auction->bidder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1755,20 +1755,20 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
|
||||
|
||||
case GAMEOBJECT_TYPE_SPELL_FOCUS:
|
||||
// triggering linked GO
|
||||
if (uint32 trapEntry = gameObjTarget->GetGOInfo()->spellFocus.linkedTrapId)
|
||||
if (uint32 trapEntry = gameObjTarget->GetGOInfo()->spellFocus.linkedTrap)
|
||||
gameObjTarget->TriggeringLinkedGameObject(trapEntry, m_caster);
|
||||
return;
|
||||
|
||||
case GAMEOBJECT_TYPE_CHEST:
|
||||
/// @todo possible must be moved to loot release (in different from linked triggering)
|
||||
if (gameObjTarget->GetGOInfo()->chest.eventId)
|
||||
if (gameObjTarget->GetGOInfo()->chest.triggeredEvent)
|
||||
{
|
||||
TC_LOG_DEBUG("spells", "Chest ScriptStart id %u for GO " UI64FMTD, gameObjTarget->GetGOInfo()->chest.eventId, gameObjTarget->GetDBTableGUIDLow());
|
||||
player->GetMap()->ScriptsStart(sEventScripts, gameObjTarget->GetGOInfo()->chest.eventId, player, gameObjTarget);
|
||||
TC_LOG_DEBUG("spells", "Chest ScriptStart id %u for GO " UI64FMTD, gameObjTarget->GetGOInfo()->chest.triggeredEvent, gameObjTarget->GetDBTableGUIDLow());
|
||||
player->GetMap()->ScriptsStart(sEventScripts, gameObjTarget->GetGOInfo()->chest.triggeredEvent, player, gameObjTarget);
|
||||
}
|
||||
|
||||
// triggering linked GO
|
||||
if (uint32 trapEntry = gameObjTarget->GetGOInfo()->chest.linkedTrapId)
|
||||
if (uint32 trapEntry = gameObjTarget->GetGOInfo()->chest.linkedTrap)
|
||||
gameObjTarget->TriggeringLinkedGameObject(trapEntry, m_caster);
|
||||
|
||||
// Don't return, let loots been taken
|
||||
@@ -1803,7 +1803,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex)
|
||||
GameObjectTemplate const* goInfo = gameObjTarget->GetGOInfo();
|
||||
// Arathi Basin banner opening. /// @todo Verify correctness of this check
|
||||
if ((goInfo->type == GAMEOBJECT_TYPE_BUTTON && goInfo->button.noDamageImmune) ||
|
||||
(goInfo->type == GAMEOBJECT_TYPE_GOOBER && goInfo->goober.losOK))
|
||||
(goInfo->type == GAMEOBJECT_TYPE_GOOBER && goInfo->goober.requireLOS))
|
||||
{
|
||||
//CanUseBattlegroundObject() already called in CheckCast()
|
||||
// in battleground check
|
||||
|
||||
@@ -618,10 +618,7 @@ public:
|
||||
type = gameObjectInfo->type;
|
||||
displayId = gameObjectInfo->displayId;
|
||||
name = gameObjectInfo->name;
|
||||
if (type == GAMEOBJECT_TYPE_CHEST)
|
||||
lootId = gameObjectInfo->chest.lootId;
|
||||
else if (type == GAMEOBJECT_TYPE_FISHINGHOLE)
|
||||
lootId = gameObjectInfo->fishinghole.lootId;
|
||||
lootId = gameObjectInfo->GetLootId();
|
||||
|
||||
handler->PSendSysMessage(LANG_GOINFO_ENTRY, entry);
|
||||
handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
|
||||
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
if ((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spellId == 17731)
|
||||
if ((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spell == 17731)
|
||||
{
|
||||
FloorEruptionGUID[0].insert(std::make_pair(go->GetGUID(), 0));
|
||||
return;
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
|
||||
void OnGameObjectRemove(GameObject* go) override
|
||||
{
|
||||
if ((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spellId == 17731)
|
||||
if ((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spell == 17731)
|
||||
{
|
||||
FloorEruptionGUID[0].erase(go->GetGUID());
|
||||
return;
|
||||
@@ -116,7 +116,7 @@ public:
|
||||
//remove all that are not present on FloorEruptionGUID[1] and update treeLen on each GUID
|
||||
for (std::list<GameObject*>::const_iterator itr = nearFloorList.begin(); itr != nearFloorList.end(); ++itr)
|
||||
{
|
||||
if (((*itr)->GetGOInfo()->displayId == 4392 || (*itr)->GetGOInfo()->displayId == 4472) && (*itr)->GetGOInfo()->trap.spellId == 17731)
|
||||
if (((*itr)->GetGOInfo()->displayId == 4392 || (*itr)->GetGOInfo()->displayId == 4472) && (*itr)->GetGOInfo()->trap.spell == 17731)
|
||||
{
|
||||
ObjectGuid nearFloorGUID = (*itr)->GetGUID();
|
||||
if (FloorEruptionGUID[1].find(nearFloorGUID) != FloorEruptionGUID[1].end() && (*FloorEruptionGUID[1].find(nearFloorGUID)).second == 0)
|
||||
|
||||
@@ -1292,7 +1292,7 @@ class go_twilight_portal : public GameObjectScript
|
||||
{
|
||||
case GO_HALION_PORTAL_EXIT:
|
||||
gameobject->SetPhaseMask(0x20, true);
|
||||
_spellId = gameobject->GetGOInfo()->goober.spellId;
|
||||
_spellId = gameobject->GetGOInfo()->goober.spell;
|
||||
break;
|
||||
case GO_HALION_PORTAL_1:
|
||||
case GO_HALION_PORTAL_2: // Not used, not seen in sniffs. Just in case.
|
||||
|
||||
@@ -980,7 +980,7 @@ class go_celestial_planetarium_access : public GameObjectScript
|
||||
bool GossipHello(Player* player) override
|
||||
{
|
||||
bool hasKey = true;
|
||||
if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId))
|
||||
if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))
|
||||
{
|
||||
hasKey = false;
|
||||
for (uint32 i = 0; i < MAX_LOCK_CASE; ++i)
|
||||
|
||||
@@ -1075,7 +1075,7 @@ class go_simon_cluster : public GameObjectScript
|
||||
if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true))
|
||||
bunny->AI()->SetData(go->GetEntry(), 0);
|
||||
|
||||
player->CastSpell(player, go->GetGOInfo()->goober.spellId, true);
|
||||
player->CastSpell(player, go->GetGOInfo()->goober.spell, true);
|
||||
go->AddUse();
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user