/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "AreaDefines.h" #include "CreatureScript.h" #include "ItemScript.h" #include "Player.h" #include "ScriptedCreature.h" #include "Spell.h" #include "SpellMgr.h" /*##### # item_only_for_flight #####*/ enum OnlyForFlight { SPELL_ARCANE_CHARGES = 45072 }; class item_only_for_flight : public ItemScript { public: item_only_for_flight() : ItemScript("item_only_for_flight") { } bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override { uint32 itemId = item->GetEntry(); bool disabled = false; //for special scripts switch (itemId) { case 24538: if (player->GetAreaId() != AREA_HALAA) disabled = true; break; case 34489: if (player->GetZoneId() != AREA_ISLE_OF_QUEL_DANAS) disabled = true; break; case 34475: if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES)) Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_ON_GROUND); break; } // allow use in flight only if (player->IsInFlight() && !disabled) return false; // error player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); return true; } }; /*##### # item_incendiary_explosives #####*/ class item_incendiary_explosives : public ItemScript { public: item_incendiary_explosives() : ItemScript("item_incendiary_explosives") { } bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override { if (player->FindNearestCreature(26248, 15) || player->FindNearestCreature(26249, 15)) return false; else { player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, nullptr); return true; } } }; /*##### # item_mysterious_egg #####*/ class item_mysterious_egg : public ItemScript { public: item_mysterious_egg() : ItemScript("item_mysterious_egg") { } bool OnExpire(Player* player, ItemTemplate const* /*pItemProto*/) override { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 39883, 1); // Cracked Egg if (msg == EQUIP_ERR_OK) player->StoreNewItem(dest, 39883, true); return true; } }; /*##### # item_disgusting_jar #####*/ class item_disgusting_jar : public ItemScript { public: item_disgusting_jar() : ItemScript("item_disgusting_jar") { } bool OnExpire(Player* player, ItemTemplate const* /*pItemProto*/) override { ItemPosCountVec dest; uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 44718, 1); // Ripe Disgusting Jar if (msg == EQUIP_ERR_OK) player->StoreNewItem(dest, 44718, true); return true; } }; /*##### # item_petrov_cluster_bombs #####*/ enum PetrovClusterBombs { SPELL_PETROV_BOMB = 42406 }; class item_petrov_cluster_bombs : public ItemScript { public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } bool OnUse(Player* player, Item* item, const SpellCastTargets& /*targets*/) override { if (player->GetZoneId() != AREA_HOWLING_FJORD) return false; if (!player->GetTransport() || player->GetAreaId() != AREA_SHATTERED_STRAITS) { player->SendEquipError(EQUIP_ERR_NONE, item, nullptr); if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB)) Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE); return true; } return false; } }; enum CapturedFrog { QUEST_THE_PERFECT_SPIES = 25444, NPC_VANIRAS_SENTRY_TOTEM = 40187 }; class item_captured_frog : public ItemScript { public: item_captured_frog() : ItemScript("item_captured_frog") { } bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override { if (player->GetQuestStatus(QUEST_THE_PERFECT_SPIES) == QUEST_STATUS_INCOMPLETE) { if (player->FindNearestCreature(NPC_VANIRAS_SENTRY_TOTEM, 10.0f)) return false; else player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, nullptr); } else player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); return true; } }; // Only used currently for // 19169: Nightfall class item_generic_limit_chance_above_60 : public ItemScript { public: item_generic_limit_chance_above_60() : ItemScript("item_generic_limit_chance_above_60") { } bool OnCastItemCombatSpell(Player* /*player*/, Unit* victim, SpellInfo const* /*spellInfo*/, Item* /*item*/) override { // spell proc chance gets severely reduced on victims > 60 (formula unknown) if (victim->GetLevel() > 60) { // gives ~0.1% proc chance at lvl 70 float const lvlPenaltyFactor = 9.93f; float const failureChance = (victim->GetLevel() - 60) * lvlPenaltyFactor; // base ppm chance was already rolled, only roll success chance return !roll_chance_f(failureChance); } return true; } }; void AddSC_item_scripts() { new item_only_for_flight(); new item_incendiary_explosives(); new item_mysterious_egg(); new item_disgusting_jar(); new item_petrov_cluster_bombs(); new item_captured_frog(); new item_generic_limit_chance_above_60(); }