public static void Update()
        {
            try {
                if (NeedsNewGameInit)
                {
                    NewGameInit();
                }

                if (!SkipListeners)
                {
                    // We do ToArray here so we can change the hashset while we are looping.
                    foreach (var state in TickingUberStates.ToArray())
                    {
                        // Maybe change this to use our own cache lookup?
                        var value = InterOp.get_uber_state_value(state.GroupID, state.ID);
                        InterOp.set_uber_state_value(state.GroupID, state.ID, value + 1);
                    }
                }

                if (FullSyncNextUpdate)
                {
                    FullSyncNextUpdate = false;
                    Randomizer.Client.SendBulk(SyncedUberStates.Where(uid => uid.State() != null).ToDictionary(uid => uid, (uid) => uid.State().ValueAsFloat()));
                    var bad = SyncedUberStates.Where(uid => uid.State() == null).ToList();
                    foreach (var baduid in bad)
                    {
                        SyncedUberStates.Remove(baduid);
                    }
                }
                while (Randomizer.Client.UberStateQueue.TryTake(out var stateUpdate))
                {
                    var(id, val) = stateUpdate.FromNet();
                    if (id.State().ValueAsFloat() != val)
                    {
                        InterOp.set_uber_state_value(id.GroupID, id.ID, val);
                    }
                }
            }
            catch (Exception e) { Randomizer.Error("USC.Update", e, false); }
        }
 public static void HandleSyncedUberStateChange(UberId id, float value)
 {
     InterOp.set_uber_state_value(id.GroupID, id.ID, value);
 }
 public static bool Write(this UberState state, UberValue value)
 {
     state.Value = value;
     InterOp.set_uber_state_value(state.GroupID, state.ID, state.ValueAsFloat());
     return(true);
 }