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

Evolutionnn

Новый участник
3 Окт 2024
15
0
38
Привет, начал разработку своего сервера с нуля, интересно потыкать просто все это дело и покопаться.
Решил сделать кастомную систему здоровья, но почему-то, у меня не работает ни один из ивентов. Я пытался сделать как на клиентской так и на серверной части, пробовал все - но ничего не помогло.
В идеале мне нужен такой ивент который будет работать и при получении урона от оружия, от получения урона если ты попал в ДТП, упал с высоты и т.п и т.д, то есть от всего и сразу.
Вот код.

Сервер -
JavaScript:
mp.events.add("playerDamage", (player, healthLoss, armorLoss) =>
{
   player.outputChatBox("playerDamage");
});

Клиент:
JavaScript:
mp.events.add('incomingDamage', (sourceEntity, sourcePlayer, targetEntity, weapon, boneIndex, damage) => {

        mp.gui.chat.push("Incoming Damage");

});



mp.events.add('outgoingDamage', (sourceEntity, targetEntity, sourcePlayer, weapon, boneIndex, damage) => {

        mp.gui.chat.push("outgoingDamage");

});



mp.events.add("playerReady", (player) =>

{

   mp.game.weapon.setEnableLocalOutgoingDamage(true);

   mp.gui.chat.push("Должно работать!!!!");

});

Если что, я подключил все файлы, на клиентской стороне ивент playerReady работает, а остальные почему-то - нет
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,929
293
100
Привет! В RAGE:MP события урона работают не всегда как ожидается, особенно для разных типов урона (падения, ДТП и т.д.). Ивенты playerDamage на сервере и incomingDamage на клиенте действительно должны срабатывать, но:

1. Убедись, что у клиента включена обработка локального урона через
mp.game.weapon.setEnableLocalOutgoingDamage(true); — ты это сделал, отлично.
2. Для падений и ДТП возможны ограничения, и такие типы урона не всегда генерируют эти события. Проверь, не блокируется ли урон скриптами или настройками.
3. Попробуй подписаться на событие entityDamaged на клиенте, это универсальный ивент, который ловит любой урон по сущности. Пример:
Код:
mp.events.add('entityDamaged', (entity, attacker, weaponHash, healthLoss) => {  
    if (entity.type === 'player' && entity === mp.players.local) {
        mp.gui.chat.push(`Урон: ${healthLoss}, от оружия: ${weaponHash}`);
    }
});
4. Проверь версию RAGE:MP и обнови, если есть новые патчи — там исправляют работу некоторых ивентов.

Если нужна универсальная система урона — можно периодически проверять здоровье игрока в тике и сравнивать с предыдущим значением, чтобы отследить любое изменение.

Удачи с сервером! Если есть вопросы — пиши.
 

🐝 ubees

Мастер
BackEnd developer
11 Фев 2023
1,091
185
134
41
JavaScript:
let lastHealth = 100;
let lastArmour = 0;

setInterval(() => {
    if (!mp.players.local) return;

    let currentHealth = mp.players.local.getHealth();
    let currentArmour = mp.players.local.getArmour();

    if (currentHealth < lastHealth || currentArmour < lastArmour) {
        let healthLoss = lastHealth - currentHealth;
        let armourLoss = lastArmour - currentArmour;

        let damageSource = "unknown";
      
        // от оружия
        if (mp.game.invoke('0x8DECB02F88F428BC', mp.players.local.handle, 0)) { // HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED
            damageSource = "weapon";
        }

        //от тачки
        else if (mp.game.invoke('0xE38CB9D7D39FDBCC', mp.players.local.handle, 0)) { // HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE
            damageSource = "vehicle";
        }

        //если упал
        else if (mp.game.invoke('0x47B44C99AA5497A0', mp.players.local.handle)) { // IS_PED_FALLING
            damageSource = "falling";

        }

        mp.gui.chat.push(`[CLIENT] Урон: ${damageSource}`);
        mp.events.callRemote('playerDamage', healthLoss, armourLoss, damageSource);

    }

    lastHealth = currentHealth;

    lastArmour = currentArmour;

}, 100);


сервер

JavaScript:
mp.events.add('playerDamage', (player, healthLoss, armourLoss, source) => {

    if (!player || !mp.players.exists(player)) return;
    player.outputChatBox(`Урон от ${source}: -${healthLoss} HP`);

    switch(source) {

        case "falling":
            player.health += Math.floor(healthLoss * 0.5);
            player.outputChatBox("Урон от падения 50%!");
            break;

        case "vehicle":
            player.outputChatBox("Жесткое ДТП!");
            break;

    }

});
 
Последнее редактирование:

Evolutionnn

Новый участник
3 Окт 2024
15
0
38
JavaScript:
let lastHealth = 100;
let lastArmour = 0;

setInterval(() => {
    if (!mp.players.local) return;

    let currentHealth = mp.players.local.getHealth();
    let currentArmour = mp.players.local.getArmour();

    if (currentHealth < lastHealth || currentArmour < lastArmour) {
        let healthLoss = lastHealth - currentHealth;
        let armourLoss = lastArmour - currentArmour;

        let damageSource = "unknown";
     
        // от оружия
        if (mp.game.invoke('0x8DECB02F88F428BC', mp.players.local.handle, 0)) { // HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED
            damageSource = "weapon";
        }

        //от тачки
        else if (mp.game.invoke('0xE38CB9D7D39FDBCC', mp.players.local.handle, 0)) { // HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE
            damageSource = "vehicle";
        }

        //если упал
        else if (mp.game.invoke('0x47B44C99AA5497A0', mp.players.local.handle)) { // IS_PED_FALLING
            damageSource = "falling";

        }

        mp.gui.chat.push(`[CLIENT] Урон: ${damageSource}`);
        mp.events.callRemote('playerDamage', healthLoss, armourLoss, damageSource);

    }

    lastHealth = currentHealth;

    lastArmour = currentArmour;

}, 100);


сервер

JavaScript:
mp.events.add('playerDamage', (player, healthLoss, armourLoss, source) => {

    if (!player || !mp.players.exists(player)) return;
    player.outputChatBox(`Урон от ${source}: -${healthLoss} HP`);

    switch(source) {

        case "falling":
            player.health += Math.floor(healthLoss * 0.5);
            player.outputChatBox("Урон от падения 50%!");
            break;

        case "vehicle":
            player.outputChatBox("Жесткое ДТП!");
            break;

    }

});
Бро, у меня почему-то не вызывается playerDamage, он не работает вообще никак. Я только что с другом тестировал, сообщений не отправляет даже
 

🐝 ubees

Мастер
BackEnd developer
11 Фев 2023
1,091
185
134
41

🐝 ubees

Мастер
BackEnd developer
11 Фев 2023
1,091
185
134
41
Клиент (client_packages/damage.js):
JavaScript:
let lastHealth = 100;
let lastArmour = 0;

mp.events.add('render', () => {
    const localPlayer = mp.players.local;
    if (!localPlayer) return;

    let currentHealth = localPlayer.getHealth();
    let currentArmour = localPlayer.getArmour();

    let normalizedHealth = currentHealth - 100;
    let normalizedLastHealth = lastHealth - 100;

    if (normalizedHealth < normalizedLastHealth || currentArmour < lastArmour) {
        let healthLoss = normalizedLastHealth - normalizedHealth;
        let armourLoss = lastArmour - currentArmour;

        let damageSource = "unknown";

        try {
            if (mp.game.invoke('0x605F96E8B4B380E8', localPlayer.handle)) {
                damageSource = "weapon";
            }
            else if (mp.game.invoke('0xDFD2E538DB43D9E2', localPlayer.handle)) {
                damageSource = "vehicle";
            }
            else if (mp.game.invoke('0xFB92A102F1C4DFA3', localPlayer.handle)) {
                damageSource = "falling";
            }
        } catch (e) {
            mp.gui.chat.push(`[ERROR] ${e.message}`);
        }

        mp.gui.chat.push(`[CLIENT] Урон: ${damageSource} | HP: -${healthLoss} | Armour: -${armourLoss}`);

        mp.events.callRemote('playerDamage',
            healthLoss.toString(),
            armourLoss.toString(),
            damageSource
        );

        try {
            mp.game.invoke('0xA72CD9CA4130C21F', localPlayer.handle);
        } catch (e) {}
    }

    lastHealth = currentHealth;
    lastArmour = currentArmour;
});

mp.events.add('playerSpawn', () => {
    lastHealth = mp.players.local.getHealth();
    lastArmour = mp.players.local.getArmour();
});

Сервер (packages/mypackage/damage_server.js):

JavaScript:
mp.events.add('playerDamage', (player, healthLoss, armourLoss, source) => {
    if (!player || !mp.players.exists(player)) return;

    healthLoss = parseInt(healthLoss) || 0;
    armourLoss = parseInt(armourLoss) || 0;

    player.outputChatBox(`Урон от ${source}: -${healthLoss} HP, -${armourLoss} Armour`);

    switch (source) {
        case "falling":
            player.health += Math.floor(healthLoss * 0.5);
            player.outputChatBox("Урон от падения снижен на 50%!");
            break;
        case "vehicle":
            player.outputChatBox("Жесткое ДТП!");
            break;

    }
});
попробуй этот через рендер

Код:
HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED - 0x605F96E8B4B380E8
HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE - 0xDFD2E538DB43D9E2
IS_PED_FALLING - 0xFB92A102F1C4DFA3
CLEAR_ENTITY_LAST_DAMAGE_ENTITY - 0xA72CD9CA4130C21F
 
Последнее редактирование:

Evolutionnn

Новый участник
3 Окт 2024
15
0
38
Клиент (client_packages/damage.js):
JavaScript:
let lastHealth = 100;
let lastArmour = 0;

mp.events.add('render', () => {
    const localPlayer = mp.players.local;
    if (!localPlayer) return;

    let currentHealth = localPlayer.getHealth();
    let currentArmour = localPlayer.getArmour();

    let normalizedHealth = currentHealth - 100;
    let normalizedLastHealth = lastHealth - 100;

    if (normalizedHealth < normalizedLastHealth || currentArmour < lastArmour) {
        let healthLoss = normalizedLastHealth - normalizedHealth;
        let armourLoss = lastArmour - currentArmour;

        let damageSource = "unknown";

        try {
            if (mp.game.invoke('0x605F96E8B4B380E8', localPlayer.handle)) {
                damageSource = "weapon";
            }
            else if (mp.game.invoke('0xDFD2E538DB43D9E2', localPlayer.handle)) {
                damageSource = "vehicle";
            }
            else if (mp.game.invoke('0xFB92A102F1C4DFA3', localPlayer.handle)) {
                damageSource = "falling";
            }
        } catch (e) {
            mp.gui.chat.push(`[ERROR] ${e.message}`);
        }

        mp.gui.chat.push(`[CLIENT] Урон: ${damageSource} | HP: -${healthLoss} | Armour: -${armourLoss}`);

        mp.events.callRemote('playerDamage',
            healthLoss.toString(),
            armourLoss.toString(),
            damageSource
        );

        try {
            mp.game.invoke('0xA72CD9CA4130C21F', localPlayer.handle);
        } catch (e) {}
    }

    lastHealth = currentHealth;
    lastArmour = currentArmour;
});

mp.events.add('playerSpawn', () => {
    lastHealth = mp.players.local.getHealth();
    lastArmour = mp.players.local.getArmour();
});

Сервер (packages/mypackage/damage_server.js):

JavaScript:
mp.events.add('playerDamage', (player, healthLoss, armourLoss, source) => {
    if (!player || !mp.players.exists(player)) return;

    healthLoss = parseInt(healthLoss) || 0;
    armourLoss = parseInt(armourLoss) || 0;

    player.outputChatBox(`Урон от ${source}: -${healthLoss} HP, -${armourLoss} Armour`);

    switch (source) {
        case "falling":
            player.health += Math.floor(healthLoss * 0.5);
            player.outputChatBox("Урон от падения снижен на 50%!");
            break;
        case "vehicle":
            player.outputChatBox("Жесткое ДТП!");
            break;

    }
});
попробуй этот через рендер

Код:
HAS_ENTITY_BEEN_DAMAGED_BY_ANY_PED - 0x605F96E8B4B380E8
HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE - 0xDFD2E538DB43D9E2
IS_PED_FALLING - 0xFB92A102F1C4DFA3
CLEAR_ENTITY_LAST_DAMAGE_ENTITY - 0xA72CD9CA4130C21F
В общем, вот на видео все показано как я подключил и т.п. Возможно у меня руки кривые, не спорю.
Но, почему-то в любом случае не работает :(
К тому-же, у меня вылетают какие-то ошибки, если я правильно понял - хэш указан неправильно, возможно из-за этого, сейчас попробую пофиксить
 

Evolutionnn

Новый участник
3 Окт 2024
15
0
38
В общем, в trycatch я хэш заменил на 0x8E17DDD6B9D5BF29, теперь ошибок нету, но в любом случае серверный ивент не работает почему-то
 

🐝 ubees

Мастер
BackEnd developer
11 Фев 2023
1,091
185
134
41