35 Commits
11.01 ... 12.00

Author SHA1 Message Date
ChaosMarc
e0472480c4 Fixed PlugYInstaller Project 2020-11-01 12:52:36 +01:00
ChaosMarc
1657f9ca6c fix french installer translation 2020-10-31 19:50:36 +01:00
ChaosMarc
f6848c515c fix russian installer translation 2020-10-31 19:03:27 +01:00
ChaosMarc
779ec95c3d Added german installer translation 2020-10-31 18:59:35 +01:00
ChaosMarc
d0a28e23d1 Encoding + typo fixes 2020-10-31 18:15:25 +01:00
ChaosMarc
2ae254ab43 Fix #23 ActiveSkillsUnassignmentOneForOne -> ActiveSkillsUnassignmentOneByOne 2020-10-31 16:03:28 +01:00
ChaosMarc
17b5d682c8 Update README.md 2020-10-25 16:32:42 +01:00
ChaosMarc
f35d9790d7 Version Bump + Readme Update 2020-10-25 15:05:32 +01:00
ChaosMarc
10df6a86b7 Merge Fix 2020-10-25 14:13:59 +01:00
ChaosMarc
6246f98247 Update to Visual Studio 2019 2020-10-25 14:10:47 +01:00
ChaosMarc
93aaeb0b61 Merged haxifix/PlugY + Code Formatting 2020-10-25 14:10:17 +01:00
ChaosMarc
9c3a7a01c3 fixed POEditor project url 2020-05-22 19:35:47 +02:00
ChaosMarc
bb7eac37f4 Updated README.md 2020-05-22 19:31:41 +02:00
ChaosMarc
e8dc732f2c Fix #21 and added python script to create LocalizedStrings.ini from poeditor json files 2020-05-22 19:18:59 +02:00
ChaosMarc
c982875959 Added translations in POEditor (https://poeditor.com/) format 2020-05-20 12:44:04 +02:00
ChaosMarc
29cbdbe028 Merge pull request #18 from CaiMiao/master
Update LocalizedStrings.ini
2018-12-26 23:21:20 +01:00
Fumii Chuu
c0ab93847c Update LocalizedStrings.ini
fix chinese and add japanese string
2018-12-26 18:42:37 +08:00
ChaosMarc
0116cb44b4 Merge tag '11.02' 2018-05-22 16:22:51 +02:00
ChaosMarc
a0c5ef7c9f Revert "Create D2Funcs_pre114.h"
This reverts commit d2b9c9c06b.
2018-05-22 16:05:53 +02:00
ChaosMarc
3f25bf1b0a Revert "Update D2Funcs_pre114.h"
This reverts commit 722e7c2046.
2018-05-22 16:05:37 +02:00
ChaosMarc
9a05a42243 Revert "Update D2Funcs_pre114.h"
This reverts commit 1abbd073f9.
2018-05-22 16:05:22 +02:00
ChaosMarc
1f7ae685b6 Revert "Update D2Funcs_pre114.h"
This reverts commit ac348b8cb7.
2018-05-22 16:05:03 +02:00
ChaosMarc
58c251230c Fixes typo in german translation mentioned in #7 2017-06-19 15:22:18 +02:00
ChaosMarc
857834bc82 updated to v11.02 by Yohann 2017-06-19 15:01:03 +02:00
ChaosMarc
825a51f608 Removed N° from stash page string (fixes #5)
The ° symbol broke mods with truncated custom fonts. Also the spelling N° / No. is not applicable to all languages.
2017-05-08 09:34:13 +02:00
LAutour
ac348b8cb7 Update D2Funcs_pre114.h 2017-02-26 23:52:22 +05:00
LAutour
1abbd073f9 Update D2Funcs_pre114.h 2017-02-25 17:45:08 +05:00
LAutour
722e7c2046 Update D2Funcs_pre114.h 2017-02-24 22:53:56 +05:00
LAutour
b9f766313b Update LocalizedStrings.ini 2017-02-24 22:09:59 +05:00
LAutour
d2b9c9c06b Create D2Funcs_pre114.h 2017-02-24 21:55:49 +05:00
ChaosMarc
d743794477 Fix bullet points in README 2017-01-24 11:15:52 +01:00
ChaosMarc
0e1a9d449e Updated README 2017-01-24 11:13:18 +01:00
ChaosMarc
4a0ba8e2c9 Translated new lines in PlugY_The_Survival_Kit_-_Liesmich.txt 2017-01-24 11:10:15 +01:00
ChaosMarc
d1bf1eb471 Update PlugY_The_Survival_Kit_-_Liesmich.txt (DerWeedologe's original commit 6b98f2566fea7f06675de150856549ef4ac234c8) 2017-01-24 10:41:29 +01:00
ChaosMarc
3d4273028a Update Chinese translation (tytannial's original commit f97c173282d4716aa9b529e977213a5add3418dd) 2017-01-24 10:37:54 +01:00
77 changed files with 6859 additions and 3649 deletions

12
.gitignore vendored
View File

@@ -26,3 +26,15 @@
*.exe *.exe
*.out *.out
*.app *.app
**/*.zip
.idea
**/.vs
**/Release/
**/*.vcxproj
**/*.vcxproj.filters
**/*.vcxproj.user
**/*.VC.db
**/*.VC.VC.opendb
**/UpgradeLog*
/PlugYRun/PlugYRun.aps

View File

@@ -1,6 +1,7 @@
/*====================================================================== /*======================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Declares the type for a STDCALL or FASTCALL function pointer Declares the type for a STDCALL or FASTCALL function pointer
called N with arguments list P, returning R, namedInDLL D and at @A called N with arguments list P, returning R, namedInDLL D and at @A
@@ -20,7 +21,7 @@
//D2S(D2Common,11068, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//ONLY 1.11b result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll //D2S(D2Common,11068, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//ONLY 1.11b result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
//D2S(D2Common,10250, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll //D2S(D2Common,10250, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
////D2S(D2Common,10257, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); ////D2S(D2Common,10257, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc));
//D2S(D2Common,10273, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); //D2S(D2Common,10273, DWORD, D2Common10273, (Inventory* ptInventory, void* unknown));
//D2S(D2Common,10535, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory));//ONLY 1.11b //D2S(D2Common,10535, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory));//ONLY 1.11b
//D2S(D2Common,11140, Unit*, D2UnitGetNextItem, (Unit* ptItem));//ONLY 1.11b //D2S(D2Common,11140, Unit*, D2UnitGetNextItem, (Unit* ptItem));//ONLY 1.11b
//D2S(D2Common,10748, Unit*, D2GetRealItem, (Unit* ptUnit));//ONLY 1.11b //D2S(D2Common,10748, Unit*, D2GetRealItem, (Unit* ptUnit));//ONLY 1.11b
@@ -149,68 +150,68 @@
//F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID)); //F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID));
F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); F8(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907, 21AED0, DWORD, D2Common11084, (Room* ptRoom, DWORD zero));
F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691, DWORD, D2GetLevelID, (Room* ptRoom)); F8(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691, 21A1B0, DWORD, D2GetLevelID, (Room* ptRoom));
F7(STD, D2Common,10138,10138,10138,10623,10491,11043,10654,10716, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); F8(STD, D2Common,10138,10138,10138,10623,10491,11043,10654,10716, 24E810, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD));
//F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit)); //F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit));
F7(STD, D2Common,10242,10242,10242,00000,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); F8(STD, D2Common,10242,10242,10242,00000,00000,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient));
F7(STD, D2Common,10246,10246,10246,10855,10813,10289,10133,10402, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line)); F8(STD, D2Common,10246,10246,10246,10855,10813,10289,10133,10402, 23B950, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line));
F7(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); F8(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490, 23AD90, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem));
F7(STD, D2Common,10249,10249,10249,10880,11068,10436,11107,10963, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll F8(STD, D2Common,10249,10249,10249,10880,11068,10436,11107,10963, 23BCC0, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
F7(STD, D2Common,10250,10250,10250,00000,00000,00000,00000,00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll F8(STD, D2Common,10250,10250,10250,00000,00000,00000,00000,00000, 00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
//F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); //F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc));
F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); F8(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000, 00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknown));
F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); F8(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040, 23B2C0, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory));
F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879, Unit*, D2UnitGetNextItem, (Unit* ptItem)); F8(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879, 23DFA0, Unit*, D2UnitGetNextItem, (Unit* ptItem));
F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897, Unit*, D2GetRealItem, (Unit* ptUnit)); F8(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897, 23DFD0, Unit*, D2GetRealItem, (Unit* ptUnit));
//F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar)); //F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar));
//F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar)); //F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar));
F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 F8(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000, 00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10
//F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos)); //F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos));
F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 F8(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000, 00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10
//F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos)); //F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos));
F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166, void, D2GetPosition, (Unit* ptUnit, Position* pos)); F8(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166, 220870, void, D2GetPosition, (Unit* ptUnit, Position* pos));
F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); F8(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025, 223460, DWORD, D2GetMaxGoldBank, (Unit* ptUnit));
F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846, Room*, D2GetRoom, (Unit* ptUnit)); F8(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846, 220BB0, Room*, D2GetRoom, (Unit* ptUnit));
//F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode)); //F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode));
//F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject)); //F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject));
F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404, PlayerData*,D2InitPlayerData, (Unit* ptChar)); F8(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404, 221F90, PlayerData*,D2InitPlayerData, (Unit* ptChar));
//F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar)); //F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar));
F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103, PlayerData*,D2GetPlayerData, (Unit* ptChar)); F8(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103, 2221A0, PlayerData*,D2GetPlayerData, (Unit* ptChar));
F7(STD, D2Common,10431,10431,10431,00000,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar)); F8(STD, D2Common,10431,10431,10431,00000,00000,00000,00000,00000, 00000, DWORD, D2GetDefence, (Unit* ptChar));
F7(STD, D2Common,10433,10433,10433,00000,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); F8(STD, D2Common,10433,10433,10433,00000,00000,00000,00000,00000, 00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame));
F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159, DWORD, D2GetMaxGold, (Unit* ptUnit)); F8(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159, 222E70, DWORD, D2GetMaxGold, (Unit* ptUnit));
F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); F8(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193, 224690, DWORD, D2Common10572, (Unit* ptObject, DWORD value));
//F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
//F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
//F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
//F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex)); //F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex));
//F7(STD, D2Common,10470,10470,10470,00000,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum)); //F7(STD, D2Common,10470,10470,10470,00000,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum));
F7(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040, BYTE, D2GetObjectFlags, (Unit* ptObject)); F8(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040, 2222C0, BYTE, D2GetObjectFlags, (Unit* ptObject));
F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); F8(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033, 222300, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags));
//F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000,00000, DWORD, D2Common10471, (void*)); //F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000,00000, DWORD, D2Common10471, (void*));
//F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000,00000, DWORD, D2Common10472, (void*)); //F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000,00000, DWORD, D2Common10472, (void*));
//F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one)); //F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one));
//F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags)); //F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags));
//F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD)); //F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD));
//F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats)); //F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats));
F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); F8(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000, 00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame));
//F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index)); //F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));
F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b F8(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645, 2272B0, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b
F7(STD, D2Common,10519,10519,10519,11092,10061,10658,10973,10550, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b F8(STD, D2Common,10519,10519,10519,11092,10061,10658,10973,10550, 225480, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
//F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index)); //F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index));
F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b F8(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216, 2253B0, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
//F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit)); //F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit));
F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); F8(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000, 00000, DWORD, D2haveDefenceBonus, (Unit* ptChar));
F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); F8(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000, 00000, DWORD, D2haveFireResBonus, (Unit* ptChar));
F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); F8(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000, 00000, DWORD, D2haveColdResBonus, (Unit* ptChar));
F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); F8(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000, 00000, DWORD, D2haveLightResBonus, (Unit* ptChar));
F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); F8(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000, 00000, DWORD, D2havePoisonResBonus, (Unit* ptChar));
F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); F8(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000, 00000, DWORD, D2haveDefenceMalus, (Unit* ptChar));
F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); F8(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000, 00000, DWORD, D2haveFireResMalus, (Unit* ptChar));
F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); F8(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000, 00000, DWORD, D2haveColdResMalus, (Unit* ptChar));
F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); F8(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000, 00000, DWORD, D2haveLightResMalus, (Unit* ptChar));
F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); F8(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, 00000, DWORD, D2havePoisonResMalus, (Unit* ptChar));
//F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit)); //F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit));
//F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem)); //F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem));
//F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats)); //F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats));
@@ -218,35 +219,35 @@ F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, DWORD, D2hav
//F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000,00000, void, D2FreeBinFiles, ()); //F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000,00000, void, D2FreeBinFiles, ());
//F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool)); //F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool));
//F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value)); //F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value));
F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); F8(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037, 2122F0, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength));
F7(STD, D2Common,10600,10600,10600,10573,10262,10887,10695,10994, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); F8(STD, D2Common,10600,10600,10600,10573,10262,10887,10695,10994, 2335F0, ItemsBIN*, D2GetItemsBIN, (DWORD itemID));
//F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID)); //F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID));
//F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID)); //F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID));
F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); F8(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619, 10619, GemsBIN*, D2GetGemsBIN, (DWORD gemID));
F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); F8(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393, 26A1B0, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID));
F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235, int, D2GetNbCubeMainBIN, ()); F8(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235, 26A200, int, D2GetNbCubeMainBIN, ());
//F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID)); //F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID));
F7(STD, D2Common,10628,10628,10628,00000,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); F8(STD, D2Common,10628,10628,10628,00000,00000,00000,00000,00000, 00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level));
F7(STD, D2Common,10629,10629,10629,00000,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID)); F8(STD, D2Common,10629,10629,10629,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMaxLevel, (DWORD classID));
F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); F8(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694, 10694, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel));
//F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk)); //F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk));
//F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id)); //F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id));
F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911, DWORD, D2GetItemQuality, (Unit* ptItem)); F8(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911, 227E70, DWORD, D2GetItemQuality, (Unit* ptItem));
F7(STD, D2Common,10707,10707,10707,10911,10303,10989,10202,10458, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); F8(STD, D2Common,10707,10707,10707,10911,10303,10989,10202,10458, 2280A0, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file));
//F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue)); //F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue));
//F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit)); //F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit));
//F7(STD, D2Common,10711,10711,10711,00000,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1 //F7(STD, D2Common,10711,10711,10711,00000,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1
F7(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008, DWORD, D2GetItemLevel, (Unit* ptItem)); F8(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008, 2281E0, DWORD, D2GetItemLevel, (Unit* ptItem));
F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810, BYTE, D2ItemGetPage, (Unit* ptUnit)); F8(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810, 228250, BYTE, D2ItemGetPage, (Unit* ptUnit));
F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); F8(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026, 228280, void, D2ItemSetPage, (Unit* ptItem, BYTE page));
F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); F8(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601, 229BB0, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype));
F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075, int, D2GetUniqueID, (Unit* ptItem)); F8(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075, 229DA0, int, D2GetUniqueID, (Unit* ptItem));
F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); F8(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000, 00000, void, D2SetAnim, (Unit* ptUnit, int anim));
//F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height); //F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height);
//F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit)); //F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit));
//F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem)); //F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem));
F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981, int*, D2GetNbRunesBIN, ());//return the point on th number F8(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981, 10981, int*, D2GetNbRunesBIN, ());//return the point on th number
F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, RunesBIN*, D2GetRunesBIN, (int runesID)); F8(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, 10405, RunesBIN*, D2GetRunesBIN, (int runesID));
//F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem)); //F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem));
//F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem)); //F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem));
//F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem)); //F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem));
@@ -255,35 +256,36 @@ F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, RunesBIN*, D2
//F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD)); //F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD));
//F7(STD, D2Common,10872,10872,10872,00000,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y)); //F7(STD, D2Common,10872,10872,10872,00000,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y));
//F7(STD, D2Common,10875,10875,10875,00000,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem)); //F7(STD, D2Common,10875,10875,10875,00000,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem));
F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 F8(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963, 23BCC0, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10
F7(STD, D2Common,10881,10881,10881,10956,11156,10218,10987,10665, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); F8(STD, D2Common, 11163, 11163, 11163, 10880, 11068, 10436, 11107, 10963, 23BCC0, DWORD, D2isEtheral2, (Unit* ptItem, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6, WORD a7));
F8(STD, D2Common,10881,10881,10881,10956,11156,10218,10987,10665, 2313E0, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6));
//F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000,00000, void, DoNothing916, ()); //F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000,00000, void, DoNothing916, ());
//F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID)); //F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID));
//F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID)); //F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID));
//F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID)); //F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID));
F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); F8(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335, 247280, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD));
//F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line)); //F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line));
//F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill)); //F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill));
F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); F8(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007, 2442A0, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus));
//F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two)); //F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two));
//F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState)); //F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState));
//F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber)); //F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber));
//F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID)); //F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID));
//F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex)); //F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex));
//F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD)); //F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD));
F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 F8(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081, 246D00, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447
A7(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, 17B0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); A8(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, 17B0, 833E0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID));
A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); A8(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0, 268600, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2));
A7(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60,5AB20, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); A8(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60,5AB20, 5AB20, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2));
A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); A8(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160, 155C90, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId));
//A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize)); //A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize));
A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); A8(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0, 5C4F0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id));
//A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD)); //A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD));
//A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats)); //A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats));
//A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem)); //A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem));
A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); A8(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0, /*116E46*/117079, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD));
//A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string)); //A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string));
A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 A8(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, 2552E0, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -308,24 +310,24 @@ A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, void, D2Loa
//E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b //E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b
//E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI //E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI
A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480, void*, D2LoadImage, (const char* filename, DWORD filetype)); A8(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480, 788B0, void*, D2LoadImage, (const char* filename, DWORD filetype));
A7(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000,00000, void, D2FreeImage, (void* image));//6FAA1140 A8(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000,00000, 00000, void, D2FreeImage, (void* image));//6FAA1140
A7(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0,B6890, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! A8(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0,B6890, 787B0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !!
//A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80 //A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80
A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 A8(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, 00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80
A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640, void, D2PrintStatsPage, ()); A8(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640, A7D00, void, D2PrintStatsPage, ());
//A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990 //A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990
A7(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10,2CE40, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b A8(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10,2CE40, E4D80, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b
A7(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI A8(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820, 521C0, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI
//A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0 //A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0
A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); A8(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270, B9A00, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD));
//A7(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl)); //A7(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl));
A7(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0, Unit*, D2GetCurrentNPC, ()); A8(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0, 790D0, Unit*, D2GetCurrentNPC, ());
A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX A8(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0, 78350, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX
A7(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790,1C190, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); A8(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790,1C190, 55F20, void, D2TogglePage, (DWORD a, DWORD b, DWORD c));
A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI A8(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10, 89980, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI
A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0, void*, D2LoadBuySelBtn, ()); A8(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0, 54600, void*, D2LoadBuySelBtn, ());
A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, void, D2ReloadGambleScreen, ()); A8(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, 7DC60, void, D2ReloadGambleScreen, ());
//A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI //A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI
@@ -370,43 +372,43 @@ A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, void, D2Relo
//E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b //E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b
F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002, void, D2SetNbPlayers, (DWORD nbPlayers)); F8(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002, 135780, void, D2SetNbPlayers, (DWORD nbPlayers));
//A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0 //A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0
A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070, void, D2AddClient, (DWORD clientID));//BY EAX A8(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070, 12C550, void, D2AddClient, (DWORD clientID));//BY EAX
A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 A8(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700, /*12E860*/12FEE0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0
A7(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820,BB510, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 A8(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820,BB510, 12DED0, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0
A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData A8(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780, 13B280, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData
A7(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0,DD4F0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX A8(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0,DD4F0, 13C4A0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX
//A7(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0 //A7(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0
//A7(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0 //A7(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0
//A7(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0 //A7(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0
A7(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); A8(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40, 16CF40, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID));
A7(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070,B2F70, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem A8(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070,B2F70, 15CA40, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem
//A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80 //A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80
A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); A8(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340, 63740, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y));
//A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410 //A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410
//A7(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00 //A7(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00
//A7(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 //A7(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610
//A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 //A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10
A7(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950,CDE20, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param A8(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950,CDE20, 1A09E0, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param
A7(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); A8(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980, 142B40, void, D2Game235C0, (Game* ptGame, Room* ptRoom));
//A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 //A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0
//A7(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500 //A7(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500
A7(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810,3A4C0, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0 A8(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810,3A4C0, 1335E0, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0
A7(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 A8(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40, 152F60, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00
//A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220,00000, Unit*, D2GetOwnerMonster, (Unit* ptMonster)); //A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220,00000, Unit*, D2GetOwnerMonster, (Unit* ptMonster));
//A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0 //A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0
A7(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90,6FE10, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3)); A8(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90,6FE10, 155230, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3));
A7(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); A8(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0, 194270, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar));
A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); A8(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0, 194280, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar));
A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920, 1E9170, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*));
A7(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60,4EAD0, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60,4EAD0, 1F78B0, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));
A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850, 1FCFE0, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));
A7(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0,49480, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0,49480, 1F81C0, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*));
A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0, 1E9DF0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));
A7(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80,C6EC0, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); A8(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80,C6EC0, 1FD200, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));
//A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one)); //A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one));
A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, void, D2SaveGame, (Game* ptGame) ); A8(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, 12CA10, void, D2SaveGame, (Game* ptGame) );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -414,8 +416,8 @@ A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, void, D2SaveGa
//D2S(D2Net,10020, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//ONLY 1.11b //D2S(D2Net,10020, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//ONLY 1.11b
//D2S(D2Net,10018, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));//ONLY 1.11b //D2S(D2Net,10018, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));//ONLY 1.11b
F7(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024,10015, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before F8(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024,10015, 12AE50, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before
F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); F8(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, 12B330, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -436,29 +438,29 @@ F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, DWORD, D2SendT
////D2S(Fog,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 ////D2S(Fog,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0
////D2S(Fog,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0 ////D2S(Fog,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0
////D2S(Fog,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 ////D2S(Fog,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840
//D2S(Fog,10212, void, D2Fog10212, (DWORD unknow));//1.11b //D2S(Fog,10212, void, D2Fog10212, (DWORD unknown));//1.11b
////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 ////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840
//D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10 //D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10
F7(STD, Fog, 10023,10023,10023,00000,00000,00000,00000,00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10) F8(STD, Fog, 10023,10023,10023,00000,00000,00000,00000,00000, 00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10)
F7(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024,10024, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); F8(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024,10024, 8A60, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line));
F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); F8(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042, B380, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
F7(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); F8(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043,10043, B3C0, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); F8(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045, B430, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
F7(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); F8(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046,10046, B480, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); F8(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102, 68E0, DWORD, D2MPQOpenFile, (char* ptPath, void** buf));
F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103, DWORD, D2MPQCloseFile, (void* mpqfile)); F8(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103, 68F0, DWORD, D2MPQCloseFile, (void* mpqfile));
F7(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); F8(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104,10104, 6900, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD));
F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); F8(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105, 6930, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset));
F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); F8(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115, 7050, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize));
F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); F8(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116, 6BA0, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize));
//F7(STD, Fog, 10126,10126,10126,10126,10126,10126,10126,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0 //F7(STD, Fog, 10126,10126,10126,10126,10126,10126,10126,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0
//F7(STD, Fog, 10127,10127,10127,10127,10127,10127,10127,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 //F7(STD, Fog, 10127,10127,10127,10127,10127,10127,10127,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0
//F7(STD, Fog, 10128,10128,10128,10128,10128,10128,10128,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0 //F7(STD, Fog, 10128,10128,10128,10128,10128,10128,10128,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0
//F7(STD, Fog, 10130,10130,10130,10130,10130,10130,10130,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 //F7(STD, Fog, 10130,10130,10130,10130,10130,10130,10130,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840
F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow)); F8(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212, 2BD0B0, void, D2Fog10212, (DWORD unknown));
//F7(STD, Fog, 10217,10217,10217,10217,10217,10217,10217,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 //F7(STD, Fog, 10217,10217,10217,10217,10217,10217,10217,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840
F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, int, D2GetInstructionPointer, ()); F8(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, 8090, int, D2GetInstructionPointer, ());
//Fog10213 getIndexFromLookupTable (&table,code,bool) //Fog10213 getIndexFromLookupTable (&table,code,bool)
@@ -478,11 +480,11 @@ F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, int, D2GetInstru
////E2S(D2Lang,1670, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf ////E2S(D2Lang,1670, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf
//F7(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 //F7(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0
F7(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 LAutour F8(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011, 124E20, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 LAutour
F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); F8(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004, 124A30, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum));
//F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0 //F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0
F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001, DWORD, D2GetLang, ());//14b 00522A20 F8(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001, 125150, DWORD, D2GetLang, ());//14b 00522A20
F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 F8(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, 00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210
//F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000,10005, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 //F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000,10005, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960
//A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0 //A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0
//A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60 //A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60
@@ -499,9 +501,9 @@ F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, DWORD, D2Prin
//D2S(Storm,511, void, D2FreeWinMessage, (sWinMessage* msg));//1.11/1.11b //D2S(Storm,511, void, D2FreeWinMessage, (sWinMessage* msg));//1.11/1.11b
//F7(STD, Storm, 253, 253, 253, 253, 253, 253, 000, 000, void, D2StormMPQCloseFile, (void* mpqfile)); //F7(STD, Storm, 253, 253, 253, 253, 253, 253, 000, 000, void, D2StormMPQCloseFile, (void* mpqfile));
F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) F8(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, 192F0, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer))
F7(STD, Storm, 503, 503, 503, 503, 503, 503, 503, 503, void, D2Storm503, (DWORD, DWORD, DWORD)); F8(STD, Storm, 503, 503, 503, 503, 503, 503, 503, 503, 13750, void, D2Storm503, (DWORD, DWORD, DWORD));
F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg)); F8(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, 20290, void, D2FreeWinMessage, (sWinMessage* msg));
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -513,12 +515,12 @@ F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWi
//D2S(D2gfx,10000, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));//ONLY 1.11b //D2S(D2gfx,10000, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));//ONLY 1.11b
//D2S(D2gfx,10044, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );//ONLY 1.11b //D2S(D2gfx,10044, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );//ONLY 1.11b
F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012, DWORD, D2GetResolution,() ); F8(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012, F5160, DWORD, D2GetResolution,() );
//F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) ); //F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) );
//F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000,00000, DWORD, D2ShowWindow,() ); //F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000,00000, DWORD, D2ShowWindow,() );
//F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0 //F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0
F7(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014,10028, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); F8(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014,10028, F6300, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));
F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); F8(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, F6480, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -532,36 +534,36 @@ F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, void, D2PrintI
//D2F(D2Win,10132, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 //D2F(D2Win,10132, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080
//D2S(D2Win,10113, void*, D2CreateTextBox,(DWORD* data) );//ONLY 1.11b //D2S(D2Win,10113, void*, D2CreateTextBox,(DWORD* data) );//ONLY 1.11b
F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); F8(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051, FCFF0, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) );
F7(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150,10076, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); F8(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150,10076, 102320, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) );
F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150, DWORD, D2GetPixelLen,(LPWSTR s) ); F8(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150, 101820, DWORD, D2GetPixelLen,(LPWSTR s) );
F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047, DWORD, D2SetFont,(DWORD fontID) ); F8(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047, 102EF0, DWORD, D2SetFont,(DWORD fontID) );
F7(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085,10137, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); F8(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085,10137, 102280, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) );
F7(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 F8(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000,00000, 00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260
F7(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000,00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 F8(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000,00000, 00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080
F7(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164, void*, D2CreateTextBox,(DWORD* data) ); F8(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164, F93C0, void*, D2CreateTextBox,(DWORD* data) );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//D2CMP : ????0000 //D2CMP : ????0000
//D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11 //D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11
F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020, DWORD, D2CMP10014, (void* image) ); F8(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020, 201A50, DWORD, D2CMP10014, (void* image) );
//ONLY UNTIL 1.10 : //ONLY UNTIL 1.10 :
A7(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080 A8(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000,00000, 00000, DWORD, D2isLODGame, ());//6FAAC080
A7(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000,00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d) A8(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000,00000, 00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d)
A7(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0 A8(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMouseX, ());//6FB57BC0
A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 A8(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMouseY, ());//6FB57BD0
A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0 A8(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000, 00000, Unit*, D2GetClientPlayer, ());//6FB283D0
A7(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000,00000, void, D2CleanStatMouseUp, ());//6FAABF60 A8(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000,00000, 00000, void, D2CleanStatMouseUp, ());//6FAABF60
A7(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 A8(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000,00000, 00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990
//A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20 //A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20
//A7(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0 //A7(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0
//A7(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40 //A7(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40
//A7(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70 //A7(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70
A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 A8(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, 00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////// VARIABLES //////// //////// VARIABLES ////////
@@ -583,23 +585,23 @@ A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, NetClient*, D2
//E2C(D2Client,11C1E0,Unit*, ptClientChar);//1.11b //E2C(D2Client,11C1E0,Unit*, ptClientChar);//1.11b
//C7(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20 //C7(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20
C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, F7038, DWORD, ResolutionY);//0x258 = 600 C8(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, F7038, 311470, DWORD, ResolutionY);//0x258 = 600
C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, F7034, DWORD, ResolutionX);//0x320 = 800 C8(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, F7034, 31146C, DWORD, ResolutionX);//0x320 = 800
C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 C8(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358, 3A285C, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60
C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354, DWORD, WindowStartX);//0x50 = 80 C8(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354, 3A2858, DWORD, WindowStartX);//0x50 = 80
//C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000,00000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000 //C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000,00000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000
C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0, NetClient*, ClientTable); C8(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0, 4842A8, NetClient*, ClientTable);
//C7(D2Client,000000,000000,000000,000000,104225,000000,000000,00000, DWORD, CurrentNPCNum); //C7(D2Client,000000,000000,000000,000000,104225,000000,000000,00000, DWORD, CurrentNPCNum);
C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4, DWORD, IsLodGame); C8(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4, 3A04F4, DWORD, IsLodGame);
C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000, BYTE, DifficultyLevel); C8(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000, 000000, BYTE, DifficultyLevel);
//C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,11D1D8, BYTE, DifficultyLevel); //C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,11D1D8, BYTE, DifficultyLevel);
C7(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824,11C94C, DWORD, MouseY);//0x258 = 600 C8(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824,11C94C, 3A6AAC, DWORD, MouseY);//0x258 = 600
C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950, DWORD, MouseX);//0x320 = 800 C8(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950, 3A6AB0, DWORD, MouseX);//0x320 = 800
C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050, Unit*, ptClientChar); C8(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050, 3A5E74, Unit*, ptClientChar);
C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000, DWORD, NbStatDesc); C8(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000, 000000, DWORD, NbStatDesc);
C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000,000000, DWORD, StatDescTable); C8(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000,000000, 000000, DWORD, StatDescTable);
/* NEXT NOT TESTED IN 1.10 (1.09b fct) /* NEXT NOT TESTED IN 1.10 (1.09b fct)
D2_STD(D2Common10066, void, D2RemoveFromRoom, (DrlgRoom1* hRoom, DWORD untitype, DWORD unitID), 0x6FD7CFD0); D2_STD(D2Common10066, void, D2RemoveFromRoom, (DrlgRoom1* hRoom, DWORD untitype, DWORD unitID), 0x6FD7CFD0);

View File

@@ -132,7 +132,7 @@ struct Path //(8 dword)
struct Inventory struct Inventory
{ //Offset from Code. Size: 30 <20> 40 { //Offset from Code. Size: 30 <20> 40
DWORD tag; //+00 = 0x01020304 DWORD tag; //+00 = 0x01020304
BYTE uk1[0x04]; //+04 =? 0 BYTE uk1[0x04]; //+04 =? 0
Unit* ptChar; //+08 Unit* ptChar; //+08
@@ -300,7 +300,7 @@ ITEMFLAG_RUNEWORD = 0x04000000
WORD prefix[3]; //+38 WORD prefix[3]; //+38
WORD suffix[3]; //+3E WORD suffix[3]; //+3E
BYTE equipLoc; //+44 BYTE equipLoc; //+44
/* emplacement si <20>quip<69> /* emplacement si <20>quip<69>
* 00 = noequip/inBelt * 00 = noequip/inBelt
* 01 = head * 01 = head
* 02 = neck * 02 = neck

View File

@@ -7,7 +7,6 @@
//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include "VersionInfo.h" #include "VersionInfo.h"
#include <windows.h>
#pragma comment(lib, "Version.Lib") #pragma comment(lib, "Version.Lib")
@@ -15,18 +14,22 @@ const char* VersionStrings[16] = { "1.00","1.07","1.08","1.09","1.09b","1.09d","
const char* GetVersionString(int version) const char* GetVersionString(int version)
{ {
if (version < 0 || version >= sizeof(VersionStrings))
return "UNKNOWN";
return VersionStrings[version]; return VersionStrings[version];
} }
eGameVersion GetD2Version(LPCVOID pVersionResource) eGameVersion GetD2Version(LPCVOID pVersionResource)
{ {
if (!pVersionResource) return UNKNOWN;
UINT uLen; UINT uLen;
VS_FIXEDFILEINFO* ptFixedFileInfo; VS_FIXEDFILEINFO* ptFixedFileInfo;
if (!VerQueryValue(pVersionResource, "\\", (LPVOID*)&ptFixedFileInfo, &uLen)) if (!VerQueryValue(pVersionResource, "\\", (LPVOID*)&ptFixedFileInfo, &uLen))
return UNKNOW; return UNKNOWN;
if (uLen == 0) if (uLen == 0)
return UNKNOW; return UNKNOWN;
WORD major = HIWORD(ptFixedFileInfo->dwFileVersionMS); WORD major = HIWORD(ptFixedFileInfo->dwFileVersionMS);
WORD minor = LOWORD(ptFixedFileInfo->dwFileVersionMS); WORD minor = LOWORD(ptFixedFileInfo->dwFileVersionMS);
@@ -34,7 +37,7 @@ eGameVersion GetD2Version(LPCVOID pVersionResource)
WORD subrevision = LOWORD(ptFixedFileInfo->dwFileVersionLS); WORD subrevision = LOWORD(ptFixedFileInfo->dwFileVersionLS);
if (major != 1) if (major != 1)
return UNKNOW; return UNKNOWN;
if (minor == 0 && revision == 7 && subrevision == 0) return V107; if (minor == 0 && revision == 7 && subrevision == 0) return V107;
if (minor == 0 && revision == 8 && subrevision == 28) return V108; if (minor == 0 && revision == 8 && subrevision == 28) return V108;
if (minor == 0 && revision == 9 && subrevision == 19) return V109; if (minor == 0 && revision == 9 && subrevision == 19) return V109;
@@ -50,14 +53,14 @@ eGameVersion GetD2Version(LPCVOID pVersionResource)
if (minor == 14 && revision == 1 && subrevision == 68) return V114b; if (minor == 14 && revision == 1 && subrevision == 68) return V114b;
if (minor == 14 && revision == 2 && subrevision == 70) return V114c; if (minor == 14 && revision == 2 && subrevision == 70) return V114c;
if (minor == 14 && revision == 3 && subrevision == 71) return V114d; if (minor == 14 && revision == 3 && subrevision == 71) return V114d;
return UNKNOW; return UNKNOWN;
} }
eGameVersion GetD2Version(char* gameExe) eGameVersion GetD2Version(char* gameExe)
{ {
DWORD len = GetFileVersionInfoSize(gameExe, NULL); DWORD len = GetFileVersionInfoSize(gameExe, NULL);
if (len == 0) if (len == 0)
return UNKNOW; return UNKNOWN;
BYTE* pVersionResource = new BYTE[len]; BYTE* pVersionResource = new BYTE[len];
GetFileVersionInfo(gameExe, NULL, len, pVersionResource); GetFileVersionInfo(gameExe, NULL, len, pVersionResource);
@@ -67,19 +70,15 @@ eGameVersion GetD2Version(char* gameExe)
return version; return version;
} }
eGameVersion GetD2Version() eGameVersion GetD2Version(HMODULE hModule)
{ {
HMODULE hModule = GetModuleHandle(NULL);
HRSRC hResInfo = FindResource(hModule, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION); HRSRC hResInfo = FindResource(hModule, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
if (!hResInfo) return UNKNOWN;
HGLOBAL hResData = LoadResource(hModule, hResInfo); HGLOBAL hResData = LoadResource(hModule, hResInfo);
if (!hResData) return UNKNOWN;
LPVOID pVersionResource = LockResource(hResData); LPVOID pVersionResource = LockResource(hResData);
//DWORD dwSize = SizeofResource(hInst, hResInfo);
//LPVOID pVersionResource = LocalAlloc(LMEM_FIXED, dwSize);
//CopyMemory(pVersionResource, pRes, dwSize);
eGameVersion version = GetD2Version(pVersionResource); eGameVersion version = GetD2Version(pVersionResource);
FreeResource(hResData); FreeResource(hResData);
//LocalFree(pVersionResource);
return version; return version;
} }

View File

@@ -6,9 +6,11 @@
=================================================================*/ =================================================================*/
#pragma once #pragma once
#include <windows.h>
enum eGameVersion enum eGameVersion
{ {
UNKNOW = -1, UNKNOWN = -1,
V100 = 0, V100 = 0,
V107, V107,
V108, V108,
@@ -29,6 +31,6 @@ enum eGameVersion
const char* GetVersionString(int version); const char* GetVersionString(int version);
eGameVersion GetD2Version(char* gamePath); eGameVersion GetD2Version(char* gamePath);
eGameVersion GetD2Version(); eGameVersion GetD2Version(HMODULE hModule);
///////////////////////// END OF FILE /////////////////////// ///////////////////////// END OF FILE ///////////////////////

View File

@@ -48,6 +48,7 @@ enum UpdateServerConst
US_RENAME, US_RENAME,
US_PAGENAME, US_PAGENAME,
US_SET_INDEX, US_SET_INDEX,
US_SET_MAIN_INDEX,
US_RESET_INDEX, US_RESET_INDEX,
US_INSERT_PAGE, US_INSERT_PAGE,
US_DELETE_PAGE, US_DELETE_PAGE,

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Use a more big stash Use a more big stash
@@ -77,8 +78,13 @@ void Install_BigStash()
log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n"); log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n");
// modification of stash grid // modification of stash grid
mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25); mem_seek R8(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25, 25C0F8);
MEMC_REF4( D2CompileTxtFile, caller_modifStashGrid); if (version_D2Common == V114d) {
MEMT_REF4(0xFFFB61F4, caller_modifStashGrid);
}
else {
MEMC_REF4(D2CompileTxtFile, caller_modifStashGrid);
}
//01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578 //01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578
//6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653 //6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653
//6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496 //6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496
@@ -87,16 +93,16 @@ void Install_BigStash()
//6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037 //6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037
// modification of stash background // modification of stash background
mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC); mem_seek R8(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC, 89EB5);
memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash memt_byte(0x68, 0xE8); // CALL caller_changeTradeStash
MEMT_REF4( 0x00000104, caller_changeTradeStash); MEMT_REF4(0x00000104, caller_changeTradeStash);
//6FAEC61C |. 68 04010000 PUSH 104 //6FAEC61C |. 68 04010000 PUSH 104
//6FB5643C |. 68 04010000 PUSH 104 //6FB5643C |. 68 04010000 PUSH 104
//6FB249BC |. 68 04010000 PUSH 104 //6FB249BC |. 68 04010000 PUSH 104
//6FB59D7C |. 68 04010000 PUSH 104 //6FB59D7C |. 68 04010000 PUSH 104
//6FB3CC1C |. 68 04010000 PUSH 104 //6FB3CC1C |. 68 04010000 PUSH 104
//6FB443FC |. 68 04010000 PUSH 104 //6FB443FC |. 68 04010000 PUSH 104
log_msg("\n"); log_msg("\n");
isInstalled = true; isInstalled = true;

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Updating server. Updating server.
@@ -22,6 +23,8 @@ bool active_savegame=false;
#define MAX_CMD_SIZE 200 #define MAX_CMD_SIZE 200
const char * CMD_PLAYERS="players set to";
const char * CMD_SAVE="/save"; const char * CMD_SAVE="/save";
const char * CMD_SELECTPAGE="/page"; const char * CMD_SELECTPAGE="/page";
@@ -34,6 +37,7 @@ const char * CMD_RENAME_CHAR="/renamechar";
const char * CMD_REPAGE_NAME = "/renamepage"; const char * CMD_REPAGE_NAME = "/renamepage";
const char * CMD_SET_INDEX = "/setindex"; const char * CMD_SET_INDEX = "/setindex";
const char * CMD_SET_MAIN_INDEX = "/setmainindex";
const char * CMD_RESET_INDEX = "/resetindex"; const char * CMD_RESET_INDEX = "/resetindex";
const char * CMD_INSERT_PAGE = "/insertpage"; const char * CMD_INSERT_PAGE = "/insertpage";
const char * CMD_DELETE_PAGE = "/deletepage"; const char * CMD_DELETE_PAGE = "/deletepage";
@@ -334,6 +338,14 @@ int STDCALL commands (char* ptText)
strncpy(command,ptText,MAX_CMD_SIZE-1); strncpy(command,ptText,MAX_CMD_SIZE-1);
_strlwr(command); _strlwr(command);
if (!strncmp(command, CMD_PLAYERS, strlen(CMD_PLAYERS)))
{
int nb = atoi(&command[strlen(CMD_PLAYERS)]);
if (nb > 0 && nb <= 64)
nbPlayersCommand = nb;
return 1;
}
if (!strcmp(command, CMD_SAVE)) if (!strcmp(command, CMD_SAVE))
{ {
if (onRealm) return 1; if (onRealm) return 1;
@@ -364,7 +376,7 @@ int STDCALL commands (char* ptText)
if (!strncmp(command, CMD_RENAME_CHAR, strlen(CMD_RENAME_CHAR))) if (!strncmp(command, CMD_RENAME_CHAR, strlen(CMD_RENAME_CHAR)))
{ {
const char* param = &command[strlen(CMD_RENAME_CHAR)]; const char* param = &ptText[strlen(CMD_RENAME_CHAR)];
if (param[0] != ' ') if (param[0] != ' ')
return 1; return 1;
param++; param++;
@@ -374,7 +386,7 @@ int STDCALL commands (char* ptText)
if (!strncmp(command, CMD_REPAGE_NAME,strlen(CMD_REPAGE_NAME))) if (!strncmp(command, CMD_REPAGE_NAME,strlen(CMD_REPAGE_NAME)))
{ {
if (!active_multiPageStash) return 1; if (!active_multiPageStash) return 1;
char* param = &command[strlen(CMD_REPAGE_NAME)]; char* param = &ptText[strlen(CMD_REPAGE_NAME)];
Stash* ptStash = PCPY->currentStash; Stash* ptStash = PCPY->currentStash;
if (!ptStash) if (!ptStash)
return 0; return 0;
@@ -408,6 +420,13 @@ int STDCALL commands (char* ptText)
return 0; return 0;
} }
if (!strcmp(command, CMD_SET_MAIN_INDEX))
{
if (!active_multiPageStash) return 1;
updateServer(US_SET_MAIN_INDEX);
return 0;
}
if (!strcmp(command, CMD_RESET_INDEX)) if (!strcmp(command, CMD_RESET_INDEX))
{ {
if (!active_multiPageStash) return 1; if (!active_multiPageStash) return 1;
@@ -426,7 +445,7 @@ int STDCALL commands (char* ptText)
if (!strcmp(command, CMD_DELETE_PAGE)) if (!strcmp(command, CMD_DELETE_PAGE))
{ {
if (!active_multiPageStash) return 1; if (!active_multiPageStash) return 1;
if (deleteStash(ptChar)) if (deleteStash(ptChar, true))
updateServer(US_DELETE_PAGE); updateServer(US_DELETE_PAGE);
return 0; return 0;
} }
@@ -435,6 +454,8 @@ int STDCALL commands (char* ptText)
{ {
if (!active_multiPageStash) return 1; if (!active_multiPageStash) return 1;
int page = atoi(&command[strlen(CMD_SWAP)]) - 1; int page = atoi(&command[strlen(CMD_SWAP)]) - 1;
if (page < 0 && PCPY->currentStash->nextStash)
page = PCPY->currentStash->nextStash->id;
if (page < 0) if (page < 0)
return 1; return 1;
updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16)); updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16));
@@ -549,9 +570,9 @@ void Install_Commands()
active_savegame = version_D2Common >= V111; active_savegame = version_D2Common >= V111;
// Run custom commmand // Run custom commmand
mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6); mem_seek R8(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6, 7C548);
memt_byte( 0x83, 0xE8 ); // CALL memt_byte( 0x83, 0xE8 ); // CALL
MEMT_REF4( 0xC08508C4 , version_D2Client == V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); MEMT_REF4( 0xC08508C4 , version_D2Client >= V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands);
//6FB71EE6 . 83C4 08 ADD ESP,8 //6FB71EE6 . 83C4 08 ADD ESP,8
//6FB71EE7 . 85C0 TEST EAX,EAX //6FB71EE7 . 85C0 TEST EAX,EAX
//6FB41C16 |. 83C4 08 ADD ESP,8 //6FB41C16 |. 83C4 08 ADD ESP,8

View File

@@ -1,6 +1,7 @@
/*================================================ /*================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
This file implements some common and useful This file implements some common and useful
function related to some Diablo II mechanisms. function related to some Diablo II mechanisms.
@@ -16,9 +17,9 @@ s_shifting shifting;
#define E2S(F, A, R, N, P) T##N N; #define E2S(F, A, R, N, P) T##N N;
#define E2F(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 E2C(F, A, T, N) T* pt##N;
#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N; #define F8(X, Z, A,B,C,D,E,F,G,H,I, 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 A8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) T##N N;
#define C7(Z, A,B,C,D,E,F,G,H, T, N) T* pt##N; #define C8(Z, A,B,C,D,E,F,G,H,I, T, N) T* pt##N;
#include "../Commons/D2Funcs.h" #include "../Commons/D2Funcs.h"
DataTables* SgptDataTables; DataTables* SgptDataTables;
@@ -34,9 +35,9 @@ DataTables* SgptDataTables;
////E2F(D2Client,0, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70 ////E2F(D2Client,0, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70
//E2F(D2Game,0, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 //E2F(D2Game,0, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0
//E2F(D2Client,0, void, D2CleanStatMouseUp, ());//6FAABF60 //E2F(D2Client,0, void, D2CleanStatMouseUp, ());//6FAABF60
#undef F7 #undef F8
#undef A7 #undef A8
#undef C7 #undef C8
#undef D2S #undef D2S
#undef D2F #undef D2F
#undef E2S #undef E2S
@@ -80,6 +81,8 @@ TD2GetItemStatCostBIN V2GetItemStatCostBIN;
TD2SendPacket V2SendPacket; TD2SendPacket V2SendPacket;
TD2LoadInventory V2LoadInventory; TD2LoadInventory V2LoadInventory;
TD2SaveGame V2SaveGame; TD2SaveGame V2SaveGame;
TD2LinkPortal V2LinkPortal;
TD2Game235C0 V2Game235C0;
//DWORD* ptNbStatDesc //DWORD* ptNbStatDesc
//DWORD* ptStatDescTable; //DWORD* ptStatDescTable;
@@ -282,6 +285,45 @@ continue_compileTxtFile:
JMP ECX JMP ECX
}} }}
__declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) {
_asm {
SUB ESP, 0x20C
// MOV EAX,DWORD PTR DS:[6FDF1464]
PUSH EBX
PUSH EBP
PUSH ESI
PUSH EDI
MOV DWORD PTR SS : [ESP + 0x10], 0
MOV EBX, DWORD PTR SS : [ESP + 0x224]
PUSH EBX
LEA EAX, DWORD PTR SS : [ESP + 0x1A]
PUSH EAX
CALL DWORD PTR SS : [wsprintf]
MOV EDX, DWORD PTR SS : [ESP + 0x228]
ADD ESP, 8
LEA EDX, DWORD PTR SS : [ESP + 0xE]
PUSH EDX
PUSH EAX
LEA EDX, DWORD PTR SS : [ESP + 0x20]
CALL D2ReadFile
TEST EAX, EAX
JNZ continue_compileTxtFile
PUSH __LINE__
CALL D2GetInstructionPointer
PUSH EAX
PUSH S_errorReadTxtFile
CALL D2FogAssert
ADD ESP, 0xC
PUSH - 1
CALL exit
continue_compileTxtFile :
MOV ECX, D2CompileTxtFile
ADD ECX, 0x1EC
JMP ECX
}
}
__declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) __declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
{_asm{ {_asm{
SUB ESP,0x20C SUB ESP,0x20C
@@ -330,6 +372,14 @@ Unit* STDCALL D2GetClientPlayer_111(){return ptClientChar;}
DWORD *StatMouse1, *StatMouse2, *StatMouse3, *StatMouse4; DWORD *StatMouse1, *StatMouse2, *StatMouse3, *StatMouse4;
void FASTCALL D2CleanStatMouseUp_111(){*StatMouse1=*StatMouse2=*StatMouse3=*StatMouse4=0;} void FASTCALL D2CleanStatMouseUp_111(){*StatMouse1=*StatMouse2=*StatMouse3=*StatMouse4=0;}
FCT_ASM ( D2CleanStatMouseUp_114 )
MOV DWORD PTR DS : [StatMouse1], 0
MOV DWORD PTR DS : [StatMouse2], 0
MOV DWORD PTR DS : [StatMouse3], 0
MOV DWORD PTR DS : [StatMouse4], 0
RETN
}}
Unit* STDCALL D2GetRealItem_111(Unit* ptItem){return ptItem;} Unit* STDCALL D2GetRealItem_111(Unit* ptItem){return ptItem;}
/* 1.11 : sizememory : 0x104 (LoadBuySell) /* 1.11 : sizememory : 0x104 (LoadBuySell)
6FADA7F0 |. A1 48BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD48] 6FADA7F0 |. A1 48BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD48]
@@ -372,6 +422,14 @@ FCT_ASM ( D2LoadImage_111 )
RETN RETN
}} }}
FCT_ASM( D2LoadImage_114 )
PUSH EDX
MOV EAX, ECX
CALL V2LoadImage
POP EDX
RETN
}}
const char* D2FreeImage_FILE = __FILE__; const char* D2FreeImage_FILE = __FILE__;
FCT_ASM ( D2FreeImage_111 ) FCT_ASM ( D2FreeImage_111 )
PUSH ESI PUSH ESI
@@ -410,6 +468,20 @@ FCT_ASM ( D2GetClient_111 )
RETN 4 RETN 4
}} }}
FCT_ASM( D2SetSkillBaseLevelOnClient_114 )
PUSH EBX
PUSH EBX
PUSH ESI
PUSH DWORD PTR SS : [ESP + 0x14]
PUSH DWORD PTR SS : [ESP + 0x14]
MOV EBX, DWORD PTR SS : [ESP + 0x14]
MOV EAX, ECX
MOV ESI, EDX
CALL V2SetSkillBaseLevelOnClient
POP ESI
POP EBX
RETN 0xC
}}
FCT_ASM ( D2SetSkillBaseLevelOnClient_111 ) FCT_ASM ( D2SetSkillBaseLevelOnClient_111 )
PUSH EBX PUSH EBX
@@ -435,6 +507,24 @@ FCT_ASM ( D2GetItemStatCostBIN_111 )
JMP V2GetItemStatCostBIN JMP V2GetItemStatCostBIN
}} }}
FCT_ASM( D2SendToServer3_114 )
PUSH EDI
PUSH ESI
PUSH EBX
PUSH ECX
MOV BYTE PTR SS : [ESP], CL
MOV WORD PTR SS : [ESP + 1], DX
MOV EDI, 3
LEA ECX, DWORD PTR SS : [ESP]
PUSH ECX
CALL D2SendToServerXX
POP ECX
POP EBX
POP ESI
POP EDI
RETN
}}
FCT_ASM ( D2SendToServer3_111 ) FCT_ASM ( D2SendToServer3_111 )
PUSH EBX PUSH EBX
PUSH ECX PUSH ECX
@@ -449,6 +539,23 @@ FCT_ASM ( D2SendToServer3_111 )
RETN RETN
}} }}
FCT_ASM( D2PrintStat_114 )
PUSH ESI
PUSH EBX
PUSH ECX
MOV ESI, DWORD PTR SS : [ESP + 0x1C]
PUSH DWORD PTR SS : [ESP + 0x18]
PUSH DWORD PTR SS : [ESP + 0x18]
PUSH DWORD PTR SS : [ESP + 0x18]
PUSH EDX
PUSH ECX
CALL V2PrintStat
POP ECX
POP EBX
POP ESI
RETN 0x10
}}
FCT_ASM ( D2PrintStat_111 ) FCT_ASM ( D2PrintStat_111 )
PUSH ESI PUSH ESI
MOV ESI,DWORD PTR SS:[ESP+0x14] MOV ESI,DWORD PTR SS:[ESP+0x14]
@@ -462,6 +569,16 @@ FCT_ASM ( D2PrintStat_111 )
RETN 0x10 RETN 0x10
}} }}
FCT_ASM(D2SendPacket_114)
PUSH EDI
PUSH DWORD PTR SS : [ESP + 8]
PUSH EDX
MOV EDI, ECX
CALL V2SendPacket
POP EDI
RETN 0x4
}}
FCT_ASM ( D2SendPacket_111 ) FCT_ASM ( D2SendPacket_111 )
POP EAX POP EAX
PUSH EDX PUSH EDX
@@ -485,6 +602,13 @@ FCT_ASM ( D2CompileCubeInput_111 )
RETN 8 RETN 8
}} }}
FCT_ASM( D2CompileCubeInput_114 )
PUSH ECX
MOV EAX, EDX
CALL V2CompileCubeInput
RETN 8
}}
FCT_ASM ( D2CompileCubeOutput_111 ) FCT_ASM ( D2CompileCubeOutput_111 )
PUSH EBX PUSH EBX
MOV EBX,ECX MOV EBX,ECX
@@ -531,6 +655,22 @@ FCT_ASM ( D2SpawnMonster_111b )
RETN 0x18 RETN 0x18
}} }}
FCT_ASM( D2SpawnMonster_114 )
PUSH ECX
MOV EBX, DWORD PTR SS : [ESP + 0x18]
MOV ECX, DWORD PTR SS : [ESP + 0x14]
MOV DWORD PTR SS : [ESP + 0x18], ECX
MOV ECX, DWORD PTR SS : [ESP + 0x10]
MOV DWORD PTR SS : [ESP + 0x14], ECX
MOV ECX, DWORD PTR SS : [ESP + 0xC]
MOV DWORD PTR SS : [ESP + 0x10], ECX
MOV ECX, DWORD PTR SS : [ESP + 0x8]
MOV DWORD PTR SS : [ESP + 0xC], ECX
MOV DWORD PTR SS : [ESP + 0x8], EDX
POP ECX
JMP V2SpawnMonster
}}
FCT_ASM ( D2VerifIfNotCarry1_111 ) FCT_ASM ( D2VerifIfNotCarry1_111 )
PUSH EBX PUSH EBX
PUSH ECX PUSH ECX
@@ -578,6 +718,10 @@ FCT_ASM ( D2SendToServer_1XX )
RETN 0xC RETN 0xC
}} }}
FCT_ASM( D2GetGameByClientID_114 )
MOV ECX, DWORD PTR SS : [ESP + 0x4]
JMP V2GetGameByClientID
}}
FCT_ASM ( D2GetGameByClientID_1XX ) FCT_ASM ( D2GetGameByClientID_1XX )
POP EAX POP EAX
@@ -593,6 +737,36 @@ FCT_ASM ( D2SaveGame_1XX )
JMP V2SaveGame JMP V2SaveGame
}} }}
FCT_ASM( D2SetColorPopup_114 )
PUSH EDI
PUSH EDX
MOV EDI, ECX
CALL V2SetColorPopup
POP EDI
RETN
}}
FCT_ASM( D2LinkPortal_114 )
PUSH ECX
MOV ECX, DWORD PTR SS : [ESP + 0x8]
PUSH DWORD PTR SS : [ESP + 0x14]
PUSH DWORD PTR SS : [ESP + 0x14]
PUSH DWORD PTR SS : [ESP + 0x14]
CALL V2LinkPortal
POP ECX
RETN 0x10
}}
FCT_ASM( D2Game235C0_114 )
PUSH ECX
PUSH EDX
MOV ECX, DWORD PTR SS : [ESP + 0xC]
MOV EDX, DWORD PTR SS : [ESP + 0x10]
POP EDX
POP ECX
RETN 0x8
}}
#define SETFCTADDR(F, I, N) setFctAddr((DWORD*)&N, (HMODULE)offset_##F, (LPCSTR)I) #define SETFCTADDR(F, I, N) setFctAddr((DWORD*)&N, (HMODULE)offset_##F, (LPCSTR)I)
void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index) void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index)
{ {
@@ -607,7 +781,7 @@ void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index)
*addr = NULL; *addr = NULL;
} }
bool initD2functions() void initD2functions()
{ {
// #define D2S(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I); // #define D2S(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I);
// #define D2F(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I); // #define D2F(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I);
@@ -616,21 +790,24 @@ bool initD2functions()
#define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A); #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 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 E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A);
#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 F8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) if (version_##Z == V114d) { E2S(Z, I, 0, N, 0) } else { 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 A8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) N = (T##N)R8(Z,A,B,C,D,E,F,G,H,I);
#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); #define C8(Z, A,B,C,D,E,F,G,H,I, T, N) pt##N = (T*)R8(Z,A,B,C,D,E,F,G,H,I);
#include "../Commons/D2Funcs.h" #include "../Commons/D2Funcs.h"
SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0); //D2FogMemAlloc = (TD2FogMemAlloc)(offset_D2Game + 0xB380);
//E2S(D2Game, B380, 0, D2FogMemAlloc, 0)
//return;
SgptDataTables = *(DataTables**) R8(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0, 344304);
if (version_D2Common < V110) if (version_D2Common < V110)
{ {
D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09 D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09
D2S(D2Common,10598, ItemStatCostBIN*, D2Common10598, (DWORD itemStatCostID));//ONLY in 1.09 D2S(D2Common,10598, ItemStatCostBIN*, D2Common10598, (DWORD itemStatCostID));//ONLY in 1.09
D2S(D2Common,10673, ItemTypesBIN*, D2Common10673, (DWORD itemTypesID));//ONLY in 1.09 D2S(D2Common,10673, ItemTypesBIN*, D2Common10673, (DWORD itemTypesID));//ONLY in 1.09
} }
#undef F7 #undef F8
#undef A7 #undef A8
#undef C7 #undef C8
#undef D2S #undef D2S
#undef D2F #undef D2F
#undef E2S #undef E2S
@@ -642,7 +819,7 @@ bool initD2functions()
//setImage = version_D2Common >= V111 ? setImage_111 : setImage_1XX; //setImage = version_D2Common >= V111 ? setImage_111 : setImage_1XX;
//setFrame = version_D2Common >= V111 ? setFrame_111 : setFrame_1XX; //setFrame = version_D2Common >= V111 ? setFrame_111 : setFrame_1XX;
getDescStrPos = version_D2Common >= V110 ? getDescStrPos_10 : getDescStrPos_9; getDescStrPos = version_D2Common >= V110 ? getDescStrPos_10 : getDescStrPos_9;
compileTxtFile = version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9; compileTxtFile = version_D2Common == V114d ? compileTxtFile_114 : version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9;
//////////////// SELECT RIGHT ADDR FUNCTION //////////////// //////////////// SELECT RIGHT ADDR FUNCTION ////////////////
@@ -881,11 +1058,37 @@ bool initD2functions()
V2TestPositionInRoom = D2TestPositionInRoom; V2TestPositionInRoom = D2TestPositionInRoom;
V2GetItemTypesBIN = D2GetItemTypesBIN; V2GetItemTypesBIN = D2GetItemTypesBIN;
V2SaveGame = D2SaveGame; V2SaveGame = D2SaveGame;
V2LinkPortal = D2LinkPortal;
V2Game235C0 = D2Game235C0;
//V2OpenNPCMenu = D2OpenNPCMenu; //V2OpenNPCMenu = D2OpenNPCMenu;
//////////////// REDIRECT ON CUSTOM FUNCTIONS //////////////// //////////////// REDIRECT ON CUSTOM FUNCTIONS ////////////////
if ( version_D2Client >= V111 ) if (version_D2Client == V114d) {
{ D2GetClientPlayer = D2GetClientPlayer_111;
D2GetClient = (TD2GetClient)D2GetClient_111;
D2LoadImage = (TD2LoadImage)D2LoadImage_114;
D2FreeImage = (TD2FreeImage)D2FreeImage_111;
D2isLODGame = D2isLODGame_111;
D2GetMouseX = D2GetMouseX_111;
D2GetMouseY = D2GetMouseY_111;
D2SendToServer3 = (TD2SendToServer3)D2SendToServer3_114;
D2SetSkillBaseLevelOnClient = (TD2SetSkillBaseLevelOnClient)D2SetSkillBaseLevelOnClient_114;
D2SendPacket = (TD2SendPacket)D2SendPacket_114;
D2GetGameByClientID = (TD2GetGameByClientID)D2GetGameByClientID_1XX;
D2SpawnMonster = (TD2SpawnMonster)D2SpawnMonster_114;
D2CompileCubeInput = (TD2CompileCubeInput)D2CompileCubeInput_114;
D2CleanStatMouseUp = (TD2CleanStatMouseUp)D2CleanStatMouseUp_114;
D2LinkPortal = (TD2LinkPortal)D2LinkPortal_114;
D2Game235C0 = (TD2Game235C0)D2Game235C0_114;
D2PrintStat = (TD2PrintStat)D2PrintStat_114;
D2SaveGame = (TD2SaveGame)D2SaveGame_1XX;
D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1)D2VerifIfNotCarry1_111;
StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650);
StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654);
StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658);
StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C);
} else if ( version_D2Client >= V111 ) {
D2SendMsgToAll = (TD2SendMsgToAll) D2SendMsgToAll_111; D2SendMsgToAll = (TD2SendMsgToAll) D2SendMsgToAll_111;
D2SetColorPopup = (TD2SetColorPopup) D2SetColorPopup_111; D2SetColorPopup = (TD2SetColorPopup) D2SetColorPopup_111;
D2LoadImage = (TD2LoadImage) D2LoadImage_111; D2LoadImage = (TD2LoadImage) D2LoadImage_111;
@@ -915,10 +1118,10 @@ bool initD2functions()
D2GetClientPlayer = D2GetClientPlayer_111; D2GetClientPlayer = D2GetClientPlayer_111;
D2GetRealItem = D2GetRealItem_111; D2GetRealItem = D2GetRealItem_111;
D2CleanStatMouseUp = D2CleanStatMouseUp_111; D2CleanStatMouseUp = D2CleanStatMouseUp_111;
StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224); StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650);
StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228); StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654);
StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240); StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658);
StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244); StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C);
} else { } else {
D2SendToServer = (TD2SendToServer) D2SendToServer_1XX; D2SendToServer = (TD2SendToServer) D2SendToServer_1XX;
D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX; D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX;
@@ -948,15 +1151,14 @@ bool initD2functions()
//////////////// STRUCTURE MANAGEMENT //////////////// //////////////// STRUCTURE MANAGEMENT ////////////////
// shifting.ptPYPlayerData = V7(D2Common,118,118,F4,F4,F4,F4,F4); // 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,49)); shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V8(D2Common,5D,5D,5D,49,49,49,49,49,48));
shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14,14); shifting.ptSpecificData = V8(D2Common,70,70,14,14,14,14,14,14,14);
shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80,80); shifting.ptGame = V8(D2Common,A4,A4,80,80,80,80,80,80,80);
shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8,1A8); shifting.ptClientGame = V8(D2Common,170,194,1A8,1A8,1A8,1A8,1A8,1A8,1A8);
shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60,60); shifting.ptInventory = V8(D2Common,84,84,60,60,60,60,60,60,60);
shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8,A8); shifting.ptSkills = V8(D2Common,CC,CC,A8,A8,A8,A8,A8,A8,A8);
shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34,34); shifting.ptImage = V8(D2Common,04,04,04,08,08,3C,34,34,34);
shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00,00); shifting.ptFrame = V8(D2Common,08,08,08,44,44,40,00,00,00);
return true;
} }
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
@file D2wrapper.cpp @file D2wrapper.cpp
@brief Main Diablo II extra DLL handler. @brief Main Diablo II extra DLL handler.
@@ -29,101 +30,80 @@
#include "customLibraries.h" #include "customLibraries.h"
#include "common.h" #include "common.h"
#include "interface_Stash.h"
int version_SmackW32 = UNKNOW; int version_Game = UNKNOWN;
int version_D2Common = UNKNOW; //int version_binkw32 = UNKNOWN;
int version_ijl11 = UNKNOW; //int version_Bnclient = UNKNOWN;
int version_D2Gdi = UNKNOW; int version_D2Client = UNKNOWN;
int version_D2Win = UNKNOW; int version_D2CMP = UNKNOWN;
int version_D2sound = UNKNOW; int version_D2Common = UNKNOWN;
int version_D2MCPCLI = UNKNOW; //int version_D2DDraw = UNKNOWN;
int version_D2Launch = UNKNOW; //int version_D2Direct3D = UNKNOWN;
int version_D2gfx = UNKNOW; int version_D2Game = UNKNOWN;
int version_D2Client = UNKNOW; //int version_D2Gdi = UNKNOWN;
int version_D2Net = UNKNOW; int version_D2gfx = UNKNOWN;
int version_D2Lang = UNKNOW; //int version_D2Glide = UNKNOWN;
int version_D2Game = UNKNOW; int version_D2Lang = UNKNOWN;
int version_D2CMP = UNKNOW; int version_D2Launch = UNKNOWN;
int version_Bnclient = UNKNOW; //int version_D2MCPClient = UNKNOWN;
int version_Fog = UNKNOW; //int version_D2Multi = UNKNOWN;
int version_Storm = UNKNOW; int version_D2Net = UNKNOWN;
//int version_D2sound = UNKNOWN;
int version_D2Win = UNKNOWN;
int version_Fog = UNKNOWN;
//int version_ijl11 = UNKNOWN;
//int version_SmackW32 = UNKNOWN;
int version_Storm = UNKNOWN;
DWORD offset_Game = NULL;
DWORD offset_SmackW32 = NULL; //DWORD offset_binkw32 = NULL;
DWORD offset_D2Common = NULL; //DWORD offset_Bnclient = NULL;
DWORD offset_ijl11 = NULL;
DWORD offset_D2Gdi = NULL;
DWORD offset_D2Win = NULL;
DWORD offset_D2sound = NULL;
DWORD offset_D2Multi = NULL;
DWORD offset_D2MCPCLI = NULL;
DWORD offset_D2Launch = NULL;
DWORD offset_D2gfx = NULL;
DWORD offset_D2Game = NULL;
DWORD offset_D2Client = NULL; DWORD offset_D2Client = NULL;
DWORD offset_D2Net = NULL;
DWORD offset_D2Lang = NULL;
DWORD offset_D2CMP = NULL; DWORD offset_D2CMP = NULL;
DWORD offset_Bnclient = NULL; DWORD offset_D2Common = NULL;
//DWORD offset_D2DDraw = NULL;
//DWORD offset_D2Direct3D = NULL;
DWORD offset_D2Game = NULL;
//DWORD offset_D2Gdi = NULL;
DWORD offset_D2gfx = NULL;
//DWORD offset_D2Glide = NULL;
DWORD offset_D2Lang = NULL;
DWORD offset_D2Launch = NULL;
//DWORD offset_D2MCPClient = NULL;
//DWORD offset_D2Multi = NULL;
DWORD offset_D2Net = NULL;
//DWORD offset_D2sound = NULL;
DWORD offset_D2Win = NULL;
DWORD offset_Fog = NULL; DWORD offset_Fog = NULL;
//DWORD offset_ijl11 = NULL;
//DWORD offset_SmackW32 = NULL;
DWORD offset_Storm = NULL; DWORD offset_Storm = NULL;
// manque : Game.exe D2DDraw.dll D2Direct3D.dll D2Glide.dll
const char* S_SmackW32 = "SmackW32.dll"; const char* S_Game = "Game.exe";
const char* S_D2Common = "D2Common.dll"; //const char* S_binkw32 = "binkw32.dll";
const char* S_ijl11 = "ijl11.dll"; //const char* S_Bnclient = "Bnclient.dll";
const char* S_D2Gdi = "D2Gdi.dll";
const char* S_D2Win = "D2Win.dll";
const char* S_D2sound = "D2sound.dll";
const char* S_D2Multi = "D2Multi.dll";
const char* S_D2MCPCLI = "D2MCPClient.dll";
const char* S_D2Launch = "D2Launch.dll";
const char* S_D2gfx = "D2gfx.dll";
const char* S_D2Game = "D2Game.dll";
const char* S_D2Client = "D2Client.dll"; const char* S_D2Client = "D2Client.dll";
const char* S_D2Net = "D2Net.dll";
const char* S_D2Lang = "D2Lang.dll";
const char* S_D2CMP = "D2CMP.dll"; const char* S_D2CMP = "D2CMP.dll";
const char* S_Bnclient = "Bnclient.dll"; const char* S_D2Common = "D2Common.dll";
//const char* S_D2DDraw = "D2DDraw.dll";
//const char* S_D2Direct3D = "D2Direct3D.dll";
const char* S_D2Game = "D2Game.dll";
//const char* S_D2Gdi = "D2Gdi.dll";
const char* S_D2gfx = "D2gfx.dll";
//const char* S_D2Glide = "D2Glide.dll";
const char* S_D2Lang = "D2Lang.dll";
const char* S_D2Launch = "D2Launch.dll";
//const char* S_D2MCPClient = "D2MCPClient.dll";
//const char* S_D2Multi = "D2Multi.dll";
const char* S_D2Net = "D2Net.dll";
//const char* S_D2sound = "D2sound.dll";
const char* S_D2Win = "D2Win.dll";
const char* S_Fog = "Fog.dll"; const char* S_Fog = "Fog.dll";
//const char* S_ijl11 = "ijl11.dll";
//const char* S_SmackW32 = "SmackW32.dll";
const char* S_Storm = "Storm.dll"; const char* S_Storm = "Storm.dll";
DWORD loadLibrary( const char* libraryName)
{
DWORD offset;
/* char currentpath[MAX_PATH];
if (!strcmp(libraryName,"D2Common.dll") || !strcmp(libraryName,"D2Game.dll") || !strcmp(libraryName,"D2Client.dll"))
{
GetCurrentDirectory(MAX_PATH,currentpath);
strncat(currentpath,"\\",MAX_PATH);
strncat(currentpath,libraryName,MAX_PATH);
log_msg("Load = %s : ",currentpath);
offset = (DWORD)LoadLibrary(currentpath);
log_msg("offset = %08X\n",offset);
if (offset)
{
log_msg("%s loaded successfully at: %08X\n", libraryName, offset);
return offset;
}
}*/
offset = (DWORD)LoadLibrary(libraryName);
if (!offset)
{
log_msg("Failed to load library : %s\n", libraryName);
exit(-1);
}
log_msg("%s loaded successfully at: %08X\n", libraryName, offset);
return offset;
}
void freeLibrary( DWORD library )
{
if (library)
FreeLibrary((HINSTANCE__ *)library);
}
// Change the protection scheme of a loaded // Change the protection scheme of a loaded
// DLL called libraryName in memory space at address addr+size to allow us to customize it. // DLL called libraryName in memory space at address addr+size to allow us to customize it.
void hookLibrary(const char* libraryName, DWORD addr) void hookLibrary(const char* libraryName, DWORD addr)
@@ -152,55 +132,40 @@ void unhookLibrary(const char* libraryName, DWORD addr)
log_msg("%s successfully unhooked. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode); log_msg("%s successfully unhooked. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode);
} }
void freeLibrary( DWORD library )
void loadD2Libraries ()
{ {
log_msg("***** Load D2 Libraries *****\n"); if (library && library != offset_Game)
FreeLibrary((HMODULE)library);
offset_SmackW32 = loadLibrary( S_SmackW32); //0xD000 0x03B90000 Already Loaded -
offset_D2Common = loadLibrary( S_D2Common); //0x8D000 0x037A0000 0x7C000
offset_ijl11 = loadLibrary( S_ijl11); //0x24000 0x60000000 Already Loaded -
offset_D2Gdi = loadLibrary( S_D2Gdi); //0x7000 0x6F830000 Already Loaded -
offset_D2Win = loadLibrary( S_D2Win); //0x19000 0x6F8A0000 Already Loaded 0x1C000
offset_D2sound = loadLibrary( S_D2sound); //0xC000 0x6F980000 Already Loaded 0xD000
// offset_D2Multi = loadLibrary( S_D2Multi); //0x1000 0x6F9A0000 ?
// offset_D2MCPCLI = loadLibrary( S_D2MCPCLI); //0x6000 0x6F9F0000 Already Loaded -
offset_D2Launch = loadLibrary( S_D2Launch); //0x20000 0x6FA10000 Already Loaded 0x1E000
offset_D2gfx = loadLibrary( S_D2gfx); //0xB000 0x6FA70000 Already Loaded -
offset_D2Game = loadLibrary( S_D2Game); //0xF6000 0x6FC30000 0xCF000
offset_D2Client = loadLibrary( S_D2Client); //0xCC000 0x6FAA0000 0xCA000
offset_D2Net = loadLibrary( S_D2Net); //0x6000 0x6FC00000 Already Loaded -
offset_D2Lang = loadLibrary( S_D2Lang); //0x0A000 0x6FC10000 Already Loaded -
offset_D2CMP = loadLibrary( S_D2CMP); //0x18000 0x6FDF0000 Already Loaded 0x19000
offset_Bnclient = loadLibrary( S_Bnclient); //0x15000 0x6FF00000 Already Loaded -
offset_Fog = loadLibrary( S_Fog); //0x20000 0x6FF50000 Already Loaded 0x1F000
offset_Storm = loadLibrary( S_Storm); //0x30000 0x6FFB0000 Already Loaded -
log_msg("\n\n");
} }
void freeD2Libraries() void freeD2Libraries()
{ {
if (version_Game >= V114a)
return;
log_msg("***** Free Libraries *****\n"); log_msg("***** Free Libraries *****\n");
freeLibrary( offset_SmackW32 ); // freeLibrary( offset_binkw32 );
freeLibrary( offset_D2Common ); // freeLibrary( offset_Bnclient );
freeLibrary( offset_ijl11 );
freeLibrary( offset_D2Gdi );
freeLibrary( offset_D2Win );
freeLibrary( offset_D2sound );
// freeLibrary( offset_D2Multi );
// freeLibrary( offset_D2MCPCLI );
freeLibrary( offset_D2Launch );
freeLibrary( offset_D2gfx );
freeLibrary( offset_D2Game );
freeLibrary( offset_D2Client ); freeLibrary( offset_D2Client );
freeLibrary( offset_D2Net );
freeLibrary( offset_D2Lang );
freeLibrary( offset_D2CMP ); freeLibrary( offset_D2CMP );
freeLibrary( offset_Bnclient ); freeLibrary( offset_D2Common );
// freeLibrary( offset_D2DDraw );
// freeLibrary( offset_D2Direct3D );
freeLibrary( offset_D2Game );
// freeLibrary( offset_D2Gdi );
freeLibrary( offset_D2gfx );
// freeLibrary( offset_D2Glide );
freeLibrary( offset_D2Lang );
freeLibrary( offset_D2Launch );
// freeLibrary( offset_D2MCPClient );
// freeLibrary( offset_D2Multi );
freeLibrary( offset_D2Net );
// freeLibrary( offset_D2sound );
freeLibrary( offset_D2Win );
freeLibrary( offset_Fog ); freeLibrary( offset_Fog );
// freeLibrary( offset_ijl11 );
// freeLibrary( offset_SmackW32 );
freeLibrary( offset_Storm ); freeLibrary( offset_Storm );
log_msg("\n\n"); log_msg("\n\n");
@@ -210,16 +175,21 @@ void hookLibraries()
{ {
log_msg("***** Unprotect Libraries *****\n"); log_msg("***** Unprotect Libraries *****\n");
hookLibrary(S_D2Common, offset_D2Common); if (version_Game == V114d) {
hookLibrary(S_Game, offset_Game);
} else {
hookLibrary(S_D2Client, offset_D2Client); hookLibrary(S_D2Client, offset_D2Client);
hookLibrary(S_D2Lang, offset_D2Lang); // hookLibrary(S_D2CMP, offset_D2CMP);
hookLibrary(S_D2Common, offset_D2Common);
hookLibrary(S_D2Game, offset_D2Game); hookLibrary(S_D2Game, offset_D2Game);
hookLibrary(S_D2gfx, offset_D2gfx);
hookLibrary(S_D2Lang, offset_D2Lang);
hookLibrary(S_D2Launch, offset_D2Launch);
// hookLibrary(S_D2Net, offset_D2Net);
// hookLibrary(S_D2Win, offset_D2Win);
hookLibrary(S_Fog, offset_Fog); hookLibrary(S_Fog, offset_Fog);
hookLibrary(S_Storm, offset_Storm); hookLibrary(S_Storm, offset_Storm);
// hookLibrary(S_D2Win, offset_D2Win); }
hookLibrary(S_D2Launch, offset_D2Launch);
hookLibrary(S_D2gfx, offset_D2gfx);
// hookLibrary(S_D2Gdi, offset_D2Gdi);
log_msg("\n\n"); log_msg("\n\n");
} }
@@ -228,22 +198,30 @@ void unhookLibraries()
{ {
log_msg("***** Reprotect Libraries *****\n"); log_msg("***** Reprotect Libraries *****\n");
unhookLibrary(S_D2Common, offset_D2Common); if (version_Game == V114d) {
unhookLibrary(S_Game, offset_Game);
} else {
unhookLibrary(S_D2Client, offset_D2Client); unhookLibrary(S_D2Client, offset_D2Client);
unhookLibrary(S_D2Lang, offset_D2Lang); // unhookLibrary(S_D2CMP, offset_D2CMP);
unhookLibrary(S_D2Common, offset_D2Common);
unhookLibrary(S_D2Game, offset_D2Game); unhookLibrary(S_D2Game, offset_D2Game);
unhookLibrary(S_D2gfx, offset_D2gfx);
unhookLibrary(S_D2Lang, offset_D2Lang);
unhookLibrary(S_D2Launch, offset_D2Launch);
// unhookLibrary(S_D2Net, offset_D2Net);
// unhookLibrary(S_D2Win, offset_D2Win);
unhookLibrary(S_Fog, offset_Fog); unhookLibrary(S_Fog, offset_Fog);
unhookLibrary(S_Storm, offset_Storm); unhookLibrary(S_Storm, offset_Storm);
// unhookLibrary(S_D2Win, offset_D2Win); }
unhookLibrary(S_D2Launch, offset_D2Launch);
unhookLibrary(S_D2gfx, offset_D2gfx);
// unhookLibrary(S_D2Gdi, offset_D2Gdi);
log_msg("\n\n"); log_msg("\n\n");
} }
void freeCustomLibraries() void freeCustomLibraries()
{ {
if (!customDlls)
return;
log_msg("***** Free custom libraries *****\n"); log_msg("***** Free custom libraries *****\n");
TCustomDll* dll=customDlls; TCustomDll* dll=customDlls;
@@ -290,168 +268,151 @@ void loadCustomLibraries()
{ {
if (curString[0]) if (curString[0])
{ {
offset_currentDll = loadLibrary(curString); offset_currentDll = (DWORD)LoadLibrary(curString);
if (offset_currentDll) if (!offset_currentDll)
{ {
log_msg("Load library %s failed:\n", curString);
exit(0);
}
nextDll = customDlls; nextDll = customDlls;
customDlls = new(TCustomDll); customDlls = new(TCustomDll);
customDlls->nextDll = nextDll; customDlls->nextDll = nextDll;
customDlls->initialize(offset_currentDll); customDlls->initialize(offset_currentDll);
} }
}
curString=strtok(NULL,"|"); curString=strtok(NULL,"|");
} }
} }
if(dllFilenames) if (dllFilenames)
D2FogMemDeAlloc(dllFilenames,__FILE__,__LINE__,0); D2FogMemDeAlloc(dllFilenames, __FILE__, __LINE__, 0);
log_msg("\n\n"); log_msg("\n\n");
} }
void loadLibrary(LPCSTR libName, int* libVersion, DWORD* libOffset, int shift, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113c)
/*
void getVersion(DWORD addr, DWORD addr111, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111a, DWORD v111b, DWORD v112, DWORD v113c, DWORD v113d, const char * filename)
{ {
log_msg("version of %s\t",filename); *libOffset = (DWORD)LoadLibrary(libName);
if (*libOffset == NULL)
if (addr==v109b) { {
*ver = V109b; log_msg("Failed to load library : %s\n", libName);
log_msg("1.09b\n"); exit(-1);
} else if (addr==v109d) {
*ver = V109d;
log_msg("1.09d\n");
} else if (addr==v110) {
*ver = V110;
log_msg("1.10\n");
} else if ((addr==v111) && (addr111==v111a)) {
*ver = V111;
log_msg("1.11\n");
} else if ((addr==v111) && (addr111==v111b)) {
*ver = V111b;
log_msg("1.11b\n");
} else if (addr==v112) {
*ver = V112;
log_msg("1.12\n");
} else if (addr==v113c) {
*ver = V113c;
log_msg("1.13c\n");
} else if (addr==v113d) {
*ver = V113d;
log_msg("1.13d\n");
} else {
*ver = V113d;
log_msg("unknow, try with 1.13d\n");
} }
} log_msg("%s loaded at:\t%08X (", libName, *libOffset);
#define GET_VERSION(F,X,Y,A,B,C,D,E,G,H,I) getVersion(*(DWORD*)(offset_##F + 0x##X), *(DWORD*)(offset_##F + 0x##Y), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, 0x##I, S_##F)
bool initD2version()
{
log_msg("***** Get dll versions *****\n");
DWORD addr = *(DWORD*)(*libOffset + shift);
//GET_VERSION(SmackW32 if (version_Game != UNKNOWN && (version_Game <= V108 || version_Game >= V113d))
GET_VERSION(D2Common, 80, 108, B03A26A0, 9E3DE7CC, 0355C185, 8402CA7A, 42E6C2E5, 43028BA5, E58C71DA, 00000000); *libVersion = version_Game;
//GET_VERSION(ijl11 else if (addr==v109b)
GET_VERSION(D2Gdi, 80, 108, 90CFD95A, 86CE337B, A8CCC67B, 06059D7D, 42E6C248, 43028B2F, 5D6490A2, 00000000); *libVersion = V109b;
GET_VERSION(D2Win, 80, 108, B595A0CD, 1995DAD2, A8F5E2FD, B6DAB75A, 42E6C266, 43028B44, 6AA01FF5, 00000000); else if (addr==v109d)
//GET_VERSION(D2sound *libVersion = V109d;
//GET_VERSION(D2MCPCLI else if (addr==v110)
GET_VERSION(D2Launch, 80, 100, A66532FF, 66678CC5, 686223E5, 80B0E2C6, 42E6C275, 43028B50, 205A4C0F, 00000000); *libVersion = V110;
GET_VERSION(D2gfx, 80, 110, 00949FA8, 018866A8, 401526B2, 575C8A5E, 42E6C22A, 43028B19, ACBE1B9E, 00000000); else if (addr==v111)
GET_VERSION(D2Client, 80, 108, 03522F39, 6730B639, C9817825, 37EC6E13, 42E6C43F, 43028CA5, 61A3B3D5, 00000000); *libVersion = V111;
GET_VERSION(D2Net, 80, 0F0, E60F4DEA, 940E178B, 890FCC0B, C293A9D5, 42E6C20D, 43028B05, 19FA9F76, 00000000); else if (addr==v111b)
GET_VERSION(D2Lang, 80, 0F8, 111DCCB7, 13978953, DF917353, B91BAEA2, 42E6C213, 43028B09, B7B3978E, 00000000); *libVersion = V111b;
GET_VERSION(D2Game, 80, 108, B0805792, 8BB2C392, 92FA18E6, 00B6F7B7, 42E6C375, 43028C0D, BD8DD8E5, 00000000); else if (addr==v112)
GET_VERSION(D2CMP, 80, 0F8, BA755486, 9A77DFEE, 38F44382, 4059B13F, 42E6C203, 43028AFE, 33A9427B, 00000000); *libVersion = V112;
//GET_VERSION(Bnclient else if (addr==v113c)
GET_VERSION(Fog, 80, 100, 6F16123B, 75990846, 7E7ED3C7, D333B997, 42E6C1F0, 43028AF2, D3BD4F1B, 00000000); *libVersion = V113c;
GET_VERSION(Storm, E0, 110, 3B4B41D8, 3B8AB1CE, 00004550, 9C2BECC4, 42E6C1CA, 43028AD9, E4FA2944, 00000000); else {
*libVersion = version_Game != UNKNOWN ? version_Game : V113d;
log_msg("\n\n"); log_msg("unknown, try with ");
return true;
}
*/
void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113c, int version, const char * filename)
{
log_msg("version of %s\t", filename);
if (version >= V113d) {
*ver = version;
log_msg("%s\n", GetVersionString(version));
} else if (addr==v109b) {
*ver = V109b;
log_msg("1.09b\n");
} else if (addr==v109d) {
*ver = V109d;
log_msg("1.09d\n");
} else if (addr==v110) {
*ver = V110;
log_msg("1.10\n");
} else if (addr==v111) {
*ver = V111;
log_msg("1.11\n");
} else if (addr==v111b) {
*ver = V111b;
log_msg("1.11b\n");
} else if (addr==v112) {
*ver = V112;
log_msg("1.12\n");
} else if (addr==v113c) {
*ver = V113c;
log_msg("1.13c\n");
} else {
*ver = V113d;
log_msg("unknow, try with 1.13d\n");
} }
log_msg("%s)\n", GetVersionString(*libVersion));
} }
#define GET_VERSION(F,X,A,B,C,D,E,G,H,V) getVersion(*(DWORD*)(offset_##F + 0x##X), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, V, S_##F)
bool initD2version() #define GET_VERSION(F,S,A,B,C,D,E,G,H) loadLibrary(S_##F, &version_##F, &offset_##F, 0x##S, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H)
void initD2modules()
{ {
log_msg("***** Get Game.exe version *****\n"); log_msg("***** Get D2 Modules address and version *****\n");
int version = GetD2Version(); offset_Game = (DWORD)GetModuleHandle(NULL);
log_msg("Game.exe version : %i (%s)\n", version, GetVersionString(version)); version_Game = GetD2Version((HMODULE)offset_Game);
log_msg("Game.exe loaded at:\t%08X (%s)\n", offset_Game, GetVersionString(version_Game));
log_msg("***** Get dll versions *****\n"); if (version_Game >= V114a)
{
//GET_VERSION(SmackW32 // offset_Bnclient = offset_Game; version_Bnclient = version_Game;
GET_VERSION(D2Common, 10CA, A1E86FDC, B1E86FDC, 72D03B42, F883057E, 16746AC6, 00FE81C3, 74FE85DB, version); offset_D2Client = offset_Game; version_D2Client = version_Game;
//GET_VERSION(ijl11 offset_D2CMP = offset_Game; version_D2CMP = version_Game;
GET_VERSION(D2Gdi, 105, B4000000, 0B210E00, E4000000, 48000401, 2F000401, 00000000, B7000401, version); offset_D2Common = offset_Game; version_D2Common = version_Game;
GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8, version); // offset_D2DDraw = offset_Game; version_D2DDraw = version_Game;
//GET_VERSION(D2sound // offset_D2Direct3D = offset_Game; version_D2Direct3D = version_Game;
//GET_VERSION(D2MCPCLI offset_D2Game = offset_Game; version_D2Game = version_Game;
GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045, version); // offset_D2Gdi = offset_Game; version_D2Gdi = version_Game;
GET_VERSION(D2gfx, 10D, EB000000, 006FA700, 00000010, 2A000401, 19000401, 0B210E00, 00000000, version); offset_D2gfx = offset_Game; version_D2gfx = version_Game;
GET_VERSION(D2Client, 17F, 00000000, 14500000, 12500000, 0D814800, 0D812800, 0DA01000, 0DA03000, version); // offset_D2Glide = offset_Game; version_D2Glide = version_Game;
GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808, version); offset_D2Lang = offset_Game; version_D2Lang = version_Game;
GET_VERSION(D2Lang, 126D, FC45048B, F445048B, 02C18313, C4830000, 00C6E045, 8B48408B, 0C75FF0C, version); offset_D2Launch = offset_Game; version_D2Launch = version_Game;
// GET_VERSION(D2Game, 1010, D22A78A1, D22910A1, D43FB0A1, 03E8506F, 53E8506F, 89E8506F, 63E8506F, version); // offset_D2MCPClient = offset_Game; version_D2MCPClient = version_Game;
GET_VERSION(D2Game, 1092, 18968BF1, 38968BF1, 28968BF1, F6335608, C690C5B9, 895FD713, 56535700, version); // offset_D2Multi = offset_Game; version_D2Multi = version_Game;
GET_VERSION(D2CMP, 1359, 3C686FE0, 38686FE0, 8BF78B56, 4C880424, 07C71824, CCCCCCCC, C7000005, version); offset_D2Net = offset_Game; version_D2Net = version_Game;
//GET_VERSION(Bnclient // offset_D2sound = offset_Game; version_D2sound = version_Game;
GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95, version); offset_D2Win = offset_Game; version_D2Win = version_Game;
GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404, version); offset_Fog = offset_Game; version_Fog = version_Game;
offset_Storm = offset_Game; version_Storm = version_Game;
}
else
{
// GET_VERSION(Bnclient //0x15000 0x6FF00000 Already Loaded -
GET_VERSION(D2Client, 17F, 00000000, 14500000, 12500000, 0D814800, 0D812800, 0DA01000, 0DA03000); //0xCC000 0x6FAA0000 0xCA000
GET_VERSION(D2CMP, 1359, 3C686FE0, 38686FE0, 8BF78B56, 4C880424, 07C71824, CCCCCCCC, C7000005); //0x18000 0x6FDF0000 Already Loaded 0x19000
GET_VERSION(D2Common, 10CA, A1E86FDC, B1E86FDC, 72D03B42, F883057E, 16746AC6, 00FE81C3, 74FE85DB); //0x8D000 0x037A0000 0x7C000
// GET_VERSION(D2DDraw 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //
// GET_VERSION(D2Direct3D 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //
// GET_VERSION(D2Game, 1010, D22A78A1, D22910A1, D43FB0A1, 03E8506F, 53E8506F, 89E8506F, 63E8506F); //0xF6000 0x6FC30000 0xCF000
GET_VERSION(D2Game, 1092, 18968BF1, 38968BF1, 28968BF1, F6335608, C690C5B9, 895FD713, 56535700); //0xF6000 0x6FC30000 0xCF000
// GET_VERSION(D2Gdi, 105, B4000000, 0B210E00, E4000000, 48000401, 2F000401, 00000000, B7000401); //0x7000 0x6F830000 Already Loaded -
GET_VERSION(D2gfx, 10D, EB000000, 006FA700, 00000010, 2A000401, 19000401, 0B210E00, 00000000); //0xB000 0x6FA70000 Already Loaded -
// GET_VERSION(D2Glide 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //
GET_VERSION(D2Lang, 126D, FC45048B, F445048B, 02C18313, C4830000, 00C6E045, 8B48408B, 0C75FF0C); //0x0A000 0x6FC10000 Already Loaded -
GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045); //0x20000 0x6FA10000 Already Loaded 0x1E000
// GET_VERSION(D2MCPClient 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x6000 0x6F9F0000 Already Loaded -
// GET_VERSION(D2Multi 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x1000 0x6F9A0000 ?
GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded -
// GET_VERSION(D2sound 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xC000 0x6F980000 Already Loaded 0xD000
GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8); //0x19000 0x6F8A0000 Already Loaded 0x1C000
GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95); //0x20000 0x6FF50000 Already Loaded 0x1F000
GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404); //0x30000 0x6FFB0000 Already Loaded -
if (version_Game == UNKNOWN)
version_Game = version_D2gfx;
}
// GET_VERSION(binkw32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //
// GET_VERSION(ijl11 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x24000 0x60000000 Already Loaded -
// GET_VERSION(SmackW32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xD000 0x03B90000 Already Loaded -
log_msg("\n\n"); log_msg("\n\n");
return true;
} }
//////////////////////////////////// EXPORTS FUNCTIONS //////////////////////////////////// //////////////////////////////////// EXPORTS FUNCTIONS ////////////////////////////////////
extern "C" __declspec(dllexport) bool __stdcall Release()
{
log_msg("\n***** ENDING DIABLO II *****\n\n" );
freeCustomLibraries();
freeD2Libraries();
return true;
}
extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
{ {
if (IniName) log_msg("* PlugY is called from D2mod.dll\n\n"); if (IniName) log_msg("* PlugY is called from D2mod.dll\n\n");
else log_msg("* PlugY is called from D2gfx.dll\n\n");
static int isInstalled = false; static int isInstalled = false;
if (isInstalled) return NULL; if (isInstalled) return NULL;
isInstalled=true; isInstalled=true;
loadD2Libraries(); initD2modules();
if (!initD2version()) return NULL; if (version_Game < V109 || version_Game > V114d)
{
log_box("PlugY isn't compatible with this version : %s", GetVersionString(version_Game));
Release();
exit(0);
}
if (!initD2functions()) return NULL; initD2functions();
loadParameters(); loadParameters();
@@ -539,6 +500,9 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
if (active_EnabledCowPortalWhenCowKingWasKill) if (active_EnabledCowPortalWhenCowKingWasKill)
Install_EnabledCowPortalWhenCowKingWasKill(); Install_EnabledCowPortalWhenCowKingWasKill();
if (active_DoNotCloseNihlathakPortal)
Install_DoNotCloseNihlathakPortal();
log_msg("\nDLL patched sucessfully.\n\n\n"); log_msg("\nDLL patched sucessfully.\n\n\n");
unhookLibraries(); unhookLibraries();
@@ -554,15 +518,4 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
return NULL; return NULL;
} }
extern "C" __declspec(dllexport) bool __stdcall Release()
{
log_msg("\n***** ENDING DIABLO II *****\n\n" );
freeCustomLibraries();
freeD2Libraries();
return true;
}
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -26,7 +26,7 @@ void log_initfile()
_getcwd( log_file, MAX_PATH ); _getcwd( log_file, MAX_PATH );
if( log_file[strlen(log_file)] != '\\') if( log_file[strlen(log_file)] != '\\')
strcat(log_file, "\\"); strcat(log_file, "\\");
strcat(log_file, LOG_FILE); strcat(log_file, "PlugY.log");
FILE* lLog = fopen( log_file, "w" ); FILE* lLog = fopen( log_file, "w" );

View File

@@ -8,6 +8,7 @@
#include "extendedSaveFile.h" #include "extendedSaveFile.h"
#include "infinityStash.h" #include "infinityStash.h"
#include "customLibraries.h" #include "customLibraries.h"
#include "extraOptions.h"
#include "common.h" #include "common.h"
#include <stdio.h> #include <stdio.h>
@@ -44,7 +45,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
*size = 14; *size = 14;
*((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM" *((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM"
*((WORD *)&data[4]) = FILE_VERSION; *((WORD *)&data[4]) = FILE_VERSION;
*((DWORD*)&data[6]) = 0;// not used *((DWORD*)&data[6]) = nbPlayersCommandByDefault - 1;
*((DWORD*)&data[10]) = 0;// number of stash *((DWORD*)&data[10]) = 0;// number of stash
TCustomDll* currentDll = customDlls; TCustomDll* currentDll = customDlls;
@@ -58,8 +59,6 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
} }
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
{ {
if (!ptChar || !PCPY || !data) return 0; if (!ptChar || !PCPY || !data) return 0;
@@ -81,7 +80,9 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
return 9; return 9;
} }
curSize += 2; curSize += 2;
curSize += 4; nbPlayersCommand = (*(BYTE*)&data[curSize]) + 1;
curSize += 1;
curSize += 3;
int ret = loadStashList(ptChar, data, maxSize, &curSize, false); int ret = loadStashList(ptChar, data, maxSize, &curSize, false);
@@ -92,6 +93,7 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
currentDll=currentDll->nextDll; currentDll=currentDll->nextDll;
} }
PCPY->selfStashIsOpened = true; PCPY->selfStashIsOpened = true;
return ret; return ret;
} }
@@ -149,7 +151,7 @@ void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curS
*curSize += 4; *curSize += 4;
*(WORD *)(*data + *curSize) = FILE_VERSION; *(WORD *)(*data + *curSize) = FILE_VERSION;
*curSize += 2; *curSize += 2;
*(DWORD *)(*data + *curSize) = 0; *(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand - 1);
*curSize += 4; *curSize += 4;
saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize); saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize);

View File

@@ -1,16 +1,19 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
More little options. More little options.
=================================================================*/ =================================================================*/
#include "common.h" #include "common.h"
#include "skillsPoints.h"
#include <stdio.h> #include <stdio.h>
int active_DisplayItemLevel = false; int active_DisplayItemLevel = false;
DWORD nbPlayersCommandByDefault = 0; DWORD nbPlayersCommandByDefault = 0;
DWORD nbPlayersCommand = 0;
int active_alwaysRegenMapInSP = false; int active_alwaysRegenMapInSP = false;
int active_RunLODs = false; int active_RunLODs = false;
int active_AlwaysDisplayLifeMana = false; int active_AlwaysDisplayLifeMana = false;
@@ -18,6 +21,7 @@ int active_EnabledTXTFilesWithMSExcel = false;
int active_DisplayBaseStatsValue = false; int active_DisplayBaseStatsValue = false;
int active_LadderRunewords = false; int active_LadderRunewords = false;
int active_EnabledCowPortalWhenCowKingWasKill = false; int active_EnabledCowPortalWhenCowKingWasKill = false;
int active_DoNotCloseNihlathakPortal = false;
/****************************************************************************************************/ /****************************************************************************************************/
@@ -30,6 +34,22 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem)
wcscat(popup,text); wcscat(popup,text);
} }
FCT_ASM( caller_displayItemlevel_114 )
PUSH ECX
PUSH EAX
PUSH EDI
PUSH ECX
LEA EAX, DWORD PTR SS : [EBP - 0x2434]
PUSH EAX
CALL displayItemlevel
POP EDI
POP EAX
POP ECX
POP EDX
PUSH 0x100
JMP EDX
}}
FCT_ASM ( caller_displayItemlevel_113 ) FCT_ASM ( caller_displayItemlevel_113 )
PUSH ECX PUSH ECX
PUSH EAX PUSH EAX
@@ -58,6 +78,22 @@ FCT_ASM ( caller_displayItemlevel_111 )
JMP EAX JMP EAX
}} }}
FCT_ASM( caller_displayItemlevelSet_114 )
PUSH ECX
PUSH EAX
PUSH EDI
PUSH ECX
LEA EAX, DWORD PTR SS : [EBP - 0x2138]
PUSH EAX
CALL displayItemlevel
POP EDI
POP EAX
POP ECX
POP EDX
PUSH 0x100
JMP EDX
}}
FCT_ASM ( caller_displayItemlevelSet_111 ) FCT_ASM ( caller_displayItemlevelSet_111 )
PUSH ECX PUSH ECX
PUSH EDX PUSH EDX
@@ -135,12 +171,12 @@ void Install_DisplayItemLevel()
static int isInstalled = false; static int isInstalled = false;
if (isInstalled) return; if (isInstalled) return;
log_msg("Patch D2Client for display item popup. (DisplayPopup)\n"); log_msg("Patch D2Client to display item popup. (DisplayPopup)\n");
// print the text in the final buffer // print the text in the final buffer
mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590); mem_seek R8(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590, 8E983);
memt_byte( 0x68 , 0xE8); memt_byte( 0x68 , 0xE8);
MEMT_REF4( 0x100, version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevel_114 : 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 //6FAE38A1 . 68 00010000 PUSH 100
//6FB5DD0A |. 68 00010000 PUSH 100 //6FB5DD0A |. 68 00010000 PUSH 100
//6FB289DA |. 68 00010000 PUSH 100 //6FB289DA |. 68 00010000 PUSH 100
@@ -149,9 +185,9 @@ void Install_DisplayItemLevel()
//6FB48590 |. 68 00010000 PUSH 100 //6FB48590 |. 68 00010000 PUSH 100
// print the text in the final buffer (for set items) // print the text in the final buffer (for set items)
mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3); mem_seek R8(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3, 8D774);
memt_byte( 0x68 , 0xE8); memt_byte( 0x68 , 0xE8);
MEMT_REF4( 0x100, version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9); MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevelSet_114 : version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9);
//6FAE27BE . 68 00010000 PUSH 100 //6FAE27BE . 68 00010000 PUSH 100
//6FB5C773 |. 68 00010000 PUSH 100 //6FB5C773 |. 68 00010000 PUSH 100
//6FB27773 |. 68 00010000 PUSH 100 //6FB27773 |. 68 00010000 PUSH 100
@@ -185,15 +221,16 @@ void SendPlayersCommand()
DWORD info = *infoEnabledSendPlayersCommand; DWORD info = *infoEnabledSendPlayersCommand;
if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return; if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return;
log_msg("SendPlayersCommand %u\n", nbPlayersCommand);
D2SetNbPlayers(nbPlayersCommandByDefault); D2SetNbPlayers(nbPlayersCommand);
memset(&data,0,sizeof(data)); memset(&data,0,sizeof(data));
data.displayType=0x15; data.displayType=0x15;
data.un=1; data.un=1;
data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10 data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10
data.null=NULL; data.null=NULL;
sprintf(data.string, msgNBPlayersString, nbPlayersCommandByDefault); sprintf(data.string, msgNBPlayersString, nbPlayersCommand);
D2SendMsgToAll((BYTE*)&data); D2SendMsgToAll((BYTE*)&data);
} }
@@ -209,13 +246,18 @@ void Install_SendPlayersCommand()
log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n"); log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n");
infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC); infoEnabledSendPlayersCommand = (DWORD*)R8(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC, 3A0610);
if ( version_D2Client >= V110 ) if ( version_D2Client >= V110 )
msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C); msgNBPlayersString = (char*)R8(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C, 2D7374);
// Set nb Player to default // Set nb Player to default
mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2);//6FB1C7B7-6FAA0000 mem_seek R8(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2, 56EF9);//6FB1C7B7-6FAA0000
MEMJ_REF4( D2GetResolution , caller_SendPlayersCommand); if (version_D2Client == V114d) {
MEMT_REF4(0x0009E263, caller_SendPlayersCommand);
}
else {
MEMJ_REF4(D2GetResolution, caller_SendPlayersCommand);
}
//6FB2723A |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005> //6FB2723A |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
//6FB265BA |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005> //6FB265BA |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
//6FB21B8A . E8 4F9C0400 CALL <JMP.&D2gfx.#10005> //6FB21B8A . E8 4F9C0400 CALL <JMP.&D2gfx.#10005>
@@ -241,7 +283,7 @@ void Install_AlwaysRegenMapInSP()
log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n"); log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n");
// Always regenerate maps in Single player // Always regenerate maps in Single player
mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E); mem_seek R8(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E, 16A20F);
memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368 memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368
//6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93 //6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93
//01FE235D |. 74 09 JE SHORT D2Game.01FE2368 //01FE235D |. 74 09 JE SHORT D2Game.01FE2368
@@ -265,7 +307,7 @@ void Install_RunLODs()
log_msg("Patch D2gfx for launch any number of Diablo II game in the same computer. (RunLODs)\n"); 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 // execute if it's our packet else continue
mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF, B6B0); mem_seek R8(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF, B6B0, F562B);
memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6 memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6
//6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6 //6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6
//6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996 //6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996
@@ -279,6 +321,17 @@ void Install_RunLODs()
/****************************************************************************************************/ /****************************************************************************************************/
FCT_ASM(caller_AlwaysDisplayLife_114)
CMP onRealm, 0
JNZ normalDisplayLife
CMP active_AlwaysDisplayLifeMana, 0
JE normalDisplayLife
CMP EAX, 0x1
RETN
normalDisplayLife :
CMP DWORD PTR DS : [0x7BEFDC], EAX
RETN
}}
FCT_ASM (caller_AlwaysDisplayLife_113) FCT_ASM (caller_AlwaysDisplayLife_113)
POP EAX POP EAX
@@ -324,7 +377,18 @@ normalDisplayLife:
RETN RETN
}} }}
FCT_ASM( caller_AlwaysDisplayMana_114 )
CMP onRealm, 0
JNZ normalDisplayMana
CMP active_AlwaysDisplayLifeMana, 0
JE normalDisplayMana
POP EAX
ADD EAX, 0x32
JMP EAX
normalDisplayMana :
CMP DWORD PTR DS : [0x7BEFE0], 0
RETN
}}
FCT_ASM (caller_AlwaysDisplayMana_113) FCT_ASM (caller_AlwaysDisplayMana_113)
MOV EAX,DWORD PTR DS:[ptResolutionY] MOV EAX,DWORD PTR DS:[ptResolutionY]
@@ -384,10 +448,13 @@ void Install_AlwaysDisplayLifeMana()
if (isInstalled) return; if (isInstalled) return;
log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n"); log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n");
if (version_D2Client == V114d) {
if ( version_D2Client >= V113c ) mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 98146);
{ memt_byte(0x39, 0xE8);
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA); MEMT_REF4(0x7BEFDC05, caller_AlwaysDisplayLife_114);
memt_byte(0x00, 0x90);
} else if ( version_D2Client >= V113c ) {
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 6D6FA);
memt_byte( 0x0F , 0x90); memt_byte( 0x0F , 0x90);
memt_byte( 0x8C , 0xE8); memt_byte( 0x8C , 0xE8);
MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113); MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113);
@@ -400,7 +467,7 @@ void Install_AlwaysDisplayLifeMana()
//6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1 //6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1
} else { } else {
// Always display life. // Always display life.
mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000); mem_seek R8(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000, 0000);
memt_byte( 0xA1 , 0xE8); memt_byte( 0xA1 , 0xE8);
MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife); MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife);
//6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60] //6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60]
@@ -408,15 +475,19 @@ void Install_AlwaysDisplayLifeMana()
//6FB31733 |. A1 E4C6B86F MOV EAX,DWORD PTR DS:[6FB8C6E4] //6FB31733 |. A1 E4C6B86F MOV EAX,DWORD PTR DS:[6FB8C6E4]
} }
// Always display mana. // Always display mana.
if ( version_D2Client >= V113c ) if (version_D2Client == V114d) {
{ mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 9824E);
memt_byte(0x83, 0xE8);
MEMT_REF4(0x7BEFE03D, caller_AlwaysDisplayMana_114);
memt_byte(0x00, 0x90);
memt_byte(0x00, 0x90);
} else if ( version_D2Client >= V113c ) {
//mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711); //mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711);
//memt_byte( 0x8B , 0x90); //memt_byte( 0x8B , 0x90);
//memt_byte( 0x0D , 0xE8); //memt_byte( 0x0D , 0xE8);
//MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113); //MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113);
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC); mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 00000);
memt_byte( 0xA1 , 0xE8); memt_byte( 0xA1 , 0xE8);
MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113); MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113);
//6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] //6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
@@ -434,7 +505,7 @@ void Install_AlwaysDisplayLifeMana()
} }
else if ( version_D2Client >= V110 ) else if ( version_D2Client >= V110 )
{ {
mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000, 0000); mem_seek R8(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000, 0000, 0000);
memt_byte( 0x5F , 0xE8); memt_byte( 0x5F , 0xE8);
MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana); MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana);
memt_byte( 0xC4 , 0x90); // NOP memt_byte( 0xC4 , 0x90); // NOP
@@ -459,7 +530,7 @@ void Install_AlwaysDisplayLifeMana()
//6FB3181F |. 81C4 5C020000 ADD ESP,25C //6FB3181F |. 81C4 5C020000 ADD ESP,25C
//6FB31825 |. C3 RETN //6FB31825 |. C3 RETN
} else { } else {
mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0xE9 , 0xE8); memt_byte( 0xE9 , 0xE8);
MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9); MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9);
//6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0 //6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0
@@ -482,7 +553,7 @@ void Install_EnabledTXTFilesWithMSExcel()
log_msg("Patch D2Client for enabled the opening of files already opened by MS Excel. (EnabledTXTFilesWithMSExcel)\n"); log_msg("Patch D2Client for enabled the opening of files already opened by MS Excel. (EnabledTXTFilesWithMSExcel)\n");
mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm >= V111 ? 0x12A : 0xFF) ); mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm == V114d ? 0xB4 : version_Storm >= V111 ? 0x12A : 0xFF) );
memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
//6FC1C969 |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ //6FC1C969 |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ
@@ -542,22 +613,26 @@ void Install_DisplayBaseStatsValue()
if (isInstalled) return; if (isInstalled) return;
log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n"); log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n");
if (version_D2Client == V114d) goto jump;
// Always print stat button images. // Always print stat button images.
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, BF955);
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 13) );
memt_byte( 0x24, 0x90 ); // NOP memt_byte( 0x24, 0x90 ); // NOP
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB3963A > 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] //6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB6D1B5 |> 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] //6FB6F955 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
jump:
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C);
MEMJ_REF4( D2PrintImage, caller_displayBaseStatsValue); if (version_D2Client == V114d) {
MEMT_REF4(0x0004E3F0, caller_displayBaseStatsValue);
} else {
MEMJ_REF4(D2PrintImage, caller_displayBaseStatsValue);
}
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047> //6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044> //6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024> //6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
@@ -575,8 +650,9 @@ void Install_DisplayBaseStatsValue()
RunesBIN* STDCALL compileRunesTxt(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) RunesBIN* STDCALL compileRunesTxt(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
{ {
RunesBIN* ptRunesBin = (RunesBIN*)D2CompileTxtFile(unused, filename, ptFields, ptRecordCount, recordLength); RunesBIN* ptRunesBin = (RunesBIN*)D2CompileTxtFile(unused, filename, ptFields, ptRecordCount, recordLength);
for (DWORD i=0; i < *ptRecordCount; i++) for (DWORD i = 0; i < *ptRecordCount; i++) {
ptRunesBin[i].Server=0; ptRunesBin[i].Server = 0;
}
return ptRunesBin; return ptRunesBin;
} }
@@ -590,8 +666,12 @@ void Install_LadderRunewords()
log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n"); log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n");
mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782); mem_seek R8(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782, 239C40);
MEMC_REF4( D2CompileTxtFile, compileRunesTxt); if (version_D2Common == V114d) {
MEMT_REF4(0xFFFD86AC, compileRunesTxt);
} else {
MEMC_REF4(D2CompileTxtFile, compileRunesTxt);
}
//01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578 //01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578
//6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653 //6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653
//6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496 //6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496
@@ -615,7 +695,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"); 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, EBE8); mem_seek R8(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508, EBE8, 194179);
memt_byte( 0x85 , 0x33); // XOR EAX,EAX memt_byte( 0x85 , 0x33); // XOR EAX,EAX
//6FC8DFF7 . 85C0 TEST EAX,EAX //6FC8DFF7 . 85C0 TEST EAX,EAX
//6FC8E457 . 85C0 TEST EAX,EAX //6FC8E457 . 85C0 TEST EAX,EAX
@@ -631,4 +711,23 @@ void Install_EnabledCowPortalWhenCowKingWasKill()
isInstalled = true; isInstalled = true;
} }
/****************************************************************************************************/
void Install_DoNotCloseNihlathakPortal()
{
static int isInstalled = false;
if (version_D2Game < V114d || isInstalled) return;
log_msg("Patch D2Game to not close Nihlathak's portal. (DoNotCloseNihlathakPortal)\n");
mem_seek R8(D2Game, 0, 0, 0, 0, 0, 0, 0, 0, 18B9D7);
memt_byte(0x0F, 0x90);
memt_byte(0x85, 0x90);
memt_dword(0x000000C5, 0x90909090);
log_msg("\n");
isInstalled = true;
}
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Updating server. Updating server.
@@ -27,6 +28,21 @@ void STDCALL BtnPress()
previouslyOnRealm = onRealm; previouslyOnRealm = onRealm;
} }
FCT_ASM( caller_BnetBtnPress114 )
CMP active_DisableBattleNet, 1
JE disableBattleNet
MOV onRealm, 1
PUSH EAX
CALL BtnPress
POP EAX
SUB ESP, 0x3FC//400
JMP DWORD PTR SS : [ESP + 0x3FC]
disableBattleNet :
POP EAX
POP EAX
RETN
}}
FCT_ASM ( caller_BnetBtnPress ) FCT_ASM ( caller_BnetBtnPress )
CMP active_DisableBattleNet,1 CMP active_DisableBattleNet,1
JE disableBattleNet JE disableBattleNet
@@ -49,6 +65,17 @@ FCT_ASM ( caller_MultiPlayerBtnPress )
}} }}
*/ */
FCT_ASM( caller_TCPIPBtnPress114 )
MOV onRealm, 0
PUSH EAX
PUSH EDX
CALL BtnPress
POP EDX
POP EAX
MOV ECX, 0x006D39BC
RETN
}}
FCT_ASM ( caller_TCPIPBtnPress111 ) FCT_ASM ( caller_TCPIPBtnPress111 )
MOV onRealm,0 MOV onRealm,0
CALL BtnPress CALL BtnPress
@@ -99,9 +126,9 @@ void Install_VariableOnRealm()
log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n"); log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n");
// click on Battle.net button // click on Battle.net button
mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295, 11C65); mem_seek R8(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295, 11C65, 3533B);
memt_byte( 0x81, 0xE8 ); // CALL memt_byte( 0x81, 0xE8 ); // CALL
MEMT_REF4( 0x000400EC, caller_BnetBtnPress); MEMT_REF4( 0x000400EC, version_D2Launch == V114d ? caller_BnetBtnPress114 : caller_BnetBtnPress);
memt_byte( 0x00, 0x90 ); // NOP memt_byte( 0x00, 0x90 ); // NOP
//6FA529E5 . 81EC 00040000 SUB ESP,400 //6FA529E5 . 81EC 00040000 SUB ESP,400
@@ -112,11 +139,14 @@ void Install_VariableOnRealm()
//6FA1EFFC . B8 01000000 MOV EAX,1 //6FA1EFFC . B8 01000000 MOV EAX,1
// click on TCP/IP button // click on TCP/IP button
mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E); mem_seek R8(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E, 2FFFA);
if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110) if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110)
{ {
memt_byte( 0xBD, 0xE8 ); // CALL memt_byte( 0xBD, 0xE8 ); // CALL
MEMT_REF4( 0x00000001, caller_TCPIPBtnPress); MEMT_REF4( 0x00000001, caller_TCPIPBtnPress);
} else if (version_D2Launch == V114d) {
memt_byte(0xB9, 0xE8);
MEMT_REF4(0x006D39BC, caller_TCPIPBtnPress114);
} else { } else {
memt_byte( 0xBE, 0xE8 ); // CALL memt_byte( 0xBE, 0xE8 ); // CALL
MEMT_REF4( 0x00000040, caller_TCPIPBtnPress111); MEMT_REF4( 0x00000040, caller_TCPIPBtnPress111);
@@ -124,7 +154,7 @@ void Install_VariableOnRealm()
} }
// click on SinglePlayer button // click on SinglePlayer button
mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36, A906); mem_seek R8(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36, A906, 30BC9);
memt_byte( 0xBA, 0xE8 ); // CALL memt_byte( 0xBA, 0xE8 ); // CALL
MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress); MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress);
//6FA4B726 . BA 00040000 MOV EDX,400 //6FA4B726 . BA 00040000 MOV EDX,400
@@ -133,7 +163,7 @@ void Install_VariableOnRealm()
{ {
log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n"); log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n");
//Bug crash ptClient search fix (for Megalixir Mod). //Bug crash ptClient search fix (for Megalixir Mod).
mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x39 ,0xE8); memt_byte( 0x39 ,0xE8);
MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug); MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug);
memt_byte( 0xC1 ,0x90); memt_byte( 0xC1 ,0x90);

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Gestion of the infinity and shared Stash. Gestion of the infinity and shared Stash.
@@ -289,6 +290,8 @@ DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, boo
DWORD nbStash = *(DWORD*)&data[*curSize]; DWORD nbStash = *(DWORD*)&data[*curSize];
*curSize += 4; *curSize += 4;
log_msg("loadStashList\n\nnbStash = %d\n\n", nbStash);
while (curStash < nbStash) while (curStash < nbStash)
{ {
newStash = addStash(ptChar, isShared); newStash = addStash(ptChar, isShared);
@@ -396,9 +399,10 @@ void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DW
void updateSelectedStashClient(Unit* ptChar)//WORKS void updateSelectedStashClient(Unit* ptChar)//WORKS
{ {
Stash* newStash = PCPY->currentStash; Stash* newStash = PCPY->currentStash;
if (!newStash)
return;
updateClient(ptChar, UC_SELECT_STASH, newStash->id, newStash->flags, PCPY->flags); updateClient(ptChar, UC_SELECT_STASH, newStash->id, newStash->flags, PCPY->flags);
updateClient(ptChar, UC_PAGE_NAME, newStash->name); updateClient(ptChar, UC_PAGE_NAME, newStash->name);
} }
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)//WORKS void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)//WORKS
@@ -415,8 +419,10 @@ void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool b
} }
void selectStash(Unit* ptChar, Stash* newStash)//WORKS void selectStash(Unit* ptChar, Stash* newStash)
{ {
if (!newStash)
return;
changeToSelectedStash(ptChar, newStash, 0, 0); changeToSelectedStash(ptChar, newStash, 0, 0);
updateSelectedStashClient(ptChar); updateSelectedStashClient(ptChar);
} }
@@ -449,7 +455,7 @@ void swapStash(Unit* ptChar, Stash* curStash, Stash* swpStash)
if (!ptChar || !curStash || !swpStash || curStash == swpStash) if (!ptChar || !curStash || !swpStash || curStash == swpStash)
return; return;
changeToSelectedStash(ptChar, swpStash, 1, 0); changeToSelectedStash(ptChar, swpStash, 1, 0);
updateClient(ptChar, UC_SELECT_STASH, swpStash->id, swpStash->flags | 4, PCPY->flags); updateClient(ptChar, UC_SELECT_STASH, swpStash->id, swpStash->flags | 8, PCPY->flags);
} }
void toggleStash(Unit* ptChar, DWORD page) void toggleStash(Unit* ptChar, DWORD page)
@@ -478,20 +484,20 @@ void insertStash(Unit* ptChar)
{ {
Stash* curStash = PCPY->currentStash; Stash* curStash = PCPY->currentStash;
Stash* stash = addStash(ptChar, curStash->isShared); Stash* stash = addStash(ptChar, curStash->isShared);
do while (stash->previousStash != curStash)
{ {
stash->flags = stash->previousStash->flags; stash->flags = stash->previousStash->flags;
stash->name = stash->previousStash->name; stash->name = stash->previousStash->name;
stash->ptListItem = stash->previousStash->ptListItem; stash->ptListItem = stash->previousStash->ptListItem;
stash = stash->previousStash; stash = stash->previousStash;
} while (stash != curStash); }
stash->isIndex = 0; stash->isIndex = 0;
stash->isMainIndex = 0;
stash->name = NULL; stash->name = NULL;
stash->ptListItem = NULL; stash->ptListItem = NULL;
selectNextStash(ptChar);
} }
bool deleteStash(Unit* ptChar) bool deleteStash(Unit* ptChar, bool isClient)
{ {
if (firstClassicStashItem(ptChar) != NULL) if (firstClassicStashItem(ptChar) != NULL)
return false; return false;
@@ -500,21 +506,24 @@ bool deleteStash(Unit* ptChar)
if (stash->nextStash == NULL) if (stash->nextStash == NULL)
{ {
stash->isIndex = 0; stash->isIndex = 0;
stash->isMainIndex = 0;
stash->name = NULL; stash->name = NULL;
return true; return true;
} }
stash->flags = stash->nextStash->flags; stash->flags = stash->nextStash->flags;
stash->name = stash->nextStash->name; stash->name = stash->nextStash->name;
if (stash->nextStash->ptListItem != NULL) if (stash->nextStash->ptListItem != NULL)
swapStash(ptChar, stash, stash->nextStash); changeToSelectedStash(ptChar, stash->nextStash, 1, isClient);
stash = stash->nextStash; stash = stash->nextStash;
do { while (stash->nextStash)
{
stash->flags = stash->nextStash->flags; stash->flags = stash->nextStash->flags;
stash->name = stash->nextStash->name; stash->name = stash->nextStash->name;
stash->ptListItem = stash->nextStash->ptListItem; stash->ptListItem = stash->nextStash->ptListItem;
stash = stash->nextStash; stash = stash->nextStash;
} while (stash->nextStash); }
stash->isIndex = 0; stash->isIndex = 0;
stash->isMainIndex = 0;
stash->name = NULL; stash->name = NULL;
stash->ptListItem = NULL; stash->ptListItem = NULL;
return true; return true;
@@ -543,10 +552,12 @@ void renameCurrentStash(Unit* ptChar, char* name)
} }
void setCurrentStashIndex(Unit* ptChar, bool isIndex) void setCurrentStashIndex(Unit* ptChar, int index)
{ {
if (PCPY->currentStash) if (!PCPY->currentStash)
PCPY->currentStash->isIndex = isIndex; return;
PCPY->currentStash->isIndex = index >= 1;
PCPY->currentStash->isMainIndex = index == 2;
updateSelectedStashClient(ptChar); updateSelectedStashClient(ptChar);
} }
@@ -617,8 +628,15 @@ void selectPreviousIndex2Stash(Unit* ptChar)
{ {
selectPreviousStash(ptChar); selectPreviousStash(ptChar);
Stash* selStash = PCPY->currentStash; Stash* selStash = PCPY->currentStash;
while (selStash && !selStash->isMainIndex)
selStash = selStash->previousStash;
if (selStash == NULL)
{
selStash = PCPY->currentStash;
while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex2 != 0)) while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex2 != 0))
selStash = selStash->previousStash; selStash = selStash->previousStash;
}
if (selStash && (selStash != PCPY->currentStash)) if (selStash && (selStash != PCPY->currentStash))
selectStash(ptChar, selStash); selectStash(ptChar, selStash);
@@ -649,12 +667,19 @@ void selectNextIndex2Stash(Unit* ptChar)
{ {
selectNextStash(ptChar); selectNextStash(ptChar);
Stash* selStash = PCPY->currentStash; Stash* selStash = PCPY->currentStash;
while (selStash && !selStash->isMainIndex)
selStash = selStash->nextStash;
if (selStash == NULL)
{
selStash = PCPY->currentStash;
while ((selStash->id+1) % nbPagesPerIndex2 != 0) while ((selStash->id+1) % nbPagesPerIndex2 != 0)
{ {
if (!selStash->isShared && (selStash->id >= maxSelfPages)) break; if (!selStash->isShared && (selStash->id >= maxSelfPages)) break;
if (selStash->isShared && (selStash->id >= maxSharedPages)) break; if (selStash->isShared && (selStash->id >= maxSharedPages)) break;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);; selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);;
} }
}
if (selStash && (selStash != PCPY->currentStash)) if (selStash && (selStash != PCPY->currentStash))
selectStash(ptChar, selStash); selectStash(ptChar, selStash);
} }
@@ -742,6 +767,26 @@ DWORD STDCALL carry1Limit(Unit* ptChar, Unit* ptItemParam, DWORD itemNum, BYTE p
return 0; return 0;
} }
FCT_ASM( caller_carry1Limit_114 )
PUSH DWORD PTR SS : [ESP + 0x08]//page
PUSH 0//EDI
PUSH DWORD PTR SS : [ESP + 0x0C]
PUSH ESI//ptChar
CALL carry1Limit
TEST EAX, EAX
JNZ end_carry1Limit
JMP D2ItemSetPage
end_carry1Limit :
ADD ESP, 0x10
XOR EAX, EAX
POP EDI
POP EBX
POP ESI
MOV ESP, EBP
POP EBP
RETN 8
}}
FCT_ASM ( caller_carry1Limit_111 ) FCT_ASM ( caller_carry1Limit_111 )
PUSH DWORD PTR SS:[ESP+0x08]//page PUSH DWORD PTR SS:[ESP+0x08]//page
PUSH 0//EDI PUSH 0//EDI
@@ -781,6 +826,26 @@ end_carry1Limit:
RETN 8 RETN 8
}} }}
FCT_ASM( caller_carry1LimitSwap_114 )
PUSH EAX
PUSH DWORD PTR SS : [ESP + 0x20]
PUSH 0
PUSH EDI//ptChar
CALL carry1Limit
TEST EAX, EAX
JNZ end_carry1Limit
JMP D2ItemGetPage
end_carry1Limit :
ADD ESP, 8
XOR EAX, EAX
POP EBX
POP EDI
POP ESI
MOV ESP, EBP
POP EBP
RETN 8
}}
FCT_ASM ( caller_carry1LimitSwap_112 ) FCT_ASM ( caller_carry1LimitSwap_112 )
PUSH EAX PUSH EAX
PUSH DWORD PTR SS:[ESP+0x1C] PUSH DWORD PTR SS:[ESP+0x1C]
@@ -858,6 +923,20 @@ END_carry1LimitWhenDrop:
RETN RETN
}}*/ }}*/
FCT_ASM( caller_carry1LimitWhenDrop_114 )
PUSH 0
PUSH 0
PUSH DWORD PTR SS : [ESP + 0x10] //ptItem
PUSH EBX //ptChar
CALL carry1Limit
TEST EAX, EAX
JNZ end_carry1Limit
JMP D2CanPutItemInInv
end_carry1Limit :
XOR EAX, EAX
RETN 0x1C
}}
FCT_ASM ( caller_carry1LimitWhenDrop_111 ) FCT_ASM ( caller_carry1LimitWhenDrop_111 )
PUSH 0 PUSH 0
PUSH 0 PUSH 0
@@ -903,6 +982,19 @@ END_carry1LimitWhenDrop:
RETN RETN
}} }}
FCT_ASM( caller_carry1OutOfStash_114 )
PUSH ESI
CALL D2ItemGetPage
CMP AL, 4
JNZ continue_carry1OutOfStash
SUB DWORD PTR SS : [ESP], 0xC
RETN
continue_carry1OutOfStash :
MOV EDI, DWORD PTR SS : [EBP - 0x4]
TEST EDI, EDI
RETN
}}
FCT_ASM ( caller_carry1OutOfStash_111 ) FCT_ASM ( caller_carry1OutOfStash_111 )
PUSH EDI PUSH EDI
CALL D2ItemGetPage CALL D2ItemGetPage
@@ -945,8 +1037,12 @@ void Install_MultiPageStash()
log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n"); log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n");
// Cannot put 2 items carry1 in inventory // Cannot put 2 items carry1 in inventory
mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013); mem_seek R8(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013, 14AC7F);
MEMJ_REF4( D2ItemSetPage , version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit); if (version_D2Game == V114d) {
MEMT_REF4(0x000DD5FD, caller_carry1Limit_114);
} else {
MEMJ_REF4(D2ItemSetPage, version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit);
}
//6FC8504F . E8 94670900 CALL <JMP.&D2Common.#10720> //6FC8504F . E8 94670900 CALL <JMP.&D2Common.#10720>
//01FD7CA2 . E8 6329FBFF CALL <JMP.&D2Common.#10485> //01FD7CA2 . E8 6329FBFF CALL <JMP.&D2Common.#10485>
//01F9FE62 . E8 47A8FDFF CALL <JMP.&D2Common.#10608> //01F9FE62 . E8 47A8FDFF CALL <JMP.&D2Common.#10608>
@@ -955,8 +1051,12 @@ void Install_MultiPageStash()
//6FC8B012 . E8 13F7F9FF CALL <JMP.&D2Common.#11026> //6FC8B012 . E8 13F7F9FF CALL <JMP.&D2Common.#11026>
// Cannot put 2 items carry1 in inventory by swapping // Cannot put 2 items carry1 in inventory by swapping
mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78); mem_seek R8(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78, 14B179);
MEMJ_REF4( D2ItemGetPage , version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap); if (version_D2Game == V114d) {
MEMT_REF4(0x000DD0D3, caller_carry1LimitSwap_114);
} else {
MEMJ_REF4(D2ItemGetPage, version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap);
}
//6FC858D8 . E8 175F0900 CALL <JMP.&D2Common.#10719> //6FC858D8 . E8 175F0900 CALL <JMP.&D2Common.#10719>
//01FD8967 . E8 8E1DFBFF CALL <JMP.&D2Common.#10820> //01FD8967 . E8 8E1DFBFF CALL <JMP.&D2Common.#10820>
//01FA10E7 . E8 9A96FDFF CALL <JMP.&D2Common.#10505> //01FA10E7 . E8 9A96FDFF CALL <JMP.&D2Common.#10505>
@@ -967,8 +1067,12 @@ void Install_MultiPageStash()
if ( version_D2Game >= V111 ) if ( version_D2Game >= V111 )
{ {
// Cannot put 2 items carry1 in inventory when drop cube // Cannot put 2 items carry1 in inventory when drop cube
mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15); mem_seek R8(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15, 163A89);
MEMJ_REF4( D2CanPutItemInInv , caller_carry1LimitWhenDrop_111); if (version_D2Game == V114d) {
MEMT_REF4(0x000D7EC3, caller_carry1LimitWhenDrop_114);
} else {
MEMJ_REF4(D2CanPutItemInInv, caller_carry1LimitWhenDrop_111);
}
//01FBD934 |. E8 5BD3FCFF |CALL <JMP.&D2Common.#10855> //01FBD934 |. E8 5BD3FCFF |CALL <JMP.&D2Common.#10855>
//01FB9FD4 |. E8 3912FCFF |CALL <JMP.&D2Common.#10813> //01FB9FD4 |. E8 3912FCFF |CALL <JMP.&D2Common.#10813>
//6FC37AD4 |. E8 0535FFFF |CALL <JMP.&D2Common.#10289> //6FC37AD4 |. E8 0535FFFF |CALL <JMP.&D2Common.#10289>
@@ -976,17 +1080,22 @@ void Install_MultiPageStash()
//6FCD7B14 |. E8 7D32F5FF |CALL <JMP.&D2Common.#10402> //6FCD7B14 |. E8 7D32F5FF |CALL <JMP.&D2Common.#10402>
} else { } else {
// Cannot put 2 items carry1 in inventory when drop cube // Cannot put 2 items carry1 in inventory when drop cube
mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0xBA ,0xE8); memt_byte( 0xBA ,0xE8);
MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop); MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop);
//6FC44341 |. BA 06080000 |MOV EDX,806 //6FC44341 |. BA 06080000 |MOV EDX,806
} }
// Verif only carry1 out of stash page when pick up an item // Verif only carry1 out of stash page when pick up an item
mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B); mem_seek R8(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B, 15CADD);
memt_byte( 0x8B ,0xE8); if (version_D2Game == V114d) {
MEMT_REF4( version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash); memt_byte(0x8B, 0xE8);
memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90); MEMT_REF4(0xFF85FC7D, caller_carry1OutOfStash_114);
} else {
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);
}
//6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10] //6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10]
//6FC429A2 |. 85C0 |TEST EAX,EAX //6FC429A2 |. 85C0 |TEST EAX,EAX
//01FB8E3B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] //01FB8E3B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Interface functions Interface functions
@@ -28,7 +29,7 @@ void STDCALL printSkillsPageBtns()
if (active_SkillsPoints && !onRealm && D2isLODGame()) if (active_SkillsPoints && !onRealm && D2isLODGame())
{ {
sDrawImageInfo data; sDrawImageInfo data;
ZeroMemory(&data,sizeof(data)); ZeroMemory(&data, sizeof(data));
setImage(&data, unassignSkillsBtnImages); setImage(&data, unassignSkillsBtnImages);
setFrame(&data, btnSkillIsDown); setFrame(&data, btnSkillIsDown);
D2PrintImage(&data, getXSkillBtn(), getYSkillBtn(), -1, 5, 0); D2PrintImage(&data, getXSkillBtn(), getYSkillBtn(), -1, 5, 0);
@@ -44,7 +45,8 @@ void STDCALL printSkillsPageBtns()
Unit* STDCALL skillsPageMouseDown(sWinMessage* msg) Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
{ {
Unit* ptChar = D2GetClientPlayer(); Unit* ptChar = D2GetClientPlayer();
log_msg("push down left button\n");
log_msg("type=%u\nx=%u\ny=%u\n\n", msg->type, msg->x, msg->y);
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
{ {
log_msg("push down left button unassign skill\n"); log_msg("push down left button unassign skill\n");
@@ -59,6 +61,7 @@ Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
void STDCALL skillsPageMouseUp() void STDCALL skillsPageMouseUp()
{ {
log_msg("push up left button\n");
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
{ {
log_msg("push up left button unassign skill\n"); log_msg("push up left button unassign skill\n");
@@ -88,11 +91,22 @@ FCT_ASM ( caller_printSkillsPageBtns )
RETN RETN
}} }}
FCT_ASM ( caller_DontPrintSkillPointsRemaining_111 ) FCT_ASM( caller_DontPrintSkillPointsRemaining_114 )
MOV AL,BYTE PTR DS:[onRealm] MOV AL, BYTE PTR DS : [onRealm]
TEST AL,AL TEST AL, AL
JNZ dontPrint JNZ dontPrint
ADD DWORD PTR SS:[ESP],0xF2 ADD DWORD PTR SS : [ESP], 0x97
RETN
dontPrint :
MOV ECX, 0x1083
RETN
}}
FCT_ASM(caller_DontPrintSkillPointsRemaining_111)
MOV AL, BYTE PTR DS : [onRealm]
TEST AL, AL
JNZ dontPrint
ADD DWORD PTR SS : [ESP], 0xF2
RETN RETN
dontPrint: dontPrint:
MOV ECX,0x1083 MOV ECX,0x1083
@@ -110,6 +124,12 @@ dontPrint:
RETN RETN
}} }}
FCT_ASM( caller_skillsPageMouseDown_114 )
PUSH ESI
CALL skillsPageMouseDown
RETN
}}
FCT_ASM ( caller_skillsPageMouseDown_111 ) FCT_ASM ( caller_skillsPageMouseDown_111 )
PUSH EBP PUSH EBP
CALL skillsPageMouseDown CALL skillsPageMouseDown
@@ -139,7 +159,7 @@ void Install_InterfaceSkills()
log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n"); log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n");
// Print new buttons images // Print new buttons images
mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380); mem_seek R8(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380, AB7A5);
memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns
if ( version_D2Client >= V111 ) { if ( version_D2Client >= V111 ) {
MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111); MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111);
@@ -184,9 +204,9 @@ void Install_InterfaceSkills()
if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1) if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1)
{ {
// Don't print "Skill Points Remaining" // Don't print "Skill Points Remaining"
mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4); mem_seek R8(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4, AACE0);
memt_byte( 0xB9, 0xE8 ); memt_byte( 0xB9, 0xE8 );
MEMT_REF4( 0x00001083, version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining); MEMT_REF4( 0x00001083, version_D2Client == V114d ? caller_DontPrintSkillPointsRemaining_114 : version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining);
//6FB17080 /$ B9 83100000 MOV ECX,1083 //6FB17080 /$ B9 83100000 MOV ECX,1083
//6FAC6294 |. B9 83100000 MOV ECX,1083 //6FAC6294 |. B9 83100000 MOV ECX,1083
//6FB3AC74 |. B9 83100000 MOV ECX,1083 //6FB3AC74 |. B9 83100000 MOV ECX,1083
@@ -196,11 +216,12 @@ void Install_InterfaceSkills()
} }
// Manage mouse down (Play sound) // Manage mouse down (Play sound)
mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112); mem_seek R8(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112, ABC1A);
memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown memt_byte(0xC7, 0xE8); // CALL caller_skillsPageMouseDown
MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown); MEMT_REF4(version_D2Client == V114d ? 0x00001846 : version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client == V114d ? caller_skillsPageMouseDown_114 : version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
memt_byte( 0x00, 0x90 ); // NOP memt_byte(0x00, 0x90); // NOP
memt_byte( 0x00, 0x90 ); // NOP memt_byte(0x00, 0x90); // NOP
//6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0 //6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0
//6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 //6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 //6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
@@ -209,8 +230,12 @@ void Install_InterfaceSkills()
//6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 //6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
// Manage mouse up // Manage mouse up
mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8); mem_seek R8(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8, ABC96/*ABE38*/);
MEMJ_REF4( D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A if (version_D2Client == V114d) {
MEMT_REF4(/*0xFFFFFE45*/0xFFF745F6, caller_skillsPageMouseUp);
} else {
MEMJ_REF4(D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A
}
//6FB18465 . E8 C07D0400 CALL <JMP.&Storm.#511> //6FB18465 . E8 C07D0400 CALL <JMP.&Storm.#511>
//6FAC7557 .^E9 4248FFFF JMP <JMP.&Storm.#511> //6FAC7557 .^E9 4248FFFF JMP <JMP.&Storm.#511>
//6FB3C077 .^E9 16FDF7FF JMP <JMP.&Storm.#511> //6FB3C077 .^E9 16FDF7FF JMP <JMP.&Storm.#511>

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Interface stats page functions Interface stats page functions
@@ -346,6 +347,24 @@ Unit* STDCALL initGetNextItemForSet(Inventory* ptInventory)
return getNextItemForSet(item); return getNextItemForSet(item);
} }
FCT_ASM( caller_manageBtnDown_114 )
PUSH EBX
CALL manageBtnDown
TEST EAX, EAX
JE IS_NOT_ON_BUTTON
POP EDX
MOV EDX, DWORD PTR DS : [EDX + 0xA]
MOV DWORD PTR DS : [EDX], 1
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
RETN 4
IS_NOT_ON_BUTTON :
JMP D2ClickOnStashButton
}}
FCT_ASM( caller_manageBtnDown_111 ) FCT_ASM( caller_manageBtnDown_111 )
PUSH EBP PUSH EBP
@@ -381,6 +400,31 @@ IS_NOT_ON_BUTTON:
JMP D2isLODGame JMP D2isLODGame
}} }}
FCT_ASM( caller_manageBtnUp_114 )
PUSH EBX
CALL manageBtnUp
MOV isDownBtn.all, 0
TEST EAX, EAX
JE IS_NOT_ON_BUTTON
POP EDX
MOV EDX, DWORD PTR DS : [EDX + 0x33]
MOV DWORD PTR DS : [EDX], 0
SUB EDX, 8
MOV DWORD PTR DS : [EDX], 0
ADD EDX, 4
MOV DWORD PTR DS : [EDX], 0
ADD EDX, 0x68
MOV DWORD PTR DS : [EDX], 0
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
RETN 4
IS_NOT_ON_BUTTON:
JMP D2ClickOnStashButton
}}
FCT_ASM( caller_manageBtnUp_111 ) FCT_ASM( caller_manageBtnUp_111 )
PUSH EBX PUSH EBX
CALL manageBtnUp CALL manageBtnUp
@@ -430,6 +474,11 @@ IS_NOT_ON_BUTTON:
JMP D2isLODGame JMP D2isLODGame
}} }}
FCT_ASM( initBtnsStates_114 )
MOV isDownBtn.all, 0
MOV DWORD PTR DS : [0x7BCC3C], EAX
RETN
}}
FCT_ASM ( initBtnsStates ) FCT_ASM ( initBtnsStates )
MOV isDownBtn.all,0 MOV isDownBtn.all,0
@@ -449,8 +498,12 @@ void Install_InterfaceStash()
log_msg("Patch D2Client for stash interface. (InterfaceStash)\n"); log_msg("Patch D2Client for stash interface. (InterfaceStash)\n");
// Print button images // Print button images
mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26); mem_seek R8(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26, 8F308);
MEMC_REF4( D2LoadBuySelBtn, printBtns); if (version_D2Client == V114d) {
MEMT_REF4(0xFFFC52F4, printBtns);
} else {
MEMC_REF4(D2LoadBuySelBtn, printBtns);
}
//6FADF398 |. E8 734D0400 CALL D2Client.6FB24110 //6FADF398 |. E8 734D0400 CALL D2Client.6FB24110
//6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0 //6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0
//6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0 //6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0
@@ -459,8 +512,12 @@ void Install_InterfaceStash()
//6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0 //6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0
// print page number // print page number
mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03); mem_seek R8(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03, 8F2E5);
MEMJ_REF4( D2PrintString, printPageNumber); if (version_D2Client == V114d) {
MEMT_REF4(0x00073037, printPageNumber);
} else {
MEMJ_REF4(D2PrintString, printPageNumber);
}
//6FADF374 |. E8 3FCC0800 CALL <JMP.&D2Win.#10117> //6FADF374 |. E8 3FCC0800 CALL <JMP.&D2Win.#10117>
//6FB60FE2 |. E8 99C2F5FF CALL <JMP.&D2Win.#10020> //6FB60FE2 |. E8 99C2F5FF CALL <JMP.&D2Win.#10020>
//6FB2DF62 |. E8 19F3F8FF CALL <JMP.&D2Win.#10064> //6FB2DF62 |. E8 19F3F8FF CALL <JMP.&D2Win.#10064>
@@ -469,8 +526,12 @@ void Install_InterfaceStash()
//6FB4DE02 |. E8 4739F7FF CALL <JMP.&D2Win.#10076> //6FB4DE02 |. E8 4739F7FF CALL <JMP.&D2Win.#10076>
// Manage mouse down (Play sound) // Manage mouse down (Play sound)
mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76); mem_seek R8(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76, 925B8);
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown); if (version_D2Client == V114d) {
MEMT_REF4(0xFFFF73C4, caller_manageBtnDown_114);
} else {
MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown);
}
//6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080 //6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080
//6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520 //6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520
//6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0 //6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0
@@ -479,8 +540,12 @@ void Install_InterfaceStash()
//6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10 //6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10
// Manage mouse up // Manage mouse up
mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9); mem_seek R8(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9, 89B63);
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp); if (version_D2Client == V114d) {
MEMT_REF4(0xFFFFFE19, caller_manageBtnUp_114);
} else {
MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp);
}
//6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080 //6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080
//6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520 //6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520
//6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0 //6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0
@@ -489,10 +554,15 @@ void Install_InterfaceStash()
//6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10 //6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10
// init state of button on open stash page // init state of button on open stash page
mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A); mem_seek R8(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A, 89ED0);
memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates if (version_D2Client == V114d) {
MEMT_REF4( 0x000104C4, initBtnsStates); memt_byte(0xA3, 0xE8);
memt_byte( 0x00, 0x90 ); MEMT_REF4(0x007BCC3C, initBtnsStates_114);
} else {
memt_byte(0x81, 0xE9); // CALL initBtnsStates
MEMT_REF4(0x000104C4, initBtnsStates);
memt_byte(0x00, 0x90);
}
//6FAE5B3A |> 81C4 04010000 ADD ESP,104 //6FAE5B3A |> 81C4 04010000 ADD ESP,104
//6FAE5B3A |> 81C4 04010000 ADD ESP,104 //6FAE5B3A |> 81C4 04010000 ADD ESP,104
//6FAEC63A |> 81C4 04010000 ADD ESP,104 //6FAEC63A |> 81C4 04010000 ADD ESP,104
@@ -503,8 +573,12 @@ void Install_InterfaceStash()
//6FB4441A |> 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 // 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, 91A24); mem_seek R8(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24, 86774);
MEMJ_REF4( D2InventoryGetFirstItem, initGetNextItemForSet); if (version_D2Client == V114d) {
MEMT_REF4(0x001B4B48, initGetNextItemForSet);
} else {
MEMJ_REF4(D2InventoryGetFirstItem, initGetNextItemForSet);
}
//6FAE5996 |. E8 D5500800 CALL <JMP.&D2Common.#10277> //6FAE5996 |. E8 D5500800 CALL <JMP.&D2Common.#10277>
//6FB571F3 |. E8 D64EF6FF CALL <JMP.&D2Common.#10402> //6FB571F3 |. E8 D64EF6FF CALL <JMP.&D2Common.#10402>
//6FB21F63 |. E8 96A1F9FF CALL <JMP.&D2Common.#10535> //6FB21F63 |. E8 96A1F9FF CALL <JMP.&D2Common.#10535>
@@ -513,8 +587,12 @@ void Install_InterfaceStash()
//6FB41A23 |. E8 96A7F7FF CALL <JMP.&D2Common.#11040> //6FB41A23 |. E8 96A7F7FF CALL <JMP.&D2Common.#11040>
// Get next item for print in green the item set name we have in stash // 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, 91ABB); mem_seek R8(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB, 86807);
MEMJ_REF4( D2UnitGetNextItem, getNextItemForSet); if (version_D2Client == V114d) {
MEMT_REF4(0x001B7795, getNextItemForSet);
} else {
MEMJ_REF4(D2UnitGetNextItem, getNextItemForSet);
}
//6FAE5A1B E8 4A500800 CALL <JMP.&D2Common.#10304> //6FAE5A1B E8 4A500800 CALL <JMP.&D2Common.#10304>
//6FB5728A |. E8 0B4FF6FF |CALL <JMP.&D2Common.#10934> //6FB5728A |. E8 0B4FF6FF |CALL <JMP.&D2Common.#10934>
//6FB21FFA |. E8 A1A1F9FF |CALL <JMP.&D2Common.#11140> //6FB21FFA |. E8 A1A1F9FF |CALL <JMP.&D2Common.#11140>

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Interface functions Interface functions
@@ -138,6 +139,16 @@ Unit* STDCALL statsPageMouseUp(sWinMessage* msg)
return ptChar; return ptChar;
} }
FCT_ASM( caller_printStatsPageBtns_114 )
CALL printStatsPageBtns
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
RETN
}}
FCT_ASM ( caller_printStatsPageBtns_111 ) FCT_ASM ( caller_printStatsPageBtns_111 )
CALL printStatsPageBtns CALL printStatsPageBtns
POP EDI POP EDI
@@ -169,7 +180,21 @@ FCT_ASM ( caller_printStatsPageBtns_9 )
RETN RETN
}} }}
FCT_ASM( caller_statsPageMouseDown_114 )
PUSH DWORD PTR SS : [ESP + 0x18]
CALL statsPageMouseDown
TEST EAX, EAX
JE fin_statsPageMouseDown
MOV EAX, DWORD PTR DS : [0x7A6A70]
RETN
fin_statsPageMouseDown :
ADD ESP, 4
POP EDI
POP ESI
POP EBX
POP EBP
RETN 4
}}
FCT_ASM ( caller_statsPageMouseDown_111 ) FCT_ASM ( caller_statsPageMouseDown_111 )
PUSH DWORD PTR SS:[ESP+0x20] PUSH DWORD PTR SS:[ESP+0x20]
@@ -201,6 +226,22 @@ fin_statsPageMouseDown:
RETN 4 RETN 4
}} }}
FCT_ASM( caller_statsPageMouseUp_114 )
PUSH DWORD PTR SS : [EBP + 0x8]
CALL statsPageMouseUp
TEST EAX, EAX
JE fin_statsPageMouseUp
MOV EAX, DWORD PTR DS : [0x7A6A70]
RETN
fin_statsPageMouseUp :
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
RETN 4
}}
FCT_ASM ( caller_statsPageMouseUp ) FCT_ASM ( caller_statsPageMouseUp )
PUSH EBP PUSH EBP
CALL statsPageMouseUp CALL statsPageMouseUp
@@ -244,9 +285,16 @@ void Install_InterfaceStats()
log_msg("Patch D2Client for stats interface. (InterfaceStats)\n"); log_msg("Patch D2Client for stats interface. (InterfaceStats)\n");
// Print new buttons images // Print new buttons images
mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6); if (version_D2Client == V114d) {
memt_byte( 0x5F, 0xE9 ); // JMP mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, A8949);
MEMT_REF4( 0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9); memt_byte(0x5F, 0xE9);
MEMT_REF4(0xE58B5B5E, caller_printStatsPageBtns_114);
} else {
mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, 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 //6FAD0F86 . 5F POP EDI
//6FAD0F87 . 5E POP ESI //6FAD0F87 . 5E POP ESI
//6FAD0F88 . 5D POP EBP //6FAD0F88 . 5D POP EBP
@@ -282,14 +330,18 @@ void Install_InterfaceStats()
//6FB703B8 |. 5D POP EBP //6FB703B8 |. 5D POP EBP
//6FB703B9 |. 5B POP EBX //6FB703B9 |. 5B POP EBX
//6FB703BA |. 81C4 70030000 ADD ESP,370 //6FB703BA |. 81C4 70030000 ADD ESP,370
//6FB703<30>0 \. C3 RETN //6FB703<30>0 \. C3 RETN
if ( version_D2Client >= V111 ) if ( version_D2Client >= V111 )
{ {
// Manage mouse down (Play sound) // Manage mouse down (Play sound)
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568); mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4);
memt_byte( 0xA1, 0xE8 ); if (version_D2Client == V114d) {
MEMT_REF4( ptptClientChar, caller_statsPageMouseDown); MEMT_REF4(0xFFFBC5F8, caller_statsPageMouseDown_114);
} else {
memt_byte(0xA1, 0xE8);
MEMT_REF4(ptptClientChar, caller_statsPageMouseDown);
}
//6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
//6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
//6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
@@ -297,9 +349,13 @@ void Install_InterfaceStats()
//6FB6F568 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] //6FB6F568 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050]
// Manage mouse up // Manage mouse up
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3); mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963);
memt_byte( 0xA1, 0xE8 ); if (version_D2Client == V114d) {
MEMT_REF4( ptptClientChar, caller_statsPageMouseUp); MEMT_REF4(0xFFFBC469, caller_statsPageMouseUp_114);
} else {
memt_byte(0xA1, 0xE8);
MEMT_REF4(ptptClientChar, caller_statsPageMouseUp);
}
//6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
//6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
//6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
@@ -307,12 +363,12 @@ void Install_InterfaceStats()
//6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] //6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050]
} else { } else {
// Manage mouse down (Play sound) // Manage mouse down (Play sound)
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000); mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000, 0000);
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown); MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown);
//6FAD133C . E8 8F700500 CALL D2Client.6FB283D0 //6FAD133C . E8 8F700500 CALL D2Client.6FB283D0
// Manage mouse up // Manage mouse up
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000); mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000, 0000);
MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2 MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2
//6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0 //6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0
} }

View File

@@ -36,10 +36,10 @@ void Install_LanguageManagement()
log_msg("Patch D2Lang for language management. (LanguageManagement)\n"); log_msg("Patch D2Lang for language management. (LanguageManagement)\n");
ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang >= V111 ? 0x51: 0x5C)); ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang == V114d ? 0x5F : version_D2Lang >= V111 ? 0x51: 0x5C));
// Language management // Language management
mem_seek( (DWORD)D2GetLang + (version_D2Lang >= V111 ? 0x3E : 0x49));//6FC13E39-6FC10000 mem_seek( (DWORD)D2GetLang + (version_D2Lang == V114d ? 0x4C : version_D2Lang >= V111 ? 0x3E : 0x49));//6FC13E39-6FC10000
memt_byte( 0xA1 , 0xE8); memt_byte( 0xA1 , 0xE8);
MEMT_REF4( ptCurrentLanguage, languageManagement); MEMT_REF4( ptCurrentLanguage, languageManagement);
//6FC13E39 |. A1 EC0CC26F MOV EAX,DWORD PTR DS:[6FC20CEC] //6FC13E39 |. A1 EC0CC26F MOV EAX,DWORD PTR DS:[6FC20CEC]

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Load Player Custom Data. Load Player Custom Data.
@@ -51,6 +52,20 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar)
return ret; return ret;
} }
FCT_ASM( caller_LoadSPPlayerCustomData_114 )
MOV EDI, EAX
TEST EDI, EDI
JNZ JMP_LoadSPPlayerCustomData
PUSH DWORD PTR SS : [ESP + 0x1C]
CALL LoadSPCustomData
MOV EDI, EAX
TEST EDI, EDI
JNZ JMP_LoadSPPlayerCustomData
RETN
JMP_LoadSPPlayerCustomData :
ADD DWORD PTR SS : [ESP], 0x14
RETN
}}
FCT_ASM (caller_LoadSPPlayerCustomData ) FCT_ASM (caller_LoadSPPlayerCustomData )
MOV ESI,EAX MOV ESI,EAX
@@ -92,12 +107,12 @@ return value :
13:Unable to enter game, a normal character cannot join a game create an harcore character. 13:Unable to enter game, a normal character cannot join a game create an harcore character.
14:Unable to enter game, an harcore character cannot join a game create by a normal character. 14:Unable to enter game, an harcore character cannot join a game create by a normal character.
15:A dead character cannot join or create any game 15:A dead character cannot join or create any game
16:unknow failure 16:unknown failure
17:Unable to enter game. A D2 Character cannot join an expansion character 17:Unable to enter game. A D2 Character cannot join an expansion character
18:Expansion cannot join D2 18:Expansion cannot join D2
19:Failures to join game 19:Failures to join game
1A:Unable to enter game 1A:Unable to enter game
1B:unknow failure 1B:unknown failure
*/ */
enum { enum {
TS_SAVE_PERSONAL=0, TS_SAVE_PERSONAL=0,
@@ -186,6 +201,8 @@ void FASTCALL SendSaveFiles (char* ptPath, DWORD maxsize, char* name)
log_msg("\n--- Start SendSaveFiles ---\n"); log_msg("\n--- Start SendSaveFiles ---\n");
log_msg("path = %s\n\nmaxsize = %d\n\nname = %s\n\n", ptPath, maxsize, name);
// Send Extended Save File // Send Extended Save File
log_msg("Send Extended Save File\n"); log_msg("Send Extended Save File\n");
dataExtended = readExtendedSaveFile(name, &sizeExtended); dataExtended = readExtendedSaveFile(name, &sizeExtended);
@@ -350,7 +367,20 @@ DWORD STDCALL LoadMPCustomData(Unit* ptChar)
return ret; return ret;
} }
FCT_ASM( caller_LoadMPPlayerCustomData_114 )
PUSH DWORD PTR SS : [EDI]
CALL LoadMPCustomData
TEST EAX, EAX
JNZ JMP_LoadMPlayerCustomData
CMP DWORD PTR DS : [EDI], 0
JNZ Continue_LoadMP
ADD DWORD PTR SS : [ESP], 0x1D
Continue_LoadMP :
RETN
JMP_LoadMPlayerCustomData :
SUB DWORD PTR SS : [ESP], 0x10
RETN
}}
FCT_ASM ( caller_LoadMPPlayerCustomData_111 ) FCT_ASM ( caller_LoadMPPlayerCustomData_111 )
PUSH DWORD PTR SS:[EBX] PUSH DWORD PTR SS:[EBX]
@@ -413,7 +443,18 @@ FCT_ASM ( caller_SendSaveFiles )
JMP SendSaveFiles JMP SendSaveFiles
}} }}
FCT_ASM( caller_ReceiveSaveFiles_114 )
PUSH ECX
PUSH EDX
LEA EBX, DWORD PTR DS : [ESI + 4]
PUSH EBX //Message
MOV EBX, DWORD PTR SS : [ESI]
PUSH EBX //ID client
CALL ReceiveSaveFiles
POP EDX
POP ECX
RETN
}}
FCT_ASM ( caller_ReceiveSaveFiles_111 ) FCT_ASM ( caller_ReceiveSaveFiles_111 )
PUSH ECX PUSH ECX
@@ -475,10 +516,10 @@ void Install_LoadPlayerData()
log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n"); log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n");
// Load SP player custom data. // Load SP player custom data.
mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD); mem_seek R8(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD, 13447A);
memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData
MEMT_REF4( 0x75F685F0 , caller_LoadSPPlayerCustomData); MEMT_REF4( version_D2Game == V114d ? 0x75FF85F8 : 0x75F685F0 , version_D2Game == V114d ? caller_LoadSPPlayerCustomData_114 : caller_LoadSPPlayerCustomData);
memt_byte( 0x16, 0x90); // NOP memt_byte( version_D2Game == V114d ? 0x13 : 0x16, 0x90); // NOP
//6FC8CB0F 8BF0 MOV ESI,EAX //6FC8CB0F 8BF0 MOV ESI,EAX
//6FC8CB11 85F6 TEST ESI,ESI //6FC8CB11 85F6 TEST ESI,ESI
//6FC8CB13 75 16 JNZ SHORT D2Game.6FC8CB2B //6FC8CB13 75 16 JNZ SHORT D2Game.6FC8CB2B
@@ -499,9 +540,9 @@ void Install_LoadPlayerData()
//6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9 //6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9
// Load MP player custom data. // Load MP player custom data.
mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57); mem_seek R8(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57, 134572);
memt_byte( 0x83, 0xE8); 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); MEMT_REF4( version_D2Game == V114d ? 0x1D74003F : version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game == V114d ? caller_LoadMPPlayerCustomData_114 : version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9);
//6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0 //6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0
//6FC8CC69 . 74 46 JE SHORT D2Game.6FC8CCB1 //6FC8CC69 . 74 46 JE SHORT D2Game.6FC8CCB1
//0203B777 |> 833B 00 CMP DWORD PTR DS:[EBX],0 //0203B777 |> 833B 00 CMP DWORD PTR DS:[EBX],0
@@ -516,8 +557,13 @@ void Install_LoadPlayerData()
//6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D //6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D
// Send save files to Server. // Send save files to Server.
mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C); mem_seek R8(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C, 7807E);
MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles); if (version_D2Client == V114d) {
MEMT_REF4(0xFFF8EFCE, caller_SendSaveFiles_111);
} else {
MEMJ_REF4(D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles);
}
//6FAAD5A1 |. E8 88D10B00 CALL <JMP.&Fog.#10115> //6FAAD5A1 |. E8 88D10B00 CALL <JMP.&Fog.#10115>
//6FB233FB |. E8 CA8AF9FF CALL <JMP.&Fog.#10115> //6FB233FB |. E8 CA8AF9FF CALL <JMP.&Fog.#10115>
//6FB0DFDB |. E8 C6DEFAFF CALL <JMP.&Fog.#10115> //6FB0DFDB |. E8 C6DEFAFF CALL <JMP.&Fog.#10115>
@@ -526,9 +572,12 @@ void Install_LoadPlayerData()
//6FB6638B |. E8 2E5BF5FF CALL <JMP.&Fog.#10115> //6FB6638B |. E8 2E5BF5FF CALL <JMP.&Fog.#10115>
// Receive save files from client. // Receive save files from client.
mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9); mem_seek R8(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9, 13F114);
memt_byte( 0x8B ,0xE8); memt_byte( 0x8B ,0xE8);
if ( version_D2Game >= V111 ) { if (version_D2Game == V114d) {
MEMT_REF4(0x46B60F1E, caller_ReceiveSaveFiles_114);
memt_byte(0x04, 0x90);
} else if ( version_D2Game >= V111 ) {
MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111); MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111);
memt_byte( 0x45 ,0x90); memt_byte( 0x45 ,0x90);
memt_byte( 0x04 ,0x90); memt_byte( 0x04 ,0x90);
@@ -550,7 +599,7 @@ void Install_LoadPlayerData()
if ( version_Fog <= V109d ) if ( version_Fog <= V109d )
{ {
mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x8B ,0xE8); memt_byte( 0x8B ,0xE8);
MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d); MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d);
memt_byte( 0x44 ,0x90); memt_byte( 0x44 ,0x90);

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Print PlugY version on screen. Print PlugY version on screen.
@@ -34,6 +35,30 @@ void STDCALL printPlugYVersion(void** childrens, DWORD* sgnNumChildren)
} }
} }
void STDCALL printPlugYVersion114()
{
if (active_Windowed)
SetWindowedOptions();
if (active_PrintPlugYVersion)
{
char buf[20];
void* textbox = D2CreateTextBox(newTextBoxData);
void** childrens = (void**)0x779350;
DWORD* sgnNumChildren = (DWORD*)0x779944;
childrens[*sgnNumChildren] = textbox;
d2_assert((*sgnNumChildren)++ >= 40, "sgnNumChildren < MAX_CHILDREN", __FILE__, __LINE__);
sprintf(buf, "PlugY %s", PLUGY_VERSION);
D2PrintLineOnTextBox(textbox, buf, colorOfPlugYVersion);
}
}
FCT_ASM( caller_printPlugYVersion114 )
POP ESI
CALL printPlugYVersion114
MOV ECX, 0x115
JMP ESI
}}
FCT_ASM ( caller_printPlugYVersion ) FCT_ASM ( caller_printPlugYVersion )
POP ESI POP ESI
PUSH DWORD PTR [ESI+2] PUSH DWORD PTR [ESI+2]
@@ -51,9 +76,14 @@ void Install_PrintPlugYVersion()
log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n"); log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n");
if (version_D2Launch == V114d) {
mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 33798);
memt_byte(0xB9, 0xE8);
MEMT_REF4(0x00000115, caller_printPlugYVersion114);
} else {
// Print PlugY version. // Print PlugY version.
mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11); mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 10A11);
MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion); MEMJ_REF4(D2CreateTextBox, caller_printPlugYVersion);
//6FA19638 |. E8 1BED0000 CALL <JMP.&D2Win.#10017> //6FA19638 |. E8 1BED0000 CALL <JMP.&D2Win.#10017>
//6FA517C6 |. E8 6F81FFFF CALL <JMP.&D2Win.#10147> //6FA517C6 |. E8 6F81FFFF CALL <JMP.&D2Win.#10147>
//6FA578A6 |. E8 D71FFFFF CALL <JMP.&D2Win.#10113> //6FA578A6 |. E8 D71FFFFF CALL <JMP.&D2Win.#10113>
@@ -61,6 +91,7 @@ void Install_PrintPlugYVersion()
//6FA56AF6 |. E8 432EFFFF CALL <JMP.&D2Win.#10098> //6FA56AF6 |. E8 432EFFFF CALL <JMP.&D2Win.#10098>
//6FA58060 |. E8 ED18FFFF CALL <JMP.&D2Win.#10098> //6FA58060 |. E8 ED18FFFF CALL <JMP.&D2Win.#10098>
//6FA50A10 |. E8 218FFFFF CALL <JMP.&D2Win.#10164> //6FA50A10 |. E8 218FFFFF CALL <JMP.&D2Win.#10164>
}
log_msg("\n"); log_msg("\n");
@@ -83,6 +114,12 @@ FCT_ASM ( caller_VersionChange_10 )
RETN RETN
}} }}
FCT_ASM(caller_VersionChange_114)
MOV EDX, versionText
MOV ECX, ESI
RETN
}}
void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
{ {
static int isInstalled = false; static int isInstalled = false;
@@ -96,9 +133,14 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
// Print LoD/Mod version. // Print LoD/Mod version.
if (version_D2Launch >= V110) if (version_D2Launch == V114d) {
mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000
memt_byte(0x8D, 0xE8); // CALL
MEMT_REF4(0xCE8BC055, caller_VersionChange_114);
//memt_byte(0xCE, 0x90); // NOP
} else if (version_D2Launch >= V110)
{ {
mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4);//6FA19721-6FA10000 mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 10AE4);//6FA19721-6FA10000
memt_byte( 0x8D, 0xE8 ); // CALL memt_byte( 0x8D, 0xE8 ); // CALL
MEMT_REF4( 0x8B102454 , caller_VersionChange_10); MEMT_REF4( 0x8B102454 , caller_VersionChange_10);
memt_byte( 0xCF, 0x90 ); // NOP memt_byte( 0xCF, 0x90 ); // NOP
@@ -115,7 +157,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
//6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] //6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
//6FA50AE8 |. 8BCF MOV ECX,EDI //6FA50AE8 |. 8BCF MOV ECX,EDI
} else { } else {
mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB); mem_seek R8(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB, 10AEB);
MEMJ_REF4( D2PrintLineOnTextBox, versionChange); MEMJ_REF4( D2PrintLineOnTextBox, versionChange);
//6FA19729 |. E8 88EB0000 CALL <JMP.&D2Win.#10046> //6FA19729 |. E8 88EB0000 CALL <JMP.&D2Win.#10046>
//6FA518A1 |. E8 267FFFFF CALL <JMP.&D2Win.#10061> //6FA518A1 |. E8 267FFFFF CALL <JMP.&D2Win.#10061>

View File

@@ -11,6 +11,10 @@
#include "newInterfaces.h" #include "newInterfaces.h"
#include "common.h" #include "common.h"
#include <stdio.h> #include <stdio.h>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#define getXCloseBtn() RX(0x110) #define getXCloseBtn() RX(0x110)
#define getLCloseBtn() 32 #define getLCloseBtn() 32
@@ -61,6 +65,62 @@ extern int lastPage;
int nbStatsInterface; int nbStatsInterface;
statsInterfaceBIN* statsInterface; statsInterfaceBIN* statsInterface;
void loadStatsInterfaceDesc_114() {
char filename[0x104];
strcpy(filename, "PlugY\\statsinterface.txt");
char fileTemp[0x104];
log_msg("Load custom file : %s", filename);
strcpy(fileTemp, filename);
D2FogGetInstallPath(filename, 0x104 - strlen(filename));
strcat(filename, fileTemp);
log_msg("-> %s\n", filename);
std::ifstream statsFile(filename);
std::vector<std::string> stats;
if (statsFile.is_open()) {
std::string line;
while (std::getline(statsFile, line)) {
if (line.length() > 0 && line[0] != '*') {
//log_msg("Loading stat:\n");
//log_msg("%s\n\n", line);
stats.push_back(line);
}
}
} else {
log_msg("FAILED TO OPEN FILE: %s", filename);
}
statsFile.close();
nbStatsInterface = stats.size();
statsInterface = new statsInterfaceBIN[nbStatsInterface];
for (int i = 0; i < nbStatsInterface; ++i) {
std::istringstream ss(stats[i]);
auto& stat = statsInterface[i];
std::string token = "";
std::getline(ss, token, '\t');
//log_msg("Stat (%u) %s\n", i, token.c_str());
std::getline(ss, token, '\t');
stat.enabled = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tenabled = %u\n", stat.enabled);
std::getline(ss, token, '\t');
stat.page = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tpage = %u\n", stat.page);
std::getline(ss, token, '\t');
stat.x = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tx = %u\n", stat.x);
std::getline(ss, token, '\t');
stat.y = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\ty = %u\n", stat.y);
std::getline(ss, token, '\t');
stat.color = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tcolor = %u\n", stat.color);
std::getline(ss, token, '\t');
stat.font = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tfont = %u\n", stat.font);
std::getline(ss, token, '\t');
stat.statsID = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tstatsID = %u\n", stat.statsID);
}
}
void loadStatsInterfaceDesc(DWORD mempool) void loadStatsInterfaceDesc(DWORD mempool)
{ {
log_msg("loadStatsInterfaceDesc(%d)\n",mempool); log_msg("loadStatsInterfaceDesc(%d)\n",mempool);
@@ -75,7 +135,15 @@ void loadStatsInterfaceDesc(DWORD mempool)
// ADD_LOOKUP_WORD(10, "stat", lookupItemStatCost); // ADD_LOOKUP_WORD(10, "stat", lookupItemStatCost);
ADD_WORD_FIELD(12, "statID"); ADD_WORD_FIELD(12, "statID");
ADD_TERM_FIELD(); ADD_TERM_FIELD();
//log_msg("statsInterface=0x%08x\nnbStatsInterface=0x%08x\n", statsInterface, &nbStatsInterface);
//void* test = D2ReadFile(mempool, "PlugY\\statsinterface.txt", (DWORD*)nbStatsInterface, __FILE__, __LINE__);
//void* test = D2CompileTxtFile(mempool, "PlugY\\statsinterface.txt", TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN));
//log_msg("D2CompileTxtFile()=0x%08x", test);
if (version_D2Game == V114d) {
loadStatsInterfaceDesc_114();
} else {
BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, "PlugY\\statsinterface.txt"); BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, "PlugY\\statsinterface.txt");
}
lastPage = 0; lastPage = 0;
for (i=0; i<nbStatsInterface; i++) for (i=0; i<nbStatsInterface; i++)
@@ -89,7 +157,12 @@ void freeStatsInterfaceDesc()
if (statsInterface) if (statsInterface)
{ {
D2FogMemDeAlloc(statsInterface,__FILE__,__LINE__,0); if (version_D2Game == V114d) {
delete[] statsInterface;
}
else {
D2FogMemDeAlloc(statsInterface, __FILE__, __LINE__, 0);
}
statsInterface = NULL; statsInterface = NULL;
nbStatsInterface = 0; nbStatsInterface = 0;
} }

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Interface functions Interface functions
@@ -56,6 +57,9 @@ int GetCurrentPage()
void STDCALL printCustomPage() void STDCALL printCustomPage()
{ {
if(onRealm) {D2PrintStatsPage();return;} if(onRealm) {D2PrintStatsPage();return;}
//printNewStatsPageTwo(selectedPage); return;
if ( (selectedPage > 0) && (selectedPage<=lastPage) ) if ( (selectedPage > 0) && (selectedPage<=lastPage) )
printNewStatsPageTwo(selectedPage); printNewStatsPageTwo(selectedPage);
else if (selectedPage == lastPage+1) else if (selectedPage == lastPage+1)
@@ -92,6 +96,18 @@ DWORD STDCALL mouseCustomPageLeftUp(sWinMessage* msg)
return -1; return -1;
} }
FCT_ASM( caller_DontPrintBorder_114 )
MOV ESI, bDontPrintBorder
TEST ESI, ESI
JE printBorder
MOV bDontPrintBorder, 0
ADD DWORD PTR SS : [ESP], 0x14F
RETN
printBorder :
MOV ESI, DWORD PTR DS : [0x7BEF18]
RETN
}}
FCT_ASM ( caller_DontPrintBorder_111 ) FCT_ASM ( caller_DontPrintBorder_111 )
MOV ECX,bDontPrintBorder MOV ECX,bDontPrintBorder
TEST ECX,ECX TEST ECX,ECX
@@ -116,6 +132,30 @@ printBorder:
RETN RETN
}} }}
FCT_ASM(caller_mouseCustomPageLeftDown_114)
PUSH EAX
PUSH ESI
CALL mouseCustomPageLeftDown
TEST EAX, EAX
POP EAX
JE end_mouseNewPageLDown
;JG continue_mouseNewPageLDown
LEA ECX, DWORD PTR DS : [EAX + 0x80]
RETN
continue_mouseNewPageLDown :
POP EAX
ADD EAX, 0x170
PUSH 0x4A7720
JMP EAX
RETN
end_mouseNewPageLDown :
POP EDI
POP ESI
POP EBX
POP EBP
RETN 4
}}
FCT_ASM ( caller_mouseCustomPageLeftDown_111 ) FCT_ASM ( caller_mouseCustomPageLeftDown_111 )
PUSH EAX PUSH EAX
@@ -185,7 +225,27 @@ end_mouseNewPageLDown:
RETN 4 RETN 4
}} }}
FCT_ASM(caller_mouseCustomPageLeftUp_114)
PUSH EBP
CALL mouseCustomPageLeftUp
TEST EAX, EAX
JE end_mouseNewPageLUp
;JG continue_mouseNewPageLUp
MOV EAX, DWORD PTR DS : [ptWindowStartX]
MOV EAX, DWORD PTR DS : [EAX]
RETN
continue_mouseNewPageLUp :
ADD DWORD PTR SS : [ESP], 0x2C4
RETN
end_mouseNewPageLUp :
ADD ESP, 4
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
RETN 4
}}
FCT_ASM ( caller_mouseCustomPageLeftUp_111 ) FCT_ASM ( caller_mouseCustomPageLeftUp_111 )
PUSH EBP PUSH EBP
@@ -257,7 +317,11 @@ end_mouseNewPageLUp:
FCT_ASM( caller_resetSelectedPageByToolBar_114 )
MOV selectedPage, 0
MOV EDX, 2
RETN
}}
FCT_ASM ( caller_resetSelectedPageByToolBar ) FCT_ASM ( caller_resetSelectedPageByToolBar )
@@ -269,6 +333,13 @@ noJump:
RETN RETN
}} }}
FCT_ASM( caller_resetSelectedPageByKey_114 )
MOV selectedPage, 0
MOV EDX, DWORD PTR DS : [ECX * 4 + 0x712698]
RETN
}}
FCT_ASM ( caller_resetSelectedPageByKey ) FCT_ASM ( caller_resetSelectedPageByKey )
MOV selectedPage,0 MOV selectedPage,0
POP EAX POP EAX
@@ -308,10 +379,10 @@ void Install_NewInterfaces()
{ {
if ( version_D2Client >= V111 ) if ( version_D2Client >= V111 )
{ {
//Reset selectedPage variable on opening stats page // Reset selectedPage variable on opening stats page
mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE); mem_seek R8(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE, 7EC7A);
memt_byte( 0x83, 0xE8 ); // CALL caller_resetSelectedPage memt_byte( version_D2Client == V114d ? 0xBA : 0x83, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( 0x1F7426F8, caller_resetSelectedPageByToolBar); MEMT_REF4( version_D2Client == V114d ? 0x00000002 : 0x1F7426F8, version_D2Client == V114d ? caller_resetSelectedPageByToolBar_114 : caller_resetSelectedPageByToolBar);
//6FAFB79E > 83F8 26 CMP EAX,26 //6FAFB79E > 83F8 26 CMP EAX,26
//6FAFB7A1 . 74 1F JE SHORT D2Client.6FAFB7C2 //6FAFB7A1 . 74 1F JE SHORT D2Client.6FAFB7C2
//6FB3F73E > 83F8 26 CMP EAX,26 //6FB3F73E > 83F8 26 CMP EAX,26
@@ -323,9 +394,17 @@ void Install_NewInterfaces()
//6FB741FE > 83F8 26 CMP EAX,26 //6FB741FE > 83F8 26 CMP EAX,26
//6FB74201 . 74 1F JE SHORT D2Client.6FB05E32 //6FB74201 . 74 1F JE SHORT D2Client.6FB05E32
mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A); mem_seek R8(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A, 6A91D);
memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage if (version_D2Client == V114d) {
MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey); memt_byte(0x8B, 0x90);
memt_byte(0x14, 0x90);
memt_byte(0x8D, 0xE8);
MEMT_REF4(0x00712698, caller_resetSelectedPageByKey_114);
}
else {
memt_byte(0x55, 0xE8); // CALL caller_resetSelectedPage
MEMT_REF4(0xD53BED33, caller_resetSelectedPageByKey);
}
//6FACE55A . 55 PUSH EBP //6FACE55A . 55 PUSH EBP
//6FACE55B . 33ED XOR EBP,EBP //6FACE55B . 33ED XOR EBP,EBP
//6FACE55D . 3BD5 CMP EDX,EBP //6FACE55D . 3BD5 CMP EDX,EBP
@@ -358,7 +437,7 @@ void Install_NewInterfaces()
//6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP //6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP
} else { } else {
//Reset selectedPage variable on opening stats page //Reset selectedPage variable on opening stats page
mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000, 0000);//((DWORD)D2TogglePage+0x218); mem_seek R8(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000, 0000, 0000);//((DWORD)D2TogglePage+0x218);
memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage); MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage);
//6FB23478 |. 85C0 TEST EAX,EAX //6FB23478 |. 85C0 TEST EAX,EAX
@@ -368,8 +447,12 @@ void Install_NewInterfaces()
} }
// Print custom page // Print custom page
mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549); mem_seek R8(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549, 57052);
MEMC_REF4( D2PrintStatsPage, printCustomPage); if (version_D2Client == V114d) {
MEMT_REF4(0x00050CAA, printCustomPage);
} else {
MEMC_REF4(D2PrintStatsPage, printCustomPage);
}
//6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60 //6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60
//6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0 //6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0
//6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320 //6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320
@@ -378,9 +461,10 @@ void Install_NewInterfaces()
//6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280 //6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280
// Don't print Border // Don't print Border
mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6); mem_seek R8(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6, 98707);
memt_byte( 0xB9, 0xE8 ); // CALL caller_DontPrintBorder memt_byte( version_D2Client == V114d ? 0x8B : 0xB9, 0xE8 ); // CALL caller_DontPrintBorder
MEMT_REF4( 0x00000012, version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder); MEMT_REF4( version_D2Client == V114d ? 0x7BEF1835 : 0x00000012, version_D2Client == V114d ? caller_DontPrintBorder_114 : version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder);
if (version_D2Client == V114d) memt_byte(0x00, 0x90);
//6FAFF4C6 > B9 12000000 MOV ECX,12 //6FAFF4C6 > B9 12000000 MOV ECX,12
//6FADD366 |. B9 12000000 MOV ECX,12 //6FADD366 |. B9 12000000 MOV ECX,12
//6FB65A46 |. B9 12000000 MOV ECX,12 //6FB65A46 |. B9 12000000 MOV ECX,12
@@ -389,9 +473,9 @@ void Install_NewInterfaces()
//6FB1D2B6 |. B9 12000000 MOV ECX,12 //6FB1D2B6 |. B9 12000000 MOV ECX,12
// Manage mouse down (Play sound) // Manage mouse down (Play sound)
mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6); mem_seek R8(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6, A7731);
memt_byte( 0x8D, 0xE8 ); // CALL memt_byte( 0x8D, 0xE8 ); // CALL
MEMT_REF4( 0x00008088, version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9); MEMT_REF4( 0x00008088, version_D2Client == V114d ? caller_mouseCustomPageLeftDown_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9);
memt_byte( 0x00, 0x90 ); // NOP memt_byte( 0x00, 0x90 ); // NOP
//6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
//6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
@@ -401,9 +485,9 @@ void Install_NewInterfaces()
//6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
// Manage mouse up // Manage mouse up
mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459); mem_seek R8(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459, A78DA);
memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp
MEMT_REF4( ptWindowStartX, version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9); MEMT_REF4( ptWindowStartX, version_D2Client == V114d ? caller_mouseCustomPageLeftUp_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9);
//6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748] //6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748]
//6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24] //6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24]
//6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8] //6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8]

View File

@@ -170,6 +170,7 @@ const char* S_active_EnabledTXTFilesWithMSExcel= "EnabledTXTFilesWhenMSExcelOpen
const char* S_active_DisplayBaseStatsValue = "ActiveDisplayBaseStatsValue"; const char* S_active_DisplayBaseStatsValue = "ActiveDisplayBaseStatsValue";
const char* S_active_LadderRunewords = "ActiveLadderRunewords"; const char* S_active_LadderRunewords = "ActiveLadderRunewords";
const char* S_active_EnabledCowPortalWhenCowKingWasKill = "ActiveCowPortalWhenCowKingWasKilled"; const char* S_active_EnabledCowPortalWhenCowKingWasKill = "ActiveCowPortalWhenCowKingWasKilled";
const char* S_active_DoNotCloseNihlathakPortal = "ActiveDoNotCloseNihlathakPortal";
const char* S_DLL = "DLL:\t"; const char* S_DLL = "DLL:\t";
const char* S_DEFAULT = "DEFAULT:"; const char* S_DEFAULT = "DEFAULT:";
@@ -783,9 +784,9 @@ void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0"); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0");
nbPlayersCommandByDefault = atoi(buffer); nbPlayersCommandByDefault = atoi(buffer);
if (version_D2Common == V110) if (version_D2Common == V109 || version_D2Common == V109b)
{if (nbPlayersCommandByDefault > 8) nbPlayersCommandByDefault=8;} {if (nbPlayersCommandByDefault > 64) nbPlayersCommandByDefault=64;}
else if (nbPlayersCommandByDefault > 64) nbPlayersCommandByDefault=64; else if (nbPlayersCommandByDefault > 8) nbPlayersCommandByDefault=8;
log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault); log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0"); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0");
@@ -819,6 +820,10 @@ void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledCowPortalWhenCowKingWasKill, "0"); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledCowPortalWhenCowKingWasKill, "0");
active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer); active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer);
log_msg("active_EnabledCowPortalWhenCowKingWasKill= %u\n\n", active_EnabledCowPortalWhenCowKingWasKill); log_msg("active_EnabledCowPortalWhenCowKingWasKill= %u\n\n", active_EnabledCowPortalWhenCowKingWasKill);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DoNotCloseNihlathakPortal, "0");
active_DoNotCloseNihlathakPortal = atoi(buffer);
log_msg("active_DoNotCloseNihlathakPortal= %u\n\n", active_DoNotCloseNihlathakPortal);
} }

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Adding custom data. Adding custom data.
Save and load infinity & shared Stash Save and load infinity & shared Stash
@@ -72,11 +73,9 @@ void STDCALL updateClientPlayerOnLoading(Unit* ptChar)
log_msg("--- Start updateClientPlayerOnLoading ---\n"); log_msg("--- Start updateClientPlayerOnLoading ---\n");
if (PCGame->isLODGame) if (PCGame->isLODGame)
{ {
//selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash); PCPY->showSharedStash = openSharedStashOnLoading;
if (openSharedStashOnLoading) selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash);
toggleToSharedStash(ptChar);
else
toggleToSelfStash(ptChar);
log_msg("End update client on loading.\n\n"); log_msg("End update client on loading.\n\n");
} }
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0); updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
@@ -174,6 +173,22 @@ void FASTCALL updateItem_111(Unit* ptItem, Unit* ptChar)
} }
} }
FCT_ASM( caller_updateItem_114 )
PUSH EAX
MOV EAX, 0x552F60
CALL EAX
PUSH EAX
PUSH ECX
PUSH EDX
MOV ECX, EAX
MOV EDX, EDI
CALL updateItem_111
POP EDX
POP ECX
POP EAX
RETN 4
}}
FCT_ASM ( caller_updateItem_111 ) FCT_ASM ( caller_updateItem_111 )
MOV ECX,ESI MOV ECX,ESI
MOV EDX,EBP MOV EDX,EBP
@@ -184,6 +199,22 @@ FCT_ASM ( caller_updateItem_111 )
JMP EAX JMP EAX
}} }}
FCT_ASM( caller_updateItemB_114 )
PUSH EAX
MOV EAX, 0x552F60
CALL EAX
PUSH EAX
PUSH ECX
PUSH EDX
MOV ECX, EAX
MOV EDX, EDI
CALL updateItem_111
POP EDX
POP ECX
POP EAX
RETN 4
}}
FCT_ASM ( caller_updateItemB_111 ) FCT_ASM ( caller_updateItemB_111 )
MOV EDX,EBP MOV EDX,EBP
CALL updateItem_111 CALL updateItem_111
@@ -207,6 +238,16 @@ FCT_ASM ( caller_updateItem_9 )
RETN 4 RETN 4
}} }}
FCT_ASM( caller_updateClientPlayerOnLoading_114 )
PUSH DWORD PTR SS : [ESP + 0x14]
CALL updateClientPlayerOnLoading
POP ECX
POP EDI
POP ESI
XOR EAX, EAX
POP EBX
JMP ECX
}}
FCT_ASM ( caller_updateClientPlayerOnLoading ) FCT_ASM ( caller_updateClientPlayerOnLoading )
PUSH DWORD PTR SS:[ESP+0x14] PUSH DWORD PTR SS:[ESP+0x14]
@@ -219,6 +260,13 @@ FCT_ASM ( caller_updateClientPlayerOnLoading )
JMP ECX JMP ECX
}} }}
FCT_ASM( callerServer_getNextItemToFree_114 )
PUSH DWORD PTR SS : [ESP + 4]
PUSH DWORD PTR SS : [ESP + 0x10]
CALL getNextItemToFree
RETN 4
}}
FCT_ASM ( callerServer_getNextItemToFree_111 ) FCT_ASM ( callerServer_getNextItemToFree_111 )
PUSH DWORD PTR SS:[ESP+4] PUSH DWORD PTR SS:[ESP+4]
PUSH DWORD PTR SS:[ESP+0x30] PUSH DWORD PTR SS:[ESP+0x30]
@@ -240,6 +288,12 @@ FCT_ASM ( callerServer_getNextItemToFree_9 )
RETN 4 RETN 4
}} }}
FCT_ASM( callerClient_getNextItemToFree_114 )
PUSH DWORD PTR SS : [ESP + 4]
PUSH DWORD PTR SS : [ESP + 0xC]
CALL getNextItemToFree
RETN 4
}}
FCT_ASM ( callerClient_getNextItemToFree_111 ) FCT_ASM ( callerClient_getNextItemToFree_111 )
PUSH DWORD PTR SS:[ESP+4] PUSH DWORD PTR SS:[ESP+4]
@@ -275,8 +329,12 @@ void Install_PlayerCustomData()
log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n"); log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n");
// Initialize custom data. // Initialize custom data.
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 ); mem_seek(version_D2Client == V114d ? offset_D2Common + 0x221FDD : 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); if (version_D2Client == V114d) {
MEMT_REF4(0xFFDE944F, init_PlayerCustomData);
} else {
MEMJ_REF4(D2AllocMem, init_PlayerCustomData);
}
//01BD0381 |. E8 C03F0000 CALL <JMP.&Fog.#10045> //01BD0381 |. E8 C03F0000 CALL <JMP.&Fog.#10045>
//6FD9ED5D |. E8 94A4FBFF CALL <JMP.&Fog.#10045> //6FD9ED5D |. E8 94A4FBFF CALL <JMP.&Fog.#10045>
//6FDABFCD |. E8 34D2FAFF CALL <JMP.&Fog.#10045> //6FDABFCD |. E8 34D2FAFF CALL <JMP.&Fog.#10045>
@@ -287,9 +345,13 @@ void Install_PlayerCustomData()
if ( version_D2Game >= V111 ) if ( version_D2Game >= V111 )
{ {
// update item // update item
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81); mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81, 1978F3);
memt_byte( 0x8B ,0xE8); // CALL if (version_D2Game == V114d) {
MEMT_REF4( 0x52182454, caller_updateItem_111); MEMT_REF4(0xFFFBB669, caller_updateItem_114);
} else {
memt_byte(0x8B, 0xE8); // CALL
MEMT_REF4(0x52182454, caller_updateItem_111);
}
//0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
//0200BC75 |. 52 |PUSH EDX ; /Arg1 //0200BC75 |. 52 |PUSH EDX ; /Arg1
//02023C51 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //02023C51 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
@@ -301,9 +363,13 @@ void Install_PlayerCustomData()
//6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
//6FC95C85 |. 52 |PUSH EDX //6FC95C85 |. 52 |PUSH EDX
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1); mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1, 197943);
memt_byte( 0x8B ,0xE8); // CALL if (version_D2Game == V114d) {
MEMT_REF4( 0x52182454, caller_updateItemB_111); MEMT_REF4(0xFFFBB619, caller_updateItemB_114);
} else {
memt_byte(0x8B, 0xE8); // CALL
MEMT_REF4(0x52182454, caller_updateItemB_111);
}
//0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] //0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
//0200BCD5 |. 52 ||PUSH EDX ; /Arg1 //0200BCD5 |. 52 ||PUSH EDX ; /Arg1
//02023CB1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] //02023CB1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
@@ -317,18 +383,23 @@ void Install_PlayerCustomData()
} else { } else {
// update item // update item
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000); mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000, 0000);
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
//6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00 //6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000); mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000, 0000);
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
//6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00 //6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00
} }
// Update client on loading // Update client on loading
mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548);//6FC325D4-6FC30000 mem_seek R8(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548, 139A20);//6FC325D4-6FC30000
memt_byte( 0x5F ,0xE8); // CALL if (version_D2Game == V114d) {
MEMT_REF4( 0xC0335D5E , caller_updateClientPlayerOnLoading); memt_byte(0x5F, 0xE8); // CALL
MEMT_REF4(0x5BC0335E, caller_updateClientPlayerOnLoading_114);
} else {
memt_byte(0x5F, 0xE8); // CALL
MEMT_REF4(0xC0335D5E, caller_updateClientPlayerOnLoading);
}
//6FC325D4 |> 5F POP EDI //6FC325D4 |> 5F POP EDI
//6FC325D5 |. 5E POP ESI //6FC325D5 |. 5E POP ESI
//6FC325D6 |. 5D POP EBP //6FC325D6 |. 5D POP EBP
@@ -355,8 +426,12 @@ void Install_PlayerCustomData()
//6FD0754B |. 33C0 XOR EAX,EAX //6FD0754B |. 33C0 XOR EAX,EAX
// Free custom data. // Free custom data.
mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D); mem_seek R8(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D, 2220DD);
MEMJ_REF4( D2FreeMem, free_PlayerCustomData); if (version_D2Common == V114d) {
MEMT_REF4(0xFFDE939F, free_PlayerCustomData);
} else {
MEMJ_REF4(D2FreeMem, free_PlayerCustomData);
}
//01BD0482 |. E8 C53E0000 CALL <JMP.&Fog.#10046> //01BD0482 |. E8 C53E0000 CALL <JMP.&Fog.#10046>
//6FD9F82C |. E8 E399FBFF CALL <JMP.&Fog.#10046> //6FD9F82C |. E8 E399FBFF CALL <JMP.&Fog.#10046>
//6FDAC9CC |. E8 3BC8FAFF CALL <JMP.&Fog.#10046> //6FDAC9CC |. E8 3BC8FAFF CALL <JMP.&Fog.#10046>
@@ -365,8 +440,12 @@ void Install_PlayerCustomData()
//6FD6705C |. E8 CF3EFFFF CALL <JMP.&Fog.#10046> //6FD6705C |. E8 CF3EFFFF CALL <JMP.&Fog.#10046>
// Free item in Stash (Server-side) // Free item in Stash (Server-side)
mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2); mem_seek R8(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2, 155B34);
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204 if (version_D2Game == V114d) {
MEMT_REF4(0x000E8468, callerServer_getNextItemToFree_114);
} else {
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> //6FCBD5A3 . E8 04E20500 CALL <JMP.&D2Common.#10304>
//02019111 |. E8 5016F7FF |CALL <JMP.&D2Common.#10934> //02019111 |. E8 5016F7FF |CALL <JMP.&D2Common.#10934>
//0202FDB1 |. E8 30AAF4FF |CALL <JMP.&D2Common.#11140> //0202FDB1 |. E8 30AAF4FF |CALL <JMP.&D2Common.#11140>
@@ -375,8 +454,13 @@ void Install_PlayerCustomData()
//6FC8F7C1 |. E8 44AEF9FF |CALL <JMP.&D2Common.#10879> //6FC8F7C1 |. E8 44AEF9FF |CALL <JMP.&D2Common.#10879>
// Free item in Stash (Client-side) // Free item in Stash (Client-side)
mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4);//6FB29B31-6FAA0000 mem_seek R8(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4, 66D02);//6FB29B31-6FAA0000
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34 if (version_D2Client == V114d) {
MEMT_REF4(0x001D729A, callerClient_getNextItemToFree_114);
} else {
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> //6FB29B31 E8 340F0400 CALL <JMP.&D2Common.#10304>
//6FAD6403 |. E8 925DFEFF |CALL <JMP.&D2Common.#10934> //6FAD6403 |. E8 925DFEFF |CALL <JMP.&D2Common.#10934>
//6FAFC263 |. E8 38FFFBFF |CALL <JMP.&D2Common.#11140> //6FAFC263 |. E8 38FFFBFF |CALL <JMP.&D2Common.#11140>
@@ -387,8 +471,8 @@ void Install_PlayerCustomData()
if ( version_D2Common >= V110 ) if ( version_D2Common >= V110 )
{ {
// Test if it's already removed from inventory // Test if it's already removed from inventory
mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23, 3B393); mem_seek R8(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23, 3B393, 23ADB5);
memt_byte( 0x0D , 0x07); memt_byte( version_D2Common == V114d ? 0x0E : 0x0D , 0x07);
//01D2E688 75 0D JNZ SHORT D2Common.01D2E697 //01D2E688 75 0D JNZ SHORT D2Common.01D2E697
//6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41 //6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41
//6FD92132 |. 74 0D JE SHORT D2Common.6FD92141 //6FD92132 |. 74 0D JE SHORT D2Common.6FD92141
@@ -396,18 +480,18 @@ void Install_PlayerCustomData()
//6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31 //6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31
//6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1 //6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1
} else { } else {
mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x74 , 0x90);//MOV EAX,EDI
memt_byte( 0x35 , 0x90);//NOP memt_byte( 0x35 , 0x90);//NOP
//6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD //6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD
mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x0F , 0x90);//MOV EAX,EDI memt_byte( 0x0F , 0x90);//MOV EAX,EDI
memt_byte( 0x84 , 0x90);//NOP memt_byte( 0x84 , 0x90);//NOP
memt_dword( 0x000000BF , 0x90909090);//NOP memt_dword( 0x000000BF , 0x90909090);//NOP
//6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F //6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F
mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x74 , 0x90);//MOV EAX,EDI
memt_byte( 0x6F , 0x90);//NOP memt_byte( 0x6F , 0x90);//NOP
//6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD //6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD

Binary file not shown.

View File

@@ -1,18 +1,39 @@
 
Microsoft Visual Studio Solution File, Format Version 10.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual C++ Express 2008 # Visual Studio 14
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcproj", "{EB63DF4E-A019-4522-A140-9E8C7350B331}" VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcxproj", "{EB63DF4E-A019-4522-A140-9E8C7350B331}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugYInstall", "..\PlugYInstall\PlugYInstall.vcxproj", "{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugYRun", "..\PlugYRun\PlugYRun.vcxproj", "{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Restore|Win32 = Restore|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.ActiveCfg = Debug|Win32 {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.ActiveCfg = Debug|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.Build.0 = Debug|Win32 {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.Build.0 = Debug|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.ActiveCfg = Release|Win32 {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.ActiveCfg = Release|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.Build.0 = Release|Win32 {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.Build.0 = Release|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Restore|Win32.ActiveCfg = Release|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Restore|Win32.Build.0 = Release|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Debug|Win32.ActiveCfg = Debug|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Debug|Win32.Build.0 = Debug|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Release|Win32.ActiveCfg = Release|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Release|Win32.Build.0 = Release|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Restore|Win32.ActiveCfg = Restore|Win32
{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Restore|Win32.Build.0 = Restore|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Debug|Win32.ActiveCfg = Debug|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Debug|Win32.Build.0 = Debug|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Release|Win32.ActiveCfg = Release|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Release|Win32.Build.0 = Release|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Restore|Win32.ActiveCfg = Release|Win32
{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Restore|Win32.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

Binary file not shown.

View File

@@ -159,7 +159,7 @@
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PlugY.dll&quot;" CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PlugY.dll&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Adding custom data. Adding custom data.
Save and load infinity & shared Stash Save and load infinity & shared Stash
@@ -79,6 +80,17 @@ ISNOTMODDATA:
JMP DWORD PTR CS:[LeaveCriticalSection] JMP DWORD PTR CS:[LeaveCriticalSection]
}} }}
FCT_ASM( caller_isModFile_114 )
PUSH EBX
CALL isModFile
TEST EAX, EAX
JE ISNOTMODDATA
MOV EDX, 0x1
ISNOTMODDATA :
LEA EAX, DWORD PTR SS : [EBP - 0x108]
RETN
}}
void Install_PlugYFiles() void Install_PlugYFiles()
{ {
static int isInstalled = false; static int isInstalled = false;
@@ -87,10 +99,14 @@ void Install_PlugYFiles()
log_msg("Patch Storm to found custom file. (PlugYFiles)\n"); log_msg("Patch Storm to found custom file. (PlugYFiles)\n");
// Try in Diablo II\PlugY\ if file not found // Try in Diablo II\PlugY\ if file not found
mem_seek R7(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) ); mem_seek R8(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79, 19369);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) );
memt_byte( 0xFF ,0x90); // NOP memt_byte( version_D2Client == V114d ? 0x8D : 0xFF ,0x90); // NOP
memt_byte( 0x15 ,0xE8); // CALL memt_byte( version_D2Client == V114d ? 0x85 : 0x15 ,0xE8); // CALL
MEMD_REF4( LeaveCriticalSection, version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile); if (version_Storm == V114d) {
MEMT_REF4(0xFFFFFEF8, caller_isModFile_114);
} else {
MEMD_REF4(LeaveCriticalSection, version_Storm == V114d ? caller_isModFile_114 : version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile);
}
//6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
@@ -148,12 +164,26 @@ void STDCALL freeCustomImages()
freeImagesFile(statsBackgroundImages); freeImagesFile(statsBackgroundImages);
} }
FCT_ASM( caller_loadCustomImages_114 )
CALL loadCustomImages
POP EAX
PUSH 0x6CC8B8
JMP EAX
}}
FCT_ASM ( caller_loadCustomImages ) FCT_ASM ( caller_loadCustomImages )
CALL loadCustomImages CALL loadCustomImages
MOV ECX,0x0C MOV ECX,0x0C
RETN RETN
}} }}
FCT_ASM( caller_freeCustomImages_114 )
CALL freeCustomImages
POP EAX
PUSH 0x7BEF30
JMP EAX
}}
FCT_ASM ( caller_freeCustomImages ) FCT_ASM ( caller_freeCustomImages )
CALL freeCustomImages CALL freeCustomImages
MOV ECX,0x0C MOV ECX,0x0C
@@ -170,9 +200,9 @@ void Install_PlugYImagesFiles()
log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n"); log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n");
// Load custom images // Load custom images
mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE); mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 96955);
memt_byte( 0xB9 ,0xE8); memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68), 0xE8);
MEMT_REF4( 0x0000000C , caller_loadCustomImages); MEMT_REF4(version_D2Client == V114d ? 0x006CC8B8 : 0x0000000C, version_D2Client == V114d ? caller_loadCustomImages_114 : caller_loadCustomImages);
//6FAFE4B1 |. B9 0C000000 MOV ECX,0C //6FAFE4B1 |. B9 0C000000 MOV ECX,0C
//6FADE101 |. B9 0C000000 MOV ECX,0C //6FADE101 |. B9 0C000000 MOV ECX,0C
//6FB667E1 |. B9 0C000000 MOV ECX,0C //6FB667E1 |. B9 0C000000 MOV ECX,0C
@@ -181,9 +211,9 @@ void Install_PlugYImagesFiles()
//6FB1E0BE |. B9 0C000000 MOV ECX,0C //6FB1E0BE |. B9 0C000000 MOV ECX,0C
// Free custom images // Free custom images
mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D); mem_seek R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 96AFB);
memt_byte( 0xB9 ,0xE8); memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68),0xE8);
MEMT_REF4( 0x0000000C , caller_freeCustomImages); MEMT_REF4(version_D2Client == V114d ? 0x007BEF30 : 0x0000000C, version_D2Client == V114d ? caller_freeCustomImages_114 : caller_freeCustomImages);
//6FAFE639 |> B9 0C000000 MOV ECX,0C //6FAFE639 |> B9 0C000000 MOV ECX,0C
//6FADD12D |> B9 0C000000 MOV ECX,0C //6FADD12D |> B9 0C000000 MOV ECX,0C
//6FB6580D |> B9 0C000000 MOV ECX,0C //6FB6580D |> B9 0C000000 MOV ECX,0C
@@ -245,8 +275,8 @@ void Install_PlugYTxtFiles()
// lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000); // lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000);
// Load custom txt files // Load custom txt files
mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4); mem_seek R8(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4, 25A560);
MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); MEMC_REF4( D2LoadSuperuniques, version_D2Common == V114d ? caller_loadTxtFiles : version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles );
//6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500 //6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500
//6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510 //6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510
//01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0 //01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0
@@ -257,8 +287,12 @@ void Install_PlugYTxtFiles()
//6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40 //6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40
// Free custom txt files // Free custom txt files
mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3); mem_seek R8(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3, 25A1C8);
MEMJ_REF4( D2Fog10212, caller_freeTxtFiles ); if (version_D2Common == V114d) {
MEMT_REF4(0x00062EE4, caller_freeTxtFiles);
} else {
MEMJ_REF4(D2Fog10212, caller_freeTxtFiles);
}
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212> //6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212> //6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
//01B50185 |. E8 F8410700 CALL <JMP.&Fog.#10212> //01B50185 |. E8 F8410700 CALL <JMP.&Fog.#10212>

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Changing the current save path. Changing the current save path.
@@ -49,6 +50,46 @@ END_CHANGESP:
RETN RETN
}} }}
FCT_ASM( changeSavePath_114 )
PUSH EAX
PUSH EDI
PUSH EDX
PUSH ESI
MOV ESI, EBX
MOV EDI, DWORD PTR DS : [savePath]
XOR AL, AL
CLD
OR ECX, 0xFFFFFFFF
REPNE SCAS BYTE PTR ES : [EDI]
NOT ECX
SUB EDI, ECX
XCHG EDI, ESI
CMP BYTE PTR[ESI + 1], ':'
JE END_CHANGESP
//RELATIVE_PATH:
MOV EDX, ECX
OR ECX, 0xFFFFFFFF
REPNE SCAS BYTE PTR ES : [EDI]
DEC EDI
CMP BYTE PTR[EDI - 1], '\\'
JE NEXT
MOV BYTE PTR[EDI], '\\'
INC EDI
NEXT :
MOV ECX, EDX
END_CHANGESP :
REP MOVS BYTE PTR ES : [EDI], BYTE PTR DS : [ESI]
POP ESI
POP EDX
POP EDI
POP EAX
CMP EAX, -1
JE DONOT_JMP
ADD DWORD PTR SS : [ESP], 5
DONOT_JMP :
RETN
}}
FCT_ASM( changeSavePath_111 ) FCT_ASM( changeSavePath_111 )
PUSH EAX PUSH EAX
PUSH EDI PUSH EDI
@@ -88,6 +129,29 @@ DONOT_JMP:
RETN RETN
}} }}
FCT_ASM( forCreateSavePath_114 )
PUSH EDI
MOV ESI, EBX
MOV EDI, DWORD PTR DS : [savePath]
MOV ECX, EDI
CMP BYTE PTR DS : [EDI + 1], ':'
JNZ END_CREATESP
PUSH ESI
XOR AL, AL
CLD
OR ECX, 0xFFFFFFFF
REPNE SCAS BYTE PTR ES : [EDI]
NOT ECX
SUB EDI, ECX
XCHG EDI, ESI
REP MOVS BYTE PTR ES : [EDI], BYTE PTR DS : [ESI]
POP ESI
END_CREATESP :
POP EDI
MOV DWORD PTR SS : [ESP + 8], ECX
JMP D2Storm503
}}
FCT_ASM ( forCreateSavePath ) FCT_ASM ( forCreateSavePath )
PUSH EDI PUSH EDI
MOV EDI,DWORD PTR DS:[savePath] MOV EDI,DWORD PTR DS:[savePath]
@@ -121,10 +185,10 @@ void Install_ChangingSavePath()
if (version_Fog >= V111) if (version_Fog >= V111)
{ {
// Appel de notre fct d'ajout d'un sous-r<>pertoire // Appel de notre fct d'ajout d'un sous-r<>pertoire
mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146); mem_seek R8(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146, 71A6);
memt_byte( 0x83 ,0xE8); // CALL changeSavePath memt_byte( 0x83 ,0xE8); // CALL changeSavePath
MEMT_REF4( 0x0575FFF8, changeSavePath_111); MEMT_REF4( 0x0575FFF8, version_Fog == V114d ? changeSavePath_114 : changeSavePath_111);
//6FF685F6 . 83F8 FF CMP EAX,-1 //6FF685F6 . 83F8 FF CMP EAX,-1
//6FF685F9 . 75 05 JNZ SHORT fog.6FF68600 //6FF685F9 . 75 05 JNZ SHORT fog.6FF68600
//6FF6C106 . 83F8 FF CMP EAX,-1 //6FF6C106 . 83F8 FF CMP EAX,-1
@@ -136,9 +200,13 @@ void Install_ChangingSavePath()
//6FF6E146 . 83F8 FF CMP EAX,-1 //6FF6E146 . 83F8 FF CMP EAX,-1
//6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64 //6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64
// Pour cr<63>er le bon chemin de sauvegarde // Pour cr<63>er le bon chemin de sauvegarde
mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166); mem_seek R8(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166, 71CA);
MEMJ_REF4( D2Storm503, forCreateSavePath); if (version_Fog == V114d) {
MEMT_REF4(0x0000C582, forCreateSavePath_114);
} else {
MEMJ_REF4(D2Storm503, forCreateSavePath);
}
//6FF68615 . E8 A246FFFF CALL <JMP.&Storm.#503> //6FF68615 . E8 A246FFFF CALL <JMP.&Storm.#503>
//6FF6C125 . E8 C20BFFFF CALL <JMP.&Storm.#503> //6FF6C125 . E8 C20BFFFF CALL <JMP.&Storm.#503>
//6FF6F0A5 . E8 34DDFEFF CALL <JMP.&Storm.#503> //6FF6F0A5 . E8 34DDFEFF CALL <JMP.&Storm.#503>
@@ -147,10 +215,10 @@ void Install_ChangingSavePath()
// Remove registry update // Remove registry update
mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A); mem_seek R8(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A, 71E9);
memt_byte( 0x56 ,0xEB); // JMP SHORT fog.6FF6862C memt_byte( version_Fog == V114d ? 0x53 : 0x56 ,0xEB); // JMP SHORT fog.6FF6862C
memt_byte( 0x6A ,0x10); // memt_byte( 0x6A ,0x10); //
memt_byte( 0x00 ,0x90); // NOP memt_byte( version_Fog == V114d ? 0x01 : 0x00 ,0x90); // NOP
//6FF6861A . 56 PUSH ESI //6FF6861A . 56 PUSH ESI
//6FF6861B . 6A 00 PUSH 0 //6FF6861B . 6A 00 PUSH 0
//6FF6861D . 68 7C7BF76F PUSH fog.6FF77B7C ; ASCII "Save Path" //6FF6861D . 68 7C7BF76F PUSH fog.6FF77B7C ; ASCII "Save Path"
@@ -173,7 +241,7 @@ void Install_ChangingSavePath()
} else { } else {
// Appel de notre fct d'ajout d'un sous-r<>pertoire // Appel de notre fct d'ajout d'un sous-r<>pertoire
mem_seek( (DWORD)D2FogGetSavePath + 0x28);//6FF61928-6FF50000 mem_seek( (DWORD)D2FogGetSavePath + 0x28);//6FF61928-6FF50000
memt_byte( 0x56 ,0x90); // NOP memt_byte( 0x56 ,0x90); // NOP
memt_byte( 0xFF ,0xE8); // CALL changeSavePath memt_byte( 0xFF ,0xE8); // CALL changeSavePath
@@ -182,7 +250,7 @@ void Install_ChangingSavePath()
//6FF61929 FFD5 CALL EBP //6FF61929 FFD5 CALL EBP
//6FF6192B 83F8 FF CMP EAX,-1 //6FF6192B 83F8 FF CMP EAX,-1
// Pour cr<63>er le bon chemin de sauvegarde // Pour cr<63>er le bon chemin de sauvegarde
mem_seek( (DWORD)D2FogGetSavePath + 0xBD);//6FF619BC mem_seek( (DWORD)D2FogGetSavePath + 0xBD);//6FF619BC
MEMJ_REF4( D2Storm503, forCreateSavePath); MEMJ_REF4( D2Storm503, forCreateSavePath);
//6FF619BC . E8 5D2A0000 CALL <JMP.&Storm.#503> //6FF619BC . E8 5D2A0000 CALL <JMP.&Storm.#503>

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Save Player Custom Data. Save Player Custom Data.
@@ -45,6 +46,12 @@ void STDCALL SaveSPPlayerCustomData(Unit* ptChar)
log_msg("End saving.\n\n"); log_msg("End saving.\n\n");
} }
FCT_ASM( caller_SaveSPPlayerCustomData_114 )
CALL D2FogGetSavePath
PUSH EDI
CALL SaveSPPlayerCustomData
RETN
}}
FCT_ASM ( caller_SaveSPPlayerCustomData_111 ) FCT_ASM ( caller_SaveSPPlayerCustomData_111 )
CALL D2FogGetSavePath CALL D2FogGetSavePath
@@ -279,7 +286,7 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg)
{ {
if( (msg->packID != customPackID) || !msg->isCustom) return 0; if( (msg->packID != customPackID) || !msg->isCustom) return 0;
log_msg("Saving Receive Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); log_msg("Saving Receive Packet: id = %d\ttype=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
bool isShared; bool isShared;
@@ -359,7 +366,42 @@ void STDCALL SaveMPPlayerCustomData(BYTE* dataD2Savefile )
} }
void STDCALL SaveMPPlayerCustomData_114()
{
if (!D2isLODGame()) return;
log_msg("\n--- Start SaveMPPlayerCustomData ---\n");
Unit* ptChar = D2GetClientPlayer();
if (PCPY->selfStashIsOpened)
{
DWORD curSizeExt = 0;
DWORD maxSizeExt = 0x4000;
BYTE* dataExt = new BYTE[maxSizeExt];
ZeroMemory(dataExt, maxSizeExt);
d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__);
saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt);
writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt);
delete[] dataExt;
}
if (active_sharedStash && PCPY->sharedStashIsOpened)
{
DWORD curSizeShr = 0;
DWORD maxSizeShr = 0x4000;
BYTE* dataShr = new BYTE[maxSizeShr];
ZeroMemory(dataShr, maxSizeShr);
d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__);
saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr);
NetClient* ptClient = D2GetClient(ptChar, __FILE__, __LINE__);
writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, 0/*ptClient->isHardCoreGame*/);
delete[] dataShr;
}
log_msg("End saving.\n\n");
}
/* /*
@@ -487,6 +529,16 @@ continue_rcvFct:
// JMP DWORD PTR SS:[ESP+0x5F0] // JMP DWORD PTR SS:[ESP+0x5F0]
}} }}
FCT_ASM( caller_SaveMPPlayerCustomData_114 )
PUSH EAX
PUSH ECX
CALL SaveMPPlayerCustomData_114
POP ECX
POP EAX
CMP ECX, 0xAA55AA55
RETN
}}
FCT_ASM ( caller_SaveMPPlayerCustomData_111 ) FCT_ASM ( caller_SaveMPPlayerCustomData_111 )
PUSH EAX PUSH EAX
PUSH ECX PUSH ECX
@@ -519,9 +571,13 @@ void Install_SavePlayerData()
log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n"); log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n");
//Save single player custom data. // Save single player custom data.
mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835); mem_seek R8(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835, 132276);
MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9); if (version_D2Game == V114d) {
MEMT_REF4(0xFFED4DD6, caller_SaveSPPlayerCustomData_114);
} else {
MEMJ_REF4(D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9);
}
//6FC8A623 E8 3E210900 CALL <JMP.&Fog.#10115> //6FC8A623 E8 3E210900 CALL <JMP.&Fog.#10115>
//02039364 |. E8 3B0FF5FF CALL <JMP.&Fog.#10115> //02039364 |. E8 3B0FF5FF CALL <JMP.&Fog.#10115>
//01F95474 |. E8 C34EFEFF CALL <JMP.&Fog.#10115> //01F95474 |. E8 C34EFEFF CALL <JMP.&Fog.#10115>
@@ -529,8 +585,19 @@ void Install_SavePlayerData()
//6FC73F34 |. E8 DD63FBFF CALL <JMP.&Fog.#10115> //6FC73F34 |. E8 DD63FBFF CALL <JMP.&Fog.#10115>
//6FC59834 |. E8 FB0AFDFF CALL <JMP.&Fog.#10115> //6FC59834 |. E8 FB0AFDFF CALL <JMP.&Fog.#10115>
if (version_D2Game == V114d) {
// Save multiplayer player custom data.
mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 5C565);
memt_byte(0x81, 0xE8); // CALL
MEMT_REF4(0x55AA55F9, caller_SaveMPPlayerCustomData_114);
memt_byte(0xAA, 0x90); // CALL
log_msg("\n");
isInstalled = true;
return;
}
//Send SaveFiles //Send SaveFiles
mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB); mem_seek R8(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB, 132398);
memt_byte( 0x8B ,0x90); // NOP memt_byte( 0x8B ,0x90); // NOP
memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL 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); 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);
@@ -547,7 +614,7 @@ void Install_SavePlayerData()
//6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] //6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
//6FC597AF |. 85C0 TEST EAX,EAX //6FC597AF |. 85C0 TEST EAX,EAX
mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3); mem_seek R8(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3, 138FEC/*12E110*/);
memt_byte( 0x8B ,0x90); // NOP memt_byte( 0x8B ,0x90); // NOP
memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL 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); 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);
@@ -568,7 +635,7 @@ void Install_SavePlayerData()
if ( version_D2Game >= V111 ) if ( version_D2Game >= V111 )
{ {
//Received SaveFiles //Received SaveFiles
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6); mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6, 448E6);
memt_byte( 0x0F ,0xE8); memt_byte( 0x0F ,0xE8);
MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111); MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111);
//6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
@@ -578,7 +645,7 @@ void Install_SavePlayerData()
//6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
// Save multiplayer player custom data. // Save multiplayer player custom data.
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2); mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 829C2);
memt_byte( 0x81 ,0xE8); // CALL memt_byte( 0x81 ,0xE8); // CALL
MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111); MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111);
memt_byte( 0xAA ,0x90); // CALL memt_byte( 0xAA ,0x90); // CALL
@@ -589,14 +656,14 @@ void Install_SavePlayerData()
//6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55
} else { } else {
//Received SaveFiles //Received SaveFiles
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000); mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000, 0000);
memt_byte( 0x81 ,0x90); // NOP memt_byte( 0x81 ,0x90); // NOP
memt_byte( 0xEC ,0xE8); // CALL memt_byte( 0xEC ,0xE8); // CALL
MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave); MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave);
//6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4 //6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4
// Save multiplayer player custom data. // Save multiplayer player custom data.
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000); mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000, 0000);
memt_byte( 0x8B ,0xE8); // CALL memt_byte( 0x8B ,0xE8); // CALL
MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData); MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData);
//6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX] //6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX]

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Change Skill win per level up. Change Skill win per level up.
@@ -35,14 +36,18 @@ void Install_SkillPerLevelUp()
log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n"); 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, EDCA5); mem_seek R8(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5, 1709D1);
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp); if (version_D2Game == V114d) {
MEMT_REF4(0x000B68DB, caller_changeSkillPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
//6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518> //6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518>
//02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109> //02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109>
//01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627> //01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762> //6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551> //6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645> //6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645>
}
log_msg("\n"); log_msg("\n");

View File

@@ -42,6 +42,8 @@ void UnassignAllSkillsPoints(Unit* ptChar)
DWORD nbPoints = 0; DWORD nbPoints = 0;
void* ptClient = D2GetClient(ptChar,__FILE__,__LINE__); void* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
SkillData* ptSkill = PCSkills->ptFirstSkill; SkillData* ptSkill = PCSkills->ptFirstSkill;
log_msg("\n\nUNASSIGN SKILL POINTS\n\n");
while (ptSkill) while (ptSkill)
{ {
if (getCharClass(ptSkill) == ptChar->nPlayerClass)//ptSkill->ptSkillBin->charclass if (getCharClass(ptSkill) == ptChar->nPlayerClass)//ptSkill->ptSkillBin->charclass

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Change Stat win per level up. Change Stat win per level up.
@@ -33,14 +34,18 @@ void Install_StatPerLevelUp()
log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n"); 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, EDC9A); mem_seek R8(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A, 1709C6);
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp); if (version_D2Game == V114d) {
MEMT_REF4(0x000B68E6, caller_changeStatPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
//6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518> //6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518>
//02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109> //02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109>
//01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627> //01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762> //6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551> //6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645> //6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645>
}
log_msg("\n"); log_msg("\n");

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Unassign Stats Point for futher re-assignment. Unassign Stats Point for futher re-assignment.
@@ -249,6 +250,13 @@ END_UNASSGNSTATS:
RETN RETN
}} }}
FCT_ASM( caller_setValue_114 )
MOV CL, 0x3A
OR DX, WORD PTR DS : [ESI]
ADD DL, currentMsgID
MOV CH, DL
RETN
}}
FCT_ASM ( caller_setValue_111 ) FCT_ASM ( caller_setValue_111 )
ADD CL,currentMsgID ADD CL,currentMsgID
@@ -288,6 +296,21 @@ DWORD STDCALL pushDown (DWORD num)
return 0; return 0;
} }
FCT_ASM( caller_pushDown_114 )
PUSH EDX
PUSH DWORD PTR SS : [EBP + 0x8]
CALL pushDown
POP EDX
TEST EAX, EAX
JNZ end_pushDown
SUB DWORD PTR SS : [ESP], 0x22
RETN
end_pushDown :
MOV EAX, DWORD PTR SS : [EBP + 0x8]
LEA ECX, DWORD PTR DS : [EAX * 8]
RETN
}}
FCT_ASM ( caller_pushDown_111 ) FCT_ASM ( caller_pushDown_111 )
PUSH EDX PUSH EDX
PUSH EDX PUSH EDX
@@ -329,11 +352,11 @@ void Install_StatsPoints()
log_msg("Patch D2Client for unassign stat points when specified key is press. (StatsPoints)\n"); log_msg("Patch D2Client for unassign stat points when specified key is press. (StatsPoints)\n");
// Always print stat button images. // Always print stat button images.
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, A7FFB);
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( version_D2Client == V114d ? 0x4D : 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 12) );
memt_byte( 0x24, 0x90 ); // NOP memt_byte( version_D2Client == V114d ? 0xF8 : 0x24, 0x90 ); // NOP
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 if (version_D2Client < V114d) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
@@ -342,8 +365,12 @@ void Install_StatsPoints()
//6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//print our buttons //print our buttons
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C);
MEMJ_REF4( D2PrintImage, caller_printUnassignStatsBtn); if (version_D2Client == V114d) {
MEMT_REF4(0x0004E3F0, caller_printUnassignStatsBtn);
} else {
MEMJ_REF4(D2PrintImage, caller_printUnassignStatsBtn);
}
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047> //6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044> //6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024> //6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
@@ -351,9 +378,10 @@ void Install_StatsPoints()
//6FB6F9DD . E8 ECD5F4FF CALL <JMP.&D2gfx.#10042> //6FB6F9DD . E8 ECD5F4FF CALL <JMP.&D2gfx.#10042>
// Always manage push down. // Always manage push down.
mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579); mem_seek R8(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579, A77E4);
memt_byte( 0x74, 0x90 ); // NOP memt_byte( 0x74, 0x90 ); // NOP
memt_byte( 0x4E, 0x90 ); // NOP memt_byte(version_D2Client == V114d ? 0x62 : 0x4E, 0x90); // NOP
//6FAD134D 74 4E JE SHORT D2Client.6FAD139D //6FAD134D 74 4E JE SHORT D2Client.6FAD139D
//6FB327D9 . 74 4E JE SHORT D2Client.6FB32829 //6FB327D9 . 74 4E JE SHORT D2Client.6FB32829
//6FB39259 . 74 4E JE SHORT D2Client.6FB392A9 //6FB39259 . 74 4E JE SHORT D2Client.6FB392A9
@@ -364,12 +392,20 @@ void Install_StatsPoints()
if ( version_D2Client >= V111 ) if ( version_D2Client >= V111 )
{ {
// On Push down. // On Push down.
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4); mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4, A7863);
memt_byte( 0x6B, 0xE8 ); if (version_D2Client == V114d) {
MEMT_REF4( 0x01BF0ED2, caller_pushDown_111); memt_byte(0x8B, 0xE8);
memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E MEMT_REF4(0x0C8D0845, caller_pushDown_114);
memt_byte( 0x00, 0xD2 ); memt_byte(0xC5, 0x90);
memt_byte( 0x00, 0x0E ); memt_dword(0x00000000, 0x90909090);
} else {
memt_byte(0x6B, 0xE8);
MEMT_REF4(0x01BF0ED2, caller_pushDown_111);
memt_byte(0x00, 0x6B); // IMUL EDX,EDX,0E
memt_byte(0x00, 0xD2);
memt_byte(0x00, 0x0E);
}
//6FB32844 > 6BD2 0E IMUL EDX,EDX,0E //6FB32844 > 6BD2 0E IMUL EDX,EDX,0E
//6FB32847 . BF 01000000 MOV EDI,1 //6FB32847 . BF 01000000 MOV EDI,1
//6FB392C4 > 6BD2 0E IMUL EDX,EDX,0E //6FB392C4 > 6BD2 0E IMUL EDX,EDX,0E
@@ -383,7 +419,7 @@ void Install_StatsPoints()
} else { } else {
// On Push down. // On Push down.
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000, 0000); mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000, 0000, 0000);
memt_byte( 0x8D, 0xE8 ); // CALL memt_byte( 0x8D, 0xE8 ); // CALL
MEMT_REF4( 0x0000D504, caller_pushDown); MEMT_REF4( 0x0000D504, caller_pushDown);
memt_byte( 0x00, 0x90 ); // NOP memt_byte( 0x00, 0x90 ); // NOP
@@ -391,13 +427,15 @@ void Install_StatsPoints()
//6FAD13B8 8D04D5 00000000 LEA EAX,DWORD PTR DS:[EDX*8] //6FAD13B8 8D04D5 00000000 LEA EAX,DWORD PTR DS:[EDX*8]
} }
if ( version_D2Client >= V110 ) if ( version_D2Client >= V110 )
{ {
// Always manage push up. // Always manage push up.
mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9); mem_seek R8(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9, A7976);
memt_byte( 0x74, 0x90 ); // NOP memt_byte( version_D2Client == V114d ? 0x0F : 0x74, 0x90 ); // NOP
memt_byte( version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP memt_byte(version_D2Client == V114d ? 0x84 : version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP
if (version_D2Client == V114d) {
memt_dword(0x000000BB, 0x90909090);
}
//6FAD152E 74 68 JE SHORT D2Client.6FAD1598 //6FAD152E 74 68 JE SHORT D2Client.6FAD1598
//6FB33869 . 74 65 JE SHORT D2Client.6FB338D0 //6FB33869 . 74 65 JE SHORT D2Client.6FB338D0
//6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350 //6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350
@@ -406,7 +444,7 @@ void Install_StatsPoints()
//6FB705E9 . 74 65 JE SHORT D2Client.6FB70650 //6FB705E9 . 74 65 JE SHORT D2Client.6FB70650
// Unassign stats point when ctrl is push. // Unassign stats point when ctrl is push.
mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B); mem_seek R8(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B, A79F2);
memt_byte( 0x66, 0xE8 ); // CALL memt_byte( 0x66, 0xE8 ); // CALL
MEMT_REF4( 0x077CC085, caller_UnassignStats); MEMT_REF4( 0x077CC085, caller_UnassignStats);
//6FAD15D3 . 66:85C0 TEST AX,AX //6FAD15D3 . 66:85C0 TEST AX,AX
@@ -423,24 +461,28 @@ void Install_StatsPoints()
//6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7 //6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7
} else { } else {
// Always manage push up. // Always manage push up.
mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x0F, 0x90 ); // NOP memt_byte( 0x0F, 0x90 ); // NOP
memt_byte( 0x84, 0x90 ); // NOP memt_byte( 0x84, 0x90 ); // NOP
memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP
//6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9 //6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9
// Unassign stats point when ctrl is push. // Unassign stats point when ctrl is push.
mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000, 0000); mem_seek R8(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0xB8, 0xE8 ); // CALL memt_byte( 0xB8, 0xE8 ); // CALL
MEMT_REF4( 0x00000001, caller_UnassignStats_9); MEMT_REF4( 0x00000001, caller_UnassignStats_9);
//6FACACC9 . B8 01000000 MOV EAX,1 //6FACACC9 . B8 01000000 MOV EAX,1
} }
// Set the id for the calling function. // Set the id for the calling function.
mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE); mem_seek R8(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE, A7A29);
if ( version_D2Client >= V111 ) { if ( version_D2Client >= V111 ) {
memt_byte( 0x66, 0xE8 ); // CALL memt_byte( version_D2Client == V114d ? 0xB1 : 0x66, 0xE8 ); // CALL
MEMT_REF4( 0x15244C89, caller_setValue_111); if (version_D2Client == V114d) {
MEMT_REF4(0x160B663A, caller_setValue_114);
} else {
MEMT_REF4(0x15244C89, caller_setValue_111);
}
//6FB3395E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB3395E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX
//6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX
//6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | //6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
@@ -482,7 +524,7 @@ void Install_StatsLimitShiftClick()
log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n"); log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n");
// Limit the assigment of stat points. // Limit the assigment of stat points.
mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5, C0695); mem_seek R8(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5, C0695, A79EC);
memt_byte( 0xFF, 0x90 ); // NOP memt_byte( 0xFF, 0x90 ); // NOP
memt_byte( 0x15, 0xE8 ); // CALL memt_byte( 0x15, 0xE8 ); // CALL
MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift); MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift);

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Uber Quest Management. Uber Quest Management.
@@ -314,6 +315,15 @@ void FASTCALL uberBaalIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
D2BaalIA(ptGame, ptMonster, ptData); D2BaalIA(ptGame, ptMonster, ptData);
} }
FCT_ASM ( caller_spawnUber )
PUSHAD
PUSH EDX
PUSH ECX
CALL spawnUber
POPAD
RETN
}}
void Install_UberQuest() void Install_UberQuest()
{ {
static int isInstalled = false; static int isInstalled = false;
@@ -327,27 +337,41 @@ void Install_UberQuest()
DWORD oldProtection; DWORD oldProtection;
// open Red Portal // open Red Portal
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, PAGE_EXECUTE_READWRITE, &oldProtection); VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, PAGE_EXECUTE_READWRITE, &oldProtection);
mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4); mem_seek R8(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4, 2E11D0);
MEMT_DWORD( D2OpenPandPortal , openPandPortal); if (version_D2Game == V114d) {
MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal); MEMT_DWORD(0x00565A90, openPandPortal);
MEMT_DWORD(0x00565AA0, openPandFinalPortal);
} else {
MEMT_DWORD(D2OpenPandPortal, openPandPortal);
MEMT_DWORD(D2OpenPandFinalPortal, openPandFinalPortal);
}
//0201E357 |. FFD0 |CALL EAX //0201E357 |. FFD0 |CALL EAX
//01FA77E7 |. FFD0 |CALL EAX //01FA77E7 |. FFD0 |CALL EAX
//6FCF3CC7 |. FFD0 |CALL EAX //6FCF3CC7 |. FFD0 |CALL EAX
//6FC92437 |. FFD0 |CALL EAX //6FC92437 |. FFD0 |CALL EAX
//6FCB7127 |. FFD0 |CALL EAX //6FCB7127 |. FFD0 |CALL EAX
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, oldProtection, &oldProtection); VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, oldProtection, &oldProtection);
// manage uberIA (fct table at 0209E7E8) // manage uberIA (fct table at 0209E7E8)
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection);
mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618); if (version_D2Game == V114d) {
MEMT_DWORD( D2UberBaalIA , uberBaalIA); mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330);
mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628); MEMT_DWORD(0x005FD200, uberBaalIA);
MEMT_DWORD( D2UberMephIA , uberMephIA); mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340);
mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638); MEMT_DWORD(0x005F81C0, uberMephIA);
MEMT_DWORD( D2UberDiabloIA , uberDiabloIA); mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350);
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, oldProtection, &oldProtection); MEMT_DWORD(0x005E9DF0, uberDiabloIA);
} else {
mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330);
MEMT_DWORD(D2UberBaalIA, uberBaalIA);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340);
MEMT_DWORD(D2UberMephIA, uberMephIA);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350);
MEMT_DWORD(D2UberDiabloIA, uberDiabloIA);
}
VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, oldProtection, &oldProtection);
//0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8 //0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8
//01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0 //01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0
//6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58 //6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58
@@ -359,8 +383,12 @@ void Install_UberQuest()
// MEMJ_REF4( D2WarpPlayer , spawnUber); // MEMJ_REF4( D2WarpPlayer , spawnUber);
//02028DAC |. E8 491CF7FF CALL <JMP.&D2Common.#10872> //02028DAC |. E8 491CF7FF CALL <JMP.&D2Common.#10872>
mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB); mem_seek R8(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB, 12D1DC);
MEMC_REF4( D2Game235C0 , spawnUber); if (version_D2Game == V114d) {
MEMT_REF4(0x00015960, caller_spawnUber);
} else {
MEMC_REF4(D2Game235C0, spawnUber);
}
//020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10 //020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10
//02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0 //02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0
//6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410 //6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Updating client. Updating client.
@@ -59,13 +60,22 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet)
log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3); log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3);
switch (packet->mFunc) switch (packet->mFunc)
{ {
case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 4) == 4); return 1; case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1;
case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1; case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1;
case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1; case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1;
default : return 0; default : return 0;
} }
} }
FCT_ASM( caller_handleClientUpdate_114 )
LEA ECX, DWORD PTR SS : [ESP]
CALL handleClientUpdate
POP EDI
POP ESI
MOV ESP, EBP
POP EBP
RETN
}}
FCT_ASM ( caller_handleClientUpdate_111 ) FCT_ASM ( caller_handleClientUpdate_111 )
LEA ECX,DWORD PTR SS:[ESP+8] LEA ECX,DWORD PTR SS:[ESP+8]
@@ -93,8 +103,8 @@ void Install_UpdateClient()
log_msg("Patch D2Client for received Item packet. (UpdateClient)\n"); log_msg("Patch D2Client for received Item packet. (UpdateClient)\n");
// execute if it's our packet else continue // execute if it's our packet else continue
mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96); mem_seek R8(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96, 5EC99);
MEMT_REF4( version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate); MEMT_REF4( version_D2Client == V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client == V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
//6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690 //6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690
//6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789 //6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789
//6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59 //6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Updating server. Updating server.
@@ -34,8 +35,9 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
case US_UNASSIGN_VIT_POINTS : UnassignVitPoints( ptChar ); return 1; case US_UNASSIGN_VIT_POINTS : UnassignVitPoints( ptChar ); return 1;
case US_UNASSIGN_SKILLS : UnassignAllSkillsPoints( ptChar ); return 1; case US_UNASSIGN_SKILLS : UnassignAllSkillsPoints( ptChar ); return 1;
case US_SET_INDEX: setCurrentStashIndex(ptChar, true); return 1; case US_SET_INDEX: setCurrentStashIndex(ptChar, 1); return 1;
case US_RESET_INDEX: setCurrentStashIndex(ptChar, false); return 1; case US_SET_MAIN_INDEX: setCurrentStashIndex(ptChar, 2); return 1;
case US_RESET_INDEX: setCurrentStashIndex(ptChar, 0); return 1;
case US_SELECT_PREVIOUS : selectPreviousStash( ptChar ); return 1; case US_SELECT_PREVIOUS : selectPreviousStash( ptChar ); return 1;
case US_SELECT_NEXT : selectNextStash( ptChar ); return 1; case US_SELECT_NEXT : selectNextStash( ptChar ); return 1;
case US_SELECT_SELF : if (active_sharedStash) toggleToSelfStash( ptChar ); return 1; case US_SELECT_SELF : if (active_sharedStash) toggleToSelfStash( ptChar ); return 1;
@@ -46,8 +48,8 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
case US_SELECT_NEXT2 : selectNext2Stash( ptChar ); return 1; case US_SELECT_NEXT2 : selectNext2Stash( ptChar ); return 1;
case US_SELECT_PREVIOUS_INDEX2: selectPreviousIndex2Stash( ptChar ); return 1; case US_SELECT_PREVIOUS_INDEX2: selectPreviousIndex2Stash( ptChar ); return 1;
case US_SELECT_NEXT_INDEX2 : selectNextIndex2Stash( ptChar ); return 1; case US_SELECT_NEXT_INDEX2 : selectNextIndex2Stash( ptChar ); return 1;
case US_INSERT_PAGE: insertStash(ptChar); return 1; case US_INSERT_PAGE: insertStash(ptChar); selectNextStash(ptChar); return 1;
case US_DELETE_PAGE: deleteStash(ptChar); return 1; case US_DELETE_PAGE: deleteStash(ptChar, false); return 1;
case US_SAVE : savePlayers( ptChar ); return 1; case US_SAVE : savePlayers( ptChar ); return 1;
@@ -89,6 +91,26 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
} }
} }
FCT_ASM( caller_handleServerUpdate_114 )
PUSH ESI
PUSH EBX
CALL handleServerUpdate
TEST EAX, EAX
JNZ END_RCM
MOV EAX, ESI
AND EAX, 0xFF
SHR ESI, 8
MOV EDI, EAX
RETN
END_RCM :
ADD ESP, 8
POP EDI
POP ESI
XOR EAX, EAX
POP EBX
RETN 8
}}
FCT_ASM( caller_handleServerUpdate) FCT_ASM( caller_handleServerUpdate)
PUSH ESI PUSH ESI
PUSH EBX PUSH EBX
@@ -138,11 +160,11 @@ void Install_UpdateServer()
log_msg("Patch D2Game for received button click message. (UpdateServer)\n"); log_msg("Patch D2Game for received button click message. (UpdateServer)\n");
// manage button click message from Client. // manage button click message from Client.
mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983, 676C3); mem_seek R8(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983, 676C3, 14BD38);
if (version_D2Game >= V111) { if (version_D2Game >= V111) {
memt_byte( 0xC1, 0x57 ); // PUSH EDI memt_byte( 0xC1, 0x57 ); // PUSH EDI
memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate
MEMT_REF4( 0xF88B5708, caller_handleServerUpdate); MEMT_REF4( 0xF88B5708, version_D2Game == V114d ? caller_handleServerUpdate_114 : caller_handleServerUpdate);
//01FD4AE3 . C1EE 08 SHR ESI,8 //01FD4AE3 . C1EE 08 SHR ESI,8
//01FD4AE6 . 57 PUSH EDI //01FD4AE6 . 57 PUSH EDI
//01FD4AE7 . 8BF8 MOV EDI,EAX //01FD4AE7 . 8BF8 MOV EDI,EAX

View File

@@ -1,6 +1,7 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
World Event Management. World Event Management.
@@ -119,6 +120,11 @@ DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char*
ItemsBIN* ptItemStats = D2GetItemsBIN(ptItem->nTxtFileNo); ItemsBIN* ptItemStats = D2GetItemsBIN(ptItem->nTxtFileNo);
ItemsBIN* ptWantedItemStats = D2GetItemsBIN(itemNeeded.ID); ItemsBIN* ptWantedItemStats = D2GetItemsBIN(itemNeeded.ID);
log_msg("D2CheckItemType() = %u\n\n", D2CheckItemType(ptItem, itemNeeded.ID));
log_msg("D2GetUniqueID() = %u\n\n", D2GetUniqueID(ptItem));
log_msg("D2isEtheral() = %u\n\n", D2isEtheral2(ptItem, 0, 0, 0, 0, 0, 0));
log_msg("itemNeeded.ID = %u\n\n", itemNeeded.ID);
if((itemNeeded.byItemTypeID && D2CheckItemType(ptItem,itemNeeded.ID)) if((itemNeeded.byItemTypeID && D2CheckItemType(ptItem,itemNeeded.ID))
|| (itemNeeded.byItemID && (itemNeeded.ID == 0xFFFF)) || (itemNeeded.byItemID && (itemNeeded.ID == 0xFFFF))
|| (itemNeeded.byItemID && !itemNeeded.includeUpgradedVersions && ((DWORD)itemNeeded.ID == ptItem->nTxtFileNo)) || (itemNeeded.byItemID && !itemNeeded.includeUpgradedVersions && ((DWORD)itemNeeded.ID == ptItem->nTxtFileNo))
@@ -197,6 +203,32 @@ FCT_ASM ( caller_spawnDClone_111b )
RETN 0x14 RETN 0x14
}} }}
FCT_ASM( caller_spawnDClone_114 )
PUSH EBX
PUSH ECX
PUSH EDX
PUSH EDI
PUSH ESI
PUSH 0
PUSH EBX
PUSH 0xFFFFFFFF
PUSH DWORD PTR SS : [ESP + 0x30]
PUSH DWORD PTR SS : [ESP + 0x30]
PUSH DWORD PTR SS : [ESP + 0x30]
MOV ECX, EDI
MOV EDX, EAX
CALL spawnDClone
POP ESI
POP EDI
POP EDX
POP ECX
POP EBX
RETN 0x18
}}
FCT_ASM( caller_addClientForWE_111 ) FCT_ASM( caller_addClientForWE_111 )
PUSH EAX PUSH EAX
CALL initWorldEventVariables CALL initWorldEventVariables
@@ -231,8 +263,12 @@ void Install_WorldEvent()
log_msg("Patch D2Game for active World Event. (WorldEvent)\n"); log_msg("Patch D2Game for active World Event. (WorldEvent)\n");
// spawn DClone // spawn DClone
mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0); mem_seek R8(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0, 1A4A4F);
MEMC_REF4( V2SpawnMonster , version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone); if (version_D2Client == V114d) {
MEMT_REF4(0xFFFFBF8D, caller_spawnDClone_114);
} else {
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 //6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220
//01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0 //01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0
//0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0 //0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0
@@ -241,8 +277,12 @@ void Install_WorldEvent()
//6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20 //6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20
// verify if the item sold is a trigger of WE // verify if the item sold is a trigger of WE
mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9); mem_seek R8(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9, 179667);
MEMJ_REF4( D2TestFlags , verifIfWEItem); if (version_D2Game == V114d) {
MEMT_REF4(0x000AEA35, verifIfWEItem);
} else {
MEMJ_REF4(D2TestFlags, verifIfWEItem);
}
//6FCC77CF |. E8 32400500 CALL <JMP.&D2Common.#10707> //6FCC77CF |. E8 32400500 CALL <JMP.&D2Common.#10707>
//0200E798 |. E8 E9BDF7FF CALL <JMP.&D2Common.#10911> //0200E798 |. E8 E9BDF7FF CALL <JMP.&D2Common.#10911>
//02002858 |. E8 E57DF7FF CALL <JMP.&D2Common.#10303> //02002858 |. E8 E57DF7FF CALL <JMP.&D2Common.#10303>
@@ -251,8 +291,12 @@ void Install_WorldEvent()
//6FC92BE8 |. E8 DD7AF9FF CALL <JMP.&D2Common.#10458> //6FC92BE8 |. E8 DD7AF9FF CALL <JMP.&D2Common.#10458>
// management of the WorldEvent // management of the WorldEvent
mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51); mem_seek R8(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51, 1389B1);
MEMC_REF4( V2GetGameByClientID , version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX); if (version_D2Game == V114d) {
MEMT_REF4(0xFFFF752B, caller_WEManagement_1XX);
} else {
MEMC_REF4(V2GetGameByClientID, version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX);
}
//6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0 //6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0
//01FD1F00 |. E8 1BE60800 CALL D2Game.02060520 //01FD1F00 |. E8 1BE60800 CALL D2Game.02060520
//02035680 |. E8 1BF30100 CALL D2Game.020549A0 //02035680 |. E8 1BF30100 CALL D2Game.020549A0
@@ -261,8 +305,13 @@ void Install_WorldEvent()
//6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700 //6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700
// add client for the WorldEvent // add client for the WorldEvent
mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F); mem_seek R8(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F, 13F2D2);
MEMC_REF4( D2AddClient , version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE); if (version_D2Game == V114d) {
MEMT_REF4(0xFFFED27A, caller_addClientForWE);
}
else {
MEMC_REF4(D2AddClient, version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE);
}
//6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60 //6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60
//01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0 //01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0
//01FE0559 |. E8 B27C0700 CALL D2Game.02058210 //01FE0559 |. E8 B27C0700 CALL D2Game.02058210

View File

@@ -1,6 +1,7 @@
/*================================================ /*================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
This file implements some common and useful This file implements some common and useful
function related to some Diablo II mechanisms. function related to some Diablo II mechanisms.
@@ -41,8 +42,8 @@ extern s_shifting shifting;
#define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData #define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData
#define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills #define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills
#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 R8(Z,A,B,C,D,E,F,G,H,I) (offset_##Z + (version_##Z == V114d? 0x##I : (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))))))) #define V8(Z,A,B,C,D,E,F,G,H,I) (version_##Z == V114d? 0x##I : (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 RX(v) (WindowStartX+(v)) #define RX(v) (WindowStartX+(v))
#define RY(v) (ResolutionY+NegWindowStartY-(v)) #define RY(v) (ResolutionY+NegWindowStartY-(v))
@@ -54,9 +55,9 @@ extern s_shifting shifting;
#define E2S(F, A, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N; #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 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 E2C(F, A, 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 F8(X, Z, A,B,C,D,E,F,G,H,I, 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 A8(X, Z, A,B,C,D,E,F,G,H,I, 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; #define C8(Z, A,B,C,D,E,F,G,H,I, T, N) extern T* pt##N;
#include "../Commons/D2Funcs.h" #include "../Commons/D2Funcs.h"
extern DataTables* SgptDataTables; extern DataTables* SgptDataTables;
@@ -75,9 +76,9 @@ extern DataTables* SgptDataTables;
//E2F(D2Client,0, void, D2CleanStatMouseUp, ()); //E2F(D2Client,0, void, D2CleanStatMouseUp, ());
#undef F7 #undef F8
#undef A7 #undef A8
#undef C7 #undef C8
#undef D2S #undef D2S
#undef D2F #undef D2F
#undef E2S #undef E2S
@@ -109,6 +110,6 @@ void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color,
#define ptClientChar (*ptptClientChar) #define ptClientChar (*ptptClientChar)
//#define CurrentNPCNum (*ptCurrentNPCNum) //#define CurrentNPCNum (*ptCurrentNPCNum)
bool initD2functions(); void initD2functions();
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -15,41 +15,53 @@ COPYRIGHT
#include <windows.h> #include <windows.h>
extern int version_SmackW32; extern int version_Game;
extern int version_D2Common; //extern int version_binkw32;
extern int version_ijl11; //extern int version_Bnclient;
extern int version_D2Gdi;
extern int version_D2Win;
extern int version_D2sound;
extern int version_D2MCPCLI;
extern int version_D2Launch;
extern int version_D2gfx;
extern int version_D2Client; extern int version_D2Client;
extern int version_D2Net;
extern int version_D2Lang;
extern int version_D2Game;
extern int version_D2CMP; extern int version_D2CMP;
extern int version_Bnclient; extern int version_D2Common;
//extern int version_D2DDraw;
//extern int version_D2Direct3D;
extern int version_D2Game;
//extern int version_D2Gdi;
extern int version_D2gfx;
//extern int version_D2Glide;
extern int version_D2Lang;
extern int version_D2Launch;
//extern int version_D2MCPClient;
//extern int version_D2Multi;
extern int version_D2Net;
//extern int version_D2sound;
extern int version_D2Win;
extern int version_Fog; extern int version_Fog;
//extern int version_ijl11;
//extern int version_SmackW32;
extern int version_Storm; extern int version_Storm;
// Address in memory of external DLL // Address in memory of external DLL
extern DWORD offset_SmackW32; extern DWORD offset_Game;
extern DWORD offset_D2Common; //extern DWORD offset_binkw32;
extern DWORD offset_ijl11; //extern DWORD offset_Bnclient;
extern DWORD offset_D2Gdi;
extern DWORD offset_D2Win;
extern DWORD offset_D2sound;
extern DWORD offset_D2MCPCLI;
extern DWORD offset_D2Launch;
extern DWORD offset_D2gfx;
extern DWORD offset_D2Client; extern DWORD offset_D2Client;
extern DWORD offset_D2Net;
extern DWORD offset_D2Lang;
extern DWORD offset_D2Game;
extern DWORD offset_D2CMP; extern DWORD offset_D2CMP;
extern DWORD offset_Bnclient; extern DWORD offset_D2Common;
//extern DWORD offset_D2DDraw;
//extern DWORD offset_D2Direct3D;
extern DWORD offset_D2Game;
//extern DWORD offset_D2Gdi;
extern DWORD offset_D2gfx;
//extern DWORD offset_D2Glide;
extern DWORD offset_D2Lang;
extern DWORD offset_D2Launch;
//extern DWORD offset_D2MCPClient;
//extern DWORD offset_D2Multi;
extern DWORD offset_D2Net;
//extern DWORD offset_D2sound;
extern DWORD offset_D2Win;
extern DWORD offset_Fog; extern DWORD offset_Fog;
//extern DWORD offset_ijl11;
//extern DWORD offset_SmackW32;
extern DWORD offset_Storm; extern DWORD offset_Storm;
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -10,6 +10,7 @@
extern int active_DisplayItemLevel; extern int active_DisplayItemLevel;
extern DWORD nbPlayersCommandByDefault; extern DWORD nbPlayersCommandByDefault;
extern DWORD nbPlayersCommand;
extern int active_alwaysRegenMapInSP; extern int active_alwaysRegenMapInSP;
extern int active_RunLODs; extern int active_RunLODs;
extern int active_AlwaysDisplayLifeMana; extern int active_AlwaysDisplayLifeMana;
@@ -17,6 +18,7 @@ extern int active_EnabledTXTFilesWithMSExcel;
extern int active_DisplayBaseStatsValue; extern int active_DisplayBaseStatsValue;
extern int active_LadderRunewords; extern int active_LadderRunewords;
extern int active_EnabledCowPortalWhenCowKingWasKill; extern int active_EnabledCowPortalWhenCowKingWasKill;
extern int active_DoNotCloseNihlathakPortal;
void Install_DisplayItemLevel(); void Install_DisplayItemLevel();
void Install_SendPlayersCommand(); void Install_SendPlayersCommand();
@@ -27,5 +29,6 @@ void Install_EnabledTXTFilesWithMSExcel();
void Install_DisplayBaseStatsValue(); void Install_DisplayBaseStatsValue();
void Install_LadderRunewords(); void Install_LadderRunewords();
void Install_EnabledCowPortalWhenCowKingWasKill(); void Install_EnabledCowPortalWhenCowKingWasKill();
void Install_DoNotCloseNihlathakPortal();
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -23,7 +23,7 @@ extern int posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn
void toggleToSharedStash(Unit* ptChar); void toggleToSharedStash(Unit* ptChar);
void toggleToSelfStash(Unit* ptChar); void toggleToSelfStash(Unit* ptChar);
void setCurrentStashIndex(Unit* ptChar, bool isIndex); void setCurrentStashIndex(Unit* ptChar, int index);
void selectPreviousStash(Unit* ptChar); void selectPreviousStash(Unit* ptChar);
void selectNextStash(Unit* ptChar); void selectNextStash(Unit* ptChar);
void selectPreviousIndexStash(Unit* ptChar); void selectPreviousIndexStash(Unit* ptChar);
@@ -35,7 +35,7 @@ void selectNextIndex2Stash(Unit* ptChar);
void swapStash(Unit* ptChar, DWORD page, bool toggle); void swapStash(Unit* ptChar, DWORD page, bool toggle);
void renameCurrentStash(Unit* ptChar, char* name); void renameCurrentStash(Unit* ptChar, char* name);
void insertStash(Unit* ptChar); void insertStash(Unit* ptChar);
bool deleteStash(Unit* ptChar); bool deleteStash(Unit* ptChar, bool isClient);
void selectStash(Unit* ptChar, Stash* newStash); void selectStash(Unit* ptChar, Stash* newStash);
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems); void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems);

View File

@@ -31,4 +31,6 @@ void memc_ref4(DWORD old, DWORD ref);
#define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R)) #define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R))
void memd_ref4(DWORD old, DWORD ref); void memd_ref4(DWORD old, DWORD ref);
void patchMemory4(DWORD value);
/*================================= END OF FILE =================================*/ /*================================= END OF FILE =================================*/

View File

@@ -6,9 +6,7 @@
=================================================================*/ =================================================================*/
#pragma once #pragma once
#define PLUGY_VERSION "11.01" #define PLUGY_VERSION "12.00"
#define LOG_FILE "PlugY.log"
enum TargetMod enum TargetMod
{ {

View File

@@ -21,6 +21,7 @@ struct Stash
struct { struct {
DWORD isShared:1; // DWORD isShared:1; //
DWORD isIndex:1; // DWORD isIndex:1; //
DWORD isMainIndex:1; //
DWORD isReserved:1; // For swap items comand DWORD isReserved:1; // For swap items comand
}; };
}; };

View File

@@ -1,4 +1,3 @@
/*================================================================= /*=================================================================
File created by Yohann NICOLAS. File created by Yohann NICOLAS.
Add support 1.13d by L'Autour. Add support 1.13d by L'Autour.
@@ -9,50 +8,21 @@
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#include "../Commons/VersionInfo.h" #include "../Commons/VersionInfo.h"
#include <windows.h>
#include <stdio.h> #include <stdio.h>
const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation"; DWORD loadCallerAddr;
const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit "; DWORD loadCallerLen;
BYTE loadCallerNew[6] = { 0x90,0xE8,0x00,0x00,0x00,0x00 }; // Call load PlugY library
BYTE loadCallerOld[6] = { 0xFF,0x15,0x00,0x00,0x00,0x00 }; // CALL DWORD PTR DS:[<&KERNEL32.LoadLibrary>]
int CALL_LOAD[8] = { 0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423,0xAA03 }; DWORD freeCallerAddr;
BYTE callNewLoad[8][6] = { { 0xE8,0x60,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA738A0 ;install loadlibrary DWORD freeCallerLen;
{ 0xE8,0x60,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA738A0 ;install loadlibrary BYTE freeCallerNew[6] = { 0x90,0xE8,0x00,0x00,0x00,0x00 }; // Call free PlugY library
{ 0xE8,0x8B,0x85,0x00,0x00,0x90 },// JMP 6FA7BE00-6FA73875 ;install loadlibrary BYTE freeCallerOld[6] = { 0xFF,0x15,0x00,0x00,0x00,0x00 }; // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xE8,0xD8,0x42,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA88B28 ;install loadlibrary
{ 0xE8,0xD8,0x19,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
{ 0xE8,0x98,0x3E,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA88F68 ;install loadlibrary
{ 0xE8,0xD8,0x19,0x00,0x00,0x90 },// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
{ 0xE8,0xF8,0x23,0x00,0x00,0x90 }};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
BYTE callOldLoad[8][6] = { { 0xFF,0x15,0x3C,0xC0,0xA7,0x6F },
{ 0xFF,0x15,0x3C,0xC0,0xA7,0x6F },
{ 0xFF,0x15,0x40,0xC0,0xA7,0x6F },
{ 0xFF,0x15,0x1C,0xD1,0xA8,0x6F },
{ 0xFF,0x15,0x1C,0xD1,0xA8,0x6F },
{ 0xFF,0x15,0x1C,0xD1,0xA8,0x6F },
{ 0xFF,0x15,0x1C,0xD1,0xA8,0x6F },
{ 0xFF,0x15,0x1C,0xD1,0xA8,0x6F }};
int CALL_FREE[8] = { 0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA,0xA9AA }; DWORD loadDllAddr;
BYTE callNewFree[8][6] = { { 0xE8,0xAF,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE40-6FA73A91 ;install freelibrary DWORD loadDllLen;
{ 0xE8,0xAF,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE40-6FA73A91 ;install freelibrary BYTE loadDll[] = {
{ 0xE8,0xD2,0x83,0x00,0x00,0x90 }, // JMP 6FA7BE44-6FA73A72 ;install freelibrary
{ 0xE8,0x75,0x43,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA88ACF ;install freelibrary
{ 0xE8,0x75,0x1A,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary
{ 0xE8,0x35,0x3F,0x00,0x00,0x90 }, // JMP 6FA8CE44-6FA88F0F ;install freelibrary
{ 0xE8,0x75,0x1A,0x00,0x00,0x90 },// JMP 6FA8CE44-6FA8B3CF ;install freelibrary
{ 0xE8,0x95,0x24,0x00,0x00,0x90 }};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary
BYTE callOldFree[8][6] = { { 0xFF,0x15,0x44,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x44,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x48,0xC0,0xA7,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x2C,0xD1,0xA8,0x6F }, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x2C,0xD1,0xA8,0x6F },// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
{ 0xFF,0x15,0x24,0xD1,0xA8,0x6F }};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
int CALLER_LOADPLUGY = 0xBE00;//6FA7BE00-6FA70000
BYTE caller_LoadPlugY[] = {
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
0x50, //PUSH EAX 0x50, //PUSH EAX
@@ -60,35 +30,45 @@ BYTE caller_LoadPlugY[] = {
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX 0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
0x85,0xC0, //TEST EAX,EAX 0x85,0xC0, //TEST EAX,EAX
0x74,0x18, //JE SHORT d2gfx.6FA7BE37 0x74,0x2B, //JE SHORT d2gfx.6FA7BE33
0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init ID 0x50, //PUSH EAX
0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init String
0x50, //PUSH EAX 0x50, //PUSH EAX
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
0x85,0xC0, //TEST EAX,EAX 0x85,0xC0, //TEST EAX,EAX
0x74,0x04, //JE SHORT d2gfx.6FA7BDC1 0x74,0x04, //JE SHORT d2gfx.6FA7BDC1
0x6A,0x00, //PUSH 0 0x6A,0x00, //PUSH 0
0xEB,0x13, //JMP SHORT d2gfx.6FA7BDC1
0x68,0x10,0x27,0x00,0x00, //PUSH 2710 ;Init Ordinal(10000)
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
0x85,0xC0, //TEST EAX,EAX
0x74,0x02, //JE SHORT d2gfx.6FA7BDC1
0xFF,0xD0, //CALL EAX 0xFF,0xD0, //CALL EAX
0x58, //POP EAX 0x58, //POP EAX
0x58, //POP EAX
0xC2,0x04,0x00, //RETN 4 0xC2,0x04,0x00, //RETN 4
0x59, //POP ECX 0x00,0x00,0x00,0x00 }; //HANDLE var;
0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
0x83,0x04,0x24,0x11, //ADD DWORD PTR SS:[ESP],11
0xC2,0x04,0x00 }; //RETN 4
DWORD freeDllAddr;
int CALLER_FREEPLUGY = 0xBE44;//6FA7BE44-6FA70000 DWORD freeDllLen;
BYTE caller_FreePlugY[] = { BYTE freeDll[] = {
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary 0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary
0x50, //PUSH EAX 0x50, //PUSH EAX
0xA1,0xFC,0xEF,0xA8,0x6F, //MOV EAX,DWORD PTR DS:[6FA8EFFC] 0xA1,0xFC,0xEF,0xA8,0x6F, //MOV EAX,DWORD PTR DS:[6FA8EFFC]
0x85,0xC0, //TEST EAX,EAX 0x85,0xC0, //TEST EAX,EAX
0x74,0x20, //JE SHORT d2gfx.6FA7BE74 0x74,0x2D, //JE SHORT d2gfx.6FA7BE74
0x50, //PUSH EAX 0x50, //PUSH EAX
0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;release 0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;Release String
0x50, //PUSH EAX 0x50, //PUSH EAX
0x33,0xC0, //XOR EAX,EAX //0x33,0xC0, //XOR EAX,EAX
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX //0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
0x85,0xC0, //TEST EAX,EAX
0x75,0x13, //JNZ SHORT d2gfx.6FA7BDEF
0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001)
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
0x85,0xC0, //TEST EAX,EAX 0x85,0xC0, //TEST EAX,EAX
0x74,0x02, //JE SHORT d2gfx.6FA7BDEF 0x74,0x02, //JE SHORT d2gfx.6FA7BDEF
@@ -97,328 +77,392 @@ BYTE caller_FreePlugY[] = {
0x58, //POP EAX 0x58, //POP EAX
0xC2,0x04,0x00 }; //RETN 4 0xC2,0x04,0x00 }; //RETN 4
DWORD libraryNameAddr;
DWORD libraryNameLen;
LPCSTR libraryName = "PlugY.dll";
int S_DLLNAME = 0xBE80;//6FA7BE30-6FA70000 DWORD initNameAddr;
BYTE sDllName[] = { 'P','l','u','g','Y','.','d','l','l',0 };// Dll filename to load. DWORD initNameLen;
LPCSTR initName = "_Init@4";
int S_INIT = 0xBE90;//6FA7BE10-6FA70000 DWORD releaseNameAddr;
BYTE sInit[] = { '_','I','n','i','t','@','4',0 }; DWORD releaseNameLen;
LPCSTR releaseName = "_Release@0";
int S_RELEASE = 0xBEA0;//6FA7BE20-6FA70000 int msgBox(LPCSTR boxName, UINT uType, LPCSTR pFormat, ...)
BYTE sRelease[] = { '_','R','e','l','e','a','s','e','@','0',0 };
void updateData(int version)
{ {
switch (version) char buffer[300];
{ va_list lArgs;
case V109b: va_start( lArgs, pFormat );
case V109d: vsprintf_s( buffer, sizeof(buffer), pFormat, lArgs );
caller_LoadPlugY[6] -= 4; va_end(lArgs);
caller_LoadPlugY[18] -= 4;
caller_LoadPlugY[39] -= 4; return MessageBox(NULL, buffer, boxName, uType);
caller_FreePlugY[6] -= 4;
caller_FreePlugY[36] -= 4;
caller_FreePlugY[48] -= 4;
break;
case V110:
break;
case V111:
case V111b:
case V112:
case V113c:
case V113d:
CALLER_LOADPLUGY += 0x1000;
CALLER_FREEPLUGY += 0x1000;
S_INIT += 0x1000;
S_RELEASE += 0x1000;
S_DLLNAME += 0x1000;
*(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C;
*(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C;
*(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120;
*(DWORD*)(&caller_FreePlugY[6]) = (version == V113d) ? 0x6FA8D124 : 0x6FA8D12C;
*(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120;
*(DWORD*)(&caller_FreePlugY[48]) = (version == V113d) ? 0x6FA8D124 : 0x6FA8D12C;
caller_LoadPlugY[13] += 0x10;
caller_LoadPlugY[14]++;
caller_LoadPlugY[25]++;
caller_LoadPlugY[33] += 0x10;
caller_LoadPlugY[34]++;
caller_LoadPlugY[58] += 0x10;
caller_LoadPlugY[59]++;
caller_FreePlugY[23] += 0x10;
caller_FreePlugY[24]++;
caller_FreePlugY[14]++;
caller_FreePlugY[32]++;
break;
}
} }
int Align(int v)
{
return v % 16 ? v + 16 - v % 16 : v;
}
////////////////////////////// EXPORTED FUNCTIONS ////////////////////////////// ////////////////////////////// EXPORTED FUNCTIONS //////////////////////////////
void Patch() int Patch(FILE *targetFile)
{ {
if (MessageBox(0, "This programm will modify the D2gfx.dll file of the current directory.\n"
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
"Do you want patch D2gfx.dll for the launch of PlugY ?",
boxNameInstall, MB_YESNO | MB_ICONQUESTION) == IDNO)
{
MessageBox(0, "D2gfx.dll isn't patched.\n",
boxNameInstall, MB_OK | MB_ICONASTERISK);
exit(0);
}
FILE *dll;
if (fopen_s(&dll, "d2gfx.dll", "rb+"))
{
MessageBox(0, "Can't open D2gfx.dll in read/write mode.\n"
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
"Quit Diablo II and try again.",
boxNameInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
int version = GetD2Version("Game.exe");
if (version < V109 || version > V113d)
{
MessageBox(0, "Bad version of D2gfx.dll.\n"
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
"Or re-install a clean version (between 1.09 and 1.13d) of LOD.",
boxNameInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
updateData(version);
bool error = false; bool error = false;
int ident = 0; int ident = 0;
BYTE buffer[100]; BYTE buffer[100];
BYTE zeros[100]; BYTE zeros[100];
memset(zeros, 0, sizeof(zeros)); memset(zeros, 0, sizeof(zeros));
version -= V109b; fseek(targetFile, loadCallerAddr, SEEK_SET);
fread(buffer, sizeof(loadCallerNew), 1, targetFile);
if (memcmp(buffer, loadCallerOld, sizeof(loadCallerNew)) != 0) error = true;
if (memcmp(buffer, loadCallerNew, sizeof(loadCallerNew)) == 0) ident++;
fseek(dll, CALL_LOAD[version], SEEK_SET); fseek(targetFile, freeCallerAddr, SEEK_SET);
fread(buffer, 6, 1, dll); fread(buffer, sizeof(freeCallerNew), 1, targetFile);
if (memcmp(buffer, callOldLoad[version], 6) != 0) error = true; if (memcmp(buffer, freeCallerOld, sizeof(freeCallerNew)) != 0) error = true;
if (memcmp(buffer, callNewLoad[version], 6) == 0) ident++; if (memcmp(buffer, freeCallerNew, sizeof(freeCallerNew)) == 0) ident++;
fseek(dll, CALL_FREE[version], SEEK_SET); fseek(targetFile, loadDllAddr, SEEK_SET);
fread(buffer, 6, 1, dll); fread(buffer, sizeof(loadDll), 1, targetFile);
if (memcmp(buffer, callOldFree[version], 6) != 0) error = true; if (memcmp(buffer, zeros, sizeof(loadDll)) != 0) error = true;
if (memcmp(buffer, callNewFree[version], 6) == 0) ident++; if (memcmp(buffer, loadDll, sizeof(loadDll)) == 0) ident++;
fseek(dll, CALLER_LOADPLUGY, SEEK_SET); fseek(targetFile, freeDllAddr, SEEK_SET);
fread(buffer, sizeof(caller_LoadPlugY), 1, dll); fread(buffer, sizeof(freeDll), 1, targetFile);
if (memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) != 0) error = true; if (memcmp(buffer, zeros, sizeof(freeDll)) != 0) error = true;
if (memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) == 0) ident++; if (memcmp(buffer, freeDll, sizeof(freeDll)) == 0) ident++;
fseek(dll, CALLER_FREEPLUGY, SEEK_SET); fseek(targetFile, initNameAddr, SEEK_SET);
fread(buffer, sizeof(caller_FreePlugY), 1, dll); fread(buffer, initNameLen, 1, targetFile);
if (memcmp(buffer, zeros, sizeof(caller_FreePlugY)) != 0) error = true; if (memcmp(buffer, zeros, initNameLen) != 0) error = true;
if (memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) == 0) ident++; if (memcmp(buffer, initName, initNameLen) == 0) ident++;
fseek(dll, S_INIT, SEEK_SET); fseek(targetFile, releaseNameAddr, SEEK_SET);
fread(buffer, sizeof(sInit), 1, dll); fread(buffer, releaseNameLen, 1, targetFile);
if (memcmp(buffer, zeros, sizeof(sInit)) != 0) error = true; if (memcmp(buffer, zeros, releaseNameLen) != 0) error = true;
if (memcmp(buffer, sInit, sizeof(sInit)) == 0) ident++; if (memcmp(buffer, releaseName, releaseNameLen) == 0) ident++;
fseek(dll, S_RELEASE, SEEK_SET); fseek(targetFile, libraryNameAddr, SEEK_SET);
fread(buffer, sizeof(sRelease), 1, dll); fread(buffer, libraryNameLen, 1, targetFile);
if (memcmp(buffer, zeros, sizeof(sRelease)) != 0) error = true; if (memcmp(buffer, zeros, libraryNameLen) != 0) error = true;
if (memcmp(buffer, sRelease, sizeof(sRelease)) == 0) ident++; if (memcmp(buffer, libraryName, libraryNameLen) == 0) ident++;
fseek(dll, S_DLLNAME, SEEK_SET);
fread(buffer, sizeof(sDllName), 1, dll);
if (memcmp(buffer, zeros, sizeof(sDllName)) != 0) error = true;
if (memcmp(buffer, sDllName, sizeof(sDllName)) == 0) ident++;
if (error) if (error)
{ return ident == 7 ? 1 : 2;
if (ident == 7)
{
MessageBox(0, "PlugY, The Survival Kit already installed.",
boxNameInstall, MB_OK | MB_ICONASTERISK);
exit(0);
}
else
{
MessageBox(0, "Bad version of D2gfx.dll.\n"
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
"Or re-install a clean version (between 1.09 and 1.13d) of LOD.",
boxNameInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
}
fseek(dll, CALL_LOAD[version], SEEK_SET); fseek(targetFile, loadCallerAddr, SEEK_SET);
fwrite(callNewLoad[version], 6, 1, dll); fwrite(loadCallerNew, 6, 1, targetFile);
fseek(dll, CALL_FREE[version], SEEK_SET); fseek(targetFile, freeCallerAddr, SEEK_SET);
fwrite(callNewFree[version], 6, 1, dll); fwrite(freeCallerNew, 6, 1, targetFile);
fseek(dll, CALLER_LOADPLUGY, SEEK_SET); fseek(targetFile, loadDllAddr, SEEK_SET);
fwrite(caller_LoadPlugY, sizeof(caller_LoadPlugY), 1, dll); fwrite(loadDll, sizeof(loadDll), 1, targetFile);
fseek(dll, CALLER_FREEPLUGY, SEEK_SET); fseek(targetFile, freeDllAddr, SEEK_SET);
fwrite(caller_FreePlugY, sizeof(caller_FreePlugY), 1, dll); fwrite(freeDll, sizeof(freeDll), 1, targetFile);
fseek(dll, S_INIT, SEEK_SET); fseek(targetFile, initNameAddr, SEEK_SET);
fwrite(sInit, sizeof(sInit), 1, dll); fwrite(initName, initNameLen, 1, targetFile);
fseek(dll, S_RELEASE, SEEK_SET); fseek(targetFile, releaseNameAddr, SEEK_SET);
fwrite(sRelease, sizeof(sRelease), 1, dll); fwrite(releaseName, releaseNameLen, 1, targetFile);
fseek(dll, S_DLLNAME, SEEK_SET); fseek(targetFile, libraryNameAddr, SEEK_SET);
fwrite(sDllName, sizeof(sDllName), 1, dll); fwrite(libraryName, libraryNameLen, 1, targetFile);
fclose(dll); return 0;
MessageBox(0, "D2gfx.dll patched successfully.\n"
"PlugY, The Survival Kit installed successfully.",
boxNameInstall, MB_OK | MB_ICONASTERISK);
exit(0);
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
void Unpatch() int Unpatch(FILE *targetFile)
{ {
if (MessageBox(0, "This programm will modify the D2gfx.dll file of the current directory.\n"
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
"Do you want patch D2gfx.dll for remove the launch of PlugY ?",
boxNameUnInstall, MB_YESNO | MB_ICONQUESTION) == IDNO)
{
MessageBox(0, "D2gfx.dll isn't patched.\n",
boxNameUnInstall, MB_OK | MB_ICONASTERISK);
exit(0);
}
FILE *dll;
if (fopen_s(&dll, "d2gfx.dll", "rb+"))
{
MessageBox(0, "Can't open D2gfx.dll in read/write mode.\n"
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
"Quit Diablo II and try again.",
boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
int version = GetD2Version("Game.exe");
if (version < V109 || version > V113d)
{
MessageBox(0, "Bad version of D2gfx.dll.\n"
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
"Or re-install a clean version (between 1.09 and 1.13d) of LOD.",
boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
updateData(version);
bool error = false; bool error = false;
int ident = 0; int ident = 0;
BYTE buffer[100]; BYTE buffer[100];
BYTE zeros[100]; BYTE zeros[100];
memset(zeros, 0, sizeof(zeros)); memset(zeros, 0, sizeof(zeros));
version -= V109b; fseek(targetFile, loadCallerAddr, SEEK_SET);
fread(buffer, 6, 1, targetFile);
if (memcmp(buffer, loadCallerNew, 6) != 0) error = true;
if (memcmp(buffer, loadCallerOld, 6) == 0) ident++;
fseek(dll, CALL_LOAD[version], SEEK_SET); fseek(targetFile, freeCallerAddr, SEEK_SET);
fread(buffer, 6, 1, dll); fread(buffer, 6, 1, targetFile);
if (memcmp(buffer, callNewLoad[version], 6) != 0) error = true; if (memcmp(buffer, freeCallerNew, 6) != 0) error = true;
if (memcmp(buffer, callOldLoad[version], 6) == 0) ident++; if (memcmp(buffer, freeCallerOld, 6) == 0) ident++;
fseek(dll, CALL_FREE[version], SEEK_SET); fseek(targetFile, loadDllAddr, SEEK_SET);
fread(buffer, 6, 1, dll); fread(buffer, sizeof(loadDll), 1, targetFile);
if (memcmp(buffer, callNewFree[version], 6) != 0) error = true; if (memcmp(buffer, loadDll, sizeof(loadDll)) != 0) error = true;
if (memcmp(buffer, callOldFree[version], 6) == 0) ident++; if (memcmp(buffer, zeros, sizeof(loadDll)) == 0) ident++;
fseek(dll, CALLER_LOADPLUGY, SEEK_SET); fseek(targetFile, freeDllAddr, SEEK_SET);
fread(buffer, sizeof(caller_LoadPlugY), 1, dll); fread(buffer, sizeof(freeDll), 1, targetFile);
if (memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) != 0) error = true; if (memcmp(buffer, freeDll, sizeof(freeDll)) != 0) error = true;
if (memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) == 0) ident++; if (memcmp(buffer, zeros, sizeof(freeDll)) == 0) ident++;
fseek(dll, CALLER_FREEPLUGY, SEEK_SET); fseek(targetFile, initNameAddr, SEEK_SET);
fread(buffer, sizeof(caller_FreePlugY), 1, dll); fread(buffer, initNameLen, 1, targetFile);
if (memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) != 0) error = true; if (memcmp(buffer, initName, initNameLen) != 0) error = true;
if (memcmp(buffer, zeros, sizeof(caller_FreePlugY)) == 0) ident++; if (memcmp(buffer, zeros, initNameLen) == 0) ident++;
fseek(dll, S_INIT, SEEK_SET); fseek(targetFile, releaseNameAddr, SEEK_SET);
fread(buffer, sizeof(sInit), 1, dll); fread(buffer, releaseNameLen, 1, targetFile);
if (memcmp(buffer, sInit, sizeof(sInit)) != 0) error = true; if (memcmp(buffer, releaseName, releaseNameLen) != 0) error = true;
if (memcmp(buffer, zeros, sizeof(sInit)) == 0) ident++; if (memcmp(buffer, zeros, releaseNameLen) == 0) ident++;
fseek(dll, S_RELEASE, SEEK_SET); fseek(targetFile, libraryNameAddr, SEEK_SET);
fread(buffer, sizeof(sRelease), 1, dll); fread(buffer, libraryNameLen, 1, targetFile);
if (memcmp(buffer, sRelease, sizeof(sRelease)) != 0) error = true; if (memcmp(buffer, libraryName, libraryNameLen) != 0) error = true;
if (memcmp(buffer, zeros, sizeof(sRelease)) == 0) ident++; if (memcmp(buffer, zeros, libraryNameLen) == 0) ident++;
fseek(dll, S_DLLNAME, SEEK_SET);
fread(buffer, sizeof(sDllName), 1, dll);
if (memcmp(buffer, sDllName, sizeof(sDllName)) != 0) error = true;
if (memcmp(buffer, zeros, sizeof(sDllName)) == 0) ident++;
if (error) if (error)
{ return ident == 7 ? 1 : 2;
if (ident == 7)
{
MessageBox(0, "PlugY, The Survival Kit already uninstalled.",
boxNameUnInstall, MB_OK | MB_ICONASTERISK);
exit(0);
}
else
{
MessageBox(0, "Bad version of D2gfx.dll.\n"
"Unable to uninstall PlugY, The Survival Kit.",
boxNameUnInstall, MB_OK | MB_ICONEXCLAMATION);
exit(0);
}
}
fseek(dll, CALL_LOAD[version], SEEK_SET); fseek(targetFile, loadCallerAddr, SEEK_SET);
fwrite(callOldLoad[version], 6, 1, dll); fwrite(loadCallerOld, 6, 1, targetFile);
fseek(dll, CALL_FREE[version], SEEK_SET); fseek(targetFile, freeCallerAddr, SEEK_SET);
fwrite(callOldFree[version], 6, 1, dll); fwrite(freeCallerOld, 6, 1, targetFile);
fseek(dll, CALLER_LOADPLUGY, SEEK_SET); fseek(targetFile, loadDllAddr, SEEK_SET);
fwrite(zeros, sizeof(caller_LoadPlugY), 1, dll); fwrite(zeros, sizeof(loadDll), 1, targetFile);
fseek(dll, CALLER_FREEPLUGY, SEEK_SET); fseek(targetFile, freeDllAddr, SEEK_SET);
fwrite(zeros, sizeof(caller_FreePlugY), 1, dll); fwrite(zeros, sizeof(freeDll), 1, targetFile);
fseek(dll, S_INIT, SEEK_SET); fseek(targetFile, initNameAddr, SEEK_SET);
fwrite(zeros, sizeof(sInit), 1, dll); fwrite(zeros, initNameLen, 1, targetFile);
fseek(dll, S_RELEASE, SEEK_SET); fseek(targetFile, releaseNameAddr, SEEK_SET);
fwrite(zeros, sizeof(sRelease), 1, dll); fwrite(zeros, releaseNameLen, 1, targetFile);
fseek(dll, S_DLLNAME, SEEK_SET); fseek(targetFile, libraryNameAddr, SEEK_SET);
fwrite(zeros, sizeof(sDllName), 1, dll); fwrite(zeros, libraryNameLen, 1, targetFile);
fclose(dll); return 0;
MessageBox(0, "D2gfx.dll patched successfully.\n"
"PlugY, The Survival Kit uninstalled successfully.",
boxNameUnInstall, MB_OK | MB_ICONASTERISK);
exit(0);
} }
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
// if ((argc>1) && !strcmp(argv[1],"-u"))
#ifdef RESTORE #ifdef RESTORE
Unpatch(); bool unpatch = true;
#else #else
if ((argc>1) && !strcmp(argv[1], "-u")) bool unpatch = argc > 1 && strcmp(argv[1], "-u") == 0;
Unpatch();
else
Patch();
#endif #endif
int version = GetD2Version("Game.exe");
LPCSTR boxName = unpatch ? "Uninstall PlugY, The Survival Kit" : "Install PlugY, The Survival Kit";
LPCSTR targetFilename = version > V113d ? "Game.exe" : "D2gfx.dll";
if (version < V107 || version > V114d)
{
msgBox(boxName, MB_OK | MB_ICONEXCLAMATION,
"Current version of LoD (%s) isn't compatible with PlugY.\n\n"
"Please, install a patch between 1.09 and 1.13d or 1.14.",
GetVersionString(version));
exit(0);
}
if (msgBox(boxName, MB_YESNO | MB_ICONQUESTION,
"This programm will modify %s file in current directory.\n"
"Before continue, you should backup it.\n\n"
"Do you want to modify %s to %s PlugY ?",
targetFilename, targetFilename, unpatch ? "remove": "install") == IDNO)
{
msgBox(boxName, MB_OK | MB_ICONASTERISK, "No changes made.");
exit(0);
}
FILE *targetFile;
if (fopen_s(&targetFile, targetFilename, "rb+"))
{
msgBox(boxName, MB_OK | MB_ICONEXCLAMATION,
"Can't open %s in read/write mode.\n"
"If Diablo II is running, can you close it and try again ?",
targetFilename, unpatch ? "remove": "install");
exit(0);
}
// Get size
loadCallerLen = sizeof(loadCallerNew);
freeCallerLen = sizeof(freeCallerNew);
loadDllLen = sizeof(loadDll);
freeDllLen = sizeof(freeDll);
libraryNameLen = strlen(libraryName) + 1;
initNameLen = strlen(initName) + 1;
releaseNameLen = strlen(releaseName) + 1;
// Get Addr
DWORD offsetPESignature;
fseek(targetFile, 0x3C, SEEK_SET);
fread(&offsetPESignature, sizeof(offsetPESignature), 1, targetFile);
DWORD sizeOfCode;
fseek(targetFile, offsetPESignature + 0x1C, SEEK_SET);
fread(&sizeOfCode, sizeof(sizeOfCode), 1, targetFile);
DWORD baseOfCode;
fseek(targetFile, offsetPESignature + 0x2C, SEEK_SET);
fread(&baseOfCode, sizeof(baseOfCode), 1, targetFile);
DWORD imageBase;
fseek(targetFile, offsetPESignature + 0x34, SEEK_SET);
fread(&imageBase, sizeof(imageBase), 1, targetFile);
DWORD sizeOfData;
fseek(targetFile, offsetPESignature + 0x150, SEEK_SET);
fread(&sizeOfData, sizeof(sizeOfData), 1, targetFile);
DWORD baseOfData;
fseek(targetFile, offsetPESignature + 0x154, SEEK_SET);
fread(&baseOfData, sizeof(baseOfData), 1, targetFile);
// Set Addr
DWORD loadLibraryAddr = imageBase;
DWORD freeLibraryAddr = imageBase;
DWORD getProcAddressAddr = imageBase;
DWORD handleAddr = imageBase + baseOfData + sizeOfData;
loadCallerAddr = 0;
freeCallerAddr = 0;
loadDllAddr = Align(baseOfCode + sizeOfCode - 0x100);
freeDllAddr = Align(loadDllAddr + sizeof(loadDll));
libraryNameAddr = Align(freeDllAddr + sizeof(freeDll));
initNameAddr = Align(libraryNameAddr + libraryNameLen);
releaseNameAddr = Align(initNameAddr + initNameLen);
switch (version)
{
case V107:
loadCallerAddr += 0x3882;
freeCallerAddr += 0x3A6C;
loadLibraryAddr += 0xC038;
freeLibraryAddr += 0xC040;
getProcAddressAddr += 0xC034;
break;
case V108:
case V109:
case V109b:
case V109d:
loadCallerAddr += 0x389B;
freeCallerAddr += 0x3A8C;
loadLibraryAddr += 0xC03C;
freeLibraryAddr += 0xC044;
getProcAddressAddr += 0xC038;
break;
case V110:
loadCallerAddr += 0x3870;
freeCallerAddr += 0x3A6D;
loadLibraryAddr += 0xC040;
freeLibraryAddr += 0xC048;
getProcAddressAddr += 0xC03C;
break;
case V111:
loadCallerAddr += 0x8B23;
freeCallerAddr += 0x8ACA;
loadLibraryAddr += 0xD11C;
freeLibraryAddr += 0xD12C;
getProcAddressAddr += 0xD120;
break;
case V111b:
loadCallerAddr += 0xB423;
freeCallerAddr += 0xB3CA;
loadLibraryAddr += 0xD11C;
freeLibraryAddr += 0xD12C;
getProcAddressAddr += 0xD120;
break;
case V112:
loadCallerAddr += 0x8F63;
freeCallerAddr += 0x8F0A;
loadLibraryAddr += 0xD11C;
freeLibraryAddr += 0xD12C;
getProcAddressAddr += 0xD120;
break;
case V113c:
loadCallerAddr += 0xB423;
freeCallerAddr += 0xB3CA;
loadLibraryAddr += 0xD11C;
freeLibraryAddr += 0xD12C;
getProcAddressAddr += 0xD120;
break;
case V113d:
loadCallerAddr += 0xAA03;
freeCallerAddr += 0xA9AA;
loadLibraryAddr += 0xD11C;
freeLibraryAddr += 0xD124;
getProcAddressAddr += 0xD120;
break;
case V114a:
loadCallerAddr += 0x1BCB;// Load advapi.dll
freeCallerAddr += 0xF375;// Free dbghelp.dll
loadLibraryAddr += 0x2CD118;
freeLibraryAddr += 0x2CD120;
getProcAddressAddr += 0x2CD11C;
break;
case V114b:
case V114c:
loadCallerAddr += 0x1BCB;// Load advapi.dll
freeCallerAddr += 0x6F75;// Free dbghelp.dll
loadLibraryAddr += 0x2CD11C;
freeLibraryAddr += 0x2CD124;
getProcAddressAddr += 0x2CD120;
break;
case V114d:
loadCallerAddr += 0x621C;// Load advapi.dll
freeCallerAddr += 0xB514;// Free dbghelp.dll
loadLibraryAddr += 0x2CC144;
freeLibraryAddr += 0x2CC14C;
getProcAddressAddr += 0x2CC148;
break;
default:
return false;
}
*(DWORD*)&loadCallerNew[2] = loadDllAddr - (loadCallerAddr + sizeof(loadCallerNew));
*(DWORD*)&loadCallerOld[2] = loadLibraryAddr;
*(DWORD*)&freeCallerNew[2] = freeDllAddr - (freeCallerAddr + sizeof(freeCallerNew));
*(DWORD*)&freeCallerOld[2] = freeLibraryAddr;
*(DWORD*)&loadDll[6] = loadLibraryAddr;
*(DWORD*)&loadDll[12] = imageBase + libraryNameAddr;
*(DWORD*)&loadDll[18] = loadLibraryAddr;
*(DWORD*)&loadDll[23] = handleAddr;
*(DWORD*)&loadDll[33] = imageBase + initNameAddr;
*(DWORD*)&loadDll[40] = getProcAddressAddr;
*(DWORD*)&loadDll[63] = getProcAddressAddr;
*(DWORD*)&freeDll[6] = freeLibraryAddr;
*(DWORD*)&freeDll[12] = handleAddr;
*(DWORD*)&freeDll[22] = imageBase + releaseNameAddr;
*(DWORD*)&freeDll[29] = getProcAddressAddr;
*(DWORD*)&freeDll[48] = getProcAddressAddr;
*(DWORD*)&freeDll[60] = freeLibraryAddr;
// Patch / Unpatch
int res;
if (unpatch)
res = Unpatch(targetFile);
else
res = Patch(targetFile);
fclose(targetFile);
if (res == 0)
msgBox(boxName, MB_OK | MB_ICONASTERISK,
"%s was modified.\n"
"PlugY, The Survival Kit %s.",
targetFilename, unpatch ? "is removed" : "is installed");
else if (res == 1)
msgBox(boxName, MB_OK | MB_ICONASTERISK,
"PlugY, The Survival Kit already %s.",
unpatch ? "uninstalled" : "installed");
else if (res == 2)
msgBox(boxName, MB_OK | MB_ICONASTERISK,
"File contents in %s isn't correct.\n"
"Unable to %s PlugY, The Survival Kit.",
targetFilename, unpatch ? "uninstall" : "install");
return 1; return 1;
} }
///////////////////////// END OF FILE ///////////////////////

View File

@@ -1,11 +1,11 @@
//Script de ressources g<>n<EFBFBD>r<EFBFBD> par Microsoft Visual C++. //Script de ressources g<>n<EFBFBD>r<EFBFBD> par Microsoft Visual C++.
// //
#include "resource.h" #include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS #define APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// G<>n<EFBFBD>r<EFBFBD> <20> partir de la ressource TEXTINCLUDE 2. // G<>n<EFBFBD>r<EFBFBD> <20> partir de la ressource TEXTINCLUDE 2.
// //
#ifndef APSTUDIO_INVOKED #ifndef APSTUDIO_INVOKED
#include "targetver.h" #include "targetver.h"
@@ -28,8 +28,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,5,0 FILEVERSION 1,0,6,0
PRODUCTVERSION 1,0,5,0 PRODUCTVERSION 1,0,6,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@@ -46,11 +46,11 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Yohann Nicolas" VALUE "CompanyName", "Yohann Nicolas"
VALUE "FileDescription", "PlugY patcher" VALUE "FileDescription", "PlugY patcher"
VALUE "FileVersion", "1.0.5.0" VALUE "FileVersion", "1.0.6.0"
VALUE "LegalCopyright", "Copyright (C) 2017" VALUE "LegalCopyright", "Copyright (C) 2017"
VALUE "OriginalFilename", "PlugYInstall.exe" VALUE "OriginalFilename", "PlugYInstall.exe"
VALUE "ProductName", "PlugY, The Survival Kit" VALUE "ProductName", "PlugY, The Survival Kit"
VALUE "ProductVersion", "11.01" VALUE "ProductVersion", "12.00"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

Binary file not shown.

View File

@@ -159,7 +159,7 @@
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PatchD2gfxDll.exe&quot;" CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PatchD2gfxDll.exe&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
@@ -235,7 +235,7 @@
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\RestoreD2gfxDll.exe&quot;" CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\RestoreD2gfxDll.exe&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>

View File

@@ -5,13 +5,13 @@
; ; ; ;
; by Yohann Nicolas ; ; by Yohann Nicolas ;
; ; ; ;
; version 11.01 ; ; version 12.00 ;
; ; ; ;
;--------------------------------------------------------------------------------------; ;--------------------------------------------------------------------------------------;
; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation. ; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation.
; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information. ; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information.
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt f<EFBFBD>r weitere Informationen ; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt für weitere Informationen
[LAUNCHING] [LAUNCHING]
Param= Param=
@@ -30,7 +30,7 @@ ActiveCheckMemory=1
[WINDOWED] [WINDOWED]
ActiveWindowed=0 ActiveWindowed=0
RemoveBorder=1 RemoveBorder=0
WindowOnTop=0 WindowOnTop=0
Maximized=0 Maximized=0
SetWindowPos=0 SetWindowPos=0
@@ -72,7 +72,7 @@ MaxPersonnalPages=0
ActiveSharedStash=1 ActiveSharedStash=1
SeparateHardcoreStash=1 SeparateHardcoreStash=1
OpenSharedStashOnLoading=0 OpenSharedStashOnLoading=0
displaySharedSetItemNameInGreen=1 DisplaySharedSetItemNameInGreen=1
MaxSharedPages=0 MaxSharedPages=0
ActiveSharedGold=1 ActiveSharedGold=1
@@ -87,7 +87,7 @@ LimitValueToShiftClick=5
[SKILLS POINTS] [SKILLS POINTS]
ActiveSkillsUnassignment=1 ActiveSkillsUnassignment=1
ActiveSkillsUnassignmentOneForOne=0 ActiveSkillsUnassignmentOneByOne=0
[WORLD EVENT] [WORLD EVENT]

View File

@@ -1,8 +1,8 @@
; File created by Yohann NICOLAS. Unicode True
; Modified by L'Autour.
!include "MUI2.nsh" !include "MUI2.nsh"
!define VERSION "11.01" !define VERSION "12.00"
!define D2FILES "." !define D2FILES "."
!define NAME "PlugY, The Survival Kit" !define NAME "PlugY, The Survival Kit"
!define MOD_DIR "Mod PlugY" !define MOD_DIR "Mod PlugY"
@@ -46,54 +46,67 @@ InstallDirRegKey HKLM "${REGKEY}" "InstallPath"
;-------------------------------- ;--------------------------------
; Languages ; Languages
!insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Russian"
LangString DESC_CORE ${LANG_ENGLISH} "Core files.$\nPlugY.dll will be installed in Diablo II directory." LangString DESC_CORE ${LANG_ENGLISH} "Core files.$\nPlugY.dll will be installed in Diablo II directory."
LangString DESC_CORE ${LANG_FRENCH} "Fichiers n<>cessaires.$\nPlugY.dll sera install<6C> dans le r<>pertoire de Diablo II." LangString DESC_CORE ${LANG_GERMAN} "Hauptdateien.$\nPlugY.dll wird in das Installationsverzeichnis von Diablo II installiert."
LangString DESC_CORE ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.$\nPlugY.dll <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Diablo II." LangString DESC_CORE ${LANG_FRENCH} "Fichiers nécessaires.$\nPlugY.dll sera installé dans le répertoire de Diablo II."
LangString DESC_CORE ${LANG_RUSSIAN} "Основные файлы.$\nPlugY.dll должен быть установлен в каталог Diablo II."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_ENGLISH} "Add shortcut on Desktop to launch Diablo II with ${NAME}." LangString DESC_DESKTOP_SHORTCUTS ${LANG_ENGLISH} "Add shortcut on Desktop to launch Diablo II with ${NAME}."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_FRENCH} "Ajoute un raccourci pour d<>marrer Diablo II avec ${NAME}." LangString DESC_DESKTOP_SHORTCUTS ${LANG_GERMAN} "Fügt eine Verknüpfung auf dem Desktop mit dem Namen ${NAME} hinzu mit der Diablo II gestartet werden kann."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Diablo II <EFBFBD> ${NAME}." LangString DESC_DESKTOP_SHORTCUTS ${LANG_FRENCH} "Ajoute un raccourci pour démarrer Diablo II avec ${NAME}."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлык на рабочий стол для запуска Diablo II с ${NAME}."
LangString DESC_MENU_SHORTCUTS ${LANG_ENGLISH} "Add shortcuts in start menu." LangString DESC_MENU_SHORTCUTS ${LANG_ENGLISH} "Add shortcuts in start menu."
LangString DESC_MENU_SHORTCUTS ${LANG_FRENCH} "Ajoute des raccourcis dans le menu d<>marrer." LangString DESC_MENU_SHORTCUTS ${LANG_GERMAN} "Fügt Verknüpfungen im Startmenü hinzu."
LangString DESC_MENU_SHORTCUTS ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>." LangString DESC_MENU_SHORTCUTS ${LANG_FRENCH} "Ajoute des raccourcis dans le menu démarrer."
LangString DESC_MENU_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлыки в главное меню."
LangString DESC_UNINSTALLER ${LANG_ENGLISH} "Create a Windows uninstall program.$\nAdding registry keys in Windows." LangString DESC_UNINSTALLER ${LANG_ENGLISH} "Create a Windows uninstall program.$\nAdding registry keys in Windows."
LangString DESC_UNINSTALLER ${LANG_FRENCH} "Cr<EFBFBD>e un programme Windows de d<>sinstallation.$\nAjoute des cl<63>s de registres dans Windows." LangString DESC_UNINSTALLER ${LANG_GERMAN} "Erzeugt ein Deinstallationsprogramm.$\nWindows Registrierungseinträge werden erstellt."
LangString DESC_UNINSTALLER ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Windows <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.$\n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Windows." LangString DESC_UNINSTALLER ${LANG_FRENCH} "Crée un programme Windows de désinstallation.$\nAjoute des clés de registres dans Windows."
LangString DESC_PATCH_D2GFX ${LANG_ENGLISH} "D2gfx.dll patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme." LangString DESC_UNINSTALLER ${LANG_RUSSIAN} "Создать в Windows деинстллятор программы.$\nДобавляет ключи реестра в Windows."
LangString DESC_PATCH_D2GFX ${LANG_FRENCH} "D2gfx.dll patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI." LangString DESC_PATCH_FILE ${LANG_ENGLISH} "Patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme."
LangString DESC_PATCH_D2GFX ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> D2gfx.dll <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PlugY <EFBFBD><EFBFBD><EFBFBD> PlugY.exe. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> Readme." LangString DESC_PATCH_FILE ${LANG_GERMAN} "Patcher um PlugY ohne PlugY.exe zu starten.$\nDie LiesMich-Datei MUSS vor Benutzung gelesen werden."
LangString DESC_PATCH_FILE ${LANG_FRENCH} "D2gfx.dll patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI."
LangString DESC_PATCH_FILE ${LANG_RUSSIAN} "Применить патч для запуска PlugY без PlugY.exe. Подробнее смотреть в файле Readme."
LangString SECTION_NAME_CORE ${LANG_ENGLISH} "${NAME} (required)" LangString SECTION_NAME_CORE ${LANG_ENGLISH} "${NAME} (required)"
LangString SECTION_NAME_CORE ${LANG_FRENCH} "${NAME} (n<EFBFBD>cessaire)" LangString SECTION_NAME_CORE ${LANG_GERMAN} "${NAME} (benötigt)"
LangString SECTION_NAME_CORE ${LANG_RUSSIAN} "${NAME} (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)" LangString SECTION_NAME_CORE ${LANG_FRENCH} "${NAME} (nécessaire)"
LangString SECTION_NAME_CORE ${LANG_RUSSIAN} "${NAME} (требуется)"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_ENGLISH} "Desktop Shortcut" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_ENGLISH} "Desktop Shortcut"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_GERMAN} "Desktopverknüpfung"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_FRENCH} "Raccourci sur le bureau" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_FRENCH} "Raccourci sur le bureau"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_RUSSIAN} "Ярлык на рабочем столе"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_ENGLISH} "Start menu Shortcuts" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_ENGLISH} "Start menu Shortcuts"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_FRENCH} "Raccourcis dans le Menu d<>marrer" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_GERMAN} "Startmenüverknüpfungen"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_FRENCH} "Raccourcis dans le Menu démarrer"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_RUSSIAN} "Ярлыки в в главном меню"
LangString SECTION_NAME_UNINSTALLER ${LANG_ENGLISH} "Uninstaller (add keys registers)" LangString SECTION_NAME_UNINSTALLER ${LANG_ENGLISH} "Uninstaller (add keys registers)"
LangString SECTION_NAME_UNINSTALLER ${LANG_FRENCH} "D<EFBFBD>-installeur (ajoute cl<63>s de registre)" LangString SECTION_NAME_UNINSTALLER ${LANG_GERMAN} "Deinstallationsprogramm (Fügt Windows Registrierungseinträge hinzu)"
LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)" LangString SECTION_NAME_UNINSTALLER ${LANG_FRENCH} "Dé-installeur (ajoute clés de registre)"
LangString SECTION_PATCH_D2GFX ${LANG_ENGLISH} "D2gfx.dll Patcher (advanced user only)" LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "Деинсталлятор (добавляет ключи реестра)"
LangString SECTION_PATCH_D2GFX ${LANG_FRENCH} "Patcheur de D2gfx.dll (utilisateur avanc<6E> uniquement)" LangString SECTION_PATCH_FILE ${LANG_ENGLISH} "File Patcher (advanced user only)"
LangString SECTION_PATCH_D2GFX ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> D2gfx.dll Patcher (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)" LangString SECTION_PATCH_FILE ${LANG_GERMAN} "Datei Patcher (Für erfahrene Nutzer)"
LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de D2gfx.dll (utilisateur avancé uniquement)"
LangString SECTION_PATCH_FILE ${LANG_RUSSIAN} "Патч для Patcher (для опытных пользователей)"
LangString README_FILENAME ${LANG_ENGLISH} "PlugY_The_Survival_Kit_-_Readme.txt" LangString README_FILENAME ${LANG_ENGLISH} "PlugY_The_Survival_Kit_-_Readme.txt"
LangString README_FILENAME ${LANG_GERMAN} "PlugY_The_Survival_Kit_-_Liesmich.txt"
LangString README_FILENAME ${LANG_FRENCH} "PlugY_The_Survival_Kit_-_LisezMoi.txt" LangString README_FILENAME ${LANG_FRENCH} "PlugY_The_Survival_Kit_-_LisezMoi.txt"
LangString README_FILENAME ${LANG_RUSSIAN} "PlugY_The_Survival_Kit_-_Readme.txt" LangString README_FILENAME ${LANG_RUSSIAN} "PlugY_The_Survival_Kit_-_Readme.txt"
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_ENGLISH} "Error : Diablo II install directory not found.$\nPlease re-install your copy of Diablo II - Lord of Destruction." LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_ENGLISH} "Error : Diablo II install directory not found.$\nPlease re-install your copy of Diablo II - Lord of Destruction."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_FRENCH} "Erreur : Le r<>pertoire d'installation de Diablo II n'a pas <20>t<EFBFBD> trouv<75>.$\nVeuillez r<>-installer votre copie de Diablo II - Lord of Destruction." LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_GERMAN} "Fehler : Diablo II Installationsverzeichnis nicht gefunden.$\nBitte installiere Diablo II - Lord of Destruction neu."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_RUSSIAN} "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Diablo II <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.$\n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Diablo II - Lord of Destruction." LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_FRENCH} "Erreur : Le répertoire d'installation de Diablo II n'a pas été trouvé.$\nVeuillez ré-installer votre copie de Diablo II - Lord of Destruction."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_RUSSIAN} "Ошибка : каталог с установленной игрой Diablo II не найден.$\nПожалуйста переустановите вашу копию Diablo II - Lord of Destruction."
Var D2Path Var D2Path
;-------------------------------- ;--------------------------------
; Initialisation ; Initialisation
Function .onInit Function .onInit
!define MUI_LANGDLL_WINDOWTITLE "${NAME} v${VERSION}" !define MUI_LANGDLL_WINDOWTITLE "${NAME} v${VERSION}"
!define MUI_LANGDLL_INFO "Select your language:$\nChoisissez votre langue:" !define MUI_LANGDLL_INFO "Select your language:"
!insertmacro MUI_LANGDLL_DISPLAY !insertmacro MUI_LANGDLL_DISPLAY
!undef MUI_LANGDLL_WINDOWTITLE !undef MUI_LANGDLL_WINDOWTITLE
!undef MUI_LANGDLL_INFO !undef MUI_LANGDLL_INFO
@@ -128,38 +141,6 @@ Function LaunchPlugY
ExecShell "" "$INSTDIR\PlugY.exe" ExecShell "" "$INSTDIR\PlugY.exe"
FunctionEnd FunctionEnd
;--------------------------------
; Custom Page
;Function OptionsPage
;StrCpy $INSTDIR "C:\temp\${NAME}"
; nsDialogs::Create /NOUNLOAD 1018
;Pop $D2Path
;GetFunctionAddress $D2Path OnBack
;nsDialogs::OnBack /NOUNLOAD $D2Path
;${NSD_CreateButton} 0 0 100% 12u Test
;Pop $BUTTON
;GetFunctionAddress $D2Path OnClick
;nsDialogs::OnClick /NOUNLOAD $BUTTON $D2Path
;${NSD_CreateText} 0 35 100% 12u hello
;Pop $EDIT
;GetFunctionAddress $D2Path OnChange
;nsDialogs::OnChange /NOUNLOAD $EDIT $D2Path
;${NSD_CreateCheckbox} 0 -50 100% 8u Test
;Pop $CHECKBOX
;GetFunctionAddress $D2Path OnCheckbox
;nsDialogs::OnClick /NOUNLOAD $CHECKBOX $D2Path
;${NSD_CreateLabel} 0 40u 75% 40u "* Type `hello there` above.$\n* Click the button.$\n* Check the checkbox.$\n* Hit the Back button."
;Pop $D2Path
; nsDialogs::Show
;FunctionEnd
InstType "Standard" InstType "Standard"
InstType "Minimal" InstType "Minimal"
@@ -222,10 +203,11 @@ Section $(SECTION_NAME_UNINSTALLER) Uninstaller
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "NoRepair" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "NoRepair" 1
SectionEnd SectionEnd
Section $(SECTION_PATCH_D2GFX) PatchD2gfx Section $(SECTION_PATCH_FILE) PatchFile
SectionIn 1
SetOutPath $D2Path SetOutPath $D2Path
File "${D2FILES}\PatchD2gfxDll.exe" File "${D2FILES}\PatchD2File.exe"
File "${D2FILES}\RestoreD2gfxDll.exe" File "${D2FILES}\RestoreD2File.exe"
SectionEnd SectionEnd
;-------------------------------- ;--------------------------------
@@ -242,8 +224,8 @@ Section "Uninstall" Uninstall
; Remove files and uninstaller ; Remove files and uninstaller
Delete "$D2Path\PlugY.dll" Delete "$D2Path\PlugY.dll"
Delete "$D2Path\PatchD2gfxDll.exe" Delete "$D2Path\PatchD2File.exe"
Delete "$D2Path\RestoreD2gfxDll.exe" Delete "$D2Path\RestoreD2File.exe"
Delete "$INSTDIR\PlugY.exe" Delete "$INSTDIR\PlugY.exe"
Delete "$INSTDIR\PlugY.log" Delete "$INSTDIR\PlugY.log"
Delete "$INSTDIR\BnetLog.txt" Delete "$INSTDIR\BnetLog.txt"
@@ -267,13 +249,11 @@ Section "Uninstall" Uninstall
RMDir "$INSTDIR" RMDir "$INSTDIR"
SectionEnd SectionEnd
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT "${Core}" $(DESC_CORE) !insertmacro MUI_DESCRIPTION_TEXT "${Core}" $(DESC_CORE)
!insertmacro MUI_DESCRIPTION_TEXT "${DesktopShortcuts}" $(DESC_DESKTOP_SHORTCUTS) !insertmacro MUI_DESCRIPTION_TEXT "${DesktopShortcuts}" $(DESC_DESKTOP_SHORTCUTS)
!insertmacro MUI_DESCRIPTION_TEXT "${MenuShortcuts}" $(DESC_MENU_SHORTCUTS) !insertmacro MUI_DESCRIPTION_TEXT "${MenuShortcuts}" $(DESC_MENU_SHORTCUTS)
!insertmacro MUI_DESCRIPTION_TEXT "${PatchD2gfx}" $(DESC_PATCH_D2GFX) !insertmacro MUI_DESCRIPTION_TEXT "${PatchFile}" $(DESC_PATCH_FILE)
!insertmacro MUI_DESCRIPTION_TEXT "${Uninstaller}" $(DESC_UNINSTALLER) !insertmacro MUI_DESCRIPTION_TEXT "${Uninstaller}" $(DESC_UNINSTALLER)
!insertmacro MUI_FUNCTION_DESCRIPTION_END !insertmacro MUI_FUNCTION_DESCRIPTION_END

View File

@@ -6,13 +6,13 @@
; ; ; ;
; by Yohann Nicolas ; ; by Yohann Nicolas ;
; ; ; ;
; version 11.01 ; ; version 12.00 ;
; ; ; ;
;--------------------------------------------------------------------------------------; ;--------------------------------------------------------------------------------------;
; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation. ; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation.
; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information. ; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information.
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt f<>r weitere Informationen ; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt f<>r weitere Informationen
[GENERAL] [GENERAL]
@@ -75,7 +75,7 @@ ActiveSharedStash=0
SeparateHardcoreStash=1 SeparateHardcoreStash=1
OpenSharedStashOnLoading=0 OpenSharedStashOnLoading=0
SharedStashFilename=SharedStashSave SharedStashFilename=SharedStashSave
displaySharedSetItemNameInGreen=1 DisplaySharedSetItemNameInGreen=1
MaxSharedPages=0 MaxSharedPages=0
ActiveSharedGold=1 ActiveSharedGold=1
@@ -110,7 +110,7 @@ StatPerLevelUp=5
[SKILLS POINTS] [SKILLS POINTS]
ActiveSkillsUnassignment=0 ActiveSkillsUnassignment=0
ActiveSkillsUnassignmentOneForOne=0 ActiveSkillsUnassignmentOneByOne=0
PosXUnassignSkillBtn=-1 PosXUnassignSkillBtn=-1
PosYUnassignSkillBtn=-1 PosYUnassignSkillBtn=-1

View File

@@ -6,7 +6,7 @@
; ; ; ;
; by Yohann Nicolas ; ; by Yohann Nicolas ;
; ; ; ;
; version 11.01 ; ; version 12.00 ;
; ; ; ;
;--------------------------------------------------------------------------------------; ;--------------------------------------------------------------------------------------;

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: 撤銷加點, +Shift: %d 點",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt撤銷加點, +Shift: 所有剩余点",
"STR_STATS_BASE_MIN": "基礎:%d (最低:%d)",
"STR_SKILLS_UNASSIGN": "撤销分配所有技能點",
"STR_STASH_PREVIOUS_PAGE": "上一頁 (+Shift: 第一頁)",
"STR_STASH_NEXT_PAGE": "下一頁 (+Shift: 最後非空頁)",
"STR_TOGGLE_TO_PERSONAL": "切換到個人儲物箱",
"STR_TOGGLE_TO_SHARED": "切換到共享儲物箱",
"STR_STASH_PREVIOUS_INDEX": "向前索引 : %d 頁 (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "向後索引 : %d 頁 (+Shift: %d)",
"STR_PUT_GOLD": "存入金幣",
"STR_TAKE_GOLD": "取出金幣",
"STR_PERSONAL_PAGE_NUMBER": "個人儲物箱:第 %u 頁",
"STR_SHARED_PAGE_NUMBER": "共享儲物箱:第 %u 頁",
"STR_NO_SELECTED_PAGE": "沒有選擇的頁面",
"STR_SHARED_GOLD_QUANTITY": "共享金幣",
"STR_PREVIOUS_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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Zurücksetzen, +Shift: um %d Punkte",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Zurücksetzen, +Shift: Alle verbleibenden Punkte",
"STR_STATS_BASE_MIN": "Basiswert: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Alle Fertigkeitspunkte zurücksetzen",
"STR_STASH_PREVIOUS_PAGE": "Vorherige Seite (+Shift: Erste Seite)",
"STR_STASH_NEXT_PAGE": "Nächste Seite (+Shift: Letzte nicht leere Seite )",
"STR_TOGGLE_TO_PERSONAL": "Wechselt zum persönlichen Goldschatz",
"STR_TOGGLE_TO_SHARED": "Wechselt zum gemeinsamen Goldschatz",
"STR_STASH_PREVIOUS_INDEX": "Vorheriger Index: in %d Seiten (+shift: %d)",
"STR_STASH_NEXT_INDEX": "Nächster Index: in %d Seiten (+shift: %d)",
"STR_PUT_GOLD": "Gib Gold",
"STR_TAKE_GOLD": "Nehme Gold",
"STR_PERSONAL_PAGE_NUMBER": "Persönliche Seite n°%u",
"STR_SHARED_PAGE_NUMBER": "Gemeinsame Seite n°%u",
"STR_NO_SELECTED_PAGE": "Keine ausgewählte Seite",
"STR_SHARED_GOLD_QUANTITY": "Gemeinsames Gold",
"STR_PREVIOUS_PAGE": "Vorherige Seite",
"STR_NEXT_PAGE": "Nächste Seite",
"STR_ITEM_LEVEL": "Gegenstandsstufe",
"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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Unassign, +Shift: by %d points",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Unassign, +Shift: all remaining points",
"STR_STATS_BASE_MIN": "Base: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Unassign all skills points",
"STR_STASH_PREVIOUS_PAGE": "Previous Page (+Shift: First Page)",
"STR_STASH_NEXT_PAGE": "Next Page (+Shift: Last not empty Page)",
"STR_TOGGLE_TO_PERSONAL": "Toggle to Personal Stash",
"STR_TOGGLE_TO_SHARED": "Toggle to Shared Stash",
"STR_STASH_PREVIOUS_INDEX": "Previous Index : by %d Pages (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "Next Index : by %d Pages (+shift: %d)",
"STR_PUT_GOLD": "Put Gold",
"STR_TAKE_GOLD": "Take Gold",
"STR_PERSONAL_PAGE_NUMBER": "Personal Page n°%u",
"STR_SHARED_PAGE_NUMBER": "Shared Page n°%u",
"STR_NO_SELECTED_PAGE": "No selected page",
"STR_SHARED_GOLD_QUANTITY": "Shared Gold",
"STR_PREVIOUS_PAGE": "Previous Page",
"STR_NEXT_PAGE": "Next Page",
"STR_ITEM_LEVEL": "Item Level",
"STR_COW_PORTAL": "Cow Portal",
"STR_PANDEMONIUM_PORTAL": "Pandemonium Portal",
"STR_PANDEMONIUM_FINAL_PORTAL": "Pandemonium Final Portal",
"STR_FULL": "Fully",
"STR_REPAIR": "Repair",
"STR_AND": "and",
"STR_RECHARGE": "Recharge",
"STR_DESTROY_FILLERS": "Destroys Fillers",
"STR_REMOVE_FILLERS": "Remove Fillers",
"STR_REGENERATE": "Regenerate",
"STR_UPGRADE_TO_EXCEPTIONAL": "Upgrade to Exceptional",
"STR_UPGRADE_TO_ELITE": "Upgrade to Elite",
"STR_ETHERAL": "Ethereal",
"STR_NOT_ETHERAL": "Not Ethereal",
"STR_NOT_RUNEWORD": "Not Runeword",
"STR_BASIC": "Basic",
"STR_EXCEPTIONAL": "Exceptional",
"STR_ELITE": "Elite",
"STR_CRACKED": "Cracked",
"STR_NORMAL": "Normal",
"STR_SUPERIOR": "Superior",
"STR_MAGIC": "Magic",
"STR_SET": "Set",
"STR_RARE": "Rare",
"STR_UNIQUE": "Unique",
"STR_CRAFTED": "Crafted",
"STR_TEMPERED": "Tempered",
"STR_ITEM": "Item",
"STR_ITEM_SAME_TYPE": "Item of the same type",
"STR_INCLUDE_UPGRADED": "(or upgraded)",
"STR_WITHOUT_SOCKET": "without Socket",
"STR_WITH_SOCKETS": "with Sockets",
"STR_WITH_N_SOCKETS": "with %u Sockets",
"STR_ONLY_N_H": "(Nightmare and Hell only)",
"STR_ONLY_HELL": "(Hell only)",
"STR_ONLY_CLASS": "%hs only",
"TYPE_shie": "Shield (Not Class Specific)",
"TYPE_tors": "Body Armor",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "Potion",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "Charm",
"TYPE_boot": "lbt",
"TYPE_glov": "Gloves",
"TYPE_book": "Book",
"TYPE_belt": "mbl",
"TYPE_gem": "Gem",
"TYPE_torc": "tch",
"TYPE_scro": "Scroll",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "Staff",
"TYPE_bow": "Bow",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "Sword",
"TYPE_hamm": "Hammer",
"TYPE_knif": "Knife",
"TYPE_spea": "spr",
"TYPE_pole": "Polearm",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "Missile Potion",
"TYPE_ques": "Quest Item",
"TYPE_body": "Body Part",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "Weapon",
"TYPE_mele": "Melee Weapon",
"TYPE_miss": "Missile Weapon",
"TYPE_thro": "Throwing Weapon",
"TYPE_comb": "Combo Weapon",
"TYPE_armo": "Armor",
"TYPE_shld": "Any Shield",
"TYPE_misc": "Miscellaneous",
"TYPE_sock": "Socket Filler",
"TYPE_seco": "Second Hand Item",
"TYPE_rod": "Staff or Rod",
"TYPE_misl": "Missile",
"TYPE_blun": "Blunt weapon",
"TYPE_jewl": "jew",
"TYPE_clas": "Class Specific",
"TYPE_amaz": "Amazon Item",
"TYPE_barb": "Barbarian Item",
"TYPE_necr": "Necromancer Item",
"TYPE_pala": "Paladin Item",
"TYPE_sorc": "Sorceress Item",
"TYPE_assn": "Assassin Item",
"TYPE_drui": "Druid Item",
"TYPE_h2h": "Claw",
"TYPE_h2h2": "Assassin Claw",
"TYPE_orb": "Orb",
"TYPE_head": "Voodoo Heads",
"TYPE_ashd": "Paladin Shield",
"TYPE_phlm": "Barbarian Helm",
"TYPE_pelt": "Druid Helm",
"TYPE_cloa": "cloak",
"TYPE_rune": "Rune",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "Amazon Bow",
"TYPE_aspe": "Amazon Spear",
"TYPE_ajav": "Amazon Javelin",
"TYPE_mboq": "Magic Arrows",
"TYPE_mxbq": "Magic Bolts",
"TYPE_gem0": "Chipped Gem",
"TYPE_gem1": "Flawed Gem",
"TYPE_gem2": "Normal Gem",
"TYPE_gem3": "Flawless Gem",
"TYPE_gem4": "Perfect Gem"
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Desasignar, +Shift: %d Puntos",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Desasignar, +Shift: Puntos Restantes",
"STR_STATS_BASE_MIN": "Base: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Desasignar Todos los Puntos de Habilidades",
"STR_STASH_PREVIOUS_PAGE": "Página Anterior (+Shift: Primera Página)",
"STR_STASH_NEXT_PAGE": "Página Siguiente (+Shift: Última Página Ocupada)",
"STR_TOGGLE_TO_PERSONAL": "Ver Alijo Personal",
"STR_TOGGLE_TO_SHARED": "Ver Alijo Común",
"STR_STASH_PREVIOUS_INDEX": "Retroceder: %d Páginas (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "Avanzar: %d Páginas (+shift: %d)",
"STR_PUT_GOLD": "Guardar Oro",
"STR_TAKE_GOLD": "Retirar Oro",
"STR_PERSONAL_PAGE_NUMBER": "Página Personal n°%u",
"STR_SHARED_PAGE_NUMBER": "Página Común n°%u",
"STR_NO_SELECTED_PAGE": "Sin Página Activa***",
"STR_SHARED_GOLD_QUANTITY": "Oro Común",
"STR_PREVIOUS_PAGE": "Página Anterior",
"STR_NEXT_PAGE": "Página Siguiente",
"STR_ITEM_LEVEL": "Nivel de Objeto",
"STR_COW_PORTAL": "Portal de Las Vacas",
"STR_PANDEMONIUM_PORTAL": "Portal del Pandemonium***",
"STR_PANDEMONIUM_FINAL_PORTAL": "Portal Final del Pandemonium***",
"STR_FULL": "Completamente***",
"STR_REPAIR": "Reparar",
"STR_AND": "y",
"STR_RECHARGE": "Recargar",
"STR_DESTROY_FILLERS": "Eliminar Objetos Embebido",
"STR_REMOVE_FILLERS": "Remover Objetos Embebido",
"STR_REGENERATE": "Regenerar",
"STR_UPGRADE_TO_EXCEPTIONAL": "Mejorar a Excepcional",
"STR_UPGRADE_TO_ELITE": "Mejorar a Élite",
"STR_ETHERAL": "Etéreo",
"STR_NOT_ETHERAL": "No Etéreo",
"STR_NOT_RUNEWORD": "No Rúnico",
"STR_BASIC": "Básico",
"STR_EXCEPTIONAL": "Excepcional",
"STR_ELITE": "Élite",
"STR_CRACKED": "Agrietado",
"STR_NORMAL": "Normal",
"STR_SUPERIOR": "Superior",
"STR_MAGIC": "Mágico",
"STR_SET": "Set",
"STR_RARE": "Raro",
"STR_UNIQUE": "Único",
"STR_CRAFTED": "Hecho a Mano",
"STR_TEMPERED": "Templado",
"STR_ITEM": "Objeto",
"STR_ITEM_SAME_TYPE": "Objeto del Mismo Tipo",
"STR_INCLUDE_UPGRADED": "(o mejorado)",
"STR_WITHOUT_SOCKET": "sin Huecos",
"STR_WITH_SOCKETS": "con Huecos",
"STR_WITH_N_SOCKETS": "con %u Huecos",
"STR_ONLY_N_H": "(solo Pasadilla e Infierno)",
"STR_ONLY_HELL": "(solo Infierno)",
"STR_ONLY_CLASS": "%hs solamente",
"TYPE_shie": "Escudo (No Propietario de Clase)",
"TYPE_tors": "Armadura",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "Poción",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "Hechizo",
"TYPE_boot": "lbt",
"TYPE_glov": "Guantes",
"TYPE_book": "Tomo",
"TYPE_belt": "mbl",
"TYPE_gem": "Gema",
"TYPE_torc": "tch",
"TYPE_scro": "Pergamino",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "Bastón",
"TYPE_bow": "Arco",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "Espada",
"TYPE_hamm": "Martillo",
"TYPE_knif": "Cuchillo",
"TYPE_spea": "spr",
"TYPE_pole": "Pica",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "Poción Arrojadiza",
"TYPE_ques": "Objeto de Búsqueda",
"TYPE_body": "Parte Corporal",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "Arma",
"TYPE_mele": "Arma Cuerpo a Cuerpo",
"TYPE_miss": "Arma a Distancia",
"TYPE_thro": "Arma Arrojadiza",
"TYPE_comb": "Arma de Choque",
"TYPE_armo": "Armadura",
"TYPE_shld": "Escudo",
"TYPE_misc": "Misceláneo",
"TYPE_sock": "Embebible",
"TYPE_seco": "Clase Inferior",
"TYPE_rod": "Bastón o Cetro",
"TYPE_misl": "Proyectil",
"TYPE_blun": "Arma Contundente",
"TYPE_jewl": "jew",
"TYPE_clas": "Propietario a Clase",
"TYPE_amaz": "Objeto de Amazona",
"TYPE_barb": "Objeto de Bárbaro",
"TYPE_necr": "Objeto de Nigromante",
"TYPE_pala": "Objeto de Paladín",
"TYPE_sorc": "Objeto de Hechicera",
"TYPE_assn": "Objeto de Asesina",
"TYPE_drui": "Objeto de Druida",
"TYPE_h2h": "Garra",
"TYPE_h2h2": "Garra de Asesina",
"TYPE_orb": "Orbe",
"TYPE_head": "Cabezas Voodoo",
"TYPE_ashd": "Escudo de Paladín",
"TYPE_phlm": "Casco de Bárbaro",
"TYPE_pelt": "Casco de Druida",
"TYPE_cloa": "cloak",
"TYPE_rune": "Runa",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "Arco de Amazona",
"TYPE_aspe": "Lanza de Amazona",
"TYPE_ajav": "Javalina de Amazona",
"TYPE_mboq": "Flechas Mágicas",
"TYPE_mxbq": "Saetas Mágicas",
"TYPE_gem0": "Gema Astillada",
"TYPE_gem1": "Gema Defectuosa",
"TYPE_gem2": "Gema Normal",
"TYPE_gem3": "Gema Impecable",
"TYPE_gem4": "Gema Perfecta"
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Désallocation, +Shift: par %d points",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Désallocation, +Shift: Tous les points restants",
"STR_STATS_BASE_MIN": "Base: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Désalloue tous les points d'aptitudes",
"STR_STASH_PREVIOUS_PAGE": "Page précédente (+Shift: Première page)",
"STR_STASH_NEXT_PAGE": "Page suivante (+Shift: Dernière page non vide)",
"STR_TOGGLE_TO_PERSONAL": "Voir coffre personnel",
"STR_TOGGLE_TO_SHARED": "Voir coffre partagé",
"STR_STASH_PREVIOUS_INDEX": "Index précédent : par %d pages (+shift: %d)",
"STR_STASH_NEXT_INDEX": "Index suivant : par %d pages (+shift: %d)",
"STR_PUT_GOLD": "Déposer de l'or",
"STR_TAKE_GOLD": "Prendre de l'or",
"STR_PERSONAL_PAGE_NUMBER": "Page personnel n°%u",
"STR_SHARED_PAGE_NUMBER": "Page partagée n°%u",
"STR_NO_SELECTED_PAGE": "Aucune page sélectionnée",
"STR_SHARED_GOLD_QUANTITY": "Or partagé",
"STR_PREVIOUS_PAGE": "Page précédente",
"STR_NEXT_PAGE": "Page suivante",
"STR_ITEM_LEVEL": "Niveau d'objet",
"STR_COW_PORTAL": "Portail des vaches",
"STR_PANDEMONIUM_PORTAL": "Portail du Pandemonium",
"STR_PANDEMONIUM_FINAL_PORTAL": "Portail du Pandemonium Final",
"STR_FULL": "",
"STR_REPAIR": "Répare",
"STR_AND": "et",
"STR_RECHARGE": "Recharge",
"STR_DESTROY_FILLERS": "Détruit les objets enchassés.",
"STR_REMOVE_FILLERS": "Enléve les objets enchassés.",
"STR_REGENERATE": "Régénére",
"STR_UPGRADE_TO_EXCEPTIONAL": "Amélioration en Exceptionnel",
"STR_UPGRADE_TO_ELITE": "Amélioration en Élite",
"STR_ETHERAL": "Éthéré",
"STR_NOT_ETHERAL": "Non Éthéré",
"STR_NOT_RUNEWORD": "Pas de mots runiques",
"STR_BASIC": "Basique",
"STR_EXCEPTIONAL": "Exceptionnal",
"STR_ELITE": "Élite",
"STR_CRACKED": "Abimée",
"STR_NORMAL": "Normal",
"STR_SUPERIOR": "Supérieur",
"STR_MAGIC": "Magique",
"STR_SET": "d'Ensemble",
"STR_RARE": "Rare",
"STR_UNIQUE": "Unique",
"STR_CRAFTED": "Créé",
"STR_TEMPERED": "Tempéré",
"STR_ITEM": "Objet",
"STR_ITEM_SAME_TYPE": "Object du même type",
"STR_INCLUDE_UPGRADED": "(ou améliorée)",
"STR_WITHOUT_SOCKET": "sans Chasse",
"STR_WITH_SOCKETS": "avec Chasses",
"STR_WITH_N_SOCKETS": "avec %u Chasse",
"STR_ONLY_N_H": "(Cauchemard uniquement)",
"STR_ONLY_HELL": "(Enfer uniquement)",
"STR_ONLY_CLASS": "%hs uniquement",
"TYPE_shie": "Boulier (sauf spécifique aux classes)",
"TYPE_tors": "Plastron",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "Potion",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "Charme",
"TYPE_boot": "lbt",
"TYPE_glov": "Gants",
"TYPE_book": "Livre",
"TYPE_belt": "mbl",
"TYPE_gem": "Gemme",
"TYPE_torc": "tch",
"TYPE_scro": "Manuscrit",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "Baton",
"TYPE_bow": "Arc",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "Épée",
"TYPE_hamm": "Marteau",
"TYPE_knif": "Couteau",
"TYPE_spea": "spr",
"TYPE_pole": "Arme d'hast",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "Potion à lançer",
"TYPE_ques": "Objet de quête",
"TYPE_body": "Partie de corps",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "Arme",
"TYPE_mele": "Arme de mélée",
"TYPE_miss": "Arme à distance",
"TYPE_thro": "Arme de jet",
"TYPE_comb": "Arme de combo",
"TYPE_armo": "Armure",
"TYPE_shld": "Bouclier",
"TYPE_misc": "Divers",
"TYPE_sock": "Objet à enchasser",
"TYPE_seco": "Main gauche",
"TYPE_rod": "Bâton ou barre",
"TYPE_misl": "Missile",
"TYPE_blun": "Arme contandante",
"TYPE_jewl": "jew",
"TYPE_clas": "Spécifique classe",
"TYPE_amaz": "Objet d'Amazone",
"TYPE_barb": "Objet de Barbare",
"TYPE_necr": "Objet Nécromancien",
"TYPE_pala": "Objet de Paladin",
"TYPE_sorc": "Objet de Sorcière",
"TYPE_assn": "Objet d'Assassin",
"TYPE_drui": "Objet de Druide",
"TYPE_h2h": "Griffe",
"TYPE_h2h2": "Griffe d'Assassin",
"TYPE_orb": "Orbe",
"TYPE_head": "Tête de Voodoo",
"TYPE_ashd": "Bouclier de Paladin",
"TYPE_phlm": "Heaumme de Barbare",
"TYPE_pelt": "Heaumme de Druide",
"TYPE_cloa": "cloak",
"TYPE_rune": "Rune",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "Arc d'Amazone",
"TYPE_aspe": "Lance d'Amazone",
"TYPE_ajav": "Javeline d'Amazone",
"TYPE_mboq": "Fléche d'Amazone",
"TYPE_mxbq": "Trait d'arbalète",
"TYPE_gem0": "Gemme taillée",
"TYPE_gem1": "Gemme fissurée",
"TYPE_gem2": "Gemme normale",
"TYPE_gem3": "Gemme sans défaut",
"TYPE_gem4": "Gemme parfaite"
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Rimuovi, +Shift: Assegna %d punti",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti",
"STR_STATS_BASE_MIN": "Base: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Rimuovi tutte le abilità",
"STR_STASH_PREVIOUS_PAGE": "Pagina Precedente (+Shift: Prima Pagina)",
"STR_STASH_NEXT_PAGE": "Pagina Successiva (+Shift: Ultima Pagina non vuota)",
"STR_TOGGLE_TO_PERSONAL": "Vai all'Inventario Personale",
"STR_TOGGLE_TO_SHARED": "Vai all'Inventario Condiviso",
"STR_STASH_PREVIOUS_INDEX": "Schermata Precedente : Indietro di %d Pagine (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "Schermata Successiva : Avanti di %d Pagine (+shift: %d)",
"STR_PUT_GOLD": "Immetti Oro",
"STR_TAKE_GOLD": "Ritira Oro",
"STR_PERSONAL_PAGE_NUMBER": "Pagina Personale n°%u",
"STR_SHARED_PAGE_NUMBER": "Pagina Condivisa n°%u",
"STR_NO_SELECTED_PAGE": "Nessuna pagina selezionata",
"STR_SHARED_GOLD_QUANTITY": "Oro Condiviso",
"STR_PREVIOUS_PAGE": "Pagina Precedente",
"STR_NEXT_PAGE": "Pagina Successiva",
"STR_ITEM_LEVEL": "Nivel de objeto",
"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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: 振分けの取消し, +Shift: %d pt",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: 振分けの取消し, +Shift: 残るptの全部",
"STR_STATS_BASE_MIN": "基本: %d (最小: %d)",
"STR_SKILLS_UNASSIGN": "スキルptの振り分けを全て取り消し",
"STR_STASH_PREVIOUS_PAGE": "前のページ (+Shift: 最初のページ)",
"STR_STASH_NEXT_PAGE": "次のページ (+Shift: アイテムがある最後のページ)",
"STR_TOGGLE_TO_PERSONAL": "個人収納箱に切り替える",
"STR_TOGGLE_TO_SHARED": "共用収納箱に切り替える",
"STR_STASH_PREVIOUS_INDEX": "前に一括ページ切替 : %d ページ (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "次に一括ページ切替 : %d ページ (+shift: %d)",
"STR_PUT_GOLD": "ゴールドを預ける",
"STR_TAKE_GOLD": "ゴールドを取り出す",
"STR_PERSONAL_PAGE_NUMBER": "個人収納箱 n° %u",
"STR_SHARED_PAGE_NUMBER": "共用収納箱 n° %u",
"STR_NO_SELECTED_PAGE": "選択されるページがない",
"STR_SHARED_GOLD_QUANTITY": "共有ゴールド",
"STR_PREVIOUS_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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: 할당, +Shift: %d 포인트로",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: 할당, +Shift: 남아있는 모든 포인트를",
"STR_STATS_BASE_MIN": "기본: %d (최소: %d)",
"STR_SKILLS_UNASSIGN": "모든 스킬 포인트를 해제 할당",
"STR_STASH_PREVIOUS_PAGE": "이전 페이지 (+Shift: 첫 페이지)",
"STR_STASH_NEXT_PAGE": "다음 페이지 (+Shift: 마지막 비어 있지 않은 페이지)",
"STR_TOGGLE_TO_PERSONAL": "개인 은닉로 전환",
"STR_TOGGLE_TO_SHARED": "공유 은닉로 전환",
"STR_STASH_PREVIOUS_INDEX": "이전 색인 : %d 페이지로 (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "다음 인덱스 : %d 페이지로 (+shift: %d)",
"STR_PUT_GOLD": "골드 넣어",
"STR_TAKE_GOLD": "금을",
"STR_PERSONAL_PAGE_NUMBER": "개인 페이지 n°%u",
"STR_SHARED_PAGE_NUMBER": "공유 페이지 n°%u",
"STR_NO_SELECTED_PAGE": "없음 선택한 페이지가 없습니다",
"STR_SHARED_GOLD_QUANTITY": "공유 골드",
"STR_PREVIOUS_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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Przypisywanie, +Shift: o %d punkty",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Przypisywanie, +Shift: wszystkie pozostałe punkty",
"STR_STATS_BASE_MIN": "Podstawowe %d Min.: %d)",
"STR_SKILLS_UNASSIGN": "Un przydzielić wszystkie punkty umiejętności",
"STR_STASH_PREVIOUS_PAGE": "Poprzednia strona (+Shift: pierwsza strona)",
"STR_STASH_NEXT_PAGE": "Następna strona (+Shift: Ostatnio nie pusta strona)",
"STR_TOGGLE_TO_PERSONAL": "Przełącz do osobistego pierś",
"STR_TOGGLE_TO_SHARED": "Przełącz się na wspólnym pierś",
"STR_STASH_PREVIOUS_INDEX": "Poprzednie Index : przez %d Pages (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "Następny Index : przez d% Strony (+shift: %d)",
"STR_PUT_GOLD": "Put złoto",
"STR_TAKE_GOLD": "Weź złoto",
"STR_PERSONAL_PAGE_NUMBER": "Strona osobista n°%u",
"STR_SHARED_PAGE_NUMBER": "Wspólna strona n°%u",
"STR_NO_SELECTED_PAGE": "Nie wybrano stronę",
"STR_SHARED_GOLD_QUANTITY": "Wspólna Złoto",
"STR_PREVIOUS_PAGE": "Poprzednia strona",
"STR_NEXT_PAGE": "Następna strona",
"STR_ITEM_LEVEL": "Poziom przedmiotu",
"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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Quita, +Shift: por %d puntos",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Quita, +Shift: Todos los puntos restantes",
"STR_STATS_BASE_MIN": "Base: %d (Min: %d)",
"STR_SKILLS_UNASSIGN": "Quita todos los puntos de habilidades",
"STR_STASH_PREVIOUS_PAGE": "Pagina anterior (+Shift: Primera Pagina)",
"STR_STASH_NEXT_PAGE": "Pagina Siguiente (+Shift: Ultima pagina non vacia)",
"STR_TOGGLE_TO_PERSONAL": "Ver el cofre personal",
"STR_TOGGLE_TO_SHARED": "Ver el cofre compartido",
"STR_STASH_PREVIOUS_INDEX": "Indice anterior : por %d paginas (+shift: %d)",
"STR_STASH_NEXT_INDEX": "Indice siguiente : por %d paginas (+shift: %d)",
"STR_PUT_GOLD": "Poner oro",
"STR_TAKE_GOLD": "Tomar oro",
"STR_PERSONAL_PAGE_NUMBER": "Pagina personal n°%u",
"STR_SHARED_PAGE_NUMBER": "Pagina personal n°%u",
"STR_NO_SELECTED_PAGE": "Ninguna pagina seleccionada",
"STR_SHARED_GOLD_QUANTITY": "Oro compartido",
"STR_PREVIOUS_PAGE": "Pagina anterior",
"STR_NEXT_PAGE": "Pagina siguiente",
"STR_ITEM_LEVEL": "Nível do item",
"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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: Вычесть, +Shift: по %d очка",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: Вычесть, +Shift: все оставшиеся очки",
"STR_STATS_BASE_MIN": "Базовое: %d (Мин.: %d)",
"STR_SKILLS_UNASSIGN": "Сбросить все навыки",
"STR_STASH_PREVIOUS_PAGE": "Предыдущая страница (+Shift: первая страница)",
"STR_STASH_NEXT_PAGE": "Последняя страница (+Shift: последняя непустая страница)",
"STR_TOGGLE_TO_PERSONAL": "Переключить на личный сундук",
"STR_TOGGLE_TO_SHARED": "Переключить на общий сундук",
"STR_STASH_PREVIOUS_INDEX": "Переход назад на %d страниц (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "Переход вперед : на %d страниц (+shift: %d)",
"STR_PUT_GOLD": "Добавить золото",
"STR_TAKE_GOLD": "Забрать золото",
"STR_PERSONAL_PAGE_NUMBER": "Личная страница n°%u",
"STR_SHARED_PAGE_NUMBER": "Общая страница N°%u",
"STR_NO_SELECTED_PAGE": "Нет указанной страницы",
"STR_SHARED_GOLD_QUANTITY": "Общее золото",
"STR_PREVIOUS_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_UPGRADE_TO_EXCEPTIONAL": "Улучшение до исключительной версии",
"STR_UPGRADE_TO_ELITE": "Улучшение до элитной версии",
"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_INCLUDE_UPGRADED": "(или выше уровнем)",
"STR_WITHOUT_SOCKET": "без ячеек",
"STR_WITH_SOCKETS": "с ячейками",
"STR_WITH_N_SOCKETS": "c %u ячейками",
"STR_ONLY_N_H": "(только на уровнях Кошмар и Ад)",
"STR_ONLY_HELL": "(только на уровне Ад)",
"STR_ONLY_CLASS": "только %hs",
"TYPE_shie": "Щит (без привязки к классу)",
"TYPE_tors": "Нательная броня",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "Зелье",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "Талисман",
"TYPE_boot": "lbt",
"TYPE_glov": "Перчатки",
"TYPE_book": "Книга",
"TYPE_belt": "mbl",
"TYPE_gem": "Драгоценный камень",
"TYPE_torc": "tch",
"TYPE_scro": "Свиток",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "Посох",
"TYPE_bow": "Лук",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "Меч",
"TYPE_hamm": "Молот",
"TYPE_knif": "Нож",
"TYPE_spea": "spr",
"TYPE_pole": "Алебарада",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "Зелье стрельбы",
"TYPE_ques": "Квестовая вещь",
"TYPE_body": "Часть тела",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "Оружие",
"TYPE_mele": "Оружие ближнего боя",
"TYPE_miss": "Оружие дальнего боя",
"TYPE_thro": "Метательное оружие",
"TYPE_comb": "Ударно-метательное оружие",
"TYPE_armo": "Броня",
"TYPE_shld": "Любой щит",
"TYPE_misc": "Любой предмет",
"TYPE_sock": "Предмет для ячеек",
"TYPE_seco": "Предмет для левой руки",
"TYPE_rod": "Посохи и Жезлы",
"TYPE_misl": "Снаряд",
"TYPE_blun": "Тупое оружие",
"TYPE_jewl": "jew",
"TYPE_clas": "С привязкой к классу",
"TYPE_amaz": "Предмет для амазонки",
"TYPE_barb": "Предмет для варвара",
"TYPE_necr": "Предмет для некроманта",
"TYPE_pala": "Предмет для паладина",
"TYPE_sorc": "Предмет для волшебницы",
"TYPE_assn": "Предмет для ассасины",
"TYPE_drui": "Предмет для друида",
"TYPE_h2h": "Коготь",
"TYPE_h2h2": "Коготь ассасины",
"TYPE_orb": "Сфера",
"TYPE_head": "Голова Вуду",
"TYPE_ashd": "Щит паладина",
"TYPE_phlm": "Шлем варвара",
"TYPE_pelt": "Шлем друида",
"TYPE_cloa": "cloak",
"TYPE_rune": "Руна",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "Лук амазонки",
"TYPE_aspe": "Копье амазонки",
"TYPE_ajav": "Дротик амазонки",
"TYPE_mboq": "Магические стрелы",
"TYPE_mxbq": "Магические арбалетные стрелы",
"TYPE_gem0": "Надколотый драгоценный камень",
"TYPE_gem1": "Мутный драгоценный камень",
"TYPE_gem2": "Нормальный драгоценный камень",
"TYPE_gem3": "Безупречный драгоценный камень",
"TYPE_gem4": "Идеальный драгоценный камень"
}

View File

@@ -0,0 +1,148 @@
{
"STR_STATS_UNASSIGN_WITH_LIMIT": "+Alt: 撤销加点, +Shift: %d 点",
"STR_STATS_UNASSIGN_WITHOUT_LIMIT": "+Alt: 撤消加点, +Shift:所有剩余点",
"STR_STATS_BASE_MIN": "基础:%d (最低:%d)",
"STR_SKILLS_UNASSIGN": "撤销所有技能加点",
"STR_STASH_PREVIOUS_PAGE": "上一页 (+Shift: 第一页)",
"STR_STASH_NEXT_PAGE": "下一页 (+Shift: 最后非空页)",
"STR_TOGGLE_TO_PERSONAL": "切换到个人储物箱",
"STR_TOGGLE_TO_SHARED": "切换到共享储物箱",
"STR_STASH_PREVIOUS_INDEX": "向前索引 : %d 页 (+Shift: %d)",
"STR_STASH_NEXT_INDEX": "向前索引 : %d 页 (+Shift: %d)",
"STR_PUT_GOLD": "存入金币",
"STR_TAKE_GOLD": "取出金币",
"STR_PERSONAL_PAGE_NUMBER": "个人储物箱:第 %u 页",
"STR_SHARED_PAGE_NUMBER": "共享储物箱:第 %u 页",
"STR_NO_SELECTED_PAGE": "没有选择的页面",
"STR_SHARED_GOLD_QUANTITY": "共享金币",
"STR_PREVIOUS_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_UPGRADE_TO_EXCEPTIONAL": "",
"STR_UPGRADE_TO_ELITE": "",
"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_INCLUDE_UPGRADED": "",
"STR_WITHOUT_SOCKET": "",
"STR_WITH_SOCKETS": "",
"STR_WITH_N_SOCKETS": "",
"STR_ONLY_N_H": "",
"STR_ONLY_HELL": "",
"STR_ONLY_CLASS": "",
"TYPE_shie": "",
"TYPE_tors": "",
"TYPE_gold": "Gold",
"TYPE_bowq": "aqv",
"TYPE_xboq": "cqv",
"TYPE_play": "ear",
"TYPE_herb": "hrb",
"TYPE_poti": "",
"TYPE_ring": "rin",
"TYPE_elix": "elx",
"TYPE_amul": "amu",
"TYPE_char": "",
"TYPE_boot": "lbt",
"TYPE_glov": "",
"TYPE_book": "",
"TYPE_belt": "mbl",
"TYPE_gem": "",
"TYPE_torc": "tch",
"TYPE_scro": "",
"TYPE_scep": "scp",
"TYPE_wand": "wnd",
"TYPE_staf": "",
"TYPE_bow": "",
"TYPE_axe": "axe",
"TYPE_club": "clb",
"TYPE_swor": "",
"TYPE_hamm": "",
"TYPE_knif": "",
"TYPE_spea": "spr",
"TYPE_pole": "",
"TYPE_xbow": "mxb",
"TYPE_mace": "mac",
"TYPE_helm": "hlm",
"TYPE_tpot": "",
"TYPE_ques": "",
"TYPE_body": "",
"TYPE_key": "key",
"TYPE_tkni": "tkf",
"TYPE_taxe": "tax",
"TYPE_jave": "jav",
"TYPE_weap": "",
"TYPE_mele": "",
"TYPE_miss": "",
"TYPE_thro": "",
"TYPE_comb": "",
"TYPE_armo": "",
"TYPE_shld": "",
"TYPE_misc": "",
"TYPE_sock": "",
"TYPE_seco": "",
"TYPE_rod": "",
"TYPE_misl": "",
"TYPE_blun": "",
"TYPE_jewl": "jew",
"TYPE_clas": "",
"TYPE_amaz": "",
"TYPE_barb": "",
"TYPE_necr": "",
"TYPE_pala": "",
"TYPE_sorc": "",
"TYPE_assn": "",
"TYPE_drui": "",
"TYPE_h2h": "",
"TYPE_h2h2": "",
"TYPE_orb": "",
"TYPE_head": "",
"TYPE_ashd": "",
"TYPE_phlm": "",
"TYPE_pelt": "",
"TYPE_cloa": "cloak",
"TYPE_rune": "",
"TYPE_circ": "circlet",
"TYPE_hpot": "hp3",
"TYPE_mpot": "mp3",
"TYPE_rpot": "rvs",
"TYPE_spot": "vps",
"TYPE_apot": "yps",
"TYPE_wpot": "wms",
"TYPE_scha": "cm1",
"TYPE_mcha": "cm2",
"TYPE_lcha": "cm3",
"TYPE_abow": "",
"TYPE_aspe": "",
"TYPE_ajav": "",
"TYPE_mboq": "",
"TYPE_mxbq": "",
"TYPE_gem0": "",
"TYPE_gem1": "",
"TYPE_gem2": "",
"TYPE_gem3": "",
"TYPE_gem4": ""
}

View File

@@ -0,0 +1,42 @@
import os
import json
import codecs
import shutil
files = ["ENG.json", "ESP.json", "DEU.json", "FRA.json", "POR.json", "ITA.json", "JPN.json", "KOR.json", "SIN.json", "CHI.json", "POL.json", "RUS.json"]
translations = {}
for file in files:
lang = os.path.splitext(file)[0]
with open(file) as json_file:
data = json.load(json_file)
for key, value in data.items():
if (key in translations):
t = translations[key]
else:
t = {}
t[lang] = value
translations[key] = t
json_file.close()
with codecs.open("../LocalizedStrings.ini", "w", encoding="utf16") as ini_file:
ini_file.write(';UTF16\r\n')
ini_file.write(';--------------------------------------------------------------------------------------;\r\n')
ini_file.write('; ;\r\n')
ini_file.write('; "PlugY, The Survival Kit" ;\r\n')
ini_file.write('; Localized String File ;\r\n')
ini_file.write('; ;\r\n')
ini_file.write('; by Yohann Nicolas ;\r\n')
ini_file.write('; ;\r\n')
ini_file.write('; version 11.02 ;\r\n')
ini_file.write('; ;\r\n')
ini_file.write(';--------------------------------------------------------------------------------------;\r\n')
ini_file.write('\r\n')
for key, langs in translations.items():
ini_file.write("[{}]\r\n".format(key))
for lang, value in langs.items():
ini_file.write("{}={}\r\n".format(lang, value))
ini_file.write("\r\n")
ini_file.close()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,20 +4,20 @@
; ; ; ;
; by Yohann Nicolas ; ; by Yohann Nicolas ;
; ; ; ;
; version 11.01 ; ; version 12.00 ;
; ; ; ;
;--------------------------------------------------------------------------------------; ;--------------------------------------------------------------------------------------;
Official website : http://plugy.free.fr Official website: http://plugy.free.fr
You can make a donation if you want. You can make a donation if you want.
******** WARNING ******** ******** WARNING ********
- This plug-in works with LoD version 1.09 to 1.13d and mods based on. - This plug-in works with LoD version 1.09 to 1.13d and 1.14d and mods based on.
- This plug-in doesn't work on realms Battle.net. - This plug-in doesn't work on realms Battle.net.
- All files may be changed since previous version, so uninstall any previous version. - All files may be changed since previous version, so uninstall any previous version.
- PlugY.ini has changed since previous version, use the one in this package. - PlugY.ini has changed since previous version, use the one in this package.
- Don't forget to read the PlugY forum at : - Don't forget to read the PlugY forum at:
http://d2mods.info/forum/viewforum.php?f=133 http://d2mods.info/forum/viewforum.php?f=133
@@ -27,7 +27,7 @@ Each features can be turn on/off via PlugY.ini (see "COMMENTS ON THE CONFIGURATI
- Infinite storage space in the stash. - Infinite storage space in the stash.
- Shared storage space in the stash. - Shared storage space in the stash.
- Enabled the ladder only runewords out of realms. - Enabled the ladder only runewords out of realms.
- Local World Event and Uber Quest for singleplayer and multiplayer off-realm ! - Local World Event and Uber Quest for singleplayer and multiplayer off-realm!
- Can open Cow Level Portal even when player have kill the Cow King in that difficulty. - Can open Cow Level Portal even when player have kill the Cow King in that difficulty.
- Unassign assigned skills and stats points. - Unassign assigned skills and stats points.
- Change the selected language. - Change the selected language.
@@ -42,48 +42,57 @@ Each features can be turn on/off via PlugY.ini (see "COMMENTS ON THE CONFIGURATI
- D2 can load all files, even those opened with Microsoft Excel (disabled by default). - D2 can load all files, even those opened with Microsoft Excel (disabled by default).
- Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances. - Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances.
- Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder). - Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder).
- Add following commands (see "COMMENTS ON THE CONFIGURATION FILE") : - Add following commands (see "COMMENTS ON THE CONFIGURATION FILE"):
/save : Save game without exit. /save: Save game without exit.
/page 1 : Show normal stats page (stats page must be opened). /page 1: Show normal stats page (stats page must be opened).
/page 2 : Show extra stats page (stats page must be opened). /page 2: Show extra stats page (stats page must be opened).
/page 3 : Show resistance stats page (stats page must be opened). /page 3: Show resistance stats page (stats page must be opened).
/page 4 : (beta) Show available runewords (stats page must be opened). /page 4: (beta) Show available runewords (stats page must be opened).
/lockmouse : Lock mouse cursor in the window. /lockmouse: Lock mouse cursor in the window.
/lock : Same as /lockmouse. /lock: Same as /lockmouse.
/unlockmouse : Unlock mouse cursor in the window. /unlockmouse: Unlock mouse cursor in the window.
/unlock : Same as /unlockmouse. /unlock: Same as /unlockmouse.
/renamechar newname : Rename your character and save it. /renamechar newname: Rename your character and save it.
/renamepage name : Rename current page stash. /renamepage name: Rename current page stash.
/setindex : Set current stash page as index /setindex: Set current stash page as index.
/resetindex : Remove index flag on the current stash page. /setmainindex: Set current stash page as main index.
/insertpage : Insert a new page after the current page. /resetindex: Remove index flag on the current stash page.
/deletepage : Delete current page if empty. /insertpage: Insert a new page after the current page.
/swap page : Swap the content of current stash page with the content of another page. /deletepage: Delete current page if empty.
/toggle page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. /swap page: Swap the content of current stash page with the content of another page.
/dlm : Toggle always display mana and life mode. /toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/dml : Same as /dlm. /dlm: Toggle always display mana and life mode.
/dl : Toggle always display life mode. /dml: Same as /dlm.
/dm : Toggle always display mana mode. /dl: Toggle always display life mode.
/listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts. /dm: Toggle always display mana mode.
/listcube: (beta) Create a "cube.txt" file in save directory containing all cube's receipts.
v11.01 changes : v12.00 changes:
Compatibily with 1.13d (thanks to L'Autour) - Compatibily with 1.14d (thanks to haxifix)
Add command /unlockmouse : Unlock the mouse
Add command /unlock : same as /unlockmouse
Add command /renamepage : stash page name are succefully saved.
Add command /setindex : Set the current stash page as index (prev/next index button go to an index if exists)
Add command /resetindex : Remove index flag on the current stash page (prev/next index button go to this index if exists).
Add command /insertpage : Insert a new page after the current page.
Add command /deletepage : Delete current page if empty.
Add localizion in Russian and google traduction for not translated language. (thanks to L'Autour)
Add an option in PlugY.ini to select shared stash (instead of personal one) on character loading.
Rename command /rename to /renamechar.
Remove unfinished command /reload.
v11.00 changes : Unofficial version supporting LOD 1.13d v11.02 changes:
- Add command /setmainindex: Set the current stash page as main index (shift + prev/next index button go to an main index if exists)
- Current number of simulated players use with /players command is save with the player and set on game loading. NBPlayersByDefault must be different to 0 in PlugY.ini.
v10.01 changes : v11.01 changes:
- Compatibily with 1.13d (thanks to L'Autour)
- Add command /unlockmouse: Unlock the mouse
- Add command /unlock: same as /unlockmouse
- Add command /renamepage: stash page name are succefully saved.
- Add command /setindex: Set the current stash page as index (prev/next index button go to an index if exists)
- Add command /resetindex: Remove index flag on the current stash page (prev/next index button go to this index if exists).
- Add command /insertpage: Insert a new page after the current page.
- Add command /deletepage: Delete current page if empty.
- Add localizion in Russian and google traduction for not translated language. (thanks to L'Autour)
- Add an option in PlugY.ini to select shared stash (instead of personal one) on character loading.
- Rename command /rename to /renamechar.
- Remove unfinished command /reload.
v11.00 changes:
- Unofficial version supporting LOD 1.13d
v10.01 changes:
- Add windowed mode. - Add windowed mode.
- Can lock mouse cursor in the window (windowed mode). - Can lock mouse cursor in the window (windowed mode).
- Can remove border (windowed mode). - Can remove border (windowed mode).
@@ -94,31 +103,31 @@ v10.01 changes :
- Add command "/toggle page" to swap the content of current stash page with the content of another page in opposing stash shared/personal. - Add command "/toggle page" to swap the content of current stash page with the content of another page in opposing stash shared/personal.
- Add command "/rename newname" to rename your character. This feature is still in beta and you must exit the game to update the stats page. - Add command "/rename newname" to rename your character. This feature is still in beta and you must exit the game to update the stats page.
v10.00 changes : v10.00 changes:
- Disable access to Battle.net via main menu button. - Disable access to Battle.net via main menu button.
- PlugY works for 1.13c version of LoD too. - PlugY works for 1.13c version of LoD too.
- Fix shortcut in start menu - Fix shortcut in start menu
v9.00 changes : v9.00 changes:
- PlugY works for 1.12 version of LoD too. - PlugY works for 1.12 version of LoD too.
- Fix somes bugs. - Fix somes bugs.
- Add option for unassign skill for mods. - Add option for unassign skill for mods.
v8.00 changes : v8.00 changes:
- Easier installation : New installer. - Easier installation: New installer.
- Can open Cow Level Portal even when player have kill the Cow King in that difficulty. - Can open Cow Level Portal even when player have kill the Cow King in that difficulty.
- Display the real version of LoD in the main screen. (v 1.09d or v 1.11b instead of v 1.09 or v 1.11) - Display the real version of LoD in the main screen. (v 1.09d or v 1.11b instead of v 1.09 or v 1.11)
- Add the possibility to move the unassign skills button like stash buttons. (for modders) - Add the possibility to move the unassign skills button like stash buttons. (for modders)
- Fix crash when meeting a superunique monsters in Lod v1.11. - Fix crash when meeting a superunique monsters in Lod v1.11.
- Fix skills points lost when unasssign them in mods with special skills. - Fix skills points lost when unasssign them in mods with special skills.
- Multiplayer : Save stash files (with client's data like version before 5.00) when a deconnection or error happend during saving process. - Multiplayer: Save stash files (with client's data like version before 5.00) when a deconnection or error happend during saving process.
- Remove the "check load memory failed" message when D2gfx.dll was patched. - Remove the "check load memory failed" message when D2gfx.dll was patched.
v7.01b changes : v7.01b changes:
- Fix the ladder only runewords features in versions 1.11 and 1.10 of LoD. - Fix the ladder only runewords features in versions 1.11 and 1.10 of LoD.
- Fix wierd characters in some text. - Fix wierd characters in some text.
v7.01 changes : v7.01 changes:
- Enabled the ladder only runewords out of realms. - Enabled the ladder only runewords out of realms.
- Fixed Uber Baal AI. - Fixed Uber Baal AI.
- Remove all param options set by default in PlugY.ini (like windowed mode). - Remove all param options set by default in PlugY.ini (like windowed mode).
@@ -126,7 +135,7 @@ v7.01 changes :
- Add an executable to launch PlugY (no more LoD's files modified) (RECALL) - Add an executable to launch PlugY (no more LoD's files modified) (RECALL)
- Translation into spanish and polish. - Translation into spanish and polish.
v7.00 changes : v7.00 changes:
- PlugY works for 1.11b version of LoD too. - PlugY works for 1.11b version of LoD too.
- Add an executable to launch PlugY (no more LoD's files modified) - Add an executable to launch PlugY (no more LoD's files modified)
- Add base value for each stat on assign buttons overtext. - Add base value for each stat on assign buttons overtext.
@@ -134,75 +143,75 @@ v7.00 changes :
- Fix features which stayed enabled on Battle.net. - Fix features which stayed enabled on Battle.net.
- Translation into italian. - Translation into italian.
v6.01b changes : v6.01b changes:
- Bug fix with the display of popup on stat assignment buttons. - Bug fix with the display of popup on stat assignment buttons.
v6.01 changes : v6.01 changes:
- Major fix : unique carry1 items don't disappear when they are cubbed in LoD 1.10 - Major fix: unique carry1 items don't disappear when they are cubbed in LoD 1.10
- Keys and Uber organs aren't destroyed when we try to open a Red Porpal out of Harrogath. - Keys and Uber organs aren't destroyed when we try to open a Red Porpal out of Harrogath.
- Fix conflict with D2Mod for the version display. - Fix conflict with D2Mod for the version display.
v6.00 changes : v6.00 changes:
- PlugY works for 1.11 version of LoD too ! - PlugY works for 1.11 version of LoD too!
- Enabled Uber Quest off realm (LoD 1.11 only). - Enabled Uber Quest off realm (LoD 1.11 only).
- Fixed crash on PlugY launch if LoD install isn't clean - Fixed crash on PlugY launch if LoD install isn't clean
- Fixed some minor bugs and added some minor improvements. - Fixed some minor bugs and added some minor improvements.
- Added command "/save" to save the game without exit (LoD 1.11 only). - Added command "/save" to save the game without exit (LoD 1.11 only).
v5.06 changes : v5.06 changes:
- Added buttons for shared gold. - Added buttons for shared gold.
- Enabled shared gold in multiplayer. - Enabled shared gold in multiplayer.
- Command "/DisplayLifeMana" is replaced by "/dlm". - Command "/DisplayLifeMana" is replaced by "/dlm".
- Fixed some bugs. - Fixed some bugs.
v5.05 changes : v5.05 changes:
- Fixed bad default color in interface stats. - Fixed bad default color in interface stats.
- Added Shared gold via commands. - Added Shared gold via commands.
- Command "/DisplayLifeAndMana" is now "/DisplayLifeMana". - Command "/DisplayLifeAndMana" is now "/DisplayLifeMana".
- Display green set item name in popup when it's in the shared stash. - Display green set item name in popup when it's in the shared stash.
- Fixed multiplayer bugs by redoing multiplayer procedure. - Fixed multiplayer bugs by redoing multiplayer procedure.
v5.04 changes : v5.04 changes:
- Fixed : Stat/Skill points per level-up bug. - Fixed: Stat/Skill points per level-up bug.
- Fixed : Multiplayer bugs. - Fixed: Multiplayer bugs.
- PlugY/PlugYDefault.ini completed. - PlugY/PlugYDefault.ini completed.
v5.03 changes : v5.03 changes:
- Fixed : Bug which sometimes swaps Hardcore and Softcore shared stash. - Fixed: Bug which sometimes swaps Hardcore and Softcore shared stash.
- Added color on extra stats page. - Added color on extra stats page.
- Changed default values on extra stats page. - Changed default values on extra stats page.
- Set EnabledTXTFilesWhenMSExcelOpenIt=1 in PlugY.ini file. - Set EnabledTXTFilesWhenMSExcelOpenIt=1 in PlugY.ini file.
v5.02 changes : v5.02 changes:
- Fixed : Previous bug fix which caused items to disappear. - Fixed: Previous bug fix which caused items to disappear.
v5.01 changes : v5.01 changes:
- Fixed : Major bugs in stash management. - Fixed: Major bugs in stash management.
- Fixed : Set back PlugY.ini with ActiveLogFile=0 by default. - Fixed: Set back PlugY.ini with ActiveLogFile=0 by default.
- Fixed : bug when shared stash is disabled. - Fixed: bug when shared stash is disabled.
v5.00 changes : v5.00 changes:
- PlugY works for 1.09, 1.09b, 1.09d versions of LoD, including mods based on these releases ! - PlugY works for 1.09, 1.09b, 1.09d versions of LoD, including mods based on these releases!
- PlugY can load D2Mod.dll. - PlugY can load D2Mod.dll.
- D2 can load all files, even those openned with Microsoft Excel. - D2 can load all files, even those openned with Microsoft Excel.
- World Event monster can be changed. - World Event monster can be changed.
- Some stuff for modders. - Some stuff for modders.
- Fixed : major bugs in Multiplayer : fingerprints reset, unidentified bugged items, etc. - Fixed: major bugs in Multiplayer: fingerprints reset, unidentified bugged items, etc.
- Fixed : Typo error in PlugY.ini (Commands). - Fixed: Typo error in PlugY.ini (Commands).
- Fixed : No more case sensitive commands in game. - Fixed: No more case sensitive commands in game.
- Fixed : Select Main Stat page bug on opening - Fixed: Select Main Stat page bug on opening
- Fixed : Replaced the display "Critical Strike/Deadly Strike" with Deadly Strike only. - Fixed: Replaced the display "Critical Strike/Deadly Strike" with Deadly Strike only.
- Fixed : The spawn of DiabloClone at starting of a new game - Fixed: The spawn of DiabloClone at starting of a new game
- Fixed : Some other small bugs. - Fixed: Some other small bugs.
v4.04 changes : v4.04 changes:
- Fixed : Display bug when statPerLevelUp enabled. - Fixed: Display bug when statPerLevelUp enabled.
- Fixed : Bug in saving procedure when the disk is full. - Fixed: Bug in saving procedure when the disk is full.
- New configuration system for modders. - New configuration system for modders.
- Always display Mana and Life values above the globes. - Always display Mana and Life values above the globes.
v4.03 changes : v4.03 changes:
- Fixed : "carry 1" unique item (unique charm) when we drop the cube. - Fixed: "carry 1" unique item (unique charm) when we drop the cube.
- Can go directly to first or last page of stash (shift + click on next/previous). - Can go directly to first or last page of stash (shift + click on next/previous).
- Second index added (shift + click on index buttons) - Second index added (shift + click on index buttons)
- Added data to extra stats pages (2 pages now). - Added data to extra stats pages (2 pages now).
@@ -210,25 +219,25 @@ v4.03 changes :
- Moved buttons in extra stats pages to same place as in main stats page (only in 800x600). - Moved buttons in extra stats pages to same place as in main stats page (only in 800x600).
- Can choose whether the main (first) page or the last selected page is displayed on opening the stats page. - Can choose whether the main (first) page or the last selected page is displayed on opening the stats page.
v4.02b changes : v4.02b changes:
- Fixed : Features stay enabled in open Battle.net - Fixed: Features stay enabled in open Battle.net
v4.02 changes : v4.02 changes:
- Fixed : No more conflict with Battle.net (BigStash disabled on realms) - Fixed: No more conflict with Battle.net (BigStash disabled on realms)
- Fixed : Missing "d" in "SeparateHardcoreStash=1" from PlugY.ini - Fixed: Missing "d" in "SeparateHardcoreStash=1" from PlugY.ini
- Fixed : By default in PlugY.ini, the language isn't changed. - Fixed: By default in PlugY.ini, the language isn't changed.
- Fixed : Item level display enabled correctly for all configurations of PlugY. - Fixed: Item level display enabled correctly for all configurations of PlugY.
- Added data in the extra stats page. - Added data in the extra stats page.
v4.01 changes : v4.01 changes:
- Fixed : NbPlayers always set to 8 when active. - Fixed: NbPlayers always set to 8 when active.
- Added data in the extra stats page. - Added data in the extra stats page.
v4.00b changes : v4.00b changes:
- Fixed : MSVCR70.dll not found bug. - Fixed: MSVCR70.dll not found bug.
v4.00 changes : v4.00 changes:
- Better optimization of the code. - Better optimization of the code.
- Added some pages for displaying more characters stats like %MF. - Added some pages for displaying more characters stats like %MF.
- Change the selected language (and for mod, default and available language). - Change the selected language (and for mod, default and available language).
@@ -239,62 +248,62 @@ v4.00 changes :
- Change installation method (can be installed directly on linux now) - Change installation method (can be installed directly on linux now)
- The item which triggers the World Event can be changed. - The item which triggers the World Event can be changed.
- Any number of "carry 1 item" (like annihilus) can be put in the stash. - Any number of "carry 1 item" (like annihilus) can be put in the stash.
- Fixed : Cannot put more than one "carry 1 item" in others page than stash. - Fixed: Cannot put more than one "carry 1 item" in others page than stash.
- Fixed : display bug of socketed items in the stash. - Fixed: display bug of socketed items in the stash.
- Fixed : removed space bug in PlugY.ini. - Fixed: removed space bug in PlugY.ini.
- Fixed : Diablo Clone can't spawn in normal and nightmare difficulty. - Fixed: Diablo Clone can't spawn in normal and nightmare difficulty.
- Fixed : Destruction of extra minions after unassignment if you have +x bonus to the skill. - Fixed: Destruction of extra minions after unassignment if you have +x bonus to the skill.
v3.02 changes : v3.02 changes:
- Fixed : Change the number of stats points gained when player gains a level. - Fixed: Change the number of stats points gained when player gains a level.
- Fixed : When the shared stash is disabled, you can load a game with your character. - Fixed: When the shared stash is disabled, you can load a game with your character.
- Fixed : You can change parameters of World Event without activating skill per level up. - Fixed: You can change parameters of World Event without activating skill per level up.
v3.01 changes : v3.01 changes:
- Change the number of stats points gained when player gains a level. - Change the number of stats points gained when player gains a level.
- Fixed bugs which give extra points when skills points are unassigned. - Fixed bugs which give extra points when skills points are unassigned.
- Added parameters for the WorldEvent in configuration file. - Added parameters for the WorldEvent in configuration file.
- By default, World Event only SHOWS "X SOJ Sold" in hell difficulty. - By default, World Event only SHOWS "X SOJ Sold" in hell difficulty.
v3.00 changes : v3.00 changes:
- Local World Event for singleplayer and multiplayer off-realm ! - Local World Event for singleplayer and multiplayer off-realm!
- Unassign assigned skills points. - Unassign assigned skills points.
- New background for the stash. - New background for the stash.
- Can change the filename of the shared savefile. - Can change the filename of the shared savefile.
- Shared stash page number display are in red now. - Shared stash page number display are in red now.
v2.05 changes : v2.05 changes:
- major fix : bugs which cause D2 not to start are finally removed. - major fix: bugs which cause D2 not to start are finally removed.
v2.04 changes : v2.04 changes:
- Unassign stats points, skills on level up are disabled when you connect to realm (like stash). - Unassign stats points, skills on level up are disabled when you connect to realm (like stash).
- Open a error message box instead of crash when PlugY.dll isn't found by D2. - Open a error message box instead of crash when PlugY.dll isn't found by D2.
- Fixed some bugs in installation method. - Fixed some bugs in installation method.
- Fixed bug display of buttons. - Fixed bug display of buttons.
- Fixed win95/98/Me saving. - Fixed win95/98/Me saving.
v2.03b changes : v2.03b changes:
- Show PlugY version only in main screen. - Show PlugY version only in main screen.
v2.03 changes : v2.03 changes:
- Major fix : Correct and secure the saving procedure. - Major fix: Correct and secure the saving procedure.
- No more crash of the host game when a character is unable to enter the game. - No more crash of the host game when a character is unable to enter the game.
- Unassign stats points button greyed when base stat is above 255 fixed. - Unassign stats points button greyed when base stat is above 255 fixed.
- Change version printing on main screen (change color & PlugY version in right corner) - Change version printing on main screen (change color & PlugY version in right corner)
- Character without PlugY can join game host with PlugY enabled. - Character without PlugY can join game host with PlugY enabled.
v2.02 changes : v2.02 changes:
- PlugY doesn't use D2win.dll to launch PlugY anymore. - PlugY doesn't use D2win.dll to launch PlugY anymore.
- PlugY includes a patcher/unpatcher for editing D2gfx.dll to launch PlugY. - PlugY includes a patcher/unpatcher for editing D2gfx.dll to launch PlugY.
- PlugY can be launched by D2Mod system of SVR. - PlugY can be launched by D2Mod system of SVR.
- The infinite storage sytem is automatically disabled on a realm game. - The infinite storage sytem is automatically disabled on a realm game.
- Fixed index button bugs. - Fixed index button bugs.
v2.01 changes : v2.01 changes:
- Fixed skill per level up bug - Fixed skill per level up bug
- Fixed bug display of text in the main menu - Fixed bug display of text in the main menu
v2.00 changes : v2.00 changes:
- Localized in German. - Localized in German.
- Change the number of Skills points gained when player gains a level. - Change the number of Skills points gained when player gains a level.
- Launch any number of Diablo II game on the same computers. - Launch any number of Diablo II game on the same computers.
@@ -308,22 +317,22 @@ v2.00 changes :
- Removed page number bug when you switch between characters. - Removed page number bug when you switch between characters.
- Removed set item's bug display. - Removed set item's bug display.
- Removed the bug of "carry 1" - Removed the bug of "carry 1"
- Add other small improvements... :) - Add other small improvements...:)
v1.03 changes : v1.03 changes:
- Added French readme and ini files. - Added French readme and ini files.
- Removed bugs in D2Classic game (there is no multipage, it's not a bug) - Removed bugs in D2Classic game (there is no multipage, it's not a bug)
- Removed the bug when loading character from previous version. - Removed the bug when loading character from previous version.
(like ShadowMaster character or 1.09 or D2Classic character) (like ShadowMaster character or 1.09 or D2Classic character)
- Removed the bugged line in the text when you click on delete character. - Removed the bugged line in the text when you click on delete character.
* must read : You can start any mods without moving SAVES files * must read: You can start any mods without moving SAVES files
(you need to move dll files with classic script). (you need to move dll files with classic script).
v1.02 changes : v1.02 changes:
- Re-changed name files due to an IE bug with colon in zip file. - Re-changed name files due to an IE bug with colon in zip file.
- Ability to change the version text print in the main menu (see ini file). - Ability to change the version text print in the main menu (see ini file).
v1.01 changes : v1.01 changes:
- Localized for french version (wait for an french readme.txt) - Localized for french version (wait for an french readme.txt)
- Changed filename from "PlugY, The Survival Kit.ini" to "PlugY,The_Survival_Kit". - Changed filename from "PlugY, The Survival Kit.ini" to "PlugY,The_Survival_Kit".
- Added example for installation in the readme. - Added example for installation in the readme.
@@ -332,18 +341,18 @@ v1.01 changes :
(you can add it if you want but need to know what are you doing...) (you can add it if you want but need to know what are you doing...)
- Released in .zip file instead of .rar - Released in .zip file instead of .rar
v1.00 features (can all be easily enabled or disabled) : v1.00 features (can all be easily enabled or disabled):
- You can change the save path directory. - You can change the save path directory.
- You can start any mods without moving saves files. - You can start any mods without moving saves files.
- You can increase the stash to 10x10 squares. - You can increase the stash to 10x10 squares.
- Up to 4,294,967,296 pages in the stash (e.g. infinite storage space) ! - Up to 4,294,967,296 pages in the stash (e.g. infinite storage space)!
note : for LOD1.10 character only. note: for LOD1.10 character only.
- Any of these pages can be shared by all of your characters! - Any of these pages can be shared by all of your characters!
******** CONTENTS ******** ******** CONTENTS ********
19 files, 1 folder : 19 files, 1 folder:
- PlugY_The_Survival_Kit_-_Readme.txt - PlugY_The_Survival_Kit_-_Readme.txt
- PlugY_The_Survival_Kit_-_LisezMoi.txt - PlugY_The_Survival_Kit_-_LisezMoi.txt
- PlugY_The_Survival_Kit_-_Liesmich.txt - PlugY_The_Survival_Kit_-_Liesmich.txt
@@ -368,23 +377,23 @@ v1.00 features (can all be easily enabled or disabled) :
******** INSTALLATION ******** ******** INSTALLATION ********
Normal Installation : Normal Installation:
- Follow directive installer. - Follow directive installer.
note : You can choice "Diablo II" directory as install directory. note: You can choice "Diablo II" directory as install directory.
Installation in another mod: Installation in another mod:
- Copy PlugY.ini, PlugY.exe and PlugY folder (+its contents) in the targeted mod folder. - Copy PlugY.ini, PlugY.exe and PlugY folder (+its contents) in the targeted mod folder.
- Edit PlugY.ini to configure some features (see section below). - Edit PlugY.ini to configure some features (see section below).
- Run PlugY.exe and enjoy :) - Run PlugY.exe and enjoy:)
note : you can move the "PlugY" folder in "Diablo II" and it will be see by all PlugY installation. note: you can move the "PlugY" folder in "Diablo II" and it will be see by all PlugY installation.
Example : Example:
You have installed Lord of Destruction here : C:\Games\Diablo II\ You have installed Lord of Destruction here: C:\Games\Diablo II\
And the mod to add this plug-in is here : D:\D2Mod\MyMod\ And the mod to add this plug-in is here: D:\D2Mod\MyMod\
And the second mod to add this plug-in is here : D:\D2Mod\MyMod2\ And the second mod to add this plug-in is here: D:\D2Mod\MyMod2\
So the new installation is : So the new installation is:
C:\Games\Diablo II\PlugY.dll C:\Games\Diablo II\PlugY.dll
D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6 D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod\PlugY\PlugYFixed.ini D:\D2Mod\MyMod\PlugY\PlugYFixed.ini
@@ -416,18 +425,18 @@ So the new installation is :
D:\D2Mod\MyMod2\PlugY.exe D:\D2Mod\MyMod2\PlugY.exe
Uninstallation : Use the uninstaller or if you have check this option, simply remove all PlugY files ! Uninstallation: Use the uninstaller or if you have check this option, simply remove all PlugY files!
Note : You can also move PlugY.dll in the mod folder but you must remove any on in D2 folder. Note: You can also move PlugY.dll in the mod folder but you must remove any on in D2 folder.
Note : PlugY directory and its contents can be put in a mpq. Note: PlugY directory and its contents can be put in a mpq.
------- D2gfx Patcher : ------- D2gfx Patcher:
If you have problem when you run PlugY.exe then use PatchD2gfxDll.exe. (It happend sometimes with Windows 2000) If you have problem when you run PlugY.exe then use PatchD2gfxDll.exe. (It happend sometimes with Windows 2000)
- Go in Diablo II directory. - Go in Diablo II directory.
- Do a backup of D2gfx.dll (in the case, you remove PlugY before restore it) - Do a backup of D2gfx.dll (in the case, you remove PlugY before restore it)
- Run PatchD2gfxDll.exe (which patches D2gfx.dll for launch PlugY) - Run PatchD2gfxDll.exe (which patches D2gfx.dll for launch PlugY)
- Create a shortcut : Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory) - Create a shortcut: Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory)
- Launch with the shorcut !! - Launch with the shorcut!
Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe. Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe.
@@ -436,7 +445,7 @@ Before uninstall PlugY Restore your D2gfx.dll with your backup file or run Resto
******************** FAQ ****************** ******************** FAQ ******************
=> I can't find the PlugY.ini file, where is it ? => I can't find the PlugY.ini file, where is it ?
>From kingpin : >From kingpin:
Microsoft has in their OS hidden known extensions. This is to make sure newbie Microsoft has in their OS hidden known extensions. This is to make sure newbie
users do not delete those files by accident. You can, of course, turn this off by users do not delete those files by accident. You can, of course, turn this off by
opening up your Windows Explorer, selecting Tools->Folder Options. Then choose View and opening up your Windows Explorer, selecting Tools->Folder Options. Then choose View and
@@ -447,8 +456,8 @@ Then you will for sure see the ini file.
=> How do I Play sometimes on Battle.net when PlugY is installed ? => How do I Play sometimes on Battle.net when PlugY is installed ?
PlugY automatically disables features on realm. PlugY automatically disables features on realm.
But it's always recommended to disable any third software when you go on realm. But it's always recommended to disable any third software when you go on realm.
Note : When bigStash is enabled, you must restart D2 for play in single/multi/open after playing in closed Bnet (and vice versa). Note: When bigStash is enabled, you must restart D2 for play in single/multi/open after playing in closed Bnet (and vice versa).
Tips : Make a shorcut and add -skiptobnet at the of the "target" field for directly go to Battle.net. Tips: Make a shorcut and add -skiptobnet at the of the "target" field for directly go to Battle.net.
=> What do I do if I have an error like "Bad Generic File" on loading a new Character ? => What do I do if I have an error like "Bad Generic File" on loading a new Character ?
@@ -472,28 +481,28 @@ Thx
******** CONFIGURATION ******** ******** CONFIGURATION ********
Configuration of this kit for a specified mod : Configuration of this kit for a specified mod:
- Copy the PlugY.ini and PlugY.exe in the target mod directory (the directory where you start it, see it in the properties of the shortcut). - Copy the PlugY.ini and PlugY.exe in the target mod directory (the directory where you start it, see it in the properties of the shortcut).
- In most cases, you will change the save directory in the ini file. - In most cases, you will change the save directory in the ini file.
- Add all extra dll of the mod in PlugY.ini, if any. - Add all extra dll of the mod in PlugY.ini, if any.
- Finally, activate any specific features you want such as MultiPageStash, SharedStash, etc. - Finally, activate any specific features you want such as MultiPageStash, SharedStash, etc.
- Now, you can start the target mod using the classic method. - Now, you can start the target mod using the classic method.
D2Mod configuration : D2Mod configuration:
Just add the dll name in PlugY.ini, for example : "DllToLoad=D2Mod.dll" Just add the dll name in PlugY.ini, for example: "DllToLoad=D2Mod.dll"
Note: Note:
- Items in the Cube are always saved on the player, if you want these items shared, you must remove them from the Cube. - Items in the Cube are always saved on the player, if you want these items shared, you must remove them from the Cube.
Warning : Warning:
- Be careful if you want to edit the configurations files after having played with the mod. - Be careful if you want to edit the configurations files after having played with the mod.
- In multiplayer game, verify that the server has the same configuration. - In multiplayer game, verify that the server has the same configuration.
- Remember : PlugY doesn't support realms. - Remember: PlugY doesn't support realms.
*** Configuration for modders *** *** Configuration for modders ***
There are 3 files with same structure to configure PlugY : There are 3 files with same structure to configure PlugY:
- "PlugY/PlugYFixed.ini" in mpq or via the switch -direct - "PlugY/PlugYFixed.ini" in mpq or via the switch -direct
All fields set parameters which can't be changed by users via PlugY.ini. All fields set parameters which can't be changed by users via PlugY.ini.
Use it for enabling(disabling) wanted(unwanted) features. Use it for enabling(disabling) wanted(unwanted) features.
@@ -522,7 +531,7 @@ Think about each features if you really must disable it.
Modders can contact me, if they want help or more details about this system. Modders can contact me, if they want help or more details about this system.
WARNING : Don't forget, if it's misused, players will use old version of PlugY, and I will have no other choice than to disable it. WARNING: Don't forget, if it's misused, players will use old version of PlugY, and I will have no other choice than to disable it.
@@ -537,25 +546,25 @@ This section store info for PlugY.exe and don't work in PlugYDefault.ini and Plu
Add params to transmit to LoD on his command line. Add params to transmit to LoD on his command line.
Params give to PlugY.exe are also transmitted to LoD on his command line. Params give to PlugY.exe are also transmitted to LoD on his command line.
By default no param are trasmited. By default no param are trasmited.
Most common switch are (without quote) : Most common switch are (without quote):
"-w" open LoD in windowed form. (See WINDOWED section instead) "-w" open LoD in windowed form. (See WINDOWED section instead)
"-direct" use files in directory instead of those in mpq. "-direct" use files in directory instead of those in mpq.
"-txt" recompile txt files before launch a game. "-txt" recompile txt files before launch a game.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
Param= {-direct -txt -w: these 3 commands are passed on the command line} Param= {-direct -txt -w: these 3 commands are passed on the command line}
Select the library to load. Select the library to load.
The current directory are the one used by D2 (like set the "start in" field of a shorcut). The current directory are the one used by D2 (like set the "start in" field of a shorcut).
If no library specify, it load LoD without PlugY. If no library specify, it load LoD without PlugY.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
Library= {PlugY.dll: Load PlugY.dll} Library= {PlugY.dll: Load PlugY.dll}
[GENERAL] [GENERAL]
Enable or disable all selected features. Enable or disable all selected features.
Dlls from field "DllToLoad" aren't loaded anymore when ActivePlugin=0. Dlls from field "DllToLoad" aren't loaded anymore when ActivePlugin=0.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActivePlugin=0 {0:Don't load any features; 1:Plugin enabled} - ActivePlugin=0 {0:Don't load any features; 1:Plugin enabled}
Enable or disable BattleNet Access. Enable or disable BattleNet Access.
@@ -571,28 +580,29 @@ Separate each dll file name by the character pipe (|)
- DllToLoad2= {(empty): Same as DlltoLoad} - DllToLoad2= {(empty): Same as DlltoLoad}
Activate some new commands in PlugY. In parenthesis is the condition to be able to use the command. Activate some new commands in PlugY. In parenthesis is the condition to be able to use the command.
/save : Save game without exit (LoD 1.11 minimum). /save: Save game without exit (LoD 1.11 minimum).
/page 1 : Show normal stats page (stats page must be opened, space not mandatory). /page 1: Show normal stats page (stats page must be opened, space not mandatory).
/page 2 : Show extra stats page (stats page must be opened, space not mandatory). /page 2: Show extra stats page (stats page must be opened, space not mandatory).
/page 3 : Show resistance stats page (stats page must be opened, space not mandatory). /page 3: Show resistance stats page (stats page must be opened, space not mandatory).
/page 4 : (beta) Show available runewords (stats page must be opened, space not mandatory). /page 4: (beta) Show available runewords (stats page must be opened, space not mandatory).
/lockmouse : Lock mouse cursor in the window. /lockmouse: Lock mouse cursor in the window.
/lock : Same as /lockmouse. /lock: Same as /lockmouse.
/unlockmouse : Unlock mouse cursor in the window. /unlockmouse: Unlock mouse cursor in the window.
/unlock : Same as /unlockmouse. /unlock: Same as /unlockmouse.
/renamechar newname : Rename your character and save it. (You must exit the game to update the stats page.) /renamechar newname: Rename your character and save it. (You must exit the game to update the stats page.)
/renamepage name : Rename current page stash (MultiStash activated). /renamepage name: Rename current page stash (MultiStash activated).
/setindex : Set current stash page as index (prev/next index button go to an index if exists) (MultiStash activated). /setindex: Set current stash page as index (prev/next index button go to an index if exists) (MultiStash activated).
/resetindex : Remove index flag on the current stash page (MultiStash activated). /setmainindex: Set current stash page as main index (shift + prev/next index button go to an main index if exists) (MultiStash activated).
/insertpage : Insert a new page after the current page (MultiStash activated). /resetindex: Remove index flag on the current stash page (MultiStash activated).
/deletepage : Delete current page if empty (MultiStash activated). /insertpage: Insert a new page after the current page (MultiStash activated).
/swap page : Swap the content of current stash page with the content of another page (space not mandatory) (MultiStash activated). /deletepage: Delete current page if empty (MultiStash activated).
/toggle page : Swap the content of current stash page with the content of another page in opposing stash shared/personal (space not mandatory) (MultiStash activated). /swap page: Swap the content of current stash page with the content of another page (space not mandatory) (MultiStash activated).
/dlm : Toggle always display mana and life mode. (Since 1.13c, you can click on the bottom of each orbs) /toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal (space not mandatory) (MultiStash activated).
/dml : Same as /dlm. /dlm: Toggle always display mana and life mode. (Since 1.13c, you can click on the bottom of each orbs)
/dl : Toggle always display life mode. (Since 1.13c, you can click on the bottom of the orb) /dml: Same as /dlm.
/dm : Toggle always display mana mode. (Since 1.13c, you can click on the bottom of the orb) /dl: Toggle always display life mode. (Since 1.13c, you can click on the bottom of the orb)
/listcube : (beta) Create a "cube.txt" file in current directory containing all cube's receipts (LoD 1.10 minimum). /dm: Toggle always display mana mode. (Since 1.13c, you can click on the bottom of the orb)
/listcube: (beta) Create a "cube.txt" file in current directory containing all cube's receipts (LoD 1.10 minimum).
- ActiveCommands=0 {0:Disabled; 1:Enabled} - ActiveCommands=0 {0:Disabled; 1:Enabled}
Quit D2, if PlugY failed to installed all features. Quit D2, if PlugY failed to installed all features.
@@ -635,7 +645,7 @@ All possibles languages: ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS
- ActiveChangeLanguage=0 {0:Disabled; 1:Enabled} - ActiveChangeLanguage=0 {0:Disabled; 1:Enabled}
- SelectedLanguage=ENG {FRA: Select French as language} - SelectedLanguage=ENG {FRA: Select French as language}
For modders who want to restrict the available languages and the default language : For modders who want to restrict the available languages and the default language:
- ActiveLanguageManagement=0 {0:Disabled; 1:Enabled} - ActiveLanguageManagement=0 {0:Disabled; 1:Enabled}
- DefaultLanguage=ENG {empty:D2 default language; FRA:French is the default language} - DefaultLanguage=ENG {empty:D2 default language; FRA:French is the default language}
- AvailableLanguages=ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS {ENG|FRA} - AvailableLanguages=ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS {ENG|FRA}
@@ -644,7 +654,7 @@ For modders who want to restrict the available languages and the default languag
[SAVEPATH] [SAVEPATH]
This is where all of your characters and the shared stash is saved. This is where all of your characters and the shared stash is saved.
You can use absolute or relative paths. You can use absolute or relative paths.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveSavePathChange=0 {0:Disabled; 1:Enabled, you must set "SavePath"} - ActiveSavePathChange=0 {0:Disabled; 1:Enabled, you must set "SavePath"}
- SavePath=Save\ {Save\MyMod\ or D:\Save Games\diablo II\Current Mod\} - SavePath=Save\ {Save\MyMod\ or D:\Save Games\diablo II\Current Mod\}
@@ -652,9 +662,9 @@ Following are default values, between {} are some examples values with descripti
[MAIN SCREEN] [MAIN SCREEN]
Change the version text in the main menu (first menu)(instead of "v 1.10") Change the version text in the main menu (first menu)(instead of "v 1.10")
Color is an integer which refers to defined D2 colors. Color is an integer which refers to defined D2 colors.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveVersionTextChange=0 {0:Disabled; 1:Enabled} - ActiveVersionTextChange=0 {0:Disabled; 1:Enabled}
- VersionText= {Empty: Display the current version of LoD with the subversion letter (1.11b, 1.09d) ; Mod Name:Text with maximum length of 23 characters (ex : v 1.11b)} - VersionText= {Empty: Display the current version of LoD with the subversion letter (1.11b, 1.09d) ; Mod Name:Text with maximum length of 23 characters (ex: v 1.11b)}
- ColorOfVersionText=0 {0:white; 1:red; 4:gold; etc.} - ColorOfVersionText=0 {0:white; 1:red; 4:gold; etc.}
- ActivePrintPlugYVersion=1 {0:Disabled; 1:Enabled) - ActivePrintPlugYVersion=1 {0:Disabled; 1:Enabled)
- ColorOfPlugYVersion=4 {0:white; 1:red; 4:gold; etc.} - ColorOfPlugYVersion=4 {0:white; 1:red; 4:gold; etc.}
@@ -664,19 +674,19 @@ Following are default values, between {} are some examples values with descripti
Increase the stash to 10x10 squares. Increase the stash to 10x10 squares.
Use PlugY\TradeStash.dc6 to change the background image. Use PlugY\TradeStash.dc6 to change the background image.
When bigStash is enabled, you must restart D2 for play in single/multi/open when you have started a game in closed Bnet previously (and vice versa). When bigStash is enabled, you must restart D2 for play in single/multi/open when you have started a game in closed Bnet previously (and vice versa).
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveBigStash=0 {0:Default stash size is used; 1: Enabled, Stash uses 10x10 squared} - ActiveBigStash=0 {0:Default stash size is used; 1: Enabled, Stash uses 10x10 squared}
Use this for sharing and keep all of your items. :) Use this for sharing and keep all of your items.:)
There are 2 multipage stashes : There are 2 multipage stashes:
- one Personal, only seen by the Player; - one Personal, only seen by the Player;
- one Shared between your Players in this mod. - one Shared between your Players in this mod.
Use the Toggle Button to switch between stash. Use the Toggle Button to switch between stash.
Use arrow buttons on bottom the stash (and shift key) for switching between the pages. Use arrow buttons on bottom the stash (and shift key) for switching between the pages.
Definition : The last page is the last page with an item in it. Definition: The last page is the last page with an item in it.
The multipage stashes are inactive for Diablo II Classic Character and on realm. The multipage stashes are inactive for Diablo II Classic Character and on realm.
You can change the name of the shared filename. You can change the name of the shared filename.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveMultiPageStash=0 {0:Disabled; 1:Enabled} - ActiveMultiPageStash=0 {0:Disabled; 1:Enabled}
- NbPagesPerIndex=10 {10: Index page is 1,10,20,30,...,max} - NbPagesPerIndex=10 {10: Index page is 1,10,20,30,...,max}
- NbPagesPerIndex2=100 {100: Index page (+shift) is 1,50,100,150,...,max} - NbPagesPerIndex2=100 {100: Index page (+shift) is 1,50,100,150,...,max}
@@ -697,21 +707,21 @@ Use for repairing a bad stat point assignment.
For example, 30 points in energy for a barbarian! For example, 30 points in energy for a barbarian!
On the character stat page, press selected key and click on minus button. On the character stat page, press selected key and click on minus button.
Select a key by setting KeyUsed (should choose 17 or 18). Select a key by setting KeyUsed (should choose 17 or 18).
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveStatsUnassignment=0 {0:Disabled 1:Enabled, press selected key when clicking} - ActiveStatsUnassignment=0 {0:Disabled 1:Enabled, press selected key when clicking}
- KeyUsed=18 {17:Control key selected; 18:Alt key selected} - KeyUsed=18 {17:Control key selected; 18:Alt key selected}
Use the shift buton for assigning/unassigning all possible points in one click. Use the shift buton for assigning/unassigning all possible points in one click.
You can define a limit value for points assigned/unassigned with shift. You can define a limit value for points assigned/unassigned with shift.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveShiftClickLimit=0 {0:Disabled; 1:Enabled} - ActiveShiftClickLimit=0 {0:Disabled; 1:Enabled}
- LimitValueToShiftClick=5 (10:Assign or unassign stats points, 10 by 10} - LimitValueToShiftClick=5 (10:Assign or unassign stats points, 10 by 10}
[STAT ON LEVEL UP] [STAT ON LEVEL UP]
WARNING : CHEAT, DON'T USE IN NORMAL GAME. WARNING: CHEAT, DON'T USE IN NORMAL GAME.
Change the number of Stats Points you receive when your character gains a level. Change the number of Stats Points you receive when your character gains a level.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveStatPerLevelUp=0 {0:Disabled; 1:Enabled} - ActiveStatPerLevelUp=0 {0:Disabled; 1:Enabled}
- StatPerLevelUp=5 {0:no points win; 11:eleven points win} - StatPerLevelUp=5 {0:no points win; 11:eleven points win}
@@ -719,19 +729,19 @@ Following are default values, between {} are some examples values with descripti
[SKILLS POINTS] [SKILLS POINTS]
Use for repairing a bad skill point assignment. Use for repairing a bad skill point assignment.
Click on the button on skill page for unassigning all assigned skills points. Click on the button on skill page for unassigning all assigned skills points.
Note : It verifies the real cost of each skill (can be greater than 1 in mod) Note: It verifies the real cost of each skill (can be greater than 1 in mod)
Warning : There are few place where you can put this button without bugs. Warning: There are few place where you can put this button without bugs.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveSkillsUnassignment=0 {0:Disabled; 1:Enabled} - ActiveSkillsUnassignment=0 {0:Disabled; 1:Enabled}
- ActiveSkillsUnassignmentOneForOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).} - ActiveSkillsUnassignmentOneByOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).}
- PosXUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in X} - PosXUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in X}
- PosYUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in Y} - PosYUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in Y}
[SKILL ON LEVEL UP] [SKILL ON LEVEL UP]
WARNING : CHEAT, DON'T USE IN NORMAL GAME. WARNING: CHEAT, DON'T USE IN NORMAL GAME.
Change the number of Skills Points you receive when your character gains a level. Change the number of Skills Points you receive when your character gains a level.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveSkillPerLevelUp=0 {0:Disabled; 1:Enabled} - ActiveSkillPerLevelUp=0 {0:Disabled; 1:Enabled}
- SkillPerLevelUp=1 {0:no point gained; 3:three points gained) - SkillPerLevelUp=1 {0:no point gained; 3:three points gained)
@@ -743,7 +753,7 @@ If the WE triggers when you aren't in the game, you lose it.
From the moment you launch D2, the next WE will trigger between few seconds to 41:40 hours after. From the moment you launch D2, the next WE will trigger between few seconds to 41:40 hours after.
Keep in mind before editing it, World Event should be triggered rarely. Keep in mind before editing it, World Event should be triggered rarely.
The item to sell can be changed, the value expected is same as the cube input field. The item to sell can be changed, the value expected is same as the cube input field.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveWorldEvent=0 {0:Disabled; 1:Enabled} - ActiveWorldEvent=0 {0:Disabled; 1:Enabled}
- ShowCounterInAllDifficulty=0 {0:Show it "SOJ Sold" message only in Hell; 1:Show it in all difficulties} - ShowCounterInAllDifficulty=0 {0:Show it "SOJ Sold" message only in Hell; 1:Show it in all difficulties}
- ItemsToSell=The Stone of Jordan {r01: rune EL; cap,rar,upg: Any cap/war hat/shako rare} - ItemsToSell=The Stone of Jordan {r01: rune EL; cap,rar,upg: Any cap/war hat/shako rare}
@@ -762,7 +772,7 @@ Following are default values, between {} are some examples values with descripti
Activate the Uber Quest in local. Activate the Uber Quest in local.
It works only in Hell. It works only in Hell.
You must cube the 3 keys then the 3 organs in Harrogath. You must cube the 3 keys then the 3 organs in Harrogath.
Note : This quest will be updated more later to be more similar with the one on realm. Note: This quest will be updated more later to be more similar with the one on realm.
ActiveUberQuest=0 {0:Disabled; 1:Enabled} ActiveUberQuest=0 {0:Disabled; 1:Enabled}
@@ -781,9 +791,9 @@ Can choose whether to display the background of buttons (Use when a mod already
You can run any number of Diablo II games on one computer. You can run any number of Diablo II games on one computer.
For example, modder can test multiplayer game for their mod. For example, modder can test multiplayer game for their mod.
To start the second game, you must start it with "game.exe" and not "Diablo II.exe". To start the second game, you must start it with "game.exe" and not "Diablo II.exe".
Warning : Don't start games with the same savepath when you use the Shared Stash. Warning: Don't start games with the same savepath when you use the Shared Stash.
Don't use the same character in same time. Don't use the same character in same time.
Following are default values, between {} are some examples values with descriptions : Following are default values, between {} are some examples values with descriptions:
- ActiveLaunchAnyNumberOfLOD=0 {0:Disabled; 1:Enabled} - ActiveLaunchAnyNumberOfLOD=0 {0:Disabled; 1:Enabled}
Regenerate the map each time you re-start a game (like in multiplayer). Regenerate the map each time you re-start a game (like in multiplayer).
@@ -806,21 +816,21 @@ Display the stats current value (without magical bonus) when mouse pass over ass
Enabled the ladder only runewords out of realms. Enabled the ladder only runewords out of realms.
This is done by setting to 0 the column "server" in runes.txt file. This is done by setting to 0 the column "server" in runes.txt file.
So don't use this column in your mod with this funcion enabled ! So don't use this column in your mod with this funcion enabled!
- ActiveLadderRunewords=0 {0:Disabled; 1:Enabled} - ActiveLadderRunewords=0 {0:Disabled; 1:Enabled}
Enabled the ability to open the Cow Portal in a difficulty where the player have already killed the Cow King. Enabled the ability to open the Cow Portal in a difficulty where the player have already killed the Cow King.
- ActiveCowPortalWhenCowKingWasKilled=0 {0:Disabled; 1:Enabled} - ActiveCowPortalWhenCowKingWasKilled=0 {0:Disabled; 1:Enabled}
More features later... :) More features later...:)
This is my email : ynicolas@worldonline.fr. This is my email: ynicolas@worldonline.fr.
But I don't support PlugY anymore so don't hope any help from me if you have problems. Instead go on forums... But I don't support PlugY anymore so don't hope any help from me if you have problems. Instead go on forums...
PS : Sorry for english faults ;) PS: Sorry for english faults ;)
******** THANKS TO ******** ******** THANKS TO ********
- Blizzard for making Diablo2 and Lord of Destruction. - Blizzard for making Diablo2 and Lord of Destruction.
@@ -834,13 +844,13 @@ PS : Sorry for english faults ;)
- ItalianPlayer for italian translation. - ItalianPlayer for italian translation.
- All members of ProzenKeep chat and forums for their information and feedback. - All members of ProzenKeep chat and forums for their information and feedback.
- PhrozenKeep team for all stuff they shared for us (including mine ;) - PhrozenKeep team for all stuff they shared for us (including mine ;)
- Translation : - Translation:
* English : Yohann, Jurica. * English: Yohann, Jurica.
* French : Yohann * French: Yohann
* German : ChaosEnergy, TheMasterCaster. * German: ChaosEnergy, TheMasterCaster.
* Italian : ItalianPlayer * Italian: ItalianPlayer
* Spanish : Acrerune * Spanish: Acrerune
* Polish : Serdel * Polish: Serdel
* Russian : L'Autour * Russian: L'Autour
;--------------------------------------------------------------------------------------; ;--------------------------------------------------------------------------------------;

View File

@@ -5,25 +5,12 @@
PlugY launcher. PlugY launcher.
=================================================================*/ =================================================================*/
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "../Commons/VersionInfo.h" #include "../Commons/VersionInfo.h"
#include "PlugYRun.h" #include "PlugYRun.h"
/* #include <stdlib.h>
0012C458 00000000 |ModuleFileName = NULL #include <stdio.h>
0012C45C 0012C908 |CommandLine = ""C:\Jeux\Diablo II\Game.exe""
0012C460 00000000 |pProcessSecurity = NULL
0012C464 00000000 |pThreadSecurity = NULL
0012C468 00000000 |InheritHandles = FALSE
0012C46C 04000022 |CreationFlags = DEBUG_ONLY_THIS_PROCESS|NORMAL_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE
0012C470 00000000 |pEnvironment = NULL
0012C474 0012DF94 |CurrentDir = "C:\Jeux\Diablo II\"
0012C478 0012C6BC |pStartupInfo = 0012C6BC
0012C47C 0012C5CC \pProcessInfo = 0012C5CC
*/
#define MAX_LOADSTRING 100 #define MAX_LOADSTRING 100
#define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" #define SUBKEY "Software\\Blizzard Entertainment\\Diablo II"
@@ -44,7 +31,7 @@ BYTE loadDll[] = {
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX 0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
0x85,0xC0, //TEST EAX,EAX 0x85,0xC0, //TEST EAX,EAX
0x74,0x2F, //JE SHORT d2gfx.6FA7BE37 0x74,0x2B, //JE SHORT d2gfx.6FA7BE33
0x50, //PUSH EAX 0x50, //PUSH EAX
0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init String 0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init String
0x50, //PUSH EAX 0x50, //PUSH EAX
@@ -62,13 +49,8 @@ BYTE loadDll[] = {
0x58, //POP EAX 0x58, //POP EAX
0x58, //POP EAX 0x58, //POP EAX
0xC2,0x04,0x00, //RETN 4 0xC2,0x04,0x00, //RETN 4
0x59, //POP ECX
0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
0x83,0x04,0x24,0x10, //ADD DWORD PTR SS:[ESP],10
0xC2,0x04,0x00, //RETN 4
0x00,0x00,0x00,0x00 }; //HANDLE var; 0x00,0x00,0x00,0x00 }; //HANDLE var;
BYTE freeDll[] = { BYTE freeDll[] = {
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary 0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary
@@ -94,11 +76,9 @@ BYTE freeDll[] = {
0x58, //POP EAX 0x58, //POP EAX
0xC2,0x04,0x00 }; //RETN 4 0xC2,0x04,0x00 }; //RETN 4
//LPCSTR dllName = "PlugY.dll";
//LPCSTR dllName = "PlugY.dll";
LPCSTR initFctName = "_Init@4"; LPCSTR initFctName = "_Init@4";
LPCSTR releaseFctName = "_Release@0"; LPCSTR releaseFctName = "_Release@0";
static bool versionXP;
typedef int(__stdcall* tDebugActiveProcessStop)(DWORD); typedef int(__stdcall* tDebugActiveProcessStop)(DWORD);
tDebugActiveProcessStop debugActiveProcessStop; tDebugActiveProcessStop debugActiveProcessStop;
@@ -124,12 +104,17 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
LPBYTE loadLibraryAddr = addr; LPBYTE loadLibraryAddr = addr;
LPBYTE freeLibraryAddr = addr; LPBYTE freeLibraryAddr = addr;
LPBYTE getProcAddressAddr = addr; LPBYTE getProcAddressAddr = addr;
switch (version) switch (version)
{ {
case V107: case V107:
loadCallerAddr += 0x3882;
freeCallerAddr += 0x3A6C;
loadLibraryAddr += 0xC038;
freeLibraryAddr += 0xC040;
getProcAddressAddr += 0xC034;
break;
case V108: case V108:
//TODO
return false;
case V109: case V109:
case V109b: case V109b:
case V109d: case V109d:
@@ -182,11 +167,27 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
getProcAddressAddr += 0xD120; getProcAddressAddr += 0xD120;
break; break;
case V114a: case V114a:
loadCallerAddr += 0x1BCB;// Load advapi.dll
freeCallerAddr += 0xF375;// Free dbghelp.dll
loadLibraryAddr += 0x2CD118;
freeLibraryAddr += 0x2CD120;
getProcAddressAddr += 0x2CD11C;
break;
case V114b: case V114b:
case V114c: case V114c:
loadCallerAddr += 0x1BCB;// Load advapi.dll
freeCallerAddr += 0x6F75;// Free dbghelp.dll
loadLibraryAddr += 0x2CD11C;
freeLibraryAddr += 0x2CD124;
getProcAddressAddr += 0x2CD120;
break;
case V114d: case V114d:
//TODO loadCallerAddr += 0x621C;// Load advapi.dll
return false; freeCallerAddr += 0xB514;// Free dbghelp.dll
loadLibraryAddr += 0x2CC144;
freeLibraryAddr += 0x2CC14C;
getProcAddressAddr += 0x2CC148;
break;
default: default:
return false; return false;
} }
@@ -230,7 +231,6 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
DWORD baseOfCode = *(DWORD*)(buf + 0x2C); DWORD baseOfCode = *(DWORD*)(buf + 0x2C);
//MessageBox(0, "no memory", "RunPlugY.\n", MB_OK|MB_ICONASTERISK); //MessageBox(0, "no memory", "RunPlugY.\n", MB_OK|MB_ICONASTERISK);
//memory = addr + 0xBE00 + isAdd * 0x1000;
memory = addr + baseOfCode + sizeOfCode - 200; memory = addr + baseOfCode + sizeOfCode - 200;
if (!VirtualProtectEx(h, memory, 200, PAGE_EXECUTE_READWRITE, &oldProtect)) if (!VirtualProtectEx(h, memory, 200, PAGE_EXECUTE_READWRITE, &oldProtect))
assertion("PlugY : Failed to get memory pool in game thread"); assertion("PlugY : Failed to get memory pool in game thread");
@@ -271,7 +271,6 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
*(LPBYTE*)&loadDll[33] = initNameAddr; *(LPBYTE*)&loadDll[33] = initNameAddr;
*(LPBYTE*)&loadDll[40] = getProcAddressAddr; *(LPBYTE*)&loadDll[40] = getProcAddressAddr;
*(LPBYTE*)&loadDll[63] = getProcAddressAddr; *(LPBYTE*)&loadDll[63] = getProcAddressAddr;
*(LPBYTE*)&loadDll[80] = dllNameAddr;
len = sizeof(loadDll); len = sizeof(loadDll);
res = WriteProcessMemory(h, loadDllAddr, loadDll, len, &nb); res = WriteProcessMemory(h, loadDllAddr, loadDll, len, &nb);
if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed"); if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed");
@@ -282,16 +281,14 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
*(LPBYTE*)&freeDll[6] = freeLibraryAddr; *(LPBYTE*)&freeDll[6] = freeLibraryAddr;
*(LPBYTE*)&freeDll[12] = handleAddr; *(LPBYTE*)&freeDll[12] = handleAddr;
*(LPBYTE*)&freeDll[22] = releaseNameAddr; *(LPBYTE*)&freeDll[22] = releaseNameAddr;
// *(LPBYTE*)&freeDll[30] = handleAddr; *(LPBYTE*)&freeDll[29] = getProcAddressAddr;
*(LPBYTE*)&freeDll[36 - 7] = getProcAddressAddr; *(LPBYTE*)&freeDll[48] = getProcAddressAddr;
*(LPBYTE*)&freeDll[55 - 7] = getProcAddressAddr; *(LPBYTE*)&freeDll[60] = freeLibraryAddr;
*(LPBYTE*)&freeDll[67 - 7] = freeLibraryAddr;
len = sizeof(freeDll); len = sizeof(freeDll);
res = WriteProcessMemory(h, freeDllAddr, freeDll, len, &nb); res = WriteProcessMemory(h, freeDllAddr, freeDll, len, &nb);
if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed"); if (!res || (nb != len)) assertion("PlugY: Write custom data in memory failed");
pos += pos % 16 ? len + 16 - pos % 16 : len; pos += pos % 16 ? len + 16 - pos % 16 : len;
// Patch load library // Patch load library
buf[0] = 0x90; buf[0] = 0x90;
buf[1] = 0xE8; buf[1] = 0xE8;
@@ -305,17 +302,14 @@ bool installPlugY(HANDLE h, LPBYTE addr, char* libraryName, eGameVersion version
res = WriteProcessMemory(h, freeCallerAddr, buf, len, &nb); res = WriteProcessMemory(h, freeCallerAddr, buf, len, &nb);
if (!res || (nb != len)) assertion("PlugY: Write free library in memory failed"); if (!res || (nb != len)) assertion("PlugY: Write free library in memory failed");
// if (oldProtect != -1) // if (oldProtect != -1)
// VirtualProtectEx(h,(LPVOID)memory, 200, oldProtect, &oldProtect); // VirtualProtectEx(h,(LPVOID)memory, 200, oldProtect, &oldProtect);
return true; return true;
} }
//###########################################################################################// //###########################################################################################//
/*bool copyLodVersionFiles() /*bool copyLodVersionFiles()
{ {
BYTE folder[MAX_PATH]; BYTE folder[MAX_PATH];
@@ -337,32 +331,43 @@ return true;
#define BUF_SIZE 0x300 #define BUF_SIZE 0x300
bool isD2gfx(HANDLE hProcess, LPVOID dllAdr) bool isD2gfxLoaded(HANDLE hProcess, LPVOID addr)
{ {
SIZE_T nbRead; SIZE_T nbRead;
BYTE buf[BUF_SIZE]; BYTE buf[BUF_SIZE];
ReadProcessMemory(hProcess, dllAdr, buf, BUF_SIZE, &nbRead); ReadProcessMemory(hProcess, addr, buf, BUF_SIZE, &nbRead);
if (nbRead < 0x40) return false; if (nbRead < 0x60) return false;
int offsetPESignature = *(DWORD*)(buf + 0x3C);
if (offsetPESignature + 38 >= BUF_SIZE) return false;
DWORD baseOfCode = *(DWORD*)(buf + offsetPESignature + 0x34);
if ((baseOfCode != 0x6FA80000) && (baseOfCode != 0x6FA70000)) return false;
return true;
}
bool isGameLoaded(HANDLE hProcess, LPVOID baseAdr)
{
SIZE_T nbRead;
BYTE buf[BUF_SIZE];
ReadProcessMemory(hProcess, baseAdr, buf, BUF_SIZE, &nbRead);
if (nbRead < 0x40) return false;
int offsetPESignature = *(DWORD*)(buf + 0x3C); int offsetPESignature = *(DWORD*)(buf + 0x3C);
if (offsetPESignature + 0x5C >= BUF_SIZE) return false; if (offsetPESignature + 0x5C >= BUF_SIZE) return false;
DWORD baseOfCode = *(DWORD*)(buf + offsetPESignature + 0x34); DWORD ImageBase = *(DWORD*)(buf + offsetPESignature + 0x34);
DWORD SizeOfImage = *(DWORD*)(buf + offsetPESignature + 0x50); DWORD SizeOfImage = *(DWORD*)(buf + offsetPESignature + 0x50);
DWORD CheckSum = *(DWORD*)(buf + offsetPESignature + 0x58); DWORD CheckSum = *(DWORD*)(buf + offsetPESignature + 0x58);
if ((baseOfCode==0x00400000) && (SizeOfImage == 0x005A5000) && (CheckSum == 0x00374101)) return true;//1.14c if (ImageBase == 0x6FAA0000 && SizeOfImage == 0x00021000 && CheckSum == 0x00000000) return true;// 1.07 - 1.08
if (ImageBase == 0x6FA70000 && SizeOfImage == 0x00021000 && CheckSum == 0x00000000) return true;// 1.09 - 1.09b - 1.09d - 1.10
if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001743E) return true;// 1.11
if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001F6C4) return true;// 1.11b
if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001F0B2) return true;// 1.12
if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x0001BE5C) return true;// 1.13c
if (ImageBase == 0x6FA80000 && SizeOfImage == 0x00021000 && CheckSum == 0x00018542) return true;// 1.13d
return false;
}
bool isGameLoaded(HANDLE hProcess, LPVOID addr)
{
SIZE_T nbRead;
BYTE buf[BUF_SIZE];
ReadProcessMemory(hProcess, addr, buf, BUF_SIZE, &nbRead);
if (nbRead < 0x60) return false;
int offsetPESignature = *(DWORD*)(buf + 0x3C);
if (offsetPESignature + 0x5C >= BUF_SIZE) return false;
DWORD ImageBase = *(DWORD*)(buf + offsetPESignature + 0x34);
DWORD SizeOfImage = *(DWORD*)(buf + offsetPESignature + 0x50);
DWORD CheckSum = *(DWORD*)(buf + offsetPESignature + 0x58);
if (ImageBase == 0x00400000 && SizeOfImage == 0x005A6000 && CheckSum == 0x00371D8F) return true;//1.14a
if (ImageBase == 0x00400000 && SizeOfImage == 0x005A6000 && CheckSum == 0x0037645F) return true;//1.14b
if (ImageBase == 0x00400000 && SizeOfImage == 0x005A5000 && CheckSum == 0x00374101) return true;//1.14c
if (ImageBase == 0x00400000 && SizeOfImage == 0x005BA000 && CheckSum == 0x0037CED2) return true;//1.14d
return false; return false;
} }
@@ -431,20 +436,26 @@ bool launchGame98(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName,
if (!GetExitCodeProcess(pi.hProcess, &ret) || (ret != STILL_ACTIVE)) if (!GetExitCodeProcess(pi.hProcess, &ret) || (ret != STILL_ACTIVE))
exit(0); exit(0);
if (isD2gfx(pi.hProcess, (LPVOID)0x6FA80000)) if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FA80000))
{ {
installPlugY(pi.hProcess, (LPBYTE)0x6FA80000, libraryName, version); installPlugY(pi.hProcess, (LPBYTE)0x6FA80000, libraryName, version);
ResumeThread(pi.hThread); ResumeThread(pi.hThread);
return true; return true;
} }
if (isD2gfx(pi.hProcess, (LPVOID)0x6FA70000)) if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FA70000))
{ {
installPlugY(pi.hProcess, (LPBYTE)0x6FA70000, libraryName, version); installPlugY(pi.hProcess, (LPBYTE)0x6FA70000, libraryName, version);
ResumeThread(pi.hThread); ResumeThread(pi.hThread);
return true; return true;
} }
if (isD2gfxLoaded(pi.hProcess, (LPVOID)0x6FAA0000))
{
installPlugY(pi.hProcess, (LPBYTE)0x6FAA0000, libraryName, version);
ResumeThread(pi.hThread); ResumeThread(pi.hThread);
// Sleep(10); return true;
}
ResumeThread(pi.hThread);
//Sleep(10);
} }
return false; return false;
} }
@@ -469,9 +480,9 @@ bool launchGameXP(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName,
CloseHandle(DebugEvent.u.CreateThread.hThread); CloseHandle(DebugEvent.u.CreateThread.hThread);
break; break;
case CREATE_PROCESS_DEBUG_EVENT: case CREATE_PROCESS_DEBUG_EVENT:
if (version >= V114a && isGameLoaded(pi.hProcess, DebugEvent.u.CreateProcessInfo.lpBaseOfImage)) if (version >= V114a)// && isGameLoaded(pi.hProcess, DebugEvent.u.CreateProcessInfo.lpBaseOfImage))
{ {
//installPlugYOnGame(pi.hProcess, (DWORD)DebugEvent.u.CreateProcessInfo.lpBaseOfImage, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000, version); installPlugY(pi.hProcess, (LPBYTE)DebugEvent.u.CreateProcessInfo.lpBaseOfImage, libraryName, version);
CloseHandle(DebugEvent.u.CreateProcessInfo.hFile); CloseHandle(DebugEvent.u.CreateProcessInfo.hFile);
CloseHandle(pi.hProcess); CloseHandle(pi.hProcess);
CloseHandle(pi.hThread); CloseHandle(pi.hThread);
@@ -486,7 +497,7 @@ bool launchGameXP(LPSTR commandLine, LPSTR currentDirectory, LPSTR libraryName,
MessageBox(0, "EXCEPTION_ACCESS_VIOLATION", "PlugY", MB_OK | MB_ICONASTERISK); MessageBox(0, "EXCEPTION_ACCESS_VIOLATION", "PlugY", MB_OK | MB_ICONASTERISK);
break; break;
case LOAD_DLL_DEBUG_EVENT: case LOAD_DLL_DEBUG_EVENT:
if (version <= V113d && isD2gfx(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll)) if (version <= V113d && isD2gfxLoaded(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll))
{ {
installPlugY(pi.hProcess, (LPBYTE)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, version); installPlugY(pi.hProcess, (LPBYTE)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, version);
CloseHandle(DebugEvent.u.LoadDll.hFile); CloseHandle(DebugEvent.u.LoadDll.hFile);
@@ -514,8 +525,6 @@ int APIENTRY WinMain (
__in int nShowCmd __in int nShowCmd
) )
{ {
GetD2Version();
char currrentDirectory[MAX_PATH]; char currrentDirectory[MAX_PATH];
char iniFileName[MAX_PATH + sizeof(INIFILE) - 1]; char iniFileName[MAX_PATH + sizeof(INIFILE) - 1];
char command[MAX_PATH + sizeof(GAMEFILE) + 200]; char command[MAX_PATH + sizeof(GAMEFILE) + 200];
@@ -592,10 +601,8 @@ int APIENTRY WinMain (
return !launchNormal(command, currrentDirectory); return !launchNormal(command, currrentDirectory);
// Check version // Check version
if (version == UNKNOW) if (version < V107 || version > V114d)
assertion("This LoD version isn't supported by PlugY."); assertion("PlugY isn't compatible with this version : %s", GetVersionString(version));
else if (version < V109 || version > V113d)
assertion("The %s version of LoD isn't supported by PlugY.", GetVersionString(version));
// Launch LoD and install PlugY // Launch LoD and install PlugY
HMODULE module = GetModuleHandle("Kernel32.dll"); HMODULE module = GetModuleHandle("Kernel32.dll");

Binary file not shown.

Binary file not shown.

View File

@@ -160,7 +160,7 @@
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PlugY.exe&quot;" CommandLine="copy &quot;$(TargetPath)&quot; &quot;..\PlugYInstaller\PlugY.exe&quot;&#x0D;&#x0A;"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>

View File

@@ -1,25 +1,52 @@
# PlugY # PlugY
PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction (1.09b - 1.13d) PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction (1.09b - 1.13d + 1.14d)
Extends Diablo II - Lord of Destruction by a number of useful features which can be enabled/disabled individually Extends Diablo II - Lord of Destruction by a number of useful features
## FEATURES ## FEATURES
* Disable access to Battle.net Each features can be turned on/off via PlugY.ini
* Infinite storage space in the stash (up to 4,294,967,296 personal pages) * Disable access to Battle.net.
* Shared storage space in the stash (up to 4,294,967,296 shared pages too!) * Infinite storage space in the stash.
* Enabled the ladder only runewords for singleplayer and TCP/IP multiplayer * Shared storage space in the stash.
* Local World Event and Uber Quest for singleplayer and TCP/IP multiplayer * Enabled the ladder only runewords out of realms.
* Can open Cow Level Portal even when the Cow King was killed before in that difficulty * Local World Event and Uber Quest for singleplayer and multiplayer off-realm !
* Unassign assigned skills and stats points * Can open Cow Level Portal even when player have kill the Cow King in that difficulty.
* Change the selected language * Unassign assigned skills and stats points.
* Always regenerate maps in SinglePlayer like in MultiPlayer * Change the selected language.
* Automatically execute /players X when you launch a new game * Always regenerate maps in SinglePlayer like in MultiPlayer.
* Added some pages for display more characters stats like %MF * Automatically execute /players X when you launch a new game.
* Display item level * Added some pages for display more characters stats like %MF.
* Launch any number of Diablo II games on the same computer * Display item level in its popup.
* Increase the stash to 10x10 squares * Launch any number of Diablo II games on the same computer.
* Change the save path directory * Increase the stash to 10x10 squares.
* Always display Mana and Life values above the globes * Change the save path directory.
* D2 can load all files, even those opened with Microsoft Excel (disabled by default) * Always display Mana and Life values above the globes.
* Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances * D2 can load all files, even those opened with Microsoft Excel (disabled by default).
* PlugY is localized in English, French, German, Italian, Spanish, Polish, Portuguese, Japanese, Korean, Chinese, Polish, Russian * Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances.
* Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder).
* Add following commands:
* /save : Save game without exit.
* /page 1 : Show normal stats page (stats page must be opened).
* /page 2 : Show extra stats page (stats page must be opened).
* /page 3 : Show resistance stats page (stats page must be opened).
* /page 4 : (beta) Show available runewords (stats page must be opened).
* /lockmouse : Lock mouse cursor in the window.
* /lock : Same as /lockmouse.
* /unlockmouse : Unlock mouse cursor in the window.
* /unlock : Same as /unlockmouse.
* /renamechar newname : Rename your character and save it.
* /renamepage name : Rename current page stash.
* /setindex : Set current stash page as index
* /resetindex : Remove index flag on the current stash page.
* /insertpage : Insert a new page after the current page.
* /deletepage : Delete current page if empty.
* /swap page : Swap the content of current stash page with the content of another page.
* /toggle page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
* /dlm : Toggle always display mana and life mode.
* /dml : Same as /dlm.
* /dl : Toggle always display life mode.
* /dm : Toggle always display mana mode.
* /listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts.
## Contribute
If you want to update the translations please use the [POEditor project](https://poeditor.com/join/project/VnO1SKslPV) and create a bug-ticket nofifying me that you have done so. Please do not edit the LocalizedStrings.ini directly. If you absolutely don't want to use POEditor, edit the json files found at [PlugYInstaller/PlugY/translations](https://github.com/ChaosMarc/PlugY/tree/master/PlugYInstaller/PlugY/translations)