aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp58
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp106
3 files changed, 59 insertions, 106 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 20fdddb2074..36ef1a42d9e 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2171,6 +2171,59 @@ void GameObject::Use(Unit* user)
player->SendPreparedGossip(this);
return;
}
+ case GAMEOBJECT_TYPE_CHEST: //3
+ {
+ Player* player = user->ToPlayer();
+ if (!player)
+ return;
+
+ if (Battleground* bg = player->GetBattleground())
+ if (!bg->CanActivateGO(GetEntry(), bg->GetPlayerTeam(user->GetGUID())))
+ return;
+
+ GameObjectTemplate const* info = GetGOInfo();
+ Loot* loot = nullptr;
+ if (getLootState() == GO_READY)
+ {
+ if (uint32 lootId = info->GetLootId())
+ {
+ SetLootGenerationTime();
+
+ Group const* group = player->GetGroup();
+ bool groupRules = group && info->chest.usegrouplootrules;
+
+ loot = new Loot(GetMap(), GetGUID(), LOOT_CHEST, groupRules ? group : nullptr);
+ m_loot.reset(loot);
+
+ loot->SetDungeonEncounterId(info->chest.DungeonEncounter);
+ loot->FillLoot(lootId, LootTemplates_Gameobject, player, !groupRules, false, GetLootMode(), GetMap()->GetDifficultyLootItemContext());
+
+ if (GetLootMode() > 0)
+ if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
+ loot->generateMoneyLoot(addon->Mingold, addon->Maxgold);
+ }
+
+ /// @todo possible must be moved to loot release (in different from linked triggering)
+ if (info->chest.triggeredEvent)
+ {
+ TC_LOG_DEBUG("spells", "Chest ScriptStart id %u for GO " UI64FMTD, info->chest.triggeredEvent, GetSpawnId());
+ GameEvents::Trigger(info->chest.triggeredEvent, user, this);
+ }
+
+ // triggering linked GO
+ if (uint32 trapEntry = info->chest.linkedTrap)
+ TriggeringLinkedGameObject(trapEntry, player);
+
+ SetLootState(GO_ACTIVATED, player);
+ }
+ else
+ loot = GetLootForPlayer(player);
+
+ // Send loot
+ if (loot)
+ player->SendLoot(*loot);
+ break;
+ }
case GAMEOBJECT_TYPE_TRAP: //6
{
GameObjectTemplate const* goInfo = GetGOInfo();
@@ -2261,6 +2314,11 @@ void GameObject::Use(Unit* user)
return;
}
+ case GAMEOBJECT_TYPE_SPELL_FOCUS: //8
+ // triggering linked GO
+ if (uint32 trapEntry = GetGOInfo()->spellFocus.linkedTrap)
+ TriggeringLinkedGameObject(trapEntry, user);
+ break;
//big gun, its a spell/aura
case GAMEOBJECT_TYPE_GOOBER: //10
{
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 8c06e6c2aca..017a07498b0 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -643,7 +643,6 @@ class TC_GAME_API Spell
void CancelGlobalCooldown();
void _cast(bool skipCheck = false);
- void SendLoot(ObjectGuid guid, LootType loottype);
std::pair<float, float> GetMinMaxRange(bool strict) const;
WorldObject* const m_caster;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 87b09ece51f..e4e9179dc37 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1502,110 +1502,6 @@ void Spell::EffectEnergizePct()
unitCaster->EnergizeBySpell(unitTarget, m_spellInfo, gain, power);
}
-void Spell::SendLoot(ObjectGuid guid, LootType loottype)
-{
- Player* player = m_caster->ToPlayer();
- if (!player)
- return;
-
- if (gameObjTarget)
- {
- // Players shouldn't be able to loot gameobjects that are currently despawned
- if (!gameObjTarget->isSpawned() && !player->IsGameMaster())
- {
- TC_LOG_ERROR("entities.player.cheat", "Possible hacking attempt: Player %s %s tried to loot a gameobject %s which is on respawn timer without being in GM mode!",
- player->GetName().c_str(), player->GetGUID().ToString().c_str(), gameObjTarget->GetGUID().ToString().c_str());
- return;
- }
- // special case, already has GossipHello inside so return and avoid calling twice
- if (gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
- {
- gameObjTarget->Use(player);
- return;
- }
-
- player->PlayerTalkClass->ClearMenus();
- if (gameObjTarget->AI()->OnGossipHello(player))
- return;
-
- switch (gameObjTarget->GetGoType())
- {
- case GAMEOBJECT_TYPE_DOOR:
- case GAMEOBJECT_TYPE_BUTTON:
- gameObjTarget->UseDoorOrButton(0, false, player);
- return;
-
- case GAMEOBJECT_TYPE_QUESTGIVER:
- player->PrepareGossipMenu(gameObjTarget, gameObjTarget->GetGOInfo()->questgiver.gossipID, true);
- player->SendPreparedGossip(gameObjTarget);
- return;
-
- case GAMEOBJECT_TYPE_SPELL_FOCUS:
- // triggering linked GO
- if (uint32 trapEntry = gameObjTarget->GetGOInfo()->spellFocus.linkedTrap)
- gameObjTarget->TriggeringLinkedGameObject(trapEntry, player);
- return;
-
- case GAMEOBJECT_TYPE_CHEST:
- {
- if (Battleground* bg = player->GetBattleground())
- {
- if (!bg->CanActivateGO(gameObjTarget->GetEntry(), bg->GetPlayerTeam(player->GetGUID())))
- {
- player->SendLootRelease(guid);
- return;
- }
- }
-
- Loot* loot = nullptr;
- if (gameObjTarget->getLootState() == GO_READY)
- {
- if (uint32 lootId = gameObjTarget->GetGOInfo()->GetLootId())
- {
- gameObjTarget->SetLootGenerationTime();
-
- Group const* group = player->GetGroup();
- bool groupRules = group && gameObjTarget->GetGOInfo()->chest.usegrouplootrules;
-
- loot = new Loot(gameObjTarget->GetMap(), guid, loottype, groupRules ? group : nullptr);
- gameObjTarget->m_loot.reset(loot);
-
- loot->SetDungeonEncounterId(gameObjTarget->GetGOInfo()->chest.DungeonEncounter);
- loot->FillLoot(lootId, LootTemplates_Gameobject, player, !groupRules, false, gameObjTarget->GetLootMode(), gameObjTarget->GetMap()->GetDifficultyLootItemContext());
-
- if (gameObjTarget->GetLootMode() > 0)
- if (GameObjectTemplateAddon const* addon = gameObjTarget->GetTemplateAddon())
- loot->generateMoneyLoot(addon->Mingold, addon->Maxgold);
-
- }
-
- /// @todo possible must be moved to loot release (in different from linked triggering)
- if (gameObjTarget->GetGOInfo()->chest.triggeredEvent)
- {
- TC_LOG_DEBUG("spells", "Chest ScriptStart id %u for GO " UI64FMTD, gameObjTarget->GetGOInfo()->chest.triggeredEvent, gameObjTarget->GetSpawnId());
- GameEvents::Trigger(gameObjTarget->GetGOInfo()->chest.triggeredEvent, player, gameObjTarget);
- }
-
- // triggering linked GO
- if (uint32 trapEntry = gameObjTarget->GetGOInfo()->chest.linkedTrap)
- gameObjTarget->TriggeringLinkedGameObject(trapEntry, player);
-
- gameObjTarget->SetLootState(GO_ACTIVATED, player);
- }
- else
- loot = gameObjTarget->GetLootForPlayer(player);
-
- // Send loot
- if (loot)
- player->SendLoot(*loot);
- break;
- }
- default:
- break;
- }
- }
-}
-
void Spell::EffectOpenLock()
{
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
@@ -1699,7 +1595,7 @@ void Spell::EffectOpenLock()
}
if (gameObjTarget)
- SendLoot(guid, LOOT_CHEST);
+ gameObjTarget->Use(player);
else if (itemTarget)
{
itemTarget->SetItemFlag(ITEM_FIELD_FLAG_UNLOCKED);