• Из-за обновления 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) последний раз были обновлены:

Проблема Не считывается выстрел из штурмовой винтовки

podobaet

Новый участник
8 Апр 2025
37
0
16
Есть скрипт, который триггерится при выстреле, чтобы изменять количество имеющихся патронов в БД, но сталкиваюсь с тем, что когда игрок стреляет из боевого пистолета (WEAPON_COMBATPISTOL), все срабатывает корректно, но когда из штурмовой винтовки (WEAPON_ASSAULTRIFLE
), не происходит триггер. Каким методом можно изменить это так, чтобы считывался выстрел из штурмовой винтовки?

на клиенте так:
JavaScript:
let lastAmmoCount = 0;

mp.events.add('render', () => {
    const weaponHash = mp.game.weapon.getSelectedPed(mp.players.local.handle);
    if (weaponHash !== 0) {
        const ammoCount = mp.game.weapon.getAmmoInPed(mp.players.local.handle, weaponHash);
        if (ammoCount < lastAmmoCount) {
            mp.events.callRemote('inventory:shotFired', weaponHash);
        }
        lastAmmoCount = ammoCount;
    }
});

на сервере применяется такой ивент:
JavaScript:
mp.events.add('inventory:shotFired', async (player, weaponHash) => {
    try {
        const data = playerInventories.get(player.id);
        if (!data) return;

        const weaponItem = data.items.find(item =>
            item.weaponHash && mp.joaat(item.weaponHash) === weaponHash
        );
        if (!weaponItem) return;

        console.log("inventory weapon:", weaponItem.weaponHash, "joaat:", mp.joaat(weaponItem.weaponHash));

        const ammoItem = data.items.find(it =>
            it.type === 'ammo' &&
            it.ammoType === weaponItem.ammoType &&
            it.quantity > 0
        );

        if (!ammoItem) {
            player.removeWeapon(weaponHash);
            return;
        }

        ammoItem.quantity = Math.max(0, ammoItem.quantity - 1);

        const [affected] = await InventoryItems.update(
            { Quantity: ammoItem.quantity },
            { where: { Id: ammoItem.id } }
        );

        if (affected === 0) {
            console.error(`Не удалось обновить патроны для ${ammoItem.id}`);
        }

        const idx = data.items.findIndex(it => it.id === ammoItem.id);
        if (idx !== -1) data.items[idx].quantity = ammoItem.quantity;

        sendInventoryToClient(player);

    } catch (err) {
        console.error('[inventory:shotFired] Ошибка:', err);
    }
});

В консоль на вывод получаем следующее:
1762690718736.png


upd.: в принципе есть предположение, что на текущая реализация срабатывает только на пистолеты, т.к. выстрел из WEAPON_PISTOL триггерит ивент, а WEAPON_MINISMG нет
 
Последнее редактирование:

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,650
262
100
Попробуйте изменить часть кода на сервере, где происходит сравнение weaponHash, сделав проверку на соответствие weaponHash с штурмовой винтовкой (WEAPON_ASSAULTRIFLE), чтобы корректно обрабатывать выстрелы из этого оружия.
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,575
970
181
35
Очень плохая идея, делать запрос в базу данных при каждом выстреле. Представь количество запросов, если к примеру 10 человек одновременно будет стрелять
 

podobaet

Новый участник
8 Апр 2025
37
0
16
Очень плохая идея, делать запрос в базу данных при каждом выстреле. Представь количество запросов, если к примеру 10 человек одновременно будет стрелять
Я думал над альтернативной реализацией, но так к этому и не пришел.. Мозговой штурм конечно бы провести стоит, но пока что меня больше интересует, что не на всё оружие игра регистрирует выстрелы
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,575
970
181
35
Я думал над альтернативной реализацией, но так к этому и не пришел.. Мозговой штурм конечно бы провести стоит, но пока что меня больше интересует, что не на всё оружие игра регистрирует выстрелы
А зачем это в рендере делать? Используй ивент:

Код:
mp.events.add('playerWeaponShot', (targetPosition: Vector3Mp, targetEntity: EntityMp) => {
...
}
 

podobaet

Новый участник
8 Апр 2025
37
0
16
А зачем это в рендере делать? Используй ивент:

Код:
mp.events.add('playerWeaponShot', (targetPosition: Vector3Mp, targetEntity: EntityMp) => {
...
}
на вооружение взял, спасибо, но проблему с тем, что на автоматах не считываются выстрелы - не помогло..
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,513
2,209
208
36
Очень плохая идея, делать запрос в базу данных при каждом выстреле. Представь количество запросов, если к примеру 10 человек одновременно будет стрелять
this

это тупа худшая идея что можно себе представить ваще ес че
 

nafanych!

naffanch
BackEnd developer
FrontEnd developer
25 Ноя 2023
308
59
65
я кстати делал похожую тему, ток у меня реализовано по другому)
первый выстрел сохраняет кол-во патрон в базу данных сразу, потом идет КД в 20 секунд. после 20 секунд если он еще раз стрельнет - оно сразу в бд сохранит новые патроны
 

podobaet

Новый участник
8 Апр 2025
37
0
16
я кстати делал похожую тему, ток у меня реализовано по другому)
первый выстрел сохраняет кол-во патрон в базу данных сразу, потом идет КД в 20 секунд. после 20 секунд если он еще раз стрельнет - оно сразу в бд сохранит новые патроны
Надо будет честно спиз.. вдохновиться этой идей. Но с проблемой, что не со всего оружия считываются выстрелы ты не сталкивался?
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,513
2,209
208
36
я кстати делал похожую тему, ток у меня реализовано по другому)
первый выстрел сохраняет кол-во патрон в базу данных сразу, потом идет КД в 20 секунд. после 20 секунд если он еще раз стрельнет - оно сразу в бд сохранит новые патроны
а зачем?
почему нельзя держать какой то класс-контейнер оружия и патронов в памяти синкать бд только по событиям, которые действительно что-то значат?
выход из игры там, смерть, сейв инвентаря

ну апдейт на каждый выстрел это просто скл-суицид буквально, это просто пизда какая хуёвая идея
у тебя на десяти людях будет под тысячу апдейтов и таблица просто не выйдет из фриза

20 секунд ес чесно туда же
а если чет выстрелит три, умрёт или выйдет? ты же потеряешь состояние
это же десинк, ты заливаешь "приблизительную" правду всё время
вместо того чтобы фиксировтаь события в памяти мгновенно, а базу использовать как периодическое хранилище снэпшотов состояния
 

podobaet

Новый участник
8 Апр 2025
37
0
16
Чтобы что-то изменить, должна быть возможность это проверять. И сейчас происходит так, как и ранее описано было, что не считываются выстрели со всего оружия. С пистолетов считываются, с СМГ и автоматических винтовок - нет. Как это можно зафиксить?
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,513
2,209
208
36
Чтобы что-то изменить, должна быть возможность это проверять. И сейчас происходит так, как и ранее описано было, что не считываются выстрели со всего оружия. С пистолетов считываются, с СМГ и автоматических винтовок - нет. Как это можно зафиксить?
судя по тому что ты говоришь, вполне может быть что например есть делей чтобы не считать каждый патрон - это ну, избыточно слегка
а смг отличается от пестика скоростью стрельбы, прально
ну в теории
а может быть просто раге момент

гуглятся варианты с mp.players.local.getWeaponAmmo(weapon_hash); например и нативка 0x015A522136D7F951


Код:
    let Ammo = mp.game.invoke(
      "0x015A522136D7F951",
      mp.players.local.handle,
      mp.players.local.weapon
    );

как вариант
 

nafanych!

naffanch
BackEnd developer
FrontEnd developer
25 Ноя 2023
308
59
65
а зачем?
почему нельзя держать какой то класс-контейнер оружия и патронов в памяти синкать бд только по событиям, которые действительно что-то значат?
выход из игры там, смерть, сейв инвентаря

ну апдейт на каждый выстрел это просто скл-суицид буквально, это просто пизда какая хуёвая идея
у тебя на десяти людях будет под тысячу апдейтов и таблица просто не выйдет из фриза

20 секунд ес чесно туда же
а если чет выстрелит три, умрёт или выйдет? ты же потеряешь состояние
это же десинк, ты заливаешь "приблизительную" правду всё время
вместо того чтобы фиксировтаь события в памяти мгновенно, а базу использовать как периодическое хранилище снэпшотов состояния
нужно было быстрое решение.
+ статистика патрон сохраняется при выходе с сервера / выбрасывании оружия / поломке оружия
 

Amazingevich

Высший разум
BackEnd developer
27 Апр 2021
915
527
164
Чтобы что-то изменить, должна быть возможность это проверять. И сейчас происходит так, как и ранее описано было, что не считываются выстрели со всего оружия. С пистолетов считываются, с СМГ и автоматических винтовок - нет. Как это можно зафиксить?
Ну ты обложил только сервер ивент, значит до него не доходит инфа.
Начни с клиента и посмотри удаётся ли получить оружие игрока.

Я не спец, но гугл говорит что есть еще аналог в виде (если не получается получить хэш)
Код:
let weaponHash = mp.game.invoke('0x0A6DB4965674D243', mp.players.local.handle);
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,575
970
181
35
нужно было быстрое решение.
+ статистика патрон сохраняется при выходе с сервера / выбрасывании оружия / поломке оружия
Если под быстрым решением подразумевается - говнокод. Я вызываю полицию
 

Amazingevich

Высший разум
BackEnd developer
27 Апр 2021
915
527
164
так выше кусок с клиента.. При том что с пистолетами все работает нормально, а с СМГ, автоматами происходит затык
Ну ты пробовал его дебажить? Ты обложил только inventory:shotFired
А что творится в рендере посмотрел? Может у тебя не получается получить хэш оружия, может не получается по полученному хэшу получить патроны? А может быть у тебя количество патронов сохранилось со старого оружия и оно меньше, чем у текущего, поэтому ты не проходишь проверку перед inventory:shotFired?

Ну типо посмотри че на клиенте происходит и посмотри на каком моменте у тебя стопается логика и доходит ли дело вообще до inventory:shotFired

Это всё я пишу исходя из первого поста. У тебя проблема с рифлами, которых вот тут даже не наблюдается, я бы копал клиент
1762705066449.png
 

podobaet

Новый участник
8 Апр 2025
37
0
16
Ну ты пробовал его дебажить? Ты обложил только inventory:shotFired
А что творится в рендере посмотрел? Может у тебя не получается получить хэш оружия, может не получается по полученному хэшу получить патроны? А может быть у тебя количество патронов сохранилось со старого оружия и оно меньше, чем у текущего, поэтому ты не проходишь проверку перед inventory:shotFired?

Ну типо посмотри че на клиенте происходит и посмотри на каком моменте у тебя стопается логика и доходит ли дело вообще до inventory:shotFired

Это всё я пишу исходя из первого поста. У тебя проблема с рифлами, которых вот тут даже не наблюдается, я бы копал клиент
Посмотреть вложение 22730
Но почему тогда получается с пистолетами? С консоли и было выдрано, что с пистолетами все срабатывает, хэш и прочая передается, патроны тянутся корректно. Патроны и на прочее оружие тянутся корректно, но проблема в том, что когда с них стреляешь - не происходит триггер. И стрельба пробовалась по одному патрону - все равно нет триггера, когда как с пистолетами такой беды нет
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,121
1,836
211
28
Но почему тогда получается с пистолетами? С консоли и было выдрано, что с пистолетами все срабатывает, хэш и прочая передается, патроны тянутся корректно. Патроны и на прочее оружие тянутся корректно, но проблема в том, что когда с них стреляешь - не происходит триггер. И стрельба пробовалась по одному патрону - все равно нет триггера, когда как с пистолетами такой беды нет
Для этого и пробуют дебажить, чтобы понять вина ли в рейдже или в твоём исполнении.
Если playerWeaponShot срабатывает, а до тебя по итогу что-то не доходит, то ищи проблему в своём коде.
Если playerWeaponShot не срабатывает, то вопрос уже оборачивается иначе.
Но сколько я себя помню - не видел, чтобы playerWeaponShot не срабатывал, у меня на всех проектах он работал корректно.
 
Реакции: PercyBerkeley