You are not logged in.
Pages: 1
Здравствуйте уважаемые посетители форума, хотел бы попросить у вас помощи.
Я фанат мультиплеерной модификации 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
.text:00491863 call sub_4CEA80 ; set animation progress
Это вроде вызов самой функции. Адрес самого опкода - 0x491802.
Наверняка я неправ, и меня поправят
Offline
Спасибо за помощь, только вот ни как не получается её правильно вызвать... что бы я не делал при вызове крэш нужна помощь ^_^.
Изучив то что выдаёт Hex-Rays(Ну недано мне выучить ассемблер ), а именно:
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, после чего мгновенный вылет .
Не составит ли вам труда поподробнее обьяснить где моя ошибка, и как правильно?
Offline
Насколько я понимаю, 004CEA80 это метод какого-то класса (по управлению анимациями?). Т.е. просто так, как обычную функцию, вызвать это не получится. Передается в него 1 параметр типа Float.
Offline
В МТА анимация применяется к педу, с помощью "Task"(Заданий), и ставиться как приоритетное задание.
Вопрос, подойдёт ли опкод 0614 либо 083A, чтобы задать прогресс анимации?(Требуется в нужный момент поставить проигрывание на паузу, единственный выход который я придумал - каждый кадр задавать нужный прогресс анимации, до тех пор пока анимация должны быть приостановлена)
Возможно вы знаете друго способ поставить анимацию на паузу? Огромная просьба как-либо помочь
Offline
Pages: 1