diff --git a/build.gradle b/build.gradle index d419f8f91..afa76c8a1 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = 'mc1.14.4_v0.1.0' +version = 'mc1.14.4_v0.1.1' group = 'com.simibubi.create' archivesBaseName = 'create' diff --git a/src/main/java/com/simibubi/create/AllBlockTags.java b/src/main/java/com/simibubi/create/AllBlockTags.java index 15690638b..5b2925c7e 100644 --- a/src/main/java/com/simibubi/create/AllBlockTags.java +++ b/src/main/java/com/simibubi/create/AllBlockTags.java @@ -10,6 +10,7 @@ public enum AllBlockTags { WINDMILL_SAILS, FAN_HEATERS, + WINDOWABLE, ; diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index f04093824..b5864318a 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -32,6 +32,7 @@ import com.simibubi.create.modules.contraptions.relays.ShaftBlock; import com.simibubi.create.modules.contraptions.relays.ShaftHalfBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltSupportBlock; +import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockBlock; import com.simibubi.create.modules.curiosities.symmetry.block.CrossPlaneSymmetryBlock; import com.simibubi.create.modules.curiosities.symmetry.block.PlaneSymmetryBlock; import com.simibubi.create.modules.curiosities.symmetry.block.TriplePlaneSymmetryBlock; @@ -45,6 +46,7 @@ import com.simibubi.create.modules.logistics.block.RedstoneBridgeBlock; import com.simibubi.create.modules.logistics.block.StockswitchBlock; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterBlock; import com.simibubi.create.modules.logistics.block.diodes.PulseRepeaterBlock; +import com.simibubi.create.modules.palettes.GlassPaneBlock; import com.simibubi.create.modules.schematics.block.CreativeCrateBlock; import com.simibubi.create.modules.schematics.block.SchematicTableBlock; import com.simibubi.create.modules.schematics.block.SchematicannonBlock; @@ -56,6 +58,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.FallingBlock; import net.minecraft.block.FenceBlock; import net.minecraft.block.FenceGateBlock; +import net.minecraft.block.GlassBlock; import net.minecraft.block.RotatedPillarBlock; import net.minecraft.block.SlabBlock; import net.minecraft.block.WallBlock; @@ -127,11 +130,15 @@ public enum AllBlocks { SYMMETRY_PLANE(new PlaneSymmetryBlock()), SYMMETRY_CROSSPLANE(new CrossPlaneSymmetryBlock()), SYMMETRY_TRIPLEPLANE(new TriplePlaneSymmetryBlock()), + WINDOW_IN_A_BLOCK(new WindowInABlockBlock()), __GARDENS__(), COCOA_LOG(new CocoaLogBlock()), __PALETTES__(), + TILED_GLASS(new GlassBlock(Properties.from(Blocks.GLASS))), + TILED_GLASS_PANE(new GlassPaneBlock(Properties.from(Blocks.GLASS))), + ANDESITE_BRICKS(new Block(Properties.from(Blocks.ANDESITE))), DIORITE_BRICKS(new Block(Properties.from(Blocks.DIORITE))), GRANITE_BRICKS(new Block(Properties.from(Blocks.GRANITE))), diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 23c98f515..57502af0a 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -2,22 +2,19 @@ package com.simibubi.create; import com.simibubi.create.foundation.item.IItemWithColorHandler; import com.simibubi.create.modules.IModule; +import com.simibubi.create.modules.contraptions.relays.VerticalGearboxItem; import com.simibubi.create.modules.contraptions.relays.belt.BeltItem; import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem; import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem; import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItemRenderer; -import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunModel; import com.simibubi.create.modules.curiosities.symmetry.SymmetryWandItem; import com.simibubi.create.modules.curiosities.symmetry.client.SymmetryWandItemRenderer; -import com.simibubi.create.modules.curiosities.symmetry.client.SymmetryWandModel; import com.simibubi.create.modules.gardens.TreeFertilizerItem; import com.simibubi.create.modules.schematics.item.SchematicAndQuillItem; import com.simibubi.create.modules.schematics.item.SchematicItem; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.color.ItemColors; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.item.Item; import net.minecraft.item.Item.Properties; @@ -25,8 +22,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Rarity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.registries.IForgeRegistry; @@ -76,6 +71,7 @@ public enum AllItems { __CONTRAPTIONS__(), BELT_CONNECTOR(new BeltItem(standardItemProperties())), + VERTICAL_GEARBOX(new VerticalGearboxItem(new Properties())), FLOUR(ingredient()), DOUGH(ingredient()), PROPELLER(ingredient()), @@ -163,21 +159,4 @@ public enum AllItems { } } - @SubscribeEvent - @OnlyIn(Dist.CLIENT) - public static void onModelBake(ModelBakeEvent event) { - - ModelResourceLocation wandLocation = getModelLocation(SYMMETRY_WAND); - IBakedModel template = event.getModelRegistry().get(wandLocation); - event.getModelRegistry().put(wandLocation, new SymmetryWandModel(template).loadPartials(event)); - - ModelResourceLocation handgunLocation = getModelLocation(PLACEMENT_HANDGUN); - template = event.getModelRegistry().get(handgunLocation); - event.getModelRegistry().put(handgunLocation, new BuilderGunModel(template).loadPartials(event)); - } - - protected static ModelResourceLocation getModelLocation(AllItems item) { - return new ModelResourceLocation(item.item.getRegistryName(), "inventory"); - } - } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index ebe559444..966e1955e 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -29,6 +29,7 @@ import com.simibubi.create.modules.contraptions.relays.ShaftTileEntity; import com.simibubi.create.modules.contraptions.relays.SplitShaftTileEntityRenderer; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntityRenderer; +import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; import com.simibubi.create.modules.logistics.block.BeltFunnelTileEntity; import com.simibubi.create.modules.logistics.block.EntityDetectorTileEntity; import com.simibubi.create.modules.logistics.block.EntityDetectorTileEntityRenderer; @@ -94,6 +95,9 @@ public enum AllTileEntities { BELT_FUNNEL(BeltFunnelTileEntity::new, AllBlocks.BELT_FUNNEL), ENTITY_DETECTOR(EntityDetectorTileEntity::new, AllBlocks.ENTITY_DETECTOR), FLEXPEATER(FlexpeaterTileEntity::new, AllBlocks.FLEXPEATER), + + // Curiosities + WINDOW_IN_A_BLOCK(WindowInABlockTileEntity::new, AllBlocks.WINDOW_IN_A_BLOCK), ; diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index ac61442de..6fdf530b7 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -28,7 +28,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.1.0"; + public static final String VERSION = "0.1.1"; public static Logger logger = LogManager.getLogger(); public static ItemGroup creativeTab = new CreateItemGroup(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 8ed54062d..1b1323e44 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,15 +1,29 @@ package com.simibubi.create; +import java.util.Map; +import java.util.function.Function; + import com.simibubi.create.modules.contraptions.CachedBufferReloader; import com.simibubi.create.modules.contraptions.receivers.EncasedFanParticleHandler; +import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockModel; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunModel; +import com.simibubi.create.modules.curiosities.symmetry.client.SymmetryWandModel; import com.simibubi.create.modules.schematics.ClientSchematicLoader; import com.simibubi.create.modules.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.modules.schematics.client.SchematicHandler; import com.simibubi.create.modules.schematics.client.SchematicHologram; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockModelShapes; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; @@ -61,4 +75,40 @@ public class CreateClient { schematicHologram.tick(); } + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void onModelBake(ModelBakeEvent event) { + Map modelRegistry = event.getModelRegistry(); + + swapModels(modelRegistry, getItemModelLocation(AllItems.SYMMETRY_WAND), + t -> new SymmetryWandModel(t).loadPartials(event)); + swapModels(modelRegistry, getItemModelLocation(AllItems.PLACEMENT_HANDGUN), + t -> new BuilderGunModel(t).loadPartials(event)); + swapModels(modelRegistry, + getBlockModelLocation(AllBlocks.WINDOW_IN_A_BLOCK, + BlockModelShapes + .getPropertyMapString(AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState().getValues())), + WindowInABlockModel::new); + swapModels(modelRegistry, + getBlockModelLocation(AllBlocks.WINDOW_IN_A_BLOCK, + BlockModelShapes.getPropertyMapString(AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState() + .with(BlockStateProperties.WATERLOGGED, true).getValues())), + WindowInABlockModel::new); + + } + + protected static ModelResourceLocation getItemModelLocation(AllItems item) { + return new ModelResourceLocation(item.item.getRegistryName(), "inventory"); + } + + protected static ModelResourceLocation getBlockModelLocation(AllBlocks block, String suffix) { + return new ModelResourceLocation(block.block.getRegistryName(), suffix); + } + + @OnlyIn(Dist.CLIENT) + protected static void swapModels(Map modelRegistry, + ModelResourceLocation location, Function factory) { + modelRegistry.put(location, factory.apply(modelRegistry.get(location))); + } + } diff --git a/src/main/java/com/simibubi/create/CreateConfig.java b/src/main/java/com/simibubi/create/CreateConfig.java index 5823c6067..792214ec7 100644 --- a/src/main/java/com/simibubi/create/CreateConfig.java +++ b/src/main/java/com/simibubi/create/CreateConfig.java @@ -48,6 +48,7 @@ public class CreateConfig { // Curiosities public IntValue maxSymmetryWandRange; + public BooleanValue allowGlassPanesInPartialBlocks; // Contraptions public IntValue maxBeltLength, crushingDamage, maxMotorSpeed, maxRotationSpeed; @@ -254,6 +255,10 @@ public class CreateConfig { .comment("", "The Maximum Distance to an active mirror for the symmetry wand to trigger.") .translation(basePath + name).defineInRange(name, 50, 10, Integer.MAX_VALUE); + name = "allowGlassPanesInPartialBlocks"; + allowGlassPanesInPartialBlocks = builder.comment("", "Allow Glass Panes to be put inside Blocks like Stairs, Slabs, Fences etc.") + .translation(basePath + name).define(name, true); + builder.pop(); } diff --git a/src/main/java/com/simibubi/create/Events.java b/src/main/java/com/simibubi/create/Events.java index b45da129d..368b1c013 100644 --- a/src/main/java/com/simibubi/create/Events.java +++ b/src/main/java/com/simibubi/create/Events.java @@ -1,9 +1,25 @@ package com.simibubi.create; +import java.util.Arrays; + +import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FourWayBlock; +import net.minecraft.block.WallBlock; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.Tags; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock; import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.eventbus.api.Event.Result; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; @@ -15,15 +31,15 @@ public class Events { public static void onTick(ServerTickEvent event) { if (event.phase == Phase.START) return; - + Create.tick(); } - + @SubscribeEvent public static void onClose(FMLServerStoppingEvent event) { Create.shutdown(); } - + @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { IWorld world = event.getWorld(); @@ -37,5 +53,58 @@ public class Events { Create.frequencyHandler.onUnloadWorld(world); Create.constructHandler.onUnloadWorld(world); } - + + @SubscribeEvent + public static void onRightClickBlock(RightClickBlock event) { + if (event.getUseItem() == Result.DENY) + return; + if (event.getEntityLiving().isSneaking()) + return; + if (!event.getPlayer().isAllowEdit()) + return; + if (!CreateConfig.parameters.allowGlassPanesInPartialBlocks.get()) + return; + + ItemStack stack = event.getItemStack(); + if (stack.isEmpty()) + return; + if (!stack.getItem().isIn(Tags.Items.GLASS_PANES)) + return; + if (!(stack.getItem() instanceof BlockItem)) + return; + + BlockPos pos = event.getPos(); + World world = event.getWorld(); + BlockState blockState = world.getBlockState(pos); + if (!AllBlockTags.WINDOWABLE.matches(blockState)) + return; + if (AllBlocks.WINDOW_IN_A_BLOCK.typeOf(blockState)) + return; + + world.setBlockState(pos, AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState()); + TileEntity te = world.getTileEntity(pos); + if (te != null && te instanceof WindowInABlockTileEntity) { + WindowInABlockTileEntity wte = (WindowInABlockTileEntity) te; + wte.setWindowBlock(((BlockItem) stack.getItem()).getBlock().getDefaultState()); + wte.updateWindowConnections(); + + if (blockState.getBlock() instanceof FourWayBlock) { + for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, + FourWayBlock.WEST)) + blockState = blockState.with(side, false); + } + if (blockState.getBlock() instanceof WallBlock) + blockState = blockState.with(WallBlock.UP, true); + + wte.setPartialBlock(blockState); + wte.requestModelDataUpdate(); + + if (!event.getPlayer().isCreative()) + stack.shrink(1); + event.getPlayer().swingArm(event.getHand()); + } + + event.setCanceled(true); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java b/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java index 317644539..8dcc922fe 100644 --- a/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java @@ -4,6 +4,7 @@ import java.util.function.Consumer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; public interface IWithTileEntity { @@ -16,4 +17,12 @@ public interface IWithTileEntity { action.accept(te); } + default T getTileEntity(IBlockReader world, BlockPos pos) { + @SuppressWarnings("unchecked") + T te = (T) world.getTileEntity(pos); + if (te == null) + return null; + return te; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/TranslationConstruct.java b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/TranslationConstruct.java index 7250a6e25..0603e50cc 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/TranslationConstruct.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/TranslationConstruct.java @@ -294,20 +294,24 @@ public class TranslationConstruct { if (direction != movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1)) continue; - // Skip if pushed column ended already (Except for Relocating Chassis) + // Skip if pushed column ended already if (!currentPos.equals(currentChassisPos)) { + + // Don't pull if not sticky + if (!chassisSticky && !pushing) + continue; + for (BlockPos p = currentPos; !p.equals(currentChassisPos); p = p.offset(direction.getOpposite())) { BlockState blockState = world.getBlockState(p); - - if (!chassisSticky && (blockState.getMaterial().isReplaceable() - || blockState.isAir(world, currentPos))) { + + if (!chassisSticky + && (blockState.getMaterial().isReplaceable() || blockState.isAir(world, currentPos))) { continue Search; } - + if (!pushing && chassisSticky && !canPush(world, p, movementDirection)) { continue Search; } - } } @@ -318,7 +322,7 @@ public class TranslationConstruct { // Structure is immobile if (pushing && !canPush(world, currentPos, movementDirection)) return null; - if (!pushing && !canPull(world, currentPos, movementDirection)) + if (!pushing && !canPull(world, currentPos, movementDirection)) continue; CompoundNBT nbt = new CompoundNBT(); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/GearboxBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/GearboxBlock.java index 8e561381a..9ffa7a231 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/GearboxBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/GearboxBlock.java @@ -1,19 +1,27 @@ package com.simibubi.create.modules.contraptions.relays; -import com.simibubi.create.modules.contraptions.base.IRotate; +import java.util.Arrays; +import java.util.List; + +import com.simibubi.create.AllItems; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.material.PushReaction; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import net.minecraft.world.storage.loot.LootContext.Builder; public class GearboxBlock extends RotatedPillarKineticBlock { @@ -31,50 +39,31 @@ public class GearboxBlock extends RotatedPillarKineticBlock { return PushReaction.PUSH_ONLY; } + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) { + super.fillItemGroup(group, items); + items.add(new ItemStack(AllItems.VERTICAL_GEARBOX.get())); + } + + @SuppressWarnings("deprecation") + @Override + public List getDrops(BlockState state, Builder builder) { + if (state.get(AXIS).isVertical()) + return super.getDrops(state, builder); + return Arrays.asList(new ItemStack(AllItems.VERTICAL_GEARBOX.get())); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + if (state.get(AXIS).isVertical()) + return super.getPickBlock(state, target, world, pos, player); + return new ItemStack(AllItems.VERTICAL_GEARBOX.get()); + } + @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockState placedOnState = context.getWorld() - .getBlockState(context.getPos().offset(context.getFace().getOpposite())); - Block placedOn = placedOnState.getBlock(); - - if (!(placedOn instanceof IRotate) || !((IRotate) placedOn).hasShaftTowards(context.getWorld(), - context.getPos(), placedOnState, context.getFace())) - return getDefaultState().with(AXIS, context.getFace().getAxis()); - - Axis badAxis = context.getFace().getAxis(); - Axis otherBadAxis = null; - - for (Direction side : Direction.values()) { - if (side.getAxis() == badAxis) - continue; - - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); - if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side), - blockState, side.getOpposite())) - if (otherBadAxis != null && otherBadAxis != side.getAxis()) { - otherBadAxis = null; - break; - } else { - otherBadAxis = side.getAxis(); - } - } - } - - boolean skipped = false; - for (Axis axis : Axis.values()) { - if (axis == badAxis) - continue; - if (!skipped && context.isPlacerSneaking() && (otherBadAxis == null || badAxis == null)) { - skipped = true; - continue; - } - if (axis == otherBadAxis) - continue; - return getDefaultState().with(AXIS, axis); - } - - return super.getStateForPlacement(context); + return getDefaultState().with(AXIS, Axis.Y); } // IRotate: diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/VerticalGearboxItem.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/VerticalGearboxItem.java new file mode 100644 index 000000000..9fad762dc --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/VerticalGearboxItem.java @@ -0,0 +1,47 @@ +package com.simibubi.create.modules.contraptions.relays; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.modules.contraptions.base.IRotate; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class VerticalGearboxItem extends BlockItem { + + public VerticalGearboxItem(Properties builder) { + super(AllBlocks.GEARBOX.get(), builder); + } + + @Override + protected boolean onBlockPlaced(BlockPos pos, World world, PlayerEntity player, ItemStack stack, BlockState state) { + Axis prefferedAxis = null; + for (Direction side : Direction.values()) { + if (side.getAxis().isVertical()) + continue; + BlockState blockState = world.getBlockState(pos.offset(side)); + if (blockState.getBlock() instanceof IRotate) { + if (((IRotate) blockState.getBlock()).hasShaftTowards(world, pos.offset(side), blockState, + side.getOpposite())) + if (prefferedAxis != null && prefferedAxis != side.getAxis()) { + prefferedAxis = null; + break; + } else { + prefferedAxis = side.getAxis(); + } + } + } + + Axis axis = prefferedAxis == null ? player.getHorizontalFacing().rotateY().getAxis() + : prefferedAxis == Axis.X ? Axis.Z : Axis.X; + world.setBlockState(pos, state.with(BlockStateProperties.AXIS, axis)); + return super.onBlockPlaced(pos, world, player, stack, state); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java new file mode 100644 index 000000000..1b5b76059 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java @@ -0,0 +1,220 @@ +package com.simibubi.create.modules.curiosities.partialWindows; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.IWithoutBlockItem; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FourWayBlock; +import net.minecraft.block.PaneBlock; +import net.minecraft.block.material.Material; +import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceContext.BlockMode; +import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraft.world.storage.loot.LootContext.Builder; +import net.minecraft.world.storage.loot.LootParameters; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class WindowInABlockBlock extends PaneBlock + implements IWithTileEntity, IWithoutBlockItem { + + public WindowInABlockBlock() { + super(Properties.create(Material.ROCK)); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return new WindowInABlockTileEntity(); + } + + @Override + public boolean removedByPlayer(BlockState state, World world, BlockPos pos, PlayerEntity player, + boolean willHarvest, IFluidState fluid) { + if (player == null) + return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); + + Vec3d start = player.getEyePosition(1); + Vec3d end = start.add(player.getLookVec().scale(player.getAttribute(PlayerEntity.REACH_DISTANCE).getValue())); + BlockRayTraceResult target = world + .rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player)); + if (target == null || target.getHitVec() == null) + return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); + + WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); + if (tileEntity == null) + return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); + BlockState windowBlock = tileEntity.getWindowBlock(); + for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) { + if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) { + windowBlock.getBlock().onBlockHarvested(world, pos, windowBlock, player); + Block.spawnDrops(windowBlock, world, pos, null, player, player.getHeldItemMainhand()); + BlockState partialBlock = tileEntity.getPartialBlock(); + world.setBlockState(pos, partialBlock); + for (Direction d : Direction.values()) { + BlockPos offset = pos.offset(d); + BlockState otherState = world.getBlockState(offset); + partialBlock = partialBlock.updatePostPlacement(d, otherState, world, pos, offset); + world.notifyBlockUpdate(offset, otherState, otherState, 2); + } + if (partialBlock != world.getBlockState(pos)) + world.setBlockState(pos, partialBlock); + return false; + } + } + + return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); + } + + @Override + public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { + return true; + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext useContext) { + return false; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + WindowInABlockTileEntity tileEntity = getTileEntity(reader, pos); + if (tileEntity == null) + return super.propagatesSkylightDown(state, reader, pos); + return tileEntity.getPartialBlock().propagatesSkylightDown(reader, pos); + } + + @Override + public boolean collisionExtendsVertically(BlockState state, IBlockReader world, BlockPos pos, + Entity collidingEntity) { + WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); + if (tileEntity == null) + return false; + return tileEntity.getPartialBlock().collisionExtendsVertically(world, pos, collidingEntity); + } + + @Override + public float getBlockHardness(BlockState blockState, IBlockReader worldIn, BlockPos pos) { + WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); + if (tileEntity == null) + return 0; + return tileEntity.getPartialBlock().getBlockHardness(worldIn, pos); + } + + @Override + public float getExplosionResistance(BlockState state, IWorldReader world, BlockPos pos, Entity exploder, + Explosion explosion) { + WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); + if (tileEntity == null) + return 0; + return tileEntity.getPartialBlock().getExplosionResistance(world, pos, exploder, explosion); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); + if (tileEntity == null) + return ItemStack.EMPTY; + for (AxisAlignedBB bb : tileEntity.getWindowBlock().getShape(world, pos).toBoundingBoxList()) { + if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) + return tileEntity.getWindowBlock().getPickBlock(target, world, pos, player); + } + return tileEntity.getPartialBlock().getPickBlock(target, world, pos, player); + } + + @Override + public List getDrops(BlockState state, Builder builder) { + TileEntity tileentity = builder.get(LootParameters.BLOCK_ENTITY); + if (!(tileentity instanceof WindowInABlockTileEntity)) + return Collections.emptyList(); + + WindowInABlockTileEntity te = (WindowInABlockTileEntity) tileentity; + List drops = te.getPartialBlock().getDrops(builder); + drops.addAll(te.getWindowBlock().getDrops(builder)); + return drops; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); + if (tileEntity == null) + return VoxelShapes.empty(); + VoxelShape shape1 = tileEntity.getPartialBlock().getShape(worldIn, pos, context); + VoxelShape shape2 = tileEntity.getWindowBlock().getShape(worldIn, pos, context); + return VoxelShapes.or(shape1, shape2); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, + ISelectionContext context) { + return getShape(state, worldIn, pos, context); + } + + @SuppressWarnings("deprecation") + @Override + public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) { + WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); + if (tileEntity == null) + return MaterialColor.AIR; + return tileEntity.getPartialBlock().getMaterialColor(worldIn, pos); + } + + @Override + public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, + BlockPos currentPos, BlockPos facingPos) { + withTileEntityDo(worldIn, currentPos, te -> { + te.setWindowBlock( + te.getWindowBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos)); + BlockState blockState = te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, + facingPos); + if (blockState.getBlock() instanceof FourWayBlock) { + for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, + FourWayBlock.WEST)) + blockState = blockState.with(side, false); + te.setPartialBlock(blockState); + } + te.requestModelDataUpdate(); + }); + + return stateIn; + } + + @OnlyIn(Dist.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java new file mode 100644 index 000000000..1a7203c27 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java @@ -0,0 +1,110 @@ +package com.simibubi.create.modules.curiosities.partialWindows; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +import com.simibubi.create.foundation.block.WrappedBakedModel; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelProperty; + +public class WindowInABlockModel extends WrappedBakedModel { + + public static final ModelProperty PARTIAL_BLOCK = new ModelProperty<>(); + public static final ModelProperty WINDOW_BLOCK = new ModelProperty<>(); + public static final ModelProperty POSITION = new ModelProperty<>(); + + public WindowInABlockModel(IBakedModel template) { + super(template); + } + + @Override + public List getQuads(BlockState state, Direction side, Random rand, IModelData data) { + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + BlockState partialState = data.getData(PARTIAL_BLOCK); + BlockState windowState = data.getData(WINDOW_BLOCK); + BlockPos position = data.getData(POSITION); + ClientWorld world = Minecraft.getInstance().world; + List quads = new ArrayList<>(); + + if (partialState == null || windowState == null) + return dispatcher.getModelForState(Blocks.DIRT.getDefaultState()).getQuads(state, side, rand, data); + + BlockRenderLayer renderLayer = MinecraftForgeClient.getRenderLayer(); + if (partialState.canRenderInLayer(renderLayer) && partialState != null) { + quads.addAll(dispatcher.getModelForState(partialState).getQuads(partialState, side, rand, data)); + } + if (windowState.canRenderInLayer(renderLayer) && windowState != null) { + quads.addAll(dispatcher.getModelForState(windowState).getQuads(windowState, side, rand, data).stream() + .filter(q -> { + Direction face = q.getFace(); + if (face != null && windowState.isSideInvisible(world.getBlockState(position), face)) + return false; + if (face != null && Block.hasSolidSide(partialState, world, position, face)) + return false; + + fightZfighting(q); + return true; + }).collect(Collectors.toList())); + } + + return quads; + } + + protected void fightZfighting(BakedQuad q) { + VertexFormat format = q.getFormat(); + int[] data = q.getVertexData(); + Vec3i vec = q.getFace().getDirectionVec(); + int dirX = vec.getX(); + int dirY = vec.getY(); + int dirZ = vec.getZ(); + + for (int i = 0; i < 4; ++i) { + int j = format.getIntegerSize() * i; + float x = Float.intBitsToFloat(data[j + 0]); + float y = Float.intBitsToFloat(data[j + 1]); + float z = Float.intBitsToFloat(data[j + 2]); + double offset = q.getFace().getAxis().getCoordinate(x, y, z); + + if (offset < 1 / 1024d || offset > 1023 / 1024d) { + data[j + 0] = Float.floatToIntBits(x - 1 / 512f * dirX); + data[j + 1] = Float.floatToIntBits(y - 1 / 512f * dirY); + data[j + 2] = Float.floatToIntBits(z - 1 / 512f * dirZ); + } + + } + } + + @Override + public TextureAtlasSprite getParticleTexture(IModelData data) { + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + BlockState partialState = data.getData(PARTIAL_BLOCK); + if (partialState == null) + return super.getParticleTexture(data); + return dispatcher.getModelForState(partialState).getParticleTexture(data); + } + + @Override + public boolean isAmbientOcclusion() { + BlockRenderLayer renderLayer = MinecraftForgeClient.getRenderLayer(); + return renderLayer == BlockRenderLayer.SOLID; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java new file mode 100644 index 000000000..0a5ca65bf --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java @@ -0,0 +1,83 @@ +package com.simibubi.create.modules.curiosities.partialWindows; + +import static com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockModel.PARTIAL_BLOCK; +import static com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockModel.WINDOW_BLOCK; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.SyncedTileEntity; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; + +public class WindowInABlockTileEntity extends SyncedTileEntity { + + private BlockState partialBlock = Blocks.AIR.getDefaultState(); + private BlockState windowBlock = Blocks.AIR.getDefaultState(); + private IModelData modelData; + + public WindowInABlockTileEntity() { + super(AllTileEntities.WINDOW_IN_A_BLOCK.type); + modelData = new ModelDataMap.Builder().withInitial(WINDOW_BLOCK, Blocks.AIR.getDefaultState()) + .withInitial(PARTIAL_BLOCK, Blocks.AIR.getDefaultState()) + .withInitial(WindowInABlockModel.POSITION, BlockPos.ZERO).build(); + } + + @Override + public void read(CompoundNBT compound) { + partialBlock = NBTUtil.readBlockState(compound.getCompound("PartialBlock")); + windowBlock = NBTUtil.readBlockState(compound.getCompound("WindowBlock")); + super.read(compound); + } + + @Override + public void readClientUpdate(CompoundNBT tag) { + super.readClientUpdate(tag); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + compound.put("PartialBlock", NBTUtil.writeBlockState(getPartialBlock())); + compound.put("WindowBlock", NBTUtil.writeBlockState(getWindowBlock())); + return super.write(compound); + } + + public void updateWindowConnections() { + for (Direction side : Direction.values()) { + BlockPos offsetPos = pos.offset(side); + windowBlock = getWindowBlock().updatePostPlacement(side, world.getBlockState(offsetPos), world, pos, + offsetPos); + } + sendData(); + markDirty(); + } + + @Override + public IModelData getModelData() { + modelData.setData(WindowInABlockModel.PARTIAL_BLOCK, partialBlock); + modelData.setData(WindowInABlockModel.WINDOW_BLOCK, windowBlock); + modelData.setData(WindowInABlockModel.POSITION, pos); + return modelData; + } + + public BlockState getPartialBlock() { + return partialBlock; + } + + public void setPartialBlock(BlockState partialBlock) { + this.partialBlock = partialBlock; + } + + public BlockState getWindowBlock() { + return windowBlock; + } + + public void setWindowBlock(BlockState windowBlock) { + this.windowBlock = windowBlock; + } +} diff --git a/src/main/java/com/simibubi/create/modules/palettes/GlassPaneBlock.java b/src/main/java/com/simibubi/create/modules/palettes/GlassPaneBlock.java new file mode 100644 index 000000000..b44ab46a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/palettes/GlassPaneBlock.java @@ -0,0 +1,11 @@ +package com.simibubi.create.modules.palettes; + +import net.minecraft.block.PaneBlock; + +public class GlassPaneBlock extends PaneBlock { + + public GlassPaneBlock(Properties builder) { + super(builder); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java index eec8e7a55..5b7141296 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java @@ -165,17 +165,17 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka this(AllTileEntities.SCHEMATICANNON.type); } - @Override - public double getMaxRenderDistanceSquared() { - return 65536.0D; - } - - @OnlyIn(Dist.CLIENT) @Override public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; } - + + @Override + @OnlyIn(Dist.CLIENT) + public double getMaxRenderDistanceSquared() { + return super.getMaxRenderDistanceSquared() * 16; + } + public SchematicannonTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); attachedInventories = new LinkedList<>(); diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 568994456..ced147a9a 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -4,7 +4,7 @@ loaderVersion="[28,)" [[mods]] modId="create" -version="0.1.0" +version="0.1.1" displayName="Create" #updateJSONURL="" authors="simibubi" diff --git a/src/main/resources/assets/create/blockstates/tiled_glass.json b/src/main/resources/assets/create/blockstates/tiled_glass.json new file mode 100644 index 000000000..cc94eebd7 --- /dev/null +++ b/src/main/resources/assets/create/blockstates/tiled_glass.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "create:block/palettes/tiled_glass" } + } +} diff --git a/src/main/resources/assets/create/blockstates/tiled_glass_pane.json b/src/main/resources/assets/create/blockstates/tiled_glass_pane.json new file mode 100644 index 000000000..d26d11966 --- /dev/null +++ b/src/main/resources/assets/create/blockstates/tiled_glass_pane.json @@ -0,0 +1,29 @@ +{ + "multipart": [ + { "apply": { "model": "create:block/palettes/tiled_glass_pane_post" }}, + { "when": { "north": true }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_side" } + }, + { "when": { "east": true }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_side", "y": 90 } + }, + { "when": { "south": true }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_side_alt" } + }, + { "when": { "west": true }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_side_alt", "y": 90 } + }, + { "when": { "north": false }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_noside" } + }, + { "when": { "east": false }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_noside_alt" } + }, + { "when": { "south": false }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_noside_alt", "y": 90 } + }, + { "when": { "west": false }, + "apply": { "model": "create:block/palettes/tiled_glass_pane_noside", "y": 270 } + } + ] +} diff --git a/src/main/resources/assets/create/blockstates/window_in_a_block.json b/src/main/resources/assets/create/blockstates/window_in_a_block.json new file mode 100644 index 000000000..3d80c1594 --- /dev/null +++ b/src/main/resources/assets/create/blockstates/window_in_a_block.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "block/air" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index 0b58c7fe8..a1d85e7c8 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -76,6 +76,10 @@ "block.create.flexpeater": "FlexPeater", "block.create.entity_detector": "Belt Observer", + "block.create.tiled_glass": "Tiled Glass", + "block.create.tiled_glass_pane": "Tiled Glass Pane", + + "block.create.window_in_a_block": "Block with Glass Pane", "block.create.andesite_bricks": "Andesite Bricks", "block.create.diorite_bricks": "Diorite Bricks", "block.create.granite_bricks": "Granite Bricks", diff --git a/src/main/resources/assets/create/lang/zh_cn.json b/src/main/resources/assets/create/lang/zh_cn.json new file mode 100644 index 000000000..d8ee57168 --- /dev/null +++ b/src/main/resources/assets/create/lang/zh_cn.json @@ -0,0 +1,601 @@ +{ + + "_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------", + + "item.create.symmetry_wand": "对称法杖", + "item.create.placement_handgun": "手持式方块放置器", + "item.create.tree_fertilizer": "树木肥料", + "item.create.empty_blueprint": "空白原理图", + "item.create.andesite_alloy_cube": "安山合金", + "item.create.blaze_brass_cube": "烈焰合金", + "item.create.chorus_chrome_cube": "紫颂合金", + "item.create.chromatic_compound_cube": "Chromatic Compound", + "item.create.shadow_steel_cube": "Shadow Steel", + "item.create.blueprint_and_quill": "原理图与笔", + "item.create.blueprint": "原理图", + "item.create.belt_connector": "传送带", + "item.create.filter": "Filter", + "item.create.rose_quartz": "Rose Quartz", + "item.create.refined_rose_quartz": "Refined Rose Quartz", + "item.create.refined_radiance_cube": "Refined Radiance", + "item.create.iron_sheet": "铁板", + "item.create.gold_sheet": "金板", + "item.create.propeller": "扇叶", + "item.create.flour": "小麦粉", + "item.create.dough": "面团", + + "item.create.blazing_pickaxe": "Blazing Pickaxe", + "item.create.blazing_shovel": "Blazing Shovel", + "item.create.blazing_axe": "Blazing Axe", + "item.create.blazing_sword": "Blazing Longsword", + + "item.create.shadow_steel_pickaxe": "Shadow Steel Pickaxe", + "item.create.shadow_steel_mattock": "Shadow Steel Garden Mattock", + "item.create.shadow_steel_sword": "Shadow Steel Sword", + + "item.create.rose_quartz_pickaxe": "Gilded Quartz Pickaxe", + "item.create.rose_quartz_shovel": "Gilded Quartz Shovel", + "item.create.rose_quartz_axe": "Gilded Quartz Axe", + "item.create.rose_quartz_sword": "Gilded Quartz Blade", + + "block.create.cogwheel": "齿轮", + "block.create.large_cogwheel": "大齿轮", + "block.create.turntable": "转盘", + "block.create.gearbox": "十字齿轮箱", + "block.create.gearshift": "红石齿轮箱", + "block.create.clutch": "离合器", + "block.create.shaft": "传动杆", + "block.create.encased_belt": "连携齿轮箱", + "block.create.encased_shaft": "齿轮箱", + "block.create.encased_fan": "鼓风机", + "block.create.motor": "动力马达", + "block.create.belt": "Mechanical Belt", + "block.create.crushing_wheel": "粉碎轮", + "block.create.drill": "动力钻头", + "block.create.harvester": "收割机", + "block.create.water_wheel": "水车", + "block.create.belt_support": "传送带支撑", + "block.create.mechanical_press": "辊压机", + + "block.create.sticky_mechanical_piston": "粘性动力活塞", + "block.create.mechanical_piston": "动力活塞", + "block.create.mechanical_piston_head": "Mechanical Piston Head", + "block.create.piston_pole": "活塞杆", + "block.create.mechanical_bearing": "动力轴承", + "block.create.translation_chassis": "机壳底盘", + "block.create.rotation_chassis": "旋转底盘", + + "block.create.contact": "信号检测器", + "block.create.redstone_bridge": "无线红石信号终端", + "block.create.stockswitch": "存储检测器", + "block.create.flexcrate": "板条箱", + "block.create.extractor": "提取器", + "block.create.belt_funnel": "传送带漏斗", + "block.create.linked_extractor": "无线提取器", + "block.create.pulse_repeater": "脉冲中继器", + "block.create.flexpeater": "高级中继器", + "block.create.entity_detector": "传送带观察者", + + "block.create.andesite_bricks": "安山岩石砖", + "block.create.diorite_bricks": "闪长岩石砖", + "block.create.granite_bricks": "花岗岩石砖", + + "block.create.gabbro": "辉长岩", + "block.create.gabbro_stairs": "辉长岩楼梯", + "block.create.gabbro_slab": "辉长岩台阶", + "block.create.gabbro_wall": "辉长岩墙", + "block.create.polished_gabbro": "磨制辉长岩", + "block.create.gabbro_bricks": "辉长岩石砖", + "block.create.gabbro_bricks_stairs": "辉长岩石砖楼梯", + "block.create.gabbro_bricks_wall": "辉长岩石砖墙", + "block.create.paved_gabbro_bricks": "辉长岩砖块", + "block.create.paved_gabbro_bricks_slab": "辉长岩砖块台阶", + "block.create.indented_gabbro": "平滑辉长岩石砖", + "block.create.indented_gabbro_slab": "平滑辉长岩石砖台阶", + "block.create.slightly_mossy_gabbro_bricks": "辉长岩苔石砖", + "block.create.mossy_gabbro_bricks": "辉长岩苔藓石砖", + + "block.create.weathered_limestone": "风化石灰石", + "block.create.weathered_limestone_stairs": "风化石灰石楼梯", + "block.create.weathered_limestone_wall": "风化石灰石墙", + "block.create.weathered_limestone_slab": "风化石灰石台阶", + "block.create.polished_weathered_limestone": "磨制风化 石灰石", + "block.create.polished_weathered_limestone_slab": "磨制风化石灰石台阶", + "block.create.weathered_limestone_bricks": "风化石灰石砖", + "block.create.weathered_limestone_bricks_stairs": "风化石灰石砖楼梯", + "block.create.weathered_limestone_bricks_wall": "风化石灰石砖墙", + "block.create.weathered_limestone_bricks_slab": "风化石灰石砖台阶", + "block.create.weathered_limestone_pillar": "风化石灰石柱", + + "block.create.dolomite_pillar": "白云岩柱", + "block.create.dolomite": "白云岩", + "block.create.dolomite_stairs": "白云岩楼梯", + "block.create.dolomite_wall": "白云岩墙", + "block.create.dolomite_slab": "白云岩台阶", + "block.create.dolomite_bricks": "白云岩石砖", + "block.create.dolomite_bricks_wall": "白云岩石砖墙", + "block.create.dolomite_bricks_stairs": "白云岩石砖楼梯", + "block.create.dolomite_bricks_slab": "白云岩石砖台阶", + "block.create.polished_dolomite": "磨制白云岩", + + "block.create.limestone": "石灰石", + "block.create.limestone_stairs": "石灰石楼梯", + "block.create.limestone_slab": "石灰石台阶", + "block.create.limestone_wall": "石灰石墙", + "block.create.limestone_bricks": "石灰石砖", + "block.create.limestone_bricks_stairs": "石灰石砖楼梯", + "block.create.limestone_bricks_slab": "石灰石砖台阶", + "block.create.limestone_bricks_wall": "石灰石砖墙", + "block.create.polished_limestone": "磨制石灰石", + "block.create.polished_limestone_slab": "磨制石灰石台阶", + "block.create.limestone_pillar": "石灰石柱", + + "block.create.schematicannon": "加农炮", + "block.create.schematic_table": "Schematic桌", + "block.create.creative_crate": "Schematic创造者", + + "block.create.cocoa_log": "可可木", + + "block.create.shop_shelf": "Shelf", + + "_comment": "-------------------------] UI & MESSAGES [------------------------------------------------", + + "death.attack.create.crush": "%1$s 被压扁了", + "death.attack.create.fan_fire": "%1$s 试图接受热风的洗礼", + "death.attack.create.fan_lava": "%1$s 在接受热风的洗礼中欲火焚身", + "death.attack.create.drill": "%1$s 的钻头是突破天际的钻头", + + "create.recipe.crushing": "批量粉碎", + "create.recipe.splashing": "批量洗涤", + "create.recipe.splashing.fan": "在鼓风机前方倒水", + "create.recipe.smokingViaFan": "批量烟熏", + "create.recipe.smokingViaFan.fan": "在鼓风机前方点火", + "create.recipe.blastingViaFan": "批量冶炼", + "create.recipe.blastingViaFan.fan": "在鼓风机前方倒岩浆", + "create.recipe.pressing": "金属成型机", + "create.recipe.blockzapperUpgrade": "手持式方块放置器", + "create.recipe.processing.chance": "%1$s%% 概率", + + "create.generic.range": "范围", + "create.generic.radius": "半径", + "create.generic.speed": "速度", + "create.generic.delay": "延时", + "create.generic.unit.ticks": "Ticks", + "create.generic.unit.seconds": "Seconds", + "create.generic.unit.minutes": "Minutes", + + "create.action.scroll": "滚轮", + "create.action.confirm": "确认", + "create.action.abort": "退出", + "create.action.saveToFile": "保存", + "create.action.discard": "丢弃", + + "create.keyinfo.toolmenu": "工具菜单", + + "create.gui.scrollInput.defaultTitle": "选择一个选项:", + "create.gui.scrollInput.scrollToModify": "滚动修改", + "create.gui.scrollInput.scrollToSelect": "滚动选择", + "create.gui.scrollInput.shiftScrollsFaster": "潜行时滚动更快", + + "create.gui.toolmenu.focusKey": "按住 [%1$s] 鼠标滚轮选择", + "create.gui.toolmenu.cycle": "[SCROLL] 循环", + + "create.gui.symmetryWand.mirrorType": "镜子类型", + "create.gui.symmetryWand.orientation": "方向", + "create.symmetry.mirror.plane": "镜像", + "create.symmetry.mirror.doublePlane": "矩形", + "create.symmetry.mirror.triplePlane": "八角", + "create.orientation.orthogonal": "垂直", + "create.orientation.diagonal": "对角线", + "create.orientation.horizontal": "水平", + "create.orientation.alongZ": "Along Z", + "create.orientation.alongX": "Along X", + + "create.gui.blockzapper.title": "手持式方块放置机", + "create.gui.blockzapper.replaceMode": "更换模式", + "create.gui.blockzapper.searchDiagonal": "根据对角线", + "create.gui.blockzapper.searchFuzzy": "忽视边界", + "create.gui.blockzapper.range": "扩散范围", + "create.gui.blockzapper.patternSection": "模式", + "create.gui.blockzapper.pattern.solid": "实心", + "create.gui.blockzapper.pattern.checkered": "棋盘", + "create.gui.blockzapper.pattern.inversecheckered": "反转棋盘", + "create.gui.blockzapper.pattern.chance25": "25% ", + "create.gui.blockzapper.pattern.chance50": "50% ", + "create.gui.blockzapper.pattern.chance75": "75% ", + + "create.blockzapper.usingBlock": "使用: %1$s", + "create.blockzapper.componentUpgrades": "组件升级:", + "create.blockzapper.component.body": "机体", + "create.blockzapper.component.amplifier": "增大", + "create.blockzapper.component.accelerator": "加速", + "create.blockzapper.component.retriever": "寻回", + "create.blockzapper.component.scope": "范围", + "create.blockzapper.componentTier.none": "无", + "create.blockzapper.componentTier.blazebrass": "烈焰合金", + "create.blockzapper.componentTier.choruschrome": "紫颂合金", + "create.blockzapper.leftClickToSet": "左键点击方块以设定方块", + "create.blockzapper.empty": "出击!", + + "create.logistics.filter": "过滤器", + "create.logistics.firstFrequency": "频道. #1", + "create.logistics.secondFrequency": "频道. #2", + + "create.gui.flexcrate.title": "板条箱", + "create.gui.flexcrate.storageSpace": "储存空间", + + "create.gui.stockswitch.title": "储存开关", + "create.gui.stockswitch.lowerLimit": "阈值下限", + "create.gui.stockswitch.upperLimit": "阈值上限", + "create.gui.stockswitch.startAt": "启动信号", + "create.gui.stockswitch.startAbove": "Start Signal above", + "create.gui.stockswitch.stopAt": "停止信号", + "create.gui.stockswitch.stopBelow": "Stop Signal below", + + "create.schematicAndQuill.dimensions": "原理图尺寸: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "第一个位置.", + "create.schematicAndQuill.secondPos": "第二个位置.", + "create.schematicAndQuill.noTarget": "按住Ctrl选择空气方块.", + "create.schematicAndQuill.abort": "删除选择.", + "create.schematicAndQuill.prompt": "输入原理图的名称:", + "create.schematicAndQuill.fallbackName": "我的原理图", + "create.schematicAndQuill.saved": "另存为 %1$s", + + "create.schematic.invalid": "[!] 无效的项目", + "create.schematic.position": "位置", + "create.schematic.rotation": "旋转", + "create.schematic.rotation.none": "无", + "create.schematic.rotation.cw90": "顺时针90", + "create.schematic.rotation.cw180": "顺时针180", + "create.schematic.rotation.cw270": "顺时针270", + "create.schematic.mirror": "镜像", + "create.schematic.mirror.none": "无", + "create.schematic.mirror.frontBack": "前后", + "create.schematic.mirror.leftRight": "左右", + + "create.schematic.tool.deploy": "部署", + "create.schematic.tool.move": "移动 XZ", + "create.schematic.tool.movey": "移动 Y", + "create.schematic.tool.rotate": "旋转", + "create.schematic.tool.print": "打印", + "create.schematic.tool.flip": "翻转", + + "create.schematic.tool.deploy.description.0": "将结构移到某个位置.", + "create.schematic.tool.deploy.description.1": "在地面上单击鼠标右键以放置.", + "create.schematic.tool.deploy.description.2": "按住Ctrl以固定距离选择.", + "create.schematic.tool.deploy.description.3": "按住Ctrl鼠标滚动更改距离.", + "create.schematic.tool.move.description.0": "水平移动原理图", + "create.schematic.tool.move.description.1": "选定原理图,然后按住Ctrl鼠标滚动移动.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "垂直移动原理图", + "create.schematic.tool.movey.description.1": "按住Ctrl鼠标滚动上下移动", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "围绕原理图中心旋转原理图.", + "create.schematic.tool.rotate.description.1": "按住Ctrl鼠标滚动旋转90度", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "立即将结构放置在世界上", + "create.schematic.tool.print.description.1": "右键单机确认当前位置.", + "create.schematic.tool.print.description.2": "该工具仅适用于创造模式.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "沿你选择的面翻转原理图.", + "create.schematic.tool.flip.description.1": "指向原理图,然后按住Ctrl鼠标滚动将其翻转.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "正在同步...", + "create.schematics.uploadTooLarge": "你的原理图太大", + "create.schematics.maxAllowedSize": "允许的最大原理图文件大小为:", + + "create.gui.schematicTable.title": "原理图桌", + "create.gui.schematicTable.availableSchematics": "可用原理图", + "create.gui.schematicTable.noSchematics": "没有保存的原理图", + "create.gui.schematicTable.uploading": "正在上传...", + "create.gui.schematicTable.finished": "上传完成!", + + "create.gui.schematicannon.title": "原理图加农炮", + "create.gui.schematicannon.settingsTitle": "放置设置", + "create.gui.schematicannon.listPrinter": "物品清单打印机", + "create.gui.schematicannon.gunpowderLevel": "火药 %1$s%%", + "create.gui.schematicannon.shotsRemaining": "发射进度: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "备份: %1$s", + "create.gui.schematicannon.optionEnabled": "当前启用", + "create.gui.schematicannon.optionDisabled": "当前禁用", + "create.gui.schematicannon.option.dontReplaceSolid": "不要替换实体方块", + "create.gui.schematicannon.option.replaceWithSolid": "用普通方块替换实体方块", + "create.gui.schematicannon.option.replaceWithAny": "用任何方块替换", + "create.gui.schematicannon.option.replaceWithEmpty": "用方块替换空气", + "create.gui.schematicannon.option.skipMissing": "绕过缺少的方块", + "create.gui.schematicannon.option.skipTileEntities": "保护存储方块", + + "create.gui.schematicannon.option.skipMissing.description": "如果原理图无法找到所需的放置块,它将在下一个位置继续(译者:看不懂可以直接看视频,因为我也看不懂...).", + "create.gui.schematicannon.option.skipTileEntities.description": "原理图将避免更换存储方块,如箱子.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "加农炮将永远不会替换工作范围内的任何实体方块.", + "create.gui.schematicannon.option.replaceWithSolid.description": "如果原理图在其工作范围内包含实体方块,则加农炮将仅替换实体方块.", + "create.gui.schematicannon.option.replaceWithAny.description": "如果原理图在其工作范围内包含任何块,则加农炮将替换实体方块.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "加农炮将清除其工作范围内的所有阻碍物,包括被空气取代的障碍.", + + "create.schematicannon.status.idle": "闲置", + "create.schematicannon.status.ready": "准备", + "create.schematicannon.status.running": "运行", + "create.schematicannon.status.finished": "完成", + "create.schematicannon.status.paused": "已暂停", + "create.schematicannon.status.stopped": "停止", + "create.schematicannon.status.noGunpowder": "Out of Gunpowder", + "create.schematicannon.status.targetNotLoaded": "方块未加载", + "create.schematicannon.status.targetOutsideRange": "定位目标太远", + "create.schematicannon.status.searching": "搜索", + "create.schematicannon.status.skipping": "跳过", + "create.schematicannon.status.missingBlock": "缺少方块:", + "create.schematicannon.status.placing": "配置", + "create.schematicannon.status.clearing": "清除方块", + "create.schematicannon.status.schematicInvalid": "原理图无效", + "create.schematicannon.status.schematicNotPlaced": "原理图未部署", + "create.schematicannon.status.schematicExpired": "原理图文件已过期", + + "create.tooltip.holdKey": "按住 [%1$s]", + "create.tooltip.holdKeyOrKey": "按住 [%1$s] 或 [%2$s]", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + + "_comment": "-------------------------] ITEM DESCRIPTIONS [------------------------------------------------", + + "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", + "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.symmetry_wand.tooltip": "SYMMETRY WAND", + "item.create.symmetry_wand.tooltip.summary": "完美地映射你在已配置平面上的方块放置.", + "item.create.symmetry_wand.tooltip.condition1": "当在热键栏时", + "item.create.symmetry_wand.tooltip.behaviour1": "保持活跃", + "item.create.symmetry_wand.tooltip.control1": "当右键地面时", + "item.create.symmetry_wand.tooltip.action1": "创建或移动镜子", + "item.create.symmetry_wand.tooltip.control2": "当右键空气时", + "item.create.symmetry_wand.tooltip.action2": "删除镜子", + "item.create.symmetry_wand.tooltip.control3": "当潜行右键时", + "item.create.symmetry_wand.tooltip.action3": "打开gui界面", + + "item.create.placement_handgun.tooltip": "BLOCKZAPPER", + "item.create.placement_handgun.tooltip.summary": "新颖的小工具,可以远距离放置或更换方块.", + "item.create.placement_handgun.tooltip.control1": "当左键方块时", + "item.create.placement_handgun.tooltip.action1": "设定放置此方块.", + "item.create.placement_handgun.tooltip.control2": "当右键方块时", + "item.create.placement_handgun.tooltip.action2": "放置或替换目标方块.", + "item.create.placement_handgun.tooltip.control3": "当潜行右键时", + "item.create.placement_handgun.tooltip.action3": "打开gui界面", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "适用于常见树木的快速肥料", + "item.create.tree_fertilizer.tooltip.condition1": "在树苗上使用时", + "item.create.tree_fertilizer.tooltip.behaviour1": "无论生长时间多少,直接长大", + + "block.create.cocoa_log.tooltip": "COCOA LOG", + "block.create.cocoa_log.tooltip.summary": "增强的可可豆丛林木,更方便实现可可豆自动化", + "block.create.cocoa_log.tooltip.condition1": "成熟时", + "block.create.cocoa_log.tooltip.behaviour1": "四面生长可可豆", + + "item.create.empty_blueprint.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_blueprint.tooltip.summary": "可作为合成材料或在原理图桌使用", + + "item.create.blueprint.tooltip": "SCHEMATIC", + "item.create.blueprint.tooltip.summary": "可以放置在世界中的结构,根据需要放置全息图,并使用原理图加农炮进行构建.", + "item.create.blueprint.tooltip.condition1": "当全息图存在时", + "item.create.blueprint.tooltip.behaviour1": "可以使用屏幕上的工具定位", + "item.create.blueprint.tooltip.control1": "当潜行右键时", + "item.create.blueprint.tooltip.action1": "打开一个用于输入精确坐标的界面.", + + "item.create.blueprint_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.blueprint_and_quill.tooltip.summary": "用于将世界中的结构保存到.nbt文件.", + "item.create.blueprint_and_quill.tooltip.condition1": "第一步", + "item.create.blueprint_and_quill.tooltip.behaviour1": "手持原理图与右键旋转两个点", + "item.create.blueprint_and_quill.tooltip.condition2": "第二步", + "item.create.blueprint_and_quill.tooltip.behaviour2": "按住Ctrl鼠标滚轮选择选区大小,右键空白处保存.", + "item.create.blueprint_and_quill.tooltip.control1": "右键", + "item.create.blueprint_and_quill.tooltip.action1": "选取点/确认保存", + "item.create.blueprint_and_quill.tooltip.control2": "按住Ctrl鼠标滚轮", + "item.create.blueprint_and_quill.tooltip.action2": "在空中选择点滚动以调整距离。", + "item.create.blueprint_and_quill.tooltip.control3": "当潜行右键时", + "item.create.blueprint_and_quill.tooltip.action3": "重置并删除选区.", + + "block.create.creative_crate.tooltip": "CREATIVE CRATE", + "block.create.creative_crate.tooltip.summary": "为相邻的原理图加农炮提供无限能量的方块", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "发射方块以在世界中重新构建已部署的全息图,使用相邻箱子中的物品及火药作为燃料.", + "block.create.schematicannon.tooltip.control1": "当右键时", + "block.create.schematicannon.tooltip.action1": "打开gui界面", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "将保存的原理图图写入空白原理图", + "block.create.schematic_table.tooltip.condition1": "放入空白原理图时", + "block.create.schematic_table.tooltip.behaviour1": "从Schematics文件夹上传所选文件", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "传动杆.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": "传动结构之一.", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "大号齿轮传动结构,连接到小型齿轮时改变其转速.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "一字齿轮传动结构.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "十字传动旋转结构.", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "用于传动的可控旋转开关.", + "block.create.gearshift.tooltip.condition1": "当提供红石信号时", + "block.create.gearshift.tooltip.behaviour1": "更改旋转方向.", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "传动控制装置.", + "block.create.clutch.tooltip.condition1": "当提供红石信号时", + "block.create.clutch.tooltip.behaviour1": "停止另一侧的旋转.", + + "block.create.encased_belt.tooltip": "ENCASED_BELT", + "block.create.encased_belt.tooltip.summary": "通过此方块传递动力,比如将动力传递到连接的传送带.", + "block.create.encased_belt.tooltip.condition1": "连接到其他传动或装置时", + "block.create.encased_belt.tooltip.behaviour1": "将具有完全相同的转速和方向.", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "用传送带连接传动杆,连接的传动杆将具有完全相同的转速和方向.传送带可以传输实体.", + "item.create.belt_connector.tooltip.control1": "当右键传动杆时", + "item.create.belt_connector.tooltip.action1": "选择传动杆作为传送带的传输点,选定的两个传动杆都必须相互垂直,水平或对角平齐.", + "item.create.belt_connector.tooltip.control2": "当潜行右键时", + "item.create.belt_connector.tooltip.action2": "重置传送带的第一个选定位置", + + "block.create.belt_support.tooltip": "BELT SUPPORT", + "block.create.belt_support.tooltip.summary": "纯粹的装饰块.", + "block.create.belt_support.tooltip.condition1": "当放置在传送带下方时", + "block.create.belt_support.tooltip.behaviour1": "支撑传送带顶部,隐藏下半部分.", + + "block.create.motor.tooltip": "MOTOR", + "block.create.motor.tooltip.summary": "可以配置的无限动力来源", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "从相邻的流水中获得动力", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "有多种用途,主要可以将动力转化为气流.", + "block.create.encased_fan.tooltip.condition1": "在下方点火时", + "block.create.encased_fan.tooltip.behaviour1": "可为连结的传动结构提供动力(热力>动力)", + "block.create.encased_fan.tooltip.condition2": "当旋转时", + "block.create.encased_fan.tooltip.behaviour2": "一面推动实体,一面吸引实体,强度和速度取决于给予的动力.", + "block.create.encased_fan.tooltip.condition3": "当气流通过火,水,岩浆时", + "block.create.encased_fan.tooltip.behaviour3": "获得相应产物(建议配合jei查看).", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "一个普通的转盘.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "用于建造多方块粉碎机,粉碎轮的齿必须以相同的速度朝相对的方向旋转才可处理各种物品的粉碎合成.", + "block.create.crushing_wheel.tooltip.condition1": "当两个粉碎轮一起运作时", + "block.create.crushing_wheel.tooltip.behaviour1": "粉碎物品并获得相应产物(建议配合jei查看)", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "一个强里的活塞,用于压制其下方的物品.", + "block.create.mechanical_press.tooltip.condition1": "当提供红石信号时", + "block.create.mechanical_press.tooltip.behaviour1": "压制其下方的物品.", + "block.create.mechanical_press.tooltip.condition2": "在传送带上方时", + "block.create.mechanical_press.tooltip.behaviour2": "自动压缩经过传送带的物品.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "活塞的高级版本,使用机械动力精确移动粘贴的方块,背面可放置活塞杆延长活塞范围,没有活塞杆将不会工作,使用机壳底盘可以移动多行.", + "block.create.mechanical_piston.tooltip.condition1": "推拉活塞时", + "block.create.mechanical_piston.tooltip.behaviour1": "速度和方向与转速相关.", + + "block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON", + "block.create.sticky_mechanical_piston.tooltip.summary": "粘性活塞的高级版本,使用机械动力精确移动粘贴的方块,背面可放置活塞杆延长活塞范围,没有活塞杆将不会工作,使用机壳底盘可以移动多行.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "推拉活塞时", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "速度和方向与转速相关.", + + "block.create.piston_pole.tooltip": "PISTON POLE", + "block.create.piston_pole.tooltip.summary": "用于增加动力活塞范围", + "block.create.piston_pole.tooltip.condition1": "当连接到动力活塞时", + "block.create.piston_pole.tooltip.behaviour1": "活塞的延伸范围将扩大", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "block.create.mechanical_bearing.tooltip.summary": "用于建造旋转的大型风力动能结构,比如风车.", + "block.create.mechanical_bearing.tooltip.condition1": "当旋转时", + "block.create.mechanical_bearing.tooltip.behaviour1": "就是旋转啊还能怎么样....", + "block.create.mechanical_bearing.tooltip.condition2": "给予红石信号时", + "block.create.mechanical_bearing.tooltip.behaviour2": "开始旋转并为连接的传动方块提供动力(此结构需使用羊毛建造).", + + "block.create.translation_chassis.tooltip": "TRANSLATION CHASSIS", + "block.create.translation_chassis.tooltip.summary": "动力活塞移动的多方块结构基础,这种方块须在活塞前面第一层放置.", + "block.create.translation_chassis.tooltip.condition1": "由动力活塞推动时", + "block.create.translation_chassis.tooltip.behaviour1": "朝相同的方向移动所有连接在一起的机壳底盘;当活塞缩回时,只拉回底盘表面设置数量的方块(详情见Ctrl).", + "block.create.translation_chassis.tooltip.control1": "当用史莱姆球右键时", + "block.create.translation_chassis.tooltip.action1": "变为粘性机壳底盘.", + + "block.create.rotation_chassis.tooltip": "ROTATION CHASSIS", + "block.create.rotation_chassis.tooltip.summary": "使用旋转底盘是旋转结构必须的", + "block.create.rotation_chassis.tooltip.condition1": "当旋转时", + "block.create.rotation_chassis.tooltip.behaviour1": "在其周围的配置范围内旋转所有粘贴到粘性面的方块(详情见Ctrl).", + "block.create.rotation_chassis.tooltip.control1": "当用史莱姆球右键时", + "block.create.rotation_chassis.tooltip.action1": "当底盘旋转同时旋转所有粘贴到粘性面的方块.", + + "block.create.drill.tooltip": "MECHANICAL DRILL", + "block.create.drill.tooltip.summary": "用于破坏方块的装置", + "block.create.drill.tooltip.condition1": "当旋转时", + "block.create.drill.tooltip.behaviour1": "破化正前方的方块,且伤害在一定范围内生物及玩家.", + "block.create.drill.tooltip.condition2": "由动力活塞推动时", + "block.create.drill.tooltip.behaviour2": "横向或纵向破坏相当于活塞杆长度的方块.", + + "block.create.harvester.tooltip": "MECHANICAL HARVESTER", + "block.create.harvester.tooltip.summary": "适用于中型作物自动化的收割机", + "block.create.harvester.tooltip.condition1": "由动力活塞推动时", + "block.create.harvester.tooltip.behaviour1": "收割机移动至成熟作物收割作物并将作物变为初始生长状态.", + + "block.create.stockswitch.tooltip": "STOCKSWITCH", + "block.create.stockswitch.tooltip.summary": "根据连接的容器存储空间大小切换红石信号强度.", + "block.create.stockswitch.tooltip.condition1": "低于下限时", + "block.create.stockswitch.tooltip.behaviour1": "停止提供红石信号", + "block.create.stockswitch.tooltip.condition2": "超过上限时", + "block.create.stockswitch.tooltip.behaviour2": "开始提供红石信号,直到再次到达下限.", + "block.create.stockswitch.tooltip.control1": "当右键方块时", + + "block.create.redstone_bridge.tooltip": "REDSTONE LINK", + "block.create.redstone_bridge.tooltip.summary": "无线红石信号终端,可以使用任何物品编辑终端频道,但距离有限.", + "block.create.redstone_bridge.tooltip.condition1": "当启用时", + "block.create.redstone_bridge.tooltip.behaviour1": "接收相同频道提供的红石信号.", + "block.create.redstone_bridge.tooltip.control1": "当右键方块时", + "block.create.redstone_bridge.tooltip.action1": "手持任意物品为其设置频道,可以组合两个物品.", + "block.create.redstone_bridge.tooltip.control2": "当潜行右键方块时", + "block.create.redstone_bridge.tooltip.action2": "在终端模式和接收模式之间切换.", + + "block.create.contact.tooltip": "REDSTONE CONTACT", + "block.create.contact.tooltip.summary": "一种用于高级红石装置的设备.", + "block.create.contact.tooltip.condition1": "当正对面放置也放置信号检测器时", + "block.create.contact.tooltip.behaviour1": "提供红石信号", + "block.create.contact.tooltip.condition2": "", + "block.create.contact.tooltip.behaviour2": "", + + "block.create.flexcrate.tooltip": "FLEXCRATE", + "block.create.flexcrate.tooltip.summary": "该箱子允许对其容量进行调整,最大可以容纳16组物品.", + "block.create.flexcrate.tooltip.control1": "当右键方块时", + "block.create.flexcrate.tooltip.action1": "打开箱子", + + "block.create.extractor.tooltip": "EXTRACTOR", + "block.create.extractor.tooltip.summary": "从连接的箱子里自动将物品输出到外面,可以设置白名单过滤.", + "block.create.extractor.tooltip.condition1": "当提供红石信号时", + "block.create.extractor.tooltip.behaviour1": "暂停自动输出", + "block.create.extractor.tooltip.action1": "将当前持有的物品设置为物品过滤白名单", + + "block.create.linked_extractor.tooltip": "LINKED EXTRACTOR", + "block.create.linked_extractor.tooltip.summary": "从连接的箱子里自动将物品输出到外面,可以设置白名单过滤,直到上一次输出的物品被清空才会再次输出,可以使用无线红石信号终端控制.", + "block.create.linked_extractor.tooltip.condition1": "当无线红石信号激活时", + "block.create.linked_extractor.tooltip.behaviour1": "暂停输出物品", + "block.create.linked_extractor.tooltip.control1": "右键方块时", + "block.create.linked_extractor.tooltip.action1": "将当前持有的物品数量的物品设置为物品过滤白名单且输出此数量的物品.", + "block.create.linked_extractor.tooltip.control2": "当右键方块侧面时", + "block.create.linked_extractor.tooltip.action2": "手持任意物品为其设置频道,将接收无线红石终端相应频道,可以组合两个物品.", + + "block.create.belt_funnel.tooltip": "BELT FUNNEL", + "block.create.belt_funnel.tooltip.summary": "接收传送带上的物品到连接的储存空间,必须放置在正对传送带的方向及高度.", + + "block.create.entity_detector.tooltip": "BELT OBSERVER", + "block.create.entity_detector.tooltip.summary": "检测前方传送带上的物品经过时输出红石信号,比如在上方放置活塞.", + "block.create.entity_detector.tooltip.condition1": "当物品和过滤器相匹配时", + "block.create.entity_detector.tooltip.behaviour1": "提供一个短暂的红石信号,空置过滤器匹配所有通过的物品.", + "block.create.entity_detector.tooltip.control1": "右键方块时", + "block.create.entity_detector.tooltip.action1": "将当前持有的物品设置为物品过滤白名单,将只会对此物品做出反应(指红石信号.", + + "block.create.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "一个简单的电路,将通过的红石信号变为1tick.", + + "block.create.flexpeater.tooltip": "FLEX REPEATER", + "block.create.flexpeater.tooltip.summary": "高级中继器,最大可设置30分钟延迟", + + "itemGroup.create": "机械动力" +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass.json new file mode 100644 index 000000000..62e9fda10 --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside.json new file mode 100644 index 000000000..a11b91cf6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_glass_pane_noside", + "textures": { + "pane": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside_alt.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside_alt.json new file mode 100644 index 000000000..fd400d0e7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_noside_alt.json @@ -0,0 +1,6 @@ +{ + "parent": "block/template_glass_pane_noside_alt", + "textures": { + "pane": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_post.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_post.json new file mode 100644 index 000000000..8d40e64dc --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_glass_pane_post", + "textures": { + "edge": "block/glass_pane_top", + "pane": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side.json new file mode 100644 index 000000000..d14ee3c2d --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_glass_pane_side", + "textures": { + "edge": "block/glass_pane_top", + "pane": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side_alt.json b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side_alt.json new file mode 100644 index 000000000..1cc938289 --- /dev/null +++ b/src/main/resources/assets/create/models/block/palettes/tiled_glass_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_glass_pane_side_alt", + "textures": { + "edge": "block/glass_pane_top", + "pane": "create:block/tiled_glass" + } +} diff --git a/src/main/resources/assets/create/models/item/tiled_glass.json b/src/main/resources/assets/create/models/item/tiled_glass.json new file mode 100644 index 000000000..1c7e9b83e --- /dev/null +++ b/src/main/resources/assets/create/models/item/tiled_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/palettes/tiled_glass" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/tiled_glass_pane.json b/src/main/resources/assets/create/models/item/tiled_glass_pane.json new file mode 100644 index 000000000..c9cd61f76 --- /dev/null +++ b/src/main/resources/assets/create/models/item/tiled_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:block/tiled_glass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/vertical_gearbox.json b/src/main/resources/assets/create/models/item/vertical_gearbox.json new file mode 100644 index 000000000..e880142fc --- /dev/null +++ b/src/main/resources/assets/create/models/item/vertical_gearbox.json @@ -0,0 +1,48 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", + "parent": "block/block", + "textures": { + "particle": "create:block/gearbox", + "gearbox_top": "create:block/gearbox_top", + "gearbox": "create:block/gearbox" + }, + "elements": [ + { + "name": "Side", + "from": [ 0, 0, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "north": { "texture": "#gearbox_top", "uv": [ 14, 0, 16, 16 ] }, + "east": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 16 ] }, + "south": { "texture": "#gearbox_top", "uv": [ 0, 0, 2, 16 ] }, + "west": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 16 ] }, + "up": { "texture": "#gearbox_top", "uv": [ 0, 0, 2, 16 ] }, + "down": { "texture": "#gearbox_top", "uv": [ 0, 0, 2, 16 ] } + } + }, + { + "name": "Side", + "from": [ 14, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "north": { "texture": "#gearbox_top", "uv": [ 0, 0, 2, 16 ] }, + "east": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 16 ] }, + "south": { "texture": "#gearbox_top", "uv": [ 14, 0, 16, 16 ] }, + "west": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 16 ] }, + "up": { "texture": "#gearbox_top", "uv": [ 14, 0, 16, 16 ] }, + "down": { "texture": "#gearbox_top", "uv": [ 14, 0, 16, 16 ] } + } + }, + { + "name": "Center", + "from": [ 2, 1, 1 ], + "to": [ 14, 15, 15 ], + "faces": { + "north": { "texture": "#gearbox", "uv": [ 2, 1, 14, 15 ] }, + "south": { "texture": "#gearbox", "uv": [ 2, 1, 14, 15 ] }, + "up": { "texture": "#gearbox", "uv": [ 2, 1, 14, 15 ] }, + "down": { "texture": "#gearbox", "uv": [ 2, 1, 14, 15 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/tiled_glass.png b/src/main/resources/assets/create/textures/block/tiled_glass.png new file mode 100644 index 000000000..1588535c9 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/tiled_glass.png differ diff --git a/src/main/resources/data/create/loot_tables/blocks/tiled_glass.json b/src/main/resources/data/create/loot_tables/blocks/tiled_glass.json new file mode 100644 index 000000000..08c6ad609 --- /dev/null +++ b/src/main/resources/data/create/loot_tables/blocks/tiled_glass.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:tiled_glass" + } + ], + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/loot_tables/blocks/tiled_glass_pane.json b/src/main/resources/data/create/loot_tables/blocks/tiled_glass_pane.json new file mode 100644 index 000000000..29dc59308 --- /dev/null +++ b/src/main/resources/data/create/loot_tables/blocks/tiled_glass_pane.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:tiled_glass_pane" + } + ], + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting/gearbox2.json b/src/main/resources/data/create/recipes/crafting/gearbox2.json new file mode 100644 index 000000000..643879ae7 --- /dev/null +++ b/src/main/resources/data/create/recipes/crafting/gearbox2.json @@ -0,0 +1,18 @@ +{ + "type": "crafting_shapeless", + "ingredients": [ + { + "item": "create:vertical_gearbox" + } + ], + "result": { + "item": "create:gearbox", + "count": 1 + }, + "conditions": [ + { + "type": "create:module", + "module": "contraptions" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting/palettes/tiled_glass_pane.json b/src/main/resources/data/create/recipes/crafting/palettes/tiled_glass_pane.json new file mode 100644 index 000000000..0e4bca273 --- /dev/null +++ b/src/main/resources/data/create/recipes/crafting/palettes/tiled_glass_pane.json @@ -0,0 +1,22 @@ +{ + "type": "crafting_shaped", + "pattern": [ + "SSS", + "SSS" + ], + "key": { + "S": { + "item": "create:tiled_glass" + } + }, + "result": { + "item": "create:tiled_glass_pane", + "count": 16 + }, + "conditions": [ + { + "type": "create:module", + "module": "palettes" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting/vertical_gearbox.json b/src/main/resources/data/create/recipes/crafting/vertical_gearbox.json new file mode 100644 index 000000000..78b60747b --- /dev/null +++ b/src/main/resources/data/create/recipes/crafting/vertical_gearbox.json @@ -0,0 +1,18 @@ +{ + "type": "crafting_shapeless", + "ingredients": [ + { + "item": "create:gearbox" + } + ], + "result": { + "item": "create:vertical_gearbox", + "count": 1 + }, + "conditions": [ + { + "type": "create:module", + "module": "contraptions" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/stonecutting/tiled_glass.json b/src/main/resources/data/create/recipes/stonecutting/tiled_glass.json new file mode 100644 index 000000000..23494d70d --- /dev/null +++ b/src/main/resources/data/create/recipes/stonecutting/tiled_glass.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:glass" + }, + "result": "create:tiled_glass", + "count": 1, + "conditions": [ + { + "type": "create:module", + "module": "palettes" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/stonecutting/tiled_glass_pane.json b/src/main/resources/data/create/recipes/stonecutting/tiled_glass_pane.json new file mode 100644 index 000000000..867a129fb --- /dev/null +++ b/src/main/resources/data/create/recipes/stonecutting/tiled_glass_pane.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:glass_pane" + }, + "result": "create:tiled_glass_pane", + "count": 1, + "conditions": [ + { + "type": "create:module", + "module": "palettes" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/tags/blocks/windowable.json b/src/main/resources/data/create/tags/blocks/windowable.json new file mode 100644 index 000000000..94fd00594 --- /dev/null +++ b/src/main/resources/data/create/tags/blocks/windowable.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:stairs", "#minecraft:slabs", "#minecraft:walls", "#minecraft:fences", "#forge:fences" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/blocks/glass.json b/src/main/resources/data/forge/tags/blocks/glass.json new file mode 100644 index 000000000..723c1db15 --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/glass.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:tiled_glass" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/blocks/glass_panes.json b/src/main/resources/data/forge/tags/blocks/glass_panes.json new file mode 100644 index 000000000..17dc53a1a --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/glass_panes.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:tiled_glass_pane" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/items/glass.json b/src/main/resources/data/forge/tags/items/glass.json new file mode 100644 index 000000000..723c1db15 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/glass.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:tiled_glass" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/items/glass_panes.json b/src/main/resources/data/forge/tags/items/glass_panes.json new file mode 100644 index 000000000..17dc53a1a --- /dev/null +++ b/src/main/resources/data/forge/tags/items/glass_panes.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:tiled_glass_pane" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/impermeable.json b/src/main/resources/data/minecraft/tags/blocks/impermeable.json new file mode 100644 index 000000000..723c1db15 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/impermeable.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:tiled_glass" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/slabs.json b/src/main/resources/data/minecraft/tags/blocks/slabs.json new file mode 100644 index 000000000..bca79d676 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/slabs.json @@ -0,0 +1,15 @@ +{ + "replace": false, + "values": [ + "create:limestone_slab", + "create:polished_limestone_slab", + "create:limestone_bricks_slab", + "create:weathered_limestone_slab", + "create:polished_weathered_limestone_slab", + "create:weathered_limestone_bricks_slab", + "create:dolomite_slab", + "create:gabbro_slab", + "create:indented_gabbro_slab", + "create:paved_gabbro_bricks_slab" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/stairs.json b/src/main/resources/data/minecraft/tags/blocks/stairs.json new file mode 100644 index 000000000..15951be74 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/stairs.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "create:limestone_stairs", + "create:limestone_bricks_stairs", + "create:weathered_limestone_stairs", + "create:weathered_limestone_bricks_stairs", + "create:dolomite_stairs", + "create:gabbro_stairs", + "create:gabbro_bricks_stairs" + ] +} \ No newline at end of file