From 5b390d20c6ee6c81737bfda4a079916f0b391400 Mon Sep 17 00:00:00 2001 From: dragonruler1000 Date: Thu, 15 May 2025 09:08:38 -0500 Subject: [PATCH 1/3] Add client-side status message on block activation This change ensures players receive immediate client-side feedback when a block is activated. The addition improves user experience by providing clearer interaction confirmation. Signed-off-by: dragonruler1000 --- .../java/us/minecraftchest2/hdm_mod/block/custom/Window.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java b/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java index 8c14d56..d775c0c 100644 --- a/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java +++ b/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java @@ -104,6 +104,7 @@ public class Window extends HorizontalBlock { String message = "blockActivated"; ITextComponent msg = new StringTextComponent(message); player.sendMessage(msg, player.getUniqueID()); + player.sendStatusMessage(new StringTextComponent("Client: Block activated!"), true); if (!worldIn.isRemote()) return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); if (player.isCrouching()) return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); From 249c235220b6a5df49f5b537927c8228f7aeb416 Mon Sep 17 00:00:00 2001 From: dragonruler1000 Date: Thu, 15 May 2025 09:23:27 -0500 Subject: [PATCH 2/3] Added comments to know what is going on later. Signed-off-by: dragonruler1000 --- .../hdm_mod/item/custom/SubtleKnife.java | 8 ---- .../world/dimension/SimpleTeleporter.java | 39 ++++++++++++++++++- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/us/minecraftchest2/hdm_mod/item/custom/SubtleKnife.java b/src/main/java/us/minecraftchest2/hdm_mod/item/custom/SubtleKnife.java index 0820b96..5c17750 100644 --- a/src/main/java/us/minecraftchest2/hdm_mod/item/custom/SubtleKnife.java +++ b/src/main/java/us/minecraftchest2/hdm_mod/item/custom/SubtleKnife.java @@ -1,7 +1,5 @@ package us.minecraftchest2.hdm_mod.item.custom; -import net.minecraft.block.Blocks; -import net.minecraft.client.Minecraft; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -9,13 +7,7 @@ import net.minecraft.item.ItemUseContext; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; 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.ScoreTextComponent; -import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; -import net.minecraftforge.client.MinecraftForgeClient; import us.minecraftchest2.hdm_mod.block.ModBlocks; diff --git a/src/main/java/us/minecraftchest2/hdm_mod/world/dimension/SimpleTeleporter.java b/src/main/java/us/minecraftchest2/hdm_mod/world/dimension/SimpleTeleporter.java index a9f8992..f852405 100644 --- a/src/main/java/us/minecraftchest2/hdm_mod/world/dimension/SimpleTeleporter.java +++ b/src/main/java/us/minecraftchest2/hdm_mod/world/dimension/SimpleTeleporter.java @@ -1,5 +1,7 @@ package us.minecraftchest2.hdm_mod.world.dimension; +// Imports omitted for brevity + import net.minecraft.block.BlockState; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -10,27 +12,48 @@ import net.minecraftforge.common.util.ITeleporter; import us.minecraftchest2.hdm_mod.block.ModBlocks; import us.minecraftchest2.hdm_mod.block.custom.Window; - import java.util.function.Function; +/** + * Handles teleportation of entities between dimensions, with custom logic for portals and safety. + */ public class SimpleTeleporter implements ITeleporter { + // The destination position for the teleport public static BlockPos thisPos = BlockPos.ZERO; + + // True if teleporting into the custom dimension, false if to overworld public static boolean insideDimension = true; + // Records if the most recent teleport was successful private boolean success = false; + /** + * @return True if the last teleportation was successful (a safe landing spot found), false otherwise + */ public boolean wasSuccessful() { return success; } + /** + * Constructor sets the target position and whether we're inside our custom dimension. + * @param pos Destination position + * @param insideDim Are we inside the custom dimension after teleport? + */ public SimpleTeleporter(BlockPos pos, boolean insideDim) { thisPos = pos; insideDimension = insideDim; } + /** + * Checks if a block position is unsafe (solid, unreplaceable, lava, or fire). + * @param world The world to check in + * @param pos The position to check + * @return True if the position is unsafe, false if safe + */ private boolean isUnsafe(ServerWorld world, BlockPos pos){ BlockState state = world.getBlockState(pos); Material material = state.getMaterial(); + // Not air AND not easily replaced (by water/etc) OR is lava or fire is considered unsafe return material != Material.AIR && !state.isReplaceable(Fluids.WATER) && !material.isReplaceable() || @@ -38,32 +61,46 @@ public class SimpleTeleporter implements ITeleporter { material == Material.FIRE; } + /** + * Handles the actual placing of the entity when teleporting between dimensions. + * Will try to find a safe spot upwards, up to 25 tries. + * Also, optionally places a portal block at the destination. + */ @Override public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destinationWorld, float yaw, Function repositionEntity) { + // Move entity to the origin position entity = repositionEntity.apply(false); + + // Default target y coordinate for the destination double y = 61; + // If not going inside the custom dimension, use the saved Y if (!insideDimension) { y = thisPos.getY(); } + // Calculate the intended destination block position BlockPos destinationPos = new BlockPos(thisPos.getX(), y, thisPos.getZ()); + // Try to find a safe spot (air, replaceable, not lava/fire) by moving up, max 25 attempts int tries = 0; while ((isUnsafe(destinationWorld, destinationPos) || isUnsafe(destinationWorld, destinationPos.up())) && tries < 25) { destinationPos = destinationPos.up(2); tries++; } + // If it couldn't find a safe spot after 25 attempts, fail teleport if (tries >= 25) { this.success = false; return entity; } + // Move entity to found safe location entity.setPositionAndUpdate(destinationPos.getX(), destinationPos.getY(), destinationPos.getZ()); this.success = true; + // When entering a custom dimension, make a portal block at the destination unless one already exists nearby if (insideDimension) { boolean doSetBlock = true; for (BlockPos checkPos : BlockPos.getAllInBoxMutable(destinationPos.down(10).west(10), destinationPos.up(10).east(10))) { From 748ab1b988c5efd2b83aec93f7e4c8ea161fa5cf Mon Sep 17 00:00:00 2001 From: dragonruler1000 Date: Thu, 15 May 2025 11:06:33 -0500 Subject: [PATCH 3/3] Refactor Window block interactions and register new block Simplified the onBlockActivated logic for clarity and better separation of client and server behavior. Added null checks, improved crouching interaction handling, and adjusted dimension change logic. Registered the "window" block and updated the language file to include its name. Added comments so i can know what is going on later. --- .../hdm_mod/block/ModBlocks.java | 51 +++++++++++++------ .../hdm_mod/block/custom/Window.java | 46 ++++++++--------- .../resources/assets/hdm_mod/lang/en_us.json | 3 +- 3 files changed, 59 insertions(+), 41 deletions(-) diff --git a/src/main/java/us/minecraftchest2/hdm_mod/block/ModBlocks.java b/src/main/java/us/minecraftchest2/hdm_mod/block/ModBlocks.java index bf24224..b11579b 100644 --- a/src/main/java/us/minecraftchest2/hdm_mod/block/ModBlocks.java +++ b/src/main/java/us/minecraftchest2/hdm_mod/block/ModBlocks.java @@ -18,33 +18,54 @@ import java.util.function.Supplier; import java.util.function.ToIntFunction; public class ModBlocks { - public static ToIntFunction dustLightLevel = BlockState -> 10; // Dust Light Level - public static ToIntFunction PORTAL_LIGHT_LEVEL = BlockState ->15; + // Function to determine the light level for the "dust" block + public static ToIntFunction dustLightLevel = BlockState -> 10; // Fixed value of 10 + + // Function to set the light level for the "portal" block + public static ToIntFunction PORTAL_LIGHT_LEVEL = BlockState -> 15; // Fixed value of 15 + + // DeferredRegister to register blocks with Forge, using your mod ID public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Hdm_mod.MOD_ID); - + // Registering a "block of dust" with specific properties public static final RegistryObject DUST_BLOCK = registerBlock("block_of_dust", - () -> new Block(AbstractBlock.Properties.create(Material.ROCK).doesNotBlockMovement().harvestLevel(0) - .hardnessAndResistance(500f, 100f).setLightLevel(dustLightLevel))); + () -> new Block( + AbstractBlock.Properties.create(Material.ROCK) // Base material is rock + .doesNotBlockMovement() // Entities can move through this block + .harvestLevel(0) // Harvest level + .hardnessAndResistance(500f, 100f) // Hardness and blast resistance + .setLightLevel(dustLightLevel) // Provides light using the dustLightLevel function + ) + ); + // Registering a "portal" block called "window" with different properties public static final RegistryObject PORTAL_BLOCK = registerBlock("window", - () -> new Block(AbstractBlock.Properties.create(Material.PORTAL).doesNotBlockMovement().harvestLevel(10) - .hardnessAndResistance(1000f, 1000f).setLightLevel(PORTAL_LIGHT_LEVEL))); + () -> new Block( + AbstractBlock.Properties.create(Material.PORTAL) // Base material is portal + .doesNotBlockMovement() // Entities can move through this block + .harvestLevel(10) // High harvest level + .hardnessAndResistance(1000f, 1000f) // Very hard and blast resistant + .setLightLevel(PORTAL_LIGHT_LEVEL) // Maximum light level + ) + ); - - private static RegistryObject registerBlock(String name, Supplier block) { - RegistryObject toReturn = BLOCKS.register(name, block); - registerBlockItem(name, toReturn); + // Helper method to register a block and its corresponding BlockItem at once + private static RegistryObject registerBlock(String name, Supplier block) { + RegistryObject toReturn = BLOCKS.register(name, block); // Register the block itself + registerBlockItem(name, toReturn); // Register the block as an item return toReturn; } + // Helper method to register the item form of a block, belonging to a custom item group private static void registerBlockItem(String name, RegistryObject block) { - ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), - new Item.Properties().group(ModItemGroup.HDM_BLOCK_GROUP))); + ModItems.ITEMS.register(name, () -> new BlockItem( + block.get(), + new Item.Properties().group(ModItemGroup.HDM_BLOCK_GROUP) // Assigns to the HDM block group + )); } + // This method is called to register all blocks with the mod event bus public static void register(IEventBus eventBus){ BLOCKS.register(eventBus); } - -} +} \ No newline at end of file diff --git a/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java b/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java index d775c0c..060818a 100644 --- a/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java +++ b/src/main/java/us/minecraftchest2/hdm_mod/block/custom/Window.java @@ -100,35 +100,31 @@ public class Window extends HorizontalBlock { * @return Result of the interaction */ @Override - public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - String message = "blockActivated"; - ITextComponent msg = new StringTextComponent(message); - player.sendMessage(msg, player.getUniqueID()); - player.sendStatusMessage(new StringTextComponent("Client: Block activated!"), true); - if (!worldIn.isRemote()) return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); - if (player.isCrouching()) return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, + PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { + // Client-side: Only show a status message + if (worldIn.isRemote()) { + player.sendStatusMessage(new StringTextComponent("Client: Block activated!"), true); + return ActionResultType.SUCCESS; + } + // Server-side logic below + player.sendMessage(new StringTextComponent("blockActivated"), player.getUniqueID()); + + // Prevent action if sneaking (crouching) + if (player.isCrouching()) { + return ActionResultType.PASS; + } - if (worldIn.getServer() == null) return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); MinecraftServer server = worldIn.getServer(); - if (worldIn.getDimensionKey() == ModDimensions.World1) { - ServerWorld overWorld = server.getWorld(World.OVERWORLD); - if (overWorld != null) { - player.changeDimension(overWorld, new SimpleTeleporter(pos, false)); - } + if (server == null) { + return ActionResultType.FAIL; } - ServerWorld targetWorld; - boolean goingToCustom = worldIn.getDimensionKey() != ModDimensions.World1; - if (goingToCustom) { - targetWorld = server.getWorld(ModDimensions.World1); - } else { - ServerWorld world1 = server.getWorld(ModDimensions.World1); - if (world1 != null) { - player.changeDimension(world1, new SimpleTeleporter(pos, true)); - } - targetWorld = server.getWorld(World.OVERWORLD); - } + boolean goingToCustom = worldIn.getDimensionKey() != ModDimensions.World1; + ServerWorld targetWorld = goingToCustom + ? server.getWorld(ModDimensions.World1) + : server.getWorld(World.OVERWORLD); if (targetWorld != null) { SimpleTeleporter teleporter = new SimpleTeleporter(pos, goingToCustom); @@ -143,7 +139,7 @@ public class Window extends HorizontalBlock { return ActionResultType.SUCCESS; } - return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); + return ActionResultType.FAIL; } diff --git a/src/main/resources/assets/hdm_mod/lang/en_us.json b/src/main/resources/assets/hdm_mod/lang/en_us.json index 5bfcdda..efdaf9b 100644 --- a/src/main/resources/assets/hdm_mod/lang/en_us.json +++ b/src/main/resources/assets/hdm_mod/lang/en_us.json @@ -5,5 +5,6 @@ "item.hdm_mod.subtle_knife": "Subtle Knife", "item.hdm_mod.omelet": "Omelet", "item.hdm_mod.dust": "Dust", - "block.hdm_mod.block_of_dust": "Block of Dust" + "block.hdm_mod.block_of_dust": "Block of Dust", + "block.hdm_mod.window": "Window" } \ No newline at end of file