GhostManSD
Posts: 1054
|
Подскажите, пожалуйста, реально ли заставить WoG обращаться к текстовому файлу. Выглядит примерно так...
Имя файла: GMSDData.txt
Расположение: EraPlugins #[Раздел_1]
[Строка_1]
[Строка_2]
[Строка_3]
#[Раздел_2]
[Строка_1]
[Строка_2]
.....
Каждый раздел начинается с символа #. Программа должна сама высчитать, каков номер значка # в тексте, и это число является номером раздела.
Например, чтобы при !!SN:X0/3/25/78 в переменную z78 подставлялось значение из строки №25 раздела №3 файла GMSDData...
...а при !!SN:X1/5/78/25 значение переменной z78 подставлялось в строку №25 раздела №5.
Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 26.02.2011 07:10 by GhostManSD.)
|
|
26.02.2011 07:09 |
|
Sav
Posts: 2180
|
Думаю, можно, только алгоритм обращения к файлу и поиска строки придётся писать самому.
|
|
26.02.2011 10:25 |
|
Berserker
Posts: 16657
|
|
26.02.2011 18:39 |
|
Sav
Posts: 2180
|
|
26.02.2011 18:44 |
|
Berserker
Posts: 16657
|
|
26.02.2011 19:13 |
|
etoprostoya
Posts: 1809
|
Quote:!!UN:N5/#1/#2/#3/#4
Записать z-переменную в общую секцию файла wog.ini
Quote:!!UN:N6/#1/#2//#3/#4
Прочитать z-переменную из общей секции файла wog.ini
Quote:Так, для записи переменной z-1, названной "Главная_переменная", в файл "Мой.var" в папку GAMES (секция "MyLocalSettings") с опцией 4, используйте:
!!VRy1:S4;
!!VRz-1:S^Главная_переменная^;
!!VRz-2:S^MyLocalSettings^;
!!VRz-3:S^GAMES\My.var^;
!!UN:N5/z-1/y1/-2/-3;
|
|
26.02.2011 21:06 |
|
MOP
Posts: 1468
|
Это что вообще?
Code:
Вог-хук №301:
00619BB1 E8 FA2E1600 CALL mop.0077CAB0
00619BB6 90 NOP
0077CAB0 8B7424 0C MOV ESI,DWORD PTR SS:[ESP+C]
0077CAB4 8935 C4389302 MOV DWORD PTR DS:[29338C4],ESI
0077CABA 60 PUSHAD
0077CABB B8 00007000 MOV EAX,mop.00700000
0077CAC0 3BC6 CMP EAX,ESI
0077CAC2 77 11 JA SHORT mop.0077CAD5
0077CAC4 8D05 C0389302 LEA EAX,DWORD PTR DS:[29338C0]
0077CACA 3BF0 CMP ESI,EAX
0077CACC 77 07 JA SHORT mop.0077CAD5
0077CACE 33C0 XOR EAX,EAX
0077CAD0 A3 C4389302 MOV DWORD PTR DS:[29338C4],EAX
0077CAD5 61 POPAD
0077CAD6 8B35 C4389302 MOV ESI,DWORD PTR DS:[29338C4]
0077CADC 85F6 TEST ESI,ESI
0077CADE C3 RETN
У меня из-за этого хука жёсткий баг прямо на старте игры, причём только тогда, если включены wav-звуки, а скрипт создаёт аллоки с помощью erautils.dll.
Если выпилить хук и восстановить ориг. код – всё абсолютно нормально.
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
|
|
28.02.2011 16:33 |
|
baratorch
Posts: 197
|
Хочу сделать для оффлайна заказ героя в таверне (герой который будет появляться в таверне после нанятого).
В связи с этим вопрос: как узнать какие герои доступны/недоступны для появления в таверне у игрока?
Может подскажет кто?
|
|
02.07.2011 23:55 |
|
gamecreator
Posts: 7107
|
|
03.07.2011 01:26 |
|
baratorch
Posts: 197
|
|
03.07.2011 01:48 |
|
MOP
Posts: 1468
|
(28.02.2011 16:33)MOP Wrote: Это что вообще?
Code:
Вог-хук №301:
00619BB1 E8 FA2E1600 CALL mop.0077CAB0
00619BB6 90 NOP
0077CAB0 8B7424 0C MOV ESI,DWORD PTR SS:[ESP+C]
0077CAB4 8935 C4389302 MOV DWORD PTR DS:[29338C4],ESI
0077CABA 60 PUSHAD
0077CABB B8 00007000 MOV EAX,mop.00700000
0077CAC0 3BC6 CMP EAX,ESI
0077CAC2 77 11 JA SHORT mop.0077CAD5
0077CAC4 8D05 C0389302 LEA EAX,DWORD PTR DS:[29338C0]
0077CACA 3BF0 CMP ESI,EAX
0077CACC 77 07 JA SHORT mop.0077CAD5
0077CACE 33C0 XOR EAX,EAX
0077CAD0 A3 C4389302 MOV DWORD PTR DS:[29338C4],EAX
0077CAD5 61 POPAD
0077CAD6 8B35 C4389302 MOV ESI,DWORD PTR DS:[29338C4]
0077CADC 85F6 TEST ESI,ESI
0077CADE C3 RETN
У меня из-за этого хука жёсткий баг прямо на старте игры, причём только тогда, если включены wav-звуки, а скрипт создаёт аллоки с помощью erautils.dll.
Если выпилить хук и восстановить ориг. код – всё абсолютно нормально.
Так что, никто не знает?
Это хотя бы нужная вещь?
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
|
|
06.08.2011 17:12 |
|
kostya_76
Posts: 33
|
Может кто-нибудь подсказать, как правильно скомпилировать эту длл MoP'а в Дельфи7?
Quote:
LIBRARY Tent;
{!INFO
MODULENAME = 'Tent'
VERSION = '1.0'
AUTHOR = 'Master Of Puppets'
}
USES Win, Utils, SysUtils, VPUtils;
//PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN); external 'angel' name 'HookCode';
CONST
(* HookCode constants *)
C_HOOKTYPE_JUMP = FALSE;
C_HOOKTYPE_CALL = TRUE;
C_OPCODE_JUMP = $E9;
C_OPCODE_CALL = $E8;
C_UNIHOOK_SIZE = 5;
TYPE
THookRec = RECORD Opcode: BYTE; Ofs: INTEGER;
END; // .record THookRec
VAR
Temp: INTEGER;
PROCEDURE WriteAtCode(P: POINTER; Buf: POINTER; Count: INTEGER);
BEGIN
Win.VirtualProtect(P, Count, PAGE_READWRITE, @Temp);
Win.CopyMemory(P, Buf, Count);
Win.VirtualProtect(P, Count, Temp, NIL);
END; // .procedure WriteAtCode
PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN);
VAR
HookRec: THookRec;
BEGIN
IF UseCall THEN BEGIN HookRec.Opcode:=C_OPCODE_CALL;
END // .if
ELSE BEGIN HookRec.Opcode:=C_OPCODE_JUMP;
END; // .else
HookRec.Ofs:=INTEGER(NewAddr)-INTEGER(P)-C_UNIHOOK_SIZE;
WriteAtCode(P, @HookRec, 5);
END; // .procedure HookCode
PROCEDURE HOOK_tent; ASSEMBLER; {$FRAME-}
ASM
MOV EAX, $50C7C0
CALL EAX //вызываем функцию вычисления HP-очков, которую мы затёрли своим хуком.
MOV DWORD PTR DS:[$91DA38],-1 //заносим в адрес переменной x1 значение -1 - на случай, если мы не хотим вообще ничего менять в принципе лечения
MOV [$91DA3C], EAX //заносим в адрес переменной x2 исходное значение кол-ва хит-пойнтов, для подробностей и возможных вычислений
PUSHAD //сохраняем регистры
PUSH 29500 //номер ERM-функции. Меняйте на любой доступный.
MOV EAX, $74CE30
CALL EAX //вызываем C_FUNC_ZVS_CALLFU
ADD ESP, 4
POPAD //выталкиваем регистры
CMP DWORD PTR DS:[$91DA38],-1 //проверяем, изменил ли скриптописец кол-во очков HP для лечения
JE @@Default //если не изменил - продолжить код без изменения
MOV EAX,DWORD PTR DS:[$91DA38] // заменить значение очков на значение из x1
@@Default:
PUSH $478538 //адрес возврата в процедуру
END;
BEGIN
HookCode(POINTER($478533), @HOOK_tent, C_HOOKTYPE_JUMP);
END.
Изменяю название библиотеки Win на Windows, остальные вроде не нужны, но можно и оставить, кроме VPUtils.
Еще не понятно, что такое {$FRAME-} в строке: PROCEDURE HOOK_tent; ASSEMBLER; {$FRAME-}, чтобы компилятор не ругался, приходится убирать.
Пробовал в разных папках компилить, в том числе и в папке с Эрой.
Компилится нормально, но адрес в созданном хуке получается левый - соответственно вылет при обращении. Если в Olly адрес перехода на функцию HOOK_tent поменять на нормальный - все работает.
(This post was last modified: 10.12.2011 13:45 by kostya_76.)
|
|
10.12.2011 13:18 |
|