From aaf6bd00b1682ce22bab036ccd1d1c280d312a4a Mon Sep 17 00:00:00 2001 From: Leonard Kugis Date: Sat, 24 Dec 2016 05:09:24 +0100 Subject: initial commit --- .../com/encrox/instanceddungeons/Commander.java | 40 ++++ .../com/encrox/instanceddungeons/Direction.java | 10 + .../java/com/encrox/instanceddungeons/Dungeon.java | 48 ++++ .../com/encrox/instanceddungeons/DungeonWorld.java | 50 ++++ .../instanceddungeons/InstancedDungeons.java | 253 ++++++++++++++++++++ .../com/encrox/instanceddungeons/Schematic.java | 86 +++++++ .../java/com/encrox/instanceddungeons/Section.java | 263 +++++++++++++++++++++ src/main/resources/config.json | 22 ++ src/main/resources/descriptor.json | 72 ++++++ src/main/resources/lang/de-DE.properties | 1 + src/main/resources/lang/en-GB.properties | 1 + src/main/resources/plugin.yml | 9 + src/main/resources/schematics/endBottom.schematic | Bin 0 -> 270 bytes src/main/resources/schematics/endSide.schematic | Bin 0 -> 317 bytes src/main/resources/schematics/endTop.schematic | Bin 0 -> 358 bytes .../resources/schematics/startBottom.schematic | Bin 0 -> 423 bytes src/main/resources/schematics/startSide.schematic | Bin 0 -> 252 bytes src/main/resources/schematics/startTop.schematic | Bin 0 -> 278 bytes src/main/resources/schematics/test.schematic | Bin 0 -> 345 bytes 19 files changed, 855 insertions(+) create mode 100644 src/main/java/com/encrox/instanceddungeons/Commander.java create mode 100644 src/main/java/com/encrox/instanceddungeons/Direction.java create mode 100644 src/main/java/com/encrox/instanceddungeons/Dungeon.java create mode 100644 src/main/java/com/encrox/instanceddungeons/DungeonWorld.java create mode 100644 src/main/java/com/encrox/instanceddungeons/InstancedDungeons.java create mode 100644 src/main/java/com/encrox/instanceddungeons/Schematic.java create mode 100644 src/main/java/com/encrox/instanceddungeons/Section.java create mode 100644 src/main/resources/config.json create mode 100644 src/main/resources/descriptor.json create mode 100644 src/main/resources/lang/de-DE.properties create mode 100644 src/main/resources/lang/en-GB.properties create mode 100644 src/main/resources/plugin.yml create mode 100644 src/main/resources/schematics/endBottom.schematic create mode 100644 src/main/resources/schematics/endSide.schematic create mode 100644 src/main/resources/schematics/endTop.schematic create mode 100644 src/main/resources/schematics/startBottom.schematic create mode 100644 src/main/resources/schematics/startSide.schematic create mode 100644 src/main/resources/schematics/startTop.schematic create mode 100644 src/main/resources/schematics/test.schematic (limited to 'src/main') diff --git a/src/main/java/com/encrox/instanceddungeons/Commander.java b/src/main/java/com/encrox/instanceddungeons/Commander.java new file mode 100644 index 0000000..0bc8ce9 --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/Commander.java @@ -0,0 +1,40 @@ +package com.encrox.instanceddungeons; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.json.JSONObject; + +public class Commander implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if(sender instanceof Player) { + Player player = (Player)sender; + try { + switch(args[0]) { + case "open": + break; + case "invite": + break; + case "join": + break; + case "close": + break; + case "random": + Dungeon dungeon = new Dungeon(player, args[1], Integer.parseInt(args[2])); + InstancedDungeons.dungeons.add(dungeon); + return true; + } + } catch(Exception e) { + e.printStackTrace(); + } + } else { + sender.sendMessage("no player"); + } + return false; + } + +} diff --git a/src/main/java/com/encrox/instanceddungeons/Direction.java b/src/main/java/com/encrox/instanceddungeons/Direction.java new file mode 100644 index 0000000..05f391e --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/Direction.java @@ -0,0 +1,10 @@ +package com.encrox.instanceddungeons; + +public class Direction { + + public static final byte NORTH = 0; + public static final byte EAST = 1; + public static final byte SOUTH = 2; + public static final byte WEST = 3; + +} diff --git a/src/main/java/com/encrox/instanceddungeons/Dungeon.java b/src/main/java/com/encrox/instanceddungeons/Dungeon.java new file mode 100644 index 0000000..69cd847 --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/Dungeon.java @@ -0,0 +1,48 @@ +package com.encrox.instanceddungeons; + +import java.util.ArrayList; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.json.JSONObject; + +import com.sk89q.worldedit.BlockVector; + +public class Dungeon { + + private Section section; + private String id; + private int depth; + private ArrayList players; + + public Dungeon(Player player, String id, int depth) { + this.id = id; + this.depth = depth; + section = new Section(InstancedDungeons.startDescriptors.getJSONObject((int)Math.round(Math.random()*(InstancedDungeons.startDescriptors.length()-1))), 0, depth); + try { + section.load(); + section.instantiate(); + BlockVector[] destinations = section.getAbsoluteExits(); + BlockVector destination = destinations[(int)Math.round(Math.random()*(destinations.length-1))]; + addPlayer(player); + player.teleport(new Location(InstancedDungeons.dungeonWorld.getWorld(), destination.getBlockX(), destination.getBlockY(), destination.getBlockZ())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void addPlayer(Player player) { + section.addPlayer(player); + } + + public void removePlayer(Player player) { + section.removePlayer(player); + } + + public String getId() { + return id; + } + +} diff --git a/src/main/java/com/encrox/instanceddungeons/DungeonWorld.java b/src/main/java/com/encrox/instanceddungeons/DungeonWorld.java new file mode 100644 index 0000000..643c787 --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/DungeonWorld.java @@ -0,0 +1,50 @@ +package com.encrox.instanceddungeons; + +import java.util.ArrayList; + +import org.bukkit.World; +import org.bukkit.plugin.Plugin; + +import com.encrox.instancedregions.InstancedProtectedCuboidRegion; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.BlockVector2D; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; + +public class DungeonWorld { + + private Plugin plugin; + private World world; + private ArrayList regions; + private int lastX; + + public DungeonWorld(Plugin plugin, World world) { + this.world = world; + this.plugin = plugin; + regions = new ArrayList(); + lastX = 0; + } + + public InstancedProtectedCuboidRegion allocate(int width, int length) { + BlockVector min, max; + InstancedProtectedCuboidRegion region; + for(int i = 0; true; i+=16) { + if(new ProtectedCuboidRegion("current", (min = new BlockVector(lastX+i, 0, 0)), (max = new BlockVector(lastX+i+width, 255, length))).getIntersectingRegions(regions).isEmpty()) { + region = new InstancedProtectedCuboidRegion(plugin, world, ""+min.getBlockX(), min, max); + regions.add(region); + return region; + } + } + } + + //YOU STILL HAVE TO DISPOSE THE INSTANCED REGION MANUALLY! + public void deallocate(InstancedProtectedCuboidRegion region) { + regions.remove(region); + } + + public World getWorld() { + return world; + } + +} diff --git a/src/main/java/com/encrox/instanceddungeons/InstancedDungeons.java b/src/main/java/com/encrox/instanceddungeons/InstancedDungeons.java new file mode 100644 index 0000000..7064aa1 --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/InstancedDungeons.java @@ -0,0 +1,253 @@ +package com.encrox.instanceddungeons; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Properties; +import java.util.logging.Logger; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +public class InstancedDungeons extends JavaPlugin { + + public static Plugin plugin; + public static Logger logger; + public static PluginDescriptionFile pdf; + //public static Properties lang; + public static JSONObject config; + public static JSONArray resetDungeons, schematicDescriptors, startDescriptors, endDescriptors, normalDescriptors; + public static DungeonWorld dungeonWorld; + public static File schematicsDirectory; + public static ArrayList dungeons; + + public void onEnable() { + pdf = getDescription(); + logger = Logger.getLogger("Minecraft"); + if(setupMyself()) { + plugin = this; + getCommand("dungeon").setExecutor(new Commander()); + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been enabled."); + } else { + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been disabled."); + } + } + + public boolean setupMyself() { + if(!this.getDataFolder().exists()) + this.getDataFolder().mkdirs(); + schematicsDirectory = new File(this.getDataFolder(), "schematics"); + if(!schematicsDirectory.exists()) + schematicsDirectory.mkdirs(); + File configFile = new File(this.getDataFolder(), "config.json"); + if(!configFile.exists()) { + BufferedInputStream bis; + FileOutputStream out; + try { + bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("config.json")); + out = new FileOutputStream(configFile); + int current; + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + BufferedReader br; + StringBuilder sb = new StringBuilder(); + String line; + try { + br = new BufferedReader(new FileReader(configFile)); + while((line = br.readLine()) != null) + sb.append(line); + br.close(); + } catch (Exception e1) { + e1.printStackTrace(); + return false; + } + config = new JSONObject(sb.toString()); + resetDungeons = config.getJSONArray("resetDungeons"); + File schematicDescriptorFile = new File(schematicsDirectory, "descriptor.json"); + if(!schematicDescriptorFile.exists()) { + int current; + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("descriptor.json")); + FileOutputStream out = new FileOutputStream(schematicDescriptorFile); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/endBottom.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "endBottom.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/endSide.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "endSide.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/endTop.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "endTop.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/startBottom.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "startBottom.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/startSide.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "startSide.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/startTop.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "startTop.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + try { + BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("schematics/test.schematic")); + FileOutputStream out = new FileOutputStream(new File(schematicsDirectory, "test.schematic")); + while((current = bis.read()) != -1) { + out.write(current); + } + bis.close(); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + return false; + } + } + sb = new StringBuilder(); + try { + br = new BufferedReader(new FileReader(schematicDescriptorFile)); + while((line = br.readLine()) != null) + sb.append(line); + br.close(); + } catch (Exception e1) { + e1.printStackTrace(); + return false; + } + schematicDescriptors = new JSONObject(sb.toString()).getJSONArray("schematics"); + startDescriptors = new JSONArray(); + endDescriptors = new JSONArray(); + normalDescriptors = new JSONArray(); + JSONObject current; + for(int i = 0, length = schematicDescriptors.length(); i(); + return true; + } + + public void onDisable() { + logger.info(pdf.getName() + " " + pdf.getVersion() + " has been disabled."); + } + + private void addClassPath(final URL url) throws IOException { + final URLClassLoader sysloader = (URLClassLoader) ClassLoader + .getSystemClassLoader(); + final Class sysclass = URLClassLoader.class; + try { + final Method method = sysclass.getDeclaredMethod("addURL", + new Class[] { URL.class }); + method.setAccessible(true); + method.invoke(sysloader, new Object[] { url }); + } catch (final Throwable t) { + t.printStackTrace(); + throw new IOException("Error adding " + url + + " to system classloader"); + } + } + +} diff --git a/src/main/java/com/encrox/instanceddungeons/Schematic.java b/src/main/java/com/encrox/instanceddungeons/Schematic.java new file mode 100644 index 0000000..c20d83a --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/Schematic.java @@ -0,0 +1,86 @@ +/* + * Dynamic Schematic object + * + * Currently not supporting entities. + */ + +package com.encrox.instanceddungeons; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; +import org.jnbt.ByteArrayTag; +import org.jnbt.CompoundTag; +import org.jnbt.ListTag; +import org.jnbt.NBTInputStream; +import org.jnbt.ShortTag; +import org.jnbt.StringTag; +import org.jnbt.Tag; + +public class Schematic { + + public int width, height, length, readIndex, writeIndex; + public String materials; + public byte[] blocks, data; + public List entities, tileEntities; + + public Schematic(int width, int height, int length, String materials, byte[] blocks, byte[] data, List entities, List tileEntities) { + this.width = width; + this.height = height; + this.length = length; + this.materials = materials; + this.blocks = blocks; + this.data = data; + this.entities = entities; + this.tileEntities = tileEntities; + readIndex = -1; + writeIndex = -1; + } + + public Schematic(File file) { + CompoundTag schematicTag = null; + try { + NBTInputStream in = new NBTInputStream(new FileInputStream(file)); + schematicTag = (CompoundTag)in.readTag(); + in.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Map schematic = schematicTag.getValue(); + width = ((ShortTag)schematic.get("Width")).getValue(); + height = ((ShortTag)schematic.get("Height")).getValue(); + length = ((ShortTag)schematic.get("Length")).getValue(); + materials = ((StringTag)schematic.get("Materials")).getValue(); + blocks = ((ByteArrayTag)schematic.get("Blocks")).getValue(); + data = ((ByteArrayTag)schematic.get("Data")).getValue(); + entities = ((ListTag)schematic.get("Entities")).getValue(); + tileEntities = ((ListTag)schematic.get("TileEntities")).getValue(); + } + + public byte getBlockIdAt(int x, int y, int z) { + return blocks[(y*length + z)*width + x]; + } + + public byte getNextBlock() { + return blocks[readIndex++]; + } + + public void setBlockIdAt(int x, int y, int z, byte blockId) { + blocks[(y*length + z)*width + x] = blockId; + } + + public void setNextBlock(byte blockId) { + blocks[writeIndex++] = blockId; + } + + public void write(File file) { + + } + +} diff --git a/src/main/java/com/encrox/instanceddungeons/Section.java b/src/main/java/com/encrox/instanceddungeons/Section.java new file mode 100644 index 0000000..0c40b24 --- /dev/null +++ b/src/main/java/com/encrox/instanceddungeons/Section.java @@ -0,0 +1,263 @@ +package com.encrox.instanceddungeons; + +import java.io.File; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.plugin.Plugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.encrox.instancedregions.InstancedProtectedCuboidRegion; +import com.sk89q.worldedit.BlockVector; + +public class Section { + + private Schematic schematic; + private String schematicFileName; + private Map exitMap; + private ArrayList players; + private BlockVector[] exits; + private BlockVector size; + private int index, depth; + private InstancedProtectedCuboidRegion region; + private Listener moveOutOfLoadingZoneListener, moveIntoLoadingZoneListener; + private volatile boolean justEntered, portal; + + public Section(JSONObject descriptor, int index, int depth) { + this.index = index; + this.depth = depth; + players = new ArrayList(); + schematicFileName = descriptor.getString("file"); + JSONArray size = descriptor.getJSONArray("size"); + this.size = new BlockVector(size.getInt(0), size.getInt(1), size.getInt(2)); + JSONArray exits = descriptor.getJSONArray("exits"); + this.exits = new BlockVector[exits.length()]; + for(int i = 0; i(); + this.schematic = new Schematic(new File(InstancedDungeons.schematicsDirectory, schematicFileName)); + if(index <= depth) { + Section next; + ArrayList
usable = new ArrayList
(); + for(int i = 0; i sections = exitMap.values().iterator(); + while(sections.hasNext()) + sections.next().addPlayer(player); + } + } + + public void removePlayer(Player player) { + players.add(player); + if(region != null) + region.removePlayer(player); + if(exitMap != null) { + Iterator
sections = exitMap.values().iterator(); + while(sections.hasNext()) + sections.next().removePlayer(player); + } + } + +} diff --git a/src/main/resources/config.json b/src/main/resources/config.json new file mode 100644 index 0000000..d481467 --- /dev/null +++ b/src/main/resources/config.json @@ -0,0 +1,22 @@ +{ + "locale": "en-GB", + "world": "instance", + "loadingDepth": 2, + "resetDungeons": [ + { + "interval": 2592000, + "alias": "monthly", + "length": 10 + }, + { + "interval": 86400, + "alias": "daily", + "length": 10 + }, + { + "interval": 3600, + "alias": "hourly", + "length": 10 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/descriptor.json b/src/main/resources/descriptor.json new file mode 100644 index 0000000..81f3e6e --- /dev/null +++ b/src/main/resources/descriptor.json @@ -0,0 +1,72 @@ +{ + "schematics": [ + { + "file": "startSide.schematic", + "modifier": 1, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 1, 0 ] + ], + "mobs": [ ] + }, + { + "file": "startBottom.schematic", + "modifier": 1, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 0, 4 ] + ], + "mobs": [ ] + }, + { + "file": "startTop.schematic", + "modifier": 1, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 9, 4 ] + ], + "mobs": [] + }, + { + "file": "endSide.schematic", + "modifier": 2, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 1, 0 ] + ], + "mobs": [] + }, + { + "file": "endBottom.schematic", + "modifier": 2, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 0, 4 ] + ], + "mobs": [] + }, + { + "file": "endTop.schematic", + "modifier": 2, + "size": [ 10, 10, 10 ], + "exits": [ + [ 4, 9, 4 ] + ], + "mobs": [ ] + }, + { + "file": "test.schematic", + "modifier": 0, + "size": [ 10, 10, 10 ], + "exits": [ + [ 0, 1, 5 ], + [ 4, 1, 0 ], + [ 9, 1, 4 ], + [ 4, 1, 9 ], + [ 2, 0, 7 ], + [ 5, 9, 5 ] + ], + "mobs": [] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/lang/de-DE.properties b/src/main/resources/lang/de-DE.properties new file mode 100644 index 0000000..fe1b047 --- /dev/null +++ b/src/main/resources/lang/de-DE.properties @@ -0,0 +1 @@ +no_player=no_player \ No newline at end of file diff --git a/src/main/resources/lang/en-GB.properties b/src/main/resources/lang/en-GB.properties new file mode 100644 index 0000000..fe1b047 --- /dev/null +++ b/src/main/resources/lang/en-GB.properties @@ -0,0 +1 @@ +no_player=no_player \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..4922b8b --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,9 @@ +main: com.encrox.instanceddungeons.InstancedDungeons +name: InstancedDungeons +version: 1.0 +depend: [InstancedRegions] + +commands: + dungeon: + description: Generic dungeon command. + usage: /dungeon help \ No newline at end of file diff --git a/src/main/resources/schematics/endBottom.schematic b/src/main/resources/schematics/endBottom.schematic new file mode 100644 index 0000000..9db40b2 Binary files /dev/null and b/src/main/resources/schematics/endBottom.schematic differ diff --git a/src/main/resources/schematics/endSide.schematic b/src/main/resources/schematics/endSide.schematic new file mode 100644 index 0000000..37b5b2a Binary files /dev/null and b/src/main/resources/schematics/endSide.schematic differ diff --git a/src/main/resources/schematics/endTop.schematic b/src/main/resources/schematics/endTop.schematic new file mode 100644 index 0000000..a13a690 Binary files /dev/null and b/src/main/resources/schematics/endTop.schematic differ diff --git a/src/main/resources/schematics/startBottom.schematic b/src/main/resources/schematics/startBottom.schematic new file mode 100644 index 0000000..c03c38d Binary files /dev/null and b/src/main/resources/schematics/startBottom.schematic differ diff --git a/src/main/resources/schematics/startSide.schematic b/src/main/resources/schematics/startSide.schematic new file mode 100644 index 0000000..09c6c66 Binary files /dev/null and b/src/main/resources/schematics/startSide.schematic differ diff --git a/src/main/resources/schematics/startTop.schematic b/src/main/resources/schematics/startTop.schematic new file mode 100644 index 0000000..f905219 Binary files /dev/null and b/src/main/resources/schematics/startTop.schematic differ diff --git a/src/main/resources/schematics/test.schematic b/src/main/resources/schematics/test.schematic new file mode 100644 index 0000000..624505f Binary files /dev/null and b/src/main/resources/schematics/test.schematic differ -- cgit v1.2.1