From fc91b63d127c5bea6d37cf40b541683679ab4a72 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:29:08 +0200 Subject: [PATCH] Riveting Development - Valve handles no longer create stress config entries for each dyed variant - Place near initial angle mode on bearings now has a smaller interval considered 'near' - Rollers are now a little easier to place and expand - Players can now take items from saws via right-click - Item Drains now accept dropped items as input - Train track placement overlay now explicitly mentions the ctrl key --- src/generated/resources/.cache/cache | 5 +- .../resources/assets/create/lang/en_us.json | 3 +- .../data/create/advancements/long_bend.json | 30 ------ .../data/create/advancements/long_train.json | 2 +- .../java/com/simibubi/create/AllBlocks.java | 4 +- .../com/simibubi/create/CreateClient.java | 2 + .../components/actors/RollerBlock.java | 100 ++++++++++++++++++ .../components/actors/RollerBlockItem.java | 29 +++++ .../crank/HandCrankBlockEntity.java | 3 +- .../contraptions/components/saw/SawBlock.java | 48 +++++++-- .../bearing/MechanicalBearingBlockEntity.java | 2 +- .../fluids/actors/ItemDrainBlock.java | 37 ++++++- .../trains/track/TrackPlacement.java | 66 ++++++++++-- .../advancement/AllAdvancements.java | 8 +- .../foundation/data/BuilderTransformers.java | 1 - .../create/foundation/item/KineticStats.java | 5 + .../assets/create/lang/default/interface.json | 1 + 17 files changed, 279 insertions(+), 67 deletions(-) delete mode 100644 src/generated/resources/data/create/advancements/long_bend.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockItem.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index a1146bf1b..9a78f0224 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -567,7 +567,7 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 0f4e5a2fc58580df5b156fdac438ddeb6b57e386 assets/create/lang/en_ud.json -2502e2934b3e39763f5619e1522b0b6f98bc26d7 assets/create/lang/en_us.json +aa858245829503947285d0a41b41ec7119de4219 assets/create/lang/en_us.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 @@ -2263,8 +2263,7 @@ eff2f22dfdf7ed94f868bfdf960fd6a6c8f6a567 data/create/advancements/hose_pulley.js c119d8187e57286836579cf33d4bcdced2406932 data/create/advancements/hose_pulley_lava.json ce5a2e1e2ac7049f03c6c8f15130112500bbae2f data/create/advancements/lava_wheel_00000.json 63d86087604035e4e70c203d9b73a7d567a173c1 data/create/advancements/linked_controller.json -f81d3e42370e8429bcd165d745dfc19fdcf6dedd data/create/advancements/long_bend.json -22d19a986e27169ad170792ef5dcbcdf2ea4d214 data/create/advancements/long_train.json +5678c0e3fae7a7cd45a5c5b60f651350d314b8a8 data/create/advancements/long_train.json 648e40cace7bd3d2cb1375ae89fd2ee0e0ad561e data/create/advancements/long_travel.json 258a8c893b8a0265fb1c80f6fa528e80157884e8 data/create/advancements/mechanical_arm.json 418feaeabccc9bfa6ed89fa36de9d6991ce2c7c2 data/create/advancements/mechanical_crafter.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c2f53b0e1..bf7b0fb6c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -852,8 +852,6 @@ "advancement.create.train_portal.desc": "Ride a Train through a Nether portal", "advancement.create.track_crafting_factory": "Track Factory", "advancement.create.track_crafting_factory.desc": "Produce more than 1000 Train Tracks with the same Mechanical Press", - "advancement.create.long_bend": "The Longest Bend", - "advancement.create.long_bend.desc": "Create a curved track section that spans more than 30 blocks in length", "advancement.create.long_train": "Ambitious Endeavours", "advancement.create.long_train.desc": "Create a Train with at least 6 carriages", "advancement.create.long_travel": "Field Trip", @@ -1576,6 +1574,7 @@ "create.track.turn_start": "Cannot start connection from a Turn", "create.track.not_enough_tracks": "Not holding enough tracks", "create.track.not_enough_pavement": "Not holding enough pavement blocks", + "create.track.hold_for_smooth_curve": "Hold %1$s for maximized turn", "create.portal_track.failed": "Cannot place portal track:", "create.portal_track.missing": "Target portal not generated yet", diff --git a/src/generated/resources/data/create/advancements/long_bend.json b/src/generated/resources/data/create/advancements/long_bend.json deleted file mode 100644 index 5b6f5f513..000000000 --- a/src/generated/resources/data/create/advancements/long_bend.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "create:track_crafting_factory", - "display": { - "icon": { - "item": "create:track" - }, - "title": { - "translate": "advancement.create.long_bend" - }, - "description": { - "color": "#DBA213", - "translate": "advancement.create.long_bend.desc" - }, - "frame": "goal", - "show_toast": true, - "announce_to_chat": true, - "hidden": false - }, - "criteria": { - "0": { - "trigger": "create:long_bend_builtin", - "conditions": {} - } - }, - "requirements": [ - [ - "0" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/long_train.json b/src/generated/resources/data/create/advancements/long_train.json index e72513d0a..83ff7a661 100644 --- a/src/generated/resources/data/create/advancements/long_train.json +++ b/src/generated/resources/data/create/advancements/long_train.json @@ -1,5 +1,5 @@ { - "parent": "create:long_bend", + "parent": "create:track_crafting_factory", "display": { "icon": { "item": "minecraft:minecart" diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index f3b0d4064..84fdcd984 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -27,6 +27,7 @@ import com.simibubi.create.content.contraptions.components.actors.PloughMovement import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement; import com.simibubi.create.content.contraptions.components.actors.RollerBlock; +import com.simibubi.create.content.contraptions.components.actors.RollerBlockItem; import com.simibubi.create.content.contraptions.components.actors.RollerMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; @@ -904,6 +905,7 @@ public class AllBlocks { REGISTRATE.block("copper_valve_handle", ValveHandleBlock::copper) .transform(pickaxeOnly()) .transform(BuilderTransformers.valveHandle(null)) + .transform(BlockStressDefaults.setCapacity(8.0)) .register(); public static final DyedBlockList DYED_VALVE_HANDLES = new DyedBlockList<>(colour -> { @@ -1375,7 +1377,7 @@ public class AllBlocks { .onRegister(movementBehaviour(new RollerMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .addLayer(() -> RenderType::cutoutMipped) - .item() + .item(RollerBlockItem::new) .transform(customItemModel()) .register(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 83bfe4fbf..54ea1a696 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.curiosities.weapons.PotatoCannonRenderHandler import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler; import com.simibubi.create.content.logistics.trains.GlobalRailwayManager; +import com.simibubi.create.content.logistics.trains.track.TrackPlacement; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; @@ -104,6 +105,7 @@ public class CreateClient { OverlayRegistry.registerOverlayAbove(ForgeIngameGui.HOTBAR_ELEMENT, "Create's Linked Controller", LinkedControllerClientHandler.OVERLAY); OverlayRegistry.registerOverlayAbove(ForgeIngameGui.HOTBAR_ELEMENT, "Create's Schematics", SCHEMATIC_HANDLER.getOverlayRenderer()); OverlayRegistry.registerOverlayAbove(ForgeIngameGui.HOTBAR_ELEMENT, "Create's Toolboxes", ToolboxHandlerClient.OVERLAY); + OverlayRegistry.registerOverlayAbove(ForgeIngameGui.HOTBAR_ELEMENT, "Create's Track Placement", TrackPlacement.OVERLAY); } public static void invalidateRenderers() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java index 748e4efd8..6f0ecfc6a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlock.java @@ -1,24 +1,43 @@ package com.simibubi.create.content.contraptions.components.actors; +import java.util.function.Predicate; + import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.utility.placement.IPlacementHelper; +import com.simibubi.create.foundation.utility.placement.PlacementHelpers; +import com.simibubi.create.foundation.utility.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ForgeMod; public class RollerBlock extends AttachedActorBlock implements IBE { public static DamageSource damageSourceRoller = new DamageSource("create.mechanical_roller"); + private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); + public RollerBlock(Properties p_i48377_1_) { super(p_i48377_1_); } @@ -50,4 +69,85 @@ public class RollerBlock extends AttachedActorBlock implements IBE getItemPredicate() { + return AllBlocks.MECHANICAL_ROLLER::isIn; + } + + @Override + public Predicate getStatePredicate() { + return AllBlocks.MECHANICAL_ROLLER::has; + } + + public int attachedSteps(Level world, BlockPos pos, Direction direction) { + BlockPos checkPos = pos.relative(direction); + BlockState state = world.getBlockState(checkPos); + int count = 0; + while (getStatePredicate().test(state)) { + count++; + checkPos = checkPos.relative(direction); + state = world.getBlockState(checkPos); + } + return count; + } + + @Override + public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, + BlockHitResult ray) { + + Direction dir = null; + Direction facing = state.getValue(FACING); + + for (Direction nearest : Direction.orderedByNearest(player)) { + if (nearest.getAxis() != facing.getClockWise() + .getAxis()) + continue; + dir = nearest; + break; + } + + int range = AllConfigs.server().curiosities.placementAssistRange.get(); + if (player != null) { + AttributeInstance reach = player.getAttribute(ForgeMod.REACH_DISTANCE.get()); + if (reach != null && reach.hasModifier(ExtendoGripItem.singleRangeAttributeModifier)) + range += 4; + } + + int row = attachedSteps(world, pos, dir); + if (row >= range) + return PlacementOffset.fail(); + + BlockPos newPos = pos.relative(dir, row + 1); + BlockState newState = world.getBlockState(newPos); + + if (!state.canSurvive(world, newPos)) + return PlacementOffset.fail(); + + if (newState.getMaterial() + .isReplaceable()) + return PlacementOffset.success(newPos, bState -> bState.setValue(FACING, facing)); + return PlacementOffset.fail(); + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockItem.java new file mode 100644 index 000000000..36d101a3d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockItem.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class RollerBlockItem extends BlockItem { + + public RollerBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public InteractionResult place(BlockPlaceContext ctx) { + BlockPos clickedPos = ctx.getClickedPos(); + Level level = ctx.getLevel(); + BlockState blockStateBelow = level.getBlockState(clickedPos.below()); + if (!Block.isFaceFull(blockStateBelow.getCollisionShape(level, clickedPos.below()), Direction.UP)) + return super.place(ctx); + Direction clickedFace = ctx.getClickedFace(); + return super.place(BlockPlaceContext.at(ctx, clickedPos.relative(Direction.UP), clickedFace)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlockEntity.java index b1ce4981d..5d75891f0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlockEntity.java @@ -76,7 +76,8 @@ public class HandCrankBlockEntity extends GeneratingKineticBlockEntity { @Override protected Block getStressConfigKey() { - return AllBlocks.HAND_CRANK.get(); + return AllBlocks.HAND_CRANK.has(getBlockState()) ? AllBlocks.HAND_CRANK.get() + : AllBlocks.COPPER_VALVE_HANDLE.get(); } @Override 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 a1ac7f78b..ef7cddab1 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 @@ -12,9 +12,13 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -24,6 +28,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -40,7 +45,8 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IBE { + for (int i = 0; i < be.inventory.getSlots(); i++) { + ItemStack heldItemStack = be.inventory.getStackInSlot(i); + if (!worldIn.isClientSide && !heldItemStack.isEmpty()) + player.getInventory() + .placeItemBackInInventory(heldItemStack); + } + be.inventory.clear(); + be.notifyUpdate(); + return InteractionResult.SUCCESS; + }); + } + @Override public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity entityIn) { if (entityIn instanceof ItemEntity) return; - if (!new AABB(pos).deflate(.1f).intersects(entityIn.getBoundingBox())) + if (!new AABB(pos).deflate(.1f) + .intersects(entityIn.getBoundingBox())) return; withBlockEntityDo(worldIn, pos, be -> { if (be.getSpeed() == 0) @@ -85,30 +114,33 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IBE getBlockEntityClass() { return SawBlockEntity.class; } - + @Override public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.SAW.get(); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlockEntity.java index 7b50883ac..8a92027e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlockEntity.java @@ -242,7 +242,7 @@ public class MechanicalBearingBlockEntity extends GeneratingKineticBlockEntity } public boolean isNearInitialAngle() { - return Math.abs(angle) < 45 || Math.abs(angle) > 7 * 45; + return Math.abs(angle) < 22.5 || Math.abs(angle) > 360 - 22.5; } @Override 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 11b5a90a8..5688b4f90 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 @@ -6,7 +6,9 @@ import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.ComparatorUtil; +import com.simibubi.create.foundation.blockEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.fluid.FluidHelper; import net.minecraft.core.BlockPos; @@ -14,7 +16,9 @@ import net.minecraft.core.Direction; import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -25,6 +29,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; @@ -56,7 +61,8 @@ public class ItemDrainBlock extends Block implements IWrenchable, IBE getBlockEntityClass() { return ItemDrainBlockEntity.class; } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.ITEM_DRAIN.get(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index 74be032b8..8e852252f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -6,17 +6,19 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.jozufozu.flywheel.util.Color; +import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.content.logistics.trains.ITrackBlock; -import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Color; +import com.simibubi.create.foundation.utility.Components; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -27,6 +29,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -35,6 +38,7 @@ import net.minecraft.core.Direction.AxisDirection; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Inventory; @@ -42,6 +46,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -53,6 +58,9 @@ import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.gui.ForgeIngameGui; +import net.minecraftforge.client.gui.IIngameOverlay; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.items.ItemHandlerHelper; public class TrackPlacement { @@ -98,6 +106,8 @@ public class TrackPlacement { static int hoveringAngle; static ItemStack lastItem; + static int extraTipWarmup; + public static PlacementInfo tryConnect(Level level, Player player, BlockPos pos2, BlockState state2, ItemStack stack, boolean girder, boolean maximiseTurn) { Vec3 lookVec = player.getLookAngle(); @@ -283,10 +293,10 @@ public class TrackPlacement { if (skipCurve && !Mth.equal(ascend, 0)) { int hDistance = info.end1Extent; if (axis1.y == 0 || !Mth.equal(absAscend + 1, dist / axis1.length())) { - + if (axis1.y != 0 && axis1.y == -axis2.y) return info.withMessage("ascending_s_curve"); - + info.end1Extent = 0; double minHDistance = Math.max(absAscend < 4 ? absAscend * 4 : absAscend * 3, 6) / axis1.length(); if (hDistance < minHDistance) @@ -447,10 +457,6 @@ public class TrackPlacement { BlockItem paveItem = (BlockItem) offhandItem.getItem(); paveTracks(level, info, paveItem, false); } - - if (info.curve != null && info.curve.getLength() > 29) - AllAdvancements.LONG_BEND.awardTo(player); - return placeTracks(level, info, state1, state2, targetPos1, targetPos2, false); } @@ -576,6 +582,8 @@ public class TrackPlacement { LocalPlayer player = Minecraft.getInstance().player; ItemStack stack = player.getMainHandItem(); HitResult hitResult = Minecraft.getInstance().hitResult; + int restoreWarmup = extraTipWarmup; + extraTipWarmup = 0; if (hitResult == null) return; @@ -609,8 +617,14 @@ public class TrackPlacement { if (!(hitState.getBlock() instanceof TrackBlock)) return; + extraTipWarmup = restoreWarmup; boolean maxTurns = Minecraft.getInstance().options.keySprint.isDown(); PlacementInfo info = tryConnect(level, player, pos, hitState, stack, false, maxTurns); + if (extraTipWarmup < 20) + extraTipWarmup++; + if (!info.valid || !hoveringMaxed && (info.end1Extent == 0 || info.end2Extent == 0)) + extraTipWarmup = 0; + if (!player.isCreative() && (info.valid || !info.hasRequiredTracks || !info.hasRequiredPavement)) BlueprintOverlayRenderer.displayTrackRequirements(info, player.getOffhandItem()); @@ -625,7 +639,7 @@ public class TrackPlacement { if (bhr.getDirection() == Direction.UP) { Vec3 lookVec = player.getLookAngle(); int lookAngle = (int) (22.5 + AngleHelper.deg(Mth.atan2(lookVec.z, lookVec.x)) % 360) / 8; - + if (!pos.equals(hintPos) || lookAngle != hintAngle) { hints = Couple.create(ArrayList::new); hintAngle = lookAngle; @@ -761,4 +775,38 @@ public class TrackPlacement { .colored(color); } + @OnlyIn(Dist.CLIENT) + public static final IIngameOverlay OVERLAY = TrackPlacement::renderOverlay; + + @OnlyIn(Dist.CLIENT) + public static void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width, + int height) { + Minecraft mc = Minecraft.getInstance(); + if (mc.options.hideGui || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) + return; + if (hoveringPos == null) + return; + if (cached == null || cached.curve == null || !cached.valid) + return; + if (extraTipWarmup < 4) + return; + + if (ObfuscationReflectionHelper.getPrivateValue(Gui.class, gui, + "toolHighlightTimer") instanceof Integer toolHighlightTimer && toolHighlightTimer > 0) + return; + + boolean active = mc.options.keySprint.isDown(); + MutableComponent text = Lang.translateDirect("track.hold_for_smooth_curve", Components.keybind("key.sprint") + .withStyle(active ? ChatFormatting.WHITE : ChatFormatting.GRAY)); + + Window window = mc.getWindow(); + int x = (window.getGuiScaledWidth() - gui.getFont() + .width(text)) / 2; + int y = window.getGuiScaledHeight() - 61; + Color color = new Color(0x4ADB4A).setAlpha(Mth.clamp((extraTipWarmup - 4) / 3f, 0.1f, 1)); + gui.getFont() + .draw(poseStack, text, x, y, color.getRGB()); + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 2ed37ea6e..d667b0f42 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -565,16 +565,10 @@ public class AllAdvancements implements DataProvider { .after(STURDY_SHEET) .special(EXPERT)), - LONG_BEND = create("long_bend", b -> b.icon(AllBlocks.TRACK) - .title("The Longest Bend") - .description("Create a curved track section that spans more than 30 blocks in length") - .after(TRACK_CRAFTING) - .special(EXPERT)), - LONG_TRAIN = create("long_train", b -> b.icon(Items.MINECART) .title("Ambitious Endeavours") .description("Create a Train with at least 6 carriages") - .after(LONG_BEND) + .after(TRACK_CRAFTING) .special(EXPERT)), LONG_TRAVEL = create("long_travel", b -> b.icon(AllBlocks.SEATS.get(DyeColor.GREEN)) diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index a8e289bc3..57023b69e 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -250,7 +250,6 @@ public class BuilderTransformers { .texture("3", p.modLoc("block/valve_handle/valve_handle_" + variant))); }) .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.VALVE_HANDLES.tag) - .transform(BlockStressDefaults.setCapacity(8.0)) .transform(BlockStressDefaults.setGeneratorSpeed(ValveHandleBlock::getSpeedRange)) .onRegister(ItemUseOverrides::addBlock) .item() diff --git a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java index a0a3bd2b2..347e49c58 100644 --- a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java +++ b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java @@ -8,8 +8,10 @@ import java.util.List; import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; +import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.steam.SteamEngineBlock; import com.simibubi.create.content.contraptions.goggles.GogglesItem; import com.simibubi.create.foundation.block.BlockStressValues; @@ -71,6 +73,9 @@ public class KineticStats implements TooltipModifier { showStressImpact = true; } + if (block instanceof ValveHandleBlock) + block = AllBlocks.COPPER_VALVE_HANDLE.get(); + boolean hasStressImpact = StressImpact.isEnabled() && showStressImpact && BlockStressValues.getImpact(block) > 0; boolean hasStressCapacity = StressImpact.isEnabled() && BlockStressValues.hasCapacity(block); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 472453f5f..606c01225 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -734,6 +734,7 @@ "create.track.turn_start": "Cannot start connection from a Turn", "create.track.not_enough_tracks": "Not holding enough tracks", "create.track.not_enough_pavement": "Not holding enough pavement blocks", + "create.track.hold_for_smooth_curve": "Hold %1$s for maximized turn", "create.portal_track.failed": "Cannot place portal track:", "create.portal_track.missing": "Target portal not generated yet",