Вызов функции через FFI

Startracker983274

Известный
Автор темы
41
121
Версия MoonLoader
.026-beta
Как вызвать эту функцию в Lua с помощью FFI?
За что отвечает указатель CWanted* и как правильно передать CVector const& ?????

Взято у DK22Pac: https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CWanted.cpp

C++:
// Converted from thiscall void CWanted::RegisterCrime_Immediately(eCrimeType crimeType,CVector const&posn,uint crimeId,bool bPoliceDontReallyCare) 0x562430
void CWanted::RegisterCrime_Immediately(eCrimeType crimeType, CVector const& posn, CPed* ped, bool bPoliceDontReallyCare) {
    plugin::CallMethod<0x562430, CWanted*, eCrimeType, CVector const&, CPed*, bool>(this, crimeType, posn, ped, bPoliceDontReallyCare);
}
 
Последнее редактирование:

ARMOR

kjor32 is legend
Модератор
4,852
6,083
Lua:
local ffi = require 'ffi'
local memory = require 'memory'

ffi.cdef([[
    typedef struct { float x, y, z; } CVector;
]])

function RegisterCrime_Immediately(crimeType, posn, crimeId, bPoliceDontReallyCare)
    ffi.cast('void(__thiscall*)(void*, int, CVector*, int, bool)', 0x562430)(ffi.cast('void*', memory.getuint32(0xB7CD9C, true)), crimeType, posn, crimeId, bPoliceDontReallyCare)
end
 

Startracker983274

Известный
Автор темы
41
121
Lua:
local ffi = require 'ffi'
local memory = require 'memory'

ffi.cdef([[
    typedef struct { float x, y, z; } CVector;
]])

function RegisterCrime_Immediately(crimeType, posn, crimeId, bPoliceDontReallyCare)
    ffi.cast('void(__thiscall*)(void*, int, CVector*, int, bool)', 0x562430)(ffi.cast('void*', memory.getuint32(0xB7CD9C, true)), crimeType, posn, crimeId, bPoliceDontReallyCare)
end
Пожалуйста, дай пример, не пойму как правильно передать в функцию CVector и eCrimeType! Большое спасибо!
 

AnWu

Guardian of Order
Всефорумный модератор
4,688
5,194

sizeoftrickster

…And Megadeth For All?
Проверенный
123
451
C++:
enum eCrimeType {
    CRIME_FIRE_WEAPON = 1,
    CRIME_DAMAGED_PED = 2,
    CRIME_FIRE_WEAPON_HIT_PED = 3,
    CRIME_DAMAGE_CAR = 4,
    CRIME_DAMAGE_COP_CAR = 5,
    CRIME_CAR_STEAL = 6,
    CRIME_KILL_PED_WITH_CAR = 10,
    CRIME_KILL_COP_PED_WITH_CAR = 11,
    CRIME_SET_PED_ON_FIRE = 13,
    CRIME_SET_COP_PED_ON_FIRE = 14,
    CRIME_SET_CAR_ON_FIRE = 15,
    CRIME_EXPLOSION = 17,
    CRIME_HIT_CAR = 21,
    CRIME_AIM_GUN = 22
};
Lua:
local CRIME_FIRE_WEAPON = 1
RegisterCrime_Immediately(CRIME_FIRE_WEAPON, ...)
Lua:
ffi.cdef[[
    typedef struct {
        float x, y, z;
    } CVector;
]]

local vec = ffi.new("CVector")
vec.x = 123
vec.y = 1234
vec.z = 12345
 
  • Нравится
Реакции: Startracker983274 и qdIbp

Startracker983274

Известный
Автор темы
41
121
C++:
enum eCrimeType {
    CRIME_FIRE_WEAPON = 1,
    CRIME_DAMAGED_PED = 2,
    CRIME_FIRE_WEAPON_HIT_PED = 3,
    CRIME_DAMAGE_CAR = 4,
    CRIME_DAMAGE_COP_CAR = 5,
    CRIME_CAR_STEAL = 6,
    CRIME_KILL_PED_WITH_CAR = 10,
    CRIME_KILL_COP_PED_WITH_CAR = 11,
    CRIME_SET_PED_ON_FIRE = 13,
    CRIME_SET_COP_PED_ON_FIRE = 14,
    CRIME_SET_CAR_ON_FIRE = 15,
    CRIME_EXPLOSION = 17,
    CRIME_HIT_CAR = 21,
    CRIME_AIM_GUN = 22
};
Lua:
local CRIME_FIRE_WEAPON = 1
RegisterCrime_Immediately(CRIME_FIRE_WEAPON, ...)
Lua:
ffi.cdef[[
    typedef struct {
        float x, y, z;
    } CVector;
]]

local vec = ffi.new("CVector")
vec.x = 123
vec.y = 1234
vec.z = 12345
Чел, лучший! Спасибо большое! Значит этот enum можно передать как обычный int в данном случае.