From 5a1eb33f039b1441d6ae11a0baf5ce77113b1562 Mon Sep 17 00:00:00 2001 From: ChaosMarc Date: Mon, 18 Apr 2016 11:10:35 +0200 Subject: [PATCH] updated to v11.00 by Lautour http://d2mods.info/forum/viewtopic.php?f=133&t=62849 --- Commons/D2Funcs.h | 326 ++-- Commons/VersionInfo.cpp | 118 ++ Commons/VersionInfo.h | 30 + PlugY/BigStash.cpp | 7 +- PlugY/Commands.cpp | 34 +- PlugY/Common.cpp | 540 ++---- PlugY/D2functions.cpp | 41 +- PlugY/D2wrapper.cpp | 94 +- PlugY/ExtraOptions.cpp | 61 +- PlugY/GlobalVariable.cpp | 9 +- PlugY/InfinityStash.cpp | 18 +- PlugY/Interface_Skills.cpp | 23 +- PlugY/Interface_Stash.cpp | 24 +- PlugY/Interface_Stats.cpp | 34 +- PlugY/LoadPlayerData.cpp | 19 +- PlugY/MainScreen.cpp | 12 +- PlugY/NewInterface_CubeListing.cpp | 250 ++- PlugY/NewInterfaces.cpp | 34 +- PlugY/PlayerCustomData.cpp | 40 +- PlugY/PlugY.aps | Bin 33732 -> 33828 bytes PlugY/PlugY.rc | 9 +- PlugY/PlugY.suo | Bin 119808 -> 206848 bytes PlugY/PlugY.vcproj | 19 +- PlugY/PlugYFiles.cpp | 16 +- PlugY/SavePath.cpp | 12 +- PlugY/SavePlayerData.cpp | 21 +- PlugY/SkillPerLevelUp.cpp | 5 +- PlugY/StatPerLevelUp.cpp | 4 +- PlugY/StatsPoints.cpp | 43 +- PlugY/UberQuest.cpp | 22 +- PlugY/UpdateClient.cpp | 4 +- PlugY/UpdateServer.cpp | 3 +- PlugY/WorldEvent.cpp | 13 +- PlugY/common.h | 60 +- PlugY/d2functions.h | 7 +- PlugY/parameters.h | 3 +- PlugYInstall/PlugYInstall.aps | Bin 33752 -> 33780 bytes PlugYInstall/PlugYInstall.cpp | 67 +- PlugYInstall/PlugYInstall.rc | 8 +- PlugYInstall/PlugYInstall.suo | Bin 12288 -> 13312 bytes PlugYInstall/PlugYInstall.vcproj | 16 + PlugYInstaller/PlugY.nsi | 43 +- PlugYInstaller/PlugY/PlugYLocal.ini | 1655 +++++++++++++++++ .../PlugY_The_Survival_Kit_-_Liesmich.txt | 34 +- .../PlugY_The_Survival_Kit_-_LisezMoi.txt | 26 +- .../PlugY_The_Survival_Kit_-_Readme.txt | 39 +- PlugYLocal/PlugYLocal.cfg | 36 + PlugYLocal/PlugYLocal.dof | 143 ++ PlugYLocal/PlugYLocal.dpr | 823 ++++++++ PlugYLocal/PlugYLocal.ini | 1655 +++++++++++++++++ PlugYLocal/PlugYLocal.res | Bin 0 -> 1580 bytes PlugYRun/PlugYRun.aps | Bin 37848 -> 37948 bytes PlugYRun/PlugYRun.cpp | 103 +- PlugYRun/PlugYRun.rc | 9 +- PlugYRun/PlugYRun.suo | Bin 23040 -> 45568 bytes PlugYRun/PlugYRun.vcproj | 18 +- 56 files changed, 5670 insertions(+), 960 deletions(-) create mode 100644 Commons/VersionInfo.cpp create mode 100644 Commons/VersionInfo.h create mode 100644 PlugYInstaller/PlugY/PlugYLocal.ini create mode 100644 PlugYLocal/PlugYLocal.cfg create mode 100644 PlugYLocal/PlugYLocal.dof create mode 100644 PlugYLocal/PlugYLocal.dpr create mode 100644 PlugYLocal/PlugYLocal.ini create mode 100644 PlugYLocal/PlugYLocal.res diff --git a/Commons/D2Funcs.h b/Commons/D2Funcs.h index 9e923ea..fcfa805 100644 --- a/Commons/D2Funcs.h +++ b/Commons/D2Funcs.h @@ -1,5 +1,6 @@ /*====================================================================== File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Declares the type for a STDCALL or FASTCALL function pointer called N with arguments list P, returning R, namedInDLL D and at @A @@ -148,68 +149,68 @@ //F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID)); -F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); -F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826, DWORD, D2GetLevelID, (Room* ptRoom)); -F7(STD, D2Common,10138,10138,10138,10623,10491,11043,10654, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); +F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); +F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691, 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)); //F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit)); -F7(STD, D2Common,10242,10242,10242,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); -F7(STD, D2Common,10246,10246,10246,10855,10813,10289,10133, 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, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); -F7(STD, D2Common,10249,10249,10249,10880,11068,10436,11107, 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, 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,10242,10242,10242,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)); +F7(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490, 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 +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 //F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); -F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); -F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); -F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464, Unit*, D2UnitGetNextItem, (Unit* ptItem)); -F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147, Unit*, D2GetRealItem, (Unit* ptUnit)); +F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); +F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); +F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879, Unit*, D2UnitGetNextItem, (Unit* ptItem)); +F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897, Unit*, D2GetRealItem, (Unit* ptUnit)); //F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar)); //F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar)); -F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 +F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 //F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos)); -F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 +F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 //F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos)); -F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141, void, D2GetPosition, (Unit* ptUnit, Position* pos)); -F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); -F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331, Room*, D2GetRoom, (Unit* ptUnit)); +F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166, void, D2GetPosition, (Unit* ptUnit, Position* pos)); +F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); +F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846, Room*, D2GetRoom, (Unit* ptUnit)); //F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode)); //F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject)); -F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356, PlayerData*,D2InitPlayerData, (Unit* ptChar)); +F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404, PlayerData*,D2InitPlayerData, (Unit* ptChar)); //F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar)); -F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920, PlayerData*,D2GetPlayerData, (Unit* ptChar)); -F7(STD, D2Common,10431,10431,10431,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar)); -F7(STD, D2Common,10433,10433,10433,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); -F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049, DWORD, D2GetMaxGold, (Unit* ptUnit)); -F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); +F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103, PlayerData*,D2GetPlayerData, (Unit* ptChar)); +F7(STD, D2Common,10431,10431,10431,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)); +F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159, DWORD, D2GetMaxGold, (Unit* ptUnit)); +F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); //F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex)); //F7(STD, D2Common,10470,10470,10470,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, BYTE, D2GetObjectFlags, (Unit* ptObject)); -F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); +F7(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040, BYTE, D2GetObjectFlags, (Unit* ptObject)); +F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); //F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000, DWORD, D2Common10471, (void*)); //F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000, DWORD, D2Common10472, (void*)); //F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one)); //F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags)); //F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD)); //F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats)); -F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); +F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); //F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index)); -F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b -F7(STD, D2Common,10519,10519,10519,11092,10061,10658,10973, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645, 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 //F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index)); -F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b //F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit)); -F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); -F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); -F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); -F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); -F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); -F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); -F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); -F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); -F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); -F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); +F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); +F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); +F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); +F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); +F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); +F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); +F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); +F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); +F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); +F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); //F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit)); //F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem)); //F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats)); @@ -217,35 +218,35 @@ F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000, DWORD, D2havePoiso //F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000, void, D2FreeBinFiles, ()); //F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool)); //F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value)); -F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); -F7(STD, D2Common,10600,10600,10600,10573,10262,10887,10695, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); +F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037, 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)); //F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID)); //F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID)); -F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); -F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); -F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675, int, D2GetNbCubeMainBIN, ()); +F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); +F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); +F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235, int, D2GetNbCubeMainBIN, ()); //F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID)); -F7(STD, D2Common,10628,10628,10628,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); -F7(STD, D2Common,10629,10629,10629,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID)); -F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); +F7(STD, D2Common,10628,10628,10628,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)); +F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); //F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk)); //F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id)); -F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106, DWORD, D2GetItemQuality, (Unit* ptItem)); -F7(STD, D2Common,10707,10707,10707,10911,10303,10989,10202, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); +F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911, 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)); //F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue)); //F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit)); //F7(STD, D2Common,10711,10711,10711,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, DWORD, D2GetItemLevel, (Unit* ptItem)); -F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020, BYTE, D2ItemGetPage, (Unit* ptUnit)); -F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); -F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); -F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620, int, D2GetUniqueID, (Unit* ptItem)); -F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); +F7(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008, DWORD, D2GetItemLevel, (Unit* ptItem)); +F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810, BYTE, D2ItemGetPage, (Unit* ptUnit)); +F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); +F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); +F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075, int, D2GetUniqueID, (Unit* ptItem)); +F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); //F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height); //F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit)); //F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem)); -F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032, int*, D2GetNbRunesBIN, ());//return the point on th number -F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006, RunesBIN*, D2GetRunesBIN, (int runesID)); +F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981, int*, D2GetNbRunesBIN, ());//return the point on th number +F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, RunesBIN*, D2GetRunesBIN, (int runesID)); //F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem)); //F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem)); //F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem)); @@ -254,35 +255,35 @@ F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006, RunesBIN*, D2GetRun //F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD)); //F7(STD, D2Common,10872,10872,10872,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, WORD, D2GetItemVersion, (Unit* ptItem)); -F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 -F7(STD, D2Common,10881,10881,10881,10956,11156,10218,10987, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); +F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963, 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)); //F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000, void, DoNothing916, ()); //F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID)); //F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID)); //F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID)); -F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); +F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); //F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line)); //F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill)); -F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); +F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); //F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two)); //F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState)); //F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber)); //F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID)); //F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex)); //F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD)); -F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 -A7(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); -A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); -A7(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); -A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); +F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081, 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)); +A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0, 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)); +A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); //A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize)); -A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); +A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); //A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD)); //A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats)); //A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem)); -A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); +A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); //A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string)); -A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 +A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -307,24 +308,24 @@ A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870, void, D2LoadSuper //E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b //E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI -A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420, void*, D2LoadImage, (const char* filename, DWORD filetype)); -A7(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000, void, D2FreeImage, (void* image));//6FAA1140 -A7(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! +A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480, void*, D2LoadImage, (const char* filename, DWORD filetype)); +A7(FAST, D2Client, 1150, 1150, 1140,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 !! //A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80 -A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 -A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0, void, D2PrintStatsPage, ()); +A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 +A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640, void, D2PrintStatsPage, ()); //A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990 -A7(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10, 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, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI +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 +A7(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI //A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0 -A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); +A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); //A7(FAST, D2Client,B9970,B8CF0,BB0F0,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, Unit*, D2GetCurrentNPC, ()); -A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX -A7(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); -A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI -A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0, void*, D2LoadBuySelBtn, ()); -A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0, void, D2ReloadGambleScreen, ()); +A7(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0, Unit*, D2GetCurrentNPC, ()); +A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0, 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)); +A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI +A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0, void*, D2LoadBuySelBtn, ()); +A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, void, D2ReloadGambleScreen, ()); //A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI @@ -369,43 +370,43 @@ A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0, void, D2ReloadGamb //E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b -F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049, void, D2SetNbPlayers, (DWORD nbPlayers)); +F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002, void, D2SetNbPlayers, (DWORD nbPlayers)); //A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0 -A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930, void, D2AddClient, (DWORD clientID));//BY EAX -A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 -A7(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 -A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData -A7(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX +A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070, void, D2AddClient, (DWORD clientID));//BY EAX +A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700, 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 +A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780, 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 //A7(FAST, D2Game,00000,00000,0E6F0,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, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0 //A7(FAST, D2Game,00000,00000,110E0,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, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); -A7(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem +A7(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40, 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 //A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80 -A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); +A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); //A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410 //A7(FAST, D2Game,00000,00000,22C00,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, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 //A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 -A7(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950, 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, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); +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 +A7(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); //A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 //A7(FAST, D2Game,00000,00000,5A500,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, 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, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 +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 +A7(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 //A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220, Unit*, D2GetOwnerMonster, (Unit* ptMonster)); //A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0 -A7(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90, 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, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); -A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); -A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +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)); +A7(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); +A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); +A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920, 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*)); +A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850, 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*)); +A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0, 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*)); //A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one)); -A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830, void, D2SaveGame, (Game* ptGame) ); +A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, void, D2SaveGame, (Game* ptGame) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -413,8 +414,8 @@ A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830, void, D2SaveGame, (G //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 -F7(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024, 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, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); +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 +F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -439,25 +440,25 @@ F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002, DWORD, D2SendToClien ////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 //D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10 -F7(STD, Fog, 10023,10023,10023,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, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); -F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); -F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103, DWORD, D2MPQCloseFile, (void* mpqfile)); -F7(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); -F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); -F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); -F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); +F7(STD, Fog, 10023,10023,10023,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)); +F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042, 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)); +F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045, 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)); +F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); +F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103, 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)); +F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); +F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); +F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); //F7(STD, Fog, 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, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 //F7(STD, Fog, 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, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 -F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow)); +F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow)); //F7(STD, Fog, 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, int, D2GetInstructionPointer, ()); +F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, int, D2GetInstructionPointer, ()); //Fog10213 getIndexFromLookupTable (&table,code,bool) @@ -476,12 +477,12 @@ F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265, int, D2GetInstructionP ////E2F(D2Lang,2CD0, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth ////E2S(D2Lang,1670, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf -//F7(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 -F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); +F7(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 +F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); //F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0 -F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009, DWORD, D2GetLang, ()); -F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 -//F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 +F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001, DWORD, D2GetLang, ());//14b 00522A20 +F7(STD, D2Lang, 10010,10010,10010,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 //A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0 //A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60 //A7(FAST, D2Lang, 00000,00000,03640,00000,00000,00000,00000, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640 @@ -497,9 +498,9 @@ F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000, DWORD, D2PrintBigNu //D2S(Storm,511, void, D2FreeWinMessage, (sWinMessage* msg));//1.11/1.11b //F7(STD, Storm, 253, 253, 253, 253, 253, 253, 000, void, D2StormMPQCloseFile, (void* mpqfile)); -F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) -F7(STD, Storm, 503, 503, 503, 503, 503, 503, 503, void, D2Storm503, (DWORD, DWORD, DWORD)); -F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg)); +F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, 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)); +F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -511,12 +512,12 @@ F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessa //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 -F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031, DWORD, D2GetResolution,() ); +F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012, DWORD, D2GetResolution,() ); //F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) ); //F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000, DWORD, D2ShowWindow,() ); //F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0 -F7(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); -F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); +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)); +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) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -530,36 +531,36 @@ F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041, void, D2PrintImage,( //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 -F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); -F7(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); -F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028, DWORD, D2GetPixelLen,(LPWSTR s) ); -F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184, DWORD, D2SetFont,(DWORD fontID) ); -F7(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); -F7(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 -F7(FAST, D2Win, 10132,10132,10132,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, void*, D2CreateTextBox,(DWORD* data) ); +F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051, 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) ); +F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150, DWORD, D2GetPixelLen,(LPWSTR s) ); +F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047, 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) ); +F7(FAST, D2Win, 10131,10131,10131,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 +F7(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164, void*, D2CreateTextBox,(DWORD* data) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //D2CMP : ????0000 //D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11 -F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065, DWORD, D2CMP10014, (void* image) ); +F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020, DWORD, D2CMP10014, (void* image) ); //ONLY UNTIL 1.10 : -A7(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080 -A7(FAST, D2Client, 00000,00000, C090,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, DWORD, D2GetMouseX, ());//6FB57BC0 -A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 -A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0 -A7(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000, void, D2CleanStatMouseUp, ());//6FAABF60 -A7(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 +A7(FAST, D2Client, BA00, B9F0, C080,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) +A7(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0 +A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 +A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0 +A7(FAST, D2Client, B920, B910, BF60,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 //A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20 //A7(FAST, D2Client, 00000,00000, D9E0,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, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40 //A7(FAST, D2Client, 00000,00000, DA70,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, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 +A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// VARIABLES //////// @@ -581,22 +582,23 @@ A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000, NetClient*, D2GetCli //E2C(D2Client,11C1E0,Unit*, ptClientChar);//1.11b //C7(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20 -C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, DWORD, ResolutionY);//0x258 = 600 -C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, DWORD, ResolutionX);//0x320 = 800 -C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 -C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0, DWORD, WindowStartX);//0x50 = 80 +C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C,F7038, DWORD, ResolutionY);//0x258 = 600 +C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48,F7034, DWORD, ResolutionX);//0x320 = 800 +C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 +C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354, DWORD, WindowStartX);//0x50 = 80 //C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000 -C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8, NetClient*, ClientTable); +C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0, NetClient*, ClientTable); //C7(D2Client,000000,000000,000000,000000,104225,000000,000000, DWORD, CurrentNPCNum); -C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854, DWORD, IsLodGame); -C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000, BYTE, DifficultyLevel); -C7(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824, DWORD, MouseY);//0x258 = 600 -C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828, DWORD, MouseX);//0x320 = 800 -C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC, Unit*, ptClientChar); +C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4, DWORD, IsLodGame); +C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000, 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 +C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950, DWORD, MouseX);//0x320 = 800 +C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050, Unit*, ptClientChar); -C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000, DWORD, NbStatDesc); -C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000, DWORD, StatDescTable); +C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000, DWORD, NbStatDesc); +C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000,000000, DWORD, StatDescTable); /* NEXT NOT TESTED IN 1.10 (1.09b fct) D2_STD(D2Common10066, void, D2RemoveFromRoom, (DrlgRoom1* hRoom, DWORD untitype, DWORD unitID), 0x6FD7CFD0); diff --git a/Commons/VersionInfo.cpp b/Commons/VersionInfo.cpp new file mode 100644 index 0000000..9e7be5e --- /dev/null +++ b/Commons/VersionInfo.cpp @@ -0,0 +1,118 @@ +#include "VersionInfo.h" +#pragma comment(lib, "Version.Lib") // Delphi 7 - ! :( + + +bool IsFile(char* sPath) +{ + bool bFile = false; + HANDLE hFile = CreateFile + ( + sPath, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + if(hFile != INVALID_HANDLE_VALUE) + { + CloseHandle(hFile); + bFile = true; + } + return bFile; +} + +bool GetAppVersion(char* FileName, TFileVersion* VerInfo){ // + VerInfo->full = -1; + if(!IsFile(FileName)){ // + return false; // - + } + DWORD FSize = GetFileVersionInfoSize(FileName,NULL); // + if(FSize==0){ // 0 + return false; + } + LPVOID pBlock = (char*)malloc(FSize); // + GetFileVersionInfo(FileName,NULL,FSize,pBlock); // + LPVOID MS; + UINT LS; + try{ + VerQueryValue(pBlock,"\\",&MS,&LS); // + } + catch(...){ + return false; // + } + VS_FIXEDFILEINFO FixedFileInfo; // + memmove(&FixedFileInfo, MS, LS); // + + DWORD FileVersionMS = FixedFileInfo.dwFileVersionMS; + DWORD FileVersionLS = FixedFileInfo.dwFileVersionLS; + + VerInfo->major = HIWORD(FileVersionMS) ; // + VerInfo->minor = LOWORD(FileVersionMS); // + VerInfo->revision = HIWORD(FileVersionLS); + VerInfo->subrevision = LOWORD(FileVersionLS); + + return true; // +} + + +#define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" +#define GAMEFILE "\\Game.exe" +bool GetD2Path(char* buf, DWORD bufsize) +{ + HKEY hKey; + DWORD type; + int res; + if (RegOpenKeyEx(HKEY_CURRENT_USER, SUBKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + res = RegQueryValueEx(hKey,"InstallPath",NULL,&type,(LPBYTE)buf,&bufsize); + RegCloseKey(hKey); + if (res!=ERROR_SUCCESS) return false; + } else if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + res = RegQueryValueEx(hKey,"InstallPath",NULL,&type,(LPBYTE)buf,&bufsize); + RegCloseKey(hKey); + if (res!=ERROR_SUCCESS) return false; + } else { + return false; + } + strcat(buf, GAMEFILE); + if (GetFileAttributes(buf) == INVALID_FILE_ATTRIBUTES) + return false; + return true; +}; + +int GetVerD2(TFileVersion GameVer) +{ + if ((GameVer.major != 1)||(GameVer.minor != 0)) return -1; + switch (GameVer.revision) + { + case 9: + if (GameVer.subrevision == 20) return v109b; + if (GameVer.subrevision == 22) return v109d; + break; + case 10: + if (GameVer.subrevision == 39) return v110; + break; + case 11: + if (GameVer.subrevision == 45) return v111; + if (GameVer.subrevision == 46) return v111b; + break; + case 12: + if (GameVer.subrevision == 49) return v112; + break; + case 13: + if (GameVer.subrevision == 60) return v113c; + if (GameVer.subrevision == 64) return v113d; + break; + } + return -1; +} + + +int GetD2Version(char* PathGameExe) +{ + TFileVersion GameVer = {-1}; + if (! GetAppVersion(PathGameExe, &GameVer)) return -1; + int ver = GetVerD2(GameVer); + return ver; +} \ No newline at end of file diff --git a/Commons/VersionInfo.h b/Commons/VersionInfo.h new file mode 100644 index 0000000..679fdf2 --- /dev/null +++ b/Commons/VersionInfo.h @@ -0,0 +1,30 @@ +#include + +union TFileVersion +{ + __int64 full; + struct { + WORD subrevision; + WORD revision; + WORD minor; + WORD major; + }; + WORD w[4]; +}; + +enum eGameVersion +{ + v109b=0, + v109d, + v110, + v111, + v111b, + v112, + v113c, + v113d, + v114a +}; + +bool GetAppVersion(char* FileName, TFileVersion* VerInfo); // +bool GetD2Path(char* buf, DWORD bufsize); +int GetD2Version(char* PathGameExe); \ No newline at end of file diff --git a/PlugY/BigStash.cpp b/PlugY/BigStash.cpp index 80cbe06..152a24b 100644 --- a/PlugY/BigStash.cpp +++ b/PlugY/BigStash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Use a more big stash @@ -78,16 +79,17 @@ void Install_BigStash() log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n"); // modification of stash grid - mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5); + mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25); MEMC_REF4( D2CompileTxtFile, caller_modifStashGrid); //01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578 //6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653 //6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496 //6FD6BDB4 |. E8 97600200 CALL D2Common.#10244 ; \#10244 //6FDD2CA4 |. E8 97C2FDFF CALL D2Common.#10849 ; \#10849 + //6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037 // modification of stash background - mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C); + mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC); memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash MEMT_REF4( 0x00000104, caller_changeTradeStash); //6FAEC61C |. 68 04010000 PUSH 104 @@ -95,6 +97,7 @@ void Install_BigStash() //6FB249BC |. 68 04010000 PUSH 104 //6FB59D7C |. 68 04010000 PUSH 104 //6FB3CC1C |. 68 04010000 PUSH 104 + //6FB443FC |. 68 04010000 PUSH 104 log_msg("\n"); diff --git a/PlugY/Commands.cpp b/PlugY/Commands.cpp index 722cfed..c61eabc 100644 --- a/PlugY/Commands.cpp +++ b/PlugY/Commands.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -15,6 +16,7 @@ #include "newInterface_CubeListing.h" #include "extraOptions.h" + bool active_Commands=true; bool active_listAllCubeFormula=true; @@ -140,13 +142,15 @@ void updateSharedGold(DWORD goldAmount) int STDCALL commands (char* ptText) { + //return 0; Unit* ptChar = D2GetClientPlayer(); - + //return 0; char command[MAX_CMD_SIZE]; ZeroMemory(command,MAX_CMD_SIZE); + //return 0; strncpy(command,ptText,MAX_CMD_SIZE-1); - strlwr(command); - + //return 0; + strlwr(command); if (!strncmp(command,CMD_RENAME,strlen(CMD_RENAME))) { if (!active_multiPageStash) return 1; @@ -220,7 +224,6 @@ int STDCALL commands (char* ptText) active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana; return 0; } - return 1; } @@ -248,6 +251,19 @@ MANAGESOUNDCHAOSDEBUG: RETN 8 }} +FCT_ASM ( caller_Commands_113d ) + TEST EAX,EAX + JE MANAGESOUNDCHAOSDEBUG + PUSH EDI + CALL commands + TEST EAX,EAX + JNZ MANAGESOUNDCHAOSDEBUG + ADD DWORD PTR SS:[ESP],7 +MANAGESOUNDCHAOSDEBUG: + RETN 8 +}} + + void Install_Commands() { static int isInstalled = false; @@ -261,9 +277,9 @@ void Install_Commands() active_savegame = version_D2Common >= V111; // Run custom commmand - mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6); - memt_byte( 0x83, 0xE8 ); // CALL - MEMT_REF4( 0xC08508C4 , version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); + mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6); + memt_byte( 0x83, 0xE8 ); // CALL + MEMT_REF4( 0xC08508C4 , version_D2Client == V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); //6FB71EE6 . 83C4 08 ADD ESP,8 //6FB71EE7 . 85C0 TEST EAX,EAX //6FB41C16 |. 83C4 08 ADD ESP,8 @@ -272,9 +288,9 @@ void Install_Commands() //6FB36929 |. 85C0 TEST EAX,EAX //6FB20AE6 |. 83C4 08 ADD ESP,8 //6FB20AE9 |. 85C0 TEST EAX,EAX - //6FB20AE6 |. 83C4 08 ADD ESP,8 - //6FB20AE9 |. 85C0 TEST EAX,EAX + //6FB61FD6 |. 83C4 08 ADD ESP,8 + //6FB61FD9 |. 85C0 TEST EAX,EAX log_msg("\n"); isInstalled = true; diff --git a/PlugY/Common.cpp b/PlugY/Common.cpp index 0ee02f4..5bc4137 100644 --- a/PlugY/Common.cpp +++ b/PlugY/Common.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + *Modified by L'Autour. Common functions. @@ -8,9 +9,12 @@ #include "common.h" #include "error.h" #include "d2functions.h" +#include "INIfile.h" +#define sPlugyExt ".\\PlugY\\PlugYLocal.dll" s_shifting shifting; + bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h) {return (x>=x0) && (xy0-h) && (y<=y0);} @@ -22,445 +26,120 @@ void freeMessage(sWinMessage* msg) D2FreeWinMessage(msg); } +//MS C++__fastcall(ecx,edx,) vs Delphi register(eax,edx,ecx) - :( -LPWSTR getString(LPWSTR eng, LPWSTR esp, LPWSTR deu, LPWSTR fra, LPWSTR por, LPWSTR ita, LPWSTR jpn, LPWSTR kor, LPWSTR sin, LPWSTR chi, LPWSTR pol, LPWSTR rus) +typedef int (__stdcall *p_UCS2toUTF8)(char*, int, LPWSTR, int); +p_UCS2toUTF8 _UCS2toUTF8; + +int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc) { - switch(D2GetLang()) - { - case LNG_ENG: return eng; - case LNG_ESP: return esp; - case LNG_DEU: return deu; - case LNG_FRA: return fra; - case LNG_POR: return por; - case LNG_ITA: return ita; - case LNG_JPN: return jpn; - case LNG_KOR: return kor; - case LNG_SIN: return sin; - case LNG_CHI: return chi; - case LNG_POL: return pol; - case LNG_RUS: return rus; - case LNG_DEF: - default: return eng; - } + if (_UCS2toUTF8 == NULL) return 0; + return _UCS2toUTF8(dst, maxdst, src, lensrc); } -#define LANGUAGE(I,ENG,FRA,DEU,ITA,ESP,POL/*,CHI*/) case I : return getString(L##ENG,L##ESP,L##DEU,L##FRA,L##ENG,L##ITA,L##ENG,L##ENG,L##ENG,L##ENG,L##POL,L##ENG) + +typedef int (__stdcall *p_UTF8toUCS2)(LPWSTR, int, char*, int); +p_UTF8toUCS2 _UTF8toUCS2; + +int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc) +{ + if (_UTF8toUCS2 == NULL) return 0; + return _UTF8toUCS2(dst, maxdst, src, lensrc); +} + +typedef const LPWSTR(__fastcall *p_getTypeString)(DWORD, char**); +p_getTypeString _getTypeString; + +const LPWSTR getTypeString(DWORD code, char** IdxStr) +{ + if (_getTypeString == NULL) return L"#"; + return _getTypeString(code, IdxStr); +} + +typedef LPWSTR(__fastcall *p_getTranslatedString)(int); +p_getTranslatedString _getTranslatedString; LPWSTR getTranslatedString(int stringID) { - switch(stringID) - { -/* LANGUAGE2( STR_STATS_UNASSIGN_WITH_LIMIT, - "+Alt: ;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points", -// "+Alt: \x91CD\x5206\x914D;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points", - "+Alt: Dsallocation, +Shift: par %d points,", - "+Alt: Zurcksetzen, +Shift: um %d Punkte", - "+Alt: Rimuovi, +Shift: Assegna %d punti", - "+Alt: Quita, +Shift: por %d puntos", - "+Alt: \37325\20998\37197;,+Shift:%d \28857\25968"); -*/ - LANGUAGE( STR_STATS_UNASSIGN_WITH_LIMIT, - "+Alt: Unassign, +Shift: by %d points", - "+Alt: Dsallocation, +Shift: par %d points", - "+Alt: Zurcksetzen, +Shift: um %d Punkte", - "+Alt: Rimuovi, +Shift: Assegna %d punti", - "+Alt: Quita, +Shift: por %d puntos", - "+Alt: Odejmij, +Shift: %d punktw"); -// "+Alt: ????, +Shift: %d ??"); + if (_getTranslatedString == NULL) return L"#"; + return _getTranslatedString(stringID); +} - LANGUAGE( STR_STATS_UNASSIGN_WITHOUT_LIMIT, - "+Alt: Unassign, +Shift: all remaining points", - "+Alt: Dsallocation, +Shift: Tous les points restants", - "+Alt: Zurcksetzen, +Shift: Alle verbleibenden Punkte", - "+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti", - "+Alt: Quita, +Shift: Todos los puntos restantes", - "+Alt: Odejmij, +Shift: wszystkie pozostale punkty"); -// "+Alt: ????, +Shift: ???"); +typedef int(__stdcall *p_wSprintStringLastGender)(LPWSTR, int, int); +p_wSprintStringLastGender _wSprintStringLastGender; - LANGUAGE( STR_STATS_BASE_MIN, - "Base: %d (Min: %d)", - "Base: %d (Min: %d)", - "Basiswert: %d (Min: %d)", - "Base: %d (Min: %d)", - "Base: %d (Min: %d)", - "Bazowo: %d (Minimum: %d)"); -// "??: %d(??: %d)"); +int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID) +{ + if (_wSprintStringLastGender == NULL) return 0; + return _wSprintStringLastGender(buf, lenbuf, stringID); +} - LANGUAGE( STR_SKILLS_UNASSIGN, - "Un-allocate all skills points", - "Dsalloue tous les points d'aptitudes", - "Alle Fertigkeitspunkte zurcksetzen", - "Rimuovi tutte le abilit", - "Quita todos los puntos de habilidades", - "Rozdaj od nowa wszystkie punkty umiejetnosci"); -// "????????"); +typedef LPWSTR(__fastcall *p_cutStringGender)(LPWSTR); +p_cutStringGender _cutStringGender; - LANGUAGE( STR_STASH_PREVIOUS_PAGE, - "Previous Page (+shift: First Page)", - "Page prcdente (+shift: Premire page)", - "Vorherige Seite (+shift: Erste Seite)", - "Pagina Precedente (+shift: Prima Pagina)", - "Pagina anterior (+shift: Primera Pagina)", - "Poprzednia Strona (+shift: Pierwsza Strona)"); -// "??? (+shift: ??)"); +LPWSTR cutStringGender(LPWSTR str) +{ + if (_cutStringGender == NULL) return str; + return _cutStringGender(str); +} - LANGUAGE( STR_STASH_NEXT_PAGE, - "Next Page (+shift: Last not empty Page)", - "Page suivante (+shift: Dernire page non vide)", - "Nchste Seite (+shift: Letzte nicht leere Seite )", - "Pagina Successiva (+shift: Ultima Pagina non vuota)", - "Pagina Siguiente (+shift: Ultima pagina non vacia)", - "Nastepna Strona (+shift: Ostatnia nie pusta Strona)"); -// "??? (+shift: ?????"); +typedef LPWSTR(__fastcall *p_setMonoString)(LPWSTR); +p_setMonoString _setMonoString; - LANGUAGE( STR_TOGGLE_TO_PERSONAL, - "Toggle to Personal Stash", - "Voir coffre personnel", - "Wechselt zum persnlichen Goldschatz", - "Vai all'Inventario Personale", - "Ver el cofre personal", - "Przejdz do Skrzyni Osobistej"); -// "????????"); - - LANGUAGE( STR_TOGGLE_TO_SHARED, - "Toggle to Shared Stash", - "Voir coffre partag", - "Wechselt zum gemeinsamen Goldschatz", - "Vai all'Inventario Condiviso", - "Ver el cofre compartido", - "Przejdz do Skrzyni Wsplnej"); -// "????????"); - - LANGUAGE( STR_STASH_PREVIOUS_INDEX, - "Previous Index : by %d Pages (+Shift: %d)", - "Index prcdent : par %d pages (+shift: %d)", - "Vorheriger Index: in %d Seiten (+shift: %d)", - "Schermata Precedente : Indietro di %d Pagine (+Shift: %d)", - "Indice anterior : por %d paginas (+shift: %d)", - "Poprzednia Strona : po %d Stron (+Shift: %d)"); -// "???? : %d ? (+Shift:%d)"); - - LANGUAGE( STR_STASH_NEXT_INDEX, - "Next Index : by %d Pages (+shift: %d)", - "Index suivant : par %d pages (+shift: %d)", - "Nchster Index: in %d Seiten (+shift: %d)", - "Schermata Successiva : Avanti di %d Pagine (+shift: %d)", - "Indice siguiente : por %d paginas (+shift: %d)", - "Nastepna Strona : po %d Stron (+shift: %d)"); -// "???? : %d ? (+shift:%d)"); - - LANGUAGE( STR_PUT_GOLD, - "Put Gold", - "Poser de l'Or", - "Gib Gold", - "Immetti Oro", - "Poner oro", - "Zdeponuj Zloto"); -// "????"); - - LANGUAGE( STR_TAKE_GOLD, - "Take Gold", - "Prendre de l'Or", - "Nehme Gold", - "Ritira Oro", - "Tomar oro", - "Wyplac zloto"); -// "????"); - - LANGUAGE( STR_PERSONAL_PAGE_NUMBER, - "Personal Page n%u", - "Page perso n%u", - "Persnliche Seite n%u", - "Pagina Personale n%u", - "Pagina personal n%u", - "Strona Osobista n%u"); -// "????? n%u"); - - LANGUAGE( STR_SHARED_PAGE_NUMBER, - "Shared Page n%u", - "Page partage n%u", - "Gemeinsame Seite n%u", - "Pagina Condivisa n%u", - "Pagina personal n%u", - "Strona Wsplna n%u"); -// "????? n%u"); - - LANGUAGE( STR_NO_SELECTED_PAGE, - "No selected page", - "Aucune page slectionne", - "Keine ausgewhlte Seite", - "Nessuna pagina selezionata", - "Ninguna pagina seleccionada", - "Nie zaznaczono strony"); -// "????"); - - LANGUAGE( STR_SHARED_GOLD_QUANTITY, - "Shared Gold : %u", - "Or partag : %u", - "Gemeinsamen Gold : %u", - "Oro Condiviso : %u", - "Oro compartido : %u", - "Wsplne Zloto : %u"); -// "????: %u"); - - LANGUAGE( STR_PREVIOUS_PAGE, - "Previous Page", - "Page prcdente", - "Vorherige Seite", - "Pagina Precedente", - "Pagina anterior", - "Poprzednia Strona"); -// "???"); - - LANGUAGE( STR_NEXT_PAGE, - "Next Page", - "Page suivante", - "Nchste Seite", - "Pagina Successiva", - "Pagina siguiente", - "Nastepna Strona"); -// "???"); - - default : return L""; - } +LPWSTR setMonoString(LPWSTR str) +{ + if (_setMonoString == NULL) return str; + return _setMonoString(str); } -/*=================================================================*/ +typedef bool(__fastcall *p_initTranslatedString)(int); -const char* SNONE=""; -const char* c_shie[3]={"Shield (Not Class Specific)",SNONE,SNONE}; -const char* c_tors[3]={"Body Armor",SNONE,SNONE}; -const char* c_gold[3]={"Gold",SNONE,SNONE}; -const char* c_bowq[3]={"Arrow",SNONE,SNONE}; -const char* c_xboq[3]={"Bolt",SNONE,SNONE}; -const char* c_play[3]={"Ear",SNONE,SNONE}; -const char* c_herb[3]={"Herb",SNONE,SNONE}; -const char* c_poti[3]={"Potion",SNONE,SNONE}; -const char* c_ring[3]={"Ring",SNONE,SNONE}; -const char* c_elix[3]={"Elixir",SNONE,SNONE}; -const char* c_amul[3]={"Amulet",SNONE,SNONE}; -const char* c_char[3]={"Charm",SNONE,SNONE}; -const char* c_boot[3]={"Boot",SNONE,SNONE}; -const char* c_glov[3]={"Glove",SNONE,SNONE}; -const char* c_book[3]={"Book",SNONE,SNONE}; -const char* c_belt[3]={"Belt",SNONE,SNONE}; -const char* c_gem[3]={"Gem",SNONE,SNONE}; -const char* c_torc[3]={"Torch",SNONE,SNONE}; -const char* c_scro[3]={"Scroll",SNONE,SNONE}; -const char* c_scep[3]={"Scepter",SNONE,SNONE}; -const char* c_wand[3]={"Wand",SNONE,SNONE}; -const char* c_staf[3]={"Staff",SNONE,SNONE}; -const char* c_bow[3]={"Bow",SNONE,SNONE}; -const char* c_axe[3]={"Axe",SNONE,SNONE}; -const char* c_club[3]={"Club",SNONE,SNONE}; -const char* c_swor[3]={"Sword",SNONE,SNONE}; -const char* c_hamm[3]={"Hammer",SNONE,SNONE}; -const char* c_knif[3]={"Knife",SNONE,SNONE}; -const char* c_spea[3]={"Spear",SNONE,SNONE}; -const char* c_pole[3]={"Polearm",SNONE,SNONE}; -const char* c_xbow[3]={"Crossbow",SNONE,SNONE}; -const char* c_mace[3]={"Mace",SNONE,SNONE}; -const char* c_helm[3]={"Helm",SNONE,SNONE}; +HINSTANCE PlugyLocalLib = NULL; -const char* c_tpot[3]={"Missile Potion",SNONE,SNONE}; -const char* c_ques[3]={"Quest Item",SNONE,SNONE}; -const char* c_body[3]={"Body Part",SNONE,SNONE}; -const char* c_key[3]={"Key",SNONE,SNONE}; -const char* c_tkni[3]={"Throwing Knife",SNONE,SNONE}; -const char* c_taxe[3]={"Throwing Axe",SNONE,SNONE}; -const char* c_jave[3]={"Javelin",SNONE,SNONE}; -const char* c_weap[3]={"Weapon",SNONE,SNONE}; -const char* c_mele[3]={"Melee Weapon",SNONE,SNONE}; -const char* c_miss[3]={"Missile Weapon",SNONE,SNONE}; -const char* c_thro[3]={"Throwing Weapon",SNONE,SNONE}; -const char* c_comb[3]={"Combo Weapon",SNONE,SNONE}; -const char* c_armo[3]={"Armor",SNONE,SNONE}; -const char* c_shld[3]={"Any Shield",SNONE,SNONE}; -const char* c_misc[3]={"Miscellaneous",SNONE,SNONE}; -const char* c_sock[3]={"Socket Filler",SNONE,SNONE}; -const char* c_seco[3]={"Second Hand Item",SNONE,SNONE}; -const char* c_rod[3]={"Staves And Rods",SNONE,SNONE}; -const char* c_misl[3]={"Missile",SNONE,SNONE}; -const char* c_blun[3]={"Blunt",SNONE,SNONE}; - -const char* c_jewl[3]={"Jewel",SNONE,SNONE}; -const char* c_clas[3]={"Class Specific",SNONE,SNONE}; -const char* c_amaz[3]={"Amazon Item",SNONE,SNONE}; -const char* c_barb[3]={"Barbarian Item",SNONE,SNONE}; -const char* c_necr[3]={"Necromancer Item",SNONE,SNONE}; -const char* c_pala[3]={"Paladin Item",SNONE,SNONE}; -const char* c_sorc[3]={"Sorceress Item",SNONE,SNONE}; -const char* c_assn[3]={"Assassin Item",SNONE,SNONE}; -const char* c_drui[3]={"Druid Item",SNONE,SNONE}; -const char* c_h2h[3]={"Claw",SNONE,SNONE}; -const char* c_orb[3]={"Orb",SNONE,SNONE}; -const char* c_head[3]={"Voodoo Heads",SNONE,SNONE}; -const char* c_ashd[3]={"Paladin Shield",SNONE,SNONE}; -const char* c_phlm[3]={"Barbarian Helm",SNONE,SNONE}; -const char* c_pelt[3]={"Druid Helm",SNONE,SNONE}; -const char* c_cloa[3]={"Cloak",SNONE,SNONE}; -const char* c_rune[3]={"Rune",SNONE,SNONE}; -const char* c_circ[3]={"Circlet",SNONE,SNONE}; -const char* c_hpot[3]={"Healing Potion",SNONE,SNONE}; -const char* c_mpot[3]={"Mana Potion",SNONE,SNONE}; -const char* c_rpot[3]={"Rejuvenation potion",SNONE,SNONE}; -const char* c_spot[3]={"Stamina Potion",SNONE,SNONE}; -const char* c_apot[3]={"Antidote Potion",SNONE,SNONE}; -const char* c_wpot[3]={"Thawing Potion",SNONE,SNONE}; -const char* c_scha[3]={"Small Charm",SNONE,SNONE}; -const char* c_mcha[3]={"Large Charm",SNONE,SNONE}; -const char* c_lcha[3]={"Grand Charm",SNONE,SNONE}; -const char* c_abow[3]={"Amazon Bow",SNONE,SNONE}; -const char* c_aspe[3]={"Amazon Spear",SNONE,SNONE}; -const char* c_ajav[3]={"Amazon Javelin",SNONE,SNONE}; -const char* c_h2h2[3]={"Assassin Claw",SNONE,SNONE}; -const char* c_mboq[3]={"Magic Arrow",SNONE,SNONE}; -const char* c_mxbq[3]={"Magic Bolt",SNONE,SNONE}; -const char* c_gem0[3]={"Chipped Gem",SNONE,SNONE}; -const char* c_gem1[3]={"Flawed Gem",SNONE,SNONE}; -const char* c_gem2[3]={"Normal Gem",SNONE,SNONE}; -const char* c_gem3[3]={"Flawless Gem",SNONE,SNONE}; -const char* c_gem4[3]={"Perfect Gem",SNONE,SNONE}; -const char* c_gema[3]={"Amethyst",SNONE,SNONE}; -const char* c_gemd[3]={"Diamond",SNONE,SNONE}; -const char* c_geme[3]={"Emerald",SNONE,SNONE}; -const char* c_gemr[3]={"Ruby",SNONE,SNONE}; -const char* c_gems[3]={"Sapphire",SNONE,SNONE}; -const char* c_gemt[3]={"Topaz",SNONE,SNONE}; -const char* c_gemz[3]={"Skull",SNONE,SNONE}; - -const char* getTypeString (DWORD code) +bool initLocaleStrings() { - DWORD lang = 0;//D2GetLang(); - if ((lang == LNG_FRA) || (lang == LNG_DEU)) lang--; - else lang = 0; - switch (code) - { - case BIN('s','h','i','e') : return c_shie[0]; - case BIN('t','o','r','s') : return c_tors[0]; - case BIN('g','o','l','d') : return c_gold[0]; - case BIN('b','o','w','q') : return c_bowq[0]; - case BIN('x','b','o','q') : return c_xboq[0]; - case BIN('p','l','a','y') : return c_play[0]; - case BIN('h','e','r','b') : return c_herb[0]; - case BIN('p','o','t','i') : return c_poti[0]; - case BIN('r','i','n','g') : return c_ring[0]; - case BIN('e','l','i','x') : return c_elix[0]; - case BIN('a','m','u','l') : return c_amul[0]; - case BIN('c','h','a','r') : return c_char[0]; - case BIN('b','o','o','t') : return c_boot[0]; - case BIN('g','l','o','v') : return c_glov[0]; - case BIN('b','o','o','k') : return c_book[0]; - case BIN('b','e','l','t') : return c_belt[0]; - case BIN('g','e','m',' ') : return c_gem[0]; - case BIN('t','o','r','c') : return c_torc[0]; - case BIN('s','c','r','o') : return c_scro[0]; - case BIN('s','c','e','p') : return c_scep[0]; - case BIN('w','a','n','d') : return c_wand[0]; - case BIN('s','t','a','f') : return c_staf[0]; - case BIN('b','o','w',' ') : return c_bow[0]; - case BIN('a','x','e',' ') : return c_axe[0]; - case BIN('c','l','u','b') : return c_club[0]; - case BIN('s','w','o','r') : return c_swor[0]; - case BIN('h','a','m','m') : return c_hamm[0]; - case BIN('k','n','i','f') : return c_knif[0]; - case BIN('s','p','e','a') : return c_spea[0]; - case BIN('p','o','l','e') : return c_pole[0]; - case BIN('x','b','o','w') : return c_xbow[0]; - case BIN('m','a','c','e') : return c_mace[0]; - case BIN('h','e','l','m') : return c_helm[0]; - case BIN('t','p','o','t') : return c_tpot[0]; - case BIN('q','u','e','s') : return c_ques[0]; - case BIN('b','o','d','y') : return c_body[0]; - case BIN('k','e','y',' ') : return c_key[0]; - case BIN('t','k','n','i') : return c_tkni[0]; - case BIN('t','a','x','e') : return c_taxe[0]; - case BIN('j','a','v','e') : return c_jave[0]; - case BIN('w','e','a','p') : return c_weap[0]; - case BIN('m','e','l','e') : return c_mele[0]; - case BIN('m','i','s','s') : return c_miss[0]; - case BIN('t','h','r','o') : return c_thro[0]; - case BIN('c','o','m','b') : return c_comb[0]; - case BIN('a','r','m','o') : return c_armo[0]; - case BIN('s','h','l','d') : return c_shld[0]; - case BIN('m','i','s','c') : return c_misc[0]; - case BIN('s','o','c','k') : return c_sock[0]; - case BIN('s','e','c','o') : return c_seco[0]; - case BIN('r','o','d',' ') : return c_rod[0]; - case BIN('m','i','s','l') : return c_misl[0]; - case BIN('b','l','u','n') : return c_blun[0]; - case BIN('j','e','w','l') : return c_jewl[0]; - case BIN('c','l','a','s') : return c_clas[0]; - case BIN('a','m','a','z') : return c_amaz[0]; - case BIN('b','a','r','b') : return c_barb[0]; - case BIN('n','e','c','r') : return c_necr[0]; - case BIN('p','a','l','a') : return c_pala[0]; - case BIN('s','o','r','c') : return c_sorc[0]; - case BIN('a','s','s','n') : return c_assn[0]; - case BIN('d','r','u','i') : return c_drui[0]; - case BIN('h','2','h',' ') : return c_h2h[0]; - case BIN('h','2','h','2') : return c_h2h2[0]; - case BIN('o','r','b',' ') : return c_orb[0]; - case BIN('h','e','a','d') : return c_head[0]; - case BIN('a','s','h','d') : return c_ashd[0]; - case BIN('p','h','l','m') : return c_phlm[0]; - case BIN('p','e','l','t') : return c_pelt[0]; - case BIN('c','l','o','a') : return c_cloa[0]; - case BIN('r','u','n','e') : return c_rune[0]; - case BIN('c','i','r','c') : return c_circ[0]; - case BIN('h','p','o','t') : return c_hpot[0]; - case BIN('m','p','o','t') : return c_mpot[0]; - case BIN('r','p','o','t') : return c_rpot[0]; - case BIN('s','p','o','t') : return c_spot[0]; - case BIN('a','p','o','t') : return c_apot[0]; - case BIN('w','p','o','t') : return c_wpot[0]; - case BIN('s','c','h','a') : return c_scha[0]; - case BIN('m','c','h','a') : return c_mcha[0]; - case BIN('l','c','h','a') : return c_lcha[0]; - case BIN('a','b','o','w') : return c_abow[0]; - case BIN('a','s','p','e') : return c_aspe[0]; - case BIN('a','j','a','v') : return c_ajav[0]; - case BIN('m','b','o','q') : return c_mboq[0]; - case BIN('m','x','b','q') : return c_mxbq[0]; - case BIN('g','e','m','0') : return c_gem0[0]; - case BIN('g','e','m','1') : return c_gem1[0]; - case BIN('g','e','m','2') : return c_gem2[0]; - case BIN('g','e','m','3') : return c_gem3[0]; - case BIN('g','e','m','4') : return c_gem4[0]; - case BIN('g','e','m','a') : return c_gema[0]; - case BIN('g','e','m','d') : return c_gemd[0]; - case BIN('g','e','m','e') : return c_geme[0]; - case BIN('g','e','m','r') : return c_gemr[0]; - case BIN('g','e','m','s') : return c_gems[0]; - case BIN('g','e','m','t') : return c_gemt[0]; - case BIN('g','e','m','z') : return c_gemz[0]; - default: return NULL; - } + p_initTranslatedString initTranslatedString; + + PlugyLocalLib = LoadLibrary(sPlugyExt); + + if (PlugyLocalLib != NULL) + { + log_msg("Loading PlugYLocal.dll\n"); + initTranslatedString = (p_initTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall initTranslatedString"); + if (NULL != initTranslatedString) + { + log_msg("Loading local strings from PlugYLocal.ini\n"); + + _UCS2toUTF8 = (p_UCS2toUTF8)GetProcAddress(PlugyLocalLib, "__stdcall UCS2toUTF8"); + _UTF8toUCS2 = (p_UTF8toUCS2)GetProcAddress(PlugyLocalLib, "__stdcall UTF8toUCS2"); + + _getTypeString = (p_getTypeString)GetProcAddress(PlugyLocalLib, "__fastcall getTypeString"); + _cutStringGender = (p_cutStringGender)GetProcAddress(PlugyLocalLib, "__fastcall cutStringGender"); + _wSprintStringLastGender = (p_wSprintStringLastGender)GetProcAddress(PlugyLocalLib, "__stdcall wSprintStringLastGender"); + _setMonoString = (p_setMonoString)GetProcAddress(PlugyLocalLib, "__fastcall setMonoString"); + + _getTranslatedString = (p_getTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall getTranslatedString"); + if ((NULL != _getTranslatedString) && + (NULL != _getTypeString)) + { + initTranslatedString(D2GetLang()); + return true; + } + log_msg("Failed loading local strings\n"); + } + + if (FreeLibrary(PlugyLocalLib)) + { + PlugyLocalLib = NULL; + } + } else log_msg("Failed loading PlugYLocal.dll\n"); + return false; } -char* getTypeAString (WORD id, char* lpText, DWORD size) +void freeLocaleStrings() { - ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id); - if (!itemTypeData) - { - strncpy(lpText, "Bad Type", size); - return lpText; - } - - const char* string = getTypeString(itemTypeData->code); - if (!string) - { - struct { - DWORD code; - BYTE zero; - } code; - code.code = itemTypeData->code; - code.zero = 0; - strncpy(lpText, (char*)&code, size); - } else - strncpy(lpText, string, size); - - return lpText; + if (PlugyLocalLib == NULL) return; + FreeLibrary(PlugyLocalLib); } LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size) @@ -468,22 +147,35 @@ LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size) ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id); if (!itemTypeData) { - mbstowcs(lpText, "Bad Type", size); + wcsncpy(lpText, L"Bad Type", size); return lpText; } - const char* string = getTypeString(itemTypeData->code); + char* idxstr; + LPWSTR string = getTypeString(itemTypeData->code, &idxstr); + + if (idxstr) + { + LPWSTR string2 = D2GetStringFromString(idxstr); + if (string2) + { + wcsncpy(lpText, string2, size); + return lpText; + } + } if (!string) { struct { DWORD code; BYTE zero; - } code; + } code; code.code = itemTypeData->code; code.zero = 0; - mbstowcs(lpText, (char*)&code, size); + UTF8toUCS2(lpText,size, (char*)&code, 0xFFFF); } else - mbstowcs(lpText, string, size); - + wcsncpy(lpText, string, size); return lpText; } + + + /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/D2functions.cpp b/PlugY/D2functions.cpp index 753de83..4203e21 100644 --- a/PlugY/D2functions.cpp +++ b/PlugY/D2functions.cpp @@ -1,5 +1,6 @@ /*================================================ File created by Yohann NICOLAS. + *Add support 1.13d by L'Autour. This file implements some common and useful function related to some Diablo II mechanisms. @@ -16,9 +17,9 @@ #define E2S(F, A, R, N, P) T##N N; #define E2F(F, A, R, N, P) T##N N; #define E2C(F, A, T, N) T* pt##N; -#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N; -#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N; -#define C7(Z, A,B,C,D,E,F,G, T, N) T* pt##N; +#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N; +#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N; +#define C7(Z, A,B,C,D,E,F,G,H, T, N) T* pt##N; #include "../Commons/D2Funcs.h" DataTables* SgptDataTables; @@ -616,12 +617,12 @@ bool initD2functions() #define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A); #define E2F(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A); #define E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A); - #define F7(X, Z, A,B,C,D,E,F,G, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113? G : (version_##Z == V112? F : version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A))))))); - #define A7(X, Z, A,B,C,D,E,F,G, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G); - #define C7(Z, A,B,C,D,E,F,G, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G); + #define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A))))))))); + #define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G,H); + #define C7(Z, A,B,C,D,E,F,G,H, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G,H); #include "../Commons/D2Funcs.h" - SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C); + SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0); if (version_D2Common < V110) { D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09 @@ -915,10 +916,10 @@ bool initD2functions() D2GetClientPlayer = D2GetClientPlayer_111; D2GetRealItem = D2GetRealItem_111; D2CleanStatMouseUp = D2CleanStatMouseUp_111; - StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC); - StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0); - StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8); - StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC); + StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224); + StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228); + StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240); + StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244); } else { D2SendToServer = (TD2SendToServer) D2SendToServer_1XX; D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX; @@ -946,16 +947,16 @@ bool initD2functions() //////////////// STRUCTURE MANAGEMENT //////////////// - + //L'Autour - ?????? // shifting.ptPYPlayerData = V7(D2Common,118,118,F4,F4,F4,F4,F4); - shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49)); - shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14); - shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80); - shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8); - shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60); - shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8); - shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34); - shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00); + shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49,49)); + shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14,14); + shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80,80); + shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8,1A8); + shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60,60); + shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8,A8); + shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34,34); + shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00,00); return true; } diff --git a/PlugY/D2wrapper.cpp b/PlugY/D2wrapper.cpp index 7552405..649e5e0 100644 --- a/PlugY/D2wrapper.cpp +++ b/PlugY/D2wrapper.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. @file D2wrapper.cpp @brief Main Diablo II extra DLL handler. @@ -31,26 +32,27 @@ #include "uberQuest.h" // Install_UberQuest() #include "extraOptions.h" // Install_AlwaysRegenMapInSP() #include "language.h" // Install_LanguageManagement() +#include "../Commons/VersionInfo.h" - -int version_SmackW32=V113; -int version_D2Common=V113; -int version_ijl11=V113; -int version_D2Gdi=V113; -int version_D2Win=V113; -int version_D2sound=V113; -int version_D2MCPCLI=V113; -int version_D2Launch=V113; -int version_D2gfx=V113; -int version_D2Client=V113; -int version_D2Net=V113; -int version_D2Lang=V113; -int version_D2Game=V113; -int version_D2CMP=V113; -int version_Bnclient=V113; -int version_Fog=V113; -int version_Storm=V113; - +//------------------------- +int version_SmackW32=V113d; +int version_D2Common=V113d; +int version_ijl11=V113d; +int version_D2Gdi=V113d; +int version_D2Win=V113d; +int version_D2sound=V113d; +int version_D2MCPCLI=V113d; +int version_D2Launch=V113d; +int version_D2gfx=V113d; +int version_D2Client=V113d; +int version_D2Net=V113d; +int version_D2Lang=V113d; +int version_D2Game=V113d; +int version_D2CMP=V113d; +int version_Bnclient=V113d; +int version_Fog=V113d; +int version_Storm=V113d; +//------------------------- DWORD offset_SmackW32=NULL; DWORD offset_D2Common=NULL; @@ -375,6 +377,7 @@ bool initD2version() } */ +/* void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113, const char * filename) { log_msg("version of %s\t",filename); @@ -432,6 +435,47 @@ bool initD2version() log_msg("\n\n"); return true; } +*/ + +const char sD2Ver[8][7] = {{"v1.09b"},{"v1.09d"},{"v1.10 "},{"v1.11 "},{"v1.11b"},{"v1.12 "},{"v1.13c"},{"v1.13d"}}; + +bool initD2version() +{ + char currentpath[MAX_PATH]; + if (! GetD2Path(currentpath, MAX_PATH)) + { + log_msg("Path to Game.exe not found"); + return false; + } + log_msg("***** Get Game.exe version *****\n"); + + int ver = GetD2Version(currentpath); + if (ver == -1) return false; + //-------------------- + version_SmackW32=ver; + version_D2Common=ver; + version_ijl11=ver; + version_D2Gdi=ver; + version_D2Win=ver; + version_D2sound=ver; + version_D2MCPCLI=ver; + version_D2Launch=ver; + version_D2gfx=ver; + version_D2Client=ver; + version_D2Net=ver; + version_D2Lang=ver; + version_D2Game=ver; + version_D2CMP=ver; + version_Bnclient=ver; + version_Fog=ver; + version_Storm=ver; + //------------------- + log_msg("version Game.exe - "); + log_msg(sD2Ver[ver]); + log_msg("\n"); + + return true; +} //////////////////////////////////// EXPORTS FUNCTIONS //////////////////////////////////// extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) @@ -445,7 +489,12 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) loadD2Libraries(); - if (!initD2version()) return NULL; + if (!initD2version()) + { + log_msg("wrong G ame.exe version\n"); + return NULL; + } + if (!initD2functions()) return NULL; @@ -539,6 +588,10 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) unhookLibraries(); + log_msg("\n*****Loading locale strings.*****\n"); + initLocaleStrings(); + log_msg("\n\n\n"); + initCustomLibraries(); log_msg("***** ENTERING DIABLO II *****\n\n" ); @@ -555,6 +608,7 @@ extern "C" __declspec(dllexport) bool __stdcall Release() log_msg("\n***** ENDING DIABLO II *****\n\n" ); freeCustomLibraries(); + freeLocaleStrings(); freeD2Libraries(); return true; } diff --git a/PlugY/ExtraOptions.cpp b/PlugY/ExtraOptions.cpp index e8d6cc3..44b0500 100644 --- a/PlugY/ExtraOptions.cpp +++ b/PlugY/ExtraOptions.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. More little options. @@ -26,7 +27,9 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem) { if (onRealm && (selectModParam==MOD_NO)) return; WCHAR text[0x50]; - swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem)); + //swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem)); + swprintf(text, getTranslatedString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem)); + wcscat(text,L"\n"); D2SetColorPopup(text,WHITE); wcscat(popup,text); } @@ -139,17 +142,18 @@ void Install_DisplayItemLevel() log_msg("Patch D2Client for display item popup. (DisplayPopup)\n"); // print the text in the final buffer - mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0); + mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590); memt_byte( 0x68 , 0xE8); - MEMT_REF4( 0x100, version_D2Client >= V113 ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); + MEMT_REF4( 0x100, version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); //6FAE38A1 . 68 00010000 PUSH 100 //6FB5DD0A |. 68 00010000 PUSH 100 //6FB289DA |. 68 00010000 PUSH 100 //6FB5E0AA |. 68 00010000 PUSH 100 //6FB441C0 |. 68 00010000 PUSH 100 + //6FB48590 |. 68 00010000 PUSH 100 // print the text in the final buffer (for set items) - mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3); + mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3); memt_byte( 0x68 , 0xE8); MEMT_REF4( 0x100, version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9); //6FAE27BE . 68 00010000 PUSH 100 @@ -157,6 +161,7 @@ void Install_DisplayItemLevel() //6FB27773 |. 68 00010000 PUSH 100 //6FB5CEB3 |. 68 00010000 PUSH 100 //6FB42FE3 |. 68 00010000 PUSH 100 + //6FB473B3 |. 68 00010000 PUSH 100 log_msg("\n"); @@ -208,12 +213,12 @@ void Install_SendPlayersCommand() log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n"); - infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394); + infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC); if ( version_D2Client >= V110 ) - msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00); + msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C); // Set nb Player to default - mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2);//6FB1C7B7-6FAA0000 + mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2);//6FB1C7B7-6FAA0000 MEMJ_REF4( D2GetResolution , caller_SendPlayersCommand); //6FB2723A |. E8 7D8E0300 CALL //6FB265BA |. E8 7D8E0300 CALL @@ -222,6 +227,7 @@ void Install_SendPlayersCommand() //6FB16A01 |. E8 AA65FAFF CALL //6FB40161 |. E8 1ECFF7FF CALL //6FB739F1 |. E8 B896F4FF CALL + //6FACD3F1 |. E8 EAFBFEFF CALL log_msg("\n"); @@ -239,13 +245,14 @@ void Install_AlwaysRegenMapInSP() log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n"); // Always regenerate maps in Single player - mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE); + mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E); memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368 //6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93 //01FE235D |. 74 09 JE SHORT D2Game.01FE2368 //01F9966D |. 74 09 JE SHORT D2Game.01F99678 //6FC3E1FE |. 74 09 JE SHORT D2Game.6FC3E209 //6FD0D3BE |. 74 09 JE SHORT D2Game.6FD0D3C9 + //6FC46D7E |. 74 09 JE SHORT D2Game.6FC46D89 log_msg("\n"); @@ -262,11 +269,12 @@ void Install_RunLODs() log_msg("Patch D2gfx for launch any number of Diablo II game in the same computer. (RunLODs)\n"); // execute if it's our packet else continue - mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF); + mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF, B6B0); memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6 //6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6 //6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996 //6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606 + //6FA8B6B0 |. 74 45 JE SHORT D2gfx.6FA8B6F7 log_msg("\n"); @@ -381,9 +389,9 @@ void Install_AlwaysDisplayLifeMana() log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n"); - if ( version_D2Client >= V113 ) + if ( version_D2Client >= V113c ) { - mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A); + mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA); memt_byte( 0x0F , 0x90); memt_byte( 0x8C , 0xE8); MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113); @@ -393,10 +401,13 @@ void Install_AlwaysDisplayLifeMana() //6FAD7659 |. A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] //6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711 + //-- + //6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1 + } else { // Always display life. - mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000); + mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000); memt_byte( 0xA1 , 0xE8); MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife); //6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60] @@ -406,13 +417,13 @@ void Install_AlwaysDisplayLifeMana() // Always display mana. - if ( version_D2Client >= V113 ) + if ( version_D2Client >= V113c ) { //mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711); //memt_byte( 0x8B , 0x90); //memt_byte( 0x0D , 0xE8); //MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113); - mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C); + mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC); memt_byte( 0xA1 , 0xE8); MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113); //6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] @@ -426,10 +437,12 @@ void Install_AlwaysDisplayLifeMana() //6FAD77CA |. 5B POP EBX //6FAD77CB |. 81C4 28030000 ADD ESP,328 //6FAD77D1 \. C3 RETN + //-- + //6FB1D7BC |> A1 3870BA6F MOV EAX,DWORD PTR DS:[6FB8BC4C] } else if ( version_D2Client >= V110 ) { - mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000); + mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000, 0000); memt_byte( 0x5F , 0xE8); MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana); memt_byte( 0xC4 , 0x90); // NOP @@ -454,7 +467,7 @@ void Install_AlwaysDisplayLifeMana() //6FB3181F |. 81C4 5C020000 ADD ESP,25C //6FB31825 |. C3 RETN } else { - mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xE9 , 0xE8); MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9); //6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0 @@ -539,23 +552,25 @@ void Install_DisplayBaseStatsValue() log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n"); // Always print stat button images. - mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5); + mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 - memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) ); + memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( 0x24, 0x90 ); // NOP - memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] + //6FB6F955 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] - mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E); + mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); MEMJ_REF4( D2PrintImage, caller_displayBaseStatsValue); //6FB32C53 . E8 82A3F8FF CALL //6FB396D3 . E8 D238F8FF CALL //6FB1B636 . E8 431AFAFF CALL //6FB6D23D |. E8 54FEF4FF |CALL + //6FB6F9DD |. E8 54FEF4FF |CALL log_msg("\n"); @@ -583,13 +598,14 @@ void Install_LadderRunewords() log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n"); - mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2); + mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782); MEMC_REF4( D2CompileTxtFile, compileRunesTxt); //01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578 //6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653 //6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496 //6FDAD491 |. E8 BA49FEFF CALL D2Common.#10244 ; \#10244 //6FDC24B1 |. E8 8ACAFEFF CALL D2Common.#10849 ; \#10849 + //6FDB3781 |. E8 5A93FAFF CALL D2Common.#10037 ; \#10037 log_msg("\n"); @@ -607,7 +623,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill() log_msg("Patch D2Game for enabled the opening of Cow Portal when player have already kill the cow king in that difficulty. (EnabledCowPortalWhenCowKingWasKill)\n"); - mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508); + mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508, EBE8); memt_byte( 0x85 , 0x33); // XOR EAX,EAX //6FC8DFF7 . 85C0 TEST EAX,EAX //6FC8E457 . 85C0 TEST EAX,EAX @@ -616,6 +632,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill() //01FEDB68 |. 85C0 TEST EAX,EAX //6FC95C68 |. 85C0 TEST EAX,EAX //6FC87508 |. 85C0 TEST EAX,EAX + //6FC2EBE8 |. 85C0 TEST EAX,EAX log_msg("\n"); diff --git a/PlugY/GlobalVariable.cpp b/PlugY/GlobalVariable.cpp index a302a26..7d7d29d 100644 --- a/PlugY/GlobalVariable.cpp +++ b/PlugY/GlobalVariable.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -101,7 +102,7 @@ void Install_VariableOnRealm() log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n"); // click on Battle.net button - mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295); + mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295, 11C65); memt_byte( 0x81, 0xE8 ); // CALL MEMT_REF4( 0x000400EC, caller_BnetBtnPress); memt_byte( 0x00, 0x90 ); // NOP @@ -114,7 +115,7 @@ void Install_VariableOnRealm() //6FA1EFFC . B8 01000000 MOV EAX,1 // click on TCP/IP button - mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E); + mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E); if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110) { memt_byte( 0xBD, 0xE8 ); // CALL @@ -126,7 +127,7 @@ void Install_VariableOnRealm() } // click on SinglePlayer button - mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36); + mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36, A906); memt_byte( 0xBA, 0xE8 ); // CALL MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress); //6FA4B726 . BA 00040000 MOV EDX,400 @@ -135,7 +136,7 @@ void Install_VariableOnRealm() { log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n"); //Bug crash ptClient search fix (for Megalixir Mod). - mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x39 ,0xE8); MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug); memt_byte( 0xC1 ,0x90); diff --git a/PlugY/InfinityStash.cpp b/PlugY/InfinityStash.cpp index 97f80a1..f30c0c2 100644 --- a/PlugY/InfinityStash.cpp +++ b/PlugY/InfinityStash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Gestion of the infinity and shared Stash. @@ -80,7 +81,7 @@ Stash* newStash(DWORD id) d2_assert( id == 0xFFFFFFFF , "trop de stash", __FILE__, __LINE__); Stash* stash = (Stash*)malloc(sizeof(Stash));//D2AllocMem(memPool, sizeof(Stash),__FILE__,__LINE__,0); - d2_assert(!stash , "pb de gnration de stash", __FILE__, __LINE__); + d2_assert(!stash , "pb de generation de stash", __FILE__, __LINE__); ZeroMemory(stash, sizeof(Stash)); stash->id = id; @@ -804,42 +805,45 @@ void Install_MultiPageStash() log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n"); // Cannot put 2 items carry1 in inventory - mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3); + mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013); MEMJ_REF4( D2ItemSetPage , version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit); //6FC8504F . E8 94670900 CALL //01FD7CA2 . E8 6329FBFF CALL //01F9FE62 . E8 47A8FDFF CALL //6FCB9B02 . E8 9709F7FF CALL //6FCEF1E2 . E8 47B7F3FF CALL + //6FC8B012 . E8 13F7F9FF CALL // Cannot put 2 items carry1 in inventory by swapping - mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8); + mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78); MEMJ_REF4( D2ItemGetPage , version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap); //6FC858D8 . E8 175F0900 CALL //01FD8967 . E8 8E1DFBFF CALL //01FA10E7 . E8 9A96FDFF CALL //6FCBB6E7 . E8 CAEDF6FF CALL //6FCF10C7 . E8 F895F3FF CALL + //6FC8BC77 . E8 22E9F9FF CALL if ( version_D2Game >= V111 ) { // Cannot put 2 items carry1 in inventory when drop cube - mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75); + mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15); MEMJ_REF4( D2CanPutItemInInv , caller_carry1LimitWhenDrop_111); //01FBD934 |. E8 5BD3FCFF |CALL //01FB9FD4 |. E8 3912FCFF |CALL //6FC37AD4 |. E8 0535FFFF |CALL //6FCF7B74 |. E8 232FF3FF |CALL + //6FCD7B14 |. E8 7D32F5FF |CALL } else { // Cannot put 2 items carry1 in inventory when drop cube - mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xBA ,0xE8); MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop); //6FC44341 |. BA 06080000 |MOV EDX,806 } // Verif only carry1 out of stash page when pick up an item - mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B); + mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B); memt_byte( 0x8B ,0xE8); MEMT_REF4( version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash); memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90); @@ -853,6 +857,8 @@ void Install_MultiPageStash() //6FC3209F |. 85F6 |TEST ESI,ESI //6FCF211B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] //6FCF211F |. 85F6 |TEST ESI,ESI + //6FCD301B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] + //6FCD301F |. 85F6 |TEST ESI,ESI log_msg("\n"); } diff --git a/PlugY/Interface_Skills.cpp b/PlugY/Interface_Skills.cpp index a3a99f0..20177b6 100644 --- a/PlugY/Interface_Skills.cpp +++ b/PlugY/Interface_Skills.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -36,7 +37,7 @@ void STDCALL printSkillsPageBtns() if ( isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) { - LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN); + LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN); D2PrintPopup(popupText, getXSkillBtn()+getLSkillBtn()/2, getYSkillBtn()-getHSkillBtn(), 0, 1); } } @@ -140,7 +141,7 @@ void Install_InterfaceSkills() log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n"); // Print new buttons images - mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20); + mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380); memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns if ( version_D2Client >= V111 ) { MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111); @@ -164,6 +165,11 @@ void Install_InterfaceSkills() //6FB27F22 |. 5B POP EBX //6FB27F23 \. C3 RETN //6FB27F24 CC INT3 + //6FADF380 |> 5F POP EDI + //6FADF381 |. 5E POP ESI + //6FADF382 |. 5B POP EBX + //6FADF383 \. C3 RETN + //6FADF384 CC INT3 } else { MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns); memt_byte( 0xC4, 0x90 ); // NOP @@ -180,7 +186,7 @@ void Install_InterfaceSkills() if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1) { // Don't print "Skill Points Remaining" - mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334); + mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4); memt_byte( 0xB9, 0xE8 ); MEMT_REF4( 0x00001083, version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining); //6FB17080 /$ B9 83100000 MOV ECX,1083 @@ -188,10 +194,11 @@ void Install_InterfaceSkills() //6FB3AC74 |. B9 83100000 MOV ECX,1083 //6FB2ECF4 |. B9 83100000 MOV ECX,1083 //6FB28334 |. B9 83100000 MOV ECX,1083 + //6FADF7E4 |. B9 83100000 MOV ECX,1083 } // Manage mouse down (Play sound) - mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62); + mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112); memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown); memt_byte( 0x00, 0x90 ); // NOP @@ -199,17 +206,19 @@ void Install_InterfaceSkills() //6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0 //6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 //6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 - //6FB308B2 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0 - //6FB29C62 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0 + //6FB308B2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 + //6FB29C62 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 + //6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 // Manage mouse up - mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8); + mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8); MEMJ_REF4( D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A //6FB18465 . E8 C07D0400 CALL //6FAC7557 .^E9 4248FFFF JMP //6FB3C077 .^E9 16FDF7FF JMP //6FB30247 .^E9 2CBCF8FF JMP //6FB295F7 .^E9 8828F9FF JMP + //6FAE0AA7 .^E9 E0B2FDFF JMP log_msg("\n"); diff --git a/PlugY/Interface_Stash.cpp b/PlugY/Interface_Stash.cpp index f59f2a9..f97172f 100644 --- a/PlugY/Interface_Stash.cpp +++ b/PlugY/Interface_Stash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface stats page functions @@ -450,43 +451,47 @@ void Install_InterfaceStash() log_msg("Patch D2Client for stash interface. (InterfaceStash)\n"); // Print button images - mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56); + mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26); MEMC_REF4( D2LoadBuySelBtn, printBtns); //6FADF398 |. E8 734D0400 CALL D2Client.6FB24110 //6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0 //6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0 //6FB63655 |. E8 9682FDFF CALL D2Client.6FB3B8F0 //6FB49A55 |. E8 96500200 CALL D2Client.6FB6EAF0 + //6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0 // print page number - mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33); + mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03); MEMJ_REF4( D2PrintString, printPageNumber); //6FADF374 |. E8 3FCC0800 CALL //6FB60FE2 |. E8 99C2F5FF CALL //6FB2DF62 |. E8 19F3F8FF CALL //6FB63632 |. E8 299DF5FF CALL - //6FB49A32 |. E8 4739F7FF CALL + //6FB49A32 |. E8 91F4F6FF CALL + //6FB4DE02 |. E8 4739F7FF CALL // Manage mouse down (Play sound) - mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6); + mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76); MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown); //6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080 //6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520 //6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0 //6FB654A5 . E8 9611FFFF CALL D2Client.6FB56640 //6FB4B8A5 . E8 5614FFFF CALL D2Client.6FB3CD00 + //6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10 // Manage mouse up - mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9); + mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9); MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp); //6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080 //6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520 //6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0 //6FB652D8 > E8 6313FFFF CALL D2Client.6FB56640 //6FB4B6D8 > E8 2316FFFF CALL D2Client.6FB3CD00 + //6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10 // init state of button on open stash page - mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A); + mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A); memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates MEMT_REF4( 0x000104C4, initBtnsStates); memt_byte( 0x00, 0x90 ); @@ -497,24 +502,27 @@ void Install_InterfaceStash() //6FB249DA |> 81C4 04010000 ADD ESP,104 //6FB59D9A |> 81C4 04010000 ADD ESP,104 //6FB3CC3A |> 81C4 04010000 ADD ESP,104 + //6FB4441A |> 81C4 04010000 ADD ESP,104 // init the search of print in green the item set name we have in stash - mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434); + mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24); MEMJ_REF4( D2InventoryGetFirstItem, initGetNextItemForSet); //6FAE5996 |. E8 D5500800 CALL //6FB571F3 |. E8 D64EF6FF CALL //6FB21F63 |. E8 96A1F9FF CALL //6FB57313 |. E8 8250F6FF CALL //6FB3D433 |. E8 B8F0F7FF CALL + //6FB41A23 |. E8 96A7F7FF CALL // Get next item for print in green the item set name we have in stash - mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB); + mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB); MEMJ_REF4( D2UnitGetNextItem, getNextItemForSet); //6FAE5A1B E8 4A500800 CALL //6FB5728A |. E8 0B4FF6FF |CALL //6FB21FFA |. E8 A1A1F9FF |CALL //6FB573AA |. E8 7550F6FF |CALL //6FB3D4CA |. E8 99F0F7FF |CALL + //6FB41ABA |. E8 A3A8F7FF |CALL log_msg("\n"); diff --git a/PlugY/Interface_Stats.cpp b/PlugY/Interface_Stats.cpp index b95c7ac..43996ef 100644 --- a/PlugY/Interface_Stats.cpp +++ b/PlugY/Interface_Stats.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -48,17 +49,17 @@ void STDCALL printStatsPageBtns() sDrawImageInfo data; ZeroMemory(&data,sizeof(data)); - + if (printBackgroundOnMainPage && D2GetResolution()) - { + { setImage(&data, statsBackgroundImages); - setFrame(&data, 1); + setFrame(&data, 1); D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0); } - + setImage(&data, D2LoadBuySelBtn()); if (D2GetResolution()) - { + { setFrame(&data, 12 + isDownBtn.previousPage); D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0); } @@ -67,12 +68,12 @@ void STDCALL printStatsPageBtns() D2SetFont(1); if (D2GetResolution() && isOnPreviousPageBtn(mx,my)) //print popup "previous page" - { + { lpText = getTranslatedString(STR_PREVIOUS_PAGE); D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1); } else if ( isOnNextPageBtn(mx,my)) - { + { lpText = getTranslatedString(STR_NEXT_PAGE); D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1); } @@ -245,7 +246,7 @@ void Install_InterfaceStats() log_msg("Patch D2Client for stats interface. (InterfaceStats)\n"); // Print new buttons images - mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16); + mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6); memt_byte( 0x5F, 0xE9 ); // JMP MEMT_REF4( 0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9); //6FAD0F86 . 5F POP EDI @@ -278,34 +279,41 @@ void Install_InterfaceStats() //6FB6DC19 |. 5B POP EBX //6FB6DC1A |. 81C4 70030000 ADD ESP,370 //6FB6DC20 \. C3 RETN - + //6FB703B6 |. 5F POP EDI + //6FB703B7 |. 5E POP ESI + //6FB703B8 |. 5D POP EBP + //6FB703B9 |. 5B POP EBX + //6FB703BA |. 81C4 70030000 ADD ESP,370 + //6FB7030 \. C3 RETN if ( version_D2Client >= V111 ) { // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8); + mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568); memt_byte( 0xA1, 0xE8 ); MEMT_REF4( ptptClientChar, caller_statsPageMouseDown); //6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB6CDC8 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC] + //6FB6F568 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] // Manage mouse up - mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33); + mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3); memt_byte( 0xA1, 0xE8 ); MEMT_REF4( ptptClientChar, caller_statsPageMouseUp); //6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB6DE33 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC] + //6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] } else { // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000); + mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000); MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown); //6FAD133C . E8 8F700500 CALL D2Client.6FB283D0 // Manage mouse up - mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000); + mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000); MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2 //6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0 } diff --git a/PlugY/LoadPlayerData.cpp b/PlugY/LoadPlayerData.cpp index 5636bec..f96d7d4 100644 --- a/PlugY/LoadPlayerData.cpp +++ b/PlugY/LoadPlayerData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Load Player Custom Data. @@ -476,7 +477,7 @@ void Install_LoadPlayerData() log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n"); // Load SP player custom data. - mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D); + mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD); memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData MEMT_REF4( 0x75F685F0 , caller_LoadSPPlayerCustomData); memt_byte( 0x16, 0x90); // NOP @@ -495,9 +496,12 @@ void Install_LoadPlayerData() //6FC7638D |> 8BF0 MOV ESI,EAX //6FC7638F |. 85F6 TEST ESI,ESI //6FC76391 |. 75 16 JNZ SHORT D2Game.6FC763A9 + //6FC5BCCD |> 8BF0 MOV ESI,EAX + //6FC5BCCF |. 85F6 TEST ESI,ESI + //6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9 // Load MP player custom data. - mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217); + mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57); memt_byte( 0x83, 0xE8); MEMT_REF4( version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9); //6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0 @@ -510,18 +514,21 @@ void Install_LoadPlayerData() //6FC6644A |. 74 21 JE SHORT D2Game.6FC6646D //6FC76217 |> 833B 00 CMP DWORD PTR DS:[EBX],0 //6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D + //6FC5BB57 |> 833B 00 CMP DWORD PTR DS:[EBX],0 + //6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D // Send save files to Server. - mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C); + mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C); MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles); //6FAAD5A1 |. E8 88D10B00 CALL //6FB233FB |. E8 CA8AF9FF CALL //6FB0DFDB |. E8 C6DEFAFF CALL //6FB2933B |. E8 6A2CF9FF CALL //6FAC457B |. E8 187AFFFF CALL + //6FB6638B |. E8 2E5BF5FF CALL // Receive save files from client. - mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39); + mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9); memt_byte( 0x8B ,0xE8); if ( version_D2Game >= V111 ) { MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111); @@ -535,6 +542,8 @@ void Install_LoadPlayerData() //6FC824DC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] //6FCEAF39 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP] //6FCEAF3C |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] + //6FCF53E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP] + //6FCF53EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] } else { MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles); //6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI] @@ -543,7 +552,7 @@ void Install_LoadPlayerData() if ( version_Fog <= V109d ) { - mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x8B ,0xE8); MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d); memt_byte( 0x44 ,0x90); diff --git a/PlugY/MainScreen.cpp b/PlugY/MainScreen.cpp index b024f23..fa18aef 100644 --- a/PlugY/MainScreen.cpp +++ b/PlugY/MainScreen.cpp @@ -1,5 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. + Add "plugY v1.00" on screen. @@ -46,7 +48,7 @@ void Install_PrintPlugYVersion() log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n"); // Print PlugY version. - mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061); + mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11); MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion); //6FA19638 |. E8 1BED0000 CALL //6FA517C6 |. E8 6F81FFFF CALL @@ -54,6 +56,7 @@ void Install_PrintPlugYVersion() //6FA56B1F |. E8 1A2EFFFF CALL //6FA56AF6 |. E8 432EFFFF CALL //6FA58060 |. E8 ED18FFFF CALL + //6FA50A10 |. E8 218FFFFF CALL log_msg("\n"); @@ -91,7 +94,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? // Print LoD/Mod version. if (version_D2Launch >= V110) { - mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134);//6FA19721-6FA10000 + mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4);//6FA19721-6FA10000 memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x8B102454 , caller_VersionChange_10); memt_byte( 0xCF, 0x90 ); // NOP @@ -105,14 +108,17 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? //6FA56BCF |. 8BCF MOV ECX,EDI //6FA58134 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] //6FA58138 |. 8BCF MOV ECX,EDI + //6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] + //6FA50AE8 |. 8BCF MOV ECX,EDI } else { - mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B); + mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB); MEMJ_REF4( D2PrintLineOnTextBox, versionChange); //6FA19729 |. E8 88EB0000 CALL //6FA518A1 |. E8 267FFFFF CALL //6FA57981 |. E8 781EFFFF CALL //6FA56BD1 |. E8 EA2CFFFF CALL //6FA5813A |. E8 8F17FFFF CALL + //6FA50AEA |. E8 DF8CFFFF CALL } log_msg("\n"); diff --git a/PlugY/NewInterface_CubeListing.cpp b/PlugY/NewInterface_CubeListing.cpp index 745ab9c..e63e0f9 100644 --- a/PlugY/NewInterface_CubeListing.cpp +++ b/PlugY/NewInterface_CubeListing.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Modified by L'Autour. Cube Listing functions @@ -14,62 +15,98 @@ const char* CUBEFORMULA_FILE = "cube.txt"; -const char * STRING_ERROR="***Error***"; +const LPWSTR STRING_ERROR= L"***Error***"; -#define BUF (&buf[strlen(buf)]) - +#define lenbuf 512 +#define lenbufi 256 +#define BUF &buf[cntbuf], lenbuf-cntbuf +bool InNoSocket; //~~~~~ /* 6FC9275F |. E8 ECCCFFFF |CALL D2Game.6FC8F450 ; \D2Game.6FC8F450 */ -void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs) +void printOutput(CubeOutput* output, WCHAR* buf, BYTE* nbOutputs) { if (!output->outputType) return; + + int cntbuf = wcslen(buf); + if (*nbOutputs) - sprintf(BUF," + "); + cntbuf += swprintf(BUF,L" + "); *nbOutputs += 1; if (output->outputType == 1) { - sprintf(BUF,"Cow Portal"); + swprintf(BUF,getTranslatedString(STR_COW_PORTAL)); return; } else if (output->outputType == 2) { - sprintf(BUF,"Pandemonium Portal"); + swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_PORTAL)); return; } else if (output->outputType == 3) { - sprintf(BUF,"Pandemonium Final Portal"); + swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_FINAL_PORTAL)); return; } if ((output->quantityOrNbSockets>1) && !output->haveSockets) - sprintf(BUF,"%u ", output->quantityOrNbSockets); - + { + if (output->quantityOrNbSockets == 255) + {cntbuf += swprintf(BUF,getTranslatedString(STR_FULL));} + else + {cntbuf += swprintf(BUF,L"%u ", output->quantityOrNbSockets);} + } + + //------------------------------------------------------------------------------- + WCHAR itembuf[lenbufi]; + LPWSTR itemstr = &itembuf[0]; + if (!(output->isSpecificItem)) + { + ItemsBIN* items; LPWSTR string; + switch (output->outputType) + { + case 0xFC: + items = D2GetItemsBIN(output->ID); + wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi); + break; + case 0xFD: + getTypeUString(output->ID, itemstr, lenbufi); + break; + case 0xFE: wcsncpy(itemstr, getTranslatedString(STR_ITEM),lenbufi);break; + case 0xFF: wcsncpy(itemstr, getTranslatedString(STR_ITEM_SAME_TYPE),lenbufi);break; + default: swprintf(BUF,STRING_ERROR);return; + } + + itemstr = cutStringGender(itemstr); + } + //------------------------------------------------------------------------------- if (output->repair) - sprintf(BUF,"repair "); + cntbuf += wSprintStringLastGender(BUF, STR_REPAIR); + + if ((output->repair)&&(output->recharge)) + cntbuf += wSprintStringLastGender(BUF, STR_AND); if (output->recharge) - sprintf(BUF,"recharge "); + cntbuf += wSprintStringLastGender(BUF, STR_RECHARGE); if (output->isEthereal) - sprintf(BUF,"ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL); if (output->destroysFillers) - sprintf(BUF,"destroys Fillers "); + cntbuf += wSprintStringLastGender(BUF, STR_DESTROY_FILLERS); if (output->removeFillers) - sprintf(BUF,"remove Fillers "); + cntbuf += wSprintStringLastGender(BUF, STR_REMOVE_FILLERS); if (output->regeneratesUnique) - sprintf(BUF,"regenerate "); + cntbuf += wSprintStringLastGender(BUF, STR_REGENERATE); if (output->upgradeToExceptional) - sprintf(BUF,"exceptional "); + cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL); if (output->upgradeToElite) - sprintf(BUF,"elite "); + cntbuf += wSprintStringLastGender(BUF, STR_ELITE); if (output->isSpecificItem) { @@ -77,131 +114,163 @@ void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs) { UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + output->specificID-1; LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else if (output->quality == ITEMQUALITY_SET) { SetItemsBIN* setItems = SgptDataTables->setItems + output->specificID-1; LPWSTR string = D2GetStringFromIndex(setItems->setNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else { - sprintf(BUF,STRING_ERROR);return; + swprintf(BUF,STRING_ERROR);return; } } else { switch (output->quality) { - case 1:sprintf(BUF,"Cracked ");break; - case 2:sprintf(BUF,"Normal ");break; - case 3:sprintf(BUF,"Superior ");break; - case 4:sprintf(BUF,"Magic ");break; - case 5:sprintf(BUF,"Set ");break; - case 6:sprintf(BUF,"Rare ");break; - case 7:sprintf(BUF,"Unique ");break; - case 8:sprintf(BUF,"Crafted ");break; - case 9:sprintf(BUF,"Tempered ");break; - } - ItemsBIN* items;LPWSTR string; + case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break; + case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break; + case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break; + case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break; + case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break; + case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break; + case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break; + case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break; + case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break; + } /* + ItemsBIN* items; LPWSTR string; switch (output->outputType) { case 0xFC: items = D2GetItemsBIN(output->ID); string = D2GetStringFromIndex(items->NameStr); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); break; case 0xFD: - getTypeAString(output->ID,BUF,50); -// WCHAR string[50]; -// getTypeString(input->ID,string,50); -// wcstombs(BUF, string, wcslen(string)+1); + getTypeUString(output->ID,BUF); break; - case 0xFE: sprintf(BUF,"Item");break; - case 0xFF: sprintf(BUF,"Item of the same type");break; - default: sprintf(BUF,STRING_ERROR);return; + case 0xFE: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM));break; + case 0xFF: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM_SAME_TYPE));break; + default: cntbuf += swprintf(BUF,STRING_ERROR);return; + } */ + cntbuf += swprintf(BUF,setMonoString(itemstr)); + + } + if ((output->haveSockets==1)||InNoSocket) + { + if(output->quantityOrNbSockets>1) + { + swprintf(BUF,getTranslatedString(STR_WITH_N_SOCKETS), output->quantityOrNbSockets); + } else + { + swprintf(BUF,getTranslatedString(STR_WITH_SOCKET)); } } - if ((output->quantityOrNbSockets>1) && (output->haveSockets==1)) - sprintf(BUF," with %u sockets", output->quantityOrNbSockets); + } -void printInput(CubeInput* input, char* buf, BYTE* nbInputs)//maxsize) +void printInput(CubeInput* input, WCHAR* buf, BYTE* nbInputs)//maxsize) { if (!input->byItemID && !input->byItemTypeID) return; + + int cntbuf = wcslen(buf); + if (*nbInputs) - sprintf(BUF," + "); + cntbuf += swprintf(BUF,L" + "); BYTE nb = input->quantity > 0 ? input->quantity : 1; *nbInputs += nb; if (nb>1) - sprintf(BUF,"%u ", nb); + cntbuf += swprintf(BUF,L"%u ", nb); + WCHAR itembuf[lenbufi]; + LPWSTR itemstr = &itembuf[0]; + //------------------------------------------------------------------------------- + if (!(input->isSpecificItem)) + { + if (input->byItemTypeID) { + getTypeUString(input->ID, itemstr, lenbufi); + } else if (input->ID == 0xFFFF) { + wcsncpy(itemstr, getTranslatedString(STR_ITEM), lenbufi); + } else { + ItemsBIN* items = D2GetItemsBIN(input->ID); + wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi); + } + itemstr = cutStringGender(itemstr); + } + //------------------------------------------------------------------------------- if (input->isEthereal) - sprintf(BUF,"ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL); if (input->isNotEthereal) - sprintf(BUF,"not ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_NOT_ETHERAL); if (input->isNotRuneword) - sprintf(BUF,"not runeword "); + cntbuf += wSprintStringLastGender(BUF, STR_NOT_RUNEWORD); if (input->isBasic) - sprintf(BUF,"basic "); + cntbuf += wSprintStringLastGender(BUF, STR_BASIC); if (input->isExceptional) - sprintf(BUF,"exceptional "); + cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL); if (input->isElite) - sprintf(BUF,"elite "); + cntbuf += wSprintStringLastGender(BUF, STR_ELITE); if (input->isSpecificItem) { if (input->quality == ITEMQUALITY_UNIQUE) { UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + input->specificID-1; LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else if (input->quality == ITEMQUALITY_SET) { SetItemsBIN* setItems = SgptDataTables->setItems + input->specificID-1; LPWSTR string = D2GetStringFromIndex(setItems->setNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else { - sprintf(BUF,STRING_ERROR);return; + swprintf(BUF,STRING_ERROR);return; } } else { switch (input->quality) { - case 1:sprintf(BUF,"Cracked ");break; - case 2:sprintf(BUF,"Normal ");break; - case 3:sprintf(BUF,"Superior ");break; - case 4:sprintf(BUF,"Magic ");break; - case 5:sprintf(BUF,"Set ");break; - case 6:sprintf(BUF,"Rare ");break; - case 7:sprintf(BUF,"Unique ");break; - case 8:sprintf(BUF,"Crafted ");break; - case 9:sprintf(BUF,"Tempered ");break; - } + + case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break; + case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break; + case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break; + case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break; + case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break; + case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break; + case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break; + case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break; + case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break; + }/* if (input->byItemTypeID) { - getTypeAString(input->ID,BUF,50); + getTypeUString(input->ID,BUF); } else if (input->ID == 0xFFFF) { - sprintf(BUF,"Item"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM)); } else { ItemsBIN* items = D2GetItemsBIN(input->ID); LPWSTR string = D2GetStringFromIndex(items->NameStr); - wcstombs(BUF, string, wcslen(string)+1); - } + cntbuf += swprintf(BUF,string); + }*/ + cntbuf += swprintf(BUF,itemstr); } if (input->includeUpgradedVersions && !input->isElite) - sprintf(BUF,"(or upgraded) "); + cntbuf += swprintf(BUF,getTranslatedString(STR_OR_UPGRADED)); if (input->haveNoSocket) - sprintf(BUF," with no socket"); + { + cntbuf += swprintf(BUF,getTranslatedString(STR_WITHOUT_SOCKET)); + InNoSocket = true;//~~~~~ + } if (input->haveSockets) - sprintf(BUF," with sockets"); + swprintf(BUF,getTranslatedString(STR_WITH_SOCKET)); } -DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) +DWORD print(CubeMainBIN* curForm, WCHAR* buf, DWORD)//maxsize) { if (!buf || !curForm || !curForm->enabled) return 0; - + InNoSocket = false; //~~~~~ BYTE realNbInputs=0; printInput(&curForm->input1, buf, &realNbInputs); printInput(&curForm->input2, buf, &realNbInputs); @@ -211,14 +280,15 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) printInput(&curForm->input6, buf, &realNbInputs); printInput(&curForm->input7, buf, &realNbInputs); + int cntbuf = wcslen(buf); if (realNbInputs != curForm->numinputs) { - sprintf(BUF," *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs); + cntbuf += swprintf(BUF,L" *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs); return 1; } - sprintf(BUF," => "); + cntbuf += swprintf(BUF,L" => "); BYTE realNbOutputs=0; printOutput(&curForm->output1, buf, &realNbOutputs); printOutput(&curForm->output2, buf, &realNbOutputs); @@ -226,24 +296,24 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) // if (curForm->ladder) -// sprintf(BUF," [ladder only]"); +// cntbuf += swprintf(BUF," [ladder only]"); if (curForm->minDiff == 1) - sprintf(BUF," [Nightmare and Hell only]"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_N_H)); else if (curForm->minDiff == 2) - sprintf(BUF," [Hell only]"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_HELL)); if (curForm->playerClass != 0xFF) { CharStatsBIN* charStats = D2GetCharStatsBIN(curForm->playerClass); - sprintf(BUF, " [%s only]", charStats->name); + cntbuf += swprintf(BUF, getTranslatedString(STR_ONLY_CLASS), charStats->name); } if ((curForm->op>0) && (curForm->op!=28)) - sprintf(BUF, " [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value); + cntbuf += swprintf(BUF, L" [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value); // if (curForm->version == 100) -// sprintf(BUF, " [expansion only]"); +// cntbuf += swprintf(BUF, " [expansion only]"); return 1; } @@ -268,12 +338,24 @@ void listAllCubeFormula() int nbLines = D2GetNbCubeMainBIN();//SgptDataTables->nbCubemain log_msg("nbLines : %d\n",nbLines); - char buf[300]; + WCHAR buf[lenbuf]; + char bufa[lenbuf]; + + if (D2GetLang() != LNG_DEU) + { + bufa[0] = (char)0xEF; + bufa[1] = (char)0xBB; + bufa[2] = (char)0xBF; + bufa[3] = (char)0x00; + fprintf(file,"%s",bufa); + } + for (int i=0; icubemain + i; - if (res) fprintf(file,"%4u: %s\n",i,buf); + DWORD res = print(D2GetCubeMainBIN(i), buf, lenbuf);//SgptDataTables->cubemain + i; + UCS2toUTF8(&bufa[0], lenbuf, &buf[0], lenbuf); + if (res) fprintf(file,"%4u: %s\n",i,bufa); if (res) fflush(file); } diff --git a/PlugY/NewInterfaces.cpp b/PlugY/NewInterfaces.cpp index 66102ba..4092d70 100644 --- a/PlugY/NewInterfaces.cpp +++ b/PlugY/NewInterfaces.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -69,6 +70,7 @@ void STDCALL printCustomPage() DWORD STDCALL mouseCustomPageLeftDown(sWinMessage* msg) { + if(onRealm) return -1; if ( (selectedPage > 0) && (selectedPage<=lastPage) ) return mouseNewStatsPageTwoLeftDown(msg); @@ -310,7 +312,7 @@ void Install_NewInterfaces() if ( version_D2Client >= V111 ) { //Reset selectedPage variable on opening stats page - mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E); + mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE); memt_byte( 0x83, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0x1F7426F8, caller_resetSelectedPageByToolBar); //6FAFB79E > 83F8 26 CMP EAX,26 @@ -321,8 +323,10 @@ void Install_NewInterfaces() //6FB05E11 . 74 1F JE SHORT D2Client.6FB05E32 //6FB15F5E > 83F8 26 CMP EAX,26 //6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82 + //6FB741FE > 83F8 26 CMP EAX,26 + //6FB74201 . 74 1F JE SHORT D2Client.6FB05E32 - mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA); + mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A); memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey); //6FACE55A . 55 PUSH EBP @@ -337,7 +341,9 @@ void Install_NewInterfaces() //6FAEC5EA . 55 PUSH EBP //6FAEC5EB . 33ED XOR EBP,EBP //6FAEC5ED . 3BD5 CMP EDX,EBP - + //6FAEE39A . 55 PUSH EBP + //6FAEE39B . 33ED XOR EBP,EBP + //6FAEE39D . 3BD5 CMP EDX,EBP //For Toggle fct : (not used for open the stat page) // mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218); @@ -355,7 +361,7 @@ void Install_NewInterfaces() //6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP } else { //Reset selectedPage variable on opening stats page - mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218); + mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000, 0000);//((DWORD)D2TogglePage+0x218); memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage); //6FB23478 |. 85C0 TEST EAX,EAX @@ -365,16 +371,17 @@ void Install_NewInterfaces() } // Print custom page - mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49); + mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549); MEMC_REF4( D2PrintStatsPage, printCustomPage); //6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60 //6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0 //6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320 //6FB402B8 |. E8 C3AFFDFF CALL D2Client.6FB1B280 //6FB73B48 |. E8 5393FFFF CALL D2Client.6FB6CEA0 + //6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280 // Don't print Border - mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6); + mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6); memt_byte( 0xB9, 0xE8 ); // CALL caller_DontPrintBorder MEMT_REF4( 0x00000012, version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder); //6FAFF4C6 > B9 12000000 MOV ECX,12 @@ -382,27 +389,30 @@ void Install_NewInterfaces() //6FB65A46 |. B9 12000000 MOV ECX,12 //6FB32166 |. B9 12000000 MOV ECX,12 //6FAD71C6 |. B9 12000000 MOV ECX,12 + //6FB1D2B6 |. B9 12000000 MOV ECX,12 // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36); + mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6); memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x00008088, version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9); memt_byte( 0x00, 0x90 ); // NOP //6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB391B6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] - //6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] - //6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] // Manage mouse up - mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9); + mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459); memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp MEMT_REF4( ptWindowStartX, version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9); //6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748] //6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24] //6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8] - //6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28] - //6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0] + //6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28] + //6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0] + //6FB70459 . A1 54D3BC6F MOV EAX,DWORD PTR DS:[6FBCD354] // open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP diff --git a/PlugY/PlayerCustomData.cpp b/PlugY/PlayerCustomData.cpp index d001ef8..d53624a 100644 --- a/PlugY/PlayerCustomData.cpp +++ b/PlugY/PlayerCustomData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Adding custom data. Save and load infinity & shared Stash @@ -270,18 +271,19 @@ void Install_PlayerCustomData() log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n"); // Initialize custom data. - mem_seek( version_D2Client == V113 ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 ); + mem_seek( version_D2Client == V113d ? offset_D2Common + 0x170DE : version_D2Client == V113c ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 ); MEMJ_REF4( D2AllocMem, init_PlayerCustomData); //01BD0381 |. E8 C03F0000 CALL //6FD9ED5D |. E8 94A4FBFF CALL //6FDABFCD |. E8 34D2FAFF CALL //6FDA85ED |. E8 240CFBFF CALL //6FD809BD |. E8 6088FDFF CALL + //6FD670DD |. E8 0C3EFFFF CALL if ( version_D2Game >= V111 ) { // update item - mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91); + mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x52182454, caller_updateItem_111); //0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] @@ -292,8 +294,10 @@ void Install_PlayerCustomData() //6FC7F2A5 |. 52 |PUSH EDX ; /Arg1 //6FCBBB91 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //6FCBBB95 |. 52 |PUSH EDX + //6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] + //6FC95C85 |. 52 |PUSH EDX - mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1); + mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x52182454, caller_updateItemB_111); //0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] @@ -304,19 +308,21 @@ void Install_PlayerCustomData() //6FC7F305 |. 52 ||PUSH EDX ; /Arg1 //6FCBBBF1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] //6FCBBBF5 |. 52 ||PUSH EDX + //6FC95CE1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] + //6FC95CE5 |. 52 ||PUSH EDX } else { // update item - mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000); + mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); //6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00 - mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000); + mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); //6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00 } // Update client on loading - mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12);//6FC325D4-6FC30000 + mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548);//6FC325D4-6FC30000 memt_byte( 0x5F ,0xE8); // CALL MEMT_REF4( 0xC0335D5E , caller_updateClientPlayerOnLoading); //6FC325D4 |> 5F POP EDI @@ -339,57 +345,65 @@ void Install_PlayerCustomData() //6FC6BF13 |. 5E POP ESI //6FC6BF14 |. 5D POP EBP //6FC6BF15 |. 33C0 XOR EAX,EAX + //6FD07548 |> 5F POP EDI + //6FD07549 |. 5E POP ESI + //6FD0754A |. 5D POP EBP + //6FD0754B |. 33C0 XOR EAX,EAX // Free custom data. - mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D); + mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D); MEMJ_REF4( D2FreeMem, free_PlayerCustomData); //01BD0482 |. E8 C53E0000 CALL //6FD9F82C |. E8 E399FBFF CALL //6FDAC9CC |. E8 3BC8FAFF CALL //6FDA856C |. E8 E70CFBFF CALL //6FD8093C |. E8 E788FDFF CALL + //6FD6705C |. E8 CF3EFFFF CALL // Free item in Stash (Server-side) - mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162); + mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2); MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204 //6FCBD5A3 . E8 04E20500 CALL //02019111 |. E8 5016F7FF |CALL //0202FDB1 |. E8 30AAF4FF |CALL //6FCB4241 |. E8 8862F7FF |CALL //6FD01161 |. E8 6693F2FF |CALL + //6FC8F7C1 |. E8 44AEF9FF |CALL // Free item in Stash (Client-side) - mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94);//6FB29B31-6FAA0000 + mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4);//6FB29B31-6FAA0000 MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34 //6FB29B31 E8 340F0400 CALL //6FAD6403 |. E8 925DFEFF |CALL //6FAFC263 |. E8 38FFFBFF |CALL //6FACF2D3 |. E8 4CD1FEFF |CALL //6FB55C93 |. E8 D068F6FF |CALL + //6FB121E3 |. E8 7AA1FAFF |CALL if ( version_D2Common >= V110 ) { // Test if it's already removed from inventory - mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23); + mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23, 3B393); memt_byte( 0x0D , 0x07); //01D2E688 75 0D JNZ SHORT D2Common.01D2E697 //6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41 //6FD92132 |. 74 0D JE SHORT D2Common.6FD92141 //6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1 //6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31 + //6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1 } else { - mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x35 , 0x90);//NOP //6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD - mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x0F , 0x90);//MOV EAX,EDI memt_byte( 0x84 , 0x90);//NOP memt_dword( 0x000000BF , 0x90909090);//NOP //6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F - mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x6F , 0x90);//NOP //6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD diff --git a/PlugY/PlugY.aps b/PlugY/PlugY.aps index ddd515b742889d454eeb6cafe526f8937fd20ba4..7a4caa8e7aaff08f56f6a15f5c9dfec28ec32e52 100644 GIT binary patch delta 535 zcmZutze_?<6#lMd5Dxtyr6-j}Nx!I+B*KDxuc3w>xryXrW+s@LDd3BGh%*Tsg82ZMEY?P@t@z?nlreYAZr}xpOKiKi-8a?}aM1kJ@(pckzD0~P* zMFa_?kUdy~{`qKMx{ z7s`r|ZfnZboH(IV&B1uDd0H($6I!UI^@|U(mIgu<0SLI^8aFIus+8S%Pn+J}| zTMo0a#3b$N4s(IUbkVtP4K`>Bcdr?i5M)t6y*|z?z}?Q%8VTFWEYQ91n=|o;V+=n? d@XH(+(>#S>?Ehqd`MWZv#{s}*0eR==@ delta 446 zcmZ3|!E~gZX@UZy%0xv;T^<$&DBx*gU`Vlw2?+9ck8v@I3CJl;k3=T*ijp^G-?e9K zob2gPrAI&|gENB)!~g#v3^YD&@<#_rO@vh`3|0&=3;_&54E_x6K$Z)G5tyIDP|A?b z5INb@QI*koa9@r8Dwu=67Cd!x%DoYrQ;>yjpL_ z$p!Tb*JS<%MaC_Y4I7k2ConQFFftf0m;f;dnlL0W7))NNqAZY?hte)hx#70c067P66}h)eEtO0FByF JKY3TZ6aZZKYjgkr diff --git a/PlugY/PlugY.rc b/PlugY/PlugY.rc index fb9713a..c8ed211 100644 --- a/PlugY/PlugY.rc +++ b/PlugY/PlugY.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 10,0,0,0 - PRODUCTVERSION 10,0,0,0 + FILEVERSION 11,0,0,0 + PRODUCTVERSION 11,0,0,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,11 +81,12 @@ BEGIN BEGIN BLOCK "040004b0" BEGIN + VALUE "Comments", "Modified by L'Autour" VALUE "CompanyName", "Yohann Nicolas" - VALUE "FileVersion", "10.00" + VALUE "FileVersion", "11.00" VALUE "OriginalFilename", "PlugY.dll" VALUE "ProductName", "PlugY, The Survival Kit" - VALUE "ProductVersion", "10.00" + VALUE "ProductVersion", "11.00" END END BLOCK "VarFileInfo" diff --git a/PlugY/PlugY.suo b/PlugY/PlugY.suo index f209d633876869fa8626083ba58d9d002ca78da3..f644524bb884355c23ab2d27ccb46cc4088da236 100644 GIT binary patch literal 206848 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

@vn2$Hxhz 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 OCKflOBJuBBWBWHHWEOV- delta 7099 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 diff --git a/PlugY/PlugY.vcproj b/PlugY/PlugY.vcproj index 6efbfd6..b99c648 100644 --- a/PlugY/PlugY.vcproj +++ b/PlugY/PlugY.vcproj @@ -152,6 +152,7 @@ @@ -361,6 +362,14 @@ RelativePath="WorldEvent.cpp" > + + + + + + @@ -561,6 +574,10 @@ RelativePath="..\Commons\updatingConst.h" > + + = V111 ? caller_isModFile_111 : caller_isModFile); @@ -97,6 +98,7 @@ void Install_PlugYFiles() //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + //6FC1DA79 |. FF15 3C32C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection log_msg("\n" ); @@ -170,7 +172,7 @@ void Install_PlugYImagesFiles() log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n"); // Load custom images - mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE); + mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE); memt_byte( 0xB9 ,0xE8); MEMT_REF4( 0x0000000C , caller_loadCustomImages); //6FAFE4B1 |. B9 0C000000 MOV ECX,0C @@ -178,9 +180,10 @@ void Install_PlugYImagesFiles() //6FB667E1 |. B9 0C000000 MOV ECX,0C //6FB32761 |. B9 0C000000 MOV ECX,0C //6FAD7EAE |. B9 0C000000 MOV ECX,0C + //6FB1E0BE |. B9 0C000000 MOV ECX,0C // Free custom images - mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D); + mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D); memt_byte( 0xB9 ,0xE8); MEMT_REF4( 0x0000000C , caller_freeCustomImages); //6FAFE639 |> B9 0C000000 MOV ECX,0C @@ -188,6 +191,7 @@ void Install_PlugYImagesFiles() //6FB6580D |> B9 0C000000 MOV ECX,0C //6FB3158D |> B9 0C000000 MOV ECX,0C //6FAD6F8D |> B9 0C000000 MOV ECX,0C + //6FB1D07D |> B9 0C000000 MOV ECX,0C log_msg("\n" ); @@ -243,7 +247,7 @@ void Install_PlugYTxtFiles() // lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000); // Load custom txt files - mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4); + mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4); MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); //6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500 //6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510 @@ -252,9 +256,10 @@ void Install_PlugYTxtFiles() //6FD87443 |. E8 58B6FFFF CALL D2Common.6FD82AA0 ; \D2Common.6FD82AA0 //6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0 //6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870 + //6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40 // Free custom txt files - mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3); + mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3); MEMJ_REF4( D2Fog10212, caller_freeTxtFiles ); //6FD479EB . E8 C8C00600 CALL //6FD479EB . E8 C8C00600 CALL @@ -263,6 +268,7 @@ void Install_PlugYTxtFiles() //6FD65AB2 |. E8 B537FFFF CALL //6FD94E12 |. E8 1744FCFF CALL //6FDAE8B2 |. E8 8FA9FAFF CALL + //6FD5FAA2 |. E8 5FB4FFFF CALL log_msg("\n" ); diff --git a/PlugY/SavePath.cpp b/PlugY/SavePath.cpp index 31d9346..6f485d2 100644 --- a/PlugY/SavePath.cpp +++ b/PlugY/SavePath.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Changing the current save path. @@ -123,7 +124,7 @@ void Install_ChangingSavePath() if (version_Fog >= V111) { // Appel de notre fct d'ajout d'un sous-rpertoire - mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86); + mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146); memt_byte( 0x83 ,0xE8); // CALL changeSavePath MEMT_REF4( 0x0575FFF8, changeSavePath_111); //6FF685F6 . 83F8 FF CMP EAX,-1 @@ -134,18 +135,21 @@ void Install_ChangingSavePath() //6FF6F089 . 75 05 JNZ SHORT Fog.6FF6F090 //6FF67F86 . 83F8 FF CMP EAX,-1 //6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90 + //6FF6E146 . 83F8 FF CMP EAX,-1 + //6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64 // Pour crer le bon chemin de sauvegarde - mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6); + mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166); MEMJ_REF4( D2Storm503, forCreateSavePath); //6FF68615 . E8 A246FFFF CALL //6FF6C125 . E8 C20BFFFF CALL //6FF6F0A5 . E8 34DDFEFF CALL //6FF67FA5 . E8 504EFFFF CALL + //6FF6E165 . E8 6AEBFEFF CALL // Remove registry update - mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA); + mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A); memt_byte( 0x56 ,0xEB); // JMP SHORT fog.6FF6862C memt_byte( 0x6A ,0x10); // memt_byte( 0x00 ,0x90); // NOP @@ -166,6 +170,8 @@ void Install_ChangingSavePath() //6FF6F0B7 . E8 58DDFEFF CALL //6FF67FAA . 56 PUSH ESI //6FF67FAB . 6A 00 PUSH 0 + //6FF6E16A . 56 PUSH ESI + //6FF6E16B . 6A 00 PUSH 0 } else { diff --git a/PlugY/SavePlayerData.cpp b/PlugY/SavePlayerData.cpp index 09ba097..b5a15c1 100644 --- a/PlugY/SavePlayerData.cpp +++ b/PlugY/SavePlayerData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Save Player Custom Data. @@ -521,16 +522,17 @@ void Install_SavePlayerData() log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n"); //Save single player custom data. - mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35); + mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835); MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9); //6FC8A623 E8 3E210900 CALL //02039364 |. E8 3B0FF5FF CALL //01F95474 |. E8 C34EFEFF CALL //6FC64164 |. E8 EB61FCFF CALL //6FC73F34 |. E8 DD63FBFF CALL + //6FC59834 |. E8 FB0AFDFF CALL //Send SaveFiles - mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB); + mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB); memt_byte( 0x8B ,0x90); // NOP memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL MEMT_REF4( version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9); @@ -544,8 +546,10 @@ void Install_SavePlayerData() //6FC640DF |. 85C0 TEST EAX,EAX //6FC73EAB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] //6FC73EAF |. 85C0 TEST EAX,EAX + //6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] + //6FC597AF |. 85C0 TEST EAX,EAX - mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173); + mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3); memt_byte( 0x8B ,0x90); // NOP memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL MEMT_REF4( version_D2Game >= V110 ? 0x0000017C : version_D2Game == V109d ? 0x0000174 : 0x00000150, version_D2Game >= V110 ? caller_ManageNextPacketToSend : version_D2Game == V109d ? caller_ManageNextPacketToSend_9d : caller_ManageNextPacketToSend_9); @@ -554,6 +558,7 @@ void Install_SavePlayerData() //02056D83 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] //6FCC89D3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] //6FC4D173 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] + //6FCDEDD3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] // mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC // memt_byte( 0x8B ,0xE8); // CALL @@ -565,16 +570,17 @@ void Install_SavePlayerData() if ( version_D2Game >= V111 ) { //Received SaveFiles - mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946); + mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6); memt_byte( 0x0F ,0xE8); MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111); //6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FAE2076 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FB2BCD6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FAF3946 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] + //6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] // Save multiplayer player custom data. - mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572); + mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2); memt_byte( 0x81 ,0xE8); // CALL MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111); memt_byte( 0xAA ,0x90); // CALL @@ -582,16 +588,17 @@ void Install_SavePlayerData() //6FB6D7F2 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55 + //6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55 } else { //Received SaveFiles - mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000); + mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000); memt_byte( 0x81 ,0x90); // NOP memt_byte( 0xEC ,0xE8); // CALL MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave); //6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4 // Save multiplayer player custom data. - mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000); + mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData); //6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX] diff --git a/PlugY/SkillPerLevelUp.cpp b/PlugY/SkillPerLevelUp.cpp index 3bec02c..a63f7b5 100644 --- a/PlugY/SkillPerLevelUp.cpp +++ b/PlugY/SkillPerLevelUp.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Change Skill win per level up. @@ -36,14 +37,14 @@ void Install_SkillPerLevelUp() log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n"); - mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5); + mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5); MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp); //6FC7ED5F |. E8 56CB0900 CALL //02057AE4 |. E8 9F28F3FF CALL //01FE9694 |. E8 1B0DF9FF CALL //6FCCA454 |. E8 5F01F6FF CALL //6FD0B1E4 |. E8 E9F2F1FF CALL - + //6FD0DCA4 |. E8 FDC6F1FF CALL log_msg("\n"); diff --git a/PlugY/StatPerLevelUp.cpp b/PlugY/StatPerLevelUp.cpp index 747429c..4be88d6 100644 --- a/PlugY/StatPerLevelUp.cpp +++ b/PlugY/StatPerLevelUp.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Change Stat win per level up. @@ -34,13 +35,14 @@ void Install_StatPerLevelUp() log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n"); - mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA); + mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A); MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp); //6FC7ED54 |. E8 61CB0900 CALL //02057AD9 |. E8 AA28F3FF CALL //01FE9689 |. E8 260DF9FF CALL //6FCCA449 |. E8 6A01F6FF CALL //6FD0B1D9 |. E8 F4F2F1FF CALL + //6FD0DC99 |. E8 08C7F1FF CALL log_msg("\n"); diff --git a/PlugY/StatsPoints.cpp b/PlugY/StatsPoints.cpp index f56b45b..9b451cb 100644 --- a/PlugY/StatsPoints.cpp +++ b/PlugY/StatsPoints.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Unassign Stats Point for futher re-assignment. @@ -331,39 +332,42 @@ void Install_StatsPoints() //if ( version_D2Client < V113 ) { // Always print stat button images. - mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5); + mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 - memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) ); + memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( 0x24, 0x90 ); // NOP - memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] + //6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //print our buttons - mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E); + mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); MEMJ_REF4( D2PrintImage, caller_printUnassignStatsBtn); //6FB32C53 . E8 82A3F8FF CALL //6FB396D3 . E8 D238F8FF CALL //6FB1B636 . E8 431AFAFF CALL //6FB6D23D . E8 54FEF4FF CALL + //6FB6F9DD . E8 ECD5F4FF CALL // Always manage push down. - mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9); + mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579); memt_byte( 0x74, 0x90 ); // NOP memt_byte( 0x4E, 0x90 ); // NOP - //6FAD134D 74 4E JE SHORT D2Client.6FAD139D + //6FAD134D 74 4E JE SHORT D2Client.6FAD139D //6FB327D9 . 74 4E JE SHORT D2Client.6FB32829 //6FB39259 . 74 4E JE SHORT D2Client.6FB392A9 - //6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209 + //6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209 //6FB6CDD9 . 74 4E JE SHORT D2Client.6FB6CE29 + //6FB6F579 . 74 4E JE SHORT D2Client.6FB6F5C9 if ( version_D2Client >= V111 ) { // On Push down. - mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44); + mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4); memt_byte( 0x6B, 0xE8 ); MEMT_REF4( 0x01BF0ED2, caller_pushDown_111); memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E @@ -377,10 +381,12 @@ void Install_StatsPoints() //6FB1B227 BF 01000000 MOV EDI,1 //6FB6CE44 > 6BD2 0E IMUL EDX,EDX,0E //6FB6CE47 . BF 01000000 MOV EDI,1 + //6FB6F5E4 > 6BD2 0E IMUL EDX,EDX,0E + //6FB6F5E7 . BF 01000000 MOV EDI,1 } else { // On Push down. - mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000); + mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000, 0000); memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x0000D504, caller_pushDown); memt_byte( 0x00, 0x90 ); // NOP @@ -392,17 +398,18 @@ void Install_StatsPoints() if ( version_D2Client >= V110 ) { // Always manage push up. - mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49); + mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9); memt_byte( 0x74, 0x90 ); // NOP memt_byte( version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP //6FAD152E 74 68 JE SHORT D2Client.6FAD1598 //6FB33869 . 74 65 JE SHORT D2Client.6FB338D0 //6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350 - //6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0 + //6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0 //6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0 + //6FB705E9 . 74 65 JE SHORT D2Client.6FB70650 // Unassign stats point when ctrl is push. - mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB); + mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B); memt_byte( 0x66, 0xE8 ); // CALL MEMT_REF4( 0x077CC085, caller_UnassignStats); //6FAD15D3 . 66:85C0 TEST AX,AX @@ -415,23 +422,25 @@ void Install_StatsPoints() //6FB1C2FE . 7C 07 JL SHORT D2Client.6FB1C307 //6FB6DEFB . 66:85C0 TEST AX,AX //6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07 + //6FB7069B . 66:85C0 TEST AX,AX + //6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7 } else { // Always manage push up. - mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x0F, 0x90 ); // NOP memt_byte( 0x84, 0x90 ); // NOP memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP //6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9 // Unassign stats point when ctrl is push. - mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xB8, 0xE8 ); // CALL MEMT_REF4( 0x00000001, caller_UnassignStats_9); //6FACACC9 . B8 01000000 MOV EAX,1 } // Set the id for the calling function. - mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E); + mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE); if ( version_D2Client >= V111 ) { memt_byte( 0x66, 0xE8 ); // CALL MEMT_REF4( 0x15244C89, caller_setValue_111); @@ -439,6 +448,7 @@ void Install_StatsPoints() //6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | //6FB6DF3E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | + //6FB706DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | } else { MEMC_REF4( D2SendToServer3, caller_setValue); //6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990 @@ -475,7 +485,7 @@ void Install_StatsLimitShiftClick() log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n"); // Limit the assigment of stat points. - mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5); + mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5, C0695); memt_byte( 0xFF, 0x90 ); // NOP memt_byte( 0x15, 0xE8 ); // CALL MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift); @@ -484,6 +494,7 @@ void Install_StatsLimitShiftClick() //6FB3A395 . FF15 08F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>] //6FB1C2F5 . FF15 10F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState //6FB6DEF5 . FF15 04F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState + //6FB70695 . FF15 2001B86F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState log_msg("\n"); diff --git a/PlugY/UberQuest.cpp b/PlugY/UberQuest.cpp index c4fc399..240acda 100644 --- a/PlugY/UberQuest.cpp +++ b/PlugY/UberQuest.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Uber Quest Management. @@ -327,42 +328,45 @@ void Install_UberQuest() DWORD oldProtection; // open Red Portal - VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, PAGE_EXECUTE_READWRITE, &oldProtection); - mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0); + VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, PAGE_EXECUTE_READWRITE, &oldProtection); + mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4); MEMT_DWORD( D2OpenPandPortal , openPandPortal); MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal); //0201E357 |. FFD0 |CALL EAX //01FA77E7 |. FFD0 |CALL EAX //6FCF3CC7 |. FFD0 |CALL EAX //6FC92437 |. FFD0 |CALL EAX - VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, oldProtection, &oldProtection); + //6FCB7127 |. FFD0 |CALL EAX + VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, oldProtection, &oldProtection); // manage uberIA (fct table at 0209E7E8) - VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0); + VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618); MEMT_DWORD( D2UberBaalIA , uberBaalIA); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628); MEMT_DWORD( D2UberMephIA , uberMephIA); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638); MEMT_DWORD( D2UberDiabloIA , uberDiabloIA); - VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, oldProtection, &oldProtection); + VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, oldProtection, &oldProtection); //0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8 //01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0 //6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58 //6FCBD157 |> B8 88E7D26F MOV EAX,D2Game.6FD2E788 + //6FC5C617 |> B8 00EDD26F MOV EAX,D2Game.6FD2ED00 // spawn Uber // mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000); // MEMJ_REF4( D2WarpPlayer , spawnUber); //02028DAC |. E8 491CF7FF CALL - mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB); + mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB); MEMC_REF4( D2Game235C0 , spawnUber); //020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10 //02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0 //6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410 //6FC4CCAA |. E8 3134FFFF ||CALL D2Game.6FC400E0 + //6FCDE9AA |. E8 D1AFF9FF ||CALL D2Game.6FC79980 log_msg("\n"); diff --git a/PlugY/UpdateClient.cpp b/PlugY/UpdateClient.cpp index df230e2..e09b102 100644 --- a/PlugY/UpdateClient.cpp +++ b/PlugY/UpdateClient.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating client. @@ -74,13 +75,14 @@ void Install_UpdateClient() log_msg("Patch D2Client for received Item packet. (UpdateClient)\n"); // execute if it's our packet else continue - mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896); + mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96); MEMT_REF4( version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate); //6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690 //6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789 //6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59 //6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9 //6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969 + //6FB34D94 |. 0F87 CF000000 JA D2Client.6FB34E69 log_msg("\n"); diff --git a/PlugY/UpdateServer.cpp b/PlugY/UpdateServer.cpp index 07cb3f9..0dd4044 100644 --- a/PlugY/UpdateServer.cpp +++ b/PlugY/UpdateServer.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -100,7 +101,7 @@ void Install_UpdateServer() log_msg("Patch D2Game for received button click message. (UpdateServer)\n"); // manage button click message from Client. - mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983); + mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983, 676C3); if (version_D2Game >= V111) { memt_byte( 0xC1, 0x57 ); // PUSH EDI memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate diff --git a/PlugY/WorldEvent.cpp b/PlugY/WorldEvent.cpp index d5df6d5..e18b501 100644 --- a/PlugY/WorldEvent.cpp +++ b/PlugY/WorldEvent.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. World Event Management. @@ -231,40 +232,44 @@ void Install_WorldEvent() log_msg("Patch D2Game for active World Event. (WorldEvent)\n"); // spawn DClone - mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280); + mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0); MEMC_REF4( V2SpawnMonster , version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone); //6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220 //01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0 //0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0 //6FC6156F |. E8 1CF6FFFF CALL D2Game.6FC60B90 ; \D2Game.6FC60B90 //6FC4527F |. E8 CCF6FFFF CALL D2Game.6FC44950 ; \D2Game.6FC44950 + //6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20 // verify if the item sold is a trigger of WE - mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29); + mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9); MEMJ_REF4( D2TestFlags , verifIfWEItem); //6FCC77CF |. E8 32400500 CALL //0200E798 |. E8 E9BDF7FF CALL //02002858 |. E8 E57DF7FF CALL //6FCA4498 |. E8 3B62F8FF CALL //6FCDFB28 |. E8 77ADF4FF CALL + //6FC92BE8 |. E8 DD7AF9FF CALL // management of the WorldEvent - mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791); + mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51); MEMC_REF4( V2GetGameByClientID , version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX); //6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0 //01FD1F00 |. E8 1BE60800 CALL D2Game.02060520 //02035680 |. E8 1BF30100 CALL D2Game.020549A0 //6FD0BF40 |. E8 1BA4FBFF CALL D2Game.6FCC6360 //6FC6A790 |. E8 4B03FEFF CALL D2Game.6FC4AAE0 + //6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700 // add client for the WorldEvent - mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF); + mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F); MEMC_REF4( D2AddClient , version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE); //6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60 //01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0 //01FE0559 |. E8 B27C0700 CALL D2Game.02058210 //6FC8265E |. E8 FD890800 CALL D2Game.6FD0B060 //6FCEB0BE |. E8 6DE8F7FF CALL D2Game.6FC69930 + //6FCF556E |. E8 FDFA0000 CALL D2Game.6FD05070 log_msg("\n"); diff --git a/PlugY/common.h b/PlugY/common.h index 3aaf109..2e1b588 100644 --- a/PlugY/common.h +++ b/PlugY/common.h @@ -1,5 +1,6 @@ /*============================================== File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. this file implements some common and useful function related to some Diablo II mechanisms. @@ -54,8 +55,8 @@ extern s_shifting shifting; #define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData #define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills -#define R7(Z,A,B,C,D,E,F,G) (offset_##Z + (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))) -#define V7(Z,A,B,C,D,E,F,G) (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))) +#define R7(Z,A,B,C,D,E,F,G,H) (offset_##Z + (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))))) +#define V7(Z,A,B,C,D,E,F,G,H) (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))) // Convert 4 char code in a DWORD code @@ -74,7 +75,9 @@ enum eFileVersion V111, V111b, V112, - V113 + V113c, + V113d, + V114a }; extern int version_SmackW32; @@ -118,7 +121,19 @@ extern DWORD offset_Storm; extern const char* S_CloneBattles; extern const char* S_DarkAlliance; +int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc); +int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc); + + +bool initLocaleStrings(); +void freeLocaleStrings(); + +const LPWSTR getTypeString (DWORD code, char** IdxStr); LPWSTR getTranslatedString(int stringID); +int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID); +LPWSTR cutStringGender(LPWSTR str); +LPWSTR setMonoString(LPWSTR str); + enum eStringList { STR_STATS_UNASSIGN_WITH_LIMIT=0, @@ -138,12 +153,47 @@ enum eStringList STR_TAKE_GOLD, STR_SHARED_GOLD_QUANTITY, STR_PREVIOUS_PAGE, - STR_NEXT_PAGE + STR_NEXT_PAGE, + STR_ITEM_LEVEL, + STR_COW_PORTAL, + STR_PANDEMONIUM_PORTAL, + STR_PANDEMONIUM_FINAL_PORTAL, + STR_FULL, + STR_REPAIR, + STR_AND, + STR_RECHARGE, + STR_DESTROY_FILLERS, + STR_REMOVE_FILLERS, + STR_REGENERATE, + STR_WITH_N_SOCKETS, + STR_ETHERAL, + STR_NOT_ETHERAL, + STR_NOT_RUNEWORD, + STR_BASIC, + STR_EXCEPTIONAL, + STR_ELITE, + STR_CRACKED, + STR_NORMAL, + STR_SUPERIOR, + STR_MAGIC, + STR_SET, + STR_RARE, + STR_UNIQUE, + STR_CRAFTED, + STR_TEMPERED, + STR_ITEM, + STR_ITEM_SAME_TYPE, + STR_OR_UPGRADED, + STR_WITHOUT_SOCKET, + STR_WITH_SOCKET, + STR_ONLY_N_H, + STR_ONLY_HELL, + STR_ONLY_CLASS }; bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h); void freeMessage(sWinMessage* msg); LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size); -char* getTypeAString (WORD id, char* lpText, DWORD size); +//char* getTypeAString (WORD id, char* lpText, DWORD size); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/d2functions.h b/PlugY/d2functions.h index a131e87..7b02b42 100644 --- a/PlugY/d2functions.h +++ b/PlugY/d2functions.h @@ -1,5 +1,6 @@ /*================================================ File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. This file implements some common and useful function related to some Diablo II mechanisms. @@ -15,9 +16,9 @@ #define E2S(F, A, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N; #define E2F(F, A, R, N, P) typedef R (FASTCALL *T##N) P; extern T##N N; #define E2C(F, A, T, N) extern T* pt##N; -#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; -#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; -#define C7(Z, A,B,C,D,E,F,G, T, N) extern T* pt##N; +#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; +#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; +#define C7(Z, A,B,C,D,E,F,G,H, T, N) extern T* pt##N; #include "../Commons/D2Funcs.h" extern DataTables* SgptDataTables; diff --git a/PlugY/parameters.h b/PlugY/parameters.h index 3e5fc45..f50cf7d 100644 --- a/PlugY/parameters.h +++ b/PlugY/parameters.h @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Modified by 1.13d by L'Autour. Loading parameters from ini file. @@ -7,7 +8,7 @@ #pragma once -#define PLUGY_VERSION "10.00" +#define PLUGY_VERSION "11.00" #define LOG_FILE "PlugY.log" diff --git a/PlugYInstall/PlugYInstall.aps b/PlugYInstall/PlugYInstall.aps index 7cc6293c249f8237f64e349abc79e13195d10653..0be97cdc6ee05a03a61a1d8bf9412ec83bac2cd3 100644 GIT binary patch delta 446 zcmcc7&h(|7X@UZy@kB*Qc}W%qD6nZ_U`V!#@lDLkD=5lOj|s>rO|P7M-$8C;`CWU) z36nz|ssypgYq+*CGBBtBP4Qp|XK(`2|NrX)MHme4clj|MjxfK{R7%CVn7|a+nC(m`v#VQ&-xy4CDo&jth zs@=M9yO|~zI*3g^?c~oWxmnuzw+$yN&`}^+*2(e>=NU~Wzi)UBB(FE-N*e=3U4R(j z1+XbV5y{E%O}aqu_ckdrwoTsHBpHtI6v(qTfCNGplI1`-5V&g1z~JDFtVR#vK!_3s oZXoS5S+Uueu?I-XPL8V=Vr2%3-2n4e0eKEg3=DrJ?`@U_0Q&o6c>n+a delta 374 zcmey;&UB-lX@UZy(L_Z_IUW`UC{So(U`Vlw2?+9ck8v@I3CJl;kDUC#L2hH&J$tr( zpduB9$?KZrCRaFw3t&;F;lhx^2vWqr;K2~i-~^=q|JMhKFfbShAZ$rtuwsZ|2w(_e z@MmxbvRoL9!2BGBQigPf$jQEr#*EIB8y)2*uW`(Qv!W)?a}t@n#Yu{hXYzTcbVi=d z=FY!uI6-a)*}yW{y5T&d$z<-v=RopvV=kl7>&E1Q%Vb0(i{k_<;U z1mwUyKmy@dUASYJfN~&k)f(s_XJj>c7;3nI>I^0qHp@V;Sx MfJQx-e6v{^0M;s6UH||9 diff --git a/PlugYInstall/PlugYInstall.cpp b/PlugYInstall/PlugYInstall.cpp index 2c3c56e..b859adf 100644 --- a/PlugYInstall/PlugYInstall.cpp +++ b/PlugYInstall/PlugYInstall.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Patch D2gfx.dll to install PlugY. @@ -7,41 +8,46 @@ #include #include +#include "../Commons/VersionInfo.h" const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation"; const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit "; -int CALL_LOAD[7] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423}; -BYTE callNewLoad[7][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary +int CALL_LOAD[8] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423,0xAA03}; +BYTE callNewLoad[8][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary {0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary {0xE8,0x8B,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA73875 ;install loadlibrary {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 -BYTE callOldLoad[7][6]={{0xFF,0x15,0x3C,0xC0,0xA7,0x6F}, + {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[7] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA}; -BYTE callNewFree[7][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary +int CALL_FREE[8] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA,0xA9AA}; +BYTE callNewFree[8][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary {0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary {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 -BYTE callOldFree[7][6]={{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.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,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[]={ @@ -108,9 +114,9 @@ enum eFileVersion V111b, V112, V113c, - UNKNOW + V113d }; - +/* int getVersion(FILE *dll) { int ver; @@ -143,7 +149,7 @@ int getVersion(FILE *dll) ver = UNKNOW; return ver; } - +*/ void updateData(int version) { @@ -164,6 +170,7 @@ void updateData(int version) case V111b: case V112: case V113c: + case V113d: CALLER_LOADPLUGY += 0x1000; CALLER_FREEPLUGY += 0x1000; S_INIT += 0x1000; @@ -172,9 +179,16 @@ void updateData(int version) *(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C; *(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C; *(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C; + if (version == V113d) + { + *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D124; + *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D124; + } else + { + *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C; + *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C; + } *(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C; caller_LoadPlugY[13] += 0x10; caller_LoadPlugY[14]++; caller_LoadPlugY[25]++; @@ -192,6 +206,18 @@ void updateData(int version) ////////////////////////////// EXPORTED FUNCTIONS ////////////////////////////// +int GetD2Ver() +{ + char currentpath[MAX_PATH]; + if (! GetD2Path(currentpath, MAX_PATH)) + { + MessageBox(0,"Can't find path to Game.exe.", + boxNameInstall, MB_OK|MB_ICONEXCLAMATION); + exit(0);; + } + return GetD2Version(currentpath); +} + void Patch() { if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n" @@ -215,9 +241,12 @@ void Patch() exit(0); } - int version = getVersion(dll); + //int version = getVersion(dll); + + int version = GetD2Ver(); - if (version == UNKNOW) + //if (version == UNKNOW) + if (version == -1) { MessageBox(0,"Bad version of D2gfx.dll.\n" "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" @@ -341,9 +370,11 @@ void Unpatch() exit(0); } - int version = getVersion(dll); + //int version = getVersion(dll); + int version = GetD2Ver(); - if (version == UNKNOW) + //if (version == UNKNOW) + if (version == -1) { MessageBox(0,"Bad version of D2gfx.dll.\n" "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" diff --git a/PlugYInstall/PlugYInstall.rc b/PlugYInstall/PlugYInstall.rc index 66ed8d3..b62a53f 100644 --- a/PlugYInstall/PlugYInstall.rc +++ b/PlugYInstall/PlugYInstall.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,4,0 - PRODUCTVERSION 1,0,4,0 + FILEVERSION 1,0,5,0 + PRODUCTVERSION 1,0,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,10 +81,10 @@ BEGIN BEGIN BLOCK "040c04b0" BEGIN - VALUE "FileVersion", "1.04" + VALUE "FileVersion", "1.05" VALUE "OriginalFilename", "PlugY_Install.exe" VALUE "ProductName", "PlugY Installation" - VALUE "ProductVersion", "1.04" + VALUE "ProductVersion", "1.05" END END BLOCK "VarFileInfo" diff --git a/PlugYInstall/PlugYInstall.suo b/PlugYInstall/PlugYInstall.suo index b7dd910a771be550cb31b92dbdef1c7990240320..1c9f7b7c4ac2c1857efa13bf975a293f2d41dd30 100644 GIT binary patch delta 1906 zcmb`IT})GF7{{OYaL$32&w?vQN}&jK2xXzruCPcfRv9HA6^I{GH<*(TR|Q5f0a@Ba z;+;hE-0W`gBiqGpj7>~T%tpf9G9p}U5u^8-xC^=PM)3dkh%6?oU9$J&*Ymv3`}KUi zr-{MD=-m^FrId&au#p^6UI?Lcm0DRacxwJn>$O#pg@HvU&#GN{B@j2?HMZr{@@w@E zP4=xUT=l%Jb>|$#lo;SneO~=W3M+bd{s@FH=mHzOFWV9CgVYZOz;SR4Y+$Doc%KAc zfK%W!I0MGOS6~nffv>??AlID3d-$C^iuW`)555IaZ~RH=U)Nuq^SC)vI-4#dV&s{;rD( zh*>fqng*$xXL7sb6kgBm)kQW`rE)MC%bOS3SL74~X|lkd^cAd$_$|$oWtCB0QAo_y z?n(`dtVGM15j7>7KijfSDhXi*O8O+*@-M#Pzc*fPO1*65pa5*?x5j>k&IWqmP!wq! zqvS%-b0H$hnc^;?BT7VNDPz}5B8pasu8>{b1?i69S$o*@%pTFCr4BjBvC`|+!$?lr z@Kp!+v{9Vl+=knWhRS`0AtOj-)X8h*&Vf4WB&irke;!g7LJBY78An2=&_71!kk(dr z;ZsLwwPWE~;a{7M&(Cwj`AQckiA~k?r{Yn*aN-cDl8sl@8je-=n!Z;qSfbb~)wtK< z<%g~({FB4ryHzWWDa2Hs76!wRK7pMRsUp-_I1lhcr@=q$Il{r}L{QokL%BuqY|m4$ z@nA;Y-Kz-+Uds3CJ}lX<@T~i)`%8$KW#Vz2KY3$sKoPc-)9bY;)*`IVF=McAnHyDI zDH9yAb#tqyE}VAT9RvPBQ24&5mD}s%{LrjhRSAtZ(h&;W*%}e%D;O0 zJ*HtD8C_3atKXeWG$aH+DYwTztUS}$3hG1sO`$5LQH5tAyQl;85>08%Ic4}r{@Zxn zj^qD0lYh*uLiVhDYGo z4uVE%pmyA_cJe{;LEl8)lrBKcc;u*`K81&V(1EcQI)r)6^gUelHf5N0`B$ZEfBnoT y(cbrY&&Z25{>{_J^Om-v2iQP<0k^)4EG&&2Y^dpvq`x+q*0(Gm9HFtz6@Cj1Vx#&1 delta 892 zcmZ`&T}V@L6hHsFd++Al)}1q5&TUt>L?<`ehgt+V{HPp5Hz^Amw7wupD02iF!YxF4 zlI#%VThT*MM9V=>JuG^W%+eqT3WA>MC8749e&_3+|NrXe^mO)^ zz=}_k57;d+&J5TjdTn>}@7~`DE-?d;?7&GeW>E-jR0Qp&R$LcfOGa{MiX69c@K>`0trfp-aK=K|N6PoJ{3uex z{g@7@IbB(2Ow3Kx#F)(ZzzuwqT)~kLq&f zO~aYe2KHgrsi0DC!Y2V+6#yUUUq-y2cZ#l27=>MMh1PfpF2hAQPjMB&&yDUX4-CUu z7zYuj+}(=nv2XV4mzmyYOSbtJgKG~l;r_|@gc;9U8SIp}tvrW!NMeDf=shAFn0_}ZOX;|?0GTumz zP?;8nlRIZn4|L;oZ6tTQB`h#jZqzzt1viCkJ#WmkE%)?;2790%df)(|K6*M~FIoK% zh7MvPggRl0QiGu|HF3baklb>}G{!aUD5hFE(5-nK!4MBQVz{vxg3)$e`|o8CHZMbY p5#VQ-u*dORFhF0C!m-e>5Dd|eqG2@bN59yZ(>0x;s-`O%{SD)u0CNBU diff --git a/PlugYInstall/PlugYInstall.vcproj b/PlugYInstall/PlugYInstall.vcproj index bca4a99..b5749fc 100644 --- a/PlugYInstall/PlugYInstall.vcproj +++ b/PlugYInstall/PlugYInstall.vcproj @@ -269,6 +269,14 @@ RelativePath="PlugYInstall.cpp" > + + + + + + + + ') + ); + + IniName: AnsiString; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function InitTranslatedString(_EAX: Integer;_EDX: Integer; iLng: Integer): Boolean; register; +var + IniFile: PIniFile; + CurLng: AnsiString; + S: UTF8String; + i: Integer; +begin + Result := False; + if not FileExists(IniName) then Exit; + + if (iLng < 0)or(iLng > MaxLng) then iLng := 0; + CurLng := sLng[iLng]; + + IniFile := OpenIniFile(IniName); + IniFile.Mode := ifmRead; + for i := 0 to MaxStr do + begin + IniFile.Section := LocalStrings[i].name; + S := IniFile.ValueString(CurLng, ''); + if S <> '' then LocalStrings[i].value := UTF8Decode(S); + end; + for i := 0 to MaxType do + begin + IniFile.Section := StrTypes[i].c; + S := IniFile.ValueString(CurLng, ''); + if S <> '' then + begin + StrTypes[i].s := UTF8Decode(S); + StrTypes[i].k := ''; + end; + end; + Result := True; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function GetTranslatedString(_EAX: Integer;_EDX: Integer; Idx: Integer): PWideChar; register; +begin + if (Idx < 0)or(Idx > MaxStr) then Idx := MaxStr + 1; + Result := @LocalStrings[Idx].Value[1]; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function GetTypeString(_EAX: Integer;out IdxStr: PAnsiChar; Code: Cardinal): PWideChar; register; +var + i: Integer; +begin + i := 0; + while i <= MaxType do + begin + if Code = StrTypes[i].dw then Break; + Inc(i); + end; + if StrTypes[i].k = '' then + IdxStr := nil + else + IdxStr := PAnsiChar(StrTypes[i].k); + Result := PWideChar(StrTypes[i].s); +end; + +function WSprintStringLastGender(buf: PWideChar; lenbuf: Integer; Idx: Integer): Integer; stdcall; +var + i, p, L: Integer; + S: WideString; +begin + S := GetTranslatedString(0,0,Idx); + + if Gender <> '' then + begin + p := Pos(Gender, S); + if p <> 0 then + begin + L := Length(S); + p := p + Length(Gender); + for i := p to L do + if S[i] = '[' then Break; + S := Copy(S, p, i - p); + end; + end; + + Result := Min(lenbuf - 1, Length(S)); + for i := 1 to Result do + buf[i-1] := S[i]; + buf[Result + 1] := #$0000; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function SetMonoString(_EAX: Integer;_EDX: Integer; InStr: PWideChar): PWideChar; register; +var + StrList: PWStrList; + i: Integer; + S: WideString; +begin + Result := InStr; + if Result = nil then Exit; + StrList := NewWStrList; + StrList.Text := InStr; + i := Strlist.Count - 1; + if i = 0 then Exit; + S := StrList.Items[i]; + while i > 0 do + begin + Dec(i); + S := S + '. ' + StrList.Items[i]; + end; + Move(S[1], InStr[0], Length(S) shl 1); +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function CutStringGender(_EAX: Integer;_EDX: Integer; InStr: PWideChar): PWideChar; register; +var + i, j: Integer; +begin + Result := InStr; + Gender := ''; + if (InStr = nil)or(InStr[0] <> '[') then Exit; + i := 1; + while (InStr[i] <> #$0000) do + begin + if InStr[i] = ']' then + begin + if (i < 2)or(InStr[i+1] = #$0000) then Exit; + SetLength(Gender, i + 1); + for j := 0 to i do + Gender[j+1] := InStr[j]; + Result := @InStr[i+1]; + Exit; + end; + Inc(i); + end; +end; + +{ +const + NcColor = 14; + LenCode = 9; + +type + TTextColor = array[0..LenCode - 1] of AnsiChar; + +const + cColor: array[0..NcColor - 1] of TTextColor = ( + ('\','w','h','i','t','e',';',#00,#00), + ('\','g','r','e','y',';',#00,#00,#00), + ('\','r','e','d',';',#00,#00,#00,#00), + ('\','g','r','e','e','n',';',#00,#00), + ('\','b','l','u','e',';',#00,#00,#00), + ('\','g','o','l','d',';',#00,#00,#00), + ('\','d','g','r','e','y',';',#00,#00), + ('\','b','l','a','c','k',';',#00,#00), + ('\','t','a','n',';',#00,#00,#00,#00), + ('\','o','r','a','n','g','e',';',#00), + ('\','y','e','l','l','o','w',';',#00), + ('\','d','g','r','e','e','n',';',#00), + ('\','p','u','r','p','l','e',';',#00), + ('\','c','o','l','o','r',';',#00,#00)); + //lengths of strings in cColor table, without '\' + cColLength: array[0..NcColor-1] of Byte = (6,5,4,6,5,5,6,6,4,7,7,7,7,6); + pColor: PAnsiChar = @cColor[NcColor-1][1]; +var + SaveToTbl: Byte = 0; + +//ANSI convert ColorApi to ColorCode +//optional UCS2 convert '\n' to $0A +function ColorApi2ColorCode(Src: PAnsiChar; Dst: PAnsiChar; + SourceChars: Integer): Integer; +//EAX: Src +//EDX: Dst +//ECX: Length Src +//Result: OutLength -> EAX +asm + //backup + PUSHF + CLD // + PUSH ESI + PUSH EDI + PUSH EBX + PUSH EBP + + PUSH EDX // + MOV EDI, Dst + TEST Src, Src // + JZ @Exit + MOV ESI, Src +// ECX Src +@NextChar: + // EAX + XOR EAX, EAX + LODSB //MOV AL, [ESI]+ + // ( ) + TEST AL, AL + JZ @Exit + // '\' + CMP AL, '\' + JE @Slash + +@CopyChar: + //normal chars + STOSB //MOV [EDI]+, AL + +// +@Loop: + LOOP @NextChar + +@Exit: + MOV BYTE PTR [EDI], $00 // + POP EAX // + XCHG EAX, EDI + //get length of Dst + SUB EAX, EDI + //restore + POP EBP + POP EBX + POP EDI + POP ESI + POPF + RET + +@Slash: + // + CMP ECX, 1 + JB @CopyChar // if ECX < 1 + // + LODSB //MOV AL, [ESI]+ + // + CMP AL, 'n' + JNZ @TestColor + // ECX + DEC ECX + + //test Save2Tbl + CMP SaveToTbl, 0 + JNZ @UnixReturn + //save '\n' + MOV AL, '\' + STOSB //MOV [EDI]+, AL + MOV AL, 'n' + JMP @CopyChar + +@UnixReturn: + //save UnixNewLine + MOV AL, $0A + JMP @CopyChar + +// : +@TestColor: + // + //CMP MacroColorView, $00 + //JE @StoreSlash + + //backup + PUSH ECX + PUSH EDI + // ESI + DEC ESI + // + MOV EBX, ESI + // + MOV EAX, NcColor + // + // ( '') + MOV EBP, pColor + // '\' + //(-1, .. EAX) + LEA EDX, [cColLength - 1] + +@CmpStr: + // + MOV EDI, EBP + // + MOVZX ECX, BYTE PTR [EDX + EAX] + // + //(, , .. Src ) + REPE CMPSB + // + JZ @ColorCode + // + MOV ESI, EBX + // + SUB EBP, LenCode + // + DEC EAX + // + JA @CmpStr //if EAX > 0 +// '\' + //restore + POP EDI + POP ECX +@StoreSlash: + // '\' + MOV AL, '\' + JMP @CopyChar + +// +// AL cColor +@ColorCode: + //restore + POP EDI + // ColorCode + MOVZX EDX, BYTE PTR [EDX + EAX]// + ADD AL, $2E //1..14 + $2E = $2F..$3C + //backup EAX + MOV ECX, EAX + //save ColorCode + MOV AX, $63FF + STOSW //MOVD [EDI]+, AX + //restore EAX + MOV EAX, ECX + //test \color; + CMP AL, $3C + JE @FullColorCode + //add number to ColorCode + STOSB //MOVD [EDI]+, AL + +@FullColorCode: + //restore ECX + POP ECX + SUB ECX, EDX // ECX + JZ @Exit // + //ESI + JMP @NextChar //ECX >= 1 +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +procedure ReplaceColorCode(_EAX: Integer;_EDX: Integer; Str: PAnsiChar); register; +var + i, L, n: Integer; +begin + L := Length(Str); + n := ColorApi2ColorCode(Str, Str, L); + Dec(L); + for i := n to L do + begin + //Str[i] := ' '; + end; + //MsgOK(Str); +end; +} + +//Decode string from UCS2 to UTF8 +//WideCharToMultiByte not support CP_UTF8 in Windows 95 +function UCS2ToUTF8(Dest: PAnsiChar; MaxDestBytes: Integer; + Source: PWideChar; SourceChars: Integer): Integer; +//EAX: @Dest +//EDX: MaxDestBytes +//ECX: @Source +//(ESP): SourceChars; +//Result: DestChars of @Dest -> EAX +asm + //backup + PUSHF + CLD //set (ESI)+ + PUSH EBX + PUSH ESI + PUSH EDI + + PUSH Dest //backup @Dst + MOV EDI, Dest + TEST Source, Source //test NULL string + JZ @Exit + MOV ESI, Source + MOV ECX, SourceChars + +@NextChar: + //test length of Dst + DEC EDX + JLE @Exit + //get next char to EAX + XOR EAX, EAX + LODSW //MOV AX, [ESI]+ + //test NULL char (end of string) + TEST EAX, EAX + JZ @Exit +//decode UCS2 to UTF8 +@Ucs2ToUtf8: + //test UCS2-char in $0000..$007F + CMP AX, $007F + JA @11xxxxxx //if AX > $7F +//UTF8-char: 0xxxxxxx + //AH = 00000000; AL = 0xxxxxxx +@0xxxxxxx: + //save UTF8-char + STOSB //MOVB [EDI]+, AL +//end Loop +@Loop: + LOOP @NextChar + JMP @Exit + +@11xxxxxx: + //test length of Dst + DEC EDX + JLE @Exit + //test UCS2-char in $0080..$07FF + CMP AX, $07FF + JA @1110xxxx //if AX > $07FF +//UTF8-char: 110xxxxx 10xxxxxx + //AH = 00000xxx; AL = xxxxxxxx + //get first byte UTF8-char to AL + ROR AX, 6 //AH = xxxxxx00; AL = 000xxxxx + //get second byte UTF8-char to AH + SHR AH, 2 //AH = 00xxxxxx + OR AX, $80C0 //AH = 10xxxxxx; AL = 110xxxxx + //save UTF8-char + STOSW //MOVW [EDI]+, AX + JMP @Loop + +//UTF8-char: 1110xxxx 10xxxxxx 10xxxxxx +@1110xxxx: + //test length of Dst + DEC EDX + JLE @Exit + //save lobyte of UCS2-char + MOV BL, AL + //AH = xxxxxxxx; AL = xxxxxxxx + //get first byte UTF8-char UTF8 to AL + ROL AX, 4 //AL = ????xxxx; AH = xxxxxx?? + AND AL, $0F //AL = 0000xxxx + //get second byte UTF8-char to AH + SHR AH, 2 //AH = 00xxxxxx + OR AX, $80E0 //AH = 10xxxxxx; AL = 1110xxxx + //save first bytes UTF8-char + STOSW //MOVW [EDI]+, AX + //get second byte UTF8-char to AL + XCHG EAX, EBX //??xxxxxx + AND AL, $3F //00xxxxxx + OR AL, $80 //10xxxxxx + //save third byte UTF8-char + JMP @0xxxxxxx + +@Exit: + MOV BYTE PTR [EDI], $00 //set end-char of Dst + POP EAX //restore @Dst + XCHG EAX, EDI + //get length of Dst to Result + SUB EAX, EDI + //restore + POP EDI + POP ESI + POP EBX + POPF +end; + +function _UCS2ToUTF8(Dest: PAnsiChar; MaxDestBytes: Integer; + Source: PWideChar; SourceChars: Integer): Integer; stdcall; +begin + Result := UCS2ToUTF8(Dest, MaxDestBytes, Source, SourceChars); +end; + +//Decode string from UTF8 to UCS2 +function UTF8ToUCS2(Dest: PWideChar; MaxDestBytes: Integer; + Source: PAnsiChar; SourceChars: Integer): Integer; +//EAX: @Dest +//EDX: MaxDestBytes +//ECX: @Source +//(ESP): SourceChars; +//Result: DestChars of @Dest -> EAX +//if errors then +//Result: -(DestChars of @Dest) -> EAX +asm + //backup + PUSHF + CLD //set (ESI)+ + PUSH EBX + PUSH ESI + PUSH EDI + + PUSH Dest //backup @Dst + MOV EDI, Dest + TEST Source, Source //test NULL string + JZ @Exit + MOV ESI, Source + MOV ECX, SourceChars + +@NextChar: + //test length of Dst + SUB EDX, 2 + JLE @Exit + //get next char to EAX + XOR EAX, EAX + LODSB //MOV AL, [ESI]+ + //test NULL char (end of string) + TEST AL, AL + JZ @Exit +//decode UTF8 to UCS2 +@Utf8ToUcs2: + //test first byte UTF8 = 0xxxxxxx + TEST AL, $80 + JNZ @1xxxxxxx +//UTF8: 0xxxxxxx (AH = 0) +@SaveU16: + STOSW //MOVW [EDI]+, EAX +@Loop: + LOOP @NextChar + JMP @Exit + +@1xxxxxxx: + //test first byte UTF8 = 10xxxxxx + TEST AL, $40 //01000000 + JZ @Exit //Error UTF8: 10xxxxxx + //test first byte UTF8 = 1111xxxx + CMP AL, $F0 //11110000 + JAE @Exit //Error UTF8 to UCS2: 1111xxxx ( if AL >= $F0) + //test exist second byte UTF8 + JECXZ @Exit // DEC ECX; if ECX = 0 + //backup first byte UTF8 + MOV AH, AL //11xxxxxx + //load second byte UTF8 + LODSB //MOV AL, [ESI]+ + //test second byte UTF8 = 10xxxxxx + TEST AL, $40 //01000000 + JNE @Exit //Error UTF8: 10xxxxxx + //test second byte UTF8 = 110xxxxx + TEST AH, $20 //00100000 + JNZ @1110xxxx //third byte UTF8 +//UTF8: 110xxxxx 10xxxxxx + //backup first byte UTF8 + MOV BL, AH //110xxxxx + //get high byte UCS2 + SHR AH, 2 //00110xxx + AND AX, $073F //AH: 00000xxx; AL: 00xxxxxx + //get low byte USC2 + SHL BL, 6 //xx000000 + OR AL, BL //xxxxxxxx + //AX: 00000xxx:xxxxxxxx + JMP @SaveU16 + +@1110xxxx: + //test exist third byte UTF8 + JeCXZ @Exit // DEC ECX; if ECX = 0 + //backup second byte UTF8 + MOV BL, AL //10xxxxxx + //load third byte UTF8 + LODSB //MOV AL, [ESI]+ + //test third byte UTF8 = 10xxxxxx + CMP AL, $C0 //11000000 + JAE @Exit //Error UTF8: 11xxxxxx ( if AL >= $C0) +//UTF8: 1110xxxx 10xxxxxx 10xxxxxx + //get bytes UCS2 : xx00000:0000xxxx + AND BX, $003F //DX := 00000000:00xxxxxx + ROR BX, 2 //BL := 0000xxxx; BH := xx000000 + //get low byte UTF8 + AND AL, $3F //00xxxxxx + OR AL, BH //xxxxxxxx + //get high byte UCS2 + SHL AH, 4 //xxxx0000 + OR AH, BL //xxxxxxxx + JMP @SaveU16 + +@Exit: + XOR EAX, EAX + MOV [EDI],AX //set end-char of Dst + POP EAX //restore @Dst + XCHG EAX, EDI + //get length of Dst to Result + SUB EAX, EDI + SHR EAX, 1 + //restore + POP EDI + POP ESI + POP EBX + POPF +end ; //asm + + +function _UTF8ToUCS2(Dest: PWideChar; MaxDestBytes: Integer; + Source: PAnsiChar; SourceChars: Integer): Integer; stdcall; +begin + Result := UTF8ToUCS2(Dest, MaxDestBytes, Source, SourceChars); +end; + +exports + _UCS2ToUTF8 name '__stdcall UCS2toUTF8', + _UTF8ToUCS2 name '__stdcall UTF8toUCS2', + //ReplaceColorCode name 'replaceColorCode', + SetMonoString name '__fastcall setMonoString', + WSprintStringLastGender name '__stdcall wSprintStringLastGender', + CutStringGender name '__fastcall cutStringGender', + GetTypeString name '__fastcall getTypeString', + GetTranslatedString name '__fastcall getTranslatedString', + InitTranslatedString name '__fastcall initTranslatedString'; + +var + i, j: Integer; + S: UTF8String; + b: Boolean; +begin + IniName := GetStartDir + NamePlugyLocal; + if FileExists(IniName) then Exit; + S := #$EF#$BB#$BF';UTF8'; + for i := 0 to MaxStr do + begin + S := S + #$0D#$0A'[' + LocalStrings[i].name + ']'#$0D#$0A + sLng[0] + '="' + + LocalStrings[i].value + '"'#$0D#$0A; + for j := 1 to MaxLng do + S := S + sLng[j] + '='#$0D#$0A; + end; + for i := 0 to MaxType do + begin + S := S + #$0D#$0A; + b := (StrTypes[i].k <> ''); + if b then + S := S + ';'; + S := S + '[' + StrTypes[i].c + ']'#$0D#$0A; + + if b then + S := S + ';'; + S := S + sLng[0] + '="' + StrTypes[i].s + '"'#$0D#$0A; + if not b then + begin + for j := 1 to MaxLng do + S := S + sLng[j] + '='#$0D#$0A; + end; + end; + StrSaveToFile(IniName, S); +end. diff --git a/PlugYLocal/PlugYLocal.ini b/PlugYLocal/PlugYLocal.ini new file mode 100644 index 0000000..dcec7bf --- /dev/null +++ b/PlugYLocal/PlugYLocal.ini @@ -0,0 +1,1655 @@ +;UTF8 +;Sorry for https:;translate.google.com +[STR_STATS_UNASSIGN_WITH_LIMIT] +ENG="+Alt: Unassign, +Shift: by %d points" +ESP="+Alt: Désallocation, +Shift: par %d points" +DEU="+Alt: Zurücksetzen, +Shift: um %d Punkte" +FRA="+Alt: Rimuovi, +Shift: Assegna %d punti" +POR="+Alt: Quita, +Shift: por %d puntos" +ITA="+Alt: Odejmij, +Shift: %d punktów" +JPN="+Alt: 取消加点, +Shift: %d 点数" +KOR="+Alt: 할당, +Shift: %d 포인트로" +SIN= +CHI="+Alt: 分配, +Shift: %d 分" +POL="+Alt: Przypisywanie, +Shift: o %d punkty" +RUS="+Alt: Вычесть, +Shift: по %d очка" + +[STR_STATS_UNASSIGN_WITHOUT_LIMIT] +ENG="+Alt: Unassign, +Shift: all remaining points" +ESP="+Alt: Désallocation, +Shift: Tous les points restants" +DEU="+Alt: Zurücksetzen, +Shift: Alle verbleibenden Punkte" +FRA="+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti" +POR="+Alt: Quita, +Shift: Todos los puntos restantes" +ITA="+Alt: Odejmij, +Shift: wszystkie pozostale punkty" +JPN="+Alt: 取消加点, +Shift: 所有剩" +KOR="+Alt: 할당, +Shift: 남아있는 모든 포인트를" +SIN= +CHI="+Alt:分配, + Shift: 所有剩余点" +POL="+Alt: Przypisywanie, +Shift: wszystkie pozostałe punkty" +RUS="+Alt: Вычесть, +Shift: все оставшиеся очки" + +[STR_STATS_BASE_MIN] +ENG="Base: %d (Min: %d)" +ESP="Base: %d (Min: %d)" +DEU="Basiswert: %d (Min: %d)" +FRA="Base: %d (Min: %d)" +POR="Base: %d (Min: %d)" +ITA="Bazowo: %d (Minimum: %d)" +JPN="基础: %d (最小: %d)" +KOR="기본: %d (최소: %d)" +SIN= +CHI="基地: %d (最小: %d)" +POL="Podstawowe %d Min.: %d)" +RUS="Базовое: %d (Мин.: %d)" + +[STR_SKILLS_UNASSIGN] +ENG="Un-allocate all skills points" +ESP="Désalloue tous les points d'aptitudes" +DEU="Alle Fertigkeitspunkte zurücksetzen" +FRA="Rimuovi tutte le abilità" +POR="Quita todos los puntos de habilidades" +ITA="Rozdaj od nowa wszystkie punkty umiejetnosci" +JPN="取消所有技能加点" +KOR="모든 스킬 포인트를 해제 할당" +SIN= +CHI="取消分配所有技能點" +POL="Un przydzielić wszystkie punkty umiejętności" +RUS="Сбросить все навыки" + +[STR_STASH_PREVIOUS_PAGE] +ENG="Previous Page (+Shift: First Page)" +ESP="Page précédente (+Shift: Première page)" +DEU="Vorherige Seite (+Shift: Erste Seite)" +FRA="Pagina Precedente (+Shift: Prima Pagina)" +POR="Pagina anterior (+Shift: Primera Pagina)" +ITA="Poprzednia Strona (+Shift: Pierwsza Strona)" +JPN="上一页 (+Shift: 首页)" +KOR="이전 페이지 (+Shift: 첫 페이지)" +SIN= +CHI="上一頁 (+Shift: 第一頁)" +POL="Poprzednia strona (+Shift: pierwsza strona)" +RUS="Предыдущая страница (+Shift: первая страница)" + +[STR_STASH_NEXT_PAGE] +ENG="Next Page (+Shift: Last not empty Page)" +ESP="Page suivante (+Shift: Dernière page non vide)" +DEU="Nächste Seite (+Shift: Letzte nicht leere Seite )" +FRA="Pagina Successiva (+Shift: Ultima Pagina non vuota)" +POR="Pagina Siguiente (+Shift: Ultima pagina non vacia)" +ITA="Nastepna Strona (+Shift: Ostatnia nie pusta Strona)" +JPN="下一页 (+Shift: 最后非空页)" +KOR="다음 페이지 (+Shift: 마지막 비어 있지 않은 페이지)" +SIN= +CHI="下一頁 (+Shift: 最後非空頁)" +POL="Następna strona (+Shift: Ostatnio nie pusta strona)" +RUS="Последняя страница (+Shift: последняя непустая страница)" + +[STR_TOGGLE_TO_PERSONAL] +ENG="Toggle to Personal Stash" +ESP="Voir coffre personnel" +DEU="Wechselt zum persönlichen Goldschatz" +FRA="Vai all'Inventario Personale" +POR="Ver el cofre personal" +ITA="Przejdz do Skrzyni Osobistej" +JPN="切换到个人储物箱" +KOR="개인 은닉로 전환" +SIN= +CHI="切換到個人藏匿處" +POL="Przełącz do osobistego pierś" +RUS="Переключить на личный сундук" + +[STR_TOGGLE_TO_SHARED] +ENG="Toggle to Shared Stash" +ESP="Voir coffre partagé" +DEU="Wechselt zum gemeinsamen Goldschatz" +FRA="Vai all'Inventario Condiviso" +POR="Ver el cofre compartido" +ITA="Przejdz do Skrzyni Wspólnej" +JPN="切换到共享储物箱" +KOR="공유 은닉로 전환" +SIN= +CHI="切換到共享藏匿處" +POL="Przełącz się na wspólnym pierś" +RUS="Переключить на общий сундук" + +[STR_STASH_PREVIOUS_INDEX] +ENG="Previous Index : by %d Pages (+Shift: %d)" +ESP="Index précédent : par %d pages (+shift: %d)" +DEU="Vorheriger Index: in %d Seiten (+shift: %d)" +FRA="Schermata Precedente : Indietro di %d Pagine (+Shift: %d)" +POR="Indice anterior : por %d paginas (+shift: %d)" +ITA="Poprzednia Strona : po %d Stron (+Shift: %d)" +JPN="向前索引 : %d 页 (+Shift: %d)" +KOR="이전 색인 : %d 페이지로 (+Shift: %d)" +SIN= +CHI="上一頁目錄 : %d 個頁面 (+Shift: %d)" +POL="Poprzednie Index : przez %d Pages (+Shift: %d)" +RUS="Переход назад на %d страниц (+Shift: %d)" + +[STR_STASH_NEXT_INDEX] +ENG="Next Index : by %d Pages (+shift: %d)" +ESP="Index suivant : par %d pages (+shift: %d)" +DEU="Nächster Index: in %d Seiten (+shift: %d)" +FRA="Schermata Successiva : Avanti di %d Pagine (+shift: %d)" +POR="Indice siguiente : por %d paginas (+shift: %d)" +ITA="Nastepna Strona : po %d Stron (+shift: %d)" +JPN="向后索引 : %d 页 (+shift: %d)" +KOR="다음 인덱스 : %d 페이지로 (+shift: %d)" +SIN= +CHI="下一頁索引 : %d 個頁面 (+shift: %d)" +POL="Następny Index : przez d% Strony (+shift: %d)" +RUS="Переход вперед : на %d страниц (+shift: %d)" + +[STR_PUT_GOLD] +ENG="Put Gold" +ESP="Poser de l'Or" +DEU="Gib Gold" +FRA="Immetti Oro" +POR="Poner oro" +ITA="Zdeponuj Zloto" +JPN="放入金币" +KOR="골드 넣어" +SIN= +CHI="金放" +POL="Put złoto" +RUS="Добавить золото" + +[STR_TAKE_GOLD] +ENG="Take Gold" +ESP="Prendre de l'Or" +DEU="Nehme Gold" +FRA="Ritira Oro" +POR="Tomar oro" +ITA="Wyplac zloto" +JPN="取出金币" +KOR="금을" +SIN= +CHI="拿到金牌" +POL="Weź złoto" +RUS="Забрать золото" + +[STR_PERSONAL_PAGE_NUMBER] +ENG="Personal Page n°%u" +ESP="Page perso n°%u" +DEU="Persönliche Seite n°%u" +FRA="Pagina Personale n°%u" +POR="Pagina personal n°%u" +ITA="Strona Osobista n°%u" +JPN="个人储物箱 n°%u" +KOR="개인 페이지 n°%u" +SIN= +CHI="個人主頁 n°%u" +POL="Strona osobista n°%u" +RUS="Личная страница n°%u" + +[STR_SHARED_PAGE_NUMBER] +ENG="Shared Page n°%u" +ESP="Page partagée n°%u" +DEU="Gemeinsame Seite n°%u" +FRA="Pagina Condivisa n°%u" +POR="Pagina personal n°%u" +ITA="Strona Wspólna n°%u" +JPN="共享储物箱 n°%u" +KOR="공유 페이지 n°%u" +SIN= +CHI="共享頁 n°%u" +POL="Wspólna strona n°%u" +RUS="Общая страница N°%u" + +[STR_NO_SELECTED_PAGE] +ENG="No selected page" +ESP="Aucune page sélectionnée" +DEU="Keine ausgewählte Seite" +FRA="Nessuna pagina selezionata" +POR="Ninguna pagina seleccionada" +ITA="Nie zaznaczono strony" +JPN="未使用页" +KOR="없음 선택한 페이지가 없습니다" +SIN= +CHI="沒有選擇的頁" +POL="Nie wybrano stronę" +RUS="Нет указанной страницы" + +[STR_SHARED_GOLD_QUANTITY] +ENG="Shared Gold : %u" +ESP="Or partagé : %u" +DEU="Gemeinsamen Gold : %u" +FRA="Oro Condiviso : %u" +POR="Oro compartido : %u" +ITA="Wspólne Zloto : %u" +JPN="共享金币 : %u" +KOR="공유 골드 : %u" +SIN= +CHI="共享金 : %u" +POL="Wspólna Złoto : %u" +RUS="Общее золото : %u" + +[STR_PREVIOUS_PAGE] +ENG="Previous Page" +ESP="Page précédente" +DEU="Vorherige Seite" +FRA="Pagina Precedente" +POR="Pagina anterior" +ITA="Poprzednia Strona" +JPN="上一页" +KOR="이전 페이지" +SIN= +CHI="上一頁" +POL="Poprzednia strona" +RUS="Предыдущая страница" + +[STR_NEXT_PAGE] +ENG="Next Page" +ESP="Page suivante" +DEU="Nächste Seite" +FRA="Pagina Successiva" +POR="Pagina siguiente" +ITA="Nastepna Strona" +JPN="下一页" +KOR="다음 페이지" +SIN= +CHI="下一頁" +POL="Następna strona" +RUS="Следующая страница" + +[STR_ITEM_LEVEL] +ENG="Item Level: %u" +ESP="Nivel de objeto: %u" +DEU="Gegenstandsstufe: %u" +FRA="Niveau d'objet: %u" +POR="Nível do item: %u" +ITA="Livello oggetto" +JPN="アイテム・レベル: %u" +KOR="아이템 레벨: %u" +SIN= +CHI="物品等級: %u" +POL="Poziom przedmiotu: %u" +RUS="Уровень предмета: %u" + +;who should - add translation +[STR_COW_PORTAL] +ENG="Cow Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Коровий портал" + +[STR_PANDEMONIUM_PORTAL] +ENG="Pandemonium Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Адский Портал" + +[STR_PANDEMONIUM_FINAL_PORTAL] +ENG="Pandemonium Final Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Финальный Адский Портал" + +[STR_FULL] +ENG="Fully " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Полностью " + +[STR_REPAIR] +ENG="Repair " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Починенный [fs]Починенная [ns]Починенное [pl]Починенные " + +[STR_AND] +ENG="and " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="и " + +[STR_RECHARGE] +ENG="Recharge " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Перезаряженный [fs]Перезаряженная [ns]Перезаряженное [pl]Перезаряженные " + +[STR_DESTROY_FILLERS] +ENG="Destroys Fillers " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Без ячеек " + +[STR_REMOVE_FILLERS] +ENG="Remove Fillers " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="С пустыми ячейками в " + +[STR_REGENERATE] +ENG="Regenerate " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Восстановленный [fs]Восстановленная [ns]Восстановленное [pl]Восстановленные " + +[STR_WITH_N_SOCKETS] +ENG="with %u Sockets " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="c %u ячейками " + +[STR_ETHERAL] +ENG="Ethereal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Эфирный [fs]Эфирная [ns]Эфирное [pl]Эфирные " + +[STR_NOT_ETHERAL] +ENG="Not Ethereal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Не эфирный [fs]Не эфирная [ns]Не эфирное [pl]Не эфирные " + +[STR_NOT_RUNEWORD] +ENG="Not Runeword " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Без рунного слова " + +[STR_BASIC] +ENG="Basic " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Простой [fs]Простая [ns]Простое [pl]Простые " + +[STR_EXCEPTIONAL] +ENG="Exceptional " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Исключительный [fs]Исключительная [ns]Исключительное [pl]Исключительные " + +[STR_ELITE] +ENG="Elite " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Элитный [fs]Элитная [ns]Элитное [pl]Элитные " + +[STR_CRACKED] +ENG="Cracked " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Сломанный [fs]Сломанная [ns]Сломанное [pl]Сломанные " + +[STR_NORMAL] +ENG="Normal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Нормальный [fs]Нормальная [ns]Нормальное [pl]Нормальные " + +[STR_SUPERIOR] +ENG="Superior " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Превосходный [fs]Превосходная [ns]Превосходное [pl]Превосходные " + +[STR_MAGIC] +ENG="Magic " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Магический [fs]Магическая [ns]Магическое [pl]Магические " + +[STR_SET] +ENG="Set " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Наборный [fs]Наборная [ns]Наборное [pl]Наборные " + +[STR_RARE] +ENG="Rare " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Редкий [fs]Редкая [ns]Редкое [pl]Редкие " + +[STR_UNIQUE] +ENG="Unique " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Уникальный [fs]Уникальная [ns]Уникальное [pl]Уникальные " + +[STR_CRAFTED] +ENG="Crafted " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Создаваемый [fs]Создаваемая [ns]Создаваемое [pl]Создаваемые " + +[STR_TEMPERED] +ENG="Tempered " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Закаленный [fs]Закаленная [ns]Закаленное [pl]Закаленные " + +[STR_ITEM] +ENG="Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет" + +[STR_ITEM_SAME_TYPE] +ENG="Item of the same type" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет того же типа" + +[STR_OR_UPGRADED] +ENG=" (or upgraded)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (или выше уровнем)" + +[STR_WITHOUT_SOCKET] +ENG=" without Socket" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" без ячеек" + +[STR_WITH_SOCKET] +ENG=" with Sockets" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" с ячейками" + + +[STR_ONLY_N_H] +ENG=" (Nightmare and Hell only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только на уровнях Кошмар и Ад)" + +[STR_ONLY_HELL] +ENG=" (Hell only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только на уровне Ад)" + +[STR_ONLY_CLASS] +ENG=" (%s only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только %s)" + +[shie] +ENG="Shield (Not Class Specific)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Щит (без привязки к классу)" + +[tors] +ENG="Body Armor" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Нательная броня" + +;[gold] +;ENG="Gold" + +;[bowq] +;ENG="Arrows" + +;[xboq] +;ENG="Bolts" + +;[play] +;ENG="Ear" + +;[herb] +;ENG="Herb" + +[poti] +ENG="Potion" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Зелье" + +;[ring] +;ENG="Ring" + +;[elix] +;ENG="Elixir" + +;[amul] +;ENG="Amulet" + +[char] +ENG="Charm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[msы]Талисман" + +;[boot] +;ENG="Boots" + +[glov] +ENG="Gloves" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[pl]Перчатки" + +[book] +ENG="Book" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Книга" + +;[belt] +;ENG="Belt" + +[gem ] +ENG="Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Драгоценный камень" + +;[torc] +;ENG="Torch" + +[scro] +ENG="Scroll" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Свиток" + +;[scep] +;ENG="Scepter" + +;[wand] +;ENG="Wand" + +[staf] +ENG="Staff" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Посох" + +[bow ] +ENG="Bow" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Лук" + +;[axe ] +;ENG="Axe" + +;[club] +;ENG="Club" + +[swor] +ENG="Sword" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Меч" + +[hamm] +ENG="Hammer" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Молот" + +[knif] +ENG="Knife" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Нож" + +;[spea] +;ENG="Spear" + +[pole] +ENG="Polearm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Алебарада" + +;[xbow] +;ENG="Crossbow" + +;[mace] +;ENG="Mace" + +;[helm] +;ENG="Helm" + +[tpot] +ENG="Missile Potion" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Зелье стрельбы" + +[ques] +ENG="Quest Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Квестовая вещь" + +[body] +ENG="Body Part" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Часть тела" + +;[key ] +;ENG="Key" + +;[tkni] +;ENG="Throwing Knife" + +;[taxe] +;ENG="Throwing Axe" + +;[jave] +;ENG="Javelin" + +[weap] +ENG="Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Оружие" + +[mele] +ENG="Melee Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Оружие ближнего боя" + +[miss] +ENG="Missile Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Стреляющее оружие" + +[thro] +ENG="Throwing Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Метательное оружие" + +[comb] +ENG="Combo Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Комбинированное оружие" + +[armo] +ENG="Armor" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Броня" + +[shld] +ENG="Any Shield" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Любой щит" + +[misc] +ENG="Miscellaneous" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Любой предмет" + +[sock] +ENG="Socket Filler" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS= + +[seco] +ENG="Second Hand Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для второй руки" + +[rod ] +ENG="Staves And Rods" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[pl]Посохи и Жезлы" + +[misl] +ENG="Missile" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Снаряд" + +[blun] +ENG="Blunt" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Тупое оружие" + +;[jewl] +;ENG="Jewel" + +[clas] +ENG="Class Specific" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS= + +[amaz] +ENG="Amazon Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для амазонки" + +[barb] +ENG="Barbarian Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для варвара" + +[necr] +ENG="Necromancer Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для некроманта" + +[pala] +ENG="Paladin Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для паладина" + +[sorc] +ENG="Sorceress Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для волшебницы" + +[assn] +ENG="Assassin Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для ассасины" + +[drui] +ENG="Druid Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для друида" + +[h2h ] +ENG="Claw" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Коготь" + +[h2h2] +ENG="Assassin Claw" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Коготь ассасин" + +[orb ] +ENG="Orb" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Сфера" + +[head] +ENG="Voodoo Heads" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Голова Вуду" + +[ashd] +ENG="Paladin Shield" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Щит паладина" + +[phlm] +ENG="Barbarian Helm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Шлем варвара" + +[pelt] +ENG="Druid Helm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Шлем друида" + +;[cloa] +;ENG="Cloak" + +[rune] +ENG="Rune" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Руна" + +;[circ] +;ENG="Circlet" + +;[hpot] +;ENG="Healing Potion" + +;[mpot] +;ENG="Mana Potion" + +;[rpot] +;ENG="Rejuvenation potion" + +;[spot] +;ENG="Stamina Potion" + +;[apot] +;ENG="Antidote Potion" + +;[wpot] +;ENG="Thawing Potion" + +;[scha] +;ENG="Small Charm" + +;[mcha] +;ENG="Large Charm" + +;[lcha] +;ENG="Grand Charm" + +[abow] +ENG="Amazon Bow" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Лук амазонки" + +[aspe] +ENG="Amazon Spear" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Копье амазонки" + +[ajav] +ENG="Amazon Javelin" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Дротик амазонки" + +[mboq] +ENG="Magic Arrows" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Магические стрелы" + +[mxbq] +ENG="Magic Bolts" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Магические арбалетные стрелы" + +[gem0] +ENG="Chipped Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Надколотый драгоценный камень" + +[gem1] +ENG="Flawed Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Мутный драгоценный камень" + +[gem2] +ENG="Normal Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Нормальный драгоценный камень" + +[gem3] +ENG="Flawless Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Безупречный драгоценный камень" + +[gem4] +ENG="Perfect Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Идеальный драгоценный камень" + +;[gema] +;ENG="Amethyst" + +;[gemd] +;ENG="Diamond" + +;[geme] +;ENG="Emerald" + +;[gemr] +;ENG="Ruby" + +;[gems] +;ENG="Sapphire" + +;[gemt] +;ENG="Topaz" + +;[gemz] +;ENG="Skull" diff --git a/PlugYLocal/PlugYLocal.res b/PlugYLocal/PlugYLocal.res new file mode 100644 index 0000000000000000000000000000000000000000..d817fadb3d74003156c1cdcd6759fbd51eed7765 GIT binary patch literal 1580 zcmZuw&rcIU7=3Lwv7`n{q5)4d8v@1yvMDh!CW5inU{Ht{5>Es{R$?hlE!}X@5)N+C z1OI}50;Cs{iAg>AKX@|HgExD_M8f#K*`2naAH2@I`QG_j=Zqq3w!Gv- zz3%%PhG*zc27&*gUhDE82&%5XX#&!r@(i!X36#o@(rx{)d?M0=1xACw4P4j6Bh3Pb zL3Og9zdxaS+|+{ttTGU5ioxQcnY*~%te7nxWYlvSw7D|;S$i~T&YmCB#}}do4gNN zGv-GTd?vnYtxvA7i)ljZK|IDi%;O1hAB!BV^}h>w z4GH9Oj(HXGiW2zHeM{NCw=`g{kNz2^TEQ|_`TGD*Ih!{XR!zMk=VG6nU)+kkMS)l} z&PD{1(0bw}oSB7X)KJA1%J5O-Si(zYE@Klr6n-_DY0Pk^w}~0{ARW2Pmf&7@u#F1V zsNdtR*T`Pl^tfR(HfMpJH&{2dDy+H1*m74pjWpF(yFzW1>Ym2K6sud<`qF33Xv?f! zy3oOdslPzKZ@kiNg?-9yeY|31WKo|z-7_lIu)(-(j#a#7C)SD>V%Ehthn$+!wS5bV zPGE_vyR7mY3#__sR8!1Z;-A*5J|xOjpwrVr8PyU;as^=j>X4OB7n2TVIOjP ze15OX(J>Kl1>bCcSHSb>Sp3d?Per{rrLFq8)L#XpYNdZf$2FxHSP(!yk843MZ2Z5x zlyL+oPx-=dq6QAwF$6a}@WBr+Tpa1Z1On^@=}c2aGd*hN1O-KyMK!8WOk1`A^4Ze< z%y=nD&k{1J`izhdw)Mk0u|k7}neDt`jW;nul*2?vMz*-6D45w!e+6-k;laXdx;no{8PiCoMnKmg$N{rBIIP(=?|BvJV delta 478 zcmdn9g6YO`rU?p+S`!r|O?X%spkU8L28I-?n1CRE_ZSzWn1Gzp^hgL9RGJ58=oKY1 zY|JxqU_3H;p+l7bx`xR*j=GqFS&j;fDU*90B{dP&r7&1A#4rRf1TpwCxC2=(3`Ssn z4nrwJIz!~-i;mii&XfN-%1=Jv6g9cYNeIr%n{41L#mF<++qs;PXY*m_oi>avlWQB~ zf#loNyHHcXan6rWttIEm4CGI!H?M&r%5n=<*OwSdZ8 zfY^f}oWTi5|Njrt2m(Bl<0l0I{kUpgx!wH&E_O{p5Z1dTe4KYa1s2tJh-%c_Cu*+R6H?EO|MLNHHju}_fb0+e+IDzO diff --git a/PlugYRun/PlugYRun.cpp b/PlugYRun/PlugYRun.cpp index 4b0552d..9175dec 100644 --- a/PlugYRun/PlugYRun.cpp +++ b/PlugYRun/PlugYRun.cpp @@ -1,9 +1,11 @@ /* File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. */ #include #include #include +#include "../Commons/VersionInfo.h" //#using //#using //using namespace EnvDTE; @@ -32,13 +34,14 @@ $+40 >CD AB BA DC 00 00 00 00 ͫ */ #define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" -#define GAMEFILE "\\Game.exe " +#define GAMEFILE "\\Game.exe" #define INIFILE "\\PlugY.ini" #define LAUNCHING "LAUNCHING" #define LOD_VERSION "LodVersionFolder" #define PARAM "Param" #define LIBRARY_NAME "Library" + BYTE loadDll[]={ 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA @@ -101,6 +104,7 @@ BYTE freeDll[]={ //LPCSTR dllName = "PlugY.dll"; LPCSTR initFctName = "_Init@4"; LPCSTR releaseFctName = "_Release@0"; + static bool versionXP; typedef int (__stdcall* tDebugActiveProcessStop)(DWORD); @@ -113,24 +117,27 @@ void assertion(LPCSTR msg) exit(1); } -bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) +bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd, int ver) { BYTE buf[200]; DWORD pos=0; SIZE_T nb=0; - DWORD version; + SIZE_T nb2=0; + //DWORD version; int res; - - // Get Version and needed addresses. - res = ReadProcessMemory(h,(LPVOID)(addr+0x110),&version,4,&nb);//0x80 - if (!res || (nb!=4)) assertion("Read to get current d2gfx version in memory failed"); + + // Get Version and needed addresses. +/* res = ReadProcessMemory(h,(LPVOID)(addr+0x110),&version,4,&nb);//0x80 + if (!res || (nb!=4)) assertion("Read to get current d2gfx version in memory failed"); +*/ DWORD loadCallerAddr = addr; DWORD freeCallerAddr = addr; DWORD loadLibraryAddr = addr; DWORD freeLibraryAddr = addr; DWORD getProcAddressAddr = addr; // GET_VERSION(D2gfx, 110, 000054EB, 00001000, 0000C000, 42E6C22A, 43028B19);//110 +/* switch (version) { case 0x000054EB://1.09b 0x00949FA8: @@ -169,7 +176,7 @@ bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) freeLibraryAddr += 0xD12C; getProcAddressAddr += 0xD120; break; - case 0x00000000://1.13c + case 0x00000000://1.13 loadCallerAddr += 0xB423; freeCallerAddr += 0xB3CA; loadLibraryAddr += 0xD11C; @@ -178,8 +185,67 @@ bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) break; default: assertion("Wrong version of the library D2gfx.dll"); + }*/ + + switch (ver) + { + 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; + default: + return false;//assertion("Wrong version of the Game.exe"); } +//const char sD2Ver[8][7] = {{"v1.09b"},{"v1.09d"},{"v1.10 "},{"v1.11 "},{"v1.11b"},{"v1.12 "},{"v1.13c"},{"v1.13d"}}; +//assertion(sD2Ver[version]); + //Verify if memory are ok. bool alreadyInstalled = false; res = ReadProcessMemory(h,(LPVOID)loadCallerAddr,buf,6,&nb); @@ -360,7 +426,7 @@ bool launchNormal(char* command, char* currentDirectory) return success?true:false; } -bool launchGame98(char* command, char* currentDirectory, char* libraryName) +bool launchGame98(char* command, char* currentDirectory, char* libraryName, int ver) { // MessageBox(0, "LAUNCH 98", "PlugYRun", MB_OK|MB_ICONASTERISK); STARTUPINFO si; @@ -383,14 +449,14 @@ bool launchGame98(char* command, char* currentDirectory, char* libraryName) if (isD2gfx(pi.hProcess,(LPVOID)0x6FA80000)) { // MessageBox(0, "INSTALL 98", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, 0x6FA80000, libraryName, 1); + installPlugY(pi.hProcess, 0x6FA80000, libraryName, 1, ver); ResumeThread(pi.hThread); return true; } if (isD2gfx(pi.hProcess,(LPVOID)0x6FA70000)) { // MessageBox(0, "INSTALL 98", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, 0x6FA70000, libraryName, 0); + installPlugY(pi.hProcess, 0x6FA70000, libraryName, 0, ver); ResumeThread(pi.hThread); return true; } @@ -401,7 +467,7 @@ bool launchGame98(char* command, char* currentDirectory, char* libraryName) } -bool launchGameXP(char* command, char* currentDirectory, char* libraryName) +bool launchGameXP(char* command, char* currentDirectory, char* libraryName, int ver) { // MessageBox(0, "LAUNCH XP", "PlugYRun", MB_OK|MB_ICONASTERISK); STARTUPINFO si; @@ -442,7 +508,7 @@ bool launchGameXP(char* command, char* currentDirectory, char* libraryName) if(isD2gfx(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll)) { // MessageBox(0, "INSTALL XP", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000); + installPlugY(pi.hProcess, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000, ver); CloseHandle(DebugEvent.u.LoadDll.hFile); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); @@ -465,6 +531,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine char currrentDirectory[MAX_PATH]; char iniFileName[MAX_PATH]; char command[MAX_PATH+50]; + int ver; // MessageBox(NULL,"START","PlugYRun",MB_OK); //Get Current Directory. @@ -489,6 +556,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine if (!getWinReg(command, MAX_PATH+50)) return 1; + ver = GetD2Version(command); + if (ver == -1) assertion("Wrong version of the Game.exe"); + strcat(command, " "); + //Add params. strcat(command,lpCmdLine); len = strlen(command); @@ -496,7 +567,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine //copyLodVersionFiles(); - char libraryName[50]; + char libraryName[50]; if (!GetPrivateProfileString(LAUNCHING,LIBRARY_NAME,"",libraryName,50,iniFileName) || !libraryName[0]) return !launchNormal(command, currrentDirectory); @@ -506,9 +577,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { debugActiveProcessStop = (tDebugActiveProcessStop) GetProcAddress(module,"DebugActiveProcessStop"); if (debugActiveProcessStop) - return !launchGameXP(command, currrentDirectory, libraryName); + return !launchGameXP(command, currrentDirectory, libraryName, ver); } - return !launchGame98(command, currrentDirectory, libraryName); + return !launchGame98(command, currrentDirectory, libraryName, ver); } diff --git a/PlugYRun/PlugYRun.rc b/PlugYRun/PlugYRun.rc index 289a11d..d5bcbde 100644 --- a/PlugYRun/PlugYRun.rc +++ b/PlugYRun/PlugYRun.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,3,0 - PRODUCTVERSION 1,0,3,0 + FILEVERSION 1,0,5,0 + PRODUCTVERSION 1,0,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,11 +81,12 @@ BEGIN BEGIN BLOCK "040c04b0" BEGIN + VALUE "Comments", "Modified by L'Autour" VALUE "CompanyName", "Yohann NICOLAS" - VALUE "FileVersion", "1.03" + VALUE "FileVersion", "1.05" VALUE "OriginalFilename", "PlugY.exe" VALUE "ProductName", "PlugY launcher." - VALUE "ProductVersion", "1.03" + VALUE "ProductVersion", "1.05" END END BLOCK "VarFileInfo" diff --git a/PlugYRun/PlugYRun.suo b/PlugYRun/PlugYRun.suo index f38be8e2d319fdf07096e917289993b2b7ea3b8b..cca6eed0c8c9333e0f3830082b45c07d8dbcb45e 100644 GIT binary patch delta 9716 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 delta 952 zcmY*Y-%C?*6hG(g-n&ibT63)}r<J(ulD4cP-k>3C z8w&YEl{Kq~=%J0`kK~OzC>^h|z-i#X5QGGzpa*VK*7il$p|z=z%y#Q8*<8qmZ~&U2 z8?Gu3>;pPUt3latK1LetJFAnq0W-cBO60Ey(MqX}#DL9GGI8+P&mSY9=>_wP+1AxJ z6q`(vBQT6QiX|FpxbI}9Y|f-^kk)=a)Ctg9SsR5s=V;j7gqEEW+#(9!kv2W|(Mv<+ z6A1M1x>E^MJQ8Twd&a2d$Yer_?v2o;stWq-i;y(n&r~;aV!4eoQL1{eNZZu^Vx|r~ zwV#4IenQMaO}fY4YU^mMqT1RIiECVZKX{;to7D^56!O(_1yNTrB`qyi%PcPf(OfYs=Lg+E2x#*+4Kq0xT}T2lb`+qR|qN< diff --git a/PlugYRun/PlugYRun.vcproj b/PlugYRun/PlugYRun.vcproj index cef86b6..ffaa739 100644 --- a/PlugYRun/PlugYRun.vcproj +++ b/PlugYRun/PlugYRun.vcproj @@ -174,7 +174,7 @@ /> @@ -189,6 +189,14 @@ RelativePath="PlugYRun.cpp" > + + + + + + + +