R.E.P.O.
Install with App

Details

Latest version
0.8.171
Last Updated
First Uploaded
Downloads
799
Likes
2
Size
172KB
Dependants

TeamWars changelog

Versions are stamped from TeamWars.csproj (stamp.ps1 syncs PluginInfo and manifest.json). Only the host's config values matter for gameplay rules.

0.8.171

  • Fix: el Hauler no contaba hacia su equipo. Sus contenidos viajan en el Item Valuable Box hijo (nunca en dollarHaulList), que vainilla suma por valuableBoxHaulList aparte; ahora se acredita igual que un valuable (dueño del carrier, conductor si fue manejado sin agarre, own-goal en checks reclamados), y entra en el valor por check, el aislamiento entre checks, la contabilidad del cap de intake y el shelter de gracia.

  • Fix: saves silently dropped the whole team accounts (purses, purchase records, charger split), so after restoring a truck save only the vanilla-clamped base copies spawned (red kept theirs, blue's extras never existed) and both purses read 0. StatsManager is a DontDestroyOnLoad singleton whose Start fires once in the menu (mod always disabled there), so the gated registration never ran for multiplayer sessions. Registration is now unconditional (plus adopt of a detached copy when the load ran before it), load clears/restores ungated (saves load from the menu), and singleplayer saves stay vanilla-clean by unregistering while disabled.

0.8.170

  • Extraction.ExclusiveChecks: only one shared check may be active at a time. A new shared activation is denied (cancel sound + "COMPARTIDO EN MARCHA") while another shared check is still undelivered; team claims still allow one active check per team.

0.8.169

  • Fix: neutral cart at the start of a new run. The starter removal now falls back to any cart key (logged with its real name) and reports the run-item keys when it finds nothing, plus a master-side backstop in the cart spawn removes any leftover unowned cart by the truck when nobody bought one (bought carts are never touched).
  • Fix: items riding a team cart now wear the team colour on the master too (the claim only painted on remotes). The claim also resolves the network view through the parent grab object, so nested valuables get owned at all.
  • Fix: claimed valuables no longer enter the main-cart registry (they shared the cart ownership channel and could pose as carts); only verified carts adopt, and stale non-cart pairs are evicted on sight.

0.8.168

  • Singleplayer disables the mod: with no multiplayer session (SemiFunc.IsMultiplayer) the controller, HUD, revive terminal and every patch are no-ops, so singleplayer runs fully vanilla (normal loot, free starter cart, open truck exit, no team keys in saves). A solo player in a multiplayer room is unaffected.

0.8.167

  • Shop layout: ownership (tint) lands the same frame the vanilla populates, so items never show untinted. Placement waits only until the truck anchor sits still 1s (6s timeout) instead of a fixed delay: a parked truck orders in ~1-2s.

0.8.165

  • Shop layout: the blue row faces the truck center (180° yaw), so fronts aim at the aisle instead of outward.
  • Shop layout: waits 3s after the vanilla populate settles, then places everything in a single run instead of trickling in. Placed items freeze, so the single run holds.

0.8.164

  • Shop layout: everything places in a single time-spaced run instead of all at once. The vanilla populate fires several times in one burst, so teleporting the whole truck within the same second overloaded the solver and the items knocked each other into the tray grooves, ending up mixed.
  • Shop layout: placed items freeze (kinematic) until first grabbed. The truck table is slats over tray grooves: a resting item tips into a gap within seconds and slides back to the middle pile. Frozen items still grab, install and sync; the first grab unfreezes them.
  • Rival-owned objects no longer light the crosshair: aiming at something the other team owns (owned valuables, the rival's shop twin, a claimed check's button) leaves the mira on default, with no grab prompt and no grab — same rule as the grab block, so mira and grab never disagree. Contested grabs (AllowGrabHeldByRival on) still show the mira, since the grab is allowed. The side confirm buttons stay untouched (both teams must hold them).
  • All gameplay configs are host-wins for real now: the master broadcasts its values on the 10s re-sync and every machine plays by them (previously only documented; each client used its own). Debug.VerboseLogs stays local. Singleplayer and pre-first-sync use the local values.

0.8.163

  • Shop: the per-team spawn cap resolves the def by item name (e.g. Defibro vs Item ReviveItem), so capped items like the defib spawn for both teams instead of only the first buyer. Unparsable item types no longer abort the whole top-up.
  • Shop layout: rows stack inward on the truck table with per-slot ground snap, so purchases land in team rows instead of sliding into the tray grooves. Items carried during the spawn are placed once released; placed items are never moved. At most 4 instances per run, runs spaced 1.5s apart in real time (the vanilla populate fires several times in one burst, so a per-run budget alone still lands everything within the same second and mixes them again).
  • Shop: bought items always wear their team's colour (permanent tint, synced to every machine).

0.8.162

  • Extraction.ExclusiveChecks: the vanilla top-right counter hides on machines whose team has nothing left to deliver (own claim done, no shared check in play) instead of falling back to the combined level total. It shows again on its own when the team has a check.

0.8.161

  • Extraction.ExclusiveChecks: a claimed check that is its owner's last deliverable one (no pending shared check, no other own claim, nothing left the team could claim next) also closes without a surplus bag: the leftover pays as run currency, like the level's last check. Previously only the level's last check was exempt, so a team delivering its own claim mid-level still got a bag.

0.8.160

  • Extraction.ExclusiveChecks: the level's last check no longer pays the surplus as a moneybag. Vanilla decides the tax return when the check enters Surplus (extractionPointsCompleted != extractionPoints - 1), but a claimed check can wait there while the other checks complete, so the flag stayed "not the last one" and the bag spawned at the end. The flag is now cleared when the last check starts extracting (and a late TaxReturn close is sent through Complete), so the leftover becomes run currency like vanilla's last check.

0.8.159

  • Extraction.ExclusiveChecks: the vanilla top-right counter keeps reading the team's check through every beat of the delivery, including the Success "OK" right before the surplus is computed. It briefly fell back to the level-wide total there (both trays added), which is the moment the check turns green.

0.8.158

  • Extraction.ExclusiveChecks: the white map dots do not disappear while the check waits for the release. They used to route only to a check in Active; a claimed check parked in Surplus/Warning (the gate holding the release) left the trail with no target at all. A check that still takes deliveries now routes, and the player's own claim keeps priority over the shared one.
  • Extraction.ExclusiveChecks: the check figures are per check again. Vanilla computes every check's haul from the level-wide RoundDirector.currentHaul (only one check is ever active in vanilla), so with two checks live each one displayed the two trays added together on its screen, used the combined total for the "full" check and paid its tax return from it (an empty check showed the rival's surplus). The check's own delivery room now feeds haulCurrent, StateSuccess's surplus and the cancel check.
  • Extraction.ExclusiveChecks: the vanilla top-right counter (entered / required) now shows each team's own check (the shared one when there is no own check live), not the two trays added together and whichever check activated last.
  • Extraction.ExclusiveChecks: only one check extracts at a time. The haul list is level-wide and a delivery consumes it head-first, so a second concurrent extraction would have found it empty. The waiting check is held in Surplus/Warning and its countdown restarts when the running one closes.
  • Extraction.ExclusiveChecks: an extracting check only consumes its own tray. The other checks' items are parked out of the haul list for the duration and given back after vanilla's final sweep, so the first released check no longer eats the rival's loot (nor banks it early).

0.8.157

  • Extraction.ExclusiveChecks with GateMode = Off: if the rival delivers items into a claimed check before the owner feeds that check, they stay rejected (uncounted). As soon as the owning team delivers an item, the rival's waiting items are retried and count for the owner (own-goal rule).

0.8.156

  • Extraction.ExclusiveChecks: with GateMode = DualGrab, a claimed check always requires the owning team's button, even if that team has nobody alive (previously the wipe excused it and the rival could start it; now it waits until the wipe minute releases the claim).
  • Extraction.ExclusiveChecks: the surplus of a claimed check pays a single bag to the owning team with 100% of the leftover, instead of splitting it between both teams.
  • Extraction.ExclusiveChecks with GateMode = Off: the rival can no longer activate someone else's check by filling it with items; those deliveries stay rejected (the item sits in the tray uncounted), even though the own-goal rule would credit them to the owner. With DualGrab or Carts active the gate still controls the start.

0.8.155

  • Extraction.ExclusiveChecks: when every member of a team dies, the claimed check is no longer released instantly: it is held for one minute and only then can the rival take it. If the team revives within that minute, it keeps the claim.

0.8.154

  • Extraction.ExclusiveChecks: the white map dots (shortest path) now point to your check: your team's if you have it claimed, otherwise the nearest open shared/neutral one. It recalculates on its own (the vanilla coroutine re-resolves every cycle), so switching teams or claiming another check updates the path; old dots are cleaned up.

0.8.153

  • Extraction.ExclusiveChecks: already-delivered (completed) checks show green on the map, instead of the vanilla dark-red "used" marker.

0.8.152

  • Extraction.ExclusiveChecks: the shared (neutral) check marker on the map is now gray, instead of the vanilla light blue. Claimed red/blue markers keep their team color.

0.8.151

  • Extraction.ExclusiveChecks: switching teams (or ending up with no roster members) no longer releases the claimed check. It is released only on a real wipe: the team has assigned members and none alive. Previously, switching sides left the team with 0 alive and the claim was dropped, turning off the model and map color; now it survives until completion.

0.8.150

  • Extraction.ExclusiveChecks: the claimed-check tint now covers the whole model (body, tube, struts, screens, console and spotlights), not just the tube.
  • Extraction.ExclusiveChecks: the check marker on the map (TAB) takes the owning team's color: the active check claimed by Blue shows blue and Red's shows red. Shared/unclaimed ones stay vanilla light blue.

0.8.149

  • Extraction.ExclusiveChecks: delivering an item into a rival-claimed check now credits the owner on ownership too (previously it only moved the money: the item stayed tinted and locked for the team that carried it). The check owner is resolved at delivery time, so the intake cap and the trim use the right quota.
  • Extraction.ExclusiveChecks: the check tint is visible now. The button material was painted, which vanilla swaps for a shared one (black) in active state, hiding the color. Now the button and the check body (tube and console) are painted with MaterialPropertyBlock in the team color, without touching shared materials; it repaints if the freed slot is claimed by the rival.

0.8.148

  • Extraction.ExclusiveChecks: vanilla only allows one uncompleted check at a time on the host route (RoundDirector.extractionPointActive, only cleared in StateComplete), so the 2nd active check silently blocked every following one (no deny, no log). With exclusives on, an allowed press now clears that flag and vanilla proceeds to the RPC (re-evaluated there, idempotent); a denied press touches nothing.

0.8.147

  • New Extraction.ExclusiveChecks (default false): each level's shared quota stays shared (one check on odd totals, two on even, neutral tint); the rest is claimed per team (first to touch its vanilla button, max 1 active per team; the slot frees on delivery or wipe). A claimed check counts and releases only for its owner (rival input feeds the owner). Deny with cancel sound + floating notice. Off changes nothing.
  • New Shop.FreeWalkies (default 0): the host guarantees that many walkies in the shop at $0 (restocked on entry, bought ones not restocked).
  • Vanilla head revive uses the check where the head is (patch; previously it only followed the last activated one). The truck shows vanilla global totals as always (no change). Known limitation: the anti-loss teleport of heads outside the level can carry one to the other check; the totem revives where it is, so nothing gets stuck.

0.8.146

  • New Extraction.BothGoalsSoloMinutes (default 1 = on): once both teams already meet their goal, either one releases the check by holding just that button for that long (0 disables). Streak per check: letting go, grabbing both, or losing a goal resets it; the countdown shows in the check notice (host only) and on completion it releases just like the dual-grab.

0.8.145

  • Shop stock buys from its fixed spawn owner, no placement pin needed: the "belongs to X (grab it with that team to buy)" gate is gone, so a team's own twin in the check always charges that team's purse (holder timing is irrelevant — the ownership was set at spawn). The pin flow stays for non-duplicated shop items only.
  • The check's price tag splits the whole shopping list like the bulk gate does, not just what's inside the zone this frame: quickly moving an item in and out no longer flashes its amount as "?" while it is still in the vanilla total.

0.8.144

  • Economy.TeamGoalBasePercent default 28 -> 50 (round total per team). Untouched 28s migrate to 50; user-edited values survive.

0.8.143

  • Delivery-time trim with best precision: if a team is over its intake cap when the check delivers (same-tick races past the gate), it keeps the subset closest to (at most) the cap and the rest is pulled from the haul list before vanilla destroys it — ignored by the delivery, staying in the tray uncounted (credit kept) instead of banked or bagged. Never trims to empty (a lone oversized item stays).

0.8.142

  • Demand option B: each team's round total is TeamGoalBasePercent of single, split evenly over the checks (per-check goal = base / N, then handicap). Small demands per check, small ratios decide points.
  • Intake cap is now per team: Economy.CheckIntakeMaxPercent (% of single per team per check, 0 = no cap). Past its cap that team's deliveries stay uncounted (LLENO ROJO / LLENO AZUL) until carried onward; last check uncapped, first delivery per team always fits. A big team cannot eat the small team's slot.
  • Economy renames (Goal = per team, Check = per point): GoalBasePercent -> TeamGoalBasePercent, GoalMultiplier -> TeamGoalMultiplier, GoalMaxPercent -> CheckIntakeMaxPercent. Existing configs migrate, edited values survive (General.ConfigVersion 8). The shared Total/N x 1.5 automatic is gone.

0.8.141

  • Economy.GoalMaxPercent default 0 -> 50 (intake cap per check). Untouched zeroes migrate to 50; user-edited values survive. 0 still means automatic (Total / check count x 1.5).

0.8.140

  • Economy.GoalMaxPercent no longer caps the demand: it caps each check's intake, as percent of the single-spawn value (0 = automatic, Total / check count x 1.5). Never below the current demand (a check can always complete) and still no cap on the last check. Demand is now bounded only by the check-count ceiling, so goals may rise for configs that had a Max set (up to Total/N).

0.8.139

  • Intake cap per check: each non-last check accepts up to 1.5 x an even split of the level total (shared by both teams). Past the cap deliveries stay in the tray uncounted (floating LLENO, latch retried) until capacity frees or they are carried to the next check; the last check takes everything and a lone oversized valuable always fits. Loot spreads across checks instead of piling into the first one.
  • Check-points: each extracted check awards one point to the best haul/goal ratio over what it consumed (draws award nothing). The round goes to the points leader (HUD checks: line, tally-synced); the tug bar is the live score of the point in play.

0.8.138

  • Rename Economy.GoalStartPercent to Economy.GoalBasePercent (clearer: it is the per-team base before caps and handicap, not a minimum). Existing configs migrate automatically, keeping user-edited values; a stale leftover old key is dropped.

0.8.137

  • Goals are now capped by the check count: every check shows the higher team goal, so each goal is capped at (level total - 1) / check count. The sum of all checks stays below 100% of the level's spawned valuables; on levels with few checks the configured percent still rules.

0.8.136

  • New Extraction.SoloHoldMinutes (default 0 = disabled): minutes a single living team must hold the check button to release it without the other team. While it runs, the notice above the check shows the countdown (FALTA AZUL 1:23, host only); on completion it releases just like the dual-grab, and letting go resets the timer.

0.8.135

  • Fix: shop purchases ending up on the other team's side. Two holes:
    1. The check attribution pin was "last toucher wins": if the host (Red) reordered/touched an item placed by Blue, the periodic tag flipped it to Red and that team was charged (and got the spawn). Now the first pin of the stay in the check wins; taking the item out and putting it back re-pins as always.
    2. Spawn pairing matched red first by view ID, so when vanilla spawns fewer than bought (per-type item cap or truck without volumes) the shortfall always ate Blue's side. Now it pairs in real charge order (chronological queue, master memory, neither synced nor saved): with a shortfall the latest purchase loses, regardless of team. Save/load falls back to red-first order (no saved order).
  • Diagnostic log: if an item spawns fewer than bought, Shop layout says so with numbers (present vs bought Red/Blue).

0.8.134

  • New Economy.GoalMaxPercent (default 0 = no cap): upper cap on the money the check asks for, as a percentage of the map's single-spawn value (same base as GoalStartPercent, proportional to map money). It also caps each team's goal (whoever reaches theirs wins), so the check and the victory condition stay in step. The goal multiplier (GoalMultiplier) cannot push past the cap.

0.8.133

  • The loads UI (carga: Rojo X — Azul Y) also shows in the shop and in the post-shop lobby/truck, not just in the level. In the shop it goes inline on the rounds line (no third line, so it doesn't cover the price tag); in the lobby on the second line under the roster.

0.8.132

  • The revive totem accepts the team's full bag: besides the purse (savings minus spending plus already extracted), it counts what was delivered to the check even if not yet extracted. Previously, with a full unextracted check and an empty purse it refused to revive. The price is unchanged; if the pending amount is later lost (removed or broken), the purse stays in debt until recovered.

0.8.131

  • Feature: on level start, each team's purchases appear on its side of the truck (Red left, Blue right, same sides as the carts). Once at spawn; whatever someone already grabbed is not moved.

0.8.130

  • Fix: bought crystals charged nothing. The purchase registry uses the itemName field (Energy Crystal, visible in the log), but the mod compared it against the prefab name (Item Power Crystal): the spend was deducted and the credit was never granted. Now they match.

0.8.129

  • Fix: in the shop, taking an item out of the check un-converts it instantly (no grace, unlike levels). Previously it waited for the 0.5 s tag plus the vanilla timer; now the master scans the zone every frame and resets pin, tint and price on the spot.

0.8.128

  • Revert: the lost cart no longer returns to base on its own. Parking it far away to come back for it later is valid play and the teleport broke it. Only what moves nothing remains: a destroyed or voided cart respawns, a deactivated cart reactivates in place.

0.8.127

  • Fix: a cart could vanish without returning (seen: the blue one at the first check). The watchdog only replaced a destroyed or void-dropped cart; an existing but lost one (under the map resting on something, deactivated) counted as missing at every check and stalled the door forever. Now the lost cart returns to base with the same object and its contents (20 s grace far from checks, truck and living teammates; a team-in-use cart is never touched), and a deactivated one reactivates.

0.8.126

  • Fix: remotes saw whoever held the confirm button still grabbing the previous object. Two holes, both closed. The knob cloned the whole vanilla button object, inheriting its scene PhotonView under the same view ID; destroying it unregisters the vanilla view (photonViewList.Remove, IL-verified), so every GrabLinkRPC for it died with "viewID does not exist" (caught live: 606). The knob is now a mesh-only replica: same orientation, pivot, proportions and renderer offsets, zero foreign components. And runtime statics (view 0) can never send GrabLinkRPC at all, so the master now rebroadcasts the holds (new HoldSyncEvent) and every machine mirrors the RPC's local half (grab point, held transform, held flag, grabbing list) for the other players.

0.8.125

  • Fix: mid-level revives always saw an empty purse. Deliveries sit in Banked until the level exit rolls them into Earned, but the revive cost check read Purse() (Earned - Spent) only — so right after delivering the first check the totem still refused for lack of funds. Purse() now includes Banked; shop balances are unaffected (Banked is 0 there).
  • Removed the top-HUD revive line ("revive in truck..."): the totem itself already shows price, dead count and the [E] prompt when held.

0.8.124

  • Fix: the confirm post never used the live player position as reference — it is frozen in the check's frame (ButtonLocalOffset, calibrated live with the user standing on the spot: feet at local (1.84, 0.03, 1.68), knob 0.9 above). Planting it at the player's build-time position stranded it at spawn, 18 m from the check, invisible. Same pose on every check position/rotation, plus drift re-anchor when the check moved since build (never while held).

0.8.123

  • Fix: the confirm button spawns where the local player stands (feet XZ through the check's frame, knob height floor-snapped), and the root takes the check's yaw so the cloned knob keeps its authored orientation relative to the check (face to the screen side, live-verified). Feet are read from playerAvatarVisuals: the avatar root sits at the origin. The collider-derived hugger corner stays as fallback.

0.8.122

  • Fix: the confirm button (and any runtime-added static) actually grabs now. Root cause, caught live: StaticGrabObject.GrabLink runs mid-commit and its PhotonView.RPC on a view-0 view throws NullReferenceException (it does not just log), aborting StartGrabbingPhysObject after it stored the static but before grabbed=true. The stranded grabbedStaticGrabObject then made every later press release the ghost instead of grabbing. New GrabLink prefix replays the RPC's local half onto the holder and skips the doomed call, same pattern as the 0.8.93 GrabStarted/GrabEnded skips.

0.8.121

  • Fix: the confirm post hugs the tray's left wall at its panel-side end, tight outside both walls (live-calibrated with the user standing on the spot). Two stacked mistakes put it in the room wall before: the vanilla button sits on the back panel (it marks the BACK, the open side is the opposite), and whole-assembly bounds swallow the screen tower. Only low solid colliders are measured now, and the panel wall is excluded by shape.

0.8.120

  • Fix: the confirm button grabs with the vanilla hold again (as in 0.8.114). Cloning the whole vanilla button object inherited a child collider whose transform never equals colliderTransform, so the IL-verified static commit silently refused while the prompt still showed. The clone now drops every inherited collider (disabled at once, since Destroy is deferred) and carries a single fresh BoxCollider on the knob root itself, where the tag and colliderTransform also live.
  • Position: the post hugs the tray wall at its front-left corner (tight 0.3 m margins, knob 0.9 m above the real floor), measured from solid colliders only — the zone trigger no longer throws it meters away.

0.8.119

  • The confirm post stands front-left of the check (outside the tray, sized from the check's own collider bounds) instead of mid-doorway.
  • Fix: the aim-plus-Grab fallback now skips trigger volumes. A single raycast dies on the check's zone trigger, which is exactly where the posts stand, so the hold never engaged there; only the first solid collider blocks aim.

0.8.118

  • Fix: the confirm button's grab collider is now fitted from the world bounds of the cloned visuals, so it can no longer sit off-center when the vanilla mesh lives on an offset child (aim passed through the visible button). Cloned children are also retagged Untagged: they inherited vanilla tags like "Prop Lights", which made LightManager.Setup log the Button Light error.

0.8.117

  • The dual-grab side button now stands beside the check's own button (the designer-chosen interaction side, facing forward on any check rotation) instead of a fixed side offset.
  • Same aim-plus-Grab hold fallback applied to the revive totem: it had the identical view-0 static-commit weakness.

0.8.116

  • Fix: the dual-grab side button counts the hold even when the vanilla static commit never lands. The runtime-added PhotonView (view 0) never gets its GrabLink RPC back, so on some machines the prompt showed but the grab never engaged. Pointing at the button within grab range while holding Grab now counts the same (the protocol only needs the local hold, which it reports to the master itself); a working vanilla grab still counts as before.

0.8.115

  • Fix: the dual-grab side button no longer looks like a pole pierced by the button. The post is now 1 m (top meets the knob, foot at the floor), and the knob clones the check's whole button object, keeping its authored orientation and proportions instead of a bare mesh at identity rotation.

0.8.114

  • Fix: the shop check's bell no longer sticks shut on clients after a purchase. The tube-slam re-arm (and the surplus split) now only run in levels; the shop's own tube is fully vanilla again.

0.8.113

  • Charger energy is split per team: the base pool divides 50/50 at run start, bought crystals feed the buyer's team, and draining an item bills that item's team (no credit left means it stops charging). Vanilla bar, visuals and the crystal-break sound follow the summed pool; the HUD shows each team's charge. An unattributed battery charges the team everyone alive belongs to, and stays blocked until someone grabs it otherwise; crystals bought before the station value is known wait in a pending queue. The split survives save/load.
  • Checks are released by dual-grab instead of carts: a side button per check (the check's own button look) starts delivery only while at least one player of each team holds it; letting go mid-countdown aborts. Extraction.GateMode picks DualGrab (default), Carts (old rule) or Off. Wiped/empty teams excuse. The button glows grey (nobody), red/blue (one team holding) or green (both: released), with success/cancel sounds on the verdict change, and it is neutral: the rival-touch block never applies to it.

0.8.112

  • Fix: clients now see the per-team price tag too. The game only fills the shopping list on the master, so a client-side split always came out 0/0 and the vanilla total stayed; the host now broadcasts the split (on change plus the 10s re-sync) and clients display it.
  • Price tag colours: red Rojo -$XK | white separator | blue Azul -$YK.
  • The shop HUD block sits a bit higher, so the price tag no longer covers the rondas line.

0.8.111

  • The shop check's price tag shows each team's share (Rojo -$XK | Azul -$YK) instead of one combined total, so each team knows what it is about to spend. Items with no team attached yet are listed apart with a ?.

0.8.110

  • Version bump for Thunderstore upload (same code as 0.8.109, updated changelog packaging).

0.8.109

  • Carts are required up front, not mid-delivery: Extracting is now the point of no return. A cart pulled or destroyed mid-suck no longer aborts the delivery back to Active (which ate the consumed value and stalled the check); the run finishes and closes with whatever was verified at its start. Countdown (Warning) aborts still restart while nothing is consumed.
  • Retires the 0.8.108 abort-time banking: with no Extracting aborts left, countdown aborts consume nothing, so there is nothing to bank early.

0.8.108

  • Aborted deliveries keep their progress: value the suck-up already destroyed is banked when the gate aborts back to Active (cart pulled or destroyed mid-delivery) instead of evaporating on the limbo timer with no completion to cover it. The countdown restarts from kept progress.

0.8.107

  • Fix bell bouncing up and down: the stuck-bell detector fired on healthy open bells too (slam eval reads 1 both shut-stranded and fully open). It now compares the physical tube height, so only truly shut bells re-open.

0.8.106

  • Fix level soft-lock: the cart gate no longer vets the close (Complete). Holding it back stranded the finished check in TaxReturn once the carts moved on, and vanilla unlocks checks one by one so every later check stayed LOCKED. The delivery itself (Warning/Extracting) is still gated; once it ran, the check always closes.
  • Stuck checks heal on update: TaxReturn re-drives its close every frame, so loading this version completes the stranded check and unlocks the next one.

0.8.105

  • Fix check stranded with a closed bell: aborting a delivery (cart pulled mid-Extracting) back to Active left the tube shut, and Active never replays the raise — the check sat showing ACTIVE but nothing more could be loaded. Entering Active now re-arms vanilla's own bell raise on every machine, and the backstop re-opens bells already stuck this way.

0.8.104

  • TAB map: valuables (surplus moneybags included) carrying the rival's ownership mark no longer show their dot to the other team, same as the rival cart. Own and unattributed dots stay visible; teamless viewers see everything.

0.8.103

  • Fix missing per-team surplus bags: when a non-last check reached Complete with surplus pending but vanilla's TaxReturn never ran (Surplus never visited, or its flag died in a cart-gate abort), the gate now redirects that Extracting-end Complete into TaxReturn so the split still pays. The last check is untouched (its leftover becomes shared currency by vanilla design).
  • Fix stalled check: a Complete refused out of TaxReturn (cart pulled during the tube slam) is now re-driven by the backstop once both carts are back.

0.8.102

  • Protection.OwnershipGraceSeconds default 5s (was 10). Existing configs keep user-edited values via migration; untouched defaults re-apply.

0.8.101

  • New Economy.GoalMultiplier (default 1): extra scale on each team's goal, next to the loot multiplier. 1 = normal x1 demand, 2 = old double demand. Revive percent stays quoted on the single-spawn value.

0.8.100

  • Goals and revive percent are now quoted on the single-spawn value (spawned total divided by Spawning.ValuableMultiplier): with double loot each even team asks ~28% of a single share instead of ~28% of the doubled total. Extra loot never raises goals or the revive price.

0.8.99

  • Series (optional, off by default): Series.Enable + Series.WinLead (default 3). The team leading by that many rounds is announced as series champion (CAMPEÓN ROJO/AZUL banner + HUD tag). Display only: rounds keep going, nothing is blocked. Champion persists in saves and travels in the tally/round syncs.
  • Revive escalation: Revive.EscalationPercent (default 1). Each buyback costs base * (1 + percent * uses); the use count persists across levels and save games (0 disables).
  • TAB map: each team sees its own main cart's dot but not the rival's (re-hidden every 0.4s; vanilla Hide only parks it for 0.5s). Teamless viewers see both.

0.8.98

  • Fix delivery desync: the cart gate vetoed Warning / Extracting / Complete on clients too, where the cart refs never existed (Spawn is master-only and ApplyOwnership didn't save the view IDs) ⇒ the client always saw both carts outside, held back the replicated transition and got stuck with the button visible and the next check never activating. Now only the master vetoes; clients apply the replicated states and adopt the carts' view IDs with each sync (with per-round forgetting so previous-level IDs don't linger).

0.8.97

  • HUD text change.

0.8.96

  • Pulling a cart mid-countdown or mid-extraction aborts the check back to green (Active): once the carts are back a fresh 3-2-1 runs instead of resuming where it stopped. The previous veto left the check stranded in Warning with an expired timer, and the retry completed Extracting directly, skipping the countdown.

0.8.95

  • Fix shop ghost purchase: anyone joining mid-level (LateJoin) never got a team (auto-balance only ran in the lobby and at level start) ⇒ the master never attributed what they put in the check, the gate held everything (has no team attached yet) and nothing spawned in the truck. Now the master also auto-balances teamless players in level and shop (every 3s).
  • The master logs each team pick (Team pick: X -> Red/Blue).
  • The held notice names the teamless player and tells them to pick a team first, instead of the generic grab it again.

0.8.94

  • Hotfix 0.8.93: the prefix named the parameter grabber and vanilla calls it player ⇒ Harmony blew up when patching (Parameter not found) and PatchAll aborted the WHOLE mod. Parameters verified via Cecil.

0.8.93

  • Fix PUN spam when touching the revive totem: Illegal view ID:0 / Received RPC "GrabEndedRPC" for viewID 0 in multiplayer. The totem has no network view (by design) ⇒ the prefixes on StaticGrabObject.GrabStarted / GrabEnded replicate the local bookkeeping and skip the doomed-to-fail RPC. Hold and visual prompts unchanged.

0.8.89

  • Version bump, no gameplay changes.

0.8.88

  • Protection.OwnershipGraceSeconds default 10s (was 15).

0.8.87

  • Attribution fix with grace: when an object is neutralized its pinned credit is forgotten too, so the next rest on the check credits the carrying team (previously the cache returned the money and the ownership to the previous team).

0.8.86

  • Check fix with grace: when re-resting a neutralized object, the cached credit no longer skips Claim, so ownership (block + color) is reassigned together with the money as before.

0.8.85

  • Grace fix: the 10s ownership re-sync (including the host's own echo) no longer restarts the timer; without this the 15s never elapsed.

0.8.84

  • Ownership grace in levels: an object claimed by a team cart or the check keeps its team for Protection.OwnershipGraceSeconds (default 15s) after leaving every team cart and check, staying blocked for the rival meanwhile. Re-entering any team cart or check cancels the timer; a rival cart entry never re-claims. Surplus bags, team carts and bought items never expire. The shop check still resets instantly.

0.8.83

  • ESC team squares moved out of the options list entirely: they now hang directly below the page's MENU title, in the header area that no other mod's rows can reach (the MAIN MENU row they used to sit on ends up under inserted buttons like MODS). Falls back to the old absolute spot if the title isn't found.

0.8.82

  • Perf pass, no UX change: roster/tally travel as flat int[] (no string parse, no boxing; receivers still accept the old forms), shared RaiseEventOptions/SendOptions, scratch buffers in the haul tick, cached check list shared by gate/notices/goals, enum-compared extraction states instead of strings per poll, cached cart room checks, single-pass team/living counts, allocation-free dead-teammate count for HUD and totem, throttled font lookup, Camera.main cached, totem debug trace gated behind VerboseLogs.

0.8.81

  • Truck buyback is totem-only: the keyboard buyback and its Revive.Key setting are gone (HUD hint and docs updated to match). Old configs are migrated automatically by new config-migration machinery (General.ConfigVersion marks the config layout; entries whose saved value still matches an old default are reset to the new default, user-edited values survive; a backup cacus.TeamWars.cfg.bak is written when a migration fires).

0.8.80

  • Tug bar shows round progress, not money: each team's share is its live progress toward its own goal (Haul/Goal), so the handicap is honoured and a small team close to its small goal leads. Solid in the winner's colour once Winner() decides (matching the score line exactly).

0.8.79

  • Extraction.CartRadius default 12 m (was 6): the cart counts from twice as far from the check.

0.8.78

  • Defaults: Protection.AllowGrabHeldByRival is now false (contested grabs off unless enabled), Revive.CostPercent is now 5 (percent replaces the flat price while over 0). Docs corrected to match.

0.8.77

  • Vanilla money (CurrencyUI) hidden during the active level round too, not just the shop: the big single haul sat behind our score. Lobby/shop-menu states untouched, restored on teardown.

0.8.76

  • Surplus split counts limbo: value that left the check early (broken/slid out, banked by the next completion) no longer counts 0 while its partner takes the whole bag. Vanishing into limbo is now logged (Haul waiting: ...), so a Rojo 50000 -> 0 without a bank line is traceable.

0.8.75

  • Removed the Ownership applied log: the cart-content sweep grows the payload with every new item, so the dedup never held and it spammed with VerboseLogs on.

0.8.74

  • Cart-gate log only on transitions (entered/left per check+team): the per-poll verdict spammed the same MISSING line for minutes with VerboseLogs on. First sighting per level stays silent, flips stay at Info.

0.8.73

  • Missing-cart skip is logged once per level (nobody alive on the team, no respawn): distinguishes the by-design wipe excuse from a real respawn failure in the log.

0.8.72

  • Revive label highlight fires on hold alone, not hold-plus-affordable: with nobody dead (or short on purse) the old held && usable gate hid the very feedback that confirms the grip. Text still shows whether a buyback exists.

0.8.71

  • Temporary grab-transition trace (totem grab: held/ours/state/handle[...] only on flips + full snapshot on each E press): to catch in one run why the totem releases until the first cart touch. Remove once nailed.

0.8.70

  • Revive label highlights while grabbed and ready: full yellow with a black TMP outline; plain gold/gray otherwise.

0.8.69

  • Revive dummy actually grabs now: vanilla only commits the static grab when colliderTransform is set (editor-set on vanilla statics, null on runtime-added ones) — that null was the instant fail-buzz. Set to the pylon.

0.8.68

  • Broken main carts respawn at base: the master polls every 2s and rebuilds a destroyed (or fallen-out-of-the-world) cart on its truck side while its team still has living players. Also tracks carts by direct ref, so offline carts without a network view stop counting as missing.

0.8.67

  • Revive dummy grabs for real now: vanilla filters the grab ray by TAG, not by layer (CompareTag("Phys Grab Object") in RayCheck IL) — the pylon carries the tag (layer forced back to Default). No prompt/beam before was the wrong filter, not the dummy.

0.8.66

  • Revive totem hold is vanilla now: the pylon carries a real StaticGrabObject dummy (plus a viewID-0 PhotonView so its Start/RPCs never null-ref; position writes only exist in RPCs that never arrive, so it can never move or rotate). Hover prompt, hold and beam all vanilla; our beam is gone. The E gate reads the local grabber's held static. Solo is fully local; multi drops the dummy's RPCs with PUN error logs while the hold works. (Filter turned out to be the TAG, fixed in 0.8.67; the layer part below was wrong.)

0.8.65

  • Revive beam redrawn: thin (0.01) translucent line from the vanilla gun tip (physGrabPoint) to the totem, not a pillar from the chest. E presses that cannot prosper buzz locally at once (nothing to revive, or grab missing), and every E near the totem logs aimed/held/dead for diagnosis.

0.8.64

  • Revive totem aim uses the vanilla grab ray (localCamera override) instead of Camera.main, which is not the player view — that silent miss was eating the E press before any request existed, so no sound could ever play. The request itself is logged now.

0.8.63

  • ESC team squares moved onto the MAIN MENU row itself (inside-right corner of the full-width row) instead of a fixed spot that other mods' buttons (MODS) covered. Falls back to the old spot, nudged up, if the row isn't found.

0.8.62

  • Revive terminal: instant grab feedback (flare + beam to the holder, computed per-frame instead of at text cadence), label raised clear of the pylon, and check sounds on the buyback result (success sting / cancel buzz at the totem, reported by the master through a targeted event).

0.8.61

  • Floating check notice hides once delivered: it only shows in the states where the gate acts (Active/Warning/Surplus/Extracting). The leftover haul after Complete kept the stale text up.

0.8.60

  • Revive terminal label is two lines now: REVIVIR (n) up top, current price in parentheses below.

0.8.59

  • Revive terminal is a physical object now: solid collider, no rigidbody (vanilla can never move it). Reviving takes aim at the totem + grab-hold (left click) + E; while held it flares and the label shows [E]. Label sits right above the pylon instead of floating near the ceiling. F9 stays as the grab-less backup.

0.8.58

  • Revive terminal text now uses orientation B in the exact live-validated setup: parented under the healer (the A/B test ran under that hierarchy) with the label's +Z aimed away from the reader. The toward-reader side (A) showed mirrored. Moved to the truck wall, on the spot measured live where the player stood (x/z from the player, eye height kept).
  • The brief yellow HUD notice when the gate holds a check is replaced by a persistent floating text above the check itself, listing the missing cart(s).

0.8.57

  • ASCII tug bar: more air below it (score pushed down) and no gray dashes when empty — the bar appears with the first delivery.

0.8.56

  • Tug bar is now ASCII (■ x24, red from the left, blue from the right) instead of the Image fills, centered top at ~25% width. Verified live that ■ and ▒ both render through font fallback even where HasCharacter says 0; the bar uses NotoSansSC anyway, the only loaded font with U+25A0 natively.

0.8.55

  • Cart gate no longer strands checks: every vetoed edge is remembered and re-driven once the carts are back (Warning from Active or Surplus, Extracting from Warning, Complete from Extracting). Found live: an overfilled check loops Surplus → Warning through its own one-shot edge, so vetoing it froze the check green with a stale notice. The backstop only completes edges vanilla raised itself. (Your handicap theory was close but innocent: red goal 0 is by design — no players, no goal — and the check correctly followed blue's.)

0.8.54

  • Physical revive terminal in the truck: a floating totem beside the healer (measured live layout), activated with the vanilla Interact key within 3.5 m. Same purse charge and master validation as the key; the totem pulses and shows price/dead count, dim while unusable. F9 from anywhere in the truck still works.
  • Tug bar centered: 700 px in the middle top instead of full width.

0.8.53

  • Goal handicap: each living player shoulders an even share of the two base goals (even teams keep the base percentage; deaths shrink it, late joiners dilute it). Goals never rise from deaths, and the map math already held: goals are a share of the spawned (doubled) total, so both teams fit with headroom.
  • Tug-of-war bar above the score: confirmed (banked) money this round, red from the left, blue from the right. Banked money now travels in the tally sync.
  • Paid revive (Revive.Key default F9): a living player buys back one dead teammate from the team purse — the vanilla head revive, run by the master, so it lands exactly like the free one. Price Revive.CostFlat (default $5000) or Revive.CostPercent of the round-start level total. Bought from the truck: the living buyer must stand in it. HUD shows key, price, dead count and funds.

0.8.52

  • Cart gate: a team with nobody alive no longer gates extraction — wiped OR simply empty. Playing alone on Red with nobody on Blue now delivers with the Red cart alone (previously an empty team still demanded its cart, so solo had to haul both).

0.8.51

  • Cart gate: a wiped team (all its players dead) no longer gates extraction — its missing cart is excused, so the living team delivers with its own cart. A team with nobody in the level does not count as wiped (solo still hauls both carts).
  • Team selector without the 1 s delay: the ESC open/close check and the lobby frame sync run every frame; only the lobby scene scan stays throttled, with an immediate scan while nothing is built.

0.8.50

  • New config Protection.AllowGrabHeldByRival (default true): grabbing an object someone from the other team is holding follows this switch, ahead of the ownership rule. Off forbids grabbing anything a rival holds, even unowned.

0.8.49

  • Cart gate moved before the 3-2-1: the veto now includes the Warning transition, so a full check without both carts holds green counting instead of looping red. The backstop kicks Warning (from Active), vanilla walks the rest itself.

0.8.48

  • Cart-gate backstop: the host re-kicks a full waiting check every 2 s (RetryHeldExtractions), because the veto kills a single transition edge the game does not always raise again. Reflection helpers ExtractionStateName/DriveExtraction so the kick does not depend on the nested State enum at compile time.

0.8.47

  • The 10 s periodic re-sync (roster/tally/ownership) only logs when the content changed; steady state is silent even with VerboseLogs on.

0.8.46

  • Cart gate re-hooked to ExtractionPoint.StateSet, vetoing entries into Extracting/Complete. The extraction button is fully untouched.

0.8.45 (superseded)

  • Gate hooked to ExtractionPoint.ButtonPress. Dropped: the button must keep vanilla behaviour unconditionally; the condition belongs on the automatic delivery start instead.

0.8.44

  • TeamMapFilter: Map/ExtractionPoint API dump plus a per-level scan of checks and their static-grab children (groundwork for the cart gate and per-team TAB-map cart dots).

0.8.43

  • New config Protection.BlockRivalTouch (default true): one switch blocking grabs and impact damage on what the other team owns.

0.8.42

  • New configs Extraction.RequireCarts (default true) and Extraction.CartRadius (6 m): an extraction check needs both teams' main carts inside it. First gate attempt on the button's static grab (never fired; see 0.8.45-0.8.46). HUD notice line while held.

0.8.41

  • Shop tints with restore, Debug.VerboseLogs (default off), HUD money truncation like vanilla, ownerless shop items never bought, tube-refusal dedupe.

0.8.40

  • Shop pot mirror plus top-up (MirrorPot every second, EnsurePot on authorize); purses rule, vanilla never blocks an affordable purchase.

0.8.39

  • Loot doubling via ValuableSpawnPatch on ValuableDirector.SetupHost; Spawning.ValuableMultiplier (default 2, host wins). Perf passes (carts/caches/throttles).

0.8.38 and earlier

  • No changelog was kept.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.