You are viewing a potentially older version of this package. View all versions.
Chonkzilla-SimpleOptimize-0.1.16 icon

SimpleOptimize

Per-player FPS optimizer for hoard runs (/opt): item sleeper, shadow killer, culling. Written by Claude & Chonk.

Date uploaded a day ago
Version 0.1.16
Download link Chonkzilla-SimpleOptimize-0.1.16.zip
Downloads 98
Dependency string Chonkzilla-SimpleOptimize-0.1.16

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

SimpleOptimize

Written by Claude & Chonk

A non-cheaty bug-fix and performance mod for Lethal Company v81, built for runs where hundreds of collected items tank the frame rate. It fixes things the game gets wrong and makes big hoards cheaper to draw; it doesn't change how fast you play or give you an edge over vanilla players. The few convenience extras (cargo dropship and ship landing at the Company) are switched off during SimpleHQ tournaments.

Anyone can install it. Almost everything runs only on your own machine and doesn't affect other players. The exceptions are called out below.

Commands

Type these in the in-game chat.

Command What it does
/opt (/optimize) Status: items sleeping, shadows removed, items culled, frame time and FPS, and which features are on
/opt sleep on|off Item sleeper
/opt snap on|off Instant settle for items dropped aboard
/opt shadows on|off Shadow remover
/opt cull on|off Hides ship items when you're far away
/opt yeet on|off Cruiser launch fix
/opt spray Spray colour status, and how many colours are available
/opt spray <index> Use one of the game's own spray colours. Your colour is yours: other players running SimpleOptimize see it on the marks you spray, and you see theirs
/opt spray #RRGGBB Use any colour, for example /opt spray #20B2AA
/opt spray off Back to the normal colour
/opt dropship Cargo dropship status and the speed table
/opt dropship on|off Fast cargo dropship
/opt dropship speed <1-4> 1 is normal (40s), 2 is 20s, 3 is 13s, 4 is 10s to arrive. Only at the Company: deliveries on a moon stay vanilla
/opt dropship wait on|off Keeps the dropship waiting until someone opens it
/opt transit on|off Fast player ship landing and takeoff (off by default)

/opt cargo and /opt paint work the same as dropship and spray.

Every command also works with !, such as !opt or !opt spray #FF69B4. Use it if /opt replies "unknown command". That message comes from another chat mod grabbing every / command before SimpleOptimize sees it, and those mods ignore !.

Settings are saved in local.simpleoptimize.cfg.

Performance

  1. Item sleeper. The game updates the position of every item that isn't being held, every frame, forever. Items resting aboard now skip that update, and wake up the moment they're grabbed, moved or used.
  2. Shadow remover. Resting items stop casting shadows, and get them back when picked up or taken off the ship. Hundreds of shadows is the biggest graphics cost of a big hoard.
  3. Instant settle. A falling item can't sleep, so after a big merge or organize, hundreds of items spend seconds dropping into place. Items dropped aboard now land instantly. Items dropped outside still fall normally.
  4. Distance culling. While you're out collecting, items on the ship stop being drawn once you're more than 45 m away, and reappear as you come back.

Items in a belt bag are left alone by all four: the game moves a bagged item out of sight on its own every frame, and takes it back out the same way. Every belt-bag add and remove writes a [BeltBag] line to the BepInEx log, with a warning if an item is still visible after going in or invisible after coming out.

Cargo dropship

Normally you wait 40 seconds for a terminal order to arrive, and the dropship leaves after 30 seconds whether or not anyone opened it. If it leaves unopened, you lose the items and the credits.

SimpleOptimize makes it arrive faster and, by default, keeps it waiting until someone opens it, so you can't miss an order you paid for. Once it's opened, it leaves at your chosen speed.

Only the host needs this. The host controls the dropship timer, so players without the mod still see it arrive early, with nothing out of sync.

Spray paint colour

The game picks each spray can's colour at random. /opt spray lets you choose it.

Only players with the mod see your colour. The game never sends spray colour between players, so anyone without SimpleOptimize sees the original colour on the same cans and the same paint. Nothing breaks. You just see different colours.

Players who have SimpleOptimize get the host's colour automatically when they join and whenever it changes. To keep your own colour, set [Spray] AcceptHostColor = false.

Picking one of the game's colours always works. A custom colour depends on the paint material supporting it. If it doesn't, the command tells you instead of silently doing nothing.

Paint that's already on a wall keeps its colour. Only new spray changes.

Bug fixes

Fix What it fixes
Cadaver kill lag Killing a cadaver plant made the game throw an error and write several debug lines. Clearing a growth turned into thousands of them: 2,110 errors and a 24 MB log in one measured session.
Spider web slow Breaking a web while you're caught in it left you permanently slower, and it stacked each time.
Stuck interact A lost network message could leave you unable to interact, scroll or use items until you rejoined. Now it clears itself after 2 seconds.
Cruiser yeet Teleporting into the cruiser, or walking into it on TZP, could launch it across the map.
Ship item cap Raises the limit of 400 items saved on the ship.
Throw error spam Silences a flood of harmless errors caused by other players dropping items.
Magnet lag When the cruiser attached to the ship, the game wrote three log lines for every item within 25 m. With a big hoard that took 772 ms. Now skipped.
Weed killer error flood If the plant you were spraying got destroyed first, the game threw an error every frame until you stopped: 25,691 in one measured session. Now it happens once.
Blood particle flood A dead body's blood effect can be aimed at a mesh with no surface. The game then warns every frame: 57,398 log lines in one session, and a real frame cost for the rest of the day. That emitter is switched off.
Joiners see $0 scrap When someone joins, the host sends them every item's value, but the game stops after about 500 items (gear counts too), so on a big hoard the rest show $0 for the joiner until the next save. The limit is now 4,000 ([Fixes] JoinSyncMaxItems). Host only: the host's mod fixes it for every joiner, modded or not.
Cruiser seat stuck after a disconnect If someone left or was kicked while sitting in the cruiser, their seat stayed taken: nobody could drive (or sit in the passenger seat) for the rest of the session. Now each game frees the seat the moment that player leaves, and the host takes the truck back. No extra network messages. Everyone should have it: each player's game frees its own copy of the seat.
Can't hear a late joiner while dead When someone joined into a slot a kicked or disconnected player had, the game could keep that slot tied to the old player's voice. Alive you heard them normally, but once you died and were spectating you couldn't hear them. Now every player's voice link is checked a few seconds after any join, after a disconnect, when you die or switch who you spectate (and every few seconds while dead), and any wrong link is fixed with the game's own voice refresh. Your machine only, no network messages. [Fixes] FixLateJoinVoice (on), logged as [Voice].
Wrong Steam picture in the dead players' list The boxes on the left while you are dead are made once per player slot, so someone who joined into another player's old slot showed that player's picture. The picture and name are now redrawn when the slot's player changed. Your screen only. [Fixes] FixSpectatorAvatars (on), logged as [Avatars].
Too few sounds at once The game only plays 40 sounds at once, so in busy moments footsteps, doors and enemies cut out. Raised to 128 ([Audio] RealVoices) once at startup. Your machine only.
Unknown names Players who joined late showed up as "unknown" (a late joiner saw only the host's name). Steam only shares names between friends or people in the same Steam lobby, and everyone but the host leaves that lobby when the ship first lands. Now your game asks Steam for the missing names, and a host running SimpleOptimize sends its own names to joiners who have it (2, 8 and 20 s after each join) and re-sends the game's own Steam ID message so everyone looks the names up again. [Fixes] FixUnknownNames, [Names] HostNameSync, [Names] ResendSteamIds (all on). Best with SimpleOptimize on the host AND the joiner; a joiner without it can still only name friends and people in its Steam lobby.
Wrong names on the ship monitor The monitor followed one player but showed another's name, so the teleporter beamed the "wrong" person and switch <name> picked the wrong one. A vanilla bug in any lobby: turning on a radar booster re-sorts the monitor's list, and every later join writes names by player slot into the re-sorted list. Each entry is now named after the player it really follows (two players with the same name show as Name and Name2). The host also sends its monitor order to players who have SimpleOptimize, so a switch shows the same person for everyone. [Radar] FixRadarNames, [Radar] SyncRadarOrder (both on). Fixes your own screen, so each player needs SimpleOptimize 0.1.14; players without it keep the vanilla behaviour.

These floods of errors and log lines build up over a session. That's why lag can creep back after a few runs and go away when you restart.

Fast player ship (off by default)

Speeds up your own ship's landing and takeoff. This is off by default, and it isn't the same thing as the fast cargo dropship.

Needs everyone in the lobby. Each player's game plays the landing on its own, so this only turns on when every player has SimpleOptimize, or you're playing solo. It checks automatically and switches itself off if someone joins without the mod.

Install

Drop SimpleOptimize.dll into BepInEx/plugins, or install with a mod manager. Requires BepInEx 5.4.2100. Every feature can be turned off in local.simpleoptimize.cfg.

CHANGELOG

Changelog

0.1.16

  • Fixed: the terminal scan was never exact (vanilla bug). After landing, the game doesn't add up the real scrap values: for each item it rolls a random number from the item's base price range and only loosely keeps it near the real value (the allowed gap grows with every item, and more upward than downward), so the total usually ran high. It now adds the real values. Also, between pulling the lever and the doors opening, the game counted every piece of scrap on the moon as "in the ship"; that line now only counts what is really in the ship. After landing, "outside the ship" means every piece of scrap not inside the ship room: on the ground, held by players, in a belt bag or in the Cruiser. Your terminal only, no network messages; works the same for host and clients. [Fixes] FixExactScan (on).

0.1.15

  • Fixed: you couldn't hear a late joiner while you were dead (vanilla bug; Josh, hosting). Each player slot keeps a link to that player's voice. The game only ever fills in a missing link; it never clears one, not even when the player leaves. So when someone is kicked or disconnects and a new player joins into that slot, the slot can stay tied to the old player's voice (and, because the voice system reuses its voice objects, sometimes to another player's). Alive you don't notice: a voice nobody adjusts plays normally. But when you are dead the game has to change other players' voices (a dead player's voice becomes "in your head" at full volume instead of coming from their body), and with the wrong link that change goes to the wrong voice, so the new player stays silent for you. Now every player's voice link is checked against who is really in that slot 3, 8 and 16 seconds after anyone joins, 1 and 5 seconds after someone leaves, when you die, when you switch who you spectate, and every 4 seconds while you are dead. A wrong link is cleared and the game's own voice refresh runs again. A leaving player's slot also drops its voice link right away, so the next player in it starts clean. Your machine only, no network messages; nothing changes when every link is already right. Logged as [Voice] slot N (name, dead): <what was wrong>; re-linked to voice '...'. [Fixes] FixLateJoinVoice (on).
  • Fixed: the dead players' list showed the previous player's Steam picture (vanilla bug). The boxes on the left while you are dead are made once per player slot and only hidden between rounds, so a player who joined into someone else's old slot got that person's picture. The picture (and name) is now redrawn whenever the slot's player changed. (The pause menu list itself has no pictures in v81; the picture you see while dead is this list.) Your screen only. Logged as [Avatars]. [Fixes] FixSpectatorAvatars (on).

0.1.14

  • Fixed: the ship monitor sometimes showed the wrong name (vanilla bug, any lobby). The monitor followed one player but labelled them as someone else, and the teleporter beamed whoever it was really following. Cause: turning on a radar booster re-sorts the monitor's list, and every time someone joins afterwards the game writes everyone's name by player slot number into the re-sorted list. Every monitor entry is now named after the player it really follows, after any change and before the terminal reads the names (switch <name> works again). Two players with the same name show as Name and Name2. Logged as [Radar] monitor entry #N follows ... now 'X'. [Radar] FixRadarNames (on).
  • The host lines up everyone's monitor order. Switching the monitor is sent to everyone as a list position, so a player whose list was in a different order watched someone else. The host now sends its order to players running SimpleOptimize 0.1.14, so a switch lands on the same person for them. Players without it keep the vanilla behaviour. [Radar] SyncRadarOrder (on).
  • Unknown names: a name fetched from Steam now goes on that player's monitor entry, not on whichever entry sat at their slot number (the same mistake as the vanilla bug above).
  • Fixed: a late joiner saw "unknown" for everyone except the host (Josh, hosting). The game never sends names over the network: each player's game asks its own Steam, and Steam only names friends and people in the same Steam lobby. After the first landing everyone but the host has left that lobby, so a late joiner can only name the host (and earlier players see the joiner as "unknown" too). The host now follows up every join 2, 8 and 20 seconds later: it sends its own names to players running SimpleOptimize, who apply them at once to anyone still "unknown" (matched by Steam ID, never replaces a real name), and it re-sends the game's own per-player Steam ID message so every player, modded or not, looks the names up again once their Steam has caught up. Only the host needs it for the first part to reach SimpleOptimize joiners; a joiner WITHOUT SimpleOptimize still can't be told a stranger's name (the game has no message for it), the re-send only helps with names their own Steam can know. Logged as [Names] host pass N/3: ... on the host and [Names] player N is X (from host) on the joiner. [Names] HostNameSync (on), [Names] ResendSteamIds (on).

0.1.13

  • Faster item juggling moved out into its own separate mod. The [Juggle] settings, the /opt juggle command and the input buffer / shorter switch and drop waits are gone from SimpleOptimize. Everything else is unchanged, including the 0.1.12 belt-bag fixes. Old [Juggle] lines left in local.simpleoptimize.cfg are ignored and can be deleted.
  • Picking items up before the lever moved out to the same separate mod. The [Fixes] GrabBeforeStart setting is gone from SimpleOptimize; that mod copies your old value the first time it runs. During SimpleHQ tournaments pre-start grabbing is SimpleHQ's own (unchanged).
  • Fixed: joiners saw $0 on most items of a big hoard. The host sends a joining player the value of every item on the map, but the game stops after about 500 items (scrap and gear alike, nearest the map centre first); everything past that showed $0 for the joiner. Host only, and vanilla joiners get the right values too. New settings [Fixes] FixJoinScrapValues (on) and [Fixes] JoinSyncMaxItems (4000, 500 to 20000). The values still go in the game's own single join message (about 8 bytes per item, ~32 KB at 4000; it can't be split without breaking vanilla joiners); past the limit the farthest items still show $0 and the host log says so.
  • Fixed: a cruiser seat stayed taken after its player disconnected or was kicked, so nobody could drive or ride for the rest of the session. Every game now frees the seat itself when the player leaves (the same clean-up the game does when a player gets out normally), and the host takes back control of the truck if the leaver had it. No new network messages. [Fixes] FixCruiserSeatDisconnect (on). Best when everyone has it.
  • More sounds at once. Unity's limit of 40 sounds playing together is raised to 128 once at startup, so busy moments stop cutting sounds out. Your machine only. [Audio] RaiseVoiceLimit (on), [Audio] RealVoices (128, 32 to 255), [Audio] VirtualVoices (512). Never lowers the limit. /opt shows the current voices.
  • README: SimpleOptimize is described as what it is, a non-cheaty bug-fix and performance mod.

0.1.12

  • Fixed: a ghost copy of an item left floating after putting it in a belt bag on the ship (the 0.1.10 fix didn't work). The game takes a bagged item out of its parent and moves it far out of sight with the item's own per-frame update. The item keeps its "on the ship" flags, so the ship item sleeper put it back to sleep one frame before that last move. It stayed where the bag animation left it, next to the bag in mid-air, with no collision. Items in a bag are now tracked exactly and never slept.
  • Fixed: items taken out of a belt bag could be invisible but still grabbable. While an item sat in a bag (still flagged as a ship item, but 3 km away), distance culling hid it. Taken out anywhere off the ship, it no longer counted as a ship item, so it was never shown again until someone picked it up. Bagged items are never culled now, any item the culler hid is shown again as soon as it stops being far-away ship hoard, and an item is un-hidden the moment it goes in or out of a bag.
  • [BeltBag] log lines for every belt-bag add and remove, on host and clients. A GHOST? / INVISIBLE? warning appears if an item is still visible half a second after going in, or still hidden a second after coming out.
  • Drops are a bit slower with juggling on, so they no longer feel instant. G now waits 0.15 s after a slot switch or a confirmed pick-up (vanilla 0.2 s; 0.1.11 used 0.1 s). This is a new setting, [Juggle] DropDelay (0.05 to 0.2). Pick-ups, scrolling and the input buffer are unchanged.

0.1.11

  • Faster item juggling ([Juggle], on by default, /opt juggle on|off). A pick-up, drop, scroll or utility-slot press that the game would silently ignore for being too early (right after a switch, during a grab, before the host confirmed your last drop) is remembered for 0.35 s and done as soon as the game allows, in the order pressed. The waits themselves are shorter: 0.1 s after a switch (was 0.2), 0.15 s between scrolls (was 0.3), half the settle after a confirmed grab. Grabs still wait for the host and drops for its answer; no new network messages; your machine only. Off during SimpleHQ tournaments unless [Juggle] InTournaments = true.

0.1.10

  • Fixed: putting something in a belt bag left a ghost copy behind, on the ship and at the Company. The game animates an item into a bag by writing its target position every frame and letting the item's own update apply it; the ship-item optimizer was skipping exactly that update, so the item went in and the picture stayed put. Items in a bag, or on their way into one, are never slept now.

0.1.9

  • The startup line no longer counts SimpleBuy: its commands are part of SimpleSell now.
  • Spray colours are per player now. Everyone running SimpleOptimize sees each player's own colour on the marks that player sprayed, instead of the host's colour for everything. Vanilla players are untouched: they see the game's seeded colour, as always. Set yours with /opt spray #RRGGBB and it follows you into any lobby where the others run SimpleOptimize.

0.1.8

  • Fixed: cruiser cargo floating next to the ship. Items in a magneted cruiser are kept in place by the game writing their position every frame, and the item sleeper was skipping that, so cargo drifted loose during the flight and hung in the air at the next landing. Cruiser cargo now only sleeps while the truck is unmagneted (driving around on a moon), and items are only snapped into place when they're parented to the ship itself.

0.1.7

  • The fast cargo dropship only works at the Company now. On a moon, deliveries arrive at vanilla speed, so ordering gear mid-run is no faster than the game intends. The "waits until opened" guard follows it, since it exists to protect fast deliveries. /opt dropship says which applies where you are.

0.1.6

  • Tournament mode (SimpleHQ): while a tournament runs, this mod's commands are off and its gameplay extras switch off, so the game plays as close to vanilla as possible. /opt is off, the cargo dropship goes back to vanilla speed and timing, and grabbing items before the game starts is reverted. The performance work and bug fixes stay on.

0.1.5

Fixed: a dead body could cost you frames for the rest of the day. A body's blood effect can be pointed at a mesh with no surface, and the game then warns about it every single frame: 57,398 lines in one measured session, each one written to the log and the console. That emitter is now switched off when it's spotted, which loses nothing, since it could never have drawn anything. Turn it off with [Fixes] FixZeroAreaParticleSpam.

0.1.4

Fixed: late joiners show up as "unknown". Names aren't sent between players; each game looks them up through Steam, and Steam only shares a name with friends or people in the same Steam lobby. Everyone leaves that lobby when the ship first lands, so someone who joins later (SimpleSell's late join) and the players already in the game can't see each other's names. Your game now asks Steam for any missing name and puts it on the player, the pause menu list and the radar. It fixes your own screen only, so every player who wants names needs SimpleOptimize. Turn it off with [Fixes] FixUnknownNames in local.simpleoptimize.cfg.

0.1.3

  • Credit line: written by Claude & Chonk.

0.1.2

Fixed: weed killer error flood. While you spray weed killer on a cadaver plant or mold, the game keeps track of which plant it's hitting. If that plant got destroyed first, by another player or the growth shrinking, the game threw an error every single frame until you stopped spraying. One measured session logged 25,691 of them.

Now the game forgets the destroyed plant right away, so it happens once instead of thousands of times. You can turn this off with [Fixes] FixWeedKillerIndexSpam in local.simpleoptimize.cfg.

These floods build up over a session, which is why lag could come back after a few runs and go away after a restart.

0.1.1

  • Commands now work with !. You can type !opt, !opt spray #FF69B4, and so on. If /opt replies "unknown command", another chat mod is grabbing / first, and those mods ignore !.
  • Fixed: magnet lag with a big hoard. When the cruiser attached to the ship, the game wrote three log lines for every item within 25 m. A few hundred items meant around 700 lines each time, measured at 772 ms. That logging is now skipped.
  • /opt also writes its numbers to the BepInEx log, so you can read them after a lag spike.

0.1.0

First release.

  • Better performance with big hoards: item sleeper, shadow remover, instant settle and distance culling.
  • Fast cargo dropship (/opt dropship) with speed levels, and an option to keep it waiting until it's opened so you can't miss an order.
  • Spray paint colour (/opt spray), shared with other players who have SimpleOptimize.
  • Bug fixes: cadaver kill lag, spider web slow, stuck interact, cruiser yeet, ship item cap, early grab and throw error spam.