Advertisement
LegarsStyler

MobStacker

May 9th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.51 KB | None | 0 0
  1. package net.redheademile.mobstacker;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.UUID;
  8. import java.util.stream.Collectors;
  9.  
  10. import org.bukkit.Bukkit;
  11. import org.bukkit.World;
  12. import org.bukkit.entity.Ageable;
  13. import org.bukkit.entity.Creeper;
  14. import org.bukkit.entity.Entity;
  15. import org.bukkit.entity.EntityType;
  16. import org.bukkit.entity.LivingEntity;
  17. import org.bukkit.entity.Mob;
  18. import org.bukkit.event.EventHandler;
  19. import org.bukkit.event.Listener;
  20. import org.bukkit.event.entity.EntityDeathEvent;
  21. import org.bukkit.event.entity.EntityExplodeEvent;
  22. import org.bukkit.inventory.EntityEquipment;
  23. import org.bukkit.inventory.ItemStack;
  24. import org.bukkit.plugin.java.JavaPlugin;
  25.  
  26. public class MobStacker extends JavaPlugin implements Listener
  27. {
  28.     private double radius;
  29.     private List<EntityType> allowed;
  30.     private HashMap<EntityType, HashMap<UUID, ArrayList<CMob>>> mobs;
  31.    
  32.     @Override
  33.     public void onEnable()
  34.     {
  35.         radius = 10D; // Rayon de fusion
  36.         allowed = Arrays.asList(EntityType.ZOMBIE, EntityType.SKELETON, EntityType.RABBIT, EntityType.CREEPER, EntityType.PIG_ZOMBIE); // Mobs pouvant fusionner
  37.        
  38.         mobs = new HashMap<>();
  39.         Bukkit.getScheduler().runTaskTimer(this, new MobStackerRunnable(), 1 * 20, 2 * 20);
  40.         Bukkit.getPluginManager().registerEvents(this, this);
  41.     }
  42.    
  43.     @Override
  44.     public void onDisable()
  45.     {
  46.         mobs.values().forEach(map -> map.keySet().forEach(uuid -> Bukkit.getEntity(uuid).setCustomName(null)));
  47.     }
  48.    
  49.     @EventHandler
  50.     public void onDead(EntityDeathEvent e)
  51.     {
  52.         onEntityRemove(e.getEntity());
  53.     }
  54.    
  55.     @EventHandler
  56.     public void onExplode(EntityExplodeEvent e)
  57.     {
  58.         onEntityRemove(e.getEntity());
  59.     }
  60.    
  61.     public void onEntityRemove(Entity e)
  62.     {
  63.         EntityType type = e.getType();
  64.         HashMap<UUID, ArrayList<CMob>> mob = mobs.containsKey(type) ? mobs.get(type) : new HashMap<>();
  65.         if(mob.containsKey(e.getUniqueId()))
  66.         {
  67.             ArrayList<CMob> mobsIn = mob.get(e.getUniqueId());
  68.             if(mobsIn.size() > 0)
  69.             {
  70.                 CMob cmob = mobsIn.get(0);
  71.                 Entity entity = e.getWorld().spawnEntity(e.getLocation(), type);
  72.                 cmob.apply(entity);
  73.                 entity.setCustomName("x" + (mobsIn.size() + 1));
  74.                
  75.                 mobsIn.remove(cmob);
  76.                 mob.remove(e.getUniqueId());
  77.                 mob.put(entity.getUniqueId(), mobsIn);
  78.             }
  79.             else mob.remove(e.getUniqueId());
  80.             mobs.put(type, mob);
  81.         }
  82.     }
  83.    
  84.     public class CMob
  85.     {
  86.         private int age;
  87.         private double health;
  88.         private boolean powered;
  89.         private ItemStack[] armor;
  90.         private ItemStack right, left;
  91.         private float rightF, leftF, helmet, chestplate, leggings, boots;
  92.         public CMob(Entity entity)
  93.         {
  94.             if(entity instanceof LivingEntity)
  95.             {
  96.                 health = ((LivingEntity) entity).getHealth();
  97.                 EntityEquipment ee = ((LivingEntity) entity).getEquipment();
  98.                 armor = ee.getArmorContents();
  99.                 right = ee.getItemInMainHand();
  100.                 left = ee.getItemInOffHand();
  101.                 rightF = ee.getItemInMainHandDropChance();
  102.                 leftF = ee.getItemInOffHandDropChance();
  103.                 helmet = ee.getHelmetDropChance();
  104.                 chestplate = ee.getChestplateDropChance();
  105.                 leggings = ee.getLeggingsDropChance();
  106.                 boots = ee.getBootsDropChance();
  107.             }
  108.             if(entity instanceof Ageable) age = ((Ageable) entity).getAge();
  109.             if(entity instanceof Creeper) powered = ((Creeper) entity).isPowered();
  110.         }
  111.        
  112.         public void apply(Entity entity)
  113.         {
  114.             if(entity instanceof LivingEntity)
  115.             {
  116.                 LivingEntity e = (LivingEntity) entity;
  117.                 e.setHealth(health);
  118.                 EntityEquipment ee = e.getEquipment();
  119.                 ee.setArmorContents(armor);
  120.                 ee.setItemInMainHand(right);
  121.                 ee.setItemInOffHand(left);
  122.                 ee.setItemInMainHandDropChance(rightF);
  123.                 ee.setItemInOffHandDropChance(leftF);
  124.                 ee.setHelmetDropChance(helmet);
  125.                 ee.setChestplateDropChance(chestplate);
  126.                 ee.setLeggingsDropChance(leggings);
  127.                 ee.setBootsDropChance(boots);
  128.             }
  129.             if(entity instanceof Ageable) ((Ageable) entity).setAge(age);
  130.             if(entity instanceof Creeper) ((Creeper) entity).setPowered(powered);
  131.         }
  132.     }
  133.    
  134.     public class MobStackerRunnable implements Runnable
  135.     {
  136.         @Override
  137.         public void run()
  138.         {
  139.             for(World w : Bukkit.getWorlds())
  140.                 that : for(Entity e : new ArrayList<>(w.getEntities()))
  141.                 {
  142.                     EntityType type = e.getType();
  143.                     if(!(e instanceof Mob) || !e.isValid() || !allowed.contains(type)) continue;
  144.                    
  145.                     HashMap<UUID, ArrayList<CMob>> mob = mobs.containsKey(type) ? mobs.get(type) : new HashMap<>();
  146.                     ArrayList<CMob> mobsIn = mob.containsKey(e.getUniqueId()) ? mob.get(e.getUniqueId()) : new ArrayList<>();
  147.                     List<Entity> nearList = w.getEntities().stream().filter(en -> en.getType().equals(type) && en.isValid() && !en.equals(e) && en.getWorld().equals(e.getWorld()) && en.getLocation().distance(e.getLocation()) <= radius).collect(Collectors.toList());
  148.                     for(Entity near : nearList)
  149.                     {
  150.                         ArrayList<CMob> hisMobs = mob.containsKey(near.getUniqueId()) ? mob.get(near.getUniqueId()) : new ArrayList<>();
  151.                         if(hisMobs.size() > mobsIn.size())
  152.                         {
  153.                             hisMobs.addAll(mobsIn);
  154.                             hisMobs.add(new CMob(e));
  155.                             near.setCustomName("x" + (hisMobs.size() + 1));
  156.                             mob.put(near.getUniqueId(), hisMobs);
  157.                         }
  158.                         else
  159.                         {
  160.                             mobsIn.addAll(hisMobs);
  161.                             mobsIn.add(new CMob(near));
  162.                             e.setCustomName("x" + (mobsIn.size() + 1));
  163.                             mob.put(e.getUniqueId(), mobsIn);
  164.                         }
  165.                         mobs.put(type, mob);
  166.                         e.remove();
  167.                         continue that;
  168.                     }
  169.                     mob.put(e.getUniqueId(), mobsIn);
  170.                     mobs.put(type, mob);
  171.                 }
  172.         }
  173.     }
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement