diff --git a/src/main/java/com/dfsek/terra/config/genconfig/TreeConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/TreeConfig.java index f872dcd86..95efcca59 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/TreeConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/TreeConfig.java @@ -62,6 +62,7 @@ public class TreeConfig extends TerraConfig implements Tree { @Override public boolean plant(Location location, Random random, JavaPlugin javaPlugin) { + location.subtract(0, 1, 0); Location mut = location.clone().subtract(0, yOffset, 0); if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index a117d6f56..92b1cb685 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -138,7 +138,9 @@ public class Structure implements Serializable { * @param r Rotation */ public void paste(@NotNull Location origin, Rotation r) { - this.executeForBlocksInRange(getRange(Axis.X), getRange(Axis.Y), getRange(Axis.Z), block -> pasteBlock(block, origin, r), r); + Range xRange = getRange(Axis.X); + Range zRange = getRange(Axis.Z); + this.executeForBlocksInRange(xRange, getRange(Axis.Y), zRange, block -> pasteBlock(block, origin, r), r); } public boolean checkSpawns(Location origin, Rotation r) { @@ -184,6 +186,7 @@ public class Structure implements Serializable { Location loc = origin.clone().add(block.getX(), block.getY(), block.getZ()); Block worldBlock = loc.getBlock(); main: while(worldBlock.isEmpty()) { + if(loc.getBlockY() > 255 || loc.getBlockY() < 0) return; if(block.getPull() == null) break; switch(block.getPull()) { case UP: @@ -194,7 +197,7 @@ public class Structure implements Serializable { break; default: break main; } - if(loc.getBlockY() > 255 || loc.getBlockY() < 0) return; + } int offset = block.getPullOffset(); if(offset != 0) worldBlock = worldBlock.getRelative((offset > 0) ? BlockFace.UP : BlockFace.DOWN, Math.abs(offset)); @@ -207,10 +210,12 @@ public class Structure implements Serializable { ((Directional) data).setFacing(rt); } else if(data instanceof MultipleFacing) { MultipleFacing mfData = (MultipleFacing) data; - List faces = new ArrayList<>(mfData.getFaces()); - for(BlockFace face : faces) { - mfData.setFace(face, false); - mfData.setFace(getRotatedFace(face, r), true); + Map faces = new HashMap<>(); + for(BlockFace f : mfData.getAllowedFaces()) { + faces.put(f, mfData.hasFace(f)); + } + for(Map.Entry face : faces.entrySet()) { + mfData.setFace(getRotatedFace(face.getKey(), r), face.getValue()); } } else if(data instanceof Rail) { Rail.Shape newShape = getRotatedRail(((Rail) data).getShape(), r); @@ -225,7 +230,7 @@ public class Structure implements Serializable { connections.put(f, rData.getFace(f)); } for(Map.Entry e : connections.entrySet()) { - rData.setFace(RotationUtil.getRotatedFace(e.getKey(), r), e.getValue()); + rData.setFace(getRotatedFace(e.getKey(), r), e.getValue()); } } worldBlock.setBlockData(data, false); diff --git a/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java b/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java index d226f4f74..5522ce1b2 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java +++ b/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java @@ -1,9 +1,13 @@ package com.dfsek.terra.structure; import com.dfsek.terra.structure.serialize.SerializableBlockData; +import com.dfsek.terra.structure.serialize.block.SerializableBanner; import com.dfsek.terra.structure.serialize.block.SerializableBlockState; +import com.dfsek.terra.structure.serialize.block.SerializableMonsterCage; import com.dfsek.terra.structure.serialize.block.SerializableSign; +import org.bukkit.block.Banner; import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; @@ -23,6 +27,10 @@ public class StructureContainedBlock implements Serializable { public StructureContainedBlock(int x, int y, int z, BlockState state, BlockData d, StructureSpawnRequirement spawn, Pull pull, int pullOffset) { if(state instanceof Sign) { this.state = new SerializableSign((org.bukkit.block.Sign) state); + } else if(state instanceof CreatureSpawner) { + this.state = new SerializableMonsterCage((CreatureSpawner) state); + } else if(state instanceof Banner) { + this.state = new SerializableBanner((Banner) state); } else this.state = null; this.x = x; this.y = y; diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableEnchantment.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableEnchantment.java deleted file mode 100644 index f67a92ef4..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableEnchantment.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.NamespacedKey; -import org.bukkit.enchantments.Enchantment; - -import java.io.Serializable; - -public class SerializableEnchantment implements Serializable { - public static final long serialVersionUID = 5298928608478640006L; - private final SerializableNamespacedKey enchant; - public SerializableEnchantment(Enchantment e) { - enchant = new SerializableNamespacedKey(e.getKey()); - } - public Enchantment toEnchantment() { - return Enchantment.getByKey(enchant.getNamespacedKey()); - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableInventory.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableInventory.java deleted file mode 100644 index 1c368c537..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableInventory.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.io.Serializable; - -public class SerializableInventory implements Serializable { - public static final long serialVersionUID = 5298928608478640004L; - private SerializableItemStack[] items; - public SerializableInventory(Inventory inv) { - items = new SerializableItemStack[inv.getSize()]; - for(int i = 0; i < inv.getSize(); i++) { - ItemStack item = inv.getItem(i); - if(item == null) return; - items[i] = new SerializableItemStack(item); - } - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemMeta.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemMeta.java deleted file mode 100644 index b7bd52520..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemMeta.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.attribute.Attribute; -import org.bukkit.inventory.meta.ItemMeta; - -import java.io.Serializable; - -public class SerializableItemMeta implements Serializable { - public static final long serialVersionUID = 5298928608478640009L; - public SerializableItemMeta(ItemMeta meta) { - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemStack.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemStack.java deleted file mode 100644 index d75c79ae8..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableItemStack.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.block.BlockState; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class SerializableItemStack implements Serializable { - public static final long serialVersionUID = 5298928608478640005L; - private final HashMap enchantments = new HashMap<>(); - private final SerializableBlockData blockData; - private transient ItemStack stack; - private final SerializableItemMeta meta; - private final int amount; - public SerializableItemStack(ItemStack item) { - for(Map.Entry e : item.getEnchantments().entrySet()) { - this.enchantments.put(new SerializableEnchantment(e.getKey()), e.getValue()); - } - this.meta = new SerializableItemMeta(item.getItemMeta()); - this.blockData = new SerializableBlockData(item.getType().createBlockData()); - this.amount = item.getAmount(); - } - public ItemStack getStack() { - if(stack == null) { - stack = new ItemStack(blockData.getData().getMaterial(), amount); - } - return stack; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableNamespacedKey.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableNamespacedKey.java deleted file mode 100644 index 33d0ec6d1..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableNamespacedKey.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.NamespacedKey; - -import java.io.Serializable; - -public class SerializableNamespacedKey implements Serializable { - public static final long serialVersionUID = 5298928608478640007L; - private final String namespace; - private final String key; - public SerializableNamespacedKey(NamespacedKey key) { - this.namespace = key.getNamespace(); - this.key = key.getKey(); - } - public NamespacedKey getNamespacedKey() { - return new NamespacedKey(namespace, key); - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java new file mode 100644 index 000000000..f820c9934 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.structure.serialize.block; + +import org.bukkit.DyeColor; +import org.bukkit.block.Banner; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; + +import java.io.Serializable; +import java.util.ArrayList; + +public class SerializableBanner implements SerializableBlockState { + private final DyeColor base; + private final ArrayList patterns = new ArrayList<>(); + + public SerializableBanner(Banner banner) { + this.base = banner.getBaseColor(); + for(org.bukkit.block.banner.Pattern bukkitPattern : banner.getPatterns()) { + patterns.add(new Pattern(bukkitPattern.getPattern(), bukkitPattern.getColor())); + } + } + + @Override + public BlockState getState(BlockState orig) { + if(!(orig instanceof Banner)) throw new IllegalArgumentException("Provided BlockState is not a banner."); + Banner banner = (Banner) orig; + banner.setBaseColor(base); + for(Pattern pattern : patterns) { + banner.addPattern(new org.bukkit.block.banner.Pattern(pattern.getColor(), pattern.getType())); + } + return banner; + } + private static final class Pattern implements Serializable { + private final DyeColor color; + private final PatternType type; + public Pattern(PatternType type, DyeColor color) { + this.color = color; + this.type = type; + } + + public DyeColor getColor() { + return color; + } + + public PatternType getType() { + return type; + } + } +} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableChest.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableChest.java deleted file mode 100644 index 5846c2d07..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableChest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.structure.serialize.block; - -import org.bukkit.block.BlockState; -import org.bukkit.inventory.Inventory; - -public class SerializableChest implements SerializableContainer { - long serialVersionUID = 5298928608478640003L; - @Override - public Inventory getInventory(Inventory orig) { - return null; - } - - @Override - public BlockState getState(BlockState orig) { - return null; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableContainer.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableContainer.java deleted file mode 100644 index bd1c743a5..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableContainer.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.structure.serialize.block; - -import org.bukkit.inventory.Inventory; - -public interface SerializableContainer extends SerializableBlockState { - long serialVersionUID = 5298928608478640002L; - Inventory getInventory(Inventory orig); -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java new file mode 100644 index 000000000..3fda50edb --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.structure.serialize.block; + +import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.entity.EntityType; +import org.polydev.gaea.math.Range; + +import java.util.Random; + +public class SerializableMonsterCage implements SerializableBlockState { + private final EntityType type; + private final int minDelay; + private final int maxDelay; + private final int maxNear; + private final int playerRange; + private final int delay; + private final int count; + public SerializableMonsterCage(CreatureSpawner orig) { + this.type = orig.getSpawnedType(); + this.minDelay = orig.getMinSpawnDelay(); + this.maxDelay = orig.getMaxSpawnDelay(); + this.maxNear = orig.getMaxNearbyEntities(); + this.playerRange = orig.getRequiredPlayerRange(); + this.delay = orig.getDelay(); + this.count = orig.getSpawnCount(); + } + @Override + public BlockState getState(BlockState orig) { + if(!(orig instanceof CreatureSpawner)) throw new IllegalArgumentException("BlockState is not a Monster Spawner!"); + CreatureSpawner spawner = (CreatureSpawner) orig; + spawner.setSpawnedType(type); + spawner.setMinSpawnDelay(minDelay); + spawner.setMaxSpawnDelay(maxDelay); + spawner.setMaxNearbyEntities(maxNear); + spawner.setRequiredPlayerRange(playerRange); + spawner.setDelay(delay); + spawner.setSpawnCount(count); + return null; + } +}