
02.02.2025, 21:24
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от chapo
@SR_team, есть ли возможность получить айди подгруженного объекта для того что бы в дальнейшем например создать его на карте через createObject?
Пробовал так, но всегда получаю -1;
Lua:
Код:
local
ffi
=
require
(
'ffi'
)
;
ffi
.
cdef
(
[[
typedef struct CBaseModelInfo CBaseModelInfo;
#pragma pack(push, 8);
struct CBaseModelInfo {
void* vtbl;
unsigned int m_dwKey;
short m_wUsageCount;
short m_wTxdIndex;
char m_nAlpha;
char m_n2dfxCount;
short m_w2dfxIndex;
short m_wObjectInfoIndex;
unsigned __int16 m_nMdlFlags;
struct CColModel *m_pColModel;
float m_fDrawDistance;
struct RpClump *m_pRwObject;
};
#pragma pack(pop);
bool is_simple_model_exists( int modelId );
bool load_simple_model( int modelId );
CBaseModelInfo *get_simple_model( int modelId );
]]
)
;
local
vorbis
=
ffi
.
load
(
'vorbisFile.dll'
)
;
local
CModelInfo__ms_modelInfoPtrs
=
ffi
.
cast
(
"CBaseModelInfo**"
,
ffi
.
cast
(
"uintptr_t*"
,
0x40122D
)
[
0
]
)
;
function
GetModelIndexByCBaseModelInfo
(
pModelInfo
,
nMin
,
nMax
)
assert
(
pModelInfo
,
'pModelInfo is NULL'
)
;
local
targetKey
=
pModelInfo
.
m_dwKey
;
for
i
=
nMin
,
nMax
do
print
(
'iter'
,
i
)
;
local
pModel
=
CModelInfo__ms_modelInfoPtrs
[
i
]
;
if
(
pModel
~=
nil
)
then
print
(
'iter-result'
,
i
,
pModel
.
m_dwKey
,
targetKey
)
;
if
(
pModel
.
m_dwKey
==
targetKey
)
then
return
i
end
end
end
return
-
1
;
end
local
simpleModelId
=
368
;
local
SimpleModel
=
{
isModelExists
=
vorbis
.
is_simple_model_exists
,
loadModel
=
vorbis
.
load_simple_model
,
getModel
=
vorbis
.
get_simple_model
}
;
sampRegisterChatCommand
(
'aa'
,
function
(
)
if
(
not
SimpleModel
.
isModelExists
(
simpleModelId
)
)
then
return
sampAddChatMessage
(
'SimpleModel // Model not exists'
,
-
1
)
;
end
local
wasModelLoaded
=
SimpleModel
.
loadModel
(
simpleModelId
)
;
if
(
not
wasModelLoaded
)
then
return
sampAddChatMessage
(
'SimpleModel // Model was not loaded'
,
-
1
)
;
end
print
(
'loadModel'
,
wasModelLoaded
)
;
local
model
=
SimpleModel
.
getModel
(
simpleModelId
)
;
print
(
'getModel'
,
model
,
'm_dwKey ='
,
model
.
m_dwKey
,
string
.
format
(
"0x%X"
,
model
.
m_dwKey
)
)
;
print
(
'Model'
,
model
.
m_wObjectInfoIndex
)
;
print
(
'GetModelIndexByCBaseModelInfo'
,
GetModelIndexByCBaseModelInfo
(
model
,
0
,
24299
)
)
;
-- 24299 from limit adjuster config
end
)
;
Весь смысл этой кастомной системы моделей в том, что она не занимает id в ms_modelInfoPtrs. Вместо createObject можно использовать CBaseModelInfo::CreateInstance, но он вернет голый RpClump/RpAtomic - рендерить его нужно самому, типа atomic->renderCallback(atomic); или RpClumpRender(clump);
|
|
|