# Multiplayer Blackjack model guide [Read as Markdown](/raw/game-model-blackjack_group.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. ## One table, three seats Use `blackjack_group:0` or `blackjack_group:1`, with `asset: "blackjack_group"`, floor elevation Y = 0–64 and scale `[1,1,1]`. The client creates three seat interfaces and their station identities from that table. Do not add the internal shared-seat Blackjack IDs as independent world entities. Do not upload three separate decorative tables and expect them to share a round. The native root is `blackjack_group` in the game library. Its playing plane is approximately 1.374234 world units, or 48.1803% of the canonical body height. Keep the downloaded scale and use the runtime table transform for all seats. ## Protect each seat separately | Region | Requirement | |---|---| | `seat_0_screen` … `seat_2_screen` | Preserve all three native monitor mounts and Bet/Settings interfaces | | Seat Hit / Stand / Double / Split controls | Each seat has its own controls; do not merge their artwork or overlap adjacent button banks | | `player_slot_0` … `player_slot_2` | Keep each main hand lane clear | | `player_slot__split_0` and `_split_1` | Keep each seat's split-hand area clear | | `bet_slot_0` … `bet_slot_2` | Preserve betting/chip reference space | | `dealer_slot`, `deck` | Keep the common dealer and dealing route visible from all seats | | `wagers_screen` | Leave the shared status area readable | The generated `controls` array includes a `seat` value of 0, 1 or 2. This is a measurement of native controls, not a creator setting for assigning a custom prop to a seat. Screen and card mounts are in `runtimeMounts`; some are non-rendered anchors. ## Theme the table without partitioning it Use low exterior side trim, pedestal accents or a separate sign behind the common dealer area. Keep the existing top and all three control banks. Avoid tall separators between seats: another player's view and card lane can cross that divider. An opaque sign that looks good from seat 1 can hide the dealer from seat 0 or 2. Plan three approach corridors around the native table, plus a route behind players. Keep the seat viewing positions free of planters, chairs, posts and rugs with excessive thickness. Do not infer shared-seat positions from an equally spaced semicircle in an image; use the downloaded template. Rotating the table rotates the whole three-seat arrangement. Rotate its decorative props as the same assembly. ## Round states and animation The display distinguishes betting, playing, waiting for a turn and settlement. A seat cannot always act just because another player's controls are active. Preserve the native state cues and labels. Keep all dealer travel and all player card fans unobstructed, including split hands at the outer seats. For visual review, look from all three seat positions, not only from the center. Also view the table while walking past it. Check that each screen remains separate and that the same button cannot appear to belong to two seats. Real state validation belongs to Betworld; creator artwork does not implement a turn timer or deal sequence. ## AI brief ```text Get game_skin_contract for blackjack_group 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. ``` Use [the common workflow](/model-authoring-workflow/) for normalization, upload and publication. The skin pipeline replaces the visible table body and approved seat-action meshes; the shared game logic and live seat panels remain platform-owned. ## Reference skin sockets (v1 and v2) Read `game_skin_contract({"game":"blackjack_group"})` before saving. The current fingerprint is `9530715fe0bb2934`. The [live catalog](/game-skin-catalog.json) is authoritative if a copied example differs. The replacement body is fitted to station-local world bounds `[-3.8582389, 0, -0.9880856]` through `[3.8582389, 3.7170839, 4.228379]`. Width, height and depth are `[7.7164778, 3.7170839, 5.2164646]`. 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.seat_0_double` | `double` | seat 0 | DOUBLE | `[2.503123, 1.5770159, 2.3243863]` → `[2.9180209, 1.6789612, 2.7450909]` | | `control.seat_1_double` | `double` | seat 1 | DOUBLE | `[0.1236027, 1.5770157, 3.4840642]` → `[0.4546482, 1.6789611, 3.7858065]` | | `control.seat_2_double` | `double` | seat 2 | DOUBLE | `[-2.6094675, 1.5770159, 2.6520564]` → `[-2.1875911, 1.6789612, 3.0704851]` | | `control.seat_0_hit` | `hit` | seat 0 | HIT | `[1.7935623, 1.5770159, 2.9414472]` → `[2.206757, 1.6789612, 3.3433516]` | | `control.seat_1_hit` | `hit` | seat 1 | HIT | `[-1.0380837, 1.5770159, 3.392938]` → `[-0.675857, 1.6789612, 3.7304338]` | | `control.seat_2_hit` | `hit` | seat 2 | HIT | `[-3.1171901, 1.5770159, 1.9743272]` → `[-2.732924, 1.6789612, 2.3747825]` | | `control.seat_0_split` | `split` | seat 0 | SPLIT | `[2.732924, 1.5770159, 1.9743272]` → `[3.1171901, 1.6789612, 2.3747825]` | | `control.seat_1_split` | `split` | seat 1 | SPLIT | `[0.675857, 1.5770159, 3.392938]` → `[1.0380837, 1.6789612, 3.7304338]` | | `control.seat_2_split` | `split` | seat 2 | SPLIT | `[-2.206757, 1.5770159, 2.9414472]` → `[-1.7935623, 1.6789612, 3.3433516]` | | `control.seat_0_stand` | `stand` | seat 0 | STAND | `[2.1875911, 1.5770159, 2.6520564]` → `[2.6094675, 1.6789612, 3.0704851]` | | `control.seat_1_stand` | `stand` | seat 1 | STAND | `[-0.4546482, 1.5770157, 3.4840642]` → `[-0.1236027, 1.6789611, 3.7858065]` | | `control.seat_2_stand` | `stand` | seat 2 | STAND | `[-2.9180209, 1.5770159, 2.3243863]` → `[-2.503123, 1.6789612, 2.7450909]` | 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 `[-3.3180856, 1.3554138, -0.470517]` through `[3.3180856, 1.3742345, 3.670032]`. Its replacement does not move cards, the animation rig or the interaction proxy. Save a skin with `game: "blackjack_group"`, its current fingerprint, a converted `body` hash and the chosen `bindings`. Apply it only to existing `blackjack_group:` 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_group"})`. 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/).