#1 18-07-2010 10:13

GRascm
From: Минск
Registered: 21-05-2010
Posts: 3

Работа с анимацией

Здравствуйте уважаемые посетители форума, хотел бы попросить у вас помощи.

Я фанат мультиплеерной модификации MTA, для GTA San Andreas. И я разрабатываю свой игровой режим для данной модификации, мне хочется создать РП мод, и у меня неплохо получается, основа мода написана, но теперь, когда хочется сделать дополнительные "плюшки" мне понадобилась расширенная работа с анимациями, а именно функция, которой нет в МТА (setAnimationProgress - или что либо в таком виде)  Так как хочется сделать тренажерный зал, максимально приближенно к одиночномы режиму игры.

Модификация имеет открытые исходные коды, поэтому я смогу дописать данную функцию.

И вот собственно сам вопрос, не подскажите ли вы адрес функции которая обрабатывает опкод

0614: set_actor $PLAYER_ACTOR animation "GYM_BP_DOWN" progress_to $1822 // 0.0 to 1.0

Версия игры в которой нужен адрес - 1.0.

Offline

#2 18-07-2010 15:55

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Работа с анимацией

.text:00491863 call sub_4CEA80 ; set animation progress

Это вроде вызов самой функции. Адрес самого опкода - 0x491802.
Наверняка я неправ, и меня поправят smile

Offline

#3 21-07-2010 10:01

GRascm
From: Минск
Registered: 21-05-2010
Posts: 3

Re: Работа с анимацией

Спасибо за помощь, только вот ни как не получается её правильно вызвать... что бы я не делал при вызове крэш sad нужна помощь ^_^.

Изучив то что выдаёт Hex-Rays(Ну недано мне выучить ассемблер sad ), а именно:

CScriptThread__getNumberParams(1);
v161 = CPool_CPed__atHandle((int)PedPool, opcodeParameters[0]);
CScriptThread__getStringParam(v4, (char *)&v219, 0x18u);
v41 = sub_4D6870(*(_DWORD *)(v161 + 24), (unsigned __int8 *)&v219);
CScriptThread__getNumberParams(1);
if ( !v41 )
goto LABEL_171;
_EDX = *(_DWORD *)(v41 + 20);
__asm
{
fld     dword ptr [edx+10h]
fmul    _opcodeParameters
fstp    [esp+238h+var_238]
}
sub_4CEA80(v41, v163);
return 0;

Видно что функции передаються 2 параметра, первый из которых это результат работы
sub_4D6870(*(_DWORD *)(v161 + 24), (unsigned __int8 *)&v219);
как я понял *(_DWORD *)(v161 + 24) это "пед", ну и (unsigned __int8 *)&v219 имя анимации.
А вот второй параметр неизвестен О_о, но он int, хотя прогресс должен быть от 0.0 до 1.0

Выполняется такой код:

сначала

CAnimBlendAssociationSAInterface * pInterface;    
DWORD dwFunc = FUNC_RpAnimBlendClumpGetAssociation_str;
_asm
{
    push    szAnimName
    push    pClump
    call    dwFunc
    mov     pInterface, eax
    add     esp, 0x8
}
return GetAnimBlendAssociation ( pInterface );

Где dwFunc это sub_4D6870, это код самих разработчиков МТА, и он обязан работать ^_^.
GetAnimBlendAssociation - Это различные проверки, по сути он возвращает pInterface если все прошло нормально.

Далее попытка установить прогресс текущей анимации, естесвенно посли проверки что sub_4D6870, вернуло что то ненулевое о_О:

DWORD dwFunc = FUNC_CAnimManager_SetAnimationProgress;
int iProgress = (int)fProgress;//ну инт так инт о_О
_asm
{
    push    iProgress
    push    Animation
    call      dwFunc
}

Возможно я не понимаю как должен вызываться данный опкод, сначала я задаю анимацию, и после пытаюсь установить её прогресс на 0.5, после чего мгновенный вылет sad.

Не составит ли вам труда поподробнее обьяснить где моя ошибка, и как правильно? blush

Offline

#4 21-07-2010 11:15

Seemann
Registered: 07-08-2006
Posts: 2,073

Re: Работа с анимацией

Насколько я понимаю, 004CEA80 это метод какого-то класса (по управлению анимациями?). Т.е. просто так, как обычную функцию, вызвать это не получится. Передается в него 1 параметр типа Float.

Offline

#5 21-07-2010 16:38

GRascm
From: Минск
Registered: 21-05-2010
Posts: 3

Re: Работа с анимацией

В МТА анимация применяется к педу, с помощью "Task"(Заданий), и ставиться как приоритетное задание.
Вопрос, подойдёт ли опкод 0614 либо 083A, чтобы задать прогресс анимации?(Требуется в нужный момент поставить проигрывание на паузу, единственный выход который я придумал - каждый кадр задавать нужный прогресс анимации, до тех пор пока анимация должны быть приостановлена)

Возможно вы знаете друго способ поставить анимацию на паузу? Огромная просьба как-либо помочь smile

Offline

Board footer

Powered by FluxBB