diff --git a/src/game/Object/LootMgr.cpp b/src/game/Object/LootMgr.cpp index 0769fea8..879df85f 100644 --- a/src/game/Object/LootMgr.cpp +++ b/src/game/Object/LootMgr.cpp @@ -31,6 +31,7 @@ #include "SharedDefines.h" #include "DBCStores.h" #include "SQLStorages.h" +#include "DisableMgr.h" static eConfigFloatValues const qualityToRate[MAX_ITEM_QUALITY] = { @@ -1003,7 +1004,7 @@ bool LootTemplate::LootGroup::HasStartingQuestDropForPlayer(Player const* player void LootTemplate::LootGroup::Process(Loot& loot) const { LootStoreItem const* item = Roll(); - if (item != NULL) + if (item != NULL && !DisableMgr::IsDisabledFor(DISABLE_TYPE_ITEM_DROP, item->itemid)) { loot.AddItem(*item); } } @@ -1101,7 +1102,7 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, bool rate, uint8 // Rolling non-grouped items for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; ++i) { - if (!i->Roll(rate)) + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ITEM_DROP, i->itemid) || !i->Roll(rate)) { continue; } // Bad luck for the entry if (i->mincountOrRef < 0) // References processing diff --git a/src/game/WorldHandlers/DisableMgr.cpp b/src/game/WorldHandlers/DisableMgr.cpp index 0fd29d13..246be6e2 100644 --- a/src/game/WorldHandlers/DisableMgr.cpp +++ b/src/game/WorldHandlers/DisableMgr.cpp @@ -44,6 +44,8 @@ namespace DisableMap m_DisableMap; } +#define CONTINUE if (newData) delete data; continue + void LoadDisables() { // reload case @@ -79,10 +81,14 @@ void LoadDisables() uint32 data0 = fields[3].GetUInt32(); DisableData* data; + bool newData = false; if (m_DisableMap[type].find(entry) != m_DisableMap[type].end()) data = &m_DisableMap[type][entry]; else + { data = new DisableData(); + newData = true; + } data->flags = flags; @@ -92,13 +98,13 @@ void LoadDisables() if (!(sSpellStore.LookupEntry(entry) || flags & SPELL_DISABLE_DEPRECATED_SPELL)) { ERROR_DB_STRICT_LOG("Spell entry %u from `disables` doesn't exist in dbc, skipped.", entry); - continue; + CONTINUE; } if (!flags || flags > MAX_SPELL_DISABLE_TYPE) { ERROR_DB_STRICT_LOG("Disable flags for spell %u are invalid, skipped.", entry); - continue; + CONTINUE; } if (flags & SPELL_DISABLE_MAP) @@ -117,7 +123,7 @@ void LoadDisables() if (!mapEntry) { ERROR_DB_STRICT_LOG("Map entry %u from `disables` doesn't exist in dbc, skipped.", entry); - continue; + CONTINUE; } bool isFlagInvalid = false; switch (mapEntry->map_type) @@ -131,12 +137,12 @@ void LoadDisables() case MAP_BATTLEGROUND: //case MAP_ARENA: [-ZERO] ERROR_DB_STRICT_LOG("Battleground map %u specified to be disabled in map case, skipped.", entry); - continue; + CONTINUE; } if (isFlagInvalid) { ERROR_DB_STRICT_LOG("Disable flags for map %u are invalid, skipped.", entry); - continue; + CONTINUE; } break; } @@ -144,7 +150,7 @@ void LoadDisables() if (!sBattleGroundMgr.GetBattleGroundTemplate(BattleGroundTypeId(entry))) { ERROR_DB_STRICT_LOG("Battleground entry %u from `disables` doesn't exist in dbc, skipped.", entry); - continue; + CONTINUE; } if (flags) ERROR_DB_STRICT_LOG("Disable flags specified for battleground %u, useless data.", entry); @@ -153,7 +159,7 @@ void LoadDisables() if (entry > MAX_OPVP_ID) { ERROR_DB_STRICT_LOG("OutdoorPvPTypes value %u from `disables` is invalid, skipped.", entry); - continue; + CONTINUE; } if (flags) ERROR_DB_STRICT_LOG("Disable flags specified for outdoor PvP %u, useless data.", entry); @@ -173,7 +179,7 @@ void LoadDisables() if (!mapEntry) { ERROR_DB_STRICT_LOG("Map entry %u from `disables` doesn't exist in dbc, skipped.", entry); - continue; + CONTINUE; } switch (mapEntry->map_type) { @@ -213,7 +219,7 @@ void LoadDisables() if (!mapEntry) { ERROR_DB_STRICT_LOG("Map entry %u from `disables` doesn't exist in dbc, skipped.", entry); - continue; + CONTINUE; } switch (mapEntry->map_type) { @@ -244,11 +250,12 @@ void LoadDisables() else { ERROR_DB_STRICT_LOG("Disables type %u: required GUID is missing for entry %u, ignoring disable entry.", type, entry); - delete data; - continue; + CONTINUE; } } break; + case DISABLE_TYPE_ITEM_DROP: + break; default: break; } @@ -377,6 +384,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags case DISABLE_TYPE_OUTDOORPVP: case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: case DISABLE_TYPE_MMAP: + case DISABLE_TYPE_ITEM_DROP: return true; case DISABLE_TYPE_VMAP: return (flags & itr->second.flags) != 0; diff --git a/src/game/WorldHandlers/DisableMgr.h b/src/game/WorldHandlers/DisableMgr.h index ef5cd206..8866a955 100644 --- a/src/game/WorldHandlers/DisableMgr.h +++ b/src/game/WorldHandlers/DisableMgr.h @@ -36,7 +36,8 @@ enum DisableType DISABLE_TYPE_MMAP = 7, DISABLE_TYPE_CREATURE_SPAWN = 8, DISABLE_TYPE_GAMEOBJECT_SPAWN = 9, - MAX_DISABLE_TYPES = 10 + DISABLE_TYPE_ITEM_DROP = 10, + MAX_DISABLE_TYPES = 11 }; enum SpellDisableTypes