You are not logged in.
Ну вообще да, но пусть будет. Я кстати переписал парочку своих скриптов, вроде бы все работает, так что если никто не возражает, могу собрать архивы с парой примеров да выложить. Или Seemann'у скинуть, чтоб обновил на сайте. А то скоро сессия, некогда будет.
Выложи тут, посмотрим, потестируем. Если все пойдет хорошо, я конечно залью на cleo.li
Offline
На данный момент поддерживается только версия exe 1.0. Поддержка других версий скорее всего появится позже.
Пара примеров:
Пикапы для VC -
{$CLEO .cs}
0000:
//0A8C: write_memory 0x488D1F size 5 value 0x90 virtual_protect 1 //CPickups::DoPickUpEffects(CEntity *) for weapon pickups
0A8C: write_memory 0x4889C5 size 5 value 0x90 virtual_protect 1 //CPickups::DoPickUpEffects(CEntity *) for money pickups
0A8C: write_memory 0x43FAD5 size 1 value 0xE9 virtual_protect 1
0A8C: write_memory 0x43FAD6 size 4 value 0x00000546 virtual_protect 1
0A8C: write_memory 0x43F44B size 5 value 0x90 virtual_protect 1 //coronas
0A8C: write_memory 0x43F65A size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43F757 size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43F8A8 size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43FF7D size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43FFCD size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43F54C size 5 value 0x90 virtual_protect 1 //static shadows
0A8C: write_memory 0x43F860 size 5 value 0x90 virtual_protect 1
0A8C: write_memory 0x43F61B size 5 value 0x90 virtual_protect 1 //point light
while true
wait 0
9@ = 0x945D30
10@ = 0x94A13C
for 0@ = 9@ to 10@ step 0x34
0A8E: 5@ = 0@ + 0x0 // int
0A8D: 1@ = read_memory 5@ size 4 virtual_protect 0 //x
0A8E: 5@ = 0@ + 0x4 // int
0A8D: 2@ = read_memory 5@ size 4 virtual_protect 0 //y
0A8E: 5@ = 0@ + 0x8 // int
0A8D: 3@ = read_memory 5@ size 4 virtual_protect 0 //z
0A8E: 5@ = 0@ + 0x10 // int
0A8D: 6@ = read_memory 5@ size 4 virtual_protect 0 //6@ - [POINTER] - CObjectVC* pObject
0A8E: 5@ = 0@ + 0x22 // int
0A8D: 7@ = read_memory 5@ size 2 virtual_protect 0 //7@ - [WORD] - wModelId
if and
1@ <> 0.0
2@ <> 0.0
3@ <> 0.0
6@ <> 0
then
0AEC: 8@ = object_struct 6@ handle
if
03CA: object 8@ exists
then
if
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 60.0 60.0
then
if or
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 45.0 45.0
02CC: object 8@ bounding_sphere_visible
then
02CE: 4@ = ground_z 1@ 2@ 3@
inc(4@, 0.05)
0A8E: 5@ = 0@ + 8 // int
0A8C: write_memory 5@ size 4 value 4@ virtual_protect 0 //z
if
7@ <> 337 //#MONEY
then
0453: set_object 8@ XY_rotation 90.0 0.0 angle 134.0
else
0453: set_object 8@ XY_rotation 0.0 0.0 angle 5.0
end
0AB1: call_scm_func @createParticleForWeapon params_count 4 wModelId 7@ coords 1@ 2@ 4@
end
end
end
end
end // for
end
:createParticleForWeapon
0605: 4@ = model 0@ weapon id
if
4@ == -1
then
4@ = 37
end
4@ *= 8
4@ += 0x688098
0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 6@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 7@ = read_memory 4@ size 1 virtual_protect 0
if
0@ == 337 //#MONEY
then
5@ = 0
6@ = 155
7@ = 0
end
016F: create_particle 3 rotation_factor 0.0 size 0.5 intensity 255 color 5@ 6@ 7@ at 1@ 2@ 3@
0AB2: ret 0Скомпилированная версия - ivpickups.cs
Пикапы для III -
{$CLEO .cs}
0000:
//0A8C: write_memory 0x0047467D size 5 value 0x90 virtual_protect 1 //CPickups::DoPickUpEffects(CEntity *) for weapon pickups
0A8C: write_memory 0x0047459C size 5 value 0x90 virtual_protect 1 //CPickups::DoPickUpEffects(CEntity *) for money pickups
0A8C: write_memory 0x431B25 size 1 value 0xE9 virtual_protect 1
0A8C: write_memory 0x431B26 size 4 value 0x000000AF virtual_protect 1
0A8C: write_memory 0x43179D size 5 value 0x90 virtual_protect 1 //static shadows
0A8C: write_memory 0x431863 size 5 value 0x90 virtual_protect 1 //point light
0A8C: write_memory 0x43196C size 5 value 0x90 virtual_protect 1 //coronas
while true
wait 0
9@ = 0x878C98
10@ = 0x87B124
for 0@ = 9@ to 10@ step 0x1C
0A8E: 5@ = 0@ + 0x10 // int
0A8D: 1@ = read_memory 5@ size 4 virtual_protect 0 //x
0A8E: 5@ = 0@ + 0x14 // int
0A8D: 2@ = read_memory 5@ size 4 virtual_protect 0 //y
0A8E: 5@ = 0@ + 0x18 // int
0A8D: 3@ = read_memory 5@ size 4 virtual_protect 0 //z
0A8E: 5@ = 0@ + 0x4 // int
0A8D: 6@ = read_memory 5@ size 4 virtual_protect 0 //6@ - [POINTER] - CObjectVC* pObject
0A8E: 5@ = 0@ + 0x0C // int
0A8D: 7@ = read_memory 5@ size 2 virtual_protect 0 //7@ - [WORD] - wModelId
if
6@ <> 0
then
0AEC: 8@ = object_struct 6@ handle
if
03CA: object 8@ exists
then
if
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 80.0 80.0
then
if or
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 45.0 45.0
02CC: object 8@ bounding_sphere_visible
then
02CE: 4@ = ground_z 1@ 2@ 3@
inc(4@, 0.09)
0A8E: 5@ = 6@ + 0x3C // int
0A8C: write_memory 5@ size 4 value 4@ virtual_protect 0 //z
if
7@ <> 1323 //#MONEY
then
0453: set_object 8@ XY_rotation 90.0 0.0 angle 134.0
else
0453: set_object 8@ XY_rotation 0.0 0.0 angle 5.0
end
dec(4@, 0.05)
0AB1: call_scm_func @createParticleForWeapon params_count 4 wModelId 7@ coords 1@ 2@ 4@
end
end
end
end
end // for
end
:createParticleForWeapon
0605: 4@ = model 0@ weapon id
if
4@ == -1
then
4@ = 11
end
4@ += 0x5EDEBC
0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 6@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 7@ = read_memory 4@ size 1 virtual_protect 0
if
0@ == 1323 //#MONEY
then
5@ = 0
6@ = 155
7@ = 0
end
016F: create_particle 3 rotation_factor 0.0 size 0.5 intensity 255 color 5@ 6@ 7@ at 1@ 2@ 3@
0AB2: ret 0Скомпилированная версия - ivpickups.cs
На всякий случай прикладываю свои scm.ini + opcodes.txt - vc.zip | gta3.zip
Новые опкоды(включая дублирующие из клео4):
;CLEO2 opcodes 0600=-1,create_custom_thread %1s% 0601=1, is_button_pressed_on_pad %1d% 0602=2, emulate_button_press_on_pad %1d% sensitivity %2d% 0604=2,%2d% = weapon %1d% model 0605=2,%2d% = model %1d% weapon id 0606=3, set_mem_offset memory pointer %1d% memory to point %2d% virtual protect %3d% 0607=1, %1d% = get_current_weather 0608=3,show_text_position %1d% %2d% text %3d% 0609=-1,show_formatted_text_position %1d% %2d% text %3d% ;CLEO4 duplicate opcodes 0A8C=4,write_memory %1d% size %2d% value %3d% virtual_protect %4d% 0A8D=4,%4d% = read_memory %1d% size %2d% virtual_protect %3d% 0A8E=3,%3d% = %1d% + %2d% ; int 0A8F=3,%3d% = %1d% - %2d% ; int 0A90=3,%3d% = %1d% * %2d% ; int 0A91=3,%3d% = %1d% / %2d% ; int 0A92=-1,create_custom_thread %1s% 0A93=0,end_custom_thread 0A96=2,%2d% = actor %1h% struct 0A97=2,%2d% = car %1h% struct 0A98=2,%2d% = object %1h% struct 0A9F=1,%1d% = current_thread_pointer 0AA2=2,%2h% = load_library %1d% // IF and SET 0AA3=1,free_library %1h% 0AA4=3,%3d% = get_proc_address %1d% library %2d% // IF and SET 0AA5=-1,call %1d% num_params %2h% pop %3h% 0AA7=-1,call_function %1d% num_params %2h% pop %3h% 0AA6=-1,call_method %1d% struct %2d% num_params %3h% pop %4h% 0AA8=-1,call_function_method %1d% struct %2d% num_params %3h% pop %4h% 0AAA=2,%2d% = thread %1s% pointer 0AAB=1, file_exists %1d% 0AB0=1, key_pressed %1d% //VK_... 0AB1=-1,call_scm_func %1p% params_count %2d% 0AB2=-1,ret %1d% 0ABA=1,end_custom_thread_named %1s% 0AC6=2, %2d% = label %1p% offset 0AC7=2, %2d% = var %1d% offset 0ACA=1,show_text_box %1d% 0ACB=3,show_styled_text %1d% time %2d% style %3d% 0ACC=2,show_text_lowpriority %1d% time %2d% 0ACD=2,show_text_highpriority %1d% time %2d% 0ACE=-1,show_formatted_text_box %1d% 0ACF=-1,show_formatted_styled_text %1d% time %2d% style %3d% 0AD0=-1,show_formatted_text_lowpriority %1d% time %2d% 0AD1=-1,show_formatted_text_highpriority %1d% time %2d% 0ADB=2,%2d% = car_model %1o% name 0ADC=1, test_cheat %1d% 0ADF=2,add_dynamic_GXT_entry %1d% text %2d% 0AE0=1, remove_dynamic_GXT_entry %1d% 0AE1=7,%7d% = random_actor_near_point %1d% %2d% %3d% in_radius %4d% find_next %5h% pass_deads %6h% //IF and SET 0AE2=7,%7d% = random_vehicle_near_point %1d% %2d% %3d% in_radius %4d% find_next %5h% pass_wrecked %6h% //IF and SET 0AE3=6,%6d% = random_object_near_point %1d% %2d% %3d% in_radius %4d% find_next %5h% //IF and SET 0AE9=1,%1d% = pop_float 0AEA=2,%2h% = ped_struct %1d% handle 0AEB=2,%2h% = vehicle_struct %1d% handle 0AEC=2,%2h% = object_struct %1d% handle 0AEE=3,%3d% = %1d% exp %2d% //all floats 0AEF=3,%3d% = log %1d% base %2d% //all floats 0AF0=4,%4d% = get_int_from_ini_file %1s% section %2s% key %3s% 0AF1=4,write_int %1d% to_ini_file %2s% section %3s% key %4s% 0AF2=4,%4d% = get_float_from_ini_file %1s% section %2s% key %3s% 0AF3=4,write_float %1d% to_ini_file %2s% section %3s% key %4s% 0AF4=4,%4d% = read_string_from_ini_file %1s% section %2s% key %3s% 0AF5=4,write_string %1s% to_ini_file %2s% section %3s% key %4s% 0B10=3, %3d% = %1d% AND %2d% 0B11=3, %3d% = %1d% OR %2d% 0B12=3, %3d% = %1d% XOR %2d% 0B13=2, %2d% = NOT %1d% 0B14=3, %3d% = %1d% MOD %2d% 0B15=3, %3d% = %1d% SHR %2d% 0B16=3, %3d% = %1d% SHL %2d%
Также восстановлены следующие опкоды:
VC: 016F, 0349.
III: 0400, 0407, 04C4.
Last edited by Sergey81 (24-05-2015 20:51)
Offline
Новые опкоды(включая дублирующие из клео4):
Если я правильно понял, то в этой версии получается некоторые опкоды прописаны дважды? Т.е. например: 05E7 и 0A97
прикладываю свои scm.ini + opcodes.txt
Посмотрел scm.ini и opcodes.txt, там:
0400=1,save_mayhem_time %1d%
0407=1,time_taken_defuse_mission = %1d%
а вот
Также восстановлены следующие опкоды:
подразумевалось это?
0400: create_coordinate $448 $449 $450 from_object $714 offset -0.277 -16.662 3.152
0407: create_coordinate $1202 $1203 $1200 from_car $1185 offset 0.0 -20.0 0.0
Offline
Если я правильно понял, то в этой версии получается некоторые опкоды прописаны дважды? Т.е. например: 05E7 и 0A97
Да, можно адаптировать код между версиями, не занимаясь переименованием опкодов. Вот например примеры выше для SA:
{$CLEO .cs}
0000:
//0A8C: write_memory 0x00536541 size 5 value 0x90 virtual_protect 1 //CPickups::DoPickUpEffects(CEntity *)
0A8C: write_memory 0x00457485 size 3 value 0x90 virtual_protect 1 //object->__parent.physical.entity.placeable.m_pCoords->pos.z = outVec.z;
0A8C: write_memory 0x005361B5 size 4 value 0x537628 virtual_protect 1 // movzx edx,word ptr [008CD59C]
0A8C: write_memory 0x455C07 size 1 value 0xE9 virtual_protect 1
0A8C: write_memory 0x455C08 size 4 value 0x00000209 virtual_protect 1
0A8C: write_memory 0x45584E size 5 value 0x90 virtual_protect 1 //coronas
while true
wait 0
9@ = 0x9788C0
10@ = 0x97D620
for 0@ = 9@ to 10@ step 0x20
0A8E: 5@ = 0@ + 0x10 // int
0A8D: 1@ = read_memory 5@ size 2 virtual_protect 0 //x
1@ *= 0.125
0A8E: 5@ = 0@ + 0x12 // int
0A8D: 2@ = read_memory 5@ size 2 virtual_protect 0 //y
2@ *= 0.125
0A8E: 5@ = 0@ + 0x14 // int
0A8D: 3@ = read_memory 5@ size 2 virtual_protect 0 //z
3@ *= 0.125
0A8E: 5@ = 0@ + 0x4 // int
0A8D: 6@ = read_memory 5@ size 4 virtual_protect 0 //6@ - [POINTER] - CObjectVC* pObject
0A8E: 5@ = 0@ + 0x18 // int
0A8D: 7@ = read_memory 5@ size 2 virtual_protect 0 //7@ - [WORD] - wModelId
if and
1@ <> 0.0
2@ <> 0.0
3@ <> 0.0
6@ <> 0
then
0AEC: 8@ = object_struct 6@ handle
if
03CA: object 8@ exists
then
01BB: store_object 8@ position_to 1@ 2@ 3@
if
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 80.0 80.0
then
if or
00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 45.0 45.0
02CC: object 8@ bounding_sphere_visible
then
02CE: 4@ = ground_z 1@ 2@ 3@
inc(4@, 0.05)
01BC: put_object 8@ at 1@ 2@ 4@
if
7@ <> 1212 //#MONEY
then
0453: set_object 8@ XY_rotation 90.0 0.0 angle 134.0
else
0453: set_object 8@ XY_rotation 0.0 0.0 angle 5.0
end
0AB1: call_scm_func @createParticleForWeapon params_count 4 wModelId 7@ coords 1@ 2@ 4@
end
end
end
end
end // for
end
:createParticleForWeapon
for 10@ = 0 to 46
0AA7: call_function 0x454AC0 num_params 1 pop 1 10@ 12@ //weapon id to model id
if
003B: 0@ == 12@
then
0085: 4@ = 10@
break
end
end
if
4@ == 0
then
4@ = 37
end
4@ *= 8
4@ += 0x688098
0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 6@ = read_memory 4@ size 1 virtual_protect 0
4@ += 1
0A8D: 7@ = read_memory 4@ size 1 virtual_protect 0
if
0@ == 1212 //#MONEY
then
5@ = 0
6@ = 155
7@ = 0
end
016F: create_particle 3 rotation_factor 0.0 size 0.5 intensity 255 color 255 6@ 7@ at 1@ 2@ 3@
0AB2: ret 0а вот
подразумевалось это?
0400: create_coordinate $448 $449 $450 from_object $714 offset -0.277 -16.662 3.152
0407: create_coordinate $1202 $1203 $1200 from_car $1185 offset 0.0 -20.0 0.0
Хм, а ведь точно, я посмотрел что 04C4 нет в GTA3, и добавил два других на автомате. Поменяю тогда на новые id и перезалью.
EDIT: Перезалил, теперь так(только в GTA3):
04C2: create_coordinate $448 $449 $450 from_object $714 offset -0.277 -16.662 3.152 04C3: create_coordinate $1202 $1203 $1200 from_car $1185 offset 0.0 -20.0 0.0 04C4: create_coordinate $896 $897 $898 from_actor $854 offset 0.0 1.2 0.0
Last edited by Sergey81 (24-05-2015 10:30)
Offline
Нашел баг, стандартный опкод
00E1:
не пашет. На первый взгляд мне именно так показалось, версия для Вайса. Не для всех клавиш. Странно сейчас проверил - работает. Видимо проблема была в другом, выясняю...
Нашел косяк... Проблема в том что локальная переменная обнуляется после wait, такая проблема уже была у DK при тестах, но это было до того как он потерял исходники, видимо проблема вернулась снова, решайте как нибудь ее...
Last edited by mfisto (24-05-2015 13:17)
I know everything and nothing...
Offline
Offline
Я тут подумал, если номера опкодов совпадают, и нет нужды ставить аси лоадер, то может сделать одну asi на обе игры? Думаю, нет большой проблемы узнать в контексте какой игры загружена библиотека и соответственно поменять адреса памяти.
Offline
{$CLEO .cs}
0000:
:Noname_5
wait 0
if
Player.Defined($player_char)
jf @Noname_5
if
Player.Controllable($player_char)
jf @Noname_5
if
not Actor.Driving($player_actor)
jf @Noname_5
if
00E1: player 0 pressed_button 15
jf @Noname_5_1
03F0: enable_text_draw 1
0609: show_formatted_text_position 50.0 50.0 text "%d" 6@
set_actor_obj_no_obj $player_actor
05F5: call_scm_func @findnearestcar params_count 0 4@
if
not Car.Wrecked(4@)
jf @Noname_5
if
6@ == 0 // integer values
jf @Noname_5_0
16@ = 0
6@ = 1 // integer values
:Noname_5_0
if
6@ == 1
jf @Noname_5
if
16@ >= 500
jf @Noname_5
6@ = 2
jump @Noname_5
:Noname_5_1
// здесь я код сократил для теста он не нужен
jump @Noname_5
:findnearestcar
7@ = -1
8@ = 15.0
0054: store_player $PLAYER_CHAR position_to 12@ 13@ 14@
if
05F0: 15@ = random_vehicle_near_point 12@ 13@ 14@ in_radius 8@ find_next 0 pass_wrecked 1 //IF and SET
then
repeat
Car.StorePos(15@, 9@, 10@, 11@)
0063: 9@ -= 12@ // (float)
006B: 9@ *= 9@ // (float)
0063: 10@ -= 13@ // (float)
006B: 10@ *= 10@ // (float)
0063: 11@ -= 14@ // (float)
006B: 11@ *= 11@ // (float)
005B: 9@ += 10@ // (float)
005B: 9@ += 11@ // (float)
01FB: 9@ = square_root 9@
if
0025: 8@ > 9@ // (float)
then
0085: 8@ = 9@ // (int)
0085: 7@ = 15@ // (int)
end
until 85F0: not 15@ = random_vehicle_near_point 12@ 13@ 14@ in_radius 8@ find_next 1 pass_wrecked 1 //IF and SET
end
05F6: ret 1 7@Повторяю именно для Вайса, для трехи данный код срабатывает. Хотя как оказалось для трехи код не срабатывает там вообще ничего не выводится.
Last edited by mfisto (24-05-2015 15:30)
I know everything and nothing...
Offline
Повторяю именно для Вайса, для трехи данный код срабатывает.
Понял в чем дело, опкоды поиска не работают корректно, т.к. там смещения не поменяны.
Я тут подумал, если номера опкодов совпадают, и нет нужны ставить аси лоадер, то может сделать одну asi на обе игры? Думаю, нет большой проблемы узнать в контексте какой игры загружена библиотека и соответственно поменять адреса памяти.
Лучше пусть раздельно будет, меньше путаницы как по мне.
Offline
Обновил ссылку на версию для вайса, проверяй.
А что насчет трехи: там не выводится текст.
0609: show_formatted_text_position 50.0 50.0 text "%d" 6@
У меня выводится, только в центре экрана. Это вроде как баг вайдскрин фикса, надо будет исправить.
Offline
Вылетает при новой игре, если начать новую, я изменил скрипт, перезапустил и наблюдаю вылет.
Как так, я использую твой скрипт и все работает. Может ошибка в измененном скрипте?
Offline
Offline
Всегда вылетает на строчке с регистрацией custom текста. Каждый раз разная, в этот раз вот эта:
Registered custom text: "VCSGNS", "Pay ~h~$2000~w~ bribe to get back your weapons?
Убрал текст вообще, теперь вылет при Allocated memory f... А где можно адрес посмотреть? А все нашел... 00430c5e.
Last edited by mfisto (24-05-2015 19:01)
I know everything and nothing...
Offline
Давай еще раз по порядку, какой скрипт нужен и что надо сделать чтоб вылетело(и чтобы я смог воспроизвести).
Offline
Смотри бери мой скрипт, компилируй его и засовывай в игру, затем запускай новую игру, затем удаляй строчки с текстом, компилируй и снова запускай новую игру, будет ошибка 00430c5e. Но я как-то смог запустить один раз...
I know everything and nothing...
Offline
Но эта ошибка в функции CGarage::Update(), странно как-то. А до последнего обновления также было или вылета не было?
Offline
А установлен ли мой пример скрипта пикапов? У меня с ним действительно вылетает, если несколько раз начать новую игру, правда с другим адресом. Что-то связанное с рендером теней, создаваемых опкодом 016F. Буду разбираться.
EDIT: Скрипт обновил, там если радиус проверки снизить немного, то работает нормально.
Last edited by Sergey81 (24-05-2015 20:52)
Offline
Пример пикапов не установлен, перепробовал все: переименовывал файлы, скрипты убирал, ошибка та же. Заметил, что если какой-то файл переименовать, убрать расширение, то игра нормально без ошибок работает. Но это разово, затем все повторяется, при повторном запуске та же ошибка.
I know everything and nothing...
Offline
Очень странно, выложи тогда дамп, сгенерированный после вылета: http://dk22pac.blogspot.ru/2013/02/how- … files.html
Offline
Судя по дампу, вылетает на 0x66A702, но как это связано с клео я не очень понимаю. Воспроизводится ли вылет без скриптов, только с клео?
Offline