#1 15-07-2008 06:40

Alexander
Registered: 19-08-2006
Posts: 184
Website

[SA] Quick Opcode

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

#2 05-08-2008 13:49

flashTrash
From: Н.Новгород
Registered: 21-02-2007
Posts: 260
Website

Re: [SA] Quick Opcode

Ам.. вопрос. Как должна выглядеть запись в ini-файле?

Всмысле так

section

param

value

или так

[section]

[param]

[value]

Last edited by flashTrash (05-08-2008 13:51)

Offline

#3 06-08-2008 05:20

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: [SA] Quick Opcode

[section]
param=value
param2=value

[section2]
param=value


[small][/small]

Offline

#4 06-08-2008 09:02

flashTrash
From: Н.Новгород
Registered: 21-02-2007
Posts: 260
Website

Re: [SA] Quick Opcode

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

#5 29-08-2008 10:47

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: [SA] Quick Opcode

Вот экспортировал несколько опкодов. Процедуры-опкоды 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

#6 02-09-2008 08:54

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: [SA] Quick Opcode

Помогите плиз.
Я пставил Quick opcode чтобы записывать координаты в ини файл для телепорта, типо чтобы места запоминались.
В скрипте есть integer(целочисленная) переменная, которая содержит номер места

Можно сделать так, чтобы секции в ИНИ файле назывались с её использованием? Иначе только последнее место запоминается


GIMS developer

Offline

#7 02-07-2009 05:11

VcSaJen
Registered: 25-08-2006
Posts: 217

Re: [SA] Quick Opcode

@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:

MSDN wrote:

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

#8 07-08-2009 15:15

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: [SA] Quick Opcode

@VcSaJen - Молодчик, честно слово, хороший плагин, а как прочитать нужную строку, например, из строки -
здоровье 100.0 броня 59.0
получить 100.0 в переменную?


I know everything and nothing...

Offline

#9 15-08-2009 18:32

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: [SA] Quick Opcode

На форуме часто жалуются, что у кто-то не может установить 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

#10 16-08-2009 01:37

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: [SA] Quick Opcode

Не вижу смысла размазывать информацию по всему форуму, поэтому переместил сообщение выше в эту тему.

Offline

Board footer

Powered by FluxBB