GTA Builder Форум
GTA Vice City => Общие вопросы => Тема начата: Jak łaska za praca от Август 29, 2014, 11:02:05 pm
-
Открыл для себя то что в Maxo Vehicle Loader есть Python скрипты и для них представляться интересные модули.
Но автор скупердяй спрятал исходники у себя и IsDebuggerPresent и ещё что-то что отлаживать получается только в Olly.
Нашел я PyMethodDef
{
char *m_name = "TraceRay"
PyObject* m_method = "Python_TraceRay"
.......
}
Но понять что делает одна часть его кода не понимаю. Кто скажет как понять то (http://cs-mapping.com.ua/forum/images/smilies/rolleyes2.gif) код или как прыгнуть в нужное место в Olly зная адрес пол ученый в IDA?
-
Что такое CEntity и CColPoint?
void Inj()
{
vec3_t start = { 0.0, 0.0, 0.0 };
vec3_t end = { 0.0, 0.0, 1.0 };
char* sd[50];
//CWorld::ProcessLineOfSight
int (*func)(vec3_t const *, vec3_t const *, vec3_t const * , char ** , qboolean , qboolean , qboolean , qboolean , qboolean , qboolean , qboolean , qboolean ) = 0x004D92D0;
int test = func( start, end, start, sd, true, true, true, true, true, true, true, true );
//test = 1179648
//SDK_InjectFunction( 0x4D92D0, Test );
}
-
CEntity - Это скажем, самый такой базовый класс от которого, наследуются другие классы как CPed, CVehicle.
CColPoint - Скорее всего подразумевает Collision Point, объект который являться частью, коллизий(проверок столкновений).
-
Описание в функции в SA точно такое же
// Данный скрипт был создан специально для vol-gta.com и libertycity.ru
// Его суть - при нацеливании на пассажира в автообиле, он (пассажир) будет совершать
// определённые дейтсвия. Так, например, обычный гражданин будет пытаться сбежать, а
// человек из криминальных кругов начнет меряться силой с главным героем.
// При написании этого скрипта использовались продвинутые методы работы с кодом,
// что позволило эффективно решить ряд востребованных задач.
// В данном исходнике используются дополнительные файлы,
// подробнее см. http://modsforgta.ucoz.ru/forum/5-71-1
{$CLEO}
0AC6: 20@ = label @temp_sphere offset
0AC6: 21@ = label @temp_line offset
// Здесь происходит запись смещений меток в таблицу выбора поведения педов.
0AC6: 28@ = label @ped_events offset
0085: 0@ = 28@
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // PLAYER1
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // PLAYER2
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // PLAYER_NETWORK
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // PLAYER_UNUSED
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civmale virtual_protect 0 // CIVMALE
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civfemale virtual_protect 0 // CIVFEMALE
0@ += 4
0A8C: write_memory 0@ size 4 value @event_cop virtual_protect 0 // COP
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG1
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG2
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG3
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG4
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG5
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG6
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG7
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG8
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG9
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // GANG10
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civmale virtual_protect 0 // DEALER
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civmale virtual_protect 0 // MEDIC
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civmale virtual_protect 0 // FIREMAN
0@ += 4
0A8C: write_memory 0@ size 4 value @event_gang virtual_protect 0 // CRIMINAL
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civmale virtual_protect 0 // BUM
0@ += 4
0A8C: write_memory 0@ size 4 value @event_civfemale virtual_protect 0 // PROSTITUTE
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // SPECIAL
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION1
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION2
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION3
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION4
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION5
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION6
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION7
0@ += 4
0A8C: write_memory 0@ size 4 value @event_skip virtual_protect 0 // MISSION8
// Здесь начинается основной цикл.
{$I inloop}
if or
not player.Defined($PLAYER_CHAR)
06B9: cutscene_data_loaded
then
continue
end
// Проверяем, что игрок использует нужное оружие.
0470: 0@ = actor $PLAYER_ACTOR current_weapon
if or
0@ < 22
0@ > 38
then
continue
end
// Проверяем, что игрок прицеливается.
0A8D: 0@ = read_memory {CCamera > CCam > camMode } 0xB6F1A8 size 2 virtual_protect 0
if and
0@ <> 8
0@ <> 51
0@ <> 53
then
continue
end
// Нам нужно построить линию прицеливания игрока. Начало этой линий - позиция кости правой руки + оффсет.
// Конец - координаты прицеливания камеры.
// Находим координаты начала линии прицеливания игрока (2@, 3@, 4@).
0A96: 0@ = actor $PLAYER_ACTOR struct
0A8E: 1@ = 0@ + 0x18
0A8D: 1@ = read_memory {CPed > rwObject} 1@ size 4 virtual_protect 0
0AA7: call_function {GetAnimHierarchyFromSkinClump} 0x734A40 num_params 1 pop 1 _clump 1@ _result 1@
if
1@ <> 0 // Если у скина есть иерархия - получаем координаты кости правой руки и добавляем к ним оффсет.
then
0AA7: call_function {RpHAnimIDGetIndex} 0x7C51A0 num_params 2 pop 2 _boneId 24 _hierarchy 1@ _result 2@
1@ += 8
0A8D: 1@ = read_memory {RpHAnimHierarchy > pMatrixArray} 1@ size 4 virtual_protect 0
2@ *= 0x40
005A: 1@ += 2@
5@ = 1.0
6@ = 0.0
7@ = 0.0
0AA5: call {RwV3dTransformPoint} 0x7EDD60 num_params 3 pop 3 _transformMatrix 1@ _pointIn 5@v _pointOut 2@v
else
// Если у скина нет иерархии - получаем кординаты скина и добавляем к ним оффсет.
04C4: store_coords_to 2@ 3@ 4@ from_actor $PLAYER_ACTOR with_offset 0.0 1.5 0.7
end
// Находим координаты конца линии прицеливания игрока (5@, 6@, 7@).
0AA6: call_method {CCamera::Find3rdPersonCamTargetVector} 0x514970 struct 0xB6F028 num_params 6 pop 0 _targetOut 5@v _cameraOut 8@v _z 4@ _y 3@ _x 2@ _range 15.0
// На выходе, получили -
// 2@, 3@, 4@ - начало линии прицеливания игрока
// 5@, 6@, 7@ - конец линии прицеливания игрока
// Применяем код для всех педов.
{$I forallpeds}
if or
actor.Dead(ped)
not actor.Driving(ped)
04C8: actor ped driving_flying_vehicle
then
continue
end
0811: 1@ = actor ped used_car
0A97: 1@ = car 1@ struct
// Если у автомобиля "бешенный" водитель - пропускаем его.
0A8E: 11@ = 1@ + 0xC
0A8D: 11@ = read_memory 11@ size 1 virtual_protect 0
if
11@ == 123
then
continue
end
0A96: 11@ = actor ped struct
// Проверяем, что игрок целится в этого педа. Для этого создаём сферу, которая будет описывать модель педа.
// Получаем тип транспортного средства
1@ += 0x594
0A8D: 1@ = read_memory {CVehicle > vehicleSubType} 1@ size 4 virtual_protect 0
// Пропускаем воздушный и водный транспорт.
if or
1@ == 3
1@ == 4
1@ == 5
then
continue
end
// Если пед находится на мотоцикле или велосипеде, создаём сферу для всего педа, иначе - для его головы.
if or
1@ == 1
1@ == 9
1@ == 10
then
// Пропускаем копа на байке.
089F: get_actor ped pedtype_to 8@
if
8@ == 6
then
continue
end
0AA6: call_method {CPed::GetBonePosition} 0x5E4280 struct 11@ num_params 3 pop 0 _bDynamic true _boneId 1 _point 8@v
10@ += 0.1
12@ = 1.0
else
0AA6: call_method {CPed::GetBonePosition} 0x5E4280 struct 11@ num_params 3 pop 0 _bDynamic true _boneId 4 _point 8@v
12@ = 0.3
end
// Проверяем, что пед видит игрока.
// Построим трапецию вида для педа (Z), и проверим, что в ней находится игрок.
// Для этого надо проверить каждую из сторон трапеции на пересечение с линией (координаты игрока X ; произвольная точка Y)
// Если мы найдем больше одного пересечения - значит, точка с координатами игрока находится вне трапеции.
// Также, выполним проверку для Z-координат педа и игрока.
//
// __
// |Z|
// B --- C
// / \
// / \
// / \
// / X \
// A ----/-------- D
// /
// /
// /
// /
// Y
//
// Получаем позицию игрока (22@, 23@, 24@)
0AA6: call_method {CPed::GetBonePosition} 0x5E4280 struct 0@ num_params 3 pop 0 _bDynamic true _boneId 1 _point 22@v
// Проверяем, что пед и игрок находятся на одинаковой высоте
0087: 13@ = 24@
0063: 24@ -= 10@
if or
24@ > 2.0
24@ < -2.0
then
continue
end
// Количество пересечений
26@ = 0
// Проверка пересечения отрезков BA и XY
04C4: store_coords_to 13@ 14@ 15@ from_actor ped with_offset 1.0 0.0 0.0 // B
04C4: store_coords_to 15@ 16@ 17@ from_actor ped with_offset 15.0 15.0 0.0 // A
0AA7: call_function {DoesLineSegmentIntersect} 0x49D220 num_params 8 pop 8 _By2 -3000.0 _Bx2 -3000.0 _By1 23@ _Bx1 22@ _Ay2 16@ _Ax2 15@ _Ay1 14@ _Ax1 13@ _result 25@
if
08B7: test 25@ bit 0
then
26@++
end
// Проверка пересечения отрезков BC и XY
04C4: store_coords_to 17@ 18@ 19@ from_actor ped with_offset -1.0 0.0 0.0 // C
0AA7: call_function {DoesLineSegmentIntersect} 0x49D220 num_params 8 pop 8 _By2 -3000.0 _Bx2 -3000.0 _By1 23@ _Bx1 22@ _Ay2 18@ _Ax2 17@ _Ay1 14@ _Ax1 13@ _result 25@
if
08B7: test 25@ bit 0
then
26@++
end
// Проверка пересечения отрезков CD и XY
04C4: store_coords_to 13@ 14@ 15@ from_actor ped with_offset -15.0 15.0 0.0 // D
0AA7: call_function {DoesLineSegmentIntersect} 0x49D220 num_params 8 pop 8 _By2 -3000.0 _Bx2 -3000.0 _By1 23@ _Bx1 22@ _Ay2 14@ _Ax2 13@ _Ay1 18@ _Ax1 17@ _result 25@
if
08B7: test 25@ bit 0
then
26@++
end
// Проверка пересечения отрезков AD и XY
0AA7: call_function {DoesLineSegmentIntersect} 0x49D220 num_params 8 pop 8 _By2 -3000.0 _Bx2 -3000.0 _By1 23@ _Bx1 22@ _Ay2 14@ _Ax2 13@ _Ay1 16@ _Ax1 15@ _result 25@
if
08B7: test 25@ bit 0
then
26@++
end
// Если у нас не одно пересечение - игрок вне трапеции.
if
26@ <> 1
then
continue
end
// Итак, игрок находится в поле зрения педа.
// Создаем сферу и линию.
0AA6: call_method {CColSphere::Set} 0x40FD10 struct 20@ num_params 5 pop 0 _lighting 255 _flags 9 _material 0 _point 8@v _radius 12@
0AA6: call_method {CColLine::Set} 0x40EF50 struct 21@ num_params 2 pop 0 _end 5@v _start 2@v
// Проверяем, что сфера и линия пересекаются.
0AA7: call_function {CCollision::TestLineSphere} 0x417470 num_params 2 pop 2 _sphere 20@ _line 21@ _result 13@
if
88B7: not test 13@ bit 0
then
continue
end
// Проверяем, что между игроком и педом нет преград.
// При этом, игнорируем автомобиль педа.
03C0: 1@ = actor ped car
0A97: 1@ = car 1@ struct
0A8C: write_memory {CWorld::pIgnoreEntity} 0xB7CD68 size 4 value 1@ virtual_protect 0
0AA7: call_function {CWorld::ProcessLineOfSight} 0x56BA00 num_params 12 pop 12 0 0 0 0 _objects 1 _peds 0 _vehicles 1 _buildings 1 _pEntity 1@v _colPoint 20@ _end 5@v _start 2@v _result: 13@
0A8C: write_memory {CWorld::pIgnoreEntity} 0xB7CD68 size 4 value 0 virtual_protect 0
if
08B7: test 13@ bit 0
then
continue
end
// Выбираем поведение педа, в зависимости от его типа.
089F: get_actor ped pedtype_to 8@
if or
8@ < 0
8@ > 31
then
continue
end
// Если автомобиль "на ходу" - водитель попытается удрать, добавив скорости.
03C0: 1@ = actor ped car
02E3: 1@ = car 1@ speed
if
1@ > 3.0
then
gosub @EventDriveAway
else
8@ *= 4
005A: 8@ += 28@
0A8D: 8@ = read_memory 8@ size 4 virtual_protect 0
// Получаем случайное число (0 - 100 %)
0209: 1@ = random_int_in_ranges 0 100
gosub 8@
end
// Если рядом находятся полицейские - игрок получит звезду розыска.
if
not player.WantedLevel($PLAYER_CHAR) > 0
then
1@ = false
if
0AE1: 2@ = random_actor_near_point 22@ 23@ 24@ in_radius 20.0 find_next 0 pass_deads 1
then
repeat
089F: get_actor 2@ pedtype_to 3@
if
3@ == 6
then
1@ = true
end
until 8AE1: not 2@ = random_actor_near_point 22@ 23@ 24@ in_radius 20.0 find_next 1 pass_deads 1
end
if
1@ == true
then
player.WantedLevel($PLAYER_CHAR) = 1
end
end
{$I for_end}
{$I end}
// Здесь находится код поведения различных типов педов.
:event_skip
return
:event_civmale
// Если у педа есть оружие - шансов, что он будет атаковать, больше.
// Проверяем, есть ли у педа оружие.
0AB1: call @HasPedAnyWeapon 1 _ped_struct 11@ _result 4@
if
4@ == true
then
// 70% - будет атаковать
// 15% - будет пытаться уйти на автомобиле
// 15% - будет пытаться убежать, оставив автомобиль
if
1@ < 85
then
if
1@ < 70
then
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
else
05DD: AS_actor ped flee_from_actor $PLAYER_ACTOR from_origin_radius 100.0 timelimit -1
end
else
gosub @EventDriveAway
end
else
// Если нет оружия:
// 45% - будет пытаться уйти на автомобиле
// 45% - будет пытаться убежать, оставив автомобиль
// 10% - будет атаковать
if
1@ < 90
then
if
1@ < 45
then
05DD: AS_actor ped flee_from_actor $PLAYER_ACTOR from_origin_radius 100.0 timelimit -1
else
gosub @EventDriveAway
end
else
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
end
end
return
:event_civfemale
// Если у педа есть оружие - шансов, что он будет атаковать, больше.
// Проверяем, есть ли у педа оружие.
0AB1: call @HasPedAnyWeapon 1 _ped_struct 11@ _result 4@
if
4@ == true
then
// 50% - будет атаковать
// 25% - будет пытаться уйти на автомобиле
// 25% - будет пытаться убежать, оставив автомобиль
if
1@ < 75
then
if
1@ < 50
then
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
else
05DD: AS_actor ped flee_from_actor $PLAYER_ACTOR from_origin_radius 100.0 timelimit -1
end
else
gosub @EventDriveAway
end
else
// Если нет оружия:
// 30% - будет пытаться уйти на автомобиле
// 60% - будет пытаться убежать, оставив автомобиль
// 10% - будет атаковать
if
1@ < 90
then
if
1@ < 60
then
05DD: AS_actor ped flee_from_actor $PLAYER_ACTOR from_origin_radius 100.0 timelimit -1
else
gosub @EventDriveAway
end
else
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
end
end
return
:event_cop
if
not player.WantedLevel($PLAYER_CHAR) > 0
then
player.WantedLevel($PLAYER_CHAR) = 1
end
return
:event_gang
// Если у педа есть оружие - шансов, что он будет атаковать, больше.
// Проверяем, есть ли у педа оружие.
0AB1: call @HasPedAnyWeapon 1 _ped_struct 11@ _result 4@
if
4@ == true
then
// 80% - будет атаковать
// 20% - будет пытаться уйти на автомобиле
if
1@ < 80
then
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
else
gosub @EventDriveAway
end
else
// Если нет оружия:
// 50% - будет пытаться уйти на автомобиле
// 15% - будет пытаться убежать, оставив автомобиль
// 35% - будет атаковать
if
1@ < 85
then
if
1@ < 50
then
gosub @EventDriveAway
else
07A5: AS_actor ped attack_actor $PLAYER_ACTOR time -1
end
else
05DD: AS_actor ped flee_from_actor $PLAYER_ACTOR from_origin_radius 100.0 timelimit -1
end
end
return
// Проверка, что у педа есть оружие
:HasPedAnyWeapon // 0@ - структура педа
0@ += 0x5A0
for 1@ = 0 to 12
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
if
2@ <> 0
then
0AB2: ret 1 true
end
0@ += 0x1C
end
0AB2: ret 1 false
// Это стандартное поведение педа, автомобиль которого атакуют. Обычно, такой пед начинает удирать на автомобиле.
:EventDriveAway
03C0: 1@ = actor ped car
0A97: 1@ = car 1@ struct
0A8E: 2@ = 1@ + 0xC
0A8C: write_memory 2@ size 1 value 123 virtual_protect 0 // "Помечаем" этот автомобиль
0AA6: call_method {CEventVehicleDamageWeapon::CEventVehicleDamageWeapon} 0x61C2E0 struct 20@ num_params 3 pop 0 _type 31 _ped 0@ _vehicle 1@
0A8C: write_memory 20@ size 4 value 0x86D640 virtual_protect 0
0A8E: 1@ = 11@ + 0x47C
0A8D: 1@ = read_memory {CPed > CPedIntelligence} 1@ size 4 virtual_protect 0
1@ += 0x68
0AA6: call_method {CEventGroup::SetActorEvent} 0x4AB420 struct 1@ num_params 2 pop 0 _type 0 _data 20@
0AA6: call_method {CEventVehicleDamageWeapon::~CEventVehicleDamageWeapon} 0x4B1990 struct 20@ num_params 0 pop 0
return
// Буфер для хранения сферы (CColSphere)
:temp_sphere
hex
00000000 00000000 00000000 00000000 00000000
end
// Буфер для хранения линии (CColLine)
:temp_line
hex
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
end
// "Таблица" поведений педов
:ped_events
hex
00000000 // PLAYER1
00000000 // PLAYER2
00000000 // PLAYER_NETWORK
00000000 // PLAYER_UNUSED
00000000 // CIVMALE
00000000 // CIVFEMALE
00000000 // COP
00000000 // GANG1
00000000 // GANG2
00000000 // GANG3
00000000 // GANG4
00000000 // GANG5
00000000 // GANG6
00000000 // GANG7
00000000 // GANG8
00000000 // GANG9
00000000 // GANG10
00000000 // DEALER
00000000 // MEDIC
00000000 // FIREMAN
00000000 // CRIMINAL
00000000 // BUM
00000000 // PROSTITUTE
00000000 // SPECIAL
00000000 // MISSION1
00000000 // MISSION2
00000000 // MISSION3
00000000 // MISSION4
00000000 // MISSION5
00000000 // MISSION6
00000000 // MISSION7
00020001 // MISSION8
end
Вот клео скрипт который использует её. Но я напросто их не понимаю.
0AA7: call_function {CWorld::ProcessLineOfSight} 0x56BA00 num_params 12 pop 12 0 0 0 0 _objects 1 _peds 0 _vehicles 1 _buildings 1 _pEntity 1@v _colPoint 20@ _end 5@v _start 2@v
0AA6: call_method {CColSphere::Set} 0x40FD10 struct 20@ num_params 5 pop 0 _lighting 255 _flags 9 _material 0 _point 8@v _radius 12@ ?????
-
Стоп у MTA есть работа с ней а он открыт же. да УРА.
-
Да на MTA давно исходники были открыты. Плюс я писал в одном журнале про то, как компилировать данное чудо, журнал называется ПРОграммист 18 выпуск, тем найдете мою статью.
(https://www.dropbox.com/sc/r1zorx97s97s9ja/AABRRHKy-tlN0mYDKsD9lxzpa/0?dl=1)