RoundsPatchworkPlus
Universal stability and compatibility engine for ROUNDS modpacks. Fixes StickFightMaps MissingMethodException, DeckCustomization NRE, ASK rarity crash, bullet coroutine errors, WWM curse log spam, and Photon desyncs.
CHANGELOG
Changelog
[1.1.7] - 2026-10-27
Fixed & Improved
- StickFightMaps & MapsExtended 1.4.2 Compatibility (
MissingMethodExceptionFix):- Fixed 130+ repeated
MissingMethodException: void MapsExt.MapsExtended.OnPhotonMapObjectInstantiateerrors when spawning custom physics map objects (boxes, hinges, chains). In MapsExtended 1.4.2,OnPhotonMapObjectInstantiatewas replaced withAddPhotonInstantiateListener. Added a prefix patch onBossSlothPhysicsObject.Startthat dynamically invokes the modern listener, properly restoring box scaling and hinge physics.
- Fixed 130+ repeated
- DeckCustomization
NewGUINullReferenceException Guard:- Fixed
NullReferenceExceptioninDeckCustomization.NewGUIwhen UnboundLib GUI building runs on a destroyed or closed menu GameObject. Added null check and exception finalizer.
- Fixed
- ASK (Aidan Scyye Keyanlux)
RarityExceptionElimination:- Suppressed early
RarityExceptionduringASK.Main.Awakeand deferredCodRarity = RarityUtils.GetRarity("Call of Duty")toASK.Main.Start, ensuring all custom cards receive their rarity after RarityLib finishes registration.
- Suppressed early
- Inactive Bullet Coroutine Guard (
Bullet_Base(Clone)):- Added hierarchy active check in
ProjectileHit.AddPlayerToHeldto preventCoroutine couldn't be started because the game object 'Bullet_Base(Clone)' is inactive!when blocks or deflections trigger on disabled bullets.
- Added hierarchy active check in
- WillsWackyManagers 200 KB Curse Log Flood Silenced:
- Patched
CurseManager.CanDrawCursesConditionand disabledextremeDebugging = true, eliminating thousands of redundant console log lines per card draft.
- Patched
[1.1.0] - 2026-10-26
Fixed
- CPCCrafter
ProjHitPatch.PrefixNRE Elimination (400+ Crashes Silenced):- Fixed persistent NullReferenceException in
CPCCrafter.Patches.ProjHitPatch.Prefixwhen projectiles hit objects without aPlayercomponent (e.g. walls, crates, shields, destructible boxes). Added safety prefix and finalizer to safely pass through standard vanilla hit handling.
- Fixed persistent NullReferenceException in
- GameModeManager Hook Null Return Safety (
MapShffulerFix):- Fixed
[GAMESTART HOOK] [MapShffuler] threw exception: NullReferenceExceptioncaused byMapShffulerreturning(IEnumerator)nullon GameStart. WrappedGameModeManager.AddHookandAddOnceHookto safely substitute empty enumerators when any mod returns null from a hook.
- Fixed
- InfinityStones
GauntletVisualEffect.StartNRE Elimination:- Fixed NullReferenceException when
GauntletVisualEffect.Start()was triggered in the main menu or outside an active card pick phase with an unassigned player.
- Fixed NullReferenceException when
- Menu
Transform child out of boundsFix:- Added lightweight placeholder children during lazy card visual setup so
ToggleCardsMenuHandler.ChangeCardColumnAmountMenusandToggleCardsCategories.StartPostfixqueryingcardTransform.GetChild(2)never throw out of bounds.
- Added lightweight placeholder children during lazy card visual setup so
- RootCore & RarityMenu
KeyNotFoundExceptionGuard:- Added guards for
RootCore.Patches.ToggleCardsMenuPatchandToggleCardsMenuPatchNewto prevent crashes when the "Root" category is not present in category tabs.
- Added guards for
- RWF GameMode Namespace Correction:
- Corrected
RWF.GameModes.RWFGameModetype resolution for round transition hooks.
- Corrected
[1.0.9] - 2026-10-26
Added & Optimized
- Smart Bot Navigation & Teleport / Portal Awareness (
AIMovementModule):- Fixed an issue where Bot AI broke completely and bots stood frozen in place on custom maps featuring teleporters, portals, or disconnected platforms (e.g.
Root_Maps). - In vanilla
RoundsWithBots,AIMovementModule.PathfindPlayer()silently returned wheneverTargetNode == nullwithout issuing any movement or jump commands. Because the nav scanner only traces continuous walkable ground lines, bots failed to generate paths across portals or disconnected islands. - Implemented dynamic fallback navigation (
RunBotSmartFallbackNavigation):- Automatically discovers and caches active teleporter entrances (
Root_Maps.Scripts.Portaland custom map triggers). When opponents are unreachable via normal ground path, bots navigate directly into the nearest teleporter entrance. - Added dynamic obstacle raycasting: bots detect walls, ledges, and gaps and automatically jump to bridge voids.
- Implemented a stuck watchdog: if a bot's position remains static while trying to move for > 0.35s, it triggers un-wedge jumps and horizontal reverse hops.
- Automatically discovers and caches active teleporter entrances (
- Fixed an issue where Bot AI broke completely and bots stood frozen in place on custom maps featuring teleporters, portals, or disconnected platforms (e.g.
- Ultra-Fast Round & Point Transitions (Eliminates 5-Second Delay):
- Eliminated artificial transition lag between rounds and points in both
RoundsWithFriendsand vanilla:- Patched
RWF.UI.PlayerSpotlight.FadeInandFadeOut: capped fade durations from 1.0–1.5s down to 0.12–0.18s with zero delay, removing the lingering dark screen. - Patched
RWFGameMode.DoRoundStart&DoPointStart: ensured active players are marked ready (isPlaying = true), completely bypassing the multi-frame blocking wait loop. - Patched
PointVisualizer: accelerated point counter ball movements (timeToMove,timeToScale) by 2x. - Patched
MapTransition: accelerated map entrance animation curve from 0.8s down to 0.35s.
- Patched
- Transitions between rounds and points are now snappy and immediate.
- Eliminated artificial transition lag between rounds and points in both
[1.0.8] - 2026-10-26
Added & Optimized
- Instant Main Menu Loading & Lazy Card Visual Engine (Eliminates 30-60s Freeze):
- Fixed severe main menu freeze ("Not Responding") in large modpacks with 1,000+ cards caused by
ToggleCardsMenuHandler(UnboundLib) andCardSpawnMenuHandler(SandboxImprovements). - Previously, both menus fired at 0.5s after boot and synchronously cloned 2,000+ full card GameObject prefabs (complete with particle systems, audio, canvases, and physics) in a single blocking frame on the main thread.
- Implemented an intelligent lazy visual pipeline: card visual instantiation is deferred during batch menu initialization while the menu canvas or category containers are inactive. When a player actively opens a category or searches for cards, visuals are generated on demand frame-by-frame with zero UI stutter.
- Completely eliminates the 30-60 second main menu hang.
- Fixed severe main menu freeze ("Not Responding") in large modpacks with 1,000+ cards caused by
Fixed
- GearUpCards
FixSoundEffect.AwakeNRE Elimination:- Fixed a
NullReferenceExceptioninsideFixSoundEffect.Awake()which crashed the menu card generation pipeline when instantiating GearUP card prefabs in the menu. - Added
FixSoundEffect_Awake_Prefixand exception finalizer to verify thatgun != nullandSoundVolumeManager.Instance.audioMixeris fully initialized before attempting to query audio groups.
- Fixed a
- ZomC-Cards
DoubleViEffect.StartNRE Elimination:- Fixed a
NullReferenceExceptioninsideZomC_Cards.MonoBehaviours.DoubleViEffect.Start()when card prefabs or standalone effects are instantiated without parent projectile references (GetComponentInParent<ProjectileHit>()). - Added
DoubleViEffect_Start_Prefixand exception finalizer to safely skip unparented instances.
- Fixed a
- CardChoice Color Theme Null Safety:
- Added null safety guards for
CardChoice.GetCardColorandCardChoice.GetCardColor2to prevent NullReferenceExceptions during menu card styling whenCardChoice.instanceor theme arrays are uninitialized.
- Added null safety guards for
Fixed
- CosmicRounds
FireballMono&HolyFireMonoFrame Update NRE: Fixed a continuous NullReferenceException occurring every frame on fireball projectiles. Projectiles were missing player contexts becauseFireballMonocalledGetComponent<Player>()on projectiles where no Player component exists. AddedFireballMono_Update_Prefixand exception finalizer to dynamically recover player references fromProjectileHit.ownPlayerand validateplayer.data.currentCardsbefore processing. - CosmicRounds
MistletoeMonoStart & DoHitEffect NRE: Added safety prefix and finalizer forCR.MonoBehaviors.MistletoeMono.StartandDoHitEffect. Dynamically initializes missingProjectileHitand guards against unparented/orphaned mistletoe components or non-player collision targets. - Explosion.Explode NRE Elimination: Fixed NullReferenceException in
Explosion.Explode()caused byspawned.spawner == nullduring team check evaluation (spawned.spawner.gameObject). AddedExplosion_Explode_Prefixto provide valid fallback spawner references and wrappedExplosion.Explodewith a safety finalizer. - Bot Detection Reflection Caching & HarmonyX Warning Suppression: Corrected namespace lookup for
BotsManagertoRoundsWithBots.Handlers.BotsManagerand cached all bot reflection types/methods statically. Completely eliminates thousands of[Warning: HarmonyX] AccessTools.TypeByName: Could not find type named RoundsWithBots.BotsManagerlog warnings. - Bot Interception Log De-duplication: Replaced per-frame logging in
EveryonePicks_IsLocalPlayer_Prefixwith a per-phase unique set (_loggedBotIntercepts). Each bot is now cleanly logged exactly once per drafting phase.
[1.0.6] - 2026-10-26
Fixed
- Human Player False Bot Classification Fix (
IsBotPlayer):- Fixed a critical bug where keyboard/mouse human players were mistakenly classified as bots because their input device (
playerActions.Device) wasnull(standard for InControl keyboard/mouse bindings) and vanilla base player prefabs contain the inactivePlayerAIcomponent. - Added strict Human Host Immunity (
playerID == 0/ host player is never treated as a bot unless explicitly registered byCharacterDataExtension.IsBot == true). - Removed faulty
device == nullandPlayerAIname checks. Bot detection now strictly checksCharacterDataExtension.IsBot,BotsManager.BotList,PlayerAIBase/AdvancedBotAI,ModdingUtils.isAIMinion, and[BOT]nametags. - Human player now reliably receives the interactive draft screen and gets to choose their cards properly.
- Fixed a critical bug where keyboard/mouse human players were mistakenly classified as bots because their input device (
- Bot AI Context & Duplicate Card Selection Fix (
ChooseCardForBot):- Fixed an issue where
RoundsWithBots'sWeightedCardsPicker.PickCardthrewNullReferenceExceptionbecauseCardChoice.instance.pickrIDdid not match the bot'splayerIDduring evaluation. - Automatically sets
CardChoice.instance.pickrID = bot.playerIDduring AI card scoring and restores it cleanly infinally. - Replaced hardcoded fallback
return pool[0]with distinct randomized candidate hands per bot (System.Random(Guid.NewGuid().GetHashCode() ^ bot.playerID)). Bots and humans no longer receive duplicate index 0 cards.
- Fixed an issue where
[1.0.5] - 2026-10-26
Fixed
- EveryonePicks Bot Patch Binding Resolution: Fixed a reflection issue in
ModSafetyFixesPatchwhereGetMethod(..., BindingFlags.NonPublic)failed to locate public patch methods forEveryonePicks.State.IsLocalPlayer,SeedPickers, andApplyRow. Switched toAccessTools.Methodand added explicit verification logging. - Multi-Layered Bot Detection Engine (
IsBotPlayer): Expanded bot detection to 6 independent fallbacks:CharacterDataExtension.IsBot,InputDevice.Nullcheck,PlayerAIBase/AIMovementModulecomponent scan,BotsManager.BotListquery,ModdingUtils.isAIMinion, and[BOT]tag detection. - Plugin Loading Order (Soft Dependencies): Added
BepInDependencysoft-ordering forEveryonePicks(com.redredrain.rounds.simulpicks) andRounds With Bots(com.aalund13.rounds.roundswithbots), guaranteeing all classes are loaded before patch registration. - AiPickCard Coroutine Suppression: Added
ref IEnumerator __resultreturning an empty enumerator toBotCardPickerHandler_AiPickCard_Prefix, safely neutralizing the vanilla sequential bot card picker.
[1.0.4] - 2026-10-26
Added & Fixed
- EveryonePicks + RoundsWithBots Simultaneous Bot Card Picking: Added seamless integration between
EveryonePicksandRoundsWithBotsfor simultaneous draft phases with bots:- Zero Screen Hijack / No 25s Freeze: In vanilla
EveryonePicks, local bots were treated as local human players (IsLocalPlayer(bot) == true), causing them to enterlocalQueueand freeze the screen for 25–45 seconds per bot while waiting for human input.IsLocalPlayernow recognizes bots and exempts them from the local interactive screen queue. - Simulated Background AI Picking:
EveryonePicks.State.SeedPickerstriggers background simulated card picks for entitled bots with a realistic human-like 1.0–1.8s thinking delay. - Weighted AI Decision Engine: Bots evaluate card candidates through
RoundsWithBots.Handlers.BotCardPickerHandler.PickerAI.cardPickerAI.PickCard(hand), respecting configured bot weapon/stat synergies and category blacklists (NotForBots). - Real-Time PickBoard Updates: Picks are immediately reported to
EveryonePicks(StoreResult,StoreSessionDone,StoreStatus), turning the bot's entry on thePickBoardto<color=green>READY</color>in real time. - Guaranteed Card Stat Application: In
ApplyRow, offline bots and skipped picks are directly assigned their chosen cards viaModdingUtils.Utils.Cards.RPCA_AssignCardandApplyCardStats.Pick, ensuring bot card stats and card bar icons apply properly. - Zero Sequential Conflicts: Vanilla sequential
AiPickCardcoroutine inRoundsWithBotsis automatically suppressed whenEveryonePicksis running a draft phase.
- Zero Screen Hijack / No 25s Freeze: In vanilla
- Menu Safety & Cascade Navigation Fix (
GoBack.Update): Fixed a menu desync where pressingEscapeor gamepadAction2while navigating submenus or options triggeredGoBackon every menu page simultaneously. Added active page hierarchy verification (ListMenu.instance.selectedPage == page) so only the currently focused menu page processes the back action.
[1.0.3] - 2026-10-26
Fixed
- StatRevealMod Vanilla & Additive Stat Preservation: Fixed a major bug in
StatRevealModwhere vanilla cards and custom cards with flat stat values (such as+0.25s,+0.5sReload Time) were erroneously replaced with+0%because the mod only checked multiplier ratios (gun.reloadTime == 1.0). Now:- Flat reload additions (
gun.reloadTimeAdd) are preserved and displayed accurately in seconds (e.g.,+0.25s,+0.5s). - Unchanged multiplier stats (delta is 0%) return
nullinstead of+0%, preserving the card author's original descriptions and vanilla stat texts. - Zero-delta ammo (
gun.ammo == 0) returnsnullinstead of overwriting with+0. - Fractional decimal stats (e.g.
+0.5%,+12.5%) retain their exact decimal precision.
- Flat reload additions (
[1.0.2] - 2026-10-26
Fixed
- RoundsWithBots Pathfinding NRE Spam: Silenced and safely guarded
AIPathfindModule.AttemptPathfindToTargetandUpdate(). Prevents continuous hundreds-per-second NRE log spam when bot target or terrain path nodes are null/unmapped. - CosmicRounds StarMono VFX NRE: Fixed NullReferenceException in
StarMono.<Attack>b__0when projectiles are destroyed before the 1-frame delayed sprite initialization callback fires. - Runtime Framework Standardization: Standardized project output to
netstandard2.0matching Unity 2018.4's native Mono CLR.
[1.0.1] - 2026-10-26
Fixed
- StatRevealMod Decimal Truncation: Fixed a critical rounding flaw where fractional stat bonuses (such as
+0.5%or other decimals) were rounded down to+0%or0byStatRevealModdue to banker's roundingToString("0"). Now dynamically hooksStatCalculator.GetStatValueto preserve decimal precision up to 2 decimal places (0.##) when fractional (e.g.,+0.5%,+12.5%) while cleanly rendering whole numbers (+50%).
[1.0.0] - 2026-10-25
Initial Release
- ROUNDS Patchwork Plus: Universal compatibility and bugfix patchwork engine for modpacks.
- Added dynamic component initialization for
RayHitReflect.DoHitEffectandCareenMono(eliminates 80+ NREs). - Added Photon RPC view ID sanitization and finalizer on
ProjectileHit.RPCA_DoHit. - Added inactive & dead player guard on
PCE.MonoBehaviours.SuperJumpEffect.OnUpdate(eliminates 119+ NREs). - Added missing spawner fallback & exception suppression for
Explosion.DoExplosionEffects(eliminates 59+ NREs). - Added coroutine
MoveNext()finalizer onMapTransition.MoveandPlayerManager.Movefor smooth match progression without freezes. - Added player disconnect resilience patches (
SetPlayerSpriteLayer,EmpowerStopBlockObjectFollow,ReloadTigger,UnboundLib.DisableCard). - Zero hard dependencies; fully isolated soft-detection for all patches.