package com.hbm.util; import com.hbm.entity.mob.ai.EntityAIFireGun; import com.hbm.items.ModItems; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.WeightedRandom; import java.util.*; public class MobUtil { public static Map> slotPoolCommon = new HashMap<>(); public static Map> slotPoolRanged = new HashMap<>(); public static Map> slotPoolAdv = new HashMap<>(); public static Map> slotPoolAdvRanged; /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ public static HashMap> slotPoolGuns = new HashMap<>(); public static void intializeMobPools(){ slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} })); slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, {ModItems.steel_plate, 2} })); slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} })); slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} })); slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, {ModItems.wrench, 20} })); slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} })); slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} })); slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, })); slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, {ModItems.titanium_boots, 6} })); slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} })); slotPoolGuns.put(1D, createSlotPool(new Object[][]{ {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} })); slotPoolGuns.put(3D, createSlotPool(new Object[][]{ {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} })); slotPoolGuns.put(5D, createSlotPool(new Object[][]{ {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} })); slotPoolAdv.put(4, createSlotPool(new Object[][]{ {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, {ModItems.hazmat_helmet, 6} })); slotPoolAdv.put(3, createSlotPool(new Object[][]{ {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, {ModItems.steel_plate, 8} })); slotPoolAdv.put(2, createSlotPool(new Object[][]{ {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, {ModItems.steel_legs, 8} })); slotPoolAdv.put(1, createSlotPool(new Object[][]{ {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, {ModItems.robes_boots, 8} })); slotPoolAdv.put(0, createSlotPool(new Object[][]{ {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, {ModItems.wrench, 20} })); slotPoolAdvRanged = new HashMap<>(slotPoolAdv); slotPoolAdvRanged.remove(0); } public static List createSlotPool(int nullWeight, Object[][] items) { List pool = new ArrayList<>(); pool.add(new WeightedRandomObject(null, nullWeight)); for (Object[] item : items) { Object obj = item[0]; int weight = (int) item[1]; if (obj instanceof Item) { pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell pool.add(new WeightedRandomObject(obj, weight)); } } return pool; } public static List createSlotPool(Object[][] items) { List pool = new ArrayList<>(); for (Object[] item : items) { Object obj = item[0]; int weight = (int) item[1]; if (obj instanceof Item) { pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell pool.add(new WeightedRandomObject(obj, weight)); } } return pool; } public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number entity.setCurrentItemOrArmor(3, new ItemStack(chest)); entity.setCurrentItemOrArmor(2, new ItemStack(legs)); entity.setCurrentItemOrArmor(1, new ItemStack(boots)); } public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { for (Map.Entry> entry : slotPools.entrySet()) { int slot = entry.getKey(); List pool = entry.getValue(); WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix if (choice == null) { continue; } ItemStack stack = choice.asStack(); if (stack == null || stack.getItem() == null) { continue; } if (stack.getItem() == ModItems.gas_mask_m65 //eyesore || stack.getItem() == ModItems.gas_mask_olde || stack.getItem() == ModItems.gas_mask_mono) { ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); } entity.setCurrentItemOrArmor(slot, stack); //Give skeleton AI if it has a gun if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { addFireTask((EntityLiving) entity); } } } // these fucking tasks keep stacking on top of themselves public static void addFireTask(EntityLiving entity) { entity.setEquipmentDropChance(0, 0); // Prevent dropping guns for(Object entry : entity.tasks.taskEntries) { EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; if(task.action instanceof EntityAIFireGun) return; } entity.tasks.addTask(3, new EntityAIFireGun(entity)); } }