Links
Tags
Creators
Details
0.8.0-beta.120
Compatibility
Changes
IEMS v0.8.0-beta.120 Early Access Release
⚠️ Breaking Update: This is a complete rewrite. Old saves, old configs, old APIs, and the old sync strategy are completely incompatible.
This release is a complete rewrite of the old IEMS (v0.6.0 ~ v0.8.0-alpha): from the monolithic implementation where "the block entity is the grid" to an energy management framework with "complete separation of logic and presentation + factory-based persistence."
🚀 Core Highlights at a Glance
- Architecture Refactor: Logic and presentation are completely separated; grid simulation no longer stalls due to chunk unloading.
- FEDA Auto-Bridging: External FE devices connect automatically with zero changes, connecting upon discovery.
- Web Monitoring Panel: REST API + Token authentication, real-time grid status monitoring.
- Config Hot Reload:
/iems reloadreloads all configs with one command.
📋 Full Changelog
Click to expand full change details
Optimizations
Architecture
- Complete separation of logic and presentation: Grid logic is stripped from BlockEntity into an independent logic layer (pure POJO, not dependent on
Level); block entities degrade into appearance/views. - Autonomous device instances: Devices no longer hold references to each other; they interact with the grid only through the scheduler. They can be independently
newed / destroyed / have parameters changed, naturally suited to multi-core parallelism. - Continuous operation without chunk loading: Grid simulation no longer stalls due to chunk unloading.
Persistence
- Storage upgraded to a complete grid snapshot: From "storing only connection coordinates + type enum" to "devices (factory ID + parameters) + core info + all connections."
- Rebuild method changed to factory-based: On server startup, devices are rebuilt by device factories, eliminating the old version's dependency on device registration order.
- Fixed order-sensitive defect: The old issue where "devices load before the core → registration invalid → grid forever empty" has been fixed.
Connections and Networking
- Cable-pulling interaction fully strengthened: HUD displays cable-pulling distance and max distance in real time; over-distance (+10 block buffer) automatically retracts the cable; dimension changes immediately retract the cable; exiting the world forcibly cleans up, eliminating residual state.
- Server-side secondary validation: C2S cable-pulling requests are revalidated server-side for endpoints, same dimension, distance, duplicates, and relay rules, no longer relying on the client.
- Security protection: Added connection proximity checks and rate limiting to prevent packet modification for arbitrary remote connection creation.
- Sync packet hardening:
GridSyncPayloadperforms size validation before full topology sync to prevent oversized packets from causing client OOM.
Laser Rendering
- No longer disappears from side view: Switched to Billboard width direction (width = beam direction × (camera→beam)).
- No longer thins out and disappears at distance: Added a minimum screen-space width
max(0.03, distance × 0.0015). - Visible from any angle: Disabled backface culling for double-sided rendering while retaining depth testing (still occluded by blocks).
- Eliminated ghost diagonal lines: Inserted degenerate triangles between adjacent strips for separation.
- Client cache extended:
ClientGridCachesimultaneously handles the main grid / island / bridge three lists, including four-quadrant statistics and EMA smoothing.
Web Monitoring Panel
- Upgraded from an unauthenticated read-only page to a REST API: Default port 8080 → 28567; by default only binds to 127.0.0.1, remote access can be explicitly opened.
- Authentication: All
/api/*require a Token (request header or query parameter). - Unified data structure: Unified envelope
{schema, ts, data}; BigInteger fields are transmitted as decimal strings to avoid precision loss. - Thread safety: HTTP thread tasks are queued to the tick thread, eliminating data races with the core; the thread pool is explicitly stopped on world reload, and metric buffers are cleaned per session, avoiding thread leaks and cross-save interference.
Concurrency Model
- Explicit tick-thread exclusivity: Grid state is owned by the server tick thread; external threads submit tasks uniformly via
IEMSAPI.runOnServerThread()/callOnServerThread().
Energy System
- Settlement tick: Changed from SE/2tick (once every 2 ticks) to SE/tick (settled every tick).
- Unified units: SE is used as the internal settlement basis; FE / AE are converted by the adapter layer, and no extra converters need to be placed.
- Three-state grid topology: Added BFS reachability determination and topology snapshots for the main grid / island / boundary perspectives; devices not connected to a core are allowed to interconnect first (island), rendered with red lasers to indicate no power, and automatically powered once the core is in place.
- Protocol capacity now declared by the core: No longer incremented/decremented by devices themselves; the framework uniformly calculates and detects over-limit conditions.
- Connection distance changed to declarative: Old fixed 1500 blocks → new version declared by devices/cores; if undeclared, the framework defaults to 500 blocks.
- Command system: Debug commands
/iems_debug add_connection | list_connections | clear_connectionsupgraded to/iems status | protocol | scan | shutdown | restart.
Build and Dependencies
- GeckoLib 4.8.4 embedded via Jar-in-Jar: Players do not need to install it separately (the old version listed it as a required external dependency).
- NeoForge dependency range relaxed: From fixed
21.1.228+toNeoForge 21.1.0+.
Added
- Device Factory Mechanism (M9 Simulation): Devices are persisted as "factory ID + parameters"; they continue to exist detached from blocks, forming the basis for restart reconstruction and chunkless operation.
- FEDA External FE Device Auto-Bridging: Scans any NeoForge FE device (generator / consumer / energy storage) within range every 20 ticks; automatically connects upon discovery, with zero changes required to the other mod; bridge lasers default to cyan, configurable to normal color.
- Island Connections: Connections not connected to a core can be created and retained, with red lasers indicating no power.
- Web REST Endpoints:
/api/status,/api/devices,/api/connections,/api/topology,/api/metrics,POST /api/grid/active. - Metrics Ring Buffer: Provides time-series sampling of energy / capacity / protocol / device count for
/api/metrics, and can connect to external dashboards. - Configuration System
config/DLZstudio/IEMS/: Automatically generates commented config files on first launch.Energy.toml—fePerSeenergy exchange rate (default 1 SE = 10 FE, range 1 ~ 9×10²⁶)APIserve.toml— Web panelenabled/host/port/tokenRenderer.toml—colorizeAutoConnectbridge laser coloring toggle
/iems reloadHot Reload Command: Reload all IEMS configs with one command, no game restart required (permission level 2).- Cable-Pulling Contract
IIemsInteractable: Devices implementing this interface can participate in the framework's built-in cable-pulling interaction, decoupled from specific block types. - Static API Facade
IEMSAPI: Provides entry points for device/core attachment, connection management, topology query, grid on/off, power source registration, device scanning, external thread task submission, etc. - Topology Snapshot Query
getSnapshot(): Obtain main grid / island / boundary three perspectives at once. - Example Devices: Energy Transmission Repeater (500 blocks, manual) and Energy Broadcast Tower (50 blocks, automatic + manual), including model rendering and built-in level 7 lighting.
- Four-Quadrant Power HUD:
EnergyOverlayRendererdisplays four-quadrant statistics with EMA smoothing (1.5s time constant). - Adapter Bridge Connection Type:
ADAPTER_BRIDGEand regular connections are handled separately in topology and rendering.
Removed
- GE Unit System: GE is completely removed (including its unit enum and all project references); the new unit system is FE / AE / SE.
- Time Display Mode API: Removed the old
standard/coordinateddual display modes, unified to SE/tick. - Energy Converter Block: No longer need to manually switch SE↔GE↔FE↔AE; FE is automatically converted by the bridge layer.
- Energy Storage Block: Standard storage (100,000 SE) and universal storage (10²⁰ GE) are no longer provided by the framework and are left to external mods to implement.
- Energy Marker Block: The passive block used for old multiblock structure positioning has been removed.
- Broadcast Tower Line-of-Sight Occlusion Check: Removed the old rule "cannot connect if ≥3 full blocks occlude between the signal source and the device"; changed to pure distance determination.
- Core Block Base Class
GridCoreBlock: Cores no longer attach by inheriting from a block base class; changed toCoreDevicelogical instance + factory registration. - Instance-style API Facade
IEMSApi.getInstance()andEnergyValueWrapper: Replaced by static facadeIEMSAPI+ rawBigInteger. - Old Three-Packet Sync Set:
ConnectionSyncPayload/ConnectionAddPayload/ConnectionRemovePayloadreplaced by the unifiedGridSyncPayloadfull snapshot.
Summary
IEMS0930 reshapes IEMS from "an energy mod with a full set of built-in blocks" into "an energy management framework responsible for abstraction, scheduling, and visualization." Grid logic no longer depends on blocks to survive; external device integration changes from "requiring the other party to adapt" to "auto-discovery means bridging." Combined with hot-reloadable exchange rate and rendering configs, plus a Token-authenticated REST monitoring panel, modpack authors and server operators can build and maintain large power grids with lower integration cost and higher observability.
📝 Author's Note
This version's changes are really extensive, so there may be some bugs. I hope everyone will actively provide feedback. Thank you.
(It would be even better if feedback includes logs, crash reports, and reproduction steps.)
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:PWFgeIo9:vYpYBG5G"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:PWFgeIo9:vYpYBG5G"
}

