From 939c640e14f42ff36ed9353fed7e187e9df5daa5 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 10 Apr 2021 01:50:13 +0200 Subject: [PATCH 01/16] Better address these - Fixed Nixies rendering inconsistently - Fixed belts not showing items under certain conditions - Fixed vertical/sideways belts accepting items from other belts - Spouts can now interact with belts/depots with a mounted funnel --- .../contraptions/relays/belt/BeltTileEntity.java | 13 ++++++++++--- .../logistics/block/redstone/NixieTubeRenderer.java | 6 ++++++ .../behaviour/belt/BeltProcessingBehaviour.java | 8 ++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 253f54500..1624eb195 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -60,7 +60,6 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; - public class BeltTileEntity extends KineticTileEntity implements LightUpdateListener { public Map passengers; @@ -118,7 +117,8 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList if (light == null && world.isRemote) { initializeLight(); - LightUpdater.getInstance().startListening(getBeltVolume(), this); + LightUpdater.getInstance() + .startListening(getBeltVolume(), this); } getInventory().tick(); @@ -423,6 +423,10 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList private boolean canInsertFrom(Direction side) { if (getSpeed() == 0) return false; + BlockState state = getBlockState(); + if (state.contains(BeltBlock.SLOPE) + && (state.get(BeltBlock.SLOPE) == BeltSlope.SIDEWAYS || state.get(BeltBlock.SLOPE) == BeltSlope.VERTICAL)) + return false; return getMovementFacing() != side.getOpposite(); } @@ -515,7 +519,10 @@ public class BeltTileEntity extends KineticTileEntity implements LightUpdateList @Override public boolean shouldRenderAsTE() { - return isController(); + if (world == null) + return isController(); + BlockState state = getBlockState(); + return state != null && state.contains(BeltBlock.PART) && state.get(BeltBlock.PART) == BeltPart.START; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java index 34a659bc4..88fe71188 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java @@ -12,7 +12,9 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.fonts.TexturedGlyph; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.IRenderTypeBuffer.Impl; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.text.Style; @@ -86,6 +88,10 @@ public class NixieTubeRenderer extends SafeTileEntityRenderer Date: Sat, 10 Apr 2021 03:26:38 +0200 Subject: [PATCH 02/16] Ghostbusters - Patched up yet another set of entry points to kinetic source loops --- .../create/content/contraptions/base/KineticBlock.java | 10 ++++++---- .../content/contraptions/base/KineticTileEntity.java | 2 +- .../content/contraptions/relays/belt/BeltBlock.java | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 36a74f631..8b28d9cce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.item.ItemDescription.Palette; +import com.simibubi.create.foundation.utility.Debug; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -10,6 +11,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; @@ -54,7 +56,7 @@ public abstract class KineticBlock extends Block implements IRotate { TileEntity tileEntity = worldIn.getTileEntity(pos); if (tileEntity instanceof KineticTileEntity) { KineticTileEntity kineticTileEntity = (KineticTileEntity) tileEntity; - kineticTileEntity.preventSpeedUpdate = false; + kineticTileEntity.preventSpeedUpdate = 0; if (oldState.getBlock() != state.getBlock()) return; @@ -63,7 +65,7 @@ public abstract class KineticBlock extends Block implements IRotate { if (!areStatesKineticallyEquivalent(oldState, state)) return; - kineticTileEntity.preventSpeedUpdate = true; + kineticTileEntity.preventSpeedUpdate = 2; } } @@ -94,8 +96,8 @@ public abstract class KineticBlock extends Block implements IRotate { return; KineticTileEntity kte = (KineticTileEntity) tileEntity; - if (kte.preventSpeedUpdate) { - kte.preventSpeedUpdate = false; + if (kte.preventSpeedUpdate > 0) { + kte.preventSpeedUpdate--; return; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index d91befd6a..eed822ab4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -50,7 +50,7 @@ public abstract class KineticTileEntity extends SmartTileEntity public @Nullable BlockPos source; public boolean networkDirty; public boolean updateSpeed; - public boolean preventSpeedUpdate; + public int preventSpeedUpdate; protected KineticEffectHandler effects; protected float speed; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index af1a272c4..fca461c3c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -89,8 +89,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE Date: Sat, 10 Apr 2021 03:49:41 +0200 Subject: [PATCH 03/16] Wrapped Hints - Fixed goggle tooltips flipping to the left when too wide - Can no longer drag the goggle overlay off-screen in the config ui --- .../goggles/GoggleConfigScreen.java | 65 ++++++++++++++----- .../goggles/GoggleOverlayRenderer.java | 25 ++++++- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java index d3956d25b..63166fd4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java @@ -12,7 +12,9 @@ import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.ITextProperties; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; @@ -25,24 +27,37 @@ public class GoggleConfigScreen extends AbstractSimiScreen { public GoggleConfigScreen() { ITextComponent componentSpacing = new StringTextComponent(" "); tooltip = new ArrayList<>(); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay1"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay2").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay1"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay2") + .formatted(TextFormatting.GRAY))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay3"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay4"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay3"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay4"))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay5").formatted(TextFormatting.GRAY))); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay6").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay5") + .formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay6") + .formatted(TextFormatting.GRAY))); tooltip.add(StringTextComponent.EMPTY); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay7"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.config.overlay8"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay7"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.config.overlay8"))); } @Override protected void init() { Minecraft mc = Minecraft.getInstance(); - this.width = mc.getWindow().getScaledWidth(); - this.height = mc.getWindow().getScaledHeight(); + this.width = mc.getWindow() + .getScaledWidth(); + this.height = mc.getWindow() + .getScaledHeight(); offsetX = AllConfigs.CLIENT.overlayOffsetX.get(); offsetY = AllConfigs.CLIENT.overlayOffsetY.get(); @@ -62,7 +77,8 @@ public class GoggleConfigScreen extends AbstractSimiScreen { } @Override - public boolean mouseDragged(double p_mouseDragged_1_, double p_mouseDragged_3_, int p_mouseDragged_5_, double p_mouseDragged_6_, double p_mouseDragged_8_) { + public boolean mouseDragged(double p_mouseDragged_1_, double p_mouseDragged_3_, int p_mouseDragged_5_, + double p_mouseDragged_6_, double p_mouseDragged_8_) { updateOffset(p_mouseDragged_1_, p_mouseDragged_3_); return true; @@ -71,6 +87,23 @@ public class GoggleConfigScreen extends AbstractSimiScreen { private void updateOffset(double windowX, double windowY) { offsetX = (int) (windowX - (this.width / 2)); offsetY = (int) (windowY - (this.height / 2)); + + int titleLinesCount = 1; + int tooltipTextWidth = 0; + for (ITextProperties textLine : tooltip) { + int textLineWidth = getMinecraft().fontRenderer.getWidth(textLine); + if (textLineWidth > tooltipTextWidth) + tooltipTextWidth = textLineWidth; + } + int tooltipHeight = 8; + if (tooltip.size() > 1) { + tooltipHeight += (tooltip.size() - 1) * 10; + if (tooltip.size() > titleLinesCount) + tooltipHeight += 2; // gap between title lines and next lines + } + + offsetX = MathHelper.clamp(offsetX, -(width / 2) - 5, (width / 2) - tooltipTextWidth - 20); + offsetY = MathHelper.clamp(offsetY, -(height / 2) + 17, (height / 2) - tooltipHeight + 5); } @Override @@ -79,11 +112,13 @@ public class GoggleConfigScreen extends AbstractSimiScreen { int posY = this.height / 2 + offsetY; renderTooltip(ms, tooltip, posX, posY); - //UIRenderHelper.breadcrumbArrow(ms, 50, 50, 100, 50, 20, 10, 0x80aa9999, 0x10aa9999); - //UIRenderHelper.breadcrumbArrow(ms, 100, 80, 0, -50, 20, -10, 0x80aa9999, 0x10aa9999); + // UIRenderHelper.breadcrumbArrow(ms, 50, 50, 100, 50, 20, 10, 0x80aa9999, 0x10aa9999); + // UIRenderHelper.breadcrumbArrow(ms, 100, 80, 0, -50, 20, -10, 0x80aa9999, 0x10aa9999); ItemStack item = AllItems.GOGGLES.asStack(); - GuiGameElement.of(item).at(posX + 10, posY - 16, 450).render(ms); - //GuiGameElement.of(item).at(0, 0, 450).render(ms); + GuiGameElement.of(item) + .at(posX + 10, posY - 16, 450) + .render(ms); + // GuiGameElement.of(item).at(0, 0, 450).render(ms); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index fe785c441..3293597ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -31,7 +31,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.ITextProperties; import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.Style; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; @@ -114,7 +116,8 @@ public class GoggleOverlayRenderer { int poles = 1; boolean pistonFound = false; for (Direction dir : directions) { - int attachedPoles = PistonExtensionPoleBlock.PlacementHelper.get().attachedPoles(world, pos, dir); + int attachedPoles = PistonExtensionPoleBlock.PlacementHelper.get() + .attachedPoles(world, pos, dir); poles += attachedPoles; pistonFound |= world.getBlockState(pos.offset(dir, attachedPoles + 1)) .getBlock() instanceof MechanicalPistonBlock; @@ -139,8 +142,28 @@ public class GoggleOverlayRenderer { .getScaledWidth(), mc.getWindow() .getScaledHeight()); + + int titleLinesCount = 1; + int tooltipTextWidth = 0; + for (ITextProperties textLine : tooltip) { + int textLineWidth = mc.fontRenderer.getWidth(textLine); + if (textLineWidth > tooltipTextWidth) + tooltipTextWidth = textLineWidth; + } + + int tooltipHeight = 8; + if (tooltip.size() > 1) { + tooltipHeight += (tooltip.size() - 1) * 10; + if (tooltip.size() > titleLinesCount) + tooltipHeight += 2; // gap between title lines and next lines + } + int posX = tooltipScreen.width / 2 + AllConfigs.CLIENT.overlayOffsetX.get(); int posY = tooltipScreen.height / 2 + AllConfigs.CLIENT.overlayOffsetY.get(); + + posX = Math.min(posX, tooltipScreen.width - tooltipTextWidth - 20); + posY = Math.min(posY, tooltipScreen.height - tooltipHeight - 20); + tooltipScreen.renderTooltip(ms, tooltip, posX, posY); ItemStack item = AllItems.GOGGLES.asStack(); From 976be3470fd48b51ce44fdd92f969c6ab69ef86c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 10 Apr 2021 18:23:42 +0200 Subject: [PATCH 04/16] Better address these, Part II - Fixed entities attempting to path-find through Creates' non-solids #1390 - Fixed Redstone Links occasionally wiping their frequency when moved in a Contraption - Fixed Flywheels doubling their SU capacity after every chunk reload - Fixed display of numeric formats using non-breaking space #1374 - Signs can now be moved on a contraption #1315 - Fixed Typo in german localization #1363 - Fixed Windmill Bearings keeping su information after relocation #1364 - Fixed Symmetry Wand using up too many items #1342 --- gradle.properties | 2 +- src/generated/resources/.cache/cache | 4 +- .../assets/create/lang/unfinished/de_de.json | 2 +- .../data/create/advancements/aesthetics.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 26 ++++--- .../com/simibubi/create/AllTileEntities.java | 3 +- src/main/java/com/simibubi/create/Create.java | 2 +- .../contraptions/base/KineticBlock.java | 2 - .../components/actors/AttachedActorBlock.java | 6 ++ .../components/actors/DrillBlock.java | 6 ++ .../components/actors/HarvesterBlock.java | 1 + .../components/actors/SeatBlock.java | 6 ++ .../components/clock/CuckooClockBlock.java | 6 ++ .../components/crank/HandCrankBlock.java | 6 ++ .../components/crank/ValveHandleBlock.java | 3 +- .../crusher/CrushingWheelControllerBlock.java | 6 ++ .../components/deployer/DeployerBlock.java | 6 ++ .../components/fan/EncasedFanTileEntity.java | 2 +- .../components/fan/NozzleBlock.java | 6 ++ .../flywheel/FlywheelTileEntity.java | 2 +- .../components/millstone/MillstoneBlock.java | 6 ++ .../mixer/MechanicalMixerBlock.java | 6 ++ .../components/motor/CreativeMotorBlock.java | 7 ++ .../press/MechanicalPressBlock.java | 6 ++ .../contraptions/components/saw/SawBlock.java | 6 ++ .../BlockMovementTraits.java | 9 +++ .../bearing/MechanicalBearingTileEntity.java | 5 ++ .../structureMovement/bearing/SailBlock.java | 6 ++ .../bearing/WindmillBearingTileEntity.java | 5 +- .../mounted/CartAssemblerBlock.java | 61 ++------------- .../piston/MechanicalPistonHeadBlock.java | 6 ++ .../piston/PistonExtensionPoleBlock.java | 6 ++ .../structureMovement/pulley/PulleyBlock.java | 6 ++ .../components/turntable/TurntableBlock.java | 6 ++ .../contraptions/fluids/PumpBlock.java | 6 ++ .../fluids/actors/ItemDrainBlock.java | 6 ++ .../fluids/actors/SpoutBlock.java | 6 ++ .../fluids/pipes/FluidPipeBlock.java | 7 ++ .../fluids/pipes/FluidValveBlock.java | 6 ++ .../fluids/pipes/GlassFluidPipeBlock.java | 7 ++ .../fluids/pipes/SmartFluidPipeBlock.java | 6 ++ .../goggles/GoggleOverlayRenderer.java | 1 - .../goggles/IHaveGoggleInformation.java | 2 +- .../contraptions/processing/BasinBlock.java | 6 ++ .../processing/burner/BlazeBurnerBlock.java | 7 ++ .../burner/LitBlazeBurnerBlock.java | 6 ++ .../relays/advanced/GantryShaftBlock.java | 6 ++ .../contraptions/relays/belt/BeltBlock.java | 6 ++ .../relays/elementary/AbstractShaftBlock.java | 14 +++- .../contraptions/relays/gauge/GaugeBlock.java | 74 +++++++++++-------- .../symmetry/SymmetryWandItem.java | 16 ++-- .../logistics/block/chute/ChuteBlock.java | 6 ++ .../logistics/block/depot/DepotBlock.java | 6 ++ .../logistics/block/depot/EjectorBlock.java | 6 ++ .../block/funnel/AbstractFunnelBlock.java | 6 ++ .../block/inventories/CrateBlock.java | 6 ++ .../block/redstone/AnalogLeverBlock.java | 6 ++ .../block/redstone/NixieTubeBlock.java | 6 ++ .../block/redstone/RedstoneLinkBlock.java | 10 ++- .../schematics/block/SchematicTableBlock.java | 6 ++ .../foundation/ponder/PonderRegistry.java | 9 ++- .../foundation/ponder/content/BeltScenes.java | 1 + .../ponder/content/KineticsScenes.java | 2 +- src/main/resources/META-INF/mods.toml | 2 +- .../resources/assets/create/lang/de_de.json | 2 +- 65 files changed, 367 insertions(+), 131 deletions(-) diff --git a/gradle.properties b/gradle.properties index b3f9ce737..cb210473c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false # mod version info -mod_version=0.3.1a +mod_version=0.3.1b minecraft_version=1.16.5 forge_version=36.0.42 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 037185b3f..511caf924 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -408,7 +408,7 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 768a724d6c921cb92790364cf7a692fe8742a885 assets/create/lang/en_ud.json 3060ba1eee371d642e0590c3d6e99c2be397c7f5 assets/create/lang/en_us.json -e30cf096df194568cec732e36dea067efa28468a assets/create/lang/unfinished/de_de.json +e3b0bc11cc7b208d248ad339caeebf91aa51a5ef assets/create/lang/unfinished/de_de.json 3b3e7b694b75ab50acfe911935f80da0b3234010 assets/create/lang/unfinished/es_es.json 20d7a808b485b9140bce1c4c483c7fc2218a0611 assets/create/lang/unfinished/es_mx.json 1e9f530d590556eac0c4d08750d3ebbd83b504f2 assets/create/lang/unfinished/fr_fr.json @@ -1649,7 +1649,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index a8e495da1..5ae626464 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -57,7 +57,7 @@ "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", "block.create.content_observer": "Inhaltsbeobachter", - "block.create.controller_rail": "Steureungsschiene", + "block.create.controller_rail": "Steuerungsschiene", "block.create.copper_block": "Kupfer Block", "block.create.copper_casing": "Kupferrahmen", "block.create.copper_ore": "Kupfererz", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index d723cbe38..59a86f429 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:cogwheel", - "create:large_cogwheel" + "create:large_cogwheel", + "create:cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 62fec60ab..e5de33659 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -9,6 +9,8 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel; +import java.util.Vector; + import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.AllSections; @@ -600,22 +602,22 @@ public class AllBlocks { .transform(BuilderTransformers.valveHandle(null)) .register(); - public static final BlockEntry[] DYED_VALVE_HANDLES = new BlockEntry[DyeColor.values().length]; + public static final Vector> DYED_VALVE_HANDLES = + new Vector<>(DyeColor.values().length); static { for (DyeColor colour : DyeColor.values()) { String colourName = colour.getString(); - DYED_VALVE_HANDLES[colour.ordinal()] = - REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) - .transform(BuilderTransformers.valveHandle(colour)) - .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getTagOfDye(colour)) - .key('-', AllItemTags.VALVE_HANDLES.tag) - .addCriterion("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) - .register(); + DYED_VALVE_HANDLES.add(REGISTRATE.block(colourName + "_valve_handle", ValveHandleBlock::dyed) + .transform(BuilderTransformers.valveHandle(colour)) + .recipe((c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getTagOfDye(colour)) + .key('-', AllItemTags.VALVE_HANDLES.tag) + .addCriterion("has_valve", RegistrateRecipeProvider.hasItem(AllItemTags.VALVE_HANDLES.tag)) + .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_valve_handle"))) + .register()); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index be2086c82..33476b929 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -154,6 +154,7 @@ import com.simibubi.create.content.schematics.block.SchematicannonInstance; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.TileEntityEntry; public class AllTileEntities { @@ -245,7 +246,7 @@ public class AllTileEntities { .tileEntity("hand_crank", HandCrankTileEntity::new) .instance(() -> HandCrankInstance::new) .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) - .validBlocks(AllBlocks.DYED_VALVE_HANDLES) + .validBlocks(AllBlocks.DYED_VALVE_HANDLES.toArray(new BlockEntry[AllBlocks.DYED_VALVE_HANDLES.size()])) .renderer(() -> HandCrankRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 213768e90..8d7e91f5f 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -55,7 +55,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.3.1a"; + public static final String VERSION = "0.3.1b"; public static Logger logger = LogManager.getLogger(); public static ItemGroup baseCreativeTab = new CreateItemGroup(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java index 8b28d9cce..864737fae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.item.ItemDescription.Palette; -import com.simibubi.create.foundation.utility.Debug; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -11,7 +10,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java index d9200bca5..c9ea4bac8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/AttachedActorBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.HorizontalBlock; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.StateContainer.Builder; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -69,4 +70,9 @@ public abstract class AttachedActorBlock extends HorizontalBlock implements IWre return getDefaultState().with(HORIZONTAL_FACING, facing); } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java index ced7a4f2f..b7c9d029a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillBlock.java @@ -13,6 +13,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; @@ -88,6 +89,11 @@ public class DrillBlock extends DirectionalKineticBlock implements ITE getTileEntityClass() { return DrillTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } public static double getDamage(float speed) { float speedAbs = Math.abs(speed); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java index 68a6b5ad8..8f6182917 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterBlock.java @@ -21,4 +21,5 @@ public class HarvesterBlock extends AttachedActorBlock { public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new HarvesterTileEntity(AllTileEntities.HARVESTER.get()); } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index 2219e390b..3cccce364 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -21,6 +21,7 @@ import net.minecraft.item.DyeColor; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.pathfinding.PathNodeType; +import net.minecraft.pathfinding.PathType; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.NonNullList; @@ -143,4 +144,9 @@ public class SeatBlock extends Block { entity.startRiding(seat, true); } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java index 960b20d2a..3b179fc49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockBlock.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -75,5 +76,10 @@ public class CuckooClockBlock extends HorizontalKineticBlock { public Axis getRotationAxis(BlockState state) { return state.get(HORIZONTAL_FACING).getAxis(); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index 511be5565..459842898 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -116,5 +117,10 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE getTileEntityClass() { return HandCrankTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index e622237db..bca18a69a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -48,7 +48,8 @@ public class ValveHandleBlock extends HandCrankBlock { if (worldIn.isRemote) return ActionResultType.SUCCESS; - BlockState newState = AllBlocks.DYED_VALVE_HANDLES[color.ordinal()].getDefaultState() + BlockState newState = AllBlocks.DYED_VALVE_HANDLES.get(color.ordinal()) + .getDefaultState() .with(FACING, state.get(FACING)); if (newState != state) worldIn.setBlockState(pos, newState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java index 0b931c8f5..e1175feba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -20,6 +20,7 @@ import net.minecraft.item.BlockItemUseContext; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.particles.ParticleTypes; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; @@ -201,5 +202,10 @@ public class CrushingWheelControllerBlock extends DirectionalBlock public Class getTileEntityClass() { return CrushingWheelControllerTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java index f7d42fdef..43d4d656b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerBlock.java @@ -17,6 +17,7 @@ import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; @@ -120,5 +121,10 @@ public class DeployerBlock extends DirectionalAxisKineticBlock implements ITE getTileEntityClass() { return MillstoneTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java index 93214c68e..1d20436b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -71,5 +72,10 @@ public class MechanicalMixerBlock extends KineticBlock implements ITE getTileEntityClass() { return MechanicalMixerTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java index f150e692a..7239a505e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -57,4 +58,10 @@ public class CreativeMotorBlock extends DirectionalKineticBlock { public boolean hideStressImpact() { return true; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java index 25eb3eb20..8de328a78 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -65,5 +66,10 @@ public class MechanicalPressBlock extends HorizontalKineticBlock implements ITE< public Class getTileEntityClass() { return MechanicalPressTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java index d35b6e79b..a4458acd7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java @@ -17,6 +17,7 @@ import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; @@ -120,5 +121,10 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE getTileEntityClass() { return SawTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index 3b1af157c..9edac0058 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -26,6 +26,7 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import net.minecraft.block.AbstractPressurePlateBlock; import net.minecraft.block.AbstractRailBlock; +import net.minecraft.block.AbstractSignBlock; import net.minecraft.block.BellBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -40,7 +41,9 @@ import net.minecraft.block.LadderBlock; import net.minecraft.block.RedstoneDiodeBlock; import net.minecraft.block.RedstoneWallTorchBlock; import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.block.StandingSignBlock; import net.minecraft.block.TorchBlock; +import net.minecraft.block.WallSignBlock; import net.minecraft.block.WallTorchBlock; import net.minecraft.block.material.PushReaction; import net.minecraft.state.properties.AttachFace; @@ -116,6 +119,8 @@ public class BlockMovementTraits { return true; if (block instanceof TorchBlock) return true; + if (block instanceof AbstractSignBlock) + return true; if (block instanceof AbstractPressurePlateBlock) return true; if (block instanceof HorizontalFaceBlock && !(block instanceof GrindstoneBlock)) @@ -143,6 +148,10 @@ public class BlockMovementTraits { return state.get(LadderBlock.FACING) == direction.getOpposite(); if (block instanceof WallTorchBlock) return state.get(WallTorchBlock.HORIZONTAL_FACING) == direction.getOpposite(); + if (block instanceof WallSignBlock) + return state.get(WallSignBlock.FACING) == direction.getOpposite(); + if (block instanceof StandingSignBlock) + return direction == Direction.DOWN; if (block instanceof AbstractPressurePlateBlock) return direction == Direction.DOWN; if (block instanceof DoorBlock) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 9e9d0ff1b..239880bc0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -75,6 +75,11 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity @Override protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { + if (wasMoved) { + super.fromTag(state, compound, clientPacket); + return; + } + float angleBefore = angle; running = compound.getBoolean("Running"); angle = compound.getFloat("Angle"); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index ddc70ae1c..73e80c2e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -28,6 +28,7 @@ import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; import net.minecraft.item.ShearsItem; +import net.minecraft.pathfinding.PathType; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -195,6 +196,11 @@ public class SailBlock extends ProperDirectionalBlock { } } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } @MethodsReturnNonnullByDefault private static class PlacementHelper implements IPlacementHelper { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java index 38ecf2346..ccd717284 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java @@ -27,7 +27,7 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { super.updateGeneratedRotation(); lastGeneratedSpeed = getGeneratedSpeed(); } - + @Override public void onSpeedChanged(float prevSpeed) { boolean cancelAssembly = assembleNextTick; @@ -63,7 +63,8 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { @Override protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { - lastGeneratedSpeed = compound.getFloat("LastGenerated"); + if (!wasMoved) + lastGeneratedSpeed = compound.getFloat("LastGenerated"); super.fromTag(state, compound, clientPacket); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index 2c0cdaf93..09c2653a2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -42,6 +42,7 @@ import net.minecraft.item.ItemUseContext; import net.minecraft.loot.LootContext; import net.minecraft.loot.LootParameters; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.Property; @@ -137,54 +138,6 @@ public class CartAssemblerBlock extends AbstractRailBlock return; withTileEntityDo(world, pos, te -> { - /* - } -<<<<<<< HEAD - if (te.isMinecartUpdateValid()) { - switch (state.get(RAIL_TYPE)) { - case POWERED_RAIL: - if (state.get(POWERED)) { - assemble(world, pos, cart); - Direction facing = cart.getAdjustedHorizontalFacing(); - float speed = getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, - facing.getZOffset() * speed); - } else { - disassemble(world, pos, cart); - Vector3d diff = VecHelper.getCenterOf(pos) - .subtract(cart.getPositionVec()); - cart.setMotion(diff.x / 16f, 0, diff.z / 16f); - } - break; - case REGULAR: - if (state.get(POWERED)) { - assemble(world, pos, cart); - } else { - disassemble(world, pos, cart); - } - break; - case ACTIVATOR_RAIL: - if (state.get(POWERED)) { - disassemble(world, pos, cart); - } - break; - case DETECTOR_RAIL: - if (cart.getPassengers() - .isEmpty()) { - assemble(world, pos, cart); - Direction facing = cart.getAdjustedHorizontalFacing(); - float speed = getRailMaxSpeed(state, world, pos, cart); - cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, - facing.getZOffset() * speed); - } else { - disassemble(world, pos, cart); - } - break; - default: - break; - } - te.resetTicksSinceMinecartUpdate(); -=======*/ if (!te.isMinecartUpdateValid()) return; @@ -458,13 +411,6 @@ public class CartAssemblerBlock extends AbstractRailBlock return PushReaction.BLOCK; } - /* FIXME: Is there a 1.16 equivalent to be used? Or is this just removed? - @Override - public boolean isNormalCube(@Nonnull BlockState state, @Nonnull IBlockReader worldIn, @Nonnull BlockPos pos) { - return false; - } - */ - @Override public Class getTileEntityClass() { return CartAssemblerTileEntity.class; @@ -542,6 +488,11 @@ public class CartAssemblerBlock extends AbstractRailBlock } } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { World world = context.getWorld(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java index 6d3b1d754..fe9c50d8a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonHeadBlock.java @@ -16,6 +16,7 @@ import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; @@ -111,4 +112,9 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements FluidState FluidState = context.getWorld().getFluidState(context.getPos()); return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(FluidState.getFluid() == Fluids.WATER)); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index 06e2f6137..decf128f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -26,6 +26,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.ActionResultType; @@ -146,6 +147,11 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements } return state; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } @MethodsReturnNonnullByDefault public static class PlacementHelper extends PoleHelper { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java index 0152848b4..2aa7b6d13 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyBlock.java @@ -15,6 +15,7 @@ import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; @@ -97,6 +98,11 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE getTileEntityClass() { return TurntableTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java index e01220fb0..6dd88516a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpBlock.java @@ -17,6 +17,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemUseContext; import net.minecraft.network.DebugPacketSender; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; @@ -173,4 +174,9 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable world.removeTileEntity(pos); } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index 389d49fca..b91ade7c4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -13,6 +13,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -109,5 +110,10 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE tooltip, boolean isPlayerSneaking, LazyOptional handler) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index efe51f549..3b42e8a32 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -23,6 +23,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.item.Items; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; @@ -217,4 +218,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab return false; } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java index 7d18a7709..ddd630313 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java @@ -29,6 +29,7 @@ import net.minecraft.loot.LootPool; import net.minecraft.loot.LootTable; import net.minecraft.loot.conditions.BlockStateProperty; import net.minecraft.loot.conditions.ILootCondition.IBuilder; +import net.minecraft.pathfinding.PathType; import net.minecraft.loot.conditions.SurvivesExplosion; import net.minecraft.state.EnumProperty; import net.minecraft.state.Property; @@ -255,4 +256,10 @@ public class BlazeBurnerBlock extends Block implements ITE= heatLevel.ordinal(); } } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java index ee1e315ef..cfe315f79 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java @@ -11,6 +11,7 @@ import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; +import net.minecraft.pathfinding.PathType; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; @@ -114,5 +115,10 @@ public class LitBlazeBurnerBlock extends Block { return AllBlocks.BLAZE_BURNER.get() .getCollisionShape(state, reader, pos, context); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index 41a62efb3..9592b9d02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -24,6 +24,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.Property; @@ -269,6 +270,11 @@ public class GantryShaftBlock extends DirectionalKineticBlock { public float getParticleInitialRadius() { return .25f; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } public static class PlacementHelper extends PoleHelper { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index fca461c3c..35a1844b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -38,6 +38,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.loot.LootParameters; import net.minecraft.pathfinding.PathNodeType; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.Property; @@ -597,5 +598,10 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE Block.spawnAsEntity(world, pos, stack)); super.onReplaced(state, world, pos, newState, isMoving); } - + // IRotate: @Override @@ -112,4 +114,10 @@ public abstract class AbstractShaftBlock extends RotatedPillarKineticBlock imple return Optional.empty(); return Optional.of(new ItemStack(bracket.getBlock())); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java index 1e39fa783..7278da542 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java @@ -15,6 +15,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -45,11 +46,11 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { public static GaugeBlock speed(Properties properties) { return new GaugeBlock(properties, Type.SPEED); } - + public static GaugeBlock stress(Properties properties) { return new GaugeBlock(properties, Type.STRESS); } - + protected GaugeBlock(Properties properties, Type type) { super(properties); this.type = type; @@ -67,18 +68,24 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { } } - /* FIXME: Is there a new way of doing this in 1.16? Or cn we just delete it? - @SuppressWarnings("deprecation") - @Override - public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) { - return Blocks.SPRUCE_PLANKS.getMaterialColor(state, worldIn, pos); - } */ + /* + * FIXME: Is there a new way of doing this in 1.16? Or cn we just delete it? + * + * @SuppressWarnings("deprecation") + * + * @Override + * public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) { + * return Blocks.SPRUCE_PLANKS.getMaterialColor(state, worldIn, pos); + * } + */ @Override public BlockState getStateForPlacement(BlockItemUseContext context) { World world = context.getWorld(); Direction face = context.getFace(); - BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite()); + BlockPos placedOnPos = context.getPos() + .offset(context.getFace() + .getOpposite()); BlockState placedOnState = world.getBlockState(placedOnPos); Block block = placedOnState.getBlock(); @@ -88,17 +95,14 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { Direction nearestLookingDirection = context.getNearestLookingDirection(); boolean lookPositive = nearestLookingDirection.getAxisDirection() == AxisDirection.POSITIVE; if (face.getAxis() == Axis.X) { - toPlace = toPlace - .with(FACING, lookPositive ? Direction.NORTH : Direction.SOUTH) - .with(AXIS_ALONG_FIRST_COORDINATE, true); + toPlace = toPlace.with(FACING, lookPositive ? Direction.NORTH : Direction.SOUTH) + .with(AXIS_ALONG_FIRST_COORDINATE, true); } else if (face.getAxis() == Axis.Y) { - toPlace = toPlace - .with(FACING, horizontalFacing.getOpposite()) - .with(AXIS_ALONG_FIRST_COORDINATE, horizontalFacing.getAxis() == Axis.X); + toPlace = toPlace.with(FACING, horizontalFacing.getOpposite()) + .with(AXIS_ALONG_FIRST_COORDINATE, horizontalFacing.getAxis() == Axis.X); } else { - toPlace = toPlace - .with(FACING, lookPositive ? Direction.WEST : Direction.EAST) - .with(AXIS_ALONG_FIRST_COORDINATE, false); + toPlace = toPlace.with(FACING, lookPositive ? Direction.WEST : Direction.EAST) + .with(AXIS_ALONG_FIRST_COORDINATE, false); } return toPlace; @@ -114,20 +118,22 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { @Override protected boolean getAxisAlignmentForPlacement(BlockItemUseContext context) { - return context.getPlacementHorizontalFacing().getAxis() != Axis.X; + return context.getPlacementHorizontalFacing() + .getAxis() != Axis.X; } public boolean shouldRenderHeadOnFace(World world, BlockPos pos, BlockState state, Direction face) { - if (face.getAxis().isVertical()) + if (face.getAxis() + .isVertical()) return false; - if (face == state.get(FACING).getOpposite()) + if (face == state.get(FACING) + .getOpposite()) return false; if (face.getAxis() == getRotationAxis(state)) return false; if (getRotationAxis(state) == Axis.Y && face != state.get(FACING)) return false; - if (!Block.shouldSideBeRendered(state, world, pos, face) - && !(world instanceof WrappedWorld)) + if (!Block.shouldSideBeRendered(state, world, pos, face) && !(world instanceof WrappedWorld)) return false; return true; } @@ -156,15 +162,15 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { continue; for (int i = 0; i < particleCount; i++) { - Vector3d mul = VecHelper - .offsetRandomly(Vector3d.ZERO, rand, .25f) - .mul(new Vector3d(1, 1, 1).subtract(positiveFaceVec)) - .normalize() - .scale(.3f); - Vector3d offset = VecHelper.getCenterOf(pos).add(faceVec.scale(.55)).add(mul); - worldIn - .addParticle(new RedstoneParticleData((float) rgb.x, (float) rgb.y, (float) rgb.z, 1), offset.x, - offset.y, offset.z, mul.x, mul.y, mul.z); + Vector3d mul = VecHelper.offsetRandomly(Vector3d.ZERO, rand, .25f) + .mul(new Vector3d(1, 1, 1).subtract(positiveFaceVec)) + .normalize() + .scale(.3f); + Vector3d offset = VecHelper.getCenterOf(pos) + .add(faceVec.scale(.55)) + .add(mul); + worldIn.addParticle(new RedstoneParticleData((float) rgb.x, (float) rgb.y, (float) rgb.z, 1), offset.x, + offset.y, offset.z, mul.x, mul.y, mul.z); } } @@ -191,4 +197,8 @@ public class GaugeBlock extends DirectionalAxisKineticBlock { return 0; } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index acd103510..fb23177aa 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -20,6 +20,7 @@ import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.item.BlockItem; @@ -172,8 +173,8 @@ public class SymmetryWandItem extends Item { public static boolean isEnabled(ItemStack stack) { checkNBT(stack); - return stack.getTag() - .getBoolean(ENABLE); + CompoundNBT tag = stack.getTag(); + return tag.getBoolean(ENABLE) && !tag.getBoolean("Simulate"); } public static SymmetryMirror getMirror(ItemStack stack) { @@ -235,11 +236,16 @@ public class SymmetryWandItem extends Item { FluidState ifluidstate = world.getFluidState(position); world.setBlockState(position, ifluidstate.getBlockState(), BlockFlags.UPDATE_NEIGHBORS); world.setBlockState(position, blockState); - if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { + + CompoundNBT wandNbt = wand.getOrCreateTag(); + wandNbt.putBoolean("Simulate", true); + boolean placeInterrupted = ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP); + wandNbt.putBoolean("Simulate", false); + + if (placeInterrupted) { blocksnapshot.restore(true, false); continue; } - targets.add(position); } } @@ -286,7 +292,7 @@ public class SymmetryWandItem extends Item { continue; BlockState blockstate = world.getBlockState(position); - if (!blockstate.isAir(world, position)) { + if (blockstate.getMaterial() != Material.AIR) { targets.add(position); world.playEvent(2001, position, Block.getStateId(blockstate)); world.setBlockState(position, air, 3); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java index e7ded87ac..9926f4ba4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.DirectionProperty; import net.minecraft.state.EnumProperty; import net.minecraft.state.Property; @@ -145,5 +146,10 @@ public class ChuteBlock extends AbstractChuteBlock { return state.with(SHAPE, Shape.NORMAL); return state.with(SHAPE, Shape.INTERSECTION); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java index 6b341c902..b9852efb9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; @@ -77,5 +78,10 @@ public class DepotBlock extends Block implements ITE, IWrenchab public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { return SharedDepotBlockMethods.getComparatorInputOverride(blockState, worldIn, pos); } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java index 8447b25a8..fcdc894a7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java @@ -17,6 +17,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.pathfinding.PathType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; @@ -159,5 +160,10 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE builder) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java index 175e0e80d..0cc52ac21 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CrateBlock.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.util.Direction; @@ -33,6 +34,11 @@ public class CrateBlock extends ProperDirectionalBlock implements IWrenchable { return AllShapes.CRATE_BLOCK_SHAPE; } + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } + @Override public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java index 0daa7cef2..3d018cb61 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverBlock.java @@ -11,6 +11,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.HorizontalFaceBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; @@ -136,5 +137,10 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE getTileEntityClass() { return AnalogLeverTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java index 4cb3ea694..3aa3d7d04 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java @@ -12,6 +12,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; @@ -158,6 +159,11 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE getTileEntityClass() { return RedstoneLinkTileEntity.class; diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java index 15fc62543..1640a46b0 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableBlock.java @@ -12,6 +12,7 @@ import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.pathfinding.PathType; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; @@ -91,5 +92,10 @@ public class SchematicTableBlock extends HorizontalBlock implements ITE getTileEntityClass() { return SchematicTableTileEntity.class; } + + @Override + public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index f349f080b..412eb6ae8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -65,6 +64,10 @@ public class PonderRegistry { public static MultiSceneBuilder forComponents(ItemProviderEntry... components) { return new MultiSceneBuilder(Arrays.asList(components)); } + + public static MultiSceneBuilder forComponents(Iterable> components) { + return new MultiSceneBuilder(components); + } public static List compile(ResourceLocation id) { return compile(all.get(id)); @@ -136,9 +139,9 @@ public class PonderRegistry { public static class MultiSceneBuilder { - private final Collection> components; + private final Iterable> components; - MultiSceneBuilder(Collection> components) { + MultiSceneBuilder(Iterable> components) { this.components = components; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java index 0a5f454b9..dbaeb1718 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -45,6 +45,7 @@ public class BeltScenes { scene.title("belt_connector", "Using Mechanical Belts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); + scene.world.showSection(util.select.position(3, 0, 5), Direction.UP); scene.idle(5); scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 8177eb9b3..3bc0ccf90 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -631,7 +631,7 @@ public class KineticsScenes { scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.BLUE_DYE)), 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES[11].getDefaultState() + scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES.get(11).getDefaultState() .with(ValveHandleBlock.FACING, Direction.UP), true); scene.idle(10); scene.overlay.showText(70) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 5c2d1bfe9..4a93dd067 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -22,6 +22,6 @@ Technology that empowers the player.''' [[dependencies.create]] modId="minecraft" mandatory=true - versionRange="[1.16.3,1.17)" + versionRange="[1.16.4,1.17)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/create/lang/de_de.json b/src/main/resources/assets/create/lang/de_de.json index 7ed344946..4b4f99959 100644 --- a/src/main/resources/assets/create/lang/de_de.json +++ b/src/main/resources/assets/create/lang/de_de.json @@ -55,7 +55,7 @@ "block.create.clutch": "Kupplung", "block.create.cogwheel": "Zahnrad", "block.create.content_observer": "Inhaltsbeobachter", - "block.create.controller_rail": "Steureungsschiene", + "block.create.controller_rail": "Steuerungsschiene", "block.create.copper_block": "Kupfer Block", "block.create.copper_casing": "Kupferrahmen", "block.create.copper_ore": "Kupfererz", From d249318b808d17912cd1ecd11b22d6365e3e49a4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 11 Apr 2021 02:56:11 +0200 Subject: [PATCH 05/16] Pose stack says no - TileEntities not appreciative of wrapped worlds are now much less likely to cause a hard crash --- .../render/TileEntityRenderHelper.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 2e22b22e4..efbf65cff 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -54,19 +54,17 @@ public class TileEntityRenderHelper { continue; } - try { - BlockPos pos = tileEntity.getPos(); - ms.push(); - MatrixStacker.of(ms) - .translate(pos); + BlockPos pos = tileEntity.getPos(); + ms.push(); + MatrixStacker.of(ms) + .translate(pos); + try { Vector4f vec = new Vector4f(pos.getX() + .5f, pos.getY() + .5f, pos.getZ() + .5f, 1); vec.transform(matrix); BlockPos lightPos = new BlockPos(vec.getX(), vec.getY(), vec.getZ()); int worldLight = ContraptionRenderDispatcher.getLightOnContraption(world, renderWorld, pos, lightPos); - renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.DEFAULT_UV); - ms.pop(); } catch (Exception e) { iterator.remove(); @@ -74,14 +72,13 @@ public class TileEntityRenderHelper { String message = "TileEntity " + tileEntity.getType() .getRegistryName() .toString() + " didn't want to render while moved.\n"; - if (AllConfigs.CLIENT.explainRenderErrors.get()) { + if (AllConfigs.CLIENT.explainRenderErrors.get()) Create.logger.error(message, e); - continue; - } - - Create.logger.error(message); - continue; + else + Create.logger.error(message); } + + ms.pop(); } } From e92e9a7139bb8a3b144f8683fca8435d08cb5ac7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 11 Apr 2021 15:24:58 +0200 Subject: [PATCH 06/16] Bad impression - Mechanical Press can no longer create sheets in bulk, unless configured to - Fixed Mechanical Press missing items passing on a belt while retracting --- .../press/BeltPressingCallbacks.java | 58 +++++++++++++------ .../press/MechanicalPressTileEntity.java | 32 +++++++++- .../create/foundation/config/CRecipes.java | 2 + 3 files changed, 70 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java index 56ef63878..825d3a9ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java @@ -7,18 +7,25 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; + +import net.minecraftforge.items.ItemHandlerHelper; public class BeltPressingCallbacks { static ProcessingResult onItemReceived(TransportedItemStack transported, TransportedItemStackHandlerBehaviour handler, MechanicalPressTileEntity press) { - if (press.getSpeed() == 0 || press.running) + if (press.getSpeed() == 0) return PASS; + if (press.running) + return HOLD; if (!press.getRecipe(transported.stack) .isPresent()) return PASS; @@ -44,25 +51,38 @@ public class BeltPressingCallbacks { if (!recipe.isPresent()) return PASS; - List collect = InWorldProcessing.applyRecipeOn(transported.stack, recipe.get()) - .stream() - .map(stack -> { - TransportedItemStack copy = transported.copy(); - copy.stack = stack; - return copy; - }).collect(Collectors.toList()); + boolean bulk = MechanicalPressTileEntity.canProcessInBulk() || transported.stack.getCount() == 1; + + List collect = InWorldProcessing + .applyRecipeOn(bulk ? transported.stack : ItemHandlerHelper.copyStackWithSize(transported.stack, 1), + recipe.get()) + .stream() + .map(stack -> { + TransportedItemStack copy = transported.copy(); + boolean centered = BeltHelper.isItemUpright(stack); + copy.stack = stack; + copy.locked = true; + copy.angle = centered ? 180 : Create.random.nextInt(360); + return copy; + }) + .collect(Collectors.toList()); + + if (bulk) { + if (collect.isEmpty()) + handler.handleProcessingOnItem(transported, TransportedResult.removeItem()); + else + handler.handleProcessingOnItem(transported, TransportedResult.convertTo(collect)); + + } else { + TransportedItemStack left = transported.copy(); + left.stack.shrink(1); + + if (collect.isEmpty()) + handler.handleProcessingOnItem(transported, TransportedResult.convertTo(left)); + else + handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(collect, left)); + } - if (collect.isEmpty()) - handler.handleProcessingOnItem(transported, TransportedItemStackHandlerBehaviour.TransportedResult.removeItem()); - else - handler.handleProcessingOnItem(transported, TransportedItemStackHandlerBehaviour.TransportedResult.convertTo(collect)); - /*ItemStack out = recipe.get() - .getRecipeOutput() - .copy(); - List multipliedOutput = ItemHelper.multipliedOutput(transported.stack, out); - if (multipliedOutput.isEmpty()) - transported.stack = ItemStack.EMPTY; - transported.stack = multipliedOutput.get(0);*/ pressTe.sendData(); return HOLD; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 8795ff509..8fba222f7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -7,6 +7,7 @@ import java.util.Optional; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.logistics.InWorldProcessing; @@ -39,6 +40,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; @@ -231,6 +233,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { protected void applyPressingInWorld() { AxisAlignedBB bb = new AxisAlignedBB(pos.down(1)); + boolean bulk = canProcessInBulk(); pressedItems.clear(); if (world.isRemote) return; @@ -240,16 +243,39 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (!entity.isAlive() || !entity.isOnGround()) continue; ItemEntity itemEntity = (ItemEntity) entity; - pressedItems.add(itemEntity.getItem()); + ItemStack item = itemEntity.getItem(); + pressedItems.add(item); sendData(); - Optional recipe = getRecipe(itemEntity.getItem()); + Optional recipe = getRecipe(item); if (!recipe.isPresent()) continue; - InWorldProcessing.applyRecipeOn(itemEntity, recipe.get()); + + if (bulk || item.getCount() == 1) { + InWorldProcessing.applyRecipeOn(itemEntity, recipe.get()); + } else { + for (ItemStack result : InWorldProcessing.applyRecipeOn(ItemHandlerHelper.copyStackWithSize(item, 1), + recipe.get())) { + ItemEntity created = + new ItemEntity(world, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), result); + created.setDefaultPickupDelay(); + created.setMotion(VecHelper.offsetRandomly(Vector3d.ZERO, Create.random, .05f)); + world.addEntity(created); + } + item.shrink(1); + } + AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, world, pos, 4); + entityScanCooldown = 0; + + if (!bulk) + break; } } + public static boolean canProcessInBulk() { + return AllConfigs.SERVER.recipes.bulkPressing.get(); + } + public int getRunningTickSpeed() { if (getSpeed() == 0) return 0; diff --git a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java index e042c4f85..eec2389e7 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java +++ b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.config; public class CRecipes extends ConfigBase { + public ConfigBool bulkPressing = b(false, "bulkPressing", Comments.bulkPressing); public ConfigBool allowShapelessInMixer = b(true, "allowShapelessInMixer", Comments.allowShapelessInMixer); public ConfigBool allowShapedSquareInPress = b(true, "allowShapedSquareInPress", Comments.allowShapedSquareInPress); public ConfigBool allowRegularCraftingInCrafter = @@ -20,6 +21,7 @@ public class CRecipes extends ConfigBase { } private static class Comments { + static String bulkPressing = "When true, allows the Mechanical Press to process entire stacks at a time."; static String allowShapelessInMixer = "When true, allows any shapeless crafting recipes to be processed by a Mechanical Mixer + Basin."; static String allowShapedSquareInPress = From 13f0823ccb1c14e71e10f6cf868a3a73fc683fd2 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 14 Apr 2021 23:40:42 +0200 Subject: [PATCH 07/16] Sound Registry Refactor - Improved registration and datagen for custom and combined sounds --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 20 +- .../assets/create/lang/unfinished/de_de.json | 12 +- .../assets/create/lang/unfinished/es_es.json | 12 +- .../assets/create/lang/unfinished/es_mx.json | 22 +- .../assets/create/lang/unfinished/fr_fr.json | 14 +- .../assets/create/lang/unfinished/it_it.json | 12 +- .../assets/create/lang/unfinished/ja_jp.json | 12 +- .../assets/create/lang/unfinished/ko_kr.json | 12 +- .../assets/create/lang/unfinished/nl_nl.json | 22 +- .../assets/create/lang/unfinished/pt_br.json | 22 +- .../assets/create/lang/unfinished/ru_ru.json | 12 +- .../assets/create/lang/unfinished/zh_cn.json | 12 +- .../assets/create/lang/unfinished/zh_tw.json | 12 +- .../resources/assets/create/sounds.json | 127 +++--- .../com/simibubi/create/AllSoundEvents.java | 384 ++++++++++++++---- src/main/java/com/simibubi/create/Create.java | 2 +- .../press/MechanicalPressTileEntity.java | 16 +- .../chassis/AbstractChassisBlock.java | 5 +- .../chassis/StickerTileEntity.java | 4 +- .../glue/SuperGlueEntity.java | 4 +- .../piston/MechanicalPistonBlock.java | 3 +- .../processing/burner/BlazeBurnerHandler.java | 3 +- .../zapper/ZapperInteractionHandler.java | 13 +- .../curiosities/zapper/ZapperItem.java | 4 +- .../zapper/ZapperRenderHandler.java | 23 +- .../block/SchematicannonTileEntity.java | 33 +- .../foundation/data/AllLangPartials.java | 2 + .../assets/create/lang/default/messages.json | 13 +- .../assets/create/sounds/creeperclock.ogg | Bin 17248 -> 0 bytes .../assets/create/sounds/pigclock.ogg | Bin 17404 -> 0 bytes 31 files changed, 541 insertions(+), 319 deletions(-) delete mode 100644 src/main/resources/assets/create/sounds/creeperclock.ogg delete mode 100644 src/main/resources/assets/create/sounds/pigclock.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 511caf924..57c600fff 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,19 +407,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 768a724d6c921cb92790364cf7a692fe8742a885 assets/create/lang/en_ud.json -3060ba1eee371d642e0590c3d6e99c2be397c7f5 assets/create/lang/en_us.json -e3b0bc11cc7b208d248ad339caeebf91aa51a5ef assets/create/lang/unfinished/de_de.json -3b3e7b694b75ab50acfe911935f80da0b3234010 assets/create/lang/unfinished/es_es.json -20d7a808b485b9140bce1c4c483c7fc2218a0611 assets/create/lang/unfinished/es_mx.json -1e9f530d590556eac0c4d08750d3ebbd83b504f2 assets/create/lang/unfinished/fr_fr.json -a604e3bf8d1b28d4f77cd4fb5b63f5d58988a507 assets/create/lang/unfinished/it_it.json -371ef25dcdbd268d1f96d19ccd56413c93425ced assets/create/lang/unfinished/ja_jp.json -7206826ff926de6a04145a17928c00ea28762404 assets/create/lang/unfinished/ko_kr.json -411d5197f3b5eb75ef7033685fb24df1c02a959f assets/create/lang/unfinished/nl_nl.json -59756083e6d04f649e860fed9b13657fa12f919b assets/create/lang/unfinished/pt_br.json -efae854418421a1ce80494d1da800e778f17afe8 assets/create/lang/unfinished/ru_ru.json -58fb522692bf7b15d8fb851f0a807fab04620d45 assets/create/lang/unfinished/zh_cn.json -1e2f8564c19f2fe35ce91e65831b72ab44bedea1 assets/create/lang/unfinished/zh_tw.json +5f5c7ddeea65263977262ae9eef8284a27b342ed assets/create/lang/en_us.json +784fce1f5ae7d571449e8c2645aedca2ae54017d assets/create/lang/unfinished/de_de.json +72dc91f3968daa908451a91514573fa081ba1011 assets/create/lang/unfinished/es_es.json +e7f818f6250f6a9bcb68d29e3c4a42f4d97d191f assets/create/lang/unfinished/es_mx.json +a3c830d49cb7fbc3942c316859ffe46304dcbb07 assets/create/lang/unfinished/fr_fr.json +8263ba5d778e8d8a3255319ab08cee080930345d assets/create/lang/unfinished/it_it.json +76d31adf175b248b9a4b63d7b02005155a0e961f assets/create/lang/unfinished/ja_jp.json +78fc9b2f5695019465930da7b3d20b519d53d128 assets/create/lang/unfinished/ko_kr.json +c3d24b55cf0f6a4a3ff673e3a07872f055a8747a assets/create/lang/unfinished/nl_nl.json +dee268b4a8c1aace69527b8064b40590a8c63165 assets/create/lang/unfinished/pt_br.json +651af36f14adb7851c1a78551bd6631847893b8c assets/create/lang/unfinished/ru_ru.json +67dde4056c63b166a48bd9b6dec95ef42d28f826 assets/create/lang/unfinished/zh_cn.json +1f3e13923f4d9285b14d494576a10589fe2f3c6d assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json +56fa207f8d0d76e0435252d13dbe4b967c61aa89 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 518dafa17..d1b3fbc05 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1147,16 +1147,18 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", - "create.subtitle.schematicannon_finish": "Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "Schematicannon fires", + "create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.slime_added": "Slime squishes", - "create.subtitle.mechanical_press_activation": "Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "Metal clanks", - "create.subtitle.blockzapper_place": "Blocks zap into place", - "create.subtitle.blockzapper_confirm": "Affirmative Ding", - "create.subtitle.blockzapper_deny": "Declining Boop", - "create.subtitle.block_funnel_eat": "Funnel CHOMPS", - "create.subtitle.blaze_munch": "Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "Declining boop", + "create.subtitle.blockzapper_confirm": "Affirmative ding", + "create.subtitle.blockzapper_place": "Blockzapper zaps", + "create.subtitle.blaze_munch": "Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 5ae626464..95a8d3798 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 912", + "_": "Missing Localizations: 913", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: Benutze /killtps start um den Server Tick künstlich zu verlangsamen", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", - "create.subtitle.mechanical_press_item_break": "Metall klonkt", - "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", - "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", "create.subtitle.blockzapper_deny": "Ablehnendes Boop", - "create.subtitle.block_funnel_eat": "Trichter MAMPFT", + "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", + "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", "create.subtitle.blaze_munch": "Lohe kaut glücklich", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index bc5243a6f..7e7cb004f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 605", + "_": "Missing Localizations: 606", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", - "create.subtitle.mechanical_press_item_break": "Clanks de metal", - "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", - "create.subtitle.blockzapper_confirm": "Ding afirmativo", "create.subtitle.blockzapper_deny": "Boop declinante", - "create.subtitle.block_funnel_eat": "CHOMPS del embudo", + "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", "create.subtitle.blaze_munch": "Blaze mastica felizmente", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 3762a7784..4b84a79b7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1265", + "_": "Missing Localizations: 1264", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 5483fc944..a32f5fc41 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1162", + "_": "Missing Localizations: 1163", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", - "create.subtitle.mechanical_press_item_break": "Cliquetis de métal", - "create.subtitle.blockzapper_place": "Blocs se zappant en place", - "create.subtitle.blockzapper_confirm": "Ding d'affirmation", "create.subtitle.blockzapper_deny": "Boop de déclin", - "create.subtitle.block_funnel_eat": "Croc d'entonoir", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.blockzapper_place": "Blocs se zappant en place", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index eb2b66aa9..513a746b0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 622", + "_": "Missing Localizations: 623", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps avvia per rallentare artificialmente il tick del server", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", - "create.subtitle.mechanical_press_item_break": "Rumori metallici", - "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", - "create.subtitle.blockzapper_confirm": "Ding affermativo", "create.subtitle.blockzapper_deny": "Boop in calo", - "create.subtitle.block_funnel_eat": "CHOMPS a imbuto", + "create.subtitle.blockzapper_confirm": "Ding affermativo", + "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 6d72dd15e..cf30a6689 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 604", + "_": "Missing Localizations: 605", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: /killtps start を使用して、サーバーのティックを意図的に遅くします", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", - "create.subtitle.mechanical_press_item_break": "金属がガチャンと鳴る", - "create.subtitle.blockzapper_place": "ブロックを発射して設置する", - "create.subtitle.blockzapper_confirm": "成功音", "create.subtitle.blockzapper_deny": "失敗音", - "create.subtitle.block_funnel_eat": "ファンネルが大口で食べる", + "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.blockzapper_place": "ブロックを発射して設置する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index eaf34157c..0a6b50b23 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 675", + "_": "Missing Localizations: 676", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.mechanical_press_item_break": "금속이 부딫힘", - "create.subtitle.blockzapper_place": "블록이 순간이동됨", - "create.subtitle.blockzapper_confirm": "확인 효과음", "create.subtitle.blockzapper_deny": "취소 효과음", - "create.subtitle.block_funnel_eat": "깔때기가 흡입함", + "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.blockzapper_place": "블록이 순간이동됨", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 5e5a64a3b..c009d1345 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1554", + "_": "Missing Localizations: 1553", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 0dc83de7c..ccc17dea3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1608", + "_": "Missing Localizations: 1607", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d6f607918..149af24c6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 519", + "_": "Missing Localizations: 520", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.mechanical_press_item_break": "Лязг металла", - "create.subtitle.blockzapper_place": "Блок запрыгивает на место", - "create.subtitle.blockzapper_confirm": "Утвердительный динь", "create.subtitle.blockzapper_deny": "Тихий буп", - "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", + "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.blockzapper_place": "Блок запрыгивает на место", "create.subtitle.blaze_munch": "Всполох радостно жуёт", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index dbc9bb269..35d5ecf4e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 619", + "_": "Missing Localizations: 620", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 来手动降低服务器TPS速度", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.mechanical_press_item_break": "金属碰撞", - "create.subtitle.blockzapper_place": "放置方块", - "create.subtitle.blockzapper_confirm": "选择方块", "create.subtitle.blockzapper_deny": "放置失败", - "create.subtitle.block_funnel_eat": "漏斗:吞食", + "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.blockzapper_place": "放置方块", "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 9920312ed..3a3155431 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 624", + "_": "Missing Localizations: 625", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.mechanical_press_item_break": "金屬碰撞", - "create.subtitle.blockzapper_place": "放置方塊", - "create.subtitle.blockzapper_confirm": "選擇方塊", "create.subtitle.blockzapper_deny": "放置失敗", - "create.subtitle.block_funnel_eat": "漏斗吸收", + "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.blockzapper_place": "放置方塊", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index a420c4ac2..f53419501 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -1,69 +1,12 @@ { - "pigclock": { - "sounds": [ - "create:pigclock" - ], - "subtitle": "create.subtitle.pigclock" - }, - "creeperclock": { - "sounds": [ - "create:creeperclock" - ], - "subtitle": "create.subtitle.creeperclock" - }, - "schematicannon_launch_block": { + "blaze_munch": { "sounds": [ { - "name": "minecraft:entity.generic.explode", + "name": "minecraft:entity.generic.eat", "type": "event" } ], - "subtitle": "create.subtitle.schematicannon_launch_block" - }, - "schematicannon_finish": { - "sounds": [ - { - "name": "minecraft:block.note_block.bell", - "type": "event" - } - ], - "subtitle": "create.subtitle.schematicannon_finish" - }, - "slime_added": { - "sounds": [ - { - "name": "minecraft:block.slime_block.place", - "type": "event" - } - ], - "subtitle": "create.subtitle.slime_added" - }, - "mechanical_press_activation": { - "sounds": [ - { - "name": "minecraft:block.anvil.land", - "type": "event" - } - ], - "subtitle": "create.subtitle.mechanical_press_activation" - }, - "mechanical_press_item_break": { - "sounds": [ - { - "name": "minecraft:entity.item.break", - "type": "event" - } - ], - "subtitle": "create.subtitle.mechanical_press_item_break" - }, - "blockzapper_place": { - "sounds": [ - { - "name": "minecraft:block.note_block.basedrum", - "type": "event" - } - ], - "subtitle": "create.subtitle.blockzapper_place" + "subtitle": "create.subtitle.blaze_munch" }, "blockzapper_confirm": { "sounds": [ @@ -83,22 +26,74 @@ ], "subtitle": "create.subtitle.blockzapper_deny" }, - "block_funnel_eat": { + "blockzapper_place": { "sounds": [ { - "name": "minecraft:entity.generic.eat", + "name": "minecraft:block.note_block.basedrum", "type": "event" } ], - "subtitle": "create.subtitle.block_funnel_eat" + "subtitle": "create.subtitle.blockzapper_place" }, - "blaze_munch": { + "mechanical_press_activation": { "sounds": [ { - "name": "minecraft:entity.generic.eat", + "name": "minecraft:block.netherite_block.hit", "type": "event" } ], - "subtitle": "create.subtitle.blaze_munch" + "subtitle": "create.subtitle.mechanical_press_activation" + }, + "mechanical_press_activation_compounded_1": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ] + }, + "mechanical_press_activation_belt": { + "sounds": [ + { + "name": "minecraft:block.wool.hit", + "type": "event" + } + ], + "subtitle": "create.subtitle.mechanical_press_activation_belt" + }, + "mechanical_press_activation_belt_compounded_1": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ] + }, + "schematicannon_finish": { + "sounds": [ + { + "name": "minecraft:block.note_block.bell", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_finish" + }, + "schematicannon_launch_block": { + "sounds": [ + { + "name": "minecraft:entity.generic.explode", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_launch_block" + }, + "slime_added": { + "sounds": [ + { + "name": "minecraft:block.slime_block.place", + "type": "event" + } + ], + "subtitle": "create.subtitle.slime_added" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 8b71097aa..721bdc982 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -2,127 +2,347 @@ package com.simibubi.create; import java.io.IOException; import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.data.DataGenerator; import net.minecraft.data.DirectoryCache; import net.minecraft.data.IDataProvider; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.IForgeRegistry; -public enum AllSoundEvents implements IDataProvider { +//@EventBusSubscriber(bus = Bus.FORGE) +public class AllSoundEvents { - CUCKOO_PIG("pigclock"), - CUCKOO_CREEPER("creeperclock"), + public static Map entries = Maps.newHashMap(); + public static final SoundEntry - SCHEMATICANNON_LAUNCH_BLOCK(SoundEvents.ENTITY_GENERIC_EXPLODE), - SCHEMATICANNON_FINISH(SoundEvents.BLOCK_NOTE_BLOCK_BELL), - SLIME_ADDED(SoundEvents.BLOCK_SLIME_BLOCK_PLACE), - MECHANICAL_PRESS_ACTIVATION(SoundEvents.BLOCK_ANVIL_LAND), - MECHANICAL_PRESS_ITEM_BREAK(SoundEvents.ENTITY_ITEM_BREAK), - BLOCKZAPPER_PLACE(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM), - BLOCKZAPPER_CONFIRM(SoundEvents.BLOCK_NOTE_BLOCK_BELL), - BLOCKZAPPER_DENY(SoundEvents.BLOCK_NOTE_BLOCK_BASS), - BLOCK_FUNNEL_EAT(SoundEvents.ENTITY_GENERIC_EAT), - BLAZE_MUNCH(SoundEvents.ENTITY_GENERIC_EAT) + SCHEMATICANNON_LAUNCH_BLOCK = create("schematicannon_launch_block").subtitle("Schematicannon fires") + .playExisting(SoundEvents.ENTITY_GENERIC_EXPLODE, .1f, 1.1f) + .category(SoundCategory.BLOCKS) + .build(), - ; + SCHEMATICANNON_FINISH = create("schematicannon_finish").subtitle("Schematicannon dings") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 1, .7f) + .category(SoundCategory.BLOCKS) + .build(), - String id; - SoundEvent event, child; - private DataGenerator generator; + SLIME_ADDED = create("slime_added").subtitle("Slime squishes") + .playExisting(SoundEvents.BLOCK_SLIME_BLOCK_PLACE) + .category(SoundCategory.BLOCKS) + .build(), - // For adding our own sounds at assets/create/sounds/name.ogg - AllSoundEvents() { - id = Lang.asId(name()); - } + MECHANICAL_PRESS_ACTIVATION = create("mechanical_press_activation").subtitle("Mechanical Press clangs") + .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .5f, 1.25f) + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .category(SoundCategory.BLOCKS) + .build(), - AllSoundEvents(String name) { - id = name; - } + MECHANICAL_PRESS_ACTIVATION_ON_BELT = + create("mechanical_press_activation_belt").subtitle("Mechanical Press bonks") + .playExisting(SoundEvents.BLOCK_WOOL_HIT, .75f, 1f) + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .category(SoundCategory.BLOCKS) + .build(), - // For wrapping a existing sound with new subtitle - AllSoundEvents(SoundEvent child) { - this(); - this.child = child; - } + BLOCKZAPPER_PLACE = create("blockzapper_place").subtitle("Blockzapper zaps") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) + .category(SoundCategory.PLAYERS) + .build(), - // subtitles are taken from the lang file (create.subtitle.sound_event_name) + BLOCKZAPPER_CONFIRM = create("blockzapper_confirm").subtitle("Affirmative ding") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 0.5f, 0.8f) + .category(SoundCategory.PLAYERS) + .build(), - public SoundEvent get() { - return event; - } + BLOCKZAPPER_DENY = create("blockzapper_deny").subtitle("Declining boop") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASS, 1f, 0.5f) + .category(SoundCategory.PLAYERS) + .build(), - private String getEventName() { - return id; - } + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") + .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) + .category(SoundCategory.BLOCKS) + .build(); - public AllSoundEvents generator(DataGenerator generator) { - this.generator = generator; - return this; + public static SoundEntryBuilder create(String id) { + return new SoundEntryBuilder(id); } public static void register(RegistryEvent.Register event) { IForgeRegistry registry = event.getRegistry(); - - for (AllSoundEvents entry : values()) { - - ResourceLocation rec = new ResourceLocation(Create.ID, entry.getEventName()); - SoundEvent sound = new SoundEvent(rec).setRegistryName(rec); - registry.register(sound); - entry.event = sound; - } + for (SoundEntry entry : entries.values()) + entry.register(registry); } - public void generate(Path path, DirectoryCache cache) { - Gson GSON = (new GsonBuilder()).setPrettyPrinting() - .disableHtmlEscaping() - .create(); - path = path.resolve("assets/create"); + public static JsonElement provideLangEntries() { + JsonObject object = new JsonObject(); + for (SoundEntry entry : entries.values()) + object.addProperty(entry.getSubtitleKey(), entry.getSubtitle()); + return object; + } - try { - JsonObject json = new JsonObject(); - for (AllSoundEvents soundEvent : values()) { - JsonObject entry = new JsonObject(); - JsonArray arr = new JsonArray(); - if (soundEvent.child != null) { - // wrapper - JsonObject s = new JsonObject(); - s.addProperty("name", soundEvent.child.getName() - .toString()); - s.addProperty("type", "event"); - arr.add(s); - } else { - // own sound - arr.add(Create.ID + ":" + soundEvent.getEventName()); - } - entry.add("sounds", arr); - entry.addProperty("subtitle", Create.ID + ".subtitle." + soundEvent.getEventName()); - json.add(soundEvent.getEventName(), entry); + public static SoundEntryProvider provider(DataGenerator generator) { + return new SoundEntryProvider(generator); + } + +// @SubscribeEvent +// public static void cancelSubtitlesOfCompoundedSounds(PlaySoundEvent event) { +// ResourceLocation soundLocation = event.getSound().getSoundLocation(); +// if (!soundLocation.getNamespace().equals(Create.ID)) +// return; +// if (soundLocation.getPath().contains("_compounded_") +// event.setResultSound(); +// +// } + + private static class SoundEntryProvider implements IDataProvider { + + private DataGenerator generator; + + public SoundEntryProvider(DataGenerator generator) { + this.generator = generator; + } + + @Override + public void act(DirectoryCache cache) throws IOException { + generate(generator.getOutputFolder(), cache); + } + + @Override + public String getName() { + return "Create's Custom Sounds"; + } + + public void generate(Path path, DirectoryCache cache) { + Gson GSON = (new GsonBuilder()).setPrettyPrinting() + .disableHtmlEscaping() + .create(); + path = path.resolve("assets/create"); + + try { + JsonObject json = new JsonObject(); + entries.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + entry.getValue() + .write(json); + }); + IDataProvider.save(GSON, cache, json, path.resolve("sounds.json")); + + } catch (IOException e) { + e.printStackTrace(); } - IDataProvider.save(GSON, cache, json, path.resolve("sounds.json")); - - } catch (IOException e) { - e.printStackTrace(); } } - @Override - public void act(DirectoryCache cache) throws IOException { - generate(generator.getOutputFolder(), cache); + static class SoundEntryBuilder { + + protected String id; + protected String subtitle = "unregistered"; + protected SoundCategory category = SoundCategory.BLOCKS; + List>> wrappedEvents; + + public SoundEntryBuilder(String id) { + wrappedEvents = Lists.newArrayList(); + this.id = id; + } + + public SoundEntryBuilder subtitle(String subtitle) { + this.subtitle = subtitle; + return this; + } + + public SoundEntryBuilder category(SoundCategory category) { + this.category = category; + return this; + } + + public SoundEntryBuilder playExisting(SoundEvent event, float volume, float pitch) { + wrappedEvents.add(Pair.of(event, Couple.create(volume, pitch))); + return this; + } + + public SoundEntryBuilder playExisting(SoundEvent event) { + return playExisting(event, 1, 1); + } + + public SoundEntry build() { + SoundEntry entry = wrappedEvents.isEmpty() ? new CustomSoundEntry(id, subtitle, category) + : new WrappedSoundEntry(id, subtitle, wrappedEvents, category); + entries.put(entry.getLocation(), entry); + return entry; + } + } - @Override - public String getName() { - return "Create's Custom Sound: " + name(); + public static abstract class SoundEntry { + + protected String id; + protected String subtitle; + protected SoundCategory category; + + public SoundEntry(String id, String subtitle, SoundCategory category) { + this.id = id; + this.subtitle = subtitle; + this.category = category; + } + + public abstract void register(IForgeRegistry registry); + + public abstract void write(JsonObject json); + + public String getSubtitleKey() { + return Create.ID + ".subtitle." + id; + } + + public String getId() { + return id; + } + + public ResourceLocation getLocation() { + return Create.asResource(id); + } + + public String getSubtitle() { + return subtitle; + } + + public void playOnServer(World world, BlockPos pos) { + playOnServer(world, pos, 1, 1); + } + + public void playOnServer(World world, BlockPos pos, float volume, float pitch) { + play(world, null, pos, volume, pitch); + } + + public void play(World world, PlayerEntity entity, BlockPos pos) { + play(world, entity, pos, 1, 1); + } + + public void playFrom(Entity entity) { + playFrom(entity, 1, 1); + } + + public void playFrom(Entity entity, float volume, float pitch) { + if (!entity.isSilent()) + play(entity.world, null, entity.getBlockPos(), volume, pitch); + } + + public void play(World world, PlayerEntity entity, BlockPos pos, float volume, float pitch) { + play(world, entity, pos.getX(), pos.getY(), pos.getZ(), volume, pitch); + } + + abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); + } + + static class WrappedSoundEntry extends SoundEntry { + + private List>> wrappedEvents; + private List>> compiledEvents; + + public WrappedSoundEntry(String id, String subtitle, List>> wrappedEvents, + SoundCategory category) { + super(id, subtitle, category); + this.wrappedEvents = wrappedEvents; + compiledEvents = Lists.newArrayList(); + } + + @Override + public void register(IForgeRegistry registry) { + for (int i = 0; i < wrappedEvents.size(); i++) { + ResourceLocation location = Create.asResource(getIdOf(i)); + SoundEvent sound = new SoundEvent(location).setRegistryName(location); + registry.register(sound); + compiledEvents.add(Pair.of(sound, wrappedEvents.get(i) + .getSecond())); + } + } + + protected String getIdOf(int i) { + return i == 0 ? id : id + "_compounded_" + i; + } + + @Override + public void write(JsonObject json) { + for (int i = 0; i < wrappedEvents.size(); i++) { + Pair> pair = wrappedEvents.get(i); + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + JsonObject s = new JsonObject(); + s.addProperty("name", pair.getFirst() + .getName() + .toString()); + s.addProperty("type", "event"); + list.add(s); + entry.add("sounds", list); + if (i == 0) + entry.addProperty("subtitle", getSubtitleKey()); + json.add(getIdOf(i), entry); + } + } + + @Override + void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch) { + for (Pair> pair : compiledEvents) { + Couple volPitch = pair.getSecond(); + world.playSound(entity, x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, + volPitch.getSecond() * pitch); + } + } + } + + static class CustomSoundEntry extends SoundEntry { + + protected SoundEvent event; + + public CustomSoundEntry(String id, String subtitle, SoundCategory category) { + super(id, subtitle, category); + } + + @Override + public void register(IForgeRegistry registry) { + ResourceLocation location = getLocation(); + SoundEvent sound = new SoundEvent(location).setRegistryName(location); + registry.register(sound); + } + + @Override + public void write(JsonObject json) { + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + list.add(getLocation().toString()); + entry.add("sounds", list); + entry.addProperty("subtitle", getSubtitleKey()); + json.add(id, entry); + } + + @Override + void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch) { + world.playSound(entity, x, y, z, event, category, volume, pitch); + } + + } + } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 8d7e91f5f..6cd979ead 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -143,7 +143,7 @@ public class Create { DataGenerator gen = event.getGenerator(); gen.addProvider(new AllAdvancements(gen)); gen.addProvider(new LangMerger(gen)); - gen.addProvider(AllSoundEvents.BLAZE_MUNCH.generator(gen)); + gen.addProvider(AllSoundEvents.provider(gen)); gen.addProvider(new StandardRecipeGen(gen)); gen.addProvider(new MechanicalCraftingRecipeGen(gen)); ProcessingRecipeGen.registerAll(gen); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 8fba222f7..e37bcd83c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -23,6 +23,8 @@ import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.inventory.IInventory; @@ -35,7 +37,6 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.NonNullList; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -182,12 +183,11 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { applyPressingInWorld(); if (onBasin()) applyCompactingOnBasin(); - if (!world.isRemote) { - world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ITEM_BREAK.get(), SoundCategory.BLOCKS, - .5f, 1f); - world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.get(), SoundCategory.BLOCKS, - .125f, 1f); - } + + if (world.getBlockState(pos.down(2)).getSoundType() == SoundType.CLOTH) + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); + else + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos); } if (!world.isRemote && runningTicks > CYCLE) { @@ -266,7 +266,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, world, pos, 4); entityScanCooldown = 0; - + if (!bulk) break; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index ad32300e6..2156411af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -18,7 +18,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.vector.Vector3d; @@ -65,7 +64,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); state = state.with(glueableSide, true); } } @@ -86,7 +85,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); worldIn.setBlockState(pos, state.with(affectedSide, isSlimeBall)); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index d6402c34c..34d4a421f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -18,7 +18,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -91,8 +90,7 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende @OnlyIn(Dist.CLIENT) public void playSound(boolean attach) { - world.playSound(Minecraft.getInstance().player, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, - 0.35F, attach ? 0.75F : 0.2f); + AllSoundEvents.SLIME_ADDED.play(world, Minecraft.getInstance().player, pos, 0.35f, attach ? 0.75f : 0.2f); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index dc89ef02e..593062e4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -96,12 +96,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (onValidSurface()) { AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new GlueEffectPacket(getHangingPosition(), getFacingDirection().getOpposite(), false)); - playSound(AllSoundEvents.SLIME_ADDED.get(), 0.5F, 0.5F); + AllSoundEvents.SLIME_ADDED.playFrom(this, 0.5F, 0.5F); } } public void playPlaceSound() { - playSound(AllSoundEvents.SLIME_ADDED.get(), 0.5F, 0.75F); + AllSoundEvents.SLIME_ADDED.playFrom(this, 0.5F, 0.75F); } protected void updateFacingWithBoundingBox() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java index a0eb4546c..2c13bebb7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java @@ -22,7 +22,6 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.IStringSerializable; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; @@ -88,7 +87,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); if (!player.isCreative()) player.getHeldItem(handIn) .shrink(1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java index eb0f9b6e9..07582c253 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java @@ -5,7 +5,6 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTil import net.minecraft.entity.projectile.EggEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; @@ -52,7 +51,7 @@ public class BlazeBurnerHandler { heater.notifyUpdate(); } - world.playSound(null, heater.getPos(), AllSoundEvents.BLAZE_MUNCH.get(), SoundCategory.BLOCKS, .5F, 1F); + AllSoundEvents.BLAZE_MUNCH.playOnServer(world, heater.getPos()); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java index bb2f34074..5b1de8daf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java @@ -15,7 +15,6 @@ import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.StairsShape; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; @@ -33,7 +32,8 @@ public class ZapperInteractionHandler { public static void leftClickingBlocksWithTheZapperSelectsTheBlock(PlayerInteractEvent.LeftClickBlock event) { if (event.getWorld().isRemote) return; - ItemStack heldItem = event.getPlayer().getHeldItemMainhand(); + ItemStack heldItem = event.getPlayer() + .getHeldItemMainhand(); if (heldItem.getItem() instanceof ZapperItem && trySelect(heldItem, event.getPlayer())) { event.setCancellationResult(ActionResultType.FAIL); event.setCanceled(true); @@ -87,10 +87,8 @@ public class ZapperInteractionHandler { data.remove("id"); } CompoundNBT tag = stack.getOrCreateTag(); - if (tag.contains("BlockUsed") - && NBTUtil.readBlockState( - stack.getTag().getCompound("BlockUsed")) == newState - && Objects.equals(data, tag.get("BlockData"))) { + if (tag.contains("BlockUsed") && NBTUtil.readBlockState(stack.getTag() + .getCompound("BlockUsed")) == newState && Objects.equals(data, tag.get("BlockData"))) { return false; } @@ -99,9 +97,8 @@ public class ZapperInteractionHandler { tag.remove("BlockData"); else tag.put("BlockData", data); - player.world.playSound(null, player.getBlockPos(), AllSoundEvents.BLOCKZAPPER_CONFIRM.get(), - SoundCategory.BLOCKS, 0.5f, 0.8f); + AllSoundEvents.BLOCKZAPPER_CONFIRM.playOnServer(player.world, player.getBlockPos()); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 993f96d4c..ac7229898 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -30,7 +30,6 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; @@ -144,8 +143,7 @@ public abstract class ZapperItem extends Item { // Check if can be used ITextComponent msg = validateUsage(item); if (msg != null) { - world.playSound(player, player.getBlockPos(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS, - 1f, 0.5f); + AllSoundEvents.BLOCKZAPPER_DENY.play(world, player, player.getBlockPos()); player.sendStatusMessage(msg.copy().formatted(TextFormatting.RED), true); return new ActionResult<>(ActionResultType.FAIL, item); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index ce065f62e..bcf8f8e5c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -21,7 +21,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -82,21 +81,21 @@ public class ZapperRenderHandler { lastRightHandAnimation = rightHandAnimation; leftHandAnimation *= 0.8f; rightHandAnimation *= 0.8f; - + if (cachedBeams == null) cachedBeams = new LinkedList<>(); - + cachedBeams.removeIf(b -> b.itensity < .1f); if (cachedBeams.isEmpty()) return; - + cachedBeams.forEach(beam -> { CreateClient.outliner.endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity) - .disableNormals() - .colored(0xffffff) - .lineWidth(beam.itensity * 1 / 8f); + .disableNormals() + .colored(0xffffff) + .lineWidth(beam.itensity * 1 / 8f); }); - + cachedBeams.forEach(b -> b.itensity *= .6f); } @@ -115,8 +114,8 @@ public class ZapperRenderHandler { public static void playSound(Hand hand, BlockPos position) { float pitch = hand == Hand.MAIN_HAND ? 2f : 0.9f; - Minecraft.getInstance().world.playSound(position, AllSoundEvents.BLOCKZAPPER_PLACE.get(), SoundCategory.BLOCKS, - 0.8f, pitch, false); + Minecraft mc = Minecraft.getInstance(); + AllSoundEvents.BLOCKZAPPER_PLACE.play(mc.world, mc.player, position, 0.8f, pitch); } public static void addBeam(LaserBeam beam) { @@ -166,7 +165,7 @@ public class ZapperRenderHandler { float f4 = -0.4F * MathHelper.sin(event.getSwingProgress() * (float) Math.PI); float f5 = MathHelper.sin(event.getSwingProgress() * event.getSwingProgress() * (float) Math.PI); float f6 = MathHelper.sin(f1 * (float) Math.PI); - + ms.translate(f * (f2 + 0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F, f4 + -0.71999997F + .3f + recoil); ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 75.0F)); @@ -181,7 +180,7 @@ public class ZapperRenderHandler { ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * -135.0F)); ms.translate(f * 5.6F, 0.0F, 0.0F); ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 40.0F)); - + PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager() .getRenderer(abstractclientplayerentity); if (rightHand) { diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index f8983ad48..8a06c2464 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -55,7 +55,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; @@ -409,7 +408,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC ItemRequirement requirement; if (entityMode) { - requirement = ItemRequirement.of(blockReader.getEntities().collect(Collectors.toList()) + requirement = ItemRequirement.of(blockReader.getEntities() + .collect(Collectors.toList()) .get(printingEntityIndex)); } else { @@ -459,7 +459,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC ItemStack icon = requirement.isEmpty() || requiredItems.isEmpty() ? ItemStack.EMPTY : requiredItems.get(0); if (entityMode) - launchEntity(target, icon, blockReader.getEntities().collect(Collectors.toList()) + launchEntity(target, icon, blockReader.getEntities() + .collect(Collectors.toList()) .get(printingEntityIndex)); else if (AllBlocks.BELT.has(blockState)) { TileEntity te = blockReader.getTileEntity(currentPos.add(schematicAnchor)); @@ -646,7 +647,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } protected void advanceCurrentPos() { - List entities = blockReader.getEntities().collect(Collectors.toList()); + List entities = blockReader.getEntities() + .collect(Collectors.toList()); if (printingEntityIndex != -1) { printingEntityIndex++; @@ -692,8 +694,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC statusMsg = "finished"; resetPrinter(); target = getPos().add(1, 0, 0); - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_FINISH.get(), - SoundCategory.BLOCKS, 1, .7f); + AllSoundEvents.SCHEMATICANNON_FINISH.playOnServer(world, pos); sendUpdate = true; } @@ -875,8 +876,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } public void playFiringSound() { - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.get(), - SoundCategory.BLOCKS, .1f, 1.1f); + AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.playOnServer(world, pos); } public void sendToContainer(PacketBuffer buffer) { @@ -919,14 +919,15 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC checklist.require(requirement); blocksToPlace++; } - blockReader.getEntities().forEach(entity -> { - ItemRequirement requirement = ItemRequirement.of(entity); - if (requirement.isEmpty()) - return; - if (requirement.isInvalid()) - return; - checklist.require(requirement); - }); + blockReader.getEntities() + .forEach(entity -> { + ItemRequirement requirement = ItemRequirement.of(entity); + if (requirement.isEmpty()) + return; + if (requirement.isInvalid()) + return; + checklist.require(requirement); + }); } checklist.gathered.clear(); diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 6c71f4d97..9904c53b4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.data; import com.google.common.base.Supplier; import com.google.gson.JsonElement; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.utility.FilesHelper; @@ -11,6 +12,7 @@ public enum AllLangPartials { ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), + SUBTITLES("Subtitles", AllSoundEvents::provideLangEntries), TOOLTIPS("Item Descriptions"), PONDER("Ponder Content", PonderRegistry::provideLangEntries), diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 9f5f45fb3..59eb8ceb6 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -501,17 +501,6 @@ "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", - "create.command.killTPSCommand.argument.tickTime": "tickTime", - - "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", - "create.subtitle.schematicannon_finish": "Schematicannon finishes", - "create.subtitle.slime_added": "Slime squishes", - "create.subtitle.mechanical_press_activation": "Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "Metal clanks", - "create.subtitle.blockzapper_place": "Blocks zap into place", - "create.subtitle.blockzapper_confirm": "Affirmative Ding", - "create.subtitle.blockzapper_deny": "Declining Boop", - "create.subtitle.block_funnel_eat": "Funnel CHOMPS", - "create.subtitle.blaze_munch": "Blaze munches happily" + "create.command.killTPSCommand.argument.tickTime": "tickTime" } \ No newline at end of file diff --git a/src/main/resources/assets/create/sounds/creeperclock.ogg b/src/main/resources/assets/create/sounds/creeperclock.ogg deleted file mode 100644 index fbcb1cf3fe349cfac997be78f4a7f3c7dfc2768a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17248 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 diff --git a/src/main/resources/assets/create/sounds/pigclock.ogg b/src/main/resources/assets/create/sounds/pigclock.ogg deleted file mode 100644 index daa7c7f64beb1de2d31bacfbc569d31d832a53c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17404 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 i5x{O6C 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 From 2fc26f1112f5332cee14f939b816e257c57805b5 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 15 Apr 2021 05:19:15 +0200 Subject: [PATCH 08/16] Defer. Everything. - Millstone now accepts items from belts/ejectors directly - Fixed Redstone-triggered components losing tile data after moved by a Contraption - Super glue between non-solids can now be removed while the glue item is equipped - Fixed Deployers not able to interact with glued blocks - Fixed incorrect lang mapping of UI button descriptions - Placement assist block preview now lights properly, doesn't z-fight and fades in gradually - Pickaxe and Axe are now effective on piston extension poles - Fixed block breaking animations inside the ponder UI - Fixed Ponder Scenes rendering on top of the progress bar - Fixed Mechanical Press not retracting when items were removed early - Fixed Windmill Bearings allowing to be moved while assembled - Mechanical Pistons now silence the "missing poles" error after poles were added --- .../millstone/MillstoneTileEntity.java | 9 +++ .../press/MechanicalPressTileEntity.java | 4 +- .../BlockMovementTraits.java | 7 ++ .../glue/SuperGlueEntity.java | 23 ++++-- .../piston/MechanicalPistonBlock.java | 32 ++++++++ .../piston/PistonExtensionPoleBlock.java | 21 ++++++ .../sequencer/SequencedGearshiftBlock.java | 10 +++ .../block/chute/SmartChuteBlock.java | 11 +++ .../block/funnel/AbstractFunnelBlock.java | 13 +++- .../block/redstone/NixieTubeBlock.java | 23 +++++- .../block/redstone/RedstoneLinkBlock.java | 26 +++++-- .../create/foundation/item/TooltipHelper.java | 5 +- .../foundation/ponder/PonderProgressBar.java | 6 +- .../create/foundation/ponder/PonderScene.java | 1 + .../create/foundation/ponder/PonderUI.java | 2 +- .../foundation/ponder/ui/PonderButton.java | 2 +- .../utility/ghost/GhostBlockRenderer.java | 73 ++++++++++++------- .../utility/placement/PlacementHelpers.java | 6 +- 18 files changed, 222 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java index 6df1a0a5f..d9c9fe512 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java @@ -1,9 +1,12 @@ package com.simibubi.create.content.contraptions.components.millstone; +import java.util.List; import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -38,6 +41,12 @@ public class MillstoneTileEntity extends KineticTileEntity { outputInv = new ItemStackHandler(9); capability = LazyOptional.of(MillstoneInventoryHandler::new); } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this)); + super.addBehaviours(behaviours); + } @Override public void tick() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index e37bcd83c..5ff38295f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -24,7 +24,6 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.inventory.IInventory; @@ -188,6 +187,9 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); else AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos); + + if (!world.isRemote) + sendData(); } if (!world.isRemote && runningTicks > CYCLE) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index 9edac0058..5a47573fe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -13,6 +13,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; @@ -88,6 +90,11 @@ public class BlockMovementTraits { if (te instanceof MechanicalBearingTileEntity) return !((MechanicalBearingTileEntity) te).isRunning(); } + if (block instanceof WindmillBearingBlock) { + TileEntity te = world.getTileEntity(pos); + if (te instanceof WindmillBearingTileEntity) + return !((WindmillBearingTileEntity) te).isRunning(); + } if (block instanceof ClockworkBearingBlock) { TileEntity te = world.getTileEntity(pos); if (te instanceof ClockworkBearingTileEntity) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 593062e4e..5a7957c92 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -58,6 +58,7 @@ import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; @@ -170,7 +171,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat return false; if (world instanceof WrappedWorld) return true; - + BlockPos pos = hangingPosition; BlockPos pos2 = pos.offset(getFacingDirection().getOpposite()); return isValidFace(world, pos2, getFacingDirection()) != isValidFace(world, pos, @@ -185,7 +186,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (!isValidFace(world, pos2, getFacingDirection()) && !isValidFace(world, pos, getFacingDirection().getOpposite())) return false; - if (isSideSticky(world, pos2, getFacingDirection()) || isSideSticky(world, pos, getFacingDirection().getOpposite())) + if (isSideSticky(world, pos2, getFacingDirection()) + || isSideSticky(world, pos, getFacingDirection().getOpposite())) return false; return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) .isEmpty(); @@ -209,12 +211,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (AllBlocks.STICKER.has(state)) return state.get(DirectionalBlock.FACING) == direction; - + if (state.getBlock() == Blocks.SLIME_BLOCK) return true; if (state.getBlock() == Blocks.HONEY_BLOCK) return true; - + if (AllBlocks.CART_ASSEMBLER.has(state)) return Direction.UP == direction; @@ -227,7 +229,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (state.getBlock() instanceof AbstractChassisBlock) { BooleanProperty glueableSide = ((AbstractChassisBlock) state.getBlock()).getGlueableSide(state, direction); - if (glueableSide == null) return false; + if (glueableSide == null) + return false; return state.get(glueableSide); } @@ -255,7 +258,13 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public boolean attackEntityFrom(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) return false; - if (isAlive() && !world.isRemote && isVisible()) { + Entity immediateSource = source.getImmediateSource(); + if (!isVisible() && immediateSource instanceof PlayerEntity) { + if (!AllItems.SUPER_GLUE.isIn(((PlayerEntity) immediateSource).getHeldItemMainhand())) + return true; + } + + if (isAlive() && !world.isRemote) { remove(); markVelocityChanged(); onBroken(source.getTrueSource()); @@ -297,6 +306,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat @Override public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) { + if (player instanceof FakePlayer) + return ActionResultType.PASS; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { triggerPlaceBlock(player, hand); }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java index 2c13bebb7..98efed20f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; +import java.util.Random; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllSoundEvents; @@ -30,6 +32,7 @@ import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.Tags; public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implements ITE { @@ -97,6 +100,35 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement return ActionResultType.SUCCESS; } + @Override + public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos fromPos, + boolean p_220069_6_) { + Direction direction = state.get(FACING); + if (!fromPos.equals(pos.offset(direction.getOpposite()))) + return; + if (!world.isRemote && !world.getPendingBlockTicks() + .isTickPending(pos, this)) + world.getPendingBlockTicks() + .scheduleTick(pos, this, 0); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { + Direction direction = state.get(FACING); + BlockState pole = worldIn.getBlockState(pos.offset(direction.getOpposite())); + if (!AllBlocks.PISTON_EXTENSION_POLE.has(pole)) + return; + if (pole.get(PistonExtensionPoleBlock.FACING) + .getAxis() != direction.getAxis()) + return; + withTileEntityDo(worldIn, pos, te -> { + if (te.lastException == null) + return; + te.lastException = null; + te.sendData(); + }); + } + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.MECHANICAL_PISTON.create(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index decf128f9..b88ef5c3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -41,6 +41,7 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable { @@ -51,6 +52,26 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false)); } + @Override + public ToolType getHarvestTool(BlockState state) { + return null; + } + + @Override + public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) { + for (ToolType toolType : player.getHeldItemMainhand() + .getToolTypes()) { + if (isToolEffective(state, toolType)) + return true; + } + return super.canHarvestBlock(state, world, pos, player); + } + + @Override + public boolean isToolEffective(BlockState state, ToolType tool) { + return tool == ToolType.AXE || tool == ToolType.PICKAXE; + } + @Override public PushReaction getPushReaction(BlockState state) { return PushReaction.NORMAL; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index e206109b2..eac794939 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; +import java.util.Random; + import com.simibubi.create.AllItems; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; @@ -29,6 +31,7 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -62,7 +65,14 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen boolean isMoving) { if (worldIn.isRemote) return; + if (!worldIn.getPendingBlockTicks() + .isTickPending(pos, this)) + worldIn.getPendingBlockTicks() + .scheduleTick(pos, this, 0); + } + @Override + public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { boolean previouslyPowered = state.get(STATE) != 0; boolean isPowered = worldIn.isBlockPowered(pos); withTileEntityDo(worldIn, pos, sgte -> sgte.onRedstoneUpdate(isPowered, previouslyPowered)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java index eadcd71fa..55b0b2d52 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.block.chute; +import java.util.Random; + import com.simibubi.create.AllTileEntities; import net.minecraft.block.Block; @@ -13,6 +15,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; public class SmartChuteBlock extends AbstractChuteBlock { @@ -29,6 +32,14 @@ public class SmartChuteBlock extends AbstractChuteBlock { super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); if (worldIn.isRemote) return; + if (!worldIn.getPendingBlockTicks() + .isTickPending(pos, this)) + worldIn.getPendingBlockTicks() + .scheduleTick(pos, this, 0); + } + + @Override + public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) { boolean previouslyPowered = state.get(POWERED); if (previouslyPowered != worldIn.isBlockPowered(pos)) worldIn.setBlockState(pos, state.cycle(POWERED), 2); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java index 59733e5ce..b71846b3a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.block.funnel; +import java.util.Random; + import javax.annotation.Nullable; import com.simibubi.create.AllTileEntities; @@ -25,6 +27,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -42,7 +45,7 @@ public abstract class AbstractFunnelBlock extends Block implements ITE { @@ -116,13 +119,25 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE { @@ -41,8 +44,10 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE getTileEntityClass() { return RedstoneLinkTileEntity.class; diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index 4b89f7a4f..452af3c6c 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -47,9 +47,8 @@ public class TooltipHelper { private static final Map> tooltipReferrals = new HashMap<>(); public static IFormattableTextComponent holdShift(Palette color, boolean highlighted) { - TextFormatting colorFormat = highlighted ? color.hColor : color.color; - return Lang.translate("tooltip.holdKey", Lang.translate("tooltip.keyShift") - .formatted(colorFormat)) + return Lang.translate("tooltip.holdForDescription", Lang.translate("tooltip.keyShift") + .formatted(TextFormatting.GRAY)) .formatted(TextFormatting.DARK_GRAY); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index 07411ad8f..caf8bbcc6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -108,7 +108,7 @@ public class PonderProgressBar extends AbstractSimiWidget { hovered = clicked(mouseX, mouseY); ms.push(); - ms.translate(0, 0, 150); + ms.translate(0, 0, 250); /* * ponderButtons are at z+400 * renderBox is at z+100 @@ -182,9 +182,9 @@ public class PonderProgressBar extends AbstractSimiWidget { if (selected) { FontRenderer font = Minecraft.getInstance().fontRenderer; GuiUtils.drawGradientRect(ms.peek() - .getModel(), 500, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); + .getModel(), 100, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); ms.push(); - ms.translate(0, 0, 400); + ms.translate(0, 0, 100); String text; int offset; if (activeScene.currentTime < keyframeTime) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 60f10f109..b7393efd6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -449,6 +449,7 @@ public class PonderScene { } else { // For block breaking overlay; Don't ask ms.scale(f, f, f); + ms.translate(0.525, .2975, .9); ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset, (basePlateSize + basePlateOffsetZ) / -2f); float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index fe97ce39c..2e9c14f23 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -537,7 +537,7 @@ public class PonderUI extends NavigatableSimiScreen { { // Chapter title ms.push(); - ms.translate(0, 0, 100); + ms.translate(0, 0, 300); int x = 31 + 20 + 8; int y = 31; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index deb018c6e..fb40f8784 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -110,7 +110,7 @@ public class PonderButton extends AbstractSimiWidget { borderColorStart = ColorHelper.applyAlpha(borderColorStart, fade); borderColorEnd = ColorHelper.applyAlpha(borderColorEnd, fade); - ms.translate(0, 0, 300); + ms.translate(0, 0, 400); PonderUI.renderBox(ms, x, y, width, height, backgroundColor, borderColorStart, borderColorEnd); ms.translate(0, 0, 100); diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java index d0c37472e..93309a030 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -14,12 +14,14 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; +import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -35,16 +37,17 @@ import net.minecraft.util.math.vector.Vector4f; public abstract class GhostBlockRenderer { private static final GhostBlockRenderer transparent = new TransparentGhostBlockRenderer(); + public static GhostBlockRenderer transparent() { return transparent; } private static final GhostBlockRenderer standard = new DefaultGhostBlockRenderer(); + public static GhostBlockRenderer standard() { return standard; } - public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { @@ -52,7 +55,8 @@ public abstract class GhostBlockRenderer { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { ms.push(); - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + BlockRendererDispatcher dispatcher = Minecraft.getInstance() + .getBlockRendererDispatcher(); IBakedModel model = dispatcher.getModelForState(params.state); @@ -62,7 +66,9 @@ public abstract class GhostBlockRenderer { BlockPos pos = params.pos; ms.translate(pos.getX(), pos.getY(), pos.getZ()); - dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + dispatcher.getBlockModelRenderer() + .renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, + VirtualEmptyModelData.INSTANCE); ms.pop(); } @@ -73,48 +79,61 @@ public abstract class GhostBlockRenderer { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { - //prepare + // prepare ms.push(); - //RenderSystem.pushMatrix(); + // RenderSystem.pushMatrix(); - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + Minecraft mc = Minecraft.getInstance(); + BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher(); IBakedModel model = dispatcher.getModelForState(params.state); - //RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); + // RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); RenderType layer = RenderType.getTranslucent(); IVertexBuilder vb = buffer.getEarlyBuffer(layer); BlockPos pos = params.pos; ms.translate(pos.getX(), pos.getY(), pos.getZ()); - //dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); - renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + ms.translate(.5, .5, .5); + ms.scale(.85f, .85f, .85f); + ms.translate(-.5, -.5, -.5); - //buffer.draw(); - //clean - //RenderSystem.popMatrix(); + // dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); + renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f, + WorldRenderer.getLightmapCoordinates(mc.world, pos), OverlayTexture.DEFAULT_UV, + VirtualEmptyModelData.INSTANCE); + + // buffer.draw(); + // clean + // RenderSystem.popMatrix(); ms.pop(); } - //BlockModelRenderer - public void renderModel(GhostBlockParams params, MatrixStack.Entry entry, IVertexBuilder vb, @Nullable BlockState state, IBakedModel model, float p_228804_5_, float p_228804_6_, float p_228804_7_, int p_228804_8_, int p_228804_9_, net.minecraftforge.client.model.data.IModelData modelData) { + // BlockModelRenderer + public void renderModel(GhostBlockParams params, MatrixStack.Entry entry, IVertexBuilder vb, + @Nullable BlockState state, IBakedModel model, float p_228804_5_, float p_228804_6_, float p_228804_7_, + int p_228804_8_, int p_228804_9_, net.minecraftforge.client.model.data.IModelData modelData) { Random random = new Random(); for (Direction direction : Direction.values()) { random.setSeed(42L); - renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, direction, random, modelData), p_228804_8_, p_228804_9_); + renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, + model.getQuads(state, direction, random, modelData), p_228804_8_, p_228804_9_); } random.setSeed(42L); - renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, (Direction) null, random, modelData), p_228804_8_, p_228804_9_); + renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, + model.getQuads(state, (Direction) null, random, modelData), p_228804_8_, p_228804_9_); } - //BlockModelRenderer - private static void renderQuad(GhostBlockParams params, MatrixStack.Entry p_228803_0_, IVertexBuilder p_228803_1_, float p_228803_2_, float p_228803_3_, float p_228803_4_, List p_228803_5_, int p_228803_6_, int p_228803_7_) { - Float alpha = params.alphaSupplier.get(); + // BlockModelRenderer + private static void renderQuad(GhostBlockParams params, MatrixStack.Entry p_228803_0_, + IVertexBuilder p_228803_1_, float p_228803_2_, float p_228803_3_, float p_228803_4_, + List p_228803_5_, int p_228803_6_, int p_228803_7_) { + Float alpha = params.alphaSupplier.get() * .75f * PlacementHelpers.getCurrentAlpha(); for (BakedQuad bakedquad : p_228803_5_) { float f; @@ -130,15 +149,19 @@ public abstract class GhostBlockRenderer { f2 = 1.0F; } - quad(alpha, p_228803_1_, p_228803_0_, bakedquad, new float[]{1f, 1f, 1f, 1f}, f, f1, f2, new int[]{p_228803_6_, p_228803_6_, p_228803_6_, p_228803_6_}, p_228803_7_); + quad(alpha, p_228803_1_, p_228803_0_, bakedquad, new float[] { 1f, 1f, 1f, 1f }, f, f1, f2, + new int[] { p_228803_6_, p_228803_6_, p_228803_6_, p_228803_6_ }, p_228803_7_); } } - //IVertexBuilder - static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_, float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_, int p_227890_8_) { + // IVertexBuilder + static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_, + float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_, + int p_227890_8_) { int[] aint = p_227890_2_.getVertexData(); - Vector3i Vector3i = p_227890_2_.getFace().getDirectionVec(); + Vector3i Vector3i = p_227890_2_.getFace() + .getDirectionVec(); Vector3f vector3f = new Vector3f((float) Vector3i.getX(), (float) Vector3i.getY(), (float) Vector3i.getZ()); Matrix4f matrix4f = p_227890_1_.getModel(); vector3f.transform(p_227890_1_.getNormal()); @@ -163,14 +186,14 @@ public abstract class GhostBlockRenderer { g = p_227890_3_[k] * p_227890_5_; b = p_227890_3_[k] * p_227890_6_; - int l = vb.applyBakedLighting(p_227890_7_[k], bytebuffer); float f9 = bytebuffer.getFloat(16); float f10 = bytebuffer.getFloat(20); Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F); vector4f.transform(matrix4f); vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.getNormal()); - vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_, l, vector3f.getX(), vector3f.getY(), vector3f.getZ()); + vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_, + l, vector3f.getX(), vector3f.getY(), vector3f.getZ()); } } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index b70ec6246..09f98b72f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -157,12 +157,16 @@ public class PlacementHelpers { float screenY = res.getScaledHeight() / 2f; float screenX = res.getScaledWidth() / 2f; - float progress = Math.min(animationTick / 10f/* + event.getPartialTicks()*/, 1f); + float progress = getCurrentAlpha(); drawDirectionIndicator(event.getMatrixStack(), event.getPartialTicks(), screenX, screenY, progress); } } + public static float getCurrentAlpha() { + return Math.min(animationTick / 10f/* + event.getPartialTicks()*/, 1f); + } + @OnlyIn(Dist.CLIENT) private static void drawDirectionIndicator(MatrixStack ms, float partialTicks, float centerX, float centerY, float progress) { float r = .8f; From f9d48386cafe39ac9fa0d764c0cf5c7b8317ac52 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 15 Apr 2021 14:43:34 +0200 Subject: [PATCH 09/16] Scanning the Far Lands for Rails - Fixed basins not continuing their processing when items are extracted by funnel #1416 - Basins now accept full stacks for items thrown into the top manually - Fixed Smart Chutes not dropping filter items - Fixed Smart Chutes not updating attached diagonal chutes properly when removed - Fixed Server-side crash when coupling two minecarts from a glitched self-colliding pile --- .../deployer/DeployerMovementBehaviour.java | 2 ++ .../train/CouplingPhysics.java | 3 +++ .../train/MinecartSim2020.java | 3 ++- .../contraptions/processing/BasinBlock.java | 5 +++++ .../processing/BasinInventory.java | 11 ++++++++++ .../processing/BasinTileEntity.java | 3 ++- .../block/chute/AbstractChuteBlock.java | 21 ++++++++++++------- .../block/chute/SmartChuteBlock.java | 2 ++ .../filtering/SchematicInstances.java | 14 +++++++------ .../foundation/item/SmartInventory.java | 8 +++++++ 10 files changed, 57 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index 209144e81..a146a6c3e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -101,6 +101,8 @@ public class DeployerMovementBehaviour extends MovementBehaviour { if (!tag.getBoolean("Deployed")) return; SchematicWorld schematicWorld = SchematicInstances.get(world, filter); + if (schematicWorld == null) + return; if (!schematicWorld.getBounds() .isVecInside(pos.subtract(schematicWorld.anchor))) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java index 74becf2da..e16ea5263 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java @@ -93,7 +93,10 @@ public class CouplingPhysics { public static void softCollisionStep(World world, Couple carts, double couplingLength) { Couple maxSpeed = carts.map(AbstractMinecartEntity::getMaxCartSpeedOnRail); Couple canAddmotion = carts.map(MinecartSim2020::canAddMotion); + + // Assuming Minecarts will never move faster than 1 block/tick Couple motions = carts.map(Entity::getMotion); + motions.replaceWithParams(VecHelper::clamp, Couple.create(1f, 1f)); Couple nextPositions = carts.map(MinecartSim2020::predictNextPositionOf); Couple shapes = carts.mapWithContext((cart, current) -> { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java index aebbd074c..0a8f00f41 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java @@ -8,6 +8,7 @@ import com.google.common.collect.Maps; import com.mojang.datafixers.util.Pair; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.BlockState; @@ -47,7 +48,7 @@ public class MinecartSim2020 { public static Vector3d predictNextPositionOf(AbstractMinecartEntity cart) { Vector3d position = cart.getPositionVec(); - Vector3d motion = cart.getMotion(); + Vector3d motion = VecHelper.clamp(cart.getMotion(), 1f); return position.add(motion); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 3b42e8a32..16548ca6f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -131,8 +131,13 @@ public class BasinBlock extends Block implements ITE, IWrenchab return; ItemEntity itemEntity = (ItemEntity) entityIn; withTileEntityDo(worldIn, entityIn.getBlockPos(), te -> { + + // Tossed items bypass the quarter-stack limit + te.inputInventory.withMaxStackSize(64); ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem() .copy(), false); + te.inputInventory.withMaxStackSize(16); + if (insertItem.isEmpty()) { itemEntity.remove(); if (!itemEntity.world.isRemote) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInventory.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInventory.java index 3e3ac469a..70e5bce70 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinInventory.java @@ -7,8 +7,11 @@ import net.minecraftforge.items.ItemHandlerHelper; public class BasinInventory extends SmartInventory { + private BasinTileEntity te; + public BasinInventory(int slots, BasinTileEntity te) { super(slots, te, 16, true); + this.te = te; } @Override @@ -19,5 +22,13 @@ public class BasinInventory extends SmartInventory { return stack; return super.insertItem(slot, stack, simulate); } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack extractItem = super.extractItem(slot, amount, simulate); + if (!simulate && !extractItem.isEmpty()) + te.notifyChangeOfContents(); + return extractItem; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 6f61259dd..9601477f0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -96,7 +96,8 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor super(type); inputInventory = new BasinInventory(9, this); inputInventory.whenContentsChanged($ -> contentsChanged = true); - outputInventory = new BasinInventory(9, this).forbidInsertion(); + outputInventory = new BasinInventory(9, this).forbidInsertion() + .withMaxStackSize(64); areFluidsMoving = false; itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory)); contentsChanged = true; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 33c5c818b..60970e62d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -49,7 +50,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public static boolean isOpenChute(BlockState state) { return isChute(state) && ((AbstractChuteBlock) state.getBlock()).isOpen(state); } - + public static boolean isTransparentChute(BlockState state) { return isChute(state) && ((AbstractChuteBlock) state.getBlock()).isTransparent(state); } @@ -66,7 +67,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public boolean isOpen(BlockState state) { return true; } - + public boolean isTransparent(BlockState state) { return false; } @@ -128,6 +129,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public void onReplaced(BlockState state, World world, BlockPos pos, BlockState p_196243_4_, boolean p_196243_5_) { boolean differentBlock = state.getBlock() != p_196243_4_.getBlock(); if (state.hasTileEntity() && (differentBlock || !p_196243_4_.hasTileEntity())) { + TileEntityBehaviour.destroy(world, pos, FilteringBehaviour.TYPE); withTileEntityDo(world, pos, c -> c.onRemoved(state)); world.removeTileEntity(pos); } @@ -140,7 +142,10 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I BlockPos toUpdate = pos.up() .offset(direction); BlockState stateToUpdate = world.getBlockState(toUpdate); - BlockState updated = updateChuteState(stateToUpdate, world.getBlockState(toUpdate.up()), world, toUpdate); + if (!isChute(stateToUpdate)) + continue; + BlockState updated = ((AbstractChuteBlock) stateToUpdate.getBlock()).updateChuteState(stateToUpdate, + world.getBlockState(toUpdate.up()), world, toUpdate); if (stateToUpdate != updated && !world.isRemote) world.setBlockState(toUpdate, updated); } @@ -157,9 +162,11 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I @Override public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos, boolean p_220069_6_) { - if (pos.down().equals(neighbourPos)) + if (pos.down() + .equals(neighbourPos)) withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged); - else if (pos.up().equals(neighbourPos)) + else if (pos.up() + .equals(neighbourPos)) withTileEntityDo(world, pos, chute -> chute.capAbove = LazyOptional.empty()); } @@ -171,13 +178,13 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I BlockHelper.addReducedDestroyEffects(state, world, pos, manager); return true; } - + @Override public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { return ChuteShapes.getShape(p_220053_1_); } - + @Override public VoxelShape getCollisionShape(BlockState p_220071_1_, IBlockReader p_220071_2_, BlockPos p_220071_3_, ISelectionContext p_220071_4_) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java index 55b0b2d52..a27f1a92a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteBlock.java @@ -3,6 +3,8 @@ package com.simibubi.create.content.logistics.block.chute; import java.util.Random; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import net.minecraft.block.Block; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java index 5f92377ca..90a184ddb 100644 --- a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java +++ b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java @@ -35,12 +35,14 @@ public class SchematicInstances { public static SchematicWorld get(World world, ItemStack schematic) { Cache map = loadedSchematics.get(world); int hash = getHash(schematic); - try { - return map.get(hash, () -> loadWorld(world, schematic)); - } catch (ExecutionException e) { - e.printStackTrace(); - } - return null; + SchematicWorld ifPresent = map.getIfPresent(hash); + if (ifPresent != null) + return ifPresent; + SchematicWorld loadWorld = loadWorld(world, schematic); + if (loadWorld == null) + return null; + map.put(hash, loadWorld); + return loadWorld; } private static SchematicWorld loadWorld(World wrapped, ItemStack schematic) { diff --git a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java index 95be9e73e..7be383918 100644 --- a/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java +++ b/src/main/java/com/simibubi/create/foundation/item/SmartInventory.java @@ -18,6 +18,7 @@ public class SmartInventory extends RecipeWrapper protected boolean extractionAllowed; protected boolean insertionAllowed; protected boolean stackNonStackables; + protected SyncedStackHandler wrapped; protected int stackSize; public SmartInventory(int slots, SyncedTileEntity te) { @@ -30,6 +31,13 @@ public class SmartInventory extends RecipeWrapper insertionAllowed = true; extractionAllowed = true; this.stackSize = stackSize; + wrapped = (SyncedStackHandler) inv; + } + + public SmartInventory withMaxStackSize(int maxStackSize) { + stackSize = maxStackSize; + wrapped.stackSize = maxStackSize; + return this; } public SmartInventory whenContentsChanged(Consumer updateCallback) { From 3dfe67cd1e6cc3ecd48583d5fe287c25e7d4d973 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 15 Apr 2021 20:23:50 +0200 Subject: [PATCH 10/16] Minecarts of Mass Destruction - Contraptions with exceeding spawn packet sizes no longer get sent to the client - Minecart Contraptions with exceeding nbt packet sizes can no longer be picked up - Renamed "Metal Blocks" to "Blocks of Metal" --- src/generated/resources/.cache/cache | 28 +++---- .../resources/assets/create/lang/en_ud.json | 6 +- .../resources/assets/create/lang/en_us.json | 8 +- .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/es_es.json | 4 +- .../assets/create/lang/unfinished/es_mx.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 10 ++- .../assets/create/lang/unfinished/pt_br.json | 10 ++- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../assets/create/lang/unfinished/zh_tw.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 3 + .../AbstractContraptionEntity.java | 78 ++++++++++++------- .../mounted/MinecartContraptionItem.java | 39 ++++++++-- .../assets/create/lang/default/messages.json | 4 +- 19 files changed, 155 insertions(+), 71 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 57c600fff..25603aa31 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -406,20 +406,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -768a724d6c921cb92790364cf7a692fe8742a885 assets/create/lang/en_ud.json -5f5c7ddeea65263977262ae9eef8284a27b342ed assets/create/lang/en_us.json -784fce1f5ae7d571449e8c2645aedca2ae54017d assets/create/lang/unfinished/de_de.json -72dc91f3968daa908451a91514573fa081ba1011 assets/create/lang/unfinished/es_es.json -e7f818f6250f6a9bcb68d29e3c4a42f4d97d191f assets/create/lang/unfinished/es_mx.json -a3c830d49cb7fbc3942c316859ffe46304dcbb07 assets/create/lang/unfinished/fr_fr.json -8263ba5d778e8d8a3255319ab08cee080930345d assets/create/lang/unfinished/it_it.json -76d31adf175b248b9a4b63d7b02005155a0e961f assets/create/lang/unfinished/ja_jp.json -78fc9b2f5695019465930da7b3d20b519d53d128 assets/create/lang/unfinished/ko_kr.json -c3d24b55cf0f6a4a3ff673e3a07872f055a8747a assets/create/lang/unfinished/nl_nl.json -dee268b4a8c1aace69527b8064b40590a8c63165 assets/create/lang/unfinished/pt_br.json -651af36f14adb7851c1a78551bd6631847893b8c assets/create/lang/unfinished/ru_ru.json -67dde4056c63b166a48bd9b6dec95ef42d28f826 assets/create/lang/unfinished/zh_cn.json -1f3e13923f4d9285b14d494576a10589fe2f3c6d assets/create/lang/unfinished/zh_tw.json +97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json +3878d0d84b9575728bd299385af2a61bd3a84243 assets/create/lang/en_us.json +33296621c4421a2dc329a3739d8efafbb3b5b57a assets/create/lang/unfinished/de_de.json +052248ce9880cb3db937fed06c6d46a3ca77d1b4 assets/create/lang/unfinished/es_es.json +05d9d186ad4888c2dcb1eb08fe9b78e1e5482cd7 assets/create/lang/unfinished/es_mx.json +dea56d5fcda7baf23d5938b43c1770b5cd76c6f6 assets/create/lang/unfinished/fr_fr.json +56513c7dd8f8ce309b0f77019a2b1b0a55c0cf38 assets/create/lang/unfinished/it_it.json +888191ed07af611597d5ff852ca3d6cb6bf803b7 assets/create/lang/unfinished/ja_jp.json +95fcbeeffd2ced25371f86c9529d4108bf26f930 assets/create/lang/unfinished/ko_kr.json +03e170a7196c4c76942e8b6fde2b0a0b9b877113 assets/create/lang/unfinished/nl_nl.json +a1e092ee4a6eb19568f36535f183afe1d326f0cf assets/create/lang/unfinished/pt_br.json +74b3356506bdb4bf7046768bd7735fa95057d61a assets/create/lang/unfinished/ru_ru.json +ce16cef5a488c2f86def742ca2e436cb42e18552 assets/create/lang/unfinished/zh_cn.json +b55d5abac95ba2649f656857f54b39f98e686767 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index f4d93f438..33c7d7480 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -32,7 +32,7 @@ "block.create.blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA", "block.create.blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA", "block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA", - "block.create.brass_block": "\u029E\u0254o\u05DF\u15FA ss\u0250\u0279\u15FA", + "block.create.brass_block": "ss\u0250\u0279\u15FA \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA", "block.create.brass_encased_shaft": "\u0287\u025F\u0250\u0265S p\u01DDs\u0250\u0254u\u018E ss\u0250\u0279\u15FA", "block.create.brass_funnel": "\u05DF\u01DDuun\u2132 ss\u0250\u0279\u15FA", @@ -54,7 +54,7 @@ "block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186", "block.create.content_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287u\u01DD\u0287uo\u0186", "block.create.controller_rail": "\u05DF\u0131\u0250\u1D1A \u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186", - "block.create.copper_block": "\u029E\u0254o\u05DF\u15FA \u0279\u01DDddo\u0186", + "block.create.copper_block": "\u0279\u01DDddo\u0186 \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186", "block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186", "block.create.copper_shingles": "s\u01DD\u05DFbu\u0131\u0265S \u0279\u01DDddo\u0186", @@ -405,7 +405,7 @@ "block.create.yellow_sail": "\u05DF\u0131\u0250S \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_seat": "\u0287\u0250\u01DDS \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028Do\u05DF\u05DF\u01DD\u028E", - "block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z", + "block.create.zinc_block": "\u0254u\u0131Z \u025Fo \u029E\u0254o\u05DF\u15FA", "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d1b3fbc05..76da8e5cb 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -35,7 +35,7 @@ "block.create.blue_seat": "Blue Seat", "block.create.blue_valve_handle": "Blue Valve Handle", "block.create.brass_belt_funnel": "Brass Belt Funnel", - "block.create.brass_block": "Brass Block", + "block.create.brass_block": "Block of Brass", "block.create.brass_casing": "Brass Casing", "block.create.brass_encased_shaft": "Brass Encased Shaft", "block.create.brass_funnel": "Brass Funnel", @@ -57,7 +57,7 @@ "block.create.cogwheel": "Cogwheel", "block.create.content_observer": "Content Observer", "block.create.controller_rail": "Controller Rail", - "block.create.copper_block": "Copper Block", + "block.create.copper_block": "Block of Copper", "block.create.copper_casing": "Copper Casing", "block.create.copper_ore": "Copper Ore", "block.create.copper_shingles": "Copper Shingles", @@ -408,7 +408,7 @@ "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", "block.create.yellow_valve_handle": "Yellow Valve Handle", - "block.create.zinc_block": "Zinc Block", + "block.create.zinc_block": "Block of Zinc", "block.create.zinc_ore": "Zinc Ore", "entity.create.contraption": "Contraption", @@ -1147,6 +1147,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 95a8d3798..fef0fbea0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 913", + "_": "Missing Localizations: 914", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: Benutze /killtps start um den Server Tick künstlich zu verlangsamen", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 7e7cb004f..17ad4bdce 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 606", + "_": "Missing Localizations: 607", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 4b84a79b7..e362b5565 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1264", + "_": "Missing Localizations: 1265", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index a32f5fc41..586f39174 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1163", + "_": "Missing Localizations: 1164", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 513a746b0..f627cf5c9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 623", + "_": "Missing Localizations: 624", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps avvia per rallentare artificialmente il tick del server", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index cf30a6689..99d078dda 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 605", + "_": "Missing Localizations: 606", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: /killtps start を使用して、サーバーのティックを意図的に遅くします", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0a6b50b23..103772bb5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 676", + "_": "Missing Localizations: 677", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index c009d1345..3e5158e17 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1553", + "_": "Missing Localizations: 1554", "_": "->------------------------] Game Elements [------------------------<-", @@ -36,7 +36,7 @@ "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", - "block.create.brass_block": "UNLOCALIZED: Brass Block", + "block.create.brass_block": "UNLOCALIZED: Block of Brass", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", @@ -58,7 +58,7 @@ "block.create.cogwheel": "Tandwiel", "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.controller_rail": "UNLOCALIZED: Controller Rail", - "block.create.copper_block": "UNLOCALIZED: Copper Block", + "block.create.copper_block": "UNLOCALIZED: Block of Copper", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", @@ -409,7 +409,7 @@ "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "entity.create.contraption": "UNLOCALIZED: Contraption", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index ccc17dea3..3cb760892 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1607", + "_": "Missing Localizations: 1608", "_": "->------------------------] Game Elements [------------------------<-", @@ -36,7 +36,7 @@ "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", - "block.create.brass_block": "UNLOCALIZED: Brass Block", + "block.create.brass_block": "UNLOCALIZED: Block of Brass", "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_encased_shaft": "UNLOCALIZED: Brass Encased Shaft", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", @@ -58,7 +58,7 @@ "block.create.cogwheel": "Roda Dentada", "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.controller_rail": "UNLOCALIZED: Controller Rail", - "block.create.copper_block": "UNLOCALIZED: Copper Block", + "block.create.copper_block": "UNLOCALIZED: Block of Copper", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_ore": "UNLOCALIZED: Copper Ore", "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", @@ -409,7 +409,7 @@ "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "UNLOCALIZED: Zinc Block", + "block.create.zinc_block": "UNLOCALIZED: Block of Zinc", "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", "entity.create.contraption": "UNLOCALIZED: Contraption", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 149af24c6..0cc11a18b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 520", + "_": "Missing Localizations: 521", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 35d5ecf4e..63960b6ec 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 620", + "_": "Missing Localizations: 621", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 来手动降低服务器TPS速度", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 3a3155431..53ea0ab80 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 625", + "_": "Missing Localizations: 626", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,6 +1148,8 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "_": "->------------------------] Subtitles [------------------------<-", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index e5de33659..5065e7bdb 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1302,6 +1302,7 @@ public class AllBlocks { .tag(Tags.Items.STORAGE_BLOCKS) .transform(oxidizedItemModel()) .transform(oxidizedBlockstate()) + .lang("Block of Copper") .register(); public static final BlockEntry COPPER_SHINGLES = @@ -1327,6 +1328,7 @@ public class AllBlocks { .transform(tagBlockAndItem("storage_blocks/zinc")) .tag(Tags.Items.STORAGE_BLOCKS) .build() + .lang("Block of Zinc") .register(); public static final BlockEntry BRASS_BLOCK = REGISTRATE.block("brass_block", p -> new Block(p)) @@ -1338,6 +1340,7 @@ public class AllBlocks { .transform(tagBlockAndItem("storage_blocks/brass")) .tag(Tags.Items.STORAGE_BLOCKS) .build() + .lang("Block of Brass") .register(); // Load this class diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index b04160388..747e005d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement; +import java.io.IOException; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; @@ -10,8 +11,11 @@ import java.util.UUID; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.tuple.MutablePair; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption; @@ -30,6 +34,7 @@ import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; import net.minecraft.network.datasync.DataParameter; @@ -75,7 +80,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return; contraption.onEntityCreated(this); } - + public boolean supportsTerrainCollision() { return contraption instanceof TranslatingContraption; } @@ -139,9 +144,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit BlockPos seat = contraption.getSeatOf(id); if (seat == null) return null; - Vector3d transformedVector = - toGlobalVector(Vector3d.of(seat).add(.5, passenger.getYOffset() + ySize - .15f, .5), partialTicks) - .add(VecHelper.getCenterOf(BlockPos.ZERO)) + Vector3d transformedVector = toGlobalVector(Vector3d.of(seat) + .add(.5, passenger.getYOffset() + ySize - .15f, .5), partialTicks).add(VecHelper.getCenterOf(BlockPos.ZERO)) .subtract(0.5, ySize, 0.5); return transformedVector; } @@ -380,14 +384,34 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit public void writeSpawnData(PacketBuffer buffer) { CompoundNBT compound = new CompoundNBT(); writeAdditional(compound, true); - buffer.writeCompoundTag(compound); + + byte[] byteArray = null; + try { + ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); + CompressedStreamTools.write(compound, dataOutput); + byteArray = dataOutput.toByteArray(); + int estimatedPacketSize = byteArray.length; + if (estimatedPacketSize > 2_000_000) { + Create.logger.warn("Could not send Contraption Spawn Data (Packet too big): " + + getContraption().getType().id + " @" + getPositionVec() + " (" + getUniqueID().toString() + ")"); + buffer.writeCompoundTag(new CompoundNBT()); + return; + } + + } catch (IOException e) { + e.printStackTrace(); + buffer.writeCompoundTag(new CompoundNBT()); + return; + } + + buffer.writeByteArray(byteArray); } - + @Override protected final void writeAdditional(CompoundNBT compound) { writeAdditional(compound, false); } - + protected void writeAdditional(CompoundNBT compound, boolean spawnPacket) { if (contraption != null) compound.put("Contraption", contraption.writeNBT(spawnPacket)); @@ -399,13 +423,16 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit public void readSpawnData(PacketBuffer additionalData) { readAdditional(additionalData.readCompoundTag(), true); } - + @Override protected final void readAdditional(CompoundNBT compound) { readAdditional(compound, false); } - + protected void readAdditional(CompoundNBT compound, boolean spawnData) { + if (compound.isEmpty()) + return; + initialized = compound.getBoolean("Initialized"); contraption = Contraption.fromNBT(world, compound.getCompound("Contraption"), spawnData); contraption.entity = this; @@ -510,7 +537,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit @OnlyIn(Dist.CLIENT) static void handleDisassemblyPacket(ContraptionDisassemblyPacket packet) { - Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); + Entity entity = Minecraft.getInstance().world.getEntityByID(packet.entityID); if (!(entity instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity ce = (AbstractContraptionEntity) entity; @@ -650,25 +677,24 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } - //@Override //TODO find 1.16 replacement - //public void updateAquatics() { - /* - Override this with an empty method to reduce enormous calculation time when contraptions are in water - WARNING: THIS HAS A BUNCH OF SIDE EFFECTS! - - Fluids will not try to change contraption movement direction - - this.inWater and this.isInWater() will return unreliable data - - entities riding a contraption will not cause water splashes (seats are their own entity so this should be fine) - - fall distance is not reset when the contraption is in water - - this.eyesInWater and this.canSwim() will always be false - - swimming state will never be updated - */ - // extinguish(); - //} + // @Override //TODO find 1.16 replacement + // public void updateAquatics() { + /* + * Override this with an empty method to reduce enormous calculation time when contraptions are in water + * WARNING: THIS HAS A BUNCH OF SIDE EFFECTS! + * - Fluids will not try to change contraption movement direction + * - this.inWater and this.isInWater() will return unreliable data + * - entities riding a contraption will not cause water splashes (seats are their own entity so this should be fine) + * - fall distance is not reset when the contraption is in water + * - this.eyesInWater and this.canSwim() will always be false + * - swimming state will never be updated + */ + // extinguish(); + // } @Override public void setFire(int p_70015_1_) { - // Contraptions no longer catch fire + // Contraptions no longer catch fire } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index 75058a61a..522163f37 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -1,19 +1,24 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mounted; +import java.io.IOException; import java.util.List; import java.util.Optional; import javax.annotation.Nullable; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.AbstractRailBlock; import net.minecraft.block.BlockState; import net.minecraft.block.DispenserBlock; +import net.minecraft.block.material.Material; import net.minecraft.dispenser.DefaultDispenseItemBehavior; import net.minecraft.dispenser.IBlockSource; import net.minecraft.dispenser.IDispenseItemBehavior; @@ -26,12 +31,15 @@ import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.state.properties.RailShape; import net.minecraft.tags.BlockTags; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -86,7 +94,7 @@ public class MinecartContraptionItem extends Item { d3 = 0.1D; } } else { - if (!blockstate.isAir(world, blockpos) || !world.getBlockState(blockpos.down()) + if (blockstate.getMaterial() != Material.AIR || !world.getBlockState(blockpos.down()) .isIn(BlockTags.RAILS)) { return this.behaviourDefaultDispenseItem.dispense(source, stack); } @@ -210,13 +218,32 @@ public class MinecartContraptionItem extends Item { return; OrientedContraptionEntity contraption = (OrientedContraptionEntity) passengers.get(0); - if (!event.getWorld().isRemote) { - player.inventory.placeItemBackInInventory(event.getWorld(), - create(type, contraption).setDisplayName(entity.getCustomName())); - contraption.remove(); - entity.remove(); + if (event.getWorld().isRemote) { + event.setCancellationResult(ActionResultType.SUCCESS); + event.setCanceled(true); + return; } + ItemStack generatedStack = create(type, contraption).setDisplayName(entity.getCustomName()); + + try { + ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); + CompressedStreamTools.write(generatedStack.serializeNBT(), dataOutput); + int estimatedPacketSize = dataOutput.toByteArray().length; + if (estimatedPacketSize > 2_000_000) { + player.sendStatusMessage(Lang.translate("contraption.minecart_contraption_too_big") + .formatted(TextFormatting.RED), true); + return; + } + + } catch (IOException e) { + e.printStackTrace(); + return; + } + + player.inventory.placeItemBackInInventory(event.getWorld(), generatedStack); + contraption.remove(); + entity.remove(); event.setCancellationResult(ActionResultType.SUCCESS); event.setCanceled(true); } diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 59eb8ceb6..6f63bdef1 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -501,6 +501,8 @@ "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", - "create.command.killTPSCommand.argument.tickTime": "tickTime" + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.contraption.minecart_contraption_too_big": "This Cart Contraption seems too big to pick up" } \ No newline at end of file From db3c29679296047cd5601ed7a6fd4f20646f2c7a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 15 Apr 2021 22:03:25 +0200 Subject: [PATCH 11/16] Hotfix --- .../structureMovement/AbstractContraptionEntity.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 747e005d1..5c651529a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -385,11 +385,10 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit CompoundNBT compound = new CompoundNBT(); writeAdditional(compound, true); - byte[] byteArray = null; try { ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); CompressedStreamTools.write(compound, dataOutput); - byteArray = dataOutput.toByteArray(); + byte[] byteArray = dataOutput.toByteArray(); int estimatedPacketSize = byteArray.length; if (estimatedPacketSize > 2_000_000) { Create.logger.warn("Could not send Contraption Spawn Data (Packet too big): " @@ -404,7 +403,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return; } - buffer.writeByteArray(byteArray); + buffer.writeCompoundTag(compound); } @Override From 6db763ed5d7f0cc23e08c5b2d8c090b44f5717f0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 16 Apr 2021 01:13:46 +0200 Subject: [PATCH 12/16] Seat-hopping into oblivion - Fixed Seat interaction being too restrictive with max reach - Contraption seats can no longer be mounted while riding something else --- gradle.properties | 2 +- src/generated/resources/.cache/cache | 2 +- src/generated/resources/assets/create/sounds.json | 2 +- src/main/java/com/simibubi/create/AllSoundEvents.java | 4 ++-- src/main/java/com/simibubi/create/Create.java | 2 +- .../components/press/MechanicalPressTileEntity.java | 2 +- .../structureMovement/ContraptionHandlerClient.java | 2 ++ .../structureMovement/sync/ContraptionInteractionPacket.java | 2 +- src/main/resources/META-INF/mods.toml | 2 +- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gradle.properties b/gradle.properties index cb210473c..6f4a1d878 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false # mod version info -mod_version=0.3.1b +mod_version=0.3.1c minecraft_version=1.16.5 forge_version=36.0.42 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 25603aa31..dc18e2d28 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -56fa207f8d0d76e0435252d13dbe4b967c61aa89 assets/create/sounds.json +f98bf9f870ac5ee5b31c12a20739773c5fee4949 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index f53419501..bfba50746 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -38,7 +38,7 @@ "mechanical_press_activation": { "sounds": [ { - "name": "minecraft:block.netherite_block.hit", + "name": "minecraft:block.anvil.land", "type": "event" } ], diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 721bdc982..78e387233 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -51,8 +51,8 @@ public class AllSoundEvents { .build(), MECHANICAL_PRESS_ACTIVATION = create("mechanical_press_activation").subtitle("Mechanical Press clangs") - .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .5f, 1.25f) - .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .playExisting(SoundEvents.BLOCK_ANVIL_LAND, .125f, 1f) + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .5f, 1f) .category(SoundCategory.BLOCKS) .build(), diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 6cd979ead..8880d98f4 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -55,7 +55,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.3.1b"; + public static final String VERSION = "0.3.1c"; public static Logger logger = LogManager.getLogger(); public static ItemGroup baseCreativeTab = new CreateItemGroup(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 5ff38295f..e840bc3ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -186,7 +186,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (world.getBlockState(pos.down(2)).getSoundType() == SoundType.CLOTH) AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); else - AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos); + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos, .5f, .75f + (Math.abs(getSpeed()) / 1024f)); if (!world.isRemote) sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java index f3b6d2d29..3ab9bb670 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java @@ -63,6 +63,8 @@ public class ContraptionHandlerClient { ClientPlayerEntity player = mc.player; if (player == null) return; + if (player.isPassenger()) + return; if (mc.world == null) return; if (!event.isUseItem()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java index aa286757c..1120719d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/sync/ContraptionInteractionPacket.java @@ -54,7 +54,7 @@ public class ContraptionInteractionPacket extends SimplePacketBase { if (!(entityByID instanceof AbstractContraptionEntity)) return; AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; - double d = sender.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue(); + double d = sender.getAttribute(ForgeMod.REACH_DISTANCE.get()).getValue() + 10; if (!sender.canEntityBeSeen(entityByID)) d -= 3; d *= d; diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 4a93dd067..3c8e798a7 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -15,7 +15,7 @@ Technology that empowers the player.''' [[dependencies.create]] modId="forge" mandatory=true - versionRange="[34.0.0,)" + versionRange="[35.1.16,)" ordering="NONE" side="BOTH" From 8a41cd57b09a8656f91fb1837756cb865e654b96 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 16 Apr 2021 01:57:43 +0200 Subject: [PATCH 13/16] Quality Software - Temporary hotfix to Ponder block breaking animations --- .../com/simibubi/create/foundation/ponder/PonderScene.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index b7393efd6..fd9b44284 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -449,7 +449,8 @@ public class PonderScene { } else { // For block breaking overlay; Don't ask ms.scale(f, f, f); - ms.translate(0.525, .2975, .9); + if (f == 30) + ms.translate(0.525, .2975, .9); ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset, (basePlateSize + basePlateOffsetZ) / -2f); float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30; From 9697a30d76b9afc2099ef3bbb05b1889e2f67bc7 Mon Sep 17 00:00:00 2001 From: tterrag Date: Sun, 18 Apr 2021 14:04:08 -0400 Subject: [PATCH 14/16] Remove references to antlr IntegerList in favor of fastutil IntList --- .../foundation/ponder/PonderProgressBar.java | 17 ++++++++--------- .../create/foundation/ponder/PonderScene.java | 7 ++++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index caf8bbcc6..e19eaa51f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -1,13 +1,12 @@ package com.simibubi.create.foundation.ponder; -import org.antlr.v4.runtime.misc.IntegerList; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.SoundHandler; import net.minecraft.client.gui.FontRenderer; @@ -59,7 +58,7 @@ public class PonderProgressBar extends AbstractSimiWidget { @Override public void onClick(double mouseX, double mouseY) { PonderScene activeScene = ponder.getActiveScene(); - IntegerList keyframeTimes = activeScene.keyframeTimes; + IntList keyframeTimes = activeScene.keyframeTimes; int keyframeIndex = getHoveredKeyframeIndex(activeScene, mouseX); @@ -68,17 +67,17 @@ public class PonderProgressBar extends AbstractSimiWidget { else if (keyframeIndex == keyframeTimes.size()) ponder.seekToTime(activeScene.totalTime); else - ponder.seekToTime(keyframeTimes.get(keyframeIndex)); + ponder.seekToTime(keyframeTimes.getInt(keyframeIndex)); } public int getHoveredKeyframeIndex(PonderScene activeScene, double mouseX) { - IntegerList keyframeTimes = activeScene.keyframeTimes; + IntList keyframeTimes = activeScene.keyframeTimes; int totalTime = activeScene.totalTime; int clickedAtTime = (int) ((mouseX - x) / ((double) width + 4) * totalTime); { - int lastKeyframeTime = keyframeTimes.get(keyframeTimes.size() - 1); + int lastKeyframeTime = keyframeTimes.getInt(keyframeTimes.size() - 1); int diffToEnd = totalTime - clickedAtTime; int diffToLast = clickedAtTime - lastKeyframeTime; @@ -91,7 +90,7 @@ public class PonderProgressBar extends AbstractSimiWidget { int index = -1; for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); + int keyframeTime = keyframeTimes.getInt(i); if (keyframeTime > clickedAtTime) break; @@ -156,7 +155,7 @@ public class PonderProgressBar extends AbstractSimiWidget { hoverEndColor = 0; hoverStartColor = 0; } - IntegerList keyframeTimes = activeScene.keyframeTimes; + IntList keyframeTimes = activeScene.keyframeTimes; if (hoverIndex == -1) drawKeyframe(ms, activeScene, true, 0, 0, hoverStartColor, hoverEndColor, 8); @@ -164,7 +163,7 @@ public class PonderProgressBar extends AbstractSimiWidget { drawKeyframe(ms, activeScene, true, activeScene.totalTime, width + 4, hoverStartColor, hoverEndColor, 8); for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); + int keyframeTime = keyframeTimes.getInt(i); int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.totalTime) * (width + 4)); boolean selected = i == hoverIndex; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index fd9b44284..b3a9173b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -13,7 +13,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import org.antlr.v4.runtime.misc.IntegerList; import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableObject; @@ -32,6 +31,8 @@ import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.outliner.Outliner; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; @@ -60,7 +61,7 @@ public class PonderScene { int textIndex; String sceneId; - IntegerList keyframeTimes; + IntList keyframeTimes; List schedule, activeSchedule; Map linkedElements; @@ -110,7 +111,7 @@ public class PonderScene { info = new SceneRenderInfo(); baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); - keyframeTimes = new IntegerList(4); + keyframeTimes = new IntArrayList(4); scaleFactor = 1; yOffset = 0; From 9391700c261c0a193cca3e7036605fe403908fd1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Apr 2021 02:19:12 +0200 Subject: [PATCH 15/16] SoundScapes, Part I - Sounds for depots, funnels, cogwheels and generic kinetic rumbling, also fans --- src/generated/resources/.cache/cache | 28 ++-- .../resources/assets/create/lang/en_us.json | 12 +- .../assets/create/lang/unfinished/de_de.json | 14 +- .../assets/create/lang/unfinished/es_es.json | 14 +- .../assets/create/lang/unfinished/es_mx.json | 14 +- .../assets/create/lang/unfinished/fr_fr.json | 14 +- .../assets/create/lang/unfinished/it_it.json | 14 +- .../assets/create/lang/unfinished/ja_jp.json | 14 +- .../assets/create/lang/unfinished/ko_kr.json | 14 +- .../assets/create/lang/unfinished/nl_nl.json | 14 +- .../assets/create/lang/unfinished/pt_br.json | 14 +- .../assets/create/lang/unfinished/ru_ru.json | 14 +- .../assets/create/lang/unfinished/zh_cn.json | 14 +- .../assets/create/lang/unfinished/zh_tw.json | 14 +- .../resources/assets/create/sounds.json | 41 +++++ .../java/com/simibubi/create/AllBlocks.java | 3 + .../com/simibubi/create/AllSoundEvents.java | 56 ++++++- .../contraptions/base/KineticTileEntity.java | 61 +++++-- .../components/fan/AirCurrent.java | 47 +++++- .../components/fan/AirCurrentSound.java | 48 ++++++ .../advanced/GantryShaftTileEntity.java | 5 + .../elementary/SimpleKineticTileEntity.java | 10 +- .../relays/gearbox/GearboxTileEntity.java | 5 + .../logistics/block/depot/DepotBehaviour.java | 11 +- .../block/depot/SharedDepotBlockMethods.java | 2 + .../block/funnel/FunnelTileEntity.java | 8 +- .../simibubi/create/events/ClientEvents.java | 11 +- .../foundation/sound/ContinuousSound.java | 55 +++++++ .../foundation/sound/RepeatingSound.java | 39 +++++ .../create/foundation/sound/SoundScape.java | 88 ++++++++++ .../create/foundation/sound/SoundScapes.java | 150 ++++++++++++++++++ .../resources/assets/create/sounds/cogs.ogg | Bin 0 -> 75155 bytes 32 files changed, 747 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/SoundScape.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java create mode 100644 src/main/resources/assets/create/sounds/cogs.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index dc18e2d28..c1ddae6db 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,19 +407,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json -3878d0d84b9575728bd299385af2a61bd3a84243 assets/create/lang/en_us.json -33296621c4421a2dc329a3739d8efafbb3b5b57a assets/create/lang/unfinished/de_de.json -052248ce9880cb3db937fed06c6d46a3ca77d1b4 assets/create/lang/unfinished/es_es.json -05d9d186ad4888c2dcb1eb08fe9b78e1e5482cd7 assets/create/lang/unfinished/es_mx.json -dea56d5fcda7baf23d5938b43c1770b5cd76c6f6 assets/create/lang/unfinished/fr_fr.json -56513c7dd8f8ce309b0f77019a2b1b0a55c0cf38 assets/create/lang/unfinished/it_it.json -888191ed07af611597d5ff852ca3d6cb6bf803b7 assets/create/lang/unfinished/ja_jp.json -95fcbeeffd2ced25371f86c9529d4108bf26f930 assets/create/lang/unfinished/ko_kr.json -03e170a7196c4c76942e8b6fde2b0a0b9b877113 assets/create/lang/unfinished/nl_nl.json -a1e092ee4a6eb19568f36535f183afe1d326f0cf assets/create/lang/unfinished/pt_br.json -74b3356506bdb4bf7046768bd7735fa95057d61a assets/create/lang/unfinished/ru_ru.json -ce16cef5a488c2f86def742ca2e436cb42e18552 assets/create/lang/unfinished/zh_cn.json -b55d5abac95ba2649f656857f54b39f98e686767 assets/create/lang/unfinished/zh_tw.json +af76eb706726692eaf7f9f50f40c9278a10c539d assets/create/lang/en_us.json +ec771f0345e4148458035ec8cd4bffc480b45f47 assets/create/lang/unfinished/de_de.json +8ff19eddb1cbf42e3f16abc3968b7554b45d0769 assets/create/lang/unfinished/es_es.json +d7b6c821789f32ed7c4324bb17502cf75ee8b219 assets/create/lang/unfinished/es_mx.json +f4fd19eb4e2d60947b675efe7bc9b27dc7036cd4 assets/create/lang/unfinished/fr_fr.json +c219fafeb713fb4e13a5c1c5fa6a0268fe35cc5f assets/create/lang/unfinished/it_it.json +c44d961f8bb66645257d03dd1f44447cc529cf7b assets/create/lang/unfinished/ja_jp.json +723457b7ff8a06e3d50870e33fa0e5a0db16f9a6 assets/create/lang/unfinished/ko_kr.json +32bffbc8b9b6d02793aaa7328de2ca7c178d87dc assets/create/lang/unfinished/nl_nl.json +27a2d533fa7be9e9e982a1c4b93bb0e5c01e6bf0 assets/create/lang/unfinished/pt_br.json +878bab030e26e6c26fdd5199284aa23d2fb79cc5 assets/create/lang/unfinished/ru_ru.json +7648680dd52bb8f0ba04de23038c0530d37fe7fc assets/create/lang/unfinished/zh_cn.json +624b2a537ee44a2493806414a512805a5683d155 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -f98bf9f870ac5ee5b31c12a20739773c5fee4949 assets/create/sounds.json +736b2475009be0a214894aad0a42cc2760d2f982 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 76da8e5cb..9983acfaa 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1152,15 +1152,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Schematicannon fires", - "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.slime_added": "Slime squishes", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", - "create.subtitle.blockzapper_deny": "Declining boop", "create.subtitle.blockzapper_confirm": "Affirmative ding", + "create.subtitle.depot_slide": "Item slides", "create.subtitle.blockzapper_place": "Blockzapper zaps", "create.subtitle.blaze_munch": "Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "Schematicannon fires", + "create.subtitle.funnel_flap": "Funnel Flaps", + "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "Declining boop", + "create.subtitle.depot_plop": "Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index fef0fbea0..a6bd5c9e5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 914", + "_": "Missing Localizations: 918", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", - "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Schleim matscht", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", - "create.subtitle.blockzapper_deny": "Ablehnendes Boop", "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", "create.subtitle.blaze_munch": "Lohe kaut glücklich", + "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", + "create.subtitle.blockzapper_deny": "Ablehnendes Boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 17ad4bdce..badc0e300 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 607", + "_": "Missing Localizations: 611", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", - "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime aplastado", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", - "create.subtitle.blockzapper_deny": "Boop declinante", "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", "create.subtitle.blaze_munch": "Blaze mastica felizmente", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", + "create.subtitle.blockzapper_deny": "Boop declinante", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index e362b5565..c09524579 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1265", + "_": "Missing Localizations: 1269", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 586f39174..5604fb0ba 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1164", + "_": "Missing Localizations: 1168", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", - "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Bruit de slime", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", - "create.subtitle.blockzapper_deny": "Boop de déclin", "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Blocs se zappant en place", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", + "create.subtitle.blockzapper_deny": "Boop de déclin", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index f627cf5c9..e7b579942 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 624", + "_": "Missing Localizations: 628", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", - "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime schiacciato", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", - "create.subtitle.blockzapper_deny": "Boop in calo", "create.subtitle.blockzapper_confirm": "Ding affermativo", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", + "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", + "create.subtitle.blockzapper_deny": "Boop in calo", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 99d078dda..710906f08 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 606", + "_": "Missing Localizations: 610", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", - "create.subtitle.blockzapper_deny": "失敗音", "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "ブロックを発射して設置する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", + "create.subtitle.blockzapper_deny": "失敗音", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 103772bb5..6e1ab4253 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 677", + "_": "Missing Localizations: 681", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", - "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "슬라임이 철퍽거림", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.blockzapper_deny": "취소 효과음", "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "블록이 순간이동됨", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.mechanical_press_activation": "압착기가 가동됨", + "create.subtitle.blockzapper_deny": "취소 효과음", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 3e5158e17..4a9af2145 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1554", + "_": "Missing Localizations: 1558", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 3cb760892..8b04c7e28 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1608", + "_": "Missing Localizations: 1612", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 0cc11a18b..c2af4c0e5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 521", + "_": "Missing Localizations: 525", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", - "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Намазывание слизи", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Блок запрыгивает на место", "create.subtitle.blaze_munch": "Всполох радостно жуёт", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.blockzapper_deny": "Тихий буп", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 63960b6ec..9c8df949e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 621", + "_": "Missing Localizations: 625", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", - "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "粘液:挤碎声", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.blockzapper_deny": "放置失败", "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "放置方块", "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.mechanical_press_activation": "辊压机:工作中", + "create.subtitle.blockzapper_deny": "放置失败", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 53ea0ab80..3b992fa9f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 626", + "_": "Missing Localizations: 630", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", - "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "黏液擠壓", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.blockzapper_deny": "放置失敗", "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "放置方塊", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.mechanical_press_activation": "液壓機工作", + "create.subtitle.blockzapper_deny": "放置失敗", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index bfba50746..e9103988e 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -35,6 +35,47 @@ ], "subtitle": "create.subtitle.blockzapper_place" }, + "cogs": { + "sounds": [ + "create:cogs" + ], + "subtitle": "create.subtitle.cogs" + }, + "depot_plop": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.add_item", + "type": "event" + } + ], + "subtitle": "create.subtitle.depot_plop" + }, + "depot_slide": { + "sounds": [ + { + "name": "minecraft:block.sand.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.depot_slide" + }, + "funnel_flap": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.rotate_item", + "type": "event" + } + ], + "subtitle": "create.subtitle.funnel_flap" + }, + "funnel_flap_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.wool.place", + "type": "event" + } + ] + }, "mechanical_press_activation": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5065e7bdb..fb06bd42f 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -447,6 +447,7 @@ public class AllBlocks { public static final BlockEntry BASIN = REGISTRATE.block("basin", BasinBlock::new) .initialProperties(SharedProperties::stone) + .properties(p -> p.sound(SoundType.NETHERITE)) .blockstate(new BasinGenerator()::generate) .onRegister(addMovementBehaviour(new BasinMovementBehaviour())) .item() @@ -496,6 +497,7 @@ public class AllBlocks { public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.NETHERITE)) .addLayer(() -> RenderType::getCutoutMipped) .blockstate(new ChuteGenerator()::generate) .item(ChuteItem::new) @@ -504,6 +506,7 @@ public class AllBlocks { public static final BlockEntry SMART_CHUTE = REGISTRATE.block("smart_chute", SmartChuteBlock::new) .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.NETHERITE)) .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) .item() .transform(customItemModel("_", "block")) diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 78e387233..b12e726d4 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -45,6 +45,22 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), + DEPOT_SLIDE = create("depot_slide").subtitle("Item slides") + .playExisting(SoundEvents.BLOCK_SAND_BREAK, .125f, 1.5f) + .category(SoundCategory.BLOCKS) + .build(), + + DEPOT_PLOP = create("depot_plop").subtitle("Item lands") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, .25f, 1.25f) + .category(SoundCategory.BLOCKS) + .build(), + + FUNNEL_FLAP = create("funnel_flap").subtitle("Funnel Flaps") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ROTATE_ITEM, .125f, 1.5f) + .playExisting(SoundEvents.BLOCK_WOOL_BREAK, .0425f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + SLIME_ADDED = create("slime_added").subtitle("Slime squishes") .playExisting(SoundEvents.BLOCK_SLIME_BLOCK_PLACE) .category(SoundCategory.BLOCKS) @@ -78,6 +94,10 @@ public class AllSoundEvents { .category(SoundCategory.PLAYERS) .build(), + COGS = create("cogs").subtitle("Cogwheels rumble") + .category(SoundCategory.BLOCKS) + .build(), + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) .category(SoundCategory.BLOCKS) @@ -212,6 +232,8 @@ public class AllSoundEvents { public abstract void write(JsonObject json); + public abstract SoundEvent getMainEvent(); + public String getSubtitleKey() { return Create.ID + ".subtitle." + id; } @@ -255,6 +277,12 @@ public class AllSoundEvents { abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); + public void playAt(World world, BlockPos pos, float volume, float pitch, boolean fade) { + playAt(world, pos.getX(), pos.getY(), pos.getZ(), volume, pitch, fade); + } + + public abstract void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade); + } static class WrappedSoundEntry extends SoundEntry { @@ -280,6 +308,12 @@ public class AllSoundEvents { } } + @Override + public SoundEvent getMainEvent() { + return compiledEvents.get(0) + .getFirst(); + } + protected String getIdOf(int i) { return i == 0 ? id : id + "_compounded_" + i; } @@ -311,6 +345,15 @@ public class AllSoundEvents { volPitch.getSecond() * pitch); } } + + @Override + public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { + for (Pair> pair : compiledEvents) { + Couple volPitch = pair.getSecond(); + world.playSound(x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, + volPitch.getSecond() * pitch, fade); + } + } } static class CustomSoundEntry extends SoundEntry { @@ -324,8 +367,12 @@ public class AllSoundEvents { @Override public void register(IForgeRegistry registry) { ResourceLocation location = getLocation(); - SoundEvent sound = new SoundEvent(location).setRegistryName(location); - registry.register(sound); + registry.register(event = new SoundEvent(location).setRegistryName(location)); + } + + @Override + public SoundEvent getMainEvent() { + return event; } @Override @@ -343,6 +390,11 @@ public class AllSoundEvents { world.playSound(entity, x, y, z, event, category, volume, pitch); } + @Override + public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { + world.playSound(x, y, z, event, category, volume, pitch, fade); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index eed822ab4..d6dfbbdeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -15,10 +15,12 @@ import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; +import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; +import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; @@ -36,12 +38,14 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered { @@ -93,6 +97,7 @@ public abstract class KineticTileEntity extends SmartTileEntity if (world.isRemote) { cachedBoundingBox = null; // cache the bounding box for every frame between ticks + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio()); return; } @@ -391,21 +396,28 @@ public abstract class KineticTileEntity extends SmartTileEntity boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0; if (overStressed && AllConfigs.CLIENT.enableOverstressedTooltip.get()) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.stressometer.overstressed").formatted(GOLD))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.stressometer.overstressed") + .formatted(GOLD))); ITextComponent hint = Lang.translate("gui.contraptions.network_overstressed"); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy().append(cutString.get(i))); + tooltip.add(componentSpacing.copy() + .append(cutString.get(i))); return true; } if (notFastEnough) { - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.speedRequirement").formatted(GOLD))); - ITextComponent hint = Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock() - .getTranslationKey())); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("tooltip.speedRequirement") + .formatted(GOLD))); + ITextComponent hint = + Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock() + .getTranslationKey())); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy().append(cutString.get(i))); + tooltip.add(componentSpacing.copy() + .append(cutString.get(i))); return true; } @@ -418,13 +430,21 @@ public abstract class KineticTileEntity extends SmartTileEntity float stressAtBase = calculateStressApplied(); if (calculateStressApplied() != 0 && StressImpact.isEnabled()) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.goggles.kinetic_stats"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.stressImpact").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.goggles.kinetic_stats"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("tooltip.stressImpact") + .formatted(TextFormatting.GRAY))); float stressTotal = stressAtBase * Math.abs(getTheoreticalSpeed()); - tooltip.add(componentSpacing.copy().append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) - .append(Lang.translate("generic.unit.stress")).append(" ").formatted(TextFormatting.AQUA)).append(Lang.translate("gui.goggles.at_current_speed").formatted(TextFormatting.DARK_GRAY))); + tooltip.add(componentSpacing.copy() + .append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) + .append(Lang.translate("generic.unit.stress")) + .append(" ") + .formatted(TextFormatting.AQUA)) + .append(Lang.translate("gui.goggles.at_current_speed") + .formatted(TextFormatting.DARK_GRAY))); added = true; } @@ -537,6 +557,7 @@ public abstract class KineticTileEntity extends SmartTileEntity } protected AxisAlignedBB cachedBoundingBox; + @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { if (cachedBoundingBox == null) { @@ -548,4 +569,24 @@ public abstract class KineticTileEntity extends SmartTileEntity protected AxisAlignedBB makeRenderBoundingBox() { return super.getRenderBoundingBox(); } + + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + float componentSpeed = Math.abs(getSpeed()); + if (componentSpeed == 0) + return; + float pitch = MathHelper.clamp((componentSpeed / 256f) + .45f, .5f, 1.25f); + + if (isNoisy()) + SoundScapes.playGeneralKineticAmbience(pos, pitch); + + Block block = getBlockState().getBlock(); + if (ICogWheel.isSmallCog(block) || ICogWheel.isSmallCog(block) || block instanceof GearboxBlock) + SoundScapes.playCogwheelAmbience(pos, pitch); + } + + protected boolean isNoisy() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 88d8a91c1..e0b48858b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; @@ -39,6 +40,9 @@ import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3i; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public class AirCurrent { @@ -58,6 +62,8 @@ public class AirCurrent { new ArrayList<>(); protected List caughtEntities = new ArrayList<>(); + static boolean isClientPlayerInAirCurrent; + public AirCurrent(IAirCurrentSource source) { this.source = source; } @@ -70,7 +76,8 @@ public class AirCurrent { if (world != null && world.isRemote) { float offset = pushing ? 0.5f : maxDistance + .5f; Vector3d pos = VecHelper.getCenterOf(source.getAirCurrentPos()) - .add(Vector3d.of(facing.getDirectionVec()).scale(offset)); + .add(Vector3d.of(facing.getDirectionVec()) + .scale(offset)); if (world.rand.nextFloat() < AllConfigs.CLIENT.fanParticleDensity.get()) world.addParticle(new AirFlowParticleData(source.getAirCurrentPos()), pos.x, pos.y, pos.z, 0, 0, 0); } @@ -108,6 +115,8 @@ public class AirCurrent { entity.setMotion(previousMotion.add(new Vector3d(xIn, yIn, zIn).scale(1 / 8f))); entity.fallDistance = 0; + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> enableClientPlayerSound(entity, MathHelper.clamp(speed / 128f * .4f, 0.01f, .4f))); if (entity instanceof ServerPlayerEntity) ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; @@ -115,7 +124,8 @@ public class AirCurrent { entityDistance -= .5f; InWorldProcessing.Type processingType = getSegmentAt((float) entityDistance); if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN_PROCESSING.constructTriggerFor(processingType), (PlayerEntity) entity); + AllTriggers.triggerFor(AllTriggers.FAN_PROCESSING.constructTriggerFor(processingType), + (PlayerEntity) entity); if (processingType == null || processingType == Type.NONE) { continue; @@ -343,7 +353,40 @@ public class AirCurrent { InWorldProcessing.Type type; int startOffset; int endOffset; + } + @OnlyIn(Dist.CLIENT) + static AirCurrentSound flyingSound = null; + + @OnlyIn(Dist.CLIENT) + private static void enableClientPlayerSound(Entity e, float maxVolume) { + if (e != Minecraft.getInstance() + .getRenderViewEntity()) + return; + + isClientPlayerInAirCurrent = true; + + float pitch = (float) MathHelper.clamp(e.getMotion() + .length() * .5f, .5f, 2f); + + if (flyingSound == null || flyingSound.isDonePlaying()) { + flyingSound = new AirCurrentSound(SoundEvents.ITEM_ELYTRA_FLYING, pitch); + Minecraft.getInstance() + .getSoundHandler() + .play(flyingSound); + } + flyingSound.setPitch(pitch); + flyingSound.fadeIn(maxVolume); + } + + @OnlyIn(Dist.CLIENT) + public static void tickClientPlayerSounds() { + if (!AirCurrent.isClientPlayerInAirCurrent && flyingSound != null) + if (flyingSound.isFaded()) + flyingSound.stop(); + else + flyingSound.fadeOut(); + isClientPlayerInAirCurrent = false; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java new file mode 100644 index 000000000..7a9c4a7db --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.contraptions.components.fan; + +import net.minecraft.client.audio.TickableSound; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; + +public class AirCurrentSound extends TickableSound { + + private float pitch; + + protected AirCurrentSound(SoundEvent p_i46532_1_, float pitch) { + super(p_i46532_1_, SoundCategory.BLOCKS); + this.pitch = pitch; + volume = 0.01f; + repeat = true; + repeatDelay = 0; + global = true; + } + + @Override + public void tick() {} + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public void fadeIn(float maxVolume) { + volume = Math.min(maxVolume, volume + .05f); + } + + public void fadeOut() { + volume = Math.max(0, volume - .05f); + } + + public boolean isFaded() { + return volume == 0; + } + + @Override + public float getPitch() { + return pitch; + } + + public void stop() { + setDone(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index dbdeeb073..681a01269 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -99,5 +99,10 @@ public class GantryShaftTileEntity extends KineticTileEntity { return 0; return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f); } + + @Override + protected boolean isNoisy() { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index 2c3f47a6a..5c651a8a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -20,9 +20,8 @@ public class SimpleKineticTileEntity extends KineticTileEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add( - new BracketedTileEntityBehaviour(this, state -> state.getBlock() instanceof AbstractShaftBlock).withTrigger( - state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); + behaviours.add(new BracketedTileEntityBehaviour(this, state -> state.getBlock() instanceof AbstractShaftBlock) + .withTrigger(state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); super.addBehaviours(behaviours); } @@ -44,4 +43,9 @@ public class SimpleKineticTileEntity extends KineticTileEntity { return neighbours; } + @Override + protected boolean isNoisy() { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java index e30eee6cc..add94d709 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java @@ -10,4 +10,9 @@ public class GearboxTileEntity extends DirectionalShaftHalvesTileEntity { super(type); } + @Override + protected boolean isNoisy() { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index 0e67f64fc..02748a50d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -7,6 +7,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.funnel.AbstractFunnelBlock; @@ -274,8 +275,16 @@ public class DepotBehaviour extends TileEntityBehaviour { return returned; } - if (!simulate) + if (!simulate) { + if (this.isEmpty()) { + if (heldItem.insertedFrom.getAxis() + .isHorizontal()) + AllSoundEvents.DEPOT_SLIDE.playOnServer(getWorld(), getPos()); + else + AllSoundEvents.DEPOT_PLOP.playOnServer(getWorld(), getPos()); + } this.heldItem = heldItem; + } return ItemStack.EMPTY; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java index 390938f33..c22ac8df3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.block.depot; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -60,6 +61,7 @@ public class SharedDepotBlockMethods { transported.beltPosition = .25f; behaviour.setHeldItem(transported); player.setHeldItem(hand, ItemStack.EMPTY); + AllSoundEvents.DEPOT_SLIDE.playOnServer(world, pos); } behaviour.tileEntity.notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index e77b5e2cb..02464be74 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -4,6 +4,7 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; @@ -61,7 +62,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn BlockState state = getBlockState(); if (!FunnelBlock.isFunnel(state)) return Mode.INVALID; - if (state.method_28500(BlockStateProperties.POWERED).orElse(false)) + if (state.method_28500(BlockStateProperties.POWERED) + .orElse(false)) return Mode.PAUSED; if (state.getBlock() instanceof BeltFunnelBlock) { Shape shape = state.get(BeltFunnelBlock.SHAPE); @@ -156,7 +158,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn .isVertical(); boolean up = facing == Direction.UP; - outputPos = outputPos.add(Vector3d.of(facing.getDirectionVec()).scale(vertical ? up ? .15f : .5f : .25f)); + outputPos = outputPos.add(Vector3d.of(facing.getDirectionVec()) + .scale(vertical ? up ? .15f : .5f : .25f)); if (!vertical) outputPos = outputPos.subtract(0, .45f, 0); @@ -283,6 +286,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn AllPackets.channel.send(packetTarget(), new FunnelFlapPacket(this, inward)); } else { flap.set(inward ? 1 : -1); + AllSoundEvents.FUNNEL_FLAP.playAt(world, pos, 1, 1, true); } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 88d13aece..67a92c975 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -10,6 +10,7 @@ import com.simibubi.create.Create; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.components.fan.AirCurrent; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineBlock; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisRangeDisplay; @@ -38,6 +39,7 @@ import com.simibubi.create.foundation.render.KineticRenderer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkRenderer; @@ -87,12 +89,15 @@ public class ClientEvents { @SubscribeEvent public static void onTick(ClientTickEvent event) { World world = Minecraft.getInstance().world; - if (event.phase == Phase.START) - return; - if (!isGameActive()) return; + + if (event.phase == Phase.START) { + AirCurrent.tickClientPlayerSounds(); + return; + } + SoundScapes.tick(); AnimationTickHolder.tick(); FastRenderDispatcher.tick(); ScrollValueHandler.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java new file mode 100644 index 000000000..6055b26db --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java @@ -0,0 +1,55 @@ +package com.simibubi.create.foundation.sound; + +import net.minecraft.client.audio.TickableSound; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; + +public class ContinuousSound extends TickableSound { + + private float sharedPitch; + private SoundScape scape; + private float relativeVolume; + + protected ContinuousSound(SoundEvent event, SoundScape scape, float sharedPitch, float relativeVolume) { + super(event, SoundCategory.AMBIENT); + this.scape = scape; + this.sharedPitch = sharedPitch; + this.relativeVolume = relativeVolume; + this.repeat = true; + this.repeatDelay = 0; + this.global = false; + } + + public void remove() { + setDone(); + } + + @Override + public float getVolume() { + return scape.getVolume() * relativeVolume; + } + + @Override + public float getPitch() { + return sharedPitch; + } + + @Override + public double getX() { + return scape.getMeanPos().x; + } + + @Override + public double getY() { + return scape.getMeanPos().y; + } + + @Override + public double getZ() { + return scape.getMeanPos().z; + } + + @Override + public void tick() {} + +} diff --git a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java new file mode 100644 index 000000000..0c8d4c97e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java @@ -0,0 +1,39 @@ +package com.simibubi.create.foundation.sound; + +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.vector.Vector3d; + +public class RepeatingSound { + + private SoundEvent event; + private float sharedPitch; + private int repeatDelay; + private SoundScape scape; + private float relativeVolume; + + public RepeatingSound(SoundEvent event, SoundScape scape, float sharedPitch, float relativeVolume, + int repeatDelay) { + this.event = event; + this.scape = scape; + this.sharedPitch = sharedPitch; + this.relativeVolume = relativeVolume; + this.repeatDelay = Math.max(1, repeatDelay); + } + + public void tick() { + if (AnimationTickHolder.getTicks() % repeatDelay != 0) + return; + + ClientWorld world = Minecraft.getInstance().world; + Vector3d meanPos = scape.getMeanPos(); + + world.playSound(meanPos.x, meanPos.y, meanPos.z, event, SoundCategory.AMBIENT, + scape.getVolume() * relativeVolume, sharedPitch, true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java new file mode 100644 index 000000000..d674a9205 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -0,0 +1,88 @@ +package com.simibubi.create.foundation.sound; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; +import com.simibubi.create.foundation.sound.SoundScapes.PitchGroup; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; + +class SoundScape { + List continuous; + List repeating; + private float pitch; + private AmbienceGroup group; + private Vector3d meanPos; + private PitchGroup pitchGroup; + + public SoundScape(float pitch, AmbienceGroup group) { + this.pitchGroup = SoundScapes.getGroupFromPitch(pitch); + this.pitch = pitch; + this.group = group; + continuous = new ArrayList<>(); + repeating = new ArrayList<>(); + } + + public SoundScape continuous(SoundEvent sound, float relativeVolume, float relativePitch) { + return add(new ContinuousSound(sound, this, pitch * relativePitch, relativeVolume)); + } + + public SoundScape repeating(SoundEvent sound, float relativeVolume, float relativePitch, int delay) { + return add(new RepeatingSound(sound, this, pitch * relativePitch, relativeVolume, delay)); + } + + public SoundScape add(ContinuousSound continuousSound) { + continuous.add(continuousSound); + return this; + } + + public SoundScape add(RepeatingSound repeatingSound) { + repeating.add(repeatingSound); + return this; + } + + public void play() { + continuous.forEach(Minecraft.getInstance() + .getSoundHandler()::play); + } + + public void tick() { + if (AnimationTickHolder.getTicks() % SoundScapes.UPDATE_INTERVAL == 0) + meanPos = null; + repeating.forEach(RepeatingSound::tick); + } + + public void remove() { + continuous.forEach(ContinuousSound::remove); + } + + public Vector3d getMeanPos() { + return meanPos == null ? meanPos = determineMeanPos() : meanPos; + } + + private Vector3d determineMeanPos() { + meanPos = Vector3d.ZERO; + int amount = 0; + for (BlockPos blockPos : SoundScapes.getAllLocations(group, pitchGroup)) { + meanPos = meanPos.add(VecHelper.getCenterOf(blockPos)); + amount++; + } + if (amount == 0) + return meanPos; + return meanPos.scale(1f / amount); + } + + public float getVolume() { + int soundCount = SoundScapes.getSoundCount(group, pitchGroup); + float argMax = (float) SoundScapes.SOUND_VOLUME_ARG_MAX; + return MathHelper.clamp(soundCount / (argMax * 10f), 0, .05f); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java new file mode 100644 index 000000000..163e6d2e9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -0,0 +1,150 @@ +package com.simibubi.create.foundation.sound; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.BiFunction; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; + +public class SoundScapes { + + static final int MAX_AMBIENT_SOURCE_DISTANCE = 16; + static final int UPDATE_INTERVAL = 5; + static final int SOUND_VOLUME_ARG_MAX = 15; + + enum AmbienceGroup { + + KINETIC(SoundScapes::kinetic), COG(SoundScapes::cogwheel) + + ; + + private BiFunction factory; + + private AmbienceGroup(BiFunction factory) { + this.factory = factory; + } + + public SoundScape instantiate(float pitch) { + return factory.apply(pitch, this); + } + + } + + private static SoundScape kinetic(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).continuous(SoundEvents.ENTITY_MINECART_INSIDE, .25f, 1); + } + + private static SoundScape cogwheel(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).continuous(AllSoundEvents.COGS.getMainEvent(), 3, 1); + } + + enum PitchGroup { + VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH + } + + private static Map>> counter = new IdentityHashMap<>(); + private static Map, SoundScape> activeSounds = new HashMap<>(); + + public static void playGeneralKineticAmbience(BlockPos pos, float pitch) { + if (!outOfRange(pos)) + addSound(AmbienceGroup.KINETIC, pos, pitch); + } + + public static void playCogwheelAmbience(BlockPos pos, float pitch) { + if (!outOfRange(pos)) + addSound(AmbienceGroup.COG, pos, pitch); + } + + public static void tick() { + activeSounds.values() + .forEach(SoundScape::tick); + + if (AnimationTickHolder.getTicks() % UPDATE_INTERVAL != 0) + return; + + for (Iterator, SoundScape>> iterator = activeSounds.entrySet() + .iterator(); iterator.hasNext();) { + + Entry, SoundScape> entry = iterator.next(); + Pair key = entry.getKey(); + SoundScape value = entry.getValue(); + + if (getSoundCount(key.getFirst(), key.getSecond()) == 0) { + value.remove(); + iterator.remove(); + } + } + + counter.values() + .forEach(m -> m.values() + .forEach(Set::clear)); + } + + public static void addSound(AmbienceGroup group, BlockPos pos, float pitch) { + PitchGroup groupFromPitch = getGroupFromPitch(pitch); + Set set = counter.computeIfAbsent(group, ag -> new IdentityHashMap<>()) + .computeIfAbsent(groupFromPitch, pg -> new HashSet<>()); + set.add(pos); + + Pair pair = Pair.of(group, groupFromPitch); + activeSounds.computeIfAbsent(pair, $ -> { + SoundScape soundScape = group.instantiate(pitch); + soundScape.play(); + return soundScape; + }); + } + + public static void clean() { + BlockPos playerLocation = getCameraPos(); + for (Map> map : counter.values()) + for (Set set : map.values()) + set.removeIf(p -> !playerLocation.withinDistance(p, MAX_AMBIENT_SOURCE_DISTANCE)); + } + + protected static boolean outOfRange(BlockPos pos) { + return !getCameraPos().withinDistance(pos, MAX_AMBIENT_SOURCE_DISTANCE); + } + + protected static BlockPos getCameraPos() { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + if (renderViewEntity == null) + return BlockPos.ZERO; + BlockPos playerLocation = renderViewEntity.getBlockPos(); + return playerLocation; + } + + public static int getSoundCount(AmbienceGroup group, PitchGroup pitchGroup) { + return getAllLocations(group, pitchGroup).size(); + } + + public static Set getAllLocations(AmbienceGroup group, PitchGroup pitchGroup) { + return counter.getOrDefault(group, Collections.emptyMap()) + .getOrDefault(pitchGroup, Collections.emptySet()); + } + + public static PitchGroup getGroupFromPitch(float pitch) { + if (pitch < .70) + return PitchGroup.VERY_LOW; + if (pitch < .90) + return PitchGroup.LOW; + if (pitch < 1.10) + return PitchGroup.NORMAL; + if (pitch < 1.30) + return PitchGroup.HIGH; + return PitchGroup.VERY_HIGH; + } + +} diff --git a/src/main/resources/assets/create/sounds/cogs.ogg b/src/main/resources/assets/create/sounds/cogs.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fd2c78b49488ca0f9499770a7b1563cec9600e96 GIT binary patch literal 75155 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 Ly5EIw7BTRDMVA-U literal 0 HcmV?d00001 From 559146ef04da5a39b6af4297fadc5174a7ab2d0a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Apr 2021 17:26:46 +0200 Subject: [PATCH 16/16] SoundScapes, Part II - Picking items off belts, depots, basins - Arms collecting an item - Mixing noises - Cranking click noises - Scroll-input noises --- src/generated/resources/.cache/cache | 28 ++++++------ .../resources/assets/create/lang/en_us.json | 3 ++ .../assets/create/lang/unfinished/de_de.json | 5 ++- .../assets/create/lang/unfinished/es_es.json | 5 ++- .../assets/create/lang/unfinished/es_mx.json | 5 ++- .../assets/create/lang/unfinished/fr_fr.json | 5 ++- .../assets/create/lang/unfinished/it_it.json | 5 ++- .../assets/create/lang/unfinished/ja_jp.json | 5 ++- .../assets/create/lang/unfinished/ko_kr.json | 5 ++- .../assets/create/lang/unfinished/nl_nl.json | 5 ++- .../assets/create/lang/unfinished/pt_br.json | 5 ++- .../assets/create/lang/unfinished/ru_ru.json | 5 ++- .../assets/create/lang/unfinished/zh_cn.json | 5 ++- .../assets/create/lang/unfinished/zh_tw.json | 5 ++- .../resources/assets/create/sounds.json | 45 ++++++++++++++++++- .../com/simibubi/create/AllSoundEvents.java | 21 ++++++++- .../components/crank/HandCrankTileEntity.java | 15 ++++++- .../components/fan/AirCurrent.java | 2 +- .../mixer/MechanicalMixerTileEntity.java | 34 ++++++++++++++ .../contraptions/processing/BasinBlock.java | 28 +++++++++--- .../contraptions/relays/belt/BeltBlock.java | 25 ++++++++--- .../block/depot/SharedDepotBlockMethods.java | 5 +++ .../block/mechanicalArm/ArmTileEntity.java | 8 ++++ .../behaviour/filtering/FilteringHandler.java | 9 ++++ .../scrollvalue/ScrollValueHandler.java | 10 ++++- 25 files changed, 248 insertions(+), 45 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index c1ddae6db..5fff6584f 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,19 +407,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json -af76eb706726692eaf7f9f50f40c9278a10c539d assets/create/lang/en_us.json -ec771f0345e4148458035ec8cd4bffc480b45f47 assets/create/lang/unfinished/de_de.json -8ff19eddb1cbf42e3f16abc3968b7554b45d0769 assets/create/lang/unfinished/es_es.json -d7b6c821789f32ed7c4324bb17502cf75ee8b219 assets/create/lang/unfinished/es_mx.json -f4fd19eb4e2d60947b675efe7bc9b27dc7036cd4 assets/create/lang/unfinished/fr_fr.json -c219fafeb713fb4e13a5c1c5fa6a0268fe35cc5f assets/create/lang/unfinished/it_it.json -c44d961f8bb66645257d03dd1f44447cc529cf7b assets/create/lang/unfinished/ja_jp.json -723457b7ff8a06e3d50870e33fa0e5a0db16f9a6 assets/create/lang/unfinished/ko_kr.json -32bffbc8b9b6d02793aaa7328de2ca7c178d87dc assets/create/lang/unfinished/nl_nl.json -27a2d533fa7be9e9e982a1c4b93bb0e5c01e6bf0 assets/create/lang/unfinished/pt_br.json -878bab030e26e6c26fdd5199284aa23d2fb79cc5 assets/create/lang/unfinished/ru_ru.json -7648680dd52bb8f0ba04de23038c0530d37fe7fc assets/create/lang/unfinished/zh_cn.json -624b2a537ee44a2493806414a512805a5683d155 assets/create/lang/unfinished/zh_tw.json +514ab1f6fa3d24dc575a5dcaaaa96a8009da7414 assets/create/lang/en_us.json +7e45e9a69fb4d21d199174673f2ea6fe35ee6859 assets/create/lang/unfinished/de_de.json +2af0dd8cd0776b8ed5110990405f3cd515abe8e8 assets/create/lang/unfinished/es_es.json +90fc3a9475b957eebf10380a960416b072987541 assets/create/lang/unfinished/es_mx.json +997cc00c6a9afbb142e25c5a1840908363afad41 assets/create/lang/unfinished/fr_fr.json +6a9c89ff7a7c2df5f78a6a739a204744a4a5607a assets/create/lang/unfinished/it_it.json +e21697e70444e3c8fb367b7a4fe867726157390d assets/create/lang/unfinished/ja_jp.json +9f2d7b6fc84f6257837b4c517489f6ef31a4e1a5 assets/create/lang/unfinished/ko_kr.json +5bcfe026f3bb3f0aa0ea415e54dedad4195bb70a assets/create/lang/unfinished/nl_nl.json +bc60cb08266e8d13523d086cdb85aa12da78a47b assets/create/lang/unfinished/pt_br.json +288e3e76a1aa090a676415aeb9f5383b3386e40d assets/create/lang/unfinished/ru_ru.json +0b6852ca1cea71d24cfdee7004ab37fa7810a0fe assets/create/lang/unfinished/zh_cn.json +619d82eba592f4ae88ddbc2c9dfae02627876300 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -736b2475009be0a214894aad0a42cc2760d2f982 assets/create/sounds.json +71739e613693c476e481dfcf38628a4f52f0f570 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 9983acfaa..04ab46cf4 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1154,6 +1154,7 @@ "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.mixing": "Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Affirmative ding", "create.subtitle.depot_slide": "Item slides", @@ -1162,8 +1163,10 @@ "create.subtitle.schematicannon_launch_block": "Schematicannon fires", "create.subtitle.funnel_flap": "Funnel Flaps", "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.scroll_value": "Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.blockzapper_deny": "Declining boop", + "create.subtitle.cranking": "Hand Crank turns", "create.subtitle.depot_plop": "Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index a6bd5c9e5..cf3ae191f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 918", + "_": "Missing Localizations: 921", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", "create.subtitle.blockzapper_deny": "Ablehnendes Boop", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index badc0e300..6b9899146 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 611", + "_": "Missing Localizations: 614", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding afirmativo", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", "create.subtitle.blockzapper_deny": "Boop declinante", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index c09524579..76705092c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1269", + "_": "Missing Localizations: 1272", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 5604fb0ba..7de31748c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1168", + "_": "Missing Localizations: 1171", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding d'affirmation", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", "create.subtitle.blockzapper_deny": "Boop de déclin", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index e7b579942..c306ac7a8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 628", + "_": "Missing Localizations: 631", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding affermativo", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", "create.subtitle.blockzapper_deny": "Boop in calo", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 710906f08..1847cbfab 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 610", + "_": "Missing Localizations: 613", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "成功音", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", "create.subtitle.blockzapper_deny": "失敗音", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 6e1ab4253..560628b7e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 681", + "_": "Missing Localizations: 684", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "확인 효과음", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "압착기가 가동됨", "create.subtitle.blockzapper_deny": "취소 효과음", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 4a9af2145..fd213b6f6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1558", + "_": "Missing Localizations: 1561", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 8b04c7e28..d29401108 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1612", + "_": "Missing Localizations: 1615", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index c2af4c0e5..4e61e7a7c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 525", + "_": "Missing Localizations: 528", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Утвердительный динь", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", "create.subtitle.blockzapper_deny": "Тихий буп", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 9c8df949e..ef0da1165 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 625", + "_": "Missing Localizations: 628", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "选择方块", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "辊压机:工作中", "create.subtitle.blockzapper_deny": "放置失败", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 3b992fa9f..e7fb6b633 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 630", + "_": "Missing Localizations: 633", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "選擇方塊", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1163,8 +1164,10 @@ "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "液壓機工作", "create.subtitle.blockzapper_deny": "放置失敗", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index e9103988e..9ce292b97 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -41,6 +41,23 @@ ], "subtitle": "create.subtitle.cogs" }, + "cranking": { + "sounds": [ + { + "name": "minecraft:block.wood.place", + "type": "event" + } + ], + "subtitle": "create.subtitle.cranking" + }, + "cranking_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.wooden_button.click_off", + "type": "event" + } + ] + }, "depot_plop": { "sounds": [ { @@ -71,7 +88,7 @@ "funnel_flap_compounded_1": { "sounds": [ { - "name": "minecraft:block.wool.place", + "name": "minecraft:block.wool.break", "type": "event" } ] @@ -110,6 +127,23 @@ } ] }, + "mixing": { + "sounds": [ + { + "name": "minecraft:block.gilded_blackstone.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.mixing" + }, + "mixing_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.netherrack.break", + "type": "event" + } + ] + }, "schematicannon_finish": { "sounds": [ { @@ -128,6 +162,15 @@ ], "subtitle": "create.subtitle.schematicannon_launch_block" }, + "scroll_value": { + "sounds": [ + { + "name": "minecraft:block.note_block.hat", + "type": "event" + } + ], + "subtitle": "create.subtitle.scroll_value" + }, "slime_added": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index b12e726d4..d6af82c45 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -79,10 +79,27 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), + MIXING = create("mixing").subtitle("Mixing Noises") + .playExisting(SoundEvents.BLOCK_GILDED_BLACKSTONE_BREAK, .125f, .5f) + .playExisting(SoundEvents.BLOCK_NETHERRACK_BREAK, .125f, .5f) + .category(SoundCategory.BLOCKS) + .build(), + + CRANKING = create("cranking").subtitle("Hand Crank turns") + .playExisting(SoundEvents.BLOCK_WOOD_PLACE, .075f, .5f) + .playExisting(SoundEvents.BLOCK_WOODEN_BUTTON_CLICK_OFF, .025f, .5f) + .category(SoundCategory.BLOCKS) + .build(), + BLOCKZAPPER_PLACE = create("blockzapper_place").subtitle("Blockzapper zaps") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) .category(SoundCategory.PLAYERS) .build(), + + SCROLL_VALUE = create("scroll_value").subtitle("Scroll-input clicks") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_HAT, .124f, 1f) + .category(SoundCategory.PLAYERS) + .build(), BLOCKZAPPER_CONFIRM = create("blockzapper_confirm").subtitle("Affirmative ding") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 0.5f, 0.8f) @@ -278,9 +295,9 @@ public class AllSoundEvents { abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); public void playAt(World world, BlockPos pos, float volume, float pitch, boolean fade) { - playAt(world, pos.getX(), pos.getY(), pos.getZ(), volume, pitch, fade); + playAt(world, pos.getX() + .5f, pos.getY() + .5f, pos.getZ() + .5f, volume, pitch, fade); } - + public abstract void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 395adc698..568030a94 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -1,7 +1,9 @@ package com.simibubi.create.content.contraptions.components.crank; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -68,7 +70,7 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { updateGeneratedRotation(); } } - + @Override protected Block getStressConfigKey() { return AllBlocks.HAND_CRANK.get(); @@ -78,4 +80,15 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { public boolean shouldRenderAsTE() { return true; } + + @Override + public void tickAudio() { + super.tickAudio(); + if (inUse > 0 && AnimationTickHolder.getTicks() % 2 == 0) { + if (!AllBlocks.HAND_CRANK.has(getBlockState())) + return; + AllSoundEvents.CRANKING.playAt(world, pos, (inUse) / 5f, .65f + (10 - inUse) / 10f, true); + } + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index e0b48858b..0440de076 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -356,7 +356,7 @@ public class AirCurrent { } @OnlyIn(Dist.CLIENT) - static AirCurrentSound flyingSound = null; + static AirCurrentSound flyingSound; @OnlyIn(Dist.CLIENT) private static void enableClientPlayerSound(Entity e, float maxVolume) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index e7785f56a..86d4219dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; @@ -14,6 +15,8 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -27,9 +30,13 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -120,6 +127,19 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if ((!world.isRemote || isVirtual()) && runningTicks == 20) { if (processingTicks < 0) { processingTicks = MathHelper.clamp((MathHelper.log2((int) (512 / speed))) * 15 + 1, 1, 512); + + Optional basin = getBasin(); + if (basin.isPresent()) { + Couple tanks = basin.get() + .getTanks(); + if (!tanks.getFirst() + .isEmpty() + || !tanks.getSecond() + .isEmpty()) + world.playSound(null, pos, SoundEvents.BLOCK_BUBBLE_COLUMN_WHIRLPOOL_AMBIENT, + SoundCategory.BLOCKS, .75f, speed < 65 ? .75f : 1.5f); + } + } else { processingTicks--; if (processingTicks == 0) { @@ -249,4 +269,18 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { protected Optional getProcessedRecipeTrigger() { return Optional.of(AllTriggers.MIXER_MIX); } + + @Override + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + super.tickAudio(); + + // SoundEvents.BLOCK_STONE_BREAK + boolean slow = Math.abs(getSpeed()) < 65; + if (slow && AnimationTickHolder.getTicks() % 2 == 0) + return; + if (runningTicks == 20) + AllSoundEvents.MIXING.playAt(world, pos, .75f, 1, true); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 16548ca6f..cd27761a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.processing; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.wrench.IWrenchable; @@ -31,6 +32,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; 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.shapes.ISelectionContext; @@ -100,19 +103,30 @@ public class BasinBlock extends Block implements ITE, IWrenchab if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem) || GenericItemFilling.canItemBeFilled(worldIn, heldItem)) return ActionResultType.SUCCESS; - if (heldItem.getItem().equals(Items.SPONGE) && - !te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).map(iFluidHandler -> - iFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.EXECUTE)).orElse(FluidStack.EMPTY).isEmpty()) { + if (heldItem.getItem() + .equals(Items.SPONGE) + && !te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + .map(iFluidHandler -> iFluidHandler.drain(Integer.MAX_VALUE, IFluidHandler.FluidAction.EXECUTE)) + .orElse(FluidStack.EMPTY) + .isEmpty()) { return ActionResultType.SUCCESS; } return ActionResultType.PASS; } IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1)); + boolean success = false; for (int slot = 0; slot < inv.getSlots(); slot++) { - player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); + ItemStack stackInSlot = inv.getStackInSlot(slot); + if (stackInSlot.isEmpty()) + continue; + player.inventory.placeItemBackInInventory(worldIn, stackInSlot); inv.setStackInSlot(slot, ItemStack.EMPTY); + success = true; } + if (success) + worldIn.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, + 1f + Create.random.nextFloat()); te.onEmptied(); } catch (TileEntityException e) { } @@ -131,13 +145,13 @@ public class BasinBlock extends Block implements ITE, IWrenchab return; ItemEntity itemEntity = (ItemEntity) entityIn; withTileEntityDo(worldIn, entityIn.getBlockPos(), te -> { - + // Tossed items bypass the quarter-stack limit te.inputInventory.withMaxStackSize(64); ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem() .copy(), false); te.inputInventory.withMaxStackSize(16); - + if (insertItem.isEmpty()) { itemEntity.remove(); if (!itemEntity.world.isRemote) @@ -227,5 +241,5 @@ public class BasinBlock extends Block implements ITE, IWrenchab public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 35a1844b1..444c963cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -4,9 +4,12 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; @@ -52,6 +55,8 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Hand; import net.minecraft.util.NonNullList; import net.minecraft.util.Rotation; +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.RayTraceResult; @@ -119,11 +124,14 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { player.inventory.placeItemBackInInventory(world, transportedItemStack.stack); + success.setTrue(); return TransportedResult.removeItem(); }); + if (success.isTrue()) + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .2f, + 1f + Create.random.nextFloat()); } if (isShaft) { @@ -598,7 +611,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE