Merge branch '0.1.2' into 0.2
This commit is contained in:
commit
7304f59f55
137 changed files with 4741 additions and 1422 deletions
|
@ -20,7 +20,7 @@ archivesBaseName = 'create'
|
|||
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
|
||||
|
||||
minecraft {
|
||||
mappings channel: 'snapshot', version: '20191016-1.14.3'
|
||||
mappings channel: 'snapshot', version: '20191021-1.14.3'
|
||||
|
||||
runs {
|
||||
client {
|
||||
|
@ -71,7 +71,7 @@ repositories {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
minecraft 'net.minecraftforge:forge:1.14.4-28.1.56'
|
||||
minecraft 'net.minecraftforge:forge:1.14.4-28.1.61'
|
||||
|
||||
// compile against the JEI API but do not include it at runtime
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.10:api")
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create;
|
||||
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
|
@ -8,10 +10,8 @@ import net.minecraft.util.ResourceLocation;
|
|||
|
||||
public enum AllBlockTags {
|
||||
|
||||
WINDMILL_SAILS,
|
||||
FAN_HEATERS,
|
||||
WINDOWABLE,
|
||||
|
||||
WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE,
|
||||
|
||||
;
|
||||
|
||||
public Tag<Block> tag;
|
||||
|
@ -22,9 +22,9 @@ public enum AllBlockTags {
|
|||
|
||||
private AllBlockTags(String path) {
|
||||
tag = new BlockTags.Wrapper(
|
||||
new ResourceLocation(Create.ID, (path.isEmpty() ? "" : path + "/") + name().toLowerCase()));
|
||||
new ResourceLocation(Create.ID, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())));
|
||||
}
|
||||
|
||||
|
||||
public boolean matches(BlockState block) {
|
||||
return tag.contains(block.getBlock());
|
||||
}
|
||||
|
|
|
@ -5,9 +5,11 @@ import com.simibubi.create.foundation.block.IWithoutBlockItem;
|
|||
import com.simibubi.create.foundation.block.ProperStairsBlock;
|
||||
import com.simibubi.create.foundation.block.RenderUtilityAxisBlock;
|
||||
import com.simibubi.create.foundation.block.RenderUtilityBlock;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.IModule;
|
||||
import com.simibubi.create.modules.contraptions.generators.MotorBlock;
|
||||
import com.simibubi.create.modules.contraptions.generators.WaterWheelBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.BasinBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.DrillBlock;
|
||||
|
@ -15,6 +17,8 @@ import com.simibubi.create.modules.contraptions.receivers.DrillBlock.DrillHeadBl
|
|||
import com.simibubi.create.modules.contraptions.receivers.EncasedFanBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock.HarvesterBladeBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalMixerBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalMixerBlock.MechanicalMixerBlockItem;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.SawBlock;
|
||||
import com.simibubi.create.modules.contraptions.receivers.TurntableBlock;
|
||||
|
@ -94,6 +98,7 @@ public enum AllBlocks {
|
|||
SHAFT(new ShaftBlock(Properties.from(Blocks.ANDESITE))),
|
||||
COGWHEEL(new CogWheelBlock(false)),
|
||||
LARGE_COGWHEEL(new CogWheelBlock(true)),
|
||||
SHAFTLESS_COGWHEEL(new RenderUtilityAxisBlock()),
|
||||
ENCASED_SHAFT(new EncasedShaftBlock()),
|
||||
ENCASED_BELT(new EncasedBeltBlock()),
|
||||
CLUTCH(new ClutchBlock()),
|
||||
|
@ -109,10 +114,16 @@ public enum AllBlocks {
|
|||
ENCASED_FAN_INNER(new RenderUtilityAxisBlock()),
|
||||
TURNTABLE(new TurntableBlock()),
|
||||
SHAFT_HALF(new ShaftHalfBlock()),
|
||||
|
||||
CRUSHING_WHEEL(new CrushingWheelBlock()),
|
||||
CRUSHING_WHEEL_CONTROLLER(new CrushingWheelControllerBlock()),
|
||||
MECHANICAL_PRESS(new MechanicalPressBlock()),
|
||||
MECHANICAL_PRESS_HEAD(new MechanicalPressBlock.Head()),
|
||||
MECHANICAL_MIXER(new MechanicalMixerBlock()),
|
||||
MECHANICAL_MIXER_POLE(new RenderUtilityBlock()),
|
||||
MECHANICAL_MIXER_HEAD(new RenderUtilityBlock()),
|
||||
BASIN(new BasinBlock()),
|
||||
|
||||
MECHANICAL_PISTON(new MechanicalPistonBlock(false)),
|
||||
STICKY_MECHANICAL_PISTON(new MechanicalPistonBlock(true)),
|
||||
MECHANICAL_PISTON_HEAD(new MechanicalPistonHeadBlock()),
|
||||
|
@ -162,7 +173,7 @@ public enum AllBlocks {
|
|||
__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))),
|
||||
|
@ -206,14 +217,14 @@ public enum AllBlocks {
|
|||
CategoryTracker.currentModule = new IModule() {
|
||||
@Override
|
||||
public String getModuleName() {
|
||||
return name().toLowerCase().replaceAll("__", "");
|
||||
return Lang.asId(name()).replaceAll("__", "");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private AllBlocks(Block block, ComesWith... comesWith) {
|
||||
this.block = block;
|
||||
this.block.setRegistryName(Create.ID, this.name().toLowerCase());
|
||||
this.block.setRegistryName(Create.ID, Lang.asId(name()));
|
||||
this.module = CategoryTracker.currentModule;
|
||||
|
||||
alsoRegistered = new Block[comesWith.length];
|
||||
|
@ -246,8 +257,15 @@ public enum AllBlocks {
|
|||
}
|
||||
|
||||
private static void registerAsItem(IForgeRegistry<Item> registry, Block blockIn) {
|
||||
registry.register(
|
||||
new BlockItem(blockIn, AllItems.standardItemProperties()).setRegistryName(blockIn.getRegistryName()));
|
||||
BlockItem blockItem = null;
|
||||
net.minecraft.item.Item.Properties standardItemProperties = AllItems.standardItemProperties();
|
||||
|
||||
if (blockIn == AllBlocks.MECHANICAL_MIXER.get())
|
||||
blockItem = new MechanicalMixerBlockItem(standardItemProperties);
|
||||
else
|
||||
blockItem = new BlockItem(blockIn, standardItemProperties);
|
||||
|
||||
registry.register(blockItem.setRegistryName(blockIn.getRegistryName()));
|
||||
}
|
||||
|
||||
public Block get() {
|
||||
|
@ -282,8 +300,7 @@ public enum AllBlocks {
|
|||
return null;
|
||||
}
|
||||
|
||||
return featured.setRegistryName(Create.ID,
|
||||
block.getRegistryName().getPath() + "_" + feature.name().toLowerCase());
|
||||
return featured.setRegistryName(Create.ID, block.getRegistryName().getPath() + "_" + Lang.asId(feature.name()));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.simibubi.create;
|
||||
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.logistics.block.inventories.FlexcrateContainer;
|
||||
import com.simibubi.create.modules.logistics.block.inventories.FlexcrateScreen;
|
||||
import com.simibubi.create.modules.logistics.management.controller.LogisticalInventoryControllerContainer;
|
||||
|
@ -21,16 +22,12 @@ import net.minecraft.inventory.container.ContainerType.IFactory;
|
|||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
||||
import net.minecraftforge.fml.network.IContainerFactory;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
|
||||
@EventBusSubscriber(bus = Bus.MOD)
|
||||
public enum AllContainers {
|
||||
|
||||
SCHEMATIC_TABLE(SchematicTableContainer::new),
|
||||
SCHEMATIC_TABLE(SchematicTableContainer::new),
|
||||
SCHEMATICANNON(SchematicannonContainer::new),
|
||||
FLEXCRATE(FlexcrateContainer::new),
|
||||
LOGISTICAL_INDEX(LogisticalIndexContainer::new),
|
||||
|
@ -45,13 +42,11 @@ public enum AllContainers {
|
|||
this.factory = factory;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onContainerTypeRegistry(final RegistryEvent.Register<ContainerType<?>> e) {
|
||||
|
||||
public static void registerContainers(IForgeRegistry<ContainerType<?>> iForgeRegistry) {
|
||||
for (AllContainers container : values()) {
|
||||
container.type = new ContainerType<>(container.factory)
|
||||
.setRegistryName(new ResourceLocation(Create.ID, container.name().toLowerCase()));
|
||||
e.getRegistry().register(container.type);
|
||||
.setRegistryName(new ResourceLocation(Create.ID, Lang.asId(container.name())));
|
||||
iForgeRegistry.register(container.type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,7 +61,8 @@ public enum AllContainers {
|
|||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <C extends Container, S extends Screen & IHasContainer<C>> void bind(AllContainers c, IScreenFactory<C, S> factory) {
|
||||
private static <C extends Container, S extends Screen & IHasContainer<C>> void bind(AllContainers c,
|
||||
IScreenFactory<C, S> factory) {
|
||||
ScreenManager.registerFactory((ContainerType<C>) c.type, factory);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create;
|
||||
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tags.ItemTags;
|
||||
|
@ -13,11 +15,11 @@ public enum AllItemTags {
|
|||
public Tag<Item> tag;
|
||||
|
||||
private AllItemTags(String path) {
|
||||
tag = new ItemTags.Wrapper(new ResourceLocation(Create.ID, path + "/" + name().toLowerCase()));
|
||||
tag = new ItemTags.Wrapper(new ResourceLocation(Create.ID, path + "/" + Lang.asId(name())));
|
||||
}
|
||||
|
||||
public boolean matches(ItemStack item) {
|
||||
return tag.contains(item.getItem());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package com.simibubi.create;
|
||||
|
||||
import com.simibubi.create.foundation.item.IItemWithColorHandler;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.IModule;
|
||||
import com.simibubi.create.modules.contraptions.WrenchItem;
|
||||
import com.simibubi.create.modules.contraptions.WrenchItemRenderer;
|
||||
import com.simibubi.create.modules.contraptions.relays.VerticalGearboxItem;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.BeltItem;
|
||||
import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem;
|
||||
|
@ -79,6 +82,8 @@ public enum AllItems {
|
|||
FLOUR(ingredient()),
|
||||
DOUGH(ingredient()),
|
||||
PROPELLER(ingredient()),
|
||||
WRENCH(new WrenchItem(standardItemProperties().setTEISR(() -> () -> renderUsing(AllItemRenderers.WRENCH)))),
|
||||
|
||||
CRUSHED_IRON(ingredient()),
|
||||
CRUSHED_GOLD(ingredient()),
|
||||
TIME_SCARF(ingredient()),
|
||||
|
@ -112,14 +117,14 @@ public enum AllItems {
|
|||
CategoryTracker.currentModule = new IModule() {
|
||||
@Override
|
||||
public String getModuleName() {
|
||||
return name().toLowerCase().replaceAll("__", "");
|
||||
return Lang.asId(name()).replaceAll("__", "");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private AllItems(Item item) {
|
||||
this.item = item;
|
||||
this.item.setRegistryName(Create.ID, this.name().toLowerCase());
|
||||
this.item.setRegistryName(Create.ID, Lang.asId(name()));
|
||||
this.module = CategoryTracker.currentModule;
|
||||
}
|
||||
|
||||
|
@ -158,7 +163,7 @@ public enum AllItems {
|
|||
// Client
|
||||
|
||||
private enum AllItemRenderers {
|
||||
SYMMETRY_WAND, BUILDER_GUN,;
|
||||
SYMMETRY_WAND, BUILDER_GUN, WRENCH;
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
@ -179,6 +184,8 @@ public enum AllItems {
|
|||
return new SymmetryWandItemRenderer();
|
||||
case BUILDER_GUN:
|
||||
return new BuilderGunItemRenderer();
|
||||
case WRENCH:
|
||||
return new WrenchItemRenderer();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.util.function.Supplier;
|
|||
import com.simibubi.create.foundation.packet.NbtPacket;
|
||||
import com.simibubi.create.foundation.packet.SimplePacketBase;
|
||||
import com.simibubi.create.modules.contraptions.generators.ConfigureMotorPacket;
|
||||
import com.simibubi.create.modules.contraptions.receivers.ConfigureMixerPacket;
|
||||
import com.simibubi.create.modules.contraptions.receivers.constructs.ConfigureChassisPacket;
|
||||
import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunBeamPacket;
|
||||
import com.simibubi.create.modules.curiosities.symmetry.SymmetryEffectPacket;
|
||||
|
@ -38,6 +39,7 @@ public enum AllPackets {
|
|||
CONFIGURE_FLEXPEATER(ConfigureFlexpeaterPacket.class, ConfigureFlexpeaterPacket::new),
|
||||
CONFIGURE_LOGISTICAL_CONTROLLER(LogisticalControllerConfigurationPacket.class,
|
||||
LogisticalControllerConfigurationPacket::new),
|
||||
CONFIGURE_MIXER(ConfigureMixerPacket.class, ConfigureMixerPacket::new),
|
||||
PLACE_SCHEMATIC(SchematicPlacePacket.class, SchematicPlacePacket::new),
|
||||
UPLOAD_SCHEMATIC(SchematicUploadPacket.class, SchematicUploadPacket::new),
|
||||
INDEX_ORDER_REQUEST(IndexOrderRequest.class, IndexOrderRequest::new),
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create;
|
|||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.ProcessingRecipeSerializer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.CrushingRecipe;
|
||||
import com.simibubi.create.modules.contraptions.receivers.PressingRecipe;
|
||||
|
@ -52,7 +53,7 @@ public enum AllRecipes {
|
|||
public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) {
|
||||
for (AllRecipes r : AllRecipes.values()) {
|
||||
r.serializer = r.supplier.get();
|
||||
ResourceLocation location = new ResourceLocation(Create.ID, r.name().toLowerCase());
|
||||
ResourceLocation location = new ResourceLocation(Create.ID, Lang.asId(r.name()));
|
||||
event.getRegistry().register(r.serializer.setRegistryName(location));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,13 @@ package com.simibubi.create;
|
|||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.generators.MotorTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.generators.MotorTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.generators.WaterWheelTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.BasinTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.BasinTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.DrillTileEntity;
|
||||
|
@ -14,6 +17,8 @@ import com.simibubi.create.modules.contraptions.receivers.EncasedFanTileEntity;
|
|||
import com.simibubi.create.modules.contraptions.receivers.EncasedFanTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.HarvesterTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.HarvesterTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalMixerTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalMixerTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.SawTileEntity;
|
||||
|
@ -71,13 +76,9 @@ import net.minecraft.tileentity.TileEntityType;
|
|||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.client.registry.ClientRegistry;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
|
||||
@Mod.EventBusSubscriber(bus = Bus.MOD)
|
||||
public enum AllTileEntities {
|
||||
|
||||
// Schematics
|
||||
|
@ -105,6 +106,8 @@ public enum AllTileEntities {
|
|||
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
|
||||
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
|
||||
MECHANICAL_PRESS(MechanicalPressTileEntity::new, AllBlocks.MECHANICAL_PRESS),
|
||||
MECHANICAL_MIXER(MechanicalMixerTileEntity::new, AllBlocks.MECHANICAL_MIXER),
|
||||
BASIN(BasinTileEntity::new, AllBlocks.BASIN),
|
||||
|
||||
// Logistics
|
||||
REDSTONE_BRIDGE(RedstoneBridgeTileEntity::new, AllBlocks.REDSTONE_BRIDGE),
|
||||
|
@ -143,18 +146,16 @@ public enum AllTileEntities {
|
|||
return te.getType().equals(type);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onTileEntityRegistry(final RegistryEvent.Register<TileEntityType<?>> event) {
|
||||
|
||||
public static void registerTileEntities(IForgeRegistry<TileEntityType<?>> registry) {
|
||||
for (AllTileEntities tileEntity : values()) {
|
||||
Block[] blocks = new Block[tileEntity.blocks.length];
|
||||
for (int i = 0; i < blocks.length; i++)
|
||||
blocks[i] = tileEntity.blocks[i].block;
|
||||
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Create.ID, tileEntity.name().toLowerCase());
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Create.ID, Lang.asId(tileEntity.name()));
|
||||
tileEntity.type = TileEntityType.Builder.create(tileEntity.supplier, blocks).build(null)
|
||||
.setRegistryName(resourceLocation);
|
||||
event.getRegistry().register(tileEntity.type);
|
||||
registry.register(tileEntity.type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,6 +186,8 @@ public enum AllTileEntities {
|
|||
bind(LogisticalControllerTileEntity.class, new LogisticalControllerTileEntityRenderer());
|
||||
bind(LogisticiansTableTileEntity.class, new LogisticiansTableTileEntityRenderer());
|
||||
bind(HarvesterTileEntity.class, new HarvesterTileEntityRenderer());
|
||||
bind(MechanicalMixerTileEntity.class, new MechanicalMixerTileEntityRenderer());
|
||||
bind(BasinTileEntity.class, new BasinTileEntityRenderer());
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
|
|
@ -3,9 +3,9 @@ package com.simibubi.create;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.compat.jei.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.block.IBlockWithScrollableValue;
|
||||
import com.simibubi.create.foundation.gui.ScreenOpener;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.TooltipHelper;
|
||||
import com.simibubi.create.modules.contraptions.receivers.TurntableHandler;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.BeltItemHandler;
|
||||
|
|
|
@ -13,27 +13,28 @@ import com.simibubi.create.modules.schematics.ServerSchematicLoader;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.merchant.villager.VillagerProfession;
|
||||
import net.minecraft.inventory.container.ContainerType;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemGroup;
|
||||
import net.minecraft.item.crafting.IRecipeSerializer;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.village.PointOfInterestType;
|
||||
import net.minecraftforge.common.crafting.CraftingHelper;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
||||
import net.minecraftforge.fml.config.ModConfig;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
|
||||
@EventBusSubscriber(bus = Bus.MOD)
|
||||
@Mod(Create.ID)
|
||||
public class Create {
|
||||
|
||||
public static final String ID = "create";
|
||||
public static final String NAME = "Create";
|
||||
public static final String VERSION = "0.1.1";
|
||||
public static final String VERSION = "0.1.1a";
|
||||
|
||||
public static Logger logger = LogManager.getLogger();
|
||||
public static ItemGroup creativeTab = new CreateItemGroup();
|
||||
|
@ -46,11 +47,20 @@ public class Create {
|
|||
public static ModConfig config;
|
||||
|
||||
public Create() {
|
||||
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
|
||||
modEventBus.addListener(Create::init);
|
||||
modEventBus.addGenericListener(Block.class, Create::registerBlocks);
|
||||
modEventBus.addGenericListener(Item.class, Create::registerItems);
|
||||
modEventBus.addGenericListener(IRecipeSerializer.class, Create::registerRecipes);
|
||||
modEventBus.addGenericListener(TileEntityType.class, Create::registerTileEntities);
|
||||
modEventBus.addGenericListener(ContainerType.class, Create::registerContainers);
|
||||
modEventBus.addListener(Create::createConfigs);
|
||||
CreateClient.addListeners(modEventBus);
|
||||
|
||||
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, CreateConfig.specification);
|
||||
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, CreateClientConfig.specification);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void init(final FMLCommonSetupEvent event) {
|
||||
schematicReceiver = new ServerSchematicLoader();
|
||||
frequencyHandler = new FrequencyHandler();
|
||||
|
@ -61,18 +71,23 @@ public class Create {
|
|||
AllPackets.registerPackets();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void registerItems(RegistryEvent.Register<Item> event) {
|
||||
AllItems.registerItems(event.getRegistry());
|
||||
AllBlocks.registerItemBlocks(event.getRegistry());
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void registerBlocks(RegistryEvent.Register<Block> event) {
|
||||
AllBlocks.registerBlocks(event.getRegistry());
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void registerTileEntities(RegistryEvent.Register<TileEntityType<?>> event) {
|
||||
AllTileEntities.registerTileEntities(event.getRegistry());
|
||||
}
|
||||
|
||||
public static void registerContainers(RegistryEvent.Register<ContainerType<?>> event) {
|
||||
AllContainers.registerContainers(event.getRegistry());
|
||||
}
|
||||
|
||||
public static void registerRecipes(RegistryEvent.Register<IRecipeSerializer<?>> event) {
|
||||
AllRecipes.register(event);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.util.Map;
|
|||
import java.util.function.Function;
|
||||
|
||||
import com.simibubi.create.modules.contraptions.CachedBufferReloader;
|
||||
import com.simibubi.create.modules.contraptions.WrenchModel;
|
||||
import com.simibubi.create.modules.contraptions.receivers.EncasedFanParticleHandler;
|
||||
import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockModel;
|
||||
import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunModel;
|
||||
|
@ -24,13 +25,13 @@ 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;
|
||||
import net.minecraftforge.client.event.ModelRegistryEvent;
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.config.ModConfig;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||
|
||||
@EventBusSubscriber(bus = Bus.MOD)
|
||||
public class CreateClient {
|
||||
|
||||
public static ClientSchematicLoader schematicSender;
|
||||
|
@ -38,10 +39,19 @@ public class CreateClient {
|
|||
public static SchematicHologram schematicHologram;
|
||||
public static SchematicAndQuillHandler schematicAndQuillHandler;
|
||||
public static EncasedFanParticleHandler fanParticles;
|
||||
|
||||
public static int renderTicks;
|
||||
|
||||
public static ModConfig config;
|
||||
|
||||
@SubscribeEvent
|
||||
public static void addListeners(IEventBus modEventBus) {
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> {
|
||||
modEventBus.addListener(CreateClient::clientInit);
|
||||
modEventBus.addListener(CreateClient::createConfigs);
|
||||
modEventBus.addListener(CreateClient::onModelBake);
|
||||
modEventBus.addListener(CreateClient::onModelRegistry);
|
||||
});
|
||||
}
|
||||
|
||||
public static void clientInit(FMLClientSetupEvent event) {
|
||||
schematicSender = new ClientSchematicLoader();
|
||||
schematicHandler = new SchematicHandler();
|
||||
|
@ -61,7 +71,6 @@ public class CreateClient {
|
|||
((IReloadableResourceManager) resourceManager).addReloadListener(new CachedBufferReloader());
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void createConfigs(ModConfig.ModConfigEvent event) {
|
||||
if (event.getConfig().getSpec() == CreateConfig.specification)
|
||||
return;
|
||||
|
@ -76,7 +85,6 @@ public class CreateClient {
|
|||
schematicHologram.tick();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static void onModelBake(ModelBakeEvent event) {
|
||||
Map<ResourceLocation, IBakedModel> modelRegistry = event.getModelRegistry();
|
||||
|
@ -85,6 +93,8 @@ public class CreateClient {
|
|||
t -> new SymmetryWandModel(t).loadPartials(event));
|
||||
swapModels(modelRegistry, getItemModelLocation(AllItems.PLACEMENT_HANDGUN),
|
||||
t -> new BuilderGunModel(t).loadPartials(event));
|
||||
swapModels(modelRegistry, getItemModelLocation(AllItems.WRENCH),
|
||||
t -> new WrenchModel(t).loadPartials(event));
|
||||
swapModels(modelRegistry,
|
||||
getBlockModelLocation(AllBlocks.WINDOW_IN_A_BLOCK,
|
||||
BlockModelShapes
|
||||
|
@ -95,7 +105,16 @@ public class CreateClient {
|
|||
BlockModelShapes.getPropertyMapString(AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState()
|
||||
.with(BlockStateProperties.WATERLOGGED, true).getValues())),
|
||||
WindowInABlockModel::new);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static void onModelRegistry(ModelRegistryEvent event) {
|
||||
for (String location : SymmetryWandModel.getCustomModelLocations())
|
||||
ModelLoader.addSpecialModel(new ResourceLocation(Create.ID, "item/" + location));
|
||||
for (String location : BuilderGunModel.getCustomModelLocations())
|
||||
ModelLoader.addSpecialModel(new ResourceLocation(Create.ID, "item/" + location));
|
||||
for (String location : WrenchModel.getCustomModelLocations())
|
||||
ModelLoader.addSpecialModel(new ResourceLocation(Create.ID, "item/" + location));
|
||||
}
|
||||
|
||||
protected static ModelResourceLocation getItemModelLocation(AllItems item) {
|
||||
|
|
|
@ -67,7 +67,8 @@ public enum ScreenResources {
|
|||
BLOCKZAPPER_UPGRADE_RECIPE("recipes2.png", 144, 66),
|
||||
PRESSER_RECIPE("recipes2.png", 0, 108, 177, 109),
|
||||
WASHING_RECIPE("recipes3.png", 177, 109),
|
||||
|
||||
PROCESSING_RECIPE_SLOT("recipes3.png", 177, 0, 20, 20),
|
||||
|
||||
// Widgets
|
||||
PALETTE_BUTTON("palette_picker.png", 0, 236, 20, 20),
|
||||
TEXT_INPUT("widgets.png", 0, 28, 194, 47),
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create.compat.jei;
|
||||
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
|
||||
import mezz.jei.api.gui.drawable.IDrawable;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package com.simibubi.create.compat.jei;
|
||||
|
||||
import static com.simibubi.create.compat.jei.AnimationTickHolder.ticks;
|
||||
import static com.simibubi.create.foundation.utility.AnimationTickHolder.ticks;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.AllBlocks;
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
package com.simibubi.create.compat.jei;
|
||||
|
||||
public class AnimationTickHolder {
|
||||
|
||||
protected static int ticks;
|
||||
|
||||
public static void tick() {
|
||||
ticks++;
|
||||
}
|
||||
|
||||
}
|
|
@ -109,7 +109,7 @@ public class BlockzapperUpgradeCategory implements IRecipeCategory<BuilderGunUpg
|
|||
public void draw(BuilderGunUpgradeRecipe recipe, double mouseX, double mouseY) {
|
||||
FontRenderer font = Minecraft.getInstance().fontRenderer;
|
||||
String componentName = Lang
|
||||
.translate("blockzapper.component." + recipe.getUpgradedComponent().name().toLowerCase());
|
||||
.translate("blockzapper.component." + Lang.asId(recipe.getUpgradedComponent().name()));
|
||||
String text = "+ " + recipe.getTier().color + componentName;
|
||||
font.drawStringWithShadow(text,
|
||||
(BLOCKZAPPER_UPGRADE_RECIPE.width - font.getStringWidth(text)) / 2, 57, 0x8B8B8B);
|
||||
|
|
|
@ -9,12 +9,11 @@ import com.simibubi.create.AllRecipes;
|
|||
import com.simibubi.create.Create;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import com.simibubi.create.modules.logistics.block.FlexcrateScreen;
|
||||
import com.simibubi.create.modules.schematics.block.SchematicannonScreen;
|
||||
import mezz.jei.api.IModPlugin;
|
||||
import mezz.jei.api.JeiPlugin;
|
||||
import mezz.jei.api.registration.IRecipeCatalystRegistration;
|
||||
import mezz.jei.api.registration.IRecipeCategoryRegistration;
|
||||
import mezz.jei.api.registration.IRecipeRegistration;
|
||||
import mezz.jei.api.registration.ISubtypeRegistration;
|
||||
import mezz.jei.api.registration.*;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
|
@ -90,6 +89,12 @@ public class CreateJEI implements IModPlugin {
|
|||
registration.addRecipeCatalyst(new ItemStack(AllItems.PLACEMENT_HANDGUN.get()), blockzapperCategory.getUid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerGuiHandlers(IGuiHandlerRegistration registration) {
|
||||
registration.addGuiContainerHandler(FlexcrateScreen.class, new SlotMover<>());
|
||||
registration.addGuiContainerHandler(SchematicannonScreen.class, new SlotMover<>());
|
||||
}
|
||||
|
||||
private static List<IRecipe<?>> findRecipes(AllRecipes recipe) {
|
||||
return findRecipesByType(recipe.type);
|
||||
}
|
||||
|
|
21
src/main/java/com/simibubi/create/compat/jei/SlotMover.java
Normal file
21
src/main/java/com/simibubi/create/compat/jei/SlotMover.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package com.simibubi.create.compat.jei;
|
||||
|
||||
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
|
||||
import mezz.jei.api.gui.handlers.IGuiContainerHandler;
|
||||
import net.minecraft.client.renderer.Rectangle2d;
|
||||
import net.minecraft.inventory.container.Container;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Allows a {@link AbstractSimiContainerScreen} to specify an area in getExtraArea() that will be avoided by JEI
|
||||
*
|
||||
* Name is taken from CoFHCore's 1.12 implementation.
|
||||
*/
|
||||
public class SlotMover<T extends Container> implements IGuiContainerHandler<AbstractSimiContainerScreen<T>> {
|
||||
|
||||
@Override
|
||||
public List<Rectangle2d> getGuiExtraAreas(AbstractSimiContainerScreen<T> containerScreen) {
|
||||
return containerScreen.getExtraAreas();
|
||||
}
|
||||
}
|
|
@ -29,12 +29,14 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
|
|||
|
||||
private static ResourceLocation ID = new ResourceLocation(Create.ID, "splashing");
|
||||
private IDrawable icon;
|
||||
private IDrawable slot;
|
||||
|
||||
public SplashingCategory() {
|
||||
slot = new ScreenResourceWrapper(ScreenResources.PROCESSING_RECIPE_SLOT);
|
||||
icon = new DoubleItemIcon(() -> new ItemStack(AllItems.PROPELLER.get()),
|
||||
() -> new ItemStack(Items.WATER_BUCKET));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public IDrawable getIcon() {
|
||||
return icon;
|
||||
|
@ -54,7 +56,7 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
|
|||
public String getTitle() {
|
||||
return Lang.translate("recipe.splashing");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setIngredients(SplashingRecipe recipe, IIngredients ingredients) {
|
||||
ingredients.setInputIngredients(recipe.getIngredients());
|
||||
|
@ -69,7 +71,10 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
|
|||
|
||||
List<StochasticOutput> results = recipe.getRollableResults();
|
||||
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
|
||||
itemStacks.init(outputIndex + 1, false, 139, 58 + 19 * outputIndex);
|
||||
int xOffset = outputIndex % 2 == 0 ? 0 : 19;
|
||||
int yOffset = (outputIndex / 2) * -19;
|
||||
|
||||
itemStacks.init(outputIndex + 1, false, 132 + xOffset, 77 + yOffset);
|
||||
itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack());
|
||||
}
|
||||
|
||||
|
@ -88,6 +93,17 @@ public class SplashingCategory extends ProcessingViaFanCategory<SplashingRecipe>
|
|||
return new ScreenResourceWrapper(ScreenResources.WASHING_RECIPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(SplashingRecipe recipe, double mouseX, double mouseY) {
|
||||
super.draw(recipe, mouseX, mouseY);
|
||||
int size = recipe.getPossibleOutputs().size();
|
||||
for (int i = 4; i < size; i++) {
|
||||
int xOffset = i % 2 == 0 ? 0 : 19;
|
||||
int yOffset = (i / 2) * -19;
|
||||
slot.draw(131 + xOffset, 76 + yOffset);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderAttachedBlock() {
|
||||
BlockState state = Blocks.WATER.getDefaultState().with(FlowingFluidBlock.LEVEL, 8);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simibubi.create.foundation.block;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.foundation.utility.TessellatorHelper;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
@ -42,10 +43,18 @@ public interface IBlockWithScrollableValue {
|
|||
|
||||
public Direction getValueBoxDirection(BlockState state, IWorld world, BlockPos pos);
|
||||
|
||||
public default boolean isValueOnAllSides() {
|
||||
public default boolean isValueOnMultipleFaces() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public default boolean requiresWrench() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public default boolean isValueOnFace(Direction face) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public default String getValueSuffix(BlockState state, IWorld world, BlockPos pos) {
|
||||
return "";
|
||||
}
|
||||
|
@ -70,11 +79,16 @@ public interface IBlockWithScrollableValue {
|
|||
IBlockWithScrollableValue block = (IBlockWithScrollableValue) state.getBlock();
|
||||
Vec3d pos = new Vec3d(blockPos);
|
||||
|
||||
if (block.requiresWrench() && !AllItems.WRENCH.typeOf(mc.player.getHeldItemMainhand()))
|
||||
return;
|
||||
|
||||
Vec3d valueBoxPosition = block.getValueBoxPosition(state, world, blockPos);
|
||||
AxisAlignedBB bb = VALUE_BB.offset(valueBoxPosition);
|
||||
bb = bb.grow(1 / 128f);
|
||||
Direction facing = block.isValueOnAllSides() ? result.getFace()
|
||||
Direction facing = block.isValueOnMultipleFaces() ? result.getFace()
|
||||
: block.getValueBoxDirection(state, world, blockPos);
|
||||
if (block.isValueOnMultipleFaces() && !block.isValueOnFace(result.getFace()))
|
||||
return;
|
||||
|
||||
Vec3d cursor = result.getHitVec().subtract(VecHelper.getCenterOf(blockPos));
|
||||
cursor = VecHelper.rotate(cursor, facing.getHorizontalAngle() + 90, Axis.Y);
|
||||
|
@ -185,10 +199,14 @@ public interface IBlockWithScrollableValue {
|
|||
return false;
|
||||
|
||||
IBlockWithScrollableValue block = (IBlockWithScrollableValue) state.getBlock();
|
||||
|
||||
if (block.requiresWrench() && !AllItems.WRENCH.typeOf(mc.player.getHeldItemMainhand()))
|
||||
return false;
|
||||
|
||||
Vec3d valueBoxPosition = block.getValueBoxPosition(state, world, blockPos);
|
||||
AxisAlignedBB bb = VALUE_BB.offset(valueBoxPosition);
|
||||
bb = bb.grow(1 / 128f);
|
||||
Direction facing = block.isValueOnAllSides() ? result.getFace()
|
||||
Direction facing = block.isValueOnMultipleFaces() ? result.getFace()
|
||||
: block.getValueBoxDirection(state, world, blockPos);
|
||||
|
||||
Vec3d cursor = result.getHitVec().subtract(VecHelper.getCenterOf(blockPos));
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simibubi.create.foundation.gui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -12,6 +13,7 @@ import net.minecraft.client.gui.FontRenderer;
|
|||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
|
||||
import net.minecraft.client.gui.widget.Widget;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.Rectangle2d;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
|
@ -216,4 +218,12 @@ public abstract class AbstractSimiContainerScreen<T extends Container> extends C
|
|||
Tessellator.getInstance().draw();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for moving JEI out of the way of extra things like Flexcrate renders
|
||||
*
|
||||
* @return the space that the gui takes up besides the normal rectangle defined by {@link ContainerScreen}.
|
||||
*/
|
||||
public List<Rectangle2d> getExtraAreas() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,30 +5,36 @@ import java.util.function.Supplier;
|
|||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraftforge.fml.network.NetworkEvent.Context;
|
||||
|
||||
public class NbtPacket extends SimplePacketBase {
|
||||
|
||||
public ItemStack stack;
|
||||
public int slot;
|
||||
public Hand hand;
|
||||
|
||||
public NbtPacket(ItemStack stack) {
|
||||
public NbtPacket(ItemStack stack, Hand hand) {
|
||||
this(stack, -1);
|
||||
this.hand = hand;
|
||||
}
|
||||
|
||||
public NbtPacket(ItemStack stack, int slot) {
|
||||
this.stack = stack;
|
||||
this.slot = slot;
|
||||
this.hand = Hand.MAIN_HAND;
|
||||
}
|
||||
|
||||
public NbtPacket(PacketBuffer buffer) {
|
||||
stack = buffer.readItemStack();
|
||||
slot = buffer.readInt();
|
||||
hand = Hand.values()[buffer.readInt()];
|
||||
}
|
||||
|
||||
public void write(PacketBuffer buffer) {
|
||||
buffer.writeItemStack(stack);
|
||||
buffer.writeInt(slot);
|
||||
buffer.writeInt(hand.ordinal());
|
||||
}
|
||||
|
||||
public void handle(Supplier<Context> context) {
|
||||
|
@ -36,15 +42,7 @@ public class NbtPacket extends SimplePacketBase {
|
|||
ServerPlayerEntity player = context.get().getSender();
|
||||
|
||||
if (slot == -1) {
|
||||
ItemStack heldItem = player.getHeldItemMainhand();
|
||||
if (heldItem.getItem() == stack.getItem()) {
|
||||
heldItem.setTag(stack.getTag());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (slot == -2) {
|
||||
ItemStack heldItem = player.getHeldItemOffhand();
|
||||
ItemStack heldItem = player.getHeldItem(hand);
|
||||
if (heldItem.getItem() == stack.getItem()) {
|
||||
heldItem.setTag(stack.getTag());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package com.simibubi.create.foundation.utility;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
public class AnimationTickHolder {
|
||||
|
||||
public static int ticks;
|
||||
|
||||
public static void tick() {
|
||||
ticks++;
|
||||
}
|
||||
|
||||
public static float getRenderTick() {
|
||||
return (ticks + Minecraft.getInstance().getRenderPartialTicks()) / 20;
|
||||
}
|
||||
|
||||
}
|
|
@ -26,7 +26,7 @@ public class FilesHelper {
|
|||
Path path = Paths.get(name);
|
||||
if (path.getParent() != null)
|
||||
createFolderIfMissing(path.getParent().toString());
|
||||
|
||||
|
||||
if (!Files.isDirectory(path)) {
|
||||
try {
|
||||
Files.createDirectory(path);
|
||||
|
@ -49,7 +49,7 @@ public class FilesHelper {
|
|||
}
|
||||
|
||||
public static String slug(String name) {
|
||||
return name.toLowerCase().replace(' ', '_').replace('!', '_').replace('?', '_');
|
||||
return Lang.asId(name).replace(' ', '_').replace('!', '_').replace('?', '_');
|
||||
}
|
||||
|
||||
public static boolean saveTagCompoundAsJson(CompoundNBT compound, String path) {
|
||||
|
@ -65,7 +65,6 @@ public class FilesHelper {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public static boolean saveTagCompoundAsJsonCompact(CompoundNBT compound, String path) {
|
||||
try {
|
||||
|
@ -78,7 +77,7 @@ public class FilesHelper {
|
|||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static CompoundNBT loadJsonNBT(InputStream inputStream) {
|
||||
|
@ -110,5 +109,4 @@ public class FilesHelper {
|
|||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -85,19 +85,41 @@ public class ItemDescription {
|
|||
boolean hasControls = !linesOnCtrl.isEmpty();
|
||||
|
||||
if (hasDescription || hasControls) {
|
||||
String[] holdKey = Lang.translate("tooltip.holdKey", "$").split("\\$");
|
||||
String[] holdKeyOrKey = Lang.translate("tooltip.holdKeyOrKey", "$", "$").split("\\$");
|
||||
String keyShift = Lang.translate("tooltip.keyShift");
|
||||
String keyCtrl = Lang.translate("tooltip.keyCtrl");
|
||||
for (List<ITextComponent> list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) {
|
||||
boolean shift = list == linesOnShift;
|
||||
boolean ctrl = list == linesOnCtrl;
|
||||
|
||||
String tabs = DARK_GRAY + "Hold ";
|
||||
if (hasDescription)
|
||||
tabs += "<" + (shift ? palette.hColor : palette.color) + "Shift" + DARK_GRAY + ">";
|
||||
if (hasDescription && hasControls)
|
||||
tabs += " or ";
|
||||
if (hasControls)
|
||||
tabs += "<" + (ctrl ? palette.hColor : palette.color) + "Control" + DARK_GRAY + ">";
|
||||
if (holdKey.length != 2 || holdKeyOrKey.length != 3) {
|
||||
list.add(0, new StringTextComponent("Invalid lang formatting!"));
|
||||
continue;
|
||||
}
|
||||
|
||||
list.add(0, new StringTextComponent(tabs));
|
||||
StringBuilder tabBuilder = new StringBuilder();
|
||||
tabBuilder.append(DARK_GRAY);
|
||||
if (hasDescription && hasControls) {
|
||||
tabBuilder.append(holdKeyOrKey[0]);
|
||||
tabBuilder.append(shift ? palette.hColor : palette.color);
|
||||
tabBuilder.append(keyShift);
|
||||
tabBuilder.append(DARK_GRAY);
|
||||
tabBuilder.append(holdKeyOrKey[1]);
|
||||
tabBuilder.append(ctrl ? palette.hColor : palette.color);
|
||||
tabBuilder.append(keyCtrl);
|
||||
tabBuilder.append(DARK_GRAY);
|
||||
tabBuilder.append(holdKeyOrKey[2]);
|
||||
|
||||
} else {
|
||||
tabBuilder.append(holdKey[0]);
|
||||
tabBuilder.append((hasDescription ? shift : ctrl) ? palette.hColor : palette.color);
|
||||
tabBuilder.append(hasDescription ? keyShift : keyCtrl);
|
||||
tabBuilder.append(DARK_GRAY);
|
||||
tabBuilder.append(holdKey[1]);
|
||||
}
|
||||
|
||||
list.add(0, new StringTextComponent(tabBuilder.toString()));
|
||||
if (shift || ctrl)
|
||||
list.add(1, new StringTextComponent(""));
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import com.simibubi.create.Create;
|
||||
|
||||
|
@ -30,4 +31,8 @@ public class Lang {
|
|||
return result;
|
||||
}
|
||||
|
||||
public static String asId(String name) {
|
||||
return name.toLowerCase(Locale.ENGLISH);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,8 +45,16 @@ public class RotationPropagator {
|
|||
final Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
|
||||
final World world = from.getWorld();
|
||||
|
||||
boolean connectedByAxis = definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction)
|
||||
boolean alignedAxes = true;
|
||||
for (Axis axis : Axis.values())
|
||||
if (axis != direction.getAxis())
|
||||
if (axis.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0)
|
||||
alignedAxes = false;
|
||||
|
||||
boolean connectedByAxis = alignedAxes
|
||||
&& definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction)
|
||||
&& definitionTo.hasShaftTowards(world, to.getPos(), stateTo, direction.getOpposite());
|
||||
|
||||
boolean connectedByGears = definitionFrom.hasCogsTowards(world, from.getPos(), stateFrom, direction)
|
||||
&& definitionTo.hasCogsTowards(world, to.getPos(), stateTo, direction.getOpposite());
|
||||
|
||||
|
@ -55,10 +63,6 @@ public class RotationPropagator {
|
|||
return ((BeltTileEntity) from).getController().equals(((BeltTileEntity) to).getController()) ? 1 : 0;
|
||||
}
|
||||
|
||||
// Gearbox <-> Gearbox
|
||||
if (from instanceof GearboxTileEntity && to instanceof GearboxTileEntity)
|
||||
return 0;
|
||||
|
||||
// Axis <-> Axis
|
||||
if (connectedByAxis) {
|
||||
return getAxisModifier(from, direction) * getAxisModifier(to, direction.getOpposite());
|
||||
|
@ -84,7 +88,7 @@ public class RotationPropagator {
|
|||
Axis targetAxis = stateTo.get(AXIS);
|
||||
int sourceAxisDiff = sourceAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ());
|
||||
int targetAxisDiff = targetAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ());
|
||||
|
||||
|
||||
return sourceAxisDiff > 0 ^ targetAxisDiff > 0 ? -1 : 1;
|
||||
}
|
||||
|
||||
|
@ -100,7 +104,7 @@ public class RotationPropagator {
|
|||
return 0;
|
||||
if (LARGE_COGWHEEL.typeOf(stateTo))
|
||||
return 0;
|
||||
if (stateFrom.get(AXIS) == stateTo.get(AXIS))
|
||||
if (definitionFrom.getRotationAxis(stateFrom) == definitionTo.getRotationAxis(stateTo))
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
package com.simibubi.create.modules.contraptions;
|
||||
|
||||
import com.simibubi.create.modules.contraptions.base.IRotate;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
public class WrenchItem extends Item {
|
||||
|
||||
public WrenchItem(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onItemUse(ItemUseContext context) {
|
||||
PlayerEntity player = context.getPlayer();
|
||||
if (!player.isAllowEdit())
|
||||
return super.onItemUse(context);
|
||||
|
||||
World world = context.getWorld();
|
||||
BlockPos pos = context.getPos();
|
||||
BlockState state = world.getBlockState(pos);
|
||||
if (!(state.getBlock() instanceof IRotate))
|
||||
return super.onItemUse(context);
|
||||
IRotate actor = (IRotate) state.getBlock();
|
||||
|
||||
if (player.isSneaking()) {
|
||||
if (world instanceof ServerWorld) {
|
||||
if (!player.isCreative())
|
||||
Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos)).forEach(itemStack -> {
|
||||
player.inventory.placeItemBackInInventory(world, itemStack);
|
||||
});
|
||||
world.destroyBlock(pos, false);
|
||||
}
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
return actor.onWrenched(state, context);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.simibubi.create.modules.contraptions;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.ItemRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class WrenchItemRenderer extends ItemStackTileEntityRenderer {
|
||||
|
||||
@Override
|
||||
public void renderByItem(ItemStack stack) {
|
||||
|
||||
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
|
||||
WrenchModel mainModel = (WrenchModel) itemRenderer.getModelWithOverrides(stack);
|
||||
float worldTime = AnimationTickHolder.getRenderTick();
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translatef(0.5F, 0.5F, 0.5F);
|
||||
itemRenderer.renderItem(stack, mainModel.getBakedModel());
|
||||
|
||||
float angle = worldTime * -10 % 360;
|
||||
|
||||
float xOffset = -1/32f;
|
||||
float zOffset = 0;
|
||||
GlStateManager.translatef(-xOffset, 0, -zOffset);
|
||||
GlStateManager.rotated(angle, 0, 1, 0);
|
||||
GlStateManager.translatef(xOffset, 0, zOffset);
|
||||
|
||||
itemRenderer.renderItem(stack, mainModel.gear);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package com.simibubi.create.modules.contraptions;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.foundation.block.CustomRenderItemBakedModel;
|
||||
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
import net.minecraftforge.client.event.ModelBakeEvent;
|
||||
|
||||
public class WrenchModel extends CustomRenderItemBakedModel {
|
||||
|
||||
public IBakedModel gear;
|
||||
|
||||
public WrenchModel(IBakedModel template) {
|
||||
super(template);
|
||||
}
|
||||
|
||||
public static List<String> getCustomModelLocations() {
|
||||
return Arrays.asList("gear");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomRenderItemBakedModel loadPartials(ModelBakeEvent event) {
|
||||
this.gear = loadCustomModel(event, "wrench/gear");
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
package com.simibubi.create.modules.contraptions.base;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -9,8 +11,13 @@ import net.minecraft.world.World;
|
|||
public interface IRotate {
|
||||
|
||||
public boolean hasShaftTowards(World world, BlockPos pos, BlockState state, Direction face);
|
||||
|
||||
public boolean hasCogsTowards(World world, BlockPos pos, BlockState state, Direction face);
|
||||
|
||||
|
||||
public Axis getRotationAxis(BlockState state);
|
||||
|
||||
|
||||
public default ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
return ActionResultType.PASS;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import java.util.function.Function;
|
|||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.BufferManipulator;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -23,7 +24,6 @@ import net.minecraft.util.math.BlockPos;
|
|||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
import net.minecraftforge.client.model.animation.TileEntityRendererFast;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
|
@ -74,7 +74,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
|
|||
|
||||
final BlockPos pos = te.getPos();
|
||||
Axis axis = ((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState());
|
||||
float time = Animation.getWorldTime(Minecraft.getInstance().world, partialTicks);
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
float offset = getRotationOffsetForPosition(te, pos, axis);
|
||||
float angle = (float) (((time * te.getSpeed() + offset) % 360) / 180 * (float) Math.PI);
|
||||
|
||||
|
|
|
@ -3,12 +3,16 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.EnumProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class RotatedPillarKineticBlock extends KineticBlock {
|
||||
|
||||
|
@ -36,7 +40,7 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock {
|
|||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Axis getPreferredAxis(BlockItemUseContext context) {
|
||||
Axis prefferedAxis = null;
|
||||
for (Direction side : Direction.values()) {
|
||||
|
@ -65,4 +69,20 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock {
|
|||
return this.getDefaultState().with(AXIS, context.getFace().getAxis());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Axis axis = context.getFace().getAxis();
|
||||
World world = context.getWorld();
|
||||
if (axis == state.get(AXIS))
|
||||
return ActionResultType.PASS;
|
||||
if (!world.isRemote) {
|
||||
BlockPos pos = context.getPos();
|
||||
world.removeTileEntity(pos);
|
||||
world.setBlockState(pos, state.with(AXIS, axis), 3);
|
||||
KineticTileEntity tileEntity = (KineticTileEntity) world.getTileEntity(pos);
|
||||
tileEntity.attachKinetics();
|
||||
}
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
||||
public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity> {
|
||||
|
||||
public static final VoxelShape SHAPE = makeCuboidShape(0, 0, 0, 16, 13, 16);
|
||||
|
||||
public BasinBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new BasinTileEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
|
||||
BlockRayTraceResult hit) {
|
||||
if (!player.getHeldItem(handIn).isEmpty())
|
||||
return false;
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
return false;
|
||||
|
||||
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(pos);
|
||||
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
|
||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
}
|
||||
te.onEmptied();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLanded(IBlockReader worldIn, Entity entityIn) {
|
||||
super.onLanded(worldIn, entityIn);
|
||||
if (!AllBlocks.BASIN.typeOf(worldIn.getBlockState(entityIn.getPosition())))
|
||||
return;
|
||||
if (!(entityIn instanceof ItemEntity))
|
||||
return;
|
||||
if (!entityIn.isAlive())
|
||||
return;
|
||||
|
||||
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(entityIn.getPosition());
|
||||
ItemEntity itemEntity = (ItemEntity) entityIn;
|
||||
ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false);
|
||||
|
||||
if (insertItem.isEmpty()) {
|
||||
itemEntity.remove();
|
||||
return;
|
||||
}
|
||||
|
||||
itemEntity.setItem(insertItem);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
return;
|
||||
|
||||
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(pos);
|
||||
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
|
||||
inv.getStackInSlot(slot));
|
||||
}
|
||||
|
||||
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
|
||||
worldIn.removeTileEntity(pos);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSolid(BlockState state) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.foundation.block.SyncedTileEntity;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
||||
|
||||
public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEntity {
|
||||
|
||||
protected boolean updateProcessing;
|
||||
|
||||
protected ItemStackHandler outputInventory = new ItemStackHandler(9) {
|
||||
protected void onContentsChanged(int slot) {
|
||||
sendData();
|
||||
markDirty();
|
||||
}
|
||||
};
|
||||
|
||||
protected ItemStackHandler inputInventory = new ItemStackHandler(9) {
|
||||
protected void onContentsChanged(int slot) {
|
||||
updateProcessing = true;
|
||||
sendData();
|
||||
markDirty();
|
||||
};
|
||||
};
|
||||
|
||||
public static class BasinInventory extends CombinedInvWrapper {
|
||||
public BasinInventory(ItemStackHandler input, ItemStackHandler output) {
|
||||
super(input, output);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack extractItem(int slot, int amount, boolean simulate) {
|
||||
if (isInput(slot))
|
||||
return ItemStack.EMPTY;
|
||||
return super.extractItem(slot, amount, simulate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
if (!isInput(slot))
|
||||
return stack;
|
||||
return super.insertItem(slot, stack, simulate);
|
||||
}
|
||||
|
||||
public boolean isInput(int slot) {
|
||||
return getIndexForSlot(slot) == 0;
|
||||
}
|
||||
|
||||
public IItemHandlerModifiable getInputHandler() {
|
||||
return itemHandler[0];
|
||||
}
|
||||
|
||||
public IItemHandlerModifiable getOutputHandler() {
|
||||
return itemHandler[1];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected LazyOptional<IItemHandlerModifiable> inventory = LazyOptional
|
||||
.of(() -> new BasinInventory(inputInventory, outputInventory));
|
||||
|
||||
public BasinTileEntity() {
|
||||
super(AllTileEntities.BASIN.type);
|
||||
updateProcessing = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(CompoundNBT compound) {
|
||||
super.read(compound);
|
||||
inputInventory.deserializeNBT(compound.getCompound("InputItems"));
|
||||
outputInventory.deserializeNBT(compound.getCompound("OutputItems"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundNBT write(CompoundNBT compound) {
|
||||
super.write(compound);
|
||||
compound.put("InputItems", inputInventory.serializeNBT());
|
||||
compound.put("OutputItems", outputInventory.serializeNBT());
|
||||
return compound;
|
||||
}
|
||||
|
||||
public void onEmptied() {
|
||||
TileEntity te = world.getTileEntity(pos.up(2));
|
||||
if (te == null)
|
||||
return;
|
||||
if (te instanceof MechanicalMixerTileEntity)
|
||||
((MechanicalMixerTileEntity) te).basinRemoved = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
onEmptied();
|
||||
inventory.invalidate();
|
||||
super.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
|
||||
return inventory.cast();
|
||||
return super.getCapability(cap, side);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!updateProcessing)
|
||||
return;
|
||||
updateProcessing = false;
|
||||
|
||||
TileEntity te = world.getTileEntity(pos.up(2));
|
||||
if (te == null)
|
||||
return;
|
||||
if (te instanceof MechanicalMixerTileEntity)
|
||||
((MechanicalMixerTileEntity) te).checkBasin = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class BasinTileEntityRenderer extends TileEntityRenderer<BasinTileEntity> {
|
||||
|
||||
@Override
|
||||
public void render(BasinTileEntity basin, double x, double y, double z, float partialTicks, int destroyStage) {
|
||||
super.render(basin, x, y, z, partialTicks, destroyStage);
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
BlockPos pos = basin.getPos();
|
||||
GlStateManager.translated(x + .5, y + .2f, z + .5);
|
||||
Random r = new Random(pos.hashCode());
|
||||
|
||||
IItemHandlerModifiable inv = basin.inventory.orElse(new ItemStackHandler());
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
ItemStack stack = inv.getStackInSlot(slot);
|
||||
if (stack.isEmpty())
|
||||
continue;
|
||||
|
||||
for (int i = 0; i <= stack.getCount() / 8; i++) {
|
||||
GlStateManager.pushMatrix();
|
||||
Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, .25f);
|
||||
Vec3d vec2 = VecHelper.offsetRandomly(Vec3d.ZERO, r, .5f);
|
||||
GlStateManager.translated(vec.x, vec.y, vec.z);
|
||||
GlStateManager.rotated(vec2.x * 180, vec2.z, vec2.y, 0);
|
||||
|
||||
Minecraft.getInstance().getItemRenderer().renderItem(stack, TransformType.GROUND);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
GlStateManager.translated(0, 1 / 64f, 0);
|
||||
}
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import com.simibubi.create.foundation.packet.TileEntityConfigurationPacket;
|
||||
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class ConfigureMixerPacket extends TileEntityConfigurationPacket<MechanicalMixerTileEntity> {
|
||||
|
||||
private int value;
|
||||
|
||||
public ConfigureMixerPacket(BlockPos pos, int value) {
|
||||
super(pos);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public ConfigureMixerPacket(PacketBuffer buffer) {
|
||||
super(buffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeSettings(PacketBuffer buffer) {
|
||||
buffer.writeInt(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readSettings(PacketBuffer buffer) {
|
||||
value = buffer.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applySettings(MechanicalMixerTileEntity te) {
|
||||
te.minIngredients = value;
|
||||
te.markDirty();
|
||||
te.sendData();
|
||||
te.checkBasin = true;
|
||||
}
|
||||
|
||||
}
|
|
@ -76,6 +76,8 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
public void updateControllers(BlockState state, World world, BlockPos pos, Direction facing) {
|
||||
if (facing.getAxis() == state.get(AXIS) || facing.getAxis().isVertical())
|
||||
return;
|
||||
if (world == null)
|
||||
return;
|
||||
|
||||
BlockPos controllerPos = pos.offset(facing);
|
||||
BlockPos otherWheelPos = pos.offset(facing, 2);
|
||||
|
|
|
@ -65,10 +65,12 @@ public class CrushingWheelControllerBlock extends Block implements IWithoutBlock
|
|||
super.onLanded(worldIn, entityIn);
|
||||
if (CrushingWheelControllerTileEntity.isFrozen())
|
||||
return;
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn
|
||||
.getTileEntity(entityIn.getPosition().down());
|
||||
if (te == null)
|
||||
TileEntity tileEntity = worldIn.getTileEntity(entityIn.getPosition().down());
|
||||
if (tileEntity == null)
|
||||
return;
|
||||
if (!(tileEntity instanceof CrushingWheelControllerTileEntity))
|
||||
return;
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity;
|
||||
if (te.isOccupied())
|
||||
return;
|
||||
|
||||
|
@ -96,7 +98,7 @@ public class CrushingWheelControllerBlock extends Block implements IWithoutBlock
|
|||
|
||||
public void updateSpeed(BlockState state, World world, BlockPos pos) {
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) world.getTileEntity(pos);
|
||||
|
||||
|
||||
if (te == null)
|
||||
return;
|
||||
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) {
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.block.IBlockWithScrollableValue;
|
||||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class MechanicalMixerBlock extends KineticBlock
|
||||
implements IWithTileEntity<MechanicalMixerTileEntity>, IBlockWithScrollableValue {
|
||||
|
||||
private static final Vec3d valuePos = new Vec3d(15.8f / 16f, 6 / 16f, 5 / 16f);
|
||||
|
||||
public MechanicalMixerBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new MechanicalMixerTileEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasStaticPart() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return MechanicalPressBlock.SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRenderLayer getRenderLayer() {
|
||||
return BlockRenderLayer.CUTOUT_MIPPED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Axis getRotationAxis(BlockState state) {
|
||||
return Axis.Y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasShaftTowards(World world, BlockPos pos, BlockState state, Direction face) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCogsTowards(World world, BlockPos pos, BlockState state, Direction face) {
|
||||
return face.getAxis().isHorizontal();
|
||||
}
|
||||
|
||||
public static class MechanicalMixerBlockItem extends BlockItem {
|
||||
|
||||
public MechanicalMixerBlockItem(Properties builder) {
|
||||
super(AllBlocks.MECHANICAL_MIXER.get(), builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType tryPlace(BlockItemUseContext context) {
|
||||
|
||||
BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite());
|
||||
BlockState placedOnState = context.getWorld().getBlockState(placedOnPos);
|
||||
if (AllBlocks.BASIN.typeOf(placedOnState)) {
|
||||
if (context.getWorld().getBlockState(placedOnPos.up(2)).getMaterial().isReplaceable())
|
||||
context = BlockItemUseContext.func_221536_a(context, placedOnPos.up(2), Direction.UP);
|
||||
else
|
||||
return ActionResultType.FAIL;
|
||||
}
|
||||
|
||||
return super.tryPlace(context);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValueName(BlockState state, IWorld world, BlockPos pos) {
|
||||
return Lang.translate("mechanical_mixer.min_ingredients");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vec3d getValueBoxPosition(BlockState state, IWorld world, BlockPos pos) {
|
||||
return valuePos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Direction getValueBoxDirection(BlockState state, IWorld world, BlockPos pos) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValueOnMultipleFaces() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresWrench() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValueOnFace(Direction face) {
|
||||
return face.getAxis().isHorizontal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScroll(BlockState state, IWorld world, BlockPos pos, double value) {
|
||||
withTileEntityDo(world, pos, te -> te.setMinIngredientsLazily((int) (te.currentValue + value)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCurrentValue(BlockState state, IWorld world, BlockPos pos) {
|
||||
MechanicalMixerTileEntity tileEntity = (MechanicalMixerTileEntity) world.getTileEntity(pos);
|
||||
if (tileEntity == null)
|
||||
return 0;
|
||||
return tileEntity.currentValue;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,322 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.simibubi.create.AllPackets;
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.receivers.BasinTileEntity.BasinInventory;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.BucketItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.IRecipeSerializer;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.item.crafting.ShapelessRecipe;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.particles.ItemParticleData;
|
||||
import net.minecraft.particles.ParticleTypes;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
|
||||
public class MechanicalMixerTileEntity extends KineticTileEntity implements ITickableTileEntity {
|
||||
|
||||
public int runningTicks;
|
||||
public int processingTicks;
|
||||
public boolean running;
|
||||
public boolean checkBasin;
|
||||
public boolean basinRemoved;
|
||||
|
||||
public int minIngredients;
|
||||
public int currentValue;
|
||||
public int lastModified;
|
||||
|
||||
private ShapelessRecipe lastRecipe;
|
||||
private LazyOptional<IItemHandler> basinInv = LazyOptional.empty();
|
||||
private List<ItemStack> inputs;
|
||||
|
||||
public MechanicalMixerTileEntity() {
|
||||
super(AllTileEntities.MECHANICAL_MIXER.type);
|
||||
checkBasin = true;
|
||||
minIngredients = currentValue = 1;
|
||||
lastModified = -1;
|
||||
processingTicks = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSpeedChanged() {
|
||||
super.onSpeedChanged();
|
||||
checkBasin = true;
|
||||
}
|
||||
|
||||
public float getRenderedHeadOffset(float partialTicks) {
|
||||
int localTick = 0;
|
||||
if (running) {
|
||||
if (runningTicks < 20) {
|
||||
localTick = runningTicks;
|
||||
float num = (localTick + partialTicks) / 20f;
|
||||
num = ((2 - MathHelper.cos((float) (num * Math.PI))) / 2);
|
||||
return num - .5f;
|
||||
}
|
||||
if (runningTicks <= 20) {
|
||||
return 1;
|
||||
}
|
||||
if (runningTicks > 20) {
|
||||
localTick = 40 - runningTicks;
|
||||
float num = (localTick - partialTicks) / 20f;
|
||||
num = ((2 - MathHelper.cos((float) (num * Math.PI))) / 2);
|
||||
return num - .5f;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float getRenderedHeadRotationSpeed(float partialTicks) {
|
||||
if (running) {
|
||||
if (runningTicks < 15) {
|
||||
return speed;
|
||||
}
|
||||
if (runningTicks <= 20) {
|
||||
return speed * 2;
|
||||
}
|
||||
if (runningTicks > 20) {
|
||||
return speed;
|
||||
}
|
||||
}
|
||||
return speed / 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
return new AxisAlignedBB(pos).expand(0, -1.5, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(CompoundNBT compound) {
|
||||
running = compound.getBoolean("Running");
|
||||
runningTicks = compound.getInt("Ticks");
|
||||
currentValue = minIngredients = compound.getInt("MinIngredients");
|
||||
super.read(compound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundNBT write(CompoundNBT compound) {
|
||||
compound.putBoolean("Running", running);
|
||||
compound.putInt("Ticks", runningTicks);
|
||||
compound.putInt("MinIngredients", minIngredients);
|
||||
return super.write(compound);
|
||||
}
|
||||
|
||||
public void setMinIngredientsLazily(int minIngredients) {
|
||||
this.currentValue = MathHelper.clamp(minIngredients, 1, 9);
|
||||
if (currentValue == this.minIngredients)
|
||||
return;
|
||||
this.lastModified = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
|
||||
if (world.isRemote && lastModified != -1) {
|
||||
if (lastModified++ > 10) {
|
||||
lastModified = -1;
|
||||
AllPackets.channel.sendToServer(new ConfigureMixerPacket(pos, currentValue));
|
||||
}
|
||||
}
|
||||
|
||||
if (runningTicks == 40) {
|
||||
running = false;
|
||||
runningTicks = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (basinRemoved) {
|
||||
basinRemoved = false;
|
||||
if (running) {
|
||||
runningTicks = 40;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (running) {
|
||||
if (world.isRemote && runningTicks == 20)
|
||||
renderParticles();
|
||||
|
||||
if (!world.isRemote && runningTicks == 20) {
|
||||
if (processingTicks < 0) {
|
||||
processingTicks = (MathHelper.log2((int) (8000 / Math.abs(speed)))) * 15 + 1;
|
||||
return;
|
||||
}
|
||||
processingTicks--;
|
||||
if (processingTicks == 0) {
|
||||
runningTicks++;
|
||||
processingTicks = -1;
|
||||
applyRecipe();
|
||||
sendData();
|
||||
}
|
||||
}
|
||||
|
||||
if (runningTicks != 20)
|
||||
runningTicks++;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math.abs(speed) < 32)
|
||||
return;
|
||||
if (!checkBasin)
|
||||
return;
|
||||
checkBasin = false;
|
||||
TileEntity basinTE = world.getTileEntity(pos.down(2));
|
||||
if (basinTE == null || !(basinTE instanceof BasinTileEntity))
|
||||
return;
|
||||
if (!basinInv.isPresent())
|
||||
basinInv = basinTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
|
||||
if (!basinInv.isPresent())
|
||||
return;
|
||||
|
||||
if (world.isRemote)
|
||||
return;
|
||||
|
||||
gatherInputs();
|
||||
if (matchRecipe(lastRecipe)) {
|
||||
running = true;
|
||||
runningTicks = 0;
|
||||
sendData();
|
||||
return;
|
||||
}
|
||||
|
||||
List<IRecipe<?>> shapelessRecipe = world.getRecipeManager().getRecipes().parallelStream()
|
||||
.filter(recipe -> recipe.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS)
|
||||
.filter(this::matchRecipe).sorted((r1, r2) -> r1.getIngredients().size() - r2.getIngredients().size())
|
||||
.collect(Collectors.toList());
|
||||
if (shapelessRecipe.isEmpty())
|
||||
return;
|
||||
|
||||
running = true;
|
||||
runningTicks = 0;
|
||||
lastRecipe = (ShapelessRecipe) shapelessRecipe.get(0);
|
||||
sendData();
|
||||
}
|
||||
|
||||
public void renderParticles() {
|
||||
IItemHandler itemHandler = basinInv.orElse(null);
|
||||
if (itemHandler != null) {
|
||||
BasinInventory inv = (BasinInventory) itemHandler;
|
||||
|
||||
for (int slot = 0; slot < inv.getInputHandler().getSlots(); slot++) {
|
||||
ItemStack stackInSlot = itemHandler.getStackInSlot(slot);
|
||||
if (stackInSlot.isEmpty())
|
||||
continue;
|
||||
|
||||
ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot);
|
||||
float angle = world.rand.nextFloat() * 360;
|
||||
Vec3d offset = new Vec3d(0, 0, 0.25f);
|
||||
offset = VecHelper.rotate(offset, angle, Axis.Y);
|
||||
Vec3d target = VecHelper.rotate(offset, speed > 0 ? 25 : -25, Axis.Y).add(0, .25f, 0);
|
||||
|
||||
Vec3d center = offset.add(VecHelper.getCenterOf(pos));
|
||||
target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f);
|
||||
world.addParticle(data, center.x, center.y - 2, center.z, target.x, target.y, target.z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void gatherInputs() {
|
||||
BasinInventory inv = (BasinInventory) basinInv.orElse(null);
|
||||
inputs = new ArrayList<>();
|
||||
IItemHandlerModifiable inputHandler = inv.getInputHandler();
|
||||
for (int slot = 0; slot < inputHandler.getSlots(); ++slot) {
|
||||
ItemStack itemstack = inputHandler.extractItem(slot, inputHandler.getSlotLimit(slot), true);
|
||||
if (!itemstack.isEmpty()) {
|
||||
inputs.add(itemstack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void applyRecipe() {
|
||||
if (lastRecipe == null)
|
||||
return;
|
||||
if (!basinInv.isPresent())
|
||||
return;
|
||||
|
||||
BasinInventory inv = (BasinInventory) basinInv.orElse(null);
|
||||
if (inv == null)
|
||||
return;
|
||||
|
||||
IItemHandlerModifiable inputs = inv.getInputHandler();
|
||||
IItemHandlerModifiable outputs = inv.getOutputHandler();
|
||||
int buckets = 0;
|
||||
Ingredients: for (Ingredient ingredient : lastRecipe.getIngredients()) {
|
||||
for (int slot = 0; slot < inputs.getSlots(); slot++) {
|
||||
if (!ingredient.test(inputs.extractItem(slot, 1, true)))
|
||||
continue;
|
||||
ItemStack extracted = inputs.extractItem(slot, 1, false);
|
||||
if (extracted.getItem() instanceof BucketItem)
|
||||
buckets++;
|
||||
continue Ingredients;
|
||||
}
|
||||
// something wasn't found
|
||||
return;
|
||||
}
|
||||
|
||||
ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput().copy(), false);
|
||||
if (buckets > 0)
|
||||
ItemHandlerHelper.insertItemStacked(outputs, new ItemStack(Items.BUCKET, buckets), false);
|
||||
|
||||
// Continue mixing
|
||||
gatherInputs();
|
||||
if (matchRecipe(lastRecipe)) {
|
||||
runningTicks = 20;
|
||||
sendData();
|
||||
}
|
||||
}
|
||||
|
||||
public <C extends IInventory> boolean matchRecipe(IRecipe<C> recipe) {
|
||||
if (!(recipe instanceof ShapelessRecipe))
|
||||
return false;
|
||||
if (recipe.getIngredients().size() < minIngredients)
|
||||
return false;
|
||||
|
||||
ShapelessRecipe shapelessRecipe = (ShapelessRecipe) recipe;
|
||||
NonNullList<Ingredient> ingredients = shapelessRecipe.getIngredients();
|
||||
if (!ingredients.stream().allMatch(Ingredient::isSimple))
|
||||
return false;
|
||||
|
||||
List<ItemStack> remaining = new ArrayList<>();
|
||||
inputs.forEach(stack -> remaining.add(stack.copy()));
|
||||
|
||||
// sort by leniency
|
||||
List<Ingredient> sortedIngredients = new LinkedList<>(ingredients);
|
||||
sortedIngredients.sort((i1, i2) -> i1.getMatchingStacks().length - i2.getMatchingStacks().length);
|
||||
Ingredients: for (Ingredient ingredient : sortedIngredients) {
|
||||
for (ItemStack stack : remaining) {
|
||||
if (stack.isEmpty())
|
||||
continue;
|
||||
if (ingredient.test(stack)) {
|
||||
stack.shrink(1);
|
||||
continue Ingredients;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.simibubi.create.modules.contraptions.receivers;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntityRenderer.HeadTranslator;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class MechanicalMixerTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
||||
@Override
|
||||
public void renderTileEntityFast(KineticTileEntity te, double x, double y, double z, float partialTicks,
|
||||
int destroyStage, BufferBuilder buffer) {
|
||||
super.renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, buffer);
|
||||
|
||||
final BlockState poleState = AllBlocks.MECHANICAL_MIXER_POLE.get().getDefaultState();
|
||||
final BlockState headState = AllBlocks.MECHANICAL_MIXER_HEAD.get().getDefaultState();
|
||||
cacheIfMissing(poleState, HeadTranslator::new);
|
||||
cacheIfMissing(headState, HeadTranslator::new);
|
||||
final BlockPos pos = te.getPos();
|
||||
|
||||
int packedLightmapCoords = poleState.getPackedLightmapCoords(getWorld(), pos);
|
||||
float speed = ((MechanicalMixerTileEntity) te).getRenderedHeadRotationSpeed(partialTicks);
|
||||
float renderedHeadOffset = ((MechanicalMixerTileEntity) te).getRenderedHeadOffset(partialTicks) + 7 / 16f;
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
float angle = (float) (((time * speed * 2) % 360) / 180 * (float) Math.PI);
|
||||
|
||||
buffer.putBulkData(((HeadTranslator) cachedBuffers.get(poleState)).getTransformed((float) x, (float) y,
|
||||
(float) z, renderedHeadOffset, packedLightmapCoords));
|
||||
buffer.putBulkData(((HeadTranslator) cachedBuffers.get(headState)).getTransformedRotated((float) x, (float) y,
|
||||
(float) z, renderedHeadOffset, angle, packedLightmapCoords));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockState getRenderedBlockState(KineticTileEntity te) {
|
||||
return AllBlocks.SHAFTLESS_COGWHEEL.get().getDefaultState().with(BlockStateProperties.AXIS, Axis.Y);
|
||||
}
|
||||
|
||||
}
|
|
@ -10,11 +10,13 @@ import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
public class MechanicalPressTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
||||
protected class HeadTranslator extends BufferManipulator {
|
||||
public static class HeadTranslator extends BufferManipulator {
|
||||
|
||||
public HeadTranslator(ByteBuffer original) {
|
||||
super(original);
|
||||
|
@ -32,6 +34,30 @@ public class MechanicalPressTileEntityRenderer extends KineticTileEntityRenderer
|
|||
|
||||
return mutable;
|
||||
}
|
||||
|
||||
public ByteBuffer getTransformedRotated(float xIn, float yIn, float zIn, float pushDistance, float angle,
|
||||
int packedLightCoords) {
|
||||
original.rewind();
|
||||
mutable.rewind();
|
||||
float cos = MathHelper.cos(angle);
|
||||
float sin = MathHelper.sin(angle);
|
||||
|
||||
for (int vertex = 0; vertex < vertexCount(original); vertex++) {
|
||||
float x = getX(original, vertex) - .5f;
|
||||
float y = getY(original, vertex) + yIn - pushDistance;
|
||||
float z = getZ(original, vertex) - .5f;
|
||||
float x2 = x;
|
||||
|
||||
x = rotateX(x, y, z, sin, cos, Axis.Y) + .5f + xIn;
|
||||
z = rotateZ(x2, y, z, sin, cos, Axis.Y) + .5f + zIn;
|
||||
|
||||
putPos(mutable, vertex, x, y, z);
|
||||
putLight(mutable, vertex, packedLightCoords);
|
||||
}
|
||||
|
||||
return mutable;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -65,7 +65,7 @@ public class TurntableBlock extends KineticBlock {
|
|||
if (!world.isRemote && (e instanceof PlayerEntity))
|
||||
return;
|
||||
|
||||
if (offset.length() > 1 / 16f) {
|
||||
if (offset.length() > 1 / 4f) {
|
||||
offset = VecHelper.rotate(offset, speed / 1f, Axis.Y);
|
||||
Vec3d movement = origin.add(offset).subtract(e.getPositionVec());
|
||||
e.setMotion(e.getMotion().add(movement));
|
||||
|
|
|
@ -6,21 +6,26 @@ import com.simibubi.create.foundation.block.IBlockWithScrollableValue;
|
|||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.RotatedPillarBlock;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.particles.ParticleTypes;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvents;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.Tags;
|
||||
|
||||
public abstract class AbstractChassisBlock extends RotatedPillarBlock
|
||||
implements IWithTileEntity<ChassisTileEntity>, IBlockWithScrollableValue {
|
||||
|
@ -52,16 +57,24 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock
|
|||
return false;
|
||||
|
||||
ItemStack heldItem = player.getHeldItem(handIn);
|
||||
boolean isSlimeBall = heldItem.isItemEqual(new ItemStack(Items.SLIME_BALL));
|
||||
boolean isSlimeBall = heldItem.getItem().isIn(Tags.Items.SLIMEBALLS);
|
||||
|
||||
if ((!heldItem.isEmpty() || !player.isSneaking()) && !isSlimeBall)
|
||||
return false;
|
||||
if (state.get(affectedSide) == isSlimeBall)
|
||||
return false;
|
||||
if (worldIn.isRemote)
|
||||
if (worldIn.isRemote) {
|
||||
Vec3d vec = hit.getHitVec();
|
||||
worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
worldIn.playSound(null, pos, SoundEvents.BLOCK_SLIME_BLOCK_PLACE, SoundCategory.BLOCKS, .5f, 1);
|
||||
if (isSlimeBall && !player.isCreative())
|
||||
heldItem.shrink(1);
|
||||
if (!isSlimeBall && !player.isCreative())
|
||||
Block.spawnAsEntity(worldIn, pos.offset(hit.getFace()), new ItemStack(Items.SLIME_BALL));
|
||||
|
||||
worldIn.setBlockState(pos, state.with(affectedSide, isSlimeBall));
|
||||
return true;
|
||||
}
|
||||
|
@ -81,6 +94,11 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock
|
|||
return Lang.translate("generic.range");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresWrench() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vec3d getValueBoxPosition(BlockState state, IWorld world, BlockPos pos) {
|
||||
return valuePos;
|
||||
|
@ -104,7 +122,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isValueOnAllSides() {
|
||||
public boolean isValueOnMultipleFaces() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ public class ConfigureChassisPacket extends TileEntityConfigurationPacket<Chassi
|
|||
@Override
|
||||
protected void applySettings(ChassisTileEntity te) {
|
||||
te.setRange(range);
|
||||
te.markDirty();
|
||||
te.sendData();
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL11;
|
|||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.PlacementSimulationWorld;
|
||||
import com.simibubi.create.modules.contraptions.base.IRotate;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
|
@ -25,7 +26,6 @@ import net.minecraft.util.Direction;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
|
||||
public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
@ -39,7 +39,7 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
|
|||
MechanicalBearingTileEntity bearingTe = (MechanicalBearingTileEntity) te;
|
||||
final Direction facing = te.getBlockState().get(BlockStateProperties.FACING);
|
||||
final BlockPos pos = te.getPos();
|
||||
float time = Animation.getWorldTime(Minecraft.getInstance().world, partialTicks);
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
BlockState shaftState = AllBlocks.SHAFT_HALF.get().getDefaultState().with(BlockStateProperties.FACING,
|
||||
facing.getOpposite());
|
||||
BlockState capState = AllBlocks.MECHANICAL_BEARING_TOP.get().getDefaultState().with(BlockStateProperties.FACING,
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.receivers.constructs;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.CreateConfig;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -102,7 +103,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock {
|
|||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
return Lang.asId(name());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package com.simibubi.create.modules.contraptions.relays;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.modules.contraptions.base.IRotate;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -27,7 +30,7 @@ public class CogWheelBlock extends ShaftBlock {
|
|||
protected static final VoxelShape LARGE_GEAR_Z = makeCuboidShape(0, 0, 6, 16, 16, 10);
|
||||
|
||||
public CogWheelBlock(boolean large) {
|
||||
super(Properties.from(Blocks.STRIPPED_SPRUCE_LOG));
|
||||
super(Properties.from(Blocks.GRANITE));
|
||||
isLarge = large;
|
||||
}
|
||||
|
||||
|
@ -49,17 +52,30 @@ public class CogWheelBlock extends ShaftBlock {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite());
|
||||
BlockState placedAgainst = context.getWorld().getBlockState(placedOnPos);
|
||||
Block block = placedAgainst.getBlock();
|
||||
|
||||
if (!(block instanceof IRotate) || !(((IRotate) block).hasCogsTowards(context.getWorld(), placedOnPos,
|
||||
placedAgainst, context.getFace())))
|
||||
return super.getStateForPlacement(context);
|
||||
|
||||
return getDefaultState().with(AXIS, ((IRotate) block).getRotationAxis(placedAgainst));
|
||||
}
|
||||
|
||||
private VoxelShape getGearShape(BlockState state) {
|
||||
if (state.get(AXIS) == Axis.X)
|
||||
return isLarge ? LARGE_GEAR_X : GEAR_X;
|
||||
if (state.get(AXIS) == Axis.Z)
|
||||
return isLarge ? LARGE_GEAR_Z : GEAR_Z;
|
||||
|
||||
|
||||
return isLarge ? LARGE_GEAR_Y : GEAR_Y;
|
||||
}
|
||||
|
||||
|
||||
// IRotate
|
||||
|
||||
|
||||
@Override
|
||||
public boolean hasCogsTowards(World world, BlockPos pos, BlockState state, Direction face) {
|
||||
return !isLarge && face.getAxis() != state.get(AXIS);
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
package com.simibubi.create.modules.contraptions.relays;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
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.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
||||
|
@ -20,15 +19,13 @@ public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
|
|||
int destroyStage, BufferBuilder buffer) {
|
||||
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
|
||||
final BlockPos pos = te.getPos();
|
||||
float time = Animation.getWorldTime(Minecraft.getInstance().world, partialTicks);
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
final BlockState defaultState = AllBlocks.SHAFT_HALF.get().getDefaultState();
|
||||
|
||||
for (Direction direction : Direction.values()) {
|
||||
final Axis axis = direction.getAxis();
|
||||
if (boxAxis == axis)
|
||||
continue;
|
||||
if (AllBlocks.GEARBOX.typeOf(getWorld().getBlockState(pos.offset(direction))))
|
||||
continue;
|
||||
|
||||
BlockState state = defaultState.with(BlockStateProperties.FACING, direction);
|
||||
cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
|
||||
|
|
|
@ -3,7 +3,6 @@ package com.simibubi.create.modules.contraptions.relays;
|
|||
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
|
@ -38,17 +37,6 @@ public class ShaftBlock extends RotatedPillarKineticBlock {
|
|||
return state.get(AXIS) == Axis.X ? AXIS_X : state.get(AXIS) == Axis.Z ? AXIS_Z : AXIS_Y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockState placedAgainst = context.getWorld()
|
||||
.getBlockState(context.getPos().offset(context.getFace().getOpposite()));
|
||||
|
||||
if (!(placedAgainst.getBlock() instanceof ShaftBlock))
|
||||
return super.getStateForPlacement(context);
|
||||
|
||||
return getDefaultState().with(AXIS, placedAgainst.get(AXIS));
|
||||
}
|
||||
|
||||
// IRotate:
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
package com.simibubi.create.modules.contraptions.relays;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
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.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class SplitShaftTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
||||
|
@ -20,7 +19,7 @@ public class SplitShaftTileEntityRenderer extends KineticTileEntityRenderer {
|
|||
int destroyStage, BufferBuilder buffer) {
|
||||
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
|
||||
final BlockPos pos = te.getPos();
|
||||
float time = Animation.getWorldTime(Minecraft.getInstance().world, partialTicks);
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
final BlockState defaultState = AllBlocks.SHAFT_HALF.get().getDefaultState();
|
||||
|
||||
for (Direction direction : Direction.values()) {
|
||||
|
|
|
@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks;
|
|||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.block.IWithoutBlockItem;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity.TransportedEntityInfo;
|
||||
|
||||
|
@ -325,7 +326,7 @@ public class BeltBlock extends HorizontalKineticBlock implements IWithoutBlockIt
|
|||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
return Lang.asId(name());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -334,7 +335,7 @@ public class BeltBlock extends HorizontalKineticBlock implements IWithoutBlockIt
|
|||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name().toLowerCase();
|
||||
return Lang.asId(name());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,9 +69,8 @@ public class BeltItem extends Item {
|
|||
context.getItem().shrink(1);
|
||||
}
|
||||
|
||||
tag.remove("FirstPulley");
|
||||
if (!context.getItem().isEmpty()) {
|
||||
context.getItem().setTag(tag);
|
||||
context.getItem().setTag(null);
|
||||
context.getPlayer().getCooldownTracker().setCooldown(this, 5);
|
||||
}
|
||||
return ActionResultType.SUCCESS;
|
||||
|
|
|
@ -23,6 +23,8 @@ import net.minecraft.entity.player.PlayerEntity;
|
|||
import net.minecraft.item.DyeColor;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.potion.EffectInstance;
|
||||
import net.minecraft.potion.Effects;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
@ -196,9 +198,10 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
|
|||
if (entityIn.posY - .25f < pos.getY())
|
||||
return;
|
||||
|
||||
// Not sure if this does anything
|
||||
if (entityIn instanceof LivingEntity)
|
||||
((LivingEntity) entityIn).setIdleTime(101);
|
||||
// Lock entities in place
|
||||
if (entityIn instanceof LivingEntity && !(entityIn instanceof PlayerEntity)) {
|
||||
((LivingEntity) entityIn).addPotionEffect(new EffectInstance(Effects.SLOWNESS, 1, 9, false, false));
|
||||
}
|
||||
|
||||
BeltTileEntity belt = (BeltTileEntity) te;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.nio.ByteBuffer;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.Create;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.BufferManipulator;
|
||||
import com.simibubi.create.modules.contraptions.base.IRotate;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
|
@ -17,7 +18,6 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
|||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class BeltTileEntityRenderer extends KineticTileEntityRenderer {
|
||||
|
||||
|
@ -45,8 +45,7 @@ public class BeltTileEntityRenderer extends KineticTileEntityRenderer {
|
|||
float textureOffsetY = 0;
|
||||
|
||||
if (te.getSpeed() != 0) {
|
||||
float time = Animation.getWorldTime(Minecraft.getInstance().world,
|
||||
Minecraft.getInstance().getRenderPartialTicks());
|
||||
float time = AnimationTickHolder.getRenderTick();
|
||||
Direction direction = te.getBlockState().get(BlockStateProperties.HORIZONTAL_FACING);
|
||||
if (direction == Direction.EAST || direction == Direction.NORTH)
|
||||
time = -time;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simibubi.create.modules.curiosities;
|
||||
|
||||
import com.simibubi.create.foundation.item.IItemWithColorHandler;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -10,7 +11,6 @@ import net.minecraft.item.ItemStack;
|
|||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class ChromaticCompoundCubeItem extends Item implements IItemWithColorHandler {
|
||||
|
||||
|
@ -21,7 +21,7 @@ public class ChromaticCompoundCubeItem extends Item implements IItemWithColorHan
|
|||
Minecraft mc = Minecraft.getInstance();
|
||||
float pt = mc.getRenderPartialTicks();
|
||||
float progress = (float) ((mc.player.getYaw(pt)) / 180 * Math.PI)
|
||||
+ (Animation.getWorldTime(mc.world, pt) * 1f);
|
||||
+ (AnimationTickHolder.getRenderTick() * 1f);
|
||||
if (layer == 0)
|
||||
return ColorHelper.mixColors(0xDDDDDD, 0xDDDDDD, ((float) MathHelper.sin(progress) + 1) / 2);
|
||||
if (layer == 1)
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package com.simibubi.create.modules.curiosities.partialWindows;
|
||||
|
||||
import static com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity.PARTIAL_BLOCK;
|
||||
import static com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity.POSITION;
|
||||
import static com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity.WINDOW_BLOCK;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
@ -23,14 +27,9 @@ 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);
|
||||
}
|
||||
|
@ -46,7 +45,7 @@ public class WindowInABlockModel extends WrappedBakedModel {
|
|||
|
||||
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));
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
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;
|
||||
|
||||
|
@ -16,6 +13,7 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.client.model.data.IModelData;
|
||||
import net.minecraftforge.client.model.data.ModelDataMap;
|
||||
import net.minecraftforge.client.model.data.ModelProperty;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
|
||||
public class WindowInABlockTileEntity extends SyncedTileEntity {
|
||||
|
@ -26,6 +24,10 @@ public class WindowInABlockTileEntity extends SyncedTileEntity {
|
|||
@OnlyIn(value = Dist.CLIENT)
|
||||
private IModelData modelData;
|
||||
|
||||
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 WindowInABlockTileEntity() {
|
||||
super(AllTileEntities.WINDOW_IN_A_BLOCK.type);
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> this::initDataMap);
|
||||
|
@ -34,8 +36,7 @@ public class WindowInABlockTileEntity extends SyncedTileEntity {
|
|||
@OnlyIn(value = Dist.CLIENT)
|
||||
private void initDataMap() {
|
||||
modelData = new ModelDataMap.Builder().withInitial(WINDOW_BLOCK, Blocks.AIR.getDefaultState())
|
||||
.withInitial(PARTIAL_BLOCK, Blocks.AIR.getDefaultState())
|
||||
.withInitial(WindowInABlockModel.POSITION, BlockPos.ZERO).build();
|
||||
.withInitial(PARTIAL_BLOCK, Blocks.AIR.getDefaultState()).withInitial(POSITION, BlockPos.ZERO).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -70,9 +71,9 @@ public class WindowInABlockTileEntity extends SyncedTileEntity {
|
|||
@OnlyIn(value = Dist.CLIENT)
|
||||
@Override
|
||||
public IModelData getModelData() {
|
||||
modelData.setData(WindowInABlockModel.PARTIAL_BLOCK, partialBlock);
|
||||
modelData.setData(WindowInABlockModel.WINDOW_BLOCK, windowBlock);
|
||||
modelData.setData(WindowInABlockModel.POSITION, pos);
|
||||
modelData.setData(PARTIAL_BLOCK, partialBlock);
|
||||
modelData.setData(WINDOW_BLOCK, windowBlock);
|
||||
modelData.setData(POSITION, pos);
|
||||
return modelData;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,11 +46,11 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
|||
@EventBusSubscriber(value = Dist.CLIENT)
|
||||
public class BuilderGunHandler {
|
||||
|
||||
private static List<LaserBeam> cachedBeams;
|
||||
private static float leftHandAnimation;
|
||||
private static float rightHandAnimation;
|
||||
private static float lastLeftHandAnimation;
|
||||
private static float lastRightHandAnimation;
|
||||
public static List<LaserBeam> cachedBeams;
|
||||
public static float leftHandAnimation;
|
||||
public static float rightHandAnimation;
|
||||
public static float lastLeftHandAnimation;
|
||||
public static float lastRightHandAnimation;
|
||||
|
||||
private static boolean dontReequipLeft;
|
||||
private static boolean dontReequipRight;
|
||||
|
@ -86,8 +86,9 @@ public class BuilderGunHandler {
|
|||
ClientPlayerEntity player = Minecraft.getInstance().player;
|
||||
float yaw = (float) ((player.getYaw(partialTicks)) / -180 * Math.PI);
|
||||
float pitch = (float) ((player.getPitch(partialTicks)) / -180 * Math.PI);
|
||||
Vec3d barrelPosNoTransform = new Vec3d(mainHand == (player.getPrimaryHand() == HandSide.RIGHT) ? -.35f : .35f,
|
||||
-0.1f, 1);
|
||||
boolean rightHand = mainHand == (player.getPrimaryHand() == HandSide.RIGHT);
|
||||
float zOffset = ((float) Minecraft.getInstance().gameSettings.fov - 70) / -100;
|
||||
Vec3d barrelPosNoTransform = new Vec3d(rightHand ? -.35f : .35f, -0.115f, .75f + zOffset);
|
||||
Vec3d barrelPos = player.getEyePosition(partialTicks)
|
||||
.add(barrelPosNoTransform.rotatePitch(pitch).rotateYaw(yaw));
|
||||
return barrelPos;
|
||||
|
|
|
@ -66,9 +66,7 @@ import net.minecraftforge.fml.network.PacketDistributor;
|
|||
public class BuilderGunItem extends Item {
|
||||
|
||||
public static enum ComponentTier {
|
||||
None(TextFormatting.DARK_GRAY),
|
||||
BlazeBrass(TextFormatting.GOLD),
|
||||
ChorusChrome(TextFormatting.LIGHT_PURPLE),
|
||||
None(TextFormatting.DARK_GRAY), BlazeBrass(TextFormatting.GOLD), ChorusChrome(TextFormatting.LIGHT_PURPLE),
|
||||
|
||||
;
|
||||
|
||||
|
@ -108,9 +106,9 @@ public class BuilderGunItem extends Item {
|
|||
for (Components c : Components.values()) {
|
||||
ComponentTier tier = getTier(c, stack);
|
||||
ItemDescription.add(tooltip,
|
||||
"> " + TextFormatting.GRAY + Lang.translate("blockzapper.component." + c.name().toLowerCase())
|
||||
"> " + TextFormatting.GRAY + Lang.translate("blockzapper.component." + Lang.asId(c.name()))
|
||||
+ ": " + tier.color
|
||||
+ Lang.translate("blockzapper.componentTier." + tier.name().toLowerCase()));
|
||||
+ Lang.translate("blockzapper.componentTier." + Lang.asId(tier.name())));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +1,28 @@
|
|||
package com.simibubi.create.modules.curiosities.placementHandgun;
|
||||
|
||||
import static com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components.Accelerator;
|
||||
import static com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components.Amplifier;
|
||||
import static com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components.Body;
|
||||
import static com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components.Retriever;
|
||||
import static com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components.Scope;
|
||||
|
||||
import com.mojang.blaze3d.platform.GLX;
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.ComponentTier;
|
||||
import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.FourWayBlock;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.client.renderer.ItemRenderer;
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.HandSide;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class BuilderGunItemRenderer extends ItemStackTileEntityRenderer {
|
||||
|
||||
|
@ -20,85 +30,91 @@ public class BuilderGunItemRenderer extends ItemStackTileEntityRenderer {
|
|||
public void renderByItem(ItemStack stack) {
|
||||
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
|
||||
BuilderGunModel mainModel = (BuilderGunModel) itemRenderer.getModelWithOverrides(stack);
|
||||
float worldTime = Animation.getWorldTime(Minecraft.getInstance().world,
|
||||
Minecraft.getInstance().getRenderPartialTicks());
|
||||
|
||||
float pt = Minecraft.getInstance().getRenderPartialTicks();
|
||||
float worldTime = AnimationTickHolder.getRenderTick();
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translatef(0.5F, 0.5F, 0.5F);
|
||||
float lastCoordx = GLX.lastBrightnessX;
|
||||
float lastCoordy = GLX.lastBrightnessY;
|
||||
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, Math.min(lastCoordx + 60, 240), Math.min(lastCoordy + 120, 240));
|
||||
|
||||
|
||||
itemRenderer.renderItem(stack, mainModel.getBakedModel());
|
||||
|
||||
if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.None)
|
||||
itemRenderer.renderItem(stack, mainModel.body);
|
||||
if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusBody);
|
||||
|
||||
if (BuilderGunItem.getTier(Components.Scope, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldScope);
|
||||
if (BuilderGunItem.getTier(Components.Scope, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusScope);
|
||||
|
||||
if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldAmp);
|
||||
if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusAmp);
|
||||
|
||||
if (BuilderGunItem.getTier(Components.Retriever, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldRetriever);
|
||||
if (BuilderGunItem.getTier(Components.Retriever, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusRetriever);
|
||||
|
||||
if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldAcc);
|
||||
if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusAcc);
|
||||
renderComponent(stack, Body, itemRenderer, mainModel.body, mainModel.goldBody, mainModel.chorusBody);
|
||||
renderComponent(stack, Amplifier, itemRenderer, null, mainModel.goldAmp, mainModel.chorusAmp);
|
||||
renderComponent(stack, Retriever, itemRenderer, null, mainModel.goldRetriever, mainModel.chorusRetriever);
|
||||
renderComponent(stack, Scope, itemRenderer, null, mainModel.goldScope, mainModel.chorusScope);
|
||||
|
||||
if (mainModel.showBlock && stack.hasTag() && stack.getTag().contains("BlockUsed")) {
|
||||
BlockState state = NBTUtil.readBlockState(stack.getTag().getCompound("BlockUsed"));
|
||||
// Block indicator
|
||||
if (mainModel.showBlock && stack.hasTag() && stack.getTag().contains("BlockUsed"))
|
||||
renderBlockUsed(stack, itemRenderer);
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translatef(-0.8F, -0.7F, -0.5F);
|
||||
GlStateManager.scalef(0.25F, 0.25F, 0.25F);
|
||||
itemRenderer.renderItem(new ItemStack(state.getBlock()),
|
||||
Minecraft.getInstance().getBlockRendererDispatcher().getModelForState(state));
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
ClientPlayerEntity player = Minecraft.getInstance().player;
|
||||
boolean leftHanded = player.getPrimaryHand() == HandSide.LEFT;
|
||||
boolean mainHand = player.getHeldItemMainhand() == stack;
|
||||
boolean offHand = player.getHeldItemOffhand() == stack;
|
||||
float last = mainHand ^ leftHanded ? BuilderGunHandler.lastRightHandAnimation
|
||||
: BuilderGunHandler.lastLeftHandAnimation;
|
||||
float current = mainHand ^ leftHanded ? BuilderGunHandler.rightHandAnimation
|
||||
: BuilderGunHandler.leftHandAnimation;
|
||||
float animation = MathHelper.clamp(MathHelper.lerp(pt, last, current) * 5, 0, 1);
|
||||
|
||||
// Core glows
|
||||
GlStateManager.disableLighting();
|
||||
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, MathHelper.sin(worldTime * 5) * 120 + 120, 120);
|
||||
if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldAccCore);
|
||||
if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusAccCore);
|
||||
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, 240, 120);
|
||||
if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldBody);
|
||||
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, 240, 240);
|
||||
if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.BlazeBrass)
|
||||
itemRenderer.renderItem(stack, mainModel.goldAmpCore);
|
||||
if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.ChorusChrome)
|
||||
itemRenderer.renderItem(stack, mainModel.chorusAmpCore);
|
||||
float multiplier = MathHelper.sin(worldTime * 5);
|
||||
if (mainHand || offHand) {
|
||||
multiplier = animation;
|
||||
}
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, multiplier * 240, 120);
|
||||
itemRenderer.renderItem(stack, mainModel.core);
|
||||
if (BuilderGunItem.getTier(Amplifier, stack) != ComponentTier.None)
|
||||
itemRenderer.renderItem(stack, mainModel.ampCore);
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, lastCoordx, lastCoordy);
|
||||
GlStateManager.enableLighting();
|
||||
|
||||
// Accelerator spins
|
||||
float angle = worldTime * -25;
|
||||
if (mainHand || offHand)
|
||||
angle += 360 * animation;
|
||||
|
||||
float angle = worldTime * -50;
|
||||
angle %= 360;
|
||||
|
||||
float offset = -.19f;
|
||||
float offset = -.155f;
|
||||
GlStateManager.translatef(0, offset, 0);
|
||||
GlStateManager.rotatef(angle, 0, 0, 1);
|
||||
GlStateManager.translatef(0, -offset, 0);
|
||||
itemRenderer.renderItem(stack, mainModel.rod);
|
||||
|
||||
GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, lastCoordx, lastCoordy);
|
||||
GlStateManager.enableLighting();
|
||||
renderComponent(stack, Accelerator, itemRenderer, mainModel.acc, mainModel.goldAcc, mainModel.chorusAcc);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
public void renderBlockUsed(ItemStack stack, ItemRenderer itemRenderer) {
|
||||
BlockState state = NBTUtil.readBlockState(stack.getTag().getCompound("BlockUsed"));
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translatef(-0.8F, -0.7F, -0.5F);
|
||||
GlStateManager.scalef(0.25F, 0.25F, 0.25F);
|
||||
IBakedModel modelForState = Minecraft.getInstance().getBlockRendererDispatcher().getModelForState(state);
|
||||
|
||||
if (state.getBlock() instanceof FourWayBlock)
|
||||
modelForState = Minecraft.getInstance().getItemRenderer()
|
||||
.getModelWithOverrides(new ItemStack(state.getBlock()));
|
||||
|
||||
itemRenderer.renderItem(new ItemStack(state.getBlock()), modelForState);
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
public void renderComponent(ItemStack stack, Components component, ItemRenderer itemRenderer, IBakedModel none,
|
||||
IBakedModel gold, IBakedModel chorus) {
|
||||
ComponentTier tier = BuilderGunItem.getTier(component, stack);
|
||||
|
||||
IBakedModel model = tier == ComponentTier.ChorusChrome ? chorus : gold;
|
||||
if (tier == ComponentTier.None) {
|
||||
if (none == null)
|
||||
return;
|
||||
model = none;
|
||||
}
|
||||
|
||||
itemRenderer.renderItem(stack, model);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.simibubi.create.modules.curiosities.placementHandgun;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.vecmath.Matrix4f;
|
||||
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
@ -13,30 +16,36 @@ import net.minecraftforge.client.event.ModelBakeEvent;
|
|||
@SuppressWarnings("deprecation")
|
||||
public class BuilderGunModel extends CustomRenderItemBakedModel {
|
||||
|
||||
public IBakedModel rod;
|
||||
public IBakedModel body;
|
||||
public boolean showBlock;
|
||||
|
||||
|
||||
public IBakedModel core;
|
||||
public IBakedModel body;
|
||||
public IBakedModel ampCore;
|
||||
public IBakedModel acc;
|
||||
|
||||
public IBakedModel goldBody;
|
||||
public IBakedModel goldScope;
|
||||
public IBakedModel goldAmp;
|
||||
public IBakedModel goldAmpCore;
|
||||
public IBakedModel goldRetriever;
|
||||
public IBakedModel goldAcc;
|
||||
public IBakedModel goldAccCore;
|
||||
|
||||
|
||||
public IBakedModel chorusBody;
|
||||
public IBakedModel chorusScope;
|
||||
public IBakedModel chorusAmp;
|
||||
public IBakedModel chorusAmpCore;
|
||||
public IBakedModel chorusRetriever;
|
||||
public IBakedModel chorusAcc;
|
||||
public IBakedModel chorusAccCore;
|
||||
|
||||
|
||||
public BuilderGunModel(IBakedModel template) {
|
||||
super(template);
|
||||
}
|
||||
|
||||
|
||||
public static List<String> getCustomModelLocations() {
|
||||
String p = "placement_handgun/";
|
||||
return Arrays.asList(p + "core", p + "body", p + "amplifier_core", p + "accelerator", p + "gold_body",
|
||||
p + "gold_scope", p + "gold_amplifier", p + "gold_retriever", p + "gold_accelerator", p + "chorus_body",
|
||||
p + "chorus_amplifier", p + "chorus_retriever", p + "chorus_accelerator");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<? extends IBakedModel, Matrix4f> handlePerspective(TransformType cameraTransformType) {
|
||||
showBlock = cameraTransformType == TransformType.GUI;
|
||||
|
@ -46,26 +55,24 @@ public class BuilderGunModel extends CustomRenderItemBakedModel {
|
|||
@Override
|
||||
public CustomRenderItemBakedModel loadPartials(ModelBakeEvent event) {
|
||||
String p = "placement_handgun/";
|
||||
|
||||
this.rod = loadCustomModel(event, p + "core");
|
||||
|
||||
this.core = loadCustomModel(event, p + "core");
|
||||
this.body = loadCustomModel(event, p + "body");
|
||||
|
||||
this.ampCore = loadCustomModel(event, p + "amplifier_core");
|
||||
this.acc = loadCustomModel(event, p + "accelerator");
|
||||
|
||||
this.goldBody = loadCustomModel(event, p + "gold_body");
|
||||
this.goldScope = loadCustomModel(event, p + "gold_scope");
|
||||
this.goldAmp = loadCustomModel(event, p + "gold_amplifier");
|
||||
this.goldAmpCore = loadCustomModel(event, p + "gold_amplifier_core");
|
||||
this.goldRetriever = loadCustomModel(event, p + "gold_retriever");
|
||||
this.goldAcc = loadCustomModel(event, p + "gold_accelerator");
|
||||
this.goldAccCore = loadCustomModel(event, p + "gold_accelerator_core");
|
||||
|
||||
|
||||
this.chorusBody = loadCustomModel(event, p + "chorus_body");
|
||||
this.chorusScope = loadCustomModel(event, p + "chorus_scope");
|
||||
this.chorusAmp = loadCustomModel(event, p + "chorus_amplifier");
|
||||
this.chorusAmpCore = loadCustomModel(event, p + "chorus_amplifier_core");
|
||||
this.chorusRetriever = loadCustomModel(event, p + "chorus_retriever");
|
||||
this.chorusAcc = loadCustomModel(event, p + "chorus_accelerator");
|
||||
this.chorusAccCore = loadCustomModel(event, p + "chorus_accelerator_core");
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import net.minecraft.item.ItemStack;
|
|||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
|
@ -42,6 +43,7 @@ public class BuilderGunScreen extends AbstractSimiScreen {
|
|||
|
||||
private final String title = Lang.translate("gui.blockzapper.title");
|
||||
private final String patternSection = Lang.translate("gui.blockzapper.patternSection");
|
||||
private final String needsUpgradedAmplifier = Lang.translate("gui.blockzapper.needsUpgradedAmplifier");
|
||||
|
||||
private IconButton replaceModeButton;
|
||||
private Indicator replaceModeIndicator;
|
||||
|
@ -96,6 +98,8 @@ public class BuilderGunScreen extends AbstractSimiScreen {
|
|||
|
||||
if (nbt.contains("SearchDistance"))
|
||||
spreadRangeInput.setState(nbt.getInt("SearchDistance"));
|
||||
if (BuilderGunItem.getMaxAoe(item) == 2)
|
||||
spreadRangeInput.getToolTip().add(1, TextFormatting.RED + needsUpgradedAmplifier);
|
||||
|
||||
Collections.addAll(widgets, replaceModeButton, replaceModeIndicator, spreadDiagonallyButton,
|
||||
spreadDiagonallyIndicator, spreadMaterialButton, spreadMaterialIndicator, spreadRangeLabel,
|
||||
|
|
|
@ -10,9 +10,11 @@ import net.minecraft.inventory.CraftingInventory;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.ICraftingRecipe;
|
||||
import net.minecraft.item.crafting.IRecipeSerializer;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.item.crafting.ShapedRecipe;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.JSONUtils;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.registries.ForgeRegistryEntry;
|
||||
|
@ -33,7 +35,12 @@ public class BuilderGunUpgradeRecipe implements ICraftingRecipe {
|
|||
public boolean matches(CraftingInventory inv, World worldIn) {
|
||||
return getRecipe().matches(inv, worldIn);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public NonNullList<Ingredient> getIngredients() {
|
||||
return recipe.getIngredients();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getCraftingResult(CraftingInventory inv) {
|
||||
for (int slot = 0; slot < inv.getSizeInventory(); slot++) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simibubi.create.modules.curiosities.placementHandgun;
|
||||
|
||||
import com.simibubi.create.ScreenResources;
|
||||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
public enum PlacementPatterns {
|
||||
|
||||
|
@ -15,7 +16,7 @@ public enum PlacementPatterns {
|
|||
public ScreenResources icon;
|
||||
|
||||
private PlacementPatterns(ScreenResources icon) {
|
||||
this.translationKey = name().toLowerCase();
|
||||
this.translationKey = Lang.asId(name());
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ public class SymmetryWandItem extends Item {
|
|||
if (player.isSneaking()) {
|
||||
if (player.world.isRemote) {
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> {
|
||||
openWandGUI(wand);
|
||||
openWandGUI(wand, context.getHand());
|
||||
});
|
||||
player.getCooldownTracker().setCooldown(this, 5);
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ public class SymmetryWandItem extends Item {
|
|||
if (playerIn.isSneaking()) {
|
||||
if (worldIn.isRemote) {
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> {
|
||||
openWandGUI(playerIn.getHeldItem(handIn));
|
||||
openWandGUI(playerIn.getHeldItem(handIn), handIn);
|
||||
});
|
||||
playerIn.getCooldownTracker().setCooldown(this, 5);
|
||||
}
|
||||
|
@ -136,8 +136,8 @@ public class SymmetryWandItem extends Item {
|
|||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private void openWandGUI(ItemStack wand) {
|
||||
ScreenOpener.open(new SymmetryWandScreen(wand));
|
||||
private void openWandGUI(ItemStack wand, Hand hand) {
|
||||
ScreenOpener.open(new SymmetryWandScreen(wand, hand));
|
||||
}
|
||||
|
||||
private static void checkNBT(ItemStack wand) {
|
||||
|
|
|
@ -43,14 +43,16 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
|
|||
private SymmetryMirror currentElement;
|
||||
private float animationProgress;
|
||||
private ItemStack wand;
|
||||
private Hand hand;
|
||||
|
||||
public SymmetryWandScreen(ItemStack wand) {
|
||||
public SymmetryWandScreen(ItemStack wand, Hand hand) {
|
||||
super();
|
||||
|
||||
currentElement = SymmetryWandItem.getMirror(wand);
|
||||
if (currentElement instanceof EmptyMirror) {
|
||||
currentElement = new PlaneMirror(Vec3d.ZERO);
|
||||
}
|
||||
this.hand = hand;
|
||||
this.wand = wand;
|
||||
animationProgress = 0;
|
||||
}
|
||||
|
@ -170,12 +172,12 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
|
|||
|
||||
@Override
|
||||
public void removed() {
|
||||
ItemStack heldItemMainhand = minecraft.player.getHeldItemMainhand();
|
||||
CompoundNBT compound = heldItemMainhand.getTag();
|
||||
ItemStack heldItem = minecraft.player.getHeldItem(hand);
|
||||
CompoundNBT compound = heldItem.getTag();
|
||||
compound.put(SymmetryWandItem.SYMMETRY, currentElement.writeToNbt());
|
||||
heldItemMainhand.setTag(compound);
|
||||
AllPackets.channel.send(PacketDistributor.SERVER.noArg(), new NbtPacket(heldItemMainhand));
|
||||
minecraft.player.setHeldItem(Hand.MAIN_HAND, heldItemMainhand);
|
||||
heldItem.setTag(compound);
|
||||
AllPackets.channel.send(PacketDistributor.SERVER.noArg(), new NbtPacket(heldItem, hand));
|
||||
minecraft.player.setHeldItem(hand, heldItem);
|
||||
super.removed();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,13 +2,13 @@ package com.simibubi.create.modules.curiosities.symmetry.client;
|
|||
|
||||
import com.mojang.blaze3d.platform.GLX;
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.ItemRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.client.model.animation.Animation;
|
||||
|
||||
public class SymmetryWandItemRenderer extends ItemStackTileEntityRenderer {
|
||||
|
||||
|
@ -17,8 +17,7 @@ public class SymmetryWandItemRenderer extends ItemStackTileEntityRenderer {
|
|||
|
||||
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
|
||||
SymmetryWandModel mainModel = (SymmetryWandModel) itemRenderer.getModelWithOverrides(stack);
|
||||
float worldTime = Animation.getWorldTime(Minecraft.getInstance().world,
|
||||
Minecraft.getInstance().getRenderPartialTicks());
|
||||
float worldTime = AnimationTickHolder.getRenderTick();
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translatef(0.5F, 0.5F, 0.5F);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.simibubi.create.modules.curiosities.symmetry.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.simibubi.create.foundation.block.CustomRenderItemBakedModel;
|
||||
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
|
@ -14,6 +17,10 @@ public class SymmetryWandModel extends CustomRenderItemBakedModel {
|
|||
super(template);
|
||||
}
|
||||
|
||||
public static List<String> getCustomModelLocations() {
|
||||
return Arrays.asList("symmetry_wand_core", "symmetry_wand_bits");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CustomRenderItemBakedModel loadPartials(ModelBakeEvent event) {
|
||||
this.core = loadCustomModel(event, "symmetry_wand_core");
|
||||
|
|
|
@ -49,6 +49,18 @@ public class BeltFunnelBlock extends HorizontalBlock implements IBeltAttachment,
|
|||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
|
||||
boolean isMoving) {
|
||||
Direction blockFacing = state.get(HORIZONTAL_FACING);
|
||||
if (fromPos.equals(pos.offset(blockFacing))) {
|
||||
if (!isValidPosition(state, worldIn, pos)) {
|
||||
worldIn.destroyBlock(pos, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
|
@ -61,6 +73,13 @@ public class BeltFunnelBlock extends HorizontalBlock implements IBeltAttachment,
|
|||
super.fillStateContainer(builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
BlockPos neighbourPos = pos.offset(state.get(HORIZONTAL_FACING));
|
||||
BlockState neighbour = worldIn.getBlockState(neighbourPos);
|
||||
return !neighbour.getShape(worldIn, pos).isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockState state = getDefaultState();
|
||||
|
|
|
@ -31,8 +31,8 @@ import net.minecraft.state.StateContainer.Builder;
|
|||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
|
|
@ -37,7 +37,7 @@ public class ExtractorBlock extends HorizontalBlock implements IBlockWithFilter
|
|||
SHAPE_SOUTH = makeCuboidShape(4, 2, 11, 12, 10, 17), SHAPE_WEST = makeCuboidShape(-1, 2, 4, 5, 10, 12),
|
||||
SHAPE_EAST = makeCuboidShape(11, 2, 4, 17, 10, 12);
|
||||
private static final List<Vec3d> itemPositions = new ArrayList<>(Direction.values().length);
|
||||
|
||||
|
||||
public ExtractorBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
setDefaultState(getDefaultState().with(POWERED, false));
|
||||
|
@ -49,28 +49,28 @@ public class ExtractorBlock extends HorizontalBlock implements IBlockWithFilter
|
|||
builder.add(HORIZONTAL_FACING, POWERED);
|
||||
super.fillStateContainer(builder);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean showsCount() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new ExtractorTileEntity();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
|
||||
BlockRayTraceResult hit) {
|
||||
return handleActivatedFilterSlots(state, worldIn, pos, player, handIn, hit);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
BlockState state = getDefaultState();
|
||||
|
@ -88,6 +88,13 @@ public class ExtractorBlock extends HorizontalBlock implements IBlockWithFilter
|
|||
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
updateObservedInventory(state, worldIn, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
BlockPos neighbourPos = pos.offset(state.get(HORIZONTAL_FACING));
|
||||
BlockState neighbour = worldIn.getBlockState(neighbourPos);
|
||||
return !neighbour.getShape(worldIn, pos).isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) {
|
||||
|
@ -97,23 +104,31 @@ public class ExtractorBlock extends HorizontalBlock implements IBlockWithFilter
|
|||
return;
|
||||
updateObservedInventory(state, world, pos);
|
||||
}
|
||||
|
||||
|
||||
private void updateObservedInventory(BlockState state, IWorldReader world, BlockPos pos) {
|
||||
IExtractor extractor = (IExtractor) world.getTileEntity(pos);
|
||||
if (extractor == null)
|
||||
return;
|
||||
extractor.neighborChanged();
|
||||
}
|
||||
|
||||
|
||||
private boolean isObserving(BlockState state, BlockPos pos, BlockPos observing) {
|
||||
return observing.equals(pos.offset(state.get(HORIZONTAL_FACING)));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
|
||||
boolean isMoving) {
|
||||
if (worldIn.isRemote)
|
||||
return;
|
||||
|
||||
Direction blockFacing = state.get(HORIZONTAL_FACING);
|
||||
if (fromPos.equals(pos.offset(blockFacing))) {
|
||||
if (!isValidPosition(state, worldIn, pos)) {
|
||||
worldIn.destroyBlock(pos, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
boolean previouslyPowered = state.get(POWERED);
|
||||
if (previouslyPowered != worldIn.isBlockPowered(pos)) {
|
||||
|
@ -161,7 +176,7 @@ public class ExtractorBlock extends HorizontalBlock implements IBlockWithFilter
|
|||
itemPositions.add(position);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public float getItemHitboxScale() {
|
||||
return 1.76f / 16f;
|
||||
|
|
|
@ -15,8 +15,8 @@ import net.minecraft.item.BlockItemUseContext;
|
|||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.BlockRenderLayer;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
|
|
@ -33,7 +33,9 @@ public class ConfigureFlexpeaterPacket extends TileEntityConfigurationPacket<Fle
|
|||
protected void applySettings(FlexpeaterTileEntity te) {
|
||||
te.maxState = maxState;
|
||||
te.state = MathHelper.clamp(te.state, 0, maxState);
|
||||
te.forceClientState = true;
|
||||
te.sendData();
|
||||
te.forceClientState = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
|
|||
public int newMaxState;
|
||||
public int lastModified;
|
||||
public boolean charging;
|
||||
public boolean forceClientState;
|
||||
|
||||
public FlexpeaterTileEntity() {
|
||||
super(AllTileEntities.FLEXPEATER.type);
|
||||
|
@ -38,6 +39,15 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
|
|||
charging = compound.getBoolean("Charging");
|
||||
maxState = compound.getInt("MaxState");
|
||||
state = MathHelper.clamp(state, 0, maxState - 1);
|
||||
if (compound.contains("Force"))
|
||||
newMaxState = maxState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundNBT writeToClient(CompoundNBT tag) {
|
||||
if (forceClientState)
|
||||
tag.putBoolean("Force", true);
|
||||
return super.writeToClient(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -15,9 +15,13 @@ import com.simibubi.create.foundation.utility.Lang;
|
|||
import com.simibubi.create.modules.logistics.packet.ConfigureFlexcratePacket;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.renderer.Rectangle2d;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FlexcrateScreen extends AbstractSimiContainerScreen<FlexcrateContainer> {
|
||||
|
||||
private FlexcrateTileEntity te;
|
||||
|
@ -25,6 +29,8 @@ public class FlexcrateScreen extends AbstractSimiContainerScreen<FlexcrateContai
|
|||
private ScrollInput allowedItems;
|
||||
private int lastModification;
|
||||
|
||||
private List<Rectangle2d> extraAreas;
|
||||
|
||||
private final String title = Lang.translate("gui.flexcrate.title");
|
||||
private final String storageSpace = Lang.translate("gui.flexcrate.storageSpace");
|
||||
|
||||
|
@ -47,6 +53,9 @@ public class FlexcrateScreen extends AbstractSimiContainerScreen<FlexcrateContai
|
|||
allowedItems.onChanged();
|
||||
widgets.add(allowedItemsLabel);
|
||||
widgets.add(allowedItems);
|
||||
|
||||
extraAreas = new ArrayList<>();
|
||||
extraAreas.add(new Rectangle2d(guiLeft + FLEXCRATE.width + 110, guiTop + 46, 71, 70));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -76,6 +85,10 @@ public class FlexcrateScreen extends AbstractSimiContainerScreen<FlexcrateContai
|
|||
}
|
||||
|
||||
ScreenElementRenderer.renderBlock(this::getRenderedBlock);
|
||||
|
||||
//to see or debug the bounds of the extra area uncomment the following lines
|
||||
//Rectangle2d r = extraAreas.get(0);
|
||||
//fill(r.getX() + r.getWidth(), r.getY() + r.getHeight(), r.getX(), r.getY(), 0xd3d3d3d3);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -101,4 +114,8 @@ public class FlexcrateScreen extends AbstractSimiContainerScreen<FlexcrateContai
|
|||
return AllBlocks.FLEXCRATE.get().getDefaultState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Rectangle2d> getExtraAreas() {
|
||||
return extraAreas;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
|
@ -26,24 +27,24 @@ public class MaterialChecklist {
|
|||
required = new HashMap<>();
|
||||
gathered = new HashMap<>();
|
||||
}
|
||||
|
||||
|
||||
public void warnBlockNotLoaded() {
|
||||
blocksNotLoaded = true;
|
||||
}
|
||||
|
||||
|
||||
public void require(Item item) {
|
||||
if (required.containsKey(item))
|
||||
required.put(item, required.get(item) + 1);
|
||||
else
|
||||
else
|
||||
required.put(item, 1);
|
||||
}
|
||||
|
||||
|
||||
public void collect(ItemStack stack) {
|
||||
Item item = stack.getItem();
|
||||
if (required.containsKey(item))
|
||||
if (gathered.containsKey(item))
|
||||
gathered.put(item, gathered.get(item) + stack.getCount());
|
||||
else
|
||||
else
|
||||
gathered.put(item, stack.getCount());
|
||||
}
|
||||
|
||||
|
@ -55,44 +56,47 @@ public class MaterialChecklist {
|
|||
|
||||
int itemsWritten = 0;
|
||||
StringBuilder string = new StringBuilder("{\"text\":\"");
|
||||
|
||||
|
||||
if (blocksNotLoaded) {
|
||||
string.append("\n" + TextFormatting.RED + "* Disclaimer *\n\n");
|
||||
string.append("Material List may be inaccurate due to relevant chunks not being loaded.");
|
||||
string.append("\n" + TextFormatting.RED + "* Disclaimer *\n\n");
|
||||
string.append("Material List may be inaccurate due to relevant chunks not being loaded.");
|
||||
string.append("\"}");
|
||||
pages.add(new StringNBT(string.toString()));
|
||||
string = new StringBuilder("{\"text\":\"");
|
||||
}
|
||||
|
||||
|
||||
List<Item> keys = new ArrayList<>(required.keySet());
|
||||
Collections.sort(keys, (item1, item2) -> {
|
||||
String name1 = new TranslationTextComponent(((Item) item1).getTranslationKey()).getFormattedText().toLowerCase();
|
||||
String name2 = new TranslationTextComponent(((Item) item2).getTranslationKey()).getFormattedText().toLowerCase();
|
||||
Locale locale = Locale.ENGLISH;
|
||||
String name1 = new TranslationTextComponent(((Item) item1).getTranslationKey()).getFormattedText()
|
||||
.toLowerCase(locale);
|
||||
String name2 = new TranslationTextComponent(((Item) item2).getTranslationKey()).getFormattedText()
|
||||
.toLowerCase(locale);
|
||||
return name1.compareTo(name2);
|
||||
});
|
||||
|
||||
|
||||
List<Item> completed = new ArrayList<>();
|
||||
for (Item item : keys) {
|
||||
int amount = required.get(item);
|
||||
if (gathered.containsKey(item))
|
||||
amount -= gathered.get(item);
|
||||
|
||||
|
||||
if (amount <= 0) {
|
||||
completed.add(item);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (itemsWritten == 6) {
|
||||
itemsWritten = 0;
|
||||
string.append("\"}");
|
||||
pages.add(new StringNBT(string.toString()));
|
||||
string = new StringBuilder("{\"text\":\"");
|
||||
}
|
||||
|
||||
|
||||
itemsWritten++;
|
||||
string.append(unfinishedEntry(new ItemStack(item), amount));
|
||||
}
|
||||
|
||||
|
||||
for (Item item : completed) {
|
||||
if (itemsWritten == 6) {
|
||||
itemsWritten = 0;
|
||||
|
@ -100,11 +104,11 @@ public class MaterialChecklist {
|
|||
pages.add(new StringNBT(string.toString()));
|
||||
string = new StringBuilder("{\"text\":\"");
|
||||
}
|
||||
|
||||
|
||||
itemsWritten++;
|
||||
string.append(gatheredEntry(new ItemStack(item), required.get(item)));
|
||||
}
|
||||
|
||||
|
||||
string.append("\"}");
|
||||
pages.add(new StringNBT(string.toString()));
|
||||
|
||||
|
@ -120,16 +124,16 @@ public class MaterialChecklist {
|
|||
int stacks = amount / 64;
|
||||
int remainder = amount % 64;
|
||||
ITextComponent tc = new TranslationTextComponent(item.getTranslationKey());
|
||||
return TextFormatting.DARK_GREEN + tc.getFormattedText()
|
||||
+ " \\u2714\n x" + amount + TextFormatting.GRAY + " | " + stacks + "\\u25A4 +" + remainder + "\n";
|
||||
return TextFormatting.DARK_GREEN + tc.getFormattedText() + " \\u2714\n x" + amount + TextFormatting.GRAY + " | "
|
||||
+ stacks + "\\u25A4 +" + remainder + "\n";
|
||||
}
|
||||
|
||||
private String unfinishedEntry(ItemStack item, int amount) {
|
||||
int stacks = amount / 64;
|
||||
int remainder = amount % 64;
|
||||
ITextComponent tc = new TranslationTextComponent(item.getTranslationKey());
|
||||
return TextFormatting.BLUE + tc.getFormattedText() + "\n x" + amount
|
||||
+ TextFormatting.GRAY + " | " + stacks + "\\u25A4 +" + remainder + "\n";
|
||||
return TextFormatting.BLUE + tc.getFormattedText() + "\n x" + amount + TextFormatting.GRAY + " | " + stacks
|
||||
+ "\\u25A4 +" + remainder + "\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -3,12 +3,11 @@ package com.simibubi.create.modules.schematics;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.simibubi.create.foundation.type.Cuboid;
|
||||
import com.simibubi.create.foundation.utility.WrappedWorld;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -16,47 +15,34 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.FluidState;
|
||||
import net.minecraft.fluid.Fluids;
|
||||
import net.minecraft.fluid.IFluidState;
|
||||
import net.minecraft.particles.IParticleData;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.DifficultyInstance;
|
||||
import net.minecraft.world.EmptyTickList;
|
||||
import net.minecraft.world.ITickList;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.LightType;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.Biomes;
|
||||
import net.minecraft.world.border.WorldBorder;
|
||||
import net.minecraft.world.chunk.AbstractChunkProvider;
|
||||
import net.minecraft.world.chunk.ChunkStatus;
|
||||
import net.minecraft.world.chunk.IChunk;
|
||||
import net.minecraft.world.dimension.Dimension;
|
||||
import net.minecraft.world.gen.Heightmap.Type;
|
||||
import net.minecraft.world.storage.WorldInfo;
|
||||
|
||||
public class SchematicWorld implements IWorld {
|
||||
public class SchematicWorld extends WrappedWorld {
|
||||
|
||||
private Map<BlockPos, BlockState> blocks;
|
||||
private Cuboid bounds;
|
||||
public BlockPos anchor;
|
||||
|
||||
public SchematicWorld(Map<BlockPos, BlockState> blocks, Cuboid bounds, BlockPos anchor) {
|
||||
|
||||
public SchematicWorld(Map<BlockPos, BlockState> blocks, Cuboid bounds, BlockPos anchor, World original) {
|
||||
super(original);
|
||||
this.blocks = blocks;
|
||||
this.setBounds(bounds);
|
||||
this.anchor = anchor;
|
||||
}
|
||||
|
||||
|
||||
public Set<BlockPos> getAllPositions() {
|
||||
return blocks.keySet();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public TileEntity getTileEntity(BlockPos pos) {
|
||||
return null;
|
||||
|
@ -65,11 +51,11 @@ public class SchematicWorld implements IWorld {
|
|||
@Override
|
||||
public BlockState getBlockState(BlockPos globalPos) {
|
||||
BlockPos pos = globalPos.subtract(anchor);
|
||||
|
||||
|
||||
if (pos.getY() - bounds.y == -1) {
|
||||
return Blocks.GRASS_BLOCK.getDefaultState();
|
||||
}
|
||||
|
||||
|
||||
if (getBounds().contains(pos) && blocks.containsKey(pos)) {
|
||||
return blocks.get(pos);
|
||||
} else {
|
||||
|
@ -83,7 +69,7 @@ public class SchematicWorld implements IWorld {
|
|||
|
||||
@Override
|
||||
public IFluidState getFluidState(BlockPos pos) {
|
||||
return new FluidState(Fluids.EMPTY, ImmutableMap.of());
|
||||
return getBlockState(pos).getFluidState();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -117,46 +103,11 @@ public class SchematicWorld implements IWorld {
|
|||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IChunk getChunk(int x, int z, ChunkStatus requiredStatus, boolean nonnull) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getHeight(Type heightmapType, BlockPos pos) {
|
||||
return BlockPos.ZERO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight(Type heightmapType, int x, int z) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSkylightSubtracted() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorldBorder getWorldBorder() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRemote() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSeaLevel() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension getDimension() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBlockState(BlockPos pos, Predicate<BlockState> predicate) {
|
||||
return predicate.test(getBlockState(pos));
|
||||
|
@ -197,16 +148,11 @@ public class SchematicWorld implements IWorld {
|
|||
if (boundsMax.getZ() <= pos.getZ()) {
|
||||
bounds.length += pos.getZ() - boundsMax.getZ() + 1;
|
||||
}
|
||||
|
||||
|
||||
blocks.put(pos, arg1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSeed() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITickList<Block> getPendingBlockTicks() {
|
||||
return EmptyTickList.get();
|
||||
|
@ -217,54 +163,6 @@ public class SchematicWorld implements IWorld {
|
|||
return EmptyTickList.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWorld() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorldInfo getWorldInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DifficultyInstance getDifficultyForLocation(BlockPos pos) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractChunkProvider getChunkProvider() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Random getRandom() {
|
||||
return new Random();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyNeighbors(BlockPos pos, Block blockIn) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getSpawnPoint() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playSound(PlayerEntity player, BlockPos pos, SoundEvent soundIn, SoundCategory category, float volume,
|
||||
float pitch) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addParticle(IParticleData particleData, double x, double y, double z, double xSpeed, double ySpeed,
|
||||
double zSpeed) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playEvent(PlayerEntity player, int type, BlockPos pos, int data) {
|
||||
}
|
||||
|
||||
public Cuboid getBounds() {
|
||||
return bounds;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.modules.schematics.block;
|
|||
|
||||
import static net.minecraft.util.text.TextFormatting.GRAY;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
@ -22,6 +23,7 @@ import com.simibubi.create.modules.schematics.packet.ConfigureSchematicannonPack
|
|||
import com.simibubi.create.modules.schematics.packet.ConfigureSchematicannonPacket.Option;
|
||||
|
||||
import net.minecraft.client.gui.widget.Widget;
|
||||
import net.minecraft.client.renderer.Rectangle2d;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.item.BlockItem;
|
||||
|
@ -46,6 +48,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
|
|||
protected IconButton resetButton;
|
||||
protected Indicator resetIndicator;
|
||||
|
||||
private List<Rectangle2d> extraAreas;
|
||||
|
||||
private final String title = Lang.translate("gui.schematicannon.title");
|
||||
private final String settingsTitle = Lang.translate("gui.schematicannon.settingsTitle");
|
||||
private final String listPrinter = Lang.translate("gui.schematicannon.listPrinter");
|
||||
|
@ -112,6 +116,9 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
|
|||
skipTilesIndicator = new Indicator(x + 124, y + 96, "");
|
||||
Collections.addAll(widgets, skipTilesButton, skipTilesIndicator);
|
||||
|
||||
extraAreas = new ArrayList<>();
|
||||
extraAreas.add(new Rectangle2d(guiLeft + 240, guiTop + 88, 84, 113));
|
||||
|
||||
tick();
|
||||
}
|
||||
|
||||
|
@ -219,6 +226,10 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
|
|||
font.drawString(settingsTitle, guiLeft + 20 + 13, guiTop + 84, ScreenResources.FONT_COLOR);
|
||||
font.drawString(playerInventory.getDisplayName().getFormattedText(), guiLeft - 10 + 7, guiTop + 145 + 6,
|
||||
0x666666);
|
||||
|
||||
//to see or debug the bounds of the extra area uncomment the following lines
|
||||
//Rectangle2d r = extraAreas.get(0);
|
||||
//fill(r.getX() + r.getWidth(), r.getY() + r.getHeight(), r.getX(), r.getY(), 0xd3d3d3d3);
|
||||
}
|
||||
|
||||
protected void renderCannon() {
|
||||
|
@ -323,6 +334,11 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
|
|||
return super.mouseClicked(x, y, button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Rectangle2d> getExtraAreas() {
|
||||
return extraAreas;
|
||||
}
|
||||
|
||||
protected void sendOptionUpdate(Option option, boolean set) {
|
||||
AllPackets.channel
|
||||
.sendToServer(ConfigureSchematicannonPacket.setOption(container.getTileEntity().getPos(), option, set));
|
||||
|
|
|
@ -535,7 +535,7 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka
|
|||
}
|
||||
|
||||
schematicAnchor = anchor;
|
||||
blockReader = new SchematicWorld(new HashMap<>(), new Cuboid(), schematicAnchor);
|
||||
blockReader = new SchematicWorld(new HashMap<>(), new Cuboid(), schematicAnchor, world);
|
||||
activeTemplate.addBlocksToWorld(blockReader, schematicAnchor, SchematicItem.getSettings(blueprint));
|
||||
schematicLoaded = true;
|
||||
state = State.PAUSED;
|
||||
|
|
|
@ -209,7 +209,7 @@ public class SchematicHandler {
|
|||
if (schematic.getSize().equals(BlockPos.ZERO))
|
||||
return;
|
||||
|
||||
SchematicWorld w = new SchematicWorld(new HashMap<>(), new Cuboid(), anchor);
|
||||
SchematicWorld w = new SchematicWorld(new HashMap<>(), new Cuboid(), anchor, Minecraft.getInstance().world);
|
||||
PlacementSettings settings = cachedSettings.copy();
|
||||
settings.setBoundingBox(null);
|
||||
schematic.addBlocksToWorld(w, anchor, settings);
|
||||
|
|
|
@ -49,7 +49,8 @@ public class SchematicHologram {
|
|||
}
|
||||
|
||||
public void startHologram(Template schematic, BlockPos anchor) {
|
||||
SchematicWorld world = new SchematicWorld(new HashMap<>(), new Cuboid(BlockPos.ZERO, BlockPos.ZERO), anchor);
|
||||
SchematicWorld world = new SchematicWorld(new HashMap<>(), new Cuboid(BlockPos.ZERO, BlockPos.ZERO), anchor,
|
||||
Minecraft.getInstance().world);
|
||||
schematic.addBlocksToWorld(world, anchor, new PlacementSettings());
|
||||
startHologram(world);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ public enum Tools {
|
|||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return Lang.translate("schematic.tool." + name().toLowerCase());
|
||||
return Lang.translate("schematic.tool." + Lang.asId(name()));
|
||||
}
|
||||
|
||||
public ScreenResources getIcon() {
|
||||
|
@ -45,7 +45,7 @@ public enum Tools {
|
|||
}
|
||||
|
||||
public List<String> getDescription() {
|
||||
return Lang.translatedOptions("schematic.tool." + name().toLowerCase() + ".description", "0", "1", "2", "3");
|
||||
return Lang.translatedOptions("schematic.tool." + Lang.asId(name()) + ".description", "0", "1", "2", "3");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ loaderVersion="[28,)"
|
|||
|
||||
[[mods]]
|
||||
modId="create"
|
||||
version="0.1.1"
|
||||
version="0.1.1a"
|
||||
displayName="Create"
|
||||
#updateJSONURL=""
|
||||
authors="simibubi"
|
||||
|
|
5
src/main/resources/assets/create/blockstates/basin.json
Normal file
5
src/main/resources/assets/create/blockstates/basin.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"variants": {
|
||||
"": { "model": "create:block/basin" }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"variants": {
|
||||
"": { "model": "create:block/mixer_base" }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"variants": {
|
||||
"": { "model": "create:block/mixer_head" }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"variants": {
|
||||
"": { "model": "create:block/mixer_pole" }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "create:block/cogwheel_shaftless"
|
||||
},
|
||||
"variants": {
|
||||
"axis" : {
|
||||
"x": { "x": 90, "y": 90 },
|
||||
"y": {},
|
||||
"z": { "x": 90 }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
|
||||
|
||||
"_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------",
|
||||
|
||||
"item.create.symmetry_wand": "Staff of Symmetry",
|
||||
|
@ -23,6 +23,7 @@
|
|||
"item.create.propeller": "Propeller",
|
||||
"item.create.flour": "Wheat Flour",
|
||||
"item.create.dough": "Dough",
|
||||
"item.create.wrench": "Wrench",
|
||||
"item.create.crushed_iron": "Crushed Iron Ore",
|
||||
"item.create.crushed_gold": "Crushed Gold Ore",
|
||||
"item.create.time_scarf": "Scarf with a clock on it",
|
||||
|
@ -34,32 +35,32 @@
|
|||
"item.create.logistical_controller_calculation": "Ingredient Calculator",
|
||||
"item.create.logistical_controller_transactions": "Task Manager",
|
||||
"item.create.logistical_dial": "Logistical Dial",
|
||||
|
||||
|
||||
"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": "Cogwheel",
|
||||
"block.create.large_cogwheel": "Large Cogwheel",
|
||||
"block.create.turntable": "Turntable",
|
||||
"block.create.gearbox": "Gearbox",
|
||||
"block.create.large_cogwheel": "Large Cogwheel",
|
||||
"block.create.turntable": "Turntable",
|
||||
"block.create.gearbox": "Gearbox",
|
||||
"block.create.gearshift": "Gearshift",
|
||||
"block.create.clutch": "Clutch",
|
||||
"block.create.shaft": "Shaft",
|
||||
"block.create.shaft": "Shaft",
|
||||
"block.create.encased_belt": "Encased Belt",
|
||||
"block.create.encased_shaft": "Encased Shaft",
|
||||
"block.create.encased_fan": "Encased Fan",
|
||||
"block.create.motor": "Motor",
|
||||
"block.create.motor": "Motor",
|
||||
"block.create.belt": "Mechanical Belt",
|
||||
"block.create.crushing_wheel": "Crushing Wheel",
|
||||
"block.create.drill": "Mechanical Drill",
|
||||
|
@ -68,7 +69,9 @@
|
|||
"block.create.water_wheel": "Water Wheel",
|
||||
"block.create.belt_support": "Belt Support",
|
||||
"block.create.mechanical_press": "Mechanical Press",
|
||||
|
||||
"block.create.mechanical_mixer": "Mechanical Mixer",
|
||||
"block.create.basin": "Basin",
|
||||
|
||||
"block.create.sticky_mechanical_piston": "Sticky Mechanical Piston",
|
||||
"block.create.mechanical_piston": "Mechanical Piston",
|
||||
"block.create.mechanical_piston_head": "Mechanical Piston Head",
|
||||
|
@ -95,12 +98,12 @@
|
|||
|
||||
"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",
|
||||
|
||||
|
||||
"block.create.gabbro": "Gabbro",
|
||||
"block.create.gabbro_stairs": "Gabbro Stairs",
|
||||
"block.create.gabbro_slab": "Gabbro Slab",
|
||||
|
@ -115,7 +118,7 @@
|
|||
"block.create.indented_gabbro_slab": "Indented Gabbro Slab",
|
||||
"block.create.slightly_mossy_gabbro_bricks": "Mossy Gabbro Bricks",
|
||||
"block.create.mossy_gabbro_bricks": "Overgrown Gabbro Bricks",
|
||||
|
||||
|
||||
"block.create.weathered_limestone": "Weathered Limestone",
|
||||
"block.create.weathered_limestone_stairs": "Weathered Limestone Stairs",
|
||||
"block.create.weathered_limestone_wall": "Weathered Limestone Wall",
|
||||
|
@ -127,7 +130,7 @@
|
|||
"block.create.weathered_limestone_bricks_wall": "Weathered Limestone Brick Wall",
|
||||
"block.create.weathered_limestone_bricks_slab": "Weathered Limestone Brick Slab",
|
||||
"block.create.weathered_limestone_pillar": "Weathered Limestone Pillar",
|
||||
|
||||
|
||||
"block.create.dolomite_pillar": "Dolomite Pillar",
|
||||
"block.create.dolomite": "Dolomite",
|
||||
"block.create.dolomite_stairs": "Dolomite Stairs",
|
||||
|
@ -138,7 +141,7 @@
|
|||
"block.create.dolomite_bricks_stairs": "Dolomite Brick Stairs",
|
||||
"block.create.dolomite_bricks_slab": "Dolomite Brick Slab",
|
||||
"block.create.polished_dolomite": "Polished Dolomite",
|
||||
|
||||
|
||||
"block.create.limesand": "Limesand",
|
||||
"block.create.limestone": "Limestone",
|
||||
"block.create.limestone_stairs": "Limestone Stairs",
|
||||
|
@ -151,22 +154,22 @@
|
|||
"block.create.polished_limestone": "Polished Limestone",
|
||||
"block.create.polished_limestone_slab": "Polished Limestone Slab",
|
||||
"block.create.limestone_pillar": "Limestone Pillar",
|
||||
|
||||
|
||||
"block.create.schematicannon": "Schematicannon",
|
||||
"block.create.schematic_table": "Schematic Table",
|
||||
"block.create.creative_crate": "Schematicannon Creatifier",
|
||||
|
||||
"block.create.cocoa_log": "Cocoa Jungle Log",
|
||||
|
||||
|
||||
"block.create.shop_shelf": "Shelf",
|
||||
|
||||
|
||||
"_comment": "-------------------------] UI & MESSAGES [------------------------------------------------",
|
||||
|
||||
"death.attack.create.crush": "%1$s was processed by Crushing Wheels",
|
||||
"death.attack.create.fan_fire": "%1$s was burned to death by hot air",
|
||||
"death.attack.create.fan_lava": "%1$s was burned to death by lava fan",
|
||||
"death.attack.create.drill": "%1$s was impaled by Mechanical Drill",
|
||||
|
||||
|
||||
"create.recipe.crushing": "Crushing",
|
||||
"create.recipe.splashing": "Bulk Washing",
|
||||
"create.recipe.splashing.fan": "Fan behind Flowing Water",
|
||||
|
@ -177,7 +180,7 @@
|
|||
"create.recipe.pressing": "Mechanical Press",
|
||||
"create.recipe.blockzapperUpgrade": "Handheld Blockzapper",
|
||||
"create.recipe.processing.chance": "%1$s%% Chance",
|
||||
|
||||
|
||||
"create.generic.range": "Range",
|
||||
"create.generic.radius": "Radius",
|
||||
"create.generic.speed": "Speed",
|
||||
|
@ -185,23 +188,23 @@
|
|||
"create.generic.unit.ticks": "Ticks",
|
||||
"create.generic.unit.seconds": "Seconds",
|
||||
"create.generic.unit.minutes": "Minutes",
|
||||
|
||||
|
||||
"create.action.scroll": "Scroll",
|
||||
"create.action.confirm": "Confirm",
|
||||
"create.action.abort": "Abort",
|
||||
"create.action.saveToFile": "Save",
|
||||
"create.action.discard": "Discard",
|
||||
|
||||
|
||||
"create.keyinfo.toolmenu": "Focus Tool Menu",
|
||||
|
||||
|
||||
"create.gui.scrollInput.defaultTitle": "Choose an Option:",
|
||||
"create.gui.scrollInput.scrollToModify": "Scroll to Modify",
|
||||
"create.gui.scrollInput.scrollToSelect": "Scroll to Select",
|
||||
"create.gui.scrollInput.shiftScrollsFaster": "Shift to Scroll faster",
|
||||
|
||||
|
||||
"create.gui.toolmenu.focusKey": "Hold [%1$s] to Focus",
|
||||
"create.gui.toolmenu.cycle": "[SCROLL] to Cycle",
|
||||
|
||||
|
||||
"create.gui.symmetryWand.mirrorType": "Mirror",
|
||||
"create.gui.symmetryWand.orientation": "Orientation",
|
||||
"create.symmetry.mirror.plane": "Mirror once",
|
||||
|
@ -212,12 +215,13 @@
|
|||
"create.orientation.horizontal": "Horizontal",
|
||||
"create.orientation.alongZ": "Along Z",
|
||||
"create.orientation.alongX": "Along X",
|
||||
|
||||
|
||||
"create.gui.blockzapper.title": "Handheld Blockzapper",
|
||||
"create.gui.blockzapper.replaceMode": "Replace Mode",
|
||||
"create.gui.blockzapper.searchDiagonal": "Follow Diagonals",
|
||||
"create.gui.blockzapper.searchFuzzy": "Ignore Material Borders",
|
||||
"create.gui.blockzapper.range": "Spread Range",
|
||||
"create.gui.blockzapper.needsUpgradedAmplifier": "Requires Upgraded Amplifier",
|
||||
"create.gui.blockzapper.patternSection": "Patterns",
|
||||
"create.gui.blockzapper.pattern.solid": "Solid",
|
||||
"create.gui.blockzapper.pattern.checkered": "Checkerboard",
|
||||
|
@ -225,7 +229,7 @@
|
|||
"create.gui.blockzapper.pattern.chance25": "25% Roll",
|
||||
"create.gui.blockzapper.pattern.chance50": "50% Roll",
|
||||
"create.gui.blockzapper.pattern.chance75": "75% Roll",
|
||||
|
||||
|
||||
"create.blockzapper.usingBlock": "Using: %1$s",
|
||||
"create.blockzapper.componentUpgrades": "Component Upgrades:",
|
||||
"create.blockzapper.component.body": "Body",
|
||||
|
@ -238,14 +242,14 @@
|
|||
"create.blockzapper.componentTier.choruschrome": "Chorus Chrome",
|
||||
"create.blockzapper.leftClickToSet": "Left-Click a Block to set Material",
|
||||
"create.blockzapper.empty": "Out of Blocks!",
|
||||
|
||||
|
||||
"create.logistics.filter": "Filter",
|
||||
"create.logistics.firstFrequency": "Freq. #1",
|
||||
"create.logistics.secondFrequency": "Freq. #2",
|
||||
|
||||
|
||||
"create.gui.flexcrate.title": "FlexCrate",
|
||||
"create.gui.flexcrate.storageSpace": "Storage Space",
|
||||
|
||||
|
||||
"create.gui.stockswitch.title": "Stockpile Switch",
|
||||
"create.gui.stockswitch.lowerLimit": "Lower Threshold",
|
||||
"create.gui.stockswitch.upperLimit": "Upper Threshold",
|
||||
|
@ -253,7 +257,7 @@
|
|||
"create.gui.stockswitch.startAbove": "Start Signal above",
|
||||
"create.gui.stockswitch.stopAt": "Stop Signal at",
|
||||
"create.gui.stockswitch.stopBelow": "Stop Signal below",
|
||||
|
||||
|
||||
"create.schematicAndQuill.dimensions": "Schematic Size: %1$sx%2$sx%3$s",
|
||||
"create.schematicAndQuill.firstPos": "First position set.",
|
||||
"create.schematicAndQuill.secondPos": "Second position set.",
|
||||
|
@ -262,7 +266,7 @@
|
|||
"create.schematicAndQuill.prompt": "Enter a name for the Schematic:",
|
||||
"create.schematicAndQuill.fallbackName": "My Schematic",
|
||||
"create.schematicAndQuill.saved": "Saved as %1$s",
|
||||
|
||||
|
||||
"create.schematic.invalid": "[!] Invalid Item - Use the Schematic Table instead",
|
||||
"create.schematic.position": "Position",
|
||||
"create.schematic.rotation": "Rotation",
|
||||
|
@ -274,14 +278,14 @@
|
|||
"create.schematic.mirror.none": "None",
|
||||
"create.schematic.mirror.frontBack": "Front-Back",
|
||||
"create.schematic.mirror.leftRight": "Left-Right",
|
||||
|
||||
|
||||
"create.schematic.tool.deploy": "Deploy",
|
||||
"create.schematic.tool.move": "Move XZ",
|
||||
"create.schematic.tool.movey": "Move Y",
|
||||
"create.schematic.tool.rotate": "Rotate",
|
||||
"create.schematic.tool.print": "Print",
|
||||
"create.schematic.tool.flip": "Flip",
|
||||
|
||||
|
||||
"create.schematic.tool.deploy.description.0": "Moves the structure to a location.",
|
||||
"create.schematic.tool.deploy.description.1": "Right-Click on the ground to place.",
|
||||
"create.schematic.tool.deploy.description.2": "Hold [Ctrl] to select at a fixed distance.",
|
||||
|
@ -306,17 +310,17 @@
|
|||
"create.schematic.tool.flip.description.1": "Point at the Schematic and [CTRL]-Scroll to flip it.",
|
||||
"create.schematic.tool.flip.description.2": "",
|
||||
"create.schematic.tool.flip.description.3": "",
|
||||
|
||||
|
||||
"create.schematics.synchronizing": "Syncing...",
|
||||
"create.schematics.uploadTooLarge": "Your schematic is too large",
|
||||
"create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:",
|
||||
|
||||
|
||||
"create.gui.schematicTable.title": "Schematic Table",
|
||||
"create.gui.schematicTable.availableSchematics": "Available Schematics",
|
||||
"create.gui.schematicTable.noSchematics": "No Schematics Saved",
|
||||
"create.gui.schematicTable.uploading": "Uploading...",
|
||||
"create.gui.schematicTable.finished": "Upload Finished!",
|
||||
|
||||
|
||||
"create.gui.schematicannon.title": "Schematicannon",
|
||||
"create.gui.schematicannon.settingsTitle": "Placement Settings",
|
||||
"create.gui.schematicannon.listPrinter": "Material List Printer",
|
||||
|
@ -331,14 +335,14 @@
|
|||
"create.gui.schematicannon.option.replaceWithEmpty": "Replace Solid with Empty",
|
||||
"create.gui.schematicannon.option.skipMissing": "Skip missing Blocks",
|
||||
"create.gui.schematicannon.option.skipTileEntities": "Protect Tile Entities",
|
||||
|
||||
|
||||
"create.gui.schematicannon.option.skipMissing.description": "If the Schematicannon cannot find a required Block for placement, it will continue at the next Location.",
|
||||
"create.gui.schematicannon.option.skipTileEntities.description": "The Schematicannon will avoid replacing data holding blocks such as Chests.",
|
||||
"create.gui.schematicannon.option.dontReplaceSolid.description": "The cannon will never replace any Solid blocks in its working area, only non-Solid and Air.",
|
||||
"create.gui.schematicannon.option.replaceWithSolid.description": "The cannon will only replace Solid blocks in its working area, if the Schematic contains a solid Block at their location.",
|
||||
"create.gui.schematicannon.option.replaceWithAny.description": "The cannon will replace Solid blocks in its working area, if the Schematic contains any Block at their location.",
|
||||
"create.gui.schematicannon.option.replaceWithEmpty.description": "The cannon will clear out all blocks in its working area, including those replaced by Air.",
|
||||
|
||||
|
||||
"create.schematicannon.status.idle": "Idle",
|
||||
"create.schematicannon.status.ready": "Ready",
|
||||
"create.schematicannon.status.running": "Running",
|
||||
|
@ -370,14 +374,16 @@
|
|||
"create.gui.logistical_controller.passive_mode": "Passive Mode",
|
||||
"create.gui.requester.requestedItemCount": "Requested Amount",
|
||||
"create.gui.storage.passiveModeOnly": "Item Storage is Passive only",
|
||||
|
||||
|
||||
"create.tooltip.holdKey": "Hold [%1$s]",
|
||||
"create.tooltip.holdKeyOrKey": "Hold [%1$s] or [%2$s]",
|
||||
"create.tooltip.keyShift": "Shift",
|
||||
"create.tooltip.keyCtrl": "Ctrl",
|
||||
|
||||
"create.mechanical_mixer.min_ingredients": "Min. Ingredients",
|
||||
|
||||
"_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",
|
||||
|
@ -385,8 +391,8 @@
|
|||
"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.example_item.tooltip.action1": "These controls are displayed.",
|
||||
|
||||
"item.create.symmetry_wand.tooltip": "SYMMETRY WAND",
|
||||
"item.create.symmetry_wand.tooltip.summary": "Perfectly mirrors your Block placement across the configured planes.",
|
||||
"item.create.symmetry_wand.tooltip.condition1": "When in Hotbar",
|
||||
|
@ -397,7 +403,7 @@
|
|||
"item.create.symmetry_wand.tooltip.action2": "_Removes_ the active Mirror",
|
||||
"item.create.symmetry_wand.tooltip.control3": "R-Click while Sneaking",
|
||||
"item.create.symmetry_wand.tooltip.action3": "Opens the _Configuration_ _Interface_",
|
||||
|
||||
|
||||
"item.create.placement_handgun.tooltip": "BLOCKZAPPER",
|
||||
"item.create.placement_handgun.tooltip.summary": "Novel gadget for placing or exchanging blocks at a distance.",
|
||||
"item.create.placement_handgun.tooltip.control1": "L-Click at Block",
|
||||
|
@ -406,27 +412,27 @@
|
|||
"item.create.placement_handgun.tooltip.action2": "_Places_ or _Replaces_ the targeted block.",
|
||||
"item.create.placement_handgun.tooltip.control3": "R-Click while Sneaking",
|
||||
"item.create.placement_handgun.tooltip.action3": "Opens the _Configuration_ _Interface_",
|
||||
|
||||
|
||||
"item.create.tree_fertilizer.tooltip": "TREE FERTILIZER",
|
||||
"item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals suitable for common tree types",
|
||||
"item.create.tree_fertilizer.tooltip.condition1": "When used on Sapling",
|
||||
"item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees regardless of their spacing Conditions",
|
||||
|
||||
"item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees regardless of their spacing Conditions",
|
||||
|
||||
"block.create.cocoa_log.tooltip": "COCOA LOG",
|
||||
"block.create.cocoa_log.tooltip.summary": "An augmented jungle log allowing for easier automation of _Cocoa_ _Beans_",
|
||||
"block.create.cocoa_log.tooltip.condition1": "When Mature",
|
||||
"block.create.cocoa_log.tooltip.behaviour1": "Grows _Cocoa_ _Pods_ on all sides",
|
||||
|
||||
|
||||
"item.create.empty_blueprint.tooltip": "EMPTY SCHEMATIC",
|
||||
"item.create.empty_blueprint.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic_ _Table_",
|
||||
|
||||
|
||||
"item.create.blueprint.tooltip": "SCHEMATIC",
|
||||
"item.create.blueprint.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.",
|
||||
"item.create.blueprint.tooltip.condition1": "When Held",
|
||||
"item.create.blueprint.tooltip.behaviour1": "Can be positioned using the Tools on Screen",
|
||||
"item.create.blueprint.tooltip.control1": "R-Click while Sneaking",
|
||||
"item.create.blueprint.tooltip.action1": "Opens an _Interface_ for entering exact _Coordinates._",
|
||||
|
||||
|
||||
"item.create.blueprint_and_quill.tooltip": "SCHEMATIC AND QUILL",
|
||||
"item.create.blueprint_and_quill.tooltip.summary": "Used for saving a Structure in your world to a .nbt file.",
|
||||
"item.create.blueprint_and_quill.tooltip.condition1": "Step 1",
|
||||
|
@ -439,62 +445,62 @@
|
|||
"item.create.blueprint_and_quill.tooltip.action2": "Select points in _mid-air_. _Scroll_ to adjust the distance.",
|
||||
"item.create.blueprint_and_quill.tooltip.control3": "R-Click while Sneaking",
|
||||
"item.create.blueprint_and_quill.tooltip.action3": "_Resets_ and removes the selection.",
|
||||
|
||||
|
||||
"block.create.creative_crate.tooltip": "CREATIVE CRATE",
|
||||
"block.create.creative_crate.tooltip.summary": "Provides an endless supply of blocks to adjacent _Schematicannons_",
|
||||
|
||||
|
||||
"block.create.schematicannon.tooltip": "SCHEMATICANNON",
|
||||
"block.create.schematicannon.tooltip.summary": "Shoots blocks to recreate a deployed _Schematic_ in the World. Uses items from adjacent Inventories and _Gunpowder_ as fuel.",
|
||||
"block.create.schematicannon.tooltip.control1": "When R-Clicked",
|
||||
"block.create.schematicannon.tooltip.action1": "Opens the _Interface_",
|
||||
|
||||
|
||||
"block.create.schematic_table.tooltip": "SCHEMATIC TABLE",
|
||||
"block.create.schematic_table.tooltip.summary": "Writes saved Schematics onto an _Empty_ _Schematic_",
|
||||
"block.create.schematic_table.tooltip.condition1": "When given an Empty Schematic",
|
||||
"block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder",
|
||||
|
||||
|
||||
"block.create.shaft.tooltip": "SHAFT",
|
||||
"block.create.shaft.tooltip.summary": "_Relays_ _Rotation_ in a straight line.",
|
||||
|
||||
|
||||
"block.create.cogwheel.tooltip": "COGWHEEL",
|
||||
"block.create.cogwheel.tooltip.summary": "_Relays_ _Rotation_ in a straigt line, and to adjacent _Cogwheels._",
|
||||
|
||||
"block.create.large_cogwheel.tooltip": "LARGE COGWHEEL",
|
||||
"block.create.large_cogwheel.tooltip.summary": "A larger version of the _Cogwheel,_ allowing for _change_ in _Rotation_ _Speed_ when connected to its smaller Counterpart.",
|
||||
|
||||
|
||||
"block.create.encased_shaft.tooltip": "ENCASED SHAFT",
|
||||
"block.create.encased_shaft.tooltip.summary": "_Relays_ _Rotation_ in a straight line. Suitable for propagating Rotation through Walls.",
|
||||
|
||||
"block.create.gearbox.tooltip": "GEARBOX",
|
||||
"block.create.gearbox.tooltip.summary": "_Relays_ _Rotation_ to _Four_ _directions._ Reverses straight connections.",
|
||||
|
||||
|
||||
"block.create.gearshift.tooltip": "GEARSHIFT",
|
||||
"block.create.gearshift.tooltip.summary": "A controllable _rotation_ _switch_ for connected shafts.",
|
||||
"block.create.gearshift.tooltip.condition1": "When Powered",
|
||||
"block.create.gearshift.tooltip.behaviour1": "_Reverses_ the outgoing rotation.",
|
||||
|
||||
|
||||
"block.create.clutch.tooltip": "CLUTCH",
|
||||
"block.create.clutch.tooltip.summary": "A controllable _rotation_ _switch_ for connected shafts.",
|
||||
"block.create.clutch.tooltip.condition1": "When Powered",
|
||||
"block.create.clutch.tooltip.behaviour1": "_Stops_ conveying rotation to the other side.",
|
||||
|
||||
|
||||
"block.create.encased_belt.tooltip": "ENCASED_BELT",
|
||||
"block.create.encased_belt.tooltip.summary": "_Relays_ _Rotation_ through its block and to an attached _Encased_ _Belt._",
|
||||
"block.create.encased_belt.tooltip.condition1": "When Attached to other Encased Belt",
|
||||
"block.create.encased_belt.tooltip.behaviour1": "Attached Block will have the exact same rotation speed and direction. Attached Belts do not have to face the same way.",
|
||||
|
||||
|
||||
"item.create.belt_connector.tooltip": "BELT CONNECTOR",
|
||||
"item.create.belt_connector.tooltip.summary": "Connects two _Shafts_ with a _Mechanical_ _Belt._ Connected shafts will have the exact same rotation speed and direction. The Belt can act as a _Conveyor_ for _Entities._",
|
||||
"item.create.belt_connector.tooltip.control1": "R-Clicked on Shaft",
|
||||
"item.create.belt_connector.tooltip.action1": "Selects the shaft as one pulley of the Belt. Both selected Shafts have to _line_ _up_ either _Vertically,_ _Horizontally_ or _Diagonally_ towards the Belt's Direction.",
|
||||
"item.create.belt_connector.tooltip.control2": "R-Click while Sneaking",
|
||||
"item.create.belt_connector.tooltip.action2": "_Resets_ the first selected position for the Belt",
|
||||
|
||||
|
||||
"block.create.belt_support.tooltip": "BELT SUPPORT",
|
||||
"block.create.belt_support.tooltip.summary": "A _purely_ _decorational_ block suitable for mounting _Mechanical_ _Belts_ to the Ground.",
|
||||
"block.create.belt_support.tooltip.condition1": "When placed below a Belt",
|
||||
"block.create.belt_support.tooltip.behaviour1": "Supports the top of the Belt, hiding the bottom layer.",
|
||||
|
||||
"block.create.belt_support.tooltip.behaviour1": "Supports the top of the Belt, hiding the bottom layer.",
|
||||
|
||||
"block.create.motor.tooltip": "MOTOR",
|
||||
"block.create.motor.tooltip.summary": "A configurable source of _Rotational_ _Force_",
|
||||
|
||||
|
@ -503,8 +509,8 @@
|
|||
|
||||
"block.create.encased_fan.tooltip": "ENCASED FAN",
|
||||
"block.create.encased_fan.tooltip.summary": "Converts _Rotational_ _Force_ to _Air_ _Currents_ and back. Has a variety of uses.",
|
||||
"block.create.encased_fan.tooltip.condition1": "When above Fire",
|
||||
"block.create.encased_fan.tooltip.behaviour1": "Provides _Rotational_ _Force_ (has to be vertical)",
|
||||
"block.create.encased_fan.tooltip.condition1": "When Powered by Redstone",
|
||||
"block.create.encased_fan.tooltip.behaviour1": "Provides _Rotational_ _Force_ from any _heat_ _sources_ immediately below itself (fan has to be vertical)",
|
||||
"block.create.encased_fan.tooltip.condition2": "When Rotated",
|
||||
"block.create.encased_fan.tooltip.behaviour2": "_Pushes_ Entities on one side, _Pulls_ on the other. Force and Speed depend on incoming Rotations.",
|
||||
"block.create.encased_fan.tooltip.condition3": "When air flows through special blocks",
|
||||
|
@ -524,55 +530,55 @@
|
|||
"block.create.mechanical_press.tooltip.behaviour1": "_Starts_ to compress items dropped below it.",
|
||||
"block.create.mechanical_press.tooltip.condition2": "When Above a Mechanical Belt",
|
||||
"block.create.mechanical_press.tooltip.behaviour2": "_Automatically_ compresses bypassing items on the Belt.",
|
||||
|
||||
|
||||
"block.create.mechanical_piston.tooltip": "MECHANICAL PISTON",
|
||||
"block.create.mechanical_piston.tooltip.summary": "A more advanced version of the _Piston,_ using _Rotational_ _Force_ to precisely move attached structures. _Piston_ _Extension_ _Poles_ at the rear define the _Range_ of this Device. Without extensions, the piston will not move. Use _Translation_ _Chassis_ to move more than a single line of blocks.",
|
||||
"block.create.mechanical_piston.tooltip.condition1": "When Rotated",
|
||||
"block.create.mechanical_piston.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.",
|
||||
|
||||
|
||||
"block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON",
|
||||
"block.create.sticky_mechanical_piston.tooltip.summary": "A more advanced version of the _Sticky_ _Piston,_ using _Rotational_ _Force_ to precisely move attached structures. _Piston_ _Extension_ _Poles_ at the rear define the _Range_ of this Device. Without extensions, the piston will not move. Use _Translation_ _Chassis_ to move more than a single line of blocks.",
|
||||
"block.create.sticky_mechanical_piston.tooltip.condition1": "When Rotated",
|
||||
"block.create.sticky_mechanical_piston.tooltip.behaviour1": "Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.",
|
||||
|
||||
|
||||
"block.create.piston_pole.tooltip": "PISTON POLE",
|
||||
"block.create.piston_pole.tooltip.summary": "Used to increase the extension range of _Mechanical_ _Pistons_",
|
||||
"block.create.piston_pole.tooltip.condition1": "When attached to Mechanical Piston",
|
||||
"block.create.piston_pole.tooltip.behaviour1": "Extends the pistons extension range by 1 block",
|
||||
|
||||
|
||||
"block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING",
|
||||
"block.create.mechanical_bearing.tooltip.summary": "Used for rotating _larger_ _structures_ or generating _Rotational_ _Force_ from wind.",
|
||||
"block.create.mechanical_bearing.tooltip.condition1": "When Rotated",
|
||||
"block.create.mechanical_bearing.tooltip.behaviour1": "Starts physically rotating attached _Rotation_ _Chassis_ and their attached blocks respectively.",
|
||||
"block.create.mechanical_bearing.tooltip.condition2": "When Powered by Redstone",
|
||||
"block.create.mechanical_bearing.tooltip.behaviour2": "Starts providing _Rotational_ _Force_ from rotating its attached structure. The Structure has to include suitable _Sail_ _Blocks_ (Currently any Wool Block).",
|
||||
|
||||
|
||||
"block.create.translation_chassis.tooltip": "TRANSLATION CHASSIS",
|
||||
"block.create.translation_chassis.tooltip.summary": "A configurable base for Structures moved by a _Mechanical_ _Piston._ These Blocks have to form the first Layer of blocks in front of the Piston.",
|
||||
"block.create.translation_chassis.tooltip.condition1": "When Moved by Mechanical Piston",
|
||||
"block.create.translation_chassis.tooltip.behaviour1": "_Moves_ all _attached_ _Chassis_ with the same orientation, and attached Blocks in front of it. When the Piston retracts, blocks will only be pulled if the chassis' face is _Sticky_ (See [Ctrl]).",
|
||||
"block.create.translation_chassis.tooltip.control1": "When R-Clicked with Slime Ball",
|
||||
"block.create.translation_chassis.tooltip.action1": "Makes the clicked face _Sticky._ When the piston retracts, the chassis will _pull_ _back_ all attached Blocks in its column and within the configured Range.",
|
||||
|
||||
|
||||
"block.create.rotation_chassis.tooltip": "ROTATION CHASSIS",
|
||||
"block.create.rotation_chassis.tooltip.summary": "Required for rotating structures with the _Mechanical_ _Bearing._ ",
|
||||
"block.create.rotation_chassis.tooltip.condition1": "When Rotated by Bearing",
|
||||
"block.create.rotation_chassis.tooltip.behaviour1": "_Rotates_ all blocks attached to _Sticky_ sides (See [Ctrl]) within the configured range around itself. _Transmits_ the rotation to further attached Rotation Chassis.",
|
||||
"block.create.rotation_chassis.tooltip.control1": "When R-Clicked with Slime Ball",
|
||||
"block.create.rotation_chassis.tooltip.action1": "Makes the clicked face _Sticky._ When the Chassis rotates, all blocks attached to this side will be rotated with it.",
|
||||
|
||||
|
||||
"block.create.drill.tooltip": "MECHANICAL DRILL",
|
||||
"block.create.drill.tooltip.summary": "A mechanical device suitable for _breaking_ _blocks._",
|
||||
"block.create.drill.tooltip.condition1": "When Rotated",
|
||||
"block.create.drill.tooltip.behaviour1": "Acts as a _stationary_ Block Breaker. Also _hurts_ _entities_ in its effective area.",
|
||||
"block.create.drill.tooltip.condition2": "When Pushed by Mechanical Piston",
|
||||
"block.create.drill.tooltip.behaviour2": "Breaks Blocks the drill is running into.",
|
||||
|
||||
"block.create.drill.tooltip.behaviour2": "Breaks Blocks the drill is running into.",
|
||||
|
||||
"block.create.harvester.tooltip": "MECHANICAL HARVESTER",
|
||||
"block.create.harvester.tooltip.summary": "A mechanical plant cutter suitable for medium scale crop automation",
|
||||
"block.create.harvester.tooltip.condition1": "When Pushed by Mechanical Piston",
|
||||
"block.create.harvester.tooltip.behaviour1": "_Harvests_ all _mature_ _crops_ the blade is running into, and resets them to their initial growth state.",
|
||||
|
||||
|
||||
"block.create.stockswitch.tooltip": "STOCKSWITCH",
|
||||
"block.create.stockswitch.tooltip.summary": "Toggles a Redstone signal based on the _Storage_ _Space_ in the attached Container.",
|
||||
"block.create.stockswitch.tooltip.condition1": "When below Lower Limit",
|
||||
|
@ -581,7 +587,7 @@
|
|||
"block.create.stockswitch.tooltip.behaviour2": "Starts providing _Redstone_ _Power_ until Lower Limit is reached again.",
|
||||
"block.create.stockswitch.tooltip.control1": "When R-Clicked",
|
||||
"block.create.stockswitch.tooltip.action1": "Opens the _Configuration_ _Interface_",
|
||||
|
||||
|
||||
"block.create.redstone_bridge.tooltip": "REDSTONE LINK",
|
||||
"block.create.redstone_bridge.tooltip.summary": "Endpoints for _Wireless_ _Redstone_ connections. Can be assigned _Frequencies_ using any item. Signal range is limited, but reasonably far.",
|
||||
"block.create.redstone_bridge.tooltip.condition1": "When Powered",
|
||||
|
@ -590,50 +596,50 @@
|
|||
"block.create.redstone_bridge.tooltip.action1": "Sets the _Frequency_ to that item. A total of _two_ _different_ _items_ can be used in combination for defining a Frequency.",
|
||||
"block.create.redstone_bridge.tooltip.control2": "When R-Clicked while Sneaking",
|
||||
"block.create.redstone_bridge.tooltip.action2": "Toggles between _Receiver_ and _Transmitter_ Mode.",
|
||||
|
||||
|
||||
"block.create.contact.tooltip": "REDSTONE CONTACT",
|
||||
"block.create.contact.tooltip.summary": "A simple device for advanced Redstone Contraptions.",
|
||||
"block.create.contact.tooltip.condition1": "When facing other Contact",
|
||||
"block.create.contact.tooltip.behaviour1": "Provides a _Redstone_ _Signal_",
|
||||
"block.create.contact.tooltip.condition2": "When moved by Mechanical Piston",
|
||||
"block.create.contact.tooltip.behaviour2": "Triggers all stationary Contacts passing by",
|
||||
|
||||
"block.create.contact.tooltip.behaviour2": "Triggers all stationary Contacts passing by",
|
||||
|
||||
"block.create.flexcrate.tooltip": "FLEXCRATE",
|
||||
"block.create.flexcrate.tooltip.summary": "This _Storage_ _Container_ allows Manual control over its capacity. It can hold up to _16_ _Stacks_ of any Item",
|
||||
"block.create.flexcrate.tooltip.control1": "When R-Clicked",
|
||||
"block.create.flexcrate.tooltip.action1": "Opens the _Interface_",
|
||||
|
||||
"block.create.flexcrate.tooltip.action1": "Opens the _Interface_",
|
||||
|
||||
"block.create.extractor.tooltip": "EXTRACTOR",
|
||||
"block.create.extractor.tooltip.summary": "_Takes_ _items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items until the space cleared. Can be assigned an item-stack as a _filter._",
|
||||
"block.create.extractor.tooltip.condition1": "When Powered by Redstone",
|
||||
"block.create.extractor.tooltip.behaviour1": "_Pauses_ the Extractor",
|
||||
"block.create.extractor.tooltip.control1": "R-Click on Filter Space",
|
||||
"block.create.extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
|
||||
|
||||
"block.create.extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
|
||||
|
||||
"block.create.linked_extractor.tooltip": "LINKED EXTRACTOR",
|
||||
"block.create.linked_extractor.tooltip.summary": "_Takes_ _items_ from an attached _Inventory_ and drops them onto the ground. Will not drop Items until the space cleared. Can be assigned an item-stack as a _filter._ Can be controlled remotely via a _Redstone_ _Link._",
|
||||
"block.create.linked_extractor.tooltip.condition1": "When Redstone Link Active",
|
||||
"block.create.linked_extractor.tooltip.behaviour1": "_Pauses_ the Extractor",
|
||||
"block.create.linked_extractor.tooltip.control1": "R-Click on Filter Space",
|
||||
"block.create.linked_extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
|
||||
"block.create.linked_extractor.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Extractor will pull the item _type_ and _count_ of the filter stack exclusively.",
|
||||
"block.create.linked_extractor.tooltip.control2": "R-Click on Frequency Space",
|
||||
"block.create.linked_extractor.tooltip.action2": "Assigns currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Extractor will pause.",
|
||||
|
||||
"block.create.linked_extractor.tooltip.action2": "Assigns currently _held_ _item_ as part of the Frequency listened on. Whenever a transmitting _Redstone_ _Link_ of the same frequency is powered, this Extractor will pause.",
|
||||
|
||||
"block.create.belt_funnel.tooltip": "BELT FUNNEL",
|
||||
"block.create.belt_funnel.tooltip.summary": "Collects incoming items on a _Mechanical_ _Belt_ and inserts them into the attached _Inventory_ if possible. Has to be directly _on_ _top_ of a Belt, with the opening facing against the Belts' movement direction. The inventory has to be on the same height as the funnel.",
|
||||
|
||||
|
||||
"block.create.entity_detector.tooltip": "BELT OBSERVER",
|
||||
"block.create.entity_detector.tooltip.summary": "Detects items passing by on a _Mechanical_ _Belt_ in front of it. Works well with a _Piston_ on top, pushing certain items off.",
|
||||
"block.create.entity_detector.tooltip.condition1": "When item matches Filter",
|
||||
"block.create.entity_detector.tooltip.behaviour1": "Provides a short _Redstone_ _pulse_ to all sides. An Empty Filter matches all passing items.",
|
||||
"block.create.entity_detector.tooltip.control1": "R-Click on Filter Space",
|
||||
"block.create.entity_detector.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Observer will react to this item type only.",
|
||||
|
||||
"block.create.entity_detector.tooltip.action1": "Assigns currently _held_ _stack_ as the _Filter._ Observer will react to this item type only.",
|
||||
|
||||
"block.create.pulse_repeater.tooltip": "PULSE REPEATER",
|
||||
"block.create.pulse_repeater.tooltip.summary": "A simple circuit for cutting passing redstone signals to a length of _1_ _tick._",
|
||||
|
||||
|
||||
"block.create.flexpeater.tooltip": "FLEX REPEATER",
|
||||
"block.create.flexpeater.tooltip.summary": "An advanced _Redstone_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.",
|
||||
|
||||
|
||||
"itemGroup.create": "Create"
|
||||
}
|
||||
|
|
608
src/main/resources/assets/create/lang/pt_br.json
Normal file
608
src/main/resources/assets/create/lang/pt_br.json
Normal file
|
@ -0,0 +1,608 @@
|
|||
{
|
||||
|
||||
"_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------",
|
||||
|
||||
"item.create.symmetry_wand": "Varinha de Simetria",
|
||||
"item.create.placement_handgun": "Blockzapper Portátil",
|
||||
"item.create.tree_fertilizer": "Fertilizante de Árvore",
|
||||
"item.create.empty_blueprint": "Esquema vazio",
|
||||
"item.create.andesite_alloy_cube": "Liga de Andesite",
|
||||
"item.create.blaze_brass_cube": "Latão de Blaze",
|
||||
"item.create.chorus_chrome_cube": "Coro Cromada",
|
||||
"item.create.chromatic_compound_cube": "Composto Cromático",
|
||||
"item.create.shadow_steel_cube": "Aço Sombrio",
|
||||
"item.create.blueprint_and_quill": "Esquema e pena",
|
||||
"item.create.blueprint": "Esquema",
|
||||
"item.create.belt_connector": "Esteira Mecânica",
|
||||
"item.create.filter": "Filtro",
|
||||
"item.create.rose_quartz": "Quartzo Rosa",
|
||||
"item.create.refined_rose_quartz": "Quartzo Rosa Refinado",
|
||||
"item.create.refined_radiance_cube": "Esplendor Refinado",
|
||||
"item.create.iron_sheet": "Placas de Ferro",
|
||||
"item.create.gold_sheet": "Placas de Outro",
|
||||
"item.create.propeller": "Hélice",
|
||||
"item.create.flour": "Farinha de Trigo",
|
||||
"item.create.dough": "Massa",
|
||||
|
||||
"item.create.blazing_pickaxe": "Picareta Ardente",
|
||||
"item.create.blazing_shovel": "Pá Ardente",
|
||||
"item.create.blazing_axe": "Machado Ardente",
|
||||
"item.create.blazing_sword": "Espada Longa Ardente",
|
||||
|
||||
"item.create.shadow_steel_pickaxe": "Picareta de Aço Sombrio",
|
||||
"item.create.shadow_steel_mattock": "Enxada de Aço Sombrio",
|
||||
"item.create.shadow_steel_sword": "Espada de Aço Sombrio",
|
||||
|
||||
"item.create.rose_quartz_pickaxe": "Picareta de Quartzo Dourado",
|
||||
"item.create.rose_quartz_shovel": "Pá de Quartzo Dourado",
|
||||
"item.create.rose_quartz_axe": "Machado de Quartzo Dourado",
|
||||
"item.create.rose_quartz_sword": "Lamina de Quartzo Dourado",
|
||||
|
||||
"block.create.cogwheel": "Roda Dentada",
|
||||
"block.create.large_cogwheel": "Roda Dentada Grande",
|
||||
"block.create.turntable": "Mesa giratória",
|
||||
"block.create.gearbox": "Caixa de Transmissão",
|
||||
"block.create.gearshift": "Câmbio",
|
||||
"block.create.clutch": "Embreagem",
|
||||
"block.create.shaft": "Eixo",
|
||||
"block.create.encased_belt": "Esteira Revestida",
|
||||
"block.create.encased_shaft": "Eixo Revestido",
|
||||
"block.create.encased_fan": "Ventilador Revestida",
|
||||
"block.create.motor": "Motor",
|
||||
"block.create.belt": "Esteira Mecânica",
|
||||
"block.create.crushing_wheel": "Roda de Moer",
|
||||
"block.create.drill": "Furadeira Mecânica",
|
||||
"block.create.harvester": "Coletor Mecânico",
|
||||
"block.create.water_wheel": "Roda de Água",
|
||||
"block.create.belt_support": "Suporte da Esteira",
|
||||
"block.create.mechanical_press": "Prensa Mecânico",
|
||||
|
||||
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
|
||||
"block.create.mechanical_piston": "Pistão Mecânico",
|
||||
"block.create.mechanical_piston_head": "Cabeça do Pistão Mecânico",
|
||||
"block.create.piston_pole": "Vara de Extensão do Pistão",
|
||||
"block.create.mechanical_bearing": "Rolamento Mecânico",
|
||||
"block.create.translation_chassis": "Chassis de Translado",
|
||||
"block.create.rotation_chassis": "Chassis de Rotação",
|
||||
|
||||
"block.create.contact": "Contato de Redstone",
|
||||
"block.create.redstone_bridge": "Conexão de Redstone",
|
||||
"block.create.stockswitch": "Disjuntor de Armazenamento",
|
||||
"block.create.flexcrate": "FlexCrate",
|
||||
"block.create.extractor": "Extrator",
|
||||
"block.create.belt_funnel": "Funil de Esteira",
|
||||
"block.create.linked_extractor": "Extrator Conectado",
|
||||
"block.create.pulse_repeater": "Repetidor de Pulso",
|
||||
"block.create.flexpeater": "Repetidor Flex",
|
||||
"block.create.entity_detector": "Observador de Esteira",
|
||||
|
||||
"block.create.tiled_glass": "Vidro Entalhado",
|
||||
"block.create.tiled_glass_pane": "Vidraça Entalhada",
|
||||
|
||||
"block.create.window_in_a_block": "Bloco com Vidraça",
|
||||
"block.create.andesite_bricks": "Tijolos de Andesite",
|
||||
"block.create.diorite_bricks": "Tijolos de Diorito",
|
||||
"block.create.granite_bricks": "Tijolos de Granito",
|
||||
|
||||
"block.create.gabbro": "Gabbro",
|
||||
"block.create.gabbro_stairs": "Escadas de Gabbro",
|
||||
"block.create.gabbro_slab": "Lajotas de Gabbro",
|
||||
"block.create.gabbro_wall": "Muro de Gabbro",
|
||||
"block.create.polished_gabbro": "Gabbro Polido",
|
||||
"block.create.gabbro_bricks": "Tijolos de Gabbro",
|
||||
"block.create.gabbro_bricks_stairs": "Escadas de Tijolos de Gabbro",
|
||||
"block.create.gabbro_bricks_wall": "Muros de Tijolos de Gabbro",
|
||||
"block.create.paved_gabbro_bricks": "Tijolos de Gabbros Pavimentados",
|
||||
"block.create.paved_gabbro_bricks_slab": "Lajotas de Tijolos de Gabbros Pavimentados",
|
||||
"block.create.indented_gabbro": "Ladrilho Destacado de Gabbro",
|
||||
"block.create.indented_gabbro_slab": "Lajota Destacada de Gabbro",
|
||||
"block.create.slightly_mossy_gabbro_bricks": "Tijolos de Gabbros Musgosos",
|
||||
"block.create.mossy_gabbro_bricks": "Tijolos de Gabbros Musgosos Infestados",
|
||||
|
||||
"block.create.weathered_limestone": "Calcário Resistido",
|
||||
"block.create.weathered_limestone_stairs": "Escadas de Calcário Resistido",
|
||||
"block.create.weathered_limestone_wall": " Muro de Calcário Resistido",
|
||||
"block.create.weathered_limestone_slab": "Lajota de Calcário Resistido",
|
||||
"block.create.polished_weathered_limestone": "Calcário Polido Resistido",
|
||||
"block.create.polished_weathered_limestone_slab": "Lajota de Calcário Polido Resistido",
|
||||
"block.create.weathered_limestone_bricks": "Tijolos de Calcário Resistido",
|
||||
"block.create.weathered_limestone_bricks_stairs": "Escadas de Tijolos de Calcário Resistido",
|
||||
"block.create.weathered_limestone_bricks_wall": "Muro de Tijolos de Calcário Resistido",
|
||||
"block.create.weathered_limestone_bricks_slab": "Lajota de Tijolos de Calcário Resistido",
|
||||
"block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido",
|
||||
|
||||
"block.create.dolomite_pillar": "Pilar de Dolomite",
|
||||
"block.create.dolomite": "Dolomite",
|
||||
"block.create.dolomite_stairs": "Escadas de Dolomite",
|
||||
"block.create.dolomite_wall": "Muro de Dolomite",
|
||||
"block.create.dolomite_slab": "Lajota de Dolomite",
|
||||
"block.create.dolomite_bricks": "Tijolos de Dolomite",
|
||||
"block.create.dolomite_bricks_wall": "Muro de Tijolos de Dolomite",
|
||||
"block.create.dolomite_bricks_stairs": "Escadas de Tijolos de Dolomite",
|
||||
"block.create.dolomite_bricks_slab": "Lajotas de Tijolos de Dolomite",
|
||||
"block.create.polished_dolomite": "Dolomite Polido",
|
||||
|
||||
"block.create.limesand": "Areia Calcária",
|
||||
"block.create.limestone": "Calcário",
|
||||
"block.create.limestone_stairs": "Escadas de Calcário",
|
||||
"block.create.limestone_slab": "Lajotas de Calcário",
|
||||
"block.create.limestone_wall": "Muro de Calcário",
|
||||
"block.create.limestone_bricks": "Tijolos de Calcário",
|
||||
"block.create.limestone_bricks_stairs": "Escadas de Tijolos de Calcário",
|
||||
"block.create.limestone_bricks_slab": "Lajotas de Tijolos de Calcário",
|
||||
"block.create.limestone_bricks_wall": "Muro de Tijolos de Calcário",
|
||||
"block.create.polished_limestone": "Calcário Polido",
|
||||
"block.create.polished_limestone_slab": "Lajotas de Calcário Polido",
|
||||
"block.create.limestone_pillar": "Pilar de Calcário",
|
||||
|
||||
"block.create.schematicannon": "Esquemaannon",
|
||||
"block.create.schematic_table": "Mesa de Esquematizar",
|
||||
"block.create.creative_crate": "Criativador Esquemaannon",
|
||||
|
||||
"block.create.cocoa_log": "Madeira de Cacao da Selva",
|
||||
|
||||
"block.create.shop_shelf": "Prateleira",
|
||||
|
||||
"_comment": "-------------------------] UI & MESSAGES [------------------------------------------------",
|
||||
|
||||
"death.attack.create.crush": "%1$s foi processado pelas Rodas de Moer",
|
||||
"death.attack.create.fan_fire": "%1$s foi queimado por ar quente",
|
||||
"death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava",
|
||||
"death.attack.create.drill": "%1$s foi empalado pela Furadeira Mecânica",
|
||||
|
||||
"create.recipe.crushing": "Moendo",
|
||||
"create.recipe.splashing": "Lavando em Massa",
|
||||
"create.recipe.splashing.fan": "Ventilador atras de Água corrente",
|
||||
"create.recipe.smokingViaFan": "Fumaceando em Massa",
|
||||
"create.recipe.smokingViaFan.fan": "Ventilador atras de Fogo",
|
||||
"create.recipe.blastingViaFan": "Fundindo em Massa",
|
||||
"create.recipe.blastingViaFan.fan": "Ventilador atras de Lava",
|
||||
"create.recipe.pressing": "Prensa Mecânica",
|
||||
"create.recipe.blockzapperUpgrade": "Blockzapper Portátil",
|
||||
"create.recipe.processing.chance": "%1$s%% de chance",
|
||||
|
||||
"create.generic.range": "Área",
|
||||
"create.generic.radius": "Raio",
|
||||
"create.generic.speed": "Velocidade",
|
||||
"create.generic.delay": "Demorada",
|
||||
"create.generic.unit.ticks": "Ticks",
|
||||
"create.generic.unit.seconds": "Segundos",
|
||||
"create.generic.unit.minutes": "Minutos",
|
||||
|
||||
"create.action.scroll": "Rolar",
|
||||
"create.action.confirm": "Confirmar",
|
||||
"create.action.abort": "Abortar",
|
||||
"create.action.saveToFile": "Salvar",
|
||||
"create.action.discard": "Descartar",
|
||||
|
||||
"create.keyinfo.toolmenu": "Menu Focal da Ferramenta",
|
||||
|
||||
"create.gui.scrollInput.defaultTitle": "Escolha uma Opção:",
|
||||
"create.gui.scrollInput.scrollToModify": "Role o mouse para Modificar",
|
||||
"create.gui.scrollInput.scrollToSelect": "Role o mouse para Selecionar",
|
||||
"create.gui.scrollInput.shiftRolarsFaster": "Shift para rolar mais rápido",
|
||||
|
||||
"create.gui.toolmenu.focusKey": "Segure [%1$s] para Focar",
|
||||
"create.gui.toolmenu.cycle": "[SCROLL] para Circular",
|
||||
|
||||
"create.gui.symmetryWand.mirrorType": "Espelhar",
|
||||
"create.gui.symmetryWand.orientation": "Orientação",
|
||||
"create.symmetry.mirror.plane": "Espelhar uma vez",
|
||||
"create.symmetry.mirror.doublePlane": "Retangular",
|
||||
"create.symmetry.mirror.triplePlane": "Octagonal",
|
||||
"create.orientation.orthogonal": "Ortogonal",
|
||||
"create.orientation.diagonal": "Diagonal",
|
||||
"create.orientation.horizontal": "Horizontal",
|
||||
"create.orientation.alongZ": "Através de Z",
|
||||
"create.orientation.alongX": "Através de X",
|
||||
|
||||
"create.gui.blockzapper.title": "Blockzapper Portátil",
|
||||
"create.gui.blockzapper.replaceMode": "Modo de Substituição",
|
||||
"create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais",
|
||||
"create.gui.blockzapper.searchFuzzy": "Ignorar Material nas Bordas",
|
||||
"create.gui.blockzapper.range": "Raio de Expansão",
|
||||
"create.gui.blockzapper.patternSection": "Padrões",
|
||||
"create.gui.blockzapper.pattern.solid": "Sólido",
|
||||
"create.gui.blockzapper.pattern.checkered": "Xadrez",
|
||||
"create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido",
|
||||
"create.gui.blockzapper.pattern.chance25": "25% de chance",
|
||||
"create.gui.blockzapper.pattern.chance50": "50% de chance",
|
||||
"create.gui.blockzapper.pattern.chance75": "75% de chance",
|
||||
|
||||
"create.blockzapper.usingBlock": "Usando: %1$s",
|
||||
"create.blockzapper.componentUpgrades": "Melhorias do Componente:",
|
||||
"create.blockzapper.component.body": "Corpo",
|
||||
"create.blockzapper.component.amplifier": "Amplificador",
|
||||
"create.blockzapper.component.accelerator": "Acelerador",
|
||||
"create.blockzapper.component.retriever": "Retornador",
|
||||
"create.blockzapper.component.scope": "Mira",
|
||||
"create.blockzapper.componentTier.none": "Nada",
|
||||
"create.blockzapper.componentTier.blazebrass": "Latão de Blaze",
|
||||
"create.blockzapper.componentTier.choruschrome": "Coro Cromado",
|
||||
"create.blockzapper.leftClickToSet": "Botão-Esquerdo em um Bloco para selecionar Material",
|
||||
"create.blockzapper.empty": "Sem Blocos!",
|
||||
|
||||
"create.logistics.filter": "Filtros",
|
||||
"create.logistics.firstFrequência": "Freq. #1",
|
||||
"create.logistics.secondFrequência": "Freq. #2",
|
||||
|
||||
"create.gui.flexcrate.title": "FlexCrate",
|
||||
"create.gui.flexcrate.storageSpace": "Espaço de Armazenamento",
|
||||
|
||||
"create.gui.stockswitch.title": "Disjuntor de Armazenamento",
|
||||
"create.gui.stockswitch.lowerLimit": "Limite Mínimo",
|
||||
"create.gui.stockswitch.upperLimit": "Limite Máximo",
|
||||
"create.gui.stockswitch.startAt": "Iniciar Sinal em",
|
||||
"create.gui.stockswitch.startAbove": "Iniciar Sinal acima de",
|
||||
"create.gui.stockswitch.stopAt": "Parar Sinal em",
|
||||
"create.gui.stockswitch.stopBelow": "Parar Sinal abaixo de",
|
||||
|
||||
"create.schematicAndQuill.dimensions": "Tamanho Esquema: %1$sx%2$sx%3$s",
|
||||
"create.schematicAndQuill.firstPos": "Primeira posição feita.",
|
||||
"create.schematicAndQuill.secondPos": "Segunda posição feita.",
|
||||
"create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.",
|
||||
"create.schematicAndQuill.abort": "Seleção removida.",
|
||||
"create.schematicAndQuill.prompt": "Informe um nome para o Esquema:",
|
||||
"create.schematicAndQuill.fallbackName": "Meu Esquema",
|
||||
"create.schematicAndQuill.saved": "Salvo como %1$s",
|
||||
|
||||
"create.schematic.invalid": "[!] Item Inválido - Use a Mesa de Desenho no lugar",
|
||||
"create.schematic.position": "Posição",
|
||||
"create.schematic.rotation": "Rotação",
|
||||
"create.schematic.rotation.none": "Nada",
|
||||
"create.schematic.rotation.cw90": "Sentido horário 90",
|
||||
"create.schematic.rotation.cw180": "Sentido horário 180",
|
||||
"create.schematic.rotation.cw270": "Sentido horário 270",
|
||||
"create.schematic.mirror": "Espelhar",
|
||||
"create.schematic.mirror.none": "Nada",
|
||||
"create.schematic.mirror.frontBack": "Frente para Trás",
|
||||
"create.schematic.mirror.leftRight": "Esquerda para Direita",
|
||||
|
||||
"create.schematic.tool.deploy": "Concluir",
|
||||
"create.schematic.tool.move": "Mover XZ",
|
||||
"create.schematic.tool.movey": "Mover Y",
|
||||
"create.schematic.tool.rotate": "Rodar",
|
||||
"create.schematic.tool.print": "Imprimir",
|
||||
"create.schematic.tool.flip": "Virar",
|
||||
|
||||
"create.schematic.tool.deploy.description.0": "Move o lugar da estrutura.",
|
||||
"create.schematic.tool.deploy.description.1": "Botão-direito no chão para colocar.",
|
||||
"create.schematic.tool.deploy.description.2": "Segure [Ctrl] para selecionar em uma distância fixa.",
|
||||
"create.schematic.tool.deploy.description.3": "[Ctrl]-Rolar para mudar a distância.",
|
||||
"create.schematic.tool.move.description.0": "Vira o Esquema Horizontalmente",
|
||||
"create.schematic.tool.move.description.1": "Aponte ao Esquema e [CTRL]-Rolar para empurrar.",
|
||||
"create.schematic.tool.move.description.2": "",
|
||||
"create.schematic.tool.move.description.3": "",
|
||||
"create.schematic.tool.movey.description.0": "Vira o Esquema Verticalmente",
|
||||
"create.schematic.tool.movey.description.1": "[CTRL]-Rolar para mover para cima/baixo",
|
||||
"create.schematic.tool.movey.description.2": "",
|
||||
"create.schematic.tool.movey.description.3": "",
|
||||
"create.schematic.tool.rotate.description.0": "Roda o Esquema em torno do seu centro.",
|
||||
"create.schematic.tool.rotate.description.1": "[CTRL]-Rolar para rolar 90 Graus",
|
||||
"create.schematic.tool.rotate.description.2": "",
|
||||
"create.schematic.tool.rotate.description.3": "",
|
||||
"create.schematic.tool.print.description.0": "Coloca estrutura no mundo instantaneamente",
|
||||
"create.schematic.tool.print.description.1": "[Botão-Direito] para confirmar a posição atual.",
|
||||
"create.schematic.tool.print.description.2": "Esta ferramenta é para o Modo Criativo apenas.",
|
||||
"create.schematic.tool.print.description.3": "",
|
||||
"create.schematic.tool.flip.description.0": "Gira o Esquema ao longo da face que você selecionar.",
|
||||
"create.schematic.tool.flip.description.1": "Aponte para o Esquema e [CTRL]-Rolar para virá-lo.",
|
||||
"create.schematic.tool.flip.description.2": "",
|
||||
"create.schematic.tool.flip.description.3": "",
|
||||
|
||||
"create.schematics.synchronizing": "Sincronizando...",
|
||||
"create.schematics.uploadTooLarge": "Seu esquema é muito grande",
|
||||
"create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:",
|
||||
|
||||
"create.gui.schematicTable.title": "Mesa de Desenho",
|
||||
"create.gui.schematicTable.availableEsquemas": "Esquemas Disponíveis",
|
||||
"create.gui.schematicTable.noEsquemas": "Nenhum Esquemas salvo",
|
||||
"create.gui.schematicTable.uploading": "Importando...",
|
||||
"create.gui.schematicTable.finished": "Envio Concluído!",
|
||||
|
||||
"create.gui.schematicannon.title": "Esquemaannon",
|
||||
"create.gui.schematicannon.settingsTitle": "Parâmetros de Posicionamento",
|
||||
"create.gui.schematicannon.listPrinter": "Impressora de Lista de Materiais",
|
||||
"create.gui.schematicannon.gunpowderLevel": "Pólvora em %1$s%%",
|
||||
"create.gui.schematicannon.shotsRemaining": "Disparos faltantes: %1$s",
|
||||
"create.gui.schematicannon.shotsRemainingWithBackup": "Com backup: %1$s",
|
||||
"create.gui.schematicannon.optionEnabled": "Habilitado Atualmente",
|
||||
"create.gui.schematicannon.optionDisabled": "Desabilitado Atualmente",
|
||||
"create.gui.schematicannon.option.dontReplaceSolid": "Não Substituir Blocos Sólidos",
|
||||
"create.gui.schematicannon.option.replaceWithSolid": "Substituir Blocos Sólidos",
|
||||
"create.gui.schematicannon.option.replaceWithAny": "Substituir Sólidos com Qualquer",
|
||||
"create.gui.schematicannon.option.replaceWithEmpty": "Substituir Sólidos com Vazio",
|
||||
"create.gui.schematicannon.option.skipMissing": "Pulando Blocos faltantes",
|
||||
"create.gui.schematicannon.option.skipTileEntities": "Proteger Entidades Entalhadas",
|
||||
|
||||
"create.gui.schematicannon.option.skipMissing.description": "Se o Esquemaannon não encontrar o Bloco para colocar, ele irá continuar para a próx. Posição.",
|
||||
"create.gui.schematicannon.option.skipTileEntities.description": "O Esquemaannon vai evitar substituir blocos que contêm dados como Baus.",
|
||||
"create.gui.schematicannon.option.dontReplaceSolid.description": "O canhão irá nunca substituir Blocos sólidos na área em trabalho, apenas não-Sólidos e Ar.",
|
||||
"create.gui.schematicannon.option.replaceWithSolid.description": "O canhão irá apenas substituir Blocos sólidos na área de trabalho, se o Esquema conter um bloco Sólido naquela posição.",
|
||||
"create.gui.schematicannon.option.replaceWithAny.description": "O canhão irá substituir Blocos sólidos na área de trabalho, se o Esquema conter qualquer Bloco naquela posição.",
|
||||
"create.gui.schematicannon.option.replaceWithEmpty.description": "O canhão irá limpar todos os blocos na área de trabalho, incluindo os substituídos por Ar.",
|
||||
|
||||
"create.schematicannon.status.idle": "Ocioso",
|
||||
"create.schematicannon.status.ready": "Pronto",
|
||||
"create.schematicannon.status.running": "Trabalhando",
|
||||
"create.schematicannon.status.finished": "Concluído",
|
||||
"create.schematicannon.status.paused": "Pausado",
|
||||
"create.schematicannon.status.stopped": "Parada",
|
||||
"create.schematicannon.status.noPólvora": "Sem Pólvora",
|
||||
"create.schematicannon.status.targetNotLoaded": "Bloco não carregado",
|
||||
"create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe",
|
||||
"create.schematicannon.status.searching": "Procurando",
|
||||
"create.schematicannon.status.skipping": "Pulando",
|
||||
"create.schematicannon.status.missingBlock": "Bloco Faltante:",
|
||||
"create.schematicannon.status.placing": "Colocando",
|
||||
"create.schematicannon.status.clearing": "Limpando Blocos",
|
||||
"create.schematicannon.status.schematicInvalid": "Esquema Inválido",
|
||||
"create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado",
|
||||
"create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado",
|
||||
|
||||
"create.tooltip.holdKey": "Segure [%1$s]",
|
||||
"create.tooltip.holdKeyOrKey": "Segure [%1$s] or [%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": "Quando this",
|
||||
"item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)",
|
||||
"item.create.example_item.tooltip.condition2": "And Quando this",
|
||||
"item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like",
|
||||
"item.create.example_item.tooltip.control1": "Quando Ctrl pressed",
|
||||
"item.create.example_item.tooltip.action1": "These controls are displayed.",
|
||||
|
||||
"item.create.symmetry_wand.tooltip": "VARINHA DE SIMETRIA",
|
||||
"item.create.symmetry_wand.tooltip.summary": "Espelhar perfeitamente a colocação de blocos nos planos configurados.",
|
||||
"item.create.symmetry_wand.tooltip.condition1": "Quando na Hotbar",
|
||||
"item.create.symmetry_wand.tooltip.behaviour1": "Mantem-se Ativo",
|
||||
"item.create.symmetry_wand.tooltip.control1": "B-Direito no Chão",
|
||||
"item.create.symmetry_wand.tooltip.action1": "_Cria_ ou _Move_ o Espelho",
|
||||
"item.create.symmetry_wand.tooltip.control2": "B-Direito no Ar",
|
||||
"item.create.symmetry_wand.tooltip.action2": "_Remove_ o Espelho ativo",
|
||||
"item.create.symmetry_wand.tooltip.control3": "B-Direito enquanto Abaixado",
|
||||
"item.create.symmetry_wand.tooltip.action3": "Abre _Interface_ de _Configuração_",
|
||||
|
||||
"item.create.placement_handgun.tooltip": "BLOCKZAPPER",
|
||||
"item.create.placement_handgun.tooltip.summary": "Gadget imaginário para colocar ou substituir blocos a distância.",
|
||||
"item.create.placement_handgun.tooltip.control1": "B-Esquerdo no Bloco",
|
||||
"item.create.placement_handgun.tooltip.action1": "Define os blocos colocados pela ferramenta no bloco de destino.",
|
||||
"item.create.placement_handgun.tooltip.control2": "B-Direito em Bloco",
|
||||
"item.create.placement_handgun.tooltip.action2": "_Coloca_ ou _Substitui_ o bloco alvo.",
|
||||
"item.create.placement_handgun.tooltip.control3": "B-Direito equando Abaixado",
|
||||
"item.create.placement_handgun.tooltip.action3": "Abre _Interface_ de _Configuração_",
|
||||
|
||||
"item.create.tree_fertilizer.tooltip": "FERTILIZANTE DE ARVORE",
|
||||
"item.create.tree_fertilizer.tooltip.summary": "Uma combinação poderosa de minerais para tipos comuns de arvores",
|
||||
"item.create.tree_fertilizer.tooltip.condition1": "Quando usada em Mudas",
|
||||
"item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço",
|
||||
|
||||
"block.create.cocoa_log.tooltip": "MADEIRA DE COCOA",
|
||||
"block.create.cocoa_log.tooltip.summary": "Um tronco de selva melhorado para facilitar automação de _Sementes_ _de_ _Cacau_",
|
||||
"block.create.cocoa_log.tooltip.condition1": "Quando madura",
|
||||
"block.create.cocoa_log.tooltip.behaviour1": "Cresce _Vagens_ _de_ _Cacau_ em todos os lados",
|
||||
|
||||
"item.create.empty_blueprint.tooltip": "ESQUEMA VAZIO",
|
||||
"item.create.empty_blueprint.tooltip.summary": "Usado como ingrediente em receitas e para escrever na _Mesa_ _de_ _Esquematizar_",
|
||||
|
||||
"item.create.blueprint.tooltip": "ESQUEMA",
|
||||
"item.create.blueprint.tooltip.summary": "Contem uma estrutura para ser posicionada e colocada no mundo. Posicione o Holograma como desejar e use um _Esquemaannon_ para construí-lo.",
|
||||
"item.create.blueprint.tooltip.condition1": "Quando Em mãos",
|
||||
"item.create.blueprint.tooltip.behaviour1": "Pode ser posicionado usando as Ferramentas em Tela",
|
||||
"item.create.blueprint.tooltip.control1": "B-Direito enquanto Abaixado",
|
||||
"item.create.blueprint.tooltip.action1": "Abre uma _Interface_ para informar as _Coordenadas_ exatas.",
|
||||
|
||||
"item.create.blueprint_and_quill.tooltip": "ESQUEMA E PENA",
|
||||
"item.create.blueprint_and_quill.tooltip.summary": "Usado para salvar uma Estrutura no mundo para um arquivo .nbt.",
|
||||
"item.create.blueprint_and_quill.tooltip.condition1": "Passo 1",
|
||||
"item.create.blueprint_and_quill.tooltip.behaviour1": "Selecione duas coordenadas de extremidade usando B-Direito",
|
||||
"item.create.blueprint_and_quill.tooltip.condition2": "Passo 2",
|
||||
"item.create.blueprint_and_quill.tooltip.behaviour2": "_Ctrl-Rolar_ nas faces para ajustar o tamanho. B-Direito de novo para Salvar.",
|
||||
"item.create.blueprint_and_quill.tooltip.control1": "B-Direito",
|
||||
"item.create.blueprint_and_quill.tooltip.action1": "Selecione um canto / confirmar salvamento",
|
||||
"item.create.blueprint_and_quill.tooltip.control2": "Ctrl Pressionado",
|
||||
"item.create.blueprint_and_quill.tooltip.action2": "Selecione pontos no _meio_ _do_ _ar_. _Rolar_ para ajustar a distância.",
|
||||
"item.create.blueprint_and_quill.tooltip.control3": "B-Direito enquanto Abaixado",
|
||||
"item.create.blueprint_and_quill.tooltip.action3": "_Cancela_ e remove a seleção.",
|
||||
|
||||
"block.create.creative_crate.tooltip": "CRIATIVADOR ESQUEMAANNON",
|
||||
"block.create.creative_crate.tooltip.summary": "Provê um suprimento infinito de blocos para _Esquemaannons_ próximos",
|
||||
|
||||
"block.create.schematicannon.tooltip": "ESQUEMAANNON",
|
||||
"block.create.schematicannon.tooltip.summary": "Dispara blocos para recriar um _Esquema_ no Mundo. Usa itens de Inventários adjacentes e _Pólvora_ como combustível.",
|
||||
"block.create.schematicannon.tooltip.control1": "Quando Apertado com B-Direito",
|
||||
"block.create.schematicannon.tooltip.action1": "Abre a _Interface_",
|
||||
|
||||
"block.create.schematic_table.tooltip": "MESA DE ESQUEMATIZAR",
|
||||
"block.create.schematic_table.tooltip.summary": "Escreve Esquemas salvos into um _Esquema_ _Vazio_",
|
||||
"block.create.schematic_table.tooltip.condition1": "Quando recebe um Esquema Vazio",
|
||||
"block.create.schematic_table.tooltip.behaviour1": "Importa um Arquivo escolhido da sua Pasta de Esquemas",
|
||||
|
||||
"block.create.shaft.tooltip": "EIXO",
|
||||
"block.create.shaft.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta.",
|
||||
|
||||
"block.create.cogwheel.tooltip": "RODA DENTADA",
|
||||
"block.create.cogwheel.tooltip.summary": "_Transmite_ _Rotação_ em uma linha reta, e para _Rodas_ _Dentadas_ adjacentes.",
|
||||
|
||||
"block.create.large_cogwheel.tooltip": "RODA DENTADA GRADE",
|
||||
"block.create.large_cogwheel.tooltip.summary": "Uma versão maior da _Roda_ _Dentada,_ permitindo mudança na _Velocidade_ de _Rotação_ quando conectada a sua Contraparte.",
|
||||
|
||||
"block.create.encased_shaft.tooltip": "EIXO REVESTIDO",
|
||||
"block.create.encased_shaft.tooltip.summary": " _Transmite_ _Rotação_ em uma linha reta. Apropriada para propagar Rotação através de Muros.",
|
||||
|
||||
"block.create.gearbox.tooltip": "CAIXA DE TRANSMISSÃO",
|
||||
"block.create.gearbox.tooltip.summary": "_Transmite_ _Rotação_ em _Quatro_ _direções._ Reverte conexões diretas.",
|
||||
|
||||
"block.create.gearshift.tooltip": "CÂMBIO",
|
||||
"block.create.gearshift.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para eixos conectados.",
|
||||
"block.create.gearshift.tooltip.condition1": "Quando Ligado",
|
||||
"block.create.gearshift.tooltip.behaviour1": "_Inverte_ a rotação de saída.",
|
||||
|
||||
"block.create.clutch.tooltip": "EMBREAGEM",
|
||||
"block.create.clutch.tooltip.summary": "Um _disjuntor_ de _rotação_ controlável para os eixos conectados.",
|
||||
"block.create.clutch.tooltip.condition1": "Quando Ligado",
|
||||
"block.create.clutch.tooltip.behaviour1": "_Para_ de prover rotação para o outro lado.",
|
||||
|
||||
"block.create.encased_belt.tooltip": "ESTEIRA REVESTIDA",
|
||||
"block.create.encased_belt.tooltip.summary": "_Transmite_ _Rotação_ através de si e para _Esteiras_ _Revestidas_ conectadas.",
|
||||
"block.create.encased_belt.tooltip.condition1": "Quando Conectadas com outra Esteira Revestida",
|
||||
"block.create.encased_belt.tooltip.behaviour1": "Bloco Conectado irá ter a mesma velocidade de rotação, na mesma direção. Esteiras Conectadas não precisam estar viradas para mesma direção.",
|
||||
|
||||
"item.create.belt_connector.tooltip": "ESTEIRA MECÂNICA",
|
||||
"item.create.belt_connector.tooltip.summary": "Conecta dois _Eixos_ com uma _Esteira_ _Mecânica._ Eixos conectados irá ter exatamente a mesma velocidade e direção de rotação. A Esteira pode atuar como um _Transporte_ para _Entidades._",
|
||||
"item.create.belt_connector.tooltip.control1": "B-Direito em um Eixo",
|
||||
"item.create.belt_connector.tooltip.action1": "Seleciona o eixo como uma polia da Esteira. Os dois Eixos selecionadas precisam estar _alinhados_ seja na _Vertical,_ _Horizontal_ ou _Diagonal_ na direção da Esteira.",
|
||||
"item.create.belt_connector.tooltip.control2": "B-Direito enquanto Abaixado",
|
||||
"item.create.belt_connector.tooltip.action2": "_Cancela_ a seleção da Posição para a Esteira",
|
||||
|
||||
"block.create.belt_support.tooltip": "SUPORTE DA ESTEIRA",
|
||||
"block.create.belt_support.tooltip.summary": "Apenas um bloco decorativo para montar _Esteiras_ _Mecânicas_ no Chão.",
|
||||
"block.create.belt_support.tooltip.condition1": "Quando colocado abaixo de uma Esteira",
|
||||
"block.create.belt_support.tooltip.behaviour1": "Suporta o topo da Esteira, escondendo a parte de baixo.",
|
||||
|
||||
"block.create.motor.tooltip": "MOTOR",
|
||||
"block.create.motor.tooltip.summary": "Uma fonte de _Força_ _Rotacional_ configurável",
|
||||
|
||||
"block.create.water_wheel.tooltip": "RODA DE ÁGUA",
|
||||
"block.create.water_wheel.tooltip.summary": "Prove _Força_ _Rotacional_ tirada de _Correntes_ de _Água_ próximas.",
|
||||
|
||||
"block.create.encased_fan.tooltip": "VENTILADO REVESTIDO",
|
||||
"block.create.encased_fan.tooltip.summary": "Converte _Força_ _Rotacional_ em _Correntes_ de _Ar_ e vice-versa. Muitos usos.",
|
||||
"block.create.encased_fan.tooltip.condition1": "Quando sobre Fogo",
|
||||
"block.create.encased_fan.tooltip.behaviour1": "Prove _Força_ _Rotacional_ (precisa ser na vertical)",
|
||||
"block.create.encased_fan.tooltip.condition2": "Quando Invertido",
|
||||
"block.create.encased_fan.tooltip.behaviour2": "_Empurra_ Entidades em um lado, _Puxa_ entidades no outro. Força e Velocidade dependem da Rotação de entrada.",
|
||||
"block.create.encased_fan.tooltip.condition3": "Quando ar flui através de blocos especiais",
|
||||
"block.create.encased_fan.tooltip.behaviour3": "Processa itens na frente do Bloco: _Água_ alva, _Fogo_ defuma, e _Lava_ derrete o ingrediente.",
|
||||
|
||||
"block.create.turntable.tooltip": "MESA GIRATÓRIA",
|
||||
"block.create.turntable.tooltip.summary": "Muda a _Força_ _Rotacional_ em uma forma refinada de Enjoo.",
|
||||
|
||||
"block.create.crushing_wheel.tooltip": "RODA DE MOER",
|
||||
"block.create.crushing_wheel.tooltip.summary": "Grandes rodas giratórias que _esmagam_ qualquer coisa que impeça seu movimento.",
|
||||
"block.create.crushing_wheel.tooltip.condition1": "Quando conectado a outras Rodas de Moer",
|
||||
"block.create.crushing_wheel.tooltip.behaviour1": "Forma uma estrutura de esmagamento para processar uma variedade de coisas. Os Dentes da rota precisam estar conectados e se movimentando com a _mesma_ _velocidade_ em _direções_ _opostas._",
|
||||
|
||||
"block.create.mechanical_press.tooltip": "PRENSA MECÂNICA",
|
||||
"block.create.mechanical_press.tooltip.summary": "Um forte pistão usado para comprimir itens abaixo dele. Precisa de _Força_ _Rotacional_ constante",
|
||||
"block.create.mechanical_press.tooltip.condition1": "Quando Ligado com Redstone",
|
||||
"block.create.mechanical_press.tooltip.behaviour1": "_Inicia_ compressão de itens jogados abaixo dele.",
|
||||
"block.create.mechanical_press.tooltip.condition2": "Quando Sobre uma Esteira Mecânica",
|
||||
"block.create.mechanical_press.tooltip.behaviour2": "_Automaticamente_ comprime itens que passando na Esteira.",
|
||||
|
||||
"block.create.mechanical_piston.tooltip": "PISTÃO MECÂNICO",
|
||||
"block.create.mechanical_piston.tooltip.summary": "Uma verão melhorada do _Pistão,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. _Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.",
|
||||
"block.create.mechanical_piston.tooltip.condition1": "Quando Rodado",
|
||||
"block.create.mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.",
|
||||
|
||||
"block.create.sticky_mechanical_piston.tooltip": "PISTÃO MECÂNICO GRUDENTO",
|
||||
"block.create.sticky_mechanical_piston.tooltip.summary": "Uma versão melhorada do _Pistão_ _Grudento,_ usando _Força_ _Rotacional_ para mover estruturas de forma precisa. Varas_ de _Extensão_ do _Pistão_ na traseira definem o _Alcance_ deste Dispositivo. Sem extensões o pistão não se move. Use __Chassis_ de _Translado_ para mover mais de uma linha de blocos.",
|
||||
"block.create.sticky_mechanical_piston.tooltip.condition1": "Quando Rodado",
|
||||
"block.create.sticky_mechanical_piston.tooltip.behaviour1": "Começa a mover blocos presos na estrutura. Velocidade e direção diretamente relacionados a Velocidade Rotação de entrada.",
|
||||
|
||||
"block.create.piston_pole.tooltip": "VARA DE EXTENSÃO DO PISTÃO",
|
||||
"block.create.piston_pole.tooltip.summary": "Aumenta o alcance de _Pistões_ _Mecânicos_",
|
||||
"block.create.piston_pole.tooltip.condition1": "Quando preso a um Pistão Mecânico",
|
||||
"block.create.piston_pole.tooltip.behaviour1": "Aumenta a extensão dos pistões em 1 bloco",
|
||||
|
||||
"block.create.mechanical_bearing.tooltip": "ROLAMENTO MECÂNICO",
|
||||
"block.create.mechanical_bearing.tooltip.summary": "Usado para rotacionar _estruturas_ _grandes_ ou geração de _Força_ _Rotacional_ do vento.",
|
||||
"block.create.mechanical_bearing.tooltip.condition1": "Quando Rodado",
|
||||
"block.create.mechanical_bearing.tooltip.behaviour1": "Começa a rotacionar _Chassis_ de _Rotação_ conectados e blocos conectados a eles.",
|
||||
"block.create.mechanical_bearing.tooltip.condition2": "Quando Ligado por Redstone",
|
||||
"block.create.mechanical_bearing.tooltip.behaviour2": "Começa a passar _Força_ _Rotacional_ das estruturas conectadas. A estrutura dele incluir _Blocos_ de _Vela_ válidos (atualmente qualquer Bloco de Lã).",
|
||||
|
||||
"block.create.translation_chassis.tooltip": "CHASSIS DE TRANSLADO",
|
||||
"block.create.translation_chassis.tooltip.summary": "Uma base configurável para Estruturas serem movidas por um _Pistão_ _Mecânico._ Esses Blocos precisam formas uma camada de blocos na frente do Pistão.",
|
||||
"block.create.translation_chassis.tooltip.condition1": "Quando movido por Pistão Mecânico",
|
||||
"block.create.translation_chassis.tooltip.behaviour1": "_Move_ todos os _Chassis_ _conectados_ na mesma orientação, e Blocos conectados a frente dele. Quando o Pistão volta, blocos apenas serão puxados se a face do chassis for _Grudenta_ (Ver [Ctrl]).",
|
||||
"block.create.translation_chassis.tooltip.control1": "Quando clicado com B-Direito com Gosma de Slime",
|
||||
"block.create.translation_chassis.tooltip.action1": "Torna a face clicada _Grudenta._ Quando o pistão volta, o chassis irá _puxar_ _junto_ todos os Blocos conectados na sua coluna e no Alcance configurado.",
|
||||
|
||||
"block.create.rotation_chassis.tooltip": "CHASSIS DE ROTAÇÃO",
|
||||
"block.create.rotation_chassis.tooltip.summary": "Nessário para rotacionar estruturas om um _Rolamento_ _Mecânico._ ",
|
||||
"block.create.rotation_chassis.tooltip.condition1": "Quando Rotacionado por Rolamento",
|
||||
"block.create.rotation_chassis.tooltip.behaviour1": "_Rotaciona_ todos os blocos conectados a lados _Grudentos_ (Veja [Ctrl]) dentro do alcance configurado no seu entorno. _Propaga_ a rotação para outros Chassis de Rotação conectados.",
|
||||
"block.create.rotation_chassis.tooltip.control1": "Quando clicado com B-Direito com Goma de Slime",
|
||||
"block.create.rotation_chassis.tooltip.action1": "Torna face clicada em _Grudenta._ Quando o Chassis girar, todos os blocos conectados nesse lado irão girar junto.",
|
||||
|
||||
"block.create.drill.tooltip": "FURADEIRA MECÂNICA",
|
||||
"block.create.drill.tooltip.summary": "Um dispositivo mecânido feito para _quebrar_ _blocos._",
|
||||
"block.create.drill.tooltip.condition1": "Quando Rodado",
|
||||
"block.create.drill.tooltip.behaviour1": "Atua como um Bloco Quebrador _estacionário._ Também _machuca_ _entidades_ na sua área de efeito.",
|
||||
"block.create.drill.tooltip.condition2": "Quando Empurrado por Pistão Mecânico",
|
||||
"block.create.drill.tooltip.behaviour2": "Quebra os Blocos na direção do avanço da broca.",
|
||||
|
||||
"block.create.harvester.tooltip": "COLETOR MECÂNICO",
|
||||
"block.create.harvester.tooltip.summary": "Um cortador de plantas mecânico indicado para automação de culturas de médio porte",
|
||||
"block.create.harvester.tooltip.condition1": "Quando Empurrado por Pistão Mecânico",
|
||||
"block.create.harvester.tooltip.behaviour1": "_Colhe_ todas as _safra_ _madura_ que a lâmina passar sobre, e os retorna a estado de crescimento inicial.",
|
||||
|
||||
"block.create.stockswitch.tooltip": "DISJUNTOR DE ARMAZENAMENTO",
|
||||
"block.create.stockswitch.tooltip.summary": "Alterna um sinal de Redstone com base no _Espaço_ de _Armazenamento_ do Reciente conectado.",
|
||||
"block.create.stockswitch.tooltip.condition1": "Quando abaixo do Limite Mínimo",
|
||||
"block.create.stockswitch.tooltip.behaviour1": "Para de enviar _Sinal_ de _Redstone_",
|
||||
"block.create.stockswitch.tooltip.condition2": "Quando acima do Limite Máximo",
|
||||
"block.create.stockswitch.tooltip.behaviour2": "Começa a enviar _Sinal_ de _Redstone_ até chegar no Limite Mínio novamente.",
|
||||
"block.create.stockswitch.tooltip.control1": "Quando clicado com B-Direito",
|
||||
"block.create.stockswitch.tooltip.action1": "Abre a _Interface_ de _Configuração_",
|
||||
|
||||
"block.create.redstone_bridge.tooltip": "CONEXÃO DE REDSTONE",
|
||||
"block.create.redstone_bridge.tooltip.summary": "Saida para conexões _Redstone_ _Sem-Fio._ Pode ter _Frequências_ usando qualquer item. Distancia do Sinal é limitada, mas resoavelmente justa.",
|
||||
"block.create.redstone_bridge.tooltip.condition1": "Quando Ligado",
|
||||
"block.create.redstone_bridge.tooltip.behaviour1": "Recebendo Conexões da mesma _Frequência_ irá gerar um sinal de Redstone.",
|
||||
"block.create.redstone_bridge.tooltip.control1": "Quando clicado com B-Direito com um Item",
|
||||
"block.create.redstone_bridge.tooltip.action1": "Altera a _Frequência_ para aquele item. Até _dois_ _itens_ _diferentes_ podem ser combinados para definir uma Frequência.",
|
||||
"block.create.redstone_bridge.tooltip.control2": "Quando clicado com B-Direito enquanto Abaixado",
|
||||
"block.create.redstone_bridge.tooltip.action2": "Muda entre Modo _Receptor_ e _Transmissor_ .",
|
||||
|
||||
"block.create.contact.tooltip": "CONTATO DE REDSTONE",
|
||||
"block.create.contact.tooltip.summary": "Um dispositivo simples para Mecanimos de Redstone avançados.",
|
||||
"block.create.contact.tooltip.condition1": "Quando apontando para outro Contato",
|
||||
"block.create.contact.tooltip.behaviour1": "Provê um _Sinal_ de _Redstone_",
|
||||
"block.create.contact.tooltip.condition2": "Quando movido por Pistão Mecânico",
|
||||
"block.create.contact.tooltip.behaviour2": "Ativa todos os Contatos imóveis na passagem",
|
||||
|
||||
"block.create.flexcrate.tooltip": "FLEXCRATE",
|
||||
"block.create.flexcrate.tooltip.summary": "Este _Recipiente_ de _Armazenamento_ permite controle Manual da sua capacidade. Pode conter até _16_ _Pilhas_ de qualquer Item",
|
||||
"block.create.flexcrate.tooltip.control1": "Quando clicado com B-Direito",
|
||||
"block.create.flexcrate.tooltip.action1": "Abre a _Interface_",
|
||||
|
||||
"block.create.extractor.tooltip": "EXTRATOR",
|
||||
"block.create.extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ conectado e os joga no chão. Não irá jogar Itens até o espaço ser limpo. Pode ser configurado como para ser um _filtro._",
|
||||
"block.create.extractor.tooltip.condition1": "Quando Ligado por Redstone",
|
||||
"block.create.extractor.tooltip.behaviour1": "_Para_ o Extractor",
|
||||
"block.create.extractor.tooltip.control1": "B-Direito no Espaço de Filtro",
|
||||
"block.create.extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.",
|
||||
|
||||
"block.create.linked_extractor.tooltip": "EXTRATOR CONECTADO",
|
||||
"block.create.linked_extractor.tooltip.summary": "_Pega_ _itens_ de um _Inventário_ e os joga no chão. Não vai jogar Itens até que o espaço ser limpo. Pode ser configurado como para ser um _filtro._ Pode ser controlado remotamente via _Conexão_ de _Redstone._",
|
||||
"block.create.linked_extractor.tooltip.condition1": "Quando Conexão de Redstone Ativa",
|
||||
"block.create.linked_extractor.tooltip.behaviour1": "_Para_ o Extrator",
|
||||
"block.create.linked_extractor.tooltip.control1": "B-Direito no Espaço de Filtro",
|
||||
"block.create.linked_extractor.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Extrator irá apenas puxar apenas _tipo_ e _quantidade_ do item filtro.",
|
||||
"block.create.linked_extractor.tooltip.control2": "B-Direito no Espaço de Frequência",
|
||||
"block.create.linked_extractor.tooltip.action2": "Configura a _pilha_ atualmente _presente_ como parte da Frequência a ouvir. Quando um _Conexão_ de _Redstone_ transmissor da mesma frequência é ligado, esse Extrator irá parar.",
|
||||
|
||||
"block.create.belt_funnel.tooltip": "FUNIL DE ESTEIRA",
|
||||
"block.create.belt_funnel.tooltip.summary": "Coleta itens passando numa _Esteira_ _Mecânica_ e os insere no _Inventário_ conetado, se possível. Precisa estar diretamente _sobre_ uma Esteira, com a abertura virada contra o movimento da Esteira. O inventário precisa estar na mesma altura que o funil.",
|
||||
|
||||
"block.create.entity_detector.tooltip": "OBSERVADOR DE ESTEIRA",
|
||||
"block.create.entity_detector.tooltip.summary": "Detecta os itens passando numa _Esteira_ _Mecânica_ a sua frente. Funciona bem com um _Pistão_ em cima, empurrando certos itens.",
|
||||
"block.create.entity_detector.tooltip.condition1": "Quando item bate com Filtro",
|
||||
"block.create.entity_detector.tooltip.behaviour1": "Provê um _Pulso_ curto de _Redstone_ para todos os lados. Um Filtro vazio considera todos os itens passando.",
|
||||
"block.create.entity_detector.tooltip.control1": "B-Direito em um Espaço de Filtro",
|
||||
"block.create.entity_detector.tooltip.action1": "Configura a _pilha_ atualmente _presente_ como um _Filtro._ Observador irá reagir apenas a esse tipo de item.",
|
||||
|
||||
"block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSO",
|
||||
"block.create.pulse_repeater.tooltip.summary": "Um circuito simples para cortar pulsos de Redstone até um comprimento de _1_ _tick._",
|
||||
|
||||
"block.create.flexpeater.tooltip": "REPETIDOR FLEX",
|
||||
"block.create.flexpeater.tooltip.summary": "Um um _Repetidor_ de _Redstone_ avançado com um _Delay_ _configurável_ de até 30 Minutos.",
|
||||
|
||||
"itemGroup.create": "Create"
|
||||
}
|
608
src/main/resources/assets/create/lang/ru_ru.json
Normal file
608
src/main/resources/assets/create/lang/ru_ru.json
Normal file
|
@ -0,0 +1,608 @@
|
|||
{
|
||||
|
||||
"_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": "Механическая лента",
|
||||
"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.tiled_glass": "Плиточное стекло",
|
||||
"block.create.tiled_glass_pane": "Плиточная стеклянная панель",
|
||||
|
||||
"block.create.window_in_a_block": "Block with Glass Pane",
|
||||
"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.limesand": "Известь",
|
||||
"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": "Стол для схем",
|
||||
"block.create.creative_crate": "Креативный снабжатель схемопушки",
|
||||
|
||||
"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": "тик",
|
||||
"create.generic.unit.seconds": "сек",
|
||||
"create.generic.unit.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": "Зажмите Shift, чтобы прокручивать быстрее",
|
||||
|
||||
"create.gui.toolmenu.focusKey": "Зажмите [%1$s], чтобы сфокусироваться",
|
||||
"create.gui.toolmenu.cycle": "[КолМыши] , чтобы выбрать",
|
||||
|
||||
"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": "По Z оси",
|
||||
"create.orientation.alongX": "По 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": "Включить выше",
|
||||
"create.gui.stockswitch.stopAt": "Отключить на",
|
||||
"create.gui.stockswitch.stopBelow": "Отключить ниже",
|
||||
|
||||
"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": "C запасом: %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": "Кончился порох",
|
||||
"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": "Открывает _Меню_ _настройки_",
|
||||
|
||||
"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": "Открывает _Меню_ _настройки_",
|
||||
|
||||
"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": "Шаг 1",
|
||||
"item.create.blueprint_and_quill.tooltip.behaviour1": "Выберите две точки с помощью ПКМ",
|
||||
"item.create.blueprint_and_quill.tooltip.condition2": "Шаг 2",
|
||||
"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": "Открывает _Меню_",
|
||||
|
||||
"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": "Записывает выбранный файл из папки со схемами",
|
||||
|
||||
"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": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.",
|
||||
|
||||
"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": "Соединяет _2_ _Вала_ с помощью _Механической_ _ленты._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _Конвейер_ для _Существ._",
|
||||
"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": "Обрабатывает предметы перед блоком: _вода_ моет, _огонь_ коптит, _лава_ плавит.",
|
||||
|
||||
"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": "Формирует дробильную установку для обработки различных вещей. Зубцы колёс должны соединяться и двигаться с _одинаковой_ _скоростью_ в _противоположных_ _направлениях._",
|
||||
|
||||
"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": "Увеличивает длину поршня на 1 блок",
|
||||
|
||||
"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.stockswitch.tooltip.action1": "Открывает _Меню_ _настройки_",
|
||||
|
||||
"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": "Устанавливает _частоту_ для этого звена. Всего для определения частоты можно использовать _2_ _предмета._",
|
||||
"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.control1": "ПКМ по фильтру",
|
||||
"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": "Простая схема для уменьшения времени проходящего сигнала до _1_ _тика._",
|
||||
|
||||
"block.create.flexpeater.tooltip": "FLEX REPEATER",
|
||||
"block.create.flexpeater.tooltip.summary": "Продвинутый _Повторитель_ с _настраиваемой_ _задержкой_ вплоть до 30 минут.",
|
||||
|
||||
"itemGroup.create": "Create"
|
||||
}
|
169
src/main/resources/assets/create/models/block/basin.json
Normal file
169
src/main/resources/assets/create/models/block/basin.json
Normal file
|
@ -0,0 +1,169 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/cube",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"12": "create:block/basin",
|
||||
"particle": "create:block/basin"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "Side1",
|
||||
"from": [0, 5, 0],
|
||||
"to": [2, 13, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [7, 0, 8, 4], "texture": "#12"},
|
||||
"east": {"uv": [0, 0, 8, 4.5], "texture": "#12"},
|
||||
"south": {"uv": [0, 0, 1, 4], "texture": "#12"},
|
||||
"west": {"uv": [0, 0, 8, 4], "texture": "#12"},
|
||||
"up": {"uv": [8, 0, 9, 8], "texture": "#12"},
|
||||
"down": {"uv": [8, 0, 9, 8], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Leg1",
|
||||
"from": [0, 0, 0],
|
||||
"to": [2, 5, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"east": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"south": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"west": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"down": {"uv": [7, 5.5, 8, 6.5], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Leg2",
|
||||
"from": [0, 0, 14],
|
||||
"to": [2, 5, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 22]},
|
||||
"faces": {
|
||||
"north": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"east": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"south": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"west": {"uv": [7, 4.5, 8, 6.5], "texture": "#12"},
|
||||
"down": {"uv": [1, 10, 2, 11], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Leg3",
|
||||
"from": [14, 0, 0],
|
||||
"to": [16, 5, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"east": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"south": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"west": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"down": {"uv": [0, 5.5, 1, 6.5], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Leg4",
|
||||
"from": [14, 0, 14],
|
||||
"to": [16, 5, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 22]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"east": {"uv": [0, 4, 1, 6.5], "texture": "#12"},
|
||||
"south": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"west": {"uv": [7, 4, 8, 6.5], "texture": "#12"},
|
||||
"down": {"uv": [1, 11, 2, 12], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Bottom1",
|
||||
"from": [2, 1, 2],
|
||||
"to": [4, 6, 14],
|
||||
"rotation": {"angle": 22.5, "axis": "z", "origin": [2, 1, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [1, 4.5, 7, 7], "texture": "#12"},
|
||||
"west": {"uv": [1, 4.5, 7, 7], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Bottom2",
|
||||
"from": [2, 1, 12],
|
||||
"to": [14, 6, 14],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [4, 1, 14]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 4.5, 7, 7], "texture": "#12"},
|
||||
"south": {"uv": [1, 4.5, 7, 7], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Bottom4",
|
||||
"from": [2, 1, 2],
|
||||
"to": [14, 6, 4],
|
||||
"rotation": {"angle": -22.5, "axis": "x", "origin": [4, 1, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 4.5, 7, 7], "texture": "#12"},
|
||||
"south": {"uv": [1, 4.5, 7, 7], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Bottom3",
|
||||
"from": [12, 1, 2],
|
||||
"to": [14, 6, 14],
|
||||
"rotation": {"angle": -22.5, "axis": "z", "origin": [14, 1, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [1, 4.5, 7, 7], "texture": "#12"},
|
||||
"west": {"uv": [1, 4.5, 7, 7], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "BasinBottom",
|
||||
"from": [2, 0, 2],
|
||||
"to": [14, 2, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 25, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 6.5, 7, 7.5], "texture": "#12"},
|
||||
"east": {"uv": [1, 6.5, 7, 7.5], "texture": "#12"},
|
||||
"south": {"uv": [1, 6.5, 7, 7.5], "texture": "#12"},
|
||||
"west": {"uv": [1, 6.5, 7, 7.5], "texture": "#12"},
|
||||
"up": {"uv": [0, 10, 6, 16], "texture": "#12"},
|
||||
"down": {"uv": [0, 10, 6, 16], "rotation": 90, "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side4",
|
||||
"from": [2, 5, 0],
|
||||
"to": [14, 13, 2],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 0, 7, 4], "texture": "#12"},
|
||||
"south": {"uv": [0, 0, 8, 4.5], "texture": "#12"},
|
||||
"up": {"uv": [9, 0, 15, 1], "texture": "#12"},
|
||||
"down": {"uv": [9, 7, 15, 8], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side2",
|
||||
"from": [2, 5, 14],
|
||||
"to": [14, 13, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 24, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 0, 7, 4.5], "texture": "#12"},
|
||||
"south": {"uv": [1, 0, 7, 4], "texture": "#12"},
|
||||
"up": {"uv": [9, 7, 15, 8], "texture": "#12"},
|
||||
"down": {"uv": [9, 0, 15, 1], "texture": "#12"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side3",
|
||||
"from": [14, 5, 0],
|
||||
"to": [16, 13, 16],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 40, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 1, 4], "texture": "#12"},
|
||||
"east": {"uv": [0, 0, 8, 4], "texture": "#12"},
|
||||
"south": {"uv": [7, 0, 8, 4], "texture": "#12"},
|
||||
"west": {"uv": [0, 0, 8, 4.5], "texture": "#12"},
|
||||
"up": {"uv": [15, 0, 16, 8], "texture": "#12"},
|
||||
"down": {"uv": [15, 0, 16, 8], "texture": "#12"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
{
|
||||
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"particle": "block/stripped_spruce_log",
|
||||
"1": "block/stripped_spruce_log",
|
||||
"2": "block/stripped_spruce_log_top"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "Gear",
|
||||
"from": [ -1.0, 6.5, 6.5 ],
|
||||
"to": [ 17.0, 9.5, 9.5 ],
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 6.0, 0.0, 9.0, 16.0 ], "rotation": 90 },
|
||||
"east": { "texture": "#1", "uv": [ 1.0, 3.0, 4.0, 6.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 5.0, 10.0, 8.0, 13.0 ] },
|
||||
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Gear2",
|
||||
"from": [ -1.0, 6.5, 6.5 ],
|
||||
"to": [ 17.0, 9.5, 9.5 ],
|
||||
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 },
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Gear3",
|
||||
"from": [ -1.0, 6.5, 6.5 ],
|
||||
"to": [ 17.0, 9.5, 9.5 ],
|
||||
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Gear4",
|
||||
"from": [ 6.5, 6.5, -1.0 ],
|
||||
"to": [ 9.5, 9.5, 17.0 ],
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
|
||||
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] },
|
||||
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 3.0, 16.0 ] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "GearCaseInner",
|
||||
"from": [ 2.0, 7.0, 2.0 ],
|
||||
"to": [ 14.0, 9.0, 14.0 ],
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] },
|
||||
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 12.0, 2.0 ] },
|
||||
"up": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
|
||||
"down": { "texture": "#2", "uv": [ 2.0, 2.0, 14.0, 14.0 ] }
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "GearCaseOuter",
|
||||
"from": [ 4.0, 6.0, 4.0 ],
|
||||
"to": [ 12.0, 10.0, 12.0 ],
|
||||
"faces": {
|
||||
"north": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] },
|
||||
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] },
|
||||
"south": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] },
|
||||
"west": { "texture": "#1", "uv": [ 0.0, 0.0, 8.0, 4.0 ] },
|
||||
"up": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] },
|
||||
"down": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/cube",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"1": "block/stripped_spruce_log",
|
||||
"2": "block/spruce_log_top",
|
||||
"4": "create:block/mixer_base_side",
|
||||
"11": "create:block/mechanical_press_top",
|
||||
"particle": "block/stripped_spruce_log"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "Top",
|
||||
"from": [0, 10, 0],
|
||||
"to": [16, 16, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 6], "texture": "#4"},
|
||||
"east": {"uv": [0, 0, 16, 6], "texture": "#4"},
|
||||
"south": {"uv": [0, 0, 16, 6], "texture": "#4"},
|
||||
"west": {"uv": [0, 0, 16, 6], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#11"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#2"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Bottom",
|
||||
"from": [0, 2, 0],
|
||||
"to": [16, 6, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 10, 16, 14], "texture": "#4"},
|
||||
"east": {"uv": [0, 10, 16, 14], "texture": "#4"},
|
||||
"south": {"uv": [0, 10, 16, 14], "texture": "#4"},
|
||||
"west": {"uv": [0, 10, 16, 14], "texture": "#4"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#2"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#11"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side1",
|
||||
"from": [0, 6, 0],
|
||||
"to": [0, 10, 16],
|
||||
"faces": {
|
||||
"east": {"uv": [0, 6, 16, 10], "texture": "#4"},
|
||||
"west": {"uv": [0, 6, 16, 10], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side2",
|
||||
"from": [16, 6, 0],
|
||||
"to": [16, 10, 16],
|
||||
"faces": {
|
||||
"east": {"uv": [0, 6, 16, 10], "texture": "#4"},
|
||||
"west": {"uv": [0, 6, 16, 10], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side3",
|
||||
"from": [0, 6, 16],
|
||||
"to": [16, 10, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 6, 16, 10], "texture": "#4"},
|
||||
"south": {"uv": [0, 6, 16, 10], "texture": "#4"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Side4",
|
||||
"from": [0, 6, 0],
|
||||
"to": [16, 10, 0],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 6, 16, 10], "texture": "#4"},
|
||||
"south": {"uv": [0, 6, 16, 10], "texture": "#4"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
129
src/main/resources/assets/create/models/block/mixer_head.json
Normal file
129
src/main/resources/assets/create/models/block/mixer_head.json
Normal file
|
@ -0,0 +1,129 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/cube",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"6": "create:block/mixer_head",
|
||||
"mechanical_press_pole": "create:block/mechanical_press_pole"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "MixerCenter",
|
||||
"from": [7, -4.5, 7],
|
||||
"to": [9, 7.5, 9],
|
||||
"shade": false,
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},
|
||||
"east": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},
|
||||
"south": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},
|
||||
"west": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},
|
||||
"down": {"uv": [0, 12, 2, 14], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerbottom1",
|
||||
"from": [2.5, -4, 7],
|
||||
"to": [13.5, -2, 9],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 14, 11, 16], "texture": "#6"},
|
||||
"east": {"uv": [2, 8, 4, 10], "texture": "#6"},
|
||||
"south": {"uv": [0, 14, 11, 16], "texture": "#6"},
|
||||
"west": {"uv": [2, 0, 4, 2], "texture": "#6"},
|
||||
"up": {"uv": [0, 12, 11, 14], "texture": "#6"},
|
||||
"down": {"uv": [0, 10, 11, 12], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerbottom2",
|
||||
"from": [7, -4, 2.5],
|
||||
"to": [9, -2, 13.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 8, 4, 10], "texture": "#6"},
|
||||
"east": {"uv": [0, 14, 11, 16], "texture": "#6"},
|
||||
"south": {"uv": [2, 8, 4, 10], "texture": "#6"},
|
||||
"west": {"uv": [0, 14, 11, 16], "texture": "#6"},
|
||||
"up": {"uv": [0, 12, 11, 14], "rotation": 90, "texture": "#6"},
|
||||
"down": {"uv": [0, 10, 11, 12], "rotation": 90, "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerside4",
|
||||
"from": [11.5, -2, 7],
|
||||
"to": [13.5, 4, 9],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 2, 8], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [2, 2, 4, 8], "texture": "#6"},
|
||||
"south": {"uv": [0, 2, 2, 8], "texture": "#6"},
|
||||
"west": {"uv": [4, 0, 6, 6], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerside3",
|
||||
"from": [2.5, -2, 7],
|
||||
"to": [4.5, 4, 9],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 2, 8], "texture": "#6"},
|
||||
"east": {"uv": [4, 0, 6, 6], "texture": "#6"},
|
||||
"south": {"uv": [0, 2, 2, 8], "rotation": 180, "texture": "#6"},
|
||||
"west": {"uv": [2, 2, 4, 8], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerside2",
|
||||
"from": [7, -2, 2.5],
|
||||
"to": [9, 4, 4.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 2, 4, 8], "texture": "#6"},
|
||||
"east": {"uv": [0, 2, 2, 8], "texture": "#6"},
|
||||
"south": {"uv": [4, 0, 6, 6], "texture": "#6"},
|
||||
"west": {"uv": [0, 2, 2, 8], "rotation": 180, "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixerside1",
|
||||
"from": [7, -2, 11.5],
|
||||
"to": [9, 4, 13.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 0, 6, 6], "texture": "#6"},
|
||||
"east": {"uv": [0, 2, 2, 8], "rotation": 180, "texture": "#6"},
|
||||
"south": {"uv": [2, 2, 4, 8], "texture": "#6"},
|
||||
"west": {"uv": [0, 2, 2, 8], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixertop1",
|
||||
"from": [7, 4, 2.5],
|
||||
"to": [9, 6, 13.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 0, 4, 2], "texture": "#6"},
|
||||
"east": {"uv": [0, 14, 11, 16], "rotation": 180, "texture": "#6"},
|
||||
"south": {"uv": [2, 0, 4, 2], "texture": "#6"},
|
||||
"west": {"uv": [0, 14, 11, 16], "rotation": 180, "texture": "#6"},
|
||||
"up": {"uv": [0, 10, 11, 12], "rotation": 90, "texture": "#6"},
|
||||
"down": {"uv": [0, 12, 11, 14], "rotation": 90, "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mixertop2",
|
||||
"from": [2.5, 4, 7],
|
||||
"to": [13.5, 6, 9],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 14, 11, 16], "rotation": 180, "texture": "#6"},
|
||||
"east": {"uv": [2, 0, 4, 2], "texture": "#6"},
|
||||
"south": {"uv": [0, 14, 11, 16], "rotation": 180, "texture": "#6"},
|
||||
"west": {"uv": [2, 0, 4, 2], "texture": "#6"},
|
||||
"up": {"uv": [0, 10, 11, 12], "texture": "#6"},
|
||||
"down": {"uv": [0, 12, 11, 14], "texture": "#6"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
100
src/main/resources/assets/create/models/block/mixer_pole.json
Normal file
100
src/main/resources/assets/create/models/block/mixer_pole.json
Normal file
|
@ -0,0 +1,100 @@
|
|||
{
|
||||
"credit": "Made with Blockbench",
|
||||
"parent": "block/cube",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"6": "create:block/mixer_head",
|
||||
"mechanical_press_pole": "create:block/mechanical_press_pole"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "polebase",
|
||||
"from": [5, 7, 5],
|
||||
"to": [11, 9, 11],
|
||||
"shade": false,
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [10, 6, 16, 8], "texture": "#6"},
|
||||
"east": {"uv": [10, 6, 16, 8], "texture": "#6"},
|
||||
"south": {"uv": [10, 6, 16, 8], "texture": "#6"},
|
||||
"west": {"uv": [10, 6, 16, 8], "texture": "#6"},
|
||||
"up": {"uv": [10, 0, 16, 6], "texture": "#6"},
|
||||
"down": {"uv": [10, 0, 16, 6], "texture": "#6"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole1Core",
|
||||
"from": [6, 9, 6],
|
||||
"to": [10, 19, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [6, 6, 10, 16], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [6, 6, 10, 16], "texture": "#mechanical_press_pole"},
|
||||
"down": {"uv": [11, 1, 15, 5], "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole1Side",
|
||||
"from": [5, 9, 5],
|
||||
"to": [11, 19, 6],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"east": {"uv": [0, 6, 1, 16], "texture": "#mechanical_press_pole"},
|
||||
"south": {"uv": [0, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [5, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"down": {"uv": [10, 5, 16, 6], "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole1Side",
|
||||
"from": [5, 9, 10],
|
||||
"to": [11, 19, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"east": {"uv": [0, 6, 1, 16], "texture": "#mechanical_press_pole"},
|
||||
"south": {"uv": [0, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [5, 6, 6, 16], "texture": "#mechanical_press_pole"},
|
||||
"down": {"uv": [10, 0, 16, 1], "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole2Core",
|
||||
"from": [6, 19, 6],
|
||||
"to": [10, 32, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]},
|
||||
"faces": {
|
||||
"east": {"uv": [6, 0, 10, 13], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [6, 0, 10, 13], "texture": "#mechanical_press_pole"},
|
||||
"up": {"uv": [11, 1, 15, 5], "rotation": 180, "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole2Side",
|
||||
"from": [5, 19, 10],
|
||||
"to": [11, 32, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"east": {"uv": [0, 0, 1, 13], "texture": "#mechanical_press_pole"},
|
||||
"south": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [5, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"up": {"uv": [10, 0, 16, 1], "rotation": 180, "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pole2Side",
|
||||
"from": [5, 19, 5],
|
||||
"to": [11, 32, 6],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"east": {"uv": [0, 0, 1, 13], "texture": "#mechanical_press_pole"},
|
||||
"south": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"west": {"uv": [5, 0, 6, 13], "texture": "#mechanical_press_pole"},
|
||||
"up": {"uv": [10, 5, 16, 6], "rotation": 180, "texture": "#mechanical_press_pole"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
3
src/main/resources/assets/create/models/item/basin.json
Normal file
3
src/main/resources/assets/create/models/item/basin.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "create:block/basin"
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue