mirror of
https://gitlab.com/hashborgir/plugy.git
synced 2025-10-13 08:24:24 -05:00
updated to v11.00 by Lautour http://d2mods.info/forum/viewtopic.php?f=133&t=62849
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Use a more big stash
|
||||
|
||||
@@ -78,16 +79,17 @@ void Install_BigStash()
|
||||
log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n");
|
||||
|
||||
// modification of stash grid
|
||||
mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5);
|
||||
mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25);
|
||||
MEMC_REF4( D2CompileTxtFile, caller_modifStashGrid);
|
||||
//01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578
|
||||
//6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653
|
||||
//6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496
|
||||
//6FD6BDB4 |. E8 97600200 CALL D2Common.#10244 ; \#10244
|
||||
//6FDD2CA4 |. E8 97C2FDFF CALL D2Common.#10849 ; \#10849
|
||||
//6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037
|
||||
|
||||
// modification of stash background
|
||||
mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C);
|
||||
mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC);
|
||||
memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash
|
||||
MEMT_REF4( 0x00000104, caller_changeTradeStash);
|
||||
//6FAEC61C |. 68 04010000 PUSH 104
|
||||
@@ -95,6 +97,7 @@ void Install_BigStash()
|
||||
//6FB249BC |. 68 04010000 PUSH 104
|
||||
//6FB59D7C |. 68 04010000 PUSH 104
|
||||
//6FB3CC1C |. 68 04010000 PUSH 104
|
||||
//6FB443FC |. 68 04010000 PUSH 104
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Updating server.
|
||||
|
||||
@@ -15,6 +16,7 @@
|
||||
#include "newInterface_CubeListing.h"
|
||||
#include "extraOptions.h"
|
||||
|
||||
|
||||
bool active_Commands=true;
|
||||
|
||||
bool active_listAllCubeFormula=true;
|
||||
@@ -140,13 +142,15 @@ void updateSharedGold(DWORD goldAmount)
|
||||
|
||||
int STDCALL commands (char* ptText)
|
||||
{
|
||||
//return 0;
|
||||
Unit* ptChar = D2GetClientPlayer();
|
||||
|
||||
//return 0;
|
||||
char command[MAX_CMD_SIZE];
|
||||
ZeroMemory(command,MAX_CMD_SIZE);
|
||||
//return 0;
|
||||
strncpy(command,ptText,MAX_CMD_SIZE-1);
|
||||
strlwr(command);
|
||||
|
||||
//return 0;
|
||||
strlwr(command);
|
||||
if (!strncmp(command,CMD_RENAME,strlen(CMD_RENAME)))
|
||||
{
|
||||
if (!active_multiPageStash) return 1;
|
||||
@@ -220,7 +224,6 @@ int STDCALL commands (char* ptText)
|
||||
active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -248,6 +251,19 @@ MANAGESOUNDCHAOSDEBUG:
|
||||
RETN 8
|
||||
}}
|
||||
|
||||
FCT_ASM ( caller_Commands_113d )
|
||||
TEST EAX,EAX
|
||||
JE MANAGESOUNDCHAOSDEBUG
|
||||
PUSH EDI
|
||||
CALL commands
|
||||
TEST EAX,EAX
|
||||
JNZ MANAGESOUNDCHAOSDEBUG
|
||||
ADD DWORD PTR SS:[ESP],7
|
||||
MANAGESOUNDCHAOSDEBUG:
|
||||
RETN 8
|
||||
}}
|
||||
|
||||
|
||||
void Install_Commands()
|
||||
{
|
||||
static int isInstalled = false;
|
||||
@@ -261,9 +277,9 @@ void Install_Commands()
|
||||
active_savegame = version_D2Common >= V111;
|
||||
|
||||
// Run custom commmand
|
||||
mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6);
|
||||
memt_byte( 0x83, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0xC08508C4 , version_D2Client >= V111 ? caller_Commands_111 : caller_Commands);
|
||||
mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6);
|
||||
memt_byte( 0x83, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0xC08508C4 , version_D2Client == V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands);
|
||||
//6FB71EE6 . 83C4 08 ADD ESP,8
|
||||
//6FB71EE7 . 85C0 TEST EAX,EAX
|
||||
//6FB41C16 |. 83C4 08 ADD ESP,8
|
||||
@@ -272,9 +288,9 @@ void Install_Commands()
|
||||
//6FB36929 |. 85C0 TEST EAX,EAX
|
||||
//6FB20AE6 |. 83C4 08 ADD ESP,8
|
||||
//6FB20AE9 |. 85C0 TEST EAX,EAX
|
||||
//6FB20AE6 |. 83C4 08 ADD ESP,8
|
||||
//6FB20AE9 |. 85C0 TEST EAX,EAX
|
||||
|
||||
//6FB61FD6 |. 83C4 08 ADD ESP,8
|
||||
//6FB61FD9 |. 85C0 TEST EAX,EAX
|
||||
log_msg("\n");
|
||||
|
||||
isInstalled = true;
|
||||
|
540
PlugY/Common.cpp
540
PlugY/Common.cpp
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
*Modified by L'Autour.
|
||||
|
||||
Common functions.
|
||||
|
||||
@@ -8,9 +9,12 @@
|
||||
#include "common.h"
|
||||
#include "error.h"
|
||||
#include "d2functions.h"
|
||||
#include "INIfile.h"
|
||||
|
||||
#define sPlugyExt ".\\PlugY\\PlugYLocal.dll"
|
||||
s_shifting shifting;
|
||||
|
||||
|
||||
bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h)
|
||||
{return (x>=x0) && (x<x0+l) && (y>y0-h) && (y<=y0);}
|
||||
|
||||
@@ -22,445 +26,120 @@ void freeMessage(sWinMessage* msg)
|
||||
D2FreeWinMessage(msg);
|
||||
}
|
||||
|
||||
//MS C++__fastcall(ecx,edx,) vs Delphi register(eax,edx,ecx) - :(
|
||||
|
||||
LPWSTR getString(LPWSTR eng, LPWSTR esp, LPWSTR deu, LPWSTR fra, LPWSTR por, LPWSTR ita, LPWSTR jpn, LPWSTR kor, LPWSTR sin, LPWSTR chi, LPWSTR pol, LPWSTR rus)
|
||||
typedef int (__stdcall *p_UCS2toUTF8)(char*, int, LPWSTR, int);
|
||||
p_UCS2toUTF8 _UCS2toUTF8;
|
||||
|
||||
int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc)
|
||||
{
|
||||
switch(D2GetLang())
|
||||
{
|
||||
case LNG_ENG: return eng;
|
||||
case LNG_ESP: return esp;
|
||||
case LNG_DEU: return deu;
|
||||
case LNG_FRA: return fra;
|
||||
case LNG_POR: return por;
|
||||
case LNG_ITA: return ita;
|
||||
case LNG_JPN: return jpn;
|
||||
case LNG_KOR: return kor;
|
||||
case LNG_SIN: return sin;
|
||||
case LNG_CHI: return chi;
|
||||
case LNG_POL: return pol;
|
||||
case LNG_RUS: return rus;
|
||||
case LNG_DEF:
|
||||
default: return eng;
|
||||
}
|
||||
if (_UCS2toUTF8 == NULL) return 0;
|
||||
return _UCS2toUTF8(dst, maxdst, src, lensrc);
|
||||
}
|
||||
#define LANGUAGE(I,ENG,FRA,DEU,ITA,ESP,POL/*,CHI*/) case I : return getString(L##ENG,L##ESP,L##DEU,L##FRA,L##ENG,L##ITA,L##ENG,L##ENG,L##ENG,L##ENG,L##POL,L##ENG)
|
||||
|
||||
typedef int (__stdcall *p_UTF8toUCS2)(LPWSTR, int, char*, int);
|
||||
p_UTF8toUCS2 _UTF8toUCS2;
|
||||
|
||||
int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc)
|
||||
{
|
||||
if (_UTF8toUCS2 == NULL) return 0;
|
||||
return _UTF8toUCS2(dst, maxdst, src, lensrc);
|
||||
}
|
||||
|
||||
typedef const LPWSTR(__fastcall *p_getTypeString)(DWORD, char**);
|
||||
p_getTypeString _getTypeString;
|
||||
|
||||
const LPWSTR getTypeString(DWORD code, char** IdxStr)
|
||||
{
|
||||
if (_getTypeString == NULL) return L"#";
|
||||
return _getTypeString(code, IdxStr);
|
||||
}
|
||||
|
||||
typedef LPWSTR(__fastcall *p_getTranslatedString)(int);
|
||||
p_getTranslatedString _getTranslatedString;
|
||||
|
||||
LPWSTR getTranslatedString(int stringID)
|
||||
{
|
||||
switch(stringID)
|
||||
{
|
||||
/* LANGUAGE2( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||
"+Alt: ;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||
// "+Alt: \x91CD\x5206\x914D;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||
"+Alt: D<>sallocation, +Shift: par %d points,",
|
||||
"+Alt: Zur<75>cksetzen, +Shift: um %d Punkte",
|
||||
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||
"+Alt: Quita, +Shift: por %d puntos",
|
||||
"+Alt: \37325\20998\37197;,+Shift:%d \28857\25968");
|
||||
*/
|
||||
LANGUAGE( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||
"+Alt: Unassign, +Shift: by %d points",
|
||||
"+Alt: D<>sallocation, +Shift: par %d points",
|
||||
"+Alt: Zur<75>cksetzen, +Shift: um %d Punkte",
|
||||
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||
"+Alt: Quita, +Shift: por %d puntos",
|
||||
"+Alt: Odejmij, +Shift: %d punkt<6B>w");
|
||||
// "+Alt: ????, +Shift: %d ??");
|
||||
if (_getTranslatedString == NULL) return L"#";
|
||||
return _getTranslatedString(stringID);
|
||||
}
|
||||
|
||||
LANGUAGE( STR_STATS_UNASSIGN_WITHOUT_LIMIT,
|
||||
"+Alt: Unassign, +Shift: all remaining points",
|
||||
"+Alt: D<>sallocation, +Shift: Tous les points restants",
|
||||
"+Alt: Zur<75>cksetzen, +Shift: Alle verbleibenden Punkte",
|
||||
"+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti",
|
||||
"+Alt: Quita, +Shift: Todos los puntos restantes",
|
||||
"+Alt: Odejmij, +Shift: wszystkie pozostale punkty");
|
||||
// "+Alt: ????, +Shift: ???");
|
||||
typedef int(__stdcall *p_wSprintStringLastGender)(LPWSTR, int, int);
|
||||
p_wSprintStringLastGender _wSprintStringLastGender;
|
||||
|
||||
LANGUAGE( STR_STATS_BASE_MIN,
|
||||
"Base: %d (Min: %d)",
|
||||
"Base: %d (Min: %d)",
|
||||
"Basiswert: %d (Min: %d)",
|
||||
"Base: %d (Min: %d)",
|
||||
"Base: %d (Min: %d)",
|
||||
"Bazowo: %d (Minimum: %d)");
|
||||
// "??: %d(??: %d)");
|
||||
int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID)
|
||||
{
|
||||
if (_wSprintStringLastGender == NULL) return 0;
|
||||
return _wSprintStringLastGender(buf, lenbuf, stringID);
|
||||
}
|
||||
|
||||
LANGUAGE( STR_SKILLS_UNASSIGN,
|
||||
"Un-allocate all skills points",
|
||||
"D<EFBFBD>salloue tous les points d'aptitudes",
|
||||
"Alle Fertigkeitspunkte zur<75>cksetzen",
|
||||
"Rimuovi tutte le abilit<69>",
|
||||
"Quita todos los puntos de habilidades",
|
||||
"Rozdaj od nowa wszystkie punkty umiejetnosci");
|
||||
// "????????");
|
||||
typedef LPWSTR(__fastcall *p_cutStringGender)(LPWSTR);
|
||||
p_cutStringGender _cutStringGender;
|
||||
|
||||
LANGUAGE( STR_STASH_PREVIOUS_PAGE,
|
||||
"Previous Page (+shift: First Page)",
|
||||
"Page pr<70>c<EFBFBD>dente (+shift: Premi<6D>re page)",
|
||||
"Vorherige Seite (+shift: Erste Seite)",
|
||||
"Pagina Precedente (+shift: Prima Pagina)",
|
||||
"Pagina anterior (+shift: Primera Pagina)",
|
||||
"Poprzednia Strona (+shift: Pierwsza Strona)");
|
||||
// "??? (+shift: ??)");
|
||||
LPWSTR cutStringGender(LPWSTR str)
|
||||
{
|
||||
if (_cutStringGender == NULL) return str;
|
||||
return _cutStringGender(str);
|
||||
}
|
||||
|
||||
LANGUAGE( STR_STASH_NEXT_PAGE,
|
||||
"Next Page (+shift: Last not empty Page)",
|
||||
"Page suivante (+shift: Derni<6E>re page non vide)",
|
||||
"N<EFBFBD>chste Seite (+shift: Letzte nicht leere Seite )",
|
||||
"Pagina Successiva (+shift: Ultima Pagina non vuota)",
|
||||
"Pagina Siguiente (+shift: Ultima pagina non vacia)",
|
||||
"Nastepna Strona (+shift: Ostatnia nie pusta Strona)");
|
||||
// "??? (+shift: ?????");
|
||||
typedef LPWSTR(__fastcall *p_setMonoString)(LPWSTR);
|
||||
p_setMonoString _setMonoString;
|
||||
|
||||
LANGUAGE( STR_TOGGLE_TO_PERSONAL,
|
||||
"Toggle to Personal Stash",
|
||||
"Voir coffre personnel",
|
||||
"Wechselt zum pers<72>nlichen Goldschatz",
|
||||
"Vai all'Inventario Personale",
|
||||
"Ver el cofre personal",
|
||||
"Przejdz do Skrzyni Osobistej");
|
||||
// "????????");
|
||||
|
||||
LANGUAGE( STR_TOGGLE_TO_SHARED,
|
||||
"Toggle to Shared Stash",
|
||||
"Voir coffre partag<61>",
|
||||
"Wechselt zum gemeinsamen Goldschatz",
|
||||
"Vai all'Inventario Condiviso",
|
||||
"Ver el cofre compartido",
|
||||
"Przejdz do Skrzyni Wsp<73>lnej");
|
||||
// "????????");
|
||||
|
||||
LANGUAGE( STR_STASH_PREVIOUS_INDEX,
|
||||
"Previous Index : by %d Pages (+Shift: %d)",
|
||||
"Index pr<70>c<EFBFBD>dent : par %d pages (+shift: %d)",
|
||||
"Vorheriger Index: in %d Seiten (+shift: %d)",
|
||||
"Schermata Precedente : Indietro di %d Pagine (+Shift: %d)",
|
||||
"Indice anterior : por %d paginas (+shift: %d)",
|
||||
"Poprzednia Strona : po %d Stron (+Shift: %d)");
|
||||
// "???? : %d ? (+Shift:%d)");
|
||||
|
||||
LANGUAGE( STR_STASH_NEXT_INDEX,
|
||||
"Next Index : by %d Pages (+shift: %d)",
|
||||
"Index suivant : par %d pages (+shift: %d)",
|
||||
"N<EFBFBD>chster Index: in %d Seiten (+shift: %d)",
|
||||
"Schermata Successiva : Avanti di %d Pagine (+shift: %d)",
|
||||
"Indice siguiente : por %d paginas (+shift: %d)",
|
||||
"Nastepna Strona : po %d Stron (+shift: %d)");
|
||||
// "???? : %d ? (+shift:%d)");
|
||||
|
||||
LANGUAGE( STR_PUT_GOLD,
|
||||
"Put Gold",
|
||||
"Poser de l'Or",
|
||||
"Gib Gold",
|
||||
"Immetti Oro",
|
||||
"Poner oro",
|
||||
"Zdeponuj Zloto");
|
||||
// "????");
|
||||
|
||||
LANGUAGE( STR_TAKE_GOLD,
|
||||
"Take Gold",
|
||||
"Prendre de l'Or",
|
||||
"Nehme Gold",
|
||||
"Ritira Oro",
|
||||
"Tomar oro",
|
||||
"Wyplac zloto");
|
||||
// "????");
|
||||
|
||||
LANGUAGE( STR_PERSONAL_PAGE_NUMBER,
|
||||
"Personal Page n<>%u",
|
||||
"Page perso n<>%u",
|
||||
"Pers<EFBFBD>nliche Seite n<>%u",
|
||||
"Pagina Personale n<>%u",
|
||||
"Pagina personal n<>%u",
|
||||
"Strona Osobista n<>%u");
|
||||
// "????? n<>%u");
|
||||
|
||||
LANGUAGE( STR_SHARED_PAGE_NUMBER,
|
||||
"Shared Page n<>%u",
|
||||
"Page partag<61>e n<>%u",
|
||||
"Gemeinsame Seite n<>%u",
|
||||
"Pagina Condivisa n<>%u",
|
||||
"Pagina personal n<>%u",
|
||||
"Strona Wsp<73>lna n<>%u");
|
||||
// "????? n<>%u");
|
||||
|
||||
LANGUAGE( STR_NO_SELECTED_PAGE,
|
||||
"No selected page",
|
||||
"Aucune page s<>lectionn<6E>e",
|
||||
"Keine ausgew<65>hlte Seite",
|
||||
"Nessuna pagina selezionata",
|
||||
"Ninguna pagina seleccionada",
|
||||
"Nie zaznaczono strony");
|
||||
// "????");
|
||||
|
||||
LANGUAGE( STR_SHARED_GOLD_QUANTITY,
|
||||
"Shared Gold : %u",
|
||||
"Or partag<61> : %u",
|
||||
"Gemeinsamen Gold : %u",
|
||||
"Oro Condiviso : %u",
|
||||
"Oro compartido : %u",
|
||||
"Wsp<EFBFBD>lne Zloto : %u");
|
||||
// "????: %u");
|
||||
|
||||
LANGUAGE( STR_PREVIOUS_PAGE,
|
||||
"Previous Page",
|
||||
"Page pr<70>c<EFBFBD>dente",
|
||||
"Vorherige Seite",
|
||||
"Pagina Precedente",
|
||||
"Pagina anterior",
|
||||
"Poprzednia Strona");
|
||||
// "???");
|
||||
|
||||
LANGUAGE( STR_NEXT_PAGE,
|
||||
"Next Page",
|
||||
"Page suivante",
|
||||
"N<EFBFBD>chste Seite",
|
||||
"Pagina Successiva",
|
||||
"Pagina siguiente",
|
||||
"Nastepna Strona");
|
||||
// "???");
|
||||
|
||||
default : return L"";
|
||||
}
|
||||
LPWSTR setMonoString(LPWSTR str)
|
||||
{
|
||||
if (_setMonoString == NULL) return str;
|
||||
return _setMonoString(str);
|
||||
}
|
||||
|
||||
|
||||
/*=================================================================*/
|
||||
typedef bool(__fastcall *p_initTranslatedString)(int);
|
||||
|
||||
const char* SNONE="";
|
||||
const char* c_shie[3]={"Shield (Not Class Specific)",SNONE,SNONE};
|
||||
const char* c_tors[3]={"Body Armor",SNONE,SNONE};
|
||||
const char* c_gold[3]={"Gold",SNONE,SNONE};
|
||||
const char* c_bowq[3]={"Arrow",SNONE,SNONE};
|
||||
const char* c_xboq[3]={"Bolt",SNONE,SNONE};
|
||||
const char* c_play[3]={"Ear",SNONE,SNONE};
|
||||
const char* c_herb[3]={"Herb",SNONE,SNONE};
|
||||
const char* c_poti[3]={"Potion",SNONE,SNONE};
|
||||
const char* c_ring[3]={"Ring",SNONE,SNONE};
|
||||
const char* c_elix[3]={"Elixir",SNONE,SNONE};
|
||||
const char* c_amul[3]={"Amulet",SNONE,SNONE};
|
||||
const char* c_char[3]={"Charm",SNONE,SNONE};
|
||||
const char* c_boot[3]={"Boot",SNONE,SNONE};
|
||||
const char* c_glov[3]={"Glove",SNONE,SNONE};
|
||||
const char* c_book[3]={"Book",SNONE,SNONE};
|
||||
const char* c_belt[3]={"Belt",SNONE,SNONE};
|
||||
const char* c_gem[3]={"Gem",SNONE,SNONE};
|
||||
const char* c_torc[3]={"Torch",SNONE,SNONE};
|
||||
const char* c_scro[3]={"Scroll",SNONE,SNONE};
|
||||
const char* c_scep[3]={"Scepter",SNONE,SNONE};
|
||||
const char* c_wand[3]={"Wand",SNONE,SNONE};
|
||||
const char* c_staf[3]={"Staff",SNONE,SNONE};
|
||||
const char* c_bow[3]={"Bow",SNONE,SNONE};
|
||||
const char* c_axe[3]={"Axe",SNONE,SNONE};
|
||||
const char* c_club[3]={"Club",SNONE,SNONE};
|
||||
const char* c_swor[3]={"Sword",SNONE,SNONE};
|
||||
const char* c_hamm[3]={"Hammer",SNONE,SNONE};
|
||||
const char* c_knif[3]={"Knife",SNONE,SNONE};
|
||||
const char* c_spea[3]={"Spear",SNONE,SNONE};
|
||||
const char* c_pole[3]={"Polearm",SNONE,SNONE};
|
||||
const char* c_xbow[3]={"Crossbow",SNONE,SNONE};
|
||||
const char* c_mace[3]={"Mace",SNONE,SNONE};
|
||||
const char* c_helm[3]={"Helm",SNONE,SNONE};
|
||||
HINSTANCE PlugyLocalLib = NULL;
|
||||
|
||||
const char* c_tpot[3]={"Missile Potion",SNONE,SNONE};
|
||||
const char* c_ques[3]={"Quest Item",SNONE,SNONE};
|
||||
const char* c_body[3]={"Body Part",SNONE,SNONE};
|
||||
const char* c_key[3]={"Key",SNONE,SNONE};
|
||||
const char* c_tkni[3]={"Throwing Knife",SNONE,SNONE};
|
||||
const char* c_taxe[3]={"Throwing Axe",SNONE,SNONE};
|
||||
const char* c_jave[3]={"Javelin",SNONE,SNONE};
|
||||
const char* c_weap[3]={"Weapon",SNONE,SNONE};
|
||||
const char* c_mele[3]={"Melee Weapon",SNONE,SNONE};
|
||||
const char* c_miss[3]={"Missile Weapon",SNONE,SNONE};
|
||||
const char* c_thro[3]={"Throwing Weapon",SNONE,SNONE};
|
||||
const char* c_comb[3]={"Combo Weapon",SNONE,SNONE};
|
||||
const char* c_armo[3]={"Armor",SNONE,SNONE};
|
||||
const char* c_shld[3]={"Any Shield",SNONE,SNONE};
|
||||
const char* c_misc[3]={"Miscellaneous",SNONE,SNONE};
|
||||
const char* c_sock[3]={"Socket Filler",SNONE,SNONE};
|
||||
const char* c_seco[3]={"Second Hand Item",SNONE,SNONE};
|
||||
const char* c_rod[3]={"Staves And Rods",SNONE,SNONE};
|
||||
const char* c_misl[3]={"Missile",SNONE,SNONE};
|
||||
const char* c_blun[3]={"Blunt",SNONE,SNONE};
|
||||
|
||||
const char* c_jewl[3]={"Jewel",SNONE,SNONE};
|
||||
const char* c_clas[3]={"Class Specific",SNONE,SNONE};
|
||||
const char* c_amaz[3]={"Amazon Item",SNONE,SNONE};
|
||||
const char* c_barb[3]={"Barbarian Item",SNONE,SNONE};
|
||||
const char* c_necr[3]={"Necromancer Item",SNONE,SNONE};
|
||||
const char* c_pala[3]={"Paladin Item",SNONE,SNONE};
|
||||
const char* c_sorc[3]={"Sorceress Item",SNONE,SNONE};
|
||||
const char* c_assn[3]={"Assassin Item",SNONE,SNONE};
|
||||
const char* c_drui[3]={"Druid Item",SNONE,SNONE};
|
||||
const char* c_h2h[3]={"Claw",SNONE,SNONE};
|
||||
const char* c_orb[3]={"Orb",SNONE,SNONE};
|
||||
const char* c_head[3]={"Voodoo Heads",SNONE,SNONE};
|
||||
const char* c_ashd[3]={"Paladin Shield",SNONE,SNONE};
|
||||
const char* c_phlm[3]={"Barbarian Helm",SNONE,SNONE};
|
||||
const char* c_pelt[3]={"Druid Helm",SNONE,SNONE};
|
||||
const char* c_cloa[3]={"Cloak",SNONE,SNONE};
|
||||
const char* c_rune[3]={"Rune",SNONE,SNONE};
|
||||
const char* c_circ[3]={"Circlet",SNONE,SNONE};
|
||||
const char* c_hpot[3]={"Healing Potion",SNONE,SNONE};
|
||||
const char* c_mpot[3]={"Mana Potion",SNONE,SNONE};
|
||||
const char* c_rpot[3]={"Rejuvenation potion",SNONE,SNONE};
|
||||
const char* c_spot[3]={"Stamina Potion",SNONE,SNONE};
|
||||
const char* c_apot[3]={"Antidote Potion",SNONE,SNONE};
|
||||
const char* c_wpot[3]={"Thawing Potion",SNONE,SNONE};
|
||||
const char* c_scha[3]={"Small Charm",SNONE,SNONE};
|
||||
const char* c_mcha[3]={"Large Charm",SNONE,SNONE};
|
||||
const char* c_lcha[3]={"Grand Charm",SNONE,SNONE};
|
||||
const char* c_abow[3]={"Amazon Bow",SNONE,SNONE};
|
||||
const char* c_aspe[3]={"Amazon Spear",SNONE,SNONE};
|
||||
const char* c_ajav[3]={"Amazon Javelin",SNONE,SNONE};
|
||||
const char* c_h2h2[3]={"Assassin Claw",SNONE,SNONE};
|
||||
const char* c_mboq[3]={"Magic Arrow",SNONE,SNONE};
|
||||
const char* c_mxbq[3]={"Magic Bolt",SNONE,SNONE};
|
||||
const char* c_gem0[3]={"Chipped Gem",SNONE,SNONE};
|
||||
const char* c_gem1[3]={"Flawed Gem",SNONE,SNONE};
|
||||
const char* c_gem2[3]={"Normal Gem",SNONE,SNONE};
|
||||
const char* c_gem3[3]={"Flawless Gem",SNONE,SNONE};
|
||||
const char* c_gem4[3]={"Perfect Gem",SNONE,SNONE};
|
||||
const char* c_gema[3]={"Amethyst",SNONE,SNONE};
|
||||
const char* c_gemd[3]={"Diamond",SNONE,SNONE};
|
||||
const char* c_geme[3]={"Emerald",SNONE,SNONE};
|
||||
const char* c_gemr[3]={"Ruby",SNONE,SNONE};
|
||||
const char* c_gems[3]={"Sapphire",SNONE,SNONE};
|
||||
const char* c_gemt[3]={"Topaz",SNONE,SNONE};
|
||||
const char* c_gemz[3]={"Skull",SNONE,SNONE};
|
||||
|
||||
const char* getTypeString (DWORD code)
|
||||
bool initLocaleStrings()
|
||||
{
|
||||
DWORD lang = 0;//D2GetLang();
|
||||
if ((lang == LNG_FRA) || (lang == LNG_DEU)) lang--;
|
||||
else lang = 0;
|
||||
switch (code)
|
||||
{
|
||||
case BIN('s','h','i','e') : return c_shie[0];
|
||||
case BIN('t','o','r','s') : return c_tors[0];
|
||||
case BIN('g','o','l','d') : return c_gold[0];
|
||||
case BIN('b','o','w','q') : return c_bowq[0];
|
||||
case BIN('x','b','o','q') : return c_xboq[0];
|
||||
case BIN('p','l','a','y') : return c_play[0];
|
||||
case BIN('h','e','r','b') : return c_herb[0];
|
||||
case BIN('p','o','t','i') : return c_poti[0];
|
||||
case BIN('r','i','n','g') : return c_ring[0];
|
||||
case BIN('e','l','i','x') : return c_elix[0];
|
||||
case BIN('a','m','u','l') : return c_amul[0];
|
||||
case BIN('c','h','a','r') : return c_char[0];
|
||||
case BIN('b','o','o','t') : return c_boot[0];
|
||||
case BIN('g','l','o','v') : return c_glov[0];
|
||||
case BIN('b','o','o','k') : return c_book[0];
|
||||
case BIN('b','e','l','t') : return c_belt[0];
|
||||
case BIN('g','e','m',' ') : return c_gem[0];
|
||||
case BIN('t','o','r','c') : return c_torc[0];
|
||||
case BIN('s','c','r','o') : return c_scro[0];
|
||||
case BIN('s','c','e','p') : return c_scep[0];
|
||||
case BIN('w','a','n','d') : return c_wand[0];
|
||||
case BIN('s','t','a','f') : return c_staf[0];
|
||||
case BIN('b','o','w',' ') : return c_bow[0];
|
||||
case BIN('a','x','e',' ') : return c_axe[0];
|
||||
case BIN('c','l','u','b') : return c_club[0];
|
||||
case BIN('s','w','o','r') : return c_swor[0];
|
||||
case BIN('h','a','m','m') : return c_hamm[0];
|
||||
case BIN('k','n','i','f') : return c_knif[0];
|
||||
case BIN('s','p','e','a') : return c_spea[0];
|
||||
case BIN('p','o','l','e') : return c_pole[0];
|
||||
case BIN('x','b','o','w') : return c_xbow[0];
|
||||
case BIN('m','a','c','e') : return c_mace[0];
|
||||
case BIN('h','e','l','m') : return c_helm[0];
|
||||
case BIN('t','p','o','t') : return c_tpot[0];
|
||||
case BIN('q','u','e','s') : return c_ques[0];
|
||||
case BIN('b','o','d','y') : return c_body[0];
|
||||
case BIN('k','e','y',' ') : return c_key[0];
|
||||
case BIN('t','k','n','i') : return c_tkni[0];
|
||||
case BIN('t','a','x','e') : return c_taxe[0];
|
||||
case BIN('j','a','v','e') : return c_jave[0];
|
||||
case BIN('w','e','a','p') : return c_weap[0];
|
||||
case BIN('m','e','l','e') : return c_mele[0];
|
||||
case BIN('m','i','s','s') : return c_miss[0];
|
||||
case BIN('t','h','r','o') : return c_thro[0];
|
||||
case BIN('c','o','m','b') : return c_comb[0];
|
||||
case BIN('a','r','m','o') : return c_armo[0];
|
||||
case BIN('s','h','l','d') : return c_shld[0];
|
||||
case BIN('m','i','s','c') : return c_misc[0];
|
||||
case BIN('s','o','c','k') : return c_sock[0];
|
||||
case BIN('s','e','c','o') : return c_seco[0];
|
||||
case BIN('r','o','d',' ') : return c_rod[0];
|
||||
case BIN('m','i','s','l') : return c_misl[0];
|
||||
case BIN('b','l','u','n') : return c_blun[0];
|
||||
case BIN('j','e','w','l') : return c_jewl[0];
|
||||
case BIN('c','l','a','s') : return c_clas[0];
|
||||
case BIN('a','m','a','z') : return c_amaz[0];
|
||||
case BIN('b','a','r','b') : return c_barb[0];
|
||||
case BIN('n','e','c','r') : return c_necr[0];
|
||||
case BIN('p','a','l','a') : return c_pala[0];
|
||||
case BIN('s','o','r','c') : return c_sorc[0];
|
||||
case BIN('a','s','s','n') : return c_assn[0];
|
||||
case BIN('d','r','u','i') : return c_drui[0];
|
||||
case BIN('h','2','h',' ') : return c_h2h[0];
|
||||
case BIN('h','2','h','2') : return c_h2h2[0];
|
||||
case BIN('o','r','b',' ') : return c_orb[0];
|
||||
case BIN('h','e','a','d') : return c_head[0];
|
||||
case BIN('a','s','h','d') : return c_ashd[0];
|
||||
case BIN('p','h','l','m') : return c_phlm[0];
|
||||
case BIN('p','e','l','t') : return c_pelt[0];
|
||||
case BIN('c','l','o','a') : return c_cloa[0];
|
||||
case BIN('r','u','n','e') : return c_rune[0];
|
||||
case BIN('c','i','r','c') : return c_circ[0];
|
||||
case BIN('h','p','o','t') : return c_hpot[0];
|
||||
case BIN('m','p','o','t') : return c_mpot[0];
|
||||
case BIN('r','p','o','t') : return c_rpot[0];
|
||||
case BIN('s','p','o','t') : return c_spot[0];
|
||||
case BIN('a','p','o','t') : return c_apot[0];
|
||||
case BIN('w','p','o','t') : return c_wpot[0];
|
||||
case BIN('s','c','h','a') : return c_scha[0];
|
||||
case BIN('m','c','h','a') : return c_mcha[0];
|
||||
case BIN('l','c','h','a') : return c_lcha[0];
|
||||
case BIN('a','b','o','w') : return c_abow[0];
|
||||
case BIN('a','s','p','e') : return c_aspe[0];
|
||||
case BIN('a','j','a','v') : return c_ajav[0];
|
||||
case BIN('m','b','o','q') : return c_mboq[0];
|
||||
case BIN('m','x','b','q') : return c_mxbq[0];
|
||||
case BIN('g','e','m','0') : return c_gem0[0];
|
||||
case BIN('g','e','m','1') : return c_gem1[0];
|
||||
case BIN('g','e','m','2') : return c_gem2[0];
|
||||
case BIN('g','e','m','3') : return c_gem3[0];
|
||||
case BIN('g','e','m','4') : return c_gem4[0];
|
||||
case BIN('g','e','m','a') : return c_gema[0];
|
||||
case BIN('g','e','m','d') : return c_gemd[0];
|
||||
case BIN('g','e','m','e') : return c_geme[0];
|
||||
case BIN('g','e','m','r') : return c_gemr[0];
|
||||
case BIN('g','e','m','s') : return c_gems[0];
|
||||
case BIN('g','e','m','t') : return c_gemt[0];
|
||||
case BIN('g','e','m','z') : return c_gemz[0];
|
||||
default: return NULL;
|
||||
}
|
||||
p_initTranslatedString initTranslatedString;
|
||||
|
||||
PlugyLocalLib = LoadLibrary(sPlugyExt);
|
||||
|
||||
if (PlugyLocalLib != NULL)
|
||||
{
|
||||
log_msg("Loading PlugYLocal.dll\n");
|
||||
initTranslatedString = (p_initTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall initTranslatedString");
|
||||
if (NULL != initTranslatedString)
|
||||
{
|
||||
log_msg("Loading local strings from PlugYLocal.ini\n");
|
||||
|
||||
_UCS2toUTF8 = (p_UCS2toUTF8)GetProcAddress(PlugyLocalLib, "__stdcall UCS2toUTF8");
|
||||
_UTF8toUCS2 = (p_UTF8toUCS2)GetProcAddress(PlugyLocalLib, "__stdcall UTF8toUCS2");
|
||||
|
||||
_getTypeString = (p_getTypeString)GetProcAddress(PlugyLocalLib, "__fastcall getTypeString");
|
||||
_cutStringGender = (p_cutStringGender)GetProcAddress(PlugyLocalLib, "__fastcall cutStringGender");
|
||||
_wSprintStringLastGender = (p_wSprintStringLastGender)GetProcAddress(PlugyLocalLib, "__stdcall wSprintStringLastGender");
|
||||
_setMonoString = (p_setMonoString)GetProcAddress(PlugyLocalLib, "__fastcall setMonoString");
|
||||
|
||||
_getTranslatedString = (p_getTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall getTranslatedString");
|
||||
if ((NULL != _getTranslatedString) &&
|
||||
(NULL != _getTypeString))
|
||||
{
|
||||
initTranslatedString(D2GetLang());
|
||||
return true;
|
||||
}
|
||||
log_msg("Failed loading local strings\n");
|
||||
}
|
||||
|
||||
if (FreeLibrary(PlugyLocalLib))
|
||||
{
|
||||
PlugyLocalLib = NULL;
|
||||
}
|
||||
} else log_msg("Failed loading PlugYLocal.dll\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
char* getTypeAString (WORD id, char* lpText, DWORD size)
|
||||
void freeLocaleStrings()
|
||||
{
|
||||
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||
if (!itemTypeData)
|
||||
{
|
||||
strncpy(lpText, "Bad Type", size);
|
||||
return lpText;
|
||||
}
|
||||
|
||||
const char* string = getTypeString(itemTypeData->code);
|
||||
if (!string)
|
||||
{
|
||||
struct {
|
||||
DWORD code;
|
||||
BYTE zero;
|
||||
} code;
|
||||
code.code = itemTypeData->code;
|
||||
code.zero = 0;
|
||||
strncpy(lpText, (char*)&code, size);
|
||||
} else
|
||||
strncpy(lpText, string, size);
|
||||
|
||||
return lpText;
|
||||
if (PlugyLocalLib == NULL) return;
|
||||
FreeLibrary(PlugyLocalLib);
|
||||
}
|
||||
|
||||
LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size)
|
||||
@@ -468,22 +147,35 @@ LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size)
|
||||
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||
if (!itemTypeData)
|
||||
{
|
||||
mbstowcs(lpText, "Bad Type", size);
|
||||
wcsncpy(lpText, L"Bad Type", size);
|
||||
return lpText;
|
||||
}
|
||||
const char* string = getTypeString(itemTypeData->code);
|
||||
char* idxstr;
|
||||
LPWSTR string = getTypeString(itemTypeData->code, &idxstr);
|
||||
|
||||
if (idxstr)
|
||||
{
|
||||
LPWSTR string2 = D2GetStringFromString(idxstr);
|
||||
if (string2)
|
||||
{
|
||||
wcsncpy(lpText, string2, size);
|
||||
return lpText;
|
||||
}
|
||||
}
|
||||
if (!string)
|
||||
{
|
||||
struct {
|
||||
DWORD code;
|
||||
BYTE zero;
|
||||
} code;
|
||||
} code;
|
||||
code.code = itemTypeData->code;
|
||||
code.zero = 0;
|
||||
mbstowcs(lpText, (char*)&code, size);
|
||||
UTF8toUCS2(lpText,size, (char*)&code, 0xFFFF);
|
||||
} else
|
||||
mbstowcs(lpText, string, size);
|
||||
|
||||
wcsncpy(lpText, string, size);
|
||||
return lpText;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*================================= END OF FILE =================================*/
|
@@ -1,5 +1,6 @@
|
||||
/*================================================
|
||||
File created by Yohann NICOLAS.
|
||||
*Add support 1.13d by L'Autour.
|
||||
|
||||
This file implements some common and useful
|
||||
function related to some Diablo II mechanisms.
|
||||
@@ -16,9 +17,9 @@
|
||||
#define E2S(F, A, R, N, P) T##N N;
|
||||
#define E2F(F, A, R, N, P) T##N N;
|
||||
#define E2C(F, A, T, N) T* pt##N;
|
||||
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N;
|
||||
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N;
|
||||
#define C7(Z, A,B,C,D,E,F,G, T, N) T* pt##N;
|
||||
#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N;
|
||||
#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N;
|
||||
#define C7(Z, A,B,C,D,E,F,G,H, T, N) T* pt##N;
|
||||
|
||||
#include "../Commons/D2Funcs.h"
|
||||
DataTables* SgptDataTables;
|
||||
@@ -616,12 +617,12 @@ bool initD2functions()
|
||||
#define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
|
||||
#define E2F(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
|
||||
#define E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A);
|
||||
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113? G : (version_##Z == V112? F : version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))));
|
||||
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G);
|
||||
#define C7(Z, A,B,C,D,E,F,G, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G);
|
||||
#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))))));
|
||||
#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G,H);
|
||||
#define C7(Z, A,B,C,D,E,F,G,H, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G,H);
|
||||
|
||||
#include "../Commons/D2Funcs.h"
|
||||
SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C);
|
||||
SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0);
|
||||
if (version_D2Common < V110)
|
||||
{
|
||||
D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09
|
||||
@@ -915,10 +916,10 @@ bool initD2functions()
|
||||
D2GetClientPlayer = D2GetClientPlayer_111;
|
||||
D2GetRealItem = D2GetRealItem_111;
|
||||
D2CleanStatMouseUp = D2CleanStatMouseUp_111;
|
||||
StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC);
|
||||
StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0);
|
||||
StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8);
|
||||
StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC);
|
||||
StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224);
|
||||
StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228);
|
||||
StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240);
|
||||
StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244);
|
||||
} else {
|
||||
D2SendToServer = (TD2SendToServer) D2SendToServer_1XX;
|
||||
D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX;
|
||||
@@ -946,16 +947,16 @@ bool initD2functions()
|
||||
|
||||
|
||||
//////////////// STRUCTURE MANAGEMENT ////////////////
|
||||
|
||||
//L'Autour - ??????
|
||||
// shifting.ptPYPlayerData = V7(D2Common,118,118,F4,F4,F4,F4,F4);
|
||||
shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49));
|
||||
shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14);
|
||||
shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80);
|
||||
shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8);
|
||||
shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60);
|
||||
shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8);
|
||||
shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34);
|
||||
shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00);
|
||||
shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49,49));
|
||||
shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14,14);
|
||||
shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80,80);
|
||||
shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8,1A8);
|
||||
shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60,60);
|
||||
shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8,A8);
|
||||
shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34,34);
|
||||
shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00,00);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
@file D2wrapper.cpp
|
||||
@brief Main Diablo II extra DLL handler.
|
||||
@@ -31,26 +32,27 @@
|
||||
#include "uberQuest.h" // Install_UberQuest()
|
||||
#include "extraOptions.h" // Install_AlwaysRegenMapInSP()
|
||||
#include "language.h" // Install_LanguageManagement()
|
||||
#include "../Commons/VersionInfo.h"
|
||||
|
||||
|
||||
int version_SmackW32=V113;
|
||||
int version_D2Common=V113;
|
||||
int version_ijl11=V113;
|
||||
int version_D2Gdi=V113;
|
||||
int version_D2Win=V113;
|
||||
int version_D2sound=V113;
|
||||
int version_D2MCPCLI=V113;
|
||||
int version_D2Launch=V113;
|
||||
int version_D2gfx=V113;
|
||||
int version_D2Client=V113;
|
||||
int version_D2Net=V113;
|
||||
int version_D2Lang=V113;
|
||||
int version_D2Game=V113;
|
||||
int version_D2CMP=V113;
|
||||
int version_Bnclient=V113;
|
||||
int version_Fog=V113;
|
||||
int version_Storm=V113;
|
||||
|
||||
//-------------------------
|
||||
int version_SmackW32=V113d;
|
||||
int version_D2Common=V113d;
|
||||
int version_ijl11=V113d;
|
||||
int version_D2Gdi=V113d;
|
||||
int version_D2Win=V113d;
|
||||
int version_D2sound=V113d;
|
||||
int version_D2MCPCLI=V113d;
|
||||
int version_D2Launch=V113d;
|
||||
int version_D2gfx=V113d;
|
||||
int version_D2Client=V113d;
|
||||
int version_D2Net=V113d;
|
||||
int version_D2Lang=V113d;
|
||||
int version_D2Game=V113d;
|
||||
int version_D2CMP=V113d;
|
||||
int version_Bnclient=V113d;
|
||||
int version_Fog=V113d;
|
||||
int version_Storm=V113d;
|
||||
//-------------------------
|
||||
|
||||
DWORD offset_SmackW32=NULL;
|
||||
DWORD offset_D2Common=NULL;
|
||||
@@ -375,6 +377,7 @@ bool initD2version()
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113, const char * filename)
|
||||
{
|
||||
log_msg("version of %s\t",filename);
|
||||
@@ -432,6 +435,47 @@ bool initD2version()
|
||||
log_msg("\n\n");
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
const char sD2Ver[8][7] = {{"v1.09b"},{"v1.09d"},{"v1.10 "},{"v1.11 "},{"v1.11b"},{"v1.12 "},{"v1.13c"},{"v1.13d"}};
|
||||
|
||||
bool initD2version()
|
||||
{
|
||||
char currentpath[MAX_PATH];
|
||||
if (! GetD2Path(currentpath, MAX_PATH))
|
||||
{
|
||||
log_msg("Path to Game.exe not found");
|
||||
return false;
|
||||
}
|
||||
log_msg("***** Get Game.exe version *****\n");
|
||||
|
||||
int ver = GetD2Version(currentpath);
|
||||
if (ver == -1) return false;
|
||||
//--------------------
|
||||
version_SmackW32=ver;
|
||||
version_D2Common=ver;
|
||||
version_ijl11=ver;
|
||||
version_D2Gdi=ver;
|
||||
version_D2Win=ver;
|
||||
version_D2sound=ver;
|
||||
version_D2MCPCLI=ver;
|
||||
version_D2Launch=ver;
|
||||
version_D2gfx=ver;
|
||||
version_D2Client=ver;
|
||||
version_D2Net=ver;
|
||||
version_D2Lang=ver;
|
||||
version_D2Game=ver;
|
||||
version_D2CMP=ver;
|
||||
version_Bnclient=ver;
|
||||
version_Fog=ver;
|
||||
version_Storm=ver;
|
||||
//-------------------
|
||||
log_msg("version Game.exe - ");
|
||||
log_msg(sD2Ver[ver]);
|
||||
log_msg("\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
//////////////////////////////////// EXPORTS FUNCTIONS ////////////////////////////////////
|
||||
|
||||
extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
|
||||
@@ -445,7 +489,12 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
|
||||
|
||||
loadD2Libraries();
|
||||
|
||||
if (!initD2version()) return NULL;
|
||||
if (!initD2version())
|
||||
{
|
||||
log_msg("wrong G ame.exe version\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
if (!initD2functions()) return NULL;
|
||||
|
||||
@@ -539,6 +588,10 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
|
||||
|
||||
unhookLibraries();
|
||||
|
||||
log_msg("\n*****Loading locale strings.*****\n");
|
||||
initLocaleStrings();
|
||||
log_msg("\n\n\n");
|
||||
|
||||
initCustomLibraries();
|
||||
|
||||
log_msg("***** ENTERING DIABLO II *****\n\n" );
|
||||
@@ -555,6 +608,7 @@ extern "C" __declspec(dllexport) bool __stdcall Release()
|
||||
log_msg("\n***** ENDING DIABLO II *****\n\n" );
|
||||
|
||||
freeCustomLibraries();
|
||||
freeLocaleStrings();
|
||||
freeD2Libraries();
|
||||
return true;
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
More little options.
|
||||
|
||||
@@ -26,7 +27,9 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem)
|
||||
{
|
||||
if (onRealm && (selectModParam==MOD_NO)) return;
|
||||
WCHAR text[0x50];
|
||||
swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem));
|
||||
//swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem));
|
||||
swprintf(text, getTranslatedString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem));
|
||||
wcscat(text,L"\n");
|
||||
D2SetColorPopup(text,WHITE);
|
||||
wcscat(popup,text);
|
||||
}
|
||||
@@ -139,17 +142,18 @@ void Install_DisplayItemLevel()
|
||||
log_msg("Patch D2Client for display item popup. (DisplayPopup)\n");
|
||||
|
||||
// print the text in the final buffer
|
||||
mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0);
|
||||
mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590);
|
||||
memt_byte( 0x68 , 0xE8);
|
||||
MEMT_REF4( 0x100, version_D2Client >= V113 ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9);
|
||||
MEMT_REF4( 0x100, version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9);
|
||||
//6FAE38A1 . 68 00010000 PUSH 100
|
||||
//6FB5DD0A |. 68 00010000 PUSH 100
|
||||
//6FB289DA |. 68 00010000 PUSH 100
|
||||
//6FB5E0AA |. 68 00010000 PUSH 100
|
||||
//6FB441C0 |. 68 00010000 PUSH 100
|
||||
//6FB48590 |. 68 00010000 PUSH 100
|
||||
|
||||
// print the text in the final buffer (for set items)
|
||||
mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3);
|
||||
mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3);
|
||||
memt_byte( 0x68 , 0xE8);
|
||||
MEMT_REF4( 0x100, version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9);
|
||||
//6FAE27BE . 68 00010000 PUSH 100
|
||||
@@ -157,6 +161,7 @@ void Install_DisplayItemLevel()
|
||||
//6FB27773 |. 68 00010000 PUSH 100
|
||||
//6FB5CEB3 |. 68 00010000 PUSH 100
|
||||
//6FB42FE3 |. 68 00010000 PUSH 100
|
||||
//6FB473B3 |. 68 00010000 PUSH 100
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -208,12 +213,12 @@ void Install_SendPlayersCommand()
|
||||
|
||||
log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n");
|
||||
|
||||
infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394);
|
||||
infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC);
|
||||
if ( version_D2Client >= V110 )
|
||||
msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00);
|
||||
msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C);
|
||||
|
||||
// Set nb Player to default
|
||||
mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2);//6FB1C7B7-6FAA0000
|
||||
mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2);//6FB1C7B7-6FAA0000
|
||||
MEMJ_REF4( D2GetResolution , caller_SendPlayersCommand);
|
||||
//6FB2723A |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
|
||||
//6FB265BA |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
|
||||
@@ -222,6 +227,7 @@ void Install_SendPlayersCommand()
|
||||
//6FB16A01 |. E8 AA65FAFF CALL <JMP.&D2gfx.#10063>
|
||||
//6FB40161 |. E8 1ECFF7FF CALL <JMP.&D2gfx.#10043>
|
||||
//6FB739F1 |. E8 B896F4FF CALL <JMP.&D2gfx.#10031>
|
||||
//6FACD3F1 |. E8 EAFBFEFF CALL <JMP.&D2gfx.#10012>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -239,13 +245,14 @@ void Install_AlwaysRegenMapInSP()
|
||||
log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n");
|
||||
|
||||
// Always regenerate maps in Single player
|
||||
mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE);
|
||||
mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E);
|
||||
memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368
|
||||
//6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93
|
||||
//01FE235D |. 74 09 JE SHORT D2Game.01FE2368
|
||||
//01F9966D |. 74 09 JE SHORT D2Game.01F99678
|
||||
//6FC3E1FE |. 74 09 JE SHORT D2Game.6FC3E209
|
||||
//6FD0D3BE |. 74 09 JE SHORT D2Game.6FD0D3C9
|
||||
//6FC46D7E |. 74 09 JE SHORT D2Game.6FC46D89
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -262,11 +269,12 @@ void Install_RunLODs()
|
||||
log_msg("Patch D2gfx for launch any number of Diablo II game in the same computer. (RunLODs)\n");
|
||||
|
||||
// execute if it's our packet else continue
|
||||
mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF);
|
||||
mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF, B6B0);
|
||||
memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6
|
||||
//6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6
|
||||
//6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996
|
||||
//6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606
|
||||
//6FA8B6B0 |. 74 45 JE SHORT D2gfx.6FA8B6F7
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -381,9 +389,9 @@ void Install_AlwaysDisplayLifeMana()
|
||||
|
||||
log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n");
|
||||
|
||||
if ( version_D2Client >= V113 )
|
||||
if ( version_D2Client >= V113c )
|
||||
{
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A);
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA);
|
||||
memt_byte( 0x0F , 0x90);
|
||||
memt_byte( 0x8C , 0xE8);
|
||||
MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113);
|
||||
@@ -393,10 +401,13 @@ void Install_AlwaysDisplayLifeMana()
|
||||
//6FAD7659 |. A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
|
||||
|
||||
//6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711
|
||||
//--
|
||||
//6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1
|
||||
|
||||
|
||||
} else {
|
||||
// Always display life.
|
||||
mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000);
|
||||
mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000);
|
||||
memt_byte( 0xA1 , 0xE8);
|
||||
MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife);
|
||||
//6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60]
|
||||
@@ -406,13 +417,13 @@ void Install_AlwaysDisplayLifeMana()
|
||||
|
||||
|
||||
// Always display mana.
|
||||
if ( version_D2Client >= V113 )
|
||||
if ( version_D2Client >= V113c )
|
||||
{
|
||||
//mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711);
|
||||
//memt_byte( 0x8B , 0x90);
|
||||
//memt_byte( 0x0D , 0xE8);
|
||||
//MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113);
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C);
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC);
|
||||
memt_byte( 0xA1 , 0xE8);
|
||||
MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113);
|
||||
//6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
|
||||
@@ -426,10 +437,12 @@ void Install_AlwaysDisplayLifeMana()
|
||||
//6FAD77CA |. 5B POP EBX
|
||||
//6FAD77CB |. 81C4 28030000 ADD ESP,328
|
||||
//6FAD77D1 \. C3 RETN
|
||||
//--
|
||||
//6FB1D7BC |> A1 3870BA6F MOV EAX,DWORD PTR DS:[6FB8BC4C]
|
||||
}
|
||||
else if ( version_D2Client >= V110 )
|
||||
{
|
||||
mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000);
|
||||
mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000, 0000);
|
||||
memt_byte( 0x5F , 0xE8);
|
||||
MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana);
|
||||
memt_byte( 0xC4 , 0x90); // NOP
|
||||
@@ -454,7 +467,7 @@ void Install_AlwaysDisplayLifeMana()
|
||||
//6FB3181F |. 81C4 5C020000 ADD ESP,25C
|
||||
//6FB31825 |. C3 RETN
|
||||
} else {
|
||||
mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0xE9 , 0xE8);
|
||||
MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9);
|
||||
//6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0
|
||||
@@ -539,23 +552,25 @@ void Install_DisplayBaseStatsValue()
|
||||
log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n");
|
||||
|
||||
// Always print stat button images.
|
||||
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5);
|
||||
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955);
|
||||
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
|
||||
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) );
|
||||
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) );
|
||||
memt_byte( 0x24, 0x90 ); // NOP
|
||||
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
|
||||
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB6F955 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
|
||||
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E);
|
||||
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE);
|
||||
MEMJ_REF4( D2PrintImage, caller_displayBaseStatsValue);
|
||||
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
|
||||
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
|
||||
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
|
||||
//6FB6D23D |. E8 54FEF4FF |CALL <JMP.&D2gfx.#10041>
|
||||
//6FB6F9DD |. E8 54FEF4FF |CALL <JMP.&D2gfx.#10042>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -583,13 +598,14 @@ void Install_LadderRunewords()
|
||||
|
||||
log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n");
|
||||
|
||||
mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2);
|
||||
mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782);
|
||||
MEMC_REF4( D2CompileTxtFile, compileRunesTxt);
|
||||
//01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578
|
||||
//6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653
|
||||
//6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496
|
||||
//6FDAD491 |. E8 BA49FEFF CALL D2Common.#10244 ; \#10244
|
||||
//6FDC24B1 |. E8 8ACAFEFF CALL D2Common.#10849 ; \#10849
|
||||
//6FDB3781 |. E8 5A93FAFF CALL D2Common.#10037 ; \#10037
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
@@ -607,7 +623,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill()
|
||||
|
||||
log_msg("Patch D2Game for enabled the opening of Cow Portal when player have already kill the cow king in that difficulty. (EnabledCowPortalWhenCowKingWasKill)\n");
|
||||
|
||||
mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508);
|
||||
mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508, EBE8);
|
||||
memt_byte( 0x85 , 0x33); // XOR EAX,EAX
|
||||
//6FC8DFF7 . 85C0 TEST EAX,EAX
|
||||
//6FC8E457 . 85C0 TEST EAX,EAX
|
||||
@@ -616,6 +632,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill()
|
||||
//01FEDB68 |. 85C0 TEST EAX,EAX
|
||||
//6FC95C68 |. 85C0 TEST EAX,EAX
|
||||
//6FC87508 |. 85C0 TEST EAX,EAX
|
||||
//6FC2EBE8 |. 85C0 TEST EAX,EAX
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Updating server.
|
||||
|
||||
@@ -101,7 +102,7 @@ void Install_VariableOnRealm()
|
||||
log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n");
|
||||
|
||||
// click on Battle.net button
|
||||
mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295);
|
||||
mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295, 11C65);
|
||||
memt_byte( 0x81, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x000400EC, caller_BnetBtnPress);
|
||||
memt_byte( 0x00, 0x90 ); // NOP
|
||||
@@ -114,7 +115,7 @@ void Install_VariableOnRealm()
|
||||
//6FA1EFFC . B8 01000000 MOV EAX,1
|
||||
|
||||
// click on TCP/IP button
|
||||
mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E);
|
||||
mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E);
|
||||
if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110)
|
||||
{
|
||||
memt_byte( 0xBD, 0xE8 ); // CALL
|
||||
@@ -126,7 +127,7 @@ void Install_VariableOnRealm()
|
||||
}
|
||||
|
||||
// click on SinglePlayer button
|
||||
mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36);
|
||||
mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36, A906);
|
||||
memt_byte( 0xBA, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress);
|
||||
//6FA4B726 . BA 00040000 MOV EDX,400
|
||||
@@ -135,7 +136,7 @@ void Install_VariableOnRealm()
|
||||
{
|
||||
log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n");
|
||||
//Bug crash ptClient search fix (for Megalixir Mod).
|
||||
mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x39 ,0xE8);
|
||||
MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug);
|
||||
memt_byte( 0xC1 ,0x90);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Gestion of the infinity and shared Stash.
|
||||
|
||||
@@ -80,7 +81,7 @@ Stash* newStash(DWORD id)
|
||||
d2_assert( id == 0xFFFFFFFF , "trop de stash", __FILE__, __LINE__);
|
||||
|
||||
Stash* stash = (Stash*)malloc(sizeof(Stash));//D2AllocMem(memPool, sizeof(Stash),__FILE__,__LINE__,0);
|
||||
d2_assert(!stash , "pb de g<EFBFBD>n<EFBFBD>ration de stash", __FILE__, __LINE__);
|
||||
d2_assert(!stash , "pb de generation de stash", __FILE__, __LINE__);
|
||||
ZeroMemory(stash, sizeof(Stash));
|
||||
stash->id = id;
|
||||
|
||||
@@ -804,42 +805,45 @@ void Install_MultiPageStash()
|
||||
log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n");
|
||||
|
||||
// Cannot put 2 items carry1 in inventory
|
||||
mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3);
|
||||
mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013);
|
||||
MEMJ_REF4( D2ItemSetPage , version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit);
|
||||
//6FC8504F . E8 94670900 CALL <JMP.&D2Common.#10720>
|
||||
//01FD7CA2 . E8 6329FBFF CALL <JMP.&D2Common.#10485>
|
||||
//01F9FE62 . E8 47A8FDFF CALL <JMP.&D2Common.#10608>
|
||||
//6FCB9B02 . E8 9709F7FF CALL <JMP.&D2Common.#10223>
|
||||
//6FCEF1E2 . E8 47B7F3FF CALL <JMP.&D2Common.#10012>
|
||||
//6FC8B012 . E8 13F7F9FF CALL <JMP.&D2Common.#11026>
|
||||
|
||||
// Cannot put 2 items carry1 in inventory by swapping
|
||||
mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8);
|
||||
mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78);
|
||||
MEMJ_REF4( D2ItemGetPage , version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap);
|
||||
//6FC858D8 . E8 175F0900 CALL <JMP.&D2Common.#10719>
|
||||
//01FD8967 . E8 8E1DFBFF CALL <JMP.&D2Common.#10820>
|
||||
//01FA10E7 . E8 9A96FDFF CALL <JMP.&D2Common.#10505>
|
||||
//6FCBB6E7 . E8 CAEDF6FF CALL <JMP.&D2Common.#10370>
|
||||
//6FCF10C7 . E8 F895F3FF CALL <JMP.&D2Common.#10020>
|
||||
//6FC8BC77 . E8 22E9F9FF CALL <JMP.&D2Common.#10810>
|
||||
|
||||
if ( version_D2Game >= V111 )
|
||||
{
|
||||
// Cannot put 2 items carry1 in inventory when drop cube
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15);
|
||||
MEMJ_REF4( D2CanPutItemInInv , caller_carry1LimitWhenDrop_111);
|
||||
//01FBD934 |. E8 5BD3FCFF |CALL <JMP.&D2Common.#10855>
|
||||
//01FB9FD4 |. E8 3912FCFF |CALL <JMP.&D2Common.#10813>
|
||||
//6FC37AD4 |. E8 0535FFFF |CALL <JMP.&D2Common.#10289>
|
||||
//6FCF7B74 |. E8 232FF3FF |CALL <JMP.&D2Common.#10133>
|
||||
//6FCD7B14 |. E8 7D32F5FF |CALL <JMP.&D2Common.#10402>
|
||||
} else {
|
||||
// Cannot put 2 items carry1 in inventory when drop cube
|
||||
mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0xBA ,0xE8);
|
||||
MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop);
|
||||
//6FC44341 |. BA 06080000 |MOV EDX,806
|
||||
}
|
||||
|
||||
// Verif only carry1 out of stash page when pick up an item
|
||||
mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B);
|
||||
mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B);
|
||||
memt_byte( 0x8B ,0xE8);
|
||||
MEMT_REF4( version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash);
|
||||
memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90);
|
||||
@@ -853,6 +857,8 @@ void Install_MultiPageStash()
|
||||
//6FC3209F |. 85F6 |TEST ESI,ESI
|
||||
//6FCF211B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||
//6FCF211F |. 85F6 |TEST ESI,ESI
|
||||
//6FCD301B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||
//6FCD301F |. 85F6 |TEST ESI,ESI
|
||||
|
||||
log_msg("\n");
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Interface functions
|
||||
|
||||
@@ -36,7 +37,7 @@ void STDCALL printSkillsPageBtns()
|
||||
|
||||
if ( isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
||||
{
|
||||
LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN);
|
||||
LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN);
|
||||
D2PrintPopup(popupText, getXSkillBtn()+getLSkillBtn()/2, getYSkillBtn()-getHSkillBtn(), 0, 1);
|
||||
}
|
||||
}
|
||||
@@ -140,7 +141,7 @@ void Install_InterfaceSkills()
|
||||
log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n");
|
||||
|
||||
// Print new buttons images
|
||||
mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20);
|
||||
mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380);
|
||||
memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns
|
||||
if ( version_D2Client >= V111 ) {
|
||||
MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111);
|
||||
@@ -164,6 +165,11 @@ void Install_InterfaceSkills()
|
||||
//6FB27F22 |. 5B POP EBX
|
||||
//6FB27F23 \. C3 RETN
|
||||
//6FB27F24 CC INT3
|
||||
//6FADF380 |> 5F POP EDI
|
||||
//6FADF381 |. 5E POP ESI
|
||||
//6FADF382 |. 5B POP EBX
|
||||
//6FADF383 \. C3 RETN
|
||||
//6FADF384 CC INT3
|
||||
} else {
|
||||
MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns);
|
||||
memt_byte( 0xC4, 0x90 ); // NOP
|
||||
@@ -180,7 +186,7 @@ void Install_InterfaceSkills()
|
||||
if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1)
|
||||
{
|
||||
// Don't print "Skill Points Remaining"
|
||||
mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334);
|
||||
mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4);
|
||||
memt_byte( 0xB9, 0xE8 );
|
||||
MEMT_REF4( 0x00001083, version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining);
|
||||
//6FB17080 /$ B9 83100000 MOV ECX,1083
|
||||
@@ -188,10 +194,11 @@ void Install_InterfaceSkills()
|
||||
//6FB3AC74 |. B9 83100000 MOV ECX,1083
|
||||
//6FB2ECF4 |. B9 83100000 MOV ECX,1083
|
||||
//6FB28334 |. B9 83100000 MOV ECX,1083
|
||||
//6FADF7E4 |. B9 83100000 MOV ECX,1083
|
||||
}
|
||||
|
||||
// Manage mouse down (Play sound)
|
||||
mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62);
|
||||
mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112);
|
||||
memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown
|
||||
MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
|
||||
memt_byte( 0x00, 0x90 ); // NOP
|
||||
@@ -199,17 +206,19 @@ void Install_InterfaceSkills()
|
||||
//6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0
|
||||
//6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FB308B2 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FB29C62 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FB308B2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FB29C62 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
|
||||
//6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
|
||||
|
||||
// Manage mouse up
|
||||
mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8);
|
||||
mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8);
|
||||
MEMJ_REF4( D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A
|
||||
//6FB18465 . E8 C07D0400 CALL <JMP.&Storm.#511>
|
||||
//6FAC7557 .^E9 4248FFFF JMP <JMP.&Storm.#511>
|
||||
//6FB3C077 .^E9 16FDF7FF JMP <JMP.&Storm.#511>
|
||||
//6FB30247 .^E9 2CBCF8FF JMP <JMP.&Storm.#511>
|
||||
//6FB295F7 .^E9 8828F9FF JMP <JMP.&Storm.#511>
|
||||
//6FAE0AA7 .^E9 E0B2FDFF JMP <JMP.&Storm.#511>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Interface stats page functions
|
||||
|
||||
@@ -450,43 +451,47 @@ void Install_InterfaceStash()
|
||||
log_msg("Patch D2Client for stash interface. (InterfaceStash)\n");
|
||||
|
||||
// Print button images
|
||||
mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56);
|
||||
mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26);
|
||||
MEMC_REF4( D2LoadBuySelBtn, printBtns);
|
||||
//6FADF398 |. E8 734D0400 CALL D2Client.6FB24110
|
||||
//6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0
|
||||
//6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0
|
||||
//6FB63655 |. E8 9682FDFF CALL D2Client.6FB3B8F0
|
||||
//6FB49A55 |. E8 96500200 CALL D2Client.6FB6EAF0
|
||||
//6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0
|
||||
|
||||
// print page number
|
||||
mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33);
|
||||
mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03);
|
||||
MEMJ_REF4( D2PrintString, printPageNumber);
|
||||
//6FADF374 |. E8 3FCC0800 CALL <JMP.&D2Win.#10117>
|
||||
//6FB60FE2 |. E8 99C2F5FF CALL <JMP.&D2Win.#10020>
|
||||
//6FB2DF62 |. E8 19F3F8FF CALL <JMP.&D2Win.#10064>
|
||||
//6FB63632 |. E8 299DF5FF CALL <JMP.&D2Win.#10001>
|
||||
//6FB49A32 |. E8 4739F7FF CALL <JMP.&D2Win.#10150>
|
||||
//6FB49A32 |. E8 91F4F6FF CALL <JMP.&D2Win.#10150>
|
||||
//6FB4DE02 |. E8 4739F7FF CALL <JMP.&D2Win.#10076>
|
||||
|
||||
// Manage mouse down (Play sound)
|
||||
mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6);
|
||||
mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76);
|
||||
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown);
|
||||
//6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080
|
||||
//6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520
|
||||
//6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0
|
||||
//6FB654A5 . E8 9611FFFF CALL D2Client.6FB56640
|
||||
//6FB4B8A5 . E8 5614FFFF CALL D2Client.6FB3CD00
|
||||
//6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10
|
||||
|
||||
// Manage mouse up
|
||||
mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9);
|
||||
mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9);
|
||||
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp);
|
||||
//6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080
|
||||
//6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520
|
||||
//6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0
|
||||
//6FB652D8 > E8 6313FFFF CALL D2Client.6FB56640
|
||||
//6FB4B6D8 > E8 2316FFFF CALL D2Client.6FB3CD00
|
||||
//6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10
|
||||
|
||||
// init state of button on open stash page
|
||||
mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A);
|
||||
mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A);
|
||||
memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates
|
||||
MEMT_REF4( 0x000104C4, initBtnsStates);
|
||||
memt_byte( 0x00, 0x90 );
|
||||
@@ -497,24 +502,27 @@ void Install_InterfaceStash()
|
||||
//6FB249DA |> 81C4 04010000 ADD ESP,104
|
||||
//6FB59D9A |> 81C4 04010000 ADD ESP,104
|
||||
//6FB3CC3A |> 81C4 04010000 ADD ESP,104
|
||||
//6FB4441A |> 81C4 04010000 ADD ESP,104
|
||||
|
||||
// init the search of print in green the item set name we have in stash
|
||||
mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434);
|
||||
mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24);
|
||||
MEMJ_REF4( D2InventoryGetFirstItem, initGetNextItemForSet);
|
||||
//6FAE5996 |. E8 D5500800 CALL <JMP.&D2Common.#10277>
|
||||
//6FB571F3 |. E8 D64EF6FF CALL <JMP.&D2Common.#10402>
|
||||
//6FB21F63 |. E8 96A1F9FF CALL <JMP.&D2Common.#10535>
|
||||
//6FB57313 |. E8 8250F6FF CALL <JMP.&D2Common.#11151>
|
||||
//6FB3D433 |. E8 B8F0F7FF CALL <JMP.&D2Common.#10460>
|
||||
//6FB41A23 |. E8 96A7F7FF CALL <JMP.&D2Common.#11040>
|
||||
|
||||
// Get next item for print in green the item set name we have in stash
|
||||
mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB);
|
||||
mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB);
|
||||
MEMJ_REF4( D2UnitGetNextItem, getNextItemForSet);
|
||||
//6FAE5A1B E8 4A500800 CALL <JMP.&D2Common.#10304>
|
||||
//6FB5728A |. E8 0B4FF6FF |CALL <JMP.&D2Common.#10934>
|
||||
//6FB21FFA |. E8 A1A1F9FF |CALL <JMP.&D2Common.#11140>
|
||||
//6FB573AA |. E8 7550F6FF |CALL <JMP.&D2Common.#10770>
|
||||
//6FB3D4CA |. E8 99F0F7FF |CALL <JMP.&D2Common.#10464>
|
||||
//6FB41ABA |. E8 A3A8F7FF |CALL <JMP.&D2Common.#10879>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Interface functions
|
||||
|
||||
@@ -48,17 +49,17 @@ void STDCALL printStatsPageBtns()
|
||||
|
||||
sDrawImageInfo data;
|
||||
ZeroMemory(&data,sizeof(data));
|
||||
|
||||
|
||||
if (printBackgroundOnMainPage && D2GetResolution())
|
||||
{
|
||||
{
|
||||
setImage(&data, statsBackgroundImages);
|
||||
setFrame(&data, 1);
|
||||
setFrame(&data, 1);
|
||||
D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0);
|
||||
}
|
||||
|
||||
|
||||
setImage(&data, D2LoadBuySelBtn());
|
||||
if (D2GetResolution())
|
||||
{
|
||||
{
|
||||
setFrame(&data, 12 + isDownBtn.previousPage);
|
||||
D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0);
|
||||
}
|
||||
@@ -67,12 +68,12 @@ void STDCALL printStatsPageBtns()
|
||||
|
||||
D2SetFont(1);
|
||||
if (D2GetResolution() && isOnPreviousPageBtn(mx,my)) //print popup "previous page"
|
||||
{
|
||||
{
|
||||
lpText = getTranslatedString(STR_PREVIOUS_PAGE);
|
||||
D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1);
|
||||
}
|
||||
else if ( isOnNextPageBtn(mx,my))
|
||||
{
|
||||
{
|
||||
lpText = getTranslatedString(STR_NEXT_PAGE);
|
||||
D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
|
||||
}
|
||||
@@ -245,7 +246,7 @@ void Install_InterfaceStats()
|
||||
log_msg("Patch D2Client for stats interface. (InterfaceStats)\n");
|
||||
|
||||
// Print new buttons images
|
||||
mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16);
|
||||
mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6);
|
||||
memt_byte( 0x5F, 0xE9 ); // JMP
|
||||
MEMT_REF4( 0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9);
|
||||
//6FAD0F86 . 5F POP EDI
|
||||
@@ -278,34 +279,41 @@ void Install_InterfaceStats()
|
||||
//6FB6DC19 |. 5B POP EBX
|
||||
//6FB6DC1A |. 81C4 70030000 ADD ESP,370
|
||||
//6FB6DC20 \. C3 RETN
|
||||
|
||||
//6FB703B6 |. 5F POP EDI
|
||||
//6FB703B7 |. 5E POP ESI
|
||||
//6FB703B8 |. 5D POP EBP
|
||||
//6FB703B9 |. 5B POP EBX
|
||||
//6FB703BA |. 81C4 70030000 ADD ESP,370
|
||||
//6FB703<30>0 \. C3 RETN
|
||||
if ( version_D2Client >= V111 )
|
||||
{
|
||||
// Manage mouse down (Play sound)
|
||||
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8);
|
||||
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568);
|
||||
memt_byte( 0xA1, 0xE8 );
|
||||
MEMT_REF4( ptptClientChar, caller_statsPageMouseDown);
|
||||
//6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
|
||||
//6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
|
||||
//6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
|
||||
//6FB6CDC8 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC]
|
||||
//6FB6F568 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050]
|
||||
|
||||
// Manage mouse up
|
||||
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33);
|
||||
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3);
|
||||
memt_byte( 0xA1, 0xE8 );
|
||||
MEMT_REF4( ptptClientChar, caller_statsPageMouseUp);
|
||||
//6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
|
||||
//6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
|
||||
//6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
|
||||
//6FB6DE33 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC]
|
||||
//6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050]
|
||||
} else {
|
||||
// Manage mouse down (Play sound)
|
||||
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000);
|
||||
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000);
|
||||
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown);
|
||||
//6FAD133C . E8 8F700500 CALL D2Client.6FB283D0
|
||||
|
||||
// Manage mouse up
|
||||
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000);
|
||||
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000);
|
||||
MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2
|
||||
//6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Load Player Custom Data.
|
||||
|
||||
@@ -476,7 +477,7 @@ void Install_LoadPlayerData()
|
||||
log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n");
|
||||
|
||||
// Load SP player custom data.
|
||||
mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D);
|
||||
mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD);
|
||||
memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData
|
||||
MEMT_REF4( 0x75F685F0 , caller_LoadSPPlayerCustomData);
|
||||
memt_byte( 0x16, 0x90); // NOP
|
||||
@@ -495,9 +496,12 @@ void Install_LoadPlayerData()
|
||||
//6FC7638D |> 8BF0 MOV ESI,EAX
|
||||
//6FC7638F |. 85F6 TEST ESI,ESI
|
||||
//6FC76391 |. 75 16 JNZ SHORT D2Game.6FC763A9
|
||||
//6FC5BCCD |> 8BF0 MOV ESI,EAX
|
||||
//6FC5BCCF |. 85F6 TEST ESI,ESI
|
||||
//6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9
|
||||
|
||||
// Load MP player custom data.
|
||||
mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217);
|
||||
mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57);
|
||||
memt_byte( 0x83, 0xE8);
|
||||
MEMT_REF4( version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9);
|
||||
//6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0
|
||||
@@ -510,18 +514,21 @@ void Install_LoadPlayerData()
|
||||
//6FC6644A |. 74 21 JE SHORT D2Game.6FC6646D
|
||||
//6FC76217 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||
//6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D
|
||||
//6FC5BB57 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||
//6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D
|
||||
|
||||
// Send save files to Server.
|
||||
mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C);
|
||||
mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C);
|
||||
MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles);
|
||||
//6FAAD5A1 |. E8 88D10B00 CALL <JMP.&Fog.#10115>
|
||||
//6FB233FB |. E8 CA8AF9FF CALL <JMP.&Fog.#10115>
|
||||
//6FB0DFDB |. E8 C6DEFAFF CALL <JMP.&Fog.#10115>
|
||||
//6FB2933B |. E8 6A2CF9FF CALL <JMP.&Fog.#10115>
|
||||
//6FAC457B |. E8 187AFFFF CALL <JMP.&Fog.#10115>
|
||||
//6FB6638B |. E8 2E5BF5FF CALL <JMP.&Fog.#10115>
|
||||
|
||||
// Receive save files from client.
|
||||
mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39);
|
||||
mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9);
|
||||
memt_byte( 0x8B ,0xE8);
|
||||
if ( version_D2Game >= V111 ) {
|
||||
MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111);
|
||||
@@ -535,6 +542,8 @@ void Install_LoadPlayerData()
|
||||
//6FC824DC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||
//6FCEAF39 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
|
||||
//6FCEAF3C |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||
//6FCF53E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
|
||||
//6FCF53EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||
} else {
|
||||
MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles);
|
||||
//6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI]
|
||||
@@ -543,7 +552,7 @@ void Install_LoadPlayerData()
|
||||
|
||||
if ( version_Fog <= V109d )
|
||||
{
|
||||
mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x8B ,0xE8);
|
||||
MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d);
|
||||
memt_byte( 0x44 ,0x90);
|
||||
|
@@ -1,5 +1,7 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
|
||||
Add "plugY v1.00" on screen.
|
||||
|
||||
@@ -46,7 +48,7 @@ void Install_PrintPlugYVersion()
|
||||
log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n");
|
||||
|
||||
// Print PlugY version.
|
||||
mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061);
|
||||
mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11);
|
||||
MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion);
|
||||
//6FA19638 |. E8 1BED0000 CALL <JMP.&D2Win.#10017>
|
||||
//6FA517C6 |. E8 6F81FFFF CALL <JMP.&D2Win.#10147>
|
||||
@@ -54,6 +56,7 @@ void Install_PrintPlugYVersion()
|
||||
//6FA56B1F |. E8 1A2EFFFF CALL <JMP.&D2Win.#10098>
|
||||
//6FA56AF6 |. E8 432EFFFF CALL <JMP.&D2Win.#10098>
|
||||
//6FA58060 |. E8 ED18FFFF CALL <JMP.&D2Win.#10098>
|
||||
//6FA50A10 |. E8 218FFFFF CALL <JMP.&D2Win.#10164>
|
||||
|
||||
|
||||
log_msg("\n");
|
||||
@@ -91,7 +94,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
|
||||
// Print LoD/Mod version.
|
||||
if (version_D2Launch >= V110)
|
||||
{
|
||||
mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134);//6FA19721-6FA10000
|
||||
mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4);//6FA19721-6FA10000
|
||||
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x8B102454 , caller_VersionChange_10);
|
||||
memt_byte( 0xCF, 0x90 ); // NOP
|
||||
@@ -105,14 +108,17 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
|
||||
//6FA56BCF |. 8BCF MOV ECX,EDI
|
||||
//6FA58134 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||
//6FA58138 |. 8BCF MOV ECX,EDI
|
||||
//6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||
//6FA50AE8 |. 8BCF MOV ECX,EDI
|
||||
} else {
|
||||
mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B);
|
||||
mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB);
|
||||
MEMJ_REF4( D2PrintLineOnTextBox, versionChange);
|
||||
//6FA19729 |. E8 88EB0000 CALL <JMP.&D2Win.#10046>
|
||||
//6FA518A1 |. E8 267FFFFF CALL <JMP.&D2Win.#10061>
|
||||
//6FA57981 |. E8 781EFFFF CALL <JMP.&D2Win.#10075>
|
||||
//6FA56BD1 |. E8 EA2CFFFF CALL <JMP.&D2Win.#10015>
|
||||
//6FA5813A |. E8 8F17FFFF CALL <JMP.&D2Win.#10022>
|
||||
//6FA50AEA |. E8 DF8CFFFF CALL <JMP.&D2Win.#10051>
|
||||
}
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Modified by L'Autour.
|
||||
|
||||
Cube Listing functions
|
||||
|
||||
@@ -14,62 +15,98 @@
|
||||
|
||||
|
||||
const char* CUBEFORMULA_FILE = "cube.txt";
|
||||
const char * STRING_ERROR="***Error***";
|
||||
const LPWSTR STRING_ERROR= L"***Error***";
|
||||
|
||||
|
||||
#define BUF (&buf[strlen(buf)])
|
||||
|
||||
#define lenbuf 512
|
||||
#define lenbufi 256
|
||||
#define BUF &buf[cntbuf], lenbuf-cntbuf
|
||||
bool InNoSocket; //~~~~~
|
||||
|
||||
/*
|
||||
6FC9275F |. E8 ECCCFFFF |CALL D2Game.6FC8F450 ; \D2Game.6FC8F450
|
||||
|
||||
|
||||
*/
|
||||
void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs)
|
||||
void printOutput(CubeOutput* output, WCHAR* buf, BYTE* nbOutputs)
|
||||
{
|
||||
if (!output->outputType)
|
||||
return;
|
||||
|
||||
int cntbuf = wcslen(buf);
|
||||
|
||||
if (*nbOutputs)
|
||||
sprintf(BUF," + ");
|
||||
cntbuf += swprintf(BUF,L" + ");
|
||||
*nbOutputs += 1;
|
||||
|
||||
if (output->outputType == 1) {
|
||||
sprintf(BUF,"Cow Portal");
|
||||
swprintf(BUF,getTranslatedString(STR_COW_PORTAL));
|
||||
return;
|
||||
} else if (output->outputType == 2) {
|
||||
sprintf(BUF,"Pandemonium Portal");
|
||||
swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_PORTAL));
|
||||
return;
|
||||
} else if (output->outputType == 3) {
|
||||
sprintf(BUF,"Pandemonium Final Portal");
|
||||
swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_FINAL_PORTAL));
|
||||
return;
|
||||
}
|
||||
|
||||
if ((output->quantityOrNbSockets>1) && !output->haveSockets)
|
||||
sprintf(BUF,"%u ", output->quantityOrNbSockets);
|
||||
|
||||
{
|
||||
if (output->quantityOrNbSockets == 255)
|
||||
{cntbuf += swprintf(BUF,getTranslatedString(STR_FULL));}
|
||||
else
|
||||
{cntbuf += swprintf(BUF,L"%u ", output->quantityOrNbSockets);}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
WCHAR itembuf[lenbufi];
|
||||
LPWSTR itemstr = &itembuf[0];
|
||||
if (!(output->isSpecificItem))
|
||||
{
|
||||
ItemsBIN* items; LPWSTR string;
|
||||
switch (output->outputType)
|
||||
{
|
||||
case 0xFC:
|
||||
items = D2GetItemsBIN(output->ID);
|
||||
wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi);
|
||||
break;
|
||||
case 0xFD:
|
||||
getTypeUString(output->ID, itemstr, lenbufi);
|
||||
break;
|
||||
case 0xFE: wcsncpy(itemstr, getTranslatedString(STR_ITEM),lenbufi);break;
|
||||
case 0xFF: wcsncpy(itemstr, getTranslatedString(STR_ITEM_SAME_TYPE),lenbufi);break;
|
||||
default: swprintf(BUF,STRING_ERROR);return;
|
||||
}
|
||||
|
||||
itemstr = cutStringGender(itemstr);
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
if (output->repair)
|
||||
sprintf(BUF,"repair ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_REPAIR);
|
||||
|
||||
if ((output->repair)&&(output->recharge))
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_AND);
|
||||
|
||||
if (output->recharge)
|
||||
sprintf(BUF,"recharge ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_RECHARGE);
|
||||
|
||||
if (output->isEthereal)
|
||||
sprintf(BUF,"ethereal ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL);
|
||||
|
||||
if (output->destroysFillers)
|
||||
sprintf(BUF,"destroys Fillers ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_DESTROY_FILLERS);
|
||||
|
||||
if (output->removeFillers)
|
||||
sprintf(BUF,"remove Fillers ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_REMOVE_FILLERS);
|
||||
|
||||
if (output->regeneratesUnique)
|
||||
sprintf(BUF,"regenerate ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_REGENERATE);
|
||||
|
||||
if (output->upgradeToExceptional)
|
||||
sprintf(BUF,"exceptional ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL);
|
||||
|
||||
if (output->upgradeToElite)
|
||||
sprintf(BUF,"elite ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_ELITE);
|
||||
|
||||
|
||||
if (output->isSpecificItem) {
|
||||
@@ -77,131 +114,163 @@ void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs)
|
||||
{
|
||||
UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + output->specificID-1;
|
||||
LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
cntbuf += swprintf(BUF,string);
|
||||
} else if (output->quality == ITEMQUALITY_SET) {
|
||||
SetItemsBIN* setItems = SgptDataTables->setItems + output->specificID-1;
|
||||
LPWSTR string = D2GetStringFromIndex(setItems->setNameId);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
cntbuf += swprintf(BUF,string);
|
||||
} else {
|
||||
sprintf(BUF,STRING_ERROR);return;
|
||||
swprintf(BUF,STRING_ERROR);return;
|
||||
}
|
||||
} else {
|
||||
switch (output->quality)
|
||||
{
|
||||
case 1:sprintf(BUF,"Cracked ");break;
|
||||
case 2:sprintf(BUF,"Normal ");break;
|
||||
case 3:sprintf(BUF,"Superior ");break;
|
||||
case 4:sprintf(BUF,"Magic ");break;
|
||||
case 5:sprintf(BUF,"Set ");break;
|
||||
case 6:sprintf(BUF,"Rare ");break;
|
||||
case 7:sprintf(BUF,"Unique ");break;
|
||||
case 8:sprintf(BUF,"Crafted ");break;
|
||||
case 9:sprintf(BUF,"Tempered ");break;
|
||||
}
|
||||
ItemsBIN* items;LPWSTR string;
|
||||
case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break;
|
||||
case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break;
|
||||
case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break;
|
||||
case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break;
|
||||
case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break;
|
||||
case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break;
|
||||
case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break;
|
||||
case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break;
|
||||
case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break;
|
||||
} /*
|
||||
ItemsBIN* items; LPWSTR string;
|
||||
switch (output->outputType)
|
||||
{
|
||||
case 0xFC:
|
||||
items = D2GetItemsBIN(output->ID);
|
||||
string = D2GetStringFromIndex(items->NameStr);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
cntbuf += swprintf(BUF,string);
|
||||
break;
|
||||
case 0xFD:
|
||||
getTypeAString(output->ID,BUF,50);
|
||||
// WCHAR string[50];
|
||||
// getTypeString(input->ID,string,50);
|
||||
// wcstombs(BUF, string, wcslen(string)+1);
|
||||
getTypeUString(output->ID,BUF);
|
||||
break;
|
||||
case 0xFE: sprintf(BUF,"Item");break;
|
||||
case 0xFF: sprintf(BUF,"Item of the same type");break;
|
||||
default: sprintf(BUF,STRING_ERROR);return;
|
||||
case 0xFE: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM));break;
|
||||
case 0xFF: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM_SAME_TYPE));break;
|
||||
default: cntbuf += swprintf(BUF,STRING_ERROR);return;
|
||||
} */
|
||||
cntbuf += swprintf(BUF,setMonoString(itemstr));
|
||||
|
||||
}
|
||||
if ((output->haveSockets==1)||InNoSocket)
|
||||
{
|
||||
if(output->quantityOrNbSockets>1)
|
||||
{
|
||||
swprintf(BUF,getTranslatedString(STR_WITH_N_SOCKETS), output->quantityOrNbSockets);
|
||||
} else
|
||||
{
|
||||
swprintf(BUF,getTranslatedString(STR_WITH_SOCKET));
|
||||
}
|
||||
}
|
||||
if ((output->quantityOrNbSockets>1) && (output->haveSockets==1))
|
||||
sprintf(BUF," with %u sockets", output->quantityOrNbSockets);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void printInput(CubeInput* input, char* buf, BYTE* nbInputs)//maxsize)
|
||||
void printInput(CubeInput* input, WCHAR* buf, BYTE* nbInputs)//maxsize)
|
||||
{
|
||||
if (!input->byItemID && !input->byItemTypeID)
|
||||
return;
|
||||
|
||||
int cntbuf = wcslen(buf);
|
||||
|
||||
if (*nbInputs)
|
||||
sprintf(BUF," + ");
|
||||
cntbuf += swprintf(BUF,L" + ");
|
||||
|
||||
BYTE nb = input->quantity > 0 ? input->quantity : 1;
|
||||
*nbInputs += nb;
|
||||
if (nb>1)
|
||||
sprintf(BUF,"%u ", nb);
|
||||
cntbuf += swprintf(BUF,L"%u ", nb);
|
||||
|
||||
WCHAR itembuf[lenbufi];
|
||||
LPWSTR itemstr = &itembuf[0];
|
||||
//-------------------------------------------------------------------------------
|
||||
if (!(input->isSpecificItem))
|
||||
{
|
||||
if (input->byItemTypeID) {
|
||||
getTypeUString(input->ID, itemstr, lenbufi);
|
||||
} else if (input->ID == 0xFFFF) {
|
||||
wcsncpy(itemstr, getTranslatedString(STR_ITEM), lenbufi);
|
||||
} else {
|
||||
ItemsBIN* items = D2GetItemsBIN(input->ID);
|
||||
wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi);
|
||||
}
|
||||
itemstr = cutStringGender(itemstr);
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
if (input->isEthereal)
|
||||
sprintf(BUF,"ethereal ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL);
|
||||
|
||||
if (input->isNotEthereal)
|
||||
sprintf(BUF,"not ethereal ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_NOT_ETHERAL);
|
||||
|
||||
if (input->isNotRuneword)
|
||||
sprintf(BUF,"not runeword ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_NOT_RUNEWORD);
|
||||
|
||||
if (input->isBasic)
|
||||
sprintf(BUF,"basic ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_BASIC);
|
||||
|
||||
if (input->isExceptional)
|
||||
sprintf(BUF,"exceptional ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL);
|
||||
|
||||
if (input->isElite)
|
||||
sprintf(BUF,"elite ");
|
||||
cntbuf += wSprintStringLastGender(BUF, STR_ELITE);
|
||||
|
||||
if (input->isSpecificItem) {
|
||||
if (input->quality == ITEMQUALITY_UNIQUE)
|
||||
{
|
||||
UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + input->specificID-1;
|
||||
LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
cntbuf += swprintf(BUF,string);
|
||||
} else if (input->quality == ITEMQUALITY_SET) {
|
||||
SetItemsBIN* setItems = SgptDataTables->setItems + input->specificID-1;
|
||||
LPWSTR string = D2GetStringFromIndex(setItems->setNameId);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
cntbuf += swprintf(BUF,string);
|
||||
} else {
|
||||
sprintf(BUF,STRING_ERROR);return;
|
||||
swprintf(BUF,STRING_ERROR);return;
|
||||
}
|
||||
} else {
|
||||
switch (input->quality)
|
||||
{
|
||||
case 1:sprintf(BUF,"Cracked ");break;
|
||||
case 2:sprintf(BUF,"Normal ");break;
|
||||
case 3:sprintf(BUF,"Superior ");break;
|
||||
case 4:sprintf(BUF,"Magic ");break;
|
||||
case 5:sprintf(BUF,"Set ");break;
|
||||
case 6:sprintf(BUF,"Rare ");break;
|
||||
case 7:sprintf(BUF,"Unique ");break;
|
||||
case 8:sprintf(BUF,"Crafted ");break;
|
||||
case 9:sprintf(BUF,"Tempered ");break;
|
||||
}
|
||||
|
||||
case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break;
|
||||
case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break;
|
||||
case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break;
|
||||
case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break;
|
||||
case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break;
|
||||
case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break;
|
||||
case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break;
|
||||
case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break;
|
||||
case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break;
|
||||
}/*
|
||||
if (input->byItemTypeID) {
|
||||
getTypeAString(input->ID,BUF,50);
|
||||
getTypeUString(input->ID,BUF);
|
||||
} else if (input->ID == 0xFFFF) {
|
||||
sprintf(BUF,"Item");
|
||||
cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM));
|
||||
} else {
|
||||
ItemsBIN* items = D2GetItemsBIN(input->ID);
|
||||
LPWSTR string = D2GetStringFromIndex(items->NameStr);
|
||||
wcstombs(BUF, string, wcslen(string)+1);
|
||||
}
|
||||
cntbuf += swprintf(BUF,string);
|
||||
}*/
|
||||
cntbuf += swprintf(BUF,itemstr);
|
||||
}
|
||||
if (input->includeUpgradedVersions && !input->isElite)
|
||||
sprintf(BUF,"(or upgraded) ");
|
||||
cntbuf += swprintf(BUF,getTranslatedString(STR_OR_UPGRADED));
|
||||
|
||||
if (input->haveNoSocket)
|
||||
sprintf(BUF," with no socket");
|
||||
{
|
||||
cntbuf += swprintf(BUF,getTranslatedString(STR_WITHOUT_SOCKET));
|
||||
InNoSocket = true;//~~~~~
|
||||
}
|
||||
|
||||
if (input->haveSockets)
|
||||
sprintf(BUF," with sockets");
|
||||
swprintf(BUF,getTranslatedString(STR_WITH_SOCKET));
|
||||
}
|
||||
|
||||
DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize)
|
||||
DWORD print(CubeMainBIN* curForm, WCHAR* buf, DWORD)//maxsize)
|
||||
{
|
||||
if (!buf || !curForm || !curForm->enabled) return 0;
|
||||
|
||||
InNoSocket = false; //~~~~~
|
||||
BYTE realNbInputs=0;
|
||||
printInput(&curForm->input1, buf, &realNbInputs);
|
||||
printInput(&curForm->input2, buf, &realNbInputs);
|
||||
@@ -211,14 +280,15 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize)
|
||||
printInput(&curForm->input6, buf, &realNbInputs);
|
||||
printInput(&curForm->input7, buf, &realNbInputs);
|
||||
|
||||
int cntbuf = wcslen(buf);
|
||||
|
||||
if (realNbInputs != curForm->numinputs)
|
||||
{
|
||||
sprintf(BUF," *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs);
|
||||
cntbuf += swprintf(BUF,L" *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs);
|
||||
return 1;
|
||||
}
|
||||
|
||||
sprintf(BUF," => ");
|
||||
cntbuf += swprintf(BUF,L" => ");
|
||||
BYTE realNbOutputs=0;
|
||||
printOutput(&curForm->output1, buf, &realNbOutputs);
|
||||
printOutput(&curForm->output2, buf, &realNbOutputs);
|
||||
@@ -226,24 +296,24 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize)
|
||||
|
||||
|
||||
// if (curForm->ladder)
|
||||
// sprintf(BUF," [ladder only]");
|
||||
// cntbuf += swprintf(BUF," [ladder only]");
|
||||
|
||||
if (curForm->minDiff == 1)
|
||||
sprintf(BUF," [Nightmare and Hell only]");
|
||||
cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_N_H));
|
||||
else if (curForm->minDiff == 2)
|
||||
sprintf(BUF," [Hell only]");
|
||||
cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_HELL));
|
||||
|
||||
if (curForm->playerClass != 0xFF)
|
||||
{
|
||||
CharStatsBIN* charStats = D2GetCharStatsBIN(curForm->playerClass);
|
||||
sprintf(BUF, " [%s only]", charStats->name);
|
||||
cntbuf += swprintf(BUF, getTranslatedString(STR_ONLY_CLASS), charStats->name);
|
||||
}
|
||||
|
||||
if ((curForm->op>0) && (curForm->op!=28))
|
||||
sprintf(BUF, " [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value);
|
||||
cntbuf += swprintf(BUF, L" [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value);
|
||||
|
||||
// if (curForm->version == 100)
|
||||
// sprintf(BUF, " [expansion only]");
|
||||
// cntbuf += swprintf(BUF, " [expansion only]");
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -268,12 +338,24 @@ void listAllCubeFormula()
|
||||
int nbLines = D2GetNbCubeMainBIN();//SgptDataTables->nbCubemain
|
||||
log_msg("nbLines : %d\n",nbLines);
|
||||
|
||||
char buf[300];
|
||||
WCHAR buf[lenbuf];
|
||||
char bufa[lenbuf];
|
||||
|
||||
if (D2GetLang() != LNG_DEU)
|
||||
{
|
||||
bufa[0] = (char)0xEF;
|
||||
bufa[1] = (char)0xBB;
|
||||
bufa[2] = (char)0xBF;
|
||||
bufa[3] = (char)0x00;
|
||||
fprintf(file,"%s",bufa);
|
||||
}
|
||||
|
||||
for (int i=0; i<nbLines; i++)
|
||||
{
|
||||
buf[0]=NULL;
|
||||
DWORD res = print(D2GetCubeMainBIN(i), buf, 300);//SgptDataTables->cubemain + i;
|
||||
if (res) fprintf(file,"%4u: %s\n",i,buf);
|
||||
DWORD res = print(D2GetCubeMainBIN(i), buf, lenbuf);//SgptDataTables->cubemain + i;
|
||||
UCS2toUTF8(&bufa[0], lenbuf, &buf[0], lenbuf);
|
||||
if (res) fprintf(file,"%4u: %s\n",i,bufa);
|
||||
if (res) fflush(file);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Interface functions
|
||||
|
||||
@@ -69,6 +70,7 @@ void STDCALL printCustomPage()
|
||||
|
||||
DWORD STDCALL mouseCustomPageLeftDown(sWinMessage* msg)
|
||||
{
|
||||
|
||||
if(onRealm) return -1;
|
||||
if ( (selectedPage > 0) && (selectedPage<=lastPage) )
|
||||
return mouseNewStatsPageTwoLeftDown(msg);
|
||||
@@ -310,7 +312,7 @@ void Install_NewInterfaces()
|
||||
if ( version_D2Client >= V111 )
|
||||
{
|
||||
//Reset selectedPage variable on opening stats page
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E);
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE);
|
||||
memt_byte( 0x83, 0xE8 ); // CALL caller_resetSelectedPage
|
||||
MEMT_REF4( 0x1F7426F8, caller_resetSelectedPageByToolBar);
|
||||
//6FAFB79E > 83F8 26 CMP EAX,26
|
||||
@@ -321,8 +323,10 @@ void Install_NewInterfaces()
|
||||
//6FB05E11 . 74 1F JE SHORT D2Client.6FB05E32
|
||||
//6FB15F5E > 83F8 26 CMP EAX,26
|
||||
//6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82
|
||||
//6FB741FE > 83F8 26 CMP EAX,26
|
||||
//6FB74201 . 74 1F JE SHORT D2Client.6FB05E32
|
||||
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA);
|
||||
mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A);
|
||||
memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage
|
||||
MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey);
|
||||
//6FACE55A . 55 PUSH EBP
|
||||
@@ -337,7 +341,9 @@ void Install_NewInterfaces()
|
||||
//6FAEC5EA . 55 PUSH EBP
|
||||
//6FAEC5EB . 33ED XOR EBP,EBP
|
||||
//6FAEC5ED . 3BD5 CMP EDX,EBP
|
||||
|
||||
//6FAEE39A . 55 PUSH EBP
|
||||
//6FAEE39B . 33ED XOR EBP,EBP
|
||||
//6FAEE39D . 3BD5 CMP EDX,EBP
|
||||
|
||||
//For Toggle fct : (not used for open the stat page)
|
||||
// mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218);
|
||||
@@ -355,7 +361,7 @@ void Install_NewInterfaces()
|
||||
//6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP
|
||||
} else {
|
||||
//Reset selectedPage variable on opening stats page
|
||||
mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218);
|
||||
mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000, 0000);//((DWORD)D2TogglePage+0x218);
|
||||
memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage
|
||||
MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage);
|
||||
//6FB23478 |. 85C0 TEST EAX,EAX
|
||||
@@ -365,16 +371,17 @@ void Install_NewInterfaces()
|
||||
}
|
||||
|
||||
// Print custom page
|
||||
mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49);
|
||||
mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549);
|
||||
MEMC_REF4( D2PrintStatsPage, printCustomPage);
|
||||
//6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60
|
||||
//6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0
|
||||
//6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320
|
||||
//6FB402B8 |. E8 C3AFFDFF CALL D2Client.6FB1B280
|
||||
//6FB73B48 |. E8 5393FFFF CALL D2Client.6FB6CEA0
|
||||
//6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280
|
||||
|
||||
// Don't print Border
|
||||
mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6);
|
||||
mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6);
|
||||
memt_byte( 0xB9, 0xE8 ); // CALL caller_DontPrintBorder
|
||||
MEMT_REF4( 0x00000012, version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder);
|
||||
//6FAFF4C6 > B9 12000000 MOV ECX,12
|
||||
@@ -382,27 +389,30 @@ void Install_NewInterfaces()
|
||||
//6FB65A46 |. B9 12000000 MOV ECX,12
|
||||
//6FB32166 |. B9 12000000 MOV ECX,12
|
||||
//6FAD71C6 |. B9 12000000 MOV ECX,12
|
||||
//6FB1D2B6 |. B9 12000000 MOV ECX,12
|
||||
|
||||
// Manage mouse down (Play sound)
|
||||
mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36);
|
||||
mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6);
|
||||
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x00008088, version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9);
|
||||
memt_byte( 0x00, 0x90 ); // NOP
|
||||
//6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB391B6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
//6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||
|
||||
// Manage mouse up
|
||||
mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9);
|
||||
mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459);
|
||||
memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp
|
||||
MEMT_REF4( ptWindowStartX, version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9);
|
||||
//6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748]
|
||||
//6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24]
|
||||
//6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8]
|
||||
//6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28]
|
||||
//6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0]
|
||||
//6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28]
|
||||
//6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0]
|
||||
//6FB70459 . A1 54D3BC6F MOV EAX,DWORD PTR DS:[6FBCD354]
|
||||
|
||||
|
||||
// open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Adding custom data.
|
||||
Save and load infinity & shared Stash
|
||||
@@ -270,18 +271,19 @@ void Install_PlayerCustomData()
|
||||
log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n");
|
||||
|
||||
// Initialize custom data.
|
||||
mem_seek( version_D2Client == V113 ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 );
|
||||
mem_seek( version_D2Client == V113d ? offset_D2Common + 0x170DE : version_D2Client == V113c ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 );
|
||||
MEMJ_REF4( D2AllocMem, init_PlayerCustomData);
|
||||
//01BD0381 |. E8 C03F0000 CALL <JMP.&Fog.#10045>
|
||||
//6FD9ED5D |. E8 94A4FBFF CALL <JMP.&Fog.#10045>
|
||||
//6FDABFCD |. E8 34D2FAFF CALL <JMP.&Fog.#10045>
|
||||
//6FDA85ED |. E8 240CFBFF CALL <JMP.&Fog.#10045>
|
||||
//6FD809BD |. E8 6088FDFF CALL <JMP.&Fog.#10045>
|
||||
//6FD670DD |. E8 0C3EFFFF CALL <JMP.&Fog.#10045>
|
||||
|
||||
if ( version_D2Game >= V111 )
|
||||
{
|
||||
// update item
|
||||
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91);
|
||||
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81);
|
||||
memt_byte( 0x8B ,0xE8); // CALL
|
||||
MEMT_REF4( 0x52182454, caller_updateItem_111);
|
||||
//0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
@@ -292,8 +294,10 @@ void Install_PlayerCustomData()
|
||||
//6FC7F2A5 |. 52 |PUSH EDX ; /Arg1
|
||||
//6FCBBB91 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
//6FCBBB95 |. 52 |PUSH EDX
|
||||
//6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
//6FC95C85 |. 52 |PUSH EDX
|
||||
|
||||
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1);
|
||||
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1);
|
||||
memt_byte( 0x8B ,0xE8); // CALL
|
||||
MEMT_REF4( 0x52182454, caller_updateItemB_111);
|
||||
//0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
@@ -304,19 +308,21 @@ void Install_PlayerCustomData()
|
||||
//6FC7F305 |. 52 ||PUSH EDX ; /Arg1
|
||||
//6FCBBBF1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
//6FCBBBF5 |. 52 ||PUSH EDX
|
||||
//6FC95CE1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
|
||||
//6FC95CE5 |. 52 ||PUSH EDX
|
||||
|
||||
} else {
|
||||
// update item
|
||||
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000);
|
||||
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000);
|
||||
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
|
||||
//6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00
|
||||
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000);
|
||||
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000);
|
||||
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
|
||||
//6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00
|
||||
}
|
||||
|
||||
// Update client on loading
|
||||
mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12);//6FC325D4-6FC30000
|
||||
mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548);//6FC325D4-6FC30000
|
||||
memt_byte( 0x5F ,0xE8); // CALL
|
||||
MEMT_REF4( 0xC0335D5E , caller_updateClientPlayerOnLoading);
|
||||
//6FC325D4 |> 5F POP EDI
|
||||
@@ -339,57 +345,65 @@ void Install_PlayerCustomData()
|
||||
//6FC6BF13 |. 5E POP ESI
|
||||
//6FC6BF14 |. 5D POP EBP
|
||||
//6FC6BF15 |. 33C0 XOR EAX,EAX
|
||||
//6FD07548 |> 5F POP EDI
|
||||
//6FD07549 |. 5E POP ESI
|
||||
//6FD0754A |. 5D POP EBP
|
||||
//6FD0754B |. 33C0 XOR EAX,EAX
|
||||
|
||||
// Free custom data.
|
||||
mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D);
|
||||
mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D);
|
||||
MEMJ_REF4( D2FreeMem, free_PlayerCustomData);
|
||||
//01BD0482 |. E8 C53E0000 CALL <JMP.&Fog.#10046>
|
||||
//6FD9F82C |. E8 E399FBFF CALL <JMP.&Fog.#10046>
|
||||
//6FDAC9CC |. E8 3BC8FAFF CALL <JMP.&Fog.#10046>
|
||||
//6FDA856C |. E8 E70CFBFF CALL <JMP.&Fog.#10046>
|
||||
//6FD8093C |. E8 E788FDFF CALL <JMP.&Fog.#10046>
|
||||
//6FD6705C |. E8 CF3EFFFF CALL <JMP.&Fog.#10046>
|
||||
|
||||
// Free item in Stash (Server-side)
|
||||
mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162);
|
||||
mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2);
|
||||
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204
|
||||
//6FCBD5A3 . E8 04E20500 CALL <JMP.&D2Common.#10304>
|
||||
//02019111 |. E8 5016F7FF |CALL <JMP.&D2Common.#10934>
|
||||
//0202FDB1 |. E8 30AAF4FF |CALL <JMP.&D2Common.#11140>
|
||||
//6FCB4241 |. E8 8862F7FF |CALL <JMP.&D2Common.#10770>
|
||||
//6FD01161 |. E8 6693F2FF |CALL <JMP.&D2Common.#10464>
|
||||
//6FC8F7C1 |. E8 44AEF9FF |CALL <JMP.&D2Common.#10879>
|
||||
|
||||
// Free item in Stash (Client-side)
|
||||
mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94);//6FB29B31-6FAA0000
|
||||
mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4);//6FB29B31-6FAA0000
|
||||
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34
|
||||
//6FB29B31 E8 340F0400 CALL <JMP.&D2Common.#10304>
|
||||
//6FAD6403 |. E8 925DFEFF |CALL <JMP.&D2Common.#10934>
|
||||
//6FAFC263 |. E8 38FFFBFF |CALL <JMP.&D2Common.#11140>
|
||||
//6FACF2D3 |. E8 4CD1FEFF |CALL <JMP.&D2Common.#10770>
|
||||
//6FB55C93 |. E8 D068F6FF |CALL <JMP.&D2Common.#10464>
|
||||
//6FB121E3 |. E8 7AA1FAFF |CALL <JMP.&D2Common.#10879>
|
||||
|
||||
if ( version_D2Common >= V110 )
|
||||
{
|
||||
// Test if it's already removed from inventory
|
||||
mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23);
|
||||
mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23, 3B393);
|
||||
memt_byte( 0x0D , 0x07);
|
||||
//01D2E688 75 0D JNZ SHORT D2Common.01D2E697
|
||||
//6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41
|
||||
//6FD92132 |. 74 0D JE SHORT D2Common.6FD92141
|
||||
//6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1
|
||||
//6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31
|
||||
//6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1
|
||||
} else {
|
||||
mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x74 , 0x90);//MOV EAX,EDI
|
||||
memt_byte( 0x35 , 0x90);//NOP
|
||||
//6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD
|
||||
|
||||
mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x0F , 0x90);//MOV EAX,EDI
|
||||
memt_byte( 0x84 , 0x90);//NOP
|
||||
memt_dword( 0x000000BF , 0x90909090);//NOP
|
||||
//6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F
|
||||
|
||||
mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x74 , 0x90);//MOV EAX,EDI
|
||||
memt_byte( 0x6F , 0x90);//NOP
|
||||
//6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD
|
||||
|
BIN
PlugY/PlugY.aps
BIN
PlugY/PlugY.aps
Binary file not shown.
@@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 10,0,0,0
|
||||
PRODUCTVERSION 10,0,0,0
|
||||
FILEVERSION 11,0,0,0
|
||||
PRODUCTVERSION 11,0,0,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -81,11 +81,12 @@ BEGIN
|
||||
BEGIN
|
||||
BLOCK "040004b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Modified by L'Autour"
|
||||
VALUE "CompanyName", "Yohann Nicolas"
|
||||
VALUE "FileVersion", "10.00"
|
||||
VALUE "FileVersion", "11.00"
|
||||
VALUE "OriginalFilename", "PlugY.dll"
|
||||
VALUE "ProductName", "PlugY, The Survival Kit"
|
||||
VALUE "ProductVersion", "10.00"
|
||||
VALUE "ProductVersion", "11.00"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
BIN
PlugY/PlugY.suo
BIN
PlugY/PlugY.suo
Binary file not shown.
@@ -152,6 +152,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="opends60.lib"
|
||||
OutputFile="$(OutDir)\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="false"
|
||||
SubSystem="2"
|
||||
@@ -182,7 +183,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine="copy $(TargetPath) "..\PlugYInstaller\PlugY.dll"
copy $(TargetPath) "D:\Jeux\Blizzard\Diablo II\PlugY.dll"
copy $(TargetPath) "D:\www\PlugY.dll"
"
|
||||
CommandLine="copy $(TargetPath) "..\PlugYInstaller\PlugY.dll"
copy $(TargetPath) "D:\Games\Diablo II\PlugY.dll"

"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
@@ -361,6 +362,14 @@
|
||||
RelativePath="WorldEvent.cpp"
|
||||
>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Coomons"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\Commons\VersionInfo.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
@@ -438,6 +447,10 @@
|
||||
RelativePath="loadPlayerData.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\LocaleStrings.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="mainScreen.h"
|
||||
>
|
||||
@@ -561,6 +574,10 @@
|
||||
RelativePath="..\Commons\updatingConst.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Commons\VersionInfo.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Adding custom data.
|
||||
Save and load infinity & shared Stash
|
||||
@@ -88,7 +89,7 @@ void Install_PlugYFiles()
|
||||
log_msg("Patch Storm to found custom file. (PlugYFiles)\n");
|
||||
|
||||
// Try in Diablo II\PlugY\ if file not found
|
||||
mem_seek R7(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) );
|
||||
mem_seek R7(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) );
|
||||
memt_byte( 0xFF ,0x90); // NOP
|
||||
memt_byte( 0x15 ,0xE8); // CALL
|
||||
MEMD_REF4( LeaveCriticalSection, version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile);
|
||||
@@ -97,6 +98,7 @@ void Install_PlugYFiles()
|
||||
//6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||
//6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||
//6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||
//6FC1DA79 |. FF15 3C32C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||
|
||||
|
||||
log_msg("\n" );
|
||||
@@ -170,7 +172,7 @@ void Install_PlugYImagesFiles()
|
||||
log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n");
|
||||
|
||||
// Load custom images
|
||||
mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE);
|
||||
mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE);
|
||||
memt_byte( 0xB9 ,0xE8);
|
||||
MEMT_REF4( 0x0000000C , caller_loadCustomImages);
|
||||
//6FAFE4B1 |. B9 0C000000 MOV ECX,0C
|
||||
@@ -178,9 +180,10 @@ void Install_PlugYImagesFiles()
|
||||
//6FB667E1 |. B9 0C000000 MOV ECX,0C
|
||||
//6FB32761 |. B9 0C000000 MOV ECX,0C
|
||||
//6FAD7EAE |. B9 0C000000 MOV ECX,0C
|
||||
//6FB1E0BE |. B9 0C000000 MOV ECX,0C
|
||||
|
||||
// Free custom images
|
||||
mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D);
|
||||
mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D);
|
||||
memt_byte( 0xB9 ,0xE8);
|
||||
MEMT_REF4( 0x0000000C , caller_freeCustomImages);
|
||||
//6FAFE639 |> B9 0C000000 MOV ECX,0C
|
||||
@@ -188,6 +191,7 @@ void Install_PlugYImagesFiles()
|
||||
//6FB6580D |> B9 0C000000 MOV ECX,0C
|
||||
//6FB3158D |> B9 0C000000 MOV ECX,0C
|
||||
//6FAD6F8D |> B9 0C000000 MOV ECX,0C
|
||||
//6FB1D07D |> B9 0C000000 MOV ECX,0C
|
||||
|
||||
log_msg("\n" );
|
||||
|
||||
@@ -243,7 +247,7 @@ void Install_PlugYTxtFiles()
|
||||
// lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000);
|
||||
|
||||
// Load custom txt files
|
||||
mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4);
|
||||
mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4);
|
||||
MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles );
|
||||
//6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500
|
||||
//6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510
|
||||
@@ -252,9 +256,10 @@ void Install_PlugYTxtFiles()
|
||||
//6FD87443 |. E8 58B6FFFF CALL D2Common.6FD82AA0 ; \D2Common.6FD82AA0
|
||||
//6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0
|
||||
//6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870
|
||||
//6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40
|
||||
|
||||
// Free custom txt files
|
||||
mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3);
|
||||
mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3);
|
||||
MEMJ_REF4( D2Fog10212, caller_freeTxtFiles );
|
||||
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
|
||||
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
|
||||
@@ -263,6 +268,7 @@ void Install_PlugYTxtFiles()
|
||||
//6FD65AB2 |. E8 B537FFFF CALL <JMP.&Fog.#10212>
|
||||
//6FD94E12 |. E8 1744FCFF CALL <JMP.&Fog.#10212>
|
||||
//6FDAE8B2 |. E8 8FA9FAFF CALL <JMP.&Fog.#10212>
|
||||
//6FD5FAA2 |. E8 5FB4FFFF CALL <JMP.&Fog.#10212>
|
||||
|
||||
log_msg("\n" );
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Changing the current save path.
|
||||
|
||||
@@ -123,7 +124,7 @@ void Install_ChangingSavePath()
|
||||
if (version_Fog >= V111)
|
||||
{
|
||||
// Appel de notre fct d'ajout d'un sous-r<>pertoire
|
||||
mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86);
|
||||
mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146);
|
||||
memt_byte( 0x83 ,0xE8); // CALL changeSavePath
|
||||
MEMT_REF4( 0x0575FFF8, changeSavePath_111);
|
||||
//6FF685F6 . 83F8 FF CMP EAX,-1
|
||||
@@ -134,18 +135,21 @@ void Install_ChangingSavePath()
|
||||
//6FF6F089 . 75 05 JNZ SHORT Fog.6FF6F090
|
||||
//6FF67F86 . 83F8 FF CMP EAX,-1
|
||||
//6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90
|
||||
//6FF6E146 . 83F8 FF CMP EAX,-1
|
||||
//6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64
|
||||
|
||||
// Pour cr<63>er le bon chemin de sauvegarde
|
||||
mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6);
|
||||
mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166);
|
||||
MEMJ_REF4( D2Storm503, forCreateSavePath);
|
||||
//6FF68615 . E8 A246FFFF CALL <JMP.&Storm.#503>
|
||||
//6FF6C125 . E8 C20BFFFF CALL <JMP.&Storm.#503>
|
||||
//6FF6F0A5 . E8 34DDFEFF CALL <JMP.&Storm.#503>
|
||||
//6FF67FA5 . E8 504EFFFF CALL <JMP.&Storm.#503>
|
||||
//6FF6E165 . E8 6AEBFEFF CALL <JMP.&Storm.#503>
|
||||
|
||||
|
||||
// Remove registry update
|
||||
mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA);
|
||||
mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A);
|
||||
memt_byte( 0x56 ,0xEB); // JMP SHORT fog.6FF6862C
|
||||
memt_byte( 0x6A ,0x10); //
|
||||
memt_byte( 0x00 ,0x90); // NOP
|
||||
@@ -166,6 +170,8 @@ void Install_ChangingSavePath()
|
||||
//6FF6F0B7 . E8 58DDFEFF CALL <JMP.&Storm.#425>
|
||||
//6FF67FAA . 56 PUSH ESI
|
||||
//6FF67FAB . 6A 00 PUSH 0
|
||||
//6FF6E16A . 56 PUSH ESI
|
||||
//6FF6E16B . 6A 00 PUSH 0
|
||||
|
||||
} else {
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Save Player Custom Data.
|
||||
|
||||
@@ -521,16 +522,17 @@ void Install_SavePlayerData()
|
||||
log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n");
|
||||
|
||||
//Save single player custom data.
|
||||
mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35);
|
||||
mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835);
|
||||
MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9);
|
||||
//6FC8A623 E8 3E210900 CALL <JMP.&Fog.#10115>
|
||||
//02039364 |. E8 3B0FF5FF CALL <JMP.&Fog.#10115>
|
||||
//01F95474 |. E8 C34EFEFF CALL <JMP.&Fog.#10115>
|
||||
//6FC64164 |. E8 EB61FCFF CALL <JMP.&Fog.#10115>
|
||||
//6FC73F34 |. E8 DD63FBFF CALL <JMP.&Fog.#10115>
|
||||
//6FC59834 |. E8 FB0AFDFF CALL <JMP.&Fog.#10115>
|
||||
|
||||
//Send SaveFiles
|
||||
mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB);
|
||||
mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB);
|
||||
memt_byte( 0x8B ,0x90); // NOP
|
||||
memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL
|
||||
MEMT_REF4( version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9);
|
||||
@@ -544,8 +546,10 @@ void Install_SavePlayerData()
|
||||
//6FC640DF |. 85C0 TEST EAX,EAX
|
||||
//6FC73EAB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||
//6FC73EAF |. 85C0 TEST EAX,EAX
|
||||
//6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||
//6FC597AF |. 85C0 TEST EAX,EAX
|
||||
|
||||
mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173);
|
||||
mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3);
|
||||
memt_byte( 0x8B ,0x90); // NOP
|
||||
memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL
|
||||
MEMT_REF4( version_D2Game >= V110 ? 0x0000017C : version_D2Game == V109d ? 0x0000174 : 0x00000150, version_D2Game >= V110 ? caller_ManageNextPacketToSend : version_D2Game == V109d ? caller_ManageNextPacketToSend_9d : caller_ManageNextPacketToSend_9);
|
||||
@@ -554,6 +558,7 @@ void Install_SavePlayerData()
|
||||
//02056D83 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||
//6FCC89D3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||
//6FC4D173 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||
//6FCDEDD3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||
|
||||
// mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC
|
||||
// memt_byte( 0x8B ,0xE8); // CALL
|
||||
@@ -565,16 +570,17 @@ void Install_SavePlayerData()
|
||||
if ( version_D2Game >= V111 )
|
||||
{
|
||||
//Received SaveFiles
|
||||
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946);
|
||||
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6);
|
||||
memt_byte( 0x0F ,0xE8);
|
||||
MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111);
|
||||
//6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||
//6FAE2076 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||
//6FB2BCD6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||
//6FAF3946 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||
//6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||
|
||||
// Save multiplayer player custom data.
|
||||
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572);
|
||||
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2);
|
||||
memt_byte( 0x81 ,0xE8); // CALL
|
||||
MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111);
|
||||
memt_byte( 0xAA ,0x90); // CALL
|
||||
@@ -582,16 +588,17 @@ void Install_SavePlayerData()
|
||||
//6FB6D7F2 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||
//6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||
//6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||
//6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||
} else {
|
||||
//Received SaveFiles
|
||||
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000);
|
||||
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000);
|
||||
memt_byte( 0x81 ,0x90); // NOP
|
||||
memt_byte( 0xEC ,0xE8); // CALL
|
||||
MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave);
|
||||
//6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4
|
||||
|
||||
// Save multiplayer player custom data.
|
||||
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000);
|
||||
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000);
|
||||
memt_byte( 0x8B ,0xE8); // CALL
|
||||
MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData);
|
||||
//6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX]
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Change Skill win per level up.
|
||||
|
||||
@@ -36,14 +37,14 @@ void Install_SkillPerLevelUp()
|
||||
|
||||
log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n");
|
||||
|
||||
mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5);
|
||||
mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5);
|
||||
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
|
||||
//6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518>
|
||||
//02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109>
|
||||
//01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627>
|
||||
//6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762>
|
||||
//6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551>
|
||||
|
||||
//6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Change Stat win per level up.
|
||||
|
||||
@@ -34,13 +35,14 @@ void Install_StatPerLevelUp()
|
||||
|
||||
log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n");
|
||||
|
||||
mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA);
|
||||
mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A);
|
||||
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
|
||||
//6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518>
|
||||
//02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109>
|
||||
//01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627>
|
||||
//6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762>
|
||||
//6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551>
|
||||
//6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645>
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Unassign Stats Point for futher re-assignment.
|
||||
|
||||
@@ -331,39 +332,42 @@ void Install_StatsPoints()
|
||||
//if ( version_D2Client < V113 )
|
||||
{
|
||||
// Always print stat button images.
|
||||
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5);
|
||||
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955);
|
||||
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
|
||||
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) );
|
||||
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) );
|
||||
memt_byte( 0x24, 0x90 ); // NOP
|
||||
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
|
||||
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
//6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
|
||||
|
||||
//print our buttons
|
||||
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E);
|
||||
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE);
|
||||
MEMJ_REF4( D2PrintImage, caller_printUnassignStatsBtn);
|
||||
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
|
||||
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
|
||||
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
|
||||
//6FB6D23D . E8 54FEF4FF CALL <JMP.&D2gfx.#10041>
|
||||
//6FB6F9DD . E8 ECD5F4FF CALL <JMP.&D2gfx.#10042>
|
||||
|
||||
// Always manage push down.
|
||||
mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9);
|
||||
mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579);
|
||||
memt_byte( 0x74, 0x90 ); // NOP
|
||||
memt_byte( 0x4E, 0x90 ); // NOP
|
||||
//6FAD134D 74 4E JE SHORT D2Client.6FAD139D
|
||||
//6FAD134D 74 4E JE SHORT D2Client.6FAD139D
|
||||
//6FB327D9 . 74 4E JE SHORT D2Client.6FB32829
|
||||
//6FB39259 . 74 4E JE SHORT D2Client.6FB392A9
|
||||
//6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209
|
||||
//6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209
|
||||
//6FB6CDD9 . 74 4E JE SHORT D2Client.6FB6CE29
|
||||
//6FB6F579 . 74 4E JE SHORT D2Client.6FB6F5C9
|
||||
|
||||
if ( version_D2Client >= V111 )
|
||||
{
|
||||
// On Push down.
|
||||
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44);
|
||||
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4);
|
||||
memt_byte( 0x6B, 0xE8 );
|
||||
MEMT_REF4( 0x01BF0ED2, caller_pushDown_111);
|
||||
memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E
|
||||
@@ -377,10 +381,12 @@ void Install_StatsPoints()
|
||||
//6FB1B227 BF 01000000 MOV EDI,1
|
||||
//6FB6CE44 > 6BD2 0E IMUL EDX,EDX,0E
|
||||
//6FB6CE47 . BF 01000000 MOV EDI,1
|
||||
//6FB6F5E4 > 6BD2 0E IMUL EDX,EDX,0E
|
||||
//6FB6F5E7 . BF 01000000 MOV EDI,1
|
||||
|
||||
} else {
|
||||
// On Push down.
|
||||
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000);
|
||||
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000, 0000);
|
||||
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x0000D504, caller_pushDown);
|
||||
memt_byte( 0x00, 0x90 ); // NOP
|
||||
@@ -392,17 +398,18 @@ void Install_StatsPoints()
|
||||
if ( version_D2Client >= V110 )
|
||||
{
|
||||
// Always manage push up.
|
||||
mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49);
|
||||
mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9);
|
||||
memt_byte( 0x74, 0x90 ); // NOP
|
||||
memt_byte( version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP
|
||||
//6FAD152E 74 68 JE SHORT D2Client.6FAD1598
|
||||
//6FB33869 . 74 65 JE SHORT D2Client.6FB338D0
|
||||
//6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350
|
||||
//6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0
|
||||
//6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0
|
||||
//6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0
|
||||
//6FB705E9 . 74 65 JE SHORT D2Client.6FB70650
|
||||
|
||||
// Unassign stats point when ctrl is push.
|
||||
mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB);
|
||||
mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B);
|
||||
memt_byte( 0x66, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x077CC085, caller_UnassignStats);
|
||||
//6FAD15D3 . 66:85C0 TEST AX,AX
|
||||
@@ -415,23 +422,25 @@ void Install_StatsPoints()
|
||||
//6FB1C2FE . 7C 07 JL SHORT D2Client.6FB1C307
|
||||
//6FB6DEFB . 66:85C0 TEST AX,AX
|
||||
//6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07
|
||||
//6FB7069B . 66:85C0 TEST AX,AX
|
||||
//6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7
|
||||
} else {
|
||||
// Always manage push up.
|
||||
mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0x0F, 0x90 ); // NOP
|
||||
memt_byte( 0x84, 0x90 ); // NOP
|
||||
memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP
|
||||
//6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9
|
||||
|
||||
// Unassign stats point when ctrl is push.
|
||||
mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000);
|
||||
mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000, 0000);
|
||||
memt_byte( 0xB8, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x00000001, caller_UnassignStats_9);
|
||||
//6FACACC9 . B8 01000000 MOV EAX,1
|
||||
}
|
||||
|
||||
// Set the id for the calling function.
|
||||
mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E);
|
||||
mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE);
|
||||
if ( version_D2Client >= V111 ) {
|
||||
memt_byte( 0x66, 0xE8 ); // CALL
|
||||
MEMT_REF4( 0x15244C89, caller_setValue_111);
|
||||
@@ -439,6 +448,7 @@ void Install_StatsPoints()
|
||||
//6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX
|
||||
//6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
|
||||
//6FB6DF3E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
|
||||
//6FB706DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
|
||||
} else {
|
||||
MEMC_REF4( D2SendToServer3, caller_setValue);
|
||||
//6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990
|
||||
@@ -475,7 +485,7 @@ void Install_StatsLimitShiftClick()
|
||||
log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n");
|
||||
|
||||
// Limit the assigment of stat points.
|
||||
mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5);
|
||||
mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5, C0695);
|
||||
memt_byte( 0xFF, 0x90 ); // NOP
|
||||
memt_byte( 0x15, 0xE8 ); // CALL
|
||||
MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift);
|
||||
@@ -484,6 +494,7 @@ void Install_StatsLimitShiftClick()
|
||||
//6FB3A395 . FF15 08F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>]
|
||||
//6FB1C2F5 . FF15 10F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
|
||||
//6FB6DEF5 . FF15 04F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
|
||||
//6FB70695 . FF15 2001B86F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Uber Quest Management.
|
||||
|
||||
@@ -327,42 +328,45 @@ void Install_UberQuest()
|
||||
DWORD oldProtection;
|
||||
|
||||
// open Red Portal
|
||||
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0);
|
||||
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4);
|
||||
MEMT_DWORD( D2OpenPandPortal , openPandPortal);
|
||||
MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal);
|
||||
//0201E357 |. FFD0 |CALL EAX
|
||||
//01FA77E7 |. FFD0 |CALL EAX
|
||||
//6FCF3CC7 |. FFD0 |CALL EAX
|
||||
//6FC92437 |. FFD0 |CALL EAX
|
||||
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, oldProtection, &oldProtection);
|
||||
//6FCB7127 |. FFD0 |CALL EAX
|
||||
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, oldProtection, &oldProtection);
|
||||
|
||||
|
||||
// manage uberIA (fct table at 0209E7E8)
|
||||
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0);
|
||||
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618);
|
||||
MEMT_DWORD( D2UberBaalIA , uberBaalIA);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628);
|
||||
MEMT_DWORD( D2UberMephIA , uberMephIA);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638);
|
||||
MEMT_DWORD( D2UberDiabloIA , uberDiabloIA);
|
||||
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, oldProtection, &oldProtection);
|
||||
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, oldProtection, &oldProtection);
|
||||
//0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8
|
||||
//01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0
|
||||
//6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58
|
||||
//6FCBD157 |> B8 88E7D26F MOV EAX,D2Game.6FD2E788
|
||||
//6FC5C617 |> B8 00EDD26F MOV EAX,D2Game.6FD2ED00
|
||||
|
||||
// spawn Uber
|
||||
// mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000);
|
||||
// MEMJ_REF4( D2WarpPlayer , spawnUber);
|
||||
//02028DAC |. E8 491CF7FF CALL <JMP.&D2Common.#10872>
|
||||
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB);
|
||||
mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB);
|
||||
MEMC_REF4( D2Game235C0 , spawnUber);
|
||||
//020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10
|
||||
//02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0
|
||||
//6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410
|
||||
//6FC4CCAA |. E8 3134FFFF ||CALL D2Game.6FC400E0
|
||||
//6FCDE9AA |. E8 D1AFF9FF ||CALL D2Game.6FC79980
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Updating client.
|
||||
|
||||
@@ -74,13 +75,14 @@ void Install_UpdateClient()
|
||||
log_msg("Patch D2Client for received Item packet. (UpdateClient)\n");
|
||||
|
||||
// execute if it's our packet else continue
|
||||
mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896);
|
||||
mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96);
|
||||
MEMT_REF4( version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
|
||||
//6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690
|
||||
//6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789
|
||||
//6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59
|
||||
//6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9
|
||||
//6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969
|
||||
//6FB34D94 |. 0F87 CF000000 JA D2Client.6FB34E69
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
Updating server.
|
||||
|
||||
@@ -100,7 +101,7 @@ void Install_UpdateServer()
|
||||
log_msg("Patch D2Game for received button click message. (UpdateServer)\n");
|
||||
|
||||
// manage button click message from Client.
|
||||
mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983);
|
||||
mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983, 676C3);
|
||||
if (version_D2Game >= V111) {
|
||||
memt_byte( 0xC1, 0x57 ); // PUSH EDI
|
||||
memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
World Event Management.
|
||||
|
||||
@@ -231,40 +232,44 @@ void Install_WorldEvent()
|
||||
log_msg("Patch D2Game for active World Event. (WorldEvent)\n");
|
||||
|
||||
// spawn DClone
|
||||
mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280);
|
||||
mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0);
|
||||
MEMC_REF4( V2SpawnMonster , version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone);
|
||||
//6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220
|
||||
//01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0
|
||||
//0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0
|
||||
//6FC6156F |. E8 1CF6FFFF CALL D2Game.6FC60B90 ; \D2Game.6FC60B90
|
||||
//6FC4527F |. E8 CCF6FFFF CALL D2Game.6FC44950 ; \D2Game.6FC44950
|
||||
//6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20
|
||||
|
||||
// verify if the item sold is a trigger of WE
|
||||
mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29);
|
||||
mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9);
|
||||
MEMJ_REF4( D2TestFlags , verifIfWEItem);
|
||||
//6FCC77CF |. E8 32400500 CALL <JMP.&D2Common.#10707>
|
||||
//0200E798 |. E8 E9BDF7FF CALL <JMP.&D2Common.#10911>
|
||||
//02002858 |. E8 E57DF7FF CALL <JMP.&D2Common.#10303>
|
||||
//6FCA4498 |. E8 3B62F8FF CALL <JMP.&D2Common.#10989>
|
||||
//6FCDFB28 |. E8 77ADF4FF CALL <JMP.&D2Common.#10202>
|
||||
//6FC92BE8 |. E8 DD7AF9FF CALL <JMP.&D2Common.#10458>
|
||||
|
||||
// management of the WorldEvent
|
||||
mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791);
|
||||
mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51);
|
||||
MEMC_REF4( V2GetGameByClientID , version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX);
|
||||
//6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0
|
||||
//01FD1F00 |. E8 1BE60800 CALL D2Game.02060520
|
||||
//02035680 |. E8 1BF30100 CALL D2Game.020549A0
|
||||
//6FD0BF40 |. E8 1BA4FBFF CALL D2Game.6FCC6360
|
||||
//6FC6A790 |. E8 4B03FEFF CALL D2Game.6FC4AAE0
|
||||
//6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700
|
||||
|
||||
// add client for the WorldEvent
|
||||
mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF);
|
||||
mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F);
|
||||
MEMC_REF4( D2AddClient , version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE);
|
||||
//6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60
|
||||
//01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0
|
||||
//01FE0559 |. E8 B27C0700 CALL D2Game.02058210
|
||||
//6FC8265E |. E8 FD890800 CALL D2Game.6FD0B060
|
||||
//6FCEB0BE |. E8 6DE8F7FF CALL D2Game.6FC69930
|
||||
//6FCF556E |. E8 FDFA0000 CALL D2Game.6FD05070
|
||||
|
||||
log_msg("\n");
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*==============================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
this file implements some common and useful
|
||||
function related to some Diablo II mechanisms.
|
||||
@@ -54,8 +55,8 @@ extern s_shifting shifting;
|
||||
#define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData
|
||||
#define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills
|
||||
|
||||
#define R7(Z,A,B,C,D,E,F,G) (offset_##Z + (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))))
|
||||
#define V7(Z,A,B,C,D,E,F,G) (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))
|
||||
#define R7(Z,A,B,C,D,E,F,G,H) (offset_##Z + (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))))
|
||||
#define V7(Z,A,B,C,D,E,F,G,H) (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))))
|
||||
|
||||
|
||||
// Convert 4 char code in a DWORD code
|
||||
@@ -74,7 +75,9 @@ enum eFileVersion
|
||||
V111,
|
||||
V111b,
|
||||
V112,
|
||||
V113
|
||||
V113c,
|
||||
V113d,
|
||||
V114a
|
||||
};
|
||||
|
||||
extern int version_SmackW32;
|
||||
@@ -118,7 +121,19 @@ extern DWORD offset_Storm;
|
||||
extern const char* S_CloneBattles;
|
||||
extern const char* S_DarkAlliance;
|
||||
|
||||
int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc);
|
||||
int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc);
|
||||
|
||||
|
||||
bool initLocaleStrings();
|
||||
void freeLocaleStrings();
|
||||
|
||||
const LPWSTR getTypeString (DWORD code, char** IdxStr);
|
||||
LPWSTR getTranslatedString(int stringID);
|
||||
int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID);
|
||||
LPWSTR cutStringGender(LPWSTR str);
|
||||
LPWSTR setMonoString(LPWSTR str);
|
||||
|
||||
enum eStringList
|
||||
{
|
||||
STR_STATS_UNASSIGN_WITH_LIMIT=0,
|
||||
@@ -138,12 +153,47 @@ enum eStringList
|
||||
STR_TAKE_GOLD,
|
||||
STR_SHARED_GOLD_QUANTITY,
|
||||
STR_PREVIOUS_PAGE,
|
||||
STR_NEXT_PAGE
|
||||
STR_NEXT_PAGE,
|
||||
STR_ITEM_LEVEL,
|
||||
STR_COW_PORTAL,
|
||||
STR_PANDEMONIUM_PORTAL,
|
||||
STR_PANDEMONIUM_FINAL_PORTAL,
|
||||
STR_FULL,
|
||||
STR_REPAIR,
|
||||
STR_AND,
|
||||
STR_RECHARGE,
|
||||
STR_DESTROY_FILLERS,
|
||||
STR_REMOVE_FILLERS,
|
||||
STR_REGENERATE,
|
||||
STR_WITH_N_SOCKETS,
|
||||
STR_ETHERAL,
|
||||
STR_NOT_ETHERAL,
|
||||
STR_NOT_RUNEWORD,
|
||||
STR_BASIC,
|
||||
STR_EXCEPTIONAL,
|
||||
STR_ELITE,
|
||||
STR_CRACKED,
|
||||
STR_NORMAL,
|
||||
STR_SUPERIOR,
|
||||
STR_MAGIC,
|
||||
STR_SET,
|
||||
STR_RARE,
|
||||
STR_UNIQUE,
|
||||
STR_CRAFTED,
|
||||
STR_TEMPERED,
|
||||
STR_ITEM,
|
||||
STR_ITEM_SAME_TYPE,
|
||||
STR_OR_UPGRADED,
|
||||
STR_WITHOUT_SOCKET,
|
||||
STR_WITH_SOCKET,
|
||||
STR_ONLY_N_H,
|
||||
STR_ONLY_HELL,
|
||||
STR_ONLY_CLASS
|
||||
};
|
||||
|
||||
bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h);
|
||||
void freeMessage(sWinMessage* msg);
|
||||
LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size);
|
||||
char* getTypeAString (WORD id, char* lpText, DWORD size);
|
||||
//char* getTypeAString (WORD id, char* lpText, DWORD size);
|
||||
|
||||
/*================================= END OF FILE =================================*/
|
@@ -1,5 +1,6 @@
|
||||
/*================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Add support 1.13d by L'Autour.
|
||||
|
||||
This file implements some common and useful
|
||||
function related to some Diablo II mechanisms.
|
||||
@@ -15,9 +16,9 @@
|
||||
#define E2S(F, A, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N;
|
||||
#define E2F(F, A, R, N, P) typedef R (FASTCALL *T##N) P; extern T##N N;
|
||||
#define E2C(F, A, T, N) extern T* pt##N;
|
||||
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||
#define C7(Z, A,B,C,D,E,F,G, T, N) extern T* pt##N;
|
||||
#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||
#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||
#define C7(Z, A,B,C,D,E,F,G,H, T, N) extern T* pt##N;
|
||||
|
||||
#include "../Commons/D2Funcs.h"
|
||||
extern DataTables* SgptDataTables;
|
||||
|
@@ -1,5 +1,6 @@
|
||||
/*=================================================================
|
||||
File created by Yohann NICOLAS.
|
||||
Modified by 1.13d by L'Autour.
|
||||
|
||||
Loading parameters from ini file.
|
||||
|
||||
@@ -7,7 +8,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define PLUGY_VERSION "10.00"
|
||||
#define PLUGY_VERSION "11.00"
|
||||
|
||||
#define LOG_FILE "PlugY.log"
|
||||
|
||||
|
Reference in New Issue
Block a user