diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-12-29 01:02:52 +0100 |
|---|---|---|
| committer | Ovahlord <dreadkiller@gmx.de> | 2024-12-29 22:22:41 +0100 |
| commit | fd52be9fe5f1da91c74a8d28f526f0b33778a72b (patch) | |
| tree | c38c490eae69e95374867b1ec9842edabdd78568 /src/server/game/Loot/LootMgr.cpp | |
| parent | 4084b85352420fd2e031e8fb4aef98cbb93d2429 (diff) | |
Core/Loot: Implemented automatic flagging of tracking quests from loot
(cherry picked from commit d913e38cbab9521c80d826417093d22b2c4a1c1a)
# Conflicts:
# sql/updates/world/cata_classic/2024_12_29_00_world.sql
Diffstat (limited to 'src/server/game/Loot/LootMgr.cpp')
| -rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 02fc7b7762e..07504c41c02 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -271,6 +271,8 @@ bool LootStoreItem::Roll(bool rate) const return roll_chance_f(chance * qualityModifier); } + case Type::TrackingQuest: + return roll_chance_f(chance); default: break; } @@ -364,6 +366,45 @@ bool LootStoreItem::IsValid(LootStore const& store, uint32 entry) const } break; } + case Type::TrackingQuest: + { + Quest const* quest = sObjectMgr->GetQuestTemplate(itemid); + if (!quest) + { + TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} ItemType {} Item {}: quest does not exist - skipped", + store.GetName(), entry, type, itemid); + return false; + } + + if (!quest->HasFlag(QUEST_FLAGS_TRACKING_EVENT)) + { + TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} ItemType {} Item {}: quest is not a tracking flag - skipped", + store.GetName(), entry, type, itemid); + return false; + } + + if (chance == 0 && groupid == 0) // Zero chance is allowed for grouped entries only + { + TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} ItemType {} Item {}: equal-chanced grouped entry, but group not defined - skipped", + store.GetName(), entry, type, itemid); + return false; + } + + if (chance != 0 && chance < 0.0001f) // loot with low chance + { + TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} ItemType {} Item {}: low chance ({}) - skipped", + store.GetName(), entry, type, itemid, chance); + return false; + } + + if (mincount != 1 || maxcount) // wrong count + { + TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} ItemType {} Item {}: tracking quest has count other than 1 (MinCount {} MaxCount {}) - skipped", + store.GetName(), entry, type, itemid, int32(maxcount), mincount); + return false; + } + break; + } default: TC_LOG_ERROR("sql.sql", "Table '{}' Entry {} Item {}: invalid ItemType {}, skipped", @@ -579,6 +620,10 @@ void LootTemplate::CopyConditions(LootItem* li) const if (li->type != LootItemType::Currency) continue; break; + case LootStoreItem::Type::TrackingQuest: + if (li->type != LootItemType::TrackingQuest) + continue; + break; default: break; } @@ -619,6 +664,7 @@ void LootTemplate::Process(Loot& loot, bool rate, uint16 lootMode, uint8 groupId { case LootStoreItem::Type::Item: case LootStoreItem::Type::Currency: + case LootStoreItem::Type::TrackingQuest: // Plain entries (not a reference, not grouped) // Chance is already checked, just add if (!personalLooter || LootItem::AllowedForPlayer(personalLooter, *item, true)) @@ -729,6 +775,7 @@ void LootTemplate::ProcessPersonalLoot(std::unordered_map<Player*, std::unique_p break; } case LootStoreItem::Type::Currency: + case LootStoreItem::Type::TrackingQuest: { // Plain entries (not a reference, not grouped) // Chance is already checked, just add @@ -786,6 +833,7 @@ bool LootTemplate::HasDropForPlayer(Player const* player, uint8 groupId, bool st { case LootStoreItem::Type::Item: case LootStoreItem::Type::Currency: + case LootStoreItem::Type::TrackingQuest: if (LootItem::AllowedForPlayer(player, *lootStoreItem, strictUsabilityCheck)) return true; // active quest drop found break; |
