GTA Builder Форум
GTA Vice City => Общие вопросы => Тема начата: SpitFire от Май 01, 2017, 05:18:45 pm
-
Решил немного углубиться в скриптинг и повызвать функции через CLEO. Но у меня ничего не вышло из-за нехватки навыков. Так же мне не понятно, чем друг от друга отличаются эти 4 опкода:
05E1=-1,call %1d% num_params %2h% pop %3h%
05E2=-1,call_function %1d% num_params %2h% pop %3h%
05E3=-1,call_method %1d% struct %2d% num_params %3h% pop %4h%
05E4=-1,call_function_method %1d% struct %2d% num_params %3h% pop %4h%
Пример того, как я вызываю функцию:
05E1: call 0x5CA3C0 num_params 0 pop 0
Функция вызова перезарядки. Если я правильно понимаю, то тип void - это пустота. Т.е. у неё не должно быть параметров.
-
05E1: call 0x5CA3C0 num_params 0 pop 0
Функция вызова перезарядки. Если я правильно понимаю, то тип void - это пустота. Т.е. у неё не должно быть параметров.
Не совсем. Если посмотреть в базе, то можно увидеть, что эта процедура принимает неявный параметр через регистр ECX. В данной процедуре ECX содержит указатель на структуру класса CWeapon, и это значит, что мы имеем дело с методом. Раз мы имеем дело с методом, то его нужно вызывать опкодом 05E3, если метод не возвращает значение, иначе 05E4, если возвращает:
05E3: call_method 0x5CA3C0 struct $WeaponStruct num_params 0 pop 0
-
Хм, еще бы найти указатель на weapon struct.
-
Хм, еще бы найти указатель на weapon struct.
Если нужно перезарядить оружие игрока, тогда:
1)Получаем структуру педа игрока.
2)Смещаемся по структуре на 0x504 и высчитываем из полученного адреса значение размером в 1 байт (это номер активного слота оружия).
3)Затем снова от начала структуры смещаемся на 0x408 и прибавляем произведение номера слота на 0x18.
4)Получившиеся значение и есть адрес структуры CWeapon, который надо передать опкоду 05E3.