====== Synchronizing the state of items ====== The position, rotation and scale of items are automatically synchronized by SubItem. In this page, we will explain how to synchronize other elements, such as on/off of a switch or a counter. As an example, we will switch the on/off state of a switch with onUse (pressing on the grip button while grabbing a SubItem). When the switch is off, change the color of the material 0 to white, when on, change the color of the material 0 to red. ---- ===== Method 1: use _ALL_ functions ====== Use _ALL_ functions to run commands on all users simultaneously. isRed = false -- not local function onUse() isRed = not isRed -- flip the true, false if isRed then vci.assets._ALL_SetMaterialColorFromIndex(0, Color.__new(1, 0, 0, 1)) -- Red else vci.assets._ALL_SetMaterialColorFromIndex(0, Color.__new(1, 1, 1, 1)) -- white end end It seems simple, but it doesn't work in the following situations * The color doesn't change on the user who joined the room in the middle of the session. * When another user grabbed the item and pressed the grip button (The variable holding the state of the color is in the original user; thus it won't be transferred with the ownership) ===== Method 2: Run the command on all users though Item Sync Variable ===== Use the [[en/vci/script/reference/exportstate|vci.state]]. if vci.assets.isMine then -- Initialize with the item spawn, only in the user who spawned it vci.state.Set('isRed', false) -- Initial value. `nil` is set if nothing is done to it end function onUse() local isRed = vci.state.Get('isRed') -- Acquire true or false local vci.state.Set('isRed', not isRed) -- Just change the state, not the actual color end function updateAll() -- Use updateAll because this needs to be run on every users. local isRed = vci.state.Get('isRed') -- Acquire the state. The item sync variable will be the same in all users (synced) local if isRed then vci.assets.SetMaterialColorFromIndex(0, Color.__new(1, 0, 0, 1)) -- Red else vci.assets.SetMaterialColorFromIndex(0, Color.__new(1, 1, 1, 1)) -- white end end ===== Which method to use ===== * _ALL_ can be used for one-shot, one-way usages like playing a short sound. * The item sync variable can be used for everything else