You are not logged in.
Вылетает при новой игре, если начать новую, я изменил скрипт, перезапустил и наблюдаю вылет.
Как так, я использую твой скрипт и все работает. Может ошибка в измененном скрипте?
Обновил ссылку на версию для вайса, проверяй.
А что насчет трехи: там не выводится текст.
0609: show_formatted_text_position 50.0 50.0 text "%d" 6@
У меня выводится, только в центре экрана. Это вроде как баг вайдскрин фикса, надо будет исправить.
Повторяю именно для Вайса, для трехи данный код срабатывает.
Понял в чем дело, опкоды поиска не работают корректно, т.к. там смещения не поменяны.
Я тут подумал, если номера опкодов совпадают, и нет нужны ставить аси лоадер, то может сделать одну asi на обе игры? Думаю, нет большой проблемы узнать в контексте какой игры загружена библиотека и соответственно поменять адреса памяти.
Лучше пусть раздельно будет, меньше путаницы как по мне.
Выложи пример скрипта, где так происходит.
Если я правильно понял, то в этой версии получается некоторые опкоды прописаны дважды? Т.е. например: 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
На данный момент поддерживается только версия 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.
Ну вообще да, но пусть будет. Я кстати переписал парочку своих скриптов, вроде бы все работает, так что если никто не возражает, могу собрать архивы с парой примеров да выложить. Или Seemann'у скинуть, чтоб обновил на сайте. А то скоро сессия, некогда будет.
Ну почему, для меня того факта что можно под три игры писать одним набором опкодов и то, что игра не вылетает при загрузке сейва/новой игры каждый раз уже достаточно.
Возможно будет со временем, точно не знаю пока.
Было бы неплохо иметь какой-нибудь простенький пример скрипта для этих опкодов, чтобы сразу проверить работает или нет. Я имею в виду пример с scm функцией, а потом я её заменю на опкод и проверю работоспособность. Сам бы написал, но скоро сессия и пока не до этого.
Гораздо логичнее будет если в рамках одной игры все опкоды добавляются последовательно, без "дыр" в нумерации.
Ну не знаю, как по мне так опкод с определенным номером должен делать одно и то же во всех играх(как и большинство стандартных опкодов).
Нет, номера я не меняю, все опкоды, которые были в оригинальной версии они так и остались. В добавку к этому они дублируются с номерами опкодов из CLEO4.
Единственное, что я пока не уверен как будет, это несколько новых опкодов:
0x0600, START_CUSTOM_THREAD_VSTRING
0x0601, IS_BUTTON_PRESSED_ON_PAD
0x0602, EMULATE_BUTTON_PRESS_ON_PAD
0x0603, IS_CAMERA_IN_WIDESCREEN_MODE
0x0604, GET_MODEL_ID_FROM_WEAPON_ID
0x0605, GET_WEAPON_ID_FROM_MODEL_ID
0x0606, SET_MEM_OFFSET
0x0607, GET_CURRENT_WEATHER
0x0608, SHOW_TEXT_POSITION
0x0609, SHOW_FORMATTED_TEXT_POSITIONIS_CAMERA_IN_WIDESCREEN_MODE есть в SA, GET_CURRENT_WEATHER/SHOW_TEXT_POSITION/SHOW_FORMATTED_TEXT_POSITION были в new opcodes для SA, остальных не было нигде. Поэтому не уверен какие номера им тут поставить. Наверно лучше сделать номера больше, чем номер последнего опкода клео 4, на случай если они появятся в клео 4, чтобы не было путаницы потом.
Я уже добавил некоторые из опкодов из клео4, в том числе для работы с ini, звук пока не обещаю, битовые операции тоже есть. Все оригинальные опкоды были продублированы с номерами клео4 (05EE: - 0AB0:), добавленные опкоды клео4 соответственно с теми же номерами.
Всё это пока для вайса, но перенести будет не долго.
Про компоненты, если есть scm функции, которые хотелось бы превратить в опкод, просьба выложить здесь.
Это хорошо! Опкоды для работы с ini файлами и опкоды для работы с внешними звуковыми файлами будут?
Список новых опкодов можно посмотреть?
Огласите весь список пожалуйста.
Я решил немного помочь с разработкой, на данный момент новый опкод у DK только один был сделан, START_CUSTOM_THREAD_VSTRING. Для VC хочу восстановить 016F и 0349, плюс добавить несколько новых в обе версии.
Я имею в виду что невозможно установить несколько курсоров на идущие подряд строки:

Частичное выделение в нескольких строках(через alt+shift) не работает, возможно ли исправить?
А еще неплохо было бы, если файл изменился в другом редакторе, предлагать обновить содержимое в SB.
так ведь нету же live ?
Ну я имею в виду asi loader, отключающий мультиплеер и может еще с какими-нибудь возможностями.
А будет что-нибудь подобное xliveless?
В паблике не так давно появилась замечательная база EFLC http://public.sannybuilder.com/gtasa_ex … 141007.rar
А для GTA IV 1.0.7 имеется подобная?
Ну лучше наверно завести переменную и заполнять её после проверки на версию exe. К примеру как тут - https://github.com/ThirteenAG/Widescree … in.cpp#L37
Пример do...while в принципе в гугле найти не сложно, но если очень хочется: https://github.com/ThirteenAG/Widescree … in.cpp#L12
1) Например вот так можно: https://github.com/ThirteenAG/Y-Axis_Se … llmain.cpp
2) do...while
974B2C cTimer_m_snTimeInMilliseconds
Я тут попробовал ошибку 'database is corrupt' убрать тем же способом, что и про pirated version, а оно оказывается работает. Теперь все базы от 6.1 конвертируются без проблем в 6.5. Всем кто в пм спрашивал ссылку выслал снова.