misdocumeno

Untitled

Dec 19th, 2020
427
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package net.ddns.misplease.copyworld;
  2.  
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.Chunk;
  5. import org.bukkit.Location;
  6. import org.bukkit.World;
  7. import org.bukkit.attribute.Attribute;
  8. import org.bukkit.attribute.AttributeInstance;
  9. import org.bukkit.block.Block;
  10. import org.bukkit.block.BlockState;
  11. import org.bukkit.block.Container;
  12. import org.bukkit.block.data.BlockData;
  13. import org.bukkit.entity.*;
  14. import org.bukkit.inventory.*;
  15. import org.bukkit.util.BoundingBox;
  16. import java.util.HashSet;
  17. import java.util.Set;
  18.  
  19. public class CopyWorldWorker {
  20.  
  21.     final double[] blocks;
  22.     final World origin;
  23.     final World destination;
  24.  
  25.     public CopyWorldWorker(double[] blocks, World origin, World destination) {
  26.         this.blocks = blocks;
  27.         this.origin = origin;
  28.         this.destination = destination;
  29.     }
  30.  
  31.     private static Location getNewPosition(Location selectionStart, Location destinationStart, Location oldPosition, World world) {
  32.         double offsetX = oldPosition.getX() - selectionStart.getX();
  33.         double offsetY = oldPosition.getY() - selectionStart.getY();
  34.         double offsetZ = oldPosition.getZ() - selectionStart.getZ();
  35.         final double x = destinationStart.getX() + offsetX;
  36.         final double y = destinationStart.getY() + offsetY;
  37.         final double z = destinationStart.getZ() + offsetZ;
  38.         return new Location(world, x, y, z, oldPosition.getYaw(), oldPosition.getPitch());
  39.     }
  40.  
  41.     void startCopy() {
  42.  
  43.         // create the cube to be copied
  44.         BoundingBox box = new BoundingBox(blocks[0], blocks[1], blocks[2], blocks[3], blocks[4], blocks[5]);
  45.  
  46.         // chunks set (we will use it later to copy entities)
  47.         Set<Chunk> chunks = new HashSet<>();
  48.  
  49.         // starting positions
  50.         Location startPos1 = new Location(origin, box.getMinX(), box.getMinY(), box.getMinZ());
  51.         Location startPos2 = new Location(destination, blocks[6], blocks[7], blocks[8]);
  52.  
  53.         // start copying
  54.         for (double x = box.getMinX(); x <= box.getMaxX(); x++) {
  55.             for (double z = box.getMinZ(); z <= box.getMaxZ(); z++) {
  56.                 for (double y = box.getMinY(); y <= box.getMaxY(); y++) { // we will mainly iterate over the Y axis so we reload chunks as little as possible
  57.  
  58.                     //----------------
  59.                     // copy the block
  60.                     //----------------
  61.  
  62.                     // point to that block
  63.                     Location location = new Location(origin, x, y, z);
  64.  
  65.                     // get the block at that location
  66.                     Block block = location.getBlock();
  67.  
  68.                     // get block type and some other stuff
  69.                     BlockData blockData = block.getBlockData();
  70.                     String blockString = blockData.getAsString();
  71.  
  72.                     // add current chunk to the set
  73.                     chunks.add(block.getChunk());
  74.  
  75.                     //-----------------
  76.                     // paste the block
  77.                     //-----------------
  78.  
  79.                     // point to the destiny block
  80.                     Location newLocation = getNewPosition(startPos1, startPos2, new Location(origin, x, y, z), destination);
  81.  
  82.                     // get the block at the new location
  83.                     Block newBlock = newLocation.getBlock();
  84.  
  85.                     // set the new block data
  86.                     BlockData newBlockData = Bukkit.createBlockData(blockString);
  87.                     newBlock.setBlockData(newBlockData);
  88.  
  89.                     //-------------------
  90.                     // handle containers
  91.                     //-------------------
  92.  
  93.                     // get the old block state
  94.                     BlockState blockState = block.getState();
  95.  
  96.                     // check if it's a container
  97.                     if (blockState instanceof Container) {
  98.  
  99.                         // get the contents of the container
  100.                         Inventory inventory = ((Container)blockState).getInventory();
  101.  
  102.                         // get the inventory of the destiny block
  103.                         Inventory newInventory = ((Container)newBlock.getState()).getInventory();
  104.  
  105.                         // put items on the new block
  106.                         ItemStack[] contents = inventory.getContents().clone();
  107.                         newInventory.setContents(contents);
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.  
  113.         //-----------------
  114.         // handle entities
  115.         //-----------------
  116.  
  117.         // we have to do this to include the entities of the last upper block, otherwise they will not be copied
  118.         box.expand(0.0, 1.0, 0.0);
  119.  
  120.         // iterate over each chunk
  121.         for (Chunk chunk : chunks) {
  122.  
  123.             Entity[] entities = chunk.getEntities();
  124.  
  125.             for (Entity entity : entities) {
  126.  
  127.                 // only copy entities inside the selected box
  128.                 if (!box.contains(entity.getLocation().toVector()))
  129.                     continue;
  130.  
  131.                 // calculate the new position
  132.                 Location newEntPos = getNewPosition(startPos1, startPos2, entity.getLocation(), destination);
  133.  
  134.                 // handle item frames
  135.                 if (entity instanceof ItemFrame) {
  136.                     try {
  137.                         newEntPos.setX(newEntPos.getBlockX()); // we need to floor with item frames (for some reason)
  138.                         newEntPos.setY(newEntPos.getBlockY());
  139.                         newEntPos.setZ(newEntPos.getBlockZ());
  140.                         ItemFrame newItemFrame = (ItemFrame)destination.spawnEntity(newEntPos, EntityType.ITEM_FRAME);
  141.                         ItemFrame oldItemFrame = (ItemFrame)entity;
  142.                         newItemFrame.setItem(oldItemFrame.getItem());
  143.                         newItemFrame.setRotation(oldItemFrame.getRotation());
  144.                         newItemFrame.setFacingDirection(entity.getFacing());
  145.                     }
  146.                     catch (IllegalArgumentException ie) {
  147.                         Bukkit.getServer().getConsoleSender().sendMessage("warning: entity " + entity + "could not be copied.");
  148.                     }
  149.                 }
  150.  
  151.                 // handle armor stands
  152.                 else if (entity instanceof ArmorStand) {
  153.  
  154.                     ArmorStand newArmorStand = (ArmorStand)destination.spawnEntity(newEntPos, EntityType.ARMOR_STAND);
  155.                     EntityEquipment equipment = ((ArmorStand)entity).getEquipment();
  156.                     EntityEquipment newEquipment = newArmorStand.getEquipment();
  157.  
  158.                     if (equipment != null && newEquipment != null) {
  159.                         newEquipment.setArmorContents(equipment.getArmorContents());
  160.                     }
  161.                 }
  162.  
  163.                 // ender crystal
  164.                 else if (entity instanceof EnderCrystal) {
  165.                     EnderCrystal newEnderCrystal = (EnderCrystal)destination.spawnEntity(newEntPos, EntityType.ENDER_CRYSTAL);
  166.                     newEnderCrystal.setShowingBottom(((EnderCrystal)entity).isShowingBottom());
  167.                 }
  168.  
  169.                 // handle peaceful mobs
  170.                 else if (entity instanceof LivingEntity) {
  171.  
  172.                     // to make changes later
  173.                     Entity newEnt = null;
  174.  
  175.                     if (entity instanceof Chicken)
  176.                         newEnt = destination.spawnEntity(newEntPos, EntityType.CHICKEN);
  177.                     else if (entity instanceof Cow) {
  178.                         if (entity instanceof MushroomCow) {
  179.                             MushroomCow newMushroomCow = (MushroomCow)destination.spawnEntity(newEntPos, EntityType.MUSHROOM_COW);
  180.                             newMushroomCow.setVariant(((MushroomCow)entity).getVariant());
  181.                             newEnt = newMushroomCow;
  182.                         }
  183.                         else
  184.                             newEnt = destination.spawnEntity(newEntPos, EntityType.COW);
  185.                     }
  186.                     else if (entity instanceof Pig)
  187.                         newEnt = destination.spawnEntity(newEntPos, EntityType.PIG);
  188.                     else if (entity instanceof Squid)
  189.                         newEnt = destination.spawnEntity(newEntPos, EntityType.SQUID);
  190.                     else if (entity instanceof Turtle)
  191.                         newEnt = destination.spawnEntity(newEntPos, EntityType.TURTLE);
  192.                     else if (entity instanceof Dolphin)
  193.                         newEnt = destination.spawnEntity(newEntPos, EntityType.DOLPHIN);
  194.                     else if (entity instanceof PolarBear)
  195.                         newEnt = destination.spawnEntity(newEntPos, EntityType.POLAR_BEAR);
  196.                     else if (entity instanceof Parrot) {
  197.                         Parrot newParrot = (Parrot)destination.spawnEntity(newEntPos, EntityType.PARROT);
  198.                         newParrot.setVariant(((Parrot)entity).getVariant());
  199.                         newEnt = newParrot;
  200.                     }
  201.                     else if (entity instanceof Rabbit) {
  202.                         Rabbit newRabbit = (Rabbit)destination.spawnEntity(newEntPos, EntityType.RABBIT);
  203.                         newRabbit.setRabbitType(((Rabbit)entity).getRabbitType());
  204.                         newEnt = newRabbit;
  205.                     }
  206.                     else if (entity instanceof Sheep) {
  207.                         Sheep newSheep = (Sheep)destination.spawnEntity(newEntPos, EntityType.SHEEP);
  208.                         Sheep oldSheep = (Sheep)entity;
  209.                         newSheep.setSheared(oldSheep.isSheared());
  210.                         newSheep.setColor(oldSheep.getColor());
  211.                         newEnt = newSheep;
  212.                     }
  213.                     else if (entity instanceof Llama) {
  214.                         Llama newLlama = (Llama)destination.spawnEntity(newEntPos, EntityType.LLAMA);
  215.                         Llama oldLlama = (Llama)entity;
  216.                         newLlama.setColor(((Llama)entity).getColor());
  217.                         // inventory
  218.                         newLlama.setStrength(oldLlama.getStrength());
  219.                         newLlama.setCarryingChest(oldLlama.isCarryingChest());
  220.                         LlamaInventory newInventory = newLlama.getInventory();
  221.                         LlamaInventory oldInventory = oldLlama.getInventory();
  222.                         newInventory.setDecor(oldInventory.getDecor());
  223.                         newInventory.setContents(oldInventory.getContents());
  224.                         newInventory.setSaddle(oldInventory.getSaddle());
  225.  
  226.                         newEnt = newLlama;
  227.                     }
  228.                     else if (entity instanceof Mule) {
  229.                         Mule newMule = (Mule)destination.spawnEntity(newEntPos, EntityType.MULE);
  230.                         Mule oldMule = (Mule)entity;
  231.                         // inventory
  232.                         newMule.setCarryingChest(oldMule.isCarryingChest());
  233.                         AbstractHorseInventory newInventory = newMule.getInventory();
  234.                         AbstractHorseInventory oldInventory = oldMule.getInventory();
  235.                         newInventory.setContents(oldInventory.getContents());
  236.                         newInventory.setSaddle(oldInventory.getSaddle());
  237.  
  238.                         newEnt = newMule;
  239.                     }
  240.                     else if (entity instanceof Donkey) {
  241.                         Donkey newDonkey = (Donkey)destination.spawnEntity(newEntPos, EntityType.DONKEY);
  242.                         Donkey oldDonkey = (Donkey)entity;
  243.                         // inventory
  244.                         newDonkey.setCarryingChest(oldDonkey.isCarryingChest());
  245.                         AbstractHorseInventory newInventory = newDonkey.getInventory();
  246.                         AbstractHorseInventory oldInventory = oldDonkey.getInventory();
  247.                         newInventory.setContents(oldInventory.getContents());
  248.                         newInventory.setSaddle(oldInventory.getSaddle());
  249.  
  250.                         newEnt = newDonkey;
  251.                     }
  252.                     else if (entity instanceof Horse) {
  253.                         Horse newHorse = (Horse)destination.spawnEntity(newEntPos, EntityType.HORSE);
  254.                         Horse oldHorse = (Horse)entity;
  255.                         // inventory
  256.                         HorseInventory newInventory = newHorse.getInventory();
  257.                         HorseInventory oldInventory = oldHorse.getInventory();
  258.                         newInventory.setContents(oldInventory.getContents());
  259.                         // characteristics
  260.                         newHorse.setColor(oldHorse.getColor());
  261.                         newHorse.setStyle(oldHorse.getStyle());
  262.  
  263.                         newEnt = newHorse;
  264.                     }
  265.                     else if (entity instanceof SkeletonHorse) {
  266.                         SkeletonHorse newSkeletonHorse = (SkeletonHorse)destination.spawnEntity(newEntPos, EntityType.SKELETON_HORSE);
  267.                         // inventory
  268.                         AbstractHorseInventory newInventory = newSkeletonHorse.getInventory();
  269.                         AbstractHorseInventory oldInventory = ((SkeletonHorse)entity).getInventory();
  270.                         newInventory.setContents(oldInventory.getContents());
  271.  
  272.                         newEnt = newSkeletonHorse;
  273.                     }
  274.                     else if (entity instanceof Bee) {
  275.                         Bee newBee = (Bee)destination.spawnEntity(newEntPos, EntityType.BEE);
  276.                         Bee oldBee = (Bee)entity;
  277.                         newBee.setAnger(oldBee.getAnger());
  278.                         newBee.setCannotEnterHiveTicks(oldBee.getCannotEnterHiveTicks());
  279.                         newBee.setHasNectar(oldBee.hasNectar());
  280.                         newBee.setHasStung(oldBee.hasStung());
  281.                         // current flower
  282.                         Location flowerPos = oldBee.getFlower();
  283.                         if (flowerPos != null) {
  284.                             Location newFlowerPos = getNewPosition(startPos1, startPos2, flowerPos, destination);
  285.                             newBee.setFlower(newFlowerPos);
  286.                         }
  287.                         // current hive
  288.                         Location hivePos = oldBee.getHive();
  289.                         if (hivePos != null) {
  290.                             Location newHivePos = getNewPosition(startPos1, startPos2, hivePos, destination);
  291.                             newBee.setFlower(newHivePos);
  292.                         }
  293.  
  294.                         newEnt = newBee;
  295.                     }
  296.                     else if (entity instanceof Cat) {
  297.                         Cat newCat = (Cat)destination.spawnEntity(newEntPos, EntityType.CAT);
  298.                         Cat oldCat = (Cat)entity;
  299.                         newCat.setCatType(oldCat.getCatType());
  300.                         newCat.setCollarColor(oldCat.getCollarColor());
  301.                         newEnt = newCat;
  302.                     }
  303.                     else if (entity instanceof Wolf) {
  304.                         Wolf newWolf = (Wolf)destination.spawnEntity(newEntPos, EntityType.WOLF);
  305.                         Wolf oldWolf = (Wolf)entity;
  306.                         newWolf.setAngry(oldWolf.isAngry());
  307.                         newWolf.setCollarColor(oldWolf.getCollarColor());
  308.                         newEnt = newWolf;
  309.                     }
  310.                     else if (entity instanceof Fox) {
  311.                         Fox newFox = (Fox)destination.spawnEntity(newEntPos, EntityType.FOX);
  312.                         Fox oldFox = (Fox)entity;
  313.                         newFox.setFirstTrustedPlayer(oldFox.getFirstTrustedPlayer());
  314.                         newFox.setFoxType(oldFox.getFoxType());
  315.                         newFox.setSecondTrustedPlayer(oldFox.getSecondTrustedPlayer());
  316.                         newFox.setCrouching(oldFox.isCrouching());
  317.                         newFox.setSleeping(oldFox.isSleeping());
  318.                         newEnt = newFox;
  319.                     }
  320.                     // there are no villagers on mispark anyways...
  321.                     /*
  322.                     else if (entity instanceof Villager) { // are villagers peaceful mobs?? maybe
  323.                         Villager oldVillager = (Villager)entity;
  324.                         Villager newVillager = (Villager)destination.spawnEntity(newEntPos, EntityType.VILLAGER);
  325.                         newVillager.setVillagerType(oldVillager.getVillagerType());
  326.                         newVillager.setProfession(oldVillager.getProfession());
  327.                         newVillager.setVillagerExperience(oldVillager.getVillagerExperience());
  328.                         newVillager.setVillagerLevel(oldVillager.getVillagerLevel());
  329.                         // trades
  330.                         newVillager.setRecipes(oldVillager.getRecipes());
  331.                         // inventory
  332.                         Inventory oldInventory = oldVillager.getInventory();
  333.                         Inventory newInventory = newVillager.getInventory();
  334.                         newInventory.setContents(oldInventory.getContents());
  335.  
  336.                         newEnt = newVillager;
  337.                     }
  338.                     */
  339.                     else if (entity instanceof IronGolem) {
  340.                         IronGolem newIronGolem = (IronGolem)destination.spawnEntity(newEntPos, EntityType.IRON_GOLEM);
  341.                         newIronGolem.setPlayerCreated(((IronGolem)entity).isPlayerCreated());
  342.                         newEnt = newIronGolem;
  343.                     }
  344.                     // fish
  345.                     else if (entity instanceof Cod)
  346.                         newEnt = destination.spawnEntity(newEntPos, EntityType.COD);
  347.                     else if (entity instanceof Salmon)
  348.                         newEnt = destination.spawnEntity(newEntPos, EntityType.SALMON);
  349.                     else if (entity instanceof PufferFish) {
  350.                         PufferFish newPufferFish = (PufferFish)destination.spawnEntity(newEntPos, EntityType.PUFFERFISH);
  351.                         newPufferFish.setPuffState(((PufferFish)entity).getPuffState());
  352.                         newEnt = newPufferFish;
  353.                     }
  354.                     else if (entity instanceof TropicalFish) {
  355.                         TropicalFish newTropicalFish = (TropicalFish)destination.spawnEntity(newEntPos, EntityType.TROPICAL_FISH);
  356.                         TropicalFish oldTropicalFish = (TropicalFish)entity;
  357.                         newTropicalFish.setBodyColor(oldTropicalFish.getBodyColor());
  358.                         newTropicalFish.setPattern(oldTropicalFish.getPattern());
  359.                         newTropicalFish.setPatternColor(oldTropicalFish.getPatternColor());
  360.                         newEnt = newTropicalFish;
  361.                     }
  362.  
  363.                     // final adjustments
  364.                     if (newEnt != null) {
  365.  
  366.                         // set horse characteristics
  367.                         if (newEnt instanceof AbstractHorse) {
  368.                             AbstractHorse newHorse = (AbstractHorse)newEnt;
  369.                             AbstractHorse oldHorse = (AbstractHorse)entity;
  370.                             // characteristics (doesn't work for skeleton horses, but who cares...)
  371.                             newHorse.setDomestication(oldHorse.getDomestication());
  372.                             newHorse.setJumpStrength(oldHorse.getJumpStrength());
  373.                             newHorse.setMaxDomestication(oldHorse.getMaxDomestication());
  374.                             // health
  375.                             AttributeInstance oldMaxHealth = oldHorse.getAttribute(Attribute.GENERIC_MAX_HEALTH);
  376.                             AttributeInstance newMaxHealth = newHorse.getAttribute(Attribute.GENERIC_MAX_HEALTH);
  377.                             if (oldMaxHealth != null && newMaxHealth != null)
  378.                                 newMaxHealth.setBaseValue(oldMaxHealth.getBaseValue());
  379.                             // speed
  380.                             AttributeInstance oldMaxSpeed = oldHorse.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED);
  381.                             AttributeInstance newMaxSpeed = newHorse.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED);
  382.                             if (oldMaxSpeed != null && newMaxSpeed != null)
  383.                                 newMaxSpeed.setBaseValue(oldMaxSpeed.getBaseValue());
  384.                         }
  385.  
  386.                         // set age
  387.                         if (newEnt instanceof Ageable) {
  388.                             ((Ageable)newEnt).setAge(((Ageable)entity).getAge());
  389.                             if (((Ageable)entity).isAdult())
  390.                                 ((Ageable)newEnt).setAdult();
  391.                             else
  392.                                 ((Ageable)newEnt).setBaby();
  393.                         }
  394.  
  395.                         // set name tag
  396.                         String customName = entity.getCustomName();
  397.                         if (customName != null) {
  398.                             newEnt.setCustomName(customName);
  399.                             newEnt.setCustomNameVisible(entity.isCustomNameVisible());
  400.                         }
  401.  
  402.                         // set pet owner
  403.                         if (newEnt instanceof Tameable) {
  404.                             if (((Tameable)entity).isTamed()) {
  405.                                 Bukkit.getServer().getConsoleSender().sendMessage("Taming " + newEnt);
  406.                                 ((Tameable)newEnt).setTamed(true);
  407.                                 ((Tameable)newEnt).setOwner(((Tameable)entity).getOwner());
  408.                             }
  409.                         }
  410.  
  411.                         // sit if pet
  412.                         if (newEnt instanceof Sittable)
  413.                             ((Sittable)newEnt).setSitting(((Sittable)entity).isSitting());
  414.  
  415.                         // leash entities to fences
  416.                         Entity holder;
  417.                         try {
  418.                             holder = ((LivingEntity)entity).getLeashHolder();
  419.                         } catch (IllegalStateException ie){
  420.                             holder = null;
  421.                         }
  422.  
  423.                         if (holder != null && newEnt instanceof LivingEntity) {
  424.                             Location newHitchPos = getNewPosition(startPos1, startPos2, holder.getLocation(), destination);
  425.                             LeashHitch newHitch = (LeashHitch)destination.spawnEntity(newHitchPos, EntityType.LEASH_HITCH);
  426.                             ((LivingEntity)newEnt).setLeashHolder(newHitch);
  427.                         }
  428.                     }
  429.                 }
  430.             }
  431.         }
  432.     }
  433. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×