mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[8183] Some gameobject despanw related fixes
* Implement use `consumable` field in gameobject template for gameobject required explcit despawn at use. * Move gameobject template fields cech function from Gameobject to gameobject template class, and update callers. * Cast spells at gameobject use with gameobject guid as original caster guid, as already used in some other cases.
This commit is contained in:
parent
58209ee79a
commit
9a0abf0e01
8 changed files with 116 additions and 92 deletions
|
|
@ -87,7 +87,7 @@ void GameObject::CleanupsBeforeDelete()
|
||||||
ownerType = "pet";
|
ownerType = "pet";
|
||||||
|
|
||||||
sLog.outError("Delete GameObject (GUID: %u Entry: %u SpellId %u LinkedGO %u) that lost references to owner (GUID %u Type '%s') GO list. Crash possible later.",
|
sLog.outError("Delete GameObject (GUID: %u Entry: %u SpellId %u LinkedGO %u) that lost references to owner (GUID %u Type '%s') GO list. Crash possible later.",
|
||||||
GetGUIDLow(), GetGOInfo()->id, m_spellId, GetLinkedGameObjectEntry(), GUID_LOPART(owner_guid), ownerType);
|
GetGUIDLow(), GetGOInfo()->id, m_spellId, GetGOInfo()->GetLinkedGameObjectEntry(), GUID_LOPART(owner_guid), ownerType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -383,7 +383,7 @@ void GameObject::Update(uint32 /*p_time*/)
|
||||||
{
|
{
|
||||||
case GAMEOBJECT_TYPE_DOOR:
|
case GAMEOBJECT_TYPE_DOOR:
|
||||||
case GAMEOBJECT_TYPE_BUTTON:
|
case GAMEOBJECT_TYPE_BUTTON:
|
||||||
if (GetAutoCloseTime() && (m_cooldownTime < time(NULL)))
|
if (GetGOInfo()->GetAutoCloseTime() && (m_cooldownTime < time(NULL)))
|
||||||
ResetDoorOrButton();
|
ResetDoorOrButton();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -423,7 +423,7 @@ void GameObject::Update(uint32 /*p_time*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
//burning flags in some battlegrounds, if you find better condition, just add it
|
//burning flags in some battlegrounds, if you find better condition, just add it
|
||||||
if (GetGoAnimProgress() > 0)
|
if (GetGOInfo()->IsDespawnAtAction() || GetGoAnimProgress() > 0)
|
||||||
{
|
{
|
||||||
SendObjectDeSpawnAnim(GetGUID());
|
SendObjectDeSpawnAnim(GetGUID());
|
||||||
//reset flags
|
//reset flags
|
||||||
|
|
@ -601,7 +601,7 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
|
||||||
if (!Create(guid,entry, map, phaseMask, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) )
|
if (!Create(guid,entry, map, phaseMask, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(!GetDespawnPossibility())
|
if(!GetGOInfo()->GetDespawnPossibility() && !GetGOInfo()->IsDespawnAtAction())
|
||||||
{
|
{
|
||||||
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NODESPAWN);
|
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NODESPAWN);
|
||||||
m_spawnedByDefault = true;
|
m_spawnedByDefault = true;
|
||||||
|
|
@ -647,22 +647,6 @@ GameObjectInfo const *GameObject::GetGOInfo() const
|
||||||
return m_goInfo;
|
return m_goInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 GameObject::GetLootId(GameObjectInfo const* ginfo)
|
|
||||||
{
|
|
||||||
if (!ginfo)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch(ginfo->type)
|
|
||||||
{
|
|
||||||
case GAMEOBJECT_TYPE_CHEST:
|
|
||||||
return ginfo->chest.lootId;
|
|
||||||
case GAMEOBJECT_TYPE_FISHINGHOLE:
|
|
||||||
return ginfo->fishinghole.lootId;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
/*** QUEST SYSTEM ***/
|
/*** QUEST SYSTEM ***/
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
|
|
@ -757,7 +741,7 @@ bool GameObject::ActivateToQuest( Player *pTarget)const
|
||||||
// scan GO chest with loot including quest items
|
// scan GO chest with loot including quest items
|
||||||
case GAMEOBJECT_TYPE_CHEST:
|
case GAMEOBJECT_TYPE_CHEST:
|
||||||
{
|
{
|
||||||
if(LootTemplates_Gameobject.HaveQuestLootForPlayer(GetLootId(), pTarget))
|
if(LootTemplates_Gameobject.HaveQuestLootForPlayer(GetGOInfo()->GetLootId(), pTarget))
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -842,7 +826,7 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore, bool alternative /* = f
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!time_to_restore)
|
if(!time_to_restore)
|
||||||
time_to_restore = GetAutoCloseTime();
|
time_to_restore = GetGOInfo()->GetAutoCloseTime();
|
||||||
|
|
||||||
SwitchDoorOrButton(true,alternative);
|
SwitchDoorOrButton(true,alternative);
|
||||||
SetLootState(GO_ACTIVATED);
|
SetLootState(GO_ACTIVATED);
|
||||||
|
|
@ -1294,7 +1278,7 @@ void GameObject::Use(Unit* user)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Spell *spell = new Spell(spellCaster, spellInfo, triggered);
|
Spell *spell = new Spell(spellCaster, spellInfo, triggered,GetGUID());
|
||||||
|
|
||||||
// spell target is user of GO
|
// spell target is user of GO
|
||||||
SpellCastTargets targets;
|
SpellCastTargets targets;
|
||||||
|
|
|
||||||
|
|
@ -397,6 +397,87 @@ struct GameObjectInfo
|
||||||
} raw;
|
} raw;
|
||||||
};
|
};
|
||||||
uint32 ScriptId;
|
uint32 ScriptId;
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
bool IsDespawnAtAction() const
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case GAMEOBJECT_TYPE_CHEST: return chest.consumable;
|
||||||
|
case GAMEOBJECT_TYPE_GOOBER: return goober.consumable;
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GetLockId() const
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetDespawnPossibility() const // despawn at targeting of cast?
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case GAMEOBJECT_TYPE_DOOR: return door.noDamageImmune;
|
||||||
|
case GAMEOBJECT_TYPE_BUTTON: return button.noDamageImmune;
|
||||||
|
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.noDamageImmune;
|
||||||
|
case GAMEOBJECT_TYPE_GOOBER: return goober.noDamageImmune;
|
||||||
|
case GAMEOBJECT_TYPE_FLAGSTAND: return flagstand.noDamageImmune;
|
||||||
|
case GAMEOBJECT_TYPE_FLAGDROP: return flagdrop.noDamageImmune;
|
||||||
|
default: return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GetLinkedGameObjectEntry() const
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case GAMEOBJECT_TYPE_CHEST: return chest.linkedTrapId;
|
||||||
|
case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.linkedTrapId;
|
||||||
|
case GAMEOBJECT_TYPE_GOOBER: return goober.linkedTrapId;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GetAutoCloseTime() const
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return autoCloseTime / 0x10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 GetLootId() const
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case GAMEOBJECT_TYPE_CHEST: return chest.lootId;
|
||||||
|
case GAMEOBJECT_TYPE_FISHINGHOLE: return fishinghole.lootId;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
|
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
|
||||||
|
|
@ -500,40 +581,6 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
|
||||||
void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask);
|
void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask);
|
||||||
bool LoadFromDB(uint32 guid, Map *map);
|
bool LoadFromDB(uint32 guid, Map *map);
|
||||||
void DeleteFromDB();
|
void DeleteFromDB();
|
||||||
static uint32 GetLootId(GameObjectInfo const* info);
|
|
||||||
uint32 GetLootId() const { return GetLootId(GetGOInfo()); }
|
|
||||||
uint32 GetLockId() const
|
|
||||||
{
|
|
||||||
switch(GetGoType())
|
|
||||||
{
|
|
||||||
case GAMEOBJECT_TYPE_DOOR: return GetGOInfo()->door.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_BUTTON: return GetGOInfo()->button.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_QUESTGIVER: return GetGOInfo()->questgiver.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_CHEST: return GetGOInfo()->chest.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_TRAP: return GetGOInfo()->trap.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_AREADAMAGE: return GetGOInfo()->areadamage.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_CAMERA: return GetGOInfo()->camera.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_FLAGSTAND: return GetGOInfo()->flagstand.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_FISHINGHOLE:return GetGOInfo()->fishinghole.lockId;
|
|
||||||
case GAMEOBJECT_TYPE_FLAGDROP: return GetGOInfo()->flagdrop.lockId;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetDespawnPossibility() const
|
|
||||||
{
|
|
||||||
switch(GetGoType())
|
|
||||||
{
|
|
||||||
case GAMEOBJECT_TYPE_DOOR: return GetGOInfo()->door.noDamageImmune;
|
|
||||||
case GAMEOBJECT_TYPE_BUTTON: return GetGOInfo()->button.noDamageImmune;
|
|
||||||
case GAMEOBJECT_TYPE_QUESTGIVER: return GetGOInfo()->questgiver.noDamageImmune;
|
|
||||||
case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.noDamageImmune;
|
|
||||||
case GAMEOBJECT_TYPE_FLAGSTAND: return GetGOInfo()->flagstand.noDamageImmune;
|
|
||||||
case GAMEOBJECT_TYPE_FLAGDROP: return GetGOInfo()->flagdrop.noDamageImmune;
|
|
||||||
default: return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t GetRespawnTime() const { return m_respawnTime; }
|
time_t GetRespawnTime() const { return m_respawnTime; }
|
||||||
time_t GetRespawnTimeEx() const
|
time_t GetRespawnTimeEx() const
|
||||||
|
|
@ -603,34 +650,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
|
||||||
void UseDoorOrButton(uint32 time_to_restore = 0, bool alternative = false);
|
void UseDoorOrButton(uint32 time_to_restore = 0, bool alternative = false);
|
||||||
// 0 = use `gameobject`.`spawntimesecs`
|
// 0 = use `gameobject`.`spawntimesecs`
|
||||||
void ResetDoorOrButton();
|
void ResetDoorOrButton();
|
||||||
// 0 = use `gameobject`.`spawntimesecs`
|
|
||||||
|
|
||||||
uint32 GetLinkedGameObjectEntry() const
|
|
||||||
{
|
|
||||||
switch(GetGoType())
|
|
||||||
{
|
|
||||||
case GAMEOBJECT_TYPE_CHEST: return GetGOInfo()->chest.linkedTrapId;
|
|
||||||
case GAMEOBJECT_TYPE_SPELL_FOCUS: return GetGOInfo()->spellFocus.linkedTrapId;
|
|
||||||
case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.linkedTrapId;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 GetAutoCloseTime() const
|
|
||||||
{
|
|
||||||
uint32 autoCloseTime = 0;
|
|
||||||
switch(GetGoType())
|
|
||||||
{
|
|
||||||
case GAMEOBJECT_TYPE_DOOR: autoCloseTime = GetGOInfo()->door.autoCloseTime; break;
|
|
||||||
case GAMEOBJECT_TYPE_BUTTON: autoCloseTime = GetGOInfo()->button.autoCloseTime; break;
|
|
||||||
case GAMEOBJECT_TYPE_TRAP: autoCloseTime = GetGOInfo()->trap.autoCloseTime; break;
|
|
||||||
case GAMEOBJECT_TYPE_GOOBER: autoCloseTime = GetGOInfo()->goober.autoCloseTime; break;
|
|
||||||
case GAMEOBJECT_TYPE_TRANSPORT: autoCloseTime = GetGOInfo()->transport.autoCloseTime; break;
|
|
||||||
case GAMEOBJECT_TYPE_AREADAMAGE: autoCloseTime = GetGOInfo()->areadamage.autoCloseTime; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
return autoCloseTime / 0x10000;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TriggeringLinkedGameObject( uint32 trapEntry, Unit* target);
|
void TriggeringLinkedGameObject( uint32 trapEntry, Unit* target);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1149,7 +1149,7 @@ void LoadLootTemplates_Gameobject()
|
||||||
{
|
{
|
||||||
if(GameObjectInfo const* gInfo = sGOStorage.LookupEntry<GameObjectInfo>(i))
|
if(GameObjectInfo const* gInfo = sGOStorage.LookupEntry<GameObjectInfo>(i))
|
||||||
{
|
{
|
||||||
if(uint32 lootid = GameObject::GetLootId(gInfo))
|
if(uint32 lootid = gInfo->GetLootId())
|
||||||
{
|
{
|
||||||
if(!ids_set.count(lootid))
|
if(!ids_set.count(lootid))
|
||||||
LootTemplates_Gameobject.ReportNotExistedId(lootid);
|
LootTemplates_Gameobject.ReportNotExistedId(lootid);
|
||||||
|
|
|
||||||
|
|
@ -1230,6 +1230,12 @@ void ObjectMgr::LoadGameobjects()
|
||||||
data.rotation2 = fields[ 9].GetFloat();
|
data.rotation2 = fields[ 9].GetFloat();
|
||||||
data.rotation3 = fields[10].GetFloat();
|
data.rotation3 = fields[10].GetFloat();
|
||||||
data.spawntimesecs = fields[11].GetInt32();
|
data.spawntimesecs = fields[11].GetInt32();
|
||||||
|
|
||||||
|
if (data.spawntimesecs==0 && gInfo->IsDespawnAtAction())
|
||||||
|
{
|
||||||
|
sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with `spawntimesecs` (0) value, but gameobejct marked as despawnable at action.",guid,data.id);
|
||||||
|
}
|
||||||
|
|
||||||
data.animprogress = fields[12].GetUInt32();
|
data.animprogress = fields[12].GetUInt32();
|
||||||
|
|
||||||
uint32 go_state = fields[13].GetUInt32();
|
uint32 go_state = fields[13].GetUInt32();
|
||||||
|
|
@ -5717,6 +5723,16 @@ inline void CheckGONoDamageImmuneId(GameObjectInfo const* goInfo,uint32 dataN,ui
|
||||||
goInfo->id,goInfo->type,N,dataN);
|
goInfo->id,goInfo->type,N,dataN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void CheckGOConsumable(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
|
||||||
|
{
|
||||||
|
// 0/1 correct values
|
||||||
|
if (dataN <= 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sLog.outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but expected boolean (0/1) consumable field value.",
|
||||||
|
goInfo->id,goInfo->type,N,dataN);
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectMgr::LoadGameobjectInfo()
|
void ObjectMgr::LoadGameobjectInfo()
|
||||||
{
|
{
|
||||||
SQLGameObjectLoader loader;
|
SQLGameObjectLoader loader;
|
||||||
|
|
@ -5759,6 +5775,8 @@ void ObjectMgr::LoadGameobjectInfo()
|
||||||
if (goInfo->chest.lockId)
|
if (goInfo->chest.lockId)
|
||||||
CheckGOLockId(goInfo,goInfo->chest.lockId,0);
|
CheckGOLockId(goInfo,goInfo->chest.lockId,0);
|
||||||
|
|
||||||
|
CheckGOConsumable(goInfo,goInfo->chest.consumable,3);
|
||||||
|
|
||||||
if (goInfo->chest.linkedTrapId) // linked trap
|
if (goInfo->chest.linkedTrapId) // linked trap
|
||||||
CheckGOLinkedTrapId(goInfo,goInfo->chest.linkedTrapId,7);
|
CheckGOLinkedTrapId(goInfo,goInfo->chest.linkedTrapId,7);
|
||||||
break;
|
break;
|
||||||
|
|
@ -5794,6 +5812,8 @@ void ObjectMgr::LoadGameobjectInfo()
|
||||||
if (goInfo->goober.lockId)
|
if (goInfo->goober.lockId)
|
||||||
CheckGOLockId(goInfo,goInfo->goober.lockId,0);
|
CheckGOLockId(goInfo,goInfo->goober.lockId,0);
|
||||||
|
|
||||||
|
CheckGOConsumable(goInfo,goInfo->goober.consumable,3);
|
||||||
|
|
||||||
if (goInfo->goober.pageId) // pageId
|
if (goInfo->goober.pageId) // pageId
|
||||||
{
|
{
|
||||||
if (!sPageTextStore.LookupEntry<PageText>(goInfo->goober.pageId))
|
if (!sPageTextStore.LookupEntry<PageText>(goInfo->goober.pageId))
|
||||||
|
|
@ -6757,7 +6777,7 @@ void ObjectMgr::LoadGameObjectForQuests()
|
||||||
// scan GO chest with loot including quest items
|
// scan GO chest with loot including quest items
|
||||||
case GAMEOBJECT_TYPE_CHEST:
|
case GAMEOBJECT_TYPE_CHEST:
|
||||||
{
|
{
|
||||||
uint32 loot_id = GameObject::GetLootId(goInfo);
|
uint32 loot_id = goInfo->GetLootId();
|
||||||
|
|
||||||
// find quest loot for GO
|
// find quest loot for GO
|
||||||
if(LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
|
if(LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
|
||||||
|
|
|
||||||
|
|
@ -7339,7 +7339,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
|
||||||
|
|
||||||
if (go->getLootState() == GO_READY)
|
if (go->getLootState() == GO_READY)
|
||||||
{
|
{
|
||||||
uint32 lootid = go->GetLootId();
|
uint32 lootid = go->GetGOInfo()->GetLootId();
|
||||||
|
|
||||||
if (lootid)
|
if (lootid)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4211,7 +4211,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
uint32 lockId = 0;
|
uint32 lockId = 0;
|
||||||
if (GameObject* go = m_targets.getGOTarget())
|
if (GameObject* go = m_targets.getGOTarget())
|
||||||
{
|
{
|
||||||
lockId = go->GetLockId();
|
lockId = go->GetGOInfo()->GetLockId();
|
||||||
if (!lockId)
|
if (!lockId)
|
||||||
return SPELL_FAILED_BAD_TARGETS;
|
return SPELL_FAILED_BAD_TARGETS;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2983,7 +2983,7 @@ void Spell::EffectOpenLock(uint32 effIndex)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lockId = gameObjTarget->GetLockId();
|
lockId = goInfo->GetLockId();
|
||||||
guid = gameObjTarget->GetGUID();
|
guid = gameObjTarget->GetGUID();
|
||||||
}
|
}
|
||||||
else if(itemTarget)
|
else if(itemTarget)
|
||||||
|
|
@ -4627,7 +4627,7 @@ void Spell::EffectSummonObjectWild(uint32 i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(uint32 linkedEntry = pGameObj->GetLinkedGameObjectEntry())
|
if(uint32 linkedEntry = pGameObj->GetGOInfo()->GetLinkedGameObjectEntry())
|
||||||
{
|
{
|
||||||
GameObject* linkedGO = new GameObject;
|
GameObject* linkedGO = new GameObject;
|
||||||
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map,
|
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map,
|
||||||
|
|
@ -6341,7 +6341,7 @@ void Spell::EffectTransmitted(uint32 effIndex)
|
||||||
data << uint64(pGameObj->GetGUID());
|
data << uint64(pGameObj->GetGUID());
|
||||||
m_caster->SendMessageToSet(&data,true);
|
m_caster->SendMessageToSet(&data,true);
|
||||||
|
|
||||||
if(uint32 linkedEntry = pGameObj->GetLinkedGameObjectEntry())
|
if(uint32 linkedEntry = pGameObj->GetGOInfo()->GetLinkedGameObjectEntry())
|
||||||
{
|
{
|
||||||
GameObject* linkedGO = new GameObject;
|
GameObject* linkedGO = new GameObject;
|
||||||
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap,
|
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8182"
|
#define REVISION_NR "8183"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue