Terasology/subsystems
Cervator 2ed6da9cb2 fix: null-check setter and pass value in ObjectFieldMapTypeHandler.deserialize
Two bugs in deserialize for private fields:
1. findSetter(field) can return null — no null check (NPE risk)
2. setter.invoke(result) passed no value argument — the setter was
   called with zero args, silently failing to set the field

Fixed to match the serialize side's pattern: null-check the setter,
log an error if missing, and pass fieldValue.get() as the argument.

CodeRabbit flagged this on PR #5299 (outside-diff-range, critical).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:37:01 -04:00
..
DiscordRPC temp: gestalt-di migration changes 2025-04-15 20:36:59 +01:00
TypeHandlerLibrary fix: null-check setter and pass value in ObjectFieldMapTypeHandler.deserialize 2026-03-31 20:37:01 -04:00
build.gradle Update build files to remove deprecation warnings 2023-10-26 08:06:08 +02:00
README.MD feature(subsystems): extract DiscordRPCSubSystem (#4233) 2020-11-14 21:07:36 +01:00
subprojects.settings.gradle.kts build: migrate subprojects.settings.gradle to kotlin (#5203) 2024-01-08 19:16:47 +00:00

Subsystems

Subsystems provide and extend engine functionality that might not be needed all the time.

A subsystem can provide an API to be implemented by other subsystems (API subsystem). Such an API subsystem does not provide any functionality on its own.

Typical examples for subsystems are:

  • platform integration (e.g., Discord)
  • native libraries usage
  • network activity

⚠️ Subsystems should not extend or provide gameplay features! Use Modules instead.

It is planned to allow combinations of modules with subsystems for new functionality in the future.

Comparation between Module and Subsystem functionality:

Module Subsystem
Boot at game start at game launch
Sandbox Yes No
Installing Yes, in-game download from server or repository No, with facade or engine only
Dependencies only another Modules any, except Modules
Build Script engine-driven free-style