DOCUMENT 01 / FAIR PLAY
Why 2K's shot cheaters
never go away.
Scripted green shooters last for months, and they green shots that look impossible: half-court step-backs in 3v3, heavily contested jumpers. This document reads NBA 2K27's own code to show how a shot is judged, why those shots get through, what the game does against scripts, and what it reports to 2K after every game. NBA 2K20 and 2K19 are the comparison.
Updated October 25, 2026, checked against update 2.0.H1 · 50 min read
The short version
A cheat device doesn't change the game. It only changes when your release arrives. Everything 2K does against it has to work on timing, and the game has no rule that treats a half-court step-back or a contested jumper differently from any other shot.
- The cheat lives outside the game. A Cronus Zen or Titan Two sits between the controller and the console and passes itself off as an ordinary controller. The console sees nothing foreign.
- Half-court step-backs in 3v3 count as normal jump shots. 2K27 only treats a shot as a heave from 47 feet out. The half-court line is about 42 feet from the rim, so those shots get the same Excellent grade and the same timing bonus as a shot from the top of the key.
- Contested shots can still grade Excellent. The Excellent check doesn't use the contest you see. It uses the defense after the shooter's jump-shot grade, Takeover and badges have cut it down, and Deadeye can cut it to zero. An active Takeover window boost skips the check completely.
- A perfect release isn't an automatic make. It adds a bonus to the shot's chance, capped at a multiple of the original chance, and then the shot is rolled. A team on a cold streak can have a near-perfect release forced in.
- 2K27 fights scripts by moving the timing. It changes jump-shot speed at random, switches the set of speeds every seven minutes, holds back a hot shooter's input for a random few frames, and flags rhythm shots whose stick never moves like a real thumbstick.
- The shot code isn't the only check. The machines in an online game vote out the one whose game drifts from the rest, 2K's servers can send the game small scripts to run and answer, and conduct rules kick idle players and foul abusers. 2K League games also report full timing histograms and each player's expected makes.
- Every number arrives from 2K's servers. Window sizes, limits, bonuses and anti-cheat settings are in a tuning file the game downloads. That file isn't on the PC we studied, so this document gives 2K27's exact formulas, the values fixed in the game file, and exact values for 2K20 and 2K19.
- The base design goes back to 2K19. The same eight grades, a window sized by the look, a defense limit on Excellent, and a target that moves at random under defense. 2K27 adds more window factors, the anti-cheat, and a luck system that forces results.
How a 2K27 shot works
Every jump shot, layup and dunk goes through the same five steps. The game rates the shot, works out the defense, grades your release, adds a timing bonus to the chance, then decides make or miss. Each part below shows the code first, paraphrased in our own words, then what it means in plain language.
The grades
NBA 2K27 · TIMING GRADES AND CONTEST LEVELS (OUR WORDING)
// Seven timing grades plus "no timing", the same set as 2K19 and 2K20
grades = very early, early, slightly early, excellent,
slightly late, late, very late
// How covered the shot is, plus ten finer on-screen feedback tiers
contest = wide open, open, lightly contested, heavily contested, smothered
// Who sets the window size
models = Rookie, Semi-Pro, Pro, All-Star, Superstar, Hall of Fame,
and one built from the real player's shooting percentageIn plain words: your release is compared with the perfect moment and lands in one of seven grades. Excellent is the middle one. The window is the stretch of time around the perfect moment that counts as Excellent, and its size starts from your difficulty, or from the real player's percentage in that mode.
A script removes your release error, the one part of a shot that depends on your hands. Everything else in this section still applies to a cheater exactly as it does to you.
The timing window, factor by factor
2K27 builds the window in two passes. The first sets a starting size from your difficulty and the way you shoot. The second multiplies it by everything about this particular shot.
NBA 2K27 · SIZING THE WINDOW (PARAPHRASED)
// Pass 1: the starting size
window = start_size[difficulty][release_type] // 7 difficulties × 3 ways to release
// layups and dunks have their own lists
if shooter is not a person with the meter on: window ×= meter_off_scale
if the shot is a three: window ×= three_scale
if team_control: window ×= team_control_scale
// Pass 2: this shot
window ×= look_curve(chance_before_timing) // six points, jumpers, layups, dunks
× shot_type_scale[shot] // 30 shot types, a second list for threes
× luck_curve(team_luck_total) // with a floor when the defense is light
× takeover_scale // active Takeover abilities
× effects_from_other_players // each one names its target
× spare_curve_a(shot_attribute) // two unused slots 2K can fill
× spare_curve_b(rating) // from the server at any time
× minigame_scale // only in the Park shooting minigame
× game_mode_scale // 1 everywhere except MyCAREERIn plain words: the window starts from your difficulty and gets bigger or smaller for each item on the list. Turning the meter off, shooting a three and the kind of shot (pull-up, step-back, fade, floater and the rest) each change it. A worse look shrinks it. Your team's luck streak changes it. Takeover can grow it. The last four only apply in special cases. Every factor multiplies the others, so a single setting of 0 closes the window completely.
What each factor does, with exact values
| Factor | When it applies | NBA 2K27 | NBA 2K20 | NBA 2K19 |
|---|---|---|---|---|
| Starting size | Always | From 2K's servers, per difficulty and release type | Meter on: Excellent runs 2 frames early to 1 late on Rookie, 1 early to 1 late from Pro up | 1 frame early to on time from Pro up; 1 early to 1 late on Rookie |
| Meter off | The shooter isn't a person with the meter on. That covers meter off and every CPU shooter | Server multiplier | Its own fixed cutoffs at every difficulty: Excellent 1 early to 1 late | No such setting |
| Threes | The shot is a three | Server multiplier | No such setting | No such setting |
| Team control | At least two people on the shooter's team, and the shooter's controller isn't locked to one player | Server multiplier | No such setting | No such setting |
| Shot type | Every shot, 30 types, with a separate list for threes | Server multiplier per type | No such setting | No such setting |
| The look | Every shot, by its chance before timing | Six-point server curve, one each for jump shots, layups and dunks | 10% → 0.3×, 20% → 0.5×, 30% → 0.7×, 40% and up → 1× | 10% → 0.4×, 20% → 0.6×, 30% → 0.8×, 40% and up → 1× |
| Luck streak | Every shot, by the team's luck total (below) | Server curve, never below a server floor when the defense is light | No such setting | No such setting |
| Takeover | An active Takeover that boosts the window | Server multiplier per ability; above 1 it also skips the Excellent check | 1.5× jump shots, 2× layups, skips the check | 1.5× jump shots, 2× layups, skips the check |
| Other players | Another player on the floor has an effect aimed at the shooter | Server values, multiplied together | No such setting | No such setting |
| Two spare slots | Every shot | Wired into the math but empty until 2K's tuning fills them | No such setting | No such setting |
| Park shooting minigame | Only in that minigame | Set by the minigame | No such setting | No such setting |
| MyCAREER buddy skill | Your own MyPLAYER in MyCAREER, while a My Buddy timing skill is active | 1.5×, 2.5× or 4×, fixed in the game file, for a set number of shots | No such setting | No such setting |
| Practice drills | Drills that only count Excellent | Fixed cutoffs of 0.25, 0.5 and 0.8 seconds each side | No such setting | No such setting |
One frame is 1/60 of a second, about 17 milliseconds. 2K20's and 2K19's values come from their live memory. 2K27's "server" values sit in the tuning file 2K sends to the game, which isn't on the PC we studied.
What "team control" means. It's the couch setup where two or more people play on one team and each controller can switch between players, as in Play Now. The code checks that the team has at least two users and that the shooter's controller isn't locked to one player. In Park, Rec, Pro-Am and MyCAREER every person is locked to their own player, so team control never applies there.
2K20's full cutoffs, meter on
NBA 2K20 · RELEASE CUTOFFS BY DIFFICULTY, IN FRAMES (LIVE VALUES)
Rookie Pro All-Star Superstar Hall of Fame
very early ← −10 −9 −8 −7 −6
early ← −5 −4 −3 −3 −3
excellent ← −2 −1 −1 −1 −1 (start)
excellent → +1 +1 +1 +1 +1 (end)
late → +5 +4 +3 +3 +3
very late → +10 +9 +8 +7 +6
meter off, and every CPU shooter, at any difficulty:
−10, −3, −1 | +1, +3, +10
layups, every difficulty:
−10, −5, −1 | +1, +5, +10
then every cutoff × look scaleIn plain words: with the meter on, 2K20's Excellent window is 3 frames wide on Rookie (about 50 ms) and 2 frames from Pro up (about 33 ms). Past Pro, higher difficulties only tighten the outer cutoffs, so a mistimed release is graded Late or Very late sooner while the Excellent window stays 2 frames. With the meter off you get those same 2 frames at any difficulty.
When Excellent is refused
NBA 2K27 · GRADING A RELEASE (PARAPHRASED)
if takeover_scale > 1:
skip both checks // an active Takeover boost
else:
if chance_before_timing < min_chance_for_excellent[jump shot, layup or dunk]:
no excellent
if defense > max_defense_for_excellent[jumpers or layups]:
no excellent
// "no excellent" turns the release into slightly early or slightly lateIn plain words: a perfect release still isn't Excellent if the look is too poor or the defense is too heavy. Both limits are server values in 2K27. 2K20 used 0.5 for jump shots and 0.7 for layups, with no minimum chance. 2K19 used 0.15 and 0.4. Any Takeover that grows the window turns both checks off.
The defense the check uses
The defense number in that check isn't the contest you see on screen. The game starts from the contest, then cuts it down for the shooter before it compares anything.
NBA 2K27 · THE DEFENSE A SHOT FEELS (PARAPHRASED)
contest = sum of the defenders' contest parts
contest += sum of every active badge's defense change // never below zero
defense = combine(contest, shooter vs defender ratings)
× height and distance adjustment
× takeover_defense_scale // per active Takeover ability
× unfazed_scale[shooting_level] // seven levels
× immunity_curve(jump_shot_immunity) // the jump shot's defense immunity grade
defense = at least the lowest defense level
// The on-screen label uses its own ten cutoffs:
label = how many of feedback_cutoffs[10] the defense reachesIn plain words: a jump shot with a high defense-immunity grade, an active Takeover and the right badges can turn a heavy contest into a light one before the Excellent check sees it. Badges add their changes together, and Deadeye's can take a late contest all the way to zero. The contest label you see comes from ten separate cutoffs, so the word on screen and the Excellent limit are two different settings.
What a good release adds
NBA 2K27 · THE TIMING BONUS (PARAPHRASED)
bonus = grade_bonus[jump shot or layup][grade] // five steps from very off to perfect
// if 2K's tuning turns it on, an Excellent scales from the second-best
// step to the best by how centered it was
if excellent and meter on:
bonus = max(bonus × meter_on_scale, slightly_off_bonus)
// Close to the rim it uses the layup list, far out the jump-shot list,
// and blends the two in between
bonus += timing_grade_curve(jump_shot_timing_grade) × grade_scale[grade]
bonus += takeover_timing_buff[grade] // shooting or finishing abilities
if chance_before_timing ≥ very_easy_threshold: bonus = at least +100%
chance = min(chance_before_timing + bonus,
chance_before_timing × bonus_cap(chance_before_timing))
chance = 2K's remap curve(chance) // on timed shotsIn plain words: a good release adds to the chance, and a bad one takes away. An Excellent with the meter on gets its own scale, with a floor so it never falls below the bonus for Slightly early or late. Your jump shot's timing grade and Takeover add more. The total can't take the chance past a multiple of where it started, set by a server curve, so a 10% look can't jump to 100% unless 2K sets that curve to allow it. Very easy shots, at or above a server threshold, get the full capped bonus whatever the timing.
2K20 worked differently. It multiplied the chance instead of adding to it: about 1.22 to 1.30 times for an Excellent from Pro up. 2K19 doubled it. Both tables are in the 2K19 and 2K20 section.
Make or miss
NBA 2K27 · DECIDING THE SHOT (PARAPHRASED)
// Each team keeps a luck total per shot type: jump shots, layups, dunks
after every shot: luck += made ? (1 − chance) : −chance
off = how far the release was from perfect, as a share of the window
if luck < −streak_limit and chance > min_for_forced_make and off < small:
forced make // a cold team, near-perfect timing
elif luck > +streak_limit and chance < max_for_forced_miss and off > large:
forced miss // a hot team, timing well off
else:
card = next card from the team's deck // ten cards, reshuffled at three left
make = chance > card
// the game mode can still change the result afterwardsIn plain words: the game tracks how lucky each team has been. A team that keeps missing shots it should make can have a near-perfect release forced in. A team that keeps making shots it should miss can have a sloppy release forced out. Every other shot is drawn against its chance from a shuffled deck of ten cards, so results even out over a game. Practice drills are the one place where Excellent is an automatic make and anything else an automatic miss.
Your questions, answered from the code
Why do cheaters green half-court step-backs in 3v3?
3v3 is played on a half court, so a "half-court" shot is taken from around the half-court line. That's about 42 feet from the rim. 2K27 decides whether a shot is a heave by distance alone.
NBA 2K27 · WHEN A SHOT BECOMES A HEAVE (VALUES FIXED IN THE GAME FILE)
distance = shooter to the rim
if distance ≥ 60 ft: long heave
elif distance ≥ 47 ft: heave
elif distance ≥ 10 ft and the game is in one state it checks for
and under 0.6 s remain on the clock:
buzzer heave
else: a normal shot, timed like any other
// separately, 2K's tuning can switch timing off for heavesIn plain words: a shot from the half-court line is under 47 feet, so it's a normal jump shot with the full Excellent grade and the full timing bonus. Nothing in the code gives a shot from 42 feet any special timing rule.
So what decides whether a scripted 42-foot Excellent goes in? Only the general rules above, all set by 2K's servers:
- The window shrinks with the look. A poor look gets a smaller window. A script that releases at the same moment every time barely cares, as long as the window is still there.
- The Excellent check can refuse it. If 2K's minimum chance for that shot type is above the shot's chance, a perfect release can't grade Excellent. 2K20 and 2K19 set that minimum to 0.
- The bonus cap limits it. The final chance can't pass a multiple of the starting chance. If these shots go in most of the time, that cap must allow a large jump at low chances.
- The step-back and the three each have their own window scale. They can make that shot easier or harder to time. They don't change whether a perfect release is Excellent.
- Luck can force it in. A team on a cold streak can have a near-perfect release forced in, if the chance is above the minimum for a forced make.
- Limitless Range adds chance on deep shots. The badge has its own distance ranges and chance bonuses. See the badges document.
2K19 and 2K20 had one rule aimed at repeated deep greens. Past 60 feet, every Excellent shrank the next window, and the sixth closed it. 2K27 removed that rule, and it never covered 42 feet anyway.
How can a heavily contested shot be Excellent? What about smothered?
- The check uses the reduced defense. The jump shot's defense-immunity grade, the shooter's unfazed level, Takeover and badges all shrink the defense first (Figure 3).
- Deadeye removes late contests. When the defender wasn't already close at the start of the shot, Deadeye multiplies the release defense down by a curve, and its change can bring the total to zero.
- Takeover skips the check. Any active Takeover ability that grows the window turns the defense limit off.
- The label and the limit are separate settings. The on-screen contest comes from ten feedback cutoffs. The Excellent limit is one number per shot type. A shot can show "heavily contested" and still sit under the limit.
- A smothered make doesn't need Excellent. Any shot with a chance above zero can come up on the card draw, and a cold team's near-perfect release can be forced in.
How do Takeover and badges change shooting?
Takeover can grow the window, skip the Excellent check, add a timing bonus for each grade, shrink the defense and raise shot ratings. Badges change shot ratings, add chance on certain shots, cut the defense, and in Quick Trigger's case set a floor for the window on quick shots. The full breakdown, with 2K20's exact badge values, is its own document: Badges and Takeover, inside the shot.
Would hiding the green window help?
Not against the scripts that matter. A fixed-delay script never looks at the meter. It times the release from the moment you pressed shoot, so hiding the window changes nothing for it. Only a camera setup reads the meter, and it can read the shooting animation instead, the way a meter-off player does. The game already treats meter-off shooting differently: it has its own window scale, and the Excellent bonus has a separate scale when the meter is on. Hiding the window mainly takes a tool away from honest players who learned their jumper from it.
How the cheats work
Every common console cheat sits between your hands and the console and presents itself as an ordinary controller.
| Tool | What it is | How it gets greens |
|---|---|---|
| Cronus Zen | A USB adapter. The controller plugs into it, and it plugs into the console. | Runs scripts that rewrite button presses on the way through. |
| Titan Two | A rival programmable adapter that sits in the same spot. | Runs scripts the same way, with several stored on the device at once. |
| XIM and similar | Adapters that translate a mouse and keyboard, or remap inputs. | Mostly used for aiming in shooters, but they can carry macros. |
| Capture card + camera software | A second device watches the video, finds the shot meter, and drives a Zen. | Releases when the meter really is in the green. |
How a green script times a shot
- You press shoot. The script sees the press before the console does.
- It waits a fixed delay tuned to your jump shot, often one per shot type.
- It sends the release at exactly that moment, whatever your thumb does.
- Better scripts add a few milliseconds of random wobble so the timing looks less mechanical.
The camera setup is the hardest case. It reacts to what's on screen instead of a fixed delay, so it adapts to lag and to every jumper the way a person would, only with near-perfect precision.
Why the console can't detect the device
- It copies the controller's identity. A Zen or Titan reports the same USB identity as an official PlayStation or Xbox controller.
- It passes the license check through. Consoles check that a controller is licensed with a cryptographic challenge, and the device hands that challenge to the real controller.
- The game only sees button reports. In 2K's code, a shot is a press time and a release time. There's no program or memory change to find.
- 2K can't add deep checks on console. Sony and Microsoft own the system and the USB layer, so 2K can't ship kernel anti-cheat there.
- Platform fixes get patched around. When a console blocks a device, its makers usually ship new firmware.
What 2K27 does about it
2K27's shot code has a group of settings built against scripts, and all of them work on timing. Mike Wang put the design plainly: "There's no RNG factor that will make you randomly miss shots." The code randomizes when you have to release, not whether a perfect release goes in.
NBA 2K27 · THE ANTI-CHEAT IN THE SHOT CODE (PARAPHRASED)
// 1. Random speed on signature jump shots, people only
if anti_cheat_speed_on and the shooter is a person:
speed = weighted pick of 5 values from table[t]
// t switches among 3 tables every 420 s of game time, in shuffled order
effect grows from a minimum on jump shots needing 60 or less to full at 95
// during the shot the speed eases in, reaching full a set number
// of frames before take-off
// 2. A random input hold for hot shooters
if attempts ≥ min_attempts and field_goal_pct ≥ min_pct:
hold this controller's next input for 0 … max_frames frames
// 3. Rhythm-shot stick check
every frame of a person's rhythm gesture:
moved_x |= stick.x is between the middle and the edge
moved_y |= stick.y is between the middle and the edge
if either axis never moved in between:
push the timing at least N frames off perfect
count one flagged shot for this player and log itIn plain words: 2K27 changes the speed of your jump shot at random and swaps the set of speeds every seven minutes. It holds back a hot shooter's input for a random few frames, and it checks that a rhythm shot's stick passed through in-between positions the way a real thumb does. None of these bans anyone. All of them make a fixed delay stop lining up.
Speed that changes with the situation
Separately from the anti-cheat, every jump shot's speed is drawn at random from a range. A steadiness score from 30 to 100 sets how wide the range is. It's built from your jump shot's timing grade, adjusted for release speed: a quicker release gets a lower score and a wider range. Stamina and the closest defender shift both the range and the moment the shot starts, and a small random spread is always added on top.
NBA 2K27 · THE TARGET MOVES UNDER DEFENSE (PARAPHRASED)
tier = great shooter if rating ≥ 85, good if ≥ 75, else bad t = min(defense / full_contest_defense, 1) range = blend(tier.open_range, tier.contested_range, t) target = perfect_moment + random(range) // in frames
In plain words: on a contested shot, the perfect moment itself moves by a random few frames from one attempt to the next. Worse shooters and heavier contests get bigger moves. This applies to people as well as the CPU. A fixed delay loses greens here, while an open great shooter keeps a steady target.
The hot-shooter hold
The game counts each player's attempts and makes. Once both pass 2K's thresholds, the game holds that player's controller input for a random 0 to N frames, drawn fresh each time. A script times its release from the moment it sent the press, so the hold knocks it off the animation. A person watching the animation just adjusts.
The rhythm stick check
Rhythm shooting times a jump shot or free throw with a stick motion instead of a button. A real thumbstick always passes through in-between positions. Input that only ever jumps between the center and the edge is what a macro, a remapped key or a script produces, so that release is pushed off perfect and counted.
What it means for cheating
- 2K moved from catching scripts later to making them miss now. Rotating speeds, random spread and held input all target a fixed delay. The stick check targets fake stick input.
- A good script beats the stick check. A device that sends smooth stick values passes it.
- Script makers can patch around part of it. Anything visible in your inputs, like holding sprint into a pull-up, can get its own delay. A random draw that changes every shot can't be read from the buttons.
- Camera setups still get through. They watch the animation the way a person does, so a speed change shows on their screen too.
- Honest great shooters pay too. The hot-shooter hold can't tell a great shooter from a script. It just makes a high percentage harder to keep.
What 2K27 reports after every game
When an online game ends, 2K27 sends three reports to 2K. Between them, 2K gets each player's timing consistency, their meter habits, a count of flagged rhythm shots, and a note on anyone the anti-cheat removed.
NBA 2K27 · THE END-OF-GAME REPORTS (OUR NAMES)
cheater report for each flagged player: player id, session, status
game report per player: result, shot button vs shot stick use,
flagged rhythm shots, box score
meter fill: shots, average, spread
shot chart in 16 court zones, green releases
timing report per player, for each way of shooting
(jump shot meter on / off, rhythm timing meter on / off,
rhythm tempo meter on / off):
shots, average timing error, timing spreadIn plain words: after every online game, 2K learns how far off each player's releases were on average and how much they varied, split by how they shoot. It also gets their greens, their meter habits, how many rhythm shots failed the stick check, and whether the PC anti-cheat removed anyone.
Why the average and the spread are the right numbers
The spread of a player's timing error is exactly what separates a person from a fixed-delay script: people spread out, scripts stack. The average shows a habit, like always releasing a little early. 2K27 splits both by meter setting, so a meter-off player is compared with the right group. The game itself adds spread to everyone through the random target shift, which is why one game's numbers are never enough.
- The flagged-shot count goes up by one exactly when the rhythm stick check flags a shot. So 2K gets a count of each player's fake-stick rhythm shots, every game.
- The timing numbers come from every shot's distance from perfect, capped at one second, kept as a running average and spread for each way of shooting.
- The cheater report lists each player whose cheat status is set. On PC, that happens when the anti-cheat asks the game to remove someone.
- The upload changed shape. 2K20 sent ten-bucket timing histograms with every game's results. 2K27 sends them only for 2K League games (below). Every other game sends the average and spread instead.
What every result report carries
Those three reports aren't the whole story. Every online mode also builds a result report for 2K's servers. Park, Pro-Am, MyCAREER's NBA games (solo and co-op), its drills and workouts, MyPLAYER online games, MyTEAM and its park, The W Online, Play Now Online, Legacy mode and the 2K League each have their own. They share one core.
NBA 2K27 · A RESULT REPORT (OUR NAMES)
game: game id, session, game type, time played
up to 16 answers to server challenges // see "Beyond the shot"
each user: win, loss, dropped, quit, completed, how the game ended
teammate grade, and the plays behind it
(good shot defense, stops, smart double teams,
stopped fast breaks, stopped alley-oops)
each player: the box score, plus greens made on jump shots,
layups and dunks, and in total
by mode: Park court, streak and event; grind points, rep and badge XP;
Takeover XP; whether skill boosts were freeIn plain words: after an online game, 2K learns who played, how the game ended for each person, every player's box score with their greens split by shot type, and their teammate grade. Each mode adds its own progress. That's the record 2K's servers use to pay out VC, XP and rep, so the same report that carries progress also carries the evidence.
| How the game ended for a player | What it means |
|---|---|
| Completed | Played to the end. A separate value covers a game that finished after a split (see "Beyond the shot"). |
| Quit, dropped, cable pulled | Left on purpose, lost the connection, or the network went away mid-game. The game keeps these apart. |
| Players left, stalled, stalled more than once | The game couldn't go on because others left or it stopped advancing. |
| Out of sync | This player's game stopped matching the others' and was voted out. |
| Kicked for idling, for fouls, for teammate grade, or other | Removed by a conduct rule (see "Beyond the shot"). |
| Cheat victim, cheat at fault | The game ended because of a cheat. The report records which side was hurt and which was at fault. |
| Cancelled, accepted an invite, result error | The game didn't count, the player left to join another game, or the result couldn't be settled. |
The 2K League gets the full picture
NBA 2K27 · THE 2K LEAGUE PLAYER REPORT (OUR NAMES)
timing, for jump shots, layups and free throws:
a ten-bucket histogram, total shots, total timing error
expected makes, for threes, twos, layups and free throws:
the sum of every shot's chance
also: catch-and-shoot and pick-and-roll makes and attempts,
contest and block impact sums, inside and on the perimeter,
passes thrown and caught, touches, dribble moves, time on the ballIn plain words: 2K League games, tryouts included, send the same ten-bucket timing histograms 2K19 and 2K20 sent for everyone, and each player's expected makes. Add up the chance of every shot a player took and you get how many they "should" have made. A player who beats that number game after game, with a narrow timing histogram, stands out. Everyone else's games send only the average and spread.
Beyond the shot: the rest of 2K27's fair-play code
The shot code is one layer. 2K27 also makes sure every machine in a game agrees, lets 2K's servers ask the game questions, and enforces conduct rules. None of these care how you time a jumper, but together they decide who stays in a game and what 2K hears about it.
When machines disagree
In an online game, every console or PC runs the same game at once and the machines keep checking that they still match. If one drifts, the game decides which machines are right by vote.
NBA 2K27 · RESOLVING A DESYNC (PARAPHRASED)
each machine in the game (up to 14) reports a check value of its game state
machines with the same value form a group
majority = the biggest group // on a tie, the first one found
if the majority and this machine's group both have at least 2 machines:
split: the groups can carry on as separate games
otherwise, one of three outcomes, each logged:
keep this machine / remove a machine / end the game
the result report records "out of sync" or "completed after a split"In plain words: when the machines' games stop matching, the biggest group of matching machines wins and the others are removed. If both sides have at least two machines, the game can split instead, so a game with many people in it doesn't end for everyone. It also means a change made to the game on one machine tends to get that machine dropped rather than help it: once its game stops matching the others, it loses the vote.
Questions from 2K's servers
NBA 2K27 · A SERVER CHALLENGE (PARAPHRASED)
2K's server sends a challenge: a small script if the report already holds 16 answers: skip it run the script // only the first, if there are several store its answer in this game's result report if anything goes wrong: skip it and log why
In plain words: during an online game, 2K's servers can hand the game a small program to run and get its answer back with the game's result. The questions can change at any time without a game update, and the game can't know ahead of time what it'll be asked. What 2K actually asks isn't in the install. It arrives with each challenge.
Conduct rules
The same part of the code that handles online cheating also enforces how people behave in a game. Each mode's setup turns these rules on and sets their limits, and 2K's servers can override them, so no limits are in the install.
| Rule | What it does |
|---|---|
| Idle check | Kicks a player whose controller sits untouched for a set time. MyTEAM runs its own copy of this check. |
| Teammate grade | Kicks a player whose teammate grade falls below a minimum. |
| Fouls | Kicks a player past a set number of fouls. A switch lets reaching fouls count toward the penalty limits. |
| Penalty limits | Separate limits for penalties in a row and in total, and for reach-ins in a row and in total. A mode can ignore them in the fourth quarter. |
| Pauses | Pause timers per player, a maximum pause time, seconds taken off for each pause, and an optional short timer. |
| Team-ups and spectating | Switches for team-up games, which have their own idle and grade checks, and for whether spectators are allowed. |
Settings against gameplay exploits
2K27's gameplay tuning also has settings aimed at exploits rather than cheats, all with values from 2K's servers:
- Dribble shoves: a ball handler who shoves far enough into a defender, with the ball far enough from their hand, can fumble.
- The far-post exploit: a set distance and a penetration threshold to stop it.
- Exploit layups: their own strip chance.
- Fake-stick rhythm shots: the timing push from the stick check above.
Does the code match what Mike Wang said?
Mike Wang made three claims about 2K27 shooting: no randomness makes you miss, a perfect release always goes in, and shot speed changes with stamina, defensive pressure, the catch, pull-ups and signature shot grades, which he called the skill gap.
| Claim | What the code shows | Verdict |
|---|---|---|
| No randomness makes you miss | Every shot that isn't forced is drawn against its chance from a shuffled ten-card deck. A release that isn't perfect can miss on that draw. Forced misses also exist, for a team running hot whose release was off. | Doesn't hold for imperfect releases |
| Release perfectly and you make every shot | A perfect release adds a bonus capped at a multiple of the chance, then the shot is drawn. It's a sure make only if 2K's tuning lets the chance reach 100%, or the team is cold enough to have it forced. Excellent is also refused on poor looks and heavy defense. | Holds only if 2K's tuning makes it so |
| Speed changes with stamina, pressure, the catch, the shot | Stamina and the closest defender move the shot's start and its speed range. The timing grade and release speed set how wide that range is. Pull-ups and catch-and-shoot are shot types with their own window scale. | Matches |
| Not mentioned | Random speed for people's signature jump shots, from tables that rotate every seven minutes. Random spread on every jump shot's start and speed. A random shift of the perfect moment on contested shots. | Left out |
| Not mentioned | A random input hold once a player's attempts and field goal percentage are high enough. | Left out |
| Not mentioned | A team's luck streak changes its window size and can force makes and misses. | Left out |
| "That's the skill gap" | Part of the speed change follows the situation and can be learned. Part is a deliberate random draw that can only be reacted to, and shooting well switches on more of it. | Partly |
The code partly contradicts him. Timing is deliberately randomized for players as anti-cheat, a team's luck changes both its window and its results, and a shot that isn't forced is still drawn against its chance, as in 2K20. "Perfect means a make" is true only as far as 2K's server tuning pushes a perfect release's chance to 100%, and that tuning can change at any time.
How we got here: 2K19 and 2K20
2K19 and 2K20 keep their tuning in the game's own data, so their live memory shows real values. Their code shows where 2K27's design came from.
| NBA 2K19 | NBA 2K20 | NBA 2K27 | |
|---|---|---|---|
| What Excellent does | Doubles a jump shot's chance | Multiplies it by about 1.22 to 1.30 from Pro up | Adds a bonus, capped at a multiple of the chance |
| Excellent window, Pro, meter on | 1 frame: 1 early to on time | 2 frames: 1 early to 1 late | From 2K's servers, then up to 13 factors |
| Defense limit on Excellent | 0.15 jump shots, 0.4 layups | 0.5 jump shots, 0.7 layups | Server values; checked against the reduced defense |
| Minimum chance for Excellent | 0 | 0 | Server value per shot type |
| Takeover | Window 1.5× jumpers, 2× layups, check skipped | The same | Per ability: window, check skipped, timing bonus, defense |
| Random target shift | Up to 1 to 3 frames by shooter tier and defense; bad shooters 2 frames off even when open | None when open; up to 1 to 3 frames under defense | The same kind of tables, from 2K's servers |
| Deep-shot rule | Past 60 ft, each Excellent shrinks the next window; the sixth closes it | The same | Removed. Heaves start at 47 ft and 2K can turn their timing off |
| Luck | None | Forces makes and misses on streaks | Forces results only when timing agrees, and changes the window |
| Anti-cheat in the shot code | None | None | Random speed tables, hot-shooter hold, rhythm stick check |
| Where tuning comes from | The game's own data | The game's own data | 2K's servers |
| Timing report | Ten-bucket histograms | The same | Average and spread per way of shooting; ten-bucket histograms and expected makes in 2K League games only |
| Desync handling | Not checked | A vote among up to 14 machines; the minority is removed, or the game splits | |
| Server challenges | Not checked | Up to 16 server scripts answered in each result report | |
"None" means the setting doesn't exist in that game's executable. Neither 2K19 nor 2K20 has an anti-cheat setting or a flagged-shot counter, and neither install ships an anti-cheat program.
2K19's window
NBA 2K19 · RELEASE CUTOFFS IN FRAMES (LIVE VALUES)
jump shots, Pro and up layups, any difficulty
very early more than 8 early more than 10 early
early 8 to 2 early 10 to 4 early
slightly early 2 to 1 early 4 to 3 early
excellent 1 early to on time 3 early to 3 late
slightly late on time to 2 late 3 to 4 late
late 2 to 8 late 4 to 10 late
very late more than 8 late more than 10 late
// On Rookie, jump shots get 10, 2, 1 early and 1, 2, 10 late
every cutoff × look scale × Takeover (1.5× jump shots, 2× layups)
no Takeover and defense above 0.15 (0.4 for layups):
excellent becomes slightly early or slightly lateIn plain words: from Pro up, 2K19's Excellent window on a jump shot is a single frame, about 17 ms, and any real contest takes it away. 2K19 has no separate meter-off window.
2K19 and 2K20 already moved the target
| Shooter tier | 2K19 open | 2K19 contested | 2K20 open | 2K20 contested |
|---|---|---|---|---|
| Great (85+) | 0 | ±1 frame | 0 | ±1 frame |
| Good (75–84) | ±1 frame | ±2 frames | 0 | ±2 frames |
| Bad (below 75) | 2 frames early | ±3 frames | 0 | ±3 frames |
| Full contest at a defense of | 0.5 | 0.2 | ||
NBA 2K19 AND 2K20 · THE DEEP-SHOT RULE (PARAPHRASED, LIVE VALUES)
after a timed shot from past 60 ft:
excellent → deep_streak += 1
any other grade → deep_streak −= 0.2 // never below 0
on shots from past 60 ft:
excellent window × (0 → 1×, 3 → 0.5×, 6 → 0×)In plain words: the older games punished repeated perfect heaves. Each Excellent from past 60 feet shrank the next one's window, and after six in a row the window closed. That's the only rule in either game aimed at repeated perfect releases.
What Excellent was worth
NBA 2K20 · TIMING MULTIPLIERS (LIVE VALUES)
// One row per grade, blended from a close-range value to a long-range one grade close range long range very early / late 0.35 – 0.75× 0.82 – 0.86× early / late 0.70 – 0.90× 0.87 – 0.91× slightly early / late 1.00 – 1.23× 1.02 – 1.06× excellent 1.22 – 1.30× 1.15 – 1.23× chance = clamp(chance × multiplier, 0%, 100%)
In plain words: in 2K20 a perfect release multiplied the chance by about a quarter, a bit less from long range. Each range covers the difficulty presets. One preset doubles the chance on Excellent and one turns timing off.
NBA 2K19 · TIMING MULTIPLIERS (LIVE VALUES)
grade jump shots the other shot type very early / late 0.40 – 1.00× 0.65 – 1.00× early / late 0.84 – 1.10× 0.85 – 1.20× slightly early / late 1.37 – 1.45× 1.20 – 1.50× excellent 2.00× 1.45 – 2.00× // a jump shot released past the outer cutoffs gets 0×: a sure miss
In plain words: in 2K19 a perfect jump shot doubled the chance in every preset that uses timing, so any look of 50% or better was a sure make.
| Preset | Difficulty | 2K20 Excellent, close / long | 2K19 Excellent jump shot |
|---|---|---|---|
| 0 | Rookie | 2.00× / 2.00× | 2.00× |
| 1 | Pro (the live sessions) | 1.30× / 1.23× | 2.00× |
| 2 | All-Star | 1.27× / 1.21× | 2.00× |
| 3 | Superstar | 1.24× / 1.19× | 2.00× |
| 4 | Hall of Fame | 1.22× / 1.17× | 2.00× |
| 5–7 | Other game styles | 1.22–1.27× / 1.15–1.17× | 2.00× |
| 8 | Custom sliders | Set by the sliders | Set by the sliders |
Both games pick a column by difficulty: difficulties 0 to 4 map straight onto presets 0 to 4, presets 5 to 7 are other game styles, and preset 8 is custom sliders. Both live sessions we read were on Pro.
NBA 2K20 · THE MAKE ROLL (PARAPHRASED, LIVE VALUES)
card = next card from a shuffled ten-card deck if luck > +1 and chance < 50%: card = 1.0 // forced miss if luck < −1 and chance > 30%: card = 0.0 // forced make make = card < chance // decided as the ball leaves the hand // luck: +(1 − chance) after a make, −chance after a miss
In plain words: 2K20 forced makes and misses from the luck total whatever your release was. 2K27 kept the deck and the luck total, but forces a result only when the timing agrees.
Green isn't the same as Excellent
Excellent is the timing grade. Green is the meter's feedback afterwards. In 2K20 the make is decided the moment the ball leaves the hand, so the result already exists while the feedback plays. In 2K19 the 2× bonus put almost every Excellent jump shot at a 100% chance. 2K27 counts green releases separately for dunks, layups and jump shots and sends them in its game report.
Why bans are slow
| Signal | Skilled player | Fixed-delay script | Camera setup |
|---|---|---|---|
| Spread of release error | Wide, shifts from session to session | Very tight | Tight |
| Late in games, tired | Drifts | Unchanged | Unchanged |
| Contested vs open | Its own pattern for each | Same delay everywhere | Same precision everywhere |
| When the connection lags | Misses more | Misses in a fixed way | Adapts, may stay perfect |
| After 2K27's speed table rotates | Adjusts by eye | Drifts off until retuned | Adjusts by eye |
- Scripts add wobble to widen their spread toward a person's.
- The game adds spread to everyone through its random speeds and target shift, so a detector has to expect it.
- Connection and frame timing blur millisecond-level evidence.
- Real elite shooters have tight timing and high green rates. A wrong ban hurts them most.
- Every jumper is different. Windows change with difficulty, shot type and meter setting, so players have to be compared with others in the same situation.
One game holds only a few dozen jump shots per player. Telling a wobbling script from a great shooter takes hundreds of shots over many sessions. Then, even once a cheater is spotted, banning at once costs more than waiting:
- Hiding the signal. An instant ban tells the script maker exactly what was caught. Banning thousands together hides it.
- The bar for proof. A wrong ban hits someone who may have spent real money, and a higher bar needs more shots per account.
- A person reviews it. Statistics are evidence, not proof.
- Priorities. Each 2K game has a one-year cycle, and anti-cheat competes with features for time.
That's what players see: someone greens for months, then disappears in a wave with many others. 2K27's in-game defenses don't change that. They make scripts weaker in the meantime.
A note on PC
Every console cheat also works on PC, and PC adds software cheats. 2K27 adds EasyAntiCheat there in a peer-to-peer setup, where the anti-cheat can ask the game to remove another player, and the result is logged as a kick by the anti-cheat. It also votes out any machine whose game falls out of sync with the others (see "Beyond the shot") and reports at startup whether the PC's mod folder is empty. The catch is that the timing report is built on the player's own machine. A console guarantees that code is untouched, while a PC cheater who gets past the anti-cheat can send numbers that look human.
What 2K could do better
- Keep a record of every shot, not just game totals. Each shot with its situation (the speed drawn, stamina, contest, whether the hold was on) would be far stronger evidence. A person's error moves with the situation; a script's stays flat even when the speed changes. 2K already sends more for the 2K League, which gets full histograms and expected makes. Every ranked mode could get the same.
- Check raw input on every shot. 2K27 only checks rhythm-stick motions. Button shots have tells too: press lengths that repeat to the millisecond, releases that land on the same input poll every time.
- Bring back a rule for repeated perfect deep shots. 2K19 and 2K20 had one past 60 feet. A rule that counts repeated Excellents from 35 feet and out would hit half-court scripts without touching normal shooters.
- Aim the hold at scripts, not at good shooting. The hot-shooter hold triggers on field goal percentage alone. Triggering it on a near-zero timing spread would hit scripts and spare great shooters having a hot night.
- Make the meter harder to read by camera. Small changes to the meter's position or shape on each shot cost a person almost nothing, and a camera setup trained on one look has to be retrained.
- Act quietly while the evidence builds. Flagged accounts could be matched with each other or kept out of ranked modes without revealing which signal fired.
- Make bans cost more. Console-level bans and loss of VC and items on confirmed cases mean a ban isn't solved by buying a new account.
- Let players report a specific shot. A report tied to a replay moment, with that shot's input timing attached, gives reviewers evidence instead of a name.
- Push the console makers for signed input. A controller's license check proves it's licensed, not that each press came from it. Only Sony and Microsoft can change that.
What 2K can't do
- See the device on console. The game only ever receives button reports.
- Block every adapter. They're legal products, and remapping hardware is also how many players with disabilities play.
- Out-design a camera. Any cue a person can learn from the screen, a camera can learn too.
- Ban instantly without hitting innocent players. The statistics need hundreds of shots, and elite shooters overlap with wobbling scripts.
- Win for good. Every detection gets studied and patched around. The real goal is to make cheating cost more than it's worth.
No single change ends scripting. 2K27's randomness beats fixed delays, its reports let statistics catch the rest over time, and its hot-shooter hold is already a quiet penalty inside the game. What it doesn't have is any rule that treats a half-court Excellent differently from a free throw.
Where each piece is in the code
Every claim above was read from the PC builds' code. The names in this document are ours, not the games' own. These are the addresses, so any of it can be checked. 2K27's addresses are for update 2.0.H1.
Checked against update 2.0.H1 (October 25, 2026). We compared the update with the build this document was first written from. Every settings layout behind this document is identical: shots, badges, Takeover, skill boosts, conduct rules and result reports. The values fixed in the game file haven't changed either: the 47 and 60 ft heave lines, the 420-second speed-table rotation, the frame-based input hold, and the 1.5×, 2.5× and 4× buddy windows. The code itself was rebuilt, so every address moved; the table above has the new ones. One internal list did move: the game-mode window factor now sits in a different slot of the mode's method table. The update's visible changes are elsewhere: crew tournament data, a low-energy mode flag, a flag for leaving a crew over crossplay limits, and new Player Eras teaser cameras. Anything 2K changes on its servers can still differ from day to day without an update.
| Piece | Game | Address |
|---|---|---|
| Shot resolve: rating, defense, grade, bonus, result | 2K27 | 0x14423EFC0 |
| Shot rating and badge rating boosts | 2K27 | 0x14423CD00 |
| Defense a shot feels; badge defense total | 2K27 | 0x1443CD4E0, 0x1444752A0 |
| Contest feedback tiers | 2K27 | 0x14423B3A0 |
| Grading and the Excellent check | 2K27 | 0x14423FC00 |
| Window pass 1 and pass 2 | 2K27 | 0x1443CE7C0, 0x1443CE920, 0x1443CDE20 |
| Luck window factor | 2K27 | 0x14423E3D0 |
| Game-mode window factor; MyCAREER buddy version | 2K27 | 0x1423598E0, 0x1419615A0 |
| Timing bonus; bonus cap; remap | 2K27 | 0x1442402D0, 0x144572000, 0x144240930, 0x144240B20 |
| Make decision, forced results, deck | 2K27 | 0x1442423C0, 0x14431B410, 0x144242110, 0x144241EB0 |
| Heave distances | 2K27 | 0x1447B5A90 |
| Takeover window, timing buffs, defense | 2K27 | 0x1444A7700, 0x1444A70D0, 0x1444A8470 |
| Deadeye defense change | 2K27 | 0x1444706F0 |
| Random speed tables; ease-in; steadiness | 2K27 | 0x1447B7F20, 0x1447BE4E0, 0x1447BD410, 0x1447BF600 |
| Target shift under defense | 2K27 | 0x1447BF0C0, 0x1447B08C0 |
| Hot-shooter hold | 2K27 | 0x144694A70, 0x1446A5BF0 |
| Rhythm stick check, flagged-shot count | 2K27 | 0x1447B0B70, 0x1447AD8D0, 0x14419D760 |
| End-of-game reports | 2K27 | 0x143A26CF0, 0x14419B1B0 |
| Server challenge | 2K27 | 0x143A21760 |
| Desync vote, anti-cheat removals | 2K27 | 0x143AC0F60 |
| Conduct rules: idle and grade kicks; settings log; MyTEAM idle check | 2K27 | 0x143A2B850, 0x143A2EAE0, 0x142963DE0 |
| Pause timers | 2K27 | 0x143A2AA50, 0x143A2AB90 |
| 2K League report (registration) | 2K27 | 0x143A16780, 0x143A16730 |
| Cutoffs, meter on and off | 2K20 | 0x1418AD040 |
| Grade, target shift, deep-shot rule | 2K20 | 0x1418AD4C0, 0x141B11030, 0x141C09320 |
| Timing multipliers, make roll | 2K20 | 0x1418A85A0, 0x1418E5DC0 |
| Grade and cutoffs | 2K19 | 0x1414EAFE0, 0x1414EAD30 |
| Look scale, target shift, deep-shot rule | 2K19 | 0x141505C60, 0x141736A70, 0x14178D610 |
| Timing multipliers | 2K19 | 0x1414E7DB0 |
Code blocks paraphrase what each function does in our own words; no game code or assets are reproduced. 2K27's setting values aren't in its install: they arrive from 2K's servers, so this document gives the formulas and the values fixed in the game file. 2K19's and 2K20's values come from live sessions. Addresses are for the builds we studied (2K27: update 2.0.H1) and differ in other versions. How cheat devices and console license checks behave, and how publishers run ban waves, is described from public knowledge. NBA 2K is a trademark of Take-Two Interactive; MyBaller is not affiliated with or endorsed by 2K.