[Updated] Schematic Rotation Only works on South&East

Discussion in 'Spigot Plugin Development' started by NetherGoblin, Dec 8, 2018 at 8:08 PM.

  1. Okay so to put it simply im trying to control the direction a schematic is placed via the direction a player is facing, i have done this with the worldEdit API but now im trying to load a schematic in myself without the api (Just for that part)
    But the rotation works just fine if i use the worldedit paste function but when using my own it only works when facing south / east?
    Here is all the NEW code you would need
    Code (Text):
    package com.nethergoblin.schematicManager;

    import java.io.File;
    import java.util.HashMap;

    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.entity.Player;

    import com.sk89q.worldedit.CuboidClipboard;
    import com.sk89q.worldedit.Vector;
    import com.sk89q.worldedit.blocks.BaseBlock;

    public class SchematicController {
        private SchematicManager plugin;
        private short[] blocks;
        private byte[] data;
        private int sizeX;
        private int sizeY;
        private int sizeZ;
        private BaseBlock[][][] blockArray;
        private Location lastLoc;
        private CuboidClipboard cc;
        private int Rotation;
        private HashMap<String, Location> lastLocs = new HashMap<>();
       
        public SchematicController(CuboidClipboard cc) {
            this.cc = cc;
        }
       
        //Public Functions
       
        public void loadSchematic(Player player, Location loc, File schematic, int rot, boolean blockCheck, boolean preview) {
            cc.rotate2D(rot);
            blockArray = loadBlocks(cc);
            if(lastLocs.containsKey(player.getName())) {
                unloadPreview(player, lastLocs.get(player.getName()));
            }
            if(blockCheck) {
                if(blockCheck(player, loc)) {
                    if(preview) {
                        for (int x = 0; x < sizeX; x++) {
                            for (int y = 0; y < sizeY; y++) {
                                for (int z = 0; z < sizeZ; z++) {
                                    player.sendBlockChange(loc.clone().add(x, y, z), blockArray[x][y][z].getType(),
                                            (byte) blockArray[x][y][z].getData());
                                }
                            }
                        }
                    } else {
                        for (int x = 0; x < sizeX; x++) {
                            for (int y = 0; y < sizeY; y++) {
                                for (int z = 0; z < sizeZ; z++) {
                                    Bukkit.getServer().getWorld(loc.clone().getWorld().getName()).getBlockAt(loc.clone().add(x, y, z)).setTypeId(blockArray[x][y][z].getType());
                                }
                            }
                        }
                    }
                } else {
                   
                }
            } else {
                if(preview) {
                    for (int x = 0; x < sizeX; x++) {
                        for (int y = 0; y < sizeY; y++) {
                            for (int z = 0; z < sizeZ; z++) {
                                player.sendBlockChange(loc.clone().add(x, y, z), blockArray[x][y][z].getType(),
                                        (byte) blockArray[x][y][z].getData());
                            }
                        }
                    }
                    lastLoc = loc;
                    lastLocs.put(player.getName(), lastLoc);
                } else {
                    for (int x = 0; x < sizeX; x++) {
                        for (int y = 0; y < sizeY; y++) {
                            for (int z = 0; z < sizeZ; z++) {
                                Bukkit.getServer().getWorld(loc.clone().getWorld().getName()).getBlockAt(loc.clone().add(x, y, z)).setTypeId(blockArray[x][y][z].getType());
                            }
                        }
                    }
                }
            }
            lastLoc = loc;
            lastLocs.put(player.getName(), lastLoc);
        }
       
        public int getPlayerRotation(Player player) {
            double rotation = player.getLocation().getYaw() - 180.0F;
            if (rotation < 0.0D) {
              rotation += 360.0D;
            }
            if ((0.0D <= rotation) && (rotation < 22.5D)) {
              return 0;
            }
            if ((67.5D <= rotation) && (rotation < 112.5D)) {
              return 90;
            }
            if ((157.5D <= rotation) && (rotation < 202.5D)) {
              return 180;
            }
            if ((247.5D <= rotation) && (rotation < 292.5D)) {
              return 270;
            }
            if ((337.5D <= rotation) && (rotation <= 360.0D)) {
              return 360;
            }

            return 0;
          }

       
        //Getters & Setters
       
       
        public short[] getBlocks() {
            return blocks;
        }

        public int getRotation() {
            return Rotation;
        }

        public void setRotation(int rotation) {
            Rotation = rotation;
        }

        public CuboidClipboard getController() {
            return cc;
        }

        public void setController(CuboidClipboard cc) {
            this.cc = cc;
        }

        public void setBlocks(short[] blocks) {
            this.blocks = blocks;
        }

        public byte[] getData() {
            return data;
        }

        public void setData(byte[] data) {
            this.data = data;
        }

        public int getSizeX() {
            return sizeX;
        }

        public void setSizeX(int sizeX) {
            this.sizeX = sizeX;
        }

        public int getSizeY() {
            return sizeY;
        }

        public void setSizeY(int sizeY) {
            this.sizeY = sizeY;
        }

        public int getSizeZ() {
            return sizeZ;
        }

        public void setSizeZ(int sizeZ) {
            this.sizeZ = sizeZ;
        }

        public BaseBlock[][][] getBlockArray() {
            return blockArray;
        }

        public void setBlockArray(BaseBlock[][][] blockArray) {
            this.blockArray = blockArray;
        }

        public Location getLastLoc() {
            return lastLoc;
        }

        public void setLastLoc(Location lastLoc) {
            this.lastLoc = lastLoc;
        }
       
        //Private Functions
       
        private BaseBlock[][][] loadBlocks(CuboidClipboard cc) {
            sizeX = cc.getWidth();
            sizeY = cc.getHeight();
            sizeZ = cc.getLength();
            BaseBlock[][][] blocks = new BaseBlock[sizeX][sizeY][sizeZ];
            for (int x = 0; x < sizeX; x++) {
                for (int y = 0; y < sizeY; y++) {
                    for (int z = 0; z < sizeZ; z++) {
                        blocks[x][y][z] = cc.getBlock(new Vector(x, y, z));
                    }
                }
            }

            return blocks;

        }
       
        private boolean blockCheck(Player player, Location loc) {
            for (int x = 0; x < sizeX; x++) {
                for (int y = 0; y < sizeY; y++) {
                    for (int z = 0; z < sizeZ; z++) {
                        if(Bukkit.getServer().getWorld(loc.clone().getWorld().getName()).getBlockAt(loc.clone().add(x, y, z)).getType() == Material.AIR) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
       
        private void unloadPreview(Player player, Location loc)
          {
            for (int x = 0; x < sizeX; x++) {
              for (int y = 0; y < sizeY; y++) {
                for (int z = 0; z < sizeZ; z++) {
                  Location temp = loc.clone().add(x, y, z);
                  Block b = temp.getBlock();
                  player.sendBlockChange(temp, b.getType(), (byte)0);
                }
              }
            }
          }
    }
     
    Any of yall got an idea?
     
    #1 NetherGoblin, Dec 8, 2018 at 8:08 PM
    Last edited: Dec 8, 2018 at 11:26 PM
  2. Bump (Cleared code so its readable so yall can really help)
     

Share This Page