diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-09-18 16:33:38 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-09-18 16:33:38 +0200 |
commit | 8c20f620d7b070b13b40803095e5fa97f9349512 (patch) | |
tree | 0e5d718500cf8139945234cb1f36a53986e05dea /src/server/game/Spells/SpellEffects.cpp | |
parent | c00e2e4851498aa04ac1d8ff13a0759b245df72b (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.cpp | 82 |
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); } |