You are not logged in.
Pages: 1
Название анимации хранится в CRC32, а не в текстовом виде, поэтому можно только сравнить, а получить текущее название не удастся. Может и есть способ, но я говорю изучив работу опкода, который ты в пример поставил.
И у stream memory fix вроде нет настроек, он просто прописывает лимиту memory дофига памяти(0x8A5A80 = 0xEFFFFFFF). Кому надо - меняйте значение через память(например cleo скриптом), единица измерения скорее всего в байтах(т.е. максимум ~3 ГБ)
Сам искал по мере изучения движка, тут по-моему ещё не всё=)
Вот, нашёл названия кое-каких функций(надо бы добавить в базу=)):
sub_43CEC0 = DrawRampageText
sub_45C210 = DrawReplayText
sub_493160 = RemoveSearchlight
sub_573AE0 = SetDefaultSettings (*used to set some options by default, for example - graphic settings)
sub_589650 = _?DrawStatBox
sub_719510 = SetFontShadowRGBA arg_0 = RGBA
sub_71A700 = DrawText? (*used to redraw? textures on screen)
_allocTobjModel - arg_0 = model_ID
byte_B6EC2E - keyboard_playing (*address used to check buttons for keyboard or joypad control)
Deniska, не проще ли использовать мой плеер?:crazy: Нагружаешь Алиена той же работой, которую я сделал, к тому же он не хотел добавлять новые опкоды, но если хочет - пусть делает. Я лично переписываю щас свой плеер под C++ и ещё есть такая функция - синхронизация громкости с громкостью звуков/радио игры, хотя я считаю не особо трудно скриптом сделать.
Можно поподробнее? Я C++ изучаю всего неделю где-то...
Вот допустим код функции:
VARIANT (__stdcall *FUNC_READ_VALUE)(char) = (VARIANT (__stdcall *)(char))GetProcAddress(Lib, "FUNC_READ_VALUE");
И как можно проще?
Может и проще, вобще я использую QuickOpcode Alexander'а, написанный ещё довольно давно и по мне так проще писать, чем через CLEO. В моей версии исправлен вылет, поддерживаются все типы строк, в том числе указатели на строку, возможно писать опкоды-проверки и с переменным колличеством параметров + немного ускорен алгоритм работы.
Руки не доходят выложить(= А насчёт функций, то вот например:
function FUNC_READ_VALUE(TP : Char) : Variant;
function FUNC_WRITE_VALUE(TP : Char; Value : Variant) : Boolean;
Вместо CHAR 'i' или 'f' для обозначения типа. Для чтения в одном случае читаем параметр как float, в другом как integer, а в записе надо тоже разные использовать, чтобы не сбивать с толку и не писать целые числа как дробные... (З.Ы. кстати Boolean надо убрать, а FUNC_ заменить на OPCODE_ тогда будет красиво=))
У меня возник вопрос по C++. Мне нужно воспользоваться типом Variant для возврата одной из функций, написанных в Дельфи. Я где-то читал, что аналогия вроде есть, но сам не нашёл. Кто-нибудь знает, как это можно сделать?
З.Ы. нашёл статью в MSDN, расписывающую структуру Variant'а... Знать бы как применить ещё:
http://msdn.microsoft.com/en-us/library/ms221627.aspx
Вроде бы вторая ссылка была полезнее. Нужно просто подключить к проэкту atlcomcli.h :
http://msdn.microsoft.com/en-us/library … 80%29.aspx
Если игра чистая, возможно проблема в exe. Попробуй этот:
У меня так и не работает( Заменил. Скрипт приблизительно такой выполняется:
//код миссии
0AB1: call @FUNC_FADE_IN_1000_MS 0
0AB1: call @FUNC_LOAD_CUTSCENE 1 params 12 // HOMSWET
...
:FUNC_LOAD_CUTSCENE
0@ == 22
jf @FUNC_LOAD_CUTSCENE_CASE_12
...
:FUNC_LOAD_CUTSCENE_CASE_12
0AB1: call @FUNC_FADE_IN 1 wait 500
0@ == 12
jf @FUNC_LOAD_CUTSCENE_END
---------
ЭТОТ КОД УЖЕ НЕ ВЫПОЛЯЕТСЯ!
---------
:FUNC_FADE_IN_1000_MS
0169: set_fade_color_RGB 0 0 1
fade 0 1000
:FUNC_FADE_IN_1000_MS_PROCESS
fading
jf @FUNC_FADE_IN_1000_MS_END
wait 0
jump @FUNC_FADE_IN_1000_MS_PROCESS
:FUNC_FADE_IN_1000_MS_END
0AB2: ret 0
:FUNC_FADE_IN
0169: set_fade_color_RGB 0 0 1
fade 0 0@
:FUNC_FADE_IN_PROCESS
fading
jf @FUNC_FADE_IN_END
wait 0
jump @FUNC_FADE_IN_PROCESS
:FUNC_FADE_IN_END
0AB2: ret 0
З.Ы. если не вызывать 0AB1: call @FUNC_FADE_IN 1 wait 500 то хотя бы катсцена проигрывается! То есть, после возврата функции не имеют предыдущих значения, а обнуляются!
Вроде опкод, находится ли актёр в поле зрения вот:
89ED: not actor $PLAYER_ACTOR is_within_field_of_view_actor 9@
А опкод
0364: actor 102@(42@,9i) spotted_actor $PLAYER_ACTOR
означает не задел ли актёр другого актёра
@Alien да, степень вложенности пока ограничена! После вызова call_scm_func из миссии, а затем вызвав из того кода ещё другую функцию, то переменные обнулятся, вместо того, чтобы вернуться как были. При вызове не из миссии - всё нормально работает!
Спасибо большое! Сейчас протестирую)
Алиен, но дело в том, то что мне бы использовать опкод call в миссии мейна! А оттуда он слетает. Ты мог бы сделать ну просто, поддержку этого опкода в стандартных миссиях СА? Я думаю это не сложно будет, но при вызове обратного ret с параметрами пусть так и останется 32 локальных переменных, а остальные переменные пусть остаются как были! У меня лично в миссиях этот опкод не работает, в последней версии ещё не пробовал.
Если что, был ведь какой-то код Симана, который позволял ставить таймеры не только на глобальные переменные, но и на локальные? Там вроде и был код, который определяет, запущена ли сейчас миссия или обычный поток, ну может это тебе поможет!:)
А возможно сделать работу опкода call_scm_func в миссиях? Мне бы просто им в миссии вызывать функции, а возврат параметров - необязательно. Просто чтоб реально в миссии было также вызвать функцию с параметрами, потому что возврат всех переменных сделать не получится - в миссии их больше) Просто очень надо или альтернативу этого опкода для работы в миссиях...
У меня... блин щас номер версии клео 4 не скажу) (не последня) там вобщем запускается внешний клео-скрипт опкодом 0A92: create_custom_thread "radio.lscr"
И в папке с игрой он отсутствовал - в результате игра слетала, в клео 3 у опкода была проверка на существование файла... Надо бы добавить
Дак а поддержка будет хотя бы для ини строк по указателю? Мне надо для скрипта, я вобще на квик опкоде уже написал)) Ну всё равно в клео лучше было бы иначе вобще смысл там какой, когда из ини считать стринг даже не получится скажем из-за того что указатели не поддерживаются...
а код ретурн иф фалс у меня приблизительно такой и есть, тока я иф не пишу - потому что проверка одна, мб из-за этого не срабатывает, хз... Ещё уточню)
Я заметил, что в клео-плагинах не работает с ини файлами строка по указателю. С этим не уверен, но помоему return_if_false так и не заработал правильно. У меня обычная крякнутая версия 1.0 US...
Я говорил о таких вот опкодах! Скачиваем квик опкод новый и смотрим! В архиве описаны все опкоды, там для работы со строками, полностью совместимо с клео4 и не мешает работе игры...
http://www.needforrace.ucoz.ru/load/6-1-0-22
0B10: allocate_string "blabla" at_address 0@
0B11: 1@ = string 0@ length
0B12: allocate_int_to_str 1@ at_address 0@
0B13: allocate_string_sum 0@ + 1@v at_address 0@
0B14: 0@ == 1@v // any strings
@mfisto, не ну чё надо было ещё объяснять! Нее, люди умные сидят, я кстати тоже не тупой, доработал квик опкод, не знаю, буду ли поддержку для линейки 3-ей гта делать, но для СА 1.0 работает нормалём, пришлось тоже скриптинговую систему изучать... Короче хорош оффтопить и понты гнуть, я лишь упомянул что это отключается, да я сам эту хрень долго найти не мог(= И писал я из под XP, так что я и физически не мог посмотреть где отключается - убрал и забыл...
@Alien а что по поводу добавления опкодов? Типа
00B0: allocate_string "HZHZH" at_address 0@
и
00B1: fill_memory_by 0 at_address 0@ size 255
вот типа того? Удобно - обнулить память одним опкодом! Тут в качестве первого параметра - байт к которому будут приравниваться все аддреса побайтово, начиная от заданного адресса ну и заканчивая, там зависимо от размера... Хотя этого можно не делать, я для себя сам напишу! Для других есть write_memory А вот первый опкод я считаю просто необходим!
@GTASA нет, не совсем, ещё модель не получил)) Вот так!(не тестировал)
03C0: 1@ = actor $PLAYER_ACTOR car
0441: 1@ = car 1@ model
0ADB: 0@v = car_model 1@ name
0ADE: 0@ = text_by_GXT_entry 0@v
...
А я отключил в Винде эту фичю и не парюсь(= Да и кстати, опкод return_if_false опять работать перестал... в предпоследней версии клео 3 он не работал, в последней работал, а в клео 4 опять нет(
нифига чё мутите))) Вобще респект! Чё не нравилось в 3 клео, то что когда я хотел обнулить сразу несколько байт памяти типа 0A8C: write_memory 0@ size 255 value 0 virtual_protect 0
то ничё не обнулялось, без понятия исправлено ли это в новой версии, щас тестить буду(= И если надо - могу дать исходники своего плеера(bass.dll), хз насколько надо... А так остаётся только пожелать удачи;)
З.Ы. обнаружил опкод 0AD2: $actor = player $PLAYER_CHAR targeted_actor. Тут для "джойстика" тоже работает? Просто адресса памяти разные нужно проверять(я сам пробовал)
А теперь у меня вопрос посложнее. Можно ли определить была ли загружена игра? Может загрузка оставляет за собой какой-нибудь мусор в памяти, по которому можно вычислить была ли недавно загрузка... В памяти игры я ничё поменять не могу в коде загрузки, т.к. нифига не смыслю в асме. Дак вот мне нужно сохранять инфу о звуках вместе с игрой(слот записи можно определить по адрессам 0xC16082 и 0xC16E0A). Слот загрузки можно определить по адрессам 0xC15FB2 и 0xC1601A. Но они всегда постоянны, поэтому даже при обнулении показывают текущий слот(да и кстати потом изменяют своё значение по непонятному для меня алгоритму(возможно последний занятый слот в списке + 1?) ). А как определить загружалась ли игра в ближайшее время не придумал. И нужно чтобы это определялось за минимальное время, иначе в Аудио Плеере возможны баги:rolleyes:
Первоначально расчитывал при запуске каждого опкода на проигрывание/остановку/проверку/установку параметров из Аудио Плеера проверять не загружалась ли игра. Если не определит, то возможно какой-то звук начнёт проигрываться и при последующей загрузке(если еще проверка сработает) он остановится, хотя должен играть по скрипту и загрузятся звуки по текущему слоту из файла... Вот пример бага, так что очень надеюсь на вашу помосчь:rolleyes:
*с этой проблемой справился
Хм, интересно:
f:=PLongInt($00B7CB64)^;
//f:=0.5;
i:=round(i*f/100);
Поясняю свои действия - Я попробовал поменять на тип PLongInt, звук не воспроизвёлся вобще. Значение адресса по умолчанию 1.0, ну я поставил опкодом на 0.5, значит значение по идее 0.5. НО ничего не заработало, потом я попробовал со строкой f:=0.5 - идеально. Звук проигрался в 2 раза медленнее, когда же я дописал строку /100, то звук воспроизвелся только при обычной скорости игры... Пока не знаю что это означает, надеюсь вы мне поможете разобраться. Впринципе могу исходники своего Аудио Плеера выложить, если сильно надо будет. Но я этого не собирался делать до выхода финальной версии. Для тех кто ещё не знает что он делает, скажу только одно))):
0B51: $GTA3_WAV_SOUND = play_audio "audio\GTA3\LIB_A1.mp3" direct_path 0 volume 100 position 0.0 loop 0 menu_flag 0 temp 0.0 samplerate 0 pitch 0 reverse 0 synchronize speed 1 volume 1
Ссыль на плагин кину в темку как доделаю версию 1.5, если кого заинтересовало. Ну всё, жду помощи:)
возможно, проблема в том, что double - 8 байт, а нужно четыре.
Ааа. Не подскажешь какой тип использовать? Я уже много попробовал: PInt, PByte, PDouble и т.п. PFloat на Делфи нет и справочников в инете не нашёл по типам хороших. Полазил в Windows.pas, нарыл:
ULONG = Cardinal;
PULONG = ^ULONG;
А Кардинал, помоему и есть что-то типа Float, но не подошло. Вот не знаю что делать(
Извиняюсь если вопрос не в ту тему) Вобщем у меня возникла проблема пр чтении памяти с Float значением. Мне нужно для своего плагина узнать скорость игры, но ничё не происходит. Делаю так:
//var f : real ; i : integer;
//i:=22050
//...
VirtualProtect(Ptr($00B7CB64),4,4,op);
f:=PDouble($00B7CB64)^;
i:=round(i*f);
//...
Это для аудио плагина чтобы скорость воспроизведения с игровой сравнять) Адресс вроде работает. Не знаю в чём прблема:(
Pages: 1