Переношу своё соообщение сюда, здесь будем обсуждать - как запускать ракеты.
Code
0x737C80 _?LaunchSamRocket
В исходниках MTA эта функция называется AddProjectile. Вот её описание на C++.
Code
bool CPedSA::AddProjectile ( eWeaponType eWeapon, CVector vecOrigin, float fForce, CVector * target, CEntity * targetEntity )
{
return ((CProjectileInfoSA*)pGame->GetProjectileInfo())->AddProjectile ( (CEntitySA*)this, eWeapon, vecOrigin, fForce, target, targetEntity );
}
Осталось только разобрать параметры.
eWeaponType eWeapon - тип оружия? Не знаю что это, возможно, тип ракеты?
CVector vecOrigin - точка создания?
float fForce - Мощность (сила?), скорость?
CVector * target - указатель на конечную точку? Возможно, просто единичный вектор (направление полёта)?
CEntity * targetEntity - указатель на педа/автомобиль (для тепловых ракет)?
Один из вызовов в ASM:
Code
push 0
...
push ecx
push 3F800000h
...
push 13h
push edi
...
call _?LaunchSamRocket
Code
0xC89110 массив структур CProjectile
0xC891A8 массив структур CProjectileInfo
Добавлено (24.07.2011, 02:29)
---------------------------------------------
eWeaponType eWeapon - тип ракеты. В exe я видел такие же значения, что и представлены ниже.
Code
16 = none
19 = normal
20 = heatseeking
58 = flare
Добавлено (24.07.2011, 02:38)
---------------------------------------------
Структура
+0 = [dword] eRocketType
Code
16 = none
19 = normal
20 = heatseeking
58 = flare
+4 = [dword] Указатель на Entity, который запустил ракету (вероятно, это может быть либо автомобиль, либо пед - надо проверить)
+8 = [dword] Указатель на нацеленный автомобиль (для тепловых ракет)
+12 = [dword] Неизвестно. В исходниках мультиплееров называют "Counter", что обычно означает "Счётчик количества".
+16 = [byte] Статус ракеты
Code
0 = взорвалась/не существует
1 = летит
+17 = [byte] bPadding - трёхбайтовый вектор, возможно, текущей позиции, но, скорее всего, единичный вектор направления. Пока что не понял, как именно его трансформировать. На выходе всегда получаю 0 0 255
+20 = [float] fX - бывшая позиция X
+24 = [float] fY - бывшая позиция Y
+28 = [float] fZ - бывшая позиция Z
+32 = [dword] Неизвестно. Очень часто равно 0.0.Добавлено (24.07.2011, 03:35)
---------------------------------------------
А вот ещё одно описание
bool AddProjectile ( CEntity * creator, eWeaponType eWeapon, CVector vecOrigin, float fForce, CVector * target, CEntity * targetEntity );
Теперь ещё сложнее.
Добавлено (14.09.2011, 21:31)
---------------------------------------------
Уже со всем разобрался. Когда зайду через нормальное соединение, то выложу пример.
Добавлено (14.09.2011, 21:34)
---------------------------------------------
Также в планах - создание опкодов и класса для SB.
Code
0@ = projectile.Create(...)
Что думаете?