
14.09.2023, 16:02
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от why ega
сомневаюсь что это можно реализовать как-то кроме реверса мунлоадера, но тогда вопрос в другом, не проще ли напрямую вызывать функции (большинство) из игры/сампа?)
За каждой простенькой функой Муна стоит куча кода. Нельзя просто позвонить в ГТА и в одну строчку попросить её сделать многие простые вещи. Вот к примеру собовская функция для применения анимации к локальному игроку:
C++:
Код:
void
GTAfunc_PerformAnimation
(
const
char
*
szBlockName
,
const
char
*
szAnimName
,
int
iTime
,
bool
bLoop
,
bool
bUpdatePosition
,
bool
bInterruptable
,
bool
bFreezeLastFrame
,
bool
bRunInSequence
,
bool
bOffsetPed
,
bool
bHoldLastFrame
)
{
CAnimBlock
*
pBlock
=
pGameInterface
->
GetAnimManager
(
)
->
GetAnimationBlock
(
szBlockName
)
;
if
(
pBlock
)
{
bool
bLoaded
=
true
;
if
(
!
pBlock
->
IsLoaded
(
)
)
{
int
iTimeToWait
=
50
;
// load animations
pGameInterface
->
GetStreaming
(
)
->
RequestAnimations
(
pBlock
->
GetIndex
(
)
,
4
)
;
pGameInterface
->
GetStreaming
(
)
->
LoadAllRequestedModels
(
)
;
while
(
!
pBlock
->
IsLoaded
(
)
&&
iTimeToWait
!=
0
)
{
iTimeToWait
--
;
Sleep
(
10
)
;
}
if
(
iTimeToWait
==
0
)
bLoaded
=
false
;
}
if
(
bLoaded
)
{
// allow tasks to be removed
pPedSelf
->
GetPedIntelligence
(
)
->
GetTaskManager
(
)
->
Flush
(
TASK_PRIORITY_PRIMARY
)
;
// removes temporary tasks caused by events like falling
pPedSelf
->
GetPedIntelligence
(
)
->
GetTaskManager
(
)
->
RemoveTask
(
TASK_PRIORITY_EVENT_RESPONSE_TEMP
)
;
// remove jumping task
CTask
*
jumpTask
=
pPedSelf
->
GetPedIntelligence
(
)
->
GetTaskManager
(
)
->
FindActiveTaskByType
(
211
)
;
if
(
jumpTask
)
{
pPedSelf
->
GetPedIntelligence
(
)
->
GetTaskManager
(
)
->
RemoveTask
(
TASK_PRIORITY_PRIMARY
)
;
}
// more removals if needed ever
//pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_EVENT_RESPONSE_NONTEMP);
//pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_PHYSICAL_RESPONSE);
//pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_MAX);
//pPedSelf->GetPedIntelligence()->GetTaskManager()->RemoveTask(TASK_PRIORITY_PRIMARY);
// set flags
int
flags
=
0x10
;
// // Stops jaw fucking up, some speaking flag maybe
if
(
bLoop
)
flags
|=
0x2
;
// flag that triggers the loop (Maccer)
if
(
bUpdatePosition
)
{
// 0x40 enables position updating on Y-coord, 0x80 on X. (Maccer)
flags
|=
0x40
;
flags
|=
0x80
;
}
if
(
!
bFreezeLastFrame
)
flags
|=
0x08
;
// flag determines whether to freeze player when anim ends. Really annoying (Maccer)
// create a new task
CTask
*
pTask
=
pGameInterface
->
GetTasks
(
)
->
CreateTaskSimpleRunNamedAnim
(
szAnimName
,
pBlock
->
GetName
(
)
,
flags
,
4.0f
,
iTime
,
!
bInterruptable
,
bRunInSequence
,
bOffsetPed
,
bHoldLastFrame
)
;
if
(
pTask
)
{
pTask
->
SetAsPedTask
(
pPedSelf
,
TASK_PRIORITY_PRIMARY
)
;
}
}
else
{
// TODO: unload unreferenced blocks later on
pGameInterface
->
GetStreaming
(
)
->
RequestAnimations
(
pBlock
->
GetIndex
(
)
,
8
)
;
}
}
}
А так это выглядит в мунлоадере:
Lua:
Код:
requestAnimation
(
"animName"
)
taskPlayAnim
(
1
,
"animLib"
,
"animName"
,
9
,
false
,
false
,
false
,
false
,
-
1
)
Соответственно и потенциальных багов от использования муновских функций меньше.
|
|
|