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