• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается RAGE Multiplayer.
    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Проблема TypeError: Cannot read property 'data' of undefined return mp.players.local.data.cash;

dereksjq

Участник портала
17 Июн 2023
64
10
20
Столкнулся с проблемой, что я не могу использовать data, getVariable для игрока.
Не знаю в чем проблема, спрашивал у чатГПТ, использовал его код - та же шляпа.
Может кто поможет разобраться в этом?

JavaScript:
rpc.register("getPlayerMoney", () => {
    return mp.players.local.data.cash;
})

Внезависимости, используя data.cash или getVariable - ошибка.

JavaScript:
    rpc.callServer("getPlayerMoney").then(cash => {
        browser.execute(`setPlayerMoney(${cash});`)
    }).catch(err => {
        console.error(err);
    });

UPD: при заходе человека на сервер ему устанавливается определенное кол-во денег, которые хорошо отображаются в консоли.

JavaScript:
mp.events.add('playerReady', (player) => {
    player.setVariable("defaultName", player.name)
    console.log("Player money's: " + player.getVariable('cash'))
})
 

kirillzver

Гуру
BackEnd developer
2 Ноя 2020
190
118
104
Мне кажется, что ты перепутал серверную и клиентскую стороны.

.setVariable есть только на сервере.
Данная функция запоминает на сервере информацию в формате "ключ":"значение" и передаёт её всем другим игрокам на клиент.

Например, вызвав её для игрока1 в таком ключе: setVariable("cash", 123);
Все другие игроки на клиенте будут знать, что у этого плеера есть cash со значением 123.
Это можно получить с помощью .getVariable("cash").
Точно также ты можешь получить это значение и на сервере вызвав у нужного игрока.

Что же касается .data, то через неё ты также можешь получить все установленные с помощью setVariable значения, но, ТОЛЬКО на сервере.
То-есть, на сервере ты можешь использовать player.data.cash вместо player.getVariable("cash"). При этом, я тебе советую пока забыть о такой возможности, чтобы не путаться.

Если подытожить, то твой код должен выглядеть так:

Серверная сторона:
JavaScript:
mp.events.add("playerReady", player => {
    player.setVariable("cash", 123)
})

Клиентская сторона:
JavaScript:
browser.execute(`setPlayerMoney(${mp.players.local.getVariable("cash")});`)

Если ты хочешь, чтобы данное значение автоматически обновлялось в браузере при каждом изменении, то тебе поможет mp.events.addDataHandler
С помощью него ты можешь подписаться на событие изменения конкретного значения в shared data.

Клиентская сторона:
JavaScript:
mp.events.addDataHandler("cash", value => {
    browser.execute(`setPlayerMoney(${value});`);
});

Также, хотел бы акцентировать внимание на том, что когда ты устанавливаешь значение через setVariable для игрока, то оно доступно ВСЕМ игрокам на сервере с клиента.
Например тому же cash нет смысла синхронизироваться со всеми клиентами, достаточно только владельцу, поэтому, ты можешь использовать setOwnVariable, который появился в 1.1 и аналогичен по синтаксису setVariable, за исключением того, что переданную информацию получит только клиент (игрок), которому она была присвоена.
 
Реакции: youngBeaver и dereksjq

dereksjq

Участник портала
17 Июн 2023
64
10
20
Мне кажется, что ты перепутал серверную и клиентскую стороны.

.setVariable есть только на сервере.
Данная функция запоминает на сервере информацию в формате "ключ":"значение" и передаёт её всем другим игрокам на клиент.

Например, вызвав её для игрока1 в таком ключе: setVariable("cash", 123);
Все другие игроки на клиенте будут знать, что у этого плеера есть cash со значением 123.
Это можно получить с помощью .getVariable("cash").
Точно также ты можешь получить это значение и на сервере вызвав у нужного игрока.

Что же касается .data, то через неё ты также можешь получить все установленные с помощью setVariable значения, но, ТОЛЬКО на сервере.
То-есть, на сервере ты можешь использовать player.data.cash вместо player.getVariable("cash"). При этом, я тебе советую пока забыть о такой возможности, чтобы не путаться.

Если подытожить, то твой код должен выглядеть так:

Серверная сторона:
JavaScript:
mp.events.add("playerReady", player => {
    player.setVariable("cash", 123)
})

Клиентская сторона:
JavaScript:
browser.execute(`setPlayerMoney(${mp.players.local.getVariable("cash")});`)

Если ты хочешь, чтобы данное значение автоматически обновлялось в браузере при каждом изменении, то тебе поможет mp.events.addDataHandler
С помощью него ты можешь подписаться на событие изменения конкретного значения в shared data.

Клиентская сторона:
JavaScript:
mp.events.addDataHandler("cash", value => {
    browser.execute(`setPlayerMoney(${value});`);
});

Также, хотел бы акцентировать внимание на том, что когда ты устанавливаешь значение через setVariable для игрока, то оно доступно ВСЕМ игрокам на сервере с клиента.
Например тому же cash нет смысла синхронизироваться со всеми клиентами, достаточно только владельцу, поэтому, ты можешь использовать setOwnVariable, который появился в 1.1 и аналогичен по синтаксису setVariable, за исключением того, что переданную информацию получит только клиент (игрок), которому она была присвоена.
Нет, скорее всего не перепутал. Вставил
browser.execute(setPlayerMoney(${mp.players.local.getVariable("cash")});)
в client_resources - все заработало. Спасибо.
 
Реакции: kirillzver

kirillzver

Гуру
BackEnd developer
2 Ноя 2020
190
118
104
Нет, скорее всего не перепутал. Вставил
browser.execute(setPlayerMoney(${mp.players.local.getVariable("cash")});)
в client_resources - все заработало. Спасибо.
Это и называется перепутал.
.data есть только на серверной стороне, а ты пытался использовать на клиентской.

Не бойся совершать ошибки, они лучше запоминаются, чем всё правильно написанное.
Главное, учись гуглить, а также понимать то, что тебе выдаёт консоль.

У JS разновидностей ошибок не так уж и много, можно запомнить.
Ты бы мог решить этот вопрос ещё раньше, если бы правильно прочитал то, что тебе указало в качестве ошибки:
"TypeError: Cannot read property 'data' of undefined return mp.players.local.data.cash;"
Черным по белому: "Невозможно прочитать 'data' у undefined".
Если присмотреться то ты пытаешься получить .data у .local. Ошибка говорит, что local равен undefined, это прямо значит, что local нет у players.
Вспоминаем, что local есть только на клиенте и приходим к выводу, что указанный код был написан на серверной стороне.