Fancy Windows

- Added ability to put glass panes inside partial blocks such as Fences, Stairs and Slabs.
- Added Tiled Glass and Tiled Glass Panes
- Fixed Translation Chassis pulling blocks even without being sticky
- Added Palette Blocks to corresponding tag groups
- Added translation to zh_cn (Thanks to Thirace446)
- Split gearboxes into two interchangeable Items
This commit is contained in:
simibubi 2019-09-24 14:40:01 +02:00
parent c8872b61b0
commit 0a1b85fe39
49 changed files with 1623 additions and 88 deletions

View file

@ -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'

View file

@ -10,6 +10,7 @@ public enum AllBlockTags {
WINDMILL_SAILS,
FAN_HEATERS,
WINDOWABLE,
;

View file

@ -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))),

View file

@ -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");
}
}

View file

@ -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),
;

View file

@ -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();

View file

@ -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<ResourceLocation, IBakedModel> 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 <T extends IBakedModel> void swapModels(Map<ResourceLocation, IBakedModel> modelRegistry,
ModelResourceLocation location, Function<IBakedModel, T> factory) {
modelRegistry.put(location, factory.apply(modelRegistry.get(location)));
}
}

View file

@ -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();
}

View file

@ -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);
}
}

View file

@ -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<T extends TileEntity> {
@ -16,4 +17,12 @@ public interface IWithTileEntity<T extends TileEntity> {
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;
}
}

View file

@ -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();

View file

@ -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<ItemStack> items) {
super.fillItemGroup(group, items);
items.add(new ItemStack(AllItems.VERTICAL_GEARBOX.get()));
}
@SuppressWarnings("deprecation")
@Override
public List<ItemStack> 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:

View file

@ -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);
}
}

View file

@ -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<WindowInABlockTileEntity>, 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<ItemStack> getDrops(BlockState state, Builder builder) {
TileEntity tileentity = builder.get(LootParameters.BLOCK_ENTITY);
if (!(tileentity instanceof WindowInABlockTileEntity))
return Collections.emptyList();
WindowInABlockTileEntity te = (WindowInABlockTileEntity) tileentity;
List<ItemStack> 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;
}
}

View file

@ -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<BlockState> PARTIAL_BLOCK = new ModelProperty<>();
public static final ModelProperty<BlockState> WINDOW_BLOCK = new ModelProperty<>();
public static final ModelProperty<BlockPos> POSITION = new ModelProperty<>();
public WindowInABlockModel(IBakedModel template) {
super(template);
}
@Override
public List<BakedQuad> 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<BakedQuad> 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;
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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<>();

View file

@ -4,7 +4,7 @@ loaderVersion="[28,)"
[[mods]]
modId="create"
version="0.1.0"
version="0.1.1"
displayName="Create"
#updateJSONURL=""
authors="simibubi"

View file

@ -0,0 +1,5 @@
{
"variants": {
"": { "model": "create:block/palettes/tiled_glass" }
}
}

View file

@ -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 }
}
]
}

View file

@ -0,0 +1,5 @@
{
"variants": {
"": { "model": "block/air" }
}
}

View file

@ -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",

View file

@ -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": "机械动力"
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/template_glass_pane_noside",
"textures": {
"pane": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/template_glass_pane_noside_alt",
"textures": {
"pane": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/template_glass_pane_post",
"textures": {
"edge": "block/glass_pane_top",
"pane": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/template_glass_pane_side",
"textures": {
"edge": "block/glass_pane_top",
"pane": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "block/template_glass_pane_side_alt",
"textures": {
"edge": "block/glass_pane_top",
"pane": "create:block/tiled_glass"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/palettes/tiled_glass"
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "create:block/tiled_glass"
}
}

View file

@ -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 ] }
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

View file

@ -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
}
}
]
}
}
]
}
]
}

View file

@ -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
}
}
]
}
}
]
}
]
}

View file

@ -0,0 +1,18 @@
{
"type": "crafting_shapeless",
"ingredients": [
{
"item": "create:vertical_gearbox"
}
],
"result": {
"item": "create:gearbox",
"count": 1
},
"conditions": [
{
"type": "create:module",
"module": "contraptions"
}
]
}

View file

@ -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"
}
]
}

View file

@ -0,0 +1,18 @@
{
"type": "crafting_shapeless",
"ingredients": [
{
"item": "create:gearbox"
}
],
"result": {
"item": "create:vertical_gearbox",
"count": 1
},
"conditions": [
{
"type": "create:module",
"module": "contraptions"
}
]
}

View file

@ -0,0 +1,14 @@
{
"type": "minecraft:stonecutting",
"ingredient": {
"item": "minecraft:glass"
},
"result": "create:tiled_glass",
"count": 1,
"conditions": [
{
"type": "create:module",
"module": "palettes"
}
]
}

View file

@ -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"
}
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"#minecraft:stairs", "#minecraft:slabs", "#minecraft:walls", "#minecraft:fences", "#forge:fences"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:tiled_glass"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:tiled_glass_pane"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:tiled_glass"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:tiled_glass_pane"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:tiled_glass"
]
}

View file

@ -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"
]
}

View file

@ -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"
]
}