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

Вопрос Определяем материал поверхности под машиной

DDStudio

Участник портала
17 Авг 2024
20
5
15
! Решение проблемы находится в конце темы !

Всем привет, может кто знает подобную нативку, но для рейджа. В nbase не нашёл такую.

(GET_VEHICLE_WHEEL_SURFACE_MATERIAL)

Она должна возвращать материал под колёсами машины.
 
Последнее редактирование:

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
1,763
1,305
5
Добрый день! К сожалению, функция GET_VEHICLE_WHEEL_SURFACE_MATERIAL не является стандартной в RageMP. Возможно, вам придется создать собственную нативную функцию для выполнения требуемой задачи.
 

JJIGolem

Гуру
high coder
19 Окт 2020
228
286
142
Скорее всего это нативка от Cfx (движка fivem), надеюсь, правильно выразился. Вы можете создать свою собственную с использованием raycast от позиции колеса (которое можно получить с использованием натива или же rageAPI) до земли
 

DDStudio

Участник портала
17 Авг 2024
20
5
15
смотрел использование метода с raycast


JavaScript:
let pos = localPlayer.vehicle.position;
let isRoadLoad = mp.raycasting.testPointToPoint(pos, new mp.Vector3(pos.x, pos.y, pos.z - 5), true, [1]);

в isRoadLoad возращается объект
JSON:
{
    "position": {
        "x": 13.01,
        "y": 12.23,
        "z": 70.02
    },
    "surfaceNormal": {
        "x": 0.93,
        "y": -0.04,
        "z": -0.34
    },
    "entity": <entity object>
}

position и surfaceNormal возращают, как я понимаю, координаты того, с чем пересекается луч. а вот entity заинтересовало меня. если я его вывожу
JavaScript:
mp.console.logInfo(JSON.stringify(isRoadLoad['entity']));

то получается число ( которое изменяется на одной и той же дороге, грубо говоря. и не меняется если я заезжаю, например, на траву)


пока так и не нашел как можно получить материал под Т/С , тк raycast выдает видимо не то
 

DDStudio

Участник портала
17 Авг 2024
20
5
15
Нашел нативку этой функции ( тк в вики про последний параметр entityHit не описано толком,а в нативке его нет), но что-то делаю не так
JavaScript:
mp.game.invoke('0x3D87450E15D98694', isRoadLoad, true, JSON.stringify(isRoadLoad['position']), JSON.stringify(isRoadLoad['surfaceNormal']), isRoadLoad['entity'])

параметры для нативки ставил согласно описанию в nbase
Код:
Parameters:
rayHandle - Ray Handle from a casted ray, as returned by CAST_RAY_POINT_TO_POINT
hit - Where to store whether or not it hit anything. False is when the ray reached its destination.
endCoords - Where to store the world-coords of where the ray was stopped (by hitting its desired max range or by colliding with an entity/the map)
surfaceNormal - Where to store the surface-normal coords (NOT relative to the game world) of where the entity was hit by the ray
entityHit - Where to store the handle of the entity hit by the ray

Returns:
Result? Some type of enum.

но при вызове всегда возращает 0 независимо от поверхности
 

JJIGolem

Гуру
high coder
19 Окт 2020
228
286
142
mp.raycasting.testCapsule
 
Реакции: DDStudio

DDStudio

Участник портала
17 Авг 2024
20
5
15
да, это то, что я искал, спасибо. последний вопрос только

JavaScript:
let pos = localPlayer.vehicle.position;
mp.console.logInfo(JSON.stringify(mp.raycasting.testCapsule(pos, new mp.Vector3(pos.x, pos.y, pos.z - 5), 0.5, localPlayer.vehicle, [1])));

оно возращает материал, но не игнорирует сущность localPlayer.vehicle и выводит его материл, позицию, объект и тп

может что-то не так в параметрах сделал, есть идеи? вроде все по вики

Код:
mp.raycasting.testCapsule(pos1, pos2, radius, [ignoredEntity], [flags]);

Required Arguments
    pos1: Vector3
    pos2: Vector3
    radius: Float
    ignoreEntity: Array of entities handle or object
    flags: Array of ints
 

DaVilka

Гуру
16 Сен 2020
709
259
128
я из c# делал через эту функцию, используется в связке из StartShapeTestRay


mp.raycasting.testCapsule(pos, new mp.Vector3(pos.x, pos.y, pos.z - 5), 0.5, null, 1); попробуй так
 
Реакции: DDStudio

DDStudio

Участник портала
17 Авг 2024
20
5
15
Оставлю всем на будущее ( мало ли кто будет искать поверхность под машиной, а подобного до этой темы не было)


JavaScript:
mp.keys.bind(0x45, true, function() { // На клавишу E (англ) выполняется код
    if(!localPlayer.vehicle || localPlayer.vehicle.getPedInSeat(-1) !== localPlayer.handle) return; // Проверяем сидит ли игрок в машине и на каком месте
    let pos = localPlayer.vehicle.position; // позиция ТС
    
    mp.console.logInfo(JSON.stringify(mp.raycasting.testCapsule(pos, new mp.Vector3(pos.x, pos.y, pos.z - 5), 0.5, null, 1))); // Нужный нам идс будет в возращаемом объекте и называется 'material'
});

Потом сравниваем полученный материал с материалами из списка и выполняем нужный код если все сошлось
 

kirillzver

Гуру
2 Ноя 2020
167
122
104
Для чего планируешь использовать данные вычисления?
 

DDStudio

Участник портала
17 Авг 2024
20
5
15
Лето/зима/всесезонка - в таком плане?
± да, но так же думаю (ещё пока наброски только, буду додумывать) обычные дорожные, спортивные с лучшим сцеплением с поверхностью и тп.
например, спортивные какие-нибудь шины будут иметь хорошее сцепление с дорогой, но при выезде на бездорожье их эффективность снижается.
сейчас почти сверстал интерфейс 'шиномонтажки', если можно так сказать и параллельно искал метод как раз определения материала под тс.
 

DDStudio

Участник портала
17 Авг 2024
20
5
15
Неожиданно появился такой вопрос, относящийся, можно считать, к этой теме.

Есть объект
JavaScript:
let materials = {
    "5236042":"Blood",
    "13626292":"Temp30",
    "15972667":"MetalHollowSmall",
    "32752644":"Spine3",
    "47470226":"Temp11",
    "63305994":"Temp10"
    // и тд
}


Там основные материалы, но многих нет. Решил добавить ( в пример возьму дорожную решетку)
Дописал в объекте
Код:
"4044798976":"RoadGrid",

идс верный, возвращается при наезде на тот объект, но когда ищу его в объекте
Код:
if (entityMaterial) LastMaterialID = materials[`${entityMaterial}`];
выдает null

Решил 'продебажить', но все равно не могу догнать из-за чего такое

JavaScript:
mp.events.callRemote('console', entityMaterial);                 // return 4044798976
mp.events.callRemote('console', materials[`${entityMaterial}`]); // return null
mp.events.callRemote('console', materials[`4044798976`]);        // return 'RoadGrid'

те значения и ключи, которые шли в объекте изначально выводятся корректно, но не те, которые я добавил.
может имеются идеи какие?
 

kirillzver

Гуру
2 Ноя 2020
167
122
104
Пиши просто:
JavaScript:
materials[entityMaterial]
Не нужно лишних превращений в строку.
 

DDStudio

Участник портала
17 Авг 2024
20
5
15
Пиши просто:
JavaScript:
materials[entityMaterial]
Не нужно лишних превращений в строку.
сейчас попробую, спасибо. просто интересно то, что этим способом ищется всё, кроме значений, которых не было в вики списке, но они отдают свой идс, который я и добавляю в объект