void LoadDataPlayer_Currency(GameObject player)
        {
            PlayerCurrencyComponent manager = player.GetComponent <PlayerCurrencyComponent>();

            foreach (TablePlayerCurrencies row in Query <TablePlayerCurrencies>("SELECT * FROM " + nameof(TablePlayerCurrencies) + " WHERE owner=?", player.name))
            {
                if (row.slot < manager.GetCapacity)
                {
                    if (String.IsNullOrWhiteSpace(row.name))
                    {
                        manager.AddEntry(null, row.slot, 0, 0);
                    }
                    else if (CurrencyTemplate.data.TryGetValue(row.name.GetDeterministicHashCode(), out CurrencyTemplate template))
                    {
                        manager.AddEntry(template, row.slot, row.value, row.timeStamp);
                    }
                    else
                    {
                        debug.LogWarning("[LoadData] Skipped currency " + row.name + " for " + player.name + " as it was not found in Resources.");
                    }
                }
                else
                {
                    debug.LogWarning("[LoadData] Skipped currency slot " + row.slot + " for " + player.name + " because it exceeds capacity " + manager.GetCapacity);
                }
            }
        }
        // -------------------------------------------------------------------------------
        // ThrottledUpdate
        // -------------------------------------------------------------------------------
        protected override void ThrottledUpdate()
        {
            if (!networkManager ||  networkManager.state != NetworkState.Game)
            {
                Hide();
            }
            else
            {
                Show();
            }

            if (!localPlayer)
            {
                return;
            }

            if (currencyManager == null)
            {
                currencyManager = localPlayer.GetComponent <PlayerCurrencyComponent>();
            }

            for (int i = 0; i < root.transform.childCount; i++)
            {
                GameObject.Destroy(root.transform.GetChild(i).gameObject);
            }

            int count = 0;

            foreach (CurrencySyncStruct _entry in currencyManager.GetEntries(true, SortOrder.Priority))
            {
                CurrencySyncStruct entry = _entry;

                GameObject go = GameObject.Instantiate(slotPrefab.gameObject);
                go.transform.SetParent(root.transform, false);

                go.GetComponent <UICurrencySlotHorizontal>().Init(ref entry);

                count++;

                if (maxEntries > 0 && count > maxEntries)
                {
                    break;
                }
            }
        }
        void SaveDataPlayer_Currency(GameObject player, bool isOnline)
        {
            // you should delete all data of this player first, to prevent duplicates
            DeleteDataPlayer_Currency(player.name);

            PlayerCurrencyComponent manager = player.GetComponent <PlayerCurrencyComponent>();

            List <CurrencySyncStruct> list = manager.GetEntries(false);

            for (int i = 0; i < list.Count; i++)
            {
                CurrencySyncStruct entry = list[i];

                InsertOrReplace(new TablePlayerCurrencies {
                    owner     = player.name,
                    name      = entry.name,
                    slot      = entry.slot,
                    value     = entry.value,
                    timeStamp = entry.timeStamp
                });
            }
        }
        // -------------------------------------------------------------------------------
        // Init
        // -------------------------------------------------------------------------------
        public override void Init(ref CurrencySyncStruct _entry)
        {
            base.Init(ref _entry);

            currencyManager = localPlayer.GetComponent <PlayerCurrencyComponent>();

            if (entry.Valid)
            {
                if (backgroundImage)
                {
                    backgroundImage.sprite = entry.template.backgroundIcon;
                }

                if (borderImage)
                {
                    borderImage.sprite = entry.template.rarity.borderImage;
                }


                image.sprite = entry.template.smallIcon;

                textValue.text = entry.value + "/" + entry.GetCapacity(localPlayer);
            }
        }
        void CreateDefaultDataPlayer_Currency(GameObject player)
        {
            PlayerCurrencyComponent manager = player.GetComponent <PlayerCurrencyComponent>();

            manager.CreateDefaultDataPlayer();
        }