All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
SceneLoadWaiter.GetPlayer()— extracted helper that resolves the playerGameObjectfromDeadshot.GameManager.SceneLoadWaiter.DisableAllCameras()— extracted helper that disables all cameras except the player'sHead/MainCamera.SceneLoadWaiter.DisableMenuAndSceneRenderers()— extracted helper that hidesMainMenucanvases andC1L2scene renderers, excluding the player.SceneLoadWaiter.GetCustomScene()— extracted helper that scans loaded scenes by name and returns the matchingScene.SceneLoadWaiter.FindCustomPlayerSpawn(Scene)— updated to accept the already-resolvedSceneinstead of re-scanning for it.- Added null guards and restored deep recursive traversal in
FindChildRecursiveto support nested hierarchy spawn points. - Player
CharacterControlleris now restored in afinallyblock, ensuring it is re-enabled even if player placement throws. SceneManager.BaseGameplaySceneNameconstant to avoid hardcoded scene name strings.AsyncOperationtracking for asynchronous scene unloads to prevent reload race conditions.
SceneLoadWaiter.InitializePlayer()refactored to delegate player, camera, and renderer setup to dedicated helper methods.- Corrected the renderer-filtering scene name from
C1L1toC1L2. SceneManager.LoadScene()cleans up existing waiters and passes any pending unload operation to the new waiter.SceneLoadWaiterdestroys itsGameObjectupon placement completion or spawn search timeout.EventManager.Update()converted from a static method to an instance lifecycle method onMonoBehaviour.
- Resolved persistent
SceneLoadWaitermemory leak and CPU overhead after scene load. - Fixed broken child traversal in
FindChildRecursivefailing on nested spawn points. - Fixed race condition where reloading an already loaded scene attempted placement before unloader completed.
- Fixed
EventManager.Update()not being invoked by Unity's engine loop. - Removed stray blank lines from
EventManager.LevelPlaytimeEvent().
SceneLoadWaiterMonoBehaviour for additive custom-scene loading while preserving the existing gameplay scene and player.SceneManager.LoadScene(string)replacing the oldLoad()method — unloads an already-loaded scene before re-loading it, and bootstrapsC1L2if it is not yet loaded.AssetBundleManager.GetPlayerObject()helper to retrieve the playerGameObjectfromDeadshot.GameManager.AssetBundleManager.SpawnPlayerObject()helper to instantiate the player object.LevelCompleteScreen.SetSecret(string)to write to_menu.secretText.Plugin.csnow registersSceneLoadWaiteras a component on startup.UnityEngine.UIModuleandUnityEngine.PhysicsModulereferences added toDeadshotModAPI.csproj..editorconfigwith comprehensive C# and project-wide style rules, including test-project overrides.EnforceCodeStyleInBuildenabled inDeadshotModAPI.csproj.UniverseLibexplicit project reference added toDeadshotModAPI.csproj.
SceneManager.LoadModsBundle()is nowpublicand delegates toAssetBundleManagerinstead of using a rawAssetBundlefield.AssetBundleManagerbundle root path changed fromBepInEx/modstoBepInEx/plugins/mods.AssetBundleManager.LoadAssetBundles()now returns an emptyList<>instead ofnullon individual bundle load failure.Input.CheckKeys()refactored to filter withWhere(IsPressed)before iterating, removing the innerifbranch.Input.CheckKeys()loop variables changed fromvarto explicitKey[]/Keytypes.EventManagerlevel-time comparison changed from==to< 0.001ffloat epsilon check.LevelCompleteScreen.SetTime()simplified — redundant string interpolation removed.Plugin.cs_harmonystatic field removed;Harmonyinstance is now a local variable.ModLoader.Start()callsSceneManager.LoadModsBundle()on startup.ModLoadernull-guard braces added fortypes == nullandtype == nullchecks.SceneManagerusing directives re-ordered andDeadshot.Playernamespace added.
- Fixed
catch(Exceptionmissing space — normalised tocatch (ExceptionthroughoutEventManager.cs. - Fixed stray blank line inside
EventManager.LevelPlaytimeEvent().
EventManager.csfor events.LevelCompleteScreen.csfor modifyingDeadshot.UI.Menus.LevelCompletedMenu.Harmony v2.4.2for patching game instances.
- Updated
Plugin.csversion tov1.0.0-dev-alpha. - Updated
Plugin.Load()to addEventManageras component. - Added null checks and
try/catchexception handling to EventManager.
- Fixed runtime loading for
GameAssembly.dllinDeadshotModAPI.Tests.csproj. - Fixed git merge conflict errors with
origin/dev. - Fixed
LevelCompletedScreen.SetTime()having a hardcoded text. - Fixed spelling mistake in
Plugin.cs
Input.RemoveKeyPressed(Key, Action)to unregister key callbacks.examples/ExampleMod/reference project featuring Subaka'sSpeedrunMod.DeadshotModAPI.Tests/automated test suite covering mod discovery, reflection, and edge cases.CONTRIBUTING.mdand.github/pull_request_template.md.
- Updated
Plugin.csversion to1.1.0. - Converted all assembly references in
DeadshotModAPI.csprojto relative paths (lib\*.dll). - Renamed
Class1.cstoPlugin.cs. - Renamed
Logging/logger.cstoLogging/Logger.cs. - Upgraded GitHub Actions CI workflow to
actions/checkout@v4. - Rewrote
README.mdwith clear setup instructions and API reference.
- Fixed hardcoded machine paths (
C:\Code\...) and missing path separators inDeadshotModAPI.csproj. - Added defensive null checks and
try/catchisolation inModLoaderso corrupted or invalid mod DLLs log errors without crashing the game or stopping other mods. - Added input validation to
SceneManager.Loadfor null, whitespace, and negative indices. - Added null guards in
GameManager.RestartLevelbefore accessing game singletons and save data dictionaries. - Fixed key collection mutation issue in
Input.CheckKeysby snapshotting keys before dispatching callbacks.
- Initial modding runtime for Deadshot on BepInEx 6 IL2CPP and .NET 6.
IDeadshotModinterface.- Dynamic mod loader scanning
BepInEx/mods/. - Keyboard input listening via Unity Input System.
- Level restart helper in
GameManager. - Scene loading helpers in
SceneManager. - Console logging via
Logger.