From facef0ddb19e0fc0bf7b18fd333747e4a82dc167 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 15 Oct 2019 22:22:19 +0200 Subject: [PATCH] Bug Fixes in 0.1.1a - Fixed id downcasing not working properly in non-english environments #25 - Removed event subscriber annotations for mod & registry events - Added more displayable slots in the Washing JEI view - Fixed Windowed blocks referencing IBakedModel on the server - Changed stairs to use blockstate supplier - Fixed Symmetry Wand crashing when configured in the off-hand - Fixed "Hold Shift" in tooltips not being translated - Chassis now drop applied slime balls - Slime Balls are now craftable - Mechanical Belts now lock living entities in place - Blockzapper recipes can now be viewed from the uses of their ingredient materials - Configured FlexPeaters now synchronize with other players - Fixed client crash when rendering lava in a deployed schematic #15 - Made encased fans a little less expensive - Added other coral types to tree fertilizer recipe --- build.gradle | 10 +- .../com/simibubi/create/AllBlockTags.java | 12 +- .../java/com/simibubi/create/AllBlocks.java | 7 +- .../com/simibubi/create/AllContainers.java | 22 ++-- .../java/com/simibubi/create/AllItemTags.java | 6 +- .../java/com/simibubi/create/AllItems.java | 5 +- .../java/com/simibubi/create/AllRecipes.java | 3 +- .../com/simibubi/create/AllTileEntities.java | 17 +-- src/main/java/com/simibubi/create/Create.java | 31 +++-- .../com/simibubi/create/CreateClient.java | 19 ++- .../com/simibubi/create/ScreenResources.java | 1 + .../jei/BlockzapperUpgradeCategory.java | 2 +- .../create/compat/jei/SplashingCategory.java | 22 +++- .../foundation/block/ProperStairsBlock.java | 2 +- .../create/foundation/packet/NbtPacket.java | 18 ++- .../foundation/utility/FilesHelper.java | 8 +- .../foundation/utility/ItemDescription.java | 38 ++++-- .../create/foundation/utility/Lang.java | 5 + .../constructs/AbstractChassisBlock.java | 25 +++- .../constructs/MechanicalPistonBlock.java | 3 +- .../contraptions/relays/belt/BeltBlock.java | 5 +- .../relays/belt/BeltTileEntity.java | 9 +- .../partialWindows/WindowInABlockModel.java | 11 +- .../WindowInABlockTileEntity.java | 17 +-- .../placementHandgun/BuilderGunItem.java | 8 +- .../BuilderGunUpgradeRecipe.java | 9 +- .../placementHandgun/PlacementPatterns.java | 3 +- .../symmetry/SymmetryWandItem.java | 8 +- .../symmetry/SymmetryWandScreen.java | 14 +- .../logistics/block/EntityDetectorBlock.java | 2 +- .../logistics/block/LinkedExtractorBlock.java | 2 +- .../diodes/ConfigureFlexpeaterPacket.java | 2 + .../block/diodes/FlexpeaterTileEntity.java | 10 ++ .../modules/schematics/MaterialChecklist.java | 48 +++---- .../modules/schematics/SchematicWorld.java | 124 ++---------------- .../block/SchematicannonTileEntity.java | 2 +- .../schematics/client/SchematicHandler.java | 2 +- .../schematics/client/SchematicHologram.java | 3 +- .../schematics/client/tools/Tools.java | 4 +- .../assets/create/textures/gui/recipes3.png | Bin 15269 -> 15271 bytes .../create/recipes/crafting/encased_fan.json | 2 +- .../create/recipes/crafting/slime_ball.json | 21 +++ .../recipes/crafting/tree_fertilizer.json | 20 ++- 43 files changed, 306 insertions(+), 276 deletions(-) create mode 100644 src/main/resources/data/create/recipes/crafting/slime_ball.json diff --git a/build.gradle b/build.gradle index afa76c8a1..ca34bd323 100644 --- a/build.gradle +++ b/build.gradle @@ -13,14 +13,14 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = 'mc1.14.4_v0.1.1' +version = 'mc1.14.4_v0.1.1a' group = 'com.simibubi.create' archivesBaseName = 'create' sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' minecraft { - mappings channel: 'snapshot', version: '20190917-1.14.3' + mappings channel: 'snapshot', version: '20191012-1.14.3' runs { client { @@ -71,12 +71,12 @@ repositories { } dependencies { - minecraft 'net.minecraftforge:forge:1.14.4-28.1.6' + minecraft 'net.minecraftforge:forge:1.14.4-28.1.45' // 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") + compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.18:api") // at runtime, use the full JEI jar - runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.10") + //runtimeOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.18") } jar { diff --git a/src/main/java/com/simibubi/create/AllBlockTags.java b/src/main/java/com/simibubi/create/AllBlockTags.java index 5b2925c7e..94a42df87 100644 --- a/src/main/java/com/simibubi/create/AllBlockTags.java +++ b/src/main/java/com/simibubi/create/AllBlockTags.java @@ -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 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()); } diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index b5864318a..aa30de544 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -5,6 +5,7 @@ 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; @@ -182,14 +183,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]; @@ -259,7 +260,7 @@ public enum AllBlocks { } return featured.setRegistryName(Create.ID, - block.getRegistryName().getPath() + "_" + feature.name().toLowerCase()); + block.getRegistryName().getPath() + "_" + Lang.asId(feature.name())); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/AllContainers.java b/src/main/java/com/simibubi/create/AllContainers.java index fb0153905..0f6113487 100644 --- a/src/main/java/com/simibubi/create/AllContainers.java +++ b/src/main/java/com/simibubi/create/AllContainers.java @@ -1,5 +1,6 @@ package com.simibubi.create; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.logistics.block.FlexcrateContainer; import com.simibubi.create.modules.logistics.block.FlexcrateScreen; import com.simibubi.create.modules.schematics.block.SchematicTableContainer; @@ -17,19 +18,15 @@ 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), - + ; public ContainerType type; @@ -39,13 +36,11 @@ public enum AllContainers { this.factory = factory; } - @SubscribeEvent - public static void onContainerTypeRegistry(final RegistryEvent.Register> e) { - + public static void registerContainers(IForgeRegistry> 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); } } @@ -58,7 +53,8 @@ public enum AllContainers { @OnlyIn(Dist.CLIENT) @SuppressWarnings("unchecked") - private static > void bind(AllContainers c, IScreenFactory factory) { + private static > void bind(AllContainers c, + IScreenFactory factory) { ScreenManager.registerFactory((ContainerType) c.type, factory); } diff --git a/src/main/java/com/simibubi/create/AllItemTags.java b/src/main/java/com/simibubi/create/AllItemTags.java index b8eaa1b7a..77dab7504 100644 --- a/src/main/java/com/simibubi/create/AllItemTags.java +++ b/src/main/java/com/simibubi/create/AllItemTags.java @@ -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 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()); } - + } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 57502af0a..8b3bee9e3 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,6 +1,7 @@ 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.relays.VerticalGearboxItem; import com.simibubi.create.modules.contraptions.relays.belt.BeltItem; @@ -91,14 +92,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; } diff --git a/src/main/java/com/simibubi/create/AllRecipes.java b/src/main/java/com/simibubi/create/AllRecipes.java index 6757954aa..659f6321f 100644 --- a/src/main/java/com/simibubi/create/AllRecipes.java +++ b/src/main/java/com/simibubi/create/AllRecipes.java @@ -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> 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)); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 966e1955e..5beacae39 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -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.KineticTileEntityRenderer; import com.simibubi.create.modules.contraptions.generators.MotorTileEntity; import com.simibubi.create.modules.contraptions.generators.MotorTileEntityRenderer; @@ -54,13 +55,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 @@ -95,7 +92,7 @@ public enum AllTileEntities { BELT_FUNNEL(BeltFunnelTileEntity::new, AllBlocks.BELT_FUNNEL), ENTITY_DETECTOR(EntityDetectorTileEntity::new, AllBlocks.ENTITY_DETECTOR), FLEXPEATER(FlexpeaterTileEntity::new, AllBlocks.FLEXPEATER), - + // Curiosities WINDOW_IN_A_BLOCK(WindowInABlockTileEntity::new, AllBlocks.WINDOW_IN_A_BLOCK), @@ -110,18 +107,16 @@ public enum AllTileEntities { this.blocks = blocks; } - @SubscribeEvent - public static void onTileEntityRegistry(final RegistryEvent.Register> event) { - + public static void registerTileEntities(IForgeRegistry> 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); } } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 6fdf530b7..6ad1204b6 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -9,20 +9,20 @@ import com.simibubi.create.modules.logistics.FrequencyHandler; import com.simibubi.create.modules.schematics.ServerSchematicLoader; import net.minecraft.block.Block; +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.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.IEventBus; 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 { @@ -39,11 +39,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(); @@ -52,23 +61,27 @@ public class Create { AllPackets.registerPackets(); } - @SubscribeEvent public static void registerItems(RegistryEvent.Register event) { AllItems.registerItems(event.getRegistry()); AllBlocks.registerItemBlocks(event.getRegistry()); } - @SubscribeEvent public static void registerBlocks(RegistryEvent.Register event) { AllBlocks.registerBlocks(event.getRegistry()); } - @SubscribeEvent + public static void registerTileEntities(RegistryEvent.Register> event) { + AllTileEntities.registerTileEntities(event.getRegistry()); + } + + public static void registerContainers(RegistryEvent.Register> event) { + AllContainers.registerContainers(event.getRegistry()); + } + public static void registerRecipes(RegistryEvent.Register> event) { AllRecipes.register(event); } - @SubscribeEvent public static void createConfigs(ModConfig.ModConfigEvent event) { if (event.getConfig().getSpec() == CreateClientConfig.specification) return; diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 1b1323e44..13f29c9b6 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -24,13 +24,11 @@ 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.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; @@ -41,7 +39,14 @@ public class CreateClient { 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); + }); + } + public static void clientInit(FMLClientSetupEvent event) { schematicSender = new ClientSchematicLoader(); schematicHandler = new SchematicHandler(); @@ -60,7 +65,6 @@ public class CreateClient { ((IReloadableResourceManager) resourceManager).addReloadListener(new CachedBufferReloader()); } - @SubscribeEvent public static void createConfigs(ModConfig.ModConfigEvent event) { if (event.getConfig().getSpec() == CreateConfig.specification) return; @@ -75,7 +79,6 @@ public class CreateClient { schematicHologram.tick(); } - @SubscribeEvent @OnlyIn(Dist.CLIENT) public static void onModelBake(ModelBakeEvent event) { Map modelRegistry = event.getModelRegistry(); @@ -111,4 +114,6 @@ public class CreateClient { modelRegistry.put(location, factory.apply(modelRegistry.get(location))); } + + } diff --git a/src/main/java/com/simibubi/create/ScreenResources.java b/src/main/java/com/simibubi/create/ScreenResources.java index ede2380d6..6c4ba4e7b 100644 --- a/src/main/java/com/simibubi/create/ScreenResources.java +++ b/src/main/java/com/simibubi/create/ScreenResources.java @@ -38,6 +38,7 @@ 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), diff --git a/src/main/java/com/simibubi/create/compat/jei/BlockzapperUpgradeCategory.java b/src/main/java/com/simibubi/create/compat/jei/BlockzapperUpgradeCategory.java index a0516c980..50ab29658 100644 --- a/src/main/java/com/simibubi/create/compat/jei/BlockzapperUpgradeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/BlockzapperUpgradeCategory.java @@ -109,7 +109,7 @@ public class BlockzapperUpgradeCategory implements IRecipeCategory 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 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 List 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 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); diff --git a/src/main/java/com/simibubi/create/foundation/block/ProperStairsBlock.java b/src/main/java/com/simibubi/create/foundation/block/ProperStairsBlock.java index 5efbf5045..35892d1fd 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ProperStairsBlock.java +++ b/src/main/java/com/simibubi/create/foundation/block/ProperStairsBlock.java @@ -6,7 +6,7 @@ import net.minecraft.block.StairsBlock; public class ProperStairsBlock extends StairsBlock { public ProperStairsBlock(Block block) { - super(block.getDefaultState(), Properties.from(block)); + super(() -> block.getDefaultState(), Properties.from(block)); } } diff --git a/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java b/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java index 26875bc49..490326f10 100644 --- a/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java +++ b/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java @@ -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) { @@ -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()); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java index 2ab097e60..6e41a84e5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java @@ -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; } - } diff --git a/src/main/java/com/simibubi/create/foundation/utility/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/utility/ItemDescription.java index 83002860f..99145c52b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ItemDescription.java @@ -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 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("")); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Lang.java b/src/main/java/com/simibubi/create/foundation/utility/Lang.java index a095dafb7..a763c5ced 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Lang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Lang.java @@ -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); + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/AbstractChassisBlock.java index fb5fa52c6..2482b51e1 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/AbstractChassisBlock.java @@ -4,25 +4,30 @@ 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, IBlockWithScrollableValue { - + private static final Vec3d valuePos = new Vec3d(15 / 16f, 9 / 16f, 9 / 16f); public AbstractChassisBlock(Properties properties) { @@ -50,16 +55,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; } @@ -78,17 +91,17 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock public String getValueName(BlockState state, IWorld world, BlockPos pos) { return Lang.translate("generic.range"); } - + @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 isValueOnAllSides() { return true; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/MechanicalPistonBlock.java index 32fc8531d..e61db1126 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/receivers/constructs/MechanicalPistonBlock.java @@ -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.IRotate; import com.simibubi.create.modules.contraptions.base.KineticBlock; @@ -145,7 +146,7 @@ public class MechanicalPistonBlock extends KineticBlock { @Override public String getName() { - return name().toLowerCase(); + return Lang.asId(name()); } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java index 905be6235..799ab5847 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java @@ -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()); } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java index 3c172886e..93bf50e8e 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java @@ -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; diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java index 1a7203c27..7819c1b1b 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java @@ -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 PARTIAL_BLOCK = new ModelProperty<>(); - public static final ModelProperty WINDOW_BLOCK = new ModelProperty<>(); - public static final ModelProperty POSITION = new ModelProperty<>(); - public WindowInABlockModel(IBakedModel template) { super(template); } @@ -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)); diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java index 0a5ca65bf..918286a9e 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockTileEntity.java @@ -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; @@ -14,18 +11,22 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; public class WindowInABlockTileEntity extends SyncedTileEntity { private BlockState partialBlock = Blocks.AIR.getDefaultState(); private BlockState windowBlock = Blocks.AIR.getDefaultState(); + private IModelData modelData; + public static final ModelProperty PARTIAL_BLOCK = new ModelProperty<>(); + public static final ModelProperty WINDOW_BLOCK = new ModelProperty<>(); + public static final ModelProperty POSITION = new ModelProperty<>(); public WindowInABlockTileEntity() { super(AllTileEntities.WINDOW_IN_A_BLOCK.type); modelData = new ModelDataMap.Builder().withInitial(WINDOW_BLOCK, Blocks.AIR.getDefaultState()) - .withInitial(PARTIAL_BLOCK, Blocks.AIR.getDefaultState()) - .withInitial(WindowInABlockModel.POSITION, BlockPos.ZERO).build(); + .withInitial(PARTIAL_BLOCK, Blocks.AIR.getDefaultState()).withInitial(POSITION, BlockPos.ZERO).build(); } @Override @@ -59,9 +60,9 @@ public class WindowInABlockTileEntity extends SyncedTileEntity { @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; } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java index 5ce44020e..78469dcfa 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java @@ -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()))); } } } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java index bef5ef878..a4df1bd67 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java @@ -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 getIngredients() { + return recipe.getIngredients(); + } + @Override public ItemStack getCraftingResult(CraftingInventory inv) { for (int slot = 0; slot < inv.getSizeInventory(); slot++) { diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java index 639bb7ed3..2cdf9678d 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java @@ -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; } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandItem.java index 299a43217..ecfa4382a 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandItem.java @@ -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) { diff --git a/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandScreen.java index 674fb3cea..e3cbde8ee 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/symmetry/SymmetryWandScreen.java @@ -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(); } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/EntityDetectorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/EntityDetectorBlock.java index d6b9e8d7f..d159a0235 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/EntityDetectorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/EntityDetectorBlock.java @@ -30,8 +30,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; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/LinkedExtractorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/LinkedExtractorBlock.java index 6774d518d..f3f86c89c 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/LinkedExtractorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/LinkedExtractorBlock.java @@ -14,8 +14,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; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/diodes/ConfigureFlexpeaterPacket.java b/src/main/java/com/simibubi/create/modules/logistics/block/diodes/ConfigureFlexpeaterPacket.java index 75431b3b6..b68759606 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/diodes/ConfigureFlexpeaterPacket.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/diodes/ConfigureFlexpeaterPacket.java @@ -33,7 +33,9 @@ public class ConfigureFlexpeaterPacket extends TileEntityConfigurationPacket(); 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 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 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"; } } diff --git a/src/main/java/com/simibubi/create/modules/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/modules/schematics/SchematicWorld.java index e57670ba3..d780187e2 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/modules/schematics/SchematicWorld.java @@ -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 blocks; private Cuboid bounds; public BlockPos anchor; - - public SchematicWorld(Map blocks, Cuboid bounds, BlockPos anchor) { + + public SchematicWorld(Map blocks, Cuboid bounds, BlockPos anchor, World original) { + super(original); this.blocks = blocks; this.setBounds(bounds); this.anchor = anchor; } - + public Set 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 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 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; } diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java index 5b7141296..5bb0b2674 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java @@ -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; diff --git a/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHandler.java index b455dad32..6a406a721 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHandler.java @@ -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); diff --git a/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHologram.java b/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHologram.java index b8934f0c9..8f5f13f4b 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHologram.java +++ b/src/main/java/com/simibubi/create/modules/schematics/client/SchematicHologram.java @@ -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); } diff --git a/src/main/java/com/simibubi/create/modules/schematics/client/tools/Tools.java b/src/main/java/com/simibubi/create/modules/schematics/client/tools/Tools.java index 2b6965d2b..52790f748 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/client/tools/Tools.java +++ b/src/main/java/com/simibubi/create/modules/schematics/client/tools/Tools.java @@ -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 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"); } } diff --git a/src/main/resources/assets/create/textures/gui/recipes3.png b/src/main/resources/assets/create/textures/gui/recipes3.png index c299dda80a54b94ea3b31e8d7248f056c4bf1399..2012b71db596754f74cda3324051a2c491c2ed75 100644 GIT binary patch delta 14268 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 VQhLX%_(2yxT`hf7;YGvi{{a$UF_!=U diff --git a/src/main/resources/data/create/recipes/crafting/encased_fan.json b/src/main/resources/data/create/recipes/crafting/encased_fan.json index 5c57844f9..ae505f03e 100644 --- a/src/main/resources/data/create/recipes/crafting/encased_fan.json +++ b/src/main/resources/data/create/recipes/crafting/encased_fan.json @@ -10,7 +10,7 @@ "item": "minecraft:iron_bars" }, "A": { - "item": "create:iron_sheet" + "item": "create:andesite_alloy_cube" }, "S": { "item": "create:propeller" diff --git a/src/main/resources/data/create/recipes/crafting/slime_ball.json b/src/main/resources/data/create/recipes/crafting/slime_ball.json new file mode 100644 index 000000000..2e8885ce7 --- /dev/null +++ b/src/main/resources/data/create/recipes/crafting/slime_ball.json @@ -0,0 +1,21 @@ +{ + "type": "crafting_shapeless", + "ingredients": [ + { + "tag": "forge:dyes/lime" + }, + { + "item": "create:dough" + } + ], + "result": { + "item": "minecraft:slime_ball", + "count": 1 + }, + "conditions": [ + { + "type": "create:module", + "module": "contraptions" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/crafting/tree_fertilizer.json b/src/main/resources/data/create/recipes/crafting/tree_fertilizer.json index 2292bf0dc..20dad4a67 100644 --- a/src/main/resources/data/create/recipes/crafting/tree_fertilizer.json +++ b/src/main/resources/data/create/recipes/crafting/tree_fertilizer.json @@ -1,9 +1,23 @@ { "type": "crafting_shapeless", "ingredients": [ - { - "item": "minecraft:horn_coral" - }, + [ + { + "item": "minecraft:horn_coral" + }, + { + "item": "minecraft:tube_coral" + }, + { + "item": "minecraft:fire_coral" + }, + { + "item": "minecraft:bubble_coral" + }, + { + "item": "minecraft:brain_coral" + } + ], { "item": "minecraft:bone_meal" },