Я думаю, что ваша проблема может быть в том, что вы изменяете значение лидера на вашем клиенте, а не на сервере в вашем первом скрипте. Сервер не знает об этом изменении и не будет учитывать его при выполнении другого обновления значения Coins.
Вместо этого вам следует изменить значение Coins в обработчике событий ShopBuy, который вы вызываете в своем первом скрипт.
Обновлено:
Я думаю, что ваше решение взято из учебника, в котором есть шаги на YouTube ... Я не прошел через них, но я бы попробовал следующее:
В клиентском скрипте под кнопкой покупки избавьтесь от строки, которая меняет деньги, и вместо этого отправьте значение цены на сервер:
game.ReplicatedStorage.ShopBuy:FireServer(tool.Value,price.Value)
В скрипте сервера ShopBuy измените обратный вызов подпись для включения этого нового параметра, например:
game.ReplicatedStorage.ShopBuy.OnServerEvent:Connect(function(player,tool,price)
, а затем добавьте строку для вычета денег в эту функцию:
player.leaderstats.Money.Value = layer.leaderstats.Money.Value - price
Подумайте об этом. Сервер выполняет команду, чтобы сделать вычет сейчас, так что все клиенты будут знать об этом.
Еще одно замечание: если вы создадите «IntValue» внутри каждого инструмента, который содержит его цену Вам не нужно отправлять цену от клиента на сервер.