05 The install

Install Ungodly Bendy Community Patch

Seventeen bug-fix modules across thirty patch points. One DLL, no configuration file, no menu, nothing to tune. Install it and forget it.

Joey Drew Studios stopped patching this game years ago, and the community bug list still has a long column of entries marked Status: Unknown — which is the wiki's polite way of saying nobody ever fixed it. This plugin fixes them at the source.

StepsThe install

Identical to Enhanced, and quicker, because there is nothing to configure afterwards.

  1. Step 01Get the archive

  2. Step 02Unblock, then extract

    Right-click UngodlyBendyCommunityPatch_v1_1_3.rar → Properties → tick Unblock if it is offered, then extract.

    Archive contents
    UngodlyBendyCommunityPatch_v1_1_3\
    ├─ UngodlyBendyCommunityPatch.dll   <- this is the file you install
    └─ README.md                        <- documentation; does not go in the game folder
  3. Step 03Copy the DLL into the plugins folder

    Same destination as Enhanced:

    Destination
    <game folder>\BepInEx\plugins\

    With both mods installed, that folder holds two files:

    Both plugins in place
    BepInEx\plugins\
    ├─ UngodlyBendyEnhanced.dll
    └─ UngodlyBendyCommunityPatch.dll

    On disk:

    Windows Explorer showing the plugins folderView full size · 1752×130
    the plugins folderThe entire mod install: two DLLs, 54 KB and 242 KB. Nothing else belongs in here — no READMEs, no extracted folders, no .rar files.
  4. Step 04Launch and check the log

    There is no menu and no hotkey for this one, so the log is the only place it announces itself. Open BepInEx\LogOutput.log and look for both plugins in the chainloader list:

    LogOutput.log — both plugins loaded
    [Message: Chainloader] Chainloader ready
    [Info   : Chainloader] 2 plugins to load
    [Info   : Chainloader] Loading [Ungodly Bendy Enhanced 1.2.0]
    [Info   : Chainloader] Loading [Ungodly Bendy Community Patch 1.1.3]

CompatibilityLoad order and compatibility

The patch declares a soft dependency on stixsworldhd.bendy.ungodlyenhanced. Two consequences:

  • If Enhanced is present, the patch always loads after it, so the order is deterministic rather than dependent on filesystem enumeration.
  • If Enhanced is absent, the patch loads anyway and works normally. It does not need it.

The two were audited surface by surface rather than assumed compatible. Every global one of them reads or writes was checked against the other's source:

Engine surfaceEnhancedCommunity PatchResult
RenderSettings (ambient)never touchedsnapshot / restoreNo overlap
Time.timeScalenever touchedrestored on pause deadlockNo overlap
QualitySettings levelsets itwatches itComplementary
Time.fixedDeltaTimeraises itreads itAdapted
Harmony patch targets4 postfixes on AspectRatioUtil30 points, none of them thoseNo overlap

The physics rate needed a real adaptation

Enhanced raises Time.fixedDeltaTime to cure the camera jitter. That is a correct fix and the patch does not attempt its own. But it changes the environment two of the patch's modules run in:

  • Ragdoll stability was tuned for Unity's default 0.02 s step. At a 144 Hz timestep the physics loop runs almost three times as often, so fixed solver iterations and continuous collision detection would cost roughly three times as much — landing precisely in the Butcher Gang death moments where the vanilla lag spike already lives. As of v1.1.3 both scale to the actual timestep: iterations come down as steps go up, and sweeping is dropped once a velocity-capped limb travels less than a limb's thickness per step. At vanilla 50 Hz the behaviour is byte-for-byte what it was.
  • AI unstick accumulates real Time.fixedDeltaTime rather than counting physics steps, so its 1.5-second detection window is rate-independent by construction. No change needed. Vanilla's own CheckIfStuck gets this wrong — it adds Time.deltaTime inside FixedUpdate — which is one of the things the patch corrects.

The subtitle fix now lives in Enhanced

This module used to cap the subtitle backlog at three lines — a mitigation, not a cure. Enhanced v1.2.0 found the actual cause: AudioManager advances the voice queue every (clip length − one physics timestep) while MainSubtitlesController advances the text queue every (clip length), so the two drift apart by exactly one timestep per line and never self-correct.

Enhanced corrects that at the source. But its resync only runs while both queues hold the same number of entries — and this module’s trim removes entries from one of them, which would silently disable the cure. So as of v1.1.3 the module checks Harmony.GetPatchInfo at startup and stands down completely if anything else has already patched ShowSubtitles, logging that it has done so.

The inventoryWhat it fixes

Every fix here was written after reading the decompiled shipping code and finding the actual defect — not by guessing at symptoms. The full technical write-up for each one is in the archive's README; this is the summary.

The four that will change your playthrough

Most reported bug in the game

1. The save lockout

The little Bendy icon appears when you save and then never fades — and from that moment nothing is written to disk again. Players lose entire chapters to it. The community workaround has been to watch the corner of the screen and restart the moment the icon sticks.

It is a deadlock in AsyncFileAPI with three independent ways in: the verify path returns without releasing the lock; the guard flag is set inside the worker rather than the caller, so two quick saves both pass it; and completion is raised on the worker thread, where touching Unity UI throws before the flag is cleared.

The save path is replaced with a writer that cannot deadlock. Serialisation moves to the main thread; the write goes to a temporary file, is flushed to the device, is read back and verified in full, and only then replaces the live file. A three-deep rolling backup chain is rotated on every success. Requests queue instead of being dropped. Completion always fires. And on load, a save that will not deserialise is repaired from the newest good backup instead of hanging the game on a black screen.

2. The pause deadlock — and the enemies that walk on the spot

GameManager.Pause() sets isPaused = true and then asks for the pause menu. If that fails, the flag is stuck true forever, because Unpause() guards on the menu existing.

That one stuck bool is behind two separate wiki entries: a menu that cannot be closed, and “Ink Bendy sometimes stops moving while his walking animation keeps playing” — because the AI controllers early-out on isPaused but the Animator is not gated by it. A watchdog detects the state and unwinds it through the game's own unpause path so the event still fires for anything listening.

13. The respawn softlocks

DeathController ends its respawn with an else branch that just writes a log line. If no spawn node is active you are left in death limbo — slowed movement, locked rotation, no crosshair, and OnSpawned never raised. No input recovers it. That is Stuck in the ink tunnels, listed game-breaking with cause unknown.

Three more defects live in the same path: the spawn point is scored by distance from where you died, so dying to a pack respawns you inside it; RespawnController.Respawn() has no null check at all; and the death sequence disables two weapon objects but the respawn only re-enables one, which is the mechanism behind Unbreakable weapon. All four are fixed, plus a four-second grace window after any respawn during which enemies drop you as a target.

New in v1.1.3

17. Scripted sequences

Bendy stages a great deal of its story through the AI — Sammy’s ritual, the Boris set pieces, the Chapter 4 ballroom, Allison and Tom in the giant ink machine. All of it runs through the same thought machine that drives ordinary patrolling, and four defects live in that machinery:

  • A throwing callback strands the AI forever. The wait handler invokes its callback with no try/catch, and the SetThought that advances the sequence is the very next line. One destroyed reference and the AI sits in Wait permanently, with every later beat dead. The callback now runs inside a guard so the transition happens regardless.
  • The callback can fire every single frame. SetThought is a no-op when the new thought equals the current one, so a Wait that follows Wait never changes state, the timer stays at zero, and a beat meant to happen once fires at framerate. It now fires exactly once, and a chain that can never advance is released to Idle after eight seconds.
  • A scripted walk is abandoned the moment the AI sees you. The enemy switches to Attack mid-walk, so it never arrives — and the arrival callback the script was waiting on never fires. The walk is now allowed to finish and the attack is handed over on arrival, so nothing is lost, only reordered: the sequence completes and the enemy still comes for you.
  • Arrival can dead-end. Reaching the mark reverts to the previous thought, which is a no-op when that was MoveToPoint itself — trivially reached by scripting two moves in a row. The AI now resumes patrolling instead of re-arriving forever.

This release also fixes a regression of the patch’s own. Three modules previously reached into AI state with no idea whether a sequence was running: AI unstick treated a scripted mark as a wedged enemy and could drag it away from the arrival a script was waiting on; the Miracle Station attack block stomped scripted attacks; the respawn grace window cleared targets and could cancel a staged chase outright. All three now consult a shared IsScripted() check.

The other thirteen

#FixWhat you would have noticed
3Raw localization keys shown as dialogueOBJECTIVES/CH1_OBJ_01 drawn on screen where dialogue belongs, and AUDIOLOG/NAME_<FIRST NAME> where a speaker’s name should be — the wiki’s In-game text glitch. A startup race; now memoised, with a sweep that retroactively repairs text already on screen
4Little Miracle StationsSealed inside one with no way out, and stations that did not actually hide you because CombatStatus.Hiding was set ~1.5 s late
5Stuck enemiesProjectionist, Brute Boris, Ink Demon and the Butcher Gang wedged on steps and door frames forever. Now escalates through three levels of unstick instead of only dropping the path
6AI dispatchReflective Invoke twice per enemy per frame, on scaled time so AI stopped near timeScale zero. Rewritten to cached delegates — a net performance gain
7Audio log transcriptsWally Franks’ transcript welded to the screen permanently
8Double interactionsTwo ink hearts from one model — and, far worse, two overlapping saves, which is what wedges the save system
9The super-stretchy Butcher GangCorpses tearing themselves across the room with a lag spike. Force preserved, solver given a chance
10Achievements that never unlock“Hearing Voices” and the audio-log achievements silently failing
11Falling out of the mapNo world floor of any kind existed. Also fixes being shoved inside a wall in Chapter 5
12Subtitles that run a chapter behindA backlog cap of three, as a mitigation. Stands down entirely when Enhanced v1.2.0 is installed — see below
14The plank that will not breakChapter 5 softlock whose only remedy was restarting the chapter
15Audio that loops foreverThe never-ending ink spill, and cassette motors outliving their audio log
16Pitch-black menus and wallsChanging quality mid-game collapsing RenderSettings ambient to black until you restarted

Performance

The patch is designed to be cheaper than the bugs it removes: one MonoBehaviour for the whole plugin, one per-frame operation (draining a callback queue, which is a lock and a count check when idle), watchdogs at 2 Hz, all reflection resolved once at install time, and no scene walking on a timer. The AI dispatch rewrite is a net reduction in per-frame cost.

Where to goNext

Both plugins are in. The next page is the one worth not skipping: how to confirm the whole stack is actually running, using the folder tree, the log and the mod's own diagnostics panel.