This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

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

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);
    }
});

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


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,576
972
181
35
Очень плохая идея, делать запрос в базу данных при каждом выстреле. Представь количество запросов, если к примеру 10 человек одновременно будет стрелять
 

podobaet

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

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,576
972
181
35
А зачем это в рендере делать? Используй ивент:

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

podobaet

Новый участник
8 Апр 2025
37
0
16
на вооружение взял, спасибо, но проблему с тем, что на автоматах не считываются выстрелы - не помогло..
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,513
2,209
208
36
this

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

nafanych!

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

podobaet

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

Inoi

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

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

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
нужно было быстрое решение.
+ статистика патрон сохраняется при выходе с сервера / выбрасывании оружия / поломке оружия
 

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,576
972
181
35
Если под быстрым решением подразумевается - говнокод. Я вызываю полицию
 

Amazingevich

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

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

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

podobaet

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

XDeveluxe

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