You are viewing a potentially older version of this package.
View all versions.
RoundsPatchworkPlus
Universal stability patchwork engine for ROUNDS modpacks. Eliminates bullet passing/ghosting, reload NRE freezes, duplicate category crashes, Photon desyncs, and AI bugs.
| Date uploaded | a week ago |
| Version | 1.1.2 |
| Download link | naccel_inc-RoundsPatchworkPlus-1.1.2.zip |
| Downloads | 15 |
| Dependency string | naccel_inc-RoundsPatchworkPlus-1.1.2 |
This mod requires the following mods to function
BepInEx-BepInExPack_ROUNDS
BepInEx pack for ROUNDS. Preconfigured and ready to use.
Preferred version: 5.4.1901README
ROUNDS Patchwork Plus
ROUNDS Patchwork Plus is the all-in-one universal compatibility and stability patchwork engine for ROUNDS.
It silently intercepts, resolves, and suppresses hundreds of game-breaking crashes, NullReferenceExceptions, Photon network RPC desyncs, coroutine failures, and cross-mod incompatibilities common to heavily modded ROUNDS lobbies.
⚡ Key Features & Intercepted Incompatibilities
🛡️ Bullet Ghosting & Damage Interception Fix (CPCCore + PerformanceImprovements)
- When using performance optimization mods that send synthetic raycasts with null colliders (
PerformanceImprovements),CPCCorecrashed withNullReferenceExceptioninsideProjectileHit.Hit. - This caused bullets to pass right through players without dealing damage or triggering on-death explosions.
ROUNDS Patchwork Plussafely intercepts null colliders and wrapsProjectileHit.Hitwith a safety finalizer, guaranteeing bullets always deal damage, trigger effects, and destroy properly.
⏱️ Anti-Slow-Motion Watchdog (TimeHandler.timeStop / gameOverTime)
- Exceptions during bullet hit processing or round-end coroutines frequently corrupted hitstop and slow-motion curves, leaving
Time.timeScalelocked near zero. - The built-in watchdog monitors battle progress: if
timeStoporgameOverTimestays frozen for longer than expected during an active round, the engine automatically smoothly restores normal time (timeStop = 1.0f).
🔫 Reload Trigger NRE Cascade Elimination (DuringReloadTrigger)
- Modded cards with reload triggers frequently threw hundreds of
NullReferenceExceptionerrors per second insideDuringReloadTrigger.Update()when referencing uninitialized weapons. - Safely intercepts uninitialized
GunAmmoand weapon handlers, eliminating main-thread render lag and restoring smooth 60+ FPS.
🗂️ Duplicate Category Dictionary Crash Fix (Key: Root)
- Multiple card mods registering the
"Root"category without deduplication caused fatalArgumentException: An item with the same key has already been addedinsideUnboundLib.Utils.CardManagerandSandboxImprovements. - Deduplicates category registries before menu building, completely preventing card menu crashes.
📺 Twitch Shutdown Freeze Fix (RoundsWithViewers)
- Silences NREs and eliminates the forced 500ms synchronous main-thread sleep in
RWV.OnDestroy()when playing without an active Twitch connection.
🤖 Smart Bot Navigation & Teleport / Portal Awareness (AIMovementModule)
- Prevents bot AI from freezing or breaking on custom maps with teleporters, portals, or disconnected platforms (e.g.
Root_Maps). - Bots dynamically detect teleporter entrances when opponents are separated across portals or voids and step into them.
- Adds obstacle raycasting to automatically jump over walls and pits, with an anti-stuck watchdog to un-wedge trapped bots.
⏩ Ultra-Fast Round & Point Transitions
- Eliminates the 5-second artificial lag between points and rounds: accelerates
PlayerSpotlightfade durations to 0.15s, speeds up map entrance animation curves, and bypasses player readiness stall loops.
⚡ Instant Main Menu Loading & Lazy Card Visual Engine
- Eliminates the severe 30-60s main menu freeze in 1,000+ card modpacks (
ToggleCardsMenuHandlerandCardSpawnMenuHandler). Card visual instantiation is deferred lazily until category browsing.
👥 EveryonePicks + RoundsWithBots Simultaneous Bot Card Picking
- Eliminates the 25–45s screen freeze where bots took over the interactive draft loop (
IsLocalPlayer(bot) == true). - Bots pick simultaneously in the background with a realistic 1.0–1.8s delay using
RoundsWithBotsweighted AI (botCardPickerAI.PickCard), respecting category blacklists (NotForBots). - Updates the on-screen
PickBoardtoREADYin real time and automatically applies bot card upgrades viaModdingUtils.Utils.Cards.RPCA_AssignCard/ApplyCardStats.Pick.
🛡️ RayHitReflect, Photon RPC, & Coroutine Resilience
- RayHitReflect / CareenMono Collision Fixes: Dynamically initializes missing
MoveTransformandProjectileHitreferences, eliminating 80+ frame NREs inCosmicRounds. - Photon RPC Network Desync Protection: Prevents
ProjectileHit.RPCA_DoHitcrashes from invalid/orphaned Photon view IDs. - PCE SuperJumpEffect OnUpdate Protection: Stops 119+ frame NREs when dead or inactive players trigger PCE card effects.
- Explosion Missing Spawner Guard: Automatically provides fallback spawner contexts for
Explosion.DoExplosionEffects(fixes 59+ explosion NREs). - MapTransition & PlayerManager Coroutine Safety: Intercepts coroutine exceptions during round end and map transition, cleanly terminating destroyed player movements (
yield break) without stalling the match. - Leaver & Disconnect Resilience: Prevents crashes in
RWF.AssignPlayerIDandSetPlayerSpriteLayer.Startwhen players disconnect mid-round.
📦 Compatibility
Works seamlessly with any mod combination:
- CosmicRounds
- Player-Customization-Extended (PCE)
- Rounds With Friends (RWF)
- EveryonePicks
- UnboundLib
- Performance_Improvements
- CPCCore / CPC Crafter
- Cards+ / CardsPlusPlugin
- DemonicPact
- ModdingUtils
- Will's Wacky Cards (WWC)
- StatRevealMod
🛠️ Installation
- Install via r2modman or Thunderstore Mod Manager.
- Alternatively, place
RoundsPatchworkPlus.dll,manifest.json, andicon.pnginto your BepInEx plugins folder:BepInEx/plugins/naccel_inc-RoundsPatchworkPlus/
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.