# Blackjack model guide [Read as Markdown](/raw/game-model-blackjack.md) · [All game guides](/betting-models/) · [Measured native reference](/game-model-reference.json) ## Replacement skin support This game supports the [v2 skin contract](/game-skin-contract/). Replace the visible body and the exact named physical meshes listed at the end of this page. Use the surround and trim suggestions below to add matching scenery. Preserve the functional regions and state-dependent clearances described here. ## Station and scale Use `asset: "blackjack"` and an available ID from `blackjack:0` through `blackjack:10`. Place the game at floor elevation Y = 0–64, yaw as needed, scale `[1,1,1]`. The native root is `blackjack` in the game library. Read `games.blackjack` in the reference JSON for measured physical controls and bounds. The playing plane is approximately 1.376895 world units above the floor: 48.2736% of the canonical bare player body height. Preserve the plane, rather than raising it to the top of the padded rail. The bridge already applies native scale. See [proportions](/custom-models/) for exact values. ## Functional regions to retain | Region | Native behavior | Modeling constraint | |---|---|---| | Deal | Starts a hand with the configured stake | Keep its button face and front approach exposed | | Stake − / + | Adjust the next stake when allowed | Leave both visible; do not replace with a printed amount | | Hit / Stand | Player hand decisions | Preserve separate, readable button faces | | Double / Split | Conditional hand decisions | Disabled states are meaningful; do not repaint as permanently active | | Surrender | Available only in supported hand states | Retain the supplied control; do not create your own action | | Bet monitor / settings surface | Shows stake and opens supported controls | Keep its surface and surrounding sightline clear | | Dealer hand, player hand, split hands, deck | Card placement, dealing and totals | Reserve space above the felt and between every anchor | Native references include `dealer_slot`, `deck`, `hand_0_slot`, `hand_0_slot_split`, `hand_1_slot_split`, `btn_hit`, `btn_stand`, `btn_double` and `btn_split`. The current physical Deal, stake and Surrender controls are also listed in `controls`, even when they do not have a `referencePart` name. A runtime `screen` mount can exist without a visible named screen mesh; do not delete its space because you cannot see a monitor in an offline GLB viewer. These names explain the trusted model. Naming your uploaded mesh `btn_hit` does not wire it to Hit. ## Buildable artwork Make separate decorative side supports, a rear sign outside the dealer/card area, or trim on the exterior of the pedestal. Build the top and rail around your chosen v2 control/display layout. Keep the labels and full button faces exposed. Keep new trim away from both the button face and the player's ray to that face. Theme the surrounding floor with a walkway leading to the player side. Keep furniture out of the automatic viewing approach. A chair can obstruct that approach even if its rendered legs leave a visible gap: the prop collider is a box. Add another Blackjack entity for another playable station; a mirrored decorative table is only scenery. ## Card and control states to inspect An idle screenshot does not show the full needed space. Preserve the dealer reveal, additional cards after Hit, multiple split-hand lanes, totals and result text. Check the initial two-card hand and a wide card fan. During a hand, action availability follows server state; Double, Split and Surrender are not always available. In a finished hand, controls return to the next-hand state. Review from standing eye height, an oblique angle and a portrait phone. Native cards must remain above the felt and below your decoration without flicker. Do not bake a sample hand, chip amount or dealer result into the artwork. Betworld supplies those visuals and the game logic. ## AI brief ```text Get game_skin_contract for blackjack and download my current world draft. Build an original [theme] replacement body in Blender using the reference socket measurements and the preserved gameplay regions described in this guide. Upload static body/button assets; bind only the listed control/part sockets. Keep native labels, game values and collision. Use supported v2 placements, clips and result-motion channels for presentation changes. Save with game_skin_save and the current revision. Inspect the fitted model and report budgets and reviewed states. Do not upload code or publish via MCP. ``` Follow the [full export and upload workflow](/model-authoring-workflow/). Replacement bodies and named button meshes use [skin contract v2](/game-skin-contract/). Use v2 placements and numeric result-motion channels for layout and animation. ## Reference skin sockets (v1 and v2) Read `game_skin_contract({"game":"blackjack"})` before saving. The current fingerprint is `f2e33f7bb6871174`. The [live catalog](/game-skin-catalog.json) is authoritative if a copied example differs. The replacement body is fitted to station-local world bounds `[-2.9799405, 0, -2.2289955]` through `[2.9799405, 2.1514812, 2.1421068]`. Width, height and depth are `[5.9598811, 2.1514812, 4.3711023]`. These values already include source scale. Entity scale remains `[1,1,1]`. | Accepted binding slot | Fixed native action | Fixed index / seat | Native label | World-space bounds, minimum → maximum | |---|---|---|---|---| | `control.stake_up` | `stake_up` | None | + | `[-1.3397117, 1.5770159, 1.4266842]` → `[-1.0756085, 1.6789612, 1.7115332]` | | `control.quick` | `quick` | None | DEAL | `[1.6829154, 1.5770159, 0.7443842]` → `[2.4576338, 1.6789612, 1.5148185]` | | `control.double` | `double` | None | DOUBLE | `[0.3749485, 1.5770159, 1.4208771]` → `[0.9738668, 1.6789612, 1.9548746]` | | `control.hit` | `hit` | None | HIT | `[-0.9738668, 1.5770159, 1.4208771]` → `[-0.3749485, 1.6789612, 1.9548746]` | | `control.split` | `split` | None | SPLIT | `[1.0217327, 1.5770159, 1.2209995]` → `[1.6758978, 1.6789612, 1.8272897]` | | `control.stand` | `stand` | None | STAND | `[-0.2666263, 1.5770159, 1.5116142]` → `[0.2666263, 1.6789612, 1.9664472]` | | `control.surrender` | `surrender` | None | SURRENDER | `[2.448387, 1.5770159, 0.0489424]` → `[2.8527706, 1.6789612, 0.5784135]` | | `control.stake_down` | `stake_down` | None | − | `[-1.6604352, 1.5770159, 1.3125783]` → `[-1.3822411, 1.6789612, 1.607809]` | Only `slot` and the converted model `asset` hash go in each binding. Action, index and seat columns explain platform behavior; **do not copy them into uploaded JSON**. All listed sockets are optional visual overrides. Omitted sockets retain native meshes. Repeated Settings actions are distinct physical sockets and must use the exact listed ID. The catalog provides exact mesh-local `localBounds` for fitting and the full `matrixSource` for native orientation. Optional static surface: `part.playing_surface`, native reference `top`, world bounds `[-2.5627488, 1.3580739, -1.6562196]` through `[2.5627488, 1.3768946, 1.6562196]`. Its replacement does not move cards, the animation rig or the interaction proxy. Save a skin with `game: "blackjack"`, its current fingerprint, a converted `body` hash and the chosen `bindings`. Apply it only to existing `blackjack:` entities. Declare each binding in the skin manifest. Follow [the exact manifest and fitting rules](/game-skin-contract/) and [the export workflow](/model-authoring-workflow/). ## V2 layout and animation Fetch `game_skin_contract({"game":"blackjack"})`. Use `presentation.targets` to position the body, complete display and each listed physical control. Control labels and clickable proxies follow their target; action/index/seat identity stays the same. Numeric `idle` and `result` clips are supported. Its result-motion channels are `card_deal` and `card_flip`. Use the per-result progress and zero endpoint offsets described in the contract. Reference dimensions above describe the neutral layout before v2 placement. See the [exact fields, transforms and limits](/game-skin-contract/).