AtlyssCasino
A fully playable casino map and plugin for ATLYSS. Features 32 slot machines, 8 blackjack tables, and 4 roulette tables — all multiplayer synced and using in-game Crown currency.
By AzraeL0534
| Date uploaded | 2 weeks ago |
| Version | 1.0.2 |
| Download link | AzraeL0534-AtlyssCasino-1.0.2.zip |
| Downloads | 570 |
| Dependency string | AzraeL0534-AtlyssCasino-1.0.2 |
This mod requires the following mods to function
Nessie-EasySettings
A mod API for easily adding options to the settings menu.
Preferred version: 1.3.0FireNoobsta-MapLoader
Loads scene asset bundles and creates portals in Sanctum that lead to them.
Preferred version: 1.1.7BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2305README
AtlyssCasino
A fully playable casino accessible via a portal in Sanctum (Crescent Grove). Walk through the portal, try your luck, and spend your hard-earned Crowns across three games — all fully multiplayer synced.
IMPORTANT — This mod contains a DLL file
AtlyssCasino is both a map and a plugin at the same time. The download contains:
atlyscasino.mapbundle— the casino map scene loaded by MapLoaderAtlyssCasino.dll— a BepInEx plugin that runs all gameplay logic (slot machines, blackjack, roulette, entry fee, exit trigger, multiplayer sync)
Both files are required. The map does nothing without the DLL, and the DLL does nothing without the map. Install both into your BepInEx/plugins folder as you would any other mod.
Games
Slot Machines
32 machines, one player each. Pull the lever and match symbols for payouts up to 100x your bet.
| Result | Payout |
|---|---|
| 3x Diamond | 100x - JACKPOT |
| 3x Star / 3x Seven | 2x |
| 3x Cherry / Lemon / Orange | 1x |
| 2x Diamond | 2x |
| 2x Star / 2x Seven | 0.5x |
| 2x Cherry / Lemon / Orange | 0.25x |
| No match | Lose |
Commands: /slotbet <amount> then press F at any machine to spin.
Blackjack
8 tables, up to 5 players each. Standard blackjack rules — dealer stands on all 17s. Natural blackjack pays 3:2.
| Command | Description |
|---|---|
/blackjackbet <amount> |
Set your bet |
/ready |
Toggle ready |
/start |
Start the round (table host only) |
/hit |
Take a card |
/stand |
Keep your hand |
/leave |
Leave your seat |
Roulette
4 tables, up to 8 players each. European single-zero roulette. Place multiple bet types per spin.
| Bet Type | Payout |
|---|---|
| Straight Up (single number 0-36) | 35:1 |
| Red / Black | 1:1 |
| Even / Odd | 1:1 |
| Low (1-18) / High (19-36) | 1:1 |
| Dozen (1st / 2nd / 3rd) | 2:1 |
| Column (1st / 2nd / 3rd) | 2:1 |
| Command | Description |
|---|---|
/tbet <amount> |
Set your stake per bet |
/rbet <type> [number] |
Place a bet |
/rclearbets |
Clear and refund all your bets |
/rstandby |
Toggle ready |
/rspin |
Spin the wheel (table host only) |
/rleave |
Leave the table |
Bet types: number 0-36, red, black, even, odd, low, high, dozen 1-3, column 1-3
Shorthand: /rbet 17 works the same as /rbet number 17
Entry Fee
The casino charges a 100 Crown entry fee on your first entry each session. If you cannot afford it, you will be sent back to Sanctum with a message from Skrit.
Allowed Bet Amounts
10, 50, 100, 500 Crowns
Multiplayer
All three games are fully multiplayer synced. All players in the lobby must have the mod installed.
- Slot machine spins are visible to all players in the casino
- Blackjack is table-host authoritative — the first player to sit becomes the table host and can
/startrounds - Roulette wheel results are determined by the lobby host and synced to all players
General Help
Use /casinohelp in-game for a full command reference.
Known Issues
- Late joiners who enter the casino mid-round will not see cards already on the blackjack table
- Bar prop assets (beer bottles, cocktail glasses) have missing script warnings in the Unity console — these are cosmetic only and do not affect gameplay
Made by AzraeL0534 Special Thanks to FireNoobsta for MapLoader mod and Soggy_Pancake for CodeYapper mod
CHANGELOG
Changelog
1.6.1
- Cleaned up casino command handling so slash commands are caught a little earlier and parsed more safely.
//messages are left alone instead of being treated like casino commands.- Updated the plugin/source version metadata to match the package version.
- Added a short README note about my coding experience, the project, and how AI assistance has been used.
- No casino gameplay or balance changes in this update.
1.6.0 (formerly 1.0.9)
Version number note
- I had been numbering releases as
1.0.xwhile learning how version numbers should work. - This update was first prepared as
1.0.9, but the correct SemVer-style number is1.6.0because it added compatible new performance options. - Older changelog entries now keep their old
1.0.xlabels in parentheses so people can still match them to the original Thunderstore releases. - Already-uploaded Thunderstore versions are not changed; this just fixes the numbering from here on.
Client performance options
- Added a Client Performance settings section for local-only visual optimization.
- Added Hide Decor Props, which can unload optional casino decorations such as bottles, bar shelves, plants, neon signs, neon lighting, and spotlights while keeping gameplay objects intact.
- The bar structure, casino tables, slot machines, triggers, portal, and point lights are preserved when decor unloading is enabled.
- Added Idle Slot Screens Off, which disables idle slot-machine screen visuals on casino entry and re-enables them while a local or remote spin is playing.
- Performance options are client-local preferences and do not change casino rules or host-owned gameplay settings.
Cleanup
- Tightened decor filtering so remaining plant hooks and potted plant decorations are included in the optional hide pass.
- Verified casino setup, exit cleanup, and deferred cleanup continue to complete without leaked casino objects.
1.5.0 (formerly 1.0.8)
Easy Settings integration
- Added Easy Settings API as a required dependency.
- Added an Atlyss Casino settings tab for main-menu casino configuration.
- Settings are backed by the normal BepInEx config file, so dedicated/headless servers can configure the casino without opening a client UI.
- The settings UI locks once a player/session is loaded, preventing casino rules from being changed mid-lobby.
- Gameplay settings are host/server-owned. Clients cannot override the lobby host's casino rules from their own settings menu.
- Host-owned gameplay values are synced to clients when the casino loads, so client-side trigger paths use the lobby host's configured rules.
Configurable casino rules
- Entry fee is now configurable. The default remains 100 Crowns.
- Walk-away penalty is now configurable. The default remains 10 Crowns.
- Blackjack turn timeout is now configurable. The default remains 60 seconds.
- Roulette AFK timeout is now configurable. The default remains 60 seconds.
- Floating blackjack/roulette table info text can now be toggled on or off.
- Routine headless/dedicated-server casino logging can now be suppressed through config.
Documentation
- Updated README dependency notes for Easy Settings API.
- Added README configuration guidance for lobby hosts and dedicated servers.
- Added Easy Settings API credit to Special Thanks.
1.4.0 (formerly 1.0.7)
Entry fee reliability
- Improved entry-fee consistency by verifying that the 100 Crown deduction actually applies before marking a player as paid.
- If the entry-fee deduction does not apply correctly, the mod retries once, restores the player's original balance if needed, and does not grant paid-entry status.
- Re-entering during the same loaded casino session still recognizes already-paid players, while a fresh casino unload/reload requires paying again.
Blackjack and table interaction fixes
- Added host-authoritative blackjack turn sync with a
TurnChangedpacket. All clients now receive current-turn changes for table prompts and green active-seat stool indicators. - Turn changes short-circuit when the seat did not actually change, preventing duplicate broadcasts and redundant AFK timer resets.
- Blackjack seat, ready, and turn prompts are now gated to the local player being seated at the same table, preventing unrelated table HUD leakage.
- Blackjack table setup now deep-scans the whole table hierarchy for
SeatTrigger,SeatAnchor,DealerAnchor, andStoolobjects. This supports Unity prefab layouts whereSeatTriggeris nested under a stool instead of being a direct table child. SeatTriggerindex detection can now infer the seat from a parentStoolobject, so bothStool (1)/SeatTrigger (1)andStool (1)/SeatTriggerlayouts work.
Floating table info
- Added runtime floating table info displays for blackjack and roulette using the Unity-authored
Casino_TableInfoAnchor/Casino_TableInfoTexthierarchy. - Blackjack displays show table host, round state, compact dealer value, current turn or ready count, and player count.
- Roulette displays show table host, round state, landed number/color after a spin, ready count, and player count.
- Player names are cleaned up from ATLYSS object names such as
[connID: 0]_player(name/Azrael)into readable names such asAzrael. - Empty/inactive tables now hide their floating text entirely to reduce visual clutter.
- Floating text material handling now attempts to depth-test text so it does not draw through walls, tables, and other objects.
- Position, rotation, and scale are now respected from Unity. The runtime no longer billboards or overrides the authored transform, so table text can be tuned per prefab.
- Added an optional Unity editor-only preview script for checking table-info placement and blackjack card footprints in Scene view without launching the game.
Slot machine locking
- Added network-aware per-machine slot locks. When any player pulls a machine, that machine locks locally and on remote clients for the spin duration.
SlotBetConfirmrejects extra pulls on an in-use machine with a countdown HUD prompt.- The spinner locks locally before broadcasting the spin result, closing the timing window where the same player could trigger multiple machines during one spin.
F-key interaction gating
- Reworked
Plugin.IsTypingInUI()so casino F-key interactions are blocked only while the player is actually typing. - The check now prioritizes ATLYSS chat focus state and only falls back to Unity/TMP input fields when those fields are actually focused.
- Fixed F-key interactions appearing dead until left-clicking the world after chat had closed.
- Applied the typing gate across casino F-key paths so pressing
Fin chat does not fire casino interactions.
HUD, headless logging, and cleanup
Plugin.ShowHUDOnce()suppresses casino HUD prompts when the local player is not actually in the casino, preventing host-side Sanctum HUD leakage while the casino scene remains loaded.- Added a
CasinoLogwrapper around BepInEx logging. RoutineInfo,Debug, andMessageoutput is suppressed on headless/dedicated server while warnings, errors, and fatal logs remain visible. - Headless detection now uses the shared
HostCasinoVisibilityWatcherpath, including batch mode,-nographics, and-serverlaunch arguments. - Preserved the 1.0.6 ghost-casino visibility work so casino visuals/colliders hide when the local player is outside the casino while host-authoritative MonoBehaviour updates keep running.
- Preserved the player visual skip stack and tracking-aware hide/restore sets so remote player bodies and blackjack card faces are not corrupted by casino hide/restore cycles.
- Removed
_entity_recallPortalfrom leak cleanup so Map Loader's legitimate Sanctum recall portal is no longer destroyed after casino exit. - Cleanup logs now name each destroyed leaked object and source scene.
Debug and build hygiene
- Disabled
BlackjackDebugCommands.csby default behind theATLYSS_CASINO_DEBUG_COMMANDScompile symbol. The old debug card/deck/table tools are preserved for later testing but are not part of regular builds. - Current 1.0.7 work keeps the normal casino build path focused on runtime features rather than old testing commands.
Command shortcuts
- Added extra blackjack shortcuts while keeping every existing command and alias:
/brfor ready,/bdfor deal/start,/bhfor hit,/bstfor stand, and/blfor leave. - Added extra roulette shortcuts while keeping every existing command and alias:
/rbfor placing bets,/rrfor ready/standby, and/rcfor clearing bets. - Added compact roulette outside-bet shorthand:
/rb d1,/rb d2,/rb d3for dozens and/rb c1,/rb c2,/rb c3for columns. - Left the existing
/rsalias mapped to roulette ready/standby for backwards compatibility.
1.3.0 (formerly 1.0.6)
Ghost-casino visibility and player visuals
- Added
HostCasinoVisibilityWatcherto handle ATLYSS's additive scene behavior where the casino scene can remain loaded after the local player has returned to Sanctum. - Casino visuals and colliders are hidden per component instead of disabling root objects, so host-authoritative table logic, ghost-seat polling, and AFK checks continue running while visuals are hidden.
Plugin.IsLocalPlayerInCasino()became the shared gate for casino input and HUD behavior, preventing triggers from firing while the local player is outside the casino.- Visibility detection was moved away from active-scene and bounds checks and onto reflected
Player.Network_playerMapInstancecomparison against the casino MapInstance, which works with ATLYSS additive loading and overlapping world origins. - Fixed remote-player body corruption caused by the hide pass disabling renderers on Mirror-reparented remote Player objects. The final skip stack protects MapInstance hierarchy objects, scene-root cameras/lights, Player ancestors, and all
SkinnedMeshRendererbody meshes. - Hide/restore now tracks exactly which renderers, lights, cameras, and colliders it disabled. This prevents blackjack card fronts and backs from both being re-enabled after a hide cycle.
Multiplayer and currency stability
- Codified the host-authoritative blackjack pattern: hosts execute state changes locally and broadcast; non-hosts send request packets to the lobby host.
- Fixed remote-player currency writes by using
PlayerInventory.Network_heldCurrencydirectly from the host for blackjack bets, payouts, and other host-authoritative currency changes. - Added blackjack ghost-seat detection on the lobby host. Destroyed-but-still-referenced Player objects are now released and broadcast to all clients so seats do not stay blocked after disconnects.
- Preserved slot-machine per-player behavior where each spinner rolls locally and broadcasts the final result while echo guards prevent duplicate local replay.
Exit, HUD, and scene cleanup
- Moved casino exit F-key handling into the persistent visibility watcher so clients can reliably leave the casino even when the portal GameObject hook order differs from the host.
- Added a shared HUD gate so casino prompts do not leak to the host while they are in Sanctum and the casino is still loaded in the background.
- Removed
_entity_recallPortalfrom leak cleanup. That object is a legitimate Map Loader recall portal, and destroying it was the real cause behind the earlier 1.0.3 "harmless"MapInstance.Handle_VisualSettingsNullRefs. - Scene cleanup now logs each destroyed leaked object and its source scene, making future cleanup mistakes much easier to diagnose.
Dedicated server and log cleanup
- Added headless/server-mode detection through
HostCasinoVisibilityWatcher. - Skips visual hide/show management on dedicated servers where there is no local camera view to manage.
- Demoted noisy setup retry, trigger-bounds, and per-seat/per-machine diagnostics from
InfotoDebug. - Consolidated missing-BoxCollider warnings so they log once globally instead of once per object.
Build notes
- Cleaned up nullable warnings in
HCVW.cs. - Known harmless gap: casino audio is not silenced during hide/restore because adding full AudioSource handling would require an additional Unity audio module reference.
1.2.1 (formerly 1.0.5)
Lighting
- Fixed casino lights so they properly render and stay on.
- Resolved lighting issues where some lights appeared enabled but flickered based on camera/player position, while other lights failed to work or stayed off entirely.
1.2.0 (formerly 1.0.4)
Slots and balance
- Rebalanced slot payouts. The 3x Diamond jackpot became
500xthe bet, with other payout rows increased to match the new table. - Reduced jackpot frequency by adding a 50% demotion chance when a natural 3x Diamond result occurs. The jackpot moved from roughly 1 in 216 spins to roughly 1 in 432, while other payout odds remain unchanged.
- The jackpot demotion happens before reel animation, so players only see the final actual result.
Signs and readability
- Regenerated the slots sign with the new payout table.
- Increased blackjack and roulette sign size/resolution so text is readable from normal standing distance.
- Corrected roulette sign commands, including
/tbet,/rstandby, and/rleave.
Command shortcuts and docs
- Added short aliases for the main casino commands while keeping the original full command names.
- Slots:
/slotbet->/sbet,/sb. - Blackjack:
/blackjackbet->/bjbet,/bjb,/bb;/ready->/rdy,/rd;/start->/deal,/begin;/hit->/h;/stand->/stay,/st;/leave->/lv,/l. - Roulette:
/tbet->/tb;/rclearbets->/rclear,/rcb,/rcl;/rstandby->/rready,/rsb,/rs;/rspin->/rsp;/rleave->/rl,/rlv. - Help:
/casinohelp->/chelp,/ch. - Updated
/casinohelp, README, and changelog content to better reflect the current command set and previous release changes.
1.1.0 (formerly 1.0.3)
Multiplayer & sync
- Fixed Sanctum-leak bug where blackjack cards spawned on the host would appear floating in Sanctum if the host was physically there while clients were playing in the casino. Added
Plugin.ScopeToCasinoScenehelper that explicitly binds runtime-instantiated GameObjects to the casino scene at spawn time, so they're properly destroyed when the casino unloads instead of orphaning into whatever scene was active on the host's machine - Roulette ghost-detection now properly broadcasts
RPlayerLeftto all clients when an abruptly-disconnected player is evicted by the host's 1Hz polling. Previously the host would clear the ghost locally but never tell other clients, leaving phantom seats lingering on every other machine until they re-entered the casino - Aggressive multi-pass scene cleanup in
BlackjackSceneWatcher— runs immediately on casino scene unload, +1 frame later, and +1 second later. Catches casino objects (cards, slot machines, tables) that survive the unload event due to Mirror lifecycle quirks. Includes scanning the DontDestroyOnLoad scene where Mirror sometimes deposits orphaned NetworkIdentity'd objects - Roulette release on scene unload now properly cleans up local table state (refunds bets, clears ready, broadcasts to other clients) — was missing entirely before this release
AFK system
- Per-turn AFK timer for blackjack — when it's a player's turn to /hit or /stand, they have 60 seconds before the host auto-stands them. HUD warnings appear at 10s and 3s remaining
- Per-player AFK timer for roulette — joining a table without placing bets and going /rstandby for 60 seconds gets you auto-kicked. Activity (placing a bet, clearing bets, toggling ready) resets the timer. Doesn't count down while the wheel is spinning
- Both AFK systems are host-authoritative — only the lobby host runs the timer, broadcasts the auto-action via existing packet flows
Walk-away enforcement (strict zone)
- Physical walk-away from a seat trigger zone now releases the seat immediately, no grace period, no countdown — same model for blackjack and roulette
- Walk-away from a roulette table forfeits all placed bets without refund (in contrast to
/rleavewhich refunds normally) - Walk-away charges a 10-Crown penalty with red HUD warning teaching the player to use
/leaveor/rleavenext time. If the player has fewer than 10 Crowns, drains to zero (never goes negative). Penalty applies even if no bet was at stake — strict by design - New
RouletteTable.LeaveNoRefund(player)method andForfeitflag onRLeaveTableRequestpacket so the no-refund behavior works correctly for both lobby host and client walk-away paths - The walk-away path bypasses the "wheel is spinning" rejection so players can never get stuck at a table
Visual / layout improvements
- Casino interior fully remodeled and redesigned. The whole layout has been reworked — game zones are more distinct, sightlines between the slots / blackjack / roulette areas are cleaner, and the floor plan generally flows better than the original boxy arrangement
- Cards now stack tightly with only the corner of each previous card visible (poker fan style) instead of spreading widely. Prevents card overflow into adjacent seats when multiple players are at the same table
- Each subsequent card lifts forward along the seat anchor's up axis to prevent z-fighting and visual clipping with cards behind it (bumped from 0.005 → 0.015 per card)
- Card sizes now scale with the parent table's world scale via a non-linear curve. Small tables get appropriately smaller cards, large tables get appropriately larger cards — but extremes are pulled toward the middle so neither feels comically out of proportion. Tunable via
PLAYER_CARD_SCALE,DEALER_CARD_SCALE, andTABLE_SCALE_EXPONENTconstants inBlackjackTable.cs - New
STACK_OFFSET_FRACTIONconstant (0.20) controls how much each subsequent card peeks out from the previous one — easy to tweak from 0.10 (tight) to 1.00 (full spread, old behavior)
Trigger zones
- Slot machine triggers (
SlotBet_Confirm) and blackjack seat triggers (SeatTrigger) now use aBoxColliderfor detection if one is present on the GameObject, falling back to the previous fixed-radius behavior otherwise. Trigger zones automatically scale with their parent table — a 0.33x slot machine has a tiny detection zone, a 3x has a huge one, no code changes needed - Matches the existing pattern from
RouletteTrigger,EntryFee, andExitfor consistency
Tone / colors
- HUD message colors split into two semantic categories: peach (#FFDC96) for informational messages and prompts, vivid red (#FF3119) for errors, rejections, and "you can't do that" feedback. Replaces the previous uniform red-by-default tone
- New
Plugin.ShowHUDInfo()andPlugin.ShowHUDError()helpers wrap messages in TextMeshPro rich-text color tags. All ~60 call sites across the casino code routed through these helpers
Removed
- The
Plugin.ShowHUD()lingering coroutine that re-fired prompts every 2.8 seconds for 8 seconds total. Manifested as visible text spam rather than the intended "longer-lasting prompt" effect.ShowHUD()andShowHUDErrorLong()are kept as compatibility shims that now just delegate to single-shotShowHUDInfo/ShowHUDError
Known harmless warnings
- Four
MapInstance.Handle_VisualSettingsNullReferenceExceptions appear in the BepInEx log on entering the casino. These come from ATLYSS's ownMapInstancescript reading visual references that occasionally don't resolve in time. They don't affect gameplay. Will investigate further if they ever start firing more frequently than 4 per session - The usual wall of "missing script" warnings for Beer Bottle / Cocktail Glass / Stairs / Ladder / Bottle / Stand / Pillar are from third-party asset packs (Fries and Seagull Bar) and are cosmetic only
Known Issues
- Lights/Lighting still flickers and some still dont work, unkown reasons why and how to fix
- Cards at the Blackjack table are not scaled correctly according to the table scale
1.0.2
- Fixed multiplayer host detection —
BJNetcode.AmHost()now usesSteamMatchmaking.GetLobbyOwnerdirectly (matching CodeTalker's ownSenderIsLobbyOwnercheck) instead of relying solely onPlayer.Network_isHostPlayerreflection - Removed dangerous fallback that returned
truewhen host detection failed, which could cause clients to incorrectly behave as host and broadcast unauthoritative packets that get silently rejected - Fallback now defaults to
false(treat as client and send request packets to host) — safer behavior that prevents desync when reflection fails - Added detailed reflection diagnostics on startup so the BepInEx log shows exactly which Steam matchmaking paths resolved on each player's machine
- Affects all multiplayer features: blackjack seat claiming, ready states, hit/stand, roulette joining, betting, spinning — slots were unaffected as they don't gate on host authority
- Fixed cursor staying visible after sending casino chat commands (
/slotbet,/blackjackbet,/rbet, etc.) — players no longer have to press Escape to dismiss the chat input - The Harmony patch on
ChatBehaviour.Send_ChatMessagewas blocking the original method (which normally closes chat and re-locks the cursor), soSetChatFocusFalse()now tries ATLYSS's own close methods via reflection, with a fallback that manually clears_focusedInChatand forcesCursor.lockState = Locked+Cursor.visible = false - Fixed clients seeing the casino map but unable to interact with anything —
CasinoPatchsetup logic that hooks slot machines, blackjack tables, and roulette tables previously ran exactly once, two frames after scene load. That worked for the host (whose scene is populated immediately) but failed for clients, whose scene contents arrive over the network slightly later, leaving the client with zero hooked objects despite the map appearing visually - Setup logic now retries up to 15 times, once per second, stopping as soon as it successfully finds the casino objects — hosts continue to succeed on attempt 1; clients typically succeed on attempt 2
- Each retry attempt logs what was found vs. what was expected, making future timing or scene replication issues much easier to diagnose from BepInEx logs
- Fixed
_entity_portal,_MapInstance, and_npc_SkritGameObjects being saved as inactive prefabs with broken sceneId state, which prevented Mirror from properly replicating networked scene contents to clients — these are now active scene instances with valid sceneIds - Added an editor tool (
Tools → Casino → Inspect Scene NetworkIdentities) to detect and report missing or duplicate sceneIds before building the asset bundle, including options to force-assign missing IDs or wipe and reassign all of them as a last resort
1.0.1
- Fixed casino scene hierarchy — all geometry now correctly placed under _Environment
- Replaced RecallPortal with a proper Portal component for return to Sanctum
- Assigned correct MapInstance visual references (Skybox Camera, Directional Light)
- Installed Mirror NetID fix — portal and MapInstance now have valid network scene IDs in multiplayer
- Removed duplicate Camera and Directional Light from scene root
1.0.0
- Initial release
- 32 slot machines (1 player each)
- 8 blackjack tables (up to 5 players each)
- 4 roulette tables (up to 8 players each)
- All three games fully multiplayer synced via CodeTalker
- F-key exit trigger returns player to Sanctum
- Casino signs for each game area