September 15, 2022, 9:20 pm

The long-awaited 13.2 Update is here! This patch addresses some of the most requested features and bug fixes including Discord game join support, Valve Index support for VR, custom fonts, and much more!

Highlights: Discord Game Join- Communicating and organizing TTS games just got a whole lot easier! You can now invite people to join your game or request to join other users’ games from within discord. VR Valve Index Support- We have added VR support for the Valve Index. Enjoy a more seamless VR experience on the Valve Index with TTS including the addition of default bindings for the Index controllers. Custom Fonts- We have added the ability to import assetbundles for XML UI to allow you to import custom fonts. We have many more exciting new features, upgrades, and fixes that you can read all about below. And as always, if you have any feedback or bug reports, make sure to submit them at !


  • Added a typing indicator that shows up next to the player name and chat window. (Note: it will only show typing that you will be able to see, not if typing to another team)
  • The deck deal-to-color wheel now handles a number typed on top of it, dealing that many cards to the relevant player(s).
  • Right-clicking on slider bar will open a dialog allowing for text entry of value.
  • Added confirmation prompt to table flip.
  • Randomizing while hovering over the hand with nothing selected will randomize the entire hand.
  • Visualize Looking For Player on Host - Can be easily disabled from there as well
  • Added visual indication for when an object is dropped into a container. Control with ui_container_enter_indicator console command / misc setting.
  • Added move left & move right options to rotation value UI.
  • Added search to PDF.
  • Changed tooltip text on rewind slider to display time as minutes and seconds.
  • Enabled Metal support for Marmoset shaders fixing Mac rendering issues.
  • Group action will now put the objects into a bag as long as only one bag is present in the selection and no other combinations of decks/stacks were made. You can use the group_into_bag_first command / misc setting to override the last condition, putting everything into the bag if it's the only one (ahead of combining into decks/stacks).
  • Added logging of pertinent URL when a game asset fails to load.
  • Added showing your hand to another player (right-click a card in your hand and select Show Hand-><color>.
  • Updated Unity version to 2019.4.40 for better stability and bug fixes.

Discord Game Join

  • Can now invite people to join your game from within Discord.
  • Can now ask to join a player's game from Discord and they will be given an in-game popup to accept or decline this request.
  • Joining a game from within discord will launch the game and join the server with one button press.
  • Discord will automatically supply the password for the server if it exists making joining even more seamless.



  • Added feature to search: when searching decks you can specify a number of cards N, and only the top N cards will appear in the search window. This allows for "Peek"-like actions.
  • When a player is searching a deck and changes the order of the deck by moving a card, the movement is logged in the Game chat. You can disable seeing this via the console command / misc setting container_logging.


  • Added default bindings for Index controllers.

Fog of War

  • Add Outside walls to FoW
  • Increase revealer height range (negative values are now allowed as well)
  • Fixed Custom Models create before the FoW not loading in correctly when inside FoW.
  • Fixed FoW can be seen through with the magnify tool by any player
  • Fixed objects are not hidden by Fog of War when different player is revealing them (
  • Fixed revealer outlines not hiding when switching colors.


  • Added support for custom fonts, sprites and audio clips in XML UI using AssetBundles.
  • Added accessible Lua enum available as UI.AssetType for XML UI. (UI.AssetType.Image & UI.AssetType.AssetBundle)
  • Upgraded to XmlLayout 1.97
  • Fixed XML GUI "colors" field does not properly support Unity colors


System Console

  • Added quit console command.
  • Added spectator_show_game_ui command to allow hiding of UI elements in spectator screen.
  • Added command and misc setting deck_can_spread_facedown; when enabled and you perform a spread action on a face-down deck, the cards will remain face-down instead of being flipped.
  • Added help -c option for console command, which outputs all help text to the clipboard.
  • Added framerate_custom_cap command.
  • Added autosave_games_window_count command / misc setting to control the number of slots on top Games window which may display an autosave. Defaults to 1.


  • Added onPlayerChatTyping(player, typing)
  • object.Container.Search(player, cards = -1) - activate search window for player, optionally limited to top N cards.
  • Callback generated by object.addContextMenu changed: f(player_color) is now f(player_color, object_position, object).
  • Added object parameter to onPlayerPing event
  • Added calls for built-in dialog windows:
    • player.showInfoDialog(info)
      Displays info string to player.
    • player.showConfirmDialog(info, callback)
      Displays info string to player. Callback is called as f(player_color) if user hits OK.
    • player.showInputDialog(description, default_text, callback)
      Simple text input. Callback is called as f(text, player_color) if user hits OK.
    • player.showMemoDialog(description, default_text, callback)
      Large text input. Callback is called as f(text, player_color) if user hits OK.
    • player.showOptionsDialog(description, {options}, default_value, callback)
      Options Dropdown. Callback is called as f(option_text, option_index, player_color) if user hits OK.
    • player.showColorDialog({default_color}, callback)
      Color picker. Callback is called as f(color, player_color) if user hits Apply.
  • Added LuaPlayer.copy(objects) and LuaPlayer.paste(position).
  • Added zone.getObjects(true), which includes all objects in zone regardless of tags.
  • Added language support to addContextMenu.
  • If an object has its alt_view_angle set it will use that angle when viewed in container search.
  • Added gizmo_selectable for Objects
  • Fixed search window ignoring tryObjectEnter/onObjectEnter events.
  • Validate (numeric) enums coming from Lua are not out of range.
  • Fixed Lua lighting, turns, and hands not networking syncing when changing settings.
  • Fixed Layout zone not sorting by Memo.
  • Fixed getObjectsWithTag returning incorrect values.
  • Fixed Color.fromhex not working when alpha was omitted.
  • Fixed lua object.hasAnyTag() not working when a deck inherited its tags from its cards.
  • Fixed Color.fromhex not working when alpha was omitted.
  • Fixed lua object.hasAnyTag() not working when a deck inherited its tags from its cards.

Lua Lighting

  • Added member variables lut_index, lut_contribution, lut_url.
  • No longer need to call apply() to trigger an update any change will automatically apply.

Lua Materials

  • Added support for editing materials vars from Lua.
  • Added new class called material.
  • Added getMaterials() and getMaterialsInChildren() functions to GameObject. Materials function very similarly to Components:
  • GameObject game_object
  • String shader
  • set()
  • get()
  • getVars()


  • Fixed issue with cards getting stuck in player hands and other issues with decals and zones.
  • Fixed issues with player color names being static on the hexagon and octagon table.
  • Fixed objects flying around when rewinding by freezing them one extra frame.
  • Fixed cards with states break hand zones when you shuffle them.
  • Fixed issue with bbcodes being stripped out of UI text when translated with language codes.
  • Fixed action triggering at the point key is assigned to it.
  • Fixed spectator_activate_with_resolution not working correctly when used in autoexec.
  • Fixed rotation values not displaying sum for some totals.
  • Fixed Layout Zone has the Reversed option enabled then decks being spread into it will be reversed.
  • Fixed end_turn command not working in hotseat mode.
  • Fixed objects becoming visible when grouping.
  • Fixed XML UI tags not allowing for &lt; &gt; &amp; &nbsp;.
  • Fixed mouse centering when moving with keyboard while UI disabled (via F11).
  • Fixed scripting zones triggering leave events when returning to main menu.
  • Fixed trying to add a tag to an object which already exists on other objects not working.
  • Fixed incorrect packet error when in hotseat mode.
  • Fixed objectEnterContainer indicator cleanup.
  • Fixed dropdown UI sometimes appearing beneath its parent window.
  • Fixed alt zoom working with XML UI.
  • Fixed hidden decks with custom backs being revealed when dealt.
  • Fixed Gizmo tool being unable to click on objects with the Drag Selectable toggle turned off (note that while selecting you can override this toggle by holding shift).
  • Fixed Layout zone not sorting by Memo.
  • Fixed game taking a long time to return to main menu when lots of objects present on table.
September 26, 2022, 9:00 pm

Update v13.1 Native File Browser, Cloud Manager & Rewind Time Improvements, Optimizations, and much more!

This patch we wanted to focus on bug fixing, optimizations, and working through the feedback the community has provided for us on our new feedback website:

We have found the feedback website to be instrumental in helping us work on the most important features and the fixes you guys would like to see, and we will continue to use this for our future updates.

Since going live we have implemented 96 suggestions left by the community on nolt!

If you have any feedback of suggestions of your own you can head on over to

Native File Browser

  • Added a native file browser as an alternative to the built-in one. (your OS file browser)
  • The native file browser supports selecting multiple files where applicable.
  • VR still uses the built-in file browser to ensure interaction still works.
  • Added console command file_browser_native and also added it to the misc settings menu.

Cloud Manager Improvements

  • Cloud Management should overall work much better and be less frustrating to use.
  • Cloud manager can now upload multiple files at once using the new native file browser.
  • Fixed cloud manager reseting to the root path every time you upload or delete something.
  • Fixed cloud manager folders not showing up until you open the cloud manager one more time.

Rewind Time Improvements

  • Rewind and fast-forward has been revamped with better controls and more information.
  • Can now rewind time in multiple steps with the new time slider.
  • Can now see the number of time steps in each direction.
  • Rewind states now are only being created if something has changed since the last rewind state.
  • Rewind now works for promoted players instead of just the host.


  • Updated Unity to 2019.4.23 for bug and stability improvements.
  • Added support for multiple auto save files. The default is now 3 and can be changed in the console and misc settings.
  • Broadcast message now appear at the top to better match up with the sliding out animation and fades out smoother.
  • Renamed save file "Expand" to "Search" to better reflect what it does.
  • Added Custom Music to the save file "Search" to make it easier to bring over music from one save to another.
  • Added Music to Workshop asset tags.
  • Added "chat_input_clear_on_dismiss" console property. May be set to OFF to allow clicking away from the chat input field without losing partially written chat messages.
  • Rotation values now store their data as strings instead of objects in the save file.
  • Added EpochTime to save files.
  • Changed misc option / console command "keyboard_single_digit_draw" to "keyboard_single_digit_by_default" - it is now used whenever you type on any component (e.g. when changing component states). If enabled you can still type higher numbers by starting with a 0.
  • Added end_turn command.
  • Grouping individual cards will now give the formed deck any tags which all the cards share.


  • Greatly reduced the lock up when spawning lots of objects, such as when loading a save file.
  • Reduced ram usage by about ~100 MB thanks to shader stripping.
  • Save/Workshop file "Search" is now much faster with less chance of a hard lock up.
  • Optimized network serialization to generate less garbage and cause less stutters.
  • Optimized under the hood cloning code.
  • Save file info now caches significantly faster (Less waiting when opening the Games menu).
  • Reduced network bandwidth for impact sounds.


  • Added previous turn color player as second param for onPlayerTurn event.

  • Added Object.getZones() that returns all the zones that the object is interacting with.

  • Added onObject(Enter/Leave)Zone that works on all zones instead of just scripting zones.

  • Added support for all zones with getObjects().

  • Added UI.loading bool to see if the UI is still loading on this Object.

  • Added lua object.getJson(bool indented) to disable indenting.

  • Added (Global) tryObjectRotate(object, spin, flip, player_color, old_spin, old_flip). spin & flip values [0, 360] degrees.

  • Added (Object) tryRotate(spin, flip, player_color, old_spin, old_flip).

  • Added (Universal) onObjectRotate(object, spin, flip, player_color, old_spin, old_flip).

  • Added (Object) onRotate(spin, flip, player_color, old_spin, old_flip).

  • Added (Universal) onPlayerPing(player, position).

  • Added (LayoutZone) object.LayoutZone.getOptions(), .setOptions({options table}), .layout()

  • Added (LayoutZone) onGroupSort(table group, bool reversed) and onZoneGroupSort(object zone, table group, bool reversed) lua events: return table in desired sorted order, or false to allow default zone behaviour. If present they take precedence over the selected sort in the zone options.

  • Ensured LuaWebRequest's text no longer raises a null reference exception when no downloadHandler is set.

  • Object.getData() now correctly omits null value keys.

  • Fixed being able to addAttachment with the Table bricking the game.

  • Fixed being unable to lua to index hands greater than 1.

  • Fixed issue with on[Enter/Leave]ScriptingZone was firing multiple times in a row.

  • Fixed Book setHighlight()/clearHighlight() bug.

  • Fixed minor bug whereby RPCLookAt was using the yaw after validating the pitch (instead of validating the yaw).

  • Fixed lua Player.getAvailableColors() can have repeats.

  • Fixed issue with tryObjectEnter/tryObjectEnterContainer only firing for the first object dropped in a bag.

  • Fixed tryObjectEnter/tryObjectEnterContainer not being passed the object entering when the container was a stack.

  • Fixed data/JSON round-tripping i.e. spawnObjectData({data=JSON.decode(JSON.encode(container.getData()))}).

  • Fixed Lua core mishandling of nil table inserts i.e. table.insert(tab, 1, nil).

Lua Player Action APIs

An API that fires when a user performs an action. You may return false to prevent the action. As opposed to onObject* events, actions are fired once per user action, rather than once per object affected.

Added (Universal) onPlayerAction(player, action, targets). targets is a list of Objects and action will be one of:

  • Player.Action.Select
  • Player.Action.PickUp
  • Player.Action.RotateIncrementalLeft (Q)
  • Player.Action.RotateIncrementalRight (E)
  • Player.Action.RotateOver (Alt + F, whilst held)
  • Player.Action.FlipIncrementalLeft (Alt + Q, whilst held)
  • Player.Action.FlipIncrementalRight (Alt + E, whilst held)
  • Player.Action.FlipOver (F)
  • Player.Action.Copy (Ctrl + C / Menu Copy / Menu Clone)
  • Player.Action.Cut (Ctrl + X / Menu Cut)
  • Player.Action.Delete (Delete / Backspace / Menu Delete)
  • Player.Action.Group (G)
  • Player.Action.Paste (Ctrl + V / Menu Paste)
  • Player.Action.Randomize (R / Menu Roll)
  • Player.Action.Under (U)

    • Addresses:

Player.Action is not a table, but you may still do:

  • for name, value in pairs(Player.Action) do
  • log(Player.Action)



Lua Value and Value Flags

  • Value now persisted in ObjectState.
  • Summing of Value now takes into consideration stacks.
  • Objects with differing Value or ValueFlags are no longer stackable.
  • Selected objects will now have their value summed according to their tags.
  • value_flags will continue to work like before, but are now deprecated in favor of object tags.


  • Fixed (on|try)(Object)?Rotate not firing for click+release or short throws of dice & coins.
  • Fixed an issue loading custom assetbundles when they were created and destroyed in very quick succession.
  • Fixed a potential memory leak with custom assets.
  • Fixed voice chat not working with MacOS 10.13 as minimum.
  • Fixed global contextual menu bugging out.
  • Fixed issue with objects not hiding as fast inside hidden zones.
  • Fixed issue with lua onLoad() not triggering when the game has been running for a while.
  • Fixed {verifycache} on url checking Last-Modified header being case sensitive.
  • Fixed Fog Of War not working correctly with multiple collider objects.
  • Fixed GM pointer not hiding in fog of war zones.
  • Fixed Fog of War revealer contextual text being offset.
  • Fixed stacking of objects (stacks) in the presence of tags.
  • Fixed a event memory leak on Tablet.
  • Fixed inversed hiders i.e. Hands.hiding = 2 (Reverse) hiding mode.
  • Fixed destroy all text tools not working.
  • Fixed issue with mahjong tiles rotating strangely.
  • Fixed snap visualizer revealing hidden objects in hands.
  • Fixed issue with Custom AssetBundles hierarchy being indeterminate when using a secondary bundle.
  • Fixed bug with chips stacking with wrong names and wrong objects.
  • Fixed typo in LayoutZone HorizontalSpread value, you might need to set this value again for your save file.
  • Fixed zone click interactions.
  • Fixed objects hiding when they shouldn't.
  • Fixed missing "Pass Turn" option in hotseat mode.
  • Fixed 3D pointer being visible beneath 2D pointer when using picture-in-picture.
  • Fixed highlighting not working in VR.
  • Fixed XML UI buttons not working correctly in Hotseat mode.
  • Fixed user defined hotkeys not working while hovering over UI.
  • Fixed tags not syncing on player connect.
  • Fixed player hands failing to load when loading a save file.
  • Fixed issues with translated URLs: not cleaning up correctly and not working for UI assets.
  • Fixed issue with music persisting through loading different mods.
  • Fixed issue with the table and some objects being white when connecting to host.
  • Fixed reverse Hidden Zones overlapping stopping hiding.
April 8, 2021, 9:23 pm

Hey everyone it's been a while, but we have a huge patch for you guys today!

The headline feature is Tabletop Simulator now supports translations for all 29 languages supported by Steam. The game has been translated with the help of google translate but we also added support for creating your own translations and sharing them on the Workshop. Using google translate is an exciting jumping off point for a more global user friendly experience, however, recognizing google translate’s limitations we are also excited to see what native speakers in the community can come up with for the most authentic multilingual game play experience. Furthermore, the translation support is extended to all of your great mods out there. Now players can participate in the same game with different localized text or assets based on their selected language.

We've also upgraded the game's engine (everything should run smoother), added layout zones (automatically lay out cards easily), and added object tags (easily filter system interactions).

We have a bunch of other great new features, upgrades, and fixes you can read about all below.

Finally we are launching a new method for collecting user feedback and bug reports found at This will allow us to better connect with the community for a more fluid and streamlined feedback loop, including increased visibility into our process. The new system allows you to easily make suggestions and upvote and downvote other community member ideas in a similar style to reddit. Additionally, the community will now be able to see our progress on implementing suggestions, fixes, and new features through the roadmap tool.

Updates, Optimizations, and Cleanup

  • Updated Unity version to 2019.4 LTS.
  • Enable graphics jobs, free performance by multi-threading the rendering (benchmarked up to 25% increase in fps).
  • PhysX version upgrade gives better accuracy and performance in a variety of cases.
  • Video player is now using hardware decoding on the gpu making video textures more performant.
  • Updated tablet chromium version which now supports mp3.
  • Updated Dissonance voice chat plugin.
  • Voice chat is now working on Linux again.
  • Updated Lua Moonsharp to 2.0.
  • Lots of code refractoring and cleanup to facilitate faster updates in the future.
  • Reduced ram usage, by lower the number of variants for our custom DXT5nm Standard shader.
  • Optimized a lot of physics code to use non gc allocing functions.
  • Greatly sped up updating Workshop mods on initial load.
  • Optimized the netcode to be more performant on the cpu.


  • Added translations for most common languages using google translate. Access Language menu via the button in the bottom right of the main menu, or in the menu bar of the Configuration window.
  • Added the ability to create your own translations for the default UI and share them on the Workshop.
  • Added localization support for your text fields. This allows you to translate your mods for different languages. Example: {en}Hello {fr}Bonjour {de}Hallo
  • This also works in url fields if you need to change assets based on the language. Example: {en}url1 {fr}url2
  • Supported languages: [en]English, [zh-cn]Chinese (Simplified), [ru]Russian, [es]Spanish, [pt-br]Portuguese (Brazil), [de]German, [fr]French, [ko]Korean, [pl]Polish, [tr]Turkish, [ja]Japanese, [zh-tw]Chinese (Traditional), [th]Thai, [it]Italian, [pt]Portuguese, [cs]Czech, [hu]Hungarian, [sv]Swedish, [nl]Dutch, [es-419]Spanish (Latin America), [da]Danish, [fi]Finnish, [nb]Norwegian, [ro]Romanian, [uk]Ukrainian, [el]Greek, [vi]Vietnamese, [bg]Bulgarian, [arb] Arabic

Object Tags

New mechanics which allows objects to selectively interact with game systems. If a system (e.g. a hidden zone, a hand zone, etc.) has a tag set, then only objects which share a tag with it will interact with it.

Taggable systems:

  • Hidden zones
  • Randomize zones
  • Hand zones
  • Layout zones
  • Fog-of-War zones
  • Scripting zones
  • Snap points

Set what tags a object or system has by right-clicking it and selecting Tags from the menu. You may access all tags present at the table via the Modding->Tags window. Added Snap-Point Creation Tags window: new snap points will automatically gain whatever tags you set here.


  • Hand, Hidden, and Random zones should perform much faster and no longer slow down the game.
  • Zones now work correctly when there are multiple colliders attached to the same Object. (TODO: LayoutZone and FogOfWarZone)
  • Zones now all have a right-click context menu. Left-click will open the zone-specific menu that used to be on right-click.

Layout Zones

New Zone tool (in the zone tool popout) which allows you to automatically lay out objects (primarily cards) across the table. Deploy like any other zone, then left-click and hit the cog to change its settings. Especially useful for card games in which you lay melds on the table (like Gin) or which have trick-taking (Whist, Bridge, etc.), but can also be used to simply arrange a bunch of objects in a grid without locking them to it.

Features include:

  • Filter affected objects (face-up/down, non-cards, etc)
  • Split/Combine decks.
  • Set to Manual Only for one-off arranging.
  • Automatic sorting of objects inside groups based on Name, Description, etc.

Layout Zones can triggered by using the Layout Zone tool and left-clicking the zone then hitting the big Layout button, or by right-clicking a object inside a zone it interacts with and selecting the Layout option in its context menu. Mouse pointer shows icon indicating when you are holding an object inside a layout zone: will also show the zone's name if it has one.


  • Improved turn transitions.
  • Added ability to set player names.
  • End Turn button now shows current player instead.
  • Added some Misc Settings, detailed below.
  • Fixed object visibility.
  • Fixed a bunch of bugs in the Lua API relating to Hotseat mode.


  • Added "Order" option to contextual menu for bags (LIFO, FIFO, and Random).
  • Spawn mode now works off objects in the void.
  • Picking up objects that are teleported from out bounds now snap to the mouse nicer.
  • When cloning/spawning objects you may hold the left mouse button down and move the mouse to spawn multiple objects.
  • Buttons will now only appear on Books (i.e. PDF objects) when you hover the mouse over them. This can be disabled in Misc Settings.
  • Decks now have a Spread action in the right-click menu; spreads the cards out across the table. Distance between cards is set in Misc Settings.
  • NGUI now shows up on objects in the onscreen hand view and optimized it when alt zooming. (XML UI still doesn't work)
  • Added description to the tooltip when searching a container.
  • Workshop loading wheel above chat is always spinning now when updating.


  • HandZones are now Objects like everything else.
  • Added Lua Hands.getHands() and get/setValue() string Color for Hands Objects.
  • Added Lua WebRequest.custom(string url, string method, bool download, string data, Dictionary<string, string> headers, Closure callbackFunction)
  • Lua getAllObjects() is now instantly updated to add or remove when an object is spawned or destroyed.
  • Added Hands class to Lua with members (bool enable, bool disable_unused, int hiding) sames as the hands menu.
  • Deck no longer populates cards with its script and script state.
  • Added tryRandomize(player_color) and tryObjectRandomize(object, player_color) for when someone tries to shuffle/roll/randomize an object. Returning false will prevent randomization.
  • Added onBlindfold(player, blindfolded) event, triggered when a player puts on or takes off blindfold.
  • Added object.alt_view_angle property: when non-zero the Alt view will use the specified Euler angle to look at the object.
  • Added object.getPositionSmooth() and object.getRotationSmooth() return the current smooth move target and null if not moving.
  • Added object.isDestroyed() returns true if an object is (or will be) destroyed.
  • Deprecated object.tag property: use object.type instead.
  • Deprecated filter... commands: now use prefix try.... e.g. tryObjectEnter.
  • Added object.memo, a string you can store info in on an object.
  • Stopped the ability to spawn Tables using spawnObject.

Added Lua Global classes Tables and Backgrounds. Tables:

  • string getTable()
  • bool setTable(string name)
  • string getCustomURL()
  • bool setCustomURL(string url)
  • Object getTableObject() Backgrounds:
  • string getBackground()
  • bool setBackground(string name)
  • string getCustomURL()
  • bool setCustomURL(string url)

Added Info global static class exposing Info menu.

  • string name
  • string type
  • string complexity
  • int[] playing_time
  • int[] number_of_players
  • List<string> tags

Added calls for working with Tags:

  • object.getTags() -> Table gets the Tags attached to an object.
  • object.setTags(Table tags) sets the Tags attached to an object.
  • object.addTag(string label) adds the Tag to the object.
  • object.removeTag(string label) removes the Tag from the object.
  • object.hasTag(string label) -> bool checks if the object has the Tag.
  • object.hasAnyTag() -> bool checks if the object has any Tags.
  • object.hasMatchingTag(other) -> bool checks if the other object has a matching Tag with this object.
  • scripting_zone.getObjects() will utilize Tags attached to the zone, unless you override with scripting_zone.getObjects(true)
  • deck.spread(distance) uses the spread action on the deck.
  • getObjectsWithTag(string tag)
  • getObjectsWithAnyTags({tag, tag...})
  • getObjectsWithAllTags({tag, tag...})


  • Fixed network sync bug with Xml UI by adding null check to Xml setAttribute(s) and setValue.
  • Fixed object.getSnapPoints() throwing when having no snap points.
  • Fixed loading_custom to work with custom decks and cards.
  • Fixed object.clone() sound parameter not working.
  • Fixed MusicPlayer.playlistIndex to MusicPlayer.playlist_index (old way still works).
  • Fixed Grid calls not working over network.
  • Fixed Grid.snapping not working.
  • Fixed showHotkeyConfig working over network. Added color parameter; dialog will be shown to that player.
  • Fixed onObjectRandomize and onRandomize not returning correct player colour.
  • Fixed Physics.cast not returning list in correct order.
  • Fixed Group action ignoring tryObjectEnter and tryObjectEnterContainer.

System Console

  • Added commands for options detailed in Misc Settings above.
  • Added language, language_... commands for selecting current language.
  • Added translation_export, translation_import, translation_for... commands for working on translations.
  • Added translate command to translate an English term into the current language (if TTS knows it).
  • Added hotseat_name_..., hotseat_start_turn, and hotseat_end_turn commands.
  • Added pointer_position command.
  • Added lift_height and rotation_degrees commands.
  • Added action_spread and action_layout commands.
  • Added ui_clear command to clear UI generated by other commands (e.g. ui_button)


  • Fixed major bug when saving stuff to cache not overwriting but writing on top of and maybe deleting garbage at the end.
  • Fixed url redirect issue when trying to load assets from the web with expired certs error. (Curl error 51: Cert verify failed: UNITYTLS_X509VERIFY_FLAG_EXPIRED)
  • Fixed chat breaking and being uninteractable.
  • Fixed bug when uploading steam cloud image thumbnail for Workshop by only allowing local files.
  • Fixed being unable to click through magnify ui to pick up objects.
  • Fixed issues with states number 95 being 96.
  • Fixed rotation values not syncing on connecting client.
  • Fixed null reference when downloading old workshop files that had null width and height deck info.
  • Fixed issue when downloading a bunch of mods with the games menu open causing an insane number of threads to spawn and blow up the game.
  • Fixed bug with FogOfWarZone and child colliders not working correctly.
  • Fixed objects with Measure Movement working on clients.
  • Fixed measuring tool logging revealing hidden object info.
  • Fixed Lift Height slider not hiding when you click away from it.
  • Fixed Pan key not working while holding a object (as long as it is not on the same binding as Flip)
  • Fixed Camera Hold Rotate key not working while holding a object (as long as it is not on the same binding as Tap)
January 29, 2021, 9:44 pm

Hey everyone, hope you're all doing good! We got a great patch you guys today with a ton of great features, improvements, and fixes.

Summary: You can now make your games friends or invite only, no longer requiring a password. We have a ton of great new features to the line tool making it awesome for all your wargaming needs. There are a lot of great physics improvements to make everything feel a lot more stable. Workshop tags have been revamped and have many more options making it easier to find your games. Custom Card shapes have been added hex, circle, and square. Spawning overhaul where you can see a ghost preview where the object will appear. And much more all covered below!


  • Added new server types public, friends, and invite.
  • Public servers are just how you are used to anyone can join, but you can have an optional password.
  • Friends server means only friends can join, no password required.
  • Invite server means only people you choose to invite can join the game, no password required.
  • Server browser loading should be faster because there will be less public servers that need to fetched with the new friends and invite servers.
  • Server browser will now always get your friends servers instantly first.
  • Server browser is now available while you are in a game, in the escape menu.
  • Server browser now shows the total number of people in-game.
  • Fixed connecting to a new game while you are already in one.

Line Tool

  • Moved measurement options from Misc menu to the Line Tool button.
  • Added Grid units alongside Inches and Metric. Will measure according to the size of the grid.
  • Added 2D / 3D modes. In 2D all measurements are flattened to the horizontal plane. In 3D height is included.
  • Added ruler mode: Auto or Free. In Auto mode the ruler will take advantage of objects you hover over, snapping to them where appropriate. You can hold down ctrl to override this behaviour.
  • Objects now have a Measure Movement toggle, which if enabled will mean whenever that object is picked up (and you are in Auto mode) a measurement will be started.
  • When in Auto mode, if you start measuring while holding an object (by holding tab), it will measure from the pickup location.
  • You may hold down shift while measuring to view the orthogonal axes (2D mode) or the flat distance + height (3D mode). Holding ctrl at the same time will show the other.
  • Fixed being stuck in Line Tool after using it while holding an object.

Line Tool: Object Snapping Line Tool: Orthogonal Components

Line Tool: Flat Distance + Height

Pure Mode

  • Added Pure Mode, a simpler view of the table, tunable in the Theme Editor. Supports all built-in tables.

Pure Mode: Light Theme Pure Mode: Dark Theme

Spectator View

  • Picture-in-Picture window now allows you to interact with the game through it.
  • For example, you could set it to look at a dice, and whenever you want you can hover over the dice and hit R to roll.

Hand Zones

  • On-screen Hand View now shrinks when you are not hovering over it.
  • Optimized Hand Zones with lots of objects in them.
  • Hands Zones are much snappier with their movement.
  • Fixed issue where object you were holding would go below objects in your Hand Zone.
  • Fixed sub components of cards/dominoes/parchisi (drawings, decals, attached objects, etc.) not hiding in hands.


  • Greatly improved the reliability of physics collisions especially for thin objects.
  • Consolidated physics settings under a new menu called Physics.
  • Gravity slider goes twice as high now for stronger gravity.
  • Cards collider thickness is now the actual size instead of being much thicker.
  • Cards will no longer stack if their scale differ by 15%.
  • Made it so you have to be more precise when placing objects into a bag / infinite bag to reduce accidents especially on large objects.
  • Revamped teleporting when objects fall off the table to now place it floating at the edge of the table where it flew off to reduce disruption.


  • Revamped the workshop tags with a bunch more and now available in the new Options -> Info menu.
  • These tags are now embedded in the save file and will be in the future searchable and filterable in-game just like the Workshop.
  • New tags categories: Type, Game Category, Complexity, Number of Players, Play Time, and Assets.


  • Add an all search to the games menu.
  • Objects menu revamp completed by merging all Object Menus into the same menu that is searchable.
  • Search for Games and Objects menu has been improved.
  • Physics options have now been moved into Options -> Physics.
  • When you have a folder open on the UI popup menus will have it default selected for you.
  • Added hover icons for buttons and input fields for 3d Xml UI matching 3d NGUI.
  • Added tooltips to Tablet UI buttons.
  • Renamed vector paint to just draw.
  • Can now hold down rotate snap point buttons for continuous rotation.
  • Fixed Saved Objects that are wider than taller now save their thumbnails correctly.
  • Fixed decks making shuffling sounds in the components menu.
  • Fixed PDF popout window working at any UI scale.
  • Fixed hand opening up like you can grab on a 3d UI element overlapping an object.
  • Fixed scaling alt zoom on UI objects.
  • Fixed performance issue when alt zooming objects on the UI.
  • Fixed when having the Components -> Boards open causing snap in the middle of the table.

Custom Objects

  • Added Custom Card/Deck shape types: Rectangle (Rounded), Rectangle, Hex (Rounded), Hex, Circle.
  • Added Stand Up toggle to Custom Token, that stands the token up like a meeple.
  • Optimized Custom Token to load instantly for images with no transparency.
  • When updating an Custom Object, if there exists any objects with matching custom object properties, a popup will appear and ask if you also want to update them.


  • The game will now show a ghost object where your object will drop when snapping to grid or snap points.
  • You may still drag components out of the component window, but if you click one instead you will enter Spawn mode. Click the left mouse to place a copy of that object. Hit right mouse or escape to end.
  • New context menu for objects: Clone. Puts you in Spawn mode for that object.
  • When holding an object, hitting escape will return it to where you picked it up.
  • Snap points are now editable for promoted players.
  • New feature where when you press a number key while holding a bunch of objects it will arrange it in a grid based on the number of rows specified with the number key.
  • Settings added for various new features present in the patch.
  • Misc setting added to make containers (decks, bags, etc.) respond to the first number typed on them.


  • object.measure_movement - access the Measure Movement object toggle.
  • Vector held_position_offset position offset from pointer, lift height and object bounds still modify distance from surface.
  • Vector held_rotation_offset rototation offset from pointer. This in combination with held_spin_index and held_flip_index determine rotation.
  • int held_spin_index 0-23 value, 15 degrees Y axis. Upside down is 12, right side up is 0. Changes when a player rotates.
  • int held_flip_index 0-23 value, 15 degrees Z or X axis depending on the object. Face down is 12, face up is 0. Changes when a player hits flip or alt + rotate.
  • Vector pick_up_position The position the object was picked up at.
  • Vector pick_up_rotation The rotation the object was picked up at.
  • bool held_reduce_force When the Object collides with something while moving this is automatically enabled and reduces the movement force.
  • Add Object.getData() and spawnObjectData({ data = Object.GetData()}), which is the same thing as getJson() and spawnObjectJson() except that is working with Tables and you don't have to convert in Lua which should be more performant.
  • Added type to getCustomObject() from cards.
  • Fixed filterObjectEnter and filterObjectEnterContainer not working while game is loading.

System Console

  • Added action_cut, action_deal, action_draw, action_flip, action_group, action_lock, action_randomize, action_rotate, action_search, action_split, action_state_next, action_state_prev commands, which will trigger that action on the currently selected object.
  • For example, you could do bind f action_search, and then f would open the search window.
  • Fixed edit command messing up { } characters.


  • Fixed Cloud Manager not loading for people that had a corrupted cloud after uploading a save.
  • Fixed Search and expand working with non decks that aren't loaded already on the table.
  • Fixed black spectator hidden zone bug.
  • Fixed SSAO not being enabled correctly for cameras besides main.
  • Fixed bug with PDFs breaking in search / expand and dummy mode.
  • Fixed networking issues with the attach tool.
  • Fixed AssetBundle not hiding correctly that don't have a mesh filter.
  • Fixed AssetBundles that are attached not having colliders.
  • Fixed Fog of War cut paste issue.
  • Fix FoW issue where the fog was not lifting for clients
  • Fix FoW issue where the faraway objects were incorrectly not revealed
  • Fixed color picker display of low-alpha colors.
  • Fixed Attached Objects not getting converted when doing upload all on the cloud manager.
  • Fixed up issues with stacking custom tiles as chips.
  • Fixed rotation of cards in hands on the poker table.
  • Fixed touchscript exceptions being thrown.
  • Fixed timer sound not playing the digital clock.
  • Fixed putting objects into the search windows for decks or bags not deleting the object for clients.
  • Fixed visual objects now working decals in Search, UI, Attach, etc.

Hotfix v12.4.1

  • Lua Object.pick_up_position/rotation persists when object is released.
  • Options -> Info: Tag sliders don't add range when one value is 0.
  • Additional tooltip to view button in PiP.
  • Fixed performance regression due to SSAO being forced on for everyone.
  • Fixed decals breaking measurement tool.
  • Fix drop ghost sometimes persisting.
  • Fixed UI layer issue where drop down menu would go behind the UI (I think?)?
  • Fixed out of bounds teleport to only grab hits that are within a range so it will not teleport to the floor.
  • Fixed escape triggering menu when exiting clone mode.
  • Fixed tab ping not working while hovering over objects.
  • Fixed pure mode not persisting.
  • Fixed drawing cards that are layered on each other causing issues.
  • Fixed onscreen hand interaction to be correct when adjusting it in the misc settings.
  • Fixed Lua Grid.offsetY.
  • Fixed dummy object trigger Lua onObjectDestroy events.
  • Fixed object leak when spawning Objects -> Components.

v12.4.2 Hotfix

  • Pinging object now highlights the object.
  • Lift height is now ignore when an object is in your hand so that it doesn't raise above the hand zone.
  • Added Go and Reversi boards to the components menu.
  • Renamed the "Create" button in Save & Load to "Save Game".
  • Added misc setting that will autofocus search field for Games and Objects menu.
  • Added misc setting to change size of move gizmo.
  • Added misc setting to control matching custom object dialog.
  • Added Enhanced Base Precision experimental misc setting.
  • Disabled collasping context menus by default (can be enabled in misc settings).
  • Added keyboard shortcut for objects window: ctrl+o.
  • Added object.getNearestPointFromObject(other_object) and object.getNearestPointFromPosition(position) lua calls.
  • Added console cmds action_popout and ui_book_window.
  • Fixed custom chips loading looking like a single stack incorrectly.
  • Fixed Hand zones moving slightly everytime you saved and load a game.
  • Fixed slider issue when creating a multiplayer game and dragging it to 2 player.
  • Fixed rotation bug on Spawning mode visualizer.
  • Fixed grid in pure mode.
  • Fixed bug with pure mode and classic games.
  • Fixed flick correctly resets object that fell off the table, so it won't float and have no collision.
  • Fixed trigger colliders being used when measuring distances.
December 12, 2019, 5:36 pm

We've got yet another great update for you today featuring a Custom Theme Editor (dark mode included), Global Chat Filter, Picture-in-Picture and many scripting improvements!

Dark mode & Theme Editor

Alongside the new Dark theme, you may now edit the colours of the user interface however you wish using the Theme Editor. Find it in the Configuration->Interface window.

Global Chat

The Global Chat now has a Profanity filter that the user can enable to filter out profanity, spam and misbehaviour. Can be enabled/disabled in chat settings, or with /filter & /nofilter

Picture-in-Picture / Spectator View

  • Spectator view can now be used for picture-in-picture, if you are not using it on another monitor. Can be enabled by right-clicking background in game and selecting Picture-in-Picture.
  • Console commands added for this, and some spectator commands reworked. See below.
  • Fixed restricted visiblity (which shows the world as a Grey player sees it).
  • Fixed fog-of-war view.
  • Fixed pointer visibility.


  • Images assets are no longer resized to the nearest power of 2 thanks a bug fix by Unity. (Unity version 2019.1.14)
  • Lowered max angular velocity cap to make dice feel better and more like previous versions.
  • Various UI improvements and fixes, most notably on Color Picker, Server Browser, and Script Editor.
  • Custom Figurine object now has a Card Scale property, so the figurine card can be scaled independently from the base.
  • GM Notes section added to bottom of right-click context menu for Black player (can be disabled in Misc settings)
  • Each section in the right-click context menu can be collapsed by clicking the line above it (can be disabled in Misc settings)
  • Misc setting to control mouse shake threshold.
  • Misc setting to control whether games can add items to context menus.
  • Misc setting to control whether games can show the game-specific keyboard controls config window.
  • Misc setting to control whether a single card will behave as a deck when you type a number on it. If ON then you will draw the card. If OFF then it will change state / rotation value, etc.
  • Fixed blindfold in right-click menu not working.
  • Fixed spectators (grey players) seeing things they shouldn't (in fog-of-war for instance).
  • Fixed game freezing when you hold a stack of two objects and use alt+right-mouse to drop one.


New API events:

filterObjectEnterContainer(container, object) - Global version of object.filterObjectEnter
onPlayerChangeTeam(player, team) - Called when a player changes team.
onObjectHover(player, object) & object.onHover(player) - Called when a player moves their pointer over an object.
onObjectNumberTyped(object, number) & object.onNumberTyped(number) - Called when a player types a number on an object. Uses new property object.max_typed_number
onObjectStateChange(object, old_guid) & object.onStateChange(old_guid) - Called when an object changes state, after it is in its new state.
onObjectCollisionEnter(object, collision_info), onObjectCollisionStay(object, collision_info), onObjectCollisionExit(object, collision_info) - Called when an object collides with another. Objects must be registered with the collision handler before they will trigger these events.

New API commands:

player.setUITheme(theme_script) - Sets the player's UI theme.
object.addContextMenuItem(label, function, keep_open = false) - Adds a right-click context menu to the object.
object.clearContextMenu() - Clears all items added by above.
addContextMenuItem(label, function, keep_open = false, require_table = false) - Same as above, but global (when user right-clicks empty space, or the table).
clearContextMenu() - Clears all items added by above.
addHotkey(label, method_name, trigger_on_key_up = false) - Add a bindable control. User may assign a key to it in Options->Game Keys.
showHotkeyConfig() - Shows the config window described above.
clearHotkeys() - Remove all controls created by above.
'container.remainder' - After using container.takeObject, if there is only one object left in the container (which means the container will be destoyed in the next frame) then this will be set to that last remaining object.
object.getGMNotes() & object.setGMNotes(notes) - For new GM notes feature.
object.registerCollisions(include_stay_events = false), object.unregisterCollisions() - Objects must be registered in order to trigger the global collision handler events detailed above. Sway events are particularly expensive, so only set that parameter to true if you absolutely require it.


  • Fixed filterObjectEnter not working under certain conditions.
  • Fixed decals not cleaning up correctly when using setDecals

System Console

Spectator command rework:

spectator_window now controls the picture-in-picture mode.
spectator_screen can be used to open spectator view on another monitor.
spectator_activate_with_resolution now has -p parameter to specify picture-in-picture. This command can be used to open picture-in-picture with specific position and size.

New commands: (for more info see above page, or use help )

  • ui_main_flip, ui_main_modding, ui_main_music, ui_main_notebook, ui_main_objects, ui_main_options - Control visibility of buttons on top menu bar.
  • spectator_panel_buttons - Whether picture-in-picture window has buttons to control it.
  • spectator_panel_corners - Whether picture-in-picture window has corners to resize it.
  • spectator_panel_locked - Whether picture-in-picture window can be moved.
  • ui_themecolor - Color of specified selector.
  • ui_theme_batch_start & ui_theme_batch_end - Group multiple ui_themecolor commands together.
  • ui_theme_count - Number of themes.
  • ui_theme_from_game_auto - Whether games can set the theme colors.
  • ui_themeis - Sets current theme.
  • ui_theme_index - Index of current theme. Set to change theme.
  • ui_theme_name - Name of current theme. Set to change theme.
  • chat_filter - Whether the chat filter is enabled.
  • chat_refresh_filter - Refresh the chat filter rules.
  • card_is_deck_for_hotkeys - Whether the setting described above is enabled.
  • game_hotkey_bind - Bind a key to a game-generated control.
  • game_hotkey_list - List bindable controls generated by loaded game.
  • ui_context_menus_from_games - Whether games can add items to context menus.
  • game_hotkey_config_can_open - Whether games can show the game-specific control binding window.
  • ui_context_menus_can_collapse - Whether context menu section can be collapsed.
  • ui_context_menus_show_gm_notes - Whether GM notes are displayed at bottom of context menu for Black player.

v12.2.1 Hotfix 1

  • Fixed IRC messages not sending.
  • Fixed contextual menu bugs.
  • Fixed transparency potentially bricking your UI.
  • Fixed setUITheme not working.
  • Fixed aspect ratio on custom figurines.
  • Fixed calculator and tablet.

v12.2.1 Hotfix 2

  • Fixed hotseat turn indicator star.
  • Fixed server browser flashing white during refresh.
  • Added Highlight C theme selector for pressed state of pointer & top menu buttons.
  • Removed player colour tints from advanced theme palette.
  • Fixed some minor theme issues.
  • Fixed object.addContextMenuItem callback not supplying player color.
  • Fixed sort sometimes breaking on strange characters.

v12.2.2 Hotfix 3

  • Fixed drop-down in certain dialog windows displaying below the window.
  • Fixed cloud upload not using the selected folder.
  • Fixed object.loading_custom returning false too early.
  • Fixed onObjectEnterContainer only firing for one of the objects when two single objects merge.
  • Fixed typing numbers on objects not working in hotseat mode.
  • Fixed buttons attached to hidden objects (which are therefor invisible) being clickable.
  • Added setting in VR settings to disable the missing binding warning.
October 30, 2019, 7:13 am

Hey everyone, we got another great update for you today! We have added 2 very long requested features a Music Player and PDF support!

There are also a ton of great additions and improvements listed below in the patch notes.

Music Player
  • The music player let's you play audio files (.mp3, .wav, .ogg, ogv) which are synced for all players.
  • Great for room music or so your DnD campaign has the right mood!
  • Supports playlists with ordering, shuffling, and looping.
Custom PDF
  • New object Custom PDF, that allows you import a PDF onto a tile.
  • This converts the PDF into a series of images, to make it easy to import your rule books!
  • Supports multiple pages: swap between them with the contextual menu, next/previous state hotkeys, or the buttons on the left and right side.
  • Can popout the PDF to the screen by hitting the hidden UI button on the top left of the PDF object.
  • You can joint this to any objects to add any visual flair you would like to match the game.
Cloud Manager Folders
  • Cloud manager now supports folders just like Saved Games/Objects.
  • When you import all loaded assets into cloud it puts them in a folder defaulting to the Game name.
  • Can now name files that are uploaded to the Cloud instead of just using the file name on disk.
Sound Improvements
  • Custom Objects that are set to dice or coin will now get that correct sounds for their selected material type.
  • Improved sounds for objects interacting with locked objects.
  • Added glass material type for Custom AssetBundle and Custom Model.
Alpha Transparency Support
  • Added alpha support to the color picker.
  • Can now draw with semi tranparency.
  • Can color tint objects to have alpha transparency, which goes nicely with the new glass material type.
  • Objects with alpha transparency will not cast shadows.
Magnify Revamp
  • Magnify (hotkey m) overhauled to be round.
  • Scroll up or down to control the zoom level of the magnify.
  • Fixed visual issues with previous magnify.
General Improvements
  • Added loading percent next to the player names on the top right.
  • For the top bar in-game the Scripting, Workshop Upload, and Cloud Manager menus have been moved under "Modding".
  • Improved auto-raise to work better with overhangs.
  • Added a workshop indicator next to the chat window that you can hover over and get info about how far along the workshop subscription check is at.
  • Moved physics mode (semi-lock, locked, etc) from Configuration to Server Options.
  • Greatly improved compatibility with old AssetBundles shaders. This will fix a lot of broken DLCs.
  • Improved Fog of War performance.
  • File Browser now remembers the last opened path.
  • Updated Voice Chat plugin.
  • Voice chat is now using a higher quality setting.
  • Added hidden zone opacity sliders to Misc settings.
Scripting Improvements
  • New global class Vector:

Vector(num, num, num) --> return a vector with specified (x, y, z) components
Vector(table) --> return a vector with x/y/z or 1/2/3 conponents from source table (x/y/z first) --> same as Vector(...)

Vector.max(vec1, vec2) --> return a vector with max components between vec1 and vec2
Vector.min(vec1, vec2) --> return a vector with min components between vec1 and vec2
Vector.between(vec1, vec2) --> return a vector pointing from vec1 to vec2
vec:copy() --> copy self into a new vector and retur it

Component access:
vec.x, vec.y, vec.z --> read/write component
v[1], v[2], v[3] --> read/write component
vec:get() => num, num, num --> returns x, y, z components of self

Methods modifying self and returning self:
vec:setAt(key, num) --> same as "vec[key] = num"
vec:set(num, num, num) --> set x, y, z components to passed values
vec:add(otherVec) --> adds components of otherVec to self
vec:sub(otherVec) --> subtracts components of otherVec from self
vec:scale(otherVec) --> multiplies self components by corresponding compnents from otherVec
vec:scale(num) --> multiplies self components by a numeric factor
vec:clamp(num) --> if self magnitude is higher than provided limit, scale self down to match it
vec:normalize() --> scale self to magnitude of 1
vec:project(otherVec) --> make self into projection on another vector
vec:reflect(otherVec) --> reflect self over a plane defined through a normal vector arg
vec:inverse() --> multiply self components by -1
vec:moveTowards(otherVec, num) --> move self towards another vector, but only up to a provided distance limit
vec:rotateTowards(otherVec, num) --> rotate self towards another vector, but only up to a provided angle limit
vec:projectOnPlane(otherVec) --> project self on a plane defined through a normal vector arg

Methods not modifying self:
vec:dot(otherVec) --> return a dot product of self with otherVec
vec:magnitude() --> return self magnitude (length)
vec:sqrMagnitude() --> return self magnitude (length) squared
vec:distance(otherVec) --> returns distance between self and otherVec
vec:sqrDistance(otherVec) --> returns squared distance between self and otherVec
vec:equals(otherVec, num) --> returns true if otherVec same as self (optional numeric tolerance param), false otherwise
vec:string(str) --> return string describing self, optional string prefix
vec:angle(otherVec) --> return an angle between self and otherVec, in degrees [0, 180]
vec:cross(otherVec) --> return a cross-product vector of self and otherVec
vec:lerp(otherVec, num) --> return a vector some part of the way between self and otherVec, numeric arg [0, 1] is the fraction
vec:normalized() --> return a new vector that is normalized (length 1) version of self
vec:orthoNormalize() --> return three normalized vectors perpendicular to each other, first one being in the same dir as self
vec:orthoNormalize(otherVec) --> same as vec:orthoNormalize(), but second vector is guranteed to be on a self-otherVec plane

vecOne + vecTwo --> return a new vector with added components of vecOne and vecTwo
vecOne - vecTwo --> return a new vector with subtracted components of vecTwo from vecOne
vecOne * vecTwo --> return a new vector with multiplied components of vecOne and vecTwo, NOT a dot product (!)
vec * number --> return a new vector with all components from vec scaled by a numeric factor
number * vec --> same as "vec * number"
vecOne == vecTwo --> return true if both vectors identical or within a small margin of each other, false otherwise
tostring(vec) --> return a string description of a vector
  • New global class Color:
Color(num, num, num) --> return a color with specified (r, g, b) components
Color(num, num, num, num) --> return a color with specified (r, g, b, a) components
Color(table) --> return a color with r/g/b/a or 1/2/3/4 components from source table (letter keys prioritized) --> same as Color(...)

Color.fromString(colorStr) --> return a color from a color string ('Red', 'Green' etc), capitalization ignored
Color.fromHex(hexStr) --> return a color from a hex representation string (e.g. '#ff112233'), hash sign and alpha are optional
col:copy() --> copy self into a new color and return it

Color.Purple [etc] --> shorthand for Color.fromString('Purple'), works for all player and added colors, capitalization ignored

Component access:
col.r, col.g, col.b, col.a --> read/write component
col[1], col[2], col[3], col[4] --> read/write component
col:get() => num, num, num, num --> returns r, g, b, a components of self

col:toHex(includeAlpha) --> returns a hex string for self, boolean parameter
col:toString(num) --> returns a color string if matching this instance, nil otherwise, optional numeric tolerance param

Methods modifying self and returning self:
col:setAt(key, num) --> same as "col[key] = num"
col:set(num, num, num, num) --> set r, g, b, a components to passed values

Methods not modifying self:
col:equals(otherCol, num) --> returns true if otherCol same as self, false otherwise, optional numeric tolerance param
col:lerp(otherCol, num) --> return a color some part of the way between self and otherCol, numeric arg [0, 1] is the fraction

colOne == colTwo --> return true if both colors identical or within a small margin of each other, false otherwise
tostring(col) --> return a string description of a color

Color.list --> table of all color strings
Color.Add(name, yourColor) --> add your own color definition to the class (string name, Color instance yourColor)
  • Added an overload to UI.setXml() and UI.setXmlTable() to take a CustomAssets as the last param.
  • Music Player exposed to Lua.
  • Added logString function, which returns a string representation of a lua object (the same representation the log function uses)
  • Fixed cleanup issue with Xml custom assets UI from lua for clients.
  • Fixed turns not network syncing for Lua.
  • Improved movement - added movement inertia. Can be calibrated or disabled in VR settings.
  • Grid overlay now renders in VR.
  • Fog of War now renders in VR.
  • Added VR documentation to api website:
Spectator Mode
  • Spectator window may now display the view grey players have (for example, cards in your hand will be hidden). Enable with +spectator_restrict_view
  • Spectator window now renders the grid. May be turned off with -spectator_show_grid
System Console
  • Added documentation for system console to tabletop api website:
  • Inline variable evaluation changed to use { and } (instead of < and >). See above page for details.
  • You may now use alias to run commands when a toggle variable's value is changed.
  • skip now allows for various comparisons, and fuzzy equality check.
  • Added ui_anchor, ui_label and ui_toggle commands (to accompany ui_button), allowing you more options for easily running commands / changing setting during play.
New commands: (for more info see above page, or use help )
  • append - Adds text, or the last entered command, to a text variable.
  • camera_reset_on_load - Whether the camera resets its position when you do a Save & Play in Atom.
  • chat_input - Activates chat input box.
  • component_examine - Sets game component currently being examined.
  • component_move, component_rotate, component_position, component_rotation - Apply movements to components.
  • eval - Evaluates an expression and stores it in a variable.
  • examine_position, examine_rotation - Return information on the currently examined component.
  • hidden_zone_showing_opacity, hidden_zone_hiding_opacity - Set visual opacity of hidden zones.
  • lua - Execute a lua statement.
  • music_add, music_mute, music_next, music_pause, music_play, music_prev, music_repeat, music_shuffle, music_timecode - Commands to control new music player.
  • spectator_restrict_view - Whether the spectator window shows your view, or that of a grey player.
  • spectator_show_grid - Whether the grid is rendered in the spectator window.
  • team - Stores / sets team you are currently on.
  • ui_anchor - Sets position UI elements are made relative to (default is 0,0 - the center of the screen)
  • ui_label - Add static text UI element.
  • ui_toggle - Add checkbox UI element.
  • vector_x, vector_y, vector_z - Return an individual axis from a vector variable.
  • vr_move_with_inertia - Whether you have inertia in VR.
  • vr_move_friction - When you have inertia, how quickly you slow down.
  • vr_scale_rotate_rate - How much smoothing is applied during scaling/rotating.
  • Fixed scroll wheel being inverted for Linux.
  • Fixed Components menu chess Wood White King being missing.
  • Fixed search and expand for Games menu.
  • Fixed misc issues with spectator camera.
October 30, 2019, 7:13 am

Hey everyone, this is one of our largest updates yet! We've updated the game engine massively to the latest version of Unity 2019.1 which will give us overall better performance and features. There has also been an optimization pass to reduce stutter causing situations, so everything can be as silky smooth as possible. That's just the tip of the iceberg: reduced game size 4gb, AssetBundle materials, spectator camera improvements, and ton more covered below!

Unity Engine Upgrade:
  • Upgrade Unity version from 5.6.6 to 2019.1.
  • Dx11 on Windows, OpenGLCore on Mac and Linux.
  • FPS should be overall faster. Can be twice as fast in really specific scenes.
  • Physics performance improved.
  • Video textures much faster with more formats support (.m4v and .mov)
  • Incremental garbage collector greatly reduces the game's stutters.
  • Dx9 support has been dropped (only 0.01% of players have a gpu that is only Dx9). Dx10 is minimum requirement now.
  • Windows Xp support dropped and with Steam not supporting it anymore either this isn't a surprise.
  • All custom images are now resized to a power of 2 internal, so avoid using non power of 2 images if you can. This is due to Dx11 bug this might be changed back in the future if Unity fixes this.
  • RAW cache from Images and Models had to deleted to due incompatibilities with the engine upgrade.
Known Issues:
  • AssetBundles using crunched textures will not load correctly and need to be re-exported from Unity 2019.1 with the updated Modding Project.
  • AssetBundle mesh colliders might behave differently due to physx upgrade.
New System Requirements:
  • OS: Windows 7 SP1+, macOS 10.12+, Ubuntu 16.04+
  • Graphics card with DX10 (shader model 4.0) capabilities.
  • CPU: SSE2 instruction set support.
Performance Optimizations:
  • Saving mod asset to disk is now async and will not sutter the game.
  • Greatly reduced the time it takes to destroy objects reducing the lag when changing mods.
  • Made the Games & Saved Objects menu async to fix stutters when opening them.
DLC Improvments:
  • DLC are no longer included in the game install and will be downloaded when played the first time.
  • This has reduce the install size of the game by 4 gigs.
  • We can also now update and add new DLCs without having to update the game.
  • Can now have multiple DLCs loaded up at once.
AssetBundle Materials:
  • Added support for loading AssetBundle materials into any Custom Object Image slot.
  • Create holographic playing cards or add normal maps to your custom dice!
  • Works by assigning your material to an AssetBundle and then exporting like normal.
General Improvements:
  • Custom Card added so you can create cards one at a time.
  • Added /rules to global chat which opens a link to the rules on our knowledge base.
  • Update DLC Three Cheers for master with scripted components.
  • Disabled being able to load local files with the Tablet due to javascript exploits.
  • Opening urls now only open steam links in the overlay and all others open in your default browser.
  • Secured many networking related functions from hackers.
  • Added .json to Steam Cloud upload file types.
  • Steam Cloud now supports uploading files greater than 100mb.
  • Added filterObjectEnter(object) event: Place it on an object, and it will prevent any objects from being able to enter it. For example, placing it on a deck will not allow cards to enter it. If you return true in the function, the item will be allowed in.
  • Updated plugin to the latest version.
  • Can now get the click button for events like onClick with the value param passed.
  • Xml UI image assets are now no longer compressed to make them look nicer.
  • Xml UI errors now print to chat, to make it easier to debug Xml UI.
Caching Improvement:
  • Added support for adding {verifycache} in front of your urls to have the game check the last-modified header of a url to update the local cache if it is stale. Only does this check once per game session.
  • This is an advanced feature for people that want to host content on there own servers and make sure people get updates without having to change the URLs.
  • Added a warning message when you do not have any control bindings (typically because you are using unsupported hardware), instructing you on how to set the bindings up in SteamVR.
  • Fixed objects not clumping when you shake the controller.
  • Fixed stack/deck grab not working with laser pointer.
Spectator Mode
  • Spectator mode now works when you use a different resolution than your main display. It has had an overhaul, and now works using these commands:
displays - Lists all available displays. ID 0 will always be your main game screen.
spectator_window - Turn on to activate the spectator window.
spectator_activate_with_resolution - Use instead of above to specify display, resolution, etc.
vr_spectator_replaces_main_window - In VR, controls whether spectator mode makes its own window or just uses the desktop mirror.
spectator_camera_follow_player - When ON the camera will follow your point-of-view.
spectator_camera_attachment - Lets you specify a component or pointer to attach camera to.
spectator_camera_follow_attachment - When ON the camera will follow the above object.
spectator_camera_dolly - When camera is following an object, it will be offset this far in the direction it is facing.
spectator_camera_offset_position - When camera is following an object it will be offset by this X Y Z.
spectator_camera_offset_rotation - When camera is following an object its facing will be offset by thus X Y Z.
spectator_camera_load - Set the camera to a saved camera position.
spectator_camera_load_zero - As above, but the position is zero-indexed (useful when coupled with certain commands like Add).
spectator_camera_smooth_on_load - Whether smoothing is applied during above.
spectator_camera_target - Lets you specify a component or pointer for the camera to track.
spectator_camera_tracking - When ON the camera will track the above object.
spectator_camera_look_at - Make spectator camera look a component or pointer.
spectator_camera_override_player_with_look - When ON the look at and track commands will work when camera is following player.
spectator_show_ui - Whether the UI is displayed on the spectator window.
spectator_post_processing - Whether post-processing effects are applied to spectator window.
spectator_camera_smooth_position - Positional smoothing factor.
spectator_camera_smooth_rotation - Rotational smoothing factor.
spectator_camera_stay_upright - When ON the camera will not go upside-down.
Example autoexec.cfg:

# Make easier to type versions of spectator_camera_ commands.
# i.e. cam_load instead of spectator_camera_load
alias cam_* spectator_camera_*


# make right control have camera follow player while held
# @ makes it not output to console
bind +right_control @+cam_follow_player
bind -right_control @-cam_follow_player

# make semicolon look at object under pointer
# need to start line with > to stop <hovered> being evaluated,
# and exec to make it evaluate when activated
>bind semicolon exec cam_look_at <hovered>

# make period toggle object tracking, and comma set tracked object
bind period !cam_tracking
>bind comma exec cam_target <hovered>

# make right shift cycle through first 3 camera positions
alias next_camera add cam_load_zero 1 3
bind right_shift next_camera

# make some buttons to load specific camera positions
ui_button 1 600   0 cam_load 1
ui_button 2 600 -30 cam_load 2
ui_button 3 600 -60 cam_load 3
System Console
  • '/' commands now worked when typed into console tab
  • Fixed color command ignoring permissions
New commands:
  • chat_font_size - The size of the font in the chat windows.
  • say_global, say_game, say_team - Transmits text to specified chat channel.
  • subtract - Like add, but allows you to subtract current value from another (good for ping-ponging between two numbers).
  • vr_steamvr_bindings - Lists all current steamVR bindings.
  • ui_button - Lets you make a button on your screen which will perform a command.
  • highlight - Highlights specified component.
  • mod_caching, mod_caching_raw, mod_threading, and mod_thread_count. Last three variables are typically used as parameters in other commands, buy enclosing them with << and >>.
  • find - Call with parameters to find a component. Will then be set to that component.
  • grabbed - Equals the component you are currently holding.
  • hovered - Equals the component you are hovering over.
For example:
  • find -name "Blue Player Token"
  • highlight <>

If you want to set up a binding/alias/button in a script then you need to start the line with a >, surround the variable with < and > instead, and use exec.

>bind right_control exec spectator_camera_attachment <hovered>
  • Fixed blury comfirmation UI for tablet.
  • Fixed saving .rawm to disk when regular caching.
  • Fixed random sort for Games and Saved Objects is now actually working correctly.
  • Fixed custom objects not probably being positioned on the UI correctly.
  • Fixed the black background fade stuttering on when open exist to main menu window.
  • Fixed some format stuff for file browser or tooltips. Added back .jpeg.
  • Fixed line tool, including flick and joint.
October 30, 2019, 7:13 am

Hey there everyone! This is one of biggest updates yet, we have a lot of great stuff coming for you guys in this update, but we want to make sure it's stable before pushing it live. So, we are doing a public beta first and we want to hear from you about any issues!

To opt into the beta:

  • Right click on Tabletop Simulator in your Steam library.
  • Choose Properties -> Beta.
  • Then in the drop down for "Select the beta you would like to opt into:" choose "public_beta".
Unity Engine Upgrade:
  • Upgrade Unity version from 5.6.6 to 2019.1.
  • Dx11 on Windows, OpenGLCore on Mac and Linux.
  • FPS should be overall faster. Can be twice as fast in really specific scenes.
  • Physics performance improved.
  • Video textures much faster with more formats support (.m4v and .mov)
  • Incremental garbage collector greatly reduces the game's stutters.
  • Dx9 support has been dropped only 0.01% of players have a gpu that is only Dx9. Dx10 is minimum requirement now.
  • Windows Xp support dropped and with Steam not supporting it anymore either this isn't a surprise.
  • All custom images are now resized to a power of 2 internal, so avoid using non power of 2 images if you can. This is due to Dx11 bug this might be changed back in the future if Unity fixes this.
  • RAW cache from Images and Models had to deleted to due incompatibilities with the engine upgrade.
Known Issues:
  • Due the massive engine upgrade AssetBundle are the most effected due to Unity changes you might have to re-export your AssetBundle from 2019.1 with the updated Modding Project.
  • Old AssetBundles using crunched textures will not load correctly and need to be re-exported.
  • AssetBundle mesh colliders might behave differently due to physx upgrade.
Performance Optimizations:
  • Saving mod asset to disk is now async and will not sutter the game.
  • Greatly reduced the time it takes to destroy objects reducing the lag when changing mods.
  • Made the Games & Saved Objects menu async to fix stutters when opening them.
DLC Improvments:
  • DLC are no longer included in the game install and will be downloaded when played the first time.
  • This has reduce the install size of the game by 4 gigs.
  • We can also now update and add new DLCs without having to update the game.
AssetBundle Materials:
  • Added support for loading AssetBundle materials into any Custom Object Image slot.
  • Create holographic playing cards or add normal maps to your custom dice!
  • Works by assigning your material to an AssetBundle and then exporting like normal.
General Improvements:
  • Custom Card added so you can create cards one at a time.
  • Added /rules to global chat which opens a link to the rules on our knowledge base.
  • Update DLC Three Cheers for master with scripted components.
  • Disabled being able to load local files with the Tablet due to javascript exploits.
  • Opening urls now only open steam links in the overlay and all others open in your default browser.
  • Secured many networking related functions from hackers.
  • Added .json to Steam Cloud upload file types.
  • Steam Cloud now supports uploading files greater than 100mb.
System Console:
  • Added mod_caching, mod_caching_raw, mod_threading, and mod_thread_count.
  • Added say_global, say_game, say_team commands.
  • / commands now work when typed into system console.
  • Added subtract command.
  • Renamed vr_bindings command to vr_steamvr_bindings
  • Added say_global, say_game, say_team commands.
Spectator Mode:
  • Spectator mode should be working correctly with differing monitor resolutions.
  • Added displays command, reworked spectator_activate_with_resolution command (can now specify display)
  • spectator_camera_attachment - sets component or pointer for camera to attach to.
  • spectator_camera_follow_attachment - when this is on the camera will move as if attached to above entity.
  • spectator_camera_follow_player - renamed, was spectator_camera_follow.
  • spectator_camera_dolly - distance camera is offset along the direction it is looking.
  • spectator_camera_offset_position - vector3 positional offset from attachment.
  • spectator_camera_offset_rotation - vector3 rotational offset from attachment.
  • spectator_camera_look_at - make camera look at specified component or pointer.
  • spectator_camera_target - sets component or pointer for camera to track.
  • spectator_camera_tracking - when ON the camera will constantly track the above entity.
  • spectator_camera_override_player_with_look - when ON look and track commands will override follow_player.
  • spectator_camera_stay_upright - when ON the camera will avoid being upside-down.
  • Added onObjectTryEnter(object) callback: if present on an object then it will be called when another object would be inserted into it (like a card into a deck or a token into a bag). If it returns false then the item will not be able to enter.
  • Updated plugin to the latest version.
  • Can now get the click button for events like onClick with the value param passed.
  • Xml UI image assets are now no longer compressed to make them look nicer.
  • Xml UI errors now print to chat, to make it easier to debug Xml UI.
  • Fixed line tool, including flick and joint.
Caching Improvement:
  • Added support for adding {verifycache} in front of your urls to have the game check the last-modified header of a url to update the local cache if it is stale. Only does this check once per game session.
  • This is an advanced feature for people that want to host content on there own servers and make sure people get updates without having to change the URLs.
  • Fixed blury comfirmation UI for tablet.
  • Fixed saving .rawm to disk when regular caching.
  • Fixed random sort for Games and Saved Objects is now actually working correctly.
  • Fixed custom objects not probably being positioned on the UI correctly.
  • Fixed the black background fade stuttering on when open exist to main menu window.
  • Fixed some format stuff for file browser or tooltips. Added back .jpeg.
  • Fixed line tool, including flick and joint.
October 30, 2019, 7:13 am

Oh my! More optimizations are always nice, as the community continues to produce fantastic and more technically complex creations. But if you’re hungry for a new feature, we hope you’ll enjoy the new Video Images, which allow you to use videos as textures for assets. Plus, a long requested feature: Spectator Mode! Whatever your taste, we think this patch has a little something for everybody.

Loading Improvements:
  • Overall loading should be much faster and smoother than in the past!
  • New image caching folder “Images RAW” that stores .rawt files to speed up loading by up to 20 times.
  • General optimization to use less memory when loading your games up.
  • Greatly reduced custom image ram usage by ~50%.
  • AssetBundles now load in async and with less stutters.
  • Loading generates much less garbage for the garbage collector to clean up to reduce stutters.
  • Fixed normal maps for Custom Models not working correctly and being slow.
  • Better error handling when trying to load assets with an unsupported file type.
  • Added CMYK JPG detection to avoid game crash.
Video Images:

  • Enjoy animated textures for you assets or play jigsaw with animated video!
  • Import videos (.mp4 and .webm) into the image slot on any custom asset. Note: Linux does not support .mp4.
  • New sharpen post processing to enhance the overall clarity of the game.
  • Configuration graphic changes are instant now without having to hit apply.
  • Reduced CPU usage when lots of objects are loaded up.
  • Added game load time to system console.
  • Optimized DLC Cosmic by removing all the extra scripting zones from each expansion.
  • Added console commands rewind_interval and unload_interval.

There's now a way to interact with Unity's built in components using this new API. You can control all aspects of your assetbundles for example changing the light settings, all from Lua. You can read more about it on the API page. self.getComponentInChildren("Light").set("intensity", 20)

Object and GameObject:
  • getComponent(name) return Component
  • getComponents(optional name) return Component[
  • getComponentInChildren(name) return Component
  • getComponentsInChildren(optional name) return Component[
  • getChild(name) return GameObject
  • getChildren() return GameObject[
  • name return string


  • game_object return GameObject
  • get(varName) return value
  • getVars() return Dictionary<string Name, string Type>
  • set(varName, value) return bool
  • name return string
Scripting Fixes:
  • Fixed Component UI menu triggering onObjectDestroy lua events.
  • Fixed XML UI syncing issue for connecting players.
Spectator Mode
  • Spectator mode provides a second fullscreen viewport to be used for streaming / recording. The UI can be shown or hidden on it, and its camera can follow your own or be set to any stored position.
  • Spectator mode requires a second monitor to display on. If you only have one physical monitor then you can use something like to get around this limitation.
  • Spectator mod is controlled via the following console commands:
spectator_window - turn on to activate the spectator window
spectator_show_ui - whether the UI is displayed on the spectator window
spectator_camera_follow - when enabled spectator camera will follow your view
spectator_camera_load - set spectator camera to a stored position
spectator_camera_load_zero - same as above, but zero-indexed (so 0 = slot 1, 1 = slot 2, etc.)
spectator_camera_smooth_position - factor used to smooth spectator camera movement
spectator_camera_smooth_rotation - factor used to smooth spectator camera rotation
spectator_camera_smooth_on_load - when enabled smoothing will be applied when loading camera positions as well as when following player
spectator_post_processing - whether post-processing effects are applied to the spectator window
vr_spectator_replaces_main_window - in VR, controls whether spectator mode makes its own window or just uses the desktop mirror.

Example autoexec.cfg:

 spectator_camera_smooth_position 0.1
 spectator_camera_smooth_rotation 0.1

# set right control key to toggle player follow
 bind right_control !spectator_camera_follow

 # set space to make spectator camera follow player while it is held down
 # @ = silence command in console
 bind +space @+spectator_camera_follow
 bind -space @-spectator_camera_follow

 # set keys to jump to specific camera positions
 bind comma spectator_camera_position 1
 bind period spectator_camera_position 2
 bind semicolon spectator_camera_position 3

 # set right shift key to cycle through the first 3 camera positions
 alias next_camera add spectator_camera_position_from_zero 1 3
 bind right_shift next_camera
  • Fixed memory leaks with custom assets when changing urls on an already loaded custom object.
  • Fixed ui search overlapping issues.
  • Fixed with hackers being able to delete objects without being admin.
  • Fixed hand zones not working on colliders that where child objects.
  • Fixed flick tooltip showing garbage.
Custom Model Loading:

Speed up loading of cached models by up to 20 times with new .rawm format and "Models Raw" folder. This uses the same principle as the what we've done to the images to speed up loading of your .obj files.

Spectator Mode:
  • Added spectator_activate_with_resolution command.
  • Fixed spectator window freezing after returning to main menu.
  • Fixed post processing on spectator window.
  • Fixed scroll bar in Configuration > UI > MISC.
  • Fixed normals maps not working with non square images.
  • Fixed issues with XML UI rich text.
October 30, 2019, 7:13 am

This patch is filled to bursting with general improvements that you, the community, have been asking for. Better Fog of War, useful scripting additions, better VR, game chat announcements of clearing and measurements, Jigsaw puzzle improvements and MORE! If you don't see the improvements you were hoping for in this update, we're still hard at work on even more improvements for the future!

Jigsaw Puzzle Improvements
  • The game can now detect if the jigsaw puzzle is complete.
  • The "Shuffle" and "Check" commands can be found if you right-click on the puzzle box.
  • The UI that opens when a new puzzle is created now remembers the settings you used on your last puzzle.
  • Pieces will rotate to nearest 90-degree rotation when snapping in place.
Improved Fog of War
  • Higher maximum reveal range!
  • Field of View (and field of view offset) added!
  • You can cause items in the Fog to become hidden again if a "reveal" moves off of them. This works like Fog of War in many RTS games. You can enable this feature by right-clicking the Fog of War Zone with the Fog of War Zone Tool and enabling it.
  • Some performance improvements have been made as well.
  • Revealer Objects can now also be hidden from each other.
Miscellaneous Settings Menu

Some new features, as they are worked on, do not have their own UI menu yet. We've got them collected in the "MISC" setting menu!

  • To locate the menu, go to: "Configuration > Interface > Misc..."
  • Tweak the camera rotation speed.
  • Hide VR players.
  • Center on mouse when zooming.
  • Switch from "inches" to "metric".
  • You will see some other patch notes that mention the "MISC" menu. They can be modified here as well.
General Improvements
  • If you press a number key when over a single card, it will draw that single card (like it would if the card was part of a deck).
  • You can shuffle cards in your hand by highlighting the ones you want to shuffle and clicking R.
  • Dice rolling in high-gravity rooms has been improved.
  • New "Sort" categories have been added to various menus. "Classic" now has "Last Played", "DLC" now has "Purchased", and "Workshop" now has "Downloaded".
  • When you open the search menu, the keyboard cursor will jump up to the Search box. This is so you can just start typing to begin a search, rather than needing to click in the "Search" text box.
  • Both "Previous State" and "Next State" options have been added. They have keyboard shortcuts, PgUp and PgDn by default. You can change which keys scroll through the states of an object in the Configuration menu. You can change if they wrap (the last one leads back to the first) in the Misc menu.
  • The line tool is now able to log its measurements, printing them to the Game tab. This is off by default, but can be enabled in the Misc menu.
  • Server Browser sorting now works during the refresh.
  • You can now use Ctrl-F6 to toggle all UI panels on/off.
  • The tablet should now work on Linux. This is experimental.
  • The on-screen hand interaction area is now much smaller if nothing is currently in the hand to avoid accidental interactions.
  • Added chat message notifying if someone deletes all vector lines, 3d texts, or decals.
  • You can now Shift+F keys to cycle through your tools in reverse order.
  • The version number on the bottom right of the main menu is now click-able to bring up patch notes.
  • Fixed objects getting stuck above tiny play areas.
  • Added group(table). This allows you to group a table of objects, in the same way the "G" key would for a player! It returns a list of the grouped objects.
  • Added addDecal(table), getDecals(), and setDecals(table). Now scripting can add decals into the game world.
  • Added object.getJoints().
  • When a table of parameters for a joint is returned, it now includes joint_object_guid. This is the GUID for the object which is attached by the joint.
  • Added desired_position to the list of parameters returned by .getCustomObject() when it is used on a Jigsaw Puzzle piece. This parameter is the "solved" position for the piece.
  • New Time class added, used to easily fetch information like os.time(), but also other informations like time passed since last frame, total frames passed, etc.
  • pingTable(vector) added to the Player class. Now a script can emulate a player pinging.
  • Added setComponentVar(componentName, varName, value) and getComponentVar(componentName, varName) as an object function. This allows you to access components that you have made part of your AssetBundle via scripting. For example, changing lights or colliders on the fly. These functions will also work on the components of default objects like "Collider" and "Light".

You can find details and examples for these, and all of Tabletop Simulator's functions, in the Tabletop Simulator API.

Bugs Fixed
  • Scripting can now properly read whose turn it is (according to the Turns system).
  • Fixed custom objects in scripting zones failing to trigger events.
  • Fixed items that are hidden being revealed for a frame when switching states.
  • Prevented "scaling permission" pop-up when using Vector paint.
  • Removed Grey player's ability to delete notebook pages.
  • Improved snapping for very small and very large objects.
  • Thief animation fixed. (poor little guy gets sick during Unity changes for some reason)
  • Fixed shuffling deck from right-click menu not triggering OnObjectRandomize.
  • Fixed collisions trigger when loading custom objects.

Keep tabs on VR improvements on the discussion page.

VR Improvements
  • Updated to SteamVR action+binding system.
  • VR controllers can now act as a joypad for control binding; turn on Joypad Emulation in the VR settings, and make sure the Controller option at the bottom of the Controls window is ticked.
  • Using above, most normal control bindings should work where approriate in VR (e.g. Copy, Paste, Flip, etc.)
  • Can now attach the VR UI screen to a controller: rotate your wrist as if you were looking at your watch.
  • Added Drawings, Text, Gizmo, Snap, and Decal tools.
  • Fixed Zone tools, Line tool (displays measurement, arrow ping).
  • Fixed objects (such as chess pieces) warping into upright rotation on grab (now smooth-moves).
  • Trigger Click Effect now known as Orient Object.
  • Orient Object action should now work on all card-like objects (dominos, mahjong tiles, etc). Also works on jigsaw pieces: will rotate them to next 90-degree angle.
  • Fixed snap points.
  • Made resize room visual effect less opaque.
  • Fixed non-hands objects being picked up by VR virtual hand.
  • Fixed tooltips & icons on Oculus Rift.
  • Pad bindings now use compass notation (i.e. vr_left_pad_north = left controller, up on pad)
VR Settings
  • Physical UI Screen, Attached UI Screen, UI Scale - Control how the VR UI Screen is displayed.
  • Display VR Players - Can select whether other VR players are visible (off, hands-only, hands+headset)
  • Wall mode - will rotate room so the table is vertical.
  • Align Zoomed Object - Zoom object now matches rotation of the object it is displaying.
  • Grabbing Hides Gem - Hides controller gem when holding on object.
  • Hover Tooltips - Display UI hover tooltips above controller.
  • Interface Click Threshold - When the interface click action is bound to an analog input it will use this value.
  • Laser Activation Threshold - When laser activation is bound to an analog input it will use this value.
  • Laser Beam Thickness, Laser Dot Size - Control how big the laser pointer is.
  • Left Tool Hotkeys & Right Tool Hotkeys - Bind the default tool select hotkeys to the pad.
  • Tooltips Action Enabled - Can be turned off here to disable tooltips (instead of having to unbind the action).
  • Floor of mist - change the floor.
Console Commands

All New Console Commands

Renamed Console Commands
vr_trigger_click_effect_delay -> vr_orient_object_delay
vr_thumbstick_repeat_duration -> vr_interface_repeat_duration
Removed Console Commands
October 30, 2019, 7:13 am

It has been a while since the last update, because we've been plugging away at making it a big one. Fog of War, Play Area control, Line Tool improvements, Additive Loading, VR Improvements, and much of it covered in our brand new Knowledge Base. Oh my!

Fog of War:
  • Found under the Zone tools, Fog of War acts similarly to a hidden zone, with the zone hiding objects that are within it.
  • You can right click any object to enable "Reveal Fog Of War" in its Toggles menu. This object now reveals fog, instead of being hidden inside of it.
  • Right clicking it again shows options for visibility range as well as what color objects are revealed for.
  • The piece reveals area of the fog, which is represented by a black plane.
  • Did we mention it can be accessed via scripting? See below.
  • GM (black seat) players can see everything in the fog.
  • Objects also have a "Ignore Fog of War" toggle, to disable the hiding effect on that piece.
  • All "Boards" are unaffected by fog, and are still visible. You can set your Custom Models or AssetBundles to be "boards" if you want them visible as well.
  • Read about other options and system details on the Zone Tools section of the new Knowledge Base.
Play Area:
  • Want the camera to move further from the table? Or not be able to? Play area lets you set that distance limit.
  • Use this to make a small room that the player can't sneak out of.
  • Use it to make even BIGGER setups.
  • The setting can be modified under Options at the top of the screen, then under the Game settings.
Improved Line Tool:
  • Your measurements with the line tool are now visible for all players!
  • The line never covers the number.
  • It is not blurry. What more could you ask for from a line?!
Additive Load:

When in the Game menu, when clicking the 3 dots that appear in the upper right of a Game when you go to select it, you will see a new option: Additive Load.

  • Clicking this option causes all of the game pieces from the save to be loaded into your CURRENT game.
  • So all your current game objects remain where they were and the ones from the save you Additive Loaded from will appear as well.
  • An ideal use for this is to save different dungeon/map setups, then load them into your current game after clearing space.
New Knowledge Base:
  • The old Knowledge Base was built to explain the many systems in Tabletop Simulator.
  • A replacement for the old Knowledge Base, the new Knowledge Base has a fast, much more modern setup.
  • It is patterned on the update API.
  • There have been some additional documents created, updates to classics and more.
  • It also allows you to submit improvements via GitHub.
VR Improvements:

On-Screen Keyboard:

  • Turn on in Interface settings. Displays an on-screen keyboard - mainly for use in VR (makes searching a lot easier). Can be toggled in VR with button on right of screen.

VR Settings UI:

  • You no longer need to use console commands to configure your VR experience.
  • Accessible through Interface settings, or in VR with button on right of screen.
  • Added setting to disable displaying network player VR peripherals; accessible in VR settings or via console command vr_display_network_players
  • Added settings for how selection works: either a box with a fixed height (as it has been), a box exactly as you draw it, or a box anchored to the table surface.
  • Long hover tooltips now wordwrap.
System Console:

A number of commands are now persistent: you do not need to add them to your autoexec to set them at startup; instead they will remember their setting between sessions. help will show which commands persist.

New Commands:
Scripting Changes:

Not as much here as in some other patches. But we made sure you had access to some of the new toys.

  • Added Physics.play_area
  • Added object.setFogOfWarReveal(table)
  • Added object.getFogOfWarReveal()
  • Added object.ignore_fog_of_war
  • Read more about these in the API.
Bug Fixes:
  • Peeking cards no longer causes their name/description to become available for all players to see for a few moments.
  • Improvements to the console's color changing commands to prevent abuse.
October 30, 2019, 7:13 am

Hey everyone got meaty patch for you guys this time focusing on improving the drawing tool with improved visuals and functionality. We also got a plethora of great VR improvements that can be seen below like virtual hands. Also like normal we got a bunch of great scripting improvements.

Drawing Tool
  • Sharper less blurry look.
  • Added line, box, and circle tool.
  • Can now control thickness using +/-.
  • Added draw indicator to easier to see where you will be drawing.
  • Can now draw on any angled surface on objects.
  • Pixel paint removed.
  • Fixed up bugs plaguing lines on objects.
  • Added Steam rich presence to see what games your friends are playing and if there is any room!
  • Server browser now streams in results instead of in one big chunk.
  • You can stop this refresh by clicking the refresh again.
  • Raised max packet size from 1 mb to 10 mb allowing you to load larger save files when promoted.
  • Input fields are now auto selected for popup dialogs.
  • Removed "Hacking in Unity" discord message.
  • Objects will now have their face hidden while face-down (set per object, defaults to on for objects such as cards / decks / dominos)
  • Rotation Value identifiers which begin with # will not be displayed in tooltip.
  • Tutorial now always uses Museum backdrop (as it has good text contrast)

Updates to the new Wait class:

  • Added repetitions to Wait.time to better emulate Timer. Wait.time(func, time, number_repetitions).
  • Using -1 will cause infinite repetitions
  • Improvements to stop() so it should work more as expected.

Returns from getObject and getStates improved to a common standard, includes:

  • Name and Nickname
  • Description
  • Lua Script and Lua Script State

New Object functions:

  • obj.drop() causes the item, if held by a player, to be dropped.
  • setHiddenFrom(players) Hides objects from a specific player/players. Uses "hand zone" hiding.
  • setInvisibleTo(players) Hides objects from a specific player/players. Uses "hidden zone" hiding.
  • attachHider(...) and attachInvisibleHider(...) are more advanced version of
  • setHiddenFrom and setInvisibleTo, there to help handle complex situations easily.
  • Old Object Functions (with new features!)
  • setRotationValues() now allows you to start a name/value with a # and it won't display the value in the tooltip.
  • randomize(color) Now an optional string can be added so that
  • onObjectRandomized will trigger, indicating that player color triggered it.

New base function:

  • get/setVectorLines() Allows for lines to be placed via scripting using the new vector line tools`
  • New Spawnable object: Custom Decks!
  • Technically this was added before, but now it works and is documented!
  • Spawn using spawnObject then set it using setCustomObject
  • Clarifications to the Object class
  • Some functions, let setSnapPoints or call, work on both Object and Global.
  • To highlight which Object functions can be directed at the game world, they have been broken out on the Object page into a "Global Functions" section.

New Object member Variables

  • use_rotation_value_flip can be used to modify which direction objects flip.
  • is_face_down determines if an object's "face" is pointed down (like with cards). The face is the direction that faces the positive Y value.
  • hide_when_face_down hides an Object when it is face-down. Objects are hidden like if in a hidden zone. The face is the direction that faces the positive Y value.

New Event

  • onObjectEnterContainer has long been a requested event, and it is now available!
  • New virtual hand feature that lets you interact with your hand just like if it was attached to your left controller.
  • Click trigger while holding a card to straighten it and hide it from other players. Click again to toggle.
  • When you pull an object out of the search inventory (for example, removing a card from a deck) it will appear at the controller tip, and be grabbed if possible.
  • Improved controller tooltips.
  • Tooltip showing click button for Vive on main menu.
  • Fixed VR tutorial.
  • Flick and Line tools now working properly.
  • Reduced jitter on scale + rotate.
  • Up no longer defaults to teleport (but that can be re-enabled with vr_teleport_with_pad)
  • Down on pad now defaults to Zoom, on both controllers.
  • Pad now has context commands when hovering over objects.
  • Lots of other VR changes/improvement that can all be found here.
Stats Monitor
  • Added a stats monitor for fps, memory, and sound.
  • Activated with stats_monitor console cmd.
  • Fixed auto raise over tablet freaking out.
  • Fixed input bug spamming hotkeys into input fields when first selecting.
  • Fixed locking object while it then unlocking it dropping through world.
  • Fixed splitting into 10 decks merges some of the decks.
  • Fixed decal on flipped cards bug.
  • Fixed vector, decals, infinite bags hiding bugs.
  • Fixed onscreen hands not showing decals and vector lines.
  • Fixes convert URL to steam cloud now works on UI custom assets.
  • Fixed string size limit over the network being increased for large xml.
October 30, 2019, 7:13 am

Hey we got another great patch for you guys today with a ton of great scripting changes, give host, and a brand new file browser!

Give Host:
  • Allows the host of game to pass the hosting off to another player that is connected to them.
  • The selected player will receive a confirmation dialog to accept the new host and can accept or decline.
  • If accepted all players will disconnect and then have the choice to reconnect to the new host in the exact same setup and layout they were just playing in.
  • Everything will be preserved from the previous host.
New File Browser:
  • Brand new file browser.
  • Can search and favorite folders to easily find your assets.
  • Works in VR now.
Split & Cut:
  • New split added to contextual menu that let's you split a deck / stack in a certain number of stacks.
  • Cut has been improved by letting you choose at what proportion you want to split the deck / stack.

Scripting Improvements:


putObject() now returns an Object.

  • Using it to combine two cards will return an object reference to the newly formed deck.
  • Using it to put an object into a container/stack/deck will return the container/stack/deck it was made part of.
New class Notes
  • Contains notebook and set/getNotes functions.
  • Deprecated the old "Base" versions of these functions.
New class Wait
  • This new class allows you to easily trigger functions after some form of delay.
  • Contains frames, time, condition, and stop functions.
  • Deprecated Timer class entirely.
New Object functions
  • obj.cut(int) - Cuts a deck at the given card index.
  • obj.split(int) - Splits a deck in a number of stacks.
  • obj.getRotationValue - Returns the current rotationValue of an object (see: gizmo tool).
  • This function existed previously, but was not documented.
Event Functions
  • Added onObjectPeek(object, player) - Triggers when peek is used by a player.
  • Added object.onPeek(player), object.onRandomize(player).
  • Player Color strings convert automatically
  • Example: printToAll("Hello", "Green").
  • Snap points created on objects use Vectors local to the Object, rather than global.
  • This applies to both position and rotation.
  • Fix for optional parameters of spawnObjectJSON().
  • Fix motor_force not working on jointTo().
New Object Member Variables
  • loading_custom - Indicates if the assets of a custom element are being loaded.
  • spawning - Indicates if any object is currently in the process of spawning.
  • These are helpful to determine if elements are loaded into the game fully
  • Especially useful with the new Wait class!
Callback Changes
  • Callbacks are being overhauled to use brand new syntax where you directly pass the function instead of the function string name, function owner, and params.
  • Ex: Wait.time(|| print("Done"), 1) or Wait.time(function() print("Done") end, 1)
  • Effected are spawnObject/Json(), takeObject(), and Webrequests.
Custom UI:

New Lua function:

  • UI.setValue(string id, string value) - Updates the value that appears within element tags {>>(ex: THIS)<<}
  • UI.getValue(string id)- Obtains the value that appears within element tags {>>(ex: THIS)<<}
  • Both support Rich Text!
  • Added get/setCustomAssets() with keys named and url.
  • New InputField attribute placeholder- Greyed out text that appears in the input if there is no text present.
Chat Improvements
  • Added optional timestamps for chat found in chat settings.
  • Improved black outline around text in chat.
  • Numbers in chat are now monospace.
Onscreen indicators
  • Added on screen indicators to the edge of the screen for ping arrow and peek icons.
  • Never miss a notification because you were looking at the wrong direction.
UI Improvements
  • Add clear input x button to all search inputs.
  • Added a scale animation to popup menus.
  • Added a safe guard to restore UIs dragged off the screen.
VR Fixes:
  • VR Beta info & settings (+how to revert to original controls)
  • Fixed cards and decks rotating on pickup.
  • Fixed zoom scale speed being framerate dependent.
  • Fixed Custom Xml UI not working.
  • Fixed file browser not working.
October 30, 2019, 7:13 am

Hey everyone we got another great patch for you guys focused on a broad range of things, but a lot had to do with spring cleaning and keeping everything running great. We got a couple of great Custom Xml UI examples below to help you started getting your feet wet. They are also very functional and could be useful for your games.

Xml UI Example:

Score Tracker Dice Roller

  • Flip now actually flips the dice instead of increasing the number value (rotate right still does this).
  • Optimized away all garbage allocation per frame to improve overall smoothness.
  • Optimized 2D UI rendering to be more performant.
  • Overall lots of code cleanup to improve our workflow in the future.
Xml UI:
  • Visibility attribute now supports admin, host, and team names.
  • Clicking button won't block your hotkeys anymore.
  • Added getXmlTable() setXmlTable().
  • Fixed onValueChanged recursive event loop.
  • Fixed setAttribute() not working if it thought there wasn't a change.
  • Fixed not being able to setXml() with an empty string.
  • Fix support for RichText in Get/SetXmlTable().
  • Fixed zombie Xml UI when opening File Browser.
  • Added Player.getAvailableColors() and Player.getColors().
  • Added SetSnapPoints() and GetSnapPoints().
  • Added JointTo().
  • Lots of scripting improvements to make it easier to convert between Lua Tables and C# types.
  • Fixed Hotseat crash when using scripting input fields.
  • Fixed camera triggering scripting zone.
  • Fixed Turns.getNextColor() returning name instead of color.
  • Added feedback with a onscreen popup warning when trying to do
  • something that is blocked by a permission.
  • Permission save objects / saves to block saving objects to chest.
  • Permission peek to block alt+shift looking at the backside of an object.
  • Permission nudge to disabling all nudging with N.
External API:
  • Atom will now warn you when you try to Save & Play after creating an object in TTS without saving.
  • Lua error reporting improved.
  • Various fixes.

Zoom object: by default bound to pad-down on the left control. Touch it to display the last examined object (with either controller). Click it to lock in this mode; click again to exit. While locked, pad-left and pad-right will scale the object. Fixed rift hotkeys.

New commands:
October 30, 2019, 7:13 am

This section includes 10.6.1 & 10.6.2

Hey everyone we got another patch for you guys today focused on improving the new Custom UI by adding the ability to attach them to 3d objects in the game. Also many VR Improvements especially for Oculus. Last and not least a new looking for players indicator on the server browser.

Custom UI
  • Supports 3D UI attached to Objects.
  • Each object can have its own assets (images)
  • UI.getXml() and UI.setXml() added, allows for dynamic UI creation from a string. Expect more ways to dynamically spawn to added in the future.
  • Click sounds added for the UI.
  • Player colors now match TTS colors. For example, "red" is now equivalent to the player color red exactly.
  • Dragging is improved so the element doesn't snap to its rectAlignment when dragged.
  • Fixed changing active attribute from scripts the visibility attribute would sometimes not work correctly.
  • Added position attribute and fixed rotation to work like you would expect.
  • Scale of onscreen UI based on resolution height instead of width.
  • Custom UI hides correctly whenever there is a popup dialog.
  • Scripting editor now has two modes Lua and UI that let you edit their respective scripts per Object or Global.
VR Improvements
  • Fixed grabbing objects messing with rotation.
  • Selection box will use laser position if laser is on.
  • Fixed selection box placement bug.
  • Added icon showing current tool mode.
Fixed Rift controls:
  • Gem now defaults to angled and is better positioned
  • Trigger activates laser and UI objects
  • Stick controls activate properly (teleport works on click, rotation will repeat on hold)
  • Stick UI becomes visible when stick touched.

New console commands:

Looking For Players
  • New looking for players indicator on the server browser. This will be default on for all servers.
  • This can be changed in game by going Options -> Server.
  • Can also be set from scripting with setLookingForPlayers(bool).
  • Updated to Unity 5.6.6.
  • Fixed thumbnail preview image causing image to being lower resolution than it should in the world.


  • Adjusted hardware mouse pointer position to be more accurate.
  • Looking for players icons desaturated and reversed the sort.
  • Fixed issue if you have a corrupt BlockList.json it would stop you from being able to connect to a server.
Xml UI:
  • Added getXmlTable() and setXmlTable() for dealing with Xml easier with Lua tables.
  • Changed setXml() from changing the actual Xml for the save file so everything is runtime changes only.
  • Changed getXml() to return the current Xml string including any runtime changes from setAttribute().
  • Fixed event recursion causing a potential lock up.
  • Fixed setXml() not working with empty string.
  • Added a 'debug_external_api' console command to show logging for external api messages.
  • Fixed logging an empty table throwing null.
  • Changed vr hotkey defaults.
  • Fixed current tool icon animating unduly.


Xml UI:
  • Changed UI.getXmlTable() properties to be lowercase and change text to value.
  • Fixed issue with UI.setXml().
  • Fixed issue visibility and late joining players.
October 30, 2019, 7:13 am

This patch includes creating Custom UIs using Xml giving you the power of Unity's UI system with an easy to use format. We also have a brand new API documentation that is much more feature complete with examples and better looks. Can be found here:

Read about the new VR Controls at the bottom of the patch notes!

Custom UI
  • Custom UI added using Xml.
  • Gives the power of Unity's UI system.
  • Docs can be found here:
  • object.randomize (or shuffle/etc) now returns 'true' if shuffle occurred. For example, a deck currently being searched by a player will not shuffle, so 'false' is returned.
  • Added search events: onObjectSearchStart, onObjectSearchEnd, onSearchStart, onSearchEnd
  • Button callbacks now have a third parameter which will be set to true if the button was right-clicked or long-pressed.
  • createButton now lets you specify 'hover_color' and 'press_color'
  • Added getJSON() to Object and spawnObjectJSON() this is the same format as Objects are saved in the save files.
  • Turns class added to let you controls the turns menu from scripting.
  • Event onPlayerTurn(player) added.
Voice Chat
  • Team icon is now working.
  • Updated to latest version of voice chat.
  • Fixed more bugs with Voice Chat.
  • Fixed items appearing faded in Search window.
  • Fixed Search window not working in VR.
  • Fixes to cosmic encounter.
VR Controls Update

The goal is to provide a more intuitive VR experience; closer to how you would play a board game IRL. This is still in development, feel free to leave us your feedback about how it feels! To enable the old control scheme type +vr_controls_original into the system console.


Various commands in the system console govern vr behaviour: type help vr to see them. For example, turning 'vr_sticky_grab' on will mean you do not have to hold the trigger to maintain grip on an object; instead you press to grab, then press again to release. If you want these commands to persist then add them to your autoexec (type 'edit autoexec' and enter them there).

You can quickly switch between old and new controls if you do something like 'bind right_control !vr_controls_original' ( can then hit right control to toggle)

  • Laser pointer now turns on and off as the player touches the touch pad, and is oriented like a pointer rather than a gun (it now matches the default steam keyboard laser).
  • Selection box now drawn from controller position instead of laser position.
Touchpad when not holding an object:
  • Center = click (buttons, UI, etc.)
  • Up = teleport
  • Left & Right = Mapped tool. Hold left or right to bind current tool to that button.
Touchpad when holding an object:
  • Center = flip

  • Left & Right = Rotate

  • Grip buttons now let you move (holding one controller) or rotate/scale (holding both). Holding any grip button will display control layout.

  • Holding menu button will reset your position.

  • Trigger now used exclusively to interact with 3D world

  • The touchpad controls when not holding an object are set using the console bind command, and can be overwritten, so you can bind any command you want to the touchpad if you wish (left, right, and up if you disable teleport; down and center are reserved). For example: 'bind vr_right_pad_left !vr_laser_constant' will toggle the laser on and off when you hit left on the right controller's touchpad. You can use -, +, and ! bind prefixes to bind to press, release, and long press respectively. Use 'vr_unbind_all' before binding your own to remove the default bindings.

Example autoexec

bind +vr_right_pad_left tool_grab
bind -vr_right_pad_left tool_revert
bind +vr_right_pad_right tool_paint
bind -vr_right_pad_right tool_revert

This will mean for the right controller, as long as you hold the left pad you will be in grab mode, and as long as you hold the right pad you will be in paint mode.

October 30, 2019, 7:13 am

This is our first update in 2018 and while this patch may not seem too exciting, it’s because we spent a lot time cleaning up underlining code to facilitate better updates for the future. We hope you do like any of the changes and updates that have been added thus far.

A big thing we’ve added to TTS is Discord integration, so you can see what game your friends are playing, what they are hosting and the number of seats available, and much more. Hope you enjoy!

Discord Integration
  • You can now click on a user in Discord and see what game they are playing within TTS.
  • You can see when players are hosting a game, the number of seats available and their color.
  • You can also see how long that particular session has been going as well as if they are in singleplayer or multiplayer.
DLC Battle For Souls Update
  • Fixed bouncing rulebook when changing states.
  • Added info to the Notebook.
  • Made background objects non-interactable.
Scripting Improvements
  • Added custom deck setCustomObject() and getCustomObject() support.
  • Fixed takeObject() collision issue with concave colliders.
  • Fixed sync input fields on late joining people.
  • Fixed null reference with Player.getSelectedObjects().
  • getCustomObject() will return a list of these keys because it could be multiple decks combined:
  • string face, bool unique_back, string back, int width, int height, int number, bool sideways, bool back_is_hidden
Chat Improvements
  • Added a ‘System’ tab console (icon is a tilde ~).
  • This gives better user experience with errors and reports for players.
  • Color of chat window will be different to differentiate between this tab and the others.
Hotkey Improvements

Added hotkeys to toggle UI elements on and off:

  • ctrl-f1: Tools
  • ctrl-f2: Top Menu
  • ctrl-f3: Players
  • ctrl-f4: Notepad
  • ctrl-f5: Chat
  • You can now modify custom decks with by reopening the custom menu.
  • Enter key now works in password dialog.
  • Duplicate errors logged to any chat tab now collate, rather than spamming the chat box.
  • Fixed issue with Text editor text invisible when it has too many characters.
  • Fixed bug with 3d pointer sometimes not showing up onscreen hands.
  • Fixed DLC custom assetbundle textures not getting converted correctly by making the secondary bundle load first.
  • Fix chat settings and host server UI overlap.
  • Fixed chat yellow indicator disappearing for all tabs when changing tabs.
  • Fixed global chat history being lost when exiting to main menu.


  • Had to reset saved settings to fix keybind issue.
  • Fixed system console hotkey activating when typing in input field.
  • Fixed being unable to rebind the system console hotkeys.
  • Fixed translations being activated when they aren't ready.
  • Fixed lua takeObject() breaking with grid and snap points.
October 30, 2019, 7:13 am
External Editor:
  • ASCII to UTF8, atom will work with all languages now.
  • Save file path added sent to external editor.
  • Added sendExternalMessage(Table) and event onExternalMessage(Table).
  • Added remote script execution from external editor.
  • Added Playercolor.getHoverObject()
  • Added static WebRequest class
  • Global script now has self, which is just the same thing as Global.
  • takeObject() now default smooth moves objects unless you supply smooth = false
  • Added sound property to spawnObject() to disable spawn sound.
Global Class WebRequest:
  • Get(string url, Object owner, string function)
  • Post(string url, Table form, Object owner, string function)
  • Put(string url, string data, Object owner, string function)

Callback function has property with keys string url, bool is_done, float download_progress, float upload_progress, bool is_error, string error, string text.

  • Spawn dropdown added to spawn an object in its exact saved spot.
  • This is great when trying to spawn a compound object.
  • Fixed issue with one of the colliders in the Indonesia DLC.
  • Fixed custom assetbundles not loading in cloud manager.
  • Fixed issue with custom objects starting with 2 dummy objects.

Hotfix 1

  • Fixed takeObject() collision issues with concave custom colliders.
  • Fixed input fields not syncing text to late joining players.
  • Fixed magnify getting stuck on your screen if you got disconnected while using magnify.
  • Fixed spectators being able to interact with calculators.
October 30, 2019, 7:13 am

This tiny update was mainly to get VR and Touch working again after the slight downtime with v10.0. Thanks for your patience!

General Improvements
  • VR is now working.
  • Touch is now working.
  • Doubled the max size of the packets so you can search and save larger things.
  • Improved sorting for server browser.
  • Servers that have a friend in it now have green text.
  • Added an invite icon on the top right, so you can easily invite your friends once all the slots are full, then it disappears.
  • Ping is more accurate and less jumpy.
  • Fixed issue with 50 value poker chip not showing properly for clients.

Hotfix 1

  • Fixed ping showing lower than it actually is.