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 https://tabletopsimulator.nolt.io/ !
ui_container_enter_indicator
console command / misc setting. https://tabletopsimulator.nolt.io/736group_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). https://tabletopsimulator.nolt.io/1594Show Hand-><color>
. https://tabletopsimulator.nolt.io/409container_logging
.quit
console command. https://tabletopsimulator.nolt.io/803spectator_show_game_ui
command to allow hiding of UI elements in spectator screen. https://tabletopsimulator.nolt.io/836deck_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. https://tabletopsimulator.nolt.io/860help -c
option for console command, which outputs all help text to the clipboard. https://tabletopsimulator.nolt.io/788framerate_custom_cap
command. https://tabletopsimulator.nolt.io/1708autosave_games_window_count
command / misc setting to control the number of slots on top Games window which may display an autosave. Defaults to 1. https://tabletopsimulator.nolt.io/1001onPlayerChatTyping(player, typing)
object.Container.Search(player, cards = -1)
- activate search window for player, optionally limited to top N cards.object.addContextMenu
changed: f(player_color)
is now f(player_color, object_position, object)
.object
parameter to onPlayerPing
eventplayer.showInfoDialog(info)
player.showConfirmDialog(info, callback)
f(player_color)
if user hits OK
.player.showInputDialog(description, default_text, callback)
f(text, player_color)
if user hits OK
.player.showMemoDialog(description, default_text, callback)
f(text, player_color)
if user hits OK
.player.showOptionsDialog(description, {options}, default_value, callback)
f(option_text, option_index, player_color)
if user hits OK
.player.showColorDialog({default_color}, callback)
f(color, player_color)
if user hits Apply
. https://tabletopsimulator.nolt.io/1343LuaPlayer.copy(objects)
and LuaPlayer.paste(position)
.zone.getObjects(true)
, which includes all objects in zone regardless of tags.addContextMenu
. https://tabletopsimulator.nolt.io/1646alt_view_angle
set it will use that angle when viewed in container search. https://tabletopsimulator.nolt.io/1575gizmo_selectable
for ObjectstryObjectEnter
/onObjectEnter
events. https://tabletopsimulator.nolt.io/778getObjectsWithTag
returning incorrect values. https://tabletopsimulator.nolt.io/1718Color.fromhex
not working when alpha was omitted. https://tabletopsimulator.nolt.io/1631object.hasAnyTag()
not working when a deck inherited its tags from its cards. https://tabletopsimulator.nolt.io/1593apply()
to trigger an update any change will automatically apply.getMaterials()
and getMaterialsInChildren()
functions to GameObject.
Materials function very similarly to Components:spectator_activate_with_resolution
not working correctly when used in autoexec. https://tabletopsimulator.nolt.io/885end_turn
command not working in hotseat mode. https://tabletopsimulator.nolt.io/726<
>
&
. https://tabletopsimulator.nolt.io/941objectEnterContainer
indicator cleanup.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: https://tabletopsimulator.nolt.io/roadmap
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 https://tabletopsimulator.nolt.io/
file_browser_native
and also added it to the misc settings menu.0
. https://tabletopsimulator.nolt.io/187end_turn
command. https://tabletopsimulator.nolt.io/130Added previous turn color player as second param for onPlayerTurn event.
Added Object.getZones() that returns all the zones that the object is interacting with. https://tabletopsimulator.nolt.io/219
Added onObject(Enter/Leave)Zone that works on all zones instead of just scripting zones. https://tabletopsimulator.nolt.io/85
Added support for all zones with getObjects(). https://tabletopsimulator.nolt.io/613
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). https://tabletopsimulator.nolt.io/28
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. https://tabletopsimulator.nolt.io/413
Fixed being unable to lua object.deal() to index hands greater than 1. https://tabletopsimulator.nolt.io/400
Fixed issue with on[Enter/Leave]ScriptingZone was firing multiple times in a row. https://tabletopsimulator.nolt.io/176
Fixed Book setHighlight()/clearHighlight() bug. https://tabletopsimulator.nolt.io/270
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. https://tabletopsimulator.nolt.io/536
Fixed issue with tryObjectEnter/tryObjectEnterContainer only firing for the first object dropped in a bag. https://tabletopsimulator.nolt.io/150
Fixed tryObjectEnter/tryObjectEnterContainer not being passed the object entering when the container was a stack. https://tabletopsimulator.nolt.io/477
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).
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.
Player.Action.Under (U)
Addresses:
value
summed according to their tags.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 https://tabletopsimulator.nolt.io/. 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.
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:
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.
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:
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.
End Turn
button now shows current player instead.Misc Settings
, detailed below.Misc Settings
.Spread
action in the right-click menu; spreads the cards out across the table. Distance between cards is set in Misc Settings
.tryRandomize(player_color)
and tryObjectRandomize(object, player_color)
for when someone tries to shuffle/roll/randomize an object. Returning false
will prevent randomization.onBlindfold(player, blindfolded)
event, triggered when a player puts on or takes off blindfold.object.alt_view_angle
property: when non-zero the Alt
view will use the specified Euler angle to look at the object.object.getPositionSmooth()
and object.getRotationSmooth()
return the current smooth move target and null if not moving.object.isDestroyed()
returns true if an object is (or will be) destroyed.object.tag
property: use object.type
instead.filter...
commands: now use prefix try...
. e.g. tryObjectEnter
.object.memo
, a string you can store info in on an object.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...})
Fixes:
object.getSnapPoints()
throwing when having no snap points.object.clone()
sound parameter not working.Grid.snapping
not working.showHotkeyConfig
working over network. Added color
parameter; dialog will be shown to that player.onObjectRandomize
and onRandomize
not returning correct player colour.Physics.cast
not returning list in correct order.Group
action ignoring tryObjectEnter
and tryObjectEnterContainer
.Misc Settings
above.language
, language_...
commands for selecting current language.translation_export
, translation_import
, translation_for...
commands for working on translations.translate
command to translate an English term into the current language (if TTS knows it).hotseat_name_...
, hotseat_start_turn
, and hotseat_end_turn
commands.pointer_position
command.lift_height
and rotation_degrees
commands.action_spread
and action_layout
commands.ui_clear
command to clear UI generated by other commands (e.g. ui_button
)Measure Movement
working on clients.Pan
key not working while holding a object (as long as it is not on the same binding as Flip
)Camera Hold Rotate
key not working while holding a object (as long as it is not on the same binding as Tap
)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!
Grid
units alongside Inches
and Metric
. Will measure according to the size of the grid.2D
/ 3D
modes. In 2D all measurements are flattened to the horizontal plane. In 3D height is included.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.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.Auto
mode, if you start measuring while holding an object (by holding tab
), it will measure from the pickup location.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.
Pure Mode
, a simpler view of the table, tunable in the Theme Editor. Supports all built-in tables.
object.measure_movement
- access the Measure Movement
object toggle.held_position_offset
position offset from pointer, lift height and object bounds still modify distance from surface.held_rotation_offset
rototation offset from pointer. This in combination with held_spin_index
and held_flip_index
determine rotation.held_spin_index
0-23 value, 15 degrees Y axis. Upside down is 12, right side up is 0. Changes when a player rotates.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.pick_up_position
The position the object was picked up at.pick_up_rotation
The rotation the object was picked up at.held_reduce_force
When the Object collides with something while moving this is automatically enabled and reduces the movement force.filterObjectEnter
and filterObjectEnterContainer
not working while game is loading.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.bind f action_search
, and then f
would open the search window.edit
command messing up {
}
characters.Hey everyone, hope you are all doing ok in these crazy times! We have another great update for you guys today that adds a brand new tool called Attach which lets you stick objects together. We also have a much needed performance optimization on the server browser due to all the new players joining us! Welcome everyone new hope you all our enjoying the game! We have a ton more below in the full patch notes.
Search inputs are now more powerful (applies to Server Browser and in-game Search dialog).
Example: gloom -fantasy, scythe, -casual will find any servers with "gloom" (but not "fantasy") or "scythe", so long as they do not contain "casual".
Special thanks to modzero for helping us track down a security vulnerability that we hotfixed.
UI Fixed a bunch of bad interactions between 2D XML UI, 3D XML UI, the normal UI, and invisible objects. Everything should now behave as you would expect.
Object values
Allows objects to behave similarly to poker chips: when set, the object will display its value when hovered over, and if multiple objects which share a flag are selected the total value will be displayed.
object.value - integer value of object.
object.value_flags - flags for object values.
Book objects (e.g. PDFs)
book.page_offset - Offset virtual book numbers are from numbers rendered on pages.
book.getPage(offsetPageNumbering = false) - Get current page. If offsetPageNumber is true then factor in the page_offset.
setPage(page, offsetPageNumbering = false) - Set current page.
setHighlight(x1, y1, x2, y2) - Set highlight box on current page.
clearHighlight() - Clear highlight.
Browser objects (e.g. Tablet)
browser.url - URL which currently wants to display.
browser.pixel_width - The pixel width the browser is virtually rendering to.
Attach Tool To go along with the new Attach tool there is new Object functions available to create these bindings in script.
object.addChild(Object) - The Object supplied as param is destroyed and becomes a dummy Object child.
object.removeChild(index) - Use getChildren to find out the index property.
object.removeChildren() - Detaches the children of this Object.
object.destroyChildren() - Destroys the children objects without detaching them.
object.getChildren() - Returns a table in the same format as getObjects() for containers.
Grid Global Class Grid options menu is now available to scripting as Grid.show_lines = true
int type
bool show_lines
Color color
float opacity
bool thick_lines
float offsetX
float offsetY
float sizeX
float sizeY
Misc
object.drag_selectable - Drag Selectable toggle of object.
object.getSelectingPlayers() - Returns table of players currently selecting the object.
object.addToPlayerSelection(player_color) - Add object to player's selection.
object.removeFromPlayerSelection(player_color) - Remove object from player's selection.
player.clearSelectedObjects() - Clears a player's current selection.
Fixes: Fixed log not outputing to external API.
System Console
cam_load, cam_load_zero, cam_save, cam_save_zero - Load and save camera positions.
dev_autoconfirm_browser_url_change - Disables browser page load confirmation. Use with caution!
hand_component_hotkey_draw - Controls whether objects which can go in hands will respond to the draw 1 hotkey.
load & save - Load and save games.
spectator_restrict_zoom - Restrict view of spectator zoom if object should be hidden to spectators.
spectator_show_zoom - Display alt-zoom in spectator window.
spectator_zoom_follows_pointer - Alt-zoom aopears at pointer position in spectator window.
spectator_zoom_position - Position on spectator window alt-zoom appears if above is turned off.
ui_context_menus_collapsed_height - Height of collapsed context menus.
ui_games_window - Visibiliy of Games window.
ui_server_browser_search - search text in Server Browser.
ui_server_browser_window - Visibility of Server Browser window.
zoom_position - Position on screen to display alt-zoom if above is disabled.
zoom_follows_pointer - Alt-zoom follows mouse pointer.
vr_tilt_mode, vr_tilt_angle - VR Tilt Mode toggle, and angle setting.
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.
Fixes:
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_custom
returning false too early.onObjectEnterContainer
only 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[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
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[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
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:
mod_caching
, mod_caching_raw
, mod_threading
, and mod_thread_count
.say_global
, say_game
, say_team
commands./
commands now work when typed into system console.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.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.
https://giant.gfycat.com/RightJointAchillestang.webm
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.
Example autoexec.cfg:
+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.
spectator_activate_with_resolution
command.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.
On-Screen Keyboard:
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
New Event
vr_teleport_with_pad
)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!
Scripting Improvements:
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)
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
Example autoexec
-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.