
IEMS
Added SE energy units and a series of energy transmission devices in the style of 《Arknights: Endfield》, utilizing high-precision storage and computation for energy.
Список изменений
IEMS v0.8.0-beta.120 Early Access Release
!Version !Dev codename
⚠️ 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.)
