Add TechnicianHiring module for managing additional technicians

- Implemented TechnicianHiring class to register and manage extra technician employees.
- Defined a struct TechDef to encapsulate technician properties such as ID, name, description, salary, and required reputation.
- Added methods for initializing technicians, handling hiring and firing events, and restoring technicians on load.
- Included logging for tracking registration, hiring, firing, and restoration processes.
This commit is contained in:
Marvin
2026-04-21 22:20:33 +02:00
parent 9f8164ba59
commit 8ef5bfbe21
53 changed files with 25070 additions and 303 deletions
-3
View File
@@ -1,3 +0,0 @@
[submodule "plugins/DataCenter-RustBridge"]
path = plugins/DataCenter-RustBridge
url = https://github.com/mleem97/DataCenter-RustBridge.git
+9 -1
View File
@@ -15,6 +15,7 @@
- **Harmony Patches** - MainMenu, MODS Button injection
- **IL2CPP Compatibility** - InputSystem, Coroutines, Il2CppTMPro
- **MoonSharp Lua** - Embedded scripting engine
- **Integrated DataCenter Compatibility Layer** - RustBridge/LangCompat runtime is embedded in-core under `src/Compatibility/DataCenterModLoader`
## Installation
@@ -24,7 +25,14 @@
## Dependencies
- None (this IS the core)
- Built-in only (this IS the core)
- Legacy `RustBridge` and `LangCompatBridge` are integrated into `gregCore` and are no longer shipped as standalone external plugin/mod dependencies
## Architecture Update
- Legacy external trees `plugins/DataCenter-RustBridge` and `mods/greg.Plugin.LangCompatBridge` were retired from `gregCore`
- Runtime compatibility lifecycle is now wired directly from `GregCoreMod` to `DataCenterModLoader.Core`
- Compatibility sources are maintained in-core at `src/Compatibility/DataCenterModLoader`
## Building from Source
Binary file not shown.
+9
View File
@@ -13,6 +13,9 @@
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
<EnableDefaultNoneItems>false</EnableDefaultNoneItems>
<Version>1.0.0.35-pre</Version>
<FileVersion>1.0.0.35</FileVersion>
<AssemblyVersion>1.0.0.35</AssemblyVersion>
</PropertyGroup>
<ItemGroup>
@@ -31,11 +34,17 @@
<Reference Include="UnityEngine.CoreModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.UI"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.UIModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.UIModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.IMGUIModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.InputLegacyModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.AIModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.AIModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.AnimationModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.AnimationModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.ImageConversionModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.ImageConversionModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.PhysicsModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="UnityEngine.TextRenderingModule"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll</HintPath><Private>false</Private></Reference>
<Reference Include="Unity.InputSystem"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\Unity.InputSystem.dll</HintPath><Private>false</Private></Reference>
<Reference Include="Unity.TextMeshPro"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\Unity.TextMeshPro.dll</HintPath><Private>false</Private></Reference>
<Reference Include="Il2CppUMA_Core"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\Il2CppUMA_Core.dll</HintPath><Private>false</Private></Reference>
<Reference Include="Il2CppTMPro"><HintPath>lib\references\MelonLoader\Il2CppAssemblies\Il2CppTMPro.dll</HintPath><Private>false</Private></Reference>
</ItemGroup>
@@ -1,148 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>disable</Nullable>
<ImplicitUsings>disable</ImplicitUsings>
<AssemblyName>greg.JoniMLCompatMod</AssemblyName>
<RootNamespace>DataCenterModLoader</RootNamespace>
<Description>MelonLoader mod that provides a Rust FFI bridge for Data Center</Description>
<!-- Suppress warnings about version conflicts with Il2Cpp assemblies -->
<NoWarn>CS1701;CS1702</NoWarn>
<!-- Add both MelonLoader directories as assembly search paths for transitive dependency resolution -->
<ReferencePath>$(MelonLoaderDir)\net6;$(MelonLoaderDir)\Il2CppAssemblies</ReferencePath>
<AssemblySearchPaths>{CandidateAssemblyFiles};{HintPathFromItem};$(MelonLoaderDir)\net6;$(MelonLoaderDir)\Il2CppAssemblies;{TargetFrameworkDirectory};{RawFileName}</AssemblySearchPaths>
</PropertyGroup>
<!--
MelonLoader + Il2Cpp assemblies live under the game folder.
Override if your install path differs:
dotnet build -c Release -p:DataCenterGameRoot="C:\Program Files (x86)\Steam\steamapps\common\Data Center"
Or set DataCenterGameRoot in Directory.Build.props.
-->
<PropertyGroup>
<DataCenterGameRoot Condition="'$(DataCenterGameRoot)' == ''">C:\Program Files (x86)\Steam\steamapps\common\Data Center</DataCenterGameRoot>
<MelonLoaderDir>$(DataCenterGameRoot)\MelonLoader</MelonLoaderDir>
</PropertyGroup>
<ItemGroup>
<!-- MelonLoader core -->
<Reference Include="MelonLoader">
<HintPath>$(MelonLoaderDir)\net6\MelonLoader.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- HarmonyX (shipped with MelonLoader, needed for [HarmonyPatch] attributes) -->
<Reference Include="0Harmony">
<HintPath>$(MelonLoaderDir)\net6\0Harmony.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Il2CppInterop runtime (needed for Il2Cpp type access) -->
<Reference Include="Il2CppInterop.Runtime">
<HintPath>$(MelonLoaderDir)\net6\Il2CppInterop.Runtime.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Il2Cpp mscorlib (needed for Il2Cpp base types like Il2CppObjectBase) -->
<Reference Include="Il2Cppmscorlib">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Il2Cppmscorlib.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Il2CppSystem (needed for Il2Cpp collection types) -->
<Reference Include="Il2CppSystem">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Il2CppSystem.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Game assembly (contains PlayerManager, BalanceSheet, TimeController, etc.) -->
<Reference Include="Assembly-CSharp">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Assembly-CSharp.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Unity engine core (contains UnityEngine.Object, Time, MonoBehaviour, etc.) -->
<Reference Include="UnityEngine.CoreModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.CoreModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Unity UI module (needed for Button, Text, Image, LayoutGroup, etc.) -->
<Reference Include="UnityEngine.UI">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.UI.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- TextMeshPro (needed for TextMeshProUGUI text component access) -->
<Reference Include="Unity.TextMeshPro">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Unity.TextMeshPro.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- AI Module (needed for NavMeshAgent removal on remote player models) -->
<Reference Include="UnityEngine.AIModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.AIModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- UI Module (needed for Canvas, RenderMode on nametags) -->
<Reference Include="UnityEngine.UIModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.UIModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Input Legacy Module (needed for Input.GetKeyDown, KeyCode) -->
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.InputLegacyModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Unity Input System (new Input System package, needed for Keyboard.current) -->
<Reference Include="Unity.InputSystem">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Unity.InputSystem.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Text Rendering Module (needed for FontStyle, TextAnchor in IMGUI styles) -->
<Reference Include="UnityEngine.TextRenderingModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.TextRenderingModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- IMGUI Module (needed for GUI/GUILayout in multiplayer panel) -->
<Reference Include="UnityEngine.IMGUIModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.IMGUIModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Unity Physics Module (needed for Collider/Rigidbody if used) -->
<Reference Include="UnityEngine.PhysicsModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.PhysicsModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Image Conversion Module (needed for ImageConversion.LoadImage to load PNG portraits) -->
<Reference Include="UnityEngine.ImageConversionModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.ImageConversionModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- Animation Module (needed for Animator, AnimatorControllerParameterType on remote players) -->
<Reference Include="UnityEngine.AnimationModule">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\UnityEngine.AnimationModule.dll</HintPath>
<Private>false</Private>
</Reference>
<!-- UMA Core (needed for DynamicCharacterAvatar, UMAData, UMAGenerator on remote players) -->
<Reference Include="Il2CppUMA_Core">
<HintPath>$(MelonLoaderDir)\Il2CppAssemblies\Il2CppUMA_Core.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
</Project>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+125
View File
@@ -0,0 +1,125 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.0.0.35-pre] - 2026-04-21
### Fixed
- **Unity 6 Compatibility**: Fixed `UpdateCoin` Harmony patch parameter name mismatch (`_amount` -> `_coinChhangeAmount`).
- **Stability**: Switched `GregDevConsole` and UI windows to `GUI.Window` to avoid `LayoutedWindow` constructor errors in Unity 6.
- **HexViewer**: Major refactor to use stable IMGUI and current SDK namespaces.
## [0.1.0] - 2026-04-18
### Added
- NuGet packaging baseline for `gregCore` with symbol package output (`.snupkg`).
- Local + GitHub Packages feed configuration and package source mapping.
- Downstream `build/gregCore.props` integration for reference-only package usage.
## [v1.0.0.7] - 2026-04-12
### Added
- **gregUI**: Complete UI manipulation layer for UGUI (`src/UI/`).
- **GregUIManager**: Central canvas registry and lifecycle management.
- **GregUITheme**: Design system tokens (The Luminescent Architect).
- **GregUIBuilder**: Fluent builder API for mod developers.
- **UI Components**: `GregPanel`, `GregButton`, `GregLabel`, `GregToggle`, `GregSlider`, `GregBadge`, `GregSeparator`.
- **HexViewer Integration**: UI Tree Inspector (F1), Hook Monitor (F2), Element Inspector (F3).
- **UI Hooks**: New hook category `greg.UI.*` for monitoring game UI events (MainMenu, PauseMenu, HUD, Tooltips).
### Changed
- `gregCoreLoader.OnInitializeMelon`: Now registers `GregUIManager`.
- `gregUiExtensionBridge.OnSceneLoaded`: Now notifies `GregUIManager`.
## [v1.0.0.6] - 2026-04-12
### Added
- **Game Compatibility Update**: Verified compatibility with *Data Center* patch `v1.0.45.5`.
- **VLAN Management**: Added `SetVlanAllowed`, `SetVlanDisallowed`, and `IsVlanAllowed` to `gregGameHooks` and `gregGameApi` (v9).
- **Route Evaluation**: Documented hooks for improved routing system.
- **gregReferences Synchronization**: Updated reference documentation for the new game version.
## [v1.0.0.0] - 2026-04-11
### Added
- **Phase 5 Implementation**: Initial SDK bridges for Economy and Data.
- **GregBalanceService**: Access to financial data, salaries, and income simulation.
- **GregLocalisationService**: Direct access to the game's internal translation system.
- **Roadmap Expansion**: Added Phase 8 (Unity Scripting API) and refactored all documentation to English with Material Symbols.
## [v1.0.0.0] - 2026-04-11
### Added
- **Game System Bridges**: 9 new SDK services for direct control of game systems via IL2CPP abstraction.
- **Hardware Bridges**: Direct interaction with physical server and rack objects.
### Added
- **Unity Signal Normalization**: 30+ canonical hooks in `GregNativeEventHooks` based on IL2CPP snapshots.
- **Full Category Registries**: Offizielle SDK-Registries für Server, Switches, Kunden, Mitarbeiter, SFP, Kabel, Möbel und Items.
- **Advanced Model Overrides**: Priority-based conflict resolution, author metadata, and diagnostics.
- **Language Bridge APIs**: Dynamic event registration for Lua (`on_update`, `on_gui`) and C# bridge surface for TS/JS.
- **Native Header**: Added `greg_api.h` for Rust/C mod developers to consume the v8 API table.
- **Validation & Migration**: `IContentValidator` and `IContentMigration` interfaces for mod data integrity.
- **Functional Services**: Basic implementation for `GregIPAllocationService` and `GregRackService`.
### Fixed
- Fixed build issues with nullable reference types in `gregSdk`.
- Corrected test project references and added comprehensive integration tests.
## [v1.0.0.0] - 2026-04-11
### Fixed
- **Definitive UI Removal**: Fixed incorrect file exclusions in `.csproj` and disabled bootstrap registration in `gregCore.cs` to ensure the native UI is used.
- **Debug Overlay**: Added **F5** toggle to show/hide the debug info panel.
## [v1.0.0.0] - 2026-04-11
### Fixed
- Standardized all Lua modules to camelCase (`gregUnityLuaModule`, etc.).
- Fixed static/instance member access conflicts in `gregModSettingsMenuBridge`.
- Corrected over-aggressive renaming of Unity engine components (e.g. `Camera.main`).
- Normalized `gregSdk` namespace usage across the framework.
### Changed
- Separated `gregAddons` into its own logical structure (Node.js tools and optional plugins).
- Built-in reference DLLs for out-of-the-box CI support.
## [v1.0.0.0] - 2026-04-11
### Added
- Missing SDK APIs for all 4 languages (C#, Rust, Lua, TS/JS).
- HUD and Targeting bridge modules for Lua.
- Advanced event subscription model.
- Windows x64 and .NET 6 as primary targets.
### Changed
- **Major Refactor**: Renamed all directories and files to follow the `greg[Name]` camelCase convention.
- Global namespace update from `DataCenterModLoader` to `gregModLoader`.
- Global namespace update from `AssetExporter` to `gregAssetExporter`.
- Standardized author name to `MLeeM97`.
## [v0.7.0.0] - 2026-04-10
### Fixed
- Project references and solution structure for correct DLL paths.
- README path updates.
## [v0.6.0.0] - 2026-04-09
### Added
- Language bridge architecture with Lua and TypeScript/JavaScript support.
- MoonSharp integration for Lua scripting.
## [v0.5.0.0] - 2026-04-08
### Added
- `UiExtensionBridge` for UI feature integration and modernization.
- Custom Main Menu replacement capabilities.
## [v0.4.0.0] - 2026-04-07
### Added
- Scripts for generating and parsing greg hooks from IL2CPP dumps.
## [v0.3.0.0] - 2026-04-06
### Changed
- Flat `gregFramework` workspace layout.
- Documentation alignment with the new repository structure.
## [v0.2.0.0] - 2026-04-05
### Added
- RustBridge integration for native mod support via FFI.
## [v0.1.0.0] - 2026-04-04
### Added
- Initial standalone repository setup.
- Basic MelonLoader mod structure.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+89
View File
@@ -0,0 +1,89 @@
# gregCore - Framework Core
> The heart of the gregFramework modding ecosystem for Data Center.
**Author:** MLeeM97 (teamGreg) | **License:** MIT | **Framework:** [gregCore](https://git.datacentermods.com/teamGreg/gregCore)
---
## Features
- **GregSaveService** - Persistent mod data storage
- **GregUIBuilder** - FixedTableUI, Panel System, Canvas Management
- **GregPersistenceService** - Centralized `UserData/gregCore/Data/` storage
- **GregMCPServer** - Embedded HTTP MCP server (Port 10420) for external tooling
- **GregMultiplayerService** - WebSocket relay-based multiplayer
- **Harmony Patches** - MainMenu, MODS Button injection
- **IL2CPP Compatibility** - InputSystem, Coroutines, Il2CppTMPro
- **MoonSharp Lua** - Embedded scripting engine
- **Integrated DataCenter Compatibility Layer** - RustBridge/LangCompat runtime is embedded in-core under `src/Compatibility/DataCenterModLoader`
## Installation
1. Install **MelonLoader** (v0.6+)
2. Place `gregCore.dll` + `gregCore.dll` into `Game/Mods/`
3. Start the game and press **Framework auto-initializes on game start**
## Dependencies
- Built-in only (this IS the core)
- Legacy `RustBridge` and `LangCompatBridge` are integrated into `gregCore` and are no longer shipped as standalone external plugin/mod dependencies
## Architecture Update
- Legacy external trees `plugins/DataCenter-RustBridge` and `mods/greg.Plugin.LangCompatBridge` were retired from `gregCore`
- Runtime compatibility lifecycle is now wired directly from `GregCoreMod` to `DataCenterModLoader.Core`
- Compatibility sources are maintained in-core at `src/Compatibility/DataCenterModLoader`
## Building from Source
```bash
cd gregFramework/gregCore
dotnet build -c Release
# Output: bin/Release/net6.0/gregCore.dll
```
Or build everything at once:
```bash
cd gregFramework/deploy
./build-all.ps1
# Output: gregFramework/BuiltModsForGame/
```
## Links
- **Primary:** [git.datacentermods.com/teamGreg](https://git.datacentermods.com/teamGreg)
- **Discord:** [discord.gg/greg](https://discord.gg/greg)
---
## Contributors & Thanks
### Discord Community
**Thanks to:**
- **Noootry**
- **TheSlickers**
- **Jarvis**
- **Kirei**
- **TeamWaseku** (ModernSamurai, GamerFrankstar, Ultra, Zyn)
*...for keeping the community alive!*
### Code & Testing
**Special thanks:**
- **Joniii** & **mochimus** - Code + Tests
- **Baker**, **Sharpy1o1**, **MachineFreak** - Testing + Modeling
### Sponsors
- **@tobiasreichel** - Haupt-Sponsor
- **SQ8** - Infrastructure Hosting
---
*gregFramework - Powered by the Community!*
## Contributors
- @mleem97
- @Joniii11
+151
View File
@@ -0,0 +1,151 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"gregCore/1.0.0.35-pre": {
"dependencies": {
"Jint": "4.8.0",
"LiteDB": "5.0.21",
"Mono.Cecil": "0.11.6",
"MoonSharp": "2.0.0",
"Newtonsoft.Json": "13.0.3",
"pythonnet": "3.0.5"
},
"runtime": {
"gregCore.dll": {}
}
},
"Acornima/1.4.0": {
"runtime": {
"lib/netstandard2.1/Acornima.dll": {
"assemblyVersion": "1.4.0.0",
"fileVersion": "1.4.0.0"
}
}
},
"Jint/4.8.0": {
"dependencies": {
"Acornima": "1.4.0"
},
"runtime": {
"lib/netstandard2.1/Jint.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.5.0.0"
}
}
},
"LiteDB/5.0.21": {
"runtime": {
"lib/netstandard2.0/LiteDB.dll": {
"assemblyVersion": "5.0.21.0",
"fileVersion": "5.0.21.0"
}
}
},
"Mono.Cecil/0.11.6": {
"runtime": {
"lib/netstandard2.0/Mono.Cecil.Mdb.dll": {
"assemblyVersion": "0.11.6.0",
"fileVersion": "0.11.6.0"
},
"lib/netstandard2.0/Mono.Cecil.Pdb.dll": {
"assemblyVersion": "0.11.6.0",
"fileVersion": "0.11.6.0"
},
"lib/netstandard2.0/Mono.Cecil.Rocks.dll": {
"assemblyVersion": "0.11.6.0",
"fileVersion": "0.11.6.0"
},
"lib/netstandard2.0/Mono.Cecil.dll": {
"assemblyVersion": "0.11.6.0",
"fileVersion": "0.11.6.0"
}
}
},
"MoonSharp/2.0.0": {
"runtime": {
"lib/netstandard1.6/MoonSharp.Interpreter.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.0"
}
}
},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"pythonnet/3.0.5": {
"runtime": {
"lib/netstandard2.0/Python.Runtime.dll": {
"assemblyVersion": "3.0.5.0",
"fileVersion": "3.0.5.0"
}
}
}
}
},
"libraries": {
"gregCore/1.0.0.35-pre": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Acornima/1.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3M7NpnhKL//pf7HkSfLJaGQ37uksibdqfa9YuUov1VOX0QXapZeYCUpURZ9an4VMt9wJ70MU/PeAsjhw8DwtJw==",
"path": "acornima/1.4.0",
"hashPath": "acornima.1.4.0.nupkg.sha512"
},
"Jint/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JlXh13WDivP2izPgS9jeUlzyP//hsHUGhGb33EQHLuRiLhdwJ0ajaYjVETnqnkIQay/qP6NHglxx/40bL0/ihQ==",
"path": "jint/4.8.0",
"hashPath": "jint.4.8.0.nupkg.sha512"
},
"LiteDB/5.0.21": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ykJ7ffFl7P9YQKR/PLci6zupiLrsSCNkOTiw6OtzntH7d2kCYp5L1+3a/pksKgTEHcJBoPXFtg7VZSGVBseN9w==",
"path": "litedb/5.0.21",
"hashPath": "litedb.5.0.21.nupkg.sha512"
},
"Mono.Cecil/0.11.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==",
"path": "mono.cecil/0.11.6",
"hashPath": "mono.cecil.0.11.6.nupkg.sha512"
},
"MoonSharp/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uiAcRh7d+53k3xW9pFDJfAFVw4RnjHVCJG05M3oPAVEVwPtFavhg1H/IpC6So4X1j9kJlzuLlA3OghhPcIvc5A==",
"path": "moonsharp/2.0.0",
"hashPath": "moonsharp.2.0.0.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"pythonnet/3.0.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-20UVeB1uDpvCHZi8yNv7VCSUKVRRaxPZWFYhkO+BjfBB9GgOh2vEeucy3U7zTY8xEVCHf2XHpRNfAU/3quxXZw==",
"path": "pythonnet/3.0.5",
"hashPath": "pythonnet.3.0.5.nupkg.sha512"
}
}
}
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -27,7 +27,7 @@ if (-not (Test-Path $dllPath)) {
& "$PSScriptRoot\Package-SdkAssets.ps1"
# 5. Package release
$version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($dllPath).FileVersion
$version = (Get-Content "$repoRoot\VERSION").Trim()
$zipName = "gregCore-v$version.zip"
$zipPath = "$publishDir\$zipName"
+2 -8
View File
@@ -51,15 +51,12 @@ Write-Host "[workshop] WorkshopRoot = $WorkshopRoot"
#region Build all projects
$AllProjects = @(
'framework\gregCore.csproj',
'plugins\greg.Plugin.Multiplayer\greg.Plugin.Multiplayer.csproj',
'plugins\greg.Plugin.Sysadmin\greg.Plugin.Sysadmin.csproj',
'plugins\greg.Plugin.AssetExporter\greg.Plugin.AssetExporter.csproj',
'plugins\greg.Plugin.WebUIBridge\greg.Plugin.WebUIBridge.csproj',
'plugins\greg.Plugin.PlayerModels\greg.Plugin.PlayerModels.csproj',
'mods\greg.ConsoleInputGuard\greg.ConsoleInputGuard.csproj',
'mods\greg.Mod.GregifyEmployees\greg.GregifyEmployees.csproj',
'mods\greg.Mod.HexLabelMod\greg.HexLabelMod.csproj',
'mods\greg.Plugin.LangCompatBridge\greg.JoniMLCompatMod.csproj'
'mods\greg.Mod.HexLabelMod\greg.HexLabelMod.csproj'
)
foreach ($rel in $AllProjects) {
@@ -128,8 +125,6 @@ Write-Host "[workshop] Copied greg_hooks.json to $fwContentDir"
#region Package plugins
$plugins = @(
@{ Id = 'greg.Plugin.Multiplayer'; Folder = 'plugins\greg.Plugin.Multiplayer'; Desc = 'Multiplayer support plugin for gregCore.' },
@{ Id = 'greg.Plugin.Sysadmin'; Folder = 'plugins\greg.Plugin.Sysadmin'; Desc = 'Sysadmin tools and server management plugin.' },
@{ Id = 'greg.Plugin.AssetExporter'; Folder = 'plugins\greg.Plugin.AssetExporter'; Desc = 'Asset export utilities for Data Center modding.' },
@{ Id = 'greg.Plugin.WebUIBridge'; Folder = 'plugins\greg.Plugin.WebUIBridge'; Desc = 'Web UI bridge plugin for in-game browser-based interfaces.' },
@{ Id = 'greg.Plugin.PlayerModels'; Folder = 'plugins\greg.Plugin.PlayerModels'; Desc = 'Custom player models plugin for Data Center.' }
@@ -152,8 +147,7 @@ foreach ($p in $plugins) {
$mods = @(
@{ Name = 'greg.ConsoleInputGuard'; Folder = 'mods\greg.ConsoleInputGuard'; Assembly = 'greg.ConsoleInputGuard'; Desc = 'Console input guard mod for Data Center.' },
@{ Name = 'greg.GregifyEmployees'; Folder = 'mods\greg.Mod.GregifyEmployees'; Assembly = 'greg.GregifyEmployees'; Desc = 'Gregify Employees gameplay mod.' },
@{ Name = 'greg.HexLabelMod'; Folder = 'mods\greg.Mod.HexLabelMod'; Assembly = 'greg.HexLabelMod'; Desc = 'Hex label display mod for Data Center.' },
@{ Name = 'greg.JoniMLCompatMod'; Folder = 'mods\greg.Plugin.LangCompatBridge'; Assembly = 'greg.JoniMLCompatMod'; Desc = 'Language compatibility bridge mod.' }
@{ Name = 'greg.HexLabelMod'; Folder = 'mods\greg.Mod.HexLabelMod'; Assembly = 'greg.HexLabelMod'; Desc = 'Hex label display mod for Data Center.' }
)
foreach ($m in $mods) {
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -1,19 +1,16 @@
using System;
using System.IO;
using System.Linq;
using HarmonyLib;
using MelonLoader;
using MelonLoader.Utils;
using System;
using System.IO;
using HarmonyLib;
using UnityEngine;
[assembly: MelonInfo(typeof(DataCenterModLoader.Core), "gregCore", "1.0.0", "TeamGreg")]
[assembly: MelonGame("", "Data Center")]
namespace DataCenterModLoader;
// file-based crash logger, never throws
public static class CrashLog
{
private static string _logPath;
private static string? _logPath;
private static readonly object _lock = new();
public static void Init(string gameRoot)
@@ -27,28 +24,40 @@ public static class CrashLog
$"========================================={Environment.NewLine}";
File.WriteAllText(_logPath, header);
}
catch { }
catch
{
}
}
public static void Log(string msg)
{
try
{
if (_logPath == null) return;
if (_logPath == null)
{
return;
}
lock (_lock)
{
File.AppendAllText(_logPath,
$"[{DateTime.Now:HH:mm:ss.fff}] {msg}{Environment.NewLine}");
}
}
catch { }
catch
{
}
}
public static void LogException(string context, Exception ex)
{
try
{
if (_logPath == null) return;
if (_logPath == null)
{
return;
}
lock (_lock)
{
File.AppendAllText(_logPath,
@@ -63,31 +72,43 @@ public static class CrashLog
Environment.NewLine);
}
}
catch { }
catch
{
}
}
}
public class Core : MelonMod
public class Core
{
public static Core Instance { get; private set; }
public static Core? Instance { get; private set; }
private FFIBridge _ffiBridge;
private MultiplayerBridge _mpBridge;
private string _modsPath;
public MelonLogger.Instance LoggerInstance { get; }
public override void OnInitializeMelon()
private FFIBridge? _ffiBridge;
private MultiplayerBridge? _mpBridge;
private string _modsPath = string.Empty;
private HarmonyLib.Harmony? _harmony;
private float _queueDrainTimer;
private const float QueueDrainInterval = 2f;
public Core(MelonLogger.Instance loggerInstance)
{
LoggerInstance = loggerInstance;
Instance = this;
}
public void Initialize()
{
try
{
Instance = this;
CrashLog.Init(MelonEnvironment.GameRootDirectory);
CrashLog.Log("step: CrashLog initialized");
_modsPath = Path.Combine(MelonEnvironment.GameRootDirectory, "Mods", "native");
LoggerInstance.Msg("╔══════════════════════════════════════════╗");
LoggerInstance.Msg("║ Rust Bridge v0.1.0 ║");
LoggerInstance.Msg("║ Rust Bridge (Integrated) ║");
LoggerInstance.Msg("║ Rust FFI Bridge Active ║");
LoggerInstance.Msg("╚══════════════════════════════════════════╝");
@@ -104,37 +125,13 @@ public class Core : MelonMod
EventDispatcher.Initialize(_ffiBridge, LoggerInstance);
CrashLog.Log("step: applying Harmony patches");
try
{
HarmonyInstance.PatchAll(typeof(Core).Assembly);
LoggerInstance.Msg("Harmony patches applied.");
CrashLog.Log("step: Harmony patches applied successfully");
}
catch (Exception ex)
{
LoggerInstance.Error($"Failed to apply Harmony patches: {ex.Message}");
LoggerInstance.Msg("Continuing without full event support.");
CrashLog.LogException("Harmony patching", ex);
}
ApplyDataCenterHarmonyPatches();
CrashLog.Log("step: initializing ModConfigSystem");
ModConfigSystem.Initialize(LoggerInstance);
CrashLog.Log("step: loading all mods");
_ffiBridge.LoadAllMods();
if (!_ffiBridge.IsRustAvailable)
{
LoggerInstance.Warning("═══════════════════════════════════════════════════════════");
LoggerInstance.Warning("⚠ Rust Bridge: Running in C# Compatibility Mode Only");
LoggerInstance.Warning($" → {_ffiBridge.RustStatusMessage}");
LoggerInstance.Warning("═══════════════════════════════════════════════════════════");
}
else
{
LoggerInstance.Msg($"✓ {_ffiBridge.RustStatusMessage}");
}
var mpDllPath = Path.Combine(_modsPath, "dc_multiplayer.dll");
if (File.Exists(mpDllPath))
@@ -142,17 +139,17 @@ public class Core : MelonMod
_mpBridge = new MultiplayerBridge(LoggerInstance);
}
LoggerInstance.Msg("Modloader initialization complete.");
CrashLog.Log("step: OnInitializeMelon complete");
LoggerInstance.Msg("Integrated Rust bridge initialization complete.");
CrashLog.Log("step: Initialize complete");
}
catch (Exception ex)
{
CrashLog.LogException("OnInitializeMelon", ex);
CrashLog.LogException("Initialize", ex);
throw;
}
}
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
public void OnSceneWasLoaded(int buildIndex, string sceneName)
{
try
{
@@ -167,13 +164,7 @@ public class Core : MelonMod
}
}
// Drain the TechnicianManager.pendingDispatches queue periodically so that jobs
// queued by the game's own "Add all broken devices" button (or restored from a
// save) are assigned to free technicians even when no CommandCenterOperator is hired.
private float _queueDrainTimer = 0f;
private const float QUEUE_DRAIN_INTERVAL = 2f;
public override void OnUpdate()
public void OnUpdate()
{
try
{
@@ -184,31 +175,30 @@ public class Core : MelonMod
EntityManager.Update();
CarryStateMonitor.Update();
// Periodically force-process any pending dispatch queue entries that
// the game's ProcessDispatchQueue coroutine would normally handle only
// when a CommandCenterOperator is hired.
_queueDrainTimer += Time.deltaTime;
if (_queueDrainTimer >= QUEUE_DRAIN_INTERVAL)
if (_queueDrainTimer >= QueueDrainInterval)
{
_queueDrainTimer = 0f;
try
{
var tm = Il2Cpp.TechnicianManager.instance;
if (tm != null)
GameHooks.ForceProcessPendingQueue(tm);
var technicianManager = Il2Cpp.TechnicianManager.instance;
if (technicianManager != null)
{
GameHooks.ForceProcessPendingQueue(technicianManager);
}
}
catch
{
}
catch { }
}
}
catch (Exception ex)
{
CrashLog.LogException("OnUpdate", ex);
}
}
public override void OnFixedUpdate()
public void OnFixedUpdate()
{
try
{
@@ -220,21 +210,12 @@ public class Core : MelonMod
}
}
public override void OnGUI()
public void OnGUI()
{
try
{
_mpBridge?.DrawGUI();
ModConfigSystem.DrawGUI();
// Show Rust Bridge status in top-left corner
if (_ffiBridge != null && !_ffiBridge.IsRustAvailable)
{
var oldColor = GUI.color;
GUI.color = new Color(1f, 0.6f, 0f, 0.8f);
GUI.Label(new Rect(10, 10, 400, 20), $"[RustBridge] C# Compatibility Mode");
GUI.color = oldColor;
}
}
catch (Exception ex)
{
@@ -242,17 +223,18 @@ public class Core : MelonMod
}
}
public override void OnApplicationQuit()
public void OnApplicationQuit()
{
try
{
LoggerInstance.Msg("Shutting down modloader...");
LoggerInstance.Msg("Shutting down integrated Rust bridge...");
CrashLog.Log("step: OnApplicationQuit starting");
EntityManager.DestroyAll();
_mpBridge?.Shutdown();
ModConfigSystem.Shutdown();
_ffiBridge?.Shutdown();
_ffiBridge?.Dispose();
_harmony?.UnpatchSelf();
CrashLog.Log("step: OnApplicationQuit complete");
}
catch (Exception ex)
@@ -260,4 +242,31 @@ public class Core : MelonMod
CrashLog.LogException("OnApplicationQuit", ex);
}
}
private void ApplyDataCenterHarmonyPatches()
{
try
{
_harmony = new HarmonyLib.Harmony("gregcore.compat.datacenter");
var patchTypes = typeof(Core).Assembly
.GetTypes()
.Where(type => type.Namespace == "DataCenterModLoader")
.Where(type => type.GetCustomAttributes(typeof(HarmonyPatch), inherit: false).Length > 0)
.ToArray();
foreach (var patchType in patchTypes)
{
_harmony.CreateClassProcessor(patchType).Patch();
}
LoggerInstance.Msg($"DataCenter Harmony patches applied: {patchTypes.Length}");
CrashLog.Log("step: Harmony patches applied successfully");
}
catch (Exception ex)
{
LoggerInstance.Error($"Failed to apply DataCenter Harmony patches: {ex.Message}");
LoggerInstance.Msg("Continuing without full DataCenter patch support.");
CrashLog.LogException("Harmony patching", ex);
}
}
}
@@ -12,11 +12,6 @@ public class FFIBridge : IDisposable
private readonly string _modsPath;
private readonly GameAPIManager _apiManager;
private readonly List<RustMod> _loadedMods = new();
private bool _rustAvailable = false;
private string _rustStatusMessage = "";
public bool IsRustAvailable => _rustAvailable;
public string RustStatusMessage => _rustStatusMessage;
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr LoadLibrary(string lpFileName);
@@ -83,61 +78,26 @@ public class FFIBridge : IDisposable
{
if (!Directory.Exists(_modsPath))
{
_logger.Warning("Mods/native/ directory not found. Creating...");
try { Directory.CreateDirectory(_modsPath); }
catch (Exception ex) {
_rustStatusMessage = $"Failed to create Mods/native/: {ex.Message}";
_logger.Error(_rustStatusMessage);
return;
}
}
var dllFiles = Directory.GetFiles(_modsPath, "*.dll", SearchOption.AllDirectories);
if (dllFiles.Length == 0)
{
_rustStatusMessage = "No Rust mod DLLs found. Running in C#-only compatibility mode.";
_logger.Warning(_rustStatusMessage);
_logger.Warning(" → Native Rust mods require Rust toolchain to build.");
_logger.Warning(" → C# mods (gregCore) are fully supported.");
_rustAvailable = false;
_logger.Msg("No Mods/native/ directory found.");
return;
}
int loadedCount = 0;
int failedCount = 0;
var dllFiles = Directory.GetFiles(_modsPath, "*.dll", SearchOption.AllDirectories);
if (dllFiles.Length == 0)
{
_logger.Msg("No native mod DLLs found in Mods/native/.");
return;
}
_logger.Msg($"Found {dllFiles.Length} potential Rust mod DLL(s). Attempting to load...");
_logger.Msg($"Found {dllFiles.Length} Rust mod DLL(s).");
foreach (var dllPath in dllFiles)
{
try {
LoadMod(dllPath);
loadedCount++;
}
catch (Exception ex) {
failedCount++;
_logger.Error($"Failed to load '{Path.GetFileName(dllPath)}': {ex.Message}");
}
try { LoadMod(dllPath); }
catch (Exception ex) { _logger.Error($"Failed to load '{Path.GetFileName(dllPath)}': {ex.Message}"); }
}
if (loadedCount > 0)
{
_rustAvailable = true;
_rustStatusMessage = $"Rust Bridge active: {loadedCount} mod(s) loaded.";
_logger.Msg($"✓ {_loadedMods.Count} Rust mod(s) loaded successfully.");
}
else
{
_rustStatusMessage = $"Failed to load all {dllFiles.Length} Rust DLLs. Running in compatibility fallback mode.";
_logger.Warning(_rustStatusMessage);
_logger.Warning(" → This usually means:");
_logger.Warning(" - DLL was built for wrong architecture (x64 vs x86)");
_logger.Warning(" - Missing Visual C++ runtime");
_logger.Warning(" - Rust DLL exports are incompatible");
_logger.Warning(" → gregCore C# mods work independently.");
_rustAvailable = false;
}
_logger.Msg($"{_loadedMods.Count} Rust mod(s) loaded successfully.");
}
private void LoadMod(string dllPath)
@@ -1774,6 +1774,7 @@ public partial class GameAPIManager : IDisposable
sd.rotation = rackPos.transform.rotation;
try { sd.isOn = sw.isOn; } catch { sd.isOn = false; }
try { sd.isBroken = sw.isBroken; } catch { sd.isBroken = false; }
try { sd.label = sw.label ?? ""; } catch { sd.label = ""; }
sw.SwitchInsertedInRack(sd);
}
+49 -8
View File
@@ -1,4 +1,5 @@
using System;
using System;
using System.Reflection;
using MelonLoader;
using gregCore.Core.Abstractions;
using gregCore.GameLayer.Bootstrap;
@@ -6,11 +7,37 @@ using gregCore.Infrastructure.Logging;
using gregCore.Sdk.Language;
[assembly: MelonInfo(typeof(gregCore.Core.GregCoreMod), "gregCore", "1.0.0.35-pre", "TeamGreg")]
[assembly: MelonGame("", "Data Center")]
[assembly: MelonOptionalDependencies("Python.Runtime", "RustBridge", "JS.Runtime.Binding")]
[assembly: MelonInfo(typeof(gregCore.Core.DataCenterModLoaderMod), "DataCenterModLoader", "1.0.0.0", "TeamGreg Compatibility")]
[assembly: MelonGame("Waseku", "Data Center")]
[assembly: MelonOptionalDependencies("Python.Runtime", "JS.Runtime.Binding")]
namespace gregCore.Core;
/// <summary>
/// Mod, die DataCenterModLoader simuliert und die Assembly-Auflösung für Legacy-Mods übernimmt.
/// Registriert als zweite Mod neben gregCore, um Abwärtskompatibilität zu gewährleisten.
/// </summary>
public sealed class DataCenterModLoaderMod : MelonMod
{
static DataCenterModLoaderMod()
{
// Redirect DataCenterModLoader assembly requests to gregCore as early as possible
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
if (args.Name.StartsWith("DataCenterModLoader"))
{
return typeof(DataCenterModLoaderMod).Assembly;
}
return null;
};
}
public override void OnInitializeMelon()
{
greg.Logging.GregLogger.Msg("DataCenterModLoader Compatibility Layer loaded (mod).");
}
}
/// <summary>
/// Der zentrale Einstiegspunkt des Frameworks (Prod-Layer: Core).
/// Verantwortlich für Lifecycle, Service-Orchestrierung und globale Initialisierung.
@@ -21,6 +48,7 @@ public sealed class GregCoreMod : MelonMod
private GregServiceContainer? _container;
private IGregLogger? _logger;
private DataCenterModLoader.Core? _legacyDataCenterBridge;
public override void OnInitializeMelon()
{
@@ -32,7 +60,7 @@ public sealed class GregCoreMod : MelonMod
// Step 2: GregBanner.Print(version, mlVersion, debugMode)
string version = Info.Version;
string mlVersion = "0.6.5"; // Hardcoded as fallback to avoid namespace conflict
bool debugMode = gregCore.Infrastructure.Config.GregCoreConfig.DebugMode;
greg.Logging.GregBanner.Print(version, mlVersion, debugMode);
@@ -62,6 +90,9 @@ public sealed class GregCoreMod : MelonMod
string scriptsDir = MelonLoader.Utils.MelonEnvironment.ModsDirectory;
GregLanguageRegistry.ScanAndActivate(scriptsDir);
_legacyDataCenterBridge = new DataCenterModLoader.Core(LoggerInstance);
_legacyDataCenterBridge.Initialize();
// Step 6: GregLogger.Msg("gregCore initialized successfully.")
greg.Logging.GregLogger.Msg("gregCore initialized successfully.");
}
@@ -69,12 +100,14 @@ public sealed class GregCoreMod : MelonMod
public override void OnUpdate()
{
float dt = UnityEngine.Time.deltaTime;
// Update core services
GregServiceContainer.Get<Infrastructure.Performance.GregPerformanceGovernor>()?.OnUpdate();
GregServiceContainer.Get<Core.Events.GregEventBus>()?.FlushDeferredEvents();
GregServiceContainer.Get<Infrastructure.Settings.Services.GregInputBindingService>()?.OnUpdate();
_legacyDataCenterBridge?.OnUpdate();
// Update only active language hosts
GregLanguageRegistry.OnUpdate(dt);
}
@@ -82,28 +115,36 @@ public sealed class GregCoreMod : MelonMod
public override void OnGUI()
{
// Debug Console & HUDs
_legacyDataCenterBridge?.OnGUI();
Infrastructure.UI.GregDevConsole.Instance.OnGUI();
GregServiceContainer.Get<Infrastructure.Settings.Services.GregHudService>()?.OnGUI();
GregServiceContainer.Get<Infrastructure.Settings.Services.GregNotificationService>()?.OnGUI();
}
public override void OnFixedUpdate()
{
_legacyDataCenterBridge?.OnFixedUpdate();
}
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
{
greg.Logging.GregLogger.Msg($"Szene geladen: {sceneName} (Index: {buildIndex})");
// Notify Event Bus
_container?.GetRequired<IGregEventBus>()
.Publish("greg.lifecycle.SceneLoaded",
.Publish("greg.lifecycle.SceneLoaded",
Core.Events.EventPayloadBuilder.ForScene(buildIndex, sceneName));
GregLanguageRegistry.OnSceneLoaded(sceneName);
_legacyDataCenterBridge?.OnSceneWasLoaded(buildIndex, sceneName);
gregCore.API.GregAPI.FireEvent(gregCore.API.GregEventId.GameLoaded);
}
public override void OnApplicationQuit()
{
greg.Logging.GregLogger.Section("Framework Shutdown");
_legacyDataCenterBridge?.OnApplicationQuit();
GregLanguageRegistry.Shutdown();
_container?.Dispose();
greg.Logging.GregLogger.Msg("gregCore unloading. Goodbye.");
+1 -1
View File
@@ -95,7 +95,7 @@ namespace greg.UI.Settings
{
RegisterTab("greg.core", "Framework", builder =>
{
builder.AddLabel("gregCore v1.0.0.33-pre")
builder.AddLabel("gregCore v1.0.0.35-pre")
.AddLabel("MelonLoader v0.6+")
.AddLabel($"Save Mode: {(frameworkSdk.GregFeatureGuard.IsVanillaSave ? "Vanilla" : "Greg")}")
.AddToggle("Verbose Startup Log", false, v => { })