Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
TeamWars
WORK IN PROGRESS. Competitive 2-team mode: pick your team in the lobby; everyone hauls to the same truck, the money is split per team by who carried each valuable in, and each team gets its own colour-coded cart.
By repocacus
CHANGELOG
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.79
Extraction.CartRadiusdefault 12 m (was 6): the cart counts from twice as far from the check.
0.8.78
- Defaults:
Protection.AllowGrabHeldByRivalis now false (contested grabs off unless enabled),Revive.CostPercentis 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 aRojo 50000 -> 0without a bank line is traceable.
0.8.75
- Removed the
Ownership appliedlog: 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/leftper 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 && usablegate 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
colliderTransformis 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.Keydefault 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. PriceRevive.CostFlat(default $5000) orRevive.CostPercentof 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
Warningtransition, so a full check without both carts holds green counting instead of looping red. The backstop kicksWarning(fromActive), 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 helpersExtractionStateName/DriveExtractionso the kick does not depend on the nestedStateenum 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
VerboseLogson.
0.8.46
- Cart gate re-hooked to
ExtractionPoint.StateSet, vetoing entries intoExtracting/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) andExtraction.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 (
MirrorPotevery second,EnsurePoton authorize); purses rule, vanilla never blocks an affordable purchase.
0.8.39
- Loot doubling via
ValuableSpawnPatchonValuableDirector.SetupHost;Spawning.ValuableMultiplier(default 2, host wins). Perf passes (carts/caches/throttles).
0.8.38 and earlier
- No changelog was kept.