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

Проблема Визуальная деформация машины через entityStreamIn для других клиентов пустой тачки

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
Здраствуйте,

На данный можент пытаюсь решить эту проблему с синхрой деформации на рейдже; если есть люди которые могут дать идеи и помочь буду рад. Спасибо.
Я пытаюсь использовать нативы vehicle.getDeformationAtPos(offsetX, offsetY, offsetZ); (или mp.invoke 0x4EC6CFBC7B2E9536) но одно их вызов уже носит вред(fatal error client side script...). Но есть ли у него эквивалент на Set а не Get ? Vehicle::SetDamage вроде изуально делает. Ну короче вы поняли пожалуйста помогите.

Спасибо
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
1,763
1,305
5
Привет!

Для изменения визуальной деформации машины через entityStreamIn, тебе нужно использовать vehicle.setDeformation. Однако, учти, что это может вызвать проблемы с производительностью или ошибками на стороне клиента, так что будь осторожен. Надеюсь, что это поможет тебе решить проблему. Удачи!
 

Robert_Easter

Активный участник
17 Июл 2024
103
13
28

Vermilion

Мастер
29 Сен 2021
973
750
151
34
Здраствуйте,

На данный можент пытаюсь решить эту проблему с синхрой деформации на рейдже; если есть люди которые могут дать идеи и помочь буду рад. Спасибо.
Я пытаюсь использовать нативы vehicle.getDeformationAtPos(offsetX, offsetY, offsetZ); (или mp.invoke 0x4EC6CFBC7B2E9536) но одно их вызов уже носит вред(fatal error client side script...). Но есть ли у него эквивалент на Set а не Get ? Vehicle::SetDamage вроде изуально делает. Ну короче вы поняли пожалуйста помогите.

Спасибо
На офиц. форуме видел где то ресурс с синхронизацией повреждений транспорта, посмотри там
 

Vermilion

Мастер
29 Сен 2021
973
750
151
34

Robert_Easter

Активный участник
17 Июл 2024
103
13
28

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
Ну вроде Vehicle_Set_Damage не визуально делает ты уверен что это визуальная повреждение ? И как его взять ведь нету Vehicle_Get_Damage - а есть только GetDeformationAtPos и он берет данные в другом формате каком то непонятном
 

DaVilka

Гуру
16 Сен 2020
709
259
128
Ну вроде Vehicle_Set_Damage не визуально делает ты уверен что это визуальная повреждение ? И как его взять ведь нету Vehicle_Get_Damage - а есть только GetDeformationAtPos и он берет данные в другом формате каком то непонятном
так работает скрипт который по ссылке, Vehicle_Get_Damage нету потому что Vehicle_Set_Damage это по сути сфера которая воздействует на точки деформации у тачки, по этому GetDeformationAtPos, она получает уровень деформации определенной точки. Скрипт выше по сути вычисляет точки деформации у тачки, получает их значения а потом рассчитывает так что бы с помощью Vehicle_Set_Damage воздействовать на эти точки у другого клиента похожим образом
 

Vermilion

Мастер
29 Сен 2021
973
750
151
34
По поводу офиц. форума ошибся, это просто видео, где кто то реализовал синхронизацию
 

DaVilka

Гуру
16 Сен 2020
709
259
128
По поводу офиц. форума ошибся, это просто видео, где кто то реализовал синхронизацию
да это же файвемовский скрипт который я выше скинул переписанный на рейдж
 
  • Like
Реакции: Vermilion

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
да это же файвемовский скрипт который я выше скинул переписанный на рейдж
Сорян но как это он переписан на рейдже у меня глаза не видят )) можешь скинуть пожалуйста ? я его скачал архив називается VehicleDeformation.zip но в нём всё в lua формате

PS : с ФайвМ никогда не работал
Ладно открыл щяс посмотрю спасибо но пока ничего нету
 
Последнее редактирование:

Vermilion

Мастер
29 Сен 2021
973
750
151
34
Сорян но как это он переписан на рейдже у меня глаза не видят )) можешь скинуть пожалуйста ? я его скачал архив називается VehicleDeformation.zip но в нём всё в lua формате

PS : с ФайвМ никогда не работал
Ладно открыл щяс посмотрю спасибо но пока ничего нету
Он имеет ввиду, что на видео переписанный скрипт
 

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
да это же файвемовский скрипт который я выше скинул переписанный на рейдж
Он имеет ввиду, что на видео переписанный скрипт
Я уже 4 часа над кодом, ничего не получился. Пожалуйста вгляните на код может я что то неправильно сделал ? но на самом деле я просто брат код с твоей рекомендации и заменил Ивенты файва с эквивалентами Рейджа; но почему ничего не происходит.Код запустается без ошибок.

Server side :
Код:
mp.events.add('storeVehicleDeformationState', (player, vehicleId, deformation) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setVariable('deformation', deformation);
    }
});


mp.events.add("VD:fixDeformation", (player, vehicleId) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setVariable('deformation', null);
    }
});


mp.events.add('fixVehicleDeformation', (player, vehicleId) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setFixed();
        vehicle.setVariable('deformation', null);
    }
});
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Client side :
Код:
const DEFORMATION_DAMAGE_THRESHOLD = 0.05;
const MAX_DEFORM_ITERATIONS = 50;
const DEFORMATION_UPDATE_INTERVAL = 1000;


let deformationUpdateTimers = {};


function getVehicleOffsetsForDeformation(vehicle) {
    const model = vehicle.model;
    const min = mp.game.gameplay.getModelDimensions(model).min;
    const max = mp.game.gameplay.getModelDimensions(model).max;
    const X = Math.round((max.x - min.x) * 0.5 * 100) / 100;
    const Y = Math.round((max.y - min.y) * 0.5 * 100) / 100;
    const Z = Math.round((max.z - min.z) * 0.5 * 100) / 100;
    const halfY = Math.round(Y * 0.5 * 100) / 100;


    return [
        new mp.Vector3(-X, Y, 0.0),
        new mp.Vector3(-X, Y, Z),
        new mp.Vector3(0.0, Y, 0.0),
        new mp.Vector3(0.0, Y, Z),
        new mp.Vector3(X, Y, 0.0),
        new mp.Vector3(X, Y, Z),
        new mp.Vector3(-X, halfY, 0.0),
        new mp.Vector3(-X, halfY, Z),
        new mp.Vector3(0.0, halfY, 0.0),
        new mp.Vector3(0.0, halfY, Z),
        new mp.Vector3(X, halfY, 0.0),
        new mp.Vector3(X, halfY, Z),
        new mp.Vector3(-X, 0.0, 0.0),
        new mp.Vector3(-X, 0.0, Z),
        new mp.Vector3(0.0, 0.0, 0.0),
        new mp.Vector3(0.0, 0.0, Z),
        new mp.Vector3(X, 0.0, 0.0),
        new mp.Vector3(X, 0.0, Z),
        new mp.Vector3(-X, -halfY, 0.0),
        new mp.Vector3(-X, -halfY, Z),
        new mp.Vector3(0.0, -halfY, 0.0),
        new mp.Vector3(0.0, -halfY, Z),
        new mp.Vector3(X, -halfY, 0.0),
        new mp.Vector3(X, -halfY, Z),
        new mp.Vector3(-X, -Y, 0.0),
        new mp.Vector3(-X, -Y, Z),
        new mp.Vector3(0.0, -Y, 0.0),
        new mp.Vector3(0.0, -Y, Z),
        new mp.Vector3(X, -Y, 0.0),
        new mp.Vector3(X, -Y, Z)
    ];
}


function applyDeformation(vehicle, deformation) {
    if (!mp.vehicles.exists(vehicle)) return;


    setTimeout(() => {
        if (!mp.vehicles.exists(vehicle)) return;


        if (deformation && deformation.length > 0) {
            setVehicleDeformation(vehicle, deformation);
        } else {
            vehicle.setFixed();
        }
    }, 500);
}


function getVehicleDeformation(vehicle) {
    if (!mp.vehicles.exists(vehicle)) return [];


    const offsets = getVehicleOffsetsForDeformation(vehicle);
    const deformationPoints = [];


    offsets.forEach(offset => {
        const dmg = Math.sqrt(
            Math.pow(vehicle.getDeformationAtPos(offset.x, offset.y, offset.z).x, 2) +
            Math.pow(vehicle.getDeformationAtPos(offset.x, offset.y, offset.z).y, 2) +
            Math.pow(vehicle.getDeformationAtPos(offset.x, offset.y, offset.z).z, 2)
        );


        if (dmg > DEFORMATION_DAMAGE_THRESHOLD) {
            deformationPoints.push({ offset, dmg });
        }
    });


    return deformationPoints;
}


function setVehicleDeformation(vehicle, deformationPoints) {
    if (!mp.vehicles.exists(vehicle)) return;


    let iteration = 0;
    let deform = true;


    const fDeformationDamageMult = vehicle.getHandling('fDeformationDamageMult');
    let damageMult = 20.0;


    if (fDeformationDamageMult <= 0.55) {
        damageMult = 1000.0;
    } else if (fDeformationDamageMult <= 0.65) {
        damageMult = 400.0;
    } else if (fDeformationDamageMult <= 0.75) {
        damageMult = 200.0;
    }


    while (deform && iteration < MAX_DEFORM_ITERATIONS) {
        deform = false;


        deformationPoints.forEach(def => {
            const dmg = Math.sqrt(
                Math.pow(vehicle.getDeformationAtPos(def.offset.x, def.offset.y, def.offset.z).x, 2) +
                Math.pow(vehicle.getDeformationAtPos(def.offset.x, def.offset.y, def.offset.z).y, 2) +
                Math.pow(vehicle.getDeformationAtPos(def.offset.x, def.offset.y, def.offset.z).z, 2)
            );


            if (dmg < def.dmg) {
                vehicle.setDamage(
                    def.offset.x * 2.0, def.offset.y * 2.0, def.offset.z * 2.0,
                    def.dmg * damageMult,
                    1000.0,
                    true
                );
                deform = true;
            }
        });


        iteration++;
    }
}


function isDeformationWorse(newDef, oldDef) {
    if (!oldDef || newDef.length > oldDef.length) {
        return true;
    } else if (newDef.length < oldDef.length) {
        return false;
    }


    for (let i = 0; i < newDef.length; i++) {
        let found = false;
        for (let j = 0; j < oldDef.length; j++) {
            if (newDef[i].offset.x === oldDef[j].offset.x &&
                newDef[i].offset.y === oldDef[j].offset.y &&
                newDef[i].offset.z === oldDef[j].offset.z) {


                found = true;
                if (newDef[i].dmg > oldDef[j].dmg) {
                    return true;
                }
            }
        }


        if (!found) {
            return true;
        }
    }


    return false;
}


function isDeformationEqual(newDef, oldDef) {
    if (oldDef == null && newDef == null) return true;
    if (oldDef == null || newDef == null || newDef.length !== oldDef.length) return false;


    for (let i = 0; i < newDef.length; i++) {
        if (newDef[i].dmg !== oldDef[i].dmg) {
            return false;
        }
    }


    return true;
}


function handleDeformationUpdate(vehicle) {
    if (!mp.vehicles.exists(vehicle)) return;


    if (!deformationUpdateTimers[vehicle.remoteId]) {
        deformationUpdateTimers[vehicle.remoteId] = true;


        setTimeout(() => {
            if (!mp.vehicles.exists(vehicle)) {
                deformationUpdateTimers[vehicle.remoteId] = false;
                return;
            }


            const deformation = getVehicleDeformation(vehicle);
            const currentDeformation = JSON.parse(vehicle.getVariable('deformation') || '[]');


            if (!isDeformationEqual(deformation, currentDeformation) && isDeformationWorse(deformation, currentDeformation)) {
                mp.events.callRemote('storeVehicleDeformationState', vehicle.remoteId, JSON.stringify(deformation));
            }


            deformationUpdateTimers[vehicle.remoteId] = false;
        }, DEFORMATION_UPDATE_INTERVAL);
    }
}


mp.events.add('playerLeaveVehicle', vehicle => {
    if (!vehicle) return;
    handleDeformationUpdate(vehicle);
});


mp.events.add('entityStreamIn', entity => {
    if (entity.type !== 'vehicle') return;


    setTimeout(() => {
        const deformation = entity.getVariable('deformation');
        if (deformation) {
            const parsedDeformation = JSON.parse(deformation);
            applyDeformation(entity, parsedDeformation);
        }
    }, 2000);
});


mp.events.add('playerEnterVehicle', (vehicle, seat) => {
    setTimeout(() => {
        if (vehicle.getPedInSeat(-1) === mp.players.local.handle) {
            const deformation = vehicle.getVariable('deformation');
            if (deformation) {
                const parsedDeformation = JSON.parse(deformation);
                applyDeformation(vehicle, parsedDeformation);
            }
        }
    }, 100);
});


mp.events.add("entityDamage", (entity, damage) => {
    if (entity.type === "vehicle") {
        handleDeformationUpdate(entity);
    }
});
 

Vermilion

Мастер
29 Сен 2021
973
750
151
34
Screenshot_3.png

Маловероятно, что за тебя кто то будет этим заниматься, можешь связаться с автором и купить за 80 евро

Screenshot_4.png
 
  • Like
Реакции: Robert_Easter

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
Посмотреть вложение 15598
Маловероятно, что за тебя кто то будет этим заниматься, можешь связаться с автором и купить за 80 евро

Посмотреть вложение 15599
Я уважаю его работу но у меня нету такой суммы это не США и я не тиктокер. Просто жаль что как в сампе такие вещи не автосинхранированы... Бедный Калькор
 

DaVilka

Гуру
16 Сен 2020
709
259
128
да тут дебажить надо, на глаз хрен поймешь. Я если сделаю то только на c#
 
  • Like
Реакции: Robert_Easter

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
да тут дебажить надо, на глаз хрен поймешь. Я если сделаю то только на c#
C# server side только ? я не знаю C# только на джаве всё делал ; но там серверская часть очень малинькая ; я думаю клиентка тупит. Я немного исправил вообщем щяс скажу кто что делает что б код не читать.
Client side :
getVehicleOffsetsForDeformation :
вот этот просто одинаковая копия функции в архиве который ты меня закинул; он просто берет размеры моделя тачки и по разным координатом(от разных сторон я думаю) и всё. 95 процент кода не менялся там только функция другая mp.game.gameplay.getModelDimensions.
getVehicleDeformation Использует нативку getDeformationAtPos что бы взять данные повреждении от машины. Оффсеты модели берутся от придедущей функции. Дамаг на float превращает.Тоже копия скрипта из Архива.
setVehicleDeformation Ну тут ставишь деформацию подробнее на https://gtamods.com/wiki/Handling.meta ищете fdefomationdamageMult и там всё описано.
IsDeformationWorse/Equal он через оффсеты проверяет есть ли деформация или нет. Ну там примерно. Опять я ничё не делал копия архива Файвема только на рейдже
handledeformationupdate Использует getVehicleDeformation и IsDeformationWorse/Equal сравниат крч

Server side :
Тупо перенаправляет данные тут нечего сказать

Вот я немного поменял; с этим скриптом начинает работать что то. Деформация на самом деле появляется на правильном месте но ни совсем похоже как надо. Пожалуйста помогите.

Client side:
Код:
const DEFORMATION_DAMAGE_THRESHOLD = 0.05;
const MAX_DEFORM_ITERATIONS = 50;


function getVehicleOffsetsForDeformation(vehicle) {
    const model = vehicle.model;
    const dimensions = mp.game.gameplay.getModelDimensions(model);
    const min = dimensions.min;
    const max = dimensions.max;


    const X = (max.x - min.x) * 0.5;
    const Y = (max.y - min.y) * 0.5;
    const Z = (max.z - min.z) * 0.5;


    return [
        new mp.Vector3(-X, Y, 0.0),
        new mp.Vector3(-X, Y, Z),
        new mp.Vector3(0.0, Y, 0.0),
        new mp.Vector3(0.0, Y, Z),
        new mp.Vector3(X, Y, 0.0),
        new mp.Vector3(X, Y, Z),
        new mp.Vector3(-X, Y * 0.5, 0.0),
        new mp.Vector3(-X, Y * 0.5, Z),
        new mp.Vector3(0.0, Y * 0.5, 0.0),
        new mp.Vector3(0.0, Y * 0.5, Z),
        new mp.Vector3(X, Y * 0.5, 0.0),
        new mp.Vector3(X, Y * 0.5, Z),
        new mp.Vector3(-X, 0.0, 0.0),
        new mp.Vector3(-X, 0.0, Z),
        new mp.Vector3(0.0, 0.0, 0.0),
        new mp.Vector3(0.0, 0.0, Z),
        new mp.Vector3(X, 0.0, 0.0),
        new mp.Vector3(X, 0.0, Z),
        new mp.Vector3(-X, -Y * 0.5, 0.0),
        new mp.Vector3(-X, -Y * 0.5, Z),
        new mp.Vector3(0.0, -Y * 0.5, 0.0),
        new mp.Vector3(0.0, -Y * 0.5, Z),
        new mp.Vector3(X, -Y * 0.5, 0.0),
        new mp.Vector3(X, -Y * 0.5, Z),
        new mp.Vector3(-X, -Y, 0.0),
        new mp.Vector3(-X, -Y, Z),
        new mp.Vector3(0.0, -Y, 0.0),
        new mp.Vector3(0.0, -Y, Z),
        new mp.Vector3(X, -Y, 0.0),
        new mp.Vector3(X, -Y, Z)
    ];
}


function getVehicleDeformation(vehicle) {
    if (!mp.vehicles.exists(vehicle)) return [];


    const offsets = getVehicleOffsetsForDeformation(vehicle);
    const deformationPoints = [];


    offsets.forEach(offset => {
        const damageVector = vehicle.getDeformationAtPos(offset.x, offset.y, offset.z);
        const dmg = Math.sqrt(damageVector.x ** 2 + damageVector.y ** 2 + damageVector.z ** 2);


        if (dmg > DEFORMATION_DAMAGE_THRESHOLD) {
            deformationPoints.push({ offset, dmg });
        }
    });


    return deformationPoints;
}


function applyDeformation(vehicle, deformation) {
    if (!mp.vehicles.exists(vehicle)) return;


    if (deformation && deformation.length > 0) {
        setVehicleDeformation(vehicle, deformation);
    } else {
        vehicle.setFixed();
    }
}


function setVehicleDeformation(vehicle, deformationPoints) {
    let iteration = 0;
    let deform = true;


    const deformationDamageMult = vehicle.getHandling('fDeformationDamageMult');
    let damageMult = deformationDamageMult > 0 ? deformationDamageMult * 100.0 : 0;


    while (deform && iteration < MAX_DEFORM_ITERATIONS) {
        deform = false;


        deformationPoints.forEach(def => {
            const damageVector = vehicle.getDeformationAtPos(def.offset.x, def.offset.y, def.offset.z);
            const dmg = Math.sqrt(damageVector.x ** 2 + damageVector.y ** 2 + damageVector.z ** 2);


            if (dmg < def.dmg) {
                vehicle.setDamage(def.offset.x, def.offset.y, def.offset.z, def.dmg * damageMult, 1000.0, true);
                deform = true;
            }
        });


        iteration++;
    }
}


function isDeformationWorse(newDef, oldDef) {
    if (!oldDef || newDef.length > oldDef.length) {
        return true;
    } else if (newDef.length < oldDef.length) {
        return false;
    }


    for (let i = 0; i < newDef.length; i++) {
        let found = false;
        for (let j = 0; j < oldDef.length; j++) {
            if (newDef[i].offset.x === oldDef[j].offset.x &&
                newDef[i].offset.y === oldDef[j].offset.y &&
                newDef[i].offset.z === oldDef[j].offset.z) {


                found = true;
                if (newDef[i].dmg > oldDef[j].dmg) {
                    return true;
                }
            }
        }


        if (!found) {
            return true;
        }
    }


    return false;
}


function isDeformationEqual(newDef, oldDef) {
    if (oldDef == null && newDef == null) return true;
    if (oldDef == null || newDef == null || newDef.length !== oldDef.length) return false;


    for (let i = 0; i < newDef.length; i++) {
        if (newDef[i].dmg !== oldDef[i].dmg) {
            return false;
        }
    }


    return true;
}


function handleDeformationUpdate(vehicle) {
    if (!mp.vehicles.exists(vehicle)) return;


    const deformation = getVehicleDeformation(vehicle);
    const currentDeformation = JSON.parse(vehicle.getVariable('deformation') || '[]');


    if (!isDeformationEqual(deformation, currentDeformation) && isDeformationWorse(deformation, currentDeformation)) {
        mp.events.callRemote('storeVehicleDeformationState', vehicle.remoteId, JSON.stringify(deformation));
    }
}


mp.events.add('playerLeaveVehicle', vehicle => {
    handleDeformationUpdate(vehicle);
});


mp.events.add('playerEnterVehicle', (vehicle, seat) => {
    setTimeout(() => {
        if (seat === -1) {
            const deformation = vehicle.getVariable('deformation');
            if (deformation) {
                applyDeformation(vehicle, JSON.parse(deformation));
            }
        }
    }, 200);
});


mp.events.add('entityStreamIn', entity => {
    if (entity.type === 'vehicle') {
        setTimeout(() => {
            const deformation = entity.getVariable('deformation');
            if (deformation) {
                applyDeformation(entity, JSON.parse(deformation));
            }
        }, 2000);
    }
});

Server side:
Код:
mp.events.add('storeVehicleDeformationState', (player, vehicleId, deformation) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setVariable('deformation', deformation);
    }
});


mp.events.add("VD:fixDeformation", (player, vehicleId) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setVariable('deformation', null);
    }
});


mp.events.add('fixVehicleDeformation', (player, vehicleId) => {
    const vehicle = mp.vehicles.at(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        vehicle.setFixed();
        vehicle.setVariable('deformation', null);
    }
});