package engine.devcmd.cmds; import engine.Enum; import engine.devcmd.AbstractDevCmd; import engine.gameManager.*; import engine.objects.*; import java.util.ArrayList; import java.util.concurrent.ThreadLocalRandom; import static engine.loot.LootManager.getGenTableItem; public class simulateBootyCmd extends AbstractDevCmd { public simulateBootyCmd() { super("simulatebooty"); } @Override protected void _doCmd(PlayerCharacter pc, String[] words, AbstractGameObject target) { // Arg Count Check if (words.length != 1) { this.sendUsage(pc); return; } if (pc == null) { return; } String newline = "\r\n "; try { int targetID = Integer.parseInt(words[0]); Building b = BuildingManager.getBuilding(targetID); if (b == null) throwbackError(pc, "Building with ID " + targetID + " not found"); else target = b; } catch (Exception e) { } if (target == null) { throwbackError(pc, "Target is unknown or of an invalid type." + newline + "Type ID: 0x" + pc.getLastTargetType().toString() + " Table ID: " + pc.getLastTargetID()); return; } Enum.GameObjectType objType = target.getObjectType(); int objectUUID = target.getObjectUUID(); String output; output = "Loot Simulation:" + newline; switch (objType) { case Building: break; case PlayerCharacter: break; case NPC: break; case Mob: Mob mob = (Mob) target; ArrayList GlassItems = new ArrayList(); ArrayList Resources = new ArrayList(); ArrayList Runes = new ArrayList(); ArrayList Contracts = new ArrayList(); ArrayList Offerings = new ArrayList(); ArrayList OtherDrops = new ArrayList(); ArrayListReturnedBootyList = new ArrayList(); for(int i = 0; i < 100; ++i) { mob.loadInventory(); for(Item lootItem : mob.getCharItemManager().getInventory()){ ReturnedBootyList.add(lootItem); } } for(Item ml : ReturnedBootyList){ if(ml.getItemBase().isGlass() == true){ GlassItems.add(ml); break; } switch(ml.getItemBase().getType().ordinal()){ case 20: //CONTRACT Contracts.add(ml); break; case 33: //OFFERING Offerings.add(ml); break; case 34: //RESOURCE Resources.add(ml); break; case 5: //RUNE Runes.add(ml); break; default: OtherDrops.add(ml); break; } } output += "TOTAL ITEMS DROPPED: " + ReturnedBootyList.size() + newline; output += "GLASS ITEMS DROPPED: " + GlassItems.size() + newline; output += "RESOURCE STACKS DROPPED: " + Resources.size() + newline; output += "RUNES DROPPED: " + Runes.size() + newline; output += "CONTRACTS DROPPED: " + Contracts.size() + newline; output += "OFFERINGS DROPPED: " + Offerings.size() + newline; output += "OTHERS DROPPED: " + OtherDrops.size() + newline; break; } throwbackInfo(pc, output); } @Override protected String _getHelpString() { return "Gets information on an Object."; } @Override protected String _getUsageString() { return "' /info targetID'"; } public static ArrayList SimulateMobLoot(Mob mob){ ArrayList outList = new ArrayList<>(); //determine if mob is in hotzone boolean inHotzone = ZoneManager.inHotZone(mob.getLoc()); //get multiplier form config manager float multiplier = Float.parseFloat(ConfigManager.MB_NORMAL_DROP_RATE.getValue()); if (inHotzone) { //if mob is inside hotzone, use the hotzone gold multiplier form the config instead multiplier = Float.parseFloat(ConfigManager.MB_HOTZONE_DROP_RATE.getValue()); } //simulate loot 100 times for(int i = 0; i < 5; ++i) { //iterate the booty sets if (mob.getMobBase().bootySet != 0 && NPCManager._bootySetMap.containsKey(mob.getMobBase().bootySet)) { try { ArrayList testList = RunBootySet(NPCManager._bootySetMap.get(mob.getMobBase().bootySet), mob, multiplier, inHotzone); for (MobLoot lootItem : testList) { outList.add((lootItem)); } }catch(Exception ex){ } } } return outList; } private static ArrayList RunBootySet(ArrayList entries, Mob mob, float multiplier, boolean inHotzone) { ArrayList outList = new ArrayList<>(); for (BootySetEntry bse : entries) { switch (bse.bootyType) { case "GOLD": break; case "LOOT": if (ThreadLocalRandom.current().nextInt(100) <= (bse.dropChance * multiplier)) { //early exit, failed to hit minimum chance roll break; } //iterate the booty tables and add items to mob inventory MobLoot toAdd = getGenTableItem(bse.lootTable, mob); if (toAdd != null) { //mob.getCharItemManager().addItemToInventory(toAdd); outList.add(toAdd); } if (inHotzone) { int lootTableID = bse.lootTable + 1; MobLoot toAddHZ = getGenTableItem(lootTableID, mob); if (toAddHZ != null) //mob.getCharItemManager().addItemToInventory(toAddHZ); outList.add(toAdd); } break; case "ITEM": break; } } return outList; } }