aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellEffects.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-18 16:33:38 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-18 16:33:38 +0200
commit8c20f620d7b070b13b40803095e5fa97f9349512 (patch)
tree0e5d718500cf8139945234cb1f36a53986e05dea /src/server/game/Spells/SpellEffects.cpp
parentc00e2e4851498aa04ac1d8ff13a0759b245df72b (diff)
Core/Loot: Move loot generation out of Player::SendLoot
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rw-r--r--src/server/game/Spells/SpellEffects.cpp82
1 files changed, 74 insertions, 8 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 61a0e645188..af66302df7f 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1547,16 +1547,47 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
return;
case GAMEOBJECT_TYPE_CHEST:
- /// @todo possible must be moved to loot release (in different from linked triggering)
- if (gameObjTarget->GetGOInfo()->chest.triggeredEvent)
+ if (Battleground* bg = player->GetBattleground())
{
- 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);
+ if (!bg->CanActivateGO(gameObjTarget->GetEntry(), bg->GetPlayerTeam(player->GetGUID())))
+ {
+ player->SendLootRelease(guid);
+ return;
+ }
}
- // triggering linked GO
- if (uint32 trapEntry = gameObjTarget->GetGOInfo()->chest.linkedTrap)
- gameObjTarget->TriggeringLinkedGameObject(trapEntry, player);
+ 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* loot = new Loot(gameObjTarget->GetMap(), guid, loottype, groupRules ? group : nullptr);
+ gameObjTarget->m_loot.reset(loot);
+
+ 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);
+ }
// Don't return, let loots been taken
break;
@@ -2221,10 +2252,36 @@ void Spell::EffectPickPocket()
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
+ Player* player = m_caster->ToPlayer();
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- m_caster->ToPlayer()->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING);
+ Creature* creature = Object::ToCreature(unitTarget);
+ if (!creature)
+ return;
+
+ if (creature->CanGeneratePickPocketLoot())
+ {
+ creature->StartPickPocketRefillTimer();
+
+ creature->m_loot.reset(new Loot(creature->GetMap(), creature->GetGUID(), LOOT_PICKPOCKETING, nullptr));
+ if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
+ creature->m_loot->FillLoot(lootid, LootTemplates_Pickpocketing, player, true);
+
+ // Generate extra money for pick pocket loot
+ const uint32 a = urand(0, creature->GetLevel() / 2);
+ const uint32 b = urand(0, player->GetLevel() / 2);
+ creature->m_loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
+ }
+ else if (creature->m_loot)
+ {
+ if (creature->m_loot->loot_type == LOOT_PICKPOCKETING && creature->m_loot->isLooted())
+ player->SendLootError(creature->m_loot->GetGUID(), creature->GetGUID(), LOOT_ERROR_ALREADY_PICKPOCKETED);
+
+ return;
+ }
+
+ player->SendLoot(unitTarget->GetGUID(), LOOT_PICKPOCKETING);
}
void Spell::EffectAddFarsight()
@@ -3422,6 +3479,8 @@ void Spell::EffectDisEnchant()
if (Player* caster = m_caster->ToPlayer())
{
caster->UpdateCraftSkill(m_spellInfo);
+ itemTarget->m_loot.reset(new Loot(caster->GetMap(), itemTarget->GetGUID(), LOOT_DISENCHANTING, nullptr));
+ itemTarget->m_loot->FillLoot(ASSERT_NOTNULL(itemTarget->GetDisenchantLoot(caster))->ID, LootTemplates_Disenchant, caster, true);
caster->SendLoot(itemTarget->GetGUID(), LOOT_DISENCHANTING);
}
@@ -3781,6 +3840,9 @@ void Spell::EffectSkinning()
creature->RemoveUnitFlag(UNIT_FLAG_SKINNABLE);
creature->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
+ creature->m_loot.reset(new Loot(creature->GetMap(), creature->GetGUID(), LOOT_SKINNING, nullptr));
+ creature->m_loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, player, true);
+ creature->SetLootRecipient(player, false);
player->SendLoot(creature->GetGUID(), LOOT_SKINNING);
if (skill == SKILL_SKINNING)
@@ -4480,6 +4542,8 @@ void Spell::EffectProspecting()
player->UpdateGatherSkill(SKILL_JEWELCRAFTING, SkillValue, reqSkillValue);
}
+ itemTarget->m_loot.reset(new Loot(player->GetMap(), itemTarget->GetGUID(), LOOT_PROSPECTING, nullptr));
+ itemTarget->m_loot->FillLoot(itemTarget->GetEntry(), LootTemplates_Prospecting, player, true);
player->SendLoot(itemTarget->GetGUID(), LOOT_PROSPECTING);
}
@@ -4505,6 +4569,8 @@ void Spell::EffectMilling()
player->UpdateGatherSkill(SKILL_INSCRIPTION, SkillValue, reqSkillValue);
}
+ itemTarget->m_loot.reset(new Loot(player->GetMap(), itemTarget->GetGUID(), LOOT_MILLING, nullptr));
+ itemTarget->m_loot->FillLoot(itemTarget->GetEntry(), LootTemplates_Milling, player, true);
player->SendLoot(itemTarget->GetGUID(), LOOT_MILLING);
}