bool MonsterType::createChildLoot(Container* parent, const LootBlock& lootBlock) { LootItems::const_iterator it = lootBlock.childLoot.begin(); if(it == lootBlock.childLoot.end()) return true; ItemList items; for(; it != lootBlock.childLoot.end() && !parent->full(); ++it) { items = createLoot(*it); if(items.empty()) continue; for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit) { Item* tmpItem = *iit; if(Container* container = tmpItem->getContainer()) { if(createChildLoot(container, *it)) parent->__internalAddThing(tmpItem); else delete container; } else parent->__internalAddThing(tmpItem); } } return !parent->empty(); }
void MonsterType::dropLoot(Container* corpse) { ItemList items; for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it) { items = createLoot(*it); if(items.empty()) continue; for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit) { Item* tmpItem = *iit; if(Container* container = tmpItem->getContainer()) { if(createChildLoot(container, *it)) corpse->__internalAddThing(tmpItem); else delete container; } else corpse->__internalAddThing(tmpItem); } } corpse->__startDecaying(); uint32_t ownerId = corpse->getCorpseOwner(); if(!ownerId) return; Player* owner = g_game.getPlayerByGuid(ownerId); if(!owner) return; LootMessage_t message = lootMessage; if(message == LOOTMSG_IGNORE) message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE); if(message < LOOTMSG_PLAYER) return; std::stringstream ss; ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << "."; if(owner->getParty() && message > LOOTMSG_PLAYER) owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH) owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); }
bool LootManagerImplementation::createLootFromCollection(SceneObject* container, LootGroupCollection* lootCollection, int level) { for (int i = 0; i < lootCollection->count(); ++i) { LootGroupCollectionEntry* entry = lootCollection->get(i); int lootChance = entry->getLootChance(); if (lootChance <= 0) continue; int roll = System::random(10000000); if (roll > lootChance) continue; int tempChance = 0; //Start at 0. LootGroups* lootGroups = entry->getLootGroups(); //Now we do the second roll to determine loot group. roll = System::random(10000000); //Select the loot group to use. for (int i = 0; i < lootGroups->count(); ++i) { LootGroupEntry* entry = lootGroups->get(i); tempChance += entry->getLootChance(); //Is this entry lower than the roll? If yes, then we want to try the next entry. if (tempChance < roll) continue; createLoot(container, entry->getLootGroupName(), level); break; } } return true; }
bool LootManagerImplementation::createLoot(SceneObject* container, const String& lootGroup, int level, bool maxCondition) { Reference<LootGroupTemplate*> group = lootGroupMap->getLootGroupTemplate(lootGroup); if (group == NULL) { warning("Loot group template requested does not exist: " + lootGroup); return false; } //Now we do the third roll for the item out of the group. int roll = System::random(10000000); String selection = group->getLootGroupEntryForRoll(roll); //Check to see if the group entry is another group if (lootGroupMap->lootGroupExists(selection)) return createLoot(container, selection, level, maxCondition); //Entry wasn't another group, it should be a loot item Reference<LootItemTemplate*> itemTemplate = lootGroupMap->getLootItemTemplate(selection); if (itemTemplate == NULL) { warning("Loot item template requested does not exist: " + group->getLootGroupEntryForRoll(roll) + " for templateName: " + group->getTemplateName()); return false; } TangibleObject* obj = createLootObject(itemTemplate, level, maxCondition); if (obj == NULL) return false; if (container->transferObject(obj, -1, false, true)) container->broadcastObject(obj, true); return true; }