2.
Цитата:
Это x-координата города. Просто в воговской базе определена структура _TownSetup_, в которой есть поле x со смещением 5.
Кстати, movzx cx, byte ptr [edi+5] - беззнаковое расширение байта до слова. Тут надо быть осторожным.
Старшее слово регистра ecx всё равно будет равно нулю после выполнения инструкции and ecx, 3FFh (and ecx, 00000000000000000000001111111111b) ниже по тексту, поэтому присваивать значение можно сразу регистру ecx (а не его младшему слову cx). Но координаты могут быть больше 127 (7Fh), поэтому эту строчку
- Код: Выделить всё
c->ecx = *(char*)(c->edi + 5);
нужно заменить на следующую:
- Код: Выделить всё
c->ecx = *(unsigned char*)(c->edi + 5);
Иначе вместо, например, 130 получим значение -126 (минус 126).
3. Здесь у Вас LoHook на 0x430520, а адрес возврата - 0x430532:
- Код: Выделить всё
_PI->WriteLoHook(0x430520, mpointsEarth_2);
Так вы скипуете инструкцию mov ecx, [esi+4Dh] (см. ниже).
- Код: Выделить всё
.text:00430520 sub eax, 3
.text:00430523 mov ecx, [esi+4Dh] ; загрузить в регистр ecx текущее значение MP
.text:00430526 neg eax
.text:00430528 sbb eax, eax
.text:0043052A and eax, 64h
.text:0043052D add eax, 0C8h
.text:00430532 sub ecx, eax
.text:00430534 mov [esi+4Dh], ecx
Если пропустить эту инструкцию, герой компа после каста Town Portal будет получать некорректное (очень большое: его адрес (esi) - стоимоcть Town Portal) кол-во MP.
4. Вместо всего этого:
- Код: Выделить всё
_PI->WriteHexPatch(0x41D534, "20 03"); // меняем расходы MP на экспертном уровне Магии, с 200 на 800
_PI->WriteHexPatch(0x41D51F, "B0 04"); // меняем расходы MP на основном уровне Магии, с 300 на 1200
...
_PI->WriteLoHook(0x41D52E, advancedEarth); // расходы MP в главной функции заклинания - для продвин. уровня - 1000
можно написать один хук:
- Код: Выделить всё
int __stdcall tpCostForHuman(LoHook* h, HookContext* c)
{
*(int*)(c->ebp - 0x40) = 1200;
*(int*)(c->ebp - 0x3C) = 1200;
*(int*)(c->ebp - 0x38) = 1000;
*(int*)(c->ebp - 0x34) = 800;
return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x41D538, tpCostForHuman);
Ну и отформатировать текст DllMain не помешало бы.