- Added player joined/left log messages to ChatHostedService.
- Added an EventAbortedException and suppoet to EventBus for handling it as a way to stop delivery for a specific event.
- Added watch/unwatch methods to the Blackboard and BlackboardState to allow more easily watching specific blackboard properties.
- Modified BlackboardState to support a state ID to make it easier to have multiple blackboards in an application.
- Added EntityContainer.isStarted() to be able to determine if a container has already been started or not.
- Added an IterationProcessorThread class and IterationProcessor interface for managing lock-step background processes.
- Modified EntityUpdater to optionally use an IterationProcessorThread to perform network entity updates on a background thread.
- Added some performance monitoring to EntityUpdater to log a warning when an update takes a lot longer than expected.
- Updated GameSystemManager to set the current frame number as a "frame" logging MDC so that certain logging implementations can include it as part of the log message format.
- Added a SystemTiming class that can optionally be given to GameSystemManager to track per-system timings and dump the information as a warning when a frame exceeds a certain threshold.
- Fixed an NPE when stopping an EntityContainer that did not fully start.
- Modified GameSystemManager initalize() and start() methods to cleanup partial init and partial startup+init on failure.
- Modified EntityContainer's element type detection to better handle parameterized extensions of EntityContainer. (Complete with unit tests.)
- Added an EntityContainer.getComponentTypes() protected method so that subclasses can query the component types.
- Increased base guava version to 21 to get java.util.function compatibility.
- Updated MessageState to allow for a configurable max width that will be applied to created Labels. (so they autowrap at max width)
- Added a bunch of trace logging to the Blackboard class.
- Change the target version of the project to Java 8 to match the few Java 8 classes that are used.
- Added @SafeVarargs to EntityContainer to avoid unchecked varargs warnings.
- Added ChatHostedService.add/removeChatSessionListener() so that the server can listen for chat messages.
- Added ChatHostedService.postMessage() so that a server console can post messages to the chat.
- Added some alternate constructors to GameSystemState that allow passing of an existing/custom GameSystemManager.
- Added GameSystemsState.getGameSystemManager() and GameSystemsState.get(class, boolean) methods.
- Added RecurringTaskSystem for executing general tasks once per frame.
- Added JobState/WorkerPool.isBusy() to indicate if there are still pending/running workers.
- Added JobState.getPoolSize() for querying the number of threads in the pool.
- Modified JobState.getQueuedCount()/getActiveCount() to return the live numbers from WorkerPool instead of the (likely delayed) numbers that the versioned objects are tracking.
- Fixed an issue where shutdown workers were spewing InterruptedException stack traces to the logs during shutdown.
- Changed the element ID for MessageState labels to be "console.message.label" instead of "message.label". The latter was too generic in styling and was often catching optionPanel.message.label as well.
- Fixed BulletSystem collision listener iteration to use getArray() instead of creating an iterator every time. (thanks Ali-RS)
- Fixed a bug in MovementState where disabled states would be auto-enabled if the default camera initialization ran.
- Added a more general WorkerPool class to encapsulate the job management of JobState. Modified JobState to delegate to it.
- Added a Blackboard class and auto-registered it with the GameSystemsManager.
- Added a BlackboardState class for convenient access to a blackboard object in client-side code.
- Renamed the JobState.getQueuedCountReference() and getActiveCountReference() to getQueuedCount() and getActiveCount() respectively. The old one was a typo and since this is a newish class, hopefully it doesn't affect too many folks to fix it now.
- Breaking change to the CommandEntry interface where runCommand() now has a boolean return value. Returning true allows the command to keep the console open.
- Fixed DecaySystem to call the "fail on error" version of getSystem() when looking up the entity system.
- Updated SimTime to have a setCurrentTime() method that allows resetting the simulation to a particular time, either because the game is being reloaded or because it's being continued after a pause, etc..
- Refactored SimTime's internals to make time tracking easier and more flexible.
- Updated GameLoop to call setCurrentTime() on its safe sim time instead of update(), ie: the time returned by GameLoop.getStepTime() This avoids a base time discrepancy but leaves a breaking change that tpf will always be 0. (tpf was generally nonsense before.)
- Updated GameLoop to allow waiting for start() to complete. If waiting then if there is an error during startup then it will be wrapped and rethrown from the start(true) method.
- Added SimEvent.simFailed and modified GameSystemsManager to publish this event if either initialize() or start() fails.
- Fixed a bug in MovementState where the provided walk speed wasn't being adopted unless the run state changed.
- Migrated the build to gradle 7.4.2
- Moved distribution to maven central.
- Added a CubeSceneState for quickly adding a fully lit test scene to an application.
- Added a DefaultSceneProcessor which is basically an empty implementation of JME's SceneProcessor interface.
- Fixed DebugHudState to automatically resize its screen layout when the viewport size changes.
- Updated JME version to 3.3. (To get the new AppState ID methods.)
- Added a JobState class and Job interface for running background jobs in a simple and JME-friendly way.
- Added some standard simple chat service classes for networked apps.
- Added CompositeAppState.clearChildren()
- Modified MovementState to handle null movement targets. The state will be automatically enabled/disabled with non-null/null movement targets, respectively.
- Added an initialize and terminate methods to MovementTarget for the MovementState to call when the target is set.
- Added an AbstractMovementTarget class to shield subclasses from future interface changes.
- Fixed a an issue where EntityContainer.stop() wasn't clearing the internal entity set reference causing other issues if operations were performed on the container after stop.
- Refactored GameLoop to allow setting a custom loop sleep strategy.
- Added a NanoLoopSleepStrategy that uses LockSupport.parkNanos() to sleep and may perform better on some OSes.
- Added a standard MovementState with default mappings for mouse, keyboard, and joystick and a default wiring to the standard JME camera. The movement target is configurable.
- Upped the Zay-ES-net version to 1.4.0 to get the entity set filtering bug fix.
- CompositeAppState modified to use SafeArrayList.getArray() in for loops.
- Modified GameLoop's default frame interval constant to be public: GameLoop.FPS_60
- Added a GameSystemsState utility for managing a GameSystemManager in single player games.
- Added a MemoryDebugState utility that displays memory stats using the DebugHudState.
- Upped Lemur and Zay-ES/Zay-ES-Net dependencies to latest versions (1.12.0 and 1.3.1/1.4.0 respectively.)
- Fixed a SimTime initialization problem where the first tpf would be huge.
- Fixed an issue where EntityContainer wouldn't support nested parameterized types.
- Added GameSystemManager.getStepTime()
- Added GameLoop.getStepTime() that is thread-safe with respect to the game loop thread.
- Added SimTime.toSimTime() and SimTime.getFutureTime(duration) to help with conversion of seconds to game time.
- Added a standard es.common.Decay component for tracking the 'life' of an entity.
- Added a standard sim.common.DecaySystem for automatically destroying entities whose Decay time has expired.
- Added GameSystemManager.get(class, failOnMiss) that can optionally throw an exception if the system does not exist.
- Added AbstractGameSystem.getSystem(class, failOnMiss) that can optionally throw an exception if the system does not exist.
- Added a MessageState that can be used to display fading messages popping up from the bottom of the screen.
- Added a basic CommandConsoleState that can be used to allow command entry (can automatically feed the MessageState).
- Modified DebugHudState to allow user-supplied VersionedObjects to be displayed instead of forcing them to be created through the API.
- Added a CameraState to make it easier to independently set camera parameters like FOV, near, and far plane values.
- Modified SimTime to initialize baseTime to current time on the first frame so that game time begins counting from the first frame.
- Fixed an NPE in CompositeAppState.addChild() when called after the outer state is attached but before it was initialized. See PR #5.
- Added SimTime.getUnlockedTime() which will return a SimTime-translated time between frames, ie: not frame locked.
- Set sourceCompatibility to 1.7 and turned on detailed 'unchecked' warnings
- Suppressed 'unchecked' warnings in some methods of EntityContainer, EventBus, and DecaySystem where it is known that the operations are safe or safe-ish, ie: we know we did it for a reason and don't need to be reminded all the time.
- Increased Zay-ES versions to 1.3.0
- Fixed the EventBus addListener()/removeListener() methods to be static like they were supposed to be.
- Added the ability to add/remove global 'dispatch' listeners to the EventBus. This is useful for things like lifecycle logging or other debug/status related operations.
- Fixed the EventBus to properly check superclasses for autowired event listener methods.
- Exposed the DebugHudState's element IDs to make it easier to restyle the debug HUD.
- Flipped the GameLoop's update loop to sleep when idle instead of only after an actual update was run.
- Modified GameLoop to allow configuring the amount of time to sleep when idle-busy-polling for the next update interval.
- Modified GameSystemManager to log its update errors before sending them to the event bus as a fatal error.
- Modified the EventBus to log.debug() any events that are undelivered.
- Modified the build.gradle to replace the JME version with a specific version instead of letting it float. I think alpha4 is generally the minimum accepted 3.1 version at this point. Did the same for all of the floating version references.
- Added some lifecycle trace logging to GameSystemManager.
- Added a DebugHudState.removeDebugValue() for removing previously created debug values from the HUD.
- Fixed the DebugHudState to clear the background of the "screen" container regardless of style settings.
- Fixed a bug where the wrong class was being reported in the exception message for adding event bus listeners.
- Initial public release with maven artifacts