forked from MagicBane/Server
				
			
				 1 changed files with 186 additions and 0 deletions
			
			
		@ -0,0 +1,186 @@
				@@ -0,0 +1,186 @@
					 | 
				
			||||
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<MobLoot> GlassItems = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot> Resources = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot> Runes = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot> Contracts = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot> Offerings = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot> OtherDrops = new ArrayList<MobLoot>(); | 
				
			||||
                ArrayList<MobLoot>ReturnedBootyList = SimulateMobLoot(mob); | 
				
			||||
                for(MobLoot 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(); | 
				
			||||
                output += "GLASS ITEMS DROPPED: " + GlassItems.size(); | 
				
			||||
                output += "RESOURCE STACKS DROPPED: " + Resources.size(); | 
				
			||||
                output += "RUNES DROPPED: " + Runes.size(); | 
				
			||||
                output += "CONTRACTS DROPPED: " + Contracts.size(); | 
				
			||||
                output += "OFFERINGS DROPPED: " + Offerings.size(); | 
				
			||||
                output += "OTHERS DROPPED: " + OtherDrops.size(); | 
				
			||||
                break; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        throwbackInfo(pc, output); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    protected String _getHelpString() { | 
				
			||||
        return "Gets information on an Object."; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    protected String _getUsageString() { | 
				
			||||
        return "' /info targetID'"; | 
				
			||||
    } | 
				
			||||
    public static ArrayList<MobLoot> SimulateMobLoot(Mob mob){ | 
				
			||||
        ArrayList<MobLoot> 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()); | 
				
			||||
        } | 
				
			||||
        //iterate the booty sets
 | 
				
			||||
        ArrayList<MobLoot> output1 = new ArrayList<>(); | 
				
			||||
        ArrayList<MobLoot> output2 = new ArrayList<>(); | 
				
			||||
        if(mob.getMobBase().bootySet != 0 && NPCManager._bootySetMap.containsKey(mob.getMobBase().bootySet)) { | 
				
			||||
            output1 = RunBootySet(NPCManager._bootySetMap.get(mob.getMobBase().bootySet), mob, multiplier, inHotzone); | 
				
			||||
        } | 
				
			||||
        if(mob.bootySet != 0) { | 
				
			||||
            output2 =RunBootySet(NPCManager._bootySetMap.get(mob.bootySet), mob, multiplier, inHotzone); | 
				
			||||
        } | 
				
			||||
        for(MobLoot lootItem : output1){ | 
				
			||||
            outList.add((lootItem)); | 
				
			||||
        } | 
				
			||||
        for(MobLoot lootItem : output2){ | 
				
			||||
            outList.add((lootItem)); | 
				
			||||
        } | 
				
			||||
        return outList; | 
				
			||||
    } | 
				
			||||
    private static ArrayList<MobLoot> RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, float multiplier, boolean inHotzone) { | 
				
			||||
        ArrayList<MobLoot> outList = new ArrayList<>(); | 
				
			||||
        for (BootySetEntry bse : entries) { | 
				
			||||
            //check if chance roll is good
 | 
				
			||||
            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": | 
				
			||||
                    MobLoot disc = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true); | 
				
			||||
                    if (disc != null) | 
				
			||||
                        //mob.getCharItemManager().addItemToInventory(disc);
 | 
				
			||||
 | 
				
			||||
                    break; | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
        return outList; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue