You are not logged in.
2Seemann:
Вот еще нарыл:
0047D099 > \6A 01 PUSH 1 ; Case 18E of switch 0047C108 0047D09B . 8BCE MOV ECX,ESI 0047D09D . E8 DE6FFEFF CALL gta_sa.00464080 0047D0A2 . 32C0 XOR AL,AL 0047D0A4 . 5F POP EDI 0047D0A5 . 5E POP ESI 0047D0A6 . 83C4 7C ADD ESP,7C 0047D0A9 . C2 0400 RETN 4 0048C206 > \6A 02 PUSH 2 ; Case 4E2 of switch 0048B5BB 0048C208 . 8BCE MOV ECX,ESI 0048C20A . E8 717EFDFF CALL gta_sa.00464080 0048C20F . 32C0 XOR AL,AL 0048C211 . E9 290A0000 JMP gta_sa.0048CC3F 00495A7D > \0FB605 81F0B600 MOVZX EAX,BYTE PTR DS:[B6F081] ; Case 68D of switch 00494005 00495A84 . 69C0 38020000 IMUL EAX,EAX,238 00495A8A . 8B88 38F3B600 MOV ECX,DWORD PTR DS:[EAX+B6F338] 00495A90 . 8B90 3CF3B600 MOV EDX,DWORD PTR DS:[EAX+B6F33C] 00495A96 . 8B80 40F3B600 MOV EAX,DWORD PTR DS:[EAX+B6F340] 00495A9C . E9 EE020000 JMP gta_sa.00495D8F 0046E91A > \6A 01 PUSH 1 ; Case 752 of switch 0046D076 0046E91C . 8BCE MOV ECX,ESI 0046E91E . E8 5D57FFFF CALL gta_sa.00464080 0046E923 . 32C0 XOR AL,AL 0046E925 . E9 6E040000 JMP gta_sa.0046ED98
004846EF > \6A 01 PUSH 1 ; Cases 3A7,3A8 of switch 00483BF2 004846F1 . 8BCE MOV ECX,ESI 004846F3 . E8 88F9FDFF CALL gta_sa.00464080 004846F8 . 32C0 XOR AL,AL 004846FA . E9 9C0F0000 JMP gta_sa.0048569B 00490FA0 > \6A 02 PUSH 2 ; Case 5E9 of switch 00490DD5 00490FA2 . 8BCE MOV ECX,ESI 00490FA4 . E8 D730FDFF CALL gta_sa.00464080 00490FA9 . 32C0 XOR AL,AL 00490FAB . E9 FB1A0000 JMP gta_sa.00492AAB 0049289D > \6A 09 PUSH 9 ; Case 636 of switch 00490DD5 0049289F . 8BCE MOV ECX,ESI 004928A1 . E8 DA17FDFF CALL gta_sa.00464080 004928A6 . 32C0 XOR AL,AL 004928A8 . E9 FE010000 JMP gta_sa.00492AAB 0047730C > \6A 02 PUSH 2 ; Case 93E of switch 004762E0 0047730E . 8BCE MOV ECX,ESI 00477310 . E8 6BCDFEFF CALL gta_sa.00464080 00477315 . 32C0 XOR AL,AL 00477317 . 5F POP EDI 00477318 . 5E POP ESI 00477319 . 5B POP EBX 0047731A . 81C4 84000000 ADD ESP,84 00477320 . C2 0400 RETN 4 0047742B > \6A 01 PUSH 1 ; Case 945 of switch 004762E0 0047742D . 8BCE MOV ECX,ESI 0047742F . E8 4CCCFEFF CALL gta_sa.00464080 00477434 . 8B0D 783CA400 MOV ECX,DWORD PTR DS:[A43C78] 0047743A . 69C9 90010000 IMUL ECX,ECX,190 00477440 . 0FB691 E8CEB700 MOVZX EDX,BYTE PTR DS:[ECX+B7CEE8] 00477447 . E9 93070000 JMP gta_sa.00477BDF 0047AC3E > \6A 01 PUSH 1 ; Case 9D8 of switch 0047A787 0047AC40 . 8BCE MOV ECX,ESI 0047AC42 . E8 3994FEFF CALL gta_sa.00464080 0047AC47 . 32C0 XOR AL,AL 0047AC49 . E9 E3120000 JMP gta_sa.0047BF31
2Seemann:
А почему 3AD и 91A пустышки?
0048475A > \6A 01 PUSH 1 ; Case 3AD of switch 00483BF2 0048475C . 8BCE MOV ECX,ESI 0048475E . E8 1DF9FDFF CALL gta_sa.00464080 00484763 . A1 783CA400 MOV EAX,DWORD PTR DS:[A43C78] 00484768 . 85C0 TEST EAX,EAX 0048476A . 74 11 JE SHORT gta_sa.0048477D 0048476C . 6A 01 PUSH 1 0048476E . E8 4DBD2900 CALL gta_sa.007204C0 00484773 . 83C4 04 ADD ESP,4 00484776 . 32C0 XOR AL,AL 00484778 . E9 1E0F0000 JMP gta_sa.0048569B 0048477D > 6A 00 PUSH 0 0048477F . E8 3CBD2900 CALL gta_sa.007204C0 00484784 . 83C4 04 ADD ESP,4 00484787 . 32C0 XOR AL,AL 00484789 . E9 0D0F0000 JMP gta_sa.0048569B 004768D5 > \6A 02 PUSH 2 ; /Arg1 = 00000002; Case 91A of switch 004762E0 004768D7 . 8BCE MOV ECX,ESI ; | 004768D9 . E8 B2DEFEFF CALL gta_sa.00464790 ; \gta_sa.00464790 004768DE . 32C0 XOR AL,AL 004768E0 . 5F POP EDI 004768E1 . 5E POP ESI 004768E2 . 5B POP EBX 004768E3 . 81C4 84000000 ADD ESP,84 004768E9 . C2 0400 RETN 4
00490FA0 > \6A 02 PUSH 2 ; Case 5E9 of switch 00490DD5 00490FA2 . 8BCE MOV ECX,ESI 00490FA4 . E8 D730FDFF CALL gta_sa.00464080 00490FA9 . 32C0 XOR AL,AL 00490FAB . E9 FB1A0000 JMP gta_sa.00492AAB
2Seemann:
1. Является ли этот опкод пустышкой?
2. CALL gta_sa.00464080 - что за процедура?
Дизассемблировать 14 мб идой надо неимеворное терпение :), уж лучше OllyDbg
---
IDA Pro 5.0.0.879 Advanced Full with SDK, Flair and WinCE Debugger -
[You must login to view hidden text.]
Ссылку спрятал в тег hide.
Если кто-то обладает знаниями ассемблера и может объснить отдельные элементы простым языком - пишите в этой теме.
Вот отличная книга там достаточно просто все описанно.
Команда: CALL операнд
Назначение: Вызов процедуры
Процессор: 8086Сохраняет текущий адрес в стеке и передает управление по адресу, указанному в операнде. Операндом может быть непосредственное значение адреса (метка в ассемблерных программах), регистр или переменная, содержащие адрес перехода. Если в качестве адреса перехода указано только смещение, считается, что адрес расположен в том же сегменте, что и команда CALL. При этом, так же как и в случае с JMP, выполняется ближний вызов процедуры. Процессор помещает значение регистра EIP (IP при 16-битной адресации), соответствующее следующей за CALL команде, в стек и загружает в EIP новое значение, осуществляя тем самым передачу управления. Если операнд CALL — регистр или переменная, то его значение рассматривается как абсолютное смещение, если операнд — метка в программе, то ассемблер указывает ее относительное смещение. Чтобы осуществить дальний CALL в реальном режиме, режиме V86 или в защищенном режиме при переходе в сегмент с теми же привилегиями, процессор помещает в стек значения регистров CS и EIP (IP при 16-битной адресации) и выполняет дальний переход аналогично команде JMP.
Проблема заключается в другом.
E8 7FE19EFF // call 0x438370 = 4424560это я вызываю процедуру из gta-sa.exe по адресу 0x438370.
E8 - опкод инструкции call, если параметр идет как локальное смещение. 0xFF9EE17F это локальное смещение от данной команды до процедуры.
А есть еще call с параметром как глобальный адрес. Т.е. там значение не зависит уже от позиции команды, оно постоянно: 0x438370. Но у меня не получается заставить это работать.
А GetProcAddress пробовал? Сам проверить не могу игры пока нет 
2Seemann
2Sanchez
угу, санник 3-й версии уже умеет такое.
А во второй добавить это можно? Или скоро выйде 3 версия
.
2Alexander
Сделать бы ещё поддержку финкций и цены бы ему не было , правда и так уже самый лучший билдер .
Об это я уже спрашивал читай 17 пост.
а, ну все, понял. да, я тоже такое хочу, но это не так просто реализовать. не буду ничего обещать, но возможно SB3, если он выйдет когда-нибудь, будет их поддерживать...
var $a, $b, $c: Integer $x, $y, $z: Float end
Данный адрес - это начало перечня моделей для каждого типа поезда. Всего определено 16 блоков-перечней (по числу типов), каждый из которых содержит 16 чисел типа DWord, определяющих номер модели поезда и его вагонов.
Откуда взялись еще два вагона? Можно перезаписать другие типы? Тогда получается что можно создать 16 * 16 = 256 вагонов (теоретически).
2Seemann
for 0@ = -382229 to -382216 wait 0 &0(0@,1i) = #STREAKC end
Почему используются отрицательные числа?
в San Andreas есть адрес 0x8D44F8.
Почему же в коде этот адрес не встречается?
Домашнее задание: проверьте это
054C: use_GXT_table 'POOL' 01E3: text_1number_styled 'NUM' &0 5000 ms 1 // ~1~
У меня первые четыре байта другие. Это постоянное число или нет?


А про поезд подробнее можно?
for 0@ = -382229 to -382216 wait 0 &0(0@,1i) = #STREAKC end
Почему используются отрицательные числа?
в San Andreas есть адрес 0x8D44F8.
Почему же в коде этот адрес не встречается?
2Seemann
Часовой пояс видимо неправильно настроен, мне приходится ставить +5, хотя время Московсое.
Все нормально
(Opera)
Не понял, уточни пожалуйста.
Например, определил в начале потока функции, а потом где нужно использовать их. Чтобы неписать одно и то же по несколько раз.
p.s. как function() в delphi
Хорошо бы реализовать функции (или что тот набодобее того), что бы весь код можно было записать в одном потоке.
Потому что самого СБ3 еще мало. В блоге мы будем публиковать информацию о разработке.
Да такой степени мало, что даже нечего писать.
Совсем без рангов тоже не интересно. Это уже социализм получается
Хотя если большинство будет ЗА, то конечно ранги будут убраны.
Так что насчет рангов?
Ранги и репутация - порождают флуд, делая из серьёзного сайта помойку...
Я не думаю что 10 человек будут флудить.
Как я понял, пока не залогинился на форуме используется английский язык с кодировкой iso-8859-1 в этом случае русский текс не читаем, нельзя ли установить по умолчанию русский язык или изменить кодировку на windows-1251.
Можно как в гта в статистики за прохождение.
2Seemann
Может быть, я только высказал своё мнение.
Ну, а ту то что неправильно? Все перепробовал. Сначало все норамльно работает, а после того как взорвешь тачку - маркер на тачке не проподает сразу, когда проподает все виснет. Пробовал и wait везде запихивать но тот же результат.
var
$car: Array 2 of Car
$actor: Array 2 of Actor
$marker: Array 2 of Marker
$flag_dest_car: Array 2 of Integer
$flag_pl_car: Array 2 of Integer
$count: Integer = 2
$check: Integer = 0
end // var
#ADMIRAL.Load
while not #ADMIRAL.Available
wait 0
end
#MAFFA.Load
while not #MAFFA.Available
wait 0
end
for $i = 0 to $count // step 1
wait 250
if
$i == 0
then
0@ = 1821.6421
1@ = -1720.1123
2@ = 12.982
end
if
$i == 1
then
0@ = 490.3722
1@ = -1307.807
2@ = 15.1438
end
if
$i == 2
then
0@ = 2300.0854
1@ = -1151.4205
2@ = 26.2798
end
0395: clear_area 1 at 0@ 1@ 2@ range 5.0
$car[$i].Create(#ADMIRAL, 0@, 1@, 2@)
0229: set_car $car[$i] color_to 0 0
0129: $actor[$i] = create_actor 20 #MAFFA in_car $car[$i] driverseat
$marker[$i].CreateAboveCar($car[$i])
$car[$i].SetMaxSpeed(17.0)
00AE: unknown_set_car $car[$i] to_ignore_traffic_lights 0
$car[$i].ImmuneToNonPlayer(True)
$car[$i].SetDriverBehaviour(FollowRoad)
$flag_dest_car[$i] = 0
$flag_pl_car[$i] = 0
end // for
while $check <> 3
wait 0
for $i = 0 to $count // step 1
if and
$car[$i].Wrecked
$flag_dest_car[$i] == 0
then
$marker[$i].Disable
$flag_dest_car[$i] = 1
$check += 1
end // if
if and
not $car[$i].Wrecked
8185: not car $car[$i] health >= 999
not $actor[$i].Dead
$actor[$i].InCar($car[$i])
then
$car[$i].SetMaxSpeed(25.0)
00AE: unknown_set_car $car[$i] to_ignore_traffic_lights 2
$car[$i].ImmuneToNonPlayer(False)
end // if
if and
not $car[$i].Wrecked
Actor.InCar($PLAYER_ACTOR, $car[$i])
$flag_pl_car[$i] == 0
then
$car[$i].ImmuneToNonPlayer(False)
$flag_pl_car[$i] = 1
end // if
end // for
end // while
Будет ли там возможнось отлаживать свой написаный код. Я имею ввиду брейкпоинты.
Может им хотелось, что бы так думали... :-)
Да мне тоже так кажется.
Вряд ли. Больно уж конструкции оттуда схожи с теми, что мы имеем в SCM.
Я не думаю что весь код можно написть в таком виде, больно долго и муторно. Вот гта 3 можно (да и то врят ли), там всего код занимал 2 мб, но гта са с 14 мб, отлаживать столь большой код замучеешься. Хотя кто их там знает. 
Хорошо бы реализовать конструкцию if...elseif...else.
Не стал создовать новый топик, думаю и здесь ответят:):):)
После компиляции этого кода, при старте миссии игра выдает ошибку, в чем проблема вроде wait везде стоит.
DEFINE OBJECTS 0
DEFINE MISSIONS 1
DEFINE MISSION 0 at @MyMission
DEFINE EXTERNAL_SCRIPTS -1 // Use -1 to not write AAA script
DEFINE UNKNOWN_EMPTY_SEGMENT 0
DEFINE UNKNOWN_THREADS_MEMORY 0
// --------------------
// THE STRIPPED MAIN THREAD
// contains initial info
// --------------------
thread 'Main'
var
$PLAYER_CHAR: Player
end // var
01F0: set_max_wanted_level_to 6
set_wb_check_to 0
00C0: set_current_time 8 0
04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
Camera.SetAtPos(2488.5601, -1666.84, 13.38)
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
Camera.SetBehindPlayer
set_weather 0
wait 0 ms
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
$PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
$PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
$PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
$PLAYER_CHAR.Build
$PLAYER_CHAR.CanMove = True
fade 1 (out) 0 ms
select_interior 0
0629: change_stat 181 (islands unlocked) to 4
016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 unknown 0
016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 unknown 0
// put your create_thread commands here
0180: set_on_mission_flag_to $ONMISSION
create_thread @MyTrigger
end_thread
// put your mission mods here
:MyTrigger
thread "MyTrigger"
$TrigMarker = Marker.CreateIconAndSphere(15, 2489.0591, -1682.2808, 13.3358)
while $MyMission_Passed == 0
wait 250
if Player.Defined($PLAYER_CHAR)
then
if $ONMISSION == 0 // integer values
then
if 00FF: actor $PLAYER_ACTOR 0 2489.0591 -1682.2808 13.3358 radius 1.0 1.0 2.0
then
if Player.Controllable($PLAYER_CHAR)
then
$ONMISSION = 1 // integer values
00BA: text_styled 'INTRO_1' 1000 ms 2 // Big Smoke
Marker.Disable($TrigMarker)
start_mission MyMission
end // if1
end // if2
end // if3
end // if4
end // while
end_thread
:MyMission
thread "MyMission"
gosub @MissionStart
if
wasted_or_busted
then
gosub @MissionFailed
end
gosub @MissionCleanup
end_thread
:MissionStart
var
$car: array 3 of Car
$actor: array 3 of Actor
$box: array 3 of Pickup
$marker_car: array 3 of Marker
$marker_box: array 3 of Marker
$check: Integer = 0
$count: Integer = 3
end
#SECURICA.Load
while not #SECURICA.Available
wait 0
end
#WMOPJ.Load
while not #WMOPJ.Available
wait 0
end
for $index = 1 to $count
wait 250
if
$index = 1
then
0@ = 1821.6421
1@ = -1720.1123
2@ = 12.982
end
if
$index = 2
then
0@ = 490.3722
1@ = -1307.807
2@ = 15.1438
end
if
$index = 3
then
0@ = 2300.0854
1@ = -1151.4205
2@ = 26.2798
end
$car[$index].Create(#SECURICA, 0@, 1@, 2@)
0129: $actor[$index] = create_actor 4 #WMOPJ in_car $car[$index] driverseat
$marker_car[$index].CreateAboveCar($car[$index])
018B: show_on_radar $marker_car[$index] 3
Car.SetMaxSpeed($car[$index], 20.0)
00AE: unknown_set_car $car[$index] to_ignore_traffic_lights 2
Car.ImmuneToNonPlayer($car[$index]) = True
Car.SetDriverBehaviour($car[$index], FollowRoad)
end
while $check_car = 6
wait 0
for $index = 1 to $count
wait 250
if
$car[$index].Wrecked
then
$marker_car[$index].Disable
$check += 1
0407: create_coordinate 3@ 4@ 5@ from_car $car[$index] offset 0.0 0.0 0.0
$box[$index].Create(#BRIEFCASE, 3, 3@, 4@, 5@)
03DC: $marker_box[$index] = create_marker_above_pickup $box[$index]
018B: show_on_radar $marker_box[$index] 2
end
if
$box[$index].Picked_up
then
$marker_box[$index].Disable
$check += 1
end
end
end
gosub @MissionPassed
return
:MissionPassed
01E3: text_1number_styled 'M_PASSD' 0 5000 ms 1 // MISSION PASSED!
$MyMission_Passed = 1
return
:MissionFailed
00BA: text_styled 'M_FAIL' 5000 ms 1 // ~r~MISSION FAILED!
return
:MissionCleanup
$ONMISSION = 0 // integer values
mission_cleanup
return2Seemann за Car.SetDriverBehaviour() спасибо, все работает.