Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.redheademile.mobstacker;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.UUID;
- import java.util.stream.Collectors;
- import org.bukkit.Bukkit;
- import org.bukkit.World;
- import org.bukkit.entity.Ageable;
- import org.bukkit.entity.Creeper;
- import org.bukkit.entity.Entity;
- import org.bukkit.entity.EntityType;
- import org.bukkit.entity.LivingEntity;
- import org.bukkit.entity.Mob;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.entity.EntityDeathEvent;
- import org.bukkit.event.entity.EntityExplodeEvent;
- import org.bukkit.inventory.EntityEquipment;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.plugin.java.JavaPlugin;
- public class MobStacker extends JavaPlugin implements Listener
- {
- private double radius;
- private List<EntityType> allowed;
- private HashMap<EntityType, HashMap<UUID, ArrayList<CMob>>> mobs;
- @Override
- public void onEnable()
- {
- radius = 10D; // Rayon de fusion
- allowed = Arrays.asList(EntityType.ZOMBIE, EntityType.SKELETON, EntityType.RABBIT, EntityType.CREEPER, EntityType.PIG_ZOMBIE); // Mobs pouvant fusionner
- mobs = new HashMap<>();
- Bukkit.getScheduler().runTaskTimer(this, new MobStackerRunnable(), 1 * 20, 2 * 20);
- Bukkit.getPluginManager().registerEvents(this, this);
- }
- @Override
- public void onDisable()
- {
- mobs.values().forEach(map -> map.keySet().forEach(uuid -> Bukkit.getEntity(uuid).setCustomName(null)));
- }
- @EventHandler
- public void onDead(EntityDeathEvent e)
- {
- onEntityRemove(e.getEntity());
- }
- @EventHandler
- public void onExplode(EntityExplodeEvent e)
- {
- onEntityRemove(e.getEntity());
- }
- public void onEntityRemove(Entity e)
- {
- EntityType type = e.getType();
- HashMap<UUID, ArrayList<CMob>> mob = mobs.containsKey(type) ? mobs.get(type) : new HashMap<>();
- if(mob.containsKey(e.getUniqueId()))
- {
- ArrayList<CMob> mobsIn = mob.get(e.getUniqueId());
- if(mobsIn.size() > 0)
- {
- CMob cmob = mobsIn.get(0);
- Entity entity = e.getWorld().spawnEntity(e.getLocation(), type);
- cmob.apply(entity);
- entity.setCustomName("x" + (mobsIn.size() + 1));
- mobsIn.remove(cmob);
- mob.remove(e.getUniqueId());
- mob.put(entity.getUniqueId(), mobsIn);
- }
- else mob.remove(e.getUniqueId());
- mobs.put(type, mob);
- }
- }
- public class CMob
- {
- private int age;
- private double health;
- private boolean powered;
- private ItemStack[] armor;
- private ItemStack right, left;
- private float rightF, leftF, helmet, chestplate, leggings, boots;
- public CMob(Entity entity)
- {
- if(entity instanceof LivingEntity)
- {
- health = ((LivingEntity) entity).getHealth();
- EntityEquipment ee = ((LivingEntity) entity).getEquipment();
- armor = ee.getArmorContents();
- right = ee.getItemInMainHand();
- left = ee.getItemInOffHand();
- rightF = ee.getItemInMainHandDropChance();
- leftF = ee.getItemInOffHandDropChance();
- helmet = ee.getHelmetDropChance();
- chestplate = ee.getChestplateDropChance();
- leggings = ee.getLeggingsDropChance();
- boots = ee.getBootsDropChance();
- }
- if(entity instanceof Ageable) age = ((Ageable) entity).getAge();
- if(entity instanceof Creeper) powered = ((Creeper) entity).isPowered();
- }
- public void apply(Entity entity)
- {
- if(entity instanceof LivingEntity)
- {
- LivingEntity e = (LivingEntity) entity;
- e.setHealth(health);
- EntityEquipment ee = e.getEquipment();
- ee.setArmorContents(armor);
- ee.setItemInMainHand(right);
- ee.setItemInOffHand(left);
- ee.setItemInMainHandDropChance(rightF);
- ee.setItemInOffHandDropChance(leftF);
- ee.setHelmetDropChance(helmet);
- ee.setChestplateDropChance(chestplate);
- ee.setLeggingsDropChance(leggings);
- ee.setBootsDropChance(boots);
- }
- if(entity instanceof Ageable) ((Ageable) entity).setAge(age);
- if(entity instanceof Creeper) ((Creeper) entity).setPowered(powered);
- }
- }
- public class MobStackerRunnable implements Runnable
- {
- @Override
- public void run()
- {
- for(World w : Bukkit.getWorlds())
- that : for(Entity e : new ArrayList<>(w.getEntities()))
- {
- EntityType type = e.getType();
- if(!(e instanceof Mob) || !e.isValid() || !allowed.contains(type)) continue;
- HashMap<UUID, ArrayList<CMob>> mob = mobs.containsKey(type) ? mobs.get(type) : new HashMap<>();
- ArrayList<CMob> mobsIn = mob.containsKey(e.getUniqueId()) ? mob.get(e.getUniqueId()) : new ArrayList<>();
- 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());
- for(Entity near : nearList)
- {
- ArrayList<CMob> hisMobs = mob.containsKey(near.getUniqueId()) ? mob.get(near.getUniqueId()) : new ArrayList<>();
- if(hisMobs.size() > mobsIn.size())
- {
- hisMobs.addAll(mobsIn);
- hisMobs.add(new CMob(e));
- near.setCustomName("x" + (hisMobs.size() + 1));
- mob.put(near.getUniqueId(), hisMobs);
- }
- else
- {
- mobsIn.addAll(hisMobs);
- mobsIn.add(new CMob(near));
- e.setCustomName("x" + (mobsIn.size() + 1));
- mob.put(e.getUniqueId(), mobsIn);
- }
- mobs.put(type, mob);
- e.remove();
- continue that;
- }
- mob.put(e.getUniqueId(), mobsIn);
- mobs.put(type, mob);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement