Conduit Buffs and Energy Conduit Rework #1070

Merged
Rover656 merged 5 commits from feat/conduit-buffs into dev/1.21.1 2025-05-12 22:10:16 +00:00
Rover656 commented 2025-05-12 18:12:36 +00:00 (Migrated from github.com)

Description

Increases fluid and energy conduit rates and improves energy conduits.

Energy conduits now distribute the stored energy evenly across all insert connections, avoiding starvation of connections by the previous round-robin strategy. Also added a priority option for energy conduits, filling connections with higher priorities first and trickling any remaining power downward.

Breaking Changes

None (for a change :P)

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

  • New Features
    • Added priority setting for energy conduit connections, allowing users to adjust and view connection priority in the user interface.
    • Introduced sorting of conduit connections based on priority for improved organisation.
  • Improvements
    • Energy storage and transfer calculations now support larger values, improving handling of high-capacity networks.
    • Energy distribution now respects connection priority, enabling more efficient and predictable energy flow.
    • Increased transfer rates for energy and fluid conduits, allowing for faster resource transport.
    • Enhanced sorting and ordering of conduit connection lists for better consistency.
  • Bug Fixes
    • Redstone updates are now only sent to loaded conduit nodes, improving stability.
  • Documentation
    • Clarified sorting and ordering behaviour in conduit connection documentation.
# Description Increases fluid and energy conduit rates and improves energy conduits. Energy conduits now distribute the stored energy evenly across all insert connections, avoiding starvation of connections by the previous round-robin strategy. Also added a priority option for energy conduits, filling connections with higher priorities first and trickling any remaining power downward. # Breaking Changes None (for a change :P) <!-- 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 - **New Features** - Added priority setting for energy conduit connections, allowing users to adjust and view connection priority in the user interface. - Introduced sorting of conduit connections based on priority for improved organisation. - **Improvements** - Energy storage and transfer calculations now support larger values, improving handling of high-capacity networks. - Energy distribution now respects connection priority, enabling more efficient and predictable energy flow. - Increased transfer rates for energy and fluid conduits, allowing for faster resource transport. - Enhanced sorting and ordering of conduit connection lists for better consistency. - **Bug Fixes** - Redstone updates are now only sent to loaded conduit nodes, improving stability. - **Documentation** - Clarified sorting and ordering behaviour in conduit connection documentation. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2025-05-12 18:12:43 +00:00 (Migrated from github.com)
## Walkthrough

The changes introduce priority-based sorting and handling for energy conduit connections, including a new priority field in the configuration, UI controls for adjusting priority, and logic for distributing energy by priority. Energy storage and transfer calculations are refactored to use long integers. Documentation and code comments are updated for clarity. Additional improvements include capability proxying enhancements, safer null handling, and build system updates for gametest integration.

## Changes

| File(s)                                                                                                  | Change Summary |
|----------------------------------------------------------------------------------------------------------|----------------|
| .../api/Conduit.java<br>.../common/conduit/type/energy/EnergyConduit.java                                | Added `getGeneralConnectionComparator()` to support sorting connections, with an override in `EnergyConduit` for priority ordering; updated `proxyCapability` with null checks. |
| .../common/conduit/type/energy/EnergyConduitConnectionConfig.java                                        | Added `priority` field, updated constructor, codecs, copy methods, and added `withPriority()`. |
| .../client/gui/screen/types/EnergyConduitScreenType.java                                                 | Added UI buttons and label rendering for priority adjustment; new methods for widget creation and increment logic. |
| .../common/conduit/type/energy/EnergyConduitTicker.java                                                  | Refactored energy distribution to group by priority and distribute in bulk; added `distributeTo` helper method; removed rotating index logic. |
| .../common/conduit/type/energy/EnergyConduitStorage.java                                                 | Changed energy storage calculations to use `long`; added `getLongMaxEnergyStored()` and `getLongEnergyStored()`; simplified `canReceive()`. |
| .../common/conduit/type/energy/EnergyConduitNetworkContext.java                                          | Changed `energyStored` from `int` to `long`, removed `rotatingIndex`, updated methods and codecs accordingly. |
| .../common/conduit/network/ConduitNetwork.java                                                           | Modified sorting logic to use the new comparator for insert/extract connections if available; added TODO comment for future refactor. |
| .../common/conduit/bundle/ConduitBundleBlockEntity.java                                                  | Removed node validity check in `getProxiedCapability`; restricted `onRedstoneChanged()` calls to loaded nodes only. |
| .../common/conduit/network/ConduitNetworkSavedData.java                                                  | Moved precondition check for network discard to public method; relaxed internal removal logic to allow empty/discarded networks. |
| .../common/init/Conduits.java                                                                            | Increased transfer rates for energy and fluid conduits; added clarifying comment on fluid conduit tick rate. |
| .../api/network/IConduitNetwork.java                                                                     | Updated Javadoc comments to clarify connection list ordering and sorting behaviour referencing new comparator methods. |
| .../modded/common/modules/appeng/MEConduit.java                                                          | Updated `proxyCapability` to accept nullable node and added null check to prevent NPEs. |
| .../modded/common/modules/refinedstorage/RSConduit.java                                                  | Updated `proxyCapability` to accept nullable node and added null check to prevent NPEs. |
| build.gradle.kts (enderio-conduits)                                                                      | Added new "gametest" source set with configurations and dependencies; added gametest mods and run configuration; enhanced resource processing with property expansion. |
| .../gametest/java/com/enderio/conduits/tests/** (multiple files)                                         | Changed package declarations from `server.tests` to `tests`; renamed test class for gametest mod; updated imports accordingly. |
| .../gametest/resources/META-INF/neoforge.mods.toml                                                       | Added mod metadata for `enderio_conduits_tests` gametest mod with dependencies and version placeholders. |
| build.gradle.kts (enderio)                                                                               | Removed "gameTestServer" run configuration from main build script. |
| gradle.properties                                                                                        | Updated `jadeFileId` property value. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant EnergyConduitScreen
    participant EnergyConduitConfig
    participant NetworkTicker

    User->>EnergyConduitScreen: Clicks priority up/down button
    EnergyConduitScreen->>EnergyConduitConfig: Calls withPriority(newValue)
    EnergyConduitConfig-->>EnergyConduitScreen: Returns updated config
    Note over EnergyConduitScreen: UI updates to show new priority

    NetworkTicker->>EnergyConduit: getGeneralConnectionComparator()
    EnergyConduit-->>NetworkTicker: Returns priority comparator
    NetworkTicker->>NetworkTicker: Sorts insert/extract connections by priority
    NetworkTicker->>NetworkTicker: Groups connections by priority
    NetworkTicker->>NetworkTicker: Distributes energy to highest priority group first
  • Team-EnderIO/EnderIO#1025: Extensive rewrite of the Conduit interface including expanded generics and modifications to proxyCapability, closely related to the new default methods added here.
  • Team-EnderIO/EnderIO#1036: Adds priority-based sorting and UI controls for item conduit insert connections, complementing the priority sorting and UI changes for energy conduits in this PR.

Suggested labels

Area-Backend

Poem

🐰
With numbers now long and priorities high,
Conduits sort and energy will fly.
Buttons to press, priorities to tweak,
Energy flows where rabbits seek.
Storage expanded, transfer rates soar—
This bunny’s code hops evermore!
🥕


<!-- walkthrough_end -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> - CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> 
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent 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 7862ab69f18f588041749f436ebc82231aeb0451 and a6fbd7dde62a3b21b87610ea071f77241db0f2a6.

</details>

<details>
<summary>📒 Files selected for processing (17)</summary>

* `enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/appeng/MEConduit.java` (1 hunks)
* `enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/refinedstorage/RSConduit.java` (1 hunks)
* `enderio-conduits/build.gradle.kts` (3 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/BasicConduitTests.java` (1 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/ConduitGameTestHelper.java` (1 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/EnderIOConduitsTests.java` (2 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitGameTestHelper.java` (1 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitTests.java` (1 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/package-info.java` (1 hunks)
* `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/package-info.java` (1 hunks)
* `enderio-conduits/src/gametest/resources/META-INF/neoforge.mods.toml` (1 hunks)
* `enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java` (3 hunks)
* `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java` (2 hunks)
* `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java` (3 hunks)
* `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java` (4 hunks)
* `enderio/build.gradle.kts` (0 hunks)
* `gradle.properties` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (1)</summary>

* enderio/build.gradle.kts

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (8)</summary>

* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/ConduitGameTestHelper.java
* gradle.properties
* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/package-info.java
* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/BasicConduitTests.java
* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitTests.java
* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitGameTestHelper.java
* enderio-conduits/src/gametest/java/com/enderio/conduits/tests/package-info.java
* enderio-conduits/src/gametest/resources/META-INF/neoforge.mods.toml

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (4)</summary>

* enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java
* enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java
* enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java
* enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java

</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 (10)</summary><blockquote>

<details>
<summary>enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/refinedstorage/RSConduit.java (1)</summary>

`91-94`: **Good addition of null safety checks**

The updated `proxyCapability` method now safely handles nullable node parameters with a proper null check before accessing node data. This aligns with the new interface contracts and prevents potential NullPointerExceptions.

</details>
<details>
<summary>enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/appeng/MEConduit.java (1)</summary>

`152-154`: **Good addition of null safety checks**

The updated `proxyCapability` method now safely handles nullable node parameters with a proper null check before accessing node data. This aligns with the new interface contracts and prevents potential NullPointerExceptions.

</details>
<details>
<summary>enderio-conduits/src/gametest/java/com/enderio/conduits/tests/EnderIOConduitsTests.java (1)</summary>

`1-1`: **Good separation of test code from production code**

These changes appropriately move the gametest class to a dedicated test package and provide it with its own mod ID. This is excellent practice as it properly isolates test code and dependencies from the main mod, making the codebase more maintainable.



Also applies to: 18-21, 23-25

</details>
<details>
<summary>enderio-conduits/build.gradle.kts (7)</summary>

`19-35`: **Well-structured test configuration setup**

These configuration blocks properly extend from their respective base configurations while creating isolated configurations for the gametest source set. This ensures test dependencies remain separate from production dependencies.

---

`43-46`: **Good source set configuration**

The gametest source set is properly configured to include the main source set in its classpath while maintaining its own runtime dependencies. This allows tests to access production code without contaminating the production artifact with test dependencies.

---

`82-85`: **Appropriate dependency management**

Moving the test framework dependency to the dedicated gametest configuration is the correct approach. The transitive dependency management is also properly handled.

---

`91-101`: **Excellent mod definition structure**

This configuration properly defines two separate mods with their own source sets, creating a clean separation between production and test code while allowing them to work together during testing.

---

`115-115`: **Clear run configuration**

Explicitly setting which mods are loaded in the data generation run configuration improves clarity and ensures only the necessary code is processed.

---

`118-123`: **Properly configured gametest environment**

The gameTestServer run configuration is correctly set up to load both the main mod and the test mod, with the appropriate source set specified. This enables isolated testing without affecting production code.

---

`127-145`: **Robust resource processing**

The property replacement mechanism ensures version information is correctly populated in the mod metadata file. The comment acknowledging this as a temporary solution is also helpful for future maintenance.

</details>

</blockquote></details>

</details>
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKNwSPbABsvkCiQBHbGlcSHFcLzpIACIAYXwMWmx1SAAhbAAzDORMegBRcgoieXjE5NCbEgB3fAoAawAaaPtsAWZ1Gno5SGxESkgbfCkKADYAVhH0ZFtIDEcBfoBGAAYAdmWGngp8bnw+5DJYTAYSNgxcZAIw2A8Mr2T6XMgySmKFMvVkeCxcG638ERiDQwP4MI4YUhfDAMfxoPrXDy4KgYRAZfpUGjIDK1SACfC/SB3B7oRLPQpvJgfC7AgCC9ngRAw8Ay8AYmFC8GYvCGp3YKGQzDQSjC+ARZNe8kpSU+AHJILQkEj4AI8PAEpAvPgiKyuN9EDQhfwMmLeCQJGren58NhEmBtmosGxfopNi8ivJUBh8FV5YqKMq8FEzWQvPI0DC9jkfCgUZRQpTyGI1SiRVtg+cSZKEonxOqMttmLiSN8iPZcM4pPR8MbdlVKLTaArcxg0D5ZJs0LNqls1f7cPIds3+TGkYpsCd6Ni+G6KQlpRcOz5vSX3jnk8gqupYJAEEQbnxeL31PIrgtCfAfFEWRR9ZtNwTMPJ/ILviuZyf/Qw6l4V7RvT9RU1OsKDAQ9amPVdRGbRBgXcTxo38IIQnlfBpFmfER22JITkzXFYTqFcwUwSFYNBBIlRVAg+Epa9mByWh9zIHCrl+DxuUBXAZWQfVZEiSAiAeEgf3IRBNmwbhaGoNCrj/BhHHYahkw7UlYQVESsRxfxzWqUiPBmNksDPbEbUeUJYFwXBuEQDgAHobO1X5Wg0JhmBs6ASDQZgwAKJQKAASQAeRsnzKECmzuG8LwbJWdYNCMfRjHAKAyCrY00DwQhSEKKT6Bcs5OC2fhhCgyQ0O6JhfJUNRNG0XQwEMEwoDgVBUEwHACGIN0coUVh2C4KgfQcJwXFxLNKtUdQtB0BLEtMAwUsoNUwClcpEBsxAKAYGyXwwGyhDQCQ0BslybIW/18GOudVpstBuHgGzSnnDR9sOjgDGiD6DAsSAaT8zrss6FphoHY0iIhaQ3D+AADR7yihkdKAycMPCqOFngADxoRIonvbdO3IH0lCR7xQidWBFEgKHuXR2RYlulQL2PeHfmof50fgNDOzZbgGZ/fs/ECYJ9VTVj3nnXETL4gRNS/UjUDJinwxObgLh4ZxPJIGgb0JHFRciKQvGU/gVeTVtQ1mSKxfKdDhQACjmHwVD49VRYYH92AASk2V36bUPn5AWFdEKFzplMeLBB1N3xKRoTHNn8XBsAoJkITFbneYgvVy2hDwcQd3xmXQ0ISHR3Y+loBsmyj0MOy7QmSGJrxSc18n6Ch0hcAAcS6rxSjXBJ4i5dWqPh1H6KUWg7wQMEBcT5OckpweeYxWpgFh9RUhluo+5KhI9HhvPIrl5AXOX6gcRa84FsnHFEFqcRU6y5RfB/fVkGrSCkwSDct2tUJO38GifwOceD4G+LgTYp9Ij5RXKLEuioVxQ1Ps4EgAA5RQ0h4YK3oCzUId8KCqwTLvFM/gvCKSkKmABDdKBMQ8EQr+GBgSpHxNuAmkBsHICOBQom6Um4oC5NAhS0FZ5JxTqWfOcUvqWBpE3ZQwiWJ/CUG7Ye64jQY12AQqIOIIrS1ZGScIHNEDxUgAAWRborRsdAuBQwAAKoMik7DwPCSaQGANAOmPM/bHk2O48iJdcB6BgB4jO/Nqa019ozfstsAAywYX5xM2HYhx0sPB+XXrgdBwovRKE2JvfAX5gleP7G4wpkT2xBL8ZjQJ6cinlKSY7FJFSr6Y3eLHXAHt4bfARhQJGOEYZXXUJ0rAUMzpLRWp8dam1traF2i9I6J1RkXXGRcG6d0HoDM0HMqGBgoBmOdI8SxtBrH1LIY05xfCl7D1XukvJBTszEMCR3bu2Ve73IYZcleFBbYdJjN03pHh+lUiGZTRZy0NlrQ2ltHae0DrzJYKdbG51LpUjWrde66Tnqwu2R9aI8U5qguWRCqZ0K5mXVcos5F85UVrPILgGo9QbJpI2agzW9K6iYteu9T631fr/TkVEIagoRofzBpCSGHhwGI2RpTJlVIWV0tqHUUeaNxKSUBlcTkGjQii0BfOeGyjEAwRBP4DwAApWFsker5Q3DQ9hihmQcxwaKZR/oMgnj+LUXyK4nj4IfqWBYXDexqITqIqIr9VakO6lcZZn9oLAgAMrcFEA6tkbZvbQz1HGHeDDEDfPhk8KGmaCHZugrbAAIrIEg8RNTUXBOQLwPyOFyi9JiSAwE6HglIJOAsZZFKpz1oqHI/gehegoL5KIGrEisj7aWAdb9GBtTPL6qIvREHpLME8nuJbkwfPPl8n5lF0DDurFjEdnqaEVx+o2dQ1dyk6v8VQMQ27v4ADECy2xuVvZ9WAi24G/Y28xtAuJFxRmjRAmqfwsiiN0Z8QxYF/AyJFeQQRWwOqiAa5ALY2C/J1TYiD6CaD5pUtQ4BDA10bLMMg/wmTMG+n8GIUMul4Sis5lkKC/AMDm1kvJc4il1RPD/EXdAsi+DYPpIyagSc0I4k1NqBgkjzDSJE3xlMCinGiDIRiVRH8S5aq0QeVoP4GD6JvRDHZkB0GME7dJUUoslGaZU+/Pg4GJNz2k8aXT999OeF0cZ9gpmbXDsFEoOKOK8VgCMAS8FkyoUzJhYdMlCKvVLOi27Dm5x7LJHWjCEgZAbL9iTWtAoEp0nxpy2QaAsgk0crQG9MLPK/pPwxAKxwQqQZWeImZuCUNivulK+VjAlWk36rIYattaNDjHBxluOukAACqflniCPODkYjiKVyyb0ZG9VtmyJUh7OBfmfQLIllgjUWbrJ1SUQICmKcMYctwm9aSJRsJwP9r+GBPs8h23oEOSLP4kQMihE3LQDuat62bDLjehIURtulX+x4eB+oNtoFkH/JjHhrvfx6BJKSJpzpfcgIde4mOPTQmfOwZASgtbtHIPQWgsgsPTrbLiOEWisB1BILIPEzh6DMHtVBm8XBSijl8JzsnD39ijUgCsDYkB40ICB9LlYYd0J2oVIL5XulKbAN8tElQQlEBYMA+N9+wx/SWIAr6RA3AyHuroUnYBoRPsQVOUJEk9BPgWzYJ+InrZggcbFIgAb6B/7nnRlEKHzZtdI79TAAKZaApWr5CoP+9hyablTv4Wg+oYfiZbAXKdbIqIbjRvzyshIe2i39HuYH8BQea0YLCIcYm1MagN74XXi1U7YOBJZljgWPDBcRLtjwNfzJtvr2Dh7Q5NvGYWOBpQyBYPmnex4aACek95XYNrl3/MhRCF6LgfKGotR6NQExW6DgyGAy6fjbsh5Do0B3EJJNomTft01n5cnvJzh5u1/4MLB/K7KNqJPdvcGpKWBwjrNOC2LohCDZAqIgE7CuL+h7hjEiOGKTBgmAc+DMsgDaCxhXEYIpj9MpvIqPvKBpiotjjpqXF5lWAZr5iZuIGZrsibkKBPNYjokZkTmAvQF3hQPrgsF4LmukmYnMGWtQGgDSAwCcIasAL1sUOkt+qUCyEQIEmqjIXIdIGAZ3MkJ3FQNwNPMgAJPAIYbdCYZsOAr2gQgABrWEZj6jOC4AACamwL65EOs5wjh2BvQJADhI4dq/hrhPyXSGGlMShtMGyZWJqg2VWJA2y7B+yv2XBlMPBeiEg/BTeHkNAsSQOAA6lPprGITEQNgABKv79DB5xG+G2G4CBE2HOEELuGQDiFkDYBSHliyHyGICKHkjRFUiqEJDqGaHSE9G6FhFYARE9YDH9ZxFDaJHmZ7KtypFWLpH+hP4SoZgdzf45b5R5q/IzFRHzG5bxHDZcq4o7L4rraECEoxbTLfDxZwrkq3GUrXR5QJDvHqA2QqiJCRDrJUjpD/EkC3J1AFDhCyA1Z1bcrSKNZdSAyCrODtYD7iq9riDGZiaf64BWDbDsx0ClL+zKrcQQZoZdBPinBwZr5WaiB1AwGUzZIkAaBIAABqqGtAhxCwU4Y+msoi8GbEeJjqC6niZSfe3o1hoQCo9GEQFJSowYlwfwjJleLAlMyyNGRu6BqaohGx+ANMhJTMk+zoeAfuP4aq/JNsJAwGzhNAlc0OBeNcOG0MqqUkLKDIsAeIFAlQOeN2JAhx2C6a2xWRxeyYaiUMCQXpue5AsQ1mHJPy6oHkM8MaSpY8HW4MTq/AchScHG5shcosSpqAckFATu5smoQodAHY16qcnYAkvOYsdpDJGCzJiA0S+AZZsZ8MXJtQdCZs5pveIIqApoUgK2As3peeLGRcKajmyphYgcqcfQGYVwNopZE8FpMEpBMiWsU5be9mNBKYdBemjBPmvB/mrBRi5m/e1mlwlBLmLYbmTmVBLqU5+5DB/ATBx55wAWbatqw+oWn01xEW80txYKKKDxJKsKiWFK9xnxu0yyNktKbKgJ848qbK0JlxUiP08JAMLWwMaiqJBgdIG+ieyeGYKZnBLWRAkIcenYiGbmAsvSVEqYfQZ8z+IyiQuw4C36Gp4CoonY4a6BnYzAJMnIt0qYZAji9g98p2IIQ+H+vq360Sg6hxKZ/OGuQpVwCc/owY6A/EPcsaIZVGe605acGyHu1hNYgB7AYk8IKQVwvqYohasYxaby0ERGbcD6WBnF8M4aMgDcXZElBCK4LC/Q9Cs+g6x8mEY48hdZzYrY/lcewBNw8ICqel6o3lrO5cgeXMLAzF2i2w5oK53QrsGyroGA4IZG1JvqG2Z+xmuMXSeZrKiqC6YIHgzpz+3IvRCm6FG5ciqi251BWmtBHm9Bmih5GRfmH5p5Rg6C5Av5VxEAAFUWIFkKjxsy4FCybxUFLA/OMFGycFDVDK6SyFiq8aB0dAXRaAqF9WcJfKzW9ASJwqoMl5aJ455e0kH29Gc49ZzVX4lMuJogn1ca31dQNIRQPGuA9s+17KSAZaSAbIY6dA3ymw0QR19Qw4La1ucNE8IA0QPy+YKposj+eOWJCQKNdQMNwevOCNh1kNXYCq9QPybeY16JeixNGApN5NmNCN8alAwwsSBsGoCSbRzKNN8FiqHS4VZAU4UVuCYootqNglwsZ4SBnNXQvlw6Wp5p1pLNgGU8F4iI71kgRNJuXoPoZs3oy+lJxOaictdQFtRAvOkQY2CVxYfAytlNd15YNAjhbs2AkBzwXI/MOIbt8N9ANtRqcE2+GYUMdkZBQE/tKsA4rtsN7ttNbKnCNC8M/gtuyMCpApZoFoyApoUo9ZdVBtWx7COtMYCowZVZAsZC6MKmairsNwP1kqycZsUJ0lrS2wvgdw3o6EPoxO9eUkudGNKd1piOzg7sfApd3Z0YRE3wmwh6osbdBeAs5esVc+aumo4MfAcIfQBCCpBZANyYnVPK5BvVlBO5A1e5Q1B5r5R5eiJ5hixiF5nWV5QeDIt5Um78d9L52ihmT9E1hi2uKlk5wiKC3Sa9beseK40BYZbNkNHN7tts3NFAvNcSAtBsmw1NdNdJNtPyBaJNSDydIdH6wteDqdYtUMs14WkWQF9xy1YFCW61yW3xKy0F7D+WCRCKEowUcxGyl1sJGFN13U91KJT1+Fs2WJm6LywxQ8nySlaMZF6ZOqJxGymd/1Y6kOeV9e3qPUOVfAMt562suq5QYJ36QyzhOcMg8gS+JwU6qce+AcbOVYPwNw8AfAsxJWGywxGA6hNDXdBlDFVGb1ApR4/MxOQss8mlFeeNhYRVGA/c0xIxDIScT5xoosyVIV64ki3WYS+p/YxuKRKZrVE6PFjY2l+cNJP1Ls0MjJ8MZ8To/QnZ6tcIVFpIq61JSClSuAgTzUBwKIP91wrMPsIp/sbM8gW9CQ5s7VuWOeKAmTipGCaNCQYA1TTwiTbSw4nYUMMN0pyY/TfwgBoQztp+cmMYi+AKBTESRJ69+BI6RBeT0MlIwwf6zlhzFdJTZeAualoo3wPtwobUnBdpsVkqpAe9oNJ+UMywo8NwKTKISI44VFs23jfWvjHzA8qTRAVj2cJwFZftnY5yzuBOEEUTTJ1gWkBdDpiT+oFAyLOIKZWp02BIxkB46szTN4AA3APSgByCfGbCy9uCyFIJInSJHZ0GAGnoRUni2jyfbWOkHHQJGXQuRD3abuvTyJejSD+lyPfPSWYxvF+pixgK5YvNlVchQMSWsemQ4NwFqrLd2MEziL3uuRfdjn1Y+cIs+SNQ/Uzc/WwaYhwYctwYA8ZrulRGvBshYya48prM8s/PI4Y4cV0mi8oRowLEwGOr8qxclsBVSqBXFqSqw4tCliBZw7BQViQLw+6Pwz41SDVkkUGykTeZJsOoQTGRLByAIr/p7SGWU0cukWG64u4rdD4iLv4oEicuJaO9wJM4U7IDEpg/rEJIkvYg0nxLKkhSs4ybkl+rc8eCUmO00m0tUge/2Gu8knxL4s0vGL01MZEQI0Cpm56jm4tQW0w0W2tfCpBalltV8ZWzw++HW+iw21spAIACgENrFs89LddJd2UMDTyxJurbtFHbnWXQxpEGvbjdA7obzB6jQxJrahDI7wbz36tseI+AkQbUSA3+B9ECuI+A1HHkP6iAeQmMj6jHFaVa1HF8GAEUf6daq7kAPH1aOIf8gn0ZmAEOAwyrPpIu6r2eKrin1HmwYnfHfAynCnwnDawKabgxeqL72bqb7710n7TxxbP7G1f7rAAHu1VbNbxQIH6bYHWKkHvLWpJ838SLYgjLM2wL16MVheNAELasVAnLlMsL9JzjaF/59DebjDxKX7LD1nbDm1dnO1VI3DSaTnsgLnhn5Qfj6hQjuKDWojiJrWyJuFkj3WhH84xXDImjWb9AKZ/i180uILtdbC4L/QUGXgbczjRzqA/XrXaM4Lt1I4lBlIdLDLFAmwxLlzeLJAmwB98AqGAAXo3RVKIMgJRywpTCYrdPEEoma1DPGkiB5MwCd6IFDF7PxQhEJGaOyF863AqazDPkPr8+hjsIYk3XtuoZALbFDLjH5IgPR3GFDJsCD1uGDxx5gWIFD5TLjPD1xxGQp2q9R0jzD78Kj1gejzDtJ0k0JHd7SNIx/rjLiRE4uzYc4z8qRX9tGs3h4FldwN9gF6mV2gdl9trlDB9cT2IAjYQ6SFDMrc5UL8U291+e27jjtmmAfRQjqkN+eEJK1/CzkTOhdoi1NuHX8Jqvqx/FDH5DQNdxiwL82CRzixqyo120Jv4Z7u4x4IgBnikyFhZs6pedL0PmWQjgoMOtM8aNp2OZj74Pxwx8mKdJx1gSGQGgdEGgsGjqSNyDzPbXHvVT6FTKS0UyrwN2fUppuRQWKNfRk+ov/W+UAwYoGzSH9mwqN5TLT1n7IMzJQR9dmwZyocR9i/qj5/S35xQHFFANXyuWwliUzfV0V53/46R5T437bA39Tw++32b8k5bzQ3F/NQl6W/m+Z8l5Z9+68el7Z9tVw458B+P+oKTRO5jKV11ZhfyndVVw9Zz11tDOfxkpDVf304wKARq2A1BumeOSyYJF/uAKd8Bdy7K0B4YdfJ4GbDrrdRoCTwHbsZjW6bdG68TevucGb6Uwd6OLcKgCwgJoRWq5pGbr5yoibAO4WsVbprEoHoEiqSiKgiyCZBDhFy8IfpEog0DRIAoqCTuLiw8ipRzW7AvyKgmgBHM865oa0IgFmYWUo62wPthCG/xKB0YUAjmAN3QJe596+SdboDGgI/YoEmsISBSVeqXpusPuUgEUV+BncbcfMSXooEHw441U5THcLkD4isUJQ4A7PPmgXhQwcB8Mclt7QgKER2mmtW3CkFTRyQb8IZQAi4iuDeCEgVvLOHwNDLgJRB/AYYLAIbhogxAOzdPMyFCDoCAAzAACYwA1UBGGF3fBlhagaAUgKmBGAAAWEoSkBwHih3QlQqgKQDvAzYV8sVM5rIM17fBFB6JJkiQS6rutVMV9fqiX08y+sAGzBANmeSgClBZufffPG2w7QYdrEb/S/r0zn4ZgwBVEOgD8kABJhI+3rZIUP+Ow5ofsIgEdJzMlQIwe8GWFURNhT7c4Xg0/67Di4AxdweWSCJ9C/UCgkuLcOSKrFUOUmZ/oOwcpfC3BBw9spABOGxDU41w7PHmmQ4tsv6awiEdYiyL157AmsKIj8I5I2FkRhw+GAiJxF3V8R3w2EbbCuHUibhTbe4Vq1e62DrENhf4SWEBHow800PCkXiNwCDA5BRALkZ8KtBCiuRtwsLPF0AqJdosFnVaqlwP6lt2Ga0Ctg5yA4DECupWKiNUKZJzIYSZXa6k1jEaP8JG79NEkvypDuDdRzXV9ibXYTOBba9lBpjn0eCYYr2LPUkAPnsp5BUEeQGwJ3FcIAB9VIHNhfQvp/RQY+NLEBpDRJ/R3fbXhmHQE2ErgOAs7KKBH6AYwC2JFshCCO7owCRNI4Xm3A7i5iiAhYiATyKPTbFRw2ERwafEDAtCKQ9MMjPvlJC55s8TY+QF01LDNDnAW4J0HoiuAHRsiPIHpHHSeDghaAfETTGF3Ja69pAMlfZCfDg70lqmOIJcq2WH44F0CyBNEObDCHeA8c6cVsS4wyp1MPANtC0goBtCMduYd0KsqEChhliNAJiGkHYSDEslYxc2PIGvwMBwRYGqcXriBAECuMWRCzbEvmIrEojixlMDuNBIl68sQ0ycNOLdCTQO9Qu/QecVQU2JXgq8HjPgM0KYC3jKAy8akF3T56iBiwUgKIn6RNyoAB2qYfwmKBwElCwJh4iIdjjuywoLw4lE8RBB9SwiuxJVBwP6GpL0ZqJQYAYueFVi1UsAtHDME8CIFzkhJFQ3GKficb0YkAp9CiQZEqAnBSodElIqgHAwCIySlCLwKjFkAW054Pwelit01ar5Z071fOhIKoJJpsY0IAcFgCVJXjTQ85HCE8EErlhakvPdymIFomwSkEmAPHmICMlS88CXSdDmmUkQBQ0hPgAMs/wtr0UcQFQjsbqIXReBwhW5UUMxL7F9hYAg44zKvQ7oxctJ4GfjKSDHF91BoaANEPzCqAIA+IO0csK+GpLAS2JGVNuv8gwKUB7SUJEYefQL6X0i+kw71n/RmHl9xqlfBYc21WIqN8OvBZoaWLiFQT6RME/Tm/2tGkB4YkANEetJDZDtmC20zWGWIQlwjU2R0nUSdPX43FZRS1XfgqJeJJZlRGXY/oB1y5n9Xh5QaAKyE5z999RaFcrsaMq44URUtXP4BUKQIURVQqVaqo6QBQYklU4EjVjeUnLnBzYgCLAhAOBB/VxBvQGlmRGFDqB7+qQ/oLALQI5Nscd+MUf0OxjowHRxPebqHhN4mx+0/zRytCNaHiRKE4eCdMiFRDog8cb+MIGDKm7PBww24GpHxCnGRBnMgsfzB3QAL4g2ZgwlMhZQ5DGgUgzUoCL8KeBqTxugs9nKq3N4hlWYnYcQNhlvEXguxGrJQLbn0GHlYBTMlMD9jmaGo6AzzS8d2Gw75RG6RAbYOJChAMcUqKYQqgRO57eIpgQ0c0nxRMkvlugzjYEJ4WnCKzE5/MCOdaG4ASkFAl4MQFGGji+w+IFQ1WZQCjBxDDS24ViJ4wdHsxBKhYCSYbUaQVDbYSETSvQHNCdhOwpko8YDE7kUJ1JRvK+BC1fHvjPx3438R7GBDG8EQWAZGf6EohhN0Ah0Xid3OkmeQG5rEeELXO1hdIVQXgOkj2KqbdgbgXgGWViXXkBgaA0AfAMNwFAod74nCZwXXOlzNytOVEruXxH4n8x7GKUJ7PTj9BPy0IFQpGJ4wdLFhWIfAbUE5OEyd5TgMyN8NJOHH0gIQKs7+TPQ8zSTUAjtd7o729wLA+AH8E+feQVD5VMFEoZ4EOXNgHy18zASBGhOgzyAp5mE/vm+I/FfjokP4xpv0F/T6UzYtIIHP0EfmURYEooPPM434iRzi5QeVSUQotp1jHgchT1CWAdJPBC4FQxKSiEyn+zvOH5OYGhHUn1UWkCiwueJG1lCiq6JcdAm/mArJMwgEsoBH4Dxxb0fsK+QOZDALLWYlsnIb4CPXxyuTLQLin2fdgpy8ZC84fNGTsHQJZ0yEUVFIOpM7DONiASi6DNQBnjSLUZ8k+1tsDzky1qAvM1WFcBZDRhEAgoS8HwBVBsZtY14fUKA2Nr91kJqmP4AQHLC+AKhv6X4Z1NZDbgGJGVRcrL31pO9VFDC2elQ1Roxx/EkiKaT1Q9YTCvW2mBaYDFmHvkVpxiFYhYjSKZ9Daz+ZoQUufn4AYkioYAFYG0AUBgAfkaCbqM2Df4eFegQJL+nKL4KwCfYneackiBREH2xxYGeoFBlfhKA+nMzhMnlHPEIKNnctv+yy7zgcu1bIGWcJBlgz6wWyV6QtQYZyjPpMKktkij+lfFXwuARCqtBv7QyES2FNrDV3NH/i9s4sTAiiE8XNYNIsBCUJsCJD15Vc/k0SfAA25Xh7guIwlE4IoQLAyA+efGTKRiUeRy4CaJNGRhZBak70iM6STGlAnwhmsGrKgEgDwkqlFgDQZYMatqFGrjVJVMqlJIYXoDFghQs1csFTB1CAAHPatVxnRXZ6A51fatTD5CnVdQ+1dnJxDcrco4KTKZqrHx44AWr2fVYWDGAOqrghQ81fL35WCrJwwq7tAapNVXBDVxquXObMRSEh01RlRNfGtFAurc1ZPCVtb0Z7OpNMzId1KzGDVWwvcOwflIwsoDyAxgssr8GAQgyyBzSGQkqIrw8VSy2q/QLGcOEEpNx4AIQzhZADGBikspXvB0cKA1Qm8H6QfcgM2tCD+BtQdLJ8kYwTlNN9BN4PPmQWmmrLZp6ywaqX0WmP1lpAWV+h73fq+8wRgBB+sX3mm3rOg4UYdvMOXU/ku6WJKjhcEwLcBbYzCfEPuu4Cf8o2VIYAAAH5NgCGt5a0n8Q/JDFBBaEJ2y6RvqHJMzD0KrBqnRwTKu6v0I3WPVaw7Bf/R1LQ2lGQqLgYAFShPELZ79FRP0pFCpWJW7QVK3gaQKsg8lEAbIJiPIBikhlXURGMMmldV3hn0q4Io/PEuEnGYGllK33dMkrBIAqwqmHomVIdQwSNMOWJ6pbokI/j4w1m+ccSjDmXkoh68ky8CbXGqZA1A8iHfTdWoKpq0O0tJVAkswBQ1Iyk8MQWK2GQBQwaQom89iAyEFBiCiAUGwNEjLRBjO4NgPyPFtQQJ48gQY8ogFHjQiDgQAUTjB6GNAualAnSTDOZstibNQQ57eQIKFwDNUwCosMTJ0tHqMlgMGgsjN1Chgia9NSgc6vqnaa+9g4IQdDFVrCAJFctiCzcH0BLlNaYOXgcKuOUHKU5QEWMcQLFWqbsUr404dGMrGETdAyA/K1OEVsSKrNQg1TVpizx0KGpUCqsLQmeu6o30P6dmOaRsu/XeZ/WwDQNvsruoYi0OEywdmdMgBXTeCR7ZTRexPaTtIA07RpLOxCTyAbmoOxdnzXdwrtDYkALduUBowWk92+SbeFVpB2w7x2vTM9gjsvYbt18n/MIJ/x+QA74RgOgwIDqpjDt8dtSQnbeynbrs/l5OkbfDth1Lt+aKO0nZzrR3dbLxGCbHQUjx0w6Wd4OqpMKQJ2Q6OdM7Cne81vbU76dRxH/p1tE0ZtTOuKlFExsUAsboVVnJUZxsUDcbtoY4R2gJrIBCautgjLFVKI34yit+hKA3YclY1fTYVbDLjUfy+K8brdgCb4PJyqGkAbINgaMQ7thQGjb+FXaTU/zwryaP8PO2pNa0YnDidCWm/GDpqN4i6DNEXIzQkMNCmb0IGAdZjpqs1o6bNq6v4P6W02wdaSzml0Qz3c3ckDG/Y7pn5rubOABIJ+NvDbmTTKq5dtSIylDEqCMC6Ax0tBCQHwA5zSANIO6H5AERvy0wQ5VWLsBW3rdfA62sBJtoxg7bVEe2oZmJNLBHaStQmM7R5sKnCRT9HcAKBQFiDM8aMvW/ipdreylgvct2ruicxAHnMts6CvUI8xjLxxeSycYgeRBmQiKfN8oaQsOFJVb6BVvww+NGCCoUBJtwwkgssoe2+9P1L26YVsqWksEX650imHhvsE5QuANOxncwWZ1lJWdp7BXTpql1lJ52VWvncjsFro6L+O7MXWkH3YI7aD/segxDq71Jyod17ZXVTtOnq6ThVBpmoIaTk3sGD4hrnQjtYMI72D8SbBowbJ3C7mUPBnJHwZx0LsFDYOpQyIaq2C6ldvTSnfe2kOA7wimuiPekghV66qU7uo3fipN0ca1Qlu2gBboD38ag9dOfKWHucNR7Do2KP8s7oY1rQVQF4CuBHKFCRANAdQC4DHqpVYUH+cMx6nJr+DxHVBNRGdRyHOBYRxwnMWbNEHtrNN9QzQO+EnBwjHZG5yczQd1BohpNsD3EpJjrKHAmKSwkCbKnrSlb5brCPbMOc2HjjOy2Awx3RaSBlixV6WH5bDO7IWjQhDEi4PpZjDAWpx0Bf8gWAPqTDiq2c7wdQukzjRd0qjGsTELgDqPWhNoTvTWMBlPh61klUxuhKAR5i/Ah0HgYSJzlUa16ZkElBow8dOZ4BBO/FSo9Uf0H6gWyqaGwG8eaDtGBIN9EAwcfEAGxO6cEQctSzsaeN2MKxzyQwG8ligWUtmZCPmA1hsphwfijNQkwBNdJQ5QiO2aSCL0HIVyBxycizjbyXGajuAJfR7PGPJhET2LM46fSMDmCEAZC8gLPtqA1CkTophIJsGY2/hNNqxsjJzGHS6YjM6gZhTWrFA8noTNxoE/cf5Hpj1c3xhgcHsHbRBFkQYwlM0F+OOCGtgJ+oyaeOyq4bTtxO0+CiDHXHEADp74H8d94Gnrjtx4E6ae/02gTjHRqcpA10y5BHB+A32iz0hMax3I+oNBsMGaCLHRtSaEZqEH8Kj0QzIQMM26cbxPBlyMgA7ipQXEYwEEqcaIFoWzNRn5TN9YcOntFBanWQOp+QE0eXJRAazYrfY3cZwh9H+0cIOkhflKpTZ0yb+KcIWGT5xh5A8ZmzeqAvExARN0AGkGACEEvo9q1YWU0yUHMEBmAXgZoNUocnfAOIK4diOxmGANT5JpIe85EJfV3YTEwemEG1MY6km59DkirT8a3H1h+yXwKnHnm6BEw+ppYASiJQ/gpLkYJ+RcwFU5heiRTJ+1BZS3yS6FKgrp6WhOY/poTzYR8xHKXEwAPm1yBgNKc/FR3N0X1Ae/sYKrUF3wb8HgKE9cfclqm/uiA1C45l8IkAkjz+Vi8hBrOvGEWpx7A9xTFAFH6AkGUQLIDdh/nSQnBeUIzk8j/6cLtwC8FrBXB3Znz6oRC6eTu1jDHtiiZ7TevwNva/1H21aUPyiBsJWzjmaxIJf1A6sW0KmXEphcNS1BseTl95lyD1p5bQw3lq4yEH5PLY+2CQIK7yfhNLGSAAVpvtDx8uwnWw0Vx2cdt13vSC2UljQEkenFMk0jRuAflemH7dh1L/Ixy8Ff1CuGMr10LKzlZSP5W1+g/P7ASaUBeTnN0QWlBoGlNTgu0HAa4xSbYBsoOAAAEmlO/mWSdcoU1gPbgVW+TYxpkxFejPInG66V13dFlqtUBcrqRi4I1aKu2Xuwwl1NmNcPMdkt41iW04Sl9MhANStsdS9zQKgzXeTd3YTHEKuZ1nkch2i6+Cnhi3WRzJAe69Yh2ik9zMNl0Ot2BzP2Whwj1kgOmdwCZnwVTdYAVDANOw34bFAaIPDCvnQ3rj8MUq00YrNbiVweIAkLm1LbemUUZ3L6yiiutvwsEtgnNsdaKDHbpYOOwqyYjU3vW48EN7i1Da0JYCuzrY82E0diFtl2bOeXa6DeHPhmxzpYSGyGSuArn6A+lv7qm03Pbndz+5nq0edsEaATzXgeGEkDQtQx3LvRbC39Y1LlhEATo1a+dG34TINryRvKztbo0xG3DO/LaD5YJVpdfp0WP0zZFSCPYGA6SWGzBHE3CNeUUm7I7Stk3gwzyWJ8MHUAKm4G1z0BqGAHfAxB2NkIdxtueD4hMtO26AnpswA0CLJnI4KDQAr3rB+nprLkEu7cTLsopdb11wJpZlQMKBhQMmdGd6J+w/lJp+fFZeMKvUOYv15l0apZd2UGBpqwwp3W9LWsfSPbs1r26bt8P3E/b6STuGmZCCVE75mK6PVDKNHUqo7Mm3I7HbRI8wvwSd0yxHFTvr3N7+obe2/hzsXmNWRBUfbXdLuEoK7PNKu83dTBF267yWBu1Sibu03F1bdnbg/S3rd3vyZZQyxesHtPbr1t9V7WPbmFWWpqVm7FZv1ttJcF7vJpez4bLYFs/bIUfyAFHSSIBs7Ydw0ZJsPtAxo7J9sVAyrYgJ3L7SDl+wXZ7T/2P75dyu1az/vv367n96u9rn14EJQygjwB5/dIeBQKH1rGk9rgiJYZQMK4jDqPpkfkPwUaN6axo4och2UhtiMW0RlctDge9YNDVoxMLu6Py7JiBPHNjjFBjbH8W5LVgPvyDQ+2xmRgbFTpaIInHQYlx5abpxTBKYnp5LOTapQ02LgGNxRz3zm7hdgre9UkHiAZzLqOzPQJKggEwzdhOtCefx2WgTHWMSj+oEzdAexNuTAjaOstOo8RSyPvrYDxBX/uMw4gY46rFqUup7uwO+756ge8ZfUxIPf6KDv1uPcfXmZYgP/YBBrEhHWOUU2jt9m7ahVTJPb3h39iBRIc1PNHKKKh+5wRHTOqU+jjGfYA1i52SAINv7EzS1qePQlvdFQZCPOcePzwa9C7mhb8fJbIAAAXhiBU2InfpjGxrv3qPtfItTzZ7/ZttjI8VeDw0wQ5WfEPrr/DQFxs72fXXG2oz2JysLIN4cAXoUBF6tDRu2wHla+9IAcAJe9BNgYtkXJAeogQHg9FAY4Zi7Id6PrreLvIMS6JfsBCXpLxQOS+petIKXi/WIw8SWf79CHKo/LLC92erQtnkRrBy7pwfgv7Ii95Z3CphdvwbINM1yMb1OC322AsNh+7vc5QSaI7dD8RnStPvMO1YF9mocnevv2UNXpvKkBve1db2qi/DiIvnbUeF3JHpbIBxSr4cgPqQarmuywAAdevhHSLgN8CHiBFlpAuwRxkQEpkSo9W4jieifgQ5auYbTrne/w9KZ/a37Qbnh43d9d+mNAabnV868DfF383wDotyW4zdv4W7cihpxA87sXNoHQWTp5gf7vYHPWw9vA8NQIP3qiDZmKey7dnuyv578r/B4q8P6rPYXarxlCb2DtIvqHseyO/Q+PtZSz7rDy11fd/1G8F3Wdpd+52ftuu0yubit0I94ff3++RbgNwI7zcXvG7N7k3vW/4CNuVmzbvRK2+94hYun92kqUPd3IDPR7QztBxPeHfSv+Xy1QV+xuhfXQ/bc78+4ndIBgBvg2ISlQfayNruE9CMlhxa76c9v1Qsy492jFfsev73Ujy9+gx/u027357ij4+7DfPv6n+4du7nEScmPVEPdtTXA56c4Gr7QHvtxZdA8jPwPM9nFdVYWcQvrjULpV3B9heIfdRKH/xvgHQ+0PMPxrmO0w/jt4eHyBHn9GQuI+qPT3ZHujyG8o/DA/XMEW9zEM9fnRvXnwSzy+/Afvv2PPRzj9+W4+/ujLfH/p2omA/bKK+IzqADcp09WuIRZ74N3Z8/uFvGPpwct5F7VD2fqQ1duZxJ5WRQeFXQr2DxMj9sKfkPqHlT47uiOjuwX47z24AXNvCa8gW5nc6gj3PdXDzGgY8ywC8AZGMPtMjT4w7Mx0gR+FMJ0EKFgPP3EOM+rW0151t634YRwHypKpt53Z708zna/xCOdsWKvwJ3XiNxeMQWRI2lFSs0deek3zo4T1aJE4ts97NY5pc1IdEgC/n1cp+MsnwGB5zIMgp50nmjrwSKq0Mo9Xb7pYwALckA2deQMo47B4ByYN4BAMovsb+gTYip85vgFVydg5ssW+kg1sUCgMKY19NCC1aYh/d1QfQdKa+5Y+HXoQAQw7bTlEBUAgc2PBr0zex5nQs2iRaHrafDVI8C0Xz1aJ0guBCQMgroPOUKiDNoxg4eJ8OI8HtZGZLNhkA7mlhTztir39IJfMCAms3gXzsd5H4lXUweTWr6pi05RsWiprmj2dE4OTAG4/zTwPJJixXkNtE3kgqgzSG8Z49du1lengT/fQC8PrJq55Z9Sr4VuCfUHvBCB/MJ5a/BUAGuY0ARtSILxevfOTWAN/LBLWFTWAC8yO/E/KiHbW1/K217U8dfTRJrrT6CCCV+LR6M+EMmcxRshA0bzZ0SzGaHC7H6mM+386dZx0HOLCuViWAkfsAwhijCqwfcznje4gt4+ZwJ1ECQTM9bYpfjM1e5xqjwZsUMKtu85iBQnUbE/8/UoEiCdBmP6IFszze0zqyTsEIC021MyFr+vP8D3p7p8A9+effIHnZSJ8wdiejAdVpksrekAZ/DX6n7P5p5f4Ap9oSgF9HrT8iQD/gN/EiZ/cbYnsoH/DQCf8NSQz3INAYQuzGBVgQoQABOJ1T9VprEYCQDFgMYEWBVgJz0bdPeNvGfsFlDMFvhSBcEQ6cf3Dt26cHfAD2wMfWft3e0J7KADfovfTs0v9XfFgjsZ+PEd0MADARqDJB+BdKA6hV3CVn6g0AQaGz9yoDBCoAJoGqGmh6oXgKSgrUdQCDF68RACDEqWaoDoAgxZolCAZoPgJGABARAIyAlARAOWBEA2gGWB8hSwMKEnVYwPyE6hRYEWAVAWgCdV8hNADQAzAjIHyF8hVYDqF8hMYAEBFgOqAahFA1YCdV0AlQBGAjAxYFsCxgFAOWAHA3wKMC/AkYBIABABgCdVChQoXyEnAtIISCsA4IIUCIAdABGAMgAQFoBVgSxAiD8hAQEKFFgAQCdVVgEYBWAPINYEWAMgVYAQCHA2gAEBlgDIEKE0ASYD0DFAvKGUDVA9QPzpNA2gCDEUoYIKAA=== -->

<!-- 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=1070):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `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 generate unit testing code for this file.`
  -	`@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 generate unit testing code.`
  - `@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 -->
<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- walkthrough_start --> ```markdown ## Walkthrough The changes introduce priority-based sorting and handling for energy conduit connections, including a new priority field in the configuration, UI controls for adjusting priority, and logic for distributing energy by priority. Energy storage and transfer calculations are refactored to use long integers. Documentation and code comments are updated for clarity. Additional improvements include capability proxying enhancements, safer null handling, and build system updates for gametest integration. ## Changes | File(s) | Change Summary | |----------------------------------------------------------------------------------------------------------|----------------| | .../api/Conduit.java<br>.../common/conduit/type/energy/EnergyConduit.java | Added `getGeneralConnectionComparator()` to support sorting connections, with an override in `EnergyConduit` for priority ordering; updated `proxyCapability` with null checks. | | .../common/conduit/type/energy/EnergyConduitConnectionConfig.java | Added `priority` field, updated constructor, codecs, copy methods, and added `withPriority()`. | | .../client/gui/screen/types/EnergyConduitScreenType.java | Added UI buttons and label rendering for priority adjustment; new methods for widget creation and increment logic. | | .../common/conduit/type/energy/EnergyConduitTicker.java | Refactored energy distribution to group by priority and distribute in bulk; added `distributeTo` helper method; removed rotating index logic. | | .../common/conduit/type/energy/EnergyConduitStorage.java | Changed energy storage calculations to use `long`; added `getLongMaxEnergyStored()` and `getLongEnergyStored()`; simplified `canReceive()`. | | .../common/conduit/type/energy/EnergyConduitNetworkContext.java | Changed `energyStored` from `int` to `long`, removed `rotatingIndex`, updated methods and codecs accordingly. | | .../common/conduit/network/ConduitNetwork.java | Modified sorting logic to use the new comparator for insert/extract connections if available; added TODO comment for future refactor. | | .../common/conduit/bundle/ConduitBundleBlockEntity.java | Removed node validity check in `getProxiedCapability`; restricted `onRedstoneChanged()` calls to loaded nodes only. | | .../common/conduit/network/ConduitNetworkSavedData.java | Moved precondition check for network discard to public method; relaxed internal removal logic to allow empty/discarded networks. | | .../common/init/Conduits.java | Increased transfer rates for energy and fluid conduits; added clarifying comment on fluid conduit tick rate. | | .../api/network/IConduitNetwork.java | Updated Javadoc comments to clarify connection list ordering and sorting behaviour referencing new comparator methods. | | .../modded/common/modules/appeng/MEConduit.java | Updated `proxyCapability` to accept nullable node and added null check to prevent NPEs. | | .../modded/common/modules/refinedstorage/RSConduit.java | Updated `proxyCapability` to accept nullable node and added null check to prevent NPEs. | | build.gradle.kts (enderio-conduits) | Added new "gametest" source set with configurations and dependencies; added gametest mods and run configuration; enhanced resource processing with property expansion. | | .../gametest/java/com/enderio/conduits/tests/** (multiple files) | Changed package declarations from `server.tests` to `tests`; renamed test class for gametest mod; updated imports accordingly. | | .../gametest/resources/META-INF/neoforge.mods.toml | Added mod metadata for `enderio_conduits_tests` gametest mod with dependencies and version placeholders. | | build.gradle.kts (enderio) | Removed "gameTestServer" run configuration from main build script. | | gradle.properties | Updated `jadeFileId` property value. | ## Sequence Diagram(s) ```mermaid sequenceDiagram participant User participant EnergyConduitScreen participant EnergyConduitConfig participant NetworkTicker User->>EnergyConduitScreen: Clicks priority up/down button EnergyConduitScreen->>EnergyConduitConfig: Calls withPriority(newValue) EnergyConduitConfig-->>EnergyConduitScreen: Returns updated config Note over EnergyConduitScreen: UI updates to show new priority NetworkTicker->>EnergyConduit: getGeneralConnectionComparator() EnergyConduit-->>NetworkTicker: Returns priority comparator NetworkTicker->>NetworkTicker: Sorts insert/extract connections by priority NetworkTicker->>NetworkTicker: Groups connections by priority NetworkTicker->>NetworkTicker: Distributes energy to highest priority group first ``` ## Possibly related PRs - Team-EnderIO/EnderIO#1025: Extensive rewrite of the `Conduit` interface including expanded generics and modifications to `proxyCapability`, closely related to the new default methods added here. - Team-EnderIO/EnderIO#1036: Adds priority-based sorting and UI controls for item conduit insert connections, complementing the priority sorting and UI changes for energy conduits in this PR. ## Suggested labels `Area-Backend` ## Poem > 🐰 > With numbers now long and priorities high, > Conduits sort and energy will fly. > Buttons to press, priorities to tweak, > Energy flows where rabbits seek. > Storage expanded, transfer rates soar— > This bunny’s code hops evermore! > ⚡🥕 ``` <!-- walkthrough_end --> <!-- announcements_start --> > [!TIP] > <details> > <summary>⚡️ Faster reviews with caching</summary> > > - CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings. > > Enjoy the performance boost—your workflow just got faster. > > </details> <!-- announcements_end --> --- <details> <summary>📜 Recent 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 7862ab69f18f588041749f436ebc82231aeb0451 and a6fbd7dde62a3b21b87610ea071f77241db0f2a6. </details> <details> <summary>📒 Files selected for processing (17)</summary> * `enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/appeng/MEConduit.java` (1 hunks) * `enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/refinedstorage/RSConduit.java` (1 hunks) * `enderio-conduits/build.gradle.kts` (3 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/BasicConduitTests.java` (1 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/ConduitGameTestHelper.java` (1 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/EnderIOConduitsTests.java` (2 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitGameTestHelper.java` (1 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitTests.java` (1 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/package-info.java` (1 hunks) * `enderio-conduits/src/gametest/java/com/enderio/conduits/tests/package-info.java` (1 hunks) * `enderio-conduits/src/gametest/resources/META-INF/neoforge.mods.toml` (1 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java` (2 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java` (4 hunks) * `enderio/build.gradle.kts` (0 hunks) * `gradle.properties` (1 hunks) </details> <details> <summary>💤 Files with no reviewable changes (1)</summary> * enderio/build.gradle.kts </details> <details> <summary>✅ Files skipped from review due to trivial changes (8)</summary> * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/ConduitGameTestHelper.java * gradle.properties * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/package-info.java * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/BasicConduitTests.java * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitTests.java * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/item/ItemConduitGameTestHelper.java * enderio-conduits/src/gametest/java/com/enderio/conduits/tests/package-info.java * enderio-conduits/src/gametest/resources/META-INF/neoforge.mods.toml </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (4)</summary> * enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java * enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java * enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java * enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java </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 (10)</summary><blockquote> <details> <summary>enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/refinedstorage/RSConduit.java (1)</summary> `91-94`: **Good addition of null safety checks** The updated `proxyCapability` method now safely handles nullable node parameters with a proper null check before accessing node data. This aligns with the new interface contracts and prevents potential NullPointerExceptions. </details> <details> <summary>enderio-conduits-modded/src/main/java/com/enderio/modconduits/common/modules/appeng/MEConduit.java (1)</summary> `152-154`: **Good addition of null safety checks** The updated `proxyCapability` method now safely handles nullable node parameters with a proper null check before accessing node data. This aligns with the new interface contracts and prevents potential NullPointerExceptions. </details> <details> <summary>enderio-conduits/src/gametest/java/com/enderio/conduits/tests/EnderIOConduitsTests.java (1)</summary> `1-1`: **Good separation of test code from production code** These changes appropriately move the gametest class to a dedicated test package and provide it with its own mod ID. This is excellent practice as it properly isolates test code and dependencies from the main mod, making the codebase more maintainable. Also applies to: 18-21, 23-25 </details> <details> <summary>enderio-conduits/build.gradle.kts (7)</summary> `19-35`: **Well-structured test configuration setup** These configuration blocks properly extend from their respective base configurations while creating isolated configurations for the gametest source set. This ensures test dependencies remain separate from production dependencies. --- `43-46`: **Good source set configuration** The gametest source set is properly configured to include the main source set in its classpath while maintaining its own runtime dependencies. This allows tests to access production code without contaminating the production artifact with test dependencies. --- `82-85`: **Appropriate dependency management** Moving the test framework dependency to the dedicated gametest configuration is the correct approach. The transitive dependency management is also properly handled. --- `91-101`: **Excellent mod definition structure** This configuration properly defines two separate mods with their own source sets, creating a clean separation between production and test code while allowing them to work together during testing. --- `115-115`: **Clear run configuration** Explicitly setting which mods are loaded in the data generation run configuration improves clarity and ensures only the necessary code is processed. --- `118-123`: **Properly configured gametest environment** The gameTestServer run configuration is correctly set up to load both the main mod and the test mod, with the appropriate source set specified. This enables isolated testing without affecting production code. --- `127-145`: **Robust resource processing** The property replacement mechanism ensures version information is correctly populated in the mod metadata file. The comment acknowledging this as a temporary solution is also helpful for future maintenance. </details> </blockquote></details> </details> <!-- 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=1070): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit <commit_id>, please review it.` - `Generate unit testing code for this file.` - `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 generate unit testing code for this file.` - `@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 generate unit testing code.` - `@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-05-12 18:15:36 +00:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 2

🔭 Outside diff range comments (1)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (1)

40-57: 💡 Verification agent

Verification inconclusive

Verify energy split calculation with large energy values

The energy splitting logic divides energy proportionally based on node count. With much larger energy values now possible, consider testing edge cases (e.g., networks with many thousands of nodes and very large energy values) to ensure mathematical precision is maintained.


🏁 Script executed:

#!/bin/bash
# Search for any tests that verify the energy splitting logic
rg -A 10 "EnergyConduitNetworkContext.*split" --glob "*.java" | grep -i "test\|assert"

Length of output: 88


Add tests for energy split calculation edge cases

There are currently no automated tests covering EnergyConduitNetworkContext.split(…). To ensure the proportional split remains accurate—especially with very large energyStored values and networks of varying sizes—please add JUnit tests that include:

• Zero-node safety check (totalNodes = 0 returns 0)
• Single-node network (all energy retained)
• Multiple nodes with small and large energyStored (e.g. ≥ Long.MAX_VALUE/2)
• Verification that sums of split contexts equal the original energyStored (no off-by-one losses)
• Randomised node counts and energy values for stochastic confidence

Place tests alongside other conduit tests (e.g. src/test/java/com/enderio/conduits/...). Ensure assertions cover both correct value range and integer-floor behaviour.

🧹 Nitpick comments (3)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java (1)

9-9: Unused import

The import for ItemConduitConnectionConfig appears to be unused in this file. Consider removing it to keep the imports clean.

-import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig;
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (1)

8-8: Consider documenting the ENERGY_BUFFER_SCALER constant

The new constant influences capacity calculations but lacks documentation explaining its purpose and why the value 4 was chosen. Consider adding a comment to explain its significance in the capacity calculation.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java (1)

72-99: Clever energy distribution algorithm with fair sharing

The distribution algorithm is well-designed:

  1. It sorts handlers by their receivable capacity (larger first), allowing for efficient allocation
  2. It intelligently decides between full distribution or fair sharing based on available energy
  3. It properly handles integer overflow concerns with the MIN operation on line 86

One potential improvement might be to add a comment explaining why sorting by larger capacity first is beneficial, as it might not be immediately obvious to future maintainers.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 47c65e7115 and 6b9fde909d.

Files ignored due to path filters (7)
  • enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/ender_energy.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/ender_fluid.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/energy.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/enhanced_energy.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/fluid.json is excluded by !**/generated/**
  • enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/pressurized_fluid.json is excluded by !**/generated/**
📒 Files selected for processing (12)
  • enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java (2 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/api/network/IConduitNetwork.java (4 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java (1 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java (1 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetwork.java (2 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetworkSavedData.java (1 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java (3 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java (3 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (2 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (3 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java (3 hunks)
  • enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java (2)
enderio-base/src/main/java/com/enderio/base/api/EnderIO.java (1)
  • EnderIO (5-11)
enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)
  • ConduitLang (9-109)
enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java (3)
enderio-base/src/main/java/com/enderio/base/api/EnderIO.java (1)
  • EnderIO (5-11)
enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java (1)
  • EIOLang (15-330)
enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)
  • ConduitLang (9-109)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java (2)
enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)
  • ConduitLang (9-109)
enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java (1)
  • ConduitTypes (30-109)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (1)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (1)
  • EnergyConduitNetworkContext (11-63)
Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Run Tests
  • GitHub Check: Analyze (java-kotlin)
🔇 Additional comments (35)
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetwork.java (2)

48-48: Good TODO comment to mark future refactoring opportunity.

This TODO comment clearly identifies a potential improvement for organizing endpoint connections that would enable better sorting capabilities.


412-417: Excellent implementation of connection sorting via comparator.

This change integrates the new general connection comparator from the Conduit interface to sort insert and extract connections. This is a critical component supporting the priority-based energy distribution mentioned in the PR objectives.

The implementation correctly:

  1. Retrieves the comparator from the conduit
  2. Conditionally sorts both lists only when a comparator is available
  3. Maintains the existing sort behavior for other connection lists
enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java (1)

1019-1022: Good optimization to only update loaded nodes.

This change adds an important check to prevent unnecessary redstone update calls on unloaded nodes, which improves performance.

enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java (2)

13-14: Import organization looks good.

The addition of the java.util.Comparator import is appropriate for the new method.


149-156: Well-designed API extension for connection sorting.

This new default method provides an elegant way for conduit implementations to define custom sorting logic for connection lists without a reference point. The API design is clean and follows best practices:

  1. Clear documentation explaining its purpose
  2. Proper nullability annotation
  3. Default implementation that returns null (making it optional)

This method is key to enabling the priority-based energy distribution mentioned in the PR objectives.

enderio-conduits/src/main/java/com/enderio/conduits/api/network/IConduitNetwork.java (4)

3-3: Appropriate import addition.

Adding the Conduit import is necessary for the updated documentation.


86-86: Improved documentation clarity.

The updated comment correctly reflects the new sorting capability provided by the Conduit#getGeneralConnectionComparator() method.


95-95: Consistent documentation update.

This change maintains consistency with the updated documentation for insertConnections().


104-104: Simplified reference to compareNodes.

Removing the fully qualified class name makes the documentation cleaner while maintaining clarity.

enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java (3)

39-43: Energy conduit transfer rates significantly increased

The transfer rates for energy conduits have been increased substantially:

  • Basic energy conduit: 6x increase (to 6,000)
  • Enhanced energy conduit: 4x increase (to 48,000)
  • Ender energy conduit: 8x increase (to 384,000)

These higher values align well with the new priority-based energy distribution system, allowing for much greater throughput in energy networks.


48-48: Helpful comment about fluid conduit tick rates

This comment adds important context that fluid conduits operate every 5 ticks, which effectively multiplies the configured transfer rate by 5. This clarifies how the actual transfer rates should be interpreted.


50-54: Fluid conduit transfer rates significantly increased

The transfer rates for fluid conduits have been increased substantially:

  • Basic fluid conduit: 4x increase (to 200)
  • Pressurized fluid conduit: 10x increase (to 1,000)
  • Ender fluid conduit: 40x increase (to 8,000)

These improvements provide much better fluid throughput, especially for the higher-tier conduits.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetworkSavedData.java (2)

129-129: Moved precondition check to public method

The precondition check for network discarded state has been moved from the private implementation to the public static method. This is good practice as it ensures validation happens at the API boundary.


134-135: Relaxed network state validation for internal method

The precondition check in the private method has been replaced with a comment indicating that both empty and discarded networks are now allowed. This makes sense as the validation now happens earlier in the call chain.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java (6)

19-20: Added priority field to energy connection configuration

A new priority field has been added to the connection configuration, enabling the priority-based energy distribution mechanism. This is a key feature for the conduit rework.


22-23: Default priority set to 0

The default priority has been set to 0, which serves as a good baseline. Connections can be configured with higher priorities to receive energy first.


31-33: Added priority field to the codec

The priority field has been properly added to the codec with a default value of 0, ensuring backward compatibility with existing saved data.


39-40: Updated stream codec to include priority

The priority field has been added to the stream codec, ensuring proper serialization and deserialization over the network.


47-49: Priority field preserved in connection state changes

The priority field is now correctly preserved when creating new connection config instances in various state-changing methods, ensuring priorities persist through connection operations.

Also applies to: 52-54, 94-97, 99-101, 103-105, 107-109


111-113: Added method to change priority

A new withPriority method has been added to allow changing just the priority field while preserving other configuration settings, completing the property modification API.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (2)

14-14: Changed energy storage from int to long

Energy storage values have been changed from 32-bit integers to 64-bit longs throughout the class. This important change prevents potential overflow issues with the significantly increased energy transfer rates and allows for much larger energy networks.

Also applies to: 20-20, 25-25, 32-32, 36-36


56-56: Fixed type casting in energy splitting

Updated the type cast in the energy splitting calculation to properly handle long values, ensuring consistency with the other changes to use 64-bit storage.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (4)

10-24: Good implementation of long-based capacity calculation with overflow protection

The implementation correctly handles large networks by checking for potential overflow and capping at Long.MAX_VALUE when necessary. This prevents arithmetic issues with very large networks.


46-46: The use of casts and MIN operations in receiveEnergy is correct

The implementation properly handles the conversion between long and int arithmetic while ensuring values remain within valid ranges.


60-62: Clean implementation of getEnergyStored int method

The method correctly converts from long to int with proper bounds checking to maintain compatibility with the Forge energy API.


65-67: Clean implementation of getMaxEnergyStored int method

The method correctly converts from long to int with proper bounds checking to maintain compatibility with the Forge energy API.

enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java (4)

18-19: Resource locations for buttons are well defined

The icon resource locations are clearly defined and follow the project's naming conventions.


21-31: Priority display implementation looks good

The implementation correctly renders the priority label and value. Good positioning relative to other UI elements.


33-42: Well-implemented priority adjustment buttons

The implementation adds increase/decrease buttons with appropriate callbacks to update the connection config's priority value. The use of the helper method for determining the increment is a nice touch.


44-54: Good keyboard modifier handling for priority increments

The method provides intuitive keyboard modifiers for adjusting priority values by different increments, improving usability for large adjustments.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java (2)

90-94: Well-implemented priority-based connection comparator

The comparator correctly sorts connections by descending priority, which aligns with the expected behavior where higher priority connections should receive energy first.


155-155: Default priority of 0 is a good choice

Setting the default priority to 0 allows users to configure both positive and negative priorities, providing flexibility in network design.

enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java (3)

36-53: Good implementation of priority-based energy distribution

The code effectively groups connections by priority and distributes energy to each group in order, aligning with the PR objective of preventing connection starvation. The comment on line 36 is helpful in understanding the algorithm.


55-62: Efficient handling of energy receivers

The code efficiently collects only capable energy handlers with their maximum receivable energy, avoiding unnecessary operations on handlers that cannot receive energy.


64-69: Ensure final distribution handles remaining energy correctly

This final distribution step correctly handles any remaining energy and handlers, ensuring all available energy is distributed when possible.

**Actionable comments posted: 2** <details> <summary>🔭 Outside diff range comments (1)</summary><blockquote> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (1)</summary><blockquote> `40-57`: _💡 Verification agent_ <details> <summary>❓ Verification inconclusive</summary> **Verify energy split calculation with large energy values** The energy splitting logic divides energy proportionally based on node count. With much larger energy values now possible, consider testing edge cases (e.g., networks with many thousands of nodes and very large energy values) to ensure mathematical precision is maintained. --- 🏁 Script executed: ```shell #!/bin/bash # Search for any tests that verify the energy splitting logic rg -A 10 "EnergyConduitNetworkContext.*split" --glob "*.java" | grep -i "test\|assert" ``` Length of output: 88 --- </details> **Add tests for energy split calculation edge cases** There are currently no automated tests covering `EnergyConduitNetworkContext.split(…)`. To ensure the proportional split remains accurate—especially with very large `energyStored` values and networks of varying sizes—please add JUnit tests that include: • Zero-node safety check (totalNodes = 0 returns 0) • Single-node network (all energy retained) • Multiple nodes with small and large `energyStored` (e.g. ≥ Long.MAX_VALUE/2) • Verification that sums of split contexts equal the original `energyStored` (no off-by-one losses) • Randomised node counts and energy values for stochastic confidence Place tests alongside other conduit tests (e.g. `src/test/java/com/enderio/conduits/...`). Ensure assertions cover both correct value range and integer-floor behaviour. </blockquote></details> </blockquote></details> <details> <summary>🧹 Nitpick comments (3)</summary><blockquote> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java (1)</summary><blockquote> `9-9`: **Unused import** The import for `ItemConduitConnectionConfig` appears to be unused in this file. Consider removing it to keep the imports clean. ```diff -import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; ``` </blockquote></details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (1)</summary><blockquote> `8-8`: **Consider documenting the ENERGY_BUFFER_SCALER constant** The new constant influences capacity calculations but lacks documentation explaining its purpose and why the value 4 was chosen. Consider adding a comment to explain its significance in the capacity calculation. </blockquote></details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java (1)</summary><blockquote> `72-99`: **Clever energy distribution algorithm with fair sharing** The distribution algorithm is well-designed: 1. It sorts handlers by their receivable capacity (larger first), allowing for efficient allocation 2. It intelligently decides between full distribution or fair sharing based on available energy 3. It properly handles integer overflow concerns with the MIN operation on line 86 One potential improvement might be to add a comment explaining why sorting by larger capacity first is beneficial, as it might not be immediately obvious to future maintainers. </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 47c65e7115adf34680451e2aa9f341fff0c9fadc and 6b9fde909d030328fd3411abd83aa09f337435b1. </details> <details> <summary>⛔ Files ignored due to path filters (7)</summary> * `enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/ender_energy.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/ender_fluid.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/energy.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/enhanced_energy.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/fluid.json` is excluded by `!**/generated/**` * `enderio-conduits/src/generated/resources/data/enderio/enderio/conduit/pressurized_fluid.json` is excluded by `!**/generated/**` </details> <details> <summary>📒 Files selected for processing (12)</summary> * `enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java` (2 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/api/network/IConduitNetwork.java` (4 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java` (1 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java` (1 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetwork.java` (2 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetworkSavedData.java` (1 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java` (2 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java` (3 hunks) * `enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java` (1 hunks) </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🧬 Code Graph Analysis (4)</summary> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java (2)</summary><blockquote> <details> <summary>enderio-base/src/main/java/com/enderio/base/api/EnderIO.java (1)</summary> * `EnderIO` (5-11) </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)</summary> * `ConduitLang` (9-109) </details> </blockquote></details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java (3)</summary><blockquote> <details> <summary>enderio-base/src/main/java/com/enderio/base/api/EnderIO.java (1)</summary> * `EnderIO` (5-11) </details> <details> <summary>enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java (1)</summary> * `EIOLang` (15-330) </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)</summary> * `ConduitLang` (9-109) </details> </blockquote></details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java (2)</summary><blockquote> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java (1)</summary> * `ConduitLang` (9-109) </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java (1)</summary> * `ConduitTypes` (30-109) </details> </blockquote></details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (1)</summary><blockquote> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (1)</summary> * `EnergyConduitNetworkContext` (11-63) </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 (35)</summary><blockquote> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetwork.java (2)</summary> `48-48`: **Good TODO comment to mark future refactoring opportunity.** This TODO comment clearly identifies a potential improvement for organizing endpoint connections that would enable better sorting capabilities. --- `412-417`: **Excellent implementation of connection sorting via comparator.** This change integrates the new general connection comparator from the Conduit interface to sort insert and extract connections. This is a critical component supporting the priority-based energy distribution mentioned in the PR objectives. The implementation correctly: 1. Retrieves the comparator from the conduit 2. Conditionally sorts both lists only when a comparator is available 3. Maintains the existing sort behavior for other connection lists </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java (1)</summary> `1019-1022`: **Good optimization to only update loaded nodes.** This change adds an important check to prevent unnecessary redstone update calls on unloaded nodes, which improves performance. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java (2)</summary> `13-14`: **Import organization looks good.** The addition of the java.util.Comparator import is appropriate for the new method. --- `149-156`: **Well-designed API extension for connection sorting.** This new default method provides an elegant way for conduit implementations to define custom sorting logic for connection lists without a reference point. The API design is clean and follows best practices: 1. Clear documentation explaining its purpose 2. Proper nullability annotation 3. Default implementation that returns null (making it optional) This method is key to enabling the priority-based energy distribution mentioned in the PR objectives. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/api/network/IConduitNetwork.java (4)</summary> `3-3`: **Appropriate import addition.** Adding the Conduit import is necessary for the updated documentation. --- `86-86`: **Improved documentation clarity.** The updated comment correctly reflects the new sorting capability provided by the Conduit#getGeneralConnectionComparator() method. --- `95-95`: **Consistent documentation update.** This change maintains consistency with the updated documentation for insertConnections(). --- `104-104`: **Simplified reference to compareNodes.** Removing the fully qualified class name makes the documentation cleaner while maintaining clarity. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java (3)</summary> `39-43`: **Energy conduit transfer rates significantly increased** The transfer rates for energy conduits have been increased substantially: - Basic energy conduit: 6x increase (to 6,000) - Enhanced energy conduit: 4x increase (to 48,000) - Ender energy conduit: 8x increase (to 384,000) These higher values align well with the new priority-based energy distribution system, allowing for much greater throughput in energy networks. --- `48-48`: **Helpful comment about fluid conduit tick rates** This comment adds important context that fluid conduits operate every 5 ticks, which effectively multiplies the configured transfer rate by 5. This clarifies how the actual transfer rates should be interpreted. --- `50-54`: **Fluid conduit transfer rates significantly increased** The transfer rates for fluid conduits have been increased substantially: - Basic fluid conduit: 4x increase (to 200) - Pressurized fluid conduit: 10x increase (to 1,000) - Ender fluid conduit: 40x increase (to 8,000) These improvements provide much better fluid throughput, especially for the higher-tier conduits. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/network/ConduitNetworkSavedData.java (2)</summary> `129-129`: **Moved precondition check to public method** The precondition check for network discarded state has been moved from the private implementation to the public static method. This is good practice as it ensures validation happens at the API boundary. --- `134-135`: **Relaxed network state validation for internal method** The precondition check in the private method has been replaced with a comment indicating that both empty and discarded networks are now allowed. This makes sense as the validation now happens earlier in the call chain. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java (6)</summary> `19-20`: **Added priority field to energy connection configuration** A new `priority` field has been added to the connection configuration, enabling the priority-based energy distribution mechanism. This is a key feature for the conduit rework. --- `22-23`: **Default priority set to 0** The default priority has been set to 0, which serves as a good baseline. Connections can be configured with higher priorities to receive energy first. --- `31-33`: **Added priority field to the codec** The priority field has been properly added to the codec with a default value of 0, ensuring backward compatibility with existing saved data. --- `39-40`: **Updated stream codec to include priority** The priority field has been added to the stream codec, ensuring proper serialization and deserialization over the network. --- `47-49`: **Priority field preserved in connection state changes** The priority field is now correctly preserved when creating new connection config instances in various state-changing methods, ensuring priorities persist through connection operations. Also applies to: 52-54, 94-97, 99-101, 103-105, 107-109 --- `111-113`: **Added method to change priority** A new `withPriority` method has been added to allow changing just the priority field while preserving other configuration settings, completing the property modification API. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java (2)</summary> `14-14`: **Changed energy storage from int to long** Energy storage values have been changed from 32-bit integers to 64-bit longs throughout the class. This important change prevents potential overflow issues with the significantly increased energy transfer rates and allows for much larger energy networks. Also applies to: 20-20, 25-25, 32-32, 36-36 --- `56-56`: **Fixed type casting in energy splitting** Updated the type cast in the energy splitting calculation to properly handle long values, ensuring consistency with the other changes to use 64-bit storage. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java (4)</summary> `10-24`: **Good implementation of long-based capacity calculation with overflow protection** The implementation correctly handles large networks by checking for potential overflow and capping at Long.MAX_VALUE when necessary. This prevents arithmetic issues with very large networks. --- `46-46`: **The use of casts and MIN operations in receiveEnergy is correct** The implementation properly handles the conversion between long and int arithmetic while ensuring values remain within valid ranges. --- `60-62`: **Clean implementation of getEnergyStored int method** The method correctly converts from long to int with proper bounds checking to maintain compatibility with the Forge energy API. --- `65-67`: **Clean implementation of getMaxEnergyStored int method** The method correctly converts from long to int with proper bounds checking to maintain compatibility with the Forge energy API. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java (4)</summary> `18-19`: **Resource locations for buttons are well defined** The icon resource locations are clearly defined and follow the project's naming conventions. --- `21-31`: **Priority display implementation looks good** The implementation correctly renders the priority label and value. Good positioning relative to other UI elements. --- `33-42`: **Well-implemented priority adjustment buttons** The implementation adds increase/decrease buttons with appropriate callbacks to update the connection config's priority value. The use of the helper method for determining the increment is a nice touch. --- `44-54`: **Good keyboard modifier handling for priority increments** The method provides intuitive keyboard modifiers for adjusting priority values by different increments, improving usability for large adjustments. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java (2)</summary> `90-94`: **Well-implemented priority-based connection comparator** The comparator correctly sorts connections by descending priority, which aligns with the expected behavior where higher priority connections should receive energy first. --- `155-155`: **Default priority of 0 is a good choice** Setting the default priority to 0 allows users to configure both positive and negative priorities, providing flexibility in network design. </details> <details> <summary>enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java (3)</summary> `36-53`: **Good implementation of priority-based energy distribution** The code effectively groups connections by priority and distributes energy to each group in order, aligning with the PR objective of preventing connection starvation. The comment on line 36 is helpful in understanding the algorithm. --- `55-62`: **Efficient handling of energy receivers** The code efficiently collects only capable energy handlers with their maximum receivable energy, avoiding unnecessary operations on handlers that cannot receive energy. --- `64-69`: **Ensure final distribution handles remaining energy correctly** This final distribution step correctly handles any remaining energy and handlers, ensuring all available energy is distributed when possible. </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -2,14 +2,48 @@ package com.enderio.conduits.common.conduit.type.energy;
import com.enderio.conduits.api.network.node.IConduitNode;
import net.neoforged.neoforge.energy.IEnergyStorage;
import org.jetbrains.annotations.Nullable;
coderabbitai[bot] (Migrated from github.com) commented 2025-05-12 18:15:36 +00:00

⚠️ Potential issue

The getLongEnergyStored method may have inconsistent bounds checking

In line 32, you're comparing against getMaxEnergyStored() (int method) instead of getLongMaxEnergyStored() which could lead to inconsistent bounds for very large energy networks.

-        return Math.max(Math.min(getMaxEnergyStored(), context.energyStored()), 0);
+        return Math.max(Math.min(getLongMaxEnergyStored(), context.energyStored()), 0);
📝 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.

    public long getLongEnergyStored() {
        var context = node.getNetwork().getContext(EnergyConduitNetworkContext.TYPE);
        if (context == null) {
            return 0;
        }

        return Math.max(Math.min(getLongMaxEnergyStored(), context.energyStored()), 0);
    }
_⚠️ Potential issue_ **The getLongEnergyStored method may have inconsistent bounds checking** In line 32, you're comparing against `getMaxEnergyStored()` (int method) instead of `getLongMaxEnergyStored()` which could lead to inconsistent bounds for very large energy networks. ```diff - return Math.max(Math.min(getMaxEnergyStored(), context.energyStored()), 0); + return Math.max(Math.min(getLongMaxEnergyStored(), context.energyStored()), 0); ``` <!-- 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 public long getLongEnergyStored() { var context = node.getNetwork().getContext(EnergyConduitNetworkContext.TYPE); if (context == null) { return 0; } return Math.max(Math.min(getLongMaxEnergyStored(), context.energyStored()), 0); } ````` </details> <!-- suggestion_end --> <!-- This is an auto-generated comment by CodeRabbit -->
@ -9,1 +40,4 @@
return Math.max(Math.min(getLongMaxEnergyStored(), context.energyStored()), 0);
}
coderabbitai[bot] (Migrated from github.com) commented 2025-05-12 18:15:36 +00:00

⚠️ Potential issue

Potential issue with energy storage update

In line 48, you're using getEnergyStored() (int method) instead of getLongEnergyStored() to update the energy stored. This could cause precision loss when dealing with large energy values.

-            context.setEnergyStored(getEnergyStored() + energyReceived);
+            context.setEnergyStored(getLongEnergyStored() + energyReceived);
📝 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.

        if (!simulate) {
            context.setEnergyStored(getLongEnergyStored() + energyReceived);
        }
_⚠️ Potential issue_ **Potential issue with energy storage update** In line 48, you're using `getEnergyStored()` (int method) instead of `getLongEnergyStored()` to update the energy stored. This could cause precision loss when dealing with large energy values. ```diff - context.setEnergyStored(getEnergyStored() + energyReceived); + context.setEnergyStored(getLongEnergyStored() + energyReceived); ``` <!-- 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 if (!simulate) { context.setEnergyStored(getLongEnergyStored() + energyReceived); } ````` </details> <!-- suggestion_end --> <!-- This is an auto-generated comment by CodeRabbit -->
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#1070
No description provided.