HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 08.09.2024, 13:30
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

В начале этого (2024) года, на аризоне появилась новая система загрузки моделей для аттачей. Нужна она что бы не разруливать конфликты FLA и SAMP. Данная система предоставляет альтернативные id для создания объектов.

Объекты прописываются в json файле
Код:
arizona/NamedModels.json
.

Загрузить и использовать модели из своего кода можно воспользовавшись функциями экспортируемыми из
Код:
vorbisFile.dll
. Объявление функций приложено ниже в аттаче.

Цитата:
Сообщение от Спойлер  


is_simple_model_existsПроверяет, что модель с данным id прописана в jsonget_simple_models_countРазмер пула моделей (для перебора всех). В пуле могут быть пробелы!request_simple_model_loadАсинх ронный запрос на загрузку модели. После него надо подождать, пока модель загрузитсяload_simple_modelЗагруз а модели с блокировкой основного потока. Ждать загрузки не надо, но будет микрофриз, как с самповскими объектамиunload_simple_modelУдален е моделиget_simple_modelПолучение указателя на
Код:
CBaseModelInfo
модели (вернет NULL, если модель еще не загружена)get_simple_model_infoПолуч ение информации о модели (используемые DFF, TXD, etc...)find_simple_models_by_nameПоиск id'ов по названию DFF. (например можно найти все ретекстуры часов, использующие общую модель)

Алсо, по загрузке моделей. Под капотом все модели shared_ptr, и запросы на загрузку не теряются. Соответственно, после первого запроса на загрузку, модель 100% загрузится и повторять запрос не надо, если вы не вызывали выгрузку модели. Т.к. shared_ptr не отдается наружу (из-за возможных различий в ABI), то его счетчик инткерминтируется/декриминтируется при запросах на загрузку/выгрузку моделей.
 
Ответить с цитированием

  #2  
Старый 30.09.2024, 22:23
Lance_Sterling
Познавший АНТИЧАТ
Регистрация: 12.01.2023
Сообщений: 1,016
С нами: 1757019

Репутация: 88


По умолчанию

круто, модель я загрузил, а как создать теперь объект? айди отличаются в списке и в игре





подгружаю модель, возвращает true

эмулирую аттач этого объекта

1727720552885.pngLance_Sterling · 30 Сен 2024 в 21:23' data-fancybox="lb-post-1544571" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/253190/" style="cursor: pointer;" title="1727720552885.png">


чота нихуя не получается, мне лень отслеживать неизвестные рпц/пакеты, чо делать, есть функции?

@SR_team
 
Ответить с цитированием

  #3  
Старый 01.10.2024, 02:57
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Цитата:
Сообщение от Lance_Sterling  

круто, модель я загрузил, а как создать теперь объект? айди отличаются в списке и в игре

подгружаю модель, возвращает true
эмулирую аттач этого объекта

чота нихуя не получается, мне лень отслеживать неизвестные рпц/пакеты, чо делать, есть функции?

@SR_team
На сайте серверные id'ы. Данное API предоставляет тебе доступ к CBaseModelInfo модели. Через него например можно создать кламп/атомик вызвав функцию CBaseModelInfo::CreateInstance. И уже кламп/атомик можно рендерить
 
Ответить с цитированием

  #4  
Старый 02.02.2025, 21:02
chapo
Флудер
Регистрация: 10.10.2016
Сообщений: 9,228
С нами: 5046982

Репутация: 183


По умолчанию

@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
)
;
 
Ответить с цитированием

  #5  
Старый 02.02.2025, 21:24
SR_team
Флудер
Регистрация: 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);
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.