How to report: for each row, reply with the ID (left column) + PASS or what actually happened (exact steps, what you expected, what you saw β screenshots/clips help a ton). Rows marked 2P need a second player, ADMIN need admin rank, TEAM need a specific job. Don't report anything in the KNOWN ISSUES section at the bottom β we already know.
| QUESTS | NEW: NPC story quests (v2 β replaces the daily board) | Rebuilt as a real NPC quest system with lore + progression (not dailies). Six characters give multi-step chains through a dialogue UI: Vinny the Fixer (alley by the Black Market), Sal (24/7 clerk), Doc (off-books medic), Sgt. Reyes (PD, LEO-only), Mickey (dockhand β fishing/smuggling chain), and Rosa (diner owner β honest-work chain). Objectives mix talk-to-an-NPC / grab a dead-drop / fetch an item (e.g. bring an AK) / hit a stat; each NPC keeps its own reputation (StrangerβTrusted, saved) and pays cash/dirty/XP. A tracker HUD (top-right) shows active objectives with a π track button that drops a waypoint to the next spot, plus a Quest Journal on J listing everyone + where you stand (unmet NPCs show as ???). Test: alley by the Black Market β press E on Vinny β accept βNew Bloodβ β follow it (talk to Sal at the 24/7) β π-track it β open the journal (J). |
| GROUP | Group-join: flashy + actually works | New gold "FREE $5,000!" card (slides in, pulsing border) with clear join steps. The real bug is fixed: the server cached your group status for the whole session, so joining mid-game never registered. Now it fresh-checks β join the group while playing and within ~10s the card celebrates + auto-pays (no button needed). Test with an account outside the group: join from the game page β wait β confetti + $5,000. |
| MOBILE | Phone/touch pass (14 fixes) | On your phone: shoot (FIRE/AIM buttons), place furniture (tap + β³β²βΌ cluster), fish (tap casts), drive (hold-pill start), lock car (π fob), TAB stats, backpack drag. |
| M1/M4 | Bank vault exit + car sounds range | M1: after a robbery ends you're teleported OUT of the vault + the walls go solid again. M4: you should NOT hear cars driving on the far side of the map. (Cuffs are a known issue β skip.) |
| 2P | 2P night list | Locker privacy Β· DND ring-through Β· mute vs block ("X has blocked you") Β· eject dots owner-only Β· GRP join-group UI (needs alt). |
| 119 | MOBILE3 β iPad UI polish batch QUEUED iPAD ONLY | DONE (Jul 24): β right-side HUD cluster (minimap + location/money/XP) sits too far right on mobile, clips the edge β shift left; β‘ SAFE ZONE banner too low + too wordy on mobile β just "SAFE ZONE", repositioned; β’ top icon buttons (B/TAB/HELP/M/Y) bigger touch targets on mobile; β£ HELP button becomes a true toggle (tap again = close); β€ Help's close button shows a square β drawn β (same font-glyph fix as row 100); β₯ DAILIES chip bigger on mobile. β all six done, retest on iPad |
| 120 | Mobile gun-out: move finger steered the camera NEW iPAD ONLY | FIXED (Jul 24): with an OTS gun out on mobile, releasing your movement thumb and touching again made that finger move you AND spin the camera β the gun's swipe-look was claiming any free touch, and on a re-touch it grabbed the movement finger before the thumbstick did. Now the left 45% of the screen is movement-only; camera-look swipes only register on the right side (standard shooter layout β FIRE/AIM buttons are there anyway). Test: deagle out β walk with left thumb β release β walk again (camera must NOT turn) β swipe right side (camera turns). |
| 121 | Mobile drag β hotbar drop + grid cells on touch NEW iPAD ONLY | FIXED (Jul 24): touch drags were hit-tested with emulated-mouse coords β the hotbar zone/slot check read plr:GetMouse() (which never follows a touch drag over UI, and is inset-space vs the hotbar bridge's raw-screen rects) and the release-time cell checks read a stale mouse location, so the ghost tracked your finger but every drop landed on old coordinates. The backpack now records the live drag finger itself (UIS.InputChanged/InputEnded, Touch) and all glow/drop hit tests prefer it β raw-screen for the hotbar bridge β while mouse input never sets it. Test on iPad: drag item over a backpack cell β that slot glows β drop lands; drag the deagle over the hotbar β zone glows green β drop pins it to that slot; desktop drag unchanged. |
Everything fixed or built in the Aug 4β8 run, newest work at the bottom. Same reporting: row ID + PASS or what you saw. All of it needs a PUBLISH first.
| 123 | Phone "Y" icon showing on join / during tutorial NEW | FIXED (Aug 4): the Y phone indicator is now gated on actually having entered the game β it stays hidden on the intro menu and during the tutorial tour. Also closed a hole where opening/closing the phone force-showed it (which caused a 1-frame flash before the watchdog corrected it). Test: join β main menu shows NO Y icon β press PLAY β Y appears β run the tutorial β Y hidden until it ends. |
| 125 | House garage doors opened sideways NEW | FIXED (Aug 4): the door animation rotated around the wrong axis on some house models, so doors swung sideways instead of tilting up. The axis is now picked from the door's own dimensions per house. Test: each of the 3 house types β open the garage β door tilts up correctly, closes the same way. |
| 126 | Spawn at my house after death NEW | FIXED (Aug 4): the "spawn at my house" preference wasn't being honored on respawn β the spawn router now reads the housing spawn attribute and routes your respawn to your own house (normal spawn as fallback if you have no house/plot). Test: own a house β enable spawn-at-house β die β you respawn at your house. |
| 127 | Housing build menu left bar flashing NEW | FIXED (Aug 4): a placement-state flag was left stranded on, which kept re-triggering the build menu's sidebar refresh = the constant flicker. Test: open the housing build menu β left category bar sits still (no flashing) while you browse and place furniture. |
| 128 | Eject β over passengers β drawn + Ctrl-gated NEW | FIXED (Aug 4): the eject marker was a font glyph that rendered as a red square, and the dots showed constantly. It's now a drawn β and the dots stay hidden until you press Ctrl in the car. Test: drive with a passenger β no dots β hold Ctrl β drawn β appears over their head β click ejects them. |
| 129 | Dailies CLAIM button NEW | FIXED (Aug 4): completed dailies now show a green CLAIM button instead of paying silently β click it to collect the reward. Test: finish a daily β CLAIM appears on that row β click β reward paid, row marks claimed (and stays claimed after a rejoin). |
| 130 | Admin EVENTS β durations + x2 money ADMIN NEW | FIXED (Aug 4): server events now take a pickable duration and include an x2 MONEY event alongside x2 XP. Test: admin panel β Events β pick an event + duration β confirm it announces, applies for that long, then ends on its own. |
| 131 | Stretcher no longer hauls healthy players TEAM NEW | FIXED (Aug 4): the stretcher's quick-transport path fired on anyone with health above zero β so a perfectly fine player could be teleported to the hospital (griefable + nonsense RP). It now requires a real patient: downed players go through the full stretcher run, and everyone else must actually be injured ("they aren't injured β nothing to transport"). Test as Fire/EMS: use the Stretcher on a healthy player β refused with a message; hurt them first β transport works as before. |
| 132 | Delivery bay door sound looping while nothing moves NEW | FIXED (Aug 4): the roll-up sound is a fixed ~4-second clip, but the doors finish travelling well before it ends β and with 8 bays triggering, the leftovers overlapped into constant noise while you stood still. The sound is now cut the moment its door actually stops moving. Test: drive up to the warehouse bays as Delivery Driver β each door plays its roll sound only while it's visibly moving, then silence. |
| 133 | Buy-house green circle floating in the sky NEW | FIXED (Aug 4): the claim ring places itself by shooting a ray straight down to find the ground β on some plots that ray lands on a roof, tree canopy or fence in the way, leaving the circle parked in mid-air. It's now clamped to the plot's own surface, so a bad hit can't lift it. Test: walk every FOR SALE plot β the green claim ring sits flat on the ground in front of each sign, none floating. |
| 134 | Wanted system β shooting/killing now counts 2P NEW | ROOT CAUSE FOUND + FIXED (Aug 4): the wanted rules for violence were all built (assault +1, assault officer +2, murder +5, cop-killer +8, plus the protection heals) β but ONE function in WantedSystem was defined below the code that used it, so every hit/kill handler crashed on its first line. Result: gun assaults, murders AND the "cops can't hurt innocents" / firefighter-immunity protections have ALL been silently dead. Fixed the ordering, proved the crash + the fix mechanically, audited the whole file for any other ordering traps (clean), and live-tested the full pipeline in play (assaultβ1β , murder-levelβ4β , reasons, clear β all correct; zero WantedSystem errors). Needs a 2-player confirm: civ shoots a cop β 2β "Assaulting an officer" appears; civ kills a cop β 4β "Murder of an officer"; civ shoots a civ β 1β ; cop shoots an innocent civ β damage heals + "Hold Fire" warning; anyone hits a firefighter β heal + 4β "Assaulting emergency services". |
| 135 | Dealership MY VEHICLES shows your cars again NEW | FIXED + PLAY-VERIFIED (Aug 4): the owned-cars list was coming up (0) even though the server had your cars. Verified live in play: the MY VEHICLES tab now receives all 4 of your cars with their correct plates (180SX TypeX, Explorer, R32, Tesla-X). Also repaired the recovery fallback β it was pointed at a dead internal function that could never fire; it now uses the live ownership source and keeps your existing plates (no re-plating, so registrations stay valid). Test: dealership β MY VEHICLES β count is right, every owned car listed with its plate β spawn + sell still work. |
| 136 | Type X (and any car) despawning on exit NEW | HARDENED + PLAY-VERIFIED (Aug 4): ran your exact repro live β spawned your 180SX Type X, sat in it, jumped out, watched it: it stayed put. The despawn system now (a) can NEVER remove an occupied car, (b) had its silent abandoned-despawn removed entirely, and (c) toasts you the reason on every legitimate removal (went on duty / owner left / 30-min idle store) β so a car can no longer just vanish without telling you why. Test: jump out of any personal car mid-drive β it stays; leave it 30+ min β "auto-stored" toast. |
| 137 | R32 won't drive β missing engine listener found NEW | ROOT CAUSE FOUND + FIXED (Aug 4): the July engine-sound fix (SND46) added a server listener to every car β except the R32 got skipped. Its sound/rev system fires a remote (AC6_FE_Sounds) that had no listener and no remote object in that car, so starts/revs went nowhere. Installed the same listener + remote on the R32 (template AND display copy β both, so it survives respawns). Test: spawn the R32 β start it β engine idles + revs audibly β it drives like the other fixed cars. |
| 138 | Crown Vic "drives without starting" β believed fixed by C1 NEW | RETEST (Aug 4): checked the Crown Victoria's wiring β it HAS the game-wide engine/start fix (listener present, ignition gating present, no disabled seats). Your report predates that fix landing, so this is very likely already solved. Test: get in the Crown Vic WITHOUT starting β it shouldn't drive; start it β drives; P-brake behaves correctly. If it still misbehaves, tell me exactly which part (rolls? accelerates? brake inverted?) and I'll dig into its tune specifically. |
| 139 | Wind streaks no longer show indoors NEW | FIXED (Aug 4): the on-screen wind streaks come from a separate wind system (not the weather kit β the kit already switches its SOUNDS indoors correctly, which is why audio behaved but visuals didn't). The streak spawner now checks for a roof above the camera every 0.4s and stops spawning while you're inside; any streaks already on screen fade out within ~1.5s. Test: stand in the rain/wind outside (streaks visible) β walk into any building β streaks stop within a second or two β step back out β they resume. |
| 140 | iPad round 2 β menu size, missing B/Y icons, safe-zone stuck, dailies tap, HUD size NEW | FIXED (Aug 4): Root cause of the missing icons: every top icon stays hidden until the server's "entered" flag flips, and after Play a guardian script force-shows only TAB/HELP/M (that losing battle was the flashing you saw) β B had no guardian at all and Y's gate demanded the strict flag, so a late/missed flag left both hidden. Now "intro menu destroyed" counts as entered for the whole row, B is covered by the same guardian as the other three, and Y's gate tolerates a missing flag. The safe-zone pill wasn't actually stuck β leaving a zone flips the banner into its amber combat-cooldown state, whose explainer text is hidden on touch, so the pill sat there looking unchanged until the cooldown cleared; on touch it now ticks "COOLDOWN Ns" in the pill title and hard-hides when done. The DAILIES tap was dying silently when the objectives data missed the slow iPad load (tapping now re-requests it and opens once it lands), the intro menu got a tablet size tier (460px logo, 54px buttons), and the HUD cluster scale went 0.6β0.72. Test on iPad: menu logo/buttons bigger β spawn β ALL five top icons (B TAB HELP M Y) present β enter/leave a safe zone (pill shows then hides) β tap DAILIES (menu opens) β HUD cluster readable, nothing clipped. |
| 141 | iPad round 3 β backpack tap, stats card position, Server Rules NEW | FIXED (Aug 4): The B button only listened for a mouse-click event and its open hook is registered at the very END of the big inventory script, so an iPad tap either missed the click or hit a still-empty hook and silently did nothing β it now uses the touch-native press event and waits for the hook instead of giving up. The stats card's mobile overlay only kicks in under 1000px, so iPad (~1180px) got the desktop position and the 326px card hung ~21px off the right edge β touch tablets now slide it left to keep a 24px margin (desktop untouched). Server Rules hopped through a hand-off into a separate rules script with a server round-trip and three silent bail-out points β the Help hub now owns its own rules modal that opens instantly from a built-in copy of the rules and refreshes from the server. Test on iPad: tap B β backpack grid opens; TAB β tap a player β stats card sits fully on screen, comfortably left of the edge; HELP β Server Rules β rules modal opens and closes with its β. |
| 142 | Universal Car HUD v1 NEW | NEW SYSTEM (Aug 4): One consistent status card, bottom-right, in EVERY drivable car with zero per-car setup: big MPH (same numbers as the center speed bar), engine chip (green when running), current gear (D1/N/R), P-brake (red when on), lights, live π/π lock chip, and the car's name + plate. Cars without A-Chassis (like the Defender) just show the reduced set instead of erroring, and it's purely ADDITIVE β every existing per-car dashboard is untouched until you approve retiring them. Play-tested live: driver view in a Tahoe (engine/gear/lock all correct), passenger view in the R32, and it cleanly disappears on exit. Test: get in several different cars (Tahoe, Crown Vic, R32, a job truck, the Defender) β consistent HUD bottom-right: MPH, engine chip, gear, P-brake, lights, lock, name+plate β passengers see the reduced version β exit β it disappears. Tell me what to add/change β v2 will restyle and start retiring the broken per-car dashboards. |
| 143 | Supervisor campaign hat β visible but locked "Sergeant+" TEAM NEW | VERIFIED IN CODE (Aug 4) β this is already built, needs your eyes: the SASP Supervisor Hat exists in the locker tagged for San Andreas State Police with a rank gate at Sergeant (level 3 on your SASP ladder: Trooper β Senior Trooper β Sergeant β Post Commander), and the locker draws rank-gated items as visible cards with a lock overlay + the reason "Sergeant+" β the same visible-but-locked treatment as the Fire Cairns helmets. Test as a low-rank SASP trooper: locker β Hats β you should SEE "Supervisor Hat" greyed with a lock and "Sergeant+" (not hidden), and tapping it should refuse rather than equip; at Sergeant it should equip normally. If it's still hidden for you in-game, screenshot the Hats tab and I'll chase the client-side filter. |
| 144 | XP not saving β REAL data-loss bug found + fixed NEW | ROOT CAUSE FOUND + PLAY-VERIFIED (Aug 4): you were right that XP was resetting. The rank system saves from its own internal table, but every XP award in the game (arrests, deliveries, fishing, EMS revives, the admin XP editor β all of it goes through one shared award function) was writing only to the live counter and never telling the save system. So earned XP existed for that session and vanished on rejoin β the only thing that ever persisted was the slow playtime tick. A new bridge now mirrors every change of your XP counter into the save data (plus a 30s reconcile and a final sync the moment you leave, before it writes). Play-verified: simulated an award of +777 XP β saved data matched instantly (4050 β 4827), then restored correctly. Test: earn XP on a job β note your XP/rank β rejoin β your XP is still there. |
| 145 | Car radial β owner text gone, opens with E NEW | VERIFIED DONE (Aug 4): both parts of your ask are in β the hub center now shows the car's model name (never the owner-y spawn name) with a live π/π lock line under it, and the hover prompt is the standard E-interact look ("E Β· CAR OPTIONS", key-cap styled, π on touch) with E opening it like every other interact in the game (G still toggles for muscle memory, Esc closes). Test: walk up to your car β "E Β· CAR OPTIONS" pill appears (π if locked) β press E β radial opens with the car's name in the middle, no owner text β lock/unlock updates the hub live. |
| 146 | Fish shop bait tiles β the green square is gone NEW | FIXED (Aug 4): root cause β every shop row asked for a rotating 3D model preview, but the only models the game has are the three rods; worms/minnows/chum had nothing to clone, so their tile fell through to a flat tinted box (your "green square"). All three baits now draw their own icon instead of trying for a model: a segmented pink worm on dark soil, a pair of little silver minnows, and a chopped-up red chum tile β all on the shop's dark rounded plate, so nothing ever reads as broken. Test: talk to Joe at the pier β π£ RODS & BAIT tab β scroll past the rods to the BAIT section β Worms, Minnows and Chum each show a real drawn icon (rods still spin as 3D previews). |
| 147 | Rods locked by fishing level + priced up NEW | FIXED (Aug 4): rods are now shown but locked behind your fishing level, exactly as you asked β Blue stays the cheap starter (Lv 1, $50), Carbon is Lv 5, $750, Golden is Lv 12, $3,000. A locked card keeps its picture and price but gains an amber outline, a π line reading "Requires Fishing Level N β you are X", and the BUY button turns into "π LEVEL N". The client lock is only cosmetic: the server refuses the purchase too (it re-checks your FishingLevel before it ever touches your money), so there's no way to buy a Golden rod at level 1 even with a modified client. Test: at a low fishing level open Joe's β RODS & BAIT β Carbon and Golden are visibly locked with the level shown β tap one β you get "Locked β reach Fishing Level N" and no money leaves your wallet β level up past it and the same card turns back into a normal BUY. |
| 148 | Dumpster diving β press E, and it finally reacts NEW | FIXED (Aug 4): diving was a 2.5-second hold that gave you nothing until a toast popped, so it felt like nothing happened. It's now a single press of E, followed by a rummage sound and a short "π DIGGINGβ¦" bar over the bin before the result lands β and if you walk off mid-dig it cancels cleanly instead of burning that bin's 4-minute cooldown. Second half of your report: the Bin Man "Pick up the bin" prompt really was sitting on 8 dumpsters named P2 and 4 trashcluster01a props that have nothing to do with the garbage route β those prompts are now off, and the 8 P2 dumpsters are diggable instead. The 10 real Bin Man bins were left completely alone. Test: walk to a P2 dumpster β no "Pick up the bin", you get "Dig through" β tap E once β sound + digging bar β find/flavour toast. Then check a normal green Bin Man bin still says "Pick up the bin" and still gives you the trashcan as Bin Man. |
| 149 | Rivian EDV β cargo door opens AND closes at the rear NEW | FIXED (Aug 4): the showroom Rivian's rear handle had already been made a toggle, but the template the delivery job actually spawns from was never updated β it was still open-only, disabling itself the moment the door opened and handing "close" to a tiny latch down by the bumper that nobody ever finds. All three copies (job template, dealer template, display van) now run the same rear-handle toggle, and each one also grows a proper "E Β· Open Cargo Door / Close Cargo Door" prompt on that rear handle, so it behaves like every other interact in the game. The label follows the door's real state, so it stays honest even if you use the old latch. Clicking the handle still works exactly as before. Test: spawn your Rivian β walk to the back of the van β prompt reads "Open Cargo Door" β press E (door opens, prompt flips to "Close Cargo Door") β press E again β it closes, from the rear, without hunting for a latch. |
| 150 | Rob ATM β civilians only, and only with a drill NEW | FIXED (Aug 4): the "Rob ATM" prompt was created by the server on all 3 ATMs with no filtering, so everyone saw it β cops included (it only refused them after they pressed it), and it showed whether or not you had a drill. Now a client gate hides the prompt entirely for Police / State / Sheriff / SWAT / Fire & Rescue / Moderation and for anyone without a Drill in hand or backpack, and the ATM you can crack gets an amber outline so it reads at a glance. The visibility is only cosmetic β the server re-checks your team and that you're holding a drill before anything happens, so a modified client still gets refused. With the drill now mandatory the slow no-drill crack was dropped (7s, full haul). Test: as a cop walk to an ATM β no prompt at all. Switch to Civilian with no drill β still no prompt. Buy a Drill at the black market β prompt appears reading "Rob ATM / π³ Requires Drill" with the machine outlined β hold E β cracking bar β dirty cash + cops pinged. |
| 151 | Stats card β more stats, now in categories NEW | FIXED (Aug 4): the click-a-name card was one flat list of 13 rows. It's now split into labelled sections β COMBAT / LAW ENFORCEMENT / FIRE & EMS / CRIME / JOBS / FISHING / GENERAL β and picked up every other counter the game was already keeping but never showing: fires extinguished, fire parts put out, fire calls worked, fishing level, angler rank and fishing XP. Fishing had no lifetime catch counter at all, so one was added (it starts at 0 and ticks up per catch from now on). Nothing invented β every row maps to a number something in the game actually increments. Row styling and the scroll are unchanged, so the tablet/mobile layout still fits. Test: hold TAB β click a player's name β card opens with blue section headers and the β still closes it β catch a fish β reopen your own card β FISHING β "Fish caught" went up. |
| 152 | Dealership RETURN on the car's own card + big-house doorbell straightened NEW | FIXED (Aug 4): "Return to Garage" only existed on the right-hand panel, and the moment you clicked a car in MY VEHICLES that button turned into Sell β so there was no way to store a car from the list. Each owned car that's currently OUT now carries its own β© RETURN button on its card; it fires the same server event as before (which only ever destroys your own vehicle, rate-limited), then refreshes the list. Separately, the doorbell on the big house (Seaview) mounted side-on to the porch because its front-door panel faces along a different axis than the other two templates β it's now yawed 90Β° to the right so it faces whoever's at the door, with a per-house DoorbellYaw setting if it ever needs nudging. Test: spawn a car β dealership β π MY VEHICLES β that car's card shows OUT and an β© RETURN button β click it β car stores and the badge clears. Then buy/visit a Seaview house with a doorbell and check the bell faces you square-on at the front door. |
| 153 | Revive depth β placeable Trauma Bag + working Lifepak 15 NEW | NEW SYSTEM (Aug 4): two real EMS tools now sit in the Fire & Rescue loadout next to the Medkit and Stretcher, and nothing about the old revive/stretcher flow changed β this is bolted on top of it. π§° Trauma Bag: activate it to set it down on the ground in front of you (it drops with a thud, gets a floating "TRAUMA BAG β faster care within 15 studs" tag and a "Pick Up" prompt). While it's down, every treatment and revive within 15 studs runs 35% faster β the Medkit revive channel, the walking-wounded treat, and MedCore's per-injury treatments all read it β and the first time it helps you, you get a "π§° Trauma bag on scene β faster care" toast. It stays until someone picks it up, the owner leaves, or it sits untouched for 10 minutes. Only Fire & Rescue can place or pick one up, and you can only have one out at a time. Bonus: while the bag is on the ground it still counts as carrying the trauma kit, so putting it down doesn't lock you out of treating bruises/lacerations. π« Lifepak 15: the monitor from the old disabled Vismer kit was harvested (scripts stripped, re-welded from scratch) into a working tool. Activate it next to a downed patient and a dark monitor panel opens on the right with live vitals driven by MedCore's real stability number β a beating ECG trace, heart rate, blood pressure, SpOβ, stability % and a status line that moves through STABLE β UNSTABLE β CRITICAL β FLATLINE as they bleed out. π« ANALYZE runs a short channel and then prints the patient's actual injury list on screen (β for untreated criticals, β for ones you've already fixed). If they've flatlined, β‘ SHOCK lights up red: a 3-second charge that brings the rhythm back once per arrest (45s cooldown) and leaves them at 14% stability β CRITICAL but revivable, so you still have to clear their critical injuries before the revive will take. It will not resurrect someone twice, and everything (team, range, the shock rule, both channels) is enforced on the server β the panel only displays and asks. The monitor closes itself if you walk more than 22 studs away, put the tool away, or the patient gets back up. Test: join Fire & Rescue β check your backpack has Trauma Bag and Lifepak 15 β find a downed player β activate the Trauma Bag to drop it beside them, then revive with the Medkit and watch the bar fill noticeably faster than normal β walk back and press E on the bag to pack it up. Then activate the Lifepak on a downed player β monitor opens with their name and a live trace β hit ANALYZE β injury list appears β let someone flatline (stability hits 0) β SHOCK turns red β hold it β "β‘ ROSC" and they're back at CRITICAL, treatable again. |
| 156 | The tree that burned forever with nobody on Fire NEW | FIXED (Aug 8): found the actual cause, and it's a nasty one. Fire spreads from a burning part to anything nearby inside the "Flamable Structures" folder β but the spread code never checked which structure it was jumping into. So a fire in the Motel or the Church could reach across and light a tree in Forest, and because nobody ever called PutOnFire on Forest, the game's own bookkeeping still said "Forest is not on fire." That one flag is what everything else reads: the MDT never listed it, the 5-minute unattended auto-close never saw it, the auto-resolve never saw it, and β the killer β "put every fire out because the last firefighter left" walked the list of burning structures, found none, and did nothing. The tree kept burning, re-spreading to its neighbours every few minutes, until the server died. Four things changed: (1) spread is now contained to the structure it started in, so it can't create an untracked fire; (2) spread-lit parts inherit the parent fire's payout callback, so they actually resolve the call instead of burning anonymously; (3) "put everything out" now does a hard sweep of the whole folder and extinguishes every burning part regardless of who's tracking it β that alone would have killed your tree; (4) three places where a single bad part threw an error and silently abandoned every remaining part mid-extinguish are now guarded per-part with a force-extinguish fallback, and a restore step that could crash on a missing attribute is nil-safe. Added on top: a hard 20-minute ceiling on any fire call, and a new FireReaper watchdog that sweeps every 30s for burning FX that no active call owns and kills it after a 2-minute grace (60s if nobody's on Fire at all) β it skips vehicles, characters, decorative torches and anything under 2 minutes old, and warns to the console every time it reaps, so if this ever recurs there'll be a log line naming the exact part. Test: it can't be triggered by hand in a normal round β instead confirm it stays quiet: play with nobody on Fire & Rescue and nothing should ever be alight; join Fire, let a call spawn, and confirm the fire lives, spreads within its own building, tones out on the MDT and pays out normally; then leave the Fire team mid-call and confirm the fire is fully out within seconds and no stray flames are left anywhere on the map. |
| 157 | Wheels vanishing off cars NEW | FIXED (Aug 8): couldn't reproduce it live, but found the mechanism that explains "randomly, or when someone gets out". The place runs with StreamingEnabled, and every car was set to stream piece by piece. A car's wheels are a separate physics assembly from its body, so the client is free to load the body and not the wheels β and the moment you exit, the streaming focus jumps from the vehicle back to your character, which is exactly the kind of nudge that drops the edge parts. All 93 vehicles (spawn templates in Vehicle_Storage and the parked/display copies in Workspace) are now Atomic: a car streams in and out as one whole unit, so a half-loaded car can't exist. Two real bugs fixed alongside it: (1) six cars β Chevy Silverado, Chevy Tahoe, DOT Silverado and the McLaren P1 β carried a stray Humanoid with "requires neck" on, no Head part, and break-joints-on-death enabled. That humanoid dies on spawn and Roblox then tears the model's joints apart; all six are neutralised. (2) the McLaren's "Wheel Blur (Decal Version)" plugin had been dropped into the Plugins folder instead of into a wheel, so it threw "Velocity is not a valid member of Folder" on every pass forever, and had no path to put the rim decal back if it errored while the blur was showing. It now finds a real wheel or exits quietly, and always restores the rim. Backstop: a new WheelGuard records every car's wheel baseline (each visible wheel part's transparency and its exact offset from the hub) ~12s after it spawns, then every 20s checks parked, empty, stationary cars and puts back anything that went invisible or physically drifted off the hub β it re-welds and snaps it home. It's deliberately narrow: it only touches the visuals A-Chassis welds to the spinning hub (brake calipers and suspension parts are left alone), it never "fixes" a part that was invisible to begin with, and if a single scan wants to change more than 12 parts on one car it refuses and warns instead. Verified in a play test: across 33 cars and 982 tracked parts it made zero unnecessary changes; when a wheel part was forced invisible it restored it, and when one was unwelded and thrown 30 studs away it re-attached it β both logged. Test: spawn a car, drive it, get out, walk 200 studs away and come back β all four wheels present every time. Repeat with a Silverado / Tahoe / McLaren. If a wheel ever does go missing, the server console will now carry a [WheelGuard] line naming the car and part. |
| 158 | T12 β the "Player died" popup NEW | FIXED (Aug 8): found it, and here's why it hid for weeks. There were two death notifiers, and the loud one was invisible to every text search we'd run. The card you screenshotted came from a free-model kit β ReplicatedStorage β framework β Systems β Notification System β whose server module is obfuscated with Luraph, so its strings ("Player died", "<name> has died.") are encrypted inside the bytecode and simply do not exist as searchable text anywhere in the place. That's the honest reason previous sessions kept coming up empty. What gave it away was its Config module, which is plain text and carries a switch: playerDied = true. The obfuscated code reads that switch and pushes the message out through the normal toast HUD as an "error" (dark red) card on the right β exactly what you saw. That switch is now false. Separately, a second, older popup lived in StarterGui β Leave/Join β notif (join/leave popups had already been turned off in it, but the death one was left in) β its death handler is now short-circuited and the script disabled. Verified in a play test: died three times, zero notification cards and no "died" text anywhere on screen. Test: die (any way) β no red card appears on the right, no popup at all. Team-change, purchase and bail toasts should all still work normally. |
| 159 | Keep your clothes when you die NEW | FIXED (Aug 8): the outfit-restore system existed but was losing a race it can only win in Studio. The old version took one snapshot of your shirt/pants when you died and wrote it back once, on a blind 2.2-second timer. Roblox re-stamps your avatar's own appearance onto the character asynchronously after respawn β in a solo Studio test that lands in about 0.4s so the 2.2s write survived, but on a real server with a full lobby the appearance fetch regularly arrives later than 2.2s, lands on top of the restore and wipes it. (This is the same trap the walk-style script documents for animations.) It also captured nothing at all if the corpse had already been stripped, in which case it would apply a stale outfit from an earlier life, and it never retried. Rewritten: it now keeps a live snapshot (refreshed while you're alive, on death, and on despawn, so it's never stale or empty), waits for the character to actually be in the world and for the appearance to finish loading rather than guessing at a timer, then verifies and re-applies every 0.4s for six seconds and re-asserts once more three seconds after that β so a late locker, team uniform or appearance stamp can't stomp it. The documented exception is kept: change team while dead and you get the new team's uniform instead. Verified in a play test β put on a distinct uniform, died, respawned: the uniform was back within half a second and still on at 6 seconds; a second death in a row behaved identically. (Before the fix, the same test spent 2.5s in the wrong clothes.) Test: wear your normal look, die, respawn β you look like yourself immediately. Then get a locker uniform, die, respawn β still in the uniform. Then die and switch teams while you're down β you should come back in the new team's uniform. |
| 160 | F7 mouse-debug overlay now actually appears NEW | FIXED (Aug 8): the tool was real, it just could never open. F7 is a key the Roblox CoreGui reserves β Studio's own input API refuses to send it, with the message "key is permanently bound to a CoreGUI core action" β which means every F7 press reaches game scripts flagged as "already handled". The old script's first line was "if already handled, ignore", so the toggle never once fired: nothing on screen, nothing in the console, no way to tell it was even alive. The overlay is now rebuilt and reachable: F7 is honoured regardless of that flag (still ignored while you're typing in a text box) and is also bound through a second, higher-priority input path with a debounce so the two can't cancel each other out. The panel itself moved from a tiny 236Γ158 card tucked under the minimap to a large titled panel top-left with a "MOUSE DEBUG (F7)" header bar, and it now re-asserts its own visibility every frame β plus it's been added to the intro menu's never-hide list β so no HUD guardian can quietly switch it off. It shows live: MouseIconEnabled, MouseBehavior, the GUI inset, whether any modal button is active (and its path), camera type, raw + hit-test mouse coordinates, the top-most UI element under your cursor with its full path, VehicleMouseLock, focused-text-box state, a rolling log of the last 5 changes to MouseIconEnabled/MouseBehavior, and β since Roblox gives no caller information on those changes β the list of the 8 scripts in this place that actually write them, so you know exactly where to look. Verified in a play test with a screenshot: panel opens, populates live, survives a simulated guardian trying to hide it, and closes again. Test: press F7 in game β big dark panel with a blue "MOUSE DEBUG (F7)" bar appears top-left β move the mouse and watch the values update β press F7 again to close. Next time the cursor vanishes (T02), open this first and tell me what the last line under "LAST 5 MOUSE CHANGES" says. |
| 161 | T16 β radio mic sound louder NEW | FIXED (Aug 8): both mic sounds played at a flat volume of 0.5. The key-up (mic ON) beep is now 0.8 and the mic OFF beep 0.65 β the off tone was raised by less on purpose so the pair still feels balanced rather than the release being as loud as the key-up. Nothing else about the radio changed. Test: open the radio, press [ (or click MIC) β the go-live tone is noticeably louder β press it again β the off tone is a touch louder but still clearly the quieter of the two. |
| 162 | Vehicle violation logging re-enabled NEW | DONE (Aug 8): vehicle-related exploit logging is back β but NOT by re-enabling the old script: that "logging" lived inside the entire legacy vehicle spawner, which was disabled when your current spawner replaced it, so switching it on would have resurrected a second competing spawner (dupe spawns / pad conflicts). Instead the logging half is reimplemented standalone and watches the live systems: driving someone else's LOCKED car (cops exempt β they may commandeer; unlocked cars are fair game and already covered by the break-in system), and driving a job vehicle while off that team. Both report to your Discord Moderation channel + the MDT log, with anti-spam cooldowns. Test: have a buddy lock their car β drive it as a civ β a Moderation entry appears; hop in a Fire/DOT truck while Civilian β violation logged. |
| 163 | Phone Upgrades gamepass β actually works now NEW | FIXED + EXTENDED (Aug 8): the 129 R$ Phone Upgrades pass has been on sale but did literally nothing β the phone read the pass ID from ReplicatedStorage.Config.PhoneUpgradeGamepassId, and that value had never been created, so every player (including buyers) read as "doesn't own it". That value now exists and points at 1872755093. On top of that: ownership is re-checked the instant you buy (the Sounds page rebuilds itself β no rejoin needed), 5 more premium ringtones were added (Night Pursuit, Heist Tension, Most Wanted, Stakeout, Cha-Ching β all reusing audio that's already playing in the game, so no "asset not approved" risk), and 3 premium wallpapers (Aurora, Ember, Neon β gradients, no new image IDs) now sit at the end of the wallpaper grid with a β tag. Also new: PassAuditServer prints a one-line-per-gamepass startup summary in the server console (name / price / on-sale / where it's wired) β it currently reports all 7 passes healthy, 0 problems. Test: (1) phone β Settings β Sounds β the 10 premium ringtones show [PREMIUM]; if you don't own the pass the row is greyed with a BUY button that opens the purchase prompt, and the footer note reads "β Premium ringtones and wallpapers unlockβ¦". (2) As an owner it says "β Phone Upgrades owned" and every tone plays/selects normally. (3) Phone β Settings β Customize β wallpapers: Aurora / Ember / Neon show a β and are dimmed for non-owners; tapping one opens the buy prompt instead of applying. (4) Buy the pass mid-session β the premium rows unlock without rejoining. (5) Check the server console on startup for the [PassAudit] block. |
| 164 | Gift a gamepass to another player NEW | NEW SYSTEM (Aug 8): you can now buy any of the 7 gamepasses for someone else. Roblox can't transfer a real gamepass, so each pass has a matching gift Developer Product; when you pay, the server writes a permanent entitlement for the recipient and every gate in the game (SWAT/BCSO team change + their vehicles, Golden Deagle, Luxury Housing slots, x2 XP, x2 Paychecks, Phone Upgrades, gamepass doors/barriers) now asks one shared check, so a gifted pass behaves exactly like a bought one. How to open it: the new π GIFT icon in the top-right icon row (left of the π inventory icon), the I key, or _G.OpenGiftUI(). The phone was NOT touched. Flow: pick a pass (live Robux prices) β pick who (in-server list with avatar headshots, or type a username for someone offline) β confirmation screen with their avatar, display name, @username, the pass and the price β GIFT THIS β Robux prompt. Duplicate protection (James's #1 ask) is checked in four places: the recipient list greys out anyone who already owns it ("ALREADY OWNS IT"), again when the confirm screen opens, again the moment you press GIFT THIS, and one last time at receipt time β if they somehow own it by then nothing is granted, you get a clear "Gift NOT delivered" toast and it's logged loudly to the staff webhook. Receipts are idempotent (Roblox re-delivering the same purchase can never grant twice) and the entitlement is written and verified before the purchase is marked complete. Offline gifting works β the pass is stored against their user ID and applies the next time they join. Staff: the gift window gains a STAFF tab (Senior Admin+ can view, Community Manager/Founder can grant/revoke) listing all 7 passes for any player with OWNED (Robux) vs GIFTED by <who>, plus GRANT / REVOKE buttons; the admin panel also gets Player Info β View Owned Passes, Give Gamepass (type name) and Revoke Gifted Pass (type name). Every grant/revoke is audited like any other admin action. Test: (1) press I or click the π icon β the gift window opens showing 7 passes with real R$ prices. (2) 2P pick a pass β your friend appears in the list with their avatar β select β confirm screen shows their headshot + display name + @username + pass + price. (3) Pick a pass your friend ALREADY owns β their row is greyed with "ALREADY OWNS IT" and can't be selected. (4) Type a username of someone not in the server β FIND β confirm screen appears; a made-up name gives "No Roblox user calledβ¦". (5) Actually buy one for a friend β they get a "π You got a gift!" toast, you get "Gift sent!", and the pass works for them immediately (e.g. gifted SWAT β they can join the SWAT team and drive the Bearcat). (6) Try to gift yourself β refused. (7) ADMIN gift window β STAFF tab β pick a player β GRANT a pass β they get it instantly; REVOKE removes a gifted pass (a real Robux purchase can't be revoked and says so). (8) ADMIN admin panel β Player Info category β View Owned Passes on someone β the list shows which are Robux-owned vs gifted and by whom. |
| 165 | Police radio vs the normal chat box TEAM NEW | FIXED (Aug 8): two separate problems were stacked on top of each other. (1) Roblox's default chat window lives in the top-left corner β the exact spot the radio dock sits in, so the two were drawn over each other. (2) Worse, a July change made a duty player's normal chat get swallowed into the radio just because the radio was on screen β so on a police team you literally could not speak locally without hiding the radio first, and there were two competing places to type. Now: the mic ([) is the switch. Mic OFF = your chat is ordinary local chat and the radio's "Calloutβ¦" box is the one obvious way to talk on the radio. Mic ON = the header says "MIC LIVE β your chat goes to the radio" and your chat becomes radio traffic (exactly what the UI always promised). Nothing is ever disabled β while the radio is up the default chat window is just parked at the bottom-left (kept compact so it can't creep back up into the dock), and it snaps back to the top the moment you hide (β), collapse or switch the radio OFF. Test: go on a police team β radio appears top-left, default chat now sits bottom-left, nothing overlapping β type in normal chat with the mic off β it shows as normal chat and does NOT appear in the radio β press [ (mic LIVE) β type in normal chat β it now goes out as radio traffic and does NOT show in local chat β press [ again β back to normal β press β to hide the radio β chat window returns to the top-left as usual. |
| 166 | Radio polish pass β key hints, unit status, mic indicators, volume TEAM NEW | POLISHED (Aug 8): seven things off the Maple reference shots, kept in our own look. (a) Key hints moved onto the buttons β MIC ( [ ), PANIC ( ` ), CODES ( T ), β =, and ( - ) sits on whichever channel tab you'd press to switch to; the old cramped hint line now explains the chat rule instead. (b) Per-unit MIC light in the UNITS list β a small mic icon on each unit's row that lights green while that unit is keyed up, and dims when they let go. (c) Speaking chip above the head β a small green "π€ <callsign>" tag floats over a unit's head only while their radio mic is live (built and destroyed on the key-up, so it costs nothing when idle); it's driven by the same signal as the roster light, so the two can never disagree. (d) Unit status in the roster + a status selector on the dock β each row shows a coloured dot and its short status (10-8 AVAILABLE / ON SCENE / 10-7 UNAVAIL / TRAFFIC STOP), and a new STATUS row lets you set 10-8 / ON SCENE / 10-7 without opening the MDT. This reuses the existing MDT status system β it's the same status the MDT and dispatch already see, not a second one. (e) Active count in the header β the panel now reads "UNITS Β· Active [4]" with the channel scope underneath. (f) Radio volume slider under the log, controlling the radio's own sounds (key-up/key-down, panic tone, clicks); it saves to your account like the other settings. (g) Message rows are now a team-coloured callsign pill + text ("[225] : en route") instead of a bracketed prefix, with a small ALL chip on cross-agency traffic. Also fixed along the way: the header title was clipped to "CH RADIO" (it had no size set), and DOT units now show up in the roster like they always should have. Test: on a police team β every button shows its key β send a message β it renders as a coloured pill + text β hit [ and watch your own row's mic icon light up and a π€ chip appear over your head (get a 2nd player on duty to confirm they see yours too) β click ON SCENE in the STATUS row β your roster row and the MDT both show On Scene β drag the VOLUME slider down β the mic key-up beep gets quieter β rejoin β the volume setting stuck. |
| 167 | Inventory drag β REAL root cause, my regression NEW | FIXED (Aug 8) β and it was my bug: your F7 capture showed GuiInset (0,58), the exact number in this file's old comments. The inventory GUI is set to ignore that 58px inset, meaning its positions are already full-screen β but my Jul 23 "fix" assumed the opposite and subtracted 58px from every drop test, so grid drops died. Separately the hotbar path compared an inset-space mouse against a full-screen rectangle, so hotbar drops had been dead too. Both now use one consistent coordinate space, documented in the file so it can't regress again. Test: drag item β slot glows β drops in; drag a gun onto the hotbar β pins to that slot; drag to trash. |
| 168 | Dragged cash dying mid-hold + the stuck square NEW | FIXED (Aug 8): holding a cash drag "just stopped" because any inventory refresh cancelled the drag in progress β refreshes now wait until you drop. The leftover square top-left that followed your cursor and outlived the inventory was the drag ghost stranded by a failed drop; the ghost layer is now force-cleared on every drag end, plus a watchdog kills any drag whose button/finger is no longer held. Test: pick up cash and hold it 10+ seconds β still held; drop it β lands; no square lingers after closing. |
| 169 | Full-screen effect sitting on top of the whole UI NEW | FIXED (Aug 8): your F7 readout showed Top GUI under cursor: FallDamageFX.Frame while standing still on flat ground β the fall-damage red flash is a full-screen frame on the highest layer in the game that existed permanently and was merely transparent. It's now hidden and non-interactive except during an actual flash. Test: F7 β "Top GUI under cursor" should now name a real UI element (or none), not FallDamageFX. |
| 170 | Cursor disappearing / getting stuck (T02) NEW | HARDENED (Aug 8): your F7 log caught the actual behaviour β MouseBehavior flipping Default β LockCurrentPosition ~5 times in 2 seconds: the cursor guardian frees it, something re-locks it, repeat. The guardian was polling too slowly (0.8s) and waiting for two bad samples, so it kept losing. It now polls every 0.25s, acts on the first bad sample, and force-restores for 2.5s after you alt-tab back in (your exact repro). All legitimate holders β actually aiming, cutscene cameras, shift-lock, driving, a held mouse button β are still exempt. Test: play normally + alt-tab in/out; if the cursor still vanishes, hit F7 and send the log again β the writer list will narrow it further. |
| 171 | Radio VOICE β talk on the radio, heard map-wide 2P NEW | NEW SYSTEM (Aug 8): keying the radio mic now carries your actual voice, not just your typed callout. While you hold the mic live, everyone on your channel hears you anywhere on the map β your mic is wired straight into a flat, non-3D "radio" bus on each listener's client (with a light band-limited radio colour on it), instead of only reaching people standing near you. Un-key, switch channel, go off duty, or turn the radio OFF and the wiring is torn down again. Channel rules are unchanged and still server-enforced: your team's primary = your agency only, DISPATCH = every emergency service; civilians never transmit or receive. Your existing radio volume slider also sets the voice level, there's a new MUTE MIC button on the dock, and the dock shows a live "Voice: ready / listen only / unavailable" readout. Also fixed along the way: hitting OFF (or hiding the radio) while your mic was live left you still transmitting β it now drops the mic properly. If a player has voice chat disabled (not age-verified, no mic, voice off): nothing breaks and nothing errors β they simply can't transmit, they can still hear others, and the text radio, roster, mic glyphs and head chips all behave exactly as before; the dock just reads "listen only" or "unavailable". Test (needs 2 people, both with voice on): 1) both go on duty on the same agency, one of you drive far across the map β key [ and talk; the other should hear you clearly at any distance, and see your mic glyph + π€ chip light up. 2) Un-key β voice stops immediately and you're back to normal nearby-only voice. 3) Stand right next to each other and key up β you should hear ONE copy of them, not an echo/double. 4) One of you switch to DISPATCH and the other stay on team primary, on different agencies β team-primary talk should NOT cross agencies, DISPATCH talk should reach everyone. 5) Turn the radio OFF while keyed β transmitting must stop. 6) Try MUTE MIC β your mic goes dead everywhere until you un-mute. |
| 172 | Pure-digit "sweeper" hunt β NOT FOUND (no culprit) NEW | NEW (Aug 8): spent this session hunting the long-standing bug where anything showing only digits (a label reading "250") supposedly gets hidden/blanked about once a second. Honest result: it did not reproduce and no culprit was found β nothing was changed. What was actually done: every script in the place was scanned for obfuscation (7,661 scripts; 55 flagged, incl. Luraph-packed Paycheck System.Core.Server, Notification System.Core.Server and the single-line Sentinels City handlers) β none of them sweeps text. Then a live bisect: 200+ canary labels were planted in-game (7 at PlayerGui root, 196 spread across all 98 ScreenGuis, 4 planted by the server, plus a BillboardGui and a SurfaceGui out in the world), each with pure-digit text ("250"/"7"/"1000") paired against a control ("a250"/"hi"/"$250"), all watching .Visible, .TextTransparency, .Text and .Parent. Alongside that, a census re-scanned every real digit label in the whole UI 902 times over ~7.5 minutes. Result: zero digit-specific events. The instrumentation was proven working β it instantly caught a real hider (XPHudVisibility deliberately hammering the paid kit's LevelGui), but that hits digit and non-digit labels equally, so it is not the sweeper. Ruled out: obfuscated free-model scripts, anything scoped to a particular ScreenGui, server-side hiding, BillboardGui/SurfaceGui, and the framework kit's uiRemove remote (it only destroys whole ScreenGuis by name). Next step if it ever returns: reproduce it live, then hit F7 β the exact label and property are what's missing. It may also have been fixed incidentally, or be a Studio plugin rather than a game script. Test: nothing to test β the RichText workaround in the radio callsign pills was left exactly as it is. |
| 173 | Universal door system β tag-driven, lockable, incl. bank doors NEW | NEW (Aug 8): new opt-in door system (UniversalDoorServer + UniversalDoorClient). A door does nothing at all until it's tagged, so no existing door changed behaviour β HousingV2 doors are untouched and are hard-blocked from ever being managed, as is the Bank Robbery V2 vault kit. Tagged doors get a smooth server-driven 90Β° swing, a proximity prompt (E), auto-close after ~5s, and optional locking by team or staff rank. Locked + not authorised = the door stays shut, you get a red "β¦ is locked." toast and a denied sound; authorised players walk through and can hold H to lock/unlock. Everything is server-authoritative β the client only draws the toast and hides the lock prompt from people who obviously can't use it; the server re-checks team and StaffRank on every single action. Double doors are handled by sharing a UDoorGroup, so one prompt swings both leaves. Also fixed the bank doors: the old free-model DoorManager drove Motor.DesiredAngle on anchored parts and called the long-removed FindPartsInRegion3 API β i.e. the bank front doors never opened at all. That script is now disabled and the doors run on the new system. 6 demo doors are already tagged. Test: 1) Bank front doors (main entrance) β press E β both leaves swing open together and auto-shut ~6s later; as a civilian they open fine, and any police/sheriff/SASP/SWAT unit can hold H to lock them β once locked, civilians get the "Bank Entrance is locked." toast and the doors won't budge, while police still get through. 2) BCSO interior, office door β plain unlocked door, opens for anyone, no lock prompt shown. 3) BCSO rear door β starts locked: as a civilian you get the locked toast + rattle; switch to a police team and it opens, then hold H to unlock it. 4) BCSO cell block β double door, one E opens both leaves. To tag more doors yourself: select the door (a Model, or just the door leaf Part) and either add the attribute UDoor = true in the Properties panel, or paste this into the Studio command bar β require(game.ReplicatedStorage.UDoorTagger).tag(workspace.Some.Door, {lock="police", name="Front Door", swing=90, hinge="left", auto=5}). Useful options: lock = none/police/fire/dot/staff/key, group = same string on two leaves makes a double door, swing = degrees (use -90 to mirror), hinge = left/right, hingePart = name of a hinge part for prefab kits, auto = auto-close seconds (0 = never). require(game.ReplicatedStorage.UDoorTagger).list() prints every tagged door. |
| 174 | Progression rework β harder curve, real XP for work, rank perks, purchasable rank-ups NEW | NEW (Aug 8): First, the honest framing: this game does not have numeric levels 1β50 β progression is a per-team rank ladder (3β9 ranks per job) held in the paid uxr kit, so "level 40" doesn't exist and nobody can be at one. What was wrong: the ONLY thing that gave XP was a passive drip of 75 XP every 5 min = 15 XP/min just for standing on a team. Bin Man, Delivery Driver, DOT and fishing awarded zero XP for actually doing the job, so AFK-ing on duty levelled you exactly as fast as working. Old times: PD Chief (20,000 XP) = 22 h of idling; Bin Man top rank = 5.6 h; Civilian "Paleto Bay Legend" (120,000) = 133 h. What changed: (1) the passive drip is cut to 25 XP / 5 min = 5 XP/min; (2) doing real work now pays XP β bin tipped +8, delivery stop +30, wreck towed +60, revive +30, citation +20, arrest +40, crime job +25, fish +4, tree felled +6, log sold +3 (all still doubled by the x2 XP pass / XP events). Net effect: idling is now ~3x slower than before, actually working is ~2x faster β PD Chief is now ~67 h of idling but only ~13 h of real police work. (3) Early ranks now arrive in minutes β rank 2 on most teams dropped from 1,000β3,000 XP to 250β500 XP; (4) the three 3-rank job ladders (Bin Man / Delivery / DOT) gained two new top ranks each (e.g. Bin Man: Sanitation Worker β Garbage Collector β Trash God β Route Supervisor (8,000) β Waste Baron (20,000) β 14 h of active work). NOBODY IS DEMOTED β verified exhaustively: stored XP is untouched and not a single XPRequirement was raised; I brute-forced every XP value 0β130,000 across all 10 existing teams and there is zero demotion anywhere. Most existing players will instead gain a rank or two (a 20,000-XP Bin Man goes rank 3 β 5; a 2,000-XP officer goes rank 2 β 4). The original kit settings are kept verbatim in ReplicatedStorage.uxrLevelSystem#RS@4.1.SettingsModule_BACKUP_Aug8. MATT MUST DECIDE: (a) I chose not to raise any top-end requirement precisely so no live player loses a rank β if you'd rather the top ranks were a much bigger grind (e.g. PD Chief at 45,000 instead of 20,000), say so; a no-demotion guard is already built into ProgressionPerksServer that tops a player's XP up to the new threshold for the rank they already held, so you can raise them safely (toggle with Workspace attribute RankNoDemote). (b) Purchasable rank-ups are ON β the perks panel has a "BUY RANK-UP" button that charges $5 per missing XP from your bank (min $500, one purchase per 10 min). That's a deliberate money sink (buying Civilian rank 4 cost $6,670 in testing; buying a top job rank costs $60,000+) but it IS pay-to-progress β set Workspace attribute RankBuyEnabled = false to kill it. Perks (server-authoritative, wired into systems that already exist): every rank gives +5% job pay per rank up to +30% (folded into _G.PayMult, so it lands on delivery payouts, tow payouts, EMS and logging automatically) and +10% paycheck per rank up to +60% (paid to bank on each 10-min payday), plus better lumberjack axes (Lumberjack job). Test: 1) click the new β PERKS icon top-right (left of GIFT) β panel shows your team, rank number + rank name, XP bar to the next rank, the buy button, and the full perk list with unlocked (green) vs π locked rows. 2) Join a job and do the job β tip a bin / finish a delivery stop / tow a wreck / write a citation β you should get a +XP toast every time, which never used to happen. 3) Check your old characters still have the same or a higher rank than before, never lower. 4) Hit "BUY RANK-UP" with money in the bank (not cash) β rank jumps instantly, bank drops, and a second attempt inside 10 min is refused. 5) Reach rank 2 on any job then get paid β the paycheck popup is followed by a "π¦ Rank Bonus" toast. |
| 176 | XP HUD hider was silently killing the ProgressionPanel widget NEW | NEW (Aug 8): XPHudVisibility exists to suppress the paid uxr kit's own XP popup (LevelGui). It was finding it by scanning every ScreenGui for a TextLabel containing the words "XP to next" β and the game's own ProgressionPanel HUD widget (team + rank + progress bar, top-right, ScreenGui ProgressionHUD) contains exactly that phrase, so it was being force-disabled every 250 ms. It has been silently missing this whole time. The hider now targets the kit by name (LevelGui and clones of it) instead of by text, and it also honours a new PBRP_HUD opt-out attribute that our own HUDs stamp on themselves, so this class of bug can't come back. Verified in play: LevelGui.Enabled = false (kit popup still suppressed) and ProgressionHUD.Enabled = true with live text "6276 / 18000 XP to next". Heads up: the panel is back but the minimap sits on top of it in the top-right corner β that's a pre-existing layout clash, not part of this fix; say the word and I'll move one of them. Test: join β look top-right under the minimap β the rank widget (TEAM / LV, rank β next rank, gold progress bar, "X / Y XP to next") is drawn and updates when you earn XP; the paid kit's big XP popup still never appears. |
| 177 | MDT now only opens from inside a department vehicle NEW TEAM | NEW (Aug 8): the PD tablet and the Fire tablet used to open anywhere on the map β standing in the locker room, walking down the street, on foot at a scene. Both now require you to be sitting in one of your own department's vehicles (any seat, driver or passenger). The check is server-side: a new MDTVehicleGate script reads your real seat every 0.4 s, walks up to the vehicle model, and matches its JobTag (LEO / FD, stamped on every car the job dealers spawn) against your team β the client only receives a yes/no and prints the toast. Hand-placed station rigs with no attributes are matched on their name instead, and you can force any model to count by giving it a DutyDept attribute of "PD" or "FD". Leaving the seat auto-closes the tablet. The DOT terminal was left alone. Verified in play: on foot as PD, U / the top-right U icon / the phone all refused to open it and toasted "MDT Unavailable β Get in a police vehicle to use the MDT"; seated in a LEO-tagged car the tablet opened normally; standing back up closed it again. Test: 1) go on duty PD or Fire, stand on foot β press U β nothing opens, you get the toast. 2) Get in your patrol car / engine (driver OR passenger seat) β U β the MDT opens as before. 3) Get out while it's open β it closes itself. 4) Sit in a civilian car on duty β still refused ("The MDT only works from a police vehicle"). |
| 178 | NEW RANK β Field Training Officer, with real trainee pairing NEW TEAM 2P | NEW (Aug 8): Field Training Officer is now a real rank on the Police Department ladder, slotted in at rank 4 (1,400 XP) between Senior Officer and Corporal. Nobody can be demoted by this: every rank above it just moved up an index, requirements were not raised, and the no-demotion guard in ProgressionPerksServer is untouched (verified β a 18,195 XP officer is still "Assistant Chief"). Reaching FTO unlocks the trainee pairing: an FTO-or-above officer gets an ASSIGN button on a new FIELD TRAINING widget (top-left of the HUD), picks a Recruit or Officer off a live server-built list, and the two are paired. Both sides see the pairing on the widget, and every 60 s that they are both alive, both on PD, and within 250 studs of each other, the trainee earns +20 XP and the FTO +10 XP (via the normal _G.AwardXP path, so it counts toward rank like anything else). The pairing ends on death, team change, disconnect, or END on either side. All of it is server-decided β the client can only ask. Only half-verified: solo in Studio I confirmed the rank shows up ("Field Training Officer 1,500 / 2,000" on the HUD), the widget renders, the picker opens, and the server correctly refuses bad/duplicate pair requests β but an actual two-officer pairing and the XP drip could not be tested with one player. That's the bit I need you to break. Test: 1) get a PD officer past 1,400 XP β HUD shows Field Training Officer. 2) Second player joins PD as Recruit. 3) FTO presses ASSIGN top-left β picks them β both get a toast and both widgets show the pairing. 4) Ride together for a minute β trainee gets "+20 XP" toast, session XP counter climbs. 5) Split up past ~250 studs β no XP that minute. 6) Trainee dies / goes off duty β pairing ends with a toast on both sides. 7) Try ASSIGN as a low-rank officer β refused. |
| 179 | NEW β physical fire-station call board NEW TEAM | NEW (Aug 8): a real wall-mounted BCF&R ACTIVE CALLS board in the fire station day room β the lounge with the couches and the two Chicago FD maps. It's on the right-hand wall as you face the far doors, past the second map poster and just left of the wooden door (world position roughly -916, 84, 344; the model is Workspace.FireCallBoard so it can be dragged anywhere). It lists up to 6 live fire/EMS calls with TYPE Β· LOCATION Β· AGE Β· RESPONDING, refreshing every 2 s, and shows the on-duty crew count in the header. Hit RESPOND on a row and you're marked as the responder on that call and get a GPS waypoint to it; a call someone else already took shows their name in green and a TAKE OVER button. Server-authoritative: the rows are written by the server straight out of the same cadCalls table the MDT and the 911 system use β there is no second list, clients only send the button press, and the server re-checks your team and that you're actually standing at the board (40 studs) before accepting. Verified in play: filed three test 911 calls β the board drew "Structure Fire / Paleto Boulevard", "Medical Emergency / Hotel", "Brush Fire / Great Ocean Highway", all UNASSIGNED β clicked RESPOND β that row flipped to my name + TAKE OVER and my waypoint was set to "Medical Emergency - Hotel" (the road router logged a 46-point route to it). Test: 1) go on duty BCF&R, walk into the day room β board reads "No active calls. Station is quiet." 2) Have someone call 911 for a fire or a medical β the row appears within ~2 s with the right type and location. 3) Click RESPOND β toast + waypoint on your minimap, board shows your name. 4) A second firefighter sees your name on the board and a TAKE OVER button. 5) Try clicking it as a civilian or from across the map β refused. |
| 180 | Progression widget no longer buried under the minimap NEW | NEW (Aug 8): follow-on to row 176. The restored ProgressionPanel widget (TEAM / LV, rank β next rank, gold bar, "X / Y XP to next") was drawn at (1,-16),(0,80) β completely underneath the minimap, which owns the top-right from y14 to y244, with the address bar, BANK, CASH, the job badge and the XP card stacked below it to ~y478 and the TAB/REPORT/M/INV/GIFT/βPERKS icon row across y12β60. There was no room left in that column at all. The widget has been moved to the bottom-left (anchored bottom, (0,16),(1,-132)), which is clear of the whole right-hand stack, clear of the centred hotbar, clear of the StatsUI toggle and the admin panel below it, and clear of the Roblox chat window (top-left) and the FTO widget (top-left, y90β136). Being bottom-anchored it stays put on short/phone viewports. Verified in play: screenshotted on PD at 1176Γ495 β minimap, address bar, BANK $12,643,706, CASH, the PD ON DUTY badge, the "Assistant Chief 18,195 / 20,000" XP card and the full icon row are all unobstructed, and the widget reads "POLICE DEPARTMENT LV9 / Assistant Chief β Chief / 18195 / 20000 XP to next" at the bottom-left with nothing on top of it. Test: join on any job team β the rank widget is bottom-left above the hotbar line β check it does not collide with the minimap, the money cards, the icon row, the hotbar, or the phone; earn XP and watch the bar move; check it on a phone/small window too. |
| 181 | NEW β the church has an actual interior you can walk into NEW | NEW (Aug 8): Workspace.Flamable Structures.Church was a sealed, hollow, completely empty shell β 551 parts, no doors, no way in, bare grey walls, no lighting. It is now a real building. Getting in: the front (north) gable now has a cut doorway β the wall course was genuinely split and re-built around the opening, and the gothic window that was in the way was replaced with a rose window higher up the gable. Outside there's a columned porch with a gabled canopy, a stone landing and five stone steps down to grade (two pine trees that were standing in the path were moved back 26 studs and tagged so it's reversible). Two wooden double doors hang on the existing universal door system (attributes UDoor=true, UDoorLock="none", grouped as PaletoChurchFront so both leaves swing together, outward, auto-closing after 6 s) β UniversalDoorServer itself was not touched, the doors are just tagged. Inside: plank floor, red carpet aisle runner, plaster walls with wood wainscoting and a chair rail, a boarded ceiling with tie-beam trusses, 16 pews in two blocks either side of a centre aisle with 48 real Seats you can actually sit on, a raised chancel with steps and a balustered altar rail, an altar with cloth, gold cross and two candles, a lectern, a pulpit, a pipe organ with an 11-pipe case and a playable-looking bench (another Seat), a carved reredos with a big gold cross, wall sconces down both walls, six chandeliers, and lit transept arms. All of it is grouped tidily under Church.ChurchInterior so the fire system still sees one structure β and props were kept fire-sane (candle flames are plain neon + PointLight, no Fire instances, so FireReaper can never mistake them for an orphaned structure fire). There is also a votive candle stand by the door with a "Light a candle" prompt (5 candles, start unlit, burn 150 s then go out on their own; handled by a new server script ChurchInteriorServer). Verified in play: both door models registered with the door server and got their E prompts, the doorway raycasts clear straight through into the nave, the swing maths puts both leaves outside the building rotating on the correct edges, the votive prompt exists and the 5 candles initialise unlit, and 49 Seats are live. Not verified: I could not get a synthetic E keypress to fire the door prompt through the test harness, so the doors have not actually been seen swinging in-game β that's the first thing to check. Test: 1) walk up the new steps at the front of the church β E on the doors β both leaves swing outward together and close themselves after ~6 s. 2) Walk in β it should be lit, furnished and warm, not a grey box. 3) Sit on a pew (and on the organ bench). 4) E on the votive stand by the door β a candle lights β after ~2.5 min it goes out. 5) Set the church on fire with the fire system and make sure it still behaves (structure resolves, no orphan fire warnings from FireReaper). |
| 182 | NEW β K-9 unit for police (gamepass + team gated) NEW TEAM 2P | NEW (Aug 8): a full K-9 unit for law enforcement. There's a kennel run at PBPD (concrete pad, dog house, fencing, "K-9 UNIT" sign, bowls β Workspace.K9Kennel, around -1612, 78, 290 just off the LE spawn) with a "Deploy / kennel K-9" prompt. Deploy and a German-Shepherd-style dog in a black tactical vest spawns and heels behind you, following you across the map. Press O for the command panel (bottom-left, above the rank widget): DEPLOY / HEEL / SIT / STAY / SEARCH / APPREHEND / KENNEL. SEARCH sends the dog to the nearest suspect or vehicle within 28 studs, it sniffs for ~2.6 s with a glow, then the server reports a hit or a clear. APPREHEND only works on someone who is actually WANTED β the dog chases them at 27 studs/s and on contact slows them to walk speed 8 with no jump for 6 s and takes a token 5 HP (never below 20 HP), re-biting every 4 s, giving up after 35 s. The dog despawns on team change, death, disconnect, or if it loses you for 12 s. Server-authoritative: the client sends a bare verb and nothing else β it never names a target and never claims a find. The server picks the target, runs the contraband check and decides whether an apprehension is legal. The contraband read is against the systems that already exist: illegal Tools in your character/backpack (the same five as IllegalWeaponServer β Drill, Glock 41-S, MP5, AK-47, M4A1) and _G.HousingCountItem for dirty cash and those same guns stored in the inventory; wanted state is read read-only off the Wanted / WantedStars attributes (WantedSystem was not edited). Verified in play: deployed, the dog followed a 32-stud handler move and settled at heel; SEARCH on a vehicle with an occupant carrying an M4A1 and $300 dirty cash produced "K-9 ALERT β Duke has indicated on [vehicle]. jackhughesman: M4A1, dirty cash ($300)" plus a warning to the suspect; a clean target reports "no indication"; APPREHEND with nobody wanted was refused with "The dog will not be sent after a clean civilian"; HEEL/SIT/STAY switched modes; KENNEL despawned it; switching to Civilian despawned it automatically. Not verified: the chase-and-bite half of APPREHEND needs a second, actually-wanted player β solo I could only prove the refusal path. MATT β ACTION NEEDED: there is no K9 gamepass yet. I created ReplicatedStorage.Config.K9GamepassId (a NumberValue) and left it at 0. While it is 0 the pass gate is open β any PD / SASP / BCSO / SWAT player can deploy a dog for free (the server warns about this on boot). Make the gamepass, paste its ID into that NumberValue, save & publish, and the gate arms itself β no code change needed, and it honours gifted passes through _G.OwnsPass like everything else. Test: 1) as a civilian, use the kennel prompt β refused ("K-9 handlers must be on PD, SASP, BCSO or SWAT"). 2) On duty PD β prompt at the kennel β dog spawns and follows you. 3) Press O β panel β SIT / STAY / HEEL. 4) Have a second player carry a Drill or dirty cash, stand near them β SEARCH β the dog goes over, sniffs, and you get a red K-9 ALERT naming what they've got; do it again with a clean player β "no indication". 5) Have them go WANTED and run β APPREHEND β the dog runs them down and pins them (slowed, can't jump); try it on a clean civilian β refused. 6) Go off duty or die β the dog vanishes. 7) Once the real gamepass ID is in, re-test that a non-owner on PD is refused. |
| 183 | Lumberjack is now in the phone's Jobs app β and the whole PhoneClient was trimmed to make room NEW | NEW (Aug 8): the Lumberjack job (Paleto Timber Co., built last session) is now listed in the phone's Jobs app like every other department. It shows a brown LUMB badge, the name Lumberjack, a live 0 / 8 headcount with the capacity bar, and a green Join button, and the footer now reads 9 departments. Joining from the phone fires the same TeamChangeEvent the other jobs use β the server already whitelisted "Lumberjack" as a civilian-safe job β so you get set to the team, respawned at the camp spawn (828, 79, 700), and LumberjackServer hands you the Hatchet automatically off its team-changed hook. Verified end-to-end in play: the card renders and stays rendered, the search box filters to it on "lumb"/"lumber"/"lumberjack", and firing the Join path put the player on team Lumberjack at (828, 82, 700) with Hatchet (LumberAxe=true) in the backpack. Why the whole phone was touched: PhoneClient was jammed at 199,629 / 200,000 characters β the hard Roblox source cap β so nothing could be added at all. Following the pattern the file already uses (Bank, Settings, Messages, Maps, DarkWeb etc. all live in child ModuleScripts), the Robux Store and the Fire MDT fallback page were moved out into new child ModuleScripts PhoneClient.RobuxApp and PhoneClient.FireMDTApp. No logic was rewritten β the code was moved verbatim and handed the same context table the other extracted apps get. PhoneClient is now 174,628 chars (~25k of headroom). A verbatim backup of the original 199,629-char source is parked in ServerStorage.PhoneClient_BACKUP_Aug8 if anything ever needs rolling back. This is the big regression risk this round β the whole phone file moved, so exercise the phone properly, not just the Jobs app. All 22 phone pages were opened programmatically and every one built without an error, but that is not the same as clicking them. Also found while testing (pre-existing, NOT from this change): β HudClient.hideFrameworkMoney() sweeps every GUI in PlayerGui every 2 seconds and hides any Frame narrower than 220px that contains text matching $<digits> β it was written to kill the old framework money bar, but it will silently blank any narrow panel showing a price. It ate a "$22 / log" line off the Lumberjack card until that line was removed, and it is worth checking whether it is also eating the ticket amounts in the Citations app. β‘ The All Apps drawer (the grid icon in the dock) is broken and was already broken β it throws "Unable to assign property BackgroundColor3. Color3 expected, got nil" and renders empty, because ALL_APPS_LIST entries have no color field but the missing-icon fallback reads app.color; "Bank" and "Messages" have no entry in PHONE_ICONS so they hit that path. One-line fix is app.color or C.bgPanel β left alone deliberately this round. Test: 1) open the phone (Y) β Jobs β scroll to the bottom β Lumberjack is there and looks like the other cards β tap Join β you spawn at the timber camp with a Hatchet and can chop. 2) Type "lumber" in the Jobs search β only that card. 3) Join and then Leave from the card β back to Civilian, axe removed. 4) Now hammer the rest of the phone: Bank (balance + a transfer), Messages, Settings (change a setting and reopen), Maps, Robux Store (the gamepass and cash tiers must load), Citations, Credits, Car Keys, DarkWeb, Bank Statements, Clock, Suggest, Housing, SOS, Wallpaper/UI customisation, and the MDT β anything blank, stuck or erroring is a trim regression and I need to know. 5) Confirm the phone still opens, closes, drags and survives getting in/out of a car. |
| 184 | STRETCHER FINISHED β a real wheeled cot you take out of the ambulance and push NEW TEAM 2P | NEW (Aug 8): the stretcher is now actually finished. The reason it was stuck at "80%": MedCoreServer already had the whole run β load a stabilised patient, the stretcher follows you (or rides your vehicle), Unload at the hospital pays 150 + stability + haul β but you could never start it. The Stretcher tool's client script was never updated for the downed flow: it only ever picked a target with a live HumanoidRootPart and Health > 0. A downed player is a corpse (Health 0) whose HRP the ACS ragdoll destroys, so a downed patient could never be selected and _G.MedCoreStretcherLoad was dead code. The Medkit had been given the rootOf()/downed fallback months ago; the Stretcher had not. That is fixed β the tool now targets downed players first, injured players second. On top of that there is a new ServerScriptService.EMSCotServer: every FD/EMS vehicle gets an invisible dock welded to its rear with two prompts β Get Cot (E) and Load Cot Into Ambulance (F). Take a cot out and a real StretcherProp model appears and is pushed in front of you, ray-clamped to the ground under it so it can't hover over a hill, sink through a road or climb onto a car roof. Prompts on the cot itself: Load Patient Onto Cot and Stow Cot. Loading hands straight off to the existing _G.MedCoreStretcherLoad β the stability model, the untreated-critical gate and the hospital payout were NOT reimplemented, the cot layer just feeds them. Two small fixes went into MedCoreServer as well: the stretcher used to keep the template's stored world CFrame and visibly streak in from across the map on the first tick (it now spawns on the patient), and a run now also ends on team change and after a 15-minute timeout. Cleanup is thorough: cot despawns on medic death, team change, disconnect, sitting in a vehicle with an empty cot, a 5-minute idle timeout, and a sweeper that destroys any orphan cot every 12 s. Server-authoritative: team, distance, downed state and patient registration are all re-checked server-side; the client only presses a prompt. Verified in play: 8 docks auto-built on the real FD fleet (Ambulance, KME Panther, Engine 37, Battalion 17, Rescue 237, Tanker, FPIU Fire, FHP FPIU) and the 1968 Pontiac Firebird was correctly excluded (it only matched on the letters "fire"); a cot deployed through the real Get Cot prompt; walking the medic 30 studs the cot tracked at 4.4β6.4 studs in front, 1.1β2.4 studs above the ground under it, no fling and no fall-through; Stow removed it; killing the medic removed it; the orphan sweeper removed one left behind. NEEDS 2 PLAYERS β not verified solo: load a patient β push β load into the ambulance β drive β unload at the hospital β payout. MedCoreStretcherLoad needs a second player who is downed and registered as a patient (a medic can't be their own patient β the follow loop ends the run the moment the medic's health hits 0), so the whole loadβhaulβpay leg is compile-clean and gate-tested but has never been run for real. Test with two people: 1) medic on Blaine County Fire & Rescue, other player dies and stays down. 2) Walk to the back of any fire/EMS vehicle β E β Get Cot β a cot appears and follows in front of you. 3) Push it to the body β E β Load Patient Onto Cot β they should be lying on the cot. If it refuses, that's the existing MedCore gate: assess them first and treat every critical injury. 4) Push the loaded cot to the ambulance β F β Load Cot Into Ambulance β the cot locks to the back. 5) Drive to the hospital β Unload Patient on the cot β payout toast "150 + stability + haul" and they're revived at the ER. 6) Now break it on purpose: change team mid-run, die mid-run, disconnect mid-run β no cot should be left lying in the map. 7) Confirm a plain Medkit revive with no cot still works exactly as before. |
| 185 | The "digit sweeper" is caught and re-targeted β a lot of UI comes back NEW | FIXED (Aug 8): this is the one from row 183. HudClient.hideFrameworkMoney() walked every descendant of PlayerGui every 2 seconds and hid any Frame narrower than 220px whose text matched $<digits> (or was just digits). It was written to kill one thing: the framework's money display. That turns out to be the two little wallet/bank pills in interactiveDisplayUI.Interface.main.data. It now hides exactly those two, by path, and nothing else. Live audit of what it was also eating (measured in play, every one of these matched the old heuristic and was being re-hidden every 2 s the moment it opened): BankUI panel Β· DealershipUI price panel Β· UniversalCarHUD.Panel (a protected script's own HUD) Β· UniversalVehicleHUD speed bar Β· HealthIndicator ("100") Β· LevelGui.MainFrame ("125") Β· PoliceCarUI siren buttons Β· ScreenGui.PurchaseFrame ("Price: $1000") Β· TopbarPlus notification badges Β· and every row of the Citations app β the phone screen is only 236px wide, so every ticket card is under 220px and amount.Text = "$"..cit.amount matched. It is also why the Lumberjack job card had to ship with no "$22 / log" pay line. Verified in play: a deliberate 204px-wide test card reading "$250" was left in PlayerGui for 7 s (3+ sweep cycles) and stayed visible, while the framework wallet/bank pills stayed hidden; BankUI, DealershipUI and UniversalCarHUD were force-opened and stayed open through the same window (they used to get slammed shut within 2 s). Test: 1) the old framework money box must still be gone β you should only see the BANK/CASH cards on the right. 2) Open the phone β My Citations β any ticket you have shows its $ amount and does not blank out after a couple of seconds. 3) Open the Bank app / an ATM, a dealership, get in a car (car HUD + speed), take damage (health indicator) β none of them should vanish 2 s later. 4) The Lumberjack job card can have its pay line back if you want it. |
| 186 | All Apps drawer fixed β it lists every app now NEW | FIXED (Aug 8): also from row 183. The dock's grid icon threw "Unable to assign property BackgroundColor3. Color3 expected, got nil" and came up empty. Cause: ALL_APPS_LIST rows carried no color field, but the missing-icon fallback reads app.color β and Bank ("bank") and Messages ("bubble") have no PHONE_ICONS image because they're drawn by buildAppIcon, so they always hit that path. The error killed the whole build loop on the second row, so the drawer died after App Store. Every row now carries a colour (matching the home grid), the fallback reads (typeof(app.color) == "Color3") and app.color or <grey> so a nil can never take it down again, and each tile is built inside its own pcall β one bad row loses one icon, not the drawer. While in there, Clock and Suggest were added: they were on the home grid but had never been listed in "All Apps", so it wasn't actually all apps. Verified in play: opened the phone β tapped the dock grid icon β page title APPS with 17 tiles rendering (17 = the full list), screenshotted, no errors in the client log. Test: phone (Y) β the middle dock icon β the drawer lists every app with its icon β scroll to the bottom β tap a few (Bank, Messages, Clock, Suggest especially) and check each one opens its real page. |
| 187 | Progression widget moved again β it was sitting on the Dailies chip NEW | FIXED (Aug 8): follow-on to row 180. Moving it out of the minimap was right, but bottom-left wasn't clear either β measured live at 1176Γ495 the widget sat at x16β296 / y243β305 and the always-on DAILIES chip (DailiesGui) sits at x12β144 / y257β285, straight through the middle of it. Worse, the chip is scale-positioned ({0.62,0}) while the widget was bottom-anchored, so the two slide through each other as the window height changes β there is no fixed bottom-left offset that's safe at every size, and everything below ~-114 belongs to the AdminUI panel and the CustomHotbar. It now lives in the right-hand column, directly under the XP card (fixed top offset 428; the column above it is minimap 14β244, address bar, BANK, CASH, job badge, XP card ending at 420), matched to the column's 230px width. On a short/mobile-landscape viewport there's no room left in that column, so it falls back to the bottom-left β which at those sizes is genuinely empty because the hotbar and admin panel are already pushed off-screen. The switch is driven off the ScreenGui's own AbsoluteSize, not Camera.ViewportSize β those two are not the same number (in Studio play the camera reads ~58px taller), and using the camera value is exactly what dropped the widget on top of the XP card on the first attempt. Verified in play: at 1176Γ495 it takes the short-viewport branch and measures x16β246 / y363β425 β clear of Dailies (ends y284), clear of the hotbar (starts y460), clear of the admin panel (starts y428), and nothing in the right column touches it; screenshotted reading "BLAINE COUNTY FIRE & RESCUE LV 2 / Firefighter β Seniorβ¦ / 250 / 900 XP to next" with nothing on top. Not verified: the tall-window branch (right column, under the XP card) β the test window was only 495px tall, so that layout was never rendered. On a normal full-screen 1080p client this is the branch you will actually get, so check it first. Test: 1) full-screen on a desktop β the rank widget should be in the right column just below the XP card, same width, not overlapping the XP card or running off the bottom. 2) Shrink the window right down / try a phone β it should hop to the bottom-left and still not collide with the Dailies chip or the hotbar. 3) Earn XP and watch the bar move in both layouts. SUPERSEDED by row 188 β this widget has now been removed entirely, so there is nothing to position. Skip this row. |
| 188 | One XP card, not two β plus XP-to-go and no card on the menu screen NEW | NEW (Aug 8): The two stacked XP cards were my fault and this undoes it. Last session I retargeted XPHudVisibility: it used to hide any ScreenGui containing the text XP to next, which was a blanket rule that had been silently killing the game's own progression widget as collateral damage. Making it name-based (it now only hammers the paid kit's LevelGui, and skips anything carrying a PBRP_HUD attribute) was the right fix β but the side effect was that the second card it had been accidentally suppressing all along came back, so you ended up looking at two XP cards stacked on top of each other. Which was which: the keeper is StarterPlayerScripts.XpHudClient β ScreenGui XpHudUI β the compact 230Γ54 pill in the right-hand column under CASH, with comma-formatted numbers ("Established Resident β¦ 6,526 / 18,000"). The one that has been removed is StarterPlayerScripts.ProgressionPanel β ScreenGui ProgressionHUD β the taller card reading "CIVILIAN LV 4 / Established Resident / 6526 / 18000 XP to next". That is the exact widget row 187 was about, so 187 is now moot. Worth recording: the card you're keeping is not the paid uxrLevelSystem kit's UI. The kit's LevelGui is deliberately kept hidden and must stay hidden β un-hiding it would just create a fresh duplicate. A comment block saying so is now sitting at the top of XPHudVisibility so this doesn't get "fixed" the wrong way round next time. How it was removed and how to get it back: nothing was deleted. ProgressionPanel is now Disabled in the Explorer and has local BUILD_PROGRESSION_HUD = false with an early return at the top of its source; you need to flip both to bring it back, and the comment above them explains exactly that. I grepped every script in the place for ProgressionPanel / ProgressionHUD / ProgressionWidget first β nothing depends on it; the only other mentions are comments in IntroMenuClient, EnterCleanupClient and FTOClient, plus a "never hide this" list entry that is harmless when the GUI simply doesn't exist. New "to go" text: the pill now has a third line β right-aligned in the previously empty band between the numbers and the progress bar, same GothamMedium font and same dim grey as the fraction above it, reading e.g. "11,324 XP to next level", or "Max rank reached" once you top the ladder. The card's width and height are unchanged (230Γ54), so nothing else in the right-hand column shifted, and the text sits in a 184px slot while only measuring ~97px β no clipping. Menu-screen fix: the card you were seeing before hitting Play was that same ProgressionHUD. Cause: IntroMenuClient listed ProgressionHUD in its NEVER_HIDE list but not in ALWAYS_ON_HUD, so the menu's hide-loop never touched it while every other HUD layer was being forced off. With the panel disabled it can't appear at all, and as belt-and-braces ProgressionHUD was also added to IntroHudGate's gate list so it would be hidden on the menu even if you do re-enable it later. Verified in play: on the intro menu, ProgressionHUD is absent from PlayerGui entirely and both XpHudUI and LevelGui read Enabled = false β screenshotted, no XP card anywhere on screen. After entering the game: exactly one XP pill, ProgressionHUD still absent, LevelGui.Enabled = false, XpHudUI.Enabled = true, reading "Established Resident Β· 6,676 / 18,000 Β· 11,324 XP to next level" β screenshotted. XP was then set to 9,000 ("9,000 XP to next level"), 17,999 ("1 XP to next level") and max rank ("Max rank reached"): the number recomputes correctly every time and the card still holds exactly three text labels, so nothing is double-appending or flickering. No new errors in the client log (the usual vehicle/asset noise is unchanged). Not verified: β entering via the real PLAY button β the test entered by firing PlayerEnteredGame and destroying PaletoMenu from a script, so the exact button path is unproven; β‘ the mobile / short-viewport layout of the new line. Test: 1) load in and sit on the menu β there should be no XP card of any kind on screen before you press Play. 2) Press Play β you should see exactly one XP card, in the right column under CASH, and it should now have a small "N XP to next level" line between the numbers and the bar. 3) Earn some XP β that number should count down smoothly, with no flicker and no duplicated text. 4) Get a team to max rank (or just check on a low team) β at max it should read "Max rank reached". 5) Confirm the old taller "CIVILIAN LV 4 / β¦ XP to next" card is gone everywhere β menu, in-game, after respawn and after a team change. 6) On a phone, check the new line isn't cut off. |
| 189 | T02 β cursor "disappearing" after alt-tab: real root cause NEW | NEW (Aug 8): Your F7 screenshot cracked this one, and it turns out we'd been chasing the wrong thing for a month. The cursor was never invisible. Your capture shows MouseIconEnabled: true the whole time β the cursor was switched on and drawn. What it actually was: pinned at MouseLocation (0, 690), i.e. jammed hard against the far left edge of your screen where you can't find it or use it. So "my mouse disappeared" really meant "my mouse is stuck in the corner". That's exactly why every previous attempt failed β they all worked by forcing the cursor icon back on, and it was already on.What was actually happening. Two things were fighting over MouseBehavior, which is the setting that decides whether the cursor is free or locked in place. (A) Roblox's own default camera. While it believes you're holding the right mouse button to pan the camera, it forces LockCurrentPosition every single frame. When you alt-tab away mid-drag, Roblox drops the matching "you let go" event, so the camera goes on believing the right button is still held β forever. (B) CursorGuardian, our own watchdog, which shoved it back to Default every 0.25 seconds and had no exception for a held right mouse button. So: camera locks, guardian unlocks, camera locks, guardian unlocks, endlessly. That is precisely the four flips in 0.6 seconds in your "LAST 5 MOUSE CHANGES" list. Each flip re-anchors the cursor while the camera is still eating your mouse movement, so it walks across the screen and beaches itself on an edge. Worth saying plainly: last month's "hardening" made this worse, not better β dropping the guardian from a 0.8s poll to 0.25s and from 2 strikes to 1 just made the tug-of-war four times faster.What I changed. New MouseArbiter script: one single owner of the mouse, so there's nothing left to fight over. It follows a fixed priority β typing in a text box, then driving with mouse-lock, then a gun out (OTS/ACS), then genuinely holding right-click to look around, then an open menu, then a cutscene camera, then shift-lock, then normal free cursor. Crucially it never fights forever: if something keeps re-locking the mouse, it stops writing and instead re-seats the camera, which makes Roblox's camera forget its stale "right button is held" flag β fixing the cause instead of slapping at the symptom β and then backs off. CursorGuardian and AltTabMouseFix now stand down while it's running, but stay in place as a fallback. Un-pinning: when you tab back in, if the cursor is sat against a screen edge and hasn't moved at all, it gets recentred so you can find it. It will not do that while you're aiming, driving, or typing.Also fixed, and it's related: your screenshot showed Modal active: AdminUI.Frame.Frame.TextButton while no admin UI was open. That's the admin panel's X button being left with Modal = true after the panel closed β and a stale Modal button changes cursor behaviour game-wide, which feeds the same fight. New ModalLeakGuard clears Modal on any button that isn't actually on screen. (It had to be a separate script because AdminClient is at Roblox's 200,000-character size limit.) Finally, F7 still works and now also shows who currently owns the mouse and names the script behind every change in the log, so the next report will be even clearer.How confident am I? Honestly: moderate, not certain. The CursorGuardian half I confirmed live β I planted a probe in a running session, set the mouse to a locked state, and watched CursorGuardian stomp it back to Default within about half a second every single time. The camera half is inferred from your screenshot plus Roblox's documented camera behaviour; I could not reproduce a real alt-tab in Studio, because Studio's play mode locked up partway through this session and wouldn't restart. The new arbiter is verified by a 16-case logic test (all passing, including "don't break aiming / driving / typing") rather than by a live alt-tab. So this needs your eyes. Test: 1) Play normally, then alt-tab out of Roblox and back in several times, in different situations β standing still, walking, right after right-click-dragging the camera. Each time, check the cursor is where you left it and still usable, not stuck in a corner. 2) Press F7 and check the new ARBITER owner line says free when you're just walking around, and that LAST 5 MOUSE CHANGES is not flickering back and forth. 3) Now confirm I didn't break the things that are supposed to lock your mouse: type in a text box (cursor free and visible), drive a car (mouse locks to camera-look, CTRL still toggles it back), and aim with a gun (OTS aiming locks correctly and releases when you holster). If any of those three stop working, tell me immediately β that's the main risk with this change. |
| 190 | Flashlight pointed into the air β it was never actually in your hand NEW | FIXED (Aug 8): two separate faults, both measured live, not guessed. (1) The tool was never attached to the hand at all. The Flashlight had RequiresHandle = false, so Roblox never built the RightGrip weld β in a running session the Handle measured 4 studs away from the right hand, sitting on the floor while the arm waved at nothing. (2) The arm pose was rotating the beam skyward. RodHoldPose had a "flash" branch that rotated the RightShoulder by FlashArmX(110) - 30 = +80° and the RightElbow by a further +35° on top of the engine's tool-hold animation, which already holds the arm forward β net ~115°, i.e. the hand (and therefore the SpotLight, whose Face is Front = the handle's -Z) pointed up and behind you. Fix: RequiresHandle = true and Grip = CFrame.new(0,0,0.3) on all four team Flashlights (PD / SASP / BCSO / SWAT), and the flashlight removed from RodHoldPose.POSES so nothing overrides the arm. Verified in play with before/after screenshots: before, the beam measured dot(bodyForward) = -0.81 (pointing backwards); after, pitch +0.2°, dot(bodyForward) = 1.000 β dead ahead. Screenshot shows it held out level in front. Test: go on duty as PD β equip the Flashlight β it should sit in your hand and light up whatever you are looking at, at every camera angle, walking and standing. |
| 191 | Journal moved off J β J is the PD vehicle lighting key NEW | FIXED (Aug 8): the quest journal opened on J, which the Emergency Vehicle Handler and EPICLIGHTS_V4 both bind for police vehicle lighting β so opening the journal while driving fought the light bar. I scanned every script in the whole datamodel for Enum.KeyCode.* before picking a replacement: J is referenced in 46 places, and every letter key is taken by something. The only keys bound nowhere at all in the entire place are Comma, Period, Backslash, Insert, Delete, Home, PageUp, PageDown. The journal is now on . (period) β free game-wide and present on every keyboard. The in-game hint toast was updated to match and now also points at the new top-bar icon. Test: get in a PD car β press J β lights only, no journal β press . β journal opens and closes. |
| 192 | Journal close button is a real X now, and it has a top-bar icon NEW | FIXED (Aug 8): two parts. (a) The close button used the \u{2715} codepoint, which isn't in Gotham on every platform, so it rendered as an empty box. It is now drawn from two Frames rotated +45° / -45° β the exact same treatment as the scoreboard close button (row 100) and the Help hub, hover-recolour included. (b) The journal now has a proper top-bar icon (π JOURNAL) in the icon row, built in the same house style as InvButton/PerksButton and registered in TopIconsManager's NAMES list so it shows/hides with the rest of the row and moves with the group-drag. It sits one slot left of PERKS. Verified in play: the whole row measured with no overlaps β MDT -354, MAP -408, REPORT -462, TAB -516, B -570, GIFT -624, JOURNAL -678, CTRL -732; screenshotted. Test: the JOURNAL icon is in the top row β click it β journal opens β click the X β it closes and the X looks like an X, not a square. |
| 209 | Stabilise progress bar no longer vanishes half way NEW | FIXED (Aug 8): root cause found in MedCoreClient. The green treatment sweep is a Frame parented inside the injury row β and rebuild() starts with for c in listF:GetChildren() do if c:IsA("Frame") then c:Destroy() end end. MedCoreServer pushes a Sync snapshot every second (the stability drain loop) and every Sync calls rebuild() β so roughly 1 second into a 2.2 second channel the row was destroyed and rebuilt, taking the bar with it. Exactly "the green bar disapears halfway through". The live treatment is now tracked in a treating record (region, index, start time, duration), and rebuild() re-draws the bar at the correct partial fill and tweens only the remaining time β so it survives every Sync and runs smoothly to 100%. The TREAT button also keeps showing … across a rebuild instead of flicking back to "TREAT". Nothing about the treatment itself changed β the server still owns the 2.2s channel and re-validates distance at completion. Test: assess a downed patient, hit TREAT β the green bar must sweep the full width of the row without disappearing, and the toast lands as it finishes. |
| 212 | Rosa runs the church soup kitchen β a place that actually exists NEW | FIXED (Aug 8): you said "for rosa you can rename her and the diner stuff and do it somewhere else idc". There is still no diner in this map, so she is no longer a diner owner β she now runs the SOUP KITCHEN at the Church. That fits her character (she feeds people, runs meals out on the side, wants a medkit for the back room) and the Church is a real, visible building with a real Workspace.Locations marker and a real walkable interior. Where she is: inside the church on the centre aisle, (-1160.1, 81.4, 281.4) β that is Flamable Structures.Church.ChurchInterior.Shell.FloorNave, measured with a downward raycast, zero overlapping parts and 23 studs of headroom. Verified in play: NPC_rosa placed at y=84.4, i.e. feet on the nave floor. Renamed text: title "diner owner" β "church soup kitchen"; icon 🍔 β 🍲; quest 1 "Welcome to Rosa's" β "Kitchen Hand"; the sign-off "Booth's on me" β "There's always a bowl waiting for you at the kitchen"; the delivery quest is now hot meals run out to folks who can't get up the hill. Her quest chain is unchanged and the internal NPC id is still rosa on purpose β that is the DataStore key, so anyone mid-chain keeps their progress. A Diner marker in Workspace.Locations still overrides everything if you ever build one. MATT β while checking this I noticed Doc is at y=5, far below the hospital; that is a separate pre-existing placement bug, not touched here. Test: go to the Church, walk inside β Rosa is standing on the nave floor, press E β dialogue opens and the quest chain runs. |
| 213 | Doc is finally INSIDE the hospital β and 11 map markers stopped falling through the world NEW | FIXED (Aug 8): the real cause was never the NPC code. Workspace.Locations.Hospital is an unanchored, CanCollide, fully opaque 4Γ1Γ2 part. Physics drops it the moment the server starts, so by the time the quest system reads it (t=4s) the marker has already fallen from its authored y=76.52 to yβ2.5 on the grass baseplate β the placement code was handed a target under the world, its ground-snap sailed past the hospital and landed on the baseplate, and +3 gave exactly the y=5 you measured. Caught on tape by a guard I added first: "drop at 155.3,66.9,95.4 only found ground at y=2.03 (Map.Grass Baseplate)" β the marker was mid-fall. Eleven markers were broken this way (Hospital, Bank, Car Dealership, Beach Γ2, Beach Entrance, Gas Station, Hotel, Abandoned House, Bin Man Wharehouse, Construction Zone) β all now Anchored, CanCollide=false, invisible, matching the other 29. That also silently fixes every "nearest landmark" reader: minimap address, police/fire MDT location, phone GPS, dispatch call locations and admin send-to for those places were all pointing at the baseplate. The NPC drop logic now re-reads its marker on every attempt, requires the ground it lands on to actually be part of the Hospital model, and retries while the world settles instead of believing the first cast. Measured in play β before: y=5.03. After: y=80.68, feet on the ward floor (77.68), 10.5 studs of headroom, well inside the footprint. Mickey came along for the ride: he was buried at y=63.6 under the beach, now stands on the sand at 76.92. Test: hospital β Doc is standing indoors, press E. |
| 214 | Speedometer shows the real gear β P / R / N / D NEW | FIXED (Aug 8): "shifted into drive or reverse and not moving its N for neutral not park". A-Chassis lets Values.Gear drop back to 0 whenever you come to a stop, and the HUD was printing that raw gearbox number β so a car sitting still in D honestly reported N. The chip now behaves like an automatic's selector: it latches the last real direction (stopping does not knock it out of D), shows R in reverse, N only before you have ever selected a direction, and P whenever the parking brake is set and the car is genuinely stationary (under 2.5 studs/s). Colour-coded: P and R amber, N dim, D white. The separate handbrake chip was relabelled PB so the two P's can't be confused. Test: get in, drive off, brake to a stop still in D β reads D, not N. Press P while stopped β reads P. Reverse β R. |
| 215 | Dealership "MY VEHICLES" tab + rows rebuilt NEW | FIXED (Aug 8): "text is too big and needs clear distinct separation" + "a lot of work on that button appearance and distinction". Both complaints were literally text overflowing its box. Measured: the MY VEHICLES tab was one cell of a UIGridLayout with a hard-coded CellSize 72Γ25 px, while its label "π MY VEHICLES (n)" needs roughly 110px at TextSize 12 β the text ran straight out of its own button. The list header was worse: "MY VEHICLES β spawn, sell, or return the one that's out" at TextSize 11 in a 26px Γ 298px strip, about 380px of text. Now: the garage tab has its own full-width row above the category chips (measured live: 314Γ30 px, up from 72Γ25) with its own green treatment and hover state; the header is a two-line 40px card that fits; every row is a 64px card (was a flat 54px) with a coloured status stripe down the left edge β grey stored / green OUT / purple GRANTED β truncated text that can no longer overflow, and exactly one clearly-styled action button per row, always in the same spot (βΆ SPAWN blue, β© RETURN green). Test: open any dealership β MY VEHICLES. |
| 216 | Fishing UI is 75% bigger and scales to the screen NEW | FIXED (Aug 8): "FISH2: UI is still tiny". Measured instead of nudged this time β every fishing pill was a hard-coded pixel box with no scaling of any kind: Progress 340Γ62, Task 340Γ66 (+44Γ22 timer), BeforeCast 360Γ62, headers at 16β18px and sub-text at 11β12px. On a 1080p screen that is a 340px strip = 17.7% of the width, which is why moving offsets never helped. They now carry a viewport-driven UIScale. Measured live at 1460Γ495: Progress went 340Γ62 β 595Γ108.5 px (Γ1.75), BeforeCast 360Γ62 β 630Γ108.5, and the timer tracks the pill's corner automatically. Hard caps keep it at most 90% of screen width and 30% of screen height, so it scales down on a phone instead of overflowing (a 640Γ360 screen gets Γ1.2 = 408px wide). Test: fish on desktop and on a tablet β comfortably readable, never clipped. |
| 217 | New Clock app icon NEW | FIXED (Aug 8): "Functional needs better app icon". The old clock was a solid white disc with dark hands β the only inverted glyph on the whole phone β sitting on a near-black (24,24,28) tile, so it read as a white blob. Redrawn as a white ring with 12/3/6/9 tick marks, hour and minute hands and a centre dot, i.e. white-line-on-colour exactly like every other icon, and the tile moved off near-black to a slate blue (52,58,80) so it's distinguishable from DarkWeb. All vector-drawn β no new art needed. Test: open the phone, look at Clock. |
| 218 | Phone app icons all match now (no new art needed) NEW | FIXED (Aug 8): "D13-T05: Functional but the logos are ugly". Root cause: the phone was rendering two completely different icon styles side by side. If an app had a PNG in PHONE_ICONS the code set the tile to BackgroundTransparency = 1 and drew a bare stretched image at 1.25Γ β no tile, no corner radius, no padding, whatever weight the artwork happened to have. The only two apps without a PNG (Bank and Messages, which had been converted earlier after the images kept blinking out) rendered as a proper gradient rounded tile with a clean white glyph. So half the home screen was mismatched imported art and half was tidy vector tiles. Since buildAppIcon already had a drawn glyph for every single icon kind this phone uses, all three icon surfaces β home grid, All Apps drawer and the App Store β now render the identical tile: same 52px size, same 16px corner, same gradient, same white line-art weight, one shared palette. Nothing you own needs replacing and no new art is required from you β the PNGs are simply no longer drawn. Launch behaviour untouched. Test: open the phone, then All Apps, then App Store β the icons should look like one set. |
| 219 | DISPATCH status codes + PANIC are less fat NEW | FIXED (Aug 8): "some of the font is abit too fat like satus codes and panic haha". Font weight only β no dispatch logic and no layout was touched (the 10-code / panic rework is still a separate job). The 10-code labels in the DISPATCH box were GothamBlack at TextSize 15, the heaviest face Roblox ships β now GothamBold at 14. The radio's PANIC button was GothamBlack 11 β GothamBold 10.5. Test: press T for the DISPATCH box and look at the radio panel β same layout, lighter type. |
| 220 | Parking brake actually holds the car NEW | FIXED (Aug 8): "if youre parked and then try to move it def stops but mainly slows you down it needs to have more power". Root cause: the parking brake is nothing but A-Chassis wheel-brake torque (Tune.PBrakeForce, typically 2500β5000 in a different unit per car) fighting the same component the drive motors push on β the engine simply out-muscles it β and that number lives in about 60 separate per-car Tune modules, so there was no single value to raise. Fixed car-agnostically with zero per-car edits: a new ParkBrakeHold client script watches your own car's P-brake and drives its horizontal velocity to zero through a physics constraint. Still rolling β force is capped so it decelerates hard but smoothly (about 0.76 g) instead of snapping to a stop; once under 3 studs/s the holding force jumps to a level the engine cannot beat, plus an angular hold so it can't be spun loose. Y force is always zero, so gravity and suspension are untouched, and the hold switches off entirely when the car is airborne so a jump is never frozen. Deployed and error-free, but I could not get a real drive test in Studio β please try it: park + P + throttle (should not move at all), then P at speed (should stop firmly in about a second, not feel glued). |
| 221 | LS Customs accepts the car you drove in NEW | FIXED (Aug 8): "i go to ls customs and it says drive YOUR car into the garage i cant even do anything with it" (HORN2). Root cause, and it's a good one: the garage looked your car up by model name β workspace:FindFirstChild(name.."_Vehicle") or name.."sCar" β but every vehicle in the game ships a legacy siren-pack script at DriveSeat.Pickup that does seat.Parent.Name = human.Parent.Name.."'s Car" the instant you sit in the driver seat. So the moment you drive the car β exactly what the garage tells you to do β <you>_Vehicle becomes <you>'s Car, both lookups return nil, and it insists you haven't brought a car. It could never have worked. Confirmed live: seat path read Workspace."jackhughesman's Car".DriveSeat while FindFirstChild("jackhughesman_Vehicle") was nil. The garage now identifies the car by ownership (the OwnerUserId attribute, stamped at spawn, which survives every rename) β the car you're actually sitting in wins, otherwise the nearest car you own parked in the bay; name matching stays as a fallback and now covers both apostrophe spellings. Verified end-to-end in play: drove a registered car in and the menu opened by itself β "PALETO CUSTOMS Β· PAY N SPRAY Β· CHEVY TAHOE [UFG 938]" with Respray/Horns live. Heads-up: the "only one car out at a time" guards elsewhere in the dealership have the same class of bug β they test "'s car" with a lowercase c, which never matches the "'s Car" the Pickup script writes β so those guards currently fail open. Not touched here; say the word and I'll do that pass. Test: drive your own car into LS Customs. |
| 222 | Inventory grid-to-grid drag — the REAL cause, found by measuring instead of reasoning NEW | FIXED (Aug 8): "Does not function, any item doesn't drag into an empty box, and doesn't light up green". This is the THIRD attempt at this row, and the first two were wrong because both of them argued about screen coordinates and neither one ever ran a drag. This time I started a session, dragged an item with real mouse input and read the error log. The actual bug had nothing to do with coordinates: startDrag() (line 254) calls addModelPreview(g, it), but addModelPreview is declared as a local function 263 lines further down the file (line 517). At line 254 that name resolves to a nil global, so every single mouse-down threw HousingV2_InventoryClient:254: attempt to call a nil value — function startDrag and died one line before drag = {...} was ever assigned. There was no drag state at all: no glow, no drop target, no drop — just an orphan ghost square parked at (0,0). Exactly what you described, three rounds running. Fixed with a forward declaration. Second, real bug on top of it — the coordinate question, now settled with numbers: I probed a button at Position (300,200) inside an IgnoreGuiInset=true ScreenGui and used Roblox's own MouseEnter as ground truth. Its AbsolutePosition reads (300,142); at the moment the cursor was provably inside it, GetMouseLocation() read (305.7, 232.7) and Mouse.X/Y read (305,174). So AbsolutePosition is inset-space (raw − 58) even in an IgnoreGuiInset gui, and GetMouseLocation is raw. The grid cells sit 71px apart, so testing raw coords against AbsolutePosition put every drop one row too low, or off the grid entirely on the bottom row. All grid hit tests now use inset coords; the hotbar keeps raw, because CustomHotbar exports its rects through rawRect() which adds the inset back. The stale Aug-8 "COORD TRUTH" comment that claimed the opposite has been deleted and replaced with the measured numbers. Verified with real synthetic mouse drags in a running session, not by reading code: hovering an empty cell lights that exact cell green (cell at AbsolutePosition 804.5,109.5 lit while the cursor was over it); dropping moved drill from slot 8 → slot 17 and the tile redrew there; dropping onto an occupied cell swapped drill and lockpick (7 ↔ 17); and dragging onto the hotbar still works — the drill left the bag and appeared pinned in hotbar Slot_1. Console clean, no new errors. Test: open the backpack, drag any item into an empty box (it should glow green under the cursor), then onto an occupied box (they swap), then down onto the hotbar. |
| 223 | Cash Drop and Lost Duffle events actually happen now NEW | FIXED (Aug 8): "Cash drop event doesnt do anything" / "i dont think lost duffle works". Root cause: ServerScriptService.MoneyEventsServer was ticked Disabled. The whole script — scheduler, admin hook, both events — was switched off, so the two admin buttons wrote a Workspace attribute that nothing was listening to. Re-enabled. Two more things that would have made it look broken even once running: the crate location used an unfiltered downward raycast, which could land it on one of the invisible Locations marker parts or on a player instead of the ground — now filtered; and the only in-world marking was a PointLight plus a billboard, which is invisible in daylight from any distance — the crate/duffle now carries a Highlight (green for cash, amber for the duffle) that outlines it through walls. Verified live: forced a cash drop → Workspace.CashDropCrate spawned on real ground at (1236.5, 78.5, 418.8) with the Highlight and the "Crack it open" prompt, and every player got the mission waypoint 💰 CASH DROP pointing at it. Forced a duffle → Workspace.LostDuffle spawned the same way. The duffle payout path (_G.HousingGiveItem(plr,"dirtycash",N,true)) was also called directly and returned true, so the reward and the wanted-level hook are live. Note: the automatic scheduler still needs 2 players online and a 10–16 min gap — solo you will only ever see these from the admin buttons. Test: Admin → Server tab → EVENTS → Cash Drop / Lost Duffle → you get a toast, a waypoint, and a glowing crate at the landmark. |
| 224 | Live event indicator on screen + the admin EVENTS list is half the size NEW | FIXED (Aug 8): "whats the point of the text it doesnt display anywhere i dont think" and "can you make an area where text stays active or can be seen what events are going on? Something subtle?" Every event announced itself with one toast that vanished after 7 seconds and then left no trace, so five minutes in nobody could tell whether Double Pay was still running. New EventStatusClient draws a small stack of pills in the bottom-left corner — one per running event, e.g. 💵 Double Pay 15m — each with the event colour and a live countdown. It covers Double Pay, Rush Hour, Fish Frenzy, Pawn Boom, 2x XP, 2x Money and an active Cash Drop / Lost Duffle. It reads Workspace attributes the servers already publish (no new remotes), and when nothing is running the whole thing is hidden, so it costs zero screen space. Bottom-left deliberately: top-centre is already the wanted banner / safe-zone banner / admin report banner, and the right column is minimap + HUD + XP. Measured live at 1460×495 with four events running: the stack occupies x 14–146, y 327–423 — the hotbar starts at x 334, so nothing overlaps. "for the other stuff it goes off button its so long in admin menu": the ten EVENTS buttons all began with the words "Event: " under a section header that already says EVENTS, and four of them ended with "(minutes)" even though the box that opens asks for minutes. They are now just the event name — Cash Drop, Lost Duffle, 2x XP, 2x Money, Double Pay, Rush Hour, Fish Frenzy, Pawn Boom, Payday (all), Stop All Events — so the labels fit their buttons and the block reads as ten distinct things instead of ten identical ones. Nothing keys off the label text, only the action id. Test: fire any event from the admin panel → a small pill appears bottom-left with a countdown and stays until the event ends. |
| 225 | Dealership "one car out at a time" is enforced again NEW | FIXED (Aug 8): the heads-up from row 221 is now done. Both dealership guards (refuse a spawn while a car is out, and the Despawn button) matched on <name>'s car with a lowercase c, but the legacy DriveSeat.Pickup script renames the model to <name>'s Car with a capital C the instant anyone sits in the driver seat. So the moment you actually drove your car the guards stopped matching and failed open — you could go back to the dealership and spawn a second one, and Despawn would not find the car you were driving. Both now go through one shared check that keys off the OwnerUserId attribute first (stamped at spawn, survives every rename), then falls back to the name variants case-insensitively. Verified end-to-end in play: with a model called jackhughesman's Car sitting in the workspace, firing SpawnCar for an owned Ford Taurus produced no second vehicle — refused, as it should be; removing that model and firing the same request spawned jackhughesman_Vehicle normally, so the guard is not over-blocking; and the Despawn button destroyed the capital-C model, which the old code could never have matched. Test: spawn a car, drive it (so the rename happens), go back to the dealership and try to spawn another — you should be told yours is already out. Then press Despawn — it should disappear even though you had been driving it. |
| 226 | Radio PANIC actually does something now TEAM NEW | FIXED (Aug 12): the server side of panic was fine all along — the presser's own confirmation branch was dead code (an elseif kind=="panicself" had been swallowed into a trailing comment), so whoever hit PANIC saw and heard NOTHING, and civilians were wrongly getting the officer's "PANIC SENT" toast + tone instead. Restored + beefed up: presser gets tone, "PANIC SENT" toast, and a [SYSTEM] line in the radio log; every on-duty unit gets the panic tone, a pulsing red banner with the officer's callsign + live location on a second line (📍 Great Ocean Highway near DOT Depot), a full-screen red flash, a 📍 waypoint to the officer, and a red [PANIC] line in the radio log + chat. Test: press PANIC (or `) → your own radio logs "[SYSTEM] PANIC sent - all units alerted." and the button starts a countdown; on a second cop's screen expect sound + banner w/ road/landmark + waypoint. |
| 227 | 10-codes: send on the right channel + live location in the line TEAM NEW | FIXED (Aug 12): two real bugs behind "10 codes look buggy": (1) every code was hardcoded to the TEAM channel no matter what your radio was set to (PD codes were invisible to Fire/DOT even on DISPATCH), and (2) the box said "Sent" even when the server's 1-msg/sec limit silently dropped the click — dead-button feel. Codes now follow your radio's live channel (DISPATCH by default, see 228), the client mirrors the 1s limit ("Radio busy" instead of a lying "Sent"), and the server appends your live road/landmark to every 10-code so it lands in the radio feed for everyone: real line from the test session — "10-51 DOT · Great Ocean Highway near Gas Station". Typed callouts stay location-free on purpose. Test: T → hit a code → the radio line ends with "· road/landmark"; hit two codes fast → second flashes "Radio busy". |
| 228 | Dispatch box un-mangled (Active Units off the 10-codes) + DISPATCH is the default channel TEAM NEW | FIXED (Aug 12): the walkie's panel.Size=258x318 had been swallowed into a comment during the Jul 23 reposition, so the box rendered at the default 100x100 with 42px buttons overflowing straight over the UNITS roster — that was the whole "active units block the 10 codes / looks like a mess". Explicit size restored, box moved below the UNITS panel (354,280 — UNITS ends at y272, zero overlap, measured live), codes are a clean 2x2 grid per tab, and a bottom strip shows the live send channel. Also: every department's radio now defaults to DISPATCH (all-services) on duty join AND when switching duty teams — server attribute and the dock UI agree, ( - ) still flips to your team channel manually, and voice hearability follows. Test: go on duty → radio says "[DISPATCH] All Services"; press T → codes box sits under Active Units, nothing covered; ( - ) flips to team and the walkie strip follows. |
| 229 | The "60 min" panic cooldown — was a clock bug, now a real 3 min TEAM NEW | FIXED (Aug 12): there never was a 60-minute cooldown — the button countdown mixed two different clocks (server wrote os.clock(), client subtracted its own os.clock()), so on a live server it displayed server-uptime garbage that could read as an hour+, and the ` hotkey went permanently dead after one press (negative delta = "always cooling"). The real cooldowns were 300s radio / 240s MDT. Now ONE 180s (3-min) server-enforced cooldown across radio + both MDTs on workspace:GetServerTimeNow() (same value both sides), live countdown on the button ("PANIC 2:45" in the test session), and pressing early shows the countdown + a "wait Xs" toast instead of dying silently. Test: panic → button counts down from 3:00 → press again early → blocked with visible countdown → usable again at 0:00. |
| 230 | Dodge Charger β Z-start is back + engine sound is back NEW | FIXED (Aug 12): two stacked failures behind "not functional": (1) the game-wide hold-Z starter script was sitting disabled β no "Hold Z to start" pill, Z dead on every car. Re-enabled (this was most of the report). (2) the Charger's engine-sound plugin had lost its Rev sound (model saved mid-run, the sound had been moved out of the plugin), so the plugin hung on a WaitForChild forever = permanently silent. Rev restored into the plugin and verified loading + pitching with RPM in a live run. Also wired the Charger's engine flag to the Z gate like the Crown Vic β engine is truly OFF until you hold Z, and stopping the engine sets the parking brake (ParkBrakeHold grabs it). Caveat to watch: in my session the Charger (and Crown Vic β same chassis kit) pulls away very weakly from a dead stop β looks like a pre-existing kit torque problem, tracked separately, tell me what you see. Test: spawn Charger β silent + P β hold Z β crank + idle sound β E/W β tell me how it pulls. |
| 231 | Nissan 180SX β Z starts it AND the ENG chip is a real button NEW | FIXED (Aug 12): (a) Z was dead for the same game-wide reason as #230 (starter script disabled) β plus this drift kit re-asserts "engine on" every frame at idle, which would have silently defeated the gate, so its Drive script now respects the car-side ignition flag. (b) you couldn't click the engine button because the ENG chip was never a button β it was a plain text label. It's now a real button driving the same code path as Z (click = 0.7s crank then on; click again = off + parking brake). Reminder: the cursor is locked while driving β tap CTRL (or the top-right cursor icon) first, then click ENG. Verified live on the 180SX and the Crown Vic, both directions. Bonus: the console spam this car threw every rev ("Backfire/Smoke is not a valid memberβ¦") is guarded off, and its tire-smoke FX actually emits again. Test: spawn 180SX β engine OFF, HUD shows P β hold Z β starts β E then W β drives (it's a drift kit, expect wheelspin) β CTRL β click ENG β off + held β click ENG β restarts. |
| 232 | Fleet sweep β 27 cars got their engine sound back NEW | FIXED (Aug 12): the Charger's silent-engine disease (sound plugin saved without its Rev sound β hangs forever β mute car) turned out to be fleet-wide: 27 cars had it. All restored mechanically from each car's own saved seat copy: Taurus, Tahoe, Explorer, Crown Vic, Tesla-X, McLaren P1, Hellcat + Charger, every PBPD cruiser (incl. both SAHP gamepass cars + the Bearcat), all 4 Fire trucks, the bin lorry, Mercedes, Pagani Zonda, Rivian EDV. Audit also flagged (not yet fixed): ~35 cars still auto-start their engine sound on sit instead of waiting for Z (cosmetic β Z still gates the brake), the FHP FPIU throws one Smoke_FE startup error (same lost-template disease), and the SundownIgnition cars (SF90, AMG One) self-start ~4s after sitting. Test: spawn any 2β3 of the list β hold Z β engine idles audibly and revs with throttle. |
| 233 | Joe's Fish Market — panel actually fills the screen now NEW | FIXED (Aug 19): "fish market ui is still small and needs improvement". Root cause: the panel's fit code ran on the SERVER (the pier prompt builds this UI server-side), where the camera viewport reads 1×1 — so the UIScale always clamped to its 0.62 floor = a 520×372 panel at 1920×1080 (~27% of your screen, matching your screenshot). The client-side fixer (MarketFX) that was supposed to re-scale it was created via Instance.new("LocalScript")+.Source= from the server — Source is plugin-only, so in the live game that script never existed, which also silently killed the spinning rod previews, the rate countdown, hover pops and the walk-away close. MarketFX is now a real stored LocalScript (ReplicatedStorage.Fishing_System.MarketFX) cloned into the UI, and it sizes from your viewport: ~58% of screen width, floor 700px / cap 1000px, max 90% w / 85% h on small screens — 1000×714 at 1920×1080 (measured 589×421 at the tiny Studio test window = exactly the 85% height cap). Also: cooler rows grew 56→64px with bigger text, the MARKET chip got +18px and TextScaled so the rate can never overflow its border again, and the two dead grey blobs above "NOTHING IN THE COOLER" are gone (they were a grey-tinted drawn fish that read as missing-glyph boxes — the empty state is clean centered text now). Verified with real clicks in play: all three tabs render, SELL sold one fish (+$69), SELL ALL sold the rest (+$219), β closes the panel, the countdown ticks live ("new rate in 27:38"), and all 3 rod preview tiles spin. Test: pier shop → panel is big and centered → flip SELL CATCH / RODS & BAIT / MY ANGLER → sell a fish → β. |
| 234 | Fishing rod hold — round 3, this time verified on the Blue rod itself NEW | FIXED (Aug 19): row 202 FAILED — rod vertical, handle at the hand, shaft through the pier, and you were holding the Blue Fishing Rod. This is attempt #3 at this bug. Why rounds 1–2 didn't stick: the Aug 12 pass corrected all 9 rod Tools' Grips in the editor — but ServerScriptService.GripTuner re-applies its OWN grip (orig × the RodPitch/RodYaw/RodRoll Workspace attributes) to Blue/Carbon/Golden every 3 seconds at runtime, and the saved RodPitch=168 (the Jul 15 answer for the old rod models) stomped every copy straight back the moment the game ran. Any editor-only grip fix on those three names was doomed from the start. Fix: the Workspace attributes are now the exact decomposition of the corrected grip (RodPitch 18.914 / RodYaw 16.106 / RodRoll -19.028) and GripTuner's baked-in defaults match — so the every-3s sweep now enforces the right grip on the templates, on shop-bought clones, and on rods already sitting in player backpacks. Measured in play holding the Blue Fishing Rod: tip elevation -72.5° before (down through the planks) → +48° up-forward after, 49° off body-forward (the Aug 12 target was +49.5°; the last degree is the idle arm sway). All 6 ToolStorage/InventoryTools templates verified at runtime steady-state, drift 0.009°. Test: equip the BLUE rod at the pier → shaft points up-forward over your shoulder, not into the pier; spot-check Carbon and Golden too. |
| 235 | Quest tracker moved out from under the minimap NEW | FIXED (Aug 19): "theres a ui telling me to do quests stuff and its under the minimap" — the ACTIVE QUESTS stack was hard-coded at the top of the right HUD column (y132), which lands it straight across the minimap's bottom half and the location banner — that's the "Fishing Dock" / "Talk to Sal for Doc" pile-up in your screenshot. Every other slot is taken: under the column is the job-rank widget (y428+) and the toast stack (y492+), the left edge is the radio/dispatch dock + DAILIES chip + event pills. New home: the permanently empty strip just LEFT of the minimap, under the top icon row — right-anchored at -256, y=100, so the gaps to the icons and the minimap are the same at every resolution. Measured in play: tracker at x674–920 / y100–209 at the small test window (8px clear of the minimap, quest cards fully readable); at 1920×1080 it sits at x1418–1664 — clear of the minimap (1676+), the location banner, the HUD cards, the DAILIES chip and the bottom-left event pills. The location banner itself didn't move — the two simply don't share a slot anymore. Only caveat: the top-centre pop-up banners (safe zone / AFK) can briefly overlap its top edge on very narrow windows — never at 1080p. Test: take any NPC quest → the amber π ACTIVE QUESTS stack sits left of the minimap with nothing under it → π pin still sets the waypoint. |
| 236 | PD + EMS fleet pads spawn again — and the cruiser comes out nose-out NEW | FIXED (Aug 19): "went to pd car spawner tried spawning car nothing spawned on the pads" / "spawning ems vehicles at fire staton arent working either". Owning this one: it was my own cleanup rule eating the cars, not the spawner. The fleet terminal DID spawn your cruiser every time — but my Aug 8 duty-car fix stamped SpawnedOnTeam/SpawnedAt only in the legacy spawner script, never in DealershipServer (the one the PD/fire terminals actually use), so VehicleAutoDespawn's off-duty rule (also mine) classified every unstamped fleet car as a "personal car while on duty" and destroyed it within one 15s scan — reproduced live: [VehicleAutoDespawn] removing jackhughesman_Vehicle (owner changed team) seconds after a purchase, with all 3 pads free. The Aug 12 SpawnYawDeg/DriveSeat yaw code everyone suspected was innocent — it lives in an orphaned legacy spawner nothing calls (its workspace.spawnPads folder doesn't even exist any more). Fix: DealershipServer now stamps every spawn, VehicleAutoDespawn treats job-tagged cars as DUTY vehicles (never "personal"), and the pad-yaw correction was ported to the REAL spawner — pcall'd and attribute-gated, so a weird car spawns unrotated rather than not at all. Measured in play: PBPD Crown Vic + Explorer land ON JobPads_LEO Pad1 (1.6–2.5 studs from centre), seat yaw exactly -90° = nose toward the open lane (raycast: walls sit behind, 60+ studs open ahead — not backwards, no flip needed), alive 50s+ across every despawn window; FMedic lands on JobPads_FD Pad1. Test: go on PD duty → buy any cruiser at the terminal → it appears on a blue pad facing out and STAYS; same at the fire station. |
| 237 | Parking brake releases for real + Z no longer clicks the handbrake NEW | FIXED (Aug 19): "Z seems to make parking break sound sometimes ... also when i put parking brake on manually and take back off i cant move". Both were my Aug 12 work. (a) The stuck brake: the P key is handled TWICE — by my VehicleControlRow AND by the car's own Drive script — and they track separate brake states; only the Charger/180SX got the Aug 12 sync, so on every other car the two could invert. Reproduced live on the Rivian: after brake on→off everything SAID off while the kit's internal handbrake stayed ON (rear #BV wheel motors locked at 6000 torque) → 0.00 studs under full throttle. It was never ParkBrakeHold's constraints — those released correctly every time. Fix: the P key now derives its target from the Drive clone's mirrored PBrake value, so both handlers always land on the same side (any pre-existing desync self-heals on the first press). (b) The Z sound: #147 wired the brake SFX to any PBrake value change — and Z-start flips PBrake by design (ENG1), so starting the engine clicked the handbrake. The sound now plays only on MANUAL toggles (P key / P button). Play-proved on the Charger: Z start = 0 brake sounds; P on = one click and the car sits at 0.00 studs under 2s of throttle (the strong hold survived); P off = one click and it drove 132 studs. Test: start any car with Z (no brake click), P on → floor it (car holds), P off → drive away. |
| 238 | Job car survives a team switch — and despawn toasts stop lying NEW | FIXED (Aug 19): "i had just spawned my rivian as delivery driver and it despawned it" on the switch to Fire. The eater was a THIRD despawner: VehicleAutoDespawnServer's Jul 12 "left the role" rule destroys any JobTag'd car the instant your new team leaves that job's allowed set (its toast is the "returned ... you went off duty"-style line you saw). My Aug 8 duty-car fix never touched this path, and your "only detects it once you spawn another" hunch was close — it actually fires the moment the Team property changes, occupied-or-not-recently. Fix: a job car you BOUGHT is never destroyed on a role change any more — cleanup is the Despawn button, the idle janitors, or leaving the game. On top of that, VehicleAutoDespawn now classifies job-spawned cars as DUTY vehicles, and if a duty car ever is team-despawned (the legacy TeamVehicles flow still does that by design) the toast names the fleet honestly instead of claiming your "personal car was returned because you went on duty". Play-proved: Rivian spawned as Delivery Driver, aged past every grace window, switch to Fire → alive 18s+ later (full scan passed), switch to Civilian → still alive, zero stored-vehicle toasts; and the off-duty-only rule still works the other way — an undriven personal Taurus got reaped on going ON duty with the honest personal-car toast. Test: spawn the Rivian as Delivery Driver → switch to Fire → van stays; switch back to Civilian → still there; despawn it from the dealer/phone when done. |
| 242 | Quest tracker is hidden now — you switch it on from the journal NEW VERIFY | FIXED (Aug 20): "thats a bad area for quests like can we make it so that it only appears if toggled or something … it def needs to be more hidden for quests". The π ACTIVE QUESTS stack was permanently on screen; it now starts hidden and only shows if you ask for it. I did not hijack the JOURNAL top icon — that icon (and the . key) already opens the full Quest Journal and you use that, so hijacking it would have cost you the journal. Instead the tracker got its own small toggle inside the journal: a π TRACKER ON / OFF button in the journal header, next to the β. Your choice sticks across sessions through the existing HUD-prefs store (a new showQuestTracker key in UIPrefsServer.DEFAULTS next to showMinimap/showTopIcons — no new save system invented), and a small amber dot on the JOURNAL icon tells you at a glance when it's pinned on. With it off you still get feedback: whenever a quest actually changes (new quest, objective tick, ready-to-turn-in) the tracker slides in for ~4s then slides away. Measured in play: hidden on spawn (Enabled=false); auto-peek fired → slid in from -216 to its -256 home → hid itself 4s later; toggling the pref on rendered both quest cards at the usual spot left of the minimap (x668–914) and lit the amber dot; the π pin still sets the waypoint (WaypointType=manual, target 1121,81,210); the server accepted and stored the pref. Also fixed while in there: the journal panel was a fixed 560px tall, so on a short window its entire header row — including the pre-existing β — sat under the Roblox topbar and could not be clicked at all; it now clamps to your viewport (no change at all at 720p+). Not verified: the physical click on the TRACKER button (at the tiny Studio test window its header was in that unclickable band, and Studio would not restart after the clamp fix) — everything the button calls was proved end-to-end. Test: spawn → no quest list on screen → press . or the JOURNAL icon → hit π TRACKER OFF → the list appears and the icon gets an amber dot → toggle it back off → gone → rejoin and it should remember. Also check the quest board and the π waypoints still behave. |
| 245 | PD uniform — shirt AND trousers both stick now NEW | β
CLAUDE-VERIFIED (Aug 27) · FIXED (Aug 20): "can only equip shirt no pants or pants no shirt". Root cause found in LockerServer.applyClothing: it read Humanoid:GetAppliedDescription(), changed ONE field and called ApplyDescription — and ApplyDescription yields. Picking a shirt then trousers fires two separate Equip.OnServerEvent threads; thread B read the description before thread A’s apply had landed, so B wrote a description that still carried the old shirt and stomped A’s garment straight back off. Whichever piece you picked second was the only one that survived. Now: one ApplyDescription at a time per character (a lock), the description is seeded from the garments actually on the character so an earlier write can never be lost, and the plain Shirt/Pants instance is stamped afterwards regardless — two different objects, so they physically cannot race. Test: open the locker → pick a shirt → immediately pick trousers → both stay on. Repeat picking trousers first. |
| 246 | Locker remembers your hat choice, and going Civilian actually strips the uniform NEW | FIXED (Aug 20): "needs to remember hat preference it put my hat back on when i had picked it to be off" + "when you go back to civ it keeps your uniform that needs to be fixed". Two separate causes. (1) Hat: the hat/hair choice lived only inside the session-only worn table, which is wiped on every team change and never persisted — so changing team or rejoining put your own hat straight back on. There is now a persisted prefs record (same DataStore the saved loadouts already use, separate pref_ key), it is re-applied on respawn even when there is no uniform left to apply, and a team change keeps it. RESET still clears it (that means "give me my own look back"). (2) Uniform on civ: the real culprit was OutfitPersistServer, not the locker. Its 2-second poller stamps snap.team from your team at that moment, so changing team while in uniform leaves a window where it snapshots {police uniform, team = Civilian}. Its documented "switched team while dead → new team wins" exception then does not fire (the teams match) and it re-stamps the police uniform onto the civilian character and re-asserts it for ~9 seconds so nothing can win. LockerServer now publishes a LockerUniformOn flag; OutfitPersistServer never snapshots clothes the locker put on you and stands down entirely while the locker owns the character. The team-change restore was also landing on the corpse — it is now re-asserted on the character you respawn into. Test: go PD → fit a uniform → pick no hat → die → hat still off → go Civilian → your own clothes are back → rejoin the server → hat still off. |
| 247 | Inventory trash DELETE button actually deletes NEW | β
CLAUDE-VERIFIED (Aug 27) · (remote-level: InvTrash returned ok and the item count dropped 4→3) FIXED (Aug 20): "i can drag over delete and it pops up but when i click delete nothing happens". This one is a hard root cause, not a guess. HousingV2_InventoryServer defines InvTrash.OnServerInvoke at line ~80, but that handler calls isDuty, removeFromBag and markDirty — all three are declared with local function LATER in the same file (lines ~113 / ~121 / ~207). At the point the handler body is compiled those names are not locals yet, so they resolved to globals = nil, and the first one reached (isDuty) threw "attempt to call a nil value" inside the RemoteFunction. The client wraps InvokeServer in a pcall and only reacts when it gets a table back, so the error was swallowed whole: popup closed, nothing deleted, no toast, no client-side error. The three are now forward-declared at the top of the file so the handler binds the real functions. The client and the confirm dialog were correct all along and were not changed. Test: drag any junk item onto the bin → DELETE → the item is gone and you get a "🗑 Deleted <item>" tip. Department/duty items and gamepass guns still refuse, with a reason. |
| 248 | CAST YOUR LINE pill clears when you put the rod away NEW | β CLAUDE (Aug 27): pill verified appearing on rod equip and gone after unequip in play; the post-catch re-arm guard (RodTool.Parent == plr.Character) is confirmed in FishingHandler, but a full catch could not be automated in this harness, so the exact catch-card timing case is untested live. FIXED (Aug 20): "after you catch a fish the cast your line ui stays up even if you unequip rod its an issue". Cause: after a catch, FishingHandler ran InitOnUnEquipp and then InitOnEquipp unconditionally — so if you put the rod away during the ~3.8s catch card, the UI was torn down and then immediately rebuilt with BeforeCast.Visible = true, with no rod left to ever hide it again. It now only re-arms if the rod is still in your hand. Belt-and-braces: a guardian inside the fishing GUI itself destroys the whole thing 0.3s after no fishing rod is in your character, which also covers dropping it, dying, selling it or a team swap. Test: catch a fish → unequip mid-card → pill is gone. Catch a fish with the rod still out → pill returns, ready to cast. |
| 249 | Pay N Spray actually repaints the car NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "Cool looking menu, however repainting the car did not work." Measured cause. DealershipServer paints by setting p.Color on every part carrying the baked BodyPaint attribute. That works on a plain Part — but a MeshPart with a TextureID draws the texture, not the Color, so the write lands and is completely invisible. Counted this session: Mclaren P1 21/21 tagged parts are textured, PBPD Explorer Marked 38/38, Explorer Slicktop 34/34, Legacy Taurus 11/11, SAHP Explorer 33/33, Bearcat 6/6, Crown Victoria 23/36, Hellcat 14/16, Firebird 9/14, GT500 8/9, 180SX 8/10. Because tagged came back > 0, the "no tags → use the dominant-colour heuristic" fallback never fired: you were charged $500, told "Work done", and the car did not change. Fixed without editing DealershipServer (it is on the do-not-touch list) — a new CarPaintVisible server script notices when a tagged MeshPart’s colour no longer matches the same part in the ServerStorage template (i.e. the game itself just repainted it) and clears that part’s TextureID so the paint shows. It only ever touches parts the game already recoloured, so it cannot paint a car for free, and the templates are never modified. Dry-run on 5 models: unpainted clones unmasked 0 parts every time; painted clones unmasked 21/38/9/23 with 0 left masked; a car with no textured body panels (Dodge Charger) was untouched. Test: drive your car into LS Customs → RESPRAY → pick GARNET RED → the car changes colour on the spot → despawn and re-spawn it → still red. |
| 250 | Admin cash drop / lost duffle spawns on the ground NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "The action of the event works, however it spawns in the AIR. lets make it spawn on the ground." The Aug 12 pass filtered the invisible Locations markers and the players out of the ray but still cast from 60 studs above the target — so any canopy, awning, gantry or roof between the sky and the marker caught the ray first and the crate was placed neatly on top of it. randomSpot is rebuilt on the same pattern NPCQuestServer.castDrop uses for the quest NPCs: cast from just above the target first so nothing overhead can intercept it, only fall back to the wide cast if that misses, RespectCanCollide so signage and decoration are transparent to the ray, still exclude the markers / every player character / any crate left from a previous event, and reject a hit far below the marker (that means the ray sailed past the building into the void) — it tries another landmark instead. Measured: 14 of 14 simulated drops accepted, every one landing on real ground (Terrain, roads, unions, baseplate) within a few studs of the landmark; the Procopio Drive marker itself floats ~6.7 studs and the crate now correctly lands on the road below it. Test: admin panel → force a cash drop and a lost duffle a few times → each one sits on the deck, not on a roof. |
| 251 | Scoreboard STATS — offline player search is back NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "I'm not seeing the option to search anyone offline". The search row and the server side (StatsLookup, which already reads the DataStore for players who are not in the server) have existed since Jul 16 — but on Jul 17 the row was set Visible = false with the note "stole Tab focus". That was the real blocker: this scoreboard is hold-Tab, so you physically cannot type a username while holding the key that keeps the board on screen, and letting go closed it. Opening the stats side-panel now pins the board open, so Tab can be released and the box used; Tab again, Esc, or the panel’s × closes it. The stat list was also moved down 32px so the (now visible) search row does not sit on top of it. Test: hold Tab → click any player’s name → let go of Tab, the board stays → type an offline player’s username (or their UserId) → Search → their card shows with "⚫ offline" and their lifetime stats. |
| 252 | Replay Tutorial opens on the tour’s first shot, not on you NEW | β
CLAUDE-VERIFIED (Aug 27) · (replay opened framed on tour stop 1 at (-273,322,530) while the player stood at the pier) FIXED (Aug 20): "when i hit replay tutorial it keeps starting camera at where my player is in map". Two faults stacked. (1) the camera was captured once at script load (local cam = workspace.CurrentCamera); if Roblox ever swaps CurrentCamera — which a respawn/character reload does, and a replay always follows one — every write landed on a dead camera object while the live one just kept following the player. (2) even on the right camera, CameraType was flipped to Scriptable at the top of the function but the first shot was not framed until goTo(1), ~140 lines and one whole UI build later — and a Scriptable camera with nobody writing to it freezes exactly where the player is standing. The camera is now re-resolved and stop 1 is framed immediately, before any UI exists, and each stop re-asserts Scriptable so a stale Custom cannot win a frame. Test: Help → Replay Tutorial from anywhere in the map → it opens on the wide town overview every time. |
| 253 | CTRL free-cursor icon only appears when you’re in a vehicle NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "make it so the CTRL UI option at top ONLY shows up if youre in a car". The Aug 8 pass had deliberately made it always-on for PC. VehicleMouseControl now publishes a player attribute InVehicleSeat and TopIconsManager gates that one icon on it, on top of the existing row toggle. Note this is a wider test than the camera-lock flag: that one is VehicleSeat-only (the driver), while a passenger sits in a plain Seat inside the same vehicle model and still wants the free-cursor button — so it checks whether the seat you are in belongs to a model that owns a VehicleSeat. MDTVehicleGate was deliberately not reused: it only knows about duty vehicles. The CTRL keybind itself still works everywhere, on foot included. Test: on foot → no CTRL icon in the top row → get in any car (driver or passenger) → it appears → get out → it goes. |
| 254 | Fishing rod sounds are local again NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "I can hear fishing sound from rod across map restrict it to only nearby". Measured: the two reel sounds on every rod (FastSpinning, SpinningLittle) shipped with RollOffMaxDistance = 10000 — ten thousand studs, i.e. the whole map, for both players. (WaterSplash was already sane at 60.) Both are now 70 max / 8 min, InverseTapered, on all three rod tiers in all three places they live (ToolStorage, InventoryTools and the RodPreviews) — 18 sounds changed. Test: have one player fish while the other stands across town → silence → walk to within ~70 studs → you hear the reel. |
| 255 | Vinny the Fixer moved off the Black Market’s prompt NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "Vinny the fixer is too close to black market guy it interferes". Measured: Workspace.Blackmarket (a Part) sits at 497.6, 80.8, -121.3 and its own "Browse (Illegal)" prompt has MaxActivationDistance = 10; Vinny’s Talk prompt is 11. His old offset put him 9.9 studs away — inside the black market’s own trigger radius, so the two fought over the E key. He is now at +(24, 0, 22) = 32.6 studs, still the same lot; ray-checked before moving him: flat Terrain at y=77.6, clear headroom, no overlapping parts. The dead-drop follows him automatically and was ray-checked too (Terrain at y=78.5). Test: stand at the black market → E opens the shop, not Vinny → walk to Vinny → E talks to Vinny. |
| 256 | Dead-drop is invisible unless you’re actually on that quest NEW | β CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "random dead drop at construction site nothing happens when i hold e what is this?" / "shouldnt that only be seen if theyre on the quest and need it?". Both halves answered: the drop part, its billboard and its prompt were built once at server start and left in the world forever, for everybody — and holding E did nothing because the Triggered handler no-ops unless you are on Vinny’s step 2 (The Pickup). So every player saw a mystery duffel by the construction pipes that silently ignored them. It is now invisible, non-collidable and prompt-disabled until somebody in the server is genuinely on that step, re-checked once a second. Honest limitation: ProximityPrompt visibility is not per-player, so this is a server-wide gate — if one player is on the pickup step, the drop is visible to the server. Test: with nobody on Vinny step 2, walk the construction site → no duffel, no prompt. Take Vinny’s "The Pickup" job → it appears and hold-E gives you the package. |
| 257 | Mickey the dockhand is in the fish market with Joe NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "Can you put mickey the dockhand in the same room as the fish market npc?". Joe is the model Workspace."+", HumanoidRootPart measured at -809.8, 77.6, -568.4, inside Workspace."Fishing Hut" (floor y=74.59, ceiling y=87.03). Mickey’s old placement used a Locations lookup that dropped him out on the open pier. He now stands at Joe + (0, 0, 13) — probed 15 candidate spots, this is the closest one inside the hut with zero overlapping parts that still keeps their two Talk prompts (Joe 10 studs, Mickey 11) from stealing each other’s E. He is resolved off Joe’s prompt text rather than the model’s literal name "+", with the measured position as a fallback, and still ground-snapped by the existing dropTo. Test: go to the fish market hut → Joe and Mickey are both inside, ~13 studs apart → E on each gives the right NPC. |
| 258 | Pontiac Firebird headlights — the light rig it never shipped with NEW | FIXED (Aug 20): "Headlights on Pontiac Firebird does not work". The model was genuinely missing the parts. Console said it plainly: Lights is not a valid member of Model "Workspace.1968 Pontiac Firebird.Body". The car ships the EPICLIGHTS_V4 plugin, and that plugin’s handler does local lights = car.Body.Lights on line 19 — the Firebird is the only EPICLIGHTS car in the place with no Body.Lights model at all (checked all 30-odd cars in Workspace and Vehicle_Storage), so the handler died on its first line and nothing downstream ever ran. The rig has been built from the car’s own geometry: the full skeleton the handler indexes (Headlights/Low/High/Running, Indicators/LeftInd+RightInd/Front+Rear+Side, Interior/Front+Center, Plate, Rear, Reflectors, Reverse, Brake, Fog) plus real working headlights — four spotlight anchors and two neon lenses positioned off the car’s own headlight-glass mesh (its local X is lateral and its local -Z is the car’s forward, verified by dot product against the DriveSeat look vector). Applied to both the Workspace car and the Vehicle_Storage.Sport spawn template. The two dead vendor LightsGlobal scripts were disabled — they infinite-yield on a LightsRemoteEvent that does not exist anywhere in the model (that was the second console warning), and no other car in the place has them. Be clear about scope: this restores headlights (H, low + high beam). Tail, brake, reverse, indicator and fog groups are present but empty — the model has no tagged parts for them, and inventing them would be faking it. Test: get in the Firebird at night → press H → headlights on, press again for high beam → console no longer shows the "Lights is not a valid member" error or the LightsRemoteEvent infinite yield. |
| 259 | Dealer horn menu did nothing — a scope trap NEW | FIXED (Aug 20): equipping a horn from the dealer menu silently failed every time. DealershipServer line 1089 defines _G.DealerSetHorn, which calls cgFindCar(plr) — but cgFindCar was declared local function at line ~1150, 61 lines below. At runtime the call therefore read a nil global and threw inside the pcall chain, so HornServer got nothing back and the UI just shrugged. Same bug class as the three just fixed in HousingV2_InventoryServer. It is now forward-declared above _G.DealerSetHorn and assigned with cgFindCar = function(plr) so it binds to that upvalue. Swept the whole file for the same pattern as asked — every other local function is declared before first use (the four other hits were name mentions inside comments, not calls), so this was the only one. Test: buy/equip a horn from the dealer customisation menu while sat in your car → the horn actually changes and survives a re-spawn of the car. |
| 260 | You can only get into a car with E now NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "i was in the type x and it still let me jump into the driver seat you need to make it so you can ONLY get into cars by pressing e". Root cause: there was no entry prompt in the game at all. I inventoried every ProximityPrompt in Workspace — ATMs, bins, job pads, shops — and not one was on a vehicle seat, so Roblox’s default touch-to-sit was the only way in and it was fully live. New server script ServerScriptService.VehicleEntryGate sets Disabled = true on every empty vehicle DriveSeat (the same switch TowMissionServer already uses to make wrecks un-sittable) and adds a tap-E “Enter” prompt that does the seating itself. It re-asserts Disabled whenever a chassis flips it back — A-Chassis Initialize sets it false on its literal last line — and whenever the seat empties. Getting OUT is untouched (Disabled only blocks new sits). Locked cars still refuse: the prompt mirrors VehicleOwnershipServer’s owner / duty-team / key-holder check and toasts “Locked”, and the existing 1s eject sweep is still there behind it. Duty vehicles work via the same AssignedTeam check. Deliberate scope: only VehicleSeats named DriveSeat (94 of them across Workspace + Vehicle_Storage) are gated. Passenger seats are left alone on purpose — the Land Rover and BSOFR kits drive their own Disabled/prompt logic on those and gating them would fight it. Tow wrecks (TowTarget) are skipped entirely. Test: walk into a driver seat → nothing happens → press E → you get in. Then: get out (works), sit as a passenger (works), try a locked car you have no keys to (refuses with a toast), and take out a duty car as the right team. |
| 261 | Parked cars stop getting punted under the map NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "i touched it after a min physically after i got out of car and it threw it under map ... it kinda almost needs to freeze it but not make it completely frozen". An unoccupied car is a live unanchored assembly with no driver and no network owner, so a character walking into it dumps character-physics impulses into a multi-ton body — the classic launch-through-the-floor. Approach chosen: anchor-after-settle, on the DriveSeat only. Once a car has sat under 1.5 studs/s for 4s with nobody in any of its seats, VehicleEntryGate anchors the DriveSeat — which is the assembly root the whole body is welded to, so one anchor holds the car while the wheels stay unanchored and the chassis rebuilds cleanly on wake. It is not permanently frozen: the E prompt wakes it before it seats you, any seat gaining an occupant wakes it, and _G.VehicleGateWake(model) wakes it for anything else. Cars that were already anchored by design are never touched, and we only ever un-anchor what we anchored. Interactions I checked rather than assumed: ParkBrakeHold only runs for the LOCAL DRIVER of an occupied seat, so it can never overlap this; VehicleAutoDespawnServer keys off velocity + occupancy, both of which read “idle” for a semi-parked car, so the 30-min cleanup still fires; TowMissionServer wrecks are excluded so tow physics are untouched. Test: park, get out, wait ~5s, then run into the car repeatedly → it should not budge and definitely not launch. Then press E → it must drive away normally, immediately. |
| 262 | 180SX Type X (and the M2) got their engine note back NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "startup sound but no driving engine sound". Same class as the 27 cars whose Rev child had been lost, different node: the sound instances were all present, but Body.Exh’s Idle / Red / RevA / RevB / RelA / RelB all had a completely blank SoundId. The AC6_Sounds plugin dutifully played and pitch-shifted six silent sounds. Compared against every other Body.Exh car in the place; the 180SX was fully blank and the BMW M2 G87 had the same hole (only Red was set), so both were fixed. IDs were lifted from cars already working in this place (the Nissan R34 set for the 180SX, the BMW M3 set for the M2) — no new assets — and every one was verified to actually load before use (IsLoaded=true, TimeLength 0.70–8.91s). Applied to both the Workspace car and the Vehicle_Storage.Sport spawn template. Test: drive the Type X → you should hear idle, revs and off-throttle. Same for the M2. |
| 263 | ATM robbery is a job now, not a keypress NEW | β CLAUDE (Aug 21): tap-E confirmed in play — RobATMPrompt.HoldDuration = 0 on all 3 ATMs. The 12s progress panel + dirty-cash payout were not run this session. FIXED (Aug 20): "it works it gives dirty cash make it so you just press e once not hold and make a small ui and it take a bit longer to get it make it a process". All three: the Rob-ATM prompt is now tap E (HoldDuration 1 → 0), the crack runs 12s instead of 7, and it draws a proper on-screen panel low-centre — live bar, live percentage, and a status line that walks through Bracing the drill → Punching the lock → Bypassing the keypad → Peeling the cash box → Pulling the cassettes. It stays interruptible: walk out of range, die, or leave and it aborts with the existing “you bailed” toast. Still pays DIRTY cash as decided, so the black-market laundering loop is untouched, and the wanted +2 / silent-alarm-to-PD behaviour is unchanged. Test: with a drill, on a non-emergency team, tap E on an ATM → panel appears and counts up over 12s → dirty cash at the end. Then do it again and walk away halfway → it aborts. |
| 264 | Dumpster diving — you can finally see the bar, and hear it NEW | β
CLAUDE-VERIFIED (Aug 27) · (progress ring + panel shown, rummage sfx 9113244252 heard at the bin, payout toast "+$53 in a coffee tin" landed) FIXED (Aug 20): "functional but dont see a progress bar would be cool if we did and made it take a few seconds and rummaging through trash sound". Root cause of “dont see it”: a progress bar did exist from the Aug 8 pass, but it was a 150×30 BillboardGui pinned 3 studs above the bin with AlwaysOnTop=false — the dumpster lid occludes it, and at 1.4s it was gone before you looked up. Built on that instead of duplicating it: the same doer-only, walk-away-aborts logic now renders as the same on-screen panel the ATM uses, the dig is 4.2s, and the status line runs Lifting the lid → Shifting the bags → Something’s down there. The rummage sound now loops for the whole dig and is stopped by the caller, instead of a one-shot that ended before the (longer) bar did. Sound verified, not assumed: rbxassetid://9113244252 reported IsLoaded = true, TimeLength = 2.60s on a live probe — and a candidate replacement I tested alongside it (1846319565) came back “Asset type does not match requested type” and was thrown out, which is exactly the silent-failure trap this game has a history of. The existing per-player cooldown toast is untouched. Test: E on a dumpster → panel + continuous rummaging for ~4s → result toast. Walk off mid-dig → aborts and the bin isn’t burned. |
| 265 | Lumberjack: tree hits are a chop, not an earthquake — and tap E NEW | β
CLAUDE-VERIFIED (Aug 27) · (fresh-boot re-check: [E] chop felled a pine and paid 3 logs) β CLAUDE FIX (Aug 21, in play): chopping was completely dead for BOTH inputs. wireTree guarded on the persisted p:GetAttribute("Wired") flag, which is saved in the place file — so on every fresh boot all 30 groves came back already flagged and the function returned before p.Triggered:Connect(onChop) and before state[m].trigger = onChop. Net effect: the [E] prompt was connected to nothing and the click-swing scan (which requires st.trigger) matched no tree, so every swing answered "Nothing in range" and no tree in the game could be felled. Fixed by keying idempotency off a per-server-run wiredPrompts table instead (sentinel VER1). Re-tested in play: pine felled — "π² TIMBER! +3 Pine Log", "+12 XP Β· Felled a Pine", sawmill waypoint set. FIXED (Aug 20): "still loud earthquake shaking type sound when you hit tree" + "make it so you tap e not hold e". The hit asset itself is fine and verified-loading (9125402735, IsLoaded=true, 2.88s) — what made it a tremor was volume 0.6 carried 90 studs at 1.0× speed, which is nearly all low-end rumble. Now: volume 0.2, range 32 studs (min 6, InverseTapered) instead of 90, PlaybackSpeed 1.35 to lift it out of the rumble band, and an EqualizerSoundEffect with LowGain −28dB to cut the bass that was the “earthquake”. Separately the chop prompt is HoldDuration 0 = tap. The swing rate is unchanged — the per-player lastChop gate still spaces swings by Cfg.ChopHold × 0.8, so this cannot be spam-clicked into a faster tree. Test: swing at a pine → one tap per swing, and the hit should read as a chop you only hear nearby. |
| 266 | Chainsaw is held the right way round NEW | FIXED (Aug 20): "chainsaw is held wrong way". The Chainsaw was shipping the identical Grip CFrame as the three axes — which is correct for a 3-stud shaft whose length runs down local Y, and wrong for a chainsaw whose bar runs down local X. Result: in the R6 tool pose the bar pointed straight up out of your fist. First thing I checked was GripTuner, since it is what defeated two earlier fishing-rod fixes by re-applying stored rotations every 3s — the Chainsaw is not in its table (only the three rods, Taser, Flashlight and Drill), so the fix belongs on the tool and will stick. New grip: bar forward, body upright, hand on the rear of the housing. Not guessed — verified visually: the brief warns blind grip guessing has failed here before, so I built a mock right-arm rig in Edit at the exact R6 RightGrip C0, hung the known-good Hatchet next to two candidate chainsaw grips, and took screenshots until the bar sat where the axe head sits. Test: clock in, equip the chainsaw — bar should point forward like you’re about to cut, not skyward. |
| 267 | Lumberjack clock-in pad removed NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20): "get rid of the clock in thing though its pointless its already done through phone". The ClockInPad part is deleted from Workspace.LumberCamp and LumberjackServer no longer builds a prompt for it (plus a belt-and-braces sweep in case an old copy comes back from a backup place file). Confirmed the job still works before deleting anything: the Phone → Jobs card “Lumberjack” (PhoneClient) routes to TeamChangerServer, which has Lumberjack in its CIV_JOBS table, and the axe still arrives because the Team-changed hook at the bottom of LumberjackServer calls giveAxe() no matter what changed the team. Two toast strings that still said “clock in on the pad” were repointed at the phone. Nothing else in LumberCamp was touched — the sawmill, log stacks, posts, roof and the whole Trees folder are all still there (11 children left). Test: Phone → Jobs → Lumberjack → you get the team and the axe → chop → sell at the sawmill → Phone → Civilian to clock out. The pad should be gone from the camp. |
| 268 | Z actually starts the engine now — on every car VERIFY NEW | β
CLAUDE-VERIFIED (Aug 21) · FIXED (Aug 20) — but this one changes how every car feels, so test it FIRST: the brief was to add a per-car “Z bridge” to ~35 cars. There is no such bridge anywhere in the place and there never was — I checked all 87 A-Chassis cars: every one has AutoStart = true, every engine-sound plugin already reads IsOn, and no car has any extra script doing this. The real bug is one line, universal: A-Chassis Initialize clones the car’s A-Chassis Interface into the driver’s PlayerGui on sit (line ~663), and it is that clone’s Drive loop that runs the chassis. VehicleEngineStart was writing IsOn and PBrake to the car-side template, which no running code reads — so the engine was lit from frame one on every car and Z was cosmetic. The parking brake only looked like it obeyed Z because ParkBrakeHold happens to read that same dead template and applies its own physics hold (and Drive line ~1160 only ever writes Values.PBrake, never reads it — confirmed). VehicleEngineStart now resolves every live interface for the car out of PlayerGui and writes to all of them plus the template, re-applied every Heartbeat so kits that re-assert IsOn on a timer (the Ignition plugin does exactly that 4.4s after you sit) cannot win. Fail-safe by design: if the live interface can’t be found the behaviour is exactly what it is today, so a miss is a no-op, not a dead car. One fix, all 87 cars — zero per-car edits, and I did not skip SF90 / AMG One because the “self-start by design” premise didn’t hold up: they are ordinary AutoStart=true cars like the rest. Test: get in ANY car → it should be silent and immobile → hold Z → crank, then it starts and drives. Do this on a police car, the 180SX, the SF90 and a fire truck. If any car will not move after Z, tell me which one immediately. |
| 269 | Global announce — the subscriber was there, but fragile and doubled NEW | FIXED (Aug 20): the brief said nothing calls SubscribeAsync. Not true — AdminCore line 876 already subscribed to AdminAnnounce. Two real bugs behind it though. (1) both SubscribeAsync calls shared one pcall, and SubscribeAsync throws in Studio and can throw live on a rate-limit or outage — if the AdminKick one threw first, the announce subscribe below it never ran at all and a global announce reached nobody but the sending server. They are now independent, each retried up to 4 times with backoff and each warning under its own topic name. (2) MessagingService delivers a message back to the server that published it, and H.globalannounce also fires locally — so the origin server showed every global announce twice. Publishes now carry a per-server tag (JobId + GUID, because JobId is empty in Studio) and the subscriber drops its own echo. That tag is declared at the top of the file on purpose: H.globalannounce is 640 lines above the subscriber, and a local further down would have been a nil global there — the exact trap fixed in row 259. Kept to announcements only; game events are deliberately not made global. Test: needs two live servers — run a global announce from one and confirm it appears once on both. |
| 270 | PERKS is now PROGRESSION — and you can’t pay to level up NEW | β
CLAUDE-VERIFIED (Aug 21) · NEW (Aug 20): "dont make it so someone can pay to level up". ProgressionPerksServer’s purchasable rank-up is off, and off in the safe direction: the flag used to mean “enabled unless the attribute is false”, so a missing attribute meant ON. It now requires RankBuyEnabled == true to run at all, and workspace.RankBuyEnabled is set to false in the place as well. The server refuses the remote, not just the button: a hand-rolled ProgRemotes.RankBuy:InvokeServer("buy") is rejected at the top of the handler — before any pricing, cooldown or bank code runs — and logs a warn naming the player. Every line of the purchase path is left intact behind the flag, so one attribute switches it back on. Tab renamed PERKS → PROGRESSION on the top-row icon (scale-to-fit with a size cap, because “PROGRESSION” does not fit a 48px chip at TextSize 8); the panel’s own title already read PROGRESSION. The dead BUY NEXT RANK button is not left as a hole — when it’s hidden the perk list reflows up into the 42px gap, and the button is kept rather than deleted so re-enabling restores the old layout. Tested in Edit, not just compiled: the shipped rankBuyEnabled() was extracted from the live source and run — attribute nil → false, false → false, true → true. The internal instance names (PerksButton) were deliberately NOT renamed: TopIconsManager and TutorialTourClient both key off them. No hotkey was added and it was not merged into the XP card — you didn’t ask for either. Test: open the tab — icon should read PROGRESSION, no BUY button, and no blank gap above the perk list. |
| 271 | Pawn shop: opens on BUY, refuses hot goods, stocks oddities NEW | β
CLAUDE-VERIFIED (Aug 21) · NEW (Aug 20): three changes. (1) the shop opens on the BUY tab now — and setTab runs before refresh, so the first paint is already the buy shelf instead of showing SELL for a frame and swapping. (2) It won’t buy hot goods, and that’s enforced on the server — PawnSell refuses before any inventory or money code runs, so a hand-rolled remote call dies too. The list isn’t invented: it’s cross-checked against the three systems that already define “illegal” in this game — K9Server.CONTRA_ITEMS (what a police dog indicates on), WantedSystem’s ILLEGAL_GUNS/ROBBERY_TOOLS, and what the Blackmarket shop actually stocks. Result: every Weapons-category item, plus dirty cash, banded cash bundles, the drill and the lockpick. The shopkeeper says why (“A breaching drill isn’t a power tool, it’s a felony”) and points you at the black market, and anything hot you’re carrying now appears as its own red WON’T BUY row at the bottom of the SELL tab with the reason on it, so “why won’t it let me sell this” is answered in place. There are no drug items in the catalog (all 44 checked) — if any are added later with cat="Drugs" they are refused automatically. (3) Stock: added gold_watch, diamond_ring and rod_carbon (the first two existed in the catalog with no way to obtain them at all). Quest hook-up — checked, not guessed: the only quests that ask for an ITEM are Doc “Restock” and Rosa “Family Recipe” (Medkit — already stocked here, so those two already work today), Sal “Hot Hardware” and Mickey “Deep Water” (Drill), and Vinny “Hardware” (AK-47). Drill and AK-47 are contraband and are already sold by the Blackmarket, so stocking them here would directly contradict change (2) — they were deliberately left out rather than faking a quest link. Bug found on the way and fixed: buy prices ignore the Pawn Boom multiplier, so during a boom every stocked line was already a money printer (buy at 0.86× value, resell the same second at up to 1.74×) — adding a $5,000 diamond ring would have turned that into thousands per click. Buy price is now floored at sell price + $1. Tested in Edit: the shipped refusal and pricing code was extracted from the live source and run — 14 must-refuse ids all refused, 14 must-accept ids all accepted, and across 30 market states × 11 stock lines the worst buy-minus-sell margin is +$1. Test: E on the shopkeeper → it opens on BUY → try to pawn a gun, a drill or dirty cash → refused, with a reason and a nudge to the black market. |
| 272 | ONE store, and it gifts — the duplicate store app is deleted NEW VERIFY | NEW (Aug 20): My mistake, corrected. You said "there already is a store app in phone for robux thats where you can buy gamepasses and mney and stuff so like thats alr done i hope you didnt make another :/ and it needs to be integrated to allow gifting under that." — I had made another. Last session built PhoneClient.StoreApp (21,735 chars) without noticing the phone already had PhoneClient.RobuxApp sitting in the dock. StoreApp is deleted; RobuxApp is the survivor, untouched in look and layout: the same CATEGORIES cards, the same CASH tiers and dev-product ids, the same gamepass rows, the same caches, the same PromptGamePassPurchase when you buy for yourself. Gifting was merged in as a per-row choice, not a mode: every gamepass row keeps its green Buy button and gains a small gold 🎁 button beside it. I picked per-row over a FOR ME / AS A GIFT toggle at the top because RobuxApp is a drill-down (CATEGORIES → CASH or GAMEPASSES), so a top-level toggle would live on the categories screen where it means nothing for CASH — cash dev products cannot be gifted, they credit whoever pays. Per-row puts the gift affordance only where gifting is actually possible and moves nothing else on the page. The gift screens (in-server player list with avatars, offline username lookup, confirm card) are the ones from the deleted app, calling the same GiftRemotes in the same order: OwnsPasses → PassList → Eligible/LookupUser → CanGift → BeginGift. GiftPassServer was not touched — the single game-wide ProcessReceipt, the PurchaseId idempotency in GiftReceipts_v1 and the “same pass, same person, twice” dedupe are exactly as they were, including last session’s relaxed self-buy guard. Two things got better on the way: the store now lists all 7 giftable passes instead of the 4 hard-coded ids (Phone Upgrades, Luxury Housing and x2 XP were only reachable from the duplicate), and OWNED now comes from the server — so a pass somebody gifted you finally shows as owned instead of the store offering to sell it to you again. Every trace of the duplicate is gone: home-grid tile, All Apps row, App Store listing, the store page builder and the page id. A full-place scan reports zero live references, and the phone has exactly one store tile (Robux Store, in the dock). The top-row 🛒 STORE icon, the I key and _G.OpenGiftUI() all still work — they open _G.OpenPhonePage("robux") now. NOT verified in play — Studio play mode is still jammed on “Start play hasn’t finished yet” (fourth session running), so this is compile-clean only: no live pass list, no prices, no Robux prompt has been seen. One thing to decide: now that the top-row STORE chip just opens the phone, it may be redundant sitting next to the phone chip — say the word and it goes. Test: Y → Robux Store → GAMEPASSES → all 7 should load with prices → Buy one for yourself → then hit 🎁 on another, pick someone, confirm, and check they actually get it. |
| 273 | Admin events: this server, or every server NEW VERIFY | NEW (Aug 20): every admin event now has a twin. Why twin buttons and not a toggle: AdminClient is at 199,502 of its 200,000-char cap, so a “global?” checkbox could not be added to its UI at all. Instead ten new actions went into AdminShared — 🌐 Global Cash Drop / Lost Duffle / 2x XP / 2x Money / Double Pay / Rush Hour / Fish Frenzy / Pawn Boom / Payday / Stop Events — and AdminClient’s existing generic renderer draws them for free, inside the same EVENTS group, with the globe sorting them into their own block. It also makes the choice explicit per fire instead of a sticky mode somebody leaves switched on. New server script EventBroadcastServer owns the MessagingService side and reuses the exact pattern proven by the announce fix in row 269: a per-server tag (JobId + GUID), the subscriber drops its own echo, and SubscribeAsync gets its own pcall with retry and backoff. Guards, all four tested: (1) the origin fires locally then publishes and drops its own echo, so it can never run twice; (2) a failed publish falls back to local-only and says so to the admin in the panel, and the audit line records the fallback; (3) a server already running that event ignores the inbound copy instead of restarting it, re-announcing it or extending its timer — one-shot Payday is exempt because ServerEventsServer already has its own 10-minute cooldown; (4) unknown ids, unknown kinds, malformed payloads and anything older than 2 minutes are dropped, and durations are clamped. Event state is unchanged — ServerEventsServer’s table and the Workspace attributes are still the only source of truth, so EventStatusClient’s bottom-left countdown pills keep working untouched. Permissions default to Senior Admin and above (same blast radius as Global Announce), and the ids all start gev on purpose so AdminCore’s perms-seeding migration picks them up on a live server that already has a saved permissions blob — without that they would have been invisible forever. Tested in Edit: the shipped applyLocal and the shipped subscriber callback were loaded with stubs and driven through 16 assertions, all passing — own-echo-drop, no-stacking on both the timed events and the XP/Money attribute boosts, staleness, clamping and malformed payloads. NOT tested across two live servers — that needs the published game, and Studio play mode is jammed. Test: fire “Double Pay” and confirm only your server reacts; then, with a second server open, fire “🌐 Global Double Pay” and confirm it announces once on both. |
| 274 | Pawn shop got checks and balances — finite stock, diminishing returns, a register cap, and no money printer NEW VERIFY | β
CLAUDE-VERIFIED (Aug 21) · NEW (Aug 20): "make it so pawn stuff has a lot of checks and balances and is advanced too like make it so he may not to buy a ton of something when buying idk within reason idk." Four guardrails, all enforced on the server. (1) The shelf is finite. Every line has a stock count and a restock speed — Water 12 (one back every 45s), Medkit 4 (300s), Carbon Rod 1 (30 min), Gold Watch 2 (40 min), Diamond Ring 1 (60 min). Buying drains it, he can genuinely sell out, and the BUY tab now shows “7/12 in stock”, “only 2 left!” and a dead OUT OF STOCK button when it is empty. Stock is reserved before any money moves, so two people clicking the last diamond ring in the same instant cannot both walk out with one. (2) He will not buy a ton of one thing. The first 4 of an item inside a window pay the full offer; after that each one pays 12% less than the last, down to a 35% floor, and at 18 he refuses the line outright with “I’ve got plenty of those — come back later.” One unit of that wears off every 100 seconds, so it clears completely in 30 minutes. The SELL row shows the cut offer, what it used to be, and why: “offer $3062 each (was $3480, −12% — he’s stocked up)”. (3) The register runs dry. A rolling ceiling on how much cash one player can pull out of the shop — $25,000 per 30 minutes, decaying continuously, shown in the footer as “register $X left”. Both numbers are Workspace attributes (PawnCashCap, PawnCashWindow) so you can tune them without touching code. (4) The money printer is dead for good. Row 271 floored the buy price at today’s sell price + $1, which killed the same-second loop but not the obvious one: buy the shelf out while the market is calm, sit on it, sell it all back during a Pawn Boom. The floor is now the all-states ceiling — the most that counter could ever pay for that item (best category rate 1.45× and Pawn Boom 1.6× at the same time) plus a dollar — so there is no market and no event that can invert the spread. Proved by running the shipped code, not by reading it: the live pricing functions were extracted straight out of PawnShopServer and driven through 990 combinations (11 stock lines × 15 market rates 0.65–1.35 × 3 category jitters × boom on/off). Worst same-instant margin +$1; worst cross-time margin — cheapest possible buy against dearest possible sell — also +$1. Diamond Ring: cheapest it can ever be bought is $6,961; dearest it can ever be sold is $6,960. The stock, saturation and register code was run too: the shelf empties at 12 and refills exactly on schedule, 18 gold watches pay $36,016 instead of $62,640 and the 19th is refused, and the cap stops the 4th diamond ring then fully recovers in 30 minutes. Also checked the loop cannot walk in from another shop: the old StoreServer that sold these at 1.0× value is Disabled (so is its client, so its remotes never exist), the live ShopHandler only sells weapons the pawn already refuses, and inventory Quick Sell pays 0.6×. Anti-abuse: a per-remote 0.35s gap plus a 15-calls-per-10-seconds burst ceiling, and quantities are now rejected instead of quietly floored when they are not whole positive numbers — NaN, infinity, 0, 2.5 and negatives all bounce. The existing “can’t sell what you don’t have”, “can’t spend what you don’t have” and distance checks were already there and were left alone rather than duplicated. The row-271 hot-goods refusal and the BUY-tab-first behaviour are untouched. NOT verified in play — play mode is jammed, so this is compile-clean plus the extracted-logic runs above. Test: E on the shopkeeper → buy every diamond ring he has → it should go OUT OF STOCK → sell him 6 of the same item and watch the offer drop with the reason on the row → keep going and he should refuse the line entirely. |
| 275 | Five tree species, locked behind your Lumberjack rank NEW TEAM VERIFY | β
CLAUDE-VERIFIED (Aug 27) · (rank toast reproduced: XP set to 0 server-side → "π Ironbark β locked · Requires rank 5 β you're rank 1", chop refused) β CLAUDE (Aug 21): grove verified in play — exactly Pine 12 / Fir 8 / Cedar 5 / Redwood 3 / Ironbark 2 across 30 trees with SpeciesRank 1–5 and locked prompts reading e.g. "π Ironbark Β· needs rank 5". The rank refusal toast was not reproduced (test accountβs rank cleared the gate). NEW (Aug 20): "it would be cool if you can get different types of trees you have to be different levels to cut down so progression." The grove is now five species: Pine (rank 1), Douglas Fir (rank 2), Cedar (rank 3), Redwood (rank 4) and Ironbark (rank 5), spread 12 / 8 / 5 / 3 / 2 across the same 30 trees. The common pine grows on the near rows by the camp and the rare species sit progressively further up the hill, which is not decoration — the whole pay balance is built on that extra walk. You can tell them apart before you get there: each species has its own leaf and bark colour and its own size, so an Ironbark is a 77-stud near-black-trunked giant with a pale silver crown next to a 37-stud pale-green pine, and a Cedar has a gold crown on red bark. The prompt says it too: a locked tree reads 🔒 Redwood · needs rank 4 instead of 🌲 Pine. The gate is server-side, not hidden UI: swinging at a tree above your rank hits an explicit refusal in LumberjackServer.onChop and toasts “🔒 Ironbark — locked. Requires Lumberjack rank 5 — you're rank 4.” There is no client copy of that rule, and the click-to-swing remote (row 278) lands on the same function, so it is refused identically. Different logs, different money: each species drops its own inventory item — Pine $22 / Fir $25 / Cedar $31 / Redwood $37 / Ironbark $47 per log at par. Why separate items and not one log with a value attribute: this inventory is count-based (_G.HousingCountItem returns a number per id, there is nowhere to hang a per-unit attribute) and every consumer — sawmill, pawn counter, backpack quick-sell, trunk storage — prices from ItemCatalog.get(id).value. Separate ids is the only option that works with the existing inventory and sell path completely unchanged. Pine deliberately kept the original log id so nobody's existing stack is orphaned. Naming and wiring untouched: the trees are still LumberTree_1..30 in LumberCamp.Trees, the species is just an attribute on each model, and a tree with no attribute is a pine — so the server's ChildAdded re-wire keeps working and you can still drag a new tree in. Proved by running the shipped code: the validation block was lifted verbatim out of onChop and driven as a 5×5 matrix — every rank against every species — and it is exactly lower-triangular: rank 1 can only fell pine, rank 4 gets everything but ironbark, rank 5 gets the lot. Swings per tree ran too: pine 12→8 by rank, ironbark 48 with a hatchet down to 32 with a chainsaw. Test: clock in as a Lumberjack at rank 1 → walk up the hill → the big dark trees should say 🔒 and refuse you with a toast naming the rank → fell pines until you rank up → the fir should unlock. |
| 276 | Sawmill sell panel + a fluctuating timber market NEW TEAM VERIFY | β
CLAUDE-VERIFIED (Aug 27) · (E-hold at the pad opened the panel in play — the Aug 21 "never fired" was the harness tapping instead of holding the 0.4s prompt — and SELL ALL paid $82 for 3 pine, bag 3→0) β CLAUDE (Aug 21): pricing + payout verified end-to-end in play — MillData returns live per-species rates (Pine 22→23, Fir 25→27, Cedar 31→34, Redwood 37→39, Ironbark 47→50; market 1.08, band 0.8–1.25) and selling 3 pine logs paid $82 (+9 XP), bag 3→0. The panel itself did not open from the E prompt in this harness (prompt never fired server-side), so the UI is unconfirmed. NEW (Aug 20): "how about market price fluctuation to selling a ui or something." E on the sawmill no longer silently dumps your bag at a flat $22 — it opens a proper PALETO SAWMILL panel, styled to match the pawn shop on purpose. It shows every log type you are carrying, what the mill pays for each right now, how that compares to par, a per-row SELL with a quantity stepper, and a SELL ALL footer with the running total. Species you are not carrying still show as greyed price-board rows (with “locked — needs rank 4” where that applies), so the panel doubles as the price list. A TIMBER INDEX chip at the top gives the live rate, a plain-English read (“prices are hot” / “the yard is glutted”), a ▲/▼ arrow against what it was when you last looked, and a countdown to the next move. It reuses the pawn shop's market rather than inventing a second one: same random walk with mean-reversion, same per-line jitter, same 90-second drift, same publish-to-a-Workspace-attribute pattern. And it learns from the pawn shop's bug. That one was an arbitrage hole (buy low at the same counter you sell high at) — there is no buy side here so that cannot exist, but the opposite risk is worse: logs are player-produced, so a rate spike prints money. Three things stop it. (1) A tighter band — pawn runs 0.65–1.35 with a 1.45 ceiling, timber runs 0.80–1.25 with a hard 1.30, clamped twice on independent code paths. (2) Pawn Boom does not apply. _G.SellMult (1.6×) is the pawn shop's event and the sawmill is a job payout, which already gets _G.PayMult — stacking both would be double-dipping, so it is deliberately not wired in. (3) The species curve itself is set so no species is a $/min outlier. The numbers, at each species' minimum rank: pine r1 $99/min, fir r2 $99, cedar r3 $165, redwood r4 $206, ironbark r5 $225. At max rank on the best market roll the system can ever produce it tops out at $241–$293/min — against Bin Man ~$10/min, Lumberjack-as-shipped ~$98/min and Delivery ~$170–290/min. So max-rank timber on a hot market lands level with Delivery, not above it, and Double Pay doubles every job equally so it does not change the ranking. Proved by running the shipped code: SawmillServer's own step(), speciesRate(), unitPay() and goodQty() were loaded and driven through 200,000 market moves — the index never left 0.80–1.25, no species rate ever left 0.78–1.30, and no log ever priced above its ceiling (ironbark peaked at $61 against a $61 cap). Forging the rate straight into the pricing function with 1, 9.9, a billion and infinity all clamp to $61. The shipped doSell itself was then executed against a mock bag: selling nothing, mixed SELL ALL, asking for 999,999 cedar when you hold 7 (sells 7), NaN and −4 (both “Bad quantity”, nothing taken, no money moved), trying to sell a gold bar (“The mill only buys timber”), off-team (refused), and standing 140 studs away (refused). NOT verified in play — Studio play mode is still jammed on “Start play hasn't finished yet” (fifth session running), so the panel has never been rendered on screen. Test: clock in → chop → E on the sawmill → panel opens with your logs and a rate → SELL one row, then SELL ALL → wait ~90s and reopen, the index should have moved and the arrow should say which way. |
| 277 | Real chainsaw model, pull-start and proper engine sounds NEW TEAM VERIFY | β
CLAUDE-VERIFIED (Aug 21) · NEW (Aug 20): "make them better like chainsaw use actual chainsaw model and good sounds you can pull but mainly better sounds and interactions." The part-built block-and-plank chainsaw is gone. The rank 4/5 tool is now a real Stihl MS170 mesh (Creator Store model 6252406146 — body mesh 6166079696, chain 6166075950, cover 6166081540, all with their own textures), scaled to 3.6 studs long. It was verified inserted and rendering, not just referenced — this place has a history of asset ids failing silently, so it was inserted, its meshes and textures read back, and it was screenshotted on a mock rig. The grip was re-derived, not guessed. Last session's fix put the bar on the tool's local X; this mesh runs its bar down local −Z (measured: the chain sits at z −1.76, the engine cover at +1.19), so the old grip was void. A mock R6 rig was built, the known-good Timber Axe was mounted on it first to prove the rig maths, then the saw was fitted and screenshotted from the side and the front: it sits in the right hand with the bar pointing forward and nosed 12° down, top handle up, clear of the body. GripTuner does not list the Chainsaw, so the tool-level grip sticks. Sounds: a Script inside the Tool (not a LocalScript — the sounds live on the Handle so everyone near you hears it positionally, not just the holder) runs pull start on equip → running idle looped → a higher-pitched cutting sound over the top while you are actually cutting, ducking the idle, for 0.45s after each bite. The cut is driven by the server setting an attribute on every accepted swing, so it can never get out of sync with the swing gate. Assets: 80068251726467 pull start (4.60s), 126549071567267 running idle (9.46s, looped), 91949288985641 cutting (5.60s) — all three verified IsLoaded=true with real durations in Studio, and the script re-checks at runtime and warns in the console if Roblox ever moderates one away (documented fallback: ProSoundEffects 9113764732, one 43.7s clip containing all three phases). RollOffMaxDistance is 65, not 10000 — the fishing rod bug is not repeated. The axes keep the quietened chop from Aug 20 and no longer play it when you are holding the saw. The saw is now genuinely the fast tool: the swing gate is per-tool instead of one shared rate — Hatchet 0.720s, Felling Axe 0.662s, Timber Axe 0.612s, Chainsaw 0.360s, i.e. twice the hatchet. Measured on a wall clock against the shipped gate: 5 bites in 1.5s with the saw, 3 with the hatchet. NOT verified in play — play mode is jammed, so no sound has actually been heard and the grip was checked in Edit on a mock rig, not on a live character with the walk animation running. Test: rank up to Yard Foreman → equip the chainsaw → it should look like a chainsaw in your hand, pull-start on equip then settle to an idle → chop a tree and the note should rise while you cut → unequip and it should go silent. |
| 278 | Click or tap to swing the axe, as well as E NEW TEAM VERIFY | β CLAUDE FIX (Aug 21, in play): click-to-swing fired the remote correctly but the server could never match a tree — same root cause as row 265 (the persisted Wired flag made wireTree return before setting state[m].trigger). After the VER1 fix the click path alone felled a pine in play (all swings via Tool:Activate()). NEW (Aug 20): "maybe make it so hatchet can be clicked to be swung too." Every lumber tool now swings on Tool.Activated — a left click on desktop, a screen tap on mobile/tablet once the tool is equipped — as well as on E. One code path, not two. The tool's LocalScript fires an empty remote; the server finds the tree you are standing at and calls the exact same onChop the [E] prompt calls, so the team check, the rank gate, the reach check and the swing cooldown are literally the same lines for both inputs. There is no tree id, no position and no damage number in the message — there is nothing to forge. The two things you asked to stay true, retested against the shipped code: 30 clicks fired in the same instant register as exactly 1 swing (the cooldown is untouched and is the only thing that counts a swing), and a swing from 120 studs is rejected — the scan is bounded by the same reach the prompt uses (accepted up to 20 studs, rejected at 21 and beyond) and onChop re-checks the distance again after that. Holding nothing, or holding a non-lumber tool, is also rejected. There is an extra 0.10s floor on the remote itself, purely so a click-macro cannot make the server scan the grove thousands of times a second — it is well under the fastest legal swing (0.360s), so it never lets an extra swing through and never blocks a real click. Chopping a tree above your rank by clicking gets the same 🔒 refusal as pressing E. NOT verified in play — play mode is jammed, so this was proven by executing the shipped validation block directly rather than by clicking in a running game. Test: clock in → equip the hatchet → stand at a tree and click repeatedly (the counter on the prompt should tick up at the same speed as tapping E) → mash the mouse as fast as you can and confirm it does not go faster → on a tablet, equip the tool and tap the screen. |
| 279 | Tow AI missions — they were already in; what was missing was the accept flow NEW TEAM VERIFY | β
CLAUDE-VERIFIED (Aug 27) · (MDT lists calls with street + claimedBy, ACCEPT claims and shows the holder, DROP releases; the hook-honour refusal branch is confirmed in code but a live hook attach was not completed this session) NEW (Aug 20): "i do want tow ai missions done and perfect i thought that was already in though" — you were right, it was already in. I was briefed that the AI layer had never been built — no dispatched calls, no vehicle to go find, no drop-off. That brief was wrong on every count, so I adapted rather than building a second system on top of a working one. TowMissionServer (Jul 12) already spawns broken-down AI cars on real roads (3,426 RoadGraph cells put through the minimap's calibrated transform), hazard-beacons and smokes them, waypoints DOT players out to them, tows on a RopeConstraint from whatever you happen to be driving, and pays by haul distance on delivery to the impound — and DOTMDTServer/DOTMDTClient already drew the yellow terminal with a live ACTIVE TOW CALLS list. None of that was rebuilt or duplicated. The real gap was that there was no claim. offerMission handed the nearest wreck to every DOT player independently, so two operators got waypointed to the same car and raced for it, and the MDT's only button was a passive Track — no way to take a call, no way to drop one. Fixed by mirroring FireCallBoardServer's accept semantics, which already does exactly this and works: every wreck now carries a call id, a call is held by one operator at a time, and accepting a second call releases your first. MDT rows now read ACCEPT / DROP / Assigned / Hooked with the holder's name and an estimated payout, plus a separate small GPS button that drops a waypoint without claiming. Dropping a call returns it to the board and puts it on a 2-minute decline cooldown for you only, so dispatch offers you a different car instead of instantly re-handing you the same one; a call accepted but never touched for 5 minutes is swept back to the board so nobody can sit on the queue. Server-authoritative throughout: the client sends a bare numeric id and nothing else — no positions, no payout, no player name. Non-DOT callers get an empty board and a refusal, ids are type- and range-checked, and there are two independent rate limits (0.75s at the remote, 1.0s inside the claim API). The hook prompt honours the claim too, so you cannot walk up and lift a car off somebody else's call. Calls are named from Workspace.Locations now rather than StreetNames — 40 markers, 27 distinct names — so a call reads “Tow #7 — Ammunation” instead of a street name. A 40-sample dry run of the shipped picker returned 14 distinct pickup locations spread right across the map (Great Ocean Highway, Procopio Drive, Jail, Hospital, Car Dealership, Beach Entrance…), so calls genuinely vary and do not stack in one corner. Nothing spawns while nobody is on the DOT team and anything still out is cleaned up — that was already true and was left alone. XP: already flowing, and I deliberately did NOT add a second award. The payout calls _G.DailyBump(plr, "tow", 1), and ProgressionPerksServer wraps _G.DailyBump and pays Cfg.WorkXP_DailyBump.tow = 60 XP per tow. Adding the direct _G.AwardXP call the brief asked for would have doubled it, so it was left out on purpose. 60 XP a tow puts Recovery Operator (400 XP) about 7 tows in. Payout is unchanged — I did not touch the money. Still $120 base + $0.08 per stud hauled, × _G.PayMult, so rank bonus and Double Pay both still apply. Measured against the real road cells and the real impound: haul distance p25/median/p75 = 472 / 868 / 1,584 studs → $157 / $189 / $246 a call. At a realistic loaded-tow pace that is ~$100–170/min, median ~$130/min — which lands right on the $60–130/min this job was already measured at: well above Bin Man (~$10/min) and below Delivery (~$170–290/min). Towing is still a rope, on purpose: a rope works from any vehicle, survives corners, and cannot launch the truck the way a rigid weld to an unanchored car does — and VehicleEntryGate already exempts TowTarget wrecks from its settle-anchor, so the two systems are not fighting each other. One real hazard fixed there: hooking hands the wreck's physics to the driver, but releasing never handed it back, so a wreck whose tower drove off or disconnected stayed owned by an absent client — exactly how loose cars end up under the map. Unhooking now returns network ownership to the server. Proved by running the shipped code, not by reading it: the live claim API was lifted verbatim out of TowMissionServer and driven through the whole flow — a civilian is refused, Alpha claims #1, Bravo is refused with “Assigned to Alpha”, Bravo takes #2, Alpha taking #3 releases #1, a nonexistent id and a string id both bounce, a second claim inside one second is throttled, abandon works once and then reports “you have no active tow call”, and a non-DOT player sees 0 calls on a 3-call board. NOT verified in play — Studio play mode is still jammed on “Start play hasn't finished yet” (seventh session; one stop/start attempt was made and then abandoned rather than thrashing it), so no wreck has been hooked on screen. Test: Phone → Jobs → Department Of Transportation → within a few seconds wrecks start appearing on the roads (they only spawn while somebody is actually on the DOT team) → click the amber DOT tab on the left edge of the screen → ACTIVE TOW CALLS → hit ACCEPT on one → drive to the waypoint → hold E on the wreck to hook it → haul it to the impound yard, which sits right beside the Bin Man Warehouse at roughly (540, 78, 330) → drop it in the marked bay and you get paid. Then get a second person on DOT and confirm they see your call as Assigned and cannot hook it, and that DROP hands it back to their board. |
| 280 | Tow wrecks were spawning 28 studs in the air NEW VERIFY | β
CLAUDE-VERIFIED (Aug 27) · (wrecks measured at Yβ80.5 over tarmac Yβ77.5 — on the road, not in the air — with the flashing orange TowBeacon welded on) FIXED (Aug 20): found while dry-running the tow spawner — 18 of every 20 wrecks were being placed about 28 studs above the road and then dropped onto it. Cause: Workspace.StreetNames and Workspace.Locations are not little markers, they are huge invisible, non-collidable volumes — “Paleto Boulevard” is 792 × 35 × 60 studs and its roof sits at Y ≈ 105.9 against tarmac at Y ≈ 77.5. The spawner's ground raycast ran with an empty exclude list, so it struck those roofs (and, once in the sample, a pine tree's Leaves) and reported them as ground. The wreck was then pivoted 3 studs above that, so it spawned in mid-air, fell ~30 studs and slammed into the road — exactly the sort of thing that makes an unoccupied car bounce, flip or clip through the map. The raycast now sets RespectCanCollide = true (both folders are CanCollide = false, as is foliage) and excludes the two marker folders, every existing wreck and every player character. Measured before and after on the shipped code: before, hit heights clustered at Y 101–113; after, 40 out of 40 samples land at Y 77.4–78.0 — road level, consistent with the impound pad at Y 78.3 — with 0/40 still in the bad band and 0 placement failures. It also slightly shortens recorded haul distances, since the spawn point is now the actual road surface rather than a point 28 studs above it. Test: go on DOT and watch a few wrecks appear — they should already be sitting on the tarmac when you arrive, not falling out of the sky or lying on their roof. |
| 282 | T-Chassis cars (Charger / Crown Vics / PBPD / Fire — 29 cars) barely pulled away from a stop NEW VERIFY | β
CLAUDE-VERIFIED (Aug 27) · (road-tested at last: a T-chassis Charger launched 169 studs in a 4s W-hold from rest; the FAB1 floor watched live, wheel torque 63 idle → 2109 at full throttle in gear 1) β CLAUDE (Aug 21): the launch math is live and measured — sampling a spawned PBPD Chargerβs wheel motors in play, #AV.MaxTorque steps from 63 at idle to exactly 2109 at full throttle in gear 1, and the multiplier is gear-1/reverse only as specced. The subjective road test could not be completed: no dealership/fleet-spawned car moved under power this session. Two leads in the log — DriveSeat is not a valid member of Model "jackhughesman's Car" thrown from Drive:340 (Steering) right after the spawner renames the model, and Start is not a valid member of ... "T Chassis 1.1".Components from the packβs own Ignition. Worth a look before release. FIXED (Aug 20): “the charger isnt working” β root cause found in the shared A-Chassis Drive math every “T Chassis 1.1” car uses. AC6 has no clutch/torque-converter model: engine RPM is locked to wheel speed, so parked = idle RPM, and idle output for this pack’s shared tune (280 hp, IdleRPM 700, first gear 3.53 × final drive 4.59) computes to ~667 wheel torque β the ~650 you kept seeing. The trap is circular: torque can’t rise until RPM rises, RPM can’t rise until the wheels turn, and 667 barely turns them β while your 50,000 manual test (~75×) obviously launches hard. Fix β one identical surgical edit in GetCurve, a torque-converter-style launch floor: in 1st gear or Reverse, below 2,500 RPM only, torque is multiplied up to 4× at idle, tapering linearly to 1× at 2,500 RPM. Exact numbers (Charger, 1st gear, full throttle, flat): 0 mph 667→2,109 (×3.16) · 10 mph 707→1,660 (×2.35) · 20 mph 770→770 (×1.00, RPM 2,751 is past the floor) · 30 mph 811→811. Crown Vic (smaller wheels): 667→2,109 · 717→1,521 · 784→784 · 822→822. Top end provably untouched: the multiplier branch cannot execute at/above 2,500 RPM or in gears 2β6, so highway torque, shift points and top speed are numerically identical, and 2,109 stays well under the ~6,800 traction limit so TCS never trips β no wheelspin rocket, just a real pull-away. Applied to exactly the 29 live “T Chassis 1.1” cars (badge-identified, per-script unique-anchor + compile check, dead-code copies skipped): Civilian Charger/Crown Vic/Hellcat/Taurus/Tahoe/Explorer/Tesla-S/Tesla-X/McLaren P1, all 8 PBPD + gamepass units + Bearcat, Fire FEngine/FLadder/FCommand/FMedic, GT500 (×2), FHP FPIU, F-700 Tanker, F350 Ambulance, dealership + workspace Tahoes (the two workspace 2020 Tahoes run the newer cached-curve AC6 β the same floor was baked into their per-gear cache builder). Honest caveat: play mode is still jammed, so this is math + compile-clean edits, not a drive test β the mechanism is exact but the 4× feel ceiling is my calibration, not a measured one. Test: spawn the Charger, hold W from a dead stop β it should pull away like a normal car now instead of creeping (roughly triple the shove up to ~18 mph, then exactly the car you had); check a Crown Vic and a fire engine too, and confirm highway pace feels unchanged. If launch is still soft or now too fierce, the one number to turn is the 4 in the FAB1 line of Drive. |
| 283 | Cars going dead after exit/re-enter — the vehicle-GUI wipe race NEW | FIXED (Aug 27): found while re-proving Job 1 (cars DO drive — full spawn→E-enter→Z-start→drive→P-brake→exit→re-enter loops measured on the 180SX, a T-chassis Charger and the Tahoe, 155–389 studs per 3–4s W-hold). Root cause, watched live with event logs: on a gated re-entry, Humanoid.Seated can fire true with seat=nil. VehicleGuiCleanup's handler tested if seated and seat, so that event fell into the EXIT branch and scheduled the 0.15s wipe — which then destroyed the freshly cloned A-Chassis Interface ~0.1s after it landed (logged: ADDED 1308.09 → DESTROYING 1308.20). No interface = no Drive script = throttle dead until you got out and in again; it hit 2 of 4 re-entries in play. Fix (VER3, StarterPlayerScripts.VehicleGuiCleanup): the seated branch now keys off seated alone, and the wipe re-checks humanoid.SeatPart at fire time (if you are seated again it dedupes instead of wiping). Re-verified: interface survives exit→re-enter and the car drives. Also FIXED (VER3, DealershipServer): StuckReset only matched <name>_Vehicle, but the legacy Pickup script renames every sat-in car to "<name>'s Car" / "Empty Car" — so the stuck-car reset could never find a car that had ever been driven. Both StuckReset lookups now also match OwnerUserId+CarName attributes (attribute guard keeps houses safe). Retest: spawn any car, drive, get out, get straight back in — it must still drive every time; then park a car somewhere stupid and use the dealership STUCK RESET while it is renamed — it must reset after 30s. NOT fixed (pre-existing, noting for the list): the civilian Dodge Charger interface floods the console every frame with Lights is not a valid member of Body (car has no Body.Lights — same one-off free-model class as row 258), and one Charger instance went physics-dead after a long driverless coast into a crash (fresh spawn of the same plate drove fine; Despawn/StuckReset is the remedy). |
| 284 | Alt-tab → invisible mouse until CTRL NEW | FIXED (Aug 27): "when i alt tab to something else and tab back in my mouse isnt there even if i click i gotta hit ctrl to enable it". Your F7 captures were right — MouseIconEnabled true, behavior Default, arbiter owner free, mouse moving — and that's what cracked it: the only thing left that can hide a cursor in that state is the icon IMAGE itself. Found it: StarterGui.Main.Cursor.UICursorFollower (the old custom-cursor system behind "Top GUI under cursor: Dot") sets UserInputService.MouseIcon = "rbxassetid://0" at every spawn — a blank/bogus icon — while its replacement Dot ImageLabel is ImageTransparency = 1, i.e. it draws NOTHING. Normally the bogus asset fails to load and Roblox falls back to the default arrow, but a window refocus makes the engine re-resolve the custom icon and the cursor vanishes; nothing in the CTRL/arbiter path writes MouseIcon, so only side-effect state churn ever brought it back. Fix: the MouseIcon hijack line is disabled (the follower itself is untouched), and MouseArbiter's existing WindowFocused hook now clears a leftover rbxassetid://0 icon on refocus as belt-and-braces. Aiming/driving/typing locks all live in MouseBehavior/MouseIconEnabled, which are untouched. Compiled + code-path verified; play mode was jammed this session — do the 3× alt-tab cycle on the live build: cursor should be there every time without CTRL. Test: alt-tab out/in 3× (free, driving, gun out) — cursor visible each time; aim-lock and drive-lock still engage. |
| 285 | Hat / headgear missing when you join NEW | FIXED (Aug 27): "i dont have my hat / headgear when i join game did the locker / duty system disable this?" Yes — it was the Aug 20 HATPREF persistence. Your saved duty hat choice (hat="none") is stored per-account, and LockerServer.reapply() resurrected it from the DataStore on every spawn — including plain civilian joins — then enforced "no hat" for 10s, stripping your avatar's own headgear. Fix: reapply() now returns immediately unless you are on a duty team (PD/SASP/BCSO/SWAT/Fire/DOT/Bin Man — same list the locker auto-open uses), so civilians and fresh joins always keep their real avatar look; the hat toggle still remembers and applies on duty exactly as built. Dry-run of the gate: nil-team and Civilian skip, PD and Fire apply. Compiled + dry-run verified (play jammed). Test: join as civilian → your hat is on; go PD, set hat OFF in locker → stays off through duty respawns; back to civ → hat returns. |
| 286 | Dailies card — bar touched the CLAIM button + CLAIM looked "AI/paid" NEW | FIXED (Aug 27): "the progress bar touches the claim $ button it should have a space and the claim font is overbearing its too much and shoadwy". Measured it: row content is 230px, the bar's right edge sat at x=164 and the CLAIM button starts at x=156 — an 8px overlap. Now, whenever CLAIM is showing, the bar's right margin widens (-92 vs -76) → bar ends at x=148, an 8px gap; rows without a claimable task keep the original bar length. Both CLAIM buttons (per-row and the footer CLAIM-ALL) restyled to the quiet house style: panel-dark tile, green text, thin green outline, GothamBold — no more solid bright-green GothamBlack chip; the footer headline also stops 104px short so it can never run under the button. Chip size/position untouched. Compiled + geometry verified (play jammed). Test: finish a daily → CLAIM appears with clear space after the bar and looks like the rest of the card, still pays on click. |
| 287 | Admin-panel + Help buttons were hidden under the Roblox topbar NEW VERIFY | BUILT (Aug 27) — needs your eyes: "two buttons hidden under the default roblox menu... moved those over to the right a bit and made those buttons the same style as roblox". They are TopbarPlus icons ("HelpIcon" from TutorialClient, "AdminPanelIcon" from AdminClient, admins only) drawn at legacy topbar coordinates under the new Roblox controls. AdminClient is at its 200k source cap, so neither owner was touched: new StarterPlayerScripts.TopbarBlendClient hides the TopbarPlus rendering of just those two icons and drives the same icon objects (select/deselect → the original handlers, permission gating unchanged) from two Roblox-look chips — dark rounded squares sized to the topbar — docked just RIGHT of Roblox's own controls via GuiService.TopbarInset (live-updated, so they clear chat/mic at any resolution; sane fallback if the API is missing). Help chip = "?", Staff chip = shield, only appears for admins; intro tour still hides them (gui is named HelpButton). Play was jammed, so chip position/size vs your screenshots is unverified — check they sit clear of the chat chip and look native; if the shield glyph renders as a box tell me and I'll swap it for drawn art. Test: F1/click Help chip toggles the Help Center; Staff chip opens the admin panel; non-admin sees no Staff chip. |
| 288 | Top icon label says PROGRESS now, bigger NEW | FIXED (Aug 27): "progression text looks a bit small maybe make it say progress" — PerksPanelClient chip label "PROGRESSION" → "PROGRESS", TextSize ceiling raised 8 → 10 (UITextSizeConstraint retuned 6–10, label 1px taller), same 48px chip, same slot. The modal's own title still reads PROGRESSION. Test: look at the star chip in the top-right row — label reads PROGRESS, visibly larger. |
| 289 | Scroll wheel zoomed the camera while setting a cash drag amount NEW | FIXED for real (Aug 30): "when i have cash and im changing the amount to drag with scroll wheel it scrolls my camera... make sure thats coded well". The Aug 27 guard (InventoryZoomGuard) was correct but was being stomped every frame by StarterPlayerScripts.FOV, which re-applies the on-foot zoom clamps on RenderStepped — exactly the "known limit" its own comment waved away. Now (INVZ2) the guard raises a player attribute InvZoomPin while the inventory is open and FOV stands down while it's set; on close the attribute clears and FOV resumes. Verified in a live client (Aug 30): zoom pinned at the current distance, held for 5s of frames with FOV running (previously died within 1 frame), and restored to 0.5/24 on close. Test: open inventory over a cash pile, scroll to change amount → camera distance frozen; close → zoom normal; die with it open → zoom normal after respawn. |
| 290 | Phone clock icon hands pivot from the centre now NEW | FIXED (Aug 27): "the clock icon i love but the hands on it are a bit fucked not positioned well". Cause: GuiObject.Rotation always pivots about the frame's centre — AnchorPoint does not move the pivot — so the old bottom-anchored hands swung their inner ends off the dial centre once rotated (the minute hand at 108° was floating well off-hub). Fix in PhoneClient's buildAppIcon("clockface"): each hand's centre is offset half its length along its own angle, so the inner end sits exactly on the dial centre (computed error 0.04px / 0.06px), set to the classic 10:10 — hour hand to 10, minute to 2, centre cap on top. Same ring/ticks, all three surfaces (home grid, drawer, App Store share the one builder). Test: open the phone → Clock tile: both hands radiate from the hub, 10:10. |
| 291 | Messages app icon — your original PNG restored NEW VERIFY | FIXED (Aug 27): "the message icon i can tell you generated can you restore the icon id i gave you before?" Found the real one: it wasn't anywhere in the live source or backups (Messages was converted to a drawn glyph back in the July "blinking image" pass, before every snapshot we keep), so I searched your group's uploads — Atheneum Interactive → Image "phone_icon_messages" = rbxassetid://75056652008722, uploaded Jun 4 in the same batch as phone_icon_carkeys/map/jobs etc. Double-confirmed: that exact id was still sitting in PhoneClient's own icon preload list from the original wiring. Restored as PHONE_ICONS.bubble, which makes it the primary icon on all three surfaces (home grid, All Apps drawer, App Store) via the same PNG-first path every other icon uses; unread badge untouched; asset verified live on Roblox (economy API returns it, same group, Image type). Play was jammed so IsLoaded-in-game wasn't run — if it ever "blinks" like July, say so and we revisit; the drawn fallback still exists for any icon without a PNG. Test: phone home + All Apps + App Store → Messages shows your PNG speech-bubble art. |
| 292 | Civilian Dodge Charger console flood silenced NEW | FIXED (Aug 27): your call: keep the car, kill the noise. The per-frame Lights is not a valid member of Body flood comes from the car's A-Chassis Lights plugin: it hooks game.Lighting.Changed (which the day/night cycle fires constantly) → AutoLight → car.Body.Lights:GetChildren(), and this free-model Charger's Body has no Lights folder (Body children: Model/Headlight/Brakes/Highlight/Right/Reverse/Left/Liveries). Both throwing sites (the Light() loop and the Brake.Changed handler) now FindFirstChild-guard and skip — no fake Body.Lights added, headlight behaviour for this car unchanged (it never worked; it just errors no more). Fixed in the one live copy: the ServerStorage Vehicle_Storage.Civilian.Dodge Charger template (nothing in workspace; A-Chassis clones the plugin into PlayerGui from this template at seat time); guard dry-run against the real template confirms the quiet skip. FYI, not touched (out of scope): Hellcat, Crown Vic, Explorer, both Teslas, McLaren P1 and the three Fire trucks ship the same plugin with the same missing folder — same one-line guard if any of them shows the same flood. Test: drive the civilian Charger for a minute at night and watch the console — the flood is gone, nothing new appears. |
| 293 | NPC REPUTATION core — tiers, daily caps, and it survives a rejoin NEW | NEW (Aug 27): every quest NPC now keeps a real standing with you: Stranger → Known (1) → Associate (4) → Trusted (6) → Insider (10). How rep is earned: β finishing a story chapter (+1/+2/+3, one-time, uncapped); β‘ repeatable jobs — once an NPC's chain is done they keep handing out one recurring job (+1 rep, 15 min cooldown); β’ trickle from just doing business — every $2,500 the 24/7 pawn counter pays you = +1 with Sal, every $5,000 you spend at the black market = +1 with Ghost; β£ word travels — Vinny's later jobs also raise your standing with Ghost. Repeatable + trickle rep is hard-capped at 3 per NPC per day so none of it can be farmed. All of it is server-side only — there is no remote a client can call to give itself rep, and asking for a perk re-checks tier, cooldown and that you're actually stood next to that NPC. Also fixed a pre-existing landmine while wiring this: if the DataStore ever failed to load your quest file the script used to fall back to a blank one and then autosave that blank over your real save 90 seconds later — it now tells the two apart, retries 3×, and refuses to save at all on a failed load. Test: do a job for anyone → toast says your rep went up → open the journal (. key) and check the tier chip → rejoin the server and confirm the same tier and rep are still there. |
| 294 | Pawn shop guy (Sal) — quest prompt on his shop panel + rep perks NEW | NEW (Aug 27): "involve the pawn shop guy as one and when you talk to him you have a prompt for the quest stuff make sure that all looks rlly good". The 24/7 Pawn panel now has a proper amber πΌ SAL'S JOBS button in its header (matching the panel's own card/stroke style, not a debug list) — it closes the shop and opens Sal's normal quest dialogue. His [T] Talk prompt on the counter still works too, alongside the [E] Pawn Shop prompt. How rep is earned: his 3-chapter chain, his repeatable "Shelf Help", and +1 per $2,500 he pays you across the counter. What it buys: a sell-price bonus (+2% Known → +8% Insider), a bigger personal register cap (×1.15 up to ×1.75), his repeatable coming back twice as fast at Associate, and three under-the-counter BUY lines that literally are not on the shelf until you've earned them — Gold Watch (Known), Carbon Rod (Associate), Diamond Ring (Trusted). Locked rows show "under the counter — Trusted with Sal unlocks this" with a dead LOCKED button, and the gate is enforced again server-side. The Aug 21 checks-and-balances are all intact and were re-tested by machine: the sell bonus is folded into the anti-arbitrage price floor (so the shelf still costs more than the counter could ever pay — verified at Insider tier with a PAWN BOOM running), diminishing returns and the register cap are untouched. Test: [E] the shopkeeper → SAL'S JOBS → take a job → finish it → reopen the shop and watch the MARKET chip show "SAL: KNOWN +2% sell". |
| 295 | Gun dealer (Ghost) — rep gates the black-market shelf NEW | NEW (Aug 27): "even other things like the gun dealer involve him". The black-market ped is now a talkable quest NPC, Ghost, on a [T] Talk prompt so it can't fight the existing [E] Browse (Illegal) one. He has a 3-chapter chain plus a repeatable "Standing Order". How rep is earned: his chain, his standing order, +1 per $5,000 spent at his shop (daily-capped), and Vinny vouching for you. What it buys — the deep shelf: Glock 41-S at Known(1), MP5 at Associate(4), AK-47 at Trusted(6), M4A1 at Insider(10). Drill and Lockpick stay open to everyone so nothing that already worked broke. Locked rows read "needs Trusted with Ghost" and the buy button greys to LOCKED — and the gate is enforced again in ShopHandler, so a hand-rolled remote call from a low-rep player is refused too ("Not to you. Come back when you're Trusted."). Dirty-cash economy untouched: prices, stock counts and restock timers are exactly as they were. Machine-verified: all 11 gate combinations refuse/allow correctly and the tier labels match the rep thresholds the journal shows. Test: with 0 rep open the black market → the four guns read LOCKED with a tier hint → do Ghost's first job → the Glock unlocks. |
| 296 | Rosa / Doc / Mickey / Vinny / Reyes — each gives you something for your standing NEW | NEW (Aug 27): "maybe make it so each npc does something too and you can get more done as you get more rep". Every existing NPC now has a rep-gated extra on top of their story chain, offered as an amber β button right in their dialogue (so it uses the quest UI you already have, no new panel). How rep is earned: their chain chapters plus their new repeatable job. What each one buys: Rosa (church soup kitchen) at Known — a hot plate on the house, every 15 min; Doc (hospital) at Associate — a free patch-up back to full health, every 5 min; Mickey (fish market, in the hut with Joe) at Associate — a tub of 5 worms every 10 min, and at Trusted his day's-catch job returns twice as fast; Vinny (the fixer, by the Black Market Part) at Associate — his errands come back twice as fast, and at Trusted he'll ring Ghost and vouch for you (+1 dealer rep, still daily-capped); Sgt. Reyes at Associate — back on the roster twice as fast. Deliberately tiny and cooldowned so none of it moves the economy (an Energy Bar pawns for ~$26, worms ~$3). Every grant re-checks tier, cooldown and your distance to that NPC on the server. Test: get to Known with Rosa → talk to her → a "β Take a plate" button appears → click it → item lands in your bag → click again and she tells you to come back in ~15 min. |
| 297 | Dex — the alleyway quest NPC you asked for NEW CONFIRM SPOT | NEW (Aug 27): "rlly was wanting one in alley way idk if you ever did that". Dex the back-alley hustler π², a quest-only NPC (no shop), placed in the service alley behind the 24/7 pawn building — standing on the paving beside the green dumpster, next to the back door, with the fire-escape stairs to his right. Exact spot: X 1127, Y 78 (ground), Z 163; nearest landmark on the map markers is the Customs Garage, 77 studs away, and Sal's counter is 48 studs north through the building. Note this is a back-of-store service alley, not a two-wall canyon — this map doesn't have any of those. Placement was measured rather than guessed: ground is real Terrain at y=78.00, zero collidable parts in a body-sized box around him, nothing overhead, 4 studs off the store's back wall, 7 studs clear of the dumpster (the first draft had him standing in the bin), and the raycast that puts him there rejects anything but that exact ground so the old "spawned 28 studs up on an invisible marker" bug can't repeat. How rep is earned: a 3-chapter chain (talk to Ghost → bring a Lockpick → run 2 deliveries) then a repeatable "Corner Watch". At Associate his repeatable returns twice as fast. Test: walk round the back of the 24/7 → π² DEX floats over him → press E → take "Ears Open". Tell me if you want him moved — the coordinates are one line to change. |
| 298 | Quest Journal now shows where you stand and what's still locked NEW | NEW (Aug 27): the Journal (. key, or the π JOURNAL icon) is now the place you read your reputation. Each person's card carries a tier chip with progress to the next tier ("Associate β’ 5/6 rep"), a green β line listing what your standing already buys with "(ready now)" or "(again in ~9 min)" on their perk, and an amber π line naming the cheapest thing you haven't earned — e.g. "π Trusted (6 rep) unlocks: Diamond Ring — appears under the counter on the 24/7 BUY shelf". Cards grow to fit those lines instead of clipping. Also fixed: a repeatable job runs with the storyline already complete, so the journal used to say "Storyline complete" straight over the top of a job you had open — it now reports the live job, its progress, and the cooldown until the next one. The same lock hint appears under the dialogue text when you talk to someone. The tracker is unchanged — still hidden by default, still toggled with the π TRACKER button inside the journal header, . still opens the journal. Test: press . → every NPC card shows a tier chip → someone you've done work for shows a green β line → someone you haven't shows the amber π hint. |
| 299 | Walking / camera smoothness — full-game audit of everything that moves the screen NEW | FIXED (Aug 27): I swept every script in the place for anything that writes the camera or the character each frame — RenderStep binds, CameraOffset, HipHeight, WalkSpeed, custom Animate forks, and math.sin bob/sway loops. Result: on foot with no gun, the ONLY things touching your camera are Robloxβs own camera and SmoothCamClient. There is no hidden head-bob script, no leftover car-cam bind, no second Animate, and no CameraOffset writer (the ACS and WeaponSystem shoulder-cams that could write it are shelved/commented out). What I removed: (1) SmoothCam used to drop its vertical smoothing the instant Roblox flickered you into “Freefall” — which happens several times a second just walking over kerbs and small steps — and each drop snapped the view back by the whole amount it had been softening. That snap was the leftover “little shaky”. It now eases back to zero instead of popping, and re-engages from where it already is, so the picture never steps. (2) The crouch script was re-writing the crouch animationβs speed every single frame while you walked, even when you werenβt crouched — that write is gone (crouch itself is unchanged). What I deliberately KEPT and why: the Walk Style picker (event-driven, only fires when you change style — it is not fighting anything), the OTS gun aim/recoil/zoom and its Y-softening, the driving cameras, the phone/rod arm poses, MouseArbiter/CursorGuardian, CameraLeakSentinel and BOBPROBE. Test: walk around on foot, then with a gun out, then after driving a car, then after a jail/bail cycle — it should feel like default Roblox. Then open Phone → Settings → Character and try every walk style; each one should still apply, with Stylish still the default. |
| 300 | Two things the audit found that I did NOT change — read before you retest NEW | HEADS-UP (Aug 27): if walking still feels less than perfectly smooth after #299, it is almost certainly one of these two, and neither is a bug I should quietly rip out: (1) Streaming is ON and the map is ~153,000 objects, so the client is constantly loading/unloading world chunks as you walk — that produces small periodic hitches a “basic Roblox game” never has. Turning it off would fix the hitch and wreck memory on phones, so that is your call, not mine. (2) There are ~44 per-frame client scripts running at all times (HUDs, phone, MDT, minimap, mouse arbiter), and two of them walk your entire UI tree 3–5 times a second. None of them move the camera, but together they cost frame time, and unstable frame time reads as shake. Also unproven: Studioβs play-test hook was jammed the whole session (“Start play hasnβt finished yet”, four attempts including two full stop→wait→start cycles), so #299 is a code-level fix that has not been measured live. Please restart Studio, press F8 in-game and read the BOBPROBE panel while walking: “Y sd” and “max” are the bob numbers, “fps” tells us if it is really frame-time, and the suspect-binds line must say (none) on foot with no gun. |
| 301 | Sirens, airhorns, ambience & more — 31 dead sounds replaced NEW | FIXED (Aug 30): 10 un-owned/archived sound IDs were failing silently ("User is not authorized to access Asset" console spam) — all 4 fire trucks had NO Priority siren, NO airhorn, and 2 had no Wail; all PBPD units had no Manual siren; both SAHP gamepass cars had no Priority; the Silverado had no engine rev; day/night ambience, marble footsteps, and the Tesla Model Y seatbelt chime were silent. All 31 Sound instances swapped to working audio (in-game siblings where possible, licensed store audio otherwise) and every new ID verified loading in a live server. Each changed Sound keeps its old ID in an SND1_prev attribute for rollback. Test: cycle every siren mode (Wail/Priority/Manual/Airhorn) on a fire truck, a PBPD unit and a SAHP car — nothing should be silent and nothing should sound wrong; rev a Silverado; listen for birds by day and crickets at night; sit in the Model Y unbuckled; walk on a marble floor. If any replacement sounds off, say which — the swap is per-sound reversible. |
| 302 | Free-model car backdoors — 14 remote-require() loaders disabled NEW SECURITY | FIXED (Aug 30): found a class of backdoor the earlier audit didn't cover — scripts that pull a stranger's code off Roblox at runtime via require(<assetid>) (some hidden with getfenv+reversed strings and invisible whitespace). Payload owners can silently change that code at any time. Disabled 14, reversibly (each keeps an RR_prev_enabled attribute): Skyline R34 ×2 "Anti-Anti-Lag", 180SX Boost/BoostThing, Defender "slotDestroyer+" loader, FHP FPIU "Auto Script Sync", a bed prop's OperationScript, and the Camaro tire-smoke loader. Verified in play: runtime enabled remote-requires dropped 12→1. The one holdout (Camaro Smoke_FE.Handler, re-cloned at car spawn) points at a dead asset (5722760285 no longer exists), so it runs NO code — just console spam; the clean kill is Universal Car UI v2. Left untouched on purpose (need your risk call, they're big/obfuscated and may be real systems): the WolfHub Support Service, the Firebird gauge plugin, and the Placement System kit. Test: drive a Skyline, 180SX, Defender, FHP and Camaro — they should still drive/light normally; only the Camaro's tire-smoke puff and the 180SX turbo-antilag pop are gone (cosmetic). |
| 303 | Scope-trap sweep across all 727 scripts — 3 real ones fixed NEW | FIXED (Aug 30): automated scan for the trap that caused six past bugs (a local function called before the line that declares it → nil global → silent death). Three live hits, all forward-declared now (sentinel SCOPE3): (1) HousingV2_PlotManager — the "🚨 SECURITY ALARM" and "📷 CAMERA ALERT" toasts to a homeowner called msg() 70 lines early, so the owner never got them (and the camera path aborted before its mailbox push). (2) LockerServer — idOf() in the clothing snapshot; whenever the applied description had no shirt/pants id, the fallback died. (3) Police + Fire MDT — after accepting a CAD call the tablet is meant to auto-close 0.4s later; setVisible was nil there, so it never did. Compiled against live source. Test: break into your own house with the alarm armed (2P) → owner toast + mail; accept a call from the MDT → tablet closes itself; locker save/restore still sticks. |
| 304 | Main-menu backdrop — it was staring at sky and water NEW | FIXED (Aug 30): three stacked causes. (a) CameraLeakSentinel (Jul 24) "repairs" any Scriptable camera back to Custom every 2s on foot — including during the menu flyover, so the follow-camera fought the cinematic every frame = smeared horizon. It now stands down while a legit owner is active (menu / tutorial / locker / downed) and otherwise only repairs a camera that has sat frozen ~6s (CAMFIX1). (b) With StreamingEnabled the flyover's landmarks 300–700 studs from spawn weren't loaded yet; new IntroStreamServer pre-streams around each shot on request (MENU2). (c) The opener's aim point was 130 studs above the town; now street level. Bonus: JOURNAL/PROGRESS/STORE icons peeked through behind the menu — gated (UIFIX4). Verified live: the menu now frames a real building + street. Test: sit on the menu for a full cycle (~2 min) — every shot should show town, not sky; tell me which shots you'd reframe. |
| 305 | SAFE ZONE banner — off the icon dock, and it gets out of the way NEW | FIXED (Aug 30): on desktop the banner sat at y=14, directly on top of JOURNAL/PROGRESS/STORE. And since spawn is a safe zone, that 460px explainer occupied prime screen space for everyone constantly and collided with any panel opened under it. Now: full banner below the dock for 6s on entry, then it collapses to a small "SAFE ZONE" pill top-left under the ?/shield buttons (UIFIX1/UIFIX6). Cooldown keeps the full banner (its countdown matters). Verified live both states. Test: spawn → banner under the dock → ~6s later small pill top-left; leave and re-enter the zone. |
| 306 | Phone closes when you open a panel (no more stacked modals) NEW | FIXED (Aug 30): with the phone open, HELP opened the Help Center behind the phone and three dock icons lit at once. New tiny PanelExclusivityGuard: when Journal / Progress / Inventory / Dailies / Map / Help opens, the phone closes through its own hook (UIFIX5). Verified live: phone open → B → phone closed, inventory up. Test: phone up, then hit each of those — phone should always drop. |
| 307 | HUD tug-of-war during the intro menu (the "fought(30)" console lines) NEW | FIXED (Aug 30): EnterCleanupClient decided "player has entered" when PaletoMenu == nil — also true at t=0 before the menu is built — so it force-showed the HUD twice a second while IntroHudGate force-hid it for the menu, for as long as the menu was up. Now keyed on the server's HasEntered (or menu-shown-then-gone), same rule TopIconsManager uses (UIFIX3). Verified: 0 flips after entry. Test: F9 on join — no more [EnterGuard] ...fought(...) warnings. |
| C2 π΄ | Backpack gridβgrid drag | Root cause was found and fixed twice (desktop + touch coords). Aug 8: you reported it STILL doesn't work β "any item doesn't drag into an empty box, and doesn't light up green" β so this is back to open and tracked in MASTER_REMAINING. Don't re-report until I say it's fixed again. |
| MISC | Smaller known items | No phone-holding animation yet Β· some free-model cars still log their own errors (broken lights/gauges β the Universal Car UI v2 pass is what retires these) Β· a UI sweeper hides any label whose text is purely digits (worked around; harmless, but it's why callsigns are rich-text now). |
| 239 | Phone icons β your PNGs are back NEW | FIXED (Aug 19): my Aug 12 "icon unification" pass replaced your PNG icons with drawn gradient tiles. You hated it, so it's reverted β verified live: the phone opens and builds 16 PngIcon objects with real rbxassetid images (77707172078557, 96125028759568, β¦). Apps that never had a PNG keep the drawn fallback. Test: open the phone (Y) β home grid should look like it used to. Check All Apps and the App Store tabs too, those were touched by the same pass. |
| 240 | Phone hold pose NEW VERIFY | BUILT but NOT VERIFIED (Aug 19): a new PhoneHoldPose script (6,613 chars, R15 + R6, hold + on-call ear pose) replaced the old PhoneHoldPoseClient (now disabled). It loaded with no errors, but the session ended before I could watch the arm actually raise. Test: equip the phone β arm should come up holding it, not hang at your side; unequip β normal; then die/respawn and check it still works. |
| 241 | Camera bobbing / jail-bail leak NEW VERIFY | PARTIAL β NOT VERIFIED (Aug 19): CameraLeakSentinel was edited (3,242 chars, now sweeping every 2s) but the session was cut off before the jailβbail path was traced, so I cannot claim this is fixed. Test: drive a car and get out, then get arrested β jailed β bailed, and tell me if the screen bobs after each. If it still bobs, say WHICH of the two caused it β that narrows it a lot. |