Add Niard (#148) #1096

Merged
Trytoon merged 5 commits from feat/148-niard-reverse-drain into dev/1.21.1 2025-09-30 17:55:31 +00:00
Trytoon commented 2025-06-29 07:32:09 +00:00 (Migrated from github.com)

Description

Added the Niard Block. This block places fluid around it in a given range when supplied with power and a fluid.

TODO

  • Finish rendering the fluid "shower" when active
  • Tank Renderer to see the fluid inside

Changes

I made some util classes to reuse some of the Fluid Tank logic for the Niard

Checklist

  • My code follows the style guidelines of this project (.editorconfig, most IDEs will use this for you).
  • I have made corresponding changes to the documentation.
  • My changes are ready for review from a contributor.

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Introduced the Niard machine block, which automatically places fluids in the world within a configurable range.
    • Added a dedicated Niard GUI featuring fluid tank display, energy, redstone control, activity indicator, and range adjustment buttons.
    • Provided a crafting recipe for the Niard block.
    • Implemented visual range indicators with configurable colour and a custom block model for the Niard.
    • Added fluid rendering utilities and integrated them into machine block entity renderers for consistent fluid visuals.
  • Configuration

    • Added client and server configuration options for Niard energy capacity, usage, and range colour.
  • Documentation

    • Updated language and configuration files to include the Niard machine.
  • Chores

    • Registered the Niard block, block entity, menu, and screen in the game’s block and menu registries.
# Description Added the Niard Block. This block places fluid around it in a given range when supplied with power and a fluid. <!-- If you're submitting a Draft PR, consider providing a TODO list using checkboxes --> # TODO - [x] Finish rendering the fluid "shower" when active - [x] Tank Renderer to see the fluid inside # Changes I made some util classes to reuse some of the Fluid Tank logic for the Niard <!-- For drafts, fill this in as you go; if you are leaving draft, make sure these are all complete. --> # Checklist - [X] My code follows the style guidelines of this project (.editorconfig, most IDEs will use this for you). - [X] I have made corresponding changes to the documentation. - [X] My changes are ready for review from a contributor. <!-- Thanks to: https://embeddedartistry.com/blog/2017/08/04/a-github-pull-request-template-for-your-projects/ for the building blocks of this template --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit - **New Features** - Introduced the Niard machine block, which automatically places fluids in the world within a configurable range. - Added a dedicated Niard GUI featuring fluid tank display, energy, redstone control, activity indicator, and range adjustment buttons. - Provided a crafting recipe for the Niard block. - Implemented visual range indicators with configurable colour and a custom block model for the Niard. - Added fluid rendering utilities and integrated them into machine block entity renderers for consistent fluid visuals. - **Configuration** - Added client and server configuration options for Niard energy capacity, usage, and range colour. - **Documentation** - Updated language and configuration files to include the Niard machine. - **Chores** - Registered the Niard block, block entity, menu, and screen in the game’s block and menu registries. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2025-06-29 07:32:42 +00:00 (Migrated from github.com)

Walkthrough

This update introduces a new machine called the "Niard" with full block, entity, menu, GUI, configuration, and recipe integration. It refactors internal fluid tank logic, adds range-based fluid placement mechanics, registers all necessary assets and configuration entries, and provides crafting and block model resources for the new machine.

Changes

File(s) / Path(s) Change Summary
.../client/gui/screen/NiardScreen.java Added new GUI screen for the Niard machine with widgets for fluid, energy, range, and redstone controls.
.../common/blocks/niard/NiardBlock.java
.../niard/NiardBlockEntity.java
.../niard/NiardMenu.java
.../niard/NiardRangeIterator.java
.../niard/package-info.java
Introduced the Niard machine block, its entity, menu, range iterator, and package annotations.
.../common/blocks/fluid_tank/FluidTankBlockEntity.java
.../common/blocks/fluid_tank/InternalTankTasks.java
Refactored fluid tank logic: moved internal fill, drain, and mend tool logic to new utility class InternalTankTasks.
.../common/config/MachinesConfigLang.java Added translation entry for "niard".
.../common/config/client/MachinesClientBlocksConfig.java Added client config for Niard range colour.
.../common/config/common/EnergyConfig.java Added config values for Niard energy capacity and usage.
.../common/init/MachineBlockEntities.java Registered Niard block entity.
.../common/init/MachineBlocks.java Registered Niard block.
.../common/init/MachineMenus.java Registered Niard menu and associated screen.
.../data/recipes/MachineRecipeProvider.java Added crafting recipe for Niard and included it in the machines list.
.../resources/assets/enderio/models/block/niard.json Added block model resource for Niard.
.../client/rendering/blockentity/FluidTankBER.java
.../client/rendering/item/FluidTankBEWLR.java
.../core/client/FluidRendererUtil.java
.../client/rendering/blockentity/NiardBER.java
Refactored fluid rendering: centralized fluid rendering logic in FluidRendererUtil; added Niard block entity renderer.

Sequence Diagram(s)

sequenceDiagram
    participant Player
    participant NiardBlock
    participant NiardBlockEntity
    participant World

    Player->>NiardBlock: useItemOn()
    NiardBlock->>NiardBlockEntity: handleFluidItemInteraction()
    alt Fluid interaction handled
        NiardBlockEntity-->>Player: Consume item, update inventory
    else Not handled
        NiardBlock->>NiardBlock: Fallback to superclass useItemOn()
    end

    loop Each server tick
        NiardBlockEntity->>NiardBlockEntity: fill tank from input items
        NiardBlockEntity->>NiardRangeIterator: Iterate positions in range
        alt Can place fluid
            NiardBlockEntity->>World: Place fluid block
            NiardBlockEntity->>NiardBlockEntity: Drain fluid, consume energy
        end
    end
  • Team-EnderIO/EnderIO#1017: Adds common widget factory methods for range increase/decrease buttons used in various GUIs, related to NiardScreen's range control buttons.

Suggested labels

Area-Backend, MC-1.21.1

Suggested reviewers

  • Rover656

Poem

In the land of Ender, a Niard appears,
With tanks and with range, it conquers all fears.
It places the fluids with energy spent,
Its GUI sparkles—on progress it's bent!
So hop with delight, for the code is now clear,
The Niard is ready—let’s give it a cheer!
🐇

Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.
<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough This update introduces a new machine called the "Niard" with full block, entity, menu, GUI, configuration, and recipe integration. It refactors internal fluid tank logic, adds range-based fluid placement mechanics, registers all necessary assets and configuration entries, and provides crafting and block model resources for the new machine. ## Changes | File(s) / Path(s) | Change Summary | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| | .../client/gui/screen/NiardScreen.java | Added new GUI screen for the Niard machine with widgets for fluid, energy, range, and redstone controls. | | .../common/blocks/niard/NiardBlock.java<br>.../niard/NiardBlockEntity.java<br>.../niard/NiardMenu.java<br>.../niard/NiardRangeIterator.java<br>.../niard/package-info.java | Introduced the Niard machine block, its entity, menu, range iterator, and package annotations. | | .../common/blocks/fluid_tank/FluidTankBlockEntity.java<br>.../common/blocks/fluid_tank/InternalTankTasks.java | Refactored fluid tank logic: moved internal fill, drain, and mend tool logic to new utility class InternalTankTasks.| | .../common/config/MachinesConfigLang.java | Added translation entry for "niard". | | .../common/config/client/MachinesClientBlocksConfig.java | Added client config for Niard range colour. | | .../common/config/common/EnergyConfig.java | Added config values for Niard energy capacity and usage. | | .../common/init/MachineBlockEntities.java | Registered Niard block entity. | | .../common/init/MachineBlocks.java | Registered Niard block. | | .../common/init/MachineMenus.java | Registered Niard menu and associated screen. | | .../data/recipes/MachineRecipeProvider.java | Added crafting recipe for Niard and included it in the machines list. | | .../resources/assets/enderio/models/block/niard.json | Added block model resource for Niard. | | .../client/rendering/blockentity/FluidTankBER.java<br>.../client/rendering/item/FluidTankBEWLR.java<br>.../core/client/FluidRendererUtil.java<br>.../client/rendering/blockentity/NiardBER.java | Refactored fluid rendering: centralized fluid rendering logic in FluidRendererUtil; added Niard block entity renderer.| ## Sequence Diagram(s) ```mermaid sequenceDiagram participant Player participant NiardBlock participant NiardBlockEntity participant World Player->>NiardBlock: useItemOn() NiardBlock->>NiardBlockEntity: handleFluidItemInteraction() alt Fluid interaction handled NiardBlockEntity-->>Player: Consume item, update inventory else Not handled NiardBlock->>NiardBlock: Fallback to superclass useItemOn() end loop Each server tick NiardBlockEntity->>NiardBlockEntity: fill tank from input items NiardBlockEntity->>NiardRangeIterator: Iterate positions in range alt Can place fluid NiardBlockEntity->>World: Place fluid block NiardBlockEntity->>NiardBlockEntity: Drain fluid, consume energy end end ``` ## Possibly related PRs - Team-EnderIO/EnderIO#1017: Adds common widget factory methods for range increase/decrease buttons used in various GUIs, related to NiardScreen's range control buttons. ## Suggested labels `Area-Backend`, `MC-1.21.1` ## Suggested reviewers - Rover656 ## Poem > In the land of Ender, a Niard appears, > With tanks and with range, it conquers all fears. > It places the fluids with energy spent, > Its GUI sparkles—on progress it's bent! > So hop with delight, for the code is now clear, > The Niard is ready—let’s give it a cheer! > 🐇✨ <!-- walkthrough_end --> <!-- internal state start --> <!-- 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= --> <!-- internal state end --> <!-- finishing_touch_checkbox_start --> <details open="true"> <summary>✨ Finishing Touches</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings </details> <!-- finishing_touch_checkbox_end --> <!-- tips_start --> --- Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. <details> <summary>❤️ Share</summary> - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code) </details> <details> <summary>🪧 Tips</summary> ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Team-EnderIO/EnderIO&utm_content=1096): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit <commit_id>, please review it.` - `Explain this complex logic.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai explain this code block.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.` - `@coderabbitai read src/utils.ts and explain its main purpose.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` ### Support Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (Invoked using PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR. - `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. ### Other keywords and placeholders - Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. - Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description. - Add `@coderabbitai` anywhere in the PR title to generate the title automatically. ### CodeRabbit Configuration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit. - Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements. </details> <!-- tips_end -->
coderabbitai[bot] (Migrated from github.com) reviewed 2025-06-29 07:37:17 +00:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 4

🧹 Nitpick comments (6)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (1)

101-101: Remove the French comment.

The comment is not in English and is also incorrect as the method already exists.

                        fluidHandlerItem,
-                        blockEntity.getFluidHandler(), // méthode à définir dans ton interface
+                        blockEntity.getFluidHandler(),
                        tank.getFluidAmount(blockEntity),
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java (1)

24-25: Fix formatting: Add missing spaces.

There are missing spaces after bc.getY() in the position calculations.

Apply this diff to fix the formatting:

-                positions.add(new BlockPos(bc.getX() + j, bc.getY()- 1, bc.getZ() + i));
-                positions.add(new BlockPos(bc.getX() - j, bc.getY()- 1, bc.getZ() - i));
+                positions.add(new BlockPos(bc.getX() + j, bc.getY() - 1, bc.getZ() + i));
+                positions.add(new BlockPos(bc.getX() - j, bc.getY() - 1, bc.getZ() - i));
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (1)

51-68: Consider refactoring duplicated button handling logic.

The suppression comment indicates this button handling pattern is duplicated across multiple menu classes. Consider extracting this to a shared utility method or base class to improve maintainability.

Would you like me to help create a shared button handler utility that can be reused across different menu classes?

enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (3)

44-46: Standardise on a single annotation library.

The code imports @Nullable from JetBrains annotations and @Nonnull from javax.annotation. Consider using annotations from a single library for consistency.

-import org.jetbrains.annotations.Nullable;
-
-import javax.annotation.Nonnull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;

Or alternatively, use javax.annotation for both:

-import org.jetbrains.annotations.Nullable;
-
-import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.Nonnull;

62-62: Fix formatting: remove extra space.

-    public static final  TankAccess TANK = new TankAccess();
+    public static final TankAccess TANK = new TankAccess();

220-220: Fix formatting: remove extra space.

-            || (fluidInTank == Fluids.LAVA && (fluidAtPos == Fluids.LAVA  || fluidAtPos == Fluids.FLOWING_LAVA))
+            || (fluidInTank == Fluids.LAVA && (fluidAtPos == Fluids.LAVA || fluidAtPos == Fluids.FLOWING_LAVA))
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 84bfe2477a and 467e4bd9f9.

Files ignored due to path filters (10)
  • enderio-machines/src/generated/resources/assets/enderio/blockstates/niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/assets/enderio/lang/en_us.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/assets/enderio/models/block/niard_combined.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/assets/enderio/models/item/niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/data/enderio/advancement/recipes/misc/erase_niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/data/enderio/advancement/recipes/misc/niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/data/enderio/loot_table/blocks/niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/data/enderio/recipe/erase_niard.json is excluded by !**/generated/**
  • enderio-machines/src/generated/resources/data/enderio/recipe/niard.json is excluded by !**/generated/**
  • enderio-machines/src/main/resources/assets/enderio/textures/block/niard_front.png is excluded by !**/*.png
📒 Files selected for processing (16)
  • enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/package-info.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/config/MachinesConfigLang.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/config/common/EnergyConfig.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (3 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/data/recipes/MachineRecipeProvider.java (2 hunks)
  • enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (5)
enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (2)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)
  • NiardBlockEntity (49-299)
enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (1)
  • MachineBlocks (75-467)
enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (2)
enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java (1)
  • NiardScreen (18-59)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (1)
  • NiardMenu (13-69)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java (1)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (1)
  • InternalTankTasks (21-149)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (5)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/menu/MachineSlot.java (1)
  • MachineSlot (12-54)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/menu/PoweredMachineMenu.java (1)
  • PoweredMachineMenu (15-58)
enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (1)
  • MachineBlockEntities (66-279)
enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (1)
  • MachineMenus (64-130)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)
  • NiardBlockEntity (49-299)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java (1)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)
  • NiardBlockEntity (49-299)
Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Run Tests
  • GitHub Check: Analyze (java-kotlin)
🔇 Additional comments (23)
enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java (3)

40-42: Standard imports look good.


217-219: Correct delegation to utility class.

The refactoring properly delegates the fluid filling logic to the centralised utility.


221-223: Correct delegation to utility class.

The refactoring properly delegates the fluid draining logic to the centralised utility.

enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (2)

24-66: Well-structured fluid filling logic.

The method properly handles both bucket and fluid handler item interactions with appropriate simulation checks.


115-147: Correct implementation of tool mending logic.

The method properly handles experience fluid consumption and tool repair calculations.

enderio-machines/src/main/java/com/enderio/machines/common/config/MachinesConfigLang.java (1)

47-47: LGTM: Translation entry properly added.

The translation entry follows the established pattern and is correctly positioned alphabetically between existing entries.

enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/package-info.java (1)

1-4: LGTM: Standard package-level nullability annotations.

The package-info file correctly applies nullability defaults, which is consistent with best practices used throughout the codebase.

enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (2)

15-15: LGTM: Import statements properly placed.

The import statements for NiardScreen and NiardMenu are correctly positioned alphabetically with existing imports.

Also applies to: 39-39


96-97: LGTM: Menu registration follows established pattern.

The NIARD menu registration correctly follows the same pattern as other machine menus, using appropriate constructor references and screen factory.

enderio-machines/src/main/java/com/enderio/machines/data/recipes/MachineRecipeProvider.java (2)

278-291: LGTM: Well-designed crafting recipe.

The Niard recipe uses appropriate materials that reflect its fluid placement functionality (bucket, fluid tank, piston) and follows the established pattern for machine recipes. The unlocking criterion using void chassis is consistent with other machines.


553-553: LGTM: Correctly added to MACHINES list.

The addition to the MACHINES list is necessary for the erase recipes functionality and is properly positioned.

enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1)

1-12: LGTM: Standard machine block model.

The block model follows established conventions for machine blocks, with appropriate texture assignments including a unique front texture and standard machine textures for other faces. The particle texture is correctly set to the front face.

enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (2)

30-30: LGTM! Proper import addition.

The import for NiardBlock is correctly placed in alphabetical order within the niard package imports.


291-293: LGTM! Standard machine block registration.

The Niard block registration follows the established pattern using the baseMachine helper method with appropriate block properties, block entity reference, and translation. This is consistent with other machine registrations in the codebase.

enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (2)

28-28: LGTM! Proper import addition.

The import for NiardBlockEntity is correctly placed in alphabetical order within the niard package imports.


133-135: LGTM! Appropriate block entity registration.

The Niard block entity registration follows the established pattern and correctly applies both poweredMachineBlockEntityCapabilities and fluidHandlerCapability, which is appropriate for a machine that consumes energy and handles fluids.

enderio-machines/src/main/java/com/enderio/machines/common/config/common/EnergyConfig.java (2)

48-49: LGTM! Standard energy configuration fields.

The field declarations for Niard energy capacity and usage follow the established naming convention and type structure.


197-202: LGTM! Appropriate energy configuration values.

The configuration setup follows the standard pattern with reasonable default values (64,000 capacity and 10 uI/t usage), proper validation ranges, and appropriate comments. The low energy usage is suitable for a fluid placement utility machine.

enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java (1)

11-11: LGTM! Proper field declaration.

The field declaration for Niard range color follows the established naming convention.

enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java (3)

9-11: LGTM! Appropriate class documentation.

The comment indicating this is adapted from older Ender IO versions provides useful context for the implementation approach.


12-15: LGTM! Clean class structure.

The class structure with a positions list and index for cyclic iteration is well-designed and straightforward.


30-44: LGTM! Complete and efficient iterator API.

The iterator methods provide a clean and efficient API for cyclic iteration over the generated positions. The moveToNextPosition() method correctly handles wrapping with the modulo operator.

enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java (1)

30-32: Inventory update call is required after fluid interaction

The default handleFluidItemInteraction implementation does not mark the player’s inventory as dirty, so the explicit

player.getInventory().setChanged();

call is necessary to ensure the client is informed of item stack changes. You can safely keep it in NiardBlock.java at lines 30–32.

Likely an incorrect or invalid review comment.

**Actionable comments posted: 4** <details> <summary>🧹 Nitpick comments (6)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (1)</summary><blockquote> `101-101`: **Remove the French comment.** The comment is not in English and is also incorrect as the method already exists. ```diff fluidHandlerItem, - blockEntity.getFluidHandler(), // méthode à définir dans ton interface + blockEntity.getFluidHandler(), tank.getFluidAmount(blockEntity), ``` </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java (1)</summary><blockquote> `24-25`: **Fix formatting: Add missing spaces.** There are missing spaces after `bc.getY()` in the position calculations. Apply this diff to fix the formatting: ```diff - positions.add(new BlockPos(bc.getX() + j, bc.getY()- 1, bc.getZ() + i)); - positions.add(new BlockPos(bc.getX() - j, bc.getY()- 1, bc.getZ() - i)); + positions.add(new BlockPos(bc.getX() + j, bc.getY() - 1, bc.getZ() + i)); + positions.add(new BlockPos(bc.getX() - j, bc.getY() - 1, bc.getZ() - i)); ``` </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (1)</summary><blockquote> `51-68`: **Consider refactoring duplicated button handling logic.** The suppression comment indicates this button handling pattern is duplicated across multiple menu classes. Consider extracting this to a shared utility method or base class to improve maintainability. Would you like me to help create a shared button handler utility that can be reused across different menu classes? </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (3)</summary><blockquote> `44-46`: **Standardise on a single annotation library.** The code imports `@Nullable` from JetBrains annotations and `@Nonnull` from javax.annotation. Consider using annotations from a single library for consistency. ```diff -import org.jetbrains.annotations.Nullable; - -import javax.annotation.Nonnull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; ``` Or alternatively, use javax.annotation for both: ```diff -import org.jetbrains.annotations.Nullable; - -import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.Nonnull; ``` --- `62-62`: **Fix formatting: remove extra space.** ```diff - public static final TankAccess TANK = new TankAccess(); + public static final TankAccess TANK = new TankAccess(); ``` --- `220-220`: **Fix formatting: remove extra space.** ```diff - || (fluidInTank == Fluids.LAVA && (fluidAtPos == Fluids.LAVA || fluidAtPos == Fluids.FLOWING_LAVA)) + || (fluidInTank == Fluids.LAVA && (fluidAtPos == Fluids.LAVA || fluidAtPos == Fluids.FLOWING_LAVA)) ``` </blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used: CodeRabbit UI** **Review profile: CHILL** **Plan: Pro** <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 84bfe2477a65a3a08fddde900ab2367fde300798 and 467e4bd9f92758d48c0db89fc36a7e4a9f43502b. </details> <details> <summary>⛔ Files ignored due to path filters (10)</summary> * `enderio-machines/src/generated/resources/assets/enderio/blockstates/niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/assets/enderio/lang/en_us.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/assets/enderio/models/block/niard_combined.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/assets/enderio/models/item/niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/data/enderio/advancement/recipes/misc/erase_niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/data/enderio/advancement/recipes/misc/niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/data/enderio/loot_table/blocks/niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/data/enderio/recipe/erase_niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/generated/resources/data/enderio/recipe/niard.json` is excluded by `!**/generated/**` * `enderio-machines/src/main/resources/assets/enderio/textures/block/niard_front.png` is excluded by `!**/*.png` </details> <details> <summary>📒 Files selected for processing (16)</summary> * `enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/package-info.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/config/MachinesConfigLang.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/config/common/EnergyConfig.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java` (3 hunks) * `enderio-machines/src/main/java/com/enderio/machines/data/recipes/MachineRecipeProvider.java` (2 hunks) * `enderio-machines/src/main/resources/assets/enderio/models/block/niard.json` (1 hunks) </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🧬 Code Graph Analysis (5)</summary> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (2)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)</summary> * `NiardBlockEntity` (49-299) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (1)</summary> * `MachineBlocks` (75-467) </details> </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (2)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java (1)</summary> * `NiardScreen` (18-59) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (1)</summary> * `NiardMenu` (13-69) </details> </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java (1)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (1)</summary> * `InternalTankTasks` (21-149) </details> </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardMenu.java (5)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/menu/MachineSlot.java (1)</summary> * `MachineSlot` (12-54) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/menu/PoweredMachineMenu.java (1)</summary> * `PoweredMachineMenu` (15-58) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (1)</summary> * `MachineBlockEntities` (66-279) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (1)</summary> * `MachineMenus` (64-130) </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)</summary> * `NiardBlockEntity` (49-299) </details> </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java (1)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1)</summary> * `NiardBlockEntity` (49-299) </details> </blockquote></details> </details> </details> <details> <summary>⏰ Context from checks skipped due to timeout of 90000ms (2)</summary> * GitHub Check: Run Tests * GitHub Check: Analyze (java-kotlin) </details> <details> <summary>🔇 Additional comments (23)</summary><blockquote> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java (3)</summary> `40-42`: **Standard imports look good.** --- `217-219`: **Correct delegation to utility class.** The refactoring properly delegates the fluid filling logic to the centralised utility. --- `221-223`: **Correct delegation to utility class.** The refactoring properly delegates the fluid draining logic to the centralised utility. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/InternalTankTasks.java (2)</summary> `24-66`: **Well-structured fluid filling logic.** The method properly handles both bucket and fluid handler item interactions with appropriate simulation checks. --- `115-147`: **Correct implementation of tool mending logic.** The method properly handles experience fluid consumption and tool repair calculations. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/config/MachinesConfigLang.java (1)</summary> `47-47`: **LGTM: Translation entry properly added.** The translation entry follows the established pattern and is correctly positioned alphabetically between existing entries. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/package-info.java (1)</summary> `1-4`: **LGTM: Standard package-level nullability annotations.** The package-info file correctly applies nullability defaults, which is consistent with best practices used throughout the codebase. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineMenus.java (2)</summary> `15-15`: **LGTM: Import statements properly placed.** The import statements for NiardScreen and NiardMenu are correctly positioned alphabetically with existing imports. Also applies to: 39-39 --- `96-97`: **LGTM: Menu registration follows established pattern.** The NIARD menu registration correctly follows the same pattern as other machine menus, using appropriate constructor references and screen factory. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/data/recipes/MachineRecipeProvider.java (2)</summary> `278-291`: **LGTM: Well-designed crafting recipe.** The Niard recipe uses appropriate materials that reflect its fluid placement functionality (bucket, fluid tank, piston) and follows the established pattern for machine recipes. The unlocking criterion using void chassis is consistent with other machines. --- `553-553`: **LGTM: Correctly added to MACHINES list.** The addition to the MACHINES list is necessary for the erase recipes functionality and is properly positioned. </details> <details> <summary>enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1)</summary> `1-12`: **LGTM: Standard machine block model.** The block model follows established conventions for machine blocks, with appropriate texture assignments including a unique front texture and standard machine textures for other faces. The particle texture is correctly set to the front face. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (2)</summary> `30-30`: **LGTM! Proper import addition.** The import for `NiardBlock` is correctly placed in alphabetical order within the niard package imports. --- `291-293`: **LGTM! Standard machine block registration.** The Niard block registration follows the established pattern using the `baseMachine` helper method with appropriate block properties, block entity reference, and translation. This is consistent with other machine registrations in the codebase. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (2)</summary> `28-28`: **LGTM! Proper import addition.** The import for `NiardBlockEntity` is correctly placed in alphabetical order within the niard package imports. --- `133-135`: **LGTM! Appropriate block entity registration.** The Niard block entity registration follows the established pattern and correctly applies both `poweredMachineBlockEntityCapabilities` and `fluidHandlerCapability`, which is appropriate for a machine that consumes energy and handles fluids. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/config/common/EnergyConfig.java (2)</summary> `48-49`: **LGTM! Standard energy configuration fields.** The field declarations for Niard energy capacity and usage follow the established naming convention and type structure. --- `197-202`: **LGTM! Appropriate energy configuration values.** The configuration setup follows the standard pattern with reasonable default values (64,000 capacity and 10 uI/t usage), proper validation ranges, and appropriate comments. The low energy usage is suitable for a fluid placement utility machine. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java (1)</summary> `11-11`: **LGTM! Proper field declaration.** The field declaration for Niard range color follows the established naming convention. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardRangeIterator.java (3)</summary> `9-11`: **LGTM! Appropriate class documentation.** The comment indicating this is adapted from older Ender IO versions provides useful context for the implementation approach. --- `12-15`: **LGTM! Clean class structure.** The class structure with a positions list and index for cyclic iteration is well-designed and straightforward. --- `30-44`: **LGTM! Complete and efficient iterator API.** The iterator methods provide a clean and efficient API for cyclic iteration over the generated positions. The `moveToNextPosition()` method correctly handles wrapping with the modulo operator. </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlock.java (1)</summary> `30-32`: **Inventory update call is required after fluid interaction** The default `handleFluidItemInteraction` implementation does not mark the player’s inventory as dirty, so the explicit ```java player.getInventory().setChanged(); ``` call is necessary to ensure the client is informed of item stack changes. You can safely keep it in `NiardBlock.java` at lines 30–32. > Likely an incorrect or invalid review comment. </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -0,0 +1,130 @@
package com.enderio.machines.client.gui.screen;
coderabbitai[bot] (Migrated from github.com) commented 2025-06-29 07:37:17 +00:00

⚠️ Potential issue

Use NiardMenu button IDs instead of DrainMenu constants.

The code is using button IDs from DrainMenu which breaks encapsulation. Replace with the corresponding constants from NiardMenu.

-            (ignore) -> handleButtonPress(DrainMenu.VISIBILITY_BUTTON_ID)));
+            (ignore) -> handleButtonPress(NiardMenu.VISIBILITY_BUTTON_ID)));

         addRenderableWidget(EIOCommonWidgets.createRangeIncrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2,
-            (b) -> handleButtonPress(DrainMenu.INCREASE_BUTTON_ID)));
+            (b) -> handleButtonPress(NiardMenu.INCREASE_BUTTON_ID)));
         addRenderableWidget(EIOCommonWidgets.createRangeDecrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2 + 8,
-            (b) -> handleButtonPress(DrainMenu.DECREASE_BUTTON_ID)));
+            (b) -> handleButtonPress(NiardMenu.DECREASE_BUTTON_ID)));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

            (ignore) -> handleButtonPress(NiardMenu.VISIBILITY_BUTTON_ID)));

        addRenderableWidget(EIOCommonWidgets.createRangeIncrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2,
            (b) -> handleButtonPress(NiardMenu.INCREASE_BUTTON_ID)));
        addRenderableWidget(EIOCommonWidgets.createRangeDecrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2 + 8,
            (b) -> handleButtonPress(NiardMenu.DECREASE_BUTTON_ID)));
🤖 Prompt for AI Agents
In
enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java
around lines 39 to 44, the button IDs are incorrectly referenced from DrainMenu
instead of NiardMenu. Replace all instances of DrainMenu.VISIBILITY_BUTTON_ID,
DrainMenu.INCREASE_BUTTON_ID, and DrainMenu.DECREASE_BUTTON_ID with the
corresponding constants from NiardMenu to maintain proper encapsulation and
correct referencing.
_⚠️ Potential issue_ **Use NiardMenu button IDs instead of DrainMenu constants.** The code is using button IDs from `DrainMenu` which breaks encapsulation. Replace with the corresponding constants from `NiardMenu`. ```diff - (ignore) -> handleButtonPress(DrainMenu.VISIBILITY_BUTTON_ID))); + (ignore) -> handleButtonPress(NiardMenu.VISIBILITY_BUTTON_ID))); addRenderableWidget(EIOCommonWidgets.createRangeIncrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2, - (b) -> handleButtonPress(DrainMenu.INCREASE_BUTTON_ID))); + (b) -> handleButtonPress(NiardMenu.INCREASE_BUTTON_ID))); addRenderableWidget(EIOCommonWidgets.createRangeDecrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2 + 8, - (b) -> handleButtonPress(DrainMenu.DECREASE_BUTTON_ID))); + (b) -> handleButtonPress(NiardMenu.DECREASE_BUTTON_ID))); ``` <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion (ignore) -> handleButtonPress(NiardMenu.VISIBILITY_BUTTON_ID))); addRenderableWidget(EIOCommonWidgets.createRangeIncrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2, (b) -> handleButtonPress(NiardMenu.INCREASE_BUTTON_ID))); addRenderableWidget(EIOCommonWidgets.createRangeDecrease(leftPos + imageWidth - 2 * 16, topPos + 2 + 16 * 2 + 8, (b) -> handleButtonPress(NiardMenu.DECREASE_BUTTON_ID))); ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` In enderio-machines/src/main/java/com/enderio/machines/client/gui/screen/NiardScreen.java around lines 39 to 44, the button IDs are incorrectly referenced from DrainMenu instead of NiardMenu. Replace all instances of DrainMenu.VISIBILITY_BUTTON_ID, DrainMenu.INCREASE_BUTTON_ID, and DrainMenu.DECREASE_BUTTON_ID with the corresponding constants from NiardMenu to maintain proper encapsulation and correct referencing. ``` </details> <!-- This is an auto-generated comment by CodeRabbit --> <!-- fingerprinting:phantom:medusa:lion -->
@ -216,76 +213,21 @@ public abstract class FluidTankBlockEntity extends MachineBlockEntity implements
return TANK.getTank(this);
coderabbitai[bot] (Migrated from github.com) commented 2025-06-29 07:37:16 +00:00

⚠️ Potential issue

Fix incorrect parameter in tryMendTool delegation.

The last parameter should be FLUID_DRAIN_OUTPUT instead of FLUID_FILL_INPUT to match the expected slot for the mended tool output.

    private void tryMendTool() {
-        InternalTankTasks.tryMendTool(this, TANK, FLUID_DRAIN_INPUT, FLUID_FILL_INPUT);
+        InternalTankTasks.tryMendTool(this, TANK, FLUID_DRAIN_INPUT, FLUID_DRAIN_OUTPUT);
    }
🤖 Prompt for AI Agents
In
enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java
at lines 225 to 227, the method tryMendTool incorrectly passes FLUID_FILL_INPUT
as the last parameter to InternalTankTasks.tryMendTool. Replace FLUID_FILL_INPUT
with FLUID_DRAIN_OUTPUT to correctly specify the output slot for the mended
tool.
_⚠️ Potential issue_ **Fix incorrect parameter in tryMendTool delegation.** The last parameter should be `FLUID_DRAIN_OUTPUT` instead of `FLUID_FILL_INPUT` to match the expected slot for the mended tool output. ```diff private void tryMendTool() { - InternalTankTasks.tryMendTool(this, TANK, FLUID_DRAIN_INPUT, FLUID_FILL_INPUT); + InternalTankTasks.tryMendTool(this, TANK, FLUID_DRAIN_INPUT, FLUID_DRAIN_OUTPUT); } ``` <details> <summary>🤖 Prompt for AI Agents</summary> ``` In enderio-machines/src/main/java/com/enderio/machines/common/blocks/fluid_tank/FluidTankBlockEntity.java at lines 225 to 227, the method tryMendTool incorrectly passes FLUID_FILL_INPUT as the last parameter to InternalTankTasks.tryMendTool. Replace FLUID_FILL_INPUT with FLUID_DRAIN_OUTPUT to correctly specify the output slot for the mended tool. ``` </details> <!-- This is an auto-generated comment by CodeRabbit --> <!-- fingerprinting:phantom:medusa:lion -->
@ -0,0 +119,4 @@
if (fluid == Fluids.EMPTY) return;
BlockState fluidBlockState = fluid.defaultFluidState().createLegacyBlock();
level.setBlock(pos, fluidBlockState, Block.UPDATE_ALL);
coderabbitai[bot] (Migrated from github.com) commented 2025-06-29 07:37:17 +00:00

💡 Verification agent

🧩 Analysis chain

Verify the use of createLegacyBlock() for fluid placement.

The method name suggests this might be a legacy approach. Ensure this is the correct method for placing fluid blocks in the current Minecraft version.


🌐 Web query:

What is the correct way to place fluid blocks in Minecraft modding with recent versions? Is createLegacyBlock() the recommended approach or is there a newer method?

💡 Result:

In recent versions of Minecraft modding, particularly with Forge, the recommended approach for placing fluid blocks has evolved. The createLegacyBlock() method, which was previously used to create a BlockState from a FluidState, is now considered deprecated. This deprecation indicates that there is a newer, preferred method for handling fluid block placement.

The current best practice involves using the FluidBlock class, which is designed to handle fluid block behavior more effectively. For example, in Forge 1.20.6, the FluidBlock class provides methods like getFluidState() to retrieve the fluid state associated with the block. This approach offers a more streamlined and efficient way to manage fluid blocks in your mod.

Therefore, it is advisable to transition away from using createLegacyBlock() and adopt the FluidBlock class for fluid block placement in your Minecraft modding projects.


Replace deprecated createLegacyBlock() with FluidBlock-based placement

The createLegacyBlock() call is deprecated in recent Forge versions. Instead, use your fluid’s associated FluidBlock for placement. For example:

• In enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (lines 115–116):

- BlockState fluidBlockState = fluid.defaultFluidState().createLegacyBlock();
+ FluidBlock fluidBlock = (FluidBlock) fluid.getBlock();
+ BlockState fluidBlockState = fluidBlock.defaultBlockState(); 
level.setBlock(pos, fluidBlockState, Block.UPDATE_ALL);

This ensures you’re using the modern FluidBlock API rather than the deprecated legacy method.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

        FluidBlock fluidBlock = (FluidBlock) fluid.getBlock();
        BlockState fluidBlockState = fluidBlock.defaultBlockState();
        level.setBlock(pos, fluidBlockState, Block.UPDATE_ALL);
🤖 Prompt for AI Agents
In
enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java
at lines 115-116, replace the deprecated call to
fluid.defaultFluidState().createLegacyBlock() with the modern approach by
obtaining the FluidBlock associated with the fluid and using it to set the block
state. This involves retrieving the FluidBlock instance for the fluid and
setting the block at the position using that FluidBlock's default state instead
of the legacy method.
_💡 Verification agent_ <details> <summary>🧩 Analysis chain</summary> **Verify the use of createLegacyBlock() for fluid placement.** The method name suggests this might be a legacy approach. Ensure this is the correct method for placing fluid blocks in the current Minecraft version. --- 🌐 Web query: ```web What is the correct way to place fluid blocks in Minecraft modding with recent versions? Is createLegacyBlock() the recommended approach or is there a newer method? ``` 💡 Result: In recent versions of Minecraft modding, particularly with Forge, the recommended approach for placing fluid blocks has evolved. The `createLegacyBlock()` method, which was previously used to create a `BlockState` from a `FluidState`, is now considered deprecated. This deprecation indicates that there is a newer, preferred method for handling fluid block placement. The current best practice involves using the `FluidBlock` class, which is designed to handle fluid block behavior more effectively. For example, in Forge 1.20.6, the `FluidBlock` class provides methods like `getFluidState()` to retrieve the fluid state associated with the block. This approach offers a more streamlined and efficient way to manage fluid blocks in your mod. Therefore, it is advisable to transition away from using `createLegacyBlock()` and adopt the `FluidBlock` class for fluid block placement in your Minecraft modding projects. --- </details> **Replace deprecated createLegacyBlock() with FluidBlock-based placement** The `createLegacyBlock()` call is deprecated in recent Forge versions. Instead, use your fluid’s associated FluidBlock for placement. For example: • In enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (lines 115–116): ```diff - BlockState fluidBlockState = fluid.defaultFluidState().createLegacyBlock(); + FluidBlock fluidBlock = (FluidBlock) fluid.getBlock(); + BlockState fluidBlockState = fluidBlock.defaultBlockState(); level.setBlock(pos, fluidBlockState, Block.UPDATE_ALL); ``` This ensures you’re using the modern `FluidBlock` API rather than the deprecated legacy method. <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion FluidBlock fluidBlock = (FluidBlock) fluid.getBlock(); BlockState fluidBlockState = fluidBlock.defaultBlockState(); level.setBlock(pos, fluidBlockState, Block.UPDATE_ALL); ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` In enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java at lines 115-116, replace the deprecated call to fluid.defaultFluidState().createLegacyBlock() with the modern approach by obtaining the FluidBlock associated with the fluid and using it to set the block state. This involves retrieving the FluidBlock instance for the fluid and setting the block at the position using that FluidBlock's default state instead of the legacy method. ``` </details> <!-- This is an auto-generated comment by CodeRabbit --> <!-- fingerprinting:phantom:medusa:lion -->
@ -24,6 +25,8 @@ public class MachinesClientBlocksConfig {
.define("poweredSpawnerRangeColor", "FF0000");
coderabbitai[bot] (Migrated from github.com) commented 2025-06-29 07:37:16 +00:00

⚠️ Potential issue

Fix the duplicate configuration key.

The configuration key "drainRangeColor" is already used by DRAIN_RANGE_COLOR on line 27. This will cause configuration conflicts.

Apply this diff to fix the duplicate key:

 NIARD_RANGE_COLOR = builder.comment("The color of the range box of the Niard")
-    .define("drainRangeColor", "FFA500");
+    .define("niardRangeColor", "FFA500");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

        NIARD_RANGE_COLOR = builder.comment("The color of the range box of the Niard")
            .define("niardRangeColor", "FFA500");
🤖 Prompt for AI Agents
In
enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java
around lines 28 to 29, the configuration key "drainRangeColor" is duplicated
from line 27's DRAIN_RANGE_COLOR. Rename the key in NIARD_RANGE_COLOR to a
unique string, such as "niardRangeColor", to avoid conflicts in the
configuration.
_⚠️ Potential issue_ **Fix the duplicate configuration key.** The configuration key "drainRangeColor" is already used by `DRAIN_RANGE_COLOR` on line 27. This will cause configuration conflicts. Apply this diff to fix the duplicate key: ```diff NIARD_RANGE_COLOR = builder.comment("The color of the range box of the Niard") - .define("drainRangeColor", "FFA500"); + .define("niardRangeColor", "FFA500"); ``` <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **IMPORTANT** > Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements. ```suggestion NIARD_RANGE_COLOR = builder.comment("The color of the range box of the Niard") .define("niardRangeColor", "FFA500"); ``` </details> <!-- suggestion_end --> <details> <summary>🤖 Prompt for AI Agents</summary> ``` In enderio-machines/src/main/java/com/enderio/machines/common/config/client/MachinesClientBlocksConfig.java around lines 28 to 29, the configuration key "drainRangeColor" is duplicated from line 27's DRAIN_RANGE_COLOR. Rename the key in NIARD_RANGE_COLOR to a unique string, such as "niardRangeColor", to avoid conflicts in the configuration. ``` </details> <!-- This is an auto-generated comment by CodeRabbit --> <!-- fingerprinting:phantom:poseidon:panther -->
coderabbitai[bot] (Migrated from github.com) reviewed 2025-07-17 10:57:33 +00:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 0

🧹 Nitpick comments (2)
endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java (1)

26-52: Consider extracting magic numbers as constants.

The implementation is correct, but the magic numbers could be made more maintainable.

+    private static final float FLUID_INSET = 0.0625F;
+    private static final float FACE_SIZE = 14 / 16.0f;
+    private static final float FLUID_HEIGHT_MULTIPLIER = 14 / 16.0f;
+
     public static void renderFluid(PoseStack.Pose pose, VertexConsumer consumer, Fluid fluid, float fillAmount,
         int color, int packedLight) {
         // Get fluid texture
         IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(fluid);
         TextureAtlasSprite texture = Minecraft.getInstance()
             .getTextureAtlas(InventoryMenu.BLOCK_ATLAS)
             .apply(props.getStillTexture());
 
         // Get sizes
-        float fluidHeight = (14 * fillAmount) / 16.0f;
-        float inset = 0.0625F;
-        float faceSize = 14 / 16.0f;
+        float fluidHeight = (FLUID_HEIGHT_MULTIPLIER * fillAmount);
+        float inset = FLUID_INSET;
+        float faceSize = FACE_SIZE;
enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java (1)

15-17: Consider documenting the unused constructor parameter.

The constructor correctly follows the required signature but doesn't use the context parameter. Consider adding a comment to clarify this is intentional.

 public NiardBER(BlockEntityRendererProvider.Context context) {
-
+    // Context not required for this renderer
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4b447f8f27 and b40bbe78c9.

📒 Files selected for processing (8)
  • endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/FluidTankBER.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/client/rendering/item/FluidTankBEWLR.java (2 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java (1 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java (3 hunks)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java (2 hunks)
  • enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1 hunks)
Files skipped from review due to trivial changes (2)
  • enderio-machines/src/main/java/com/enderio/machines/client/rendering/item/FluidTankBEWLR.java
  • enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/FluidTankBER.java
🚧 Files skipped from review as they are similar to previous changes (3)
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java
  • enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java
  • enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java
🔇 Additional comments (4)
enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1)

1-13: LGTM! Standard block model implementation.

The JSON model correctly defines the Niard block's visual appearance using standard Minecraft conventions. The texture mappings are consistent with other machine blocks, and the render type is appropriate.

endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java (2)

13-24: Well-designed utility method with proper delegation.

The first renderFluid method correctly extracts fluid properties and delegates to the main rendering method. The early return for empty fluid stacks is good practice.


22-22: Clarify the commented colour handling logic.

The commented line suggests there might be cases where getTintColor returns -1. Should this fallback to white (0xffffff) be implemented, or is the current approach sufficient?

enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java (1)

19-38: Well-implemented block entity renderer.

The renderer correctly follows Minecraft patterns:

  • Proper early return for empty tanks
  • Correct use of translucent cull block sheet for fluid rendering
  • Accurate fill ratio calculation
  • Appropriate delegation to the utility class
**Actionable comments posted: 0** <details> <summary>🧹 Nitpick comments (2)</summary><blockquote> <details> <summary>endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java (1)</summary><blockquote> `26-52`: **Consider extracting magic numbers as constants.** The implementation is correct, but the magic numbers could be made more maintainable. ```diff + private static final float FLUID_INSET = 0.0625F; + private static final float FACE_SIZE = 14 / 16.0f; + private static final float FLUID_HEIGHT_MULTIPLIER = 14 / 16.0f; + public static void renderFluid(PoseStack.Pose pose, VertexConsumer consumer, Fluid fluid, float fillAmount, int color, int packedLight) { // Get fluid texture IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(fluid); TextureAtlasSprite texture = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) .apply(props.getStillTexture()); // Get sizes - float fluidHeight = (14 * fillAmount) / 16.0f; - float inset = 0.0625F; - float faceSize = 14 / 16.0f; + float fluidHeight = (FLUID_HEIGHT_MULTIPLIER * fillAmount); + float inset = FLUID_INSET; + float faceSize = FACE_SIZE; ``` </blockquote></details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java (1)</summary><blockquote> `15-17`: **Consider documenting the unused constructor parameter.** The constructor correctly follows the required signature but doesn't use the context parameter. Consider adding a comment to clarify this is intentional. ```diff public NiardBER(BlockEntityRendererProvider.Context context) { - + // Context not required for this renderer } ``` </blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used: CodeRabbit UI** **Review profile: CHILL** **Plan: Pro** <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 4b447f8f271c9e176abb7ae8181f04362f668b63 and b40bbe78c9f024ab04fe65bd104db388ddb5a2b6. </details> <details> <summary>📒 Files selected for processing (8)</summary> * `endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/FluidTankBER.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/client/rendering/item/FluidTankBEWLR.java` (2 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java` (1 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java` (3 hunks) * `enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java` (2 hunks) * `enderio-machines/src/main/resources/assets/enderio/models/block/niard.json` (1 hunks) </details> <details> <summary>✅ Files skipped from review due to trivial changes (2)</summary> * enderio-machines/src/main/java/com/enderio/machines/client/rendering/item/FluidTankBEWLR.java * enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/FluidTankBER.java </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary> * enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlockEntities.java * enderio-machines/src/main/java/com/enderio/machines/common/init/MachineBlocks.java * enderio-machines/src/main/java/com/enderio/machines/common/blocks/niard/NiardBlockEntity.java </details> <details> <summary>🔇 Additional comments (4)</summary><blockquote> <details> <summary>enderio-machines/src/main/resources/assets/enderio/models/block/niard.json (1)</summary> `1-13`: **LGTM! Standard block model implementation.** The JSON model correctly defines the Niard block's visual appearance using standard Minecraft conventions. The texture mappings are consistent with other machine blocks, and the render type is appropriate. </details> <details> <summary>endercore/src/main/java/com/enderio/core/client/FluidRendererUtil.java (2)</summary> `13-24`: **Well-designed utility method with proper delegation.** The first `renderFluid` method correctly extracts fluid properties and delegates to the main rendering method. The early return for empty fluid stacks is good practice. --- `22-22`: **Clarify the commented colour handling logic.** The commented line suggests there might be cases where `getTintColor` returns -1. Should this fallback to white (0xffffff) be implemented, or is the current approach sufficient? </details> <details> <summary>enderio-machines/src/main/java/com/enderio/machines/client/rendering/blockentity/NiardBER.java (1)</summary> `19-38`: **Well-implemented block entity renderer.** The renderer correctly follows Minecraft patterns: - Proper early return for empty tanks - Correct use of translucent cull block sheet for fluid rendering - Accurate fill ratio calculation - Appropriate delegation to the utility class </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
dphaldes commented 2025-08-19 19:00:55 +00:00 (Migrated from github.com)

I see you have changed how Tank Filling works. I would prefer if this was split into 2 PRs. One for Tanks and One for Niard

I see you have changed how Tank Filling works. I would prefer if this was split into 2 PRs. One for Tanks and One for Niard
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Team-EnderIO/EnderIO#1096
No description provided.