aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Loot/LootMgr.cpp
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-09-28 04:25:15 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-09-28 04:25:15 +0200
commitaa638d9bc74a53b29f9a7c1f07fa93d47075b2bc (patch)
treea84a42ab9b1d0affdb2918f16f16d7bf606e06f5 /src/server/game/Loot/LootMgr.cpp
parentea005b0e581ab6975d9ee1ee1655ceac1ed48dc1 (diff)
parentbcfc2911b477cc4597cfe2acb9ada23ff88ba2bc (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Loot/LootMgr.cpp
Diffstat (limited to 'src/server/game/Loot/LootMgr.cpp')
-rw-r--r--src/server/game/Loot/LootMgr.cpp132
1 files changed, 67 insertions, 65 deletions
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 92694ebc834..4a30b4f4b97 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -133,7 +133,7 @@ uint32 LootStore::LoadLootTable()
Clear();
// 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.PQuery("SELECT entry, item, ChanceOrQuestChance, lootmode, groupid, mincountOrRef, maxcount FROM %s", GetName());
+ QueryResult result = WorldDatabase.PQuery("SELECT Entry, Item, Reference, Chance, QuestRequired, LootMode, GroupId, MinCount, MaxCount FROM %s", GetName());
if (!result)
return 0;
@@ -146,25 +146,27 @@ uint32 LootStore::LoadLootTable()
uint32 entry = fields[0].GetUInt32();
uint32 item = fields[1].GetUInt32();
- float chanceOrQuestChance = fields[2].GetFloat();
- uint16 lootmode = fields[3].GetUInt16();
- uint8 group = fields[4].GetUInt8();
- int32 mincountOrRef = fields[5].GetInt32();
- int32 maxcount = fields[6].GetUInt8();
+ uint32 reference = fields[2].GetUInt32();
+ float chance = fields[3].GetFloat();
+ bool needsquest = fields[4].GetBool();
+ uint16 lootmode = fields[5].GetUInt16();
+ uint8 groupid = fields[6].GetUInt8();
+ int32 mincount = fields[7].GetUInt8();
+ int32 maxcount = fields[8].GetUInt8();
if (maxcount > std::numeric_limits<uint8>::max())
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: maxcount value (%u) to large. must be less %u - skipped", GetName(), entry, item, maxcount, std::numeric_limits<uint8>::max());
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: MaxCount value (%u) to large. must be less %u - skipped", GetName(), entry, item, maxcount, std::numeric_limits<uint8>::max());
continue; // error already printed to log/console.
}
- if (group >= 1 << 7) // it stored in 7 bit field
+ if (groupid >= 1 << 7) // it stored in 7 bit field
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: group (%u) must be less %u - skipped", GetName(), entry, item, group, 1 << 7);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: GroupId (%u) must be less %u - skipped", GetName(), entry, item, groupid, 1 << 7);
return 0;
}
- LootStoreItem* storeitem = new LootStoreItem(item, chanceOrQuestChance, lootmode, group, mincountOrRef, maxcount);
+ LootStoreItem* storeitem = new LootStoreItem(item, reference, chance, needsquest, lootmode, groupid, mincount, maxcount);
if (!storeitem->IsValid(*this, entry)) // Validity checks
{
@@ -173,7 +175,7 @@ uint32 LootStore::LoadLootTable()
}
// Looking for the template of the entry
- // often entries are put together
+ // often entries are put together
if (m_LootTemplates.empty() || tab->first != entry)
{
// Searching the template (in case template Id changed)
@@ -267,12 +269,12 @@ void LootStore::ReportUnusedIds(LootIdSet const& lootIdSet) const
{
// all still listed ids isn't referenced
for (LootIdSet::const_iterator itr = lootIdSet.begin(); itr != lootIdSet.end(); ++itr)
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d isn't %s and not referenced from loot, and then useless.", GetName(), *itr, GetEntryName());
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d isn't %s and not referenced from loot, and thus useless.", GetName(), *itr, GetEntryName());
}
-void LootStore::ReportNotExistedId(uint32 id) const
+void LootStore::ReportNonExistingId(uint32 id) const
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d (%s) does not exist but used as loot id in DB.", GetName(), id, GetEntryName());
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d (%s) does not exist but is used as loot id in DB.", GetName(), id, GetEntryName());
}
//
@@ -286,7 +288,7 @@ bool LootStoreItem::Roll(bool rate) const
if (chance >= 100.0f)
return true;
- if (mincountOrRef < 0) // reference case
+ if (reference > 0) // reference case
return roll_chance_f(chance* (rate ? sWorld->getRate(RATE_DROP_ITEM_REFERENCED) : 1.0f));
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
@@ -299,47 +301,47 @@ bool LootStoreItem::Roll(bool rate) const
// Checks correctness of values
bool LootStoreItem::IsValid(LootStore const& store, uint32 entry) const
{
- if (mincountOrRef == 0)
+ if (mincount == 0)
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: wrong mincountOrRef (%d) - skipped", store.GetName(), entry, itemid, mincountOrRef);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: wrong MinCount (%d) - skipped", store.GetName(), entry, itemid, mincount);
return false;
}
- if (mincountOrRef > 0) // item (quest or non-quest) entry, maybe grouped
+ if (reference == 0) // item (quest or non-quest) entry, maybe grouped
{
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemid);
if (!proto)
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: item entry not listed in `item_template` - skipped", store.GetName(), entry, itemid);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: item entry not listed in `item_template` - skipped", store.GetName(), entry, itemid);
return false;
}
- if (chance == 0 && group == 0) // Zero chance is allowed for grouped entries only
+ if (chance == 0 && groupid == 0) // Zero chance is allowed for grouped entries only
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: equal-chanced grouped entry, but group not defined - skipped", store.GetName(), entry, itemid);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: equal-chanced grouped entry, but group not defined - skipped", store.GetName(), entry, itemid);
return false;
}
if (chance != 0 && chance < 0.000001f) // loot with low chance
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: low chance (%f) - skipped",
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: low chance (%f) - skipped",
store.GetName(), entry, itemid, chance);
return false;
}
- if (maxcount < mincountOrRef) // wrong max count
+ if (maxcount < mincount) // wrong max count
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: max count (%u) less that min count (%i) - skipped", store.GetName(), entry, itemid, int32(maxcount), mincountOrRef);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: MaxCount (%u) less that MinCount (%i) - skipped", store.GetName(), entry, itemid, int32(maxcount), mincount);
return false;
}
}
- else // mincountOrRef < 0
+ else // if reference loot
{
if (needs_quest)
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: quest chance will be treated as non-quest chance", store.GetName(), entry, itemid);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: quest required will be ignored", store.GetName(), entry, itemid);
else if (chance == 0) // no chance for the reference
{
- TC_LOG_ERROR("sql.sql", "Table '%s' entry %d item %d: zero chance is specified for a reference, skipped", store.GetName(), entry, itemid);
+ TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: zero chance is specified for a reference, skipped", store.GetName(), entry, itemid);
return false;
}
}
@@ -417,7 +419,7 @@ void Loot::AddItem(LootStoreItem const& item)
if (!proto)
return;
- uint32 count = urand(item.mincountOrRef, item.maxcount);
+ uint32 count = urand(item.mincount, item.maxcount);
uint32 stacks = count / proto->GetMaxStackSize() + ((count % proto->GetMaxStackSize()) ? 1 : 0);
std::vector<LootItem>& lootItems = item.needs_quest ? quest_items : items;
@@ -1218,24 +1220,24 @@ void LootTemplate::LootGroup::CheckLootRefs(LootTemplateMap const& /*store*/, Lo
for (LootStoreItemList::const_iterator ieItr = ExplicitlyChanced.begin(); ieItr != ExplicitlyChanced.end(); ++ieItr)
{
LootStoreItem* item = *ieItr;
- if (item->mincountOrRef < 0)
+ if (item->reference > 0)
{
- if (!LootTemplates_Reference.GetLootFor(-item->mincountOrRef))
- LootTemplates_Reference.ReportNotExistedId(-item->mincountOrRef);
+ if (!LootTemplates_Reference.GetLootFor(item->reference))
+ LootTemplates_Reference.ReportNonExistingId(item->reference);
else if (ref_set)
- ref_set->erase(-item->mincountOrRef);
+ ref_set->erase(item->reference);
}
}
for (LootStoreItemList::const_iterator ieItr = EqualChanced.begin(); ieItr != EqualChanced.end(); ++ieItr)
{
LootStoreItem* item = *ieItr;
- if (item->mincountOrRef < 0)
+ if (item->reference > 0)
{
- if (!LootTemplates_Reference.GetLootFor(-item->mincountOrRef))
- LootTemplates_Reference.ReportNotExistedId(-item->mincountOrRef);
+ if (!LootTemplates_Reference.GetLootFor(item->reference))
+ LootTemplates_Reference.ReportNonExistingId(item->reference);
else if (ref_set)
- ref_set->erase(-item->mincountOrRef);
+ ref_set->erase(item->reference);
}
}
}
@@ -1256,16 +1258,16 @@ LootTemplate::~LootTemplate()
// Adds an entry to the group (at loading stage)
void LootTemplate::AddEntry(LootStoreItem* item)
{
- if (item->group > 0 && item->mincountOrRef > 0) // Group
+ if (item->groupid > 0 && item->reference == 0) // Group
{
- if (item->group >= Groups.size())
- Groups.resize(item->group, NULL); // Adds new group the the loot template if needed
- if (!Groups[item->group - 1])
- Groups[item->group - 1] = new LootGroup();
+ if (item->groupid >= Groups.size())
+ Groups.resize(item->groupid, NULL); // Adds new group the the loot template if needed
+ if (!Groups[item->groupid - 1])
+ Groups[item->groupid - 1] = new LootGroup();
- Groups[item->group-1]->AddEntry(item); // Adds new entry to the group
+ Groups[item->groupid - 1]->AddEntry(item); // Adds new entry to the group
}
- else // Non-grouped entries and references are stored together
+ else // Non-grouped entries and references are stored together
Entries.push_back(item);
}
@@ -1304,7 +1306,7 @@ void LootTemplate::Process(Loot& loot, bool rate, uint16 lootMode, uint8 groupId
if (!Groups[groupId - 1])
return;
- Groups[groupId-1]->Process(loot, lootMode);
+ Groups[groupId - 1]->Process(loot, lootMode);
return;
}
@@ -1318,15 +1320,15 @@ void LootTemplate::Process(Loot& loot, bool rate, uint16 lootMode, uint8 groupId
if (!item->Roll(rate))
continue; // Bad luck for the entry
- if (item->mincountOrRef < 0) // References processing
+ if (item->reference > 0) // References processing
{
- LootTemplate const* Referenced = LootTemplates_Reference.GetLootFor(-item->mincountOrRef);
+ LootTemplate const* Referenced = LootTemplates_Reference.GetLootFor(item->reference);
if (!Referenced)
continue; // Error message already printed at loading stage
uint32 maxcount = uint32(float(item->maxcount) * sWorld->getRate(RATE_DROP_ITEM_REFERENCED_AMOUNT));
for (uint32 loop = 0; loop < maxcount; ++loop) // Ref multiplicator
- Referenced->Process(loot, rate, lootMode, item->group);
+ Referenced->Process(loot, rate, lootMode, item->groupid);
}
else // Plain entries (not a reference, not grouped)
loot.AddItem(*item); // Chance is already checked, just add
@@ -1355,12 +1357,12 @@ bool LootTemplate::HasQuestDrop(LootTemplateMap const& store, uint8 groupId) con
for (LootStoreItemList::const_iterator i = Entries.begin(); i != Entries.end(); ++i)
{
LootStoreItem* item = *i;
- if (item->mincountOrRef < 0) // References
+ if (item->reference > 0) // References
{
- LootTemplateMap::const_iterator Referenced = store.find(-item->mincountOrRef);
+ LootTemplateMap::const_iterator Referenced = store.find(item->reference);
if (Referenced == store.end())
continue; // Error message [should be] already printed at loading stage
- if (Referenced->second->HasQuestDrop(store, item->group))
+ if (Referenced->second->HasQuestDrop(store, item->groupid))
return true;
}
else if (item->needs_quest)
@@ -1387,19 +1389,19 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co
if (!Groups[groupId - 1])
return false;
- return Groups[groupId-1]->HasQuestDropForPlayer(player);
+ return Groups[groupId - 1]->HasQuestDropForPlayer(player);
}
// Checking non-grouped entries
for (LootStoreItemList::const_iterator i = Entries.begin(); i != Entries.end(); ++i)
{
LootStoreItem* item = *i;
- if (item->mincountOrRef < 0) // References processing
+ if (item->reference > 0) // References processing
{
- LootTemplateMap::const_iterator Referenced = store.find(-item->mincountOrRef);
+ LootTemplateMap::const_iterator Referenced = store.find(item->reference);
if (Referenced == store.end())
continue; // Error message already printed at loading stage
- if (Referenced->second->HasQuestDropForPlayer(store, player, item->group))
+ if (Referenced->second->HasQuestDropForPlayer(store, player, item->groupid))
return true;
}
else if (player->HasQuestForItem(item->itemid))
@@ -1431,12 +1433,12 @@ void LootTemplate::CheckLootRefs(LootTemplateMap const& store, LootIdSet* ref_se
for (LootStoreItemList::const_iterator ieItr = Entries.begin(); ieItr != Entries.end(); ++ieItr)
{
LootStoreItem* item = *ieItr;
- if (item->mincountOrRef < 0)
+ if (item->reference > 0)
{
- if (!LootTemplates_Reference.GetLootFor(-item->mincountOrRef))
- LootTemplates_Reference.ReportNotExistedId(-item->mincountOrRef);
+ if (!LootTemplates_Reference.GetLootFor(item->reference))
+ LootTemplates_Reference.ReportNonExistingId(item->reference);
else if (ref_set)
- ref_set->erase(-item->mincountOrRef);
+ ref_set->erase(item->reference);
}
}
@@ -1506,7 +1508,7 @@ bool LootTemplate::addConditionItem(Condition* cond)
bool LootTemplate::isReference(uint32 id)
{
for (LootStoreItemList::const_iterator ieItr = Entries.begin(); ieItr != Entries.end(); ++ieItr)
- if ((*ieItr)->itemid == id && (*ieItr)->mincountOrRef < 0)
+ if ((*ieItr)->itemid == id && (*ieItr)->reference > 0)
return true;
return false;//not found or not reference
@@ -1528,7 +1530,7 @@ void LoadLootTemplates_Creature()
if (uint32 lootid = itr->second.lootid)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Creature.ReportNotExistedId(lootid);
+ LootTemplates_Creature.ReportNonExistingId(lootid);
else
lootIdSetUsed.insert(lootid);
}
@@ -1563,7 +1565,7 @@ void LoadLootTemplates_Disenchant()
uint32 lootid = disenchant->Id;
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Disenchant.ReportNotExistedId(lootid);
+ LootTemplates_Disenchant.ReportNonExistingId(lootid);
else
lootIdSetUsed.insert(lootid);
}
@@ -1620,7 +1622,7 @@ void LoadLootTemplates_Gameobject()
if (uint32 lootid = itr->second.GetLootId())
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Gameobject.ReportNotExistedId(lootid);
+ LootTemplates_Gameobject.ReportNonExistingId(lootid);
else
lootIdSetUsed.insert(lootid);
}
@@ -1707,7 +1709,7 @@ void LoadLootTemplates_Pickpocketing()
if (uint32 lootid = itr->second.pickpocketLootId)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Pickpocketing.ReportNotExistedId(lootid);
+ LootTemplates_Pickpocketing.ReportNonExistingId(lootid);
else
lootIdSetUsed.insert(lootid);
}
@@ -1794,7 +1796,7 @@ void LoadLootTemplates_Skinning()
if (uint32 lootid = itr->second.SkinLootId)
{
if (lootIdSet.find(lootid) == lootIdSet.end())
- LootTemplates_Skinning.ReportNotExistedId(lootid);
+ LootTemplates_Skinning.ReportNonExistingId(lootid);
else
lootIdSetUsed.insert(lootid);
}
@@ -1838,7 +1840,7 @@ void LoadLootTemplates_Spell()
// ignore 61756 (Northrend Inscription Research (FAST QA VERSION) for example
if (!(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT) || (spellInfo->Attributes & SPELL_ATTR0_TRADESPELL))
{
- LootTemplates_Spell.ReportNotExistedId(spell_id);
+ LootTemplates_Spell.ReportNonExistingId(spell_id);
}
}
else