Consolidates two standalone Railroader mods into one UMM "everything mod" with an optional-module framework. Modules are disabled by default and toggled per-module from the S3 settings page. Core framework: - IModule contract plus ModuleRegistry, with each module owning a Harmony instance scoped by its id so only enabled modules patch the game - Per-module flat JSON settings (SettingsStore). On this Mono runtime JsonUtility silently drops nested custom-class fields, so settings stay flat - Foldout-per-module settings panel plus a detector that offers to disable the old standalone mods if they are still installed Modules (moved over to parity, verified in-game): - Physics Optimizer (was RailroaderPhysicsOverhaul): LOD fast-path and auto-freeze, profiler overlay, debug car tinting, /rpf console commands - Map Popout (was RRPopout): native map detach window. Pure-UMM install that drops the winhttp proxy and LoadLibrary's RRPopout.dll from the mod folder. Native Win32 + D3D11 + Dear ImGui engine included. Fixes a latent break where the now-private MapBuilder.UpdateForZoom() is reached via Traverse. Build: dotnet for the managed assembly (netstandard2.1) and CMake for the native DLL. build-local.ps1 installs into the game, build-release.ps1 packages the UMM drag-install zip.
32 lines
917 B
C++
32 lines
917 B
C++
#pragma once
|
|
#include <queue>
|
|
#include <mutex>
|
|
#include "../include/shared_types.h"
|
|
|
|
// Thread-safe queue of InputEvents. Written by the Win32 message pump thread,
|
|
// read by the Unity main thread via RRPOPOUT_PollInputEvents.
|
|
class InputQueue {
|
|
public:
|
|
void push(const InputEvent& e) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
if (m_queue.size() < kMaxBacklog) {
|
|
m_queue.push(e);
|
|
}
|
|
}
|
|
|
|
// Drains up to maxEvents into outEvents. Returns number written.
|
|
int drain(InputEvent* outEvents, int maxEvents) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
int n = 0;
|
|
while (n < maxEvents && !m_queue.empty()) {
|
|
outEvents[n++] = m_queue.front();
|
|
m_queue.pop();
|
|
}
|
|
return n;
|
|
}
|
|
|
|
private:
|
|
static constexpr size_t kMaxBacklog = 256;
|
|
std::queue<InputEvent> m_queue;
|
|
std::mutex m_mutex;
|
|
};
|