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!
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.
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
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.
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
object.loading_customreturning false too early.
onObjectEnterContaineronly firing for one of the objects when two single objects merge.
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.
Constructors: 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) Vector.new(...) --> 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, v, v --> 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 Operators: 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
Constructors: 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) Color.new(...) --> 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, col, col, col --> 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 Operators: 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 Other: Color.list --> table of all color strings Color.Add(name, yourColor) --> add your own color definition to the class (string name, Color instance yourColor)
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!
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.
+spectator_window -spectator_show_ui # Make easier to type versions of spectator_camera_ commands. # i.e. cam_load instead of spectator_camera_load alias cam_* spectator_camera_* +cam_stay_upright # 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
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>
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:
/commands now work when typed into system console.
spectator_activate_with_resolutioncommand (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_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.
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.
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)
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.
+spectator_window -spectator_show_ui +spectator_camera_follow 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
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.
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!
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!
You can find details and examples for these, and all of Tabletop Simulator's functions, in the Tabletop Simulator API.
Keep tabs on VR improvements on the discussion page.
All New Console Commands
camera_clear_saved_positions camera_load_rotation_rate camera_restore_saved_positions camera_store_saved_positions component_default_autoraise component_default_grid component_default_hands component_default_ignore_fow component_default_reveal_fow component_default_snap component_default_sticky component_default_tooltip component_override_defaults component_state_wrapping drawing_erase_all drawing_render_fully_visible dice_roll_height_multiplier jigsaw_randomize jigsaw_validate measure_in_metric measure_logging mouse_wheel_zoom_and_center sendkey ui_config_misc ui_panel_chat ui_panel_main ui_panel_notepad ui_panel_player ui_panel_tools vr_display_network_players_off vr_display_network_players_hands vr_display_network_players_all vr_grabbing_hides_gem vr_hover_tooltips vr_interface_click_threshold vr_left_controller_bind_tool_hotkeys vr_mode_display_network_players vr_mode_ui_attachment vr_joypad_emulation vr_laser_activation_threshold vr_laser_beam_thickness vr_laser_dot_size vr_right_controller_bind_tool_hotkeys vr_tooltips_action_enabled vr_ui_attach_left vr_ui_attach_right vr_ui_detached vr_ui_floating vr_ui_scale vr_ui_suppressed vr_wall_mode vr_zoom_object_aligned
vr_trigger_click_effect_delay -> vr_orient_object_delay vr_thumbstick_repeat_duration -> vr_interface_repeat_duration
vr_cards_held_like_in_hand vr_tooltips_when_gripping vr_trigger_activates_laser vr_trigger_activates_ui vr_trigger_click_effect
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!
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.
VR Settings UI:
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.
reset ui_config_vr ui_keyboard_default_state ui_keyboard_show ui_keyboard_scale ui_keyboard_echo_duration vr_display_network_players vr_mode_selection_style vr_selection_style_anchored vr_selection_style_exact vr_selection_style_fixed
Not as much here as in some other patches. But we made sure you had access to some of the new toys.
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.
#will not be displayed in tooltip.
Updates to the new Wait class:
Returns from getObject and getStates improved to a common standard, includes:
New Object functions:
New base function:
New Object member Variables
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!
putObject() now returns an Object.
New Lua function:
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.
Score Tracker https://steamcommunity.com/sharedfiles/filedetails/?id=1415879101 Dice Roller https://steamcommunity.com/sharedfiles/filedetails/?id=1393821479
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.
vr_left_hand_pad_down_bindable vr_left_hand_pad_down_zoom vr_left_hand_zoom_scale vr_right_hand_pad_down_bindable vr_right_hand_pad_down_zoom vr_right_hand_zoom_scale
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.
New console commands:
vr_card_in_hand vr_laser_beam_opacity vr_laser_beam_visible vr_mode_icon_colored vr_thumbstick_icons_constant vr_thumbstick_repeat_duration vr_trigger_activates_laser vr_trigger_activates_ui
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: https://api.tabletopsimulator.com/
Read about the new VR Controls at the bottom of the patch notes!
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' (...you can then hit right control to toggle)
Grip buttons now let you move (holding one controller) or rotate/scale (holding both). Holding any grip button will display control layout.
-vr_controls_original vr_unbind_all 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.
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!
Added hotkeys to toggle UI elements on and off:
Callback function has property with keys string url, bool is_done, float download_progress, float upload_progress, bool is_error, string error, string text.
This tiny update was mainly to get VR and Touch working again after the slight downtime with v10.0. Thanks for your patience!
Hey everyone, v10.0 will be our largest patch ever added to the game! This update’s focus was on completely rewriting and optimizing the netcode on Tabletop Simulator to help solve a lot of the connection issues. If you helped us test on the beta, thank you very much for your input as we needed all the extra testing we could get to ensure things were cleaned up smoothly. This is a major update, so if you encounter any issues, please let us know on our forums with as much detail as possible before we head into the holidays.
And finally, we have made a few UI improvements which we hope you like. The main menu has changed for simplicity and to match the rest of the UI, and the host options menu has been split into Game, Server and Permissions. We’ve added some additional features to these menus as well. VR and Touch is currently not working in this update, but we plan on adding it back in very shortly. Please be sure to post your feedback and suggestions on our forums.