// Queries the loottable: adds item & coin to the npc void Database::AddLootTableToNPC(NPC* npc,int32 loottable_id, ItemList* itemlist, int32* copper, int32* silver, int32* gold, int32* plat) { //if (loottable_id == 178190) //DebugBreak(); const LootTable_Struct* lts = 0; *copper = 0; *silver = 0; *gold = 0; *plat = 0; lts = database.GetLootTable(loottable_id); if (!lts) return; // do coin if (lts->mincash > lts->maxcash) { cerr << "Error in loottable #" << loottable_id << ": mincash > maxcash" << endl; } else if (lts->maxcash != 0) { int32 cash = 0; if (lts->mincash == lts->maxcash) cash = lts->mincash; else cash = (rand() % (lts->maxcash - lts->mincash)) + lts->mincash; if (cash != 0) { if (lts->avgcoin != 0) { int32 mincoin = (int32) (lts->avgcoin * 0.75 + 1); int32 maxcoin = (int32) (lts->avgcoin * 1.25 + 1); *copper = (rand() % (maxcoin - mincoin)) + mincoin - 1; *silver = (rand() % (maxcoin - mincoin)) + mincoin - 1; *gold = (rand() % (maxcoin - mincoin)) + mincoin - 1; cash -= *copper; cash -= *silver * 10; cash -= *gold * 10; } *plat = cash / 1000; cash -= *plat * 1000; int32 gold2 = cash / 100; cash -= gold2 * 100; int32 silver2 = cash / 10; cash -= silver2 * 10; *gold += gold2; *silver += silver2; *copper += cash; } } // Do items for (int32 i=0; i<lts->NumEntries; i++) { for (int32 k = 1; k <= lts->Entries[i].multiplier; k++) { if ( (rand()%100) < lts->Entries[i].probability) { AddLootDropToNPC(npc,lts->Entries[i].lootdrop_id, itemlist); } } } }
// Queries the loottable: adds item & coin to the npc void Database::AddLootTableToNPC(int32 loottable_id, ItemList* itemlist, int32* copper, int32* silver, int32* gold, int32* plat) { char errbuf[MYSQL_ERRMSG_SIZE]; char *query = 0; MYSQL_RES *result; MYSQL_ROW row; *copper = 0; *silver = 0; *gold = 0; *plat = 0; if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, mincash, maxcash, avgcoin FROM loottable WHERE id=%i", loottable_id), errbuf, &result)) { safe_delete(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); int32 mincash = atoi(row[1]); int32 maxcash = atoi(row[2]); if (mincash > maxcash) { cerr << "Error in loottable #" << row[0] << ": mincash > maxcash" << endl; } else if (maxcash != 0) { int32 cash = 0; if (mincash == maxcash) cash = mincash; else cash = (rand() % (maxcash - mincash)) + mincash; if (cash != 0) { int32 coinavg = atoi(row[3]); if (coinavg != 0) { int32 mincoin = (int32) (coinavg * 0.75 + 1); int32 maxcoin = (int32) (coinavg * 1.25 + 1); *copper = (rand() % (maxcoin - mincoin)) + mincoin - 1; *silver = (rand() % (maxcoin - mincoin)) + mincoin - 1; *gold = (rand() % (maxcoin - mincoin)) + mincoin - 1; cash -= *copper; cash -= *silver * 10; cash -= *gold * 10; } *plat = cash / 1000; cash -= *plat * 1000; int32 gold2 = cash / 100; cash -= gold2 * 100; int32 silver2 = cash / 10; cash -= silver2 * 10; *gold += gold2; *silver += silver2; *copper += cash; } } } else { mysql_free_result(result); return; } mysql_free_result(result); } else { cerr << "Error in AddLootTableToNPC get coin query '" << query << "' " << errbuf << endl; safe_delete(query); return; } if (RunQuery(query, MakeAnyLenString(&query, "SELECT loottable_id, lootdrop_id, multiplier, probability FROM loottable_entries WHERE loottable_id=%i", loottable_id), errbuf, &result)) { safe_delete(query); while ((row = mysql_fetch_row(result))) { int multiplier = atoi(row[2]); for (int i = 1; i <= multiplier; i++) { if ( ((rand()%1)*100) < atoi(row[3])) { AddLootDropToNPC(atoi(row[1]), itemlist); } } } mysql_free_result(result); } else { cerr << "Error in AddLootTableToNPC get items query '" << query << "' " << errbuf << endl; safe_delete(query); return; } return; }
// Queries the loottable: adds item & coin to the npc void ZoneDatabase::AddLootTableToNPC(NPC* npc,uint32 loottable_id, ItemList* itemlist, uint32* copper, uint32* silver, uint32* gold, uint32* plat) { const LootTable_Struct* lts = nullptr; *copper = 0; *silver = 0; *gold = 0; *plat = 0; lts = database.GetLootTable(loottable_id); if (!lts) return; uint32 min_cash = lts->mincash; uint32 max_cash = lts->maxcash; if(min_cash > max_cash) { uint32 t = min_cash; min_cash = max_cash; max_cash = t; } uint32 cash = 0; if(max_cash > 0 && lts->avgcoin > 0 && EQEmu::ValueWithin(lts->avgcoin, min_cash, max_cash)) { float upper_chance = (float)(lts->avgcoin - min_cash) / (float)(max_cash - min_cash); float avg_cash_roll = (float)zone->random.Real(0.0, 1.0); if(avg_cash_roll < upper_chance) { cash = zone->random.Int(lts->avgcoin, max_cash); } else { cash = zone->random.Int(min_cash, lts->avgcoin); } } else { cash = zone->random.Int(min_cash, max_cash); } if(cash != 0) { *plat = cash / 1000; cash -= *plat * 1000; *gold = cash / 100; cash -= *gold * 100; *silver = cash / 10; cash -= *silver * 10; *copper = cash; } uint32 global_loot_multiplier = RuleI(Zone, GlobalLootMultiplier); // Do items for (uint32 i=0; i<lts->NumEntries; i++) { for (uint32 k = 1; k <= (lts->Entries[i].multiplier * global_loot_multiplier); k++) { uint8 droplimit = lts->Entries[i].droplimit; uint8 mindrop = lts->Entries[i].mindrop; //LootTable Entry probability float ltchance = 0.0f; ltchance = lts->Entries[i].probability; float drop_chance = 0.0f; if(ltchance > 0.0 && ltchance < 100.0) { drop_chance = (float)zone->random.Real(0.0, 100.0); } if (ltchance != 0.0 && (ltchance == 100.0 || drop_chance <= ltchance)) { AddLootDropToNPC(npc, lts->Entries[i].lootdrop_id, itemlist, droplimit, mindrop); } } } }
// Queries the loottable: adds item & coin to the npc void ZoneDatabase::AddLootTableToNPC(NPC* npc,uint32 loottable_id, ItemList* itemlist, uint32* copper, uint32* silver, uint32* gold, uint32* plat) { _ZP(Database_AddLootTableToNPC); //if (loottable_id == 178190) //DebugBreak(); const LootTable_Struct* lts = 0; *copper = 0; *silver = 0; *gold = 0; *plat = 0; lts = database.GetLootTable(loottable_id); if (!lts) return; // do coin if (lts->mincash > lts->maxcash) { std::cerr << "Error in loottable #" << loottable_id << ": mincash > maxcash" << std::endl; } else if (lts->maxcash != 0) { uint32 cash = 0; if (lts->mincash == lts->maxcash) cash = lts->mincash; else cash = MakeRandomInt(lts->mincash, lts->maxcash); if (cash != 0) { if (lts->avgcoin != 0) { //this is some crazy ass stuff... and makes very little sense... dont use it, k? uint32 mincoin = (uint32) (lts->avgcoin * 0.75 + 1); uint32 maxcoin = (uint32) (lts->avgcoin * 1.25 + 1); *copper = MakeRandomInt(mincoin, maxcoin); *silver = MakeRandomInt(mincoin, maxcoin); *gold = MakeRandomInt(mincoin, maxcoin); if(*copper > cash) { *copper = cash; } cash -= *copper; if(*silver>(cash/10)) { *silver = (cash/10); } cash -= *silver*10; if(*gold > (cash/100)) { *gold = (cash/100); } cash -= *gold*100; } if (cash < 0) { cash = 0; } *plat = cash / 1000; cash -= *plat * 1000; uint32 gold2 = cash / 100; cash -= gold2 * 100; uint32 silver2 = cash / 10; cash -= silver2 * 10; *gold += gold2; *silver += silver2; *copper += cash; } } // Do items for (uint32 i=0; i<lts->NumEntries; i++) { for (uint32 k = 1; k <= lts->Entries[i].multiplier; k++) { uint8 droplimit = lts->Entries[i].droplimit; uint8 mindrop = lts->Entries[i].mindrop; //LootTable Entry probability float ltchance = 0.0f; ltchance = lts->Entries[i].probability; float drop_chance = 0.0f; if(ltchance > 0.0 && ltchance < 100.0) { drop_chance = MakeRandomFloat(0.0, 100.0); } if (ltchance != 0.0 && (ltchance == 100.0 || drop_chance < ltchance)) { AddLootDropToNPC(npc,lts->Entries[i].lootdrop_id, itemlist, droplimit, mindrop); } } } }