You are not logged in.
Pages: 1
C помощью данной программы-библиотеки можно легко и быстро добавлять свои scm-опкоды
используя практически любой язык программирования , конечно не все так просто , но кому
будет надо , тот разберется .
В библиотеке реализованы базовые функции работы с опкодами - чтение/запись параметров
практически всех типов данных , использующихся в scm . Гибкая система плагинов делает это
еще проще .
В комплекте идут три демо-плагина , реализующие опкоды работы с GXT записями , INI-файлами и
строками , плагин работы с INI явялется opensource ( исходники на Delphi в архиве ) .
Добавленные опкоды :
-Строки
0B10: alloc_string "blahblahblah" store_handle_to 0@
0B11: free_allocated_string handle 0@
-GXT
0B20: reset_GXT_entries
0B21: add_GXT_entry name "gxt_entry" value "blahblahblah"
0B22: add_GXT_entry name "gxt_entry" string_handle 0@
0B23: delete_added_GXT_entry name "gxt_entry"
-INI
0B30: create_ini_file name "CONFIG.INI" handle 0@
0B31: create_ini_file name_handle 1@ handle 0@
0B32: destroy_ini_file handle 0@
0B33: read_int ini_file 0@ section "SECTION" param "PARAM" store_to 1@
0B34: read_int ini_file 0@ section_handle 1@ param_handle 2@ store_to 3@
0B35: write_int ini_file 0@ section "SECTION" param "PARAM" value 18
0B36: write_int ini_file 0@ section_handle 1@ param_handle 2@ value $Value
0B37: read_float ini_file 0@ section "SECTION" param "PARAM" store_to 1@
0B38: read_float ini_file 0@ section_handle 1@ param_handle 2@ store_to 3@
0B39: write_float ini_file 0@ section "SECTION" param "PARAM" value 18.27
0B3A: write_float ini_file 0@ section_handle 1@ param_handle 2@ value 20@
0B3B: read_str ini_file 0@ section "SECTION" param "PARAM" store_to 1@
0B3C: read_str ini_file 0@ section_handle 1@ param_handle 2@ store_to 3@
0B3D: write_str ini_file 0@ section "SECTION" param "PARAM" string "VALUE"
0B3E: write_str ini_file 0@ section_handle 1@ param_handle 2@ str_handle 3@
0B3F: del_section ini_file 0@ section_name "SECTION"
0B40: del_section ini_file 0@ section_name_handle 1@
0B41: del_key ini_file 0@ section_name "SECTION" key_name "PARAM"
0B42: del_key ini_file 0@ section_name_handle 1@ key_name_handle 2@
Качаем , как всегда , с моего сайта:
http://Alexander.SannyBuilder.com
Offline
Ам.. вопрос. Как должна выглядеть запись в ini-файле?
Всмысле так
section param value
или так
[section] [param] [value]
Last edited by flashTrash (05-08-2008 13:51)
Offline
[section]
param=value
param2=value
[section2]
param=value
[small][/small]
Offline
VcSaJen
Большое спасибо
Добавленно.
никак не въеду, почему на опкод > 0B30 игра сразу вылетает. что не правильно?
0B30: create_ini_file name "test.ini" handle 8@ 0B33: read_int ini_file 8@ section "555" param "444" store_to 1@ Файл test.ini [555] 444=22
Last edited by flashTrash (06-08-2008 10:00)
Offline
Вот экспортировал несколько опкодов. Процедуры-опкоды OPCODE_GET_STR_LENGTH, OPCODE_STR_TO_INT работают нормально, но только если в опкоде указать строку. Если указать стринговую переменную, то игра виснет несмотря на [c]try..finally[/c]. А функция OPCODE_INT_TO_STR будет нормально работать? Как можно сделать?
procedure OPCODE_GET_STR_LENGTH; var s: string; begin s:=FUNC_READ_OPCODE_STRING; FUNC_WRITE_VALUE('i', Length(s)); end; procedure OPCODE_STR_TO_INT; var s: string; i: Integer; begin try i:=666; s:=FUNC_READ_OPCODE_STRING; i:=StrToInt(s); finally FUNC_WRITE_VALUE('i', i); end; end; procedure OPCODE_INT_TO_STR; var i: integer; p: PString; begin i:=FUNC_READ_VALUE('i'); p:=Pointer(FUNC_READ_POINTER('l')); p^:=IntToStr(i); end; procedure OPCODE_STR_TO_FLOAT; var s: string; f: Single; begin try f:=666.0; s:=FUNC_READ_OPCODE_STRING; f:=StrToFloat(s); finally FUNC_WRITE_VALUE('f', f); end; end; procedure OPCODE_FLOAT_TO_STR; var f: Single; p: PString; begin f:=FUNC_READ_VALUE('f'); p:=Pointer(FUNC_READ_POINTER('l')); p^:=FloatToStr(f); end;
Last edited by VcSaJen (29-08-2008 10:50)
[small][/small]
Offline
Помогите плиз.
Я пставил Quick opcode чтобы записывать координаты в ини файл для телепорта, типо чтобы места запоминались.
В скрипте есть integer(целочисленная) переменная, которая содержит номер места
Можно сделать так, чтобы секции в ИНИ файле назывались с её использованием? Иначе только последнее место запоминается
GIMS developer
Offline
@Seemann -
SCMLog конфликтует с QuickOpcode, когда SCMLog установлен, то:
1) Глючит QuickOpcode: не работает нормально функция FUNC_READ_VALUE, работает только один раз, на второй раз игра зависает.
2) Написал функцию:
procedure _OpGetNumberParams(Null1,Null2,Null3: DWord;Count:DWord); asm PUSH EBX PUSH ECX MOV ECX, [0249184Ch] //02371040h PUSH Count MOV EBX, 00464080h CALL EBX POP ECX POP EBX end; procedure OpGetNumberParams(Count: Word); begin _OpGetNumberParams(0,0,0,DWord(Count)); end;
type TOpcodeParams= array [0..31] of Cardinal; POpcodeParams= ^TOpcodeParams; var OpcodeParams: POpcodeParams; ... OpcodeParams:=Ptr($A43C78);
procedure OPCODE_ACTIVATE_CHEAT; begin // 0B41: activate_cheat %1h% OpGetNumberParams(1); N:=OpcodeParams^[0]; ActivateCheat(N); end;
Этот код работает только когда SCMLog не установлен. Если он установлен, то SCMLog зависает вместе с игрой.
@Alexander Blade - Я детально протестировал твой QuickOpcode v.1.0, и нашёл следующие ошибки:
1) наверху ^
2) Чтение стрингового параметра (FUNC_READ_OPCODE_STRING) сначала работает, но потом игра зависает, если выполнить опкод со стринговым параметром 274 раза.
Наверное, что-то не освобождается этой функцией.
3) Из-за этих ошибок не стабильно работает плагин ScmIni, а также в его исходниках есть ошибка, из-за которой невозможно запустить QOP через папку CLEO:
var AncestorLibrary : Integer; ... AncestorLibrary := GetModuleHandle(QuickOpcodeLib + '.asi'); if AncestorLibrary = INVALID_HANDLE_VALUE then begin AncestorLibrary := GetModuleHandle(QuickOpcodeLib + '.cleo'); if AncestorLibrary = INVALID_HANDLE_VALUE then begin MessageBox(0, 'Can''t initialize QuickOpcode library .' + #13 + 'Press "OK" to exit .', 'Error !', 0); ExitProcess(0) end; end;
При ошибке загрузки функция GetModuleHandle возвращает NULL, а не INVALID_HANDLE_VALUE:
Return Values
If the function succeeds, the return value is a handle to the specified module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Так что можно исправить на это:
var AncestorLibrary : Cardinal; ... AncestorLibrary := GetModuleHandle(QuickOpcodeLib + '.asi'); if AncestorLibrary = 0 then begin AncestorLibrary := GetModuleHandle(QuickOpcodeLib + '.cleo'); if AncestorLibrary = 0 then begin MessageBox(0, 'Can''t initialize QuickOpcode library .' + #13 + 'Press "OK" to exit .', 'Error !', 0); ExitProcess(0) end; end;
4) А также опечатки файлах ReadMe(rus).txt:
стр 4 стлб 66 - "парметрами" вместо "параметрами"
стр 5 стлб 54 - "оптыному" вместо "опытному"
стр 27 стлб 42 - "родителской" вместо "родительской"
стр 27 стлб 71 - "библотеки" вместо "библиотеки"
стр 37 стлб 6 - "преведено" вместо "приведено"
стр 53 стлб 36 - "глоабльную" вместо "глобальную"
стр 54 стлб 9 - "соттвественно" вместо "соответственно"
QuickOpcode_plugins\ScmIni\ReadMe(rus).txt:
стр 41 стлб 45 - "перменная" вместо "переменная"
стр 48 стлб 67 - "перменную" вместо "переменную"
[hr]
[---]
Вот написал несколько опкодов:
Проверка написания нашего чита:
0B50: typed_cheat "MYSUPERCHEAT"
Активация чита:
0B51: activate_cheat 3
Открытие и закрытие тестового файла:
0B53: open_text_file "CLEO\log.txt" mode 3 store_to 0@
0B54: close_text_file 0@
При открытии файла можно указать как строку-константу, так и нуль-строку.
Написав это:
0B55: write_file 5@ new_line 1 int_and_str_values "Новая запись" 0B55: write_file 5@ new_line 1 int_and_str_values "Первый параметр: " 111 "Второй: " 222 "3-ий: " 333 "4-ый: " 444 "5-ый: " 555 'Последний: ' 969696969 0B55: write_file 5@ new_line 1 int_and_str_values 1 2 3 4 5 6 "Строки могут " "идти подрят. " 'Семи' ' и пятнадцати' " символьные строки тоже поддерживаются" 0B56: write_file 5@ new_line 1 float_and_str_values "Это числа: " 1.1 2.22 3.333 4.4444 "Длинное число: " 5555555.55 0B55: write_file 5@ new_line 1 int_and_str_values
На выходе получим
Новая запись Первый параметр: 111 Второй: 222 3-ий: 333 4-ый: 444 5-ый: 555 Последний: 969696969 1 2 3 4 5 6 Строки могут идти подряд. Семи и пятнадцати символьные строки тоже поддерживаются Это числа: 1.1000 2.2200 3.3330 4.4444 Длинное число: 5555555.3157
Эти опкоды имеют переменное кол-во параметров. Например в опкоде 0B55 целые числа и строки могут располагаться как угодно в одном опкоде, опкод поймёт, надо писать строку или число.
И другие опкоды:
0B58: text_file 0@ eoln
0B59: text_file 0@ eof
0B60: file "CLEO\log.txt" exist
0B61: dir "CLEO\MyDir" exist
0B62: make_dir "CLEO\MyDir"
Ссылка на QIP плагин:
http://www.grand-theft-all.narod.ru/StrLib.rar
[small][/small]
Offline
На форуме часто жалуются, что у кто-то не может установить Quick Opcode PlugIn.
Установка идет неправильно, потому что пользователь устанавливает сразу все три файла с новыми опкодами. Но господин Alexander допустил грубые очепятки в readme файла ScmGxt.qop. Вот его пример записи новых опкодов из данного файла в SASCM.INI:
Формат записи опкодов в SASCM.ini : 0B20=0, reset_GXT_entries 0B21=2, add_GXT_entry name %1h of % value %2h of % 0B22=2, add_GXT_entry name %1h of % string_handle %2d of % 0B23=1, delete_added_GXT_entry name %1h of %
Как видите, слово "of" входит в состав отметки значения, которое считывает Sanny Builder. И из-за этого возникает ошибка при компиляции.
Вот правильный вариант записи опкодов в SASCM.INI:
0B20=0, reset_GXT_entries 0B21=2, add_GXT_entry name %1h% value %2h% 0B22=2, add_GXT_entry name %1h% string_handle %2d% 0B23=1, delete_added_GXT_entry name %1h%
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
Не вижу смысла размазывать информацию по всему форуму, поэтому переместил сообщение выше в эту тему.
Offline
Pages: 1