From 710e7503cf6b405d851271df921195a41495879e Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 22 Feb 2019 20:48:36 +0200 Subject: [PATCH] The fattening! Fatten out all the loud locks! --- .../com/minelittlepony/unicopia/Fixes.java | 106 +++++++ .../com/minelittlepony/unicopia/Unicopia.java | 6 + .../unicopia/block/BlockCloud.java | 50 +--- .../unicopia/block/BlockCloudBanister.java | 7 +- .../unicopia/block/BlockCloudFarm.java | 2 +- .../unicopia/block/BlockCloudFence.java | 18 +- .../unicopia/block/BlockCloudSlab.java | 270 +++++++++++------- .../unicopia/entity/EntityCloud.java | 6 +- .../minelittlepony/unicopia/init/UBlocks.java | 25 +- .../minelittlepony/unicopia/init/UItems.java | 42 +-- .../unicopia/item/ItemFruitLeaves.java | 4 +- .../unicopia/item/UItemBlock.java | 14 + .../unicopia/item/UItemDecoration.java | 13 +- .../unicopia/item/UItemMultiTexture.java | 1 + .../unicopia/item/UItemSlab.java | 9 +- .../util/fixers/BlockFixer.java | 101 +++++++ .../unicopia/blockstates/cloud_block.json | 4 +- .../blockstates/cloud_double_slab.json | 11 - .../unicopia/blockstates/cloud_slab.json | 8 +- .../blockstates/double_cloud_slab.json | 5 + .../double_enchanted_cloud_slab.json | 5 + .../blockstates/double_packed_cloud_slab.json | 5 + ...e_slab.json => enchanted_cloud_block.json} | 0 .../blockstates/enchanted_cloud_slab.json | 4 +- .../blockstates/normal_cloud_double_slab.json | 5 - .../blockstates/normal_cloud_slab.json | 6 - .../blockstates/packed_cloud_block.json | 5 + .../blockstates/packed_cloud_double_slab.json | 5 - .../blockstates/packed_cloud_slab.json | 4 +- .../resources/assets/unicopia/lang/en_US.lang | 15 +- ...rmal_cloud_block.json => cloud_block.json} | 0 ...normal_cloud_slab.json => cloud_slab.json} | 0 .../assets/unicopia/recipes/anvil.json | 2 +- .../assets/unicopia/recipes/cloud_fence.json | 2 +- .../assets/unicopia/recipes/cloud_stairs.json | 2 +- .../unicopia/recipes/construction_cloud.json | 2 +- .../recipes/enchanted_cloud_block.json | 4 +- .../recipes/enchanted_cloud_slab.json | 4 +- .../assets/unicopia/recipes/mist_door.json | 2 +- .../unicopia/recipes/normal_cloud_block.json | 2 +- .../unicopia/recipes/normal_cloud_slab.json | 4 +- .../unicopia/recipes/packed_cloud_block.json | 4 +- .../unicopia/recipes/packed_cloud_slab.json | 4 +- .../assets/unicopia/recipes/racing_cloud.json | 2 +- .../assets/unicopia/recipes/wild_cloud.json | 2 +- .../unicopia/structures/cloud/house_small.nbt | Bin 4521 -> 4473 bytes .../unicopia/structures/cloud/island_tiny.nbt | Bin 847 -> 854 bytes .../structures/cloud/temple_small.nbt | Bin 5350 -> 5268 bytes .../structures/ground/temple_with_book.nbt | Bin 1218 -> 1224 bytes .../structures/ground/temple_without_book.nbt | Bin 647 -> 658 bytes .../unicopia/structures/ground/tower.nbt | Bin 2326 -> 2362 bytes .../structures/ground/wizard_tower_blue.nbt | Bin 6405 -> 7188 bytes .../structures/ground/wizard_tower_red.nbt | Bin 6462 -> 6463 bytes 53 files changed, 532 insertions(+), 260 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/Fixes.java create mode 100644 src/main/java/com/minelittlepony/util/fixers/BlockFixer.java delete mode 100644 src/main/resources/assets/unicopia/blockstates/cloud_double_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/double_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/double_enchanted_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/double_packed_cloud_slab.json rename src/main/resources/assets/unicopia/blockstates/{enchanted_cloud_double_slab.json => enchanted_cloud_block.json} (100%) delete mode 100644 src/main/resources/assets/unicopia/blockstates/normal_cloud_double_slab.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/normal_cloud_slab.json create mode 100644 src/main/resources/assets/unicopia/blockstates/packed_cloud_block.json delete mode 100644 src/main/resources/assets/unicopia/blockstates/packed_cloud_double_slab.json rename src/main/resources/assets/unicopia/models/item/{normal_cloud_block.json => cloud_block.json} (100%) rename src/main/resources/assets/unicopia/models/item/{normal_cloud_slab.json => cloud_slab.json} (100%) diff --git a/src/main/java/com/minelittlepony/unicopia/Fixes.java b/src/main/java/com/minelittlepony/unicopia/Fixes.java new file mode 100644 index 00000000..e6f77ccb --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/Fixes.java @@ -0,0 +1,106 @@ +package com.minelittlepony.unicopia; + +import com.minelittlepony.unicopia.init.UBlocks; +import com.minelittlepony.util.fixers.BlockFixer; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.datafix.DataFixer; +import net.minecraft.util.datafix.FixTypes; +import net.minecraft.util.datafix.IFixableData; +import net.minecraftforge.common.util.CompoundDataFixer; +import net.minecraftforge.common.util.ModFixs; + +public class Fixes { + + static void init(DataFixer fixer) { + + CompoundDataFixer forgeDataFixer = (CompoundDataFixer)fixer; + + try { + ModFixs modfix = forgeDataFixer.init(Unicopia.MODID, 1342); + + modfix.registerFix(FixTypes.CHUNK, new FixCloudBlocks()); + modfix.registerFix(FixTypes.ITEM_INSTANCE, new FixCloudItems()); + } catch (Throwable ignored) { + // no way to check if our fixer is already registered. + // so just do it anyway and ignore the error. + // @FUF(reason = "FUF") + } + } + + static class FixCloudItems implements IFixableData { + @Override + public int getFixVersion() { + return 1342; + } + + @Override + public NBTTagCompound fixTagCompound(NBTTagCompound compound) { + + if (compound.hasKey("id", 8) && compound.hasKey("Damage", 3)) { + String id = compound.getString("id"); + int damage = compound.getInteger("Damage"); + + if (id == "unicopia:cloud_block") { + if (damage == 1) { + damage = 0; + id = "unicopia:packed_cloud_block"; + } else if (damage == 2) { + damage = 0; + id = "unicopia:enchanted_cloud_block"; + } + } + + if (id == "unicopia:cloud_slab") { + if (damage == 1) { + damage = 0; + id = "unicopia:packed_cloud_slab"; + } else if (damage == 2) { + damage = 0; + id = "unicopia:enchanted_cloud_slab"; + } + } + + compound.setString("id", id); + compound.setInteger("Damage", 0); + } + + return compound; + } + } + + static class FixCloudBlocks extends BlockFixer { + + @Override + public int getFixVersion() { + return 1342; + } + + @Override + protected IBlockState fixBlockState(int id, int metadata) { + if (id == Block.getIdFromBlock(UBlocks.normal_cloud) && metadata != 0) { + if (metadata == 1) { + return UBlocks.packed_cloud.getDefaultState(); + } + if (metadata == 2) { + return UBlocks.enchanted_cloud.getDefaultState(); + } + } + + int shifted = metadata % 8; + + if (id == Block.getIdFromBlock(UBlocks.cloud_slab) && shifted != 0) { + if (shifted == 1) { + return UBlocks.packed_cloud_slab.getStateFromMeta(metadata - shifted); + } + if (shifted == 2) { + return UBlocks.enchanted_cloud_slab.getStateFromMeta(metadata - shifted); + } + } + + return null; + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 338da1ec..c29122d2 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -11,6 +11,7 @@ import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.IGuiHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; @@ -75,6 +76,11 @@ public class Unicopia implements IGuiHandler { MinecraftForge.TERRAIN_GEN_BUS.register(Hooks.class); } + @EventHandler + public void onServerCreated(FMLServerAboutToStartEvent event) { + Fixes.init(event.getServer().getDataFixer()); + } + @EventHandler public void onServerStart(FMLServerStartingEvent event) { Commands.init(event); diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java index ca2f6694..f246cfcd 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloud.java @@ -11,48 +11,47 @@ import com.minelittlepony.unicopia.player.PlayerSpeciesList; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockCloud extends Block implements ICloudBlock, ITillable { - public static final PropertyEnum VARIANT = PropertyEnum.create("variant", CloudType.class); + private final CloudType variant; - public BlockCloud(Material material, String domain, String name) { + public BlockCloud(Material material, CloudType variant, String domain, String name) { super(material); setRegistryName(domain, name); setTranslationKey(name); - setCreativeTab(CreativeTabs.MISC); + setCreativeTab(CreativeTabs.MATERIALS); setHardness(0.5f); setResistance(1.0F); setSoundType(SoundType.CLOTH); setLightOpacity(20); useNeighborBrightness = true; + + this.variant = variant; } @Override public boolean isTranslucent(IBlockState state) { - return true; + return variant == CloudType.NORMAL; } @Override public boolean isOpaqueCube(IBlockState state) { - return false; + return variant != CloudType.NORMAL; } @Override @@ -73,7 +72,7 @@ public class BlockCloud extends Block implements ICloudBlock, ITillable { @Override public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.TRANSLUCENT; + return variant == CloudType.NORMAL ? BlockRenderLayer.TRANSLUCENT : super.getRenderLayer(); } @Deprecated @@ -144,36 +143,9 @@ public class BlockCloud extends Block implements ICloudBlock, ITillable { return -1; } - @Override - public int damageDropped(IBlockState state) { - return ((CloudType)state.getValue(VARIANT)).getMetadata(); - } - - @Override - public void getSubBlocks(CreativeTabs tab, NonNullList list) { - for (CloudType i : CloudType.values()) { - list.add(new ItemStack(this, 1, i.getMetadata())); - } - } - - @Override - public IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(VARIANT, CloudType.byMetadata(meta)); - } - - @Override - public int getMetaFromState(IBlockState state) { - return ((CloudType)state.getValue(VARIANT)).getMetadata(); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, VARIANT); - } - @Override public CloudType getCloudMaterialType(IBlockState blockState) { - return (CloudType)blockState.getValue(VARIANT); + return variant; } @Deprecated diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudBanister.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudBanister.java index e512bee9..dc807ad9 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudBanister.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudBanister.java @@ -4,6 +4,9 @@ import java.util.List; import javax.annotation.Nullable; +import com.minelittlepony.unicopia.CloudType; + +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.util.BlockRenderLayer; @@ -43,8 +46,8 @@ public class BlockCloudBanister extends BlockCloudFence { new AxisAlignedBB(0, 0, 0, 1, h, 1) }; - public BlockCloudBanister(String domain, String name) { - super(domain, name); + public BlockCloudBanister(Material material, String domain, String name) { + super(material, CloudType.ENCHANTED, domain, name); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFarm.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFarm.java index 012965b9..2dc62ed8 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFarm.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFarm.java @@ -120,6 +120,6 @@ public class BlockCloudFarm extends UFarmland implements ICloudBlock { @Override protected IBlockState getDroppedState(IBlockState state) { - return UBlocks.cloud.getDefaultState(); + return UBlocks.normal_cloud.getDefaultState(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFence.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFence.java index 98e4cdf6..33eb46f6 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFence.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudFence.java @@ -5,10 +5,10 @@ import java.util.List; import javax.annotation.Nullable; import com.minelittlepony.unicopia.CloudType; -import com.minelittlepony.unicopia.init.UMaterials; import net.minecraft.block.BlockFence; import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -23,8 +23,10 @@ import net.minecraft.world.World; public class BlockCloudFence extends BlockFence implements ICloudBlock { - public BlockCloudFence(String domain, String name) { - super(UMaterials.cloud, UMaterials.cloud.getMaterialMapColor()); + private final CloudType variant; + + public BlockCloudFence(Material material, CloudType variant, String domain, String name) { + super(material, material.getMaterialMapColor()); setTranslationKey(name); setRegistryName(domain, name); @@ -33,16 +35,18 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock { setLightOpacity(20); setSoundType(SoundType.CLOTH); useNeighborBrightness = true; + + this.variant = variant; } @Override public boolean isTranslucent(IBlockState state) { - return true; + return variant == CloudType.NORMAL; } @Override public boolean isOpaqueCube(IBlockState state) { - return false; + return variant != CloudType.NORMAL; } @Override @@ -62,12 +66,12 @@ public class BlockCloudFence extends BlockFence implements ICloudBlock { @Override public CloudType getCloudMaterialType(IBlockState blockState) { - return CloudType.NORMAL; + return variant; } @Override public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.TRANSLUCENT; + return variant == CloudType.NORMAL ? BlockRenderLayer.TRANSLUCENT : super.getRenderLayer(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudSlab.java b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudSlab.java index 6e86b763..6eb59397 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/BlockCloudSlab.java +++ b/src/main/java/com/minelittlepony/unicopia/block/BlockCloudSlab.java @@ -6,8 +6,8 @@ import java.util.Random; import javax.annotation.Nullable; import com.minelittlepony.unicopia.CloudType; -import com.minelittlepony.unicopia.init.UBlocks; +import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; import net.minecraft.block.BlockStairs; import net.minecraft.block.SoundType; @@ -23,7 +23,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; +import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -31,54 +31,61 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockCloudSlab extends BlockSlab implements ICloudBlock { +public abstract class BlockCloudSlab extends BlockSlab implements ICloudBlock { - public static final PropertyEnum VARIANT = PropertyEnum.create("variant", CloudType.class); + public static final PropertyEnum VARIANT = PropertyEnum.create("variant", Variant.class); - private boolean isDouble; + protected final T modelBlock; - public BlockCloudSlab(boolean isDouble, Material material, String domain, String name) { + public BlockCloudSlab(T modelBlock, BlockCloudSlab single, Material material, String domain, String name) { super(material); setCreativeTab(CreativeTabs.BUILDING_BLOCKS); setHardness(0.5F); - setResistance(1.0F); + setResistance(1); setSoundType(SoundType.CLOTH); setLightOpacity(20); setTranslationKey(name); setRegistryName(domain, name); - this.isDouble = isDouble; + useNeighborBrightness = true; + + this.modelBlock = modelBlock; + this.fullBlock = isDouble(); } + @Deprecated @Override public boolean isTranslucent(IBlockState state) { - return UBlocks.cloud.isTranslucent(state); + return modelBlock.isTranslucent(state); } @Override public boolean isAir(IBlockState state, IBlockAccess world, BlockPos pos) { - return allowsFallingBlockToPass(state, world, pos); + return modelBlock.isAir(state, world, pos); } + @Deprecated @Override public boolean isOpaqueCube(IBlockState state) { - return isDouble() ? UBlocks.cloud.isOpaqueCube(state) : false; + return isDouble() && modelBlock != null && modelBlock.isOpaqueCube(state); } + @Deprecated @Override public boolean isFullCube(IBlockState state) { - return isDouble() ? UBlocks.cloud.isFullCube(state) : false; + return isDouble() && modelBlock.isFullCube(state); } + @Deprecated @Override public boolean isNormalCube(IBlockState state) { - return isDouble() ? UBlocks.cloud.isNormalCube(state) : false; + return isDouble() && modelBlock.isNormalCube(state); } @Override public BlockRenderLayer getRenderLayer() { - return UBlocks.cloud.getRenderLayer(); + return modelBlock.getRenderLayer(); } @Override @@ -88,17 +95,17 @@ public class BlockCloudSlab extends BlockSlab implements ICloudBlock { @Override public void onFallenUpon(World w, BlockPos pos, Entity entity, float fallDistance) { - UBlocks.cloud.onFallenUpon(w, pos, entity, fallDistance); + modelBlock.onFallenUpon(w, pos, entity, fallDistance); } @Override public void onLanded(World w, Entity entity) { - UBlocks.cloud.onLanded(w, entity); + modelBlock.onLanded(w, entity); } @Override public void onEntityCollision(World w, BlockPos pos, IBlockState state, Entity entity) { - UBlocks.cloud.onEntityCollision(w, pos, state, entity); + modelBlock.onEntityCollision(w, pos, state, entity); } @Override @@ -121,123 +128,170 @@ public class BlockCloudSlab extends BlockSlab implements ICloudBlock { @Deprecated @Override public float getPlayerRelativeBlockHardness(IBlockState state, EntityPlayer player, World worldIn, BlockPos pos) { - return UBlocks.cloud.getPlayerRelativeBlockHardness(state, player, worldIn, pos); - } - - @Override - public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { - - IBlockState beside = world.getBlockState(pos.offset(face)); - - if (beside.getBlock() instanceof ICloudBlock) { - ICloudBlock cloud = ((ICloudBlock)beside.getBlock()); - - if (cloud.getCloudMaterialType(beside) == getCloudMaterialType(state)) { - if (isDouble) { - return true; - } - - if (face == EnumFacing.UP || face == EnumFacing.DOWN) { - return (state.getValue(HALF) == EnumBlockHalf.TOP) && (face == EnumFacing.UP); - } - - if (beside.getBlock() == this) { - return beside.getValue(HALF) == state.getValue(HALF); - } else { - if (beside.getBlock() instanceof BlockCloudStairs) { - return beside.getValue(BlockStairs.HALF).ordinal() == state.getValue(HALF).ordinal() - && beside.getValue(BlockStairs.FACING) == face; - } - } - } - } - - return false; + return modelBlock.getPlayerRelativeBlockHardness(state, player, worldIn, pos); } @Override public boolean canEntityDestroy(IBlockState state, IBlockAccess world, BlockPos pos, Entity entity) { - return UBlocks.cloud.canEntityDestroy(state, world, pos, entity); - } - - @Override - public Item getItemDropped(IBlockState state, Random rand, int fortune) { - return Item.getItemFromBlock(UBlocks.cloud_slab); - } - - @Override - public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) { - return new ItemStack(Item.getItemFromBlock(UBlocks.cloud_slab), 2, getMetaFromState(state)); + return modelBlock.canEntityDestroy(state, world, pos, entity); } @Override public String getTranslationKey(int meta) { - return super.getTranslationKey() + "." + CloudType.byMetadata(meta).getTranslationKey(); + return super.getTranslationKey(); } @Override - public IProperty getVariantProperty() { + public IProperty getVariantProperty() { return VARIANT; } - public Object getVariant(ItemStack stack) { - return CloudType.byMetadata(stack.getMetadata() & 7); - } - - @Override - public void getSubBlocks(CreativeTabs tab, NonNullList list) { - for (CloudType i : CloudType.values()) { - list.add(new ItemStack(this, 1, i.getMetadata())); - } - } - - @Override public CloudType getCloudMaterialType(IBlockState blockState) { - return (CloudType)blockState.getValue(VARIANT); + return modelBlock.getCloudMaterialType(blockState); } @Override - public IBlockState getStateFromMeta(int meta) { - IBlockState state = getDefaultState().withProperty(VARIANT, CloudType.byMetadata(meta & 7)); - if (!isDouble()) { - state = state.withProperty(HALF, (meta & 8) == 0 ? BlockSlab.EnumBlockHalf.BOTTOM : BlockSlab.EnumBlockHalf.TOP); + public Comparable getTypeForItem(ItemStack stack) { + return Variant.DEFAULT; + } + + public static class Single extends BlockCloudSlab { + + public final Double doubleSlab; + + public Single(T modelBlock, Material material, String domain, String name) { + super(modelBlock, null, material, domain, name); + + doubleSlab = new Double<>(this, domain, "double_" + name); } - return state; - } - /** - * Convert the BlockState into the correct metadata value - */ - @Override - public int getMetaFromState(IBlockState state) { - byte mask = 0; - int result = mask | getCloudMaterialType(state).getMetadata(); - if (!isDouble() && state.getValue(HALF) == BlockSlab.EnumBlockHalf.TOP) { - result |= 8; + @Override + public boolean isDouble() { + return false; + } + + + @Override + public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { + + IBlockState beside = world.getBlockState(pos.offset(face)); + + if (beside.getBlock() instanceof ICloudBlock) { + ICloudBlock cloud = ((ICloudBlock)beside.getBlock()); + + if (cloud.getCloudMaterialType(beside) == getCloudMaterialType(state)) { + + EnumBlockHalf half = state.getValue(HALF); + + if (beside.getBlock() instanceof BlockCloudStairs) { + return beside.getValue(BlockStairs.HALF).ordinal() == state.getValue(HALF).ordinal() + && beside.getValue(BlockStairs.FACING) == face; + } + + if (face == EnumFacing.DOWN) { + return half == EnumBlockHalf.BOTTOM; + } + + if (face == EnumFacing.UP) { + return half == EnumBlockHalf.TOP; + } + + if (beside.getBlock() == this) { + return beside.getValue(HALF) == state.getValue(HALF); + } + } + } + + return false; + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return getDefaultState() + .withProperty(VARIANT, Variant.DEFAULT) + .withProperty(HALF, (meta & 8) == 0 ? BlockSlab.EnumBlockHalf.BOTTOM : BlockSlab.EnumBlockHalf.TOP); + } + + @Override + public int getMetaFromState(IBlockState state) { + int i = 0; + + if (state.getValue(HALF) == BlockSlab.EnumBlockHalf.TOP) { + i |= 8; + } + + return i; + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, HALF, VARIANT); } - return result; } - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, isDouble() ? - new IProperty[] {VARIANT} - : new IProperty[] {HALF, VARIANT}); + public static class Double extends BlockCloudSlab { + + public final Single singleSlab; + + public Double(Single single, String domain, String name) { + super(single.modelBlock, single, single.material, domain, name); + + this.singleSlab = single; + } + + @Override + public boolean isDouble() { + return true; + } + + @Override + public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing face) { + + IBlockState beside = world.getBlockState(pos.offset(face)); + + if (beside.getBlock() instanceof ICloudBlock) { + ICloudBlock cloud = ((ICloudBlock)beside.getBlock()); + + if (cloud.getCloudMaterialType(beside) == getCloudMaterialType(state)) { + return true; + } + } + + return false; + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int fortune) { + return Item.getItemFromBlock(singleSlab); + } + + @Override + public ItemStack getItem(World world, BlockPos pos, IBlockState state) { + return new ItemStack(getItemDropped(state, world.rand, 0)); + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(VARIANT, Variant.DEFAULT); + } + + @Override + public int getMetaFromState(IBlockState state) { + return 0; + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, VARIANT); + } } - @Override - public int damageDropped(IBlockState state) { - return getCloudMaterialType(state).getMetadata(); - } + private static enum Variant implements IStringSerializable { + DEFAULT; - @Override - public boolean isDouble() { - return isDouble; - } - - @Override - public Comparable getTypeForItem(ItemStack stack) { - return CloudType.byMetadata(stack.getMetadata() & 7); + public String getName() { + return "normal"; + } } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java index ed4ee7fb..8ae712ca 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityCloud.java @@ -441,7 +441,7 @@ public class EntityCloud extends EntityFlying implements IAnimals, IInAnimate { if (type == 2) { if (!isBurning()) { for (int i = 0; i < 50 * getCloudSize(); i++) { - Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.cloud.getDefaultState()); + Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); } } } @@ -465,7 +465,7 @@ public class EntityCloud extends EntityFlying implements IAnimals, IInAnimate { public void pomf() { for (int i = 0; i < 50 * getCloudSize(); i++) { - Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.cloud.getDefaultState()); + Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); } playHurtSound(DamageSource.GENERIC); @@ -537,7 +537,7 @@ public class EntityCloud extends EntityFlying implements IAnimals, IInAnimate { if (stat || canFly) { if (!isBurning()) { for (int i = 0; i < 50 * getCloudSize(); i++) { - Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.cloud.getDefaultState()); + Particles.instance().getEntityEmitter().emitDiggingParticles(this, UBlocks.normal_cloud.getDefaultState()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/init/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/init/UBlocks.java index afaf41eb..f9ae0fa5 100644 --- a/src/main/java/com/minelittlepony/unicopia/init/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/init/UBlocks.java @@ -1,10 +1,10 @@ package com.minelittlepony.unicopia.init; +import com.minelittlepony.unicopia.CloudType; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.block.BlockAlfalfa; import com.minelittlepony.unicopia.block.BlockFruitLeaves; import com.minelittlepony.unicopia.block.BlockGlowingGem; -import com.minelittlepony.unicopia.block.BlockCloud; import com.minelittlepony.unicopia.block.BlockCloudAnvil; import com.minelittlepony.unicopia.block.BlockCloudBanister; import com.minelittlepony.unicopia.block.BlockCloudSlab; @@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.item.ItemApple; import com.minelittlepony.unicopia.block.BlockCloudDoor; import com.minelittlepony.unicopia.block.BlockCloudFarm; import com.minelittlepony.unicopia.block.BlockCloudFence; +import com.minelittlepony.unicopia.block.BlockCloud; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -33,12 +34,15 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.registries.IForgeRegistry; public class UBlocks { - public static final BlockCloud cloud = new BlockCloud(UMaterials.cloud, Unicopia.MODID, "cloud_block"); + public static final BlockCloud normal_cloud = new BlockCloud(UMaterials.cloud, CloudType.NORMAL, Unicopia.MODID, "cloud_block"); + public static final BlockCloud enchanted_cloud = new BlockCloud(UMaterials.cloud, CloudType.ENCHANTED, Unicopia.MODID, "enchanted_cloud_block"); + public static final BlockCloud packed_cloud = new BlockCloud(UMaterials.cloud, CloudType.PACKED, Unicopia.MODID, "packed_cloud_block"); - public static final BlockCloudStairs cloud_stairs = new BlockCloudStairs(UBlocks.cloud.getDefaultState(), Unicopia.MODID, "cloud_stairs"); + public static final BlockCloudStairs cloud_stairs = new BlockCloudStairs(normal_cloud.getDefaultState(), Unicopia.MODID, "cloud_stairs"); - public static final BlockCloudSlab cloud_double_slab = new BlockCloudSlab(true, UMaterials.cloud, Unicopia.MODID, "cloud_double_slab"); - public static final BlockCloudSlab cloud_slab = new BlockCloudSlab(false, UMaterials.cloud, Unicopia.MODID, "cloud_slab"); + public static final BlockCloudSlab.Single cloud_slab = new BlockCloudSlab.Single<>(normal_cloud, UMaterials.cloud, Unicopia.MODID, "cloud_slab"); + public static final BlockCloudSlab.Single enchanted_cloud_slab = new BlockCloudSlab.Single<>(enchanted_cloud, UMaterials.cloud, Unicopia.MODID, "enchanted_cloud_slab"); + public static final BlockCloudSlab.Single packed_cloud_slab = new BlockCloudSlab.Single<>(enchanted_cloud, UMaterials.cloud, Unicopia.MODID, "packed_cloud_slab"); public static final BlockCloudDoor mist_door = new BlockCloudDoor(UMaterials.cloud, Unicopia.MODID, "mist_door"); @@ -46,8 +50,8 @@ public class UBlocks { public static final BlockCloudAnvil anvil = new BlockCloudAnvil(Unicopia.MODID, "anvil"); - public static final BlockCloudFence cloud_fence = new BlockCloudFence(Unicopia.MODID, "cloud_fence"); - public static final BlockCloudBanister cloud_banister = new BlockCloudBanister(Unicopia.MODID, "cloud_banister"); + public static final BlockCloudFence cloud_fence = new BlockCloudFence(UMaterials.cloud, CloudType.NORMAL, Unicopia.MODID, "cloud_fence"); + public static final BlockCloudBanister cloud_banister = new BlockCloudBanister(UMaterials.cloud, Unicopia.MODID, "cloud_banister"); public static final BlockAlfalfa alfalfa = new BlockAlfalfa(Unicopia.MODID, "alfalfa"); @@ -66,7 +70,12 @@ public class UBlocks { .setUnharvestFruit(w -> new ItemStack(UItems.rotten_apple)); static void init(IForgeRegistry registry) { - registry.registerAll(cloud, cloud_stairs, cloud_double_slab, cloud_slab, cloud_fence, cloud_banister, + registry.registerAll(normal_cloud, enchanted_cloud, packed_cloud, + cloud_stairs, + cloud_slab, cloud_slab.doubleSlab, + enchanted_cloud_slab, enchanted_cloud_slab.doubleSlab, + packed_cloud_slab, packed_cloud_slab.doubleSlab, + cloud_fence, cloud_banister, mist_door, anvil, cloud_farmland, sugar_block, alfalfa, diff --git a/src/main/java/com/minelittlepony/unicopia/init/UItems.java b/src/main/java/com/minelittlepony/unicopia/init/UItems.java index 28803f34..cd64de7a 100644 --- a/src/main/java/com/minelittlepony/unicopia/init/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/init/UItems.java @@ -17,7 +17,6 @@ import com.minelittlepony.unicopia.item.ItemTomato; import com.minelittlepony.unicopia.item.ItemTomatoSeeds; import com.minelittlepony.unicopia.item.ItemZapApple; import com.minelittlepony.unicopia.item.UItemBlock; -import com.minelittlepony.unicopia.item.UItemMultiTexture; import com.minelittlepony.unicopia.item.UItemDecoration; import com.minelittlepony.unicopia.item.UItemSlab; import com.minelittlepony.unicopia.spell.SpellRegistry; @@ -44,7 +43,6 @@ import net.minecraftforge.registries.IForgeRegistry; import static com.minelittlepony.unicopia.Predicates.*; -import com.minelittlepony.unicopia.CloudType; import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.edibles.BushToxicityDeterminent; @@ -83,29 +81,28 @@ public class UItems { public static final ItemCloud cloud_spawner = new ItemCloud(Unicopia.MODID, "cloud"); - public static final Item cloud_block = new UItemMultiTexture(UBlocks.cloud, stack -> - CloudType.byMetadata(stack.getMetadata()).getTranslationKey(), INTERACT_WITH_CLOUDS) - .setRegistryName(Unicopia.MODID, "cloud_block"); + public static final Item cloud_block = new UItemBlock(UBlocks.normal_cloud, INTERACT_WITH_CLOUDS); + public static final Item enchanted_cloud = new UItemBlock(UBlocks.enchanted_cloud, INTERACT_WITH_CLOUDS); + public static final Item packed_cloud = new UItemBlock(UBlocks.packed_cloud, INTERACT_WITH_CLOUDS); - public static final Item cloud_stairs = new UItemBlock(UBlocks.cloud_stairs, Unicopia.MODID, "cloud_stairs", INTERACT_WITH_CLOUDS); + public static final Item cloud_stairs = new UItemBlock(UBlocks.cloud_stairs, INTERACT_WITH_CLOUDS); - public static final Item cloud_farmland = new UItemBlock(UBlocks.cloud_farmland, Unicopia.MODID, "cloud_farmland", INTERACT_WITH_CLOUDS); + public static final Item cloud_farmland = new UItemBlock(UBlocks.cloud_farmland, INTERACT_WITH_CLOUDS); - public static final Item cloud_fence = new UItemBlock(UBlocks.cloud_fence, Unicopia.MODID, "cloud_fence", INTERACT_WITH_CLOUDS); - public static final Item cloud_banister = new UItemBlock(UBlocks.cloud_banister, Unicopia.MODID, "cloud_banister", INTERACT_WITH_CLOUDS); + public static final Item cloud_fence = new UItemBlock(UBlocks.cloud_fence, INTERACT_WITH_CLOUDS); + public static final Item cloud_banister = new UItemBlock(UBlocks.cloud_banister, INTERACT_WITH_CLOUDS); - public static final Item anvil = new UItemBlock(UBlocks.anvil, Unicopia.MODID, "anvil", INTERACT_WITH_CLOUDS) - .setTranslationKey("cloud_anvil"); + public static final Item anvil = new UItemBlock(UBlocks.anvil, INTERACT_WITH_CLOUDS).setTranslationKey("cloud_anvil"); public static final Item mist_door = new ItemDoor(UBlocks.mist_door) .setTranslationKey("mist_door") .setRegistryName(Unicopia.MODID, "mist_door"); - public static final Item sugar_block = new UItemDecoration(UBlocks.sugar_block, Unicopia.MODID, "sugar_block"); + public static final Item sugar_block = new UItemDecoration(UBlocks.sugar_block); - public static final Item cloud_slab = new UItemSlab(UBlocks.cloud_slab, UBlocks.cloud_double_slab, INTERACT_WITH_CLOUDS) - .setTranslationKey("cloud_slab") - .setRegistryName(Unicopia.MODID, "cloud_slab"); + public static final Item cloud_slab = new UItemSlab(UBlocks.cloud_slab, UBlocks.cloud_slab.doubleSlab, INTERACT_WITH_CLOUDS); + public static final Item enchanted_cloud_slab = new UItemSlab(UBlocks.enchanted_cloud_slab, UBlocks.enchanted_cloud_slab.doubleSlab, INTERACT_WITH_CLOUDS); + public static final Item packed_cloud_slab = new UItemSlab(UBlocks.packed_cloud_slab, UBlocks.packed_cloud_slab.doubleSlab, INTERACT_WITH_CLOUDS); public static final ItemSpell spell = new ItemSpell(Unicopia.MODID, "gem"); public static final ItemSpell curse = new ItemCurse(Unicopia.MODID, "corrupted_gem"); @@ -139,7 +136,7 @@ public class UItems { public static final Item apple_seeds = new UItemDecoration(UBlocks.apple_tree, Unicopia.MODID, "apple_seeds"); - public static final Item apple_leaves = new ItemFruitLeaves(UBlocks.apple_leaves, Unicopia.MODID, "apple_leaves"); + public static final Item apple_leaves = new ItemFruitLeaves(UBlocks.apple_leaves); public static final Item double_plant = new UItemFoodDelegate(Blocks.DOUBLE_PLANT, stack -> BlockDoublePlant.EnumPlantType.byMetadata(stack.getMetadata()).getTranslationKey() @@ -210,8 +207,10 @@ public class UItems { registry.registerAll( green_apple, sweet_apple, sour_apple, - cloud_spawner, dew_drop, cloud_matter, cloud_block, - cloud_stairs, cloud_slab, cloud_fence, cloud_banister, + cloud_spawner, dew_drop, cloud_matter, cloud_block, enchanted_cloud, packed_cloud, + cloud_stairs, + cloud_slab, enchanted_cloud_slab, packed_cloud_slab, + cloud_fence, cloud_banister, cloud_farmland, mist_door, anvil, bag_of_holding, spell, curse, spellbook, mug, enchanted_torch, @@ -229,8 +228,6 @@ public class UItems { apple_cider, juice, burned_juice); if (UClient.isClientSide()) { - ItemModels.registerAllVariants(cloud_slab, CloudType.getVariants("_cloud_slab")); - ItemModels.registerAllVariants(cloud_block, CloudType.getVariants("_cloud_block")); ItemModels.registerAll( cloud_spawner, @@ -241,7 +238,10 @@ public class UItems { tomato, cloudsdale_tomato, - cloud_spawner, cloud_matter, cloud_stairs, cloud_fence, cloud_banister, + cloud_spawner, cloud_matter, cloud_block, enchanted_cloud, packed_cloud, + cloud_stairs, + cloud_slab, enchanted_cloud_slab, packed_cloud_slab, + cloud_fence, cloud_banister, cloud_farmland, mist_door, anvil, bag_of_holding, spell, curse, spellbook, mug, enchanted_torch, diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java b/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java index 9ff35ba4..561e259c 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemFruitLeaves.java @@ -4,8 +4,8 @@ import net.minecraft.block.Block; public class ItemFruitLeaves extends UItemDecoration { - public ItemFruitLeaves(Block block, String domain, String name) { - super(block, domain, name); + public ItemFruitLeaves(Block block) { + super(block); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItemBlock.java b/src/main/java/com/minelittlepony/unicopia/item/UItemBlock.java index e7e8712c..5cb188ff 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItemBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItemBlock.java @@ -6,6 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -13,6 +14,19 @@ public class UItemBlock extends UItemDecoration { private final Predicate abilityTest; + public UItemBlock(Block block, Predicate abilityTest) { + super(block); + + this.abilityTest = abilityTest; + } + + public UItemBlock(Block block, ResourceLocation res, Predicate abilityTest) { + super(block, res); + + this.abilityTest = abilityTest; + } + + public UItemBlock(Block block, String domain, String name, Predicate abilityTest) { super(block, domain, name); diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItemDecoration.java b/src/main/java/com/minelittlepony/unicopia/item/UItemDecoration.java index 86f26cb8..fb9e198d 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItemDecoration.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItemDecoration.java @@ -2,14 +2,23 @@ package com.minelittlepony.unicopia.item; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; +import net.minecraft.util.ResourceLocation; public class UItemDecoration extends ItemBlock { + public UItemDecoration(Block block) { + this(block, block.getRegistryName()); + } + public UItemDecoration(Block block, String domain, String name) { + this(block, new ResourceLocation(domain, name)); + } + + public UItemDecoration(Block block, ResourceLocation res) { super(block); - setTranslationKey(name); - setRegistryName(domain, name); + setTranslationKey(res.getPath()); + setRegistryName(res); setCreativeTab(block.getCreativeTab()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItemMultiTexture.java b/src/main/java/com/minelittlepony/unicopia/item/UItemMultiTexture.java index 1ca937db..0b537fa6 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItemMultiTexture.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItemMultiTexture.java @@ -16,6 +16,7 @@ public class UItemMultiTexture extends ItemMultiTexture { public UItemMultiTexture(Block block, ItemMultiTexture.Mapper mapper, Predicate abilityTest) { super(block, block, mapper); + this.setRegistryName(block.getRegistryName()); this.abilityTest = abilityTest; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItemSlab.java b/src/main/java/com/minelittlepony/unicopia/item/UItemSlab.java index 99a135df..23695f8b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItemSlab.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItemSlab.java @@ -16,16 +16,19 @@ public class UItemSlab extends ItemSlab { public UItemSlab(BlockSlab singleSlab, BlockSlab doubleSlab, Predicate abilityTest) { super(singleSlab, singleSlab, doubleSlab); - this.abilityTest = abilityTest; + + setHasSubtypes(false); + setRegistryName(singleSlab.getRegistryName()); + setTranslationKey(singleSlab.getRegistryName().getPath()); } @Override - public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, EnumFacing side, EntityPlayer player, ItemStack stack) { + public boolean canPlaceBlockOnSide(World world, BlockPos origin, EnumFacing side, EntityPlayer player, ItemStack stack) { if (!(player.capabilities.isCreativeMode || abilityTest.test(player))) { return false; } - return super.canPlaceBlockOnSide(worldIn, pos, side, player, stack); + return super.canPlaceBlockOnSide(world, origin, side, player, stack); } } diff --git a/src/main/java/com/minelittlepony/util/fixers/BlockFixer.java b/src/main/java/com/minelittlepony/util/fixers/BlockFixer.java new file mode 100644 index 00000000..5dee01be --- /dev/null +++ b/src/main/java/com/minelittlepony/util/fixers/BlockFixer.java @@ -0,0 +1,101 @@ +package com.minelittlepony.util.fixers; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.datafix.IFixableData; +import net.minecraft.world.chunk.NibbleArray; + +public abstract class BlockFixer implements IFixableData { + + protected NBTTagCompound fixChunk(NBTTagCompound chunk) { + byte[] blocks = chunk.getByteArray("Blocks"); + + NibbleArray data = new NibbleArray(chunk.getByteArray("Data")); + NibbleArray add = chunk.hasKey("Add", 7) ? new NibbleArray(chunk.getByteArray("Add")) : null; + + boolean altered = false; + + for (int i = 0; i < 4096; i++) { + int xPos = i & 15; + int yPos = i >> 8 & 15; + int zPos = i >> 4 & 15; + + int extendedBlockId = (add == null ? 0 : add.get(xPos, yPos, zPos)); + int baseBlockId = blocks[i] & 255; + + + int blockid = (extendedBlockId << 8) | baseBlockId; + int metadata = data.get(xPos, yPos, zPos); + + int blockStateId = (blockid << 4) | metadata; + + Block block = Block.getBlockById(blockid); + + + if (block != null) { + IBlockState state = fixBlockState(blockid, metadata); + + if (state != null) { + @SuppressWarnings("deprecation") + int newBlockStateId = Block.BLOCK_STATE_IDS.get(state); + + if (newBlockStateId != blockStateId) { + metadata = newBlockStateId & 15; + blockid = newBlockStateId >> 4; + extendedBlockId = blockid >> 8; + baseBlockId = blockid & 255; + + if (extendedBlockId != 0) { + if (add == null) { + add = new NibbleArray(new byte[data.getData().length]); + } + + add.set(xPos, yPos, zPos, extendedBlockId); + } + + data.set(xPos, yPos, zPos, metadata); + blocks[i] = (byte)blockid; + + altered = true; + } + } + } + } + + if (altered) { + if (add != null) { + chunk.setByteArray("Add", add.getData()); + } + chunk.setByteArray("Blocks", blocks); + chunk.setByteArray("Data", data.getData()); + } + + return chunk; + } + + protected abstract IBlockState fixBlockState(int id, int metadata); + + @Override + public NBTTagCompound fixTagCompound(NBTTagCompound compound) { + + if (compound.hasKey("Level", 10)) { + NBTTagCompound level = compound.getCompoundTag("Level"); + + if (level.hasKey("Sections", 9)) { + NBTTagList sections = level.getTagList("Sections", 10); + + for (int i = 0; i < sections.tagCount(); i++) { + NBTTagCompound chunk = sections.getCompoundTagAt(i); + + if (chunk.hasKey("Blocks", 7) && chunk.hasKey("Data", 7)) { + sections.set(i, fixChunk(chunk)); + } + } + } + } + + return compound; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/cloud_block.json b/src/main/resources/assets/unicopia/blockstates/cloud_block.json index 79e3cb5c..0dd87d3a 100644 --- a/src/main/resources/assets/unicopia/blockstates/cloud_block.json +++ b/src/main/resources/assets/unicopia/blockstates/cloud_block.json @@ -1,7 +1,5 @@ { "variants": { - "variant=normal": { "model": "unicopia:normal_cloud_block" }, - "variant=packed": { "model": "unicopia:packed_cloud_block" }, - "variant=enchanted": { "model": "unicopia:enchanted_cloud_block" } + "normal": { "model": "unicopia:normal_cloud_block" } } } diff --git a/src/main/resources/assets/unicopia/blockstates/cloud_double_slab.json b/src/main/resources/assets/unicopia/blockstates/cloud_double_slab.json deleted file mode 100644 index a9f10d46..00000000 --- a/src/main/resources/assets/unicopia/blockstates/cloud_double_slab.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "variants": { - "half=bottom,variant=normal": { "model": "unicopia:normal_cloud_block" }, - "half=bottom,variant=packed": { "model": "unicopia:packed_cloud_block" }, - "half=bottom,variant=enchanted": { "model": "unicopia:enchanted_cloud_block" }, - - "half=top,variant=normal": { "model": "unicopia:normal_cloud_block" }, - "half=top,variant=packed": { "model": "unicopia:packed_cloud_block" }, - "half=top,variant=enchanted": { "model": "unicopia:enchanted_cloud_block" } - } -} diff --git a/src/main/resources/assets/unicopia/blockstates/cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/cloud_slab.json index 07f50f97..1a11fa07 100644 --- a/src/main/resources/assets/unicopia/blockstates/cloud_slab.json +++ b/src/main/resources/assets/unicopia/blockstates/cloud_slab.json @@ -1,10 +1,6 @@ { "variants": { - "half=bottom,variant=normal": { "model": "unicopia:half_slab_normal_cloud" }, - "half=top,variant=normal": { "model": "unicopia:upper_slab_normal_cloud" }, - "half=bottom,variant=packed": { "model": "unicopia:half_slab_packed_cloud" }, - "half=top,variant=packed": { "model": "unicopia:upper_slab_packed_cloud" }, - "half=bottom,variant=enchanted": { "model": "unicopia:half_slab_enchanted_cloud" }, - "half=top,variant=enchanted": { "model": "unicopia:upper_slab_enchanted_cloud" } + "half=bottom,variant=normal": { "model": "unicopia:half_slab_normal_cloud" }, + "half=top,variant=normal": { "model": "unicopia:upper_slab_normal_cloud" } } } \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/double_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/double_cloud_slab.json new file mode 100644 index 00000000..4aaee84b --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/double_cloud_slab.json @@ -0,0 +1,5 @@ +{ + "variants": { + "variant=normal": { "model": "unicopia:normal_cloud_block" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/double_enchanted_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/double_enchanted_cloud_slab.json new file mode 100644 index 00000000..e7f9dad8 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/double_enchanted_cloud_slab.json @@ -0,0 +1,5 @@ +{ + "variants": { + "variant=normal": { "model": "unicopia:enchanted_cloud_block" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/double_packed_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/double_packed_cloud_slab.json new file mode 100644 index 00000000..465e9512 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/double_packed_cloud_slab.json @@ -0,0 +1,5 @@ +{ + "variants": { + "variant=normal": { "model": "unicopia:packed_cloud_block" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_double_slab.json b/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_block.json similarity index 100% rename from src/main/resources/assets/unicopia/blockstates/enchanted_cloud_double_slab.json rename to src/main/resources/assets/unicopia/blockstates/enchanted_cloud_block.json diff --git a/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_slab.json index c2e0d8cc..7258ab6e 100644 --- a/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_slab.json +++ b/src/main/resources/assets/unicopia/blockstates/enchanted_cloud_slab.json @@ -1,6 +1,6 @@ { "variants": { - "half=bottom": { "model": "unicopia:half_slab_enchanted_cloud" }, - "half=top": { "model": "unicopia:upper_slab_enchanted_cloud" } + "half=bottom,variant=normal": { "model": "unicopia:half_slab_enchanted_cloud" }, + "half=top,variant=normal": { "model": "unicopia:upper_slab_enchanted_cloud" } } } \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/normal_cloud_double_slab.json b/src/main/resources/assets/unicopia/blockstates/normal_cloud_double_slab.json deleted file mode 100644 index 0dd87d3a..00000000 --- a/src/main/resources/assets/unicopia/blockstates/normal_cloud_double_slab.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "unicopia:normal_cloud_block" } - } -} diff --git a/src/main/resources/assets/unicopia/blockstates/normal_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/normal_cloud_slab.json deleted file mode 100644 index ba725ff6..00000000 --- a/src/main/resources/assets/unicopia/blockstates/normal_cloud_slab.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "variants": { - "half=bottom": { "model": "unicopia:half_slab_normal_cloud" }, - "half=top": { "model": "unicopia:upper_slab_normal_cloud" } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/packed_cloud_block.json b/src/main/resources/assets/unicopia/blockstates/packed_cloud_block.json new file mode 100644 index 00000000..0abf2904 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/packed_cloud_block.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "unicopia:enchanted_cloud_block" } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/packed_cloud_double_slab.json b/src/main/resources/assets/unicopia/blockstates/packed_cloud_double_slab.json deleted file mode 100644 index eebde8cf..00000000 --- a/src/main/resources/assets/unicopia/blockstates/packed_cloud_double_slab.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "unicopia:packed_cloud_block" } - } -} diff --git a/src/main/resources/assets/unicopia/blockstates/packed_cloud_slab.json b/src/main/resources/assets/unicopia/blockstates/packed_cloud_slab.json index ea955372..978908ec 100644 --- a/src/main/resources/assets/unicopia/blockstates/packed_cloud_slab.json +++ b/src/main/resources/assets/unicopia/blockstates/packed_cloud_slab.json @@ -1,6 +1,6 @@ { "variants": { - "half=bottom": { "model": "unicopia:half_slab_packed_cloud" }, - "half=top": { "model": "unicopia:upper_slab_packed_cloud" } + "half=bottom,variant=normal": { "model": "unicopia:half_slab_packed_cloud" }, + "half=top,variant=normal": { "model": "unicopia:upper_slab_packed_cloud" } } } \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/lang/en_US.lang b/src/main/resources/assets/unicopia/lang/en_US.lang index e7473a9d..79f00af0 100644 --- a/src/main/resources/assets/unicopia/lang/en_US.lang +++ b/src/main/resources/assets/unicopia/lang/en_US.lang @@ -1,10 +1,13 @@ -tile.cloud_block.normal.name=Block of Cloud -tile.cloud_block.packed.name=Dense Cloud -tile.cloud_block.enchanted.name=Enchanted Cloud +tile.normal_cloud_block.name=Block of Cloud +tile.packed_cloud_block.name=Dense Cloud +tile.enchanted_cloud_block.name=Enchanted Cloud -tile.cloud_slab.normal.name=Cloud Slab -tile.cloud_slab.packed.name=Dense Cloud Slab -tile.cloud_slab.enchanted.name=Enchanted Cloud Slab +tile.normal_cloud_slab.name=Cloud Slab +tile.double_normal_cloud_slab.name=Double Cloud Slab +tile.packed_cloud_slab.name=Dense Cloud Slab +tile.packed_normal_cloud_slab.name=Double Dense Cloud Slab +tile.enchanted_cloud_slab.name=Enchanted Cloud Slab +tile.double_enchanted_cloud_slab.name=Double Enchanted Cloud Slab tile.cloud_stairs.name=Cloud Stairs tile.cloud_fence.name=Cloud Fence diff --git a/src/main/resources/assets/unicopia/models/item/normal_cloud_block.json b/src/main/resources/assets/unicopia/models/item/cloud_block.json similarity index 100% rename from src/main/resources/assets/unicopia/models/item/normal_cloud_block.json rename to src/main/resources/assets/unicopia/models/item/cloud_block.json diff --git a/src/main/resources/assets/unicopia/models/item/normal_cloud_slab.json b/src/main/resources/assets/unicopia/models/item/cloud_slab.json similarity index 100% rename from src/main/resources/assets/unicopia/models/item/normal_cloud_slab.json rename to src/main/resources/assets/unicopia/models/item/cloud_slab.json diff --git a/src/main/resources/assets/unicopia/recipes/anvil.json b/src/main/resources/assets/unicopia/recipes/anvil.json index 426f5791..c06aaa3a 100644 --- a/src/main/resources/assets/unicopia/recipes/anvil.json +++ b/src/main/resources/assets/unicopia/recipes/anvil.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, "result": { "item": "unicopia:anvil", "data": 0, "count": 1 } diff --git a/src/main/resources/assets/unicopia/recipes/cloud_fence.json b/src/main/resources/assets/unicopia/recipes/cloud_fence.json index 9be713b0..86eb04ea 100644 --- a/src/main/resources/assets/unicopia/recipes/cloud_fence.json +++ b/src/main/resources/assets/unicopia/recipes/cloud_fence.json @@ -7,7 +7,7 @@ ], "key": { "B": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, "result": { "item": "unicopia:cloud_fence", "count": 3 } diff --git a/src/main/resources/assets/unicopia/recipes/cloud_stairs.json b/src/main/resources/assets/unicopia/recipes/cloud_stairs.json index 92b20770..cf57cd45 100644 --- a/src/main/resources/assets/unicopia/recipes/cloud_stairs.json +++ b/src/main/resources/assets/unicopia/recipes/cloud_stairs.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, "result": { "item": "unicopia:cloud_stairs", "count": 4 } diff --git a/src/main/resources/assets/unicopia/recipes/construction_cloud.json b/src/main/resources/assets/unicopia/recipes/construction_cloud.json index 965b0d85..0a5f7541 100644 --- a/src/main/resources/assets/unicopia/recipes/construction_cloud.json +++ b/src/main/resources/assets/unicopia/recipes/construction_cloud.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ], "*": [ { "item": "unicopia:cloud_matter" } diff --git a/src/main/resources/assets/unicopia/recipes/enchanted_cloud_block.json b/src/main/resources/assets/unicopia/recipes/enchanted_cloud_block.json index dcf5d407..784b23e9 100644 --- a/src/main/resources/assets/unicopia/recipes/enchanted_cloud_block.json +++ b/src/main/resources/assets/unicopia/recipes/enchanted_cloud_block.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ], "$": [ { "item": "unicopia:dew_drop" } @@ -47,5 +47,5 @@ } ] }, - "result": { "item": "unicopia:cloud_block", "data": 2, "count": 5 } + "result": { "item": "unicopia:enchanted_cloud_block", "count": 5 } } diff --git a/src/main/resources/assets/unicopia/recipes/enchanted_cloud_slab.json b/src/main/resources/assets/unicopia/recipes/enchanted_cloud_slab.json index 410e8326..e4bfa6d6 100644 --- a/src/main/resources/assets/unicopia/recipes/enchanted_cloud_slab.json +++ b/src/main/resources/assets/unicopia/recipes/enchanted_cloud_slab.json @@ -5,8 +5,8 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 2 } + { "item": "unicopia:enchanted_cloud_block" } ] }, - "result": { "item": "unicopia:cloud_slab", "data": 2, "count": 6 } + "result": { "item": "unicopia:enchanted_cloud_slab", "count": 6 } } diff --git a/src/main/resources/assets/unicopia/recipes/mist_door.json b/src/main/resources/assets/unicopia/recipes/mist_door.json index 937a817e..1a204206 100644 --- a/src/main/resources/assets/unicopia/recipes/mist_door.json +++ b/src/main/resources/assets/unicopia/recipes/mist_door.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, "result": { "item": "unicopia:mist_door", "data": 0, "count": 1 } diff --git a/src/main/resources/assets/unicopia/recipes/normal_cloud_block.json b/src/main/resources/assets/unicopia/recipes/normal_cloud_block.json index ad04d6ea..0d4d250e 100644 --- a/src/main/resources/assets/unicopia/recipes/normal_cloud_block.json +++ b/src/main/resources/assets/unicopia/recipes/normal_cloud_block.json @@ -10,5 +10,5 @@ { "item": "unicopia:cloud_matter" } ] }, - "result": { "item": "unicopia:cloud_block", "data": 0, "count": 1 } + "result": { "item": "unicopia:cloud_block", "count": 1 } } diff --git a/src/main/resources/assets/unicopia/recipes/normal_cloud_slab.json b/src/main/resources/assets/unicopia/recipes/normal_cloud_slab.json index d9eaea97..323759cf 100644 --- a/src/main/resources/assets/unicopia/recipes/normal_cloud_slab.json +++ b/src/main/resources/assets/unicopia/recipes/normal_cloud_slab.json @@ -5,8 +5,8 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, - "result": { "item": "unicopia:cloud_slab", "data": 0, "count": 6 } + "result": { "item": "unicopia:cloud_slab", "count": 6 } } diff --git a/src/main/resources/assets/unicopia/recipes/packed_cloud_block.json b/src/main/resources/assets/unicopia/recipes/packed_cloud_block.json index b4391ec8..528dbb2e 100644 --- a/src/main/resources/assets/unicopia/recipes/packed_cloud_block.json +++ b/src/main/resources/assets/unicopia/recipes/packed_cloud_block.json @@ -6,8 +6,8 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, - "result": { "item": "unicopia:cloud_block", "data": 1, "count": 1 } + "result": { "item": "unicopia:packed_cloud_block", "count": 1 } } diff --git a/src/main/resources/assets/unicopia/recipes/packed_cloud_slab.json b/src/main/resources/assets/unicopia/recipes/packed_cloud_slab.json index 0b2ee3c2..224188c9 100644 --- a/src/main/resources/assets/unicopia/recipes/packed_cloud_slab.json +++ b/src/main/resources/assets/unicopia/recipes/packed_cloud_slab.json @@ -5,8 +5,8 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 1 } + { "item": "unicopia:packed_cloud_block" } ] }, - "result": { "item": "unicopia:cloud_slab", "data": 1, "count": 6 } + "result": { "item": "unicopia:packed_cloud_slab", "count": 6 } } diff --git a/src/main/resources/assets/unicopia/recipes/racing_cloud.json b/src/main/resources/assets/unicopia/recipes/racing_cloud.json index 3c38ba55..f89a108a 100644 --- a/src/main/resources/assets/unicopia/recipes/racing_cloud.json +++ b/src/main/resources/assets/unicopia/recipes/racing_cloud.json @@ -6,7 +6,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ], "*": [ { "item": "unicopia:cloud_matter" } diff --git a/src/main/resources/assets/unicopia/recipes/wild_cloud.json b/src/main/resources/assets/unicopia/recipes/wild_cloud.json index 5e01885a..b8ede3c2 100644 --- a/src/main/resources/assets/unicopia/recipes/wild_cloud.json +++ b/src/main/resources/assets/unicopia/recipes/wild_cloud.json @@ -7,7 +7,7 @@ ], "key": { "#": [ - { "item": "unicopia:cloud_block", "data": 0 } + { "item": "unicopia:cloud_block" } ] }, "result": { "item": "unicopia:cloud", "data": 2, "count": 1 } diff --git a/src/main/resources/assets/unicopia/structures/cloud/house_small.nbt b/src/main/resources/assets/unicopia/structures/cloud/house_small.nbt index c5ca685b46682ca62bb80dba00a599ba9e1d6bf7..e7911210a054c18e2f69832020e145ebcf55056b 100644 GIT binary patch literal 4473 zcmbtXeLUND9uHc5Sj)AY9c@>=ZquSC5z}X}du`L(WapX1Q}Svmt_{S?B;MN<($65_tUL?l}A$DP0U`aOIe-cLX4i|Y}Z zA7)?Q>9;>h;z>Ly)CUz^2M$-bthgh z=7*gdl*BHyyF1&c@Q&i9XJIKhAs7ezmwD1bN^s-Q<3ogFC?jZnW(WpfP)|E-Ka{qC z`vGAqD!%2r%B&DvJ=)CD9E-3q&iVa2d>3`^G=z?EePOjObDa%hTiQq5lZ1^sTl%1$ z^H7>CSJ3<7T(pq;I$^x}V8yQ?R^UdGs4;vi$_g^ZUYI$1P;{Vuqd?Fie&UxVpK74Y z@1OK0iL+dWQYG9qggqz{eTJcaB+6oYJh5{+o8uV7PX0#8U<4rEwCP}y+ z#%=E62(ZRBCO)a9+;<5iWW{I&=#Xi7r|oF)4vvJu4!5%;PyhKe<_;+m!}mq`2Toth z7cy}L*=UPQTJHHO(RHj*@lUtE{SR?1Bo|G1*mn;EQFDL$S>;vy`E8NhTgr9@e_s<_=jD(1 zwvKd0%;Pfhv$vBO@y^y^8&MWt)3}TP5@Xox!6f6~+_wp6)LLjG)`ZjA1Oogdun~39EsuTQFj(~I8wLv# zRHxAD(QjDl%Lfck>^c&{32ATmzHiI3-Cb(&#Oow|^{vZLgb^9ve(i(&#<#eL!e6NY;*+_2lZLw~pHYP=ax0 zWvhQwO?Yoc_b783iy(eTcnp5!_->{-vP`c%Se*O!Cq7I5X1!R$*2S*kUZ>l=RDcF7 zg5H^;Y#+MaibxW8zh!VK#9UdqAvQpXiI>1Km#Y&@3EZTo%uB1K07y_bHKc&4A`3Mj zsy$JwK>AsS34*Pka(u7QU~v5ecle0ysdtwp>rvov<;#oE;E&~2blhM&px5I*Y@q)d zQ(4BERRLJFdo=(C)}z&u1QQ_f-gs8`XxlUv?-+DGCqH|e$jtIJJxkPLnwT3{j(u57 z7I9X3iSKJj6hMD_y|pd;kx{zCrLE@F4wp-S1a&7AZXU6bJU0)RW`gtPNqfNdw1D&% zJn#S2UUV+%vPDe6sSw9I^aH37GXa7W>hj{yyNqd}g z(IheM;kMG4tJpP~Ya2rEEHqa#`~T)by{r`lHG7GqCHh~h~xs+!>Cy2Shez0OLc`4{&0`o@iaVsbC zhW-!zLit)hH(l&6Y~Jp*CDK+xQU2AQGq(1ko~-x?z<;3X75L$sI-tSUvsivjX~Si$ z72G{h+uu>u+F4&$#zI#G7{~eRl=;*z5%@J(*QT9_SC&oZ(*=3`7Cv43W?4 zsWaq#Zq%#OU!g&sfZcI&w{924IsO8CS1HM9yZovLmfE-Pknqt`HLRH*Fylv$Z(p1yCeJPCVTdm2-)r~Qu#WsIDe7s z<07rH!)cERF?XFrUNq&6!dBn$o_Te+A=hD-84_qsT;Ul5hi91f>-eT!7)t)qVK1EmfkIK1~0=7C!Jtk6eAYB5Nx)d+ zM`pUZXBRLHuK67K?9>^mV&crKSS6W~w9dF5V~DAB`>(1b@~OdDO3I`oVvF9rlFv1)I(R0qt5m5=`C5(7P)+4VyIr~N5h28$yyhx zt6R)c5>jv+_R&Jjc)$FjVxc%*)e&Q}R&LR*`XiZjyQIYZTcI`e@Omnz`hu`zL>V6x zA86LYZ^X^lPKYNzIX+~a9VLum4oaq^lEZigx~ecc3S-@Y#l|QGnhG{L_Rz?^#m)g iaB$_RTIt7{>nZZ8y!80`->QC^bG3Ca9-~bn5dQ@OSGkM; literal 4521 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 literal 847 zcmb2|=3sz;-dhLrE<1>{KAb(%+SpT|iPfJe=`yc$OG`^Yc+SMxyVhP+>5~!XoHxz= zpys@w){XD&gG9Fe%sFrC>$h}Q_Qa_#HvSB)7PPdTcG$VyJ?iA9d*6NUUvalwJN3xw z+}%6v*R|`{tv~vH{jaGl=WF-==AQOwR(9pq>~CL}t)L&fxH2Qd`gZV!kDk zfZMU3Yk?}b(pJ?!gPLzJ{mD&-{}Djbm=_;tX`1;;UVDCV@xAs*#teUxpC(Jf-SMet z0ZmVNoT$%jF$=`YZy`|Z=#ZDjz8A{+Kz z{`{c?Uz;em<-aEPffDnHJ-_WQUIBv?V-7x~gZ zwVxg4P$dJ-8GD#sOv4^l(TK2ud5$~nRsQKPyJ_GEiWe^Fp4y*kV-RJqv}Vm`u=iXc z-a~lgb2KEvKtT`mFVo}$^HS%WJ$2k@U4qx&97$F+2H{4}1ih2bnURBi$)ZTFHFCdp zZ<~De>9${y<@xvbM|)a@+}`#6_2t;w*weo@W%HMo?|NZm-)f?YAI) zb?o2!y8o7o$Nj5bm}O;Y9sMh?)OYK9Rk>AXYis|O+?d^7yE&8Jw{+vpZT#2o%l|){ z@asjQ@$Rf_xxc@HZ{NKpzk1)Vu=3-}?(*+9od3-{& F0RTw#ma_l= diff --git a/src/main/resources/assets/unicopia/structures/cloud/temple_small.nbt b/src/main/resources/assets/unicopia/structures/cloud/temple_small.nbt index 281c3f1c094f7c2056681377ef4c5731f839f55a..e92ca53438028ccb029c3980677408a567b7d50e 100644 GIT binary patch literal 5268 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 YrPF@L&yqg3{}=z)sgIX$5@TQh0N_zdE&u=k diff --git a/src/main/resources/assets/unicopia/structures/ground/temple_without_book.nbt b/src/main/resources/assets/unicopia/structures/ground/temple_without_book.nbt index 0ea35eaaf06f6f05f6786ca97cc477233c90cbcf..60ab127745cc436091086f84b5cc9076feec8be5 100644 GIT binary patch literal 658 zcmb2|=3sz;r8j*0FB=H3J?Kooqkp8G{*WVf5{>i165)xv0)?}YCNJu$wr%H@z zjw9o_2Qv~6oM_lt%EoHZoZO~Yn_X&>e4D-A)M!Kd-}f#13>y*;L>x%@@@IGI3i-1J z2|5WHf8R)0UnsuM^L33RTMxtEhy{M9+{}X7gX|jq^hkp2XE?^x7Ub{1x3x60jZwK_ zV}obp)oV+kQcchPoM~7irLZ~~Drb46>RJyY53?IXGUMc;6>GhX*$j9j7<*XHR^~eJ zNuGE(1LOt{pv^&HKogHKU@>!<gGin4t&RXn2#~3J#~NWZpm$AznRVei7VF#B{IXd7@}8)j+x^QXp5pFQzULA3w+?LW`0_b!*W4>x>cb63kiH!DI{{`SoG z>y7`*#7O#|{ybY^?SYT=+;grlz5I9jb?x-&e|K#vJZkG3rg&__+ds2T2CvJKWuu$MTn1;aK(}4Pgcb06K3tYXATM literal 647 zcmb2|=3sz;r8ffeFB=H3f9QTc$ISJBihw-J5pMlG3UU|cRjj@9aIIiwun_;+zh6{h z=ek8s`t2Rjwd}0@{daGQx2C#InRw;rNn^pS{mx6kpX~5tJI2t)sO(@TQv6ENSjgR2_r1D=Sx9{PB^HVwPa*VfAs+w~s#d=^_vFF{ZXh z*XM0iw&Xt>ac)-P0geg%tdEY|^GJIX@P>au{j(lM9%eU&WJYI0^#%M}cbOb+5IhiZ z;7HunSC^ntj>UGy3&MFXtS$z6qhVu1XYGooYa~I|FdSo2`?fG_dK$~jf)oEUU!pkOcPDr-fI2p)#K;>lDd5BJ}Cb9CVC>tb@lC4Ha}L?x^7x> zG(P-kp8N~nz1pWY#Qr~ZS}XsMu4mnjxy!fju6h4nt6YBHm4$bzXK`)NkcwD8f7ev` zb=v=Jc4^JI_T1bss^Rf}Hj9;vkN&)Vz324m#F(4A9?iStE9tcJ_1{@vEW^Z~{!M7V zR{GFPzp3@{!kfDvbS3=_*tzT7wEesF^3&(5hnIZbyGHJhx%eIb_^XvW^ZymUODX;r XKl^e0)!BCcU&t3^naz|GW?%pSvneuC diff --git a/src/main/resources/assets/unicopia/structures/ground/tower.nbt b/src/main/resources/assets/unicopia/structures/ground/tower.nbt index 74757d0ebabdd96e0f4830bf4d0bba708f8283ad..402941fa353a026fd23aaf170446a54d5409706e 100644 GIT binary patch literal 2362 zcma)5c{~&T8=tkGqa;~oq)Bq*__d)Nk@CYRUrTZnx#lQxrHE~!X=0;8FXk*qvYcP! zwh=~-mRup0`-sbKM=xWZXV+CcJ~Fa}Ycn~nRF+dD)H`%(0G{Y_3NW)PtE zHRR4QNx%%MfPHHoy)Rka@@b6QNZ+)NvzaZT@{V^hWxf>CWjA$!q}crS9TH! zP*Cg>dcej;hABY|__;Ri%L{t5cvtL?5N^(+@suUi3k2glKbh<#v87neSnlk+P)E(^ zvac4ZG&<&!TX3oc*m^s}idp3;uK?EX#d%f^N!u zGQYT=_I*XgZw3WGNw=C;yiqMY($=42slYuCewTZ|Hpi^zqTbj8as z#olLg#8LGM=JwpuAd9xrrZJ@#PNyE?I2t!0 z=rVBr{c}nJN&z~7Y9kt~7cAwn#hI4C&qV~&| zWL#NM*sxjc>1A$W*0e+xmW!%;JhwOP#+{hMRWJbSVpqSu_9)5RWWw0Q?;N>kQF$6_UDckZzKgPG!!)wKmBe-D+oW)3OgQhqQS51(pFfmZ zTc*RX0L#Veg(;%b;C8}XFlT$B)S+G@Qoog_7jDUn0LEE z^ZWB2!ZYxraiK0@K&1+#O;U1}D#-<8GQ^*m1cv&gK&*n<4N&xXW14^nz4t7%QJOR? z@ui`16$BZViaL!>Y?d}}991kM=ipsH1Ta}Df&wPgfmdv!vx59%)XQW zUJZyKHv!65?LZah8rURsR<^y{oGI~&EV)IuhD;$7trefUYZR8i4FK+E9oz>+^iPks z=aFF@2NY-clvb4c2)uZd>_Hj@=?`9mpo{E*0^|1mF3AW2com=ui#@oE6-Sd~b-F#U zA=DTb5qjdZtt3-r)&HLX(6XJhi?@&^)bPQvQBYWw9=OAq zsk^ru&lv?73=V<}plH`9Idq4|x229pVL)JaF_gLP5J!5E(9B*QRUYT2+fTM&8Q0yh z%)mUTiF29H(PW*7uJW4*Dyz!6gHixLoSs_Mb}O`xZf$ARL zkT6*;Qxa_m;LU z4JnS{vtz#g(TTSf-dRidiFkO6ODLQGhQb$2$uzh=v{8suE_MC@eTOoSfYY!R%lT)5 z&l-&CXVI|g%%eZ}4Hw3A2)|jr-f^8Hz-!i3e*PmKAsew{Bxtxg1D%XeI1c|w)`$4= z_t=1W?j}{wsX4sMqLo3G!Q3B7v_%-4;<>8JgO$f!wi8E>)x`)2@yHFH77T^|!q{_( zE|K#aWUyTDH~OApDssWz(+0sq{!G2=A-=oa&4YbOWEjsk{K7~(PuE@kryjs|9LhV5 zwLk%;F1QGvOS-AzLzCtZ;}CX5#O5UF{~U|1Jtlw#^t~{vnv46X z&>mt?)2g$%>8=ZeFOpRdojbNugcpB>|Bu#k|7cyVdtQUSb9GP)=duCDOI)B3{R6BMp*&He?vYFexLU%D5-QtQT$Xrl)CEwpf&8Dw&N>}0ea zu3)CEQhVOr^<{dn1MYUn-P9>ge)q+iVY?}1wWCf~S7gFwvd1dFAA=d`fD~VgR3wUw z-(lzXBjx^GS*u}BReM{z^p?`vW9GSS80}=_cW6>QVJi@0XR57JfnUI;=6LnYB5y({ z?pco4HclK~UR5ide7N#<t^g$mmlN(k&#jv-;!y6uNte-Nw|$tS}F;{sQm#gv*>c=r_x{E bbaYg)pxHIe(f1Yzv1N$=@^Py&1pxjAE9Z-l literal 2326 zcmYk5dmxkhAIJ5p=JIn|%4HMgm$^I4-4SD_3+pGB;~HT^tSMdr_h+)nPLQ{-!5 zedH3e^-y<$lnh)aY3^n0pOyGXgGv2i)BeuWZua$GvWoZh3}#QGBS$)i-Qh?{bBiO%-ASugud3Ps7-v7Frb;P9I^aFOWU1##N^7#2x*%56*z4_d7*T^geQYUCd+_ z7X8BgPgb1y4KXocZz4xhcpBx(x|m7P!SN#Y92jih9(K&io{y(^Hs5cX$5?51$sq@B zU(AkgAlK(l60VKKIuLAramB?7e@A%CGIJB%6_=b+$$J#scaExMUKfi@6X4F;IIgTV zXI46d#`)54E&^iJr(CCW;eGe}kk1 z-UwElA$@cd`X$e(yJT45)e|UER$h&={x%7T#wdg5yrnqRMEwJl04u#bQlKW9uWCt$ zcdK61h{u}W8T=ZIwrp*N4=ZVkNBD{AQ`8@wQ!O-olxU=L*8_~Ke&}{BwKA&G-%KAg zhtWNvF=pqb+C04oTV@qke0WKYigZhKac9-)PJAIF+_zRpk}P6e#UtK0X#~v9T0r90 zhQjjl?rmRempoj;iEr;Et(HceG>8^l6<@qBo_tC!h_QERmv=wYci?%mumBboJ<5pw zDyju7KA15N&rSEvXO>DN$wj>Ni2CiYe&UL%S#$5|WARQq9;e`-1SngJ=2@-RB_%of z4CjZQ7n3{U^U#@FYX;p`YpEc|C_2*@D__@;Q95@nX2omilg3i9jB+u9VY7?&=1M#I zW<@lAbf#hc_SCyyckV-*C8GrBnSBg;gXeiz)Ol~bId;8DL|+%Z5Wkq4@cDLl;AxC0 zzeGLo)V(?ChvQdpKu_oDN3*;e*ZAS}2$5jyrAo`6QlK}y z;I~70w`pY6A$m$nUgsG3g67v5|Jz}jXusu#koItZsulqTp5XT^r)3 z>CVu_)W!zUEhhr3ylp&aO!->(gT0I=0;Q0Jh(nF)(6wfp{6z_Gfl3yXxLPwNs+kkP8pftO#|6Z-jw}QAt!VEX-QklZJ|QM< zK?|2(`=0w;ZB;V=)cYnk#Y(v~FFNu5ORqsK=*ruFv8Jap7%#{#oL`8q2@Rfvb*oT-(F6aMyv zDjZB0j~moccO?$%CHw~JsYb*$*@Ik}4Ie>HGm7gFYV z*c3xeXMzi<{^)9PoderLVN`sw#Bjn0>f@UMD=Y1~*B%rGd=_h4K9hy@S;(Z~{0bJF zN$~w(+uthwFf@VoD>-5dA+20;pAiH<^zkU9zb@sKgJD{(IA+N<$&lk|IIztyghs_> zR|H;(i|FLHQ*p}ftZ(vcQ;KJeFQ*~4#h?iTCl?!LT9UClsa>cNC+$NBNM`bw4!a7$ zB*+#}=GCAi?trw7ECX-1>v%^{$DCd!$qLkifb~FJL?uLT{1)sX?WmO{kPjT6(d> z%BFkjm}GY#r?jRRW_m<2W5Ibt8n5Ls$>ow3Ah}v`KNx5SnrO8Z({BKX#^SC>;OQ6FJ0d`R=WBDLp_HXqAmivua-=u-iS}|Np>3_Lx@fu>B zFE=iQ0F%S|EvphYnR7*uNr%H=mOW@I?Rc57wzVwa#XC870}sHr^YZk2?~p&fyW&GB zxVvcJCSY*Km@1Q?QSkP1;d{XKR30SeY<3Y~`0rd!-ObJVC&^Id_!Ixw4NboSOWfi` z)Ck7y`_8T7qx}!6pgZU4s(Fv!}b1v%M^+X&*H2A{AYl zf}c>5ZZYJy(~%OdgrBDu;&wes5NUO|<%8^&5b0<5Ejt{8c<@%cCu9V=`LaxJava_0 z8vj`a(!}%$h-E(wL)K2}`!0T7!ydm$cbtVMVBc&b%DY t3zirEho+p=Z6Uv$BUHiVxikjLbRq1zAMXD}MK){TGN~yA8GA9YzW|8IbL{{C diff --git a/src/main/resources/assets/unicopia/structures/ground/wizard_tower_blue.nbt b/src/main/resources/assets/unicopia/structures/ground/wizard_tower_blue.nbt index 24a871ef76c82d11aa0f7cf712c4dcddc26f1900..f45ff2bd9b7dcc3a2d01e023014f4798ac0209f9 100644 GIT binary patch literal 7188 zcmdT}dpMN&+b2n_uv^=Yp{BMRuFA@ib4;~u$fQtNg&~%rW>U__q^PJVQ;bt;MLCVy zQPVh$c8Vs4$ubTJ$zd=tm>9?LexDgbtC{!x=e@4?di^o3XYS|ue(&#n-=EL@xu4k> zyHY~%SK3C$x;GsyA8F-s6%Nh$u8G-wGF*D~s!RJU-mDpEhQrLyuc^95yuP!+w+X3O z-^R!$jK7j!ljm~fqV$>>Ig6{(n!iU*$Zq~g|IFs!RoAFAKi%^k+n>^8#|h1?4M_dT zKBus_*N&MQQk%>5Dl*n{$bR_w_2;N;n*)s23vGjwLkYO+^~9btMk&tSL(}PqyV z^p2E!{)~v(P-D~MiJgu2HDc>0Po_;xtQ}C{RLN9&*2l(1cJRi$?;V+XJ9ElELf^@e zRFyL^RE#R)+?{+q%3-qKBa8wEQTYeP2&61rY){ABut7)l++=^YJ&#d8+0!z57lD`~ z?U?;YnS1;A%QH^@$-h!-=w7K0Zq5d%dzy3V6?fEXU~8RA3=qX7FS18m9*^*5y4`t? zaSG^Q-;ly|CT5)I=zp+O*C@?5(8`qCL*!~5DncZGFv;#<8mMb%U{XsECL!-OD7Iqg zid8fki!({9o3Z&BY4mJ*pfq;!Q^~R5(im28dM>s^H!kPI@l2C?+UN_o&NDj`jQ0k}d)_?tA>lg8WIF9PQe{RydUrt4jZ`N`g~zRjLOsh$lA9R& zo#!&xb03Xa`2lpSdR4!-Mw{dZX_owL73WSE;d!G9 zJXXXPO2;JHws&yyHKPnQnTQCdm3*n8l+BK@X4}npt%Dn9D?N*skKZ5!A*O7?f*W@l zWS>QSWZ{S;&lrUc(+F=fl)qUcb9@XxP&UMPTdYYXzvLRUsv+384qi9rXWnPoh>_uO z*|5>seD)kWEg}cYwZ|5$s%JYRPOf|yLsRN0>T)+4O#d}kUBV7S+VA1*uBk1rq)>ef zMQlGzL@Skguv3ti$nlVj20DZP#bh2ELUCp!eruN$o^ol)rq#m&JQQ~rsxZ~E$8A| zqMzOfR_)qDNV$-7nBH7Ca63+hj7IM@b*s-Y*MWBz(KH%#_4E0+bnc>feMsh%9N{!i z?5~L**<>%Fr_dyO8s(;2+Y`A;+g^gKYKQsZ)oo;{ns)uu(=|uH0y(7B1F)21rqJ!B z>)v_N8d@)Gy6HX;#BF>NS8z~SNh(gdLb5AzRr$Ub+_O&tXurFx*M{RIyxS%9tRO=+ z$>}iG9emgOUJ6>@&tbR-je`ys&78?`;0B+;!S1QpuBWY@PW)uy(N_n)Gj_#|l&>z3 zJXSMNwEiNDaM#u}9!Bs1H#NW!209Pws86qX6Sn$OIeVqtE{>EhciAimlmb#BtC1)L zq9AbUNw3pkBD6U^xK(P*0{G)f2)kvaqgN|=bxTsGGP7K7-j@sSavTC~w7N$#@jsgD zPq{hw672#1(vA2ag-S@cJj2^)ZL$O^8BMFPMMh zi^mK317O!>U67BzbF>~i=s;z1Zo?hmp;QIcae7mtdo=4lw4>j^rIRp?h2r6*xPI+RB($KqFrSr43q|R!PwHH zGce`ZYn!fShoMIr#>1Sa^OOAwX7yo<*>#C-y7f=H+Cp8*@as}0tKEN(X*@_L-dmwN zzIr$Wr9}Qii-dv7xgev$!Z`@+D-Cr)RH<=VK0rm za4-+$mq-Hu6q#O+d_1$!(M})MrcHwWzkXT{rSO4kg`WBM8j`rkt>uqh;eVH?W<>r{ zK3}cK<>~@MS<^qF4V}5#J7}j|R%`!932dS+u{P4O+}-6n?Hu;)ouUmL6mfKO6O~+xvbHK;g`h?a4b3TaVsi>Y@z)FemQbQ zmPE$X?_!S8F6IHk5RRz^lZ%s_FIJb$+N&L)(U(wPhPy~B|IuaO z{R)v=+cnAKMI8cPuyllIiH5HVONcv-kAm(31bzNDAy0G~uAS0^ z)oarYrZiszlDoD2k|7@#`^Q3Xz|yMSRchk0`ORHECXOKNvk~$0sKpm8YleW3!tqG}Ni8HCv|SGAN6`LQ+FZe%Y~gi8a$~22)JxRZE(OQMUIC<`roiKoa>C*d=FgLp;Op z^8)fgIu+lii)IEXky*2AG82g@e35*)NM=}FwGu3Z#*c(V0Pqg|pjI0zbl2r3o?qYryWuw+Be z?g&+3`2B*O?BL57VSP+>9UZ{B`%*)5>V5^`Q{P#A2&#wq22fx*Km^7(I{mq8cvhV! z?Q-<#G-hV|hI}fmO&BS*D8!jO)<&Ybj0jNXwxB@mmqT==sZ$Eilmdze?fk?L`ijU5ZF42$5eWIEo)}ff^Pz zZz&+yA<+T^xp1k~RS?;s@qX;HK;yB`o_#w{UX%zxUUhs$w9r#+!mtm`td=HHZW?06 zZ^Z(XVG&VdALIk1kViSbZ7Qg?_bVtGz( zWWU^JekuUn&_U<9Yeh&v`M!moN%%U0(jbG7ASh}0R+=;%#_@HXNNM6_Xm(koxceV9 zC@2fhw56a0=?j9CD?S=VNp#<{L{z(1bz4bb;c`$egaZPa=JrU$$14TAsjvB>XQ>i4o*9(naUg;(K`4@#}+aA zo)RI>U?9eTB8eM5Ek%zhdfjV9Pa|?fMbU;aYtbtSb?7%UG(XS(Lf_f>X0~L+%l4KL zGeH!Kj@-ce|1B-LeU(6qvi(%P7rxhkHLYJjV~_=~i<-optwbB5Q^mc4Fc&kshtG*K zV8j^8(Bi5t*IWwaqt;Bj|F2|vVq{snp{J~Ef`_{FmXnNp?ncHGGAzbS$#j44c!dN$ou~AwM zHm$ZcD<+mU+f((3LyYb5^$D2z7^(dFTnq=N^@mxKsiAXwX~6kO!*Wl!Okd7t-gMv4 zh`Z0u{5hZIqlWT+cGkO+HR0`Phv5FV)jN`$9_Mp0m(U3LV4aBJE03;@q&>RXIaKqX zm`VeM*07l;92~8M8vDqC_tH*-O9==X|LFdfI6aM{wzNq7@d*5eQA2fhv@|eDYY#i8 zGkKpCVNmnB`&^l$b>kHuMb6Nv;1xc#y|JD@RGKB5F`loO{M#*PjN+76TtzFrTiYJ2 zsZM+yv*Ns2#7-w9_D(Uvh>Rz+HCNhW$A^M^x$QlFO&iO5Vl_0lcPUK_L&V@cGsQ|A zhj1sh=cH}=9`EV72g74qpG^$^^n&nSqg5u>Y2)BEx6ck3r>pJlM%Xg)+Cwc(bvDD- zDm&pd%r-LGZAbO_a9-Wb$XwleZ0j|fi9=@ch*XNc$3!0k5w!)cuMGd2?vM6Xa0xnd zvd_<)t!uRTp61MHg{zOkM@@gbl>2uyY}~xDhSWrV+1bik-_+6e&^R#F>p4E4D=oBp zRp=LDy*Yd+>z(&K^!5TpYjtz;`bRIGtfIG$>r&H@;1{IF`8(Qoor~ysYeL>-bbKe= z_k&vMwh*0C%KGGPYcHoyTS;9`sl<^~M4jQoo4p)`!Lp>u(U}>IgqEKPo^v>)9KH2# z*_216d(DCjO}n;tzdxQ{vu>0&Jg1=X3fuU33ycs$6l`3LO=S--65IJPnhf7MBS`+F#S9^ysq{4X})t^Q?KU&lO>7+hFcUzn4 hAP>#EZsQXe$Q?{9qO>HebGkBxpqi@RDRGyS_%G3{b^rhX literal 6405 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 U+BMg1>8C*Y?Cp0;!W$a=8;!@-r~m)} diff --git a/src/main/resources/assets/unicopia/structures/ground/wizard_tower_red.nbt b/src/main/resources/assets/unicopia/structures/ground/wizard_tower_red.nbt index 36956a5437922e071d35c8b23eb04092a1878292..1e07bf36c7a6c0008e1d515e250a1d0fb7597871 100644 GIT binary patch literal 6463 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