From 2597bc394645927ae31587f53857dab7ee9b9f5b Mon Sep 17 00:00:00 2001 From: ChaosMarc Date: Mon, 4 Jan 2021 08:07:29 +0100 Subject: [PATCH] v14.00 by Yohann --- Commons/D2Funcs.h | 781 +++++------ Commons/D2UnitStruct.h | 521 +++++--- Commons/d2BinFile.h | 1061 ++++++++------- Commons/d2StringTblStruct.h | 2 +- Commons/d2Struct.h | 29 +- Commons/d2constants.h | 72 +- PlugY/BigStash.cpp | 46 +- PlugY/ClientSaveFile.cpp | 8 +- PlugY/Commands.cpp | 247 +++- PlugY/Common.cpp | 2 +- PlugY/D2functions.cpp | 547 ++++---- PlugY/D2wrapper.cpp | 116 +- PlugY/Error.cpp | 48 +- PlugY/ExtendedSaveFile.cpp | 29 +- PlugY/ExtraOptions.cpp | 493 +++++-- PlugY/GlobalVariable.cpp | 78 +- PlugY/INIfile.cpp | 4 +- PlugY/InfinityStash.cpp | 461 ++++--- PlugY/Interface_Skills.cpp | 79 +- PlugY/Interface_Stash.cpp | 418 +++--- PlugY/Interface_Stats.cpp | 131 +- PlugY/Language.cpp | 23 +- PlugY/LoadPlayerData.cpp | 148 ++- PlugY/LocalizedStrings.cpp | 70 +- PlugY/LocalizedStrings.h | 30 +- PlugY/MainScreen.cpp | 103 +- PlugY/ModifMemory.cpp | 11 +- PlugY/NewInterface_CubeListing.cpp | 5 +- PlugY/NewInterface_Runewords.cpp | 37 +- PlugY/NewInterface_Stats.cpp | 18 +- PlugY/NewInterface_StatsPageTwo.cpp | 295 +++-- PlugY/NewInterfaces.cpp | 193 +-- PlugY/OthersFeatures.cpp | 8 +- PlugY/Parameters.cpp | 561 ++++++-- PlugY/PlayerCustomData.cpp | 196 ++- PlugY/PlugY.rc | Bin 5084 -> 5084 bytes PlugY/PlugY.sln | 61 +- PlugY/PlugY.suo | Bin 44032 -> 102912 bytes PlugY/PlugY.vcproj | 1180 ++++++++--------- PlugY/PlugYFiles.cpp | 232 ++-- PlugY/SavePath.cpp | 144 +- PlugY/SavePlayerData.cpp | 527 +++++--- PlugY/SharedSaveFile.cpp | 42 +- PlugY/SkillPerLevelUp.cpp | 32 +- PlugY/SkillsPoints.cpp | 6 +- PlugY/StatPerLevelUp.cpp | 30 +- PlugY/StatsPoints.cpp | 123 +- PlugY/UberQuest.cpp | 520 +++++--- PlugY/UpdateClient.cpp | 39 +- PlugY/UpdateServer.cpp | 81 +- PlugY/Windowed.cpp | 18 +- PlugY/WorldEvent.cpp | 136 +- PlugY/clientSaveFile.h | 2 +- PlugY/common.h | 3 - PlugY/customData.h | 2 +- PlugY/d2functions.h | 15 +- PlugY/d2wrapper.h | 13 +- PlugY/error.h | 5 +- PlugY/extendedSaveFile.h | 2 +- PlugY/extraOptions.h | 21 +- PlugY/infinityStash.h | 56 +- PlugY/loadPlayerData.h | 2 +- PlugY/mainScreen.h | 2 +- PlugY/modifMemory.h | 6 +- PlugY/newInterfaces.h | 1 + PlugY/parameters.h | 4 +- PlugY/playerCustomData.h | 14 +- PlugY/plugYFiles.h | 2 +- PlugY/savePath.h | 2 +- PlugY/savePlayerData.h | 6 +- PlugY/sharedSaveFile.h | 2 +- PlugY/skillsPoints.h | 2 +- PlugY/uberQuest.h | 27 + PlugY/updateServer.h | 3 +- PlugYInstall/PlugYInstall.cpp | 6 +- PlugYInstall/PlugYInstall.rc | 124 +- PlugYInstall/PlugYInstall.suo | Bin 14336 -> 15360 bytes PlugYInstall/PlugYInstall.vcproj | 604 ++++----- PlugYInstaller/PlugY.ini | 48 +- PlugYInstaller/PlugY.nsi | 58 +- PlugYInstaller/PlugY/LocalizedStrings.ini | Bin 49806 -> 52696 bytes PlugYInstaller/PlugY/PlugYDefault.ini | 68 +- PlugYInstaller/PlugY/PlugYFixed.ini | 2 +- PlugYInstaller/PlugY/statsinterface.txt | 2 + PlugYInstaller/PlugY/translations/CHI.json | 148 --- PlugYInstaller/PlugY/translations/DEU.json | 148 --- PlugYInstaller/PlugY/translations/ENG.json | 148 --- PlugYInstaller/PlugY/translations/ESP.json | 148 --- PlugYInstaller/PlugY/translations/FRA.json | 148 --- PlugYInstaller/PlugY/translations/ITA.json | 148 --- PlugYInstaller/PlugY/translations/JPN.json | 148 --- PlugYInstaller/PlugY/translations/KOR.json | 148 --- PlugYInstaller/PlugY/translations/POL.json | 148 --- PlugYInstaller/PlugY/translations/POR.json | 148 --- PlugYInstaller/PlugY/translations/RUS.json | 148 --- PlugYInstaller/PlugY/translations/SIN.json | 148 --- .../PlugY/translations/json_to_ini.py | 42 - .../PlugY_The_Survival_Kit_-_Liesmich.txt | 600 +++++---- .../PlugY_The_Survival_Kit_-_LisezMoi.txt | 578 ++++---- .../PlugY_The_Survival_Kit_-_Readme.txt | 666 +++++----- .../PlugY_The_Survival_Kit_-_讀我檔案.txt | Bin 0 -> 47710 bytes PlugYRun/PlugYRun.cpp | 4 +- PlugYRun/PlugYRun.rc | Bin 6264 -> 6264 bytes PlugYRun/PlugYRun.suo | Bin 32256 -> 33280 bytes PlugYRun/PlugYRun.vcproj | 462 +++---- README.md | 51 +- 106 files changed, 7790 insertions(+), 7535 deletions(-) delete mode 100644 PlugYInstaller/PlugY/translations/CHI.json delete mode 100644 PlugYInstaller/PlugY/translations/DEU.json delete mode 100644 PlugYInstaller/PlugY/translations/ENG.json delete mode 100644 PlugYInstaller/PlugY/translations/ESP.json delete mode 100644 PlugYInstaller/PlugY/translations/FRA.json delete mode 100644 PlugYInstaller/PlugY/translations/ITA.json delete mode 100644 PlugYInstaller/PlugY/translations/JPN.json delete mode 100644 PlugYInstaller/PlugY/translations/KOR.json delete mode 100644 PlugYInstaller/PlugY/translations/POL.json delete mode 100644 PlugYInstaller/PlugY/translations/POR.json delete mode 100644 PlugYInstaller/PlugY/translations/RUS.json delete mode 100644 PlugYInstaller/PlugY/translations/SIN.json delete mode 100644 PlugYInstaller/PlugY/translations/json_to_ini.py create mode 100644 PlugYInstaller/PlugY_The_Survival_Kit_-_讀我檔案.txt diff --git a/Commons/D2Funcs.h b/Commons/D2Funcs.h index 1aa0268..22c2299 100644 --- a/Commons/D2Funcs.h +++ b/Commons/D2Funcs.h @@ -1,10 +1,10 @@ /*====================================================================== File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. - Declares the type for a STDCALL or FASTCALL function pointer - called N with arguments list P, returning R, namedInDLL D and at @A + Declares the type for a STDCALL or FASTCALL function pointer + called N with arguments list P, returning R, namedInDLL D and at @A ======================================================================*/ @@ -149,144 +149,143 @@ -//F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID)); -F8(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907, 21AED0, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); -F8(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691, 21A1B0, DWORD, D2GetLevelID, (Room* ptRoom)); -F8(STD, D2Common,10138,10138,10138,10623,10491,11043,10654,10716, 24E810, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); -//F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit)); -F8(STD, D2Common,10242,10242,10242,00000,00000,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); -F8(STD, D2Common,10246,10246,10246,10855,10813,10289,10133,10402, 23B950, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line)); -F8(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490, 23AD90, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); -F8(STD, D2Common,10249,10249,10249,10880,11068,10436,11107,10963, 23BCC0, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll -F8(STD, D2Common,10250,10250,10250,00000,00000,00000,00000,00000, 00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll -//F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); -F8(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000, 00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknown)); -F8(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040, 23B2C0, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); -F8(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879, 23DFA0, Unit*, D2UnitGetNextItem, (Unit* ptItem)); -F8(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897, 23DFD0, Unit*, D2GetRealItem, (Unit* ptUnit)); -//F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar)); -//F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar)); -F8(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000, 00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 -//F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos)); -F8(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000, 00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 -//F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos)); -F8(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166, 220870, void, D2GetPosition, (Unit* ptUnit, Position* pos)); -F8(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025, 223460, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); -F8(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846, 220BB0, Room*, D2GetRoom, (Unit* ptUnit)); -//F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode)); -//F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject)); -F8(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404, 221F90, PlayerData*,D2InitPlayerData, (Unit* ptChar)); -//F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar)); -F8(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103, 2221A0, PlayerData*,D2GetPlayerData, (Unit* ptChar)); -F8(STD, D2Common,10431,10431,10431,00000,00000,00000,00000,00000, 00000, DWORD, D2GetDefence, (Unit* ptChar)); -F8(STD, D2Common,10433,10433,10433,00000,00000,00000,00000,00000, 00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); -F8(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159, 222E70, DWORD, D2GetMaxGold, (Unit* ptUnit)); -F8(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193, 224690, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); -//F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); -//F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); -//F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); -//F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex)); -//F7(STD, D2Common,10470,10470,10470,00000,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum)); -F8(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040, 2222C0, BYTE, D2GetObjectFlags, (Unit* ptObject)); -F8(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033, 222300, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); -//F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000,00000, DWORD, D2Common10471, (void*)); -//F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000,00000, DWORD, D2Common10472, (void*)); -//F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one)); -//F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags)); -//F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD)); -//F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats)); -F8(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000, 00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); -//F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index)); -F8(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645, 2272B0, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b -F8(STD, D2Common,10519,10519,10519,11092,10061,10658,10973,10550, 225480, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b -//F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index)); -F8(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216, 2253B0, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b -//F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit)); -F8(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000, 00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); -F8(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000, 00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); -F8(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000, 00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); -F8(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000, 00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); -F8(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000, 00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); -F8(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000, 00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); -F8(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000, 00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); -F8(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000, 00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); -F8(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000, 00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); -F8(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, 00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); -//F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit)); -//F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem)); -//F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats)); -//F7(STD, D2Common,10574,10574,10574,00000,00000,00000,00000,00000, void*, D2SetEnabledStat, (Unit* ptItem, DWORD statId, DWORD disabled)); -//F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000,00000, void, D2FreeBinFiles, ()); -//F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool)); -//F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value)); -F8(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037, 2122F0, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); -F8(STD, D2Common,10600,10600,10600,10573,10262,10887,10695,10994, 2335F0, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); -//F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID)); -//F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID)); -F8(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619, 10619, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); -F8(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393, 26A1B0, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); -F8(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235, 26A200, int, D2GetNbCubeMainBIN, ()); -//F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID)); -F8(STD, D2Common,10628,10628,10628,00000,00000,00000,00000,00000, 00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); -F8(STD, D2Common,10629,10629,10629,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMaxLevel, (DWORD classID)); -F8(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694, 10694, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); -//F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk)); -//F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id)); -F8(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911, 227E70, DWORD, D2GetItemQuality, (Unit* ptItem)); -F8(STD, D2Common,10707,10707,10707,10911,10303,10989,10202,10458, 2280A0, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); -//F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue)); -//F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit)); -//F7(STD, D2Common,10711,10711,10711,00000,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1 -F8(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008, 2281E0, DWORD, D2GetItemLevel, (Unit* ptItem)); -F8(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810, 228250, BYTE, D2ItemGetPage, (Unit* ptUnit)); -F8(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026, 228280, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); -F8(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601, 229BB0, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); -F8(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075, 229DA0, int, D2GetUniqueID, (Unit* ptItem)); -F8(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000, 00000, void, D2SetAnim, (Unit* ptUnit, int anim)); -//F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height); -//F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit)); -//F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem)); -F8(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981, 10981, int*, D2GetNbRunesBIN, ());//return the point on th number -F8(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, 10405, RunesBIN*, D2GetRunesBIN, (int runesID)); -//F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem)); -//F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem)); -//F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem)); -//F7(STD, D2Common,10816,10816,10816,10816,11085,00000,00000,00000, DWORD, D2GetNbSocket, (Unit* ptItem)); -//F7(STD, D2Common,10840,10840,10840,00000,00000,00000,00000,00000, DWORD, D2Common10840, (Unit* ptItem, Unit* ptChar)); -//F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD)); -//F7(STD, D2Common,10872,10872,10872,00000,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y)); -//F7(STD, D2Common,10875,10875,10875,00000,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem)); -F8(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963, 23BCC0, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 -F8(STD, D2Common, 11163, 11163, 11163, 10880, 11068, 10436, 11107, 10963, 23BCC0, DWORD, D2isEtheral2, (Unit* ptItem, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6, WORD a7)); -F8(STD, D2Common,10881,10881,10881,10956,11156,10218,10987,10665, 2313E0, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); -//F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000,00000, void, DoNothing916, ()); -//F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID)); -//F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID)); -//F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID)); -F8(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335, 247280, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); -//F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line)); -//F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill)); -F8(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007, 2442A0, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); -//F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two)); -//F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState)); -//F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber)); -//F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID)); -//F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex)); -//F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD)); -F8(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081, 246D00, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 -A8(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, 17B0, 833E0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); -A8(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0, 268600, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); -A8(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60,5AB20, 5AB20, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); -A8(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160, 155C90, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); -//A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize)); -A8(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0, 5C4F0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); -//A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD)); -//A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats)); -//A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem)); -A8(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0, /*116E46*/117079, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); -//A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string)); -A8(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, 2552E0, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 - +//F8(STD, D2Common,00000,00000,00000,00000,10001,00000,00000,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID)); +F8(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907,21AED0, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); +F8(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691,21A1B0, DWORD, D2GetLevelID, (Room* ptRoom)); +F8(STD, D2Common,10138,10138,10138,10623,10491,11043,10654,10716,24E810, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); +//F8(STD, D2Common,10149,10149,10149,00000,00000,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit)); +F8(STD, D2Common,10242,10242,10242,00000,00000,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); +F8(STD, D2Common,10246,10246,10246,10855,10813,10289,10133,10402,23B950, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line)); +F8(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490,23AD90, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); +F8(STD, D2Common,10249,10249,10249,10880,11068,10436,11107,10963,23BCC0, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll +F8(STD, D2Common,10250,10250,10250,00000,00000,00000,00000,00000,00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll +//F8(STD, D2Common,10257,10257,10257,00000,00000,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); +F8(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknown)); +F8(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040,23B2C0, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); +F8(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879,23DFA0, Unit*, D2UnitGetNextItem, (Unit* ptItem)); +F8(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897,23DFD0, Unit*, D2GetRealItem, (Unit* ptUnit)); +//F8(STD, D2Common,10321,10321,10321,00000,00000,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar)); +//F8(STD, D2Common,10322,10322,10322,00000,00000,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar)); +F8(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 +//F8(STD, D2Common,10328,10328,10328,00000,00000,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos)); +F8(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 +//F8(STD, D2Common,10331,10331,10331,00000,00000,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos)); +F8(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166,220870, void, D2GetPosition, (Unit* ptUnit, Position* pos)); +F8(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025,223460, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); +F8(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846,220BB0, Room*, D2GetRoom, (Unit* ptUnit)); +//F8(STD, D2Common,10348,10348,10348,00000,00000,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode)); +//F8(STD, D2Common,10394,10394,10394,00000,00000,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject)); +F8(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404,221F90, PlayerData*,D2InitPlayerData, (Unit* ptChar)); +//F8(STD, D2Common,10421,10421,10421,10914,10329,00000,00000,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar)); +F8(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103,2221A0, PlayerData*,D2GetPlayerData, (Unit* ptChar)); +F8(STD, D2Common,10431,10431,10431,00000,00000,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar)); +F8(STD, D2Common,10433,10433,10433,00000,00000,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); +F8(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159,222E70, DWORD, D2GetMaxGold, (Unit* ptUnit)); +F8(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193,224690, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); +//F8(STD, D2Common,10463,10463,10463,00000,00000,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); +//F8(STD, D2Common,10464,10464,10464,00000,00000,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); +//F8(STD, D2Common,10465,10465,10465,00000,00000,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); +//F8(STD, D2Common,10466,10466,10466,00000,00000,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex)); +//F8(STD, D2Common,10470,10470,10470,00000,00000,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum)); +F8(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040,2222C0, BYTE, D2GetObjectFlags, (Unit* ptObject)); +F8(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033,222300, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); +//F8(STD, D2Common,10471,10471,10471,00000,00000,00000,00000,00000,00000, DWORD, D2Common10471, (void*)); +//F8(STD, D2Common,10472,10472,10472,00000,00000,00000,00000,00000,00000, DWORD, D2Common10472, (void*)); +//F8(STD, D2Common,10475,10475,10475,00000,00000,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one)); +//F8(STD, D2Common,10481,10481,10481,00000,00000,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags)); +//F8(STD, D2Common,10484,10484,10484,00000,00000,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD)); +//F8(STD, D2Common,10485,10485,10485,00000,00000,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats)); +F8(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); +//F8(STD, D2Common,10517,10517,10517,00000,00000,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index)); +F8(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645,2272B0, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b +F8(STD, D2Common,10519,10519,10519,11092,10061,10658,10973,10550,225480, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +//F8(STD, D2Common,10520,10520,10520,00000,00000,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index)); +F8(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216,2253B0, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +//F8(STD, D2Common,10527,10527,10527,00000,00000,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit)); +F8(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); +F8(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); +F8(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); +F8(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); +F8(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); +F8(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); +F8(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); +F8(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); +F8(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); +F8(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); +//F8(STD, D2Common,10552,10552,10552,00000,00000,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit)); +//F8(STD, D2Common,10567,10567,10567,00000,00000,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem)); +//F8(STD, D2Common,10573,10573,10573,00000,00000,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats)); +//F8(STD, D2Common,10574,10574,10574,00000,00000,00000,00000,00000,00000, void*, D2SetEnabledStat, (Unit* ptItem, DWORD statId, DWORD disabled)); +//F8(STD, D2Common,10575,10575,10575,00000,00000,00000,00000,00000,00000, void, D2FreeBinFiles, ()); +//F8(STD, D2Common,10576,10576,10576,00000,00000,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool)); +//F8(STD, D2Common,00000,00000,00000,10651,10651,00000,00000,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value)); +F8(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037,2122F0, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); +F8(STD, D2Common,10600,10600,10600,10573,10262,10887,10695,10994,2335F0, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); +//F8(STD, D2Common,10601,10601,10601,00000,00000,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID)); +//F8(STD, D2Common,10604,10604,10604,00000,00000,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID)); +F8(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619,2372C0, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); +F8(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393,26A1B0, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); +F8(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235,26A200, int, D2GetNbCubeMainBIN, ()); +//F8(STD, D2Common,10737,10737,10737,00000,00000,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID)); +F8(STD, D2Common,10628,10628,10628,00000,00000,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); +F8(STD, D2Common,10629,10629,10629,00000,00000,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID)); +F8(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694,111D30, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); +//F8(STD, D2Common,10659,10659,10659,00000,00000,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk)); +//F8(STD, D2Common,10668,10668,10668,10450,10953,00000,00000,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id)); +F8(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911,227E70, DWORD, D2GetItemQuality, (Unit* ptItem)); +F8(STD, D2Common,10707,10707,10707,10911,10303,10989,10202,10458,2280A0, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); +//F8(STD, D2Common,10708,10708,10708,00000,00000,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue)); +//F8(STD, D2Common,10709,10709,10709,00000,00000,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit)); +//F8(STD, D2Common,10711,10711,10711,00000,00000,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1 +F8(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008,2281E0, DWORD, D2GetItemLevel, (Unit* ptItem)); +F8(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810,228250, BYTE, D2ItemGetPage, (Unit* ptUnit)); +F8(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026,228280, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); +F8(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601,229BB0, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); +F8(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075,229DA0, int, D2GetUniqueID, (Unit* ptItem)); +F8(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); +//F8(STD, D2Common,10749,10749,10749,00000,00000,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height); +//F8(STD, D2Common,10751,10751,10751,00000,00000,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit)); +//F8(STD, D2Common,10757,10757,10757,00000,00000,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem)); +F8(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981,239CB0, int*, D2GetNbRunesBIN, ());//return the point on th number +F8(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405,239D60, RunesBIN*, D2GetRunesBIN, (int runesID)); +//F8(STD, D2Common,10792,10792,10792,00000,00000,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem)); +//F8(STD, D2Common,10810,10810,10810,00000,00000,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem)); +//F8(STD, D2Common,10813,10813,10813,00000,00000,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem)); +//F8(STD, D2Common,10816,10816,10816,10816,11085,00000,00000,00000,00000, DWORD, D2GetNbSocket, (Unit* ptItem)); +//F8(STD, D2Common,10840,10840,10840,00000,00000,00000,00000,00000,00000, DWORD, D2Common10840, (Unit* ptItem, Unit* ptChar)); +//F8(STD, D2Common,10855,10855,10855,00000,00000,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD)); +//F8(STD, D2Common,10872,10872,10872,00000,00000,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y)); +//F8(STD, D2Common,10875,10875,10875,00000,00000,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem)); +//F8(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963,23BCC0, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 +F8(STD, D2Common,10881,10881,10881,10956,11156,10218,10987,10665,2313E0, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); +//F8(STD, D2Common,10916,10916,10916,00000,00000,00000,00000,00000,00000, void, DoNothing916, ()); +//F8(STD, D2Common,10940,10940,10940,10027,10105,10953,00000,00000,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID)); +//F8(STD, D2Common,10950,10950,10950,00000,00000,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID)); +//F8(STD, D2Common,10952,10952,10952,10950,10256,10858,00000,00000,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID)); +F8(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335,247280, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); +//F8(STD, D2Common,10963,10963,10963,00000,00000,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line)); +//F8(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill)); +F8(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007,2442A0, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); +//F8(STD, D2Common,11023,11023,11023,00000,00000,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two)); +//F8(STD, D2Common,11007,11007,11007,00000,00000,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState)); +//F8(STD, D2Common,11041,11041,11041,00000,00000,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber)); +//F8(STD, D2Common,11042,11042,11042,00000,00000,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID)); +//F8(STD, D2Common,11269,11269,11269,00000,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex)); +//F8(STD, D2Common,11270,11270,11270,00000,00000,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD)); +F8(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081,246CA0, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 +A8(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, 17B0, 833E0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); +A8(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0,268600, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); +//A8(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60,5AB20,268A90, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); +A8(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160,155C90, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); +//A8(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize)); +A8(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0,5C4F0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); +//A8(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD)); +//A8(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats)); +//A8(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem)); +A8(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0,117079, void*, D2ReadFile,(DWORD mempool, char* filename, DWORD* size, const char*, DWORD)); +//A8(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string)); +A8(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40,2552E0, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 +A8(STD, D2Common,00000,00000,00000,00000,00000,00000,81EA0,00000,00000, InventoryBIN*, D2GetInventoryBIN, ()); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //D2Client : 6FAA0000 @@ -310,26 +309,29 @@ A8(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, 2552E0, void, //E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b //E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI -A8(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480, 788B0, void*, D2LoadImage, (const char* filename, DWORD filetype)); -A8(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000,00000, 00000, void, D2FreeImage, (void* image));//6FAA1140 -A8(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0,B6890, 787B0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! -//A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80 -A8(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, 00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 -A8(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640, A7D00, void, D2PrintStatsPage, ()); -//A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990 -A8(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10,2CE40, E4D80, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b -A8(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820, 521C0, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI -//A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0 -A8(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270, B9A00, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); -//A7(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl)); -A8(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0, 790D0, Unit*, D2GetCurrentNPC, ()); -A8(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0, 78350, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX -A8(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790,1C190, 55F20, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); -A8(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10, 89980, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI -A8(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0, 54600, void*, D2LoadBuySelBtn, ()); -A8(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, 7DC60, void, D2ReloadGambleScreen, ()); -//A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI - +A8(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480,788B0, void*, D2LoadImage, (const char* filename, DWORD filetype)); +A8(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000,00000,78A00, void, D2FreeImage, (void* image));//6FAA1140 +A8(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0,B6890,787B0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! +//A8(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80 +A8(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 +A8(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640,A7D00, void, D2PrintStatsPage, ()); +//A8(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990 +A8(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10,2CE40,E4D80, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b +A8(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820,521C0, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI +//A8(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0 +A8(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270,B9A00, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); +//A8(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl)); +//A8(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0,00000, Unit*, D2GetCurrentNPC, ()); +A8(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0,78350, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX +A8(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790,1C190,55F20, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); +A8(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10,89980, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI +A8(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0,54600, void*, D2LoadBuySelBtn, ()); +//A8(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60,00000, void, D2ReloadGambleScreen, ()); +//A8(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000,00000,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI +A8(FAST, D2Client,00000,00000,00000,00000,00000,00000,00000,00000,520C0, void*, D2LoadResImage, (const char* filename)); +A8(FAST, D2Client,00000,00000,00000,00000,00000,00000,00000,00000,96990, void*, D2FreeResImages, ()); +A8(FAST, D2Client,00000,00000,00000,00000,00000,00000,00000,00000,5C850, void*, D2ReceivePacket, (DWORD a , DWORD b)); +A8(STD, D2Client,87220,865A0,81B70,A35F0,669F0,90150,C39E0,1D3E0,56EE0, DWORD, D2PrintInterface, (void* unknown)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //D2Game : 6FC30000 @@ -351,7 +353,7 @@ A8(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, 7DC60, void, ////E2F(D2Game,22C00, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00 ////E2F(D2Game,23610, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 ////E2F(D2Game,3AD10, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 -//E2F(D2Game,EC7E0, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//1.11b (wrong param) +//E2F(D2Game,EC7E0, DWORD, D2SpawnSuperUnique, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//1.11b (wrong param) //E2S(D2Game,235C0, void, D2Game235C0, (Game* ptGame, Room* ptRoom));//1.11/1.11b //E2F(D2Game,4C7B0, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 ////E2F(D2Game,5A500, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500 @@ -362,53 +364,57 @@ A8(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, 7DC60, void, //E2F(D2Game,C09E0, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3));//1.11b //E2F(D2Game,34920, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar));//1.11b //E2F(D2Game,34910, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar));//1.11b -//E2F(D2Game,85AA0, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b -//E2F(D2Game,D7BD0, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b -//E2F(D2Game,2BC80, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b -//E2F(D2Game,D2D70, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b -//E2F(D2Game,7FE60, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b -//E2F(D2Game,2A300, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,85AA0, void, D2MephAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,D7BD0, void, D2DiabloAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,2BC80, void, D2BaalAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,D2D70, void, D2UberMephAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,7FE60, void, D2UberDiabloAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b +//E2F(D2Game,2A300, void, D2UberBaalAI, (Game* ptGame, Unit* ptMonster, DWORD*));//1.11b ////E2F(D2Game,92420, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one));//1.11b //E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b -F8(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002, 135780, void, D2SetNbPlayers, (DWORD nbPlayers)); -//A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0 -A8(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070, 12C550, void, D2AddClient, (DWORD clientID));//BY EAX -A8(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700, /*12E860*/12FEE0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 -A8(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820,BB510, 12DED0, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 -A8(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780, 13B280, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData -A8(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0,DD4F0, 13C4A0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX -//A7(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0 -//A7(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0 -//A7(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0 -A8(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40, 16CF40, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); -A8(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070,B2F70, 15CA40, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem -//A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80 -A8(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340, 63740, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); -//A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410 -//A7(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00 -//A7(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 -//A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 -A8(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950,CDE20, 1A09E0, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param -A8(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980, 142B40, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); -//A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 -//A7(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500 -A8(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810,3A4C0, 1335E0, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0 -A8(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40, 152F60, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 -//A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220,00000, Unit*, D2GetOwnerMonster, (Unit* ptMonster)); -//A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0 -A8(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90,6FE10, 155230, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3)); -A8(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0, 194270, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); -A8(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0, 194280, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); -A8(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920, 1E9170, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A8(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60,4EAD0, 1F78B0, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A8(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850, 1FCFE0, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A8(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0,49480, 1F81C0, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A8(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0, 1E9DF0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A8(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80,C6EC0, 1FD200, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -//A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one)); -A8(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, 12CA10, void, D2SaveGame, (Game* ptGame) ); +F8(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002,135780, void, D2SetNbPlayers, (DWORD nbPlayers)); +//A8(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0 +A8(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070,12C550, void, D2AddClient, (DWORD clientID));//BY EAX +A8(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700,12E860, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 +A8(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820,BB510,12DED0, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 +A8(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780,13B280, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData +A8(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0,DD4F0,13C4A0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX +//A8(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0 +//A8(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0 +//A8(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0 +A8(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40,16CF40, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); +A8(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070,B2F70,15CA40, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem +//A8(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80 +A8(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340,63740, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); +//A8(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410 +//A8(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00 +//A8(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 +//A8(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 +A8(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950,CDE20,1A09E0, DWORD, D2SpawnSuperUnique, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param +A8(FAST, D2Game,00000,00000,00000,C80F0,EF870,EFB10,EF650,C8D70,1B2F20, Unit*, D2SpawnMonster, (DWORD id, DWORD mode, Game* ptGame, Room* ptRoom, DWORD x, DWORD y, DWORD one, DWORD zero)); +A8(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980,142B40, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); +//A8(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 +//A8(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500 +A8(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810,3A4C0,1335E0, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0 +A8(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40,152F60, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 +//A8(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220,00000,00000, Unit*, D2GetOwnerMonster, (Unit* ptMonster)); +//A8(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0 +A8(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90,6FE10,155230, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3)); +A8(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0,165A90, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); +A8(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0,165AA0, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); +A8(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60,4EAD0,1F78B0, void, D2MephAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +A8(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920,1E9170, void, D2DiabloAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +A8(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850,1FCFE0, void, D2BaalAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +A8(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80,C6EC0,1FD200, void, D2UberBaalAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +A8(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0,49480,1F81C0, void, D2UberMephAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +A8(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0,1E9DF0, void, D2UberDiabloAI, (Game* ptGame, Unit* ptMonster, AIParam* args)); +//A8(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000,00000,179430, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one)); +A8(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660,12CA10, void, D2SaveGame, (Game* ptGame) ); +A8(FAST, D2Game,00000,00000,00000,EF580,F0F70,F0D70,F2540,F1800,1DEB60, void, D2MonsterMove, (Game* ptGame, Unit* ptMonster, Unit* target, DWORD two, DWORD x, DWORD y, DWORD one, DWORD zero) ); +A8(FAST, D2Game,00000,00000,00000,FF1B0,F0DB0,F0BB0,F2380,F1430,1DEAD0, void, D2MonsterUseSkill, (Game* ptGame, Unit* ptMonster, DWORD arg, DWORD skill, Unit* target, DWORD x, DWORD y) ); +A8(FAST, D2Game,00000,00000,00000,B9340,25450,44140,53F10,39810,132240, void, D2SaveSPChar, (Game* ptGame, Unit* ptChar, char* name, DWORD arg, DWORD secondPass) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -416,8 +422,8 @@ A8(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, 12CA10, void, //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 -F8(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024,10015, 12AE50, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before -F8(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, 12B330, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); +F8(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024,10015,12AE50, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before +F8(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012,12B330, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -442,25 +448,25 @@ F8(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, 12B330, DWORD, ////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 //D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10 -F8(STD, Fog, 10023,10023,10023,00000,00000,00000,00000,00000, 00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10) -F8(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024,10024, 8A60, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); -F8(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042, B380, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F8(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043,10043, B3C0, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F8(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045, B430, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F8(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046,10046, B480, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F8(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102, 68E0, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); -F8(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103, 68F0, DWORD, D2MPQCloseFile, (void* mpqfile)); -F8(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104,10104, 6900, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); -F8(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105, 6930, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); -F8(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115, 7050, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); -F8(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116, 6BA0, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); -//F7(STD, Fog, 10126,10126,10126,10126,10126,10126,10126,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0 -//F7(STD, Fog, 10127,10127,10127,10127,10127,10127,10127,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 -//F7(STD, Fog, 10128,10128,10128,10128,10128,10128,10128,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0 -//F7(STD, Fog, 10130,10130,10130,10130,10130,10130,10130,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 -F8(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212, 2BD0B0, void, D2Fog10212, (DWORD unknown)); -//F7(STD, Fog, 10217,10217,10217,10217,10217,10217,10217,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 -F8(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, 8090, int, D2GetInstructionPointer, ()); +F8(STD, Fog, 10023,10023,10023,00000,00000,00000,00000,00000,00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10) +F8(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024,10024,8A60, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); +F8(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042,B380, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F8(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043,10043,B3C0, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F8(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045,B430, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F8(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046,10046,B480, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F8(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102,68E0, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); +F8(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103,68F0, DWORD, D2MPQCloseFile, (void* mpqfile)); +F8(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104,10104,6900, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); +F8(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105,6930, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); +F8(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115,7050, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); +F8(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116,6BA0, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); +//F8(STD, Fog, 10126,10126,10126,10126,10126,10126,10126,10126,00000, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0 +//F8(STD, Fog, 10127,10127,10127,10127,10127,10127,10127,10127,00000, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 +//F8(STD, Fog, 10128,10128,10128,10128,10128,10128,10128,10128,00000, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0 +//F8(STD, Fog, 10130,10130,10130,10130,10130,10130,10130,10130,00000, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 +F8(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212,2BD0B0, void, D2Fog10212, (DWORD unknow)); +//F8(STD, Fog, 10217,10217,10217,10217,10217,10217,10217,10217,00000, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 +F8(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265,8090, int, D2GetInstructionPointer, ()); //Fog10213 getIndexFromLookupTable (&table,code,bool) @@ -479,19 +485,19 @@ F8(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, 8090, int, D2Get ////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,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 -F8(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011, 124E20, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 LAutour -F8(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004, 124A30, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); -//F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0 -F8(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001, 125150, DWORD, D2GetLang, ());//14b 00522A20 -F8(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, 00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 -//F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000,10005, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 -//A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0 -//A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60 -//A7(FAST, D2Lang, 00000,00000,03640,00000,00000,00000,00000,00000, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640 -//A7(FAST, D2Lang, 00000,00000,03A90,00000,00000,00000,00000,00000, WORD, D2GetStrAndIndexFromString, (void* ptFile, void* ptMemLoc, LPSTR String, LPWSTR RetString));//6FC13A90 -//A7(FAST, D2Lang, 00000,00000,02CD0,00000,00000,00000,00000,00000, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth -//A7(STD, D2Lang, 00000,00000,01670,00000,00000,00000,00000,00000, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf +//F8(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000,10011,00000, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 +F8(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011,124E20, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 LAutour +F8(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004,124A30, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); +//F8(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0 +F8(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001,125150, DWORD, D2GetLang, ());//14b 00522A20 +F8(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 +//F8(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000,10005,00000, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 +//A8(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0 +//A8(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60 +//A8(FAST, D2Lang, 00000,00000,03640,00000,00000,00000,00000,00000,00000, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640 +//A8(FAST, D2Lang, 00000,00000,03A90,00000,00000,00000,00000,00000,00000, WORD, D2GetStrAndIndexFromString, (void* ptFile, void* ptMemLoc, LPSTR String, LPWSTR RetString));//6FC13A90 +//A8(FAST, D2Lang, 00000,00000,02CD0,00000,00000,00000,00000,00000,00000, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth +//A8(STD, D2Lang, 00000,00000,01670,00000,00000,00000,00000,00000,00000, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Storm : 6FFB0000 @@ -500,10 +506,10 @@ F8(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, 00000, DWORD, //D2S(Storm,503, void, D2Storm503, (DWORD, DWORD, DWORD)); //+1.11 //D2S(Storm,511, void, D2FreeWinMessage, (sWinMessage* msg));//1.11/1.11b -//F7(STD, Storm, 253, 253, 253, 253, 253, 253, 000, 000, void, D2StormMPQCloseFile, (void* mpqfile)); -F8(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, 192F0, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) -F8(STD, Storm, 503, 503, 503, 503, 503, 503, 503, 503, 13750, void, D2Storm503, (DWORD, DWORD, DWORD)); -F8(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, 20290, void, D2FreeWinMessage, (sWinMessage* msg)); +//F8(STD, Storm, 253, 253, 253, 253, 253, 253, 000, 000,00000, void, D2StormMPQCloseFile, (void* mpqfile)); +F8(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, 192F0, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) +F8(STD, Storm, 503, 503, 503, 503, 503, 503, 503, 503, 13750, void, D2Storm503, (DWORD, DWORD, DWORD)); +F8(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, 20290, void, D2FreeWinMessage, (sWinMessage* msg)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -515,12 +521,12 @@ F8(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, 20290, void, D //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 -F8(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012, F5160, DWORD, D2GetResolution,() ); -//F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) ); -//F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000,00000, DWORD, D2ShowWindow,() ); -//F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0 -F8(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014,10028, F6300, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); -F8(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, F6480, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); +F8(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012,F5160, DWORD, D2GetResolution,() ); +//F8,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) ); +//F8(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000,00000,00000, DWORD, D2ShowWindow,() ); +//F8,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0 +F8(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014,10028,F6300, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); +F8(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042,F6480, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -534,36 +540,36 @@ F8(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, F6480, void, D //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 -F8(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051, FCFF0, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); -F8(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150,10076, 102320, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); -F8(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150, 101820, DWORD, D2GetPixelLen,(LPWSTR s) ); -F8(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047, 102EF0, DWORD, D2SetFont,(DWORD fontID) ); -F8(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085,10137, 102280, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); -F8(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000,00000, 00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 -F8(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000,00000, 00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 -F8(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164, F93C0, void*, D2CreateTextBox,(DWORD* data) ); +F8(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051,FCFF0, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); +F8(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150,10076,102320, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); +F8(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150,101820, DWORD, D2GetPixelLen,(LPWSTR s) ); +F8(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047,102EF0, DWORD, D2SetFont,(DWORD fontID) ); +F8(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085,10137,102280, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); +F8(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 +F8(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000,00000,00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 +F8(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164,F93C0, void*, D2CreateTextBox,(DWORD* data) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //D2CMP : ????0000 //D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11 -F8(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020, 201A50, DWORD, D2CMP10014, (void* image) ); +F8(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020,201A50, DWORD, D2CMP10014, (void* image) ); //ONLY UNTIL 1.10 : -A8(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000,00000, 00000, DWORD, D2isLODGame, ());//6FAAC080 -A8(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000,00000, 00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d) -A8(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMouseX, ());//6FB57BC0 -A8(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000, 00000, DWORD, D2GetMouseY, ());//6FB57BD0 -A8(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000, 00000, Unit*, D2GetClientPlayer, ());//6FB283D0 -A8(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000,00000, 00000, void, D2CleanStatMouseUp, ());//6FAABF60 -A8(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000,00000, 00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 -//A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20 -//A7(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0 -//A7(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40 -//A7(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70 -A8(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, 00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 +A8(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080 +A8(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000,00000,00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d) +A8(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0 +A8(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 +A8(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000,63DD0, Unit*, D2GetClientPlayer, ());//6FB283D0 +A8(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000,00000,4DA70, void, D2CleanStatMouseUp, ());//6FAABF60 +A8(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 +//A8(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20 +//A8(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0 +//A8(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40 +//A8(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70 +A8(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000,1531C0, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// VARIABLES //////// @@ -584,24 +590,25 @@ A8(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, 00000, NetClie //E2C(D2Client,11B418,DWORD, MouseX);//0x320 = 800 //1.11b //E2C(D2Client,11C1E0,Unit*, ptClientChar);//1.11b -//C7(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20 -C8(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, F7038, 311470, DWORD, ResolutionY);//0x258 = 600 -C8(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, F7034, 31146C, DWORD, ResolutionX);//0x320 = 800 -C8(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358, 3A285C, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 -C8(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354, 3A2858, DWORD, WindowStartX);//0x50 = 80 -//C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000,00000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000 -C8(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0, 4842A8, NetClient*, ClientTable); -//C7(D2Client,000000,000000,000000,000000,104225,000000,000000,00000, DWORD, CurrentNPCNum); -C8(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4, 3A04F4, DWORD, IsLodGame); -C8(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000, 000000, BYTE, DifficultyLevel); -//C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,11D1D8, BYTE, DifficultyLevel); -C8(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824,11C94C, 3A6AAC, DWORD, MouseY);//0x258 = 600 -C8(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950, 3A6AB0, DWORD, MouseX);//0x320 = 800 -C8(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050, 3A6A70, Unit*, ptClientChar); +//C8(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C,000000,000000, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20 +C8(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, F7038,311470, DWORD, ResolutionY);//0x258 = 600 +C8(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, F7034,31146C, DWORD, ResolutionX);//0x320 = 800 +C8(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358,3A285C, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 +C8(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354,3A2858, DWORD, WindowStartX);//0x50 = 80 +//C8(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000,00000,000000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000 +C8(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0,4842A8, NetClient*, ClientTable); +//C8(D2Client,000000,000000,000000,000000,104225,000000,000000,00000,000000, DWORD, CurrentNPCNum); +C8(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4,3A04F4, DWORD, IsLodGame); +C8(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000,000000, BYTE, DifficultyLevel); +//C8(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,11D1D8,000000, BYTE, DifficultyLevel); +C8(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824,11C94C,3A6AAC, DWORD, MouseY);//0x258 = 600 +C8(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950,3A6AB0, DWORD, MouseX);//0x320 = 800 +C8(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050,3A6A70, Unit*, ptClientChar); +C8(D2Client,11E0F4,11CF54,112D04,11B9A8,11BB30,11BF48,11C028,11CAA4,3BB5E8, DWORD, InputCommandLen); +C8(D2Client,11CE50,11BCB0,111A58,11C590,11D590,11FC40,11EC80,11D650,3BB638, WCHAR, InputCommand); - -C8(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000, 000000, DWORD, NbStatDesc); -C8(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000,000000, 000000, DWORD, StatDescTable); +C8(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000,000000, DWORD, NbStatDesc); +C8(D2Client, DAF98, D9EA8,000000,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); @@ -659,69 +666,69 @@ D2_FST(D2Client6FB30470,void, D2ClientUpdatePlayer, (Unit* ptChar, DWORD nUnitT Storm 1.09: -251 SFileAuthenticateArchive -252 SFileCloseArchive -253 SFileCloseFile -254 SFileDdaBegin -255 SFileDdaBeginEx -256 SFileDdaDestroy -257 SFileDdaEnd -258 SFileDdaGetPos -259 SFileDdaGetVolume -260 SFileDdaInitialize -261 SFileDdaSetVolume -262 SFileDestroy -263 SFileEnableDirectAccess -264 SFileGetFileArchive -265 SFileGetFileSize -266 SFileOpenArchive -267 SFileOpenFile -268 SFileOpenFileEx -269 SFileReadFile -270 SFileSetBasePath -271 SFileSetFilePointer -272 SFileSetLocale -273 SFileGetBasePath -274 SFileSetIoErrorMode -275 SFileGetArchiveName -276 SFileGetFileName -277 SFileGetArchiveInfo -278 SFileSetPlatform -279 SFileLoadFile -280 SFileUnloadFile -281 SFileLoadFileEx -282 SFilePrioritizeRequest -283 SFile_CancelRequest -284 SFileSetAsyncBudget -285 SFileSetDataChunkSize -286 SFileEnableSeekOptimization -287 SFileReadFileEx -288 SFile_CancelRequestEx -289 SFileReadFileEx2 -290 SFileLoadFileEx2 +251 SFileAuthenticateArchive +252 SFileCloseArchive +253 SFileCloseFile +254 SFileDdaBegin +255 SFileDdaBeginEx +256 SFileDdaDestroy +257 SFileDdaEnd +258 SFileDdaGetPos +259 SFileDdaGetVolume +260 SFileDdaInitialize +261 SFileDdaSetVolume +262 SFileDestroy +263 SFileEnableDirectAccess +264 SFileGetFileArchive +265 SFileGetFileSize +266 SFileOpenArchive +267 SFileOpenFile +268 SFileOpenFileEx +269 SFileReadFile +270 SFileSetBasePath +271 SFileSetFilePointer +272 SFileSetLocale +273 SFileGetBasePath +274 SFileSetIoErrorMode +275 SFileGetArchiveName +276 SFileGetFileName +277 SFileGetArchiveInfo +278 SFileSetPlatform +279 SFileLoadFile +280 SFileUnloadFile +281 SFileLoadFileEx +282 SFilePrioritizeRequest +283 SFile_CancelRequest +284 SFileSetAsyncBudget +285 SFileSetDataChunkSize +286 SFileEnableSeekOptimization +287 SFileReadFileEx +288 SFile_CancelRequestEx +289 SFileReadFileEx2 +290 SFileLoadFileEx2 Storm1.08 -401 SMemAlloc -403 SMemFree -404 SMemGetSize -405 SMemReAlloc -481 SMemFindNextBlock -482 SMemFindNextHeap -483 SMemGetHeapByCaller -484 SMemGetHeapByPtr -485 SMemHeapAlloc -486 SMemHeapCreate -487 SMemHeapDestroy -488 SMemHeapFree -489 SMemHeapReAlloc -490 SMemHeapSize -491 SMemCopy -492 SMemFill -493 SMemMove -494 SMemZero -495 SMemCmp -496 SMemSetDebugFlags -497 SMemDumpState +401 SMemAlloc +403 SMemFree +404 SMemGetSize +405 SMemReAlloc +481 SMemFindNextBlock +482 SMemFindNextHeap +483 SMemGetHeapByCaller +484 SMemGetHeapByPtr +485 SMemHeapAlloc +486 SMemHeapCreate +487 SMemHeapDestroy +488 SMemHeapFree +489 SMemHeapReAlloc +490 SMemHeapSize +491 SMemCopy +492 SMemFill +493 SMemMove +494 SMemZero +495 SMemCmp +496 SMemSetDebugFlags +497 SMemDumpState */ //Kingpin: D2Common #10027 is used to get dest unit (used for get type5 object in next room) //D2Common10247, (ptInventory, ptItem, x,y,0xC,void*,void*,BYTE page) verif if items can be put in inventory @@ -741,9 +748,9 @@ Storm1.08 /* Kingpin: d2common #11270 Kingpin: Check MonType.txt line to see if it match (returns a boolan) -Kingpin: arg1 = unknown -arg2 = damage_vs_montype (stat from intestatscost.txt) -arg3 = ptUnit +Kingpin: arg1 = unknown +arg2 = damage_vs_montype (stat from intestatscost.txt) +arg3 = ptUnit arg4 = 80 (maxline maybe, but is only guessing) //d2game.6FD1D660 reverse player name :P @@ -763,42 +770,42 @@ Kingpin: D2Client.6FB18770 returns a boolean if you have enough mana for skill Kingpin: D2Client.6FB18AC0 sets it to selectable or not D2Common #10480 Return ptState arg1 = ptUnit, arg2 = state_id D2Common #10479 Get State_ID from ptState+14 -D2Common #11265 Get Skill_ID from ptState+1C Arg1 = ptState +D2Common #11265 Get Skill_ID from ptState+1C Arg1 = ptState -Kingpin: D2Common #10497 Get Duration of State +Kingpin: D2Common #10497 Get Duration of State Kingpin: arg1 = state_id -D2Client.6FB5B0F0 -Function: Draw Filled Rectangle +D2Client.6FB5B0F0 +Function: Draw Filled Rectangle void FASTCALL D2ClientFillRect(int x, int y, int Width, int Height, ULONG ulColor, ULONG transTbl); D2_FST(D2Client6FB5B0F0,void, D2ClientFillRect,(int x, int y, int Width, int Height, DWORD col, DWORD transTbl), offset_D2Client + 0xBB0F0);//6FB5B0F0-6FAA0000 -D2Gfx.#10055 -Function: Draw Filled Rectangle +D2Gfx.#10055 +Function: Draw Filled Rectangle void STDCALL D2GfxFillRect(int left, int top, int right, int bottom, ULONG ulColor, ULONG transTbl); -NOTES: -color = Palette index. -transTbl = pl2 transform table index ... -0 = 75% transparent -1 = 50% transparent -2 = 25% transparent -3 = color blend 1 //white is transparent black is solid -4 = color blend 2 //black is transparent white is solid -5 = normal draw -6 = color blend 3 // screen + color -7 = hilight +NOTES: +color = Palette index. +transTbl = pl2 transform table index ... +0 = 75% transparent +1 = 50% transparent +2 = 25% transparent +3 = color blend 1 //white is transparent black is solid +4 = color blend 2 //black is transparent white is solid +5 = normal draw +6 = color blend 3 // screen + color +7 = hilight -6FAE7831 E8 9A380800 CALL ; click inventory -6FAE8D44 E8 87230800 CALL ; Right click inventory +6FAE7831 E8 9A380800 CALL ; click inventory +6FAE8D44 E8 87230800 CALL ; Right click inventory 6FAE8972 E8 59270800 CALL ; mouse over D2Client.6FACFCD0 then that set color for the text (it calls in this function #10121 and 10117) Kingpin: and the position -Kingpin: arg1 = Xpos -arg2 = Ypos -arg3 = Pointer to Unicode String +Kingpin: arg1 = Xpos +arg2 = Ypos +arg3 = Pointer to Unicode String arg4 = Color Kingpin: 10470 has as first arg ptGame +1C (memory alloc thing) @@ -808,51 +815,51 @@ Kingpin: arg4 = 4 (same here, no idea) Kingpin: arg5 = uniqueID Kingpin: 10868 SetMod -arg1 = ptItem -arg2 = ItemMod +arg1 = ptItem +arg2 = ItemMod arg3 = 1 -Kingpin: 11232 Get Cube Recipe Record (Line) from Cubemain.bin Address in memory +Kingpin: 11232 Get Cube Recipe Record (Line) from Cubemain.bin Address in memory Kingpin: i have no parameters for 11232 Kingpin: 11233 Get Number of Cube Recipes -Kingpin: edi contains target unit +Kingpin: edi contains target unit Kingpin: 10342 get ptRoom from target unit Kingpin: ecx = unique unit id Kingpin: ebx = unit type Kingpin: eax = ptRoom Kingpin: 10066 remove unit from room -D2Game.6FCBC900 ; Get Target Unit +D2Game.6FCBC900 ; Get Target Unit Arg1 = ptPlayer (ptUnit) Arg2 = ptGame -#10962 Add skill to player -Kingpin: arg1 ptPlayer +#10962 Add skill to player +Kingpin: arg1 ptPlayer arg2 SkillID Kingpin: arg3 Skill Level -10602 Gets an item ID # from an item code +10602 Gets an item ID # from an item code Kingpin: get Prefix/suffix Kingpin: #10699 arg1 = ptItem, arg2 = prefix Index Kingpin: #10701 arg1 = ptItem, arg2 = suffix index -D2EquipUnit STDCALL_FUNCTION(int, D2Common280D, (Inventory* ptInventory, Unit* ptItem, int bodylocation)); -D2AddItemToInventory STDCALL_FUNCTION(int, D2Common2802, (Inventory* ptInventory, Unit* ptItem, int nodePage)); +D2EquipUnit STDCALL_FUNCTION(int, D2Common280D, (Inventory* ptInventory, Unit* ptItem, int bodylocation)); +D2AddItemToInventory STDCALL_FUNCTION(int, D2Common2802, (Inventory* ptInventory, Unit* ptItem, int nodePage)); Kingpin: in my notes it should start here Kingpin: 6FC51360 /$ 55 PUSH EBP -D2DropTC FASTCALL_FUNCTION(void, D2Game6FC51360, (D2Game* ptGame, Unit* ptChar, Unit* ptNPC, void* ptTC, DWORD z5, DWORD ilvl, DWORD z1, DWORD z2, DWORD z3, DWORD z4)); +D2DropTC FASTCALL_FUNCTION(void, D2Game6FC51360, (D2Game* ptGame, Unit* ptChar, Unit* ptNPC, void* ptTC, DWORD z5, DWORD ilvl, DWORD z1, DWORD z2, DWORD z3, DWORD z4)); -Kingpin: D2CreateItemUnit FASTCALL_FUNCTION(Unit*, D2Game6FC501A0, (Unit* ptPlayer, DWORD itemCode, D2Game* ptGame, DWORD uk1, DWORD quality, DWORD uk3, DWORD uk4, DWORD Lvl, DWORD uk5, DWORD uk6, DWORD uk7)); -ptItem = D2CreateItemUnit(ptPlayer, D2GetItemIDfromCode(CharstatTXT->Item1), PCGame, 4, 2, 1, 1, D2GetUnitStat(ptPlayer,STATS_LEVEL,0), 0, 0, 0); +Kingpin: D2CreateItemUnit FASTCALL_FUNCTION(Unit*, D2Game6FC501A0, (Unit* ptPlayer, DWORD itemCode, D2Game* ptGame, DWORD uk1, DWORD quality, DWORD uk3, DWORD uk4, DWORD Lvl, DWORD uk5, DWORD uk6, DWORD uk7)); +ptItem = D2CreateItemUnit(ptPlayer, D2GetItemIDfromCode(CharstatTXT->Item1), PCGame, 4, 2, 1, 1, D2GetUnitStat(ptPlayer,STATS_LEVEL,0), 0, 0, 0); Kingpin: monsterData +28 holds ptGame Kingpin: ptGame +2C UniqueID (owner ID) -Kingpin: ptGame +30 UnitType +Kingpin: ptGame +30 UnitType srvDoFunc 15 adds temporarly a stat Kingpin: we have 10041 that get ptRoom from ptAct, XOffset&Yoffset diff --git a/Commons/D2UnitStruct.h b/Commons/D2UnitStruct.h index ee7eb79..adc1ea3 100644 --- a/Commons/D2UnitStruct.h +++ b/Commons/D2UnitStruct.h @@ -1,10 +1,10 @@ /*================================================================= File created by Yohann NICOLAS. - @brief Diablo II Unit Structures definitions. + @brief Diablo II Unit Structures definitions. + + NOT TESTED IN 1.10 (1.09b) - NOT TESTED IN 1.10 (1.09b) - =================================================================*/ #pragma once @@ -16,6 +16,14 @@ struct Unit; struct SkillsBIN; struct SkillData; struct ObjectsBIN; +struct NetClient; + +struct Game; +struct ActMap; +struct ActData; +struct Level; +struct RoomEx; +struct Room; /*=================================================================*/ /* Skill Structure. */ @@ -59,7 +67,7 @@ struct Position DWORD y; }; -struct Room//size=0x80 +/*struct Room//size=0x80 { //ptRoom +48 0 = spawn new units (monster, objects e.tc), 1 = don't spawn any new units DWORD seed1; //+00 @@ -79,23 +87,113 @@ struct Room//size=0x80 BYTE isGenerated2:1;//??? }; }; -}; +};*/ -struct ActMap//ptGame+BC size=0x60 +struct RoomEx //size=5C { - DWORD isNotManaged; - DWORD uk4; - DWORD uk8;//size = 0x488 - Room* ptFirstRoom; + DWORD __00[2]; //0x00 + RoomEx** roomExNear; //0x08 + DWORD __0C[5]; //0x0C + struct { + INT32 roomNumber; //0x00 + void* __04; //0x04 + PINT32 subNumber; //0x08 + } *pType2Info; //0x20 + RoomEx* ptNextRoomEx; //0x24 + UINT32 roomFlags; //0x28 + UINT32 roomsNearCount; //0x2C + Room* ptRoom; //0x30 + INT32 posX; //0x34 + INT32 posY; //0x38 + INT32 sizeX; //0x3C + INT32 sizeY; //0x40 + DWORD __44; //0x44 + UINT32 presetType; //0x48 + void* ptWarpTiles; //0x4C + DWORD __50[2]; //0x50 + Level* ptLevel; //0x58 +}; + +struct Room //size=0x80 +{ + Room** ptNearRooms; //0x00 + DWORD __04[3]; //0x04 + RoomEx* ptRoomEx; //0x10 + DWORD __14[3]; //0x14 + void* coll; //0x20 + INT32 nbNearRooms; //0x24 + DWORD __28[9]; //0x28 + DWORD startX; //0x4C + DWORD startY; //0x50 + DWORD sizeX; //0x54 + DWORD sizeY; //0x58 + DWORD __5C[6]; //0x5C + Unit* ptFirstUnit; //0x74 + DWORD __78; //0x78 + Room* ptNextRoom; //0x7C +}; + +struct Level //size=0x234 +{ + DWORD type; //+000 + DWORD flags; //+004 + DWORD __004_010[2]; //+008 + RoomEx* ptFirstRoomEx; //+010 + DWORD __014_01C[2]; //+014 + INT32 posX; //+01C + INT32 posY; //+020 + INT32 sizeX; //+024 + INT32 sizeY; //+028 + DWORD __0C2_1AC[96]; //+02C + Level* ptNextLevel; //+1AC + DWORD __1B0; //+1B0 + ActData* ptActData; //+1B4 + DWORD __1B8_1C0[2]; //+1B8 + DWORD levelType; //+1C0 + DWORD seed1; //+1C4 + DWORD seed2; //+1C8 + DWORD uk_1CC; //+1CC + UINT32 levelNo; //+1D0 + DWORD __1D4_234[96]; //+1D4 +}; + +struct ActData //size=0x488 +{ + DWORD seed1; //+000 + DWORD seed2; //+004 + DWORD nbRooms; //+008 + DWORD __00C_0094[34]; //+00C + DWORD nTalRashaTombLevel; //094 + DWORD __098; //+098 + Game* ptGame; //+09C + DWORD __0A0_450[237]; //+0A0 + BYTE difficulty; //+450 + BYTE __451_46C[27]; //+451 + ActMap* ptActMap; //+46C + DWORD __470_484[5]; //+470 + DWORD nBossMummyTombLevel;//+484 +}; + +struct ActMap //size=0x60 +{ + DWORD isNotManaged; //+00 + DWORD __04; //+04 + DWORD townLevel; //+08 + DWORD seed; //+0C + Room* ptFirstRoom; //+10 + DWORD actNumber; //+14 + DWORD __18_48[12]; //+18 + ActData* ptActData; //+48 + DWORD __50_5C[4]; //+4C + void* ptMemoryPool; //+5C }; -struct NetClient; //ptGame : 04E4007C struct Game -{ //Offset from Code. +{ //Offset from Code. BYTE uk1[0x18]; //+00 - DWORD _ptLock; //+18 Unknown - DWORD memoryPool; //+1C Memory Pool (??) + DWORD _ptLock; //+18 Unknown + DWORD memoryPool; //+1C Memory Pool (??) BYTE uk2[0x4D]; //+20 BYTE difficultyLevel; //+6D (Difficulty 0,1 or 2) WORD unknown1; //+6E Cube puts 4 here @@ -104,7 +202,9 @@ struct Game WORD unknown2; //+78 BYTE uk4[0x0E]; //+7A NetClient* ptClient; //+88 - BYTE uk8C[0x30]; //+8C + BYTE __8C[0x1C]; //+8C + DWORD gameFrame; //+A8 + BYTE __AC[0x10]; //+AC ActMap* mapAct[5]; //+BC BYTE ukD0[0x1024]; //+D0 DWORD* game10F4; //+10F4 @@ -117,7 +217,7 @@ struct Game struct Path //(8 dword) -{ //Offset from Code. Size: 20 +{ //Offset from Code. Size: 20 WORD uk1; //+00 WORD mapx; //+02 WORD uk2; //+04 @@ -132,7 +232,7 @@ struct Path //(8 dword) struct Inventory -{ //Offset from Code. Size: 30 � 40 +{ //Offset from Code. Size: 30 to 40 DWORD tag; //+00 = 0x01020304 BYTE uk1[0x04]; //+04 =? 0 Unit* ptChar; //+08 @@ -200,24 +300,49 @@ struct Stats //sizeof(Stats)=0x64 DWORD unknow2; //+60 (=0) }; +struct AIControl +{ + DWORD specialState; // +00 SpecialState - stuff like terror, confusion goes here + void* aiFunction; // +04 fpAiFunction(); - the primary ai function to call (void * __fastcall)(pGame,pUnit,pAiTickArgs); + DWORD aiFlags; // +08 AiFlags + DWORD ownerGUID; // +0C OwnerGUID - the global unique identifier of the boss or minion owner + DWORD ownerType; // +10 eOwnerType - the unit type of the boss or minion owner + DWORD args[3]; // +14 dwArgs[3] - three dwords holding custom data used by ai func to store counters (etc) + void* cmdCurrent; // +20 pCmdCurrents + void* cmdLast; // +24 pCmdLast + Game* ptGame; // +28 pGame + DWORD ownerGUID2; // +2C OwnerGUID - the same as +008 + DWORD ownerType2; // +30 eOwnerType - the same as +00C + void* minionList; // +34 pMinionList - list of all minions, for boss units (SetBoss in MonStats, Unique, SuperUnique etc) + DWORD trapNo; // +3C eTrapNo - used by shadows for summoning traps (so they stick to one type usually) +}; struct MonsterData // sizeof(MonsterData)=0x60 { //Offset from Code. - BYTE uk[0x16]; //+00 - union { - WORD flags; //+16 - struct { - WORD fuk1:1; - WORD isSuperUnique:1; - WORD isChampion:1; - WORD isUnique:1; - WORD fuk2:13; + MonStatsBIN* ptMonStats; //+000 - pMonStats - record in monstats.txt + BYTE components[0x10]; //+004 - Components[16] - bytes holding the component Ids for each component; Order: HD, TR, LG, RA, LA, RH, LH, SH, S1, S2, S3, S4, S5, S6, S7, S8 + WORD seed; //+014 - NameSeed + union + { + BYTE flags; //+016 - TypeFlags + struct + { + BYTE isOther:1; // MONTYPE_OTHER(set for some champs, uniques) + BYTE isSuperUnique:1; // MONTYPE_SUPERUNIQUE + BYTE isChampion:1; // MONTYPE_CHAMPION + BYTE isUnique:1; // MONTYPE_UNIQUE + BYTE isMinion:1; // MONTYPE_MINION + BYTE isPossessed:1; // MONTYPE_POSSESSED + BYTE isGhostly:1; // MONTYPE_GHOSTLY + BYTE isMultishot:1; // MONTYPE_MULTISHOT }; }; - BYTE uk1[0x0E]; //+18 - WORD superUniqueID; //+26 - void* unknow1; //+28 - BYTE uk2[0x38]; //+28 + BYTE lastMode; //+017 - eLastMode + DWORD duriel; //+018 - dwDuriel - set only for duriel + BYTE monUModList[10]; //+01C - MonUModList[9] - nine bytes holding the Ids for each MonUMod assigned to the unit + DWORD superUniqueID; //+026 + AIControl* ptAiGeneral; //+02A + BYTE uk2[0x32]; //+02E }; struct ObjectData @@ -226,15 +351,15 @@ struct ObjectData BYTE levelID; }; /* -Kingpin: struct MonsterData -{ - BYTE uk1[0x13]; // +00 - DWORD Flags; // +14 - DWORD uk2; // +18 - DWORD MinionOwnerID; // +1C - BYTE uk3[0x5]; // +20 - WORD SuperUniqueID; // +26 Superunique ID of monster - D2Game* ptGame; // +28 ptGame +Kingpin: struct MonsterData +{ + BYTE uk1[0x13]; // +00 + DWORD Flags; // +14 + DWORD uk2; // +18 + DWORD MinionOwnerID; // +1C + BYTE uk3[0x5]; // +20 + WORD SuperUniqueID; // +26 Superunique ID of monster + D2Game* ptGame; // +28 ptGame }; */ @@ -269,27 +394,27 @@ struct ItemData//size=0x74 }; }; /* -ITEMFLAG_NEWITEM = 0x00000001, -ITEMFLAG_TAGETING = 0x00000004, -ITEMFLAG_UNIDENTIFIED = 0x00000010, -ITEMFLAG_QUANTITY = 0x00000020, -ITEMFLAG_Durability = 0x00000100, +ITEMFLAG_NEWITEM = 0x00000001, +ITEMFLAG_TAGETING = 0x00000004, +ITEMFLAG_UNIDENTIFIED = 0x00000010, +ITEMFLAG_QUANTITY = 0x00000020, +ITEMFLAG_Durability = 0x00000100, ITEMFLAG_UNKNOWN2 = 0x00000400, -ITEMFLAG_SOCKETED = 0x00000800, -ITEMFLAG_NON_SELLABLE = 0x00001000, -ITEMFLAG_NEWITEM2 = 0x00002000, +ITEMFLAG_SOCKETED = 0x00000800, +ITEMFLAG_NON_SELLABLE = 0x00001000, +ITEMFLAG_NEWITEM2 = 0x00002000, ITEMFLAG_UNKNOWN3 = 0x00004000, -ITEMFLAG_CHECKSECPRICE = 0x00010000, -ITEMFLAG_CHECKGAMBLEPRICE = 0x00020000, +ITEMFLAG_CHECKSECPRICE = 0x00010000, +ITEMFLAG_CHECKGAMBLEPRICE = 0x00020000, ITEMFLAG_UNKNOWN4 = 0x00080000, -ITEMFLAG_INDESTRUCTIBLE(ETHERAL) = 0x00400000, +ITEMFLAG_INDESTRUCTIBLE(ETHERAL) = 0x00400000, ITEMFLAG_UNKNOWN5 = 0x00800000, -ITEMFLAG_FROMPLAYER = 0x01000000, +ITEMFLAG_FROMPLAYER = 0x01000000, ITEMFLAG_RUNEWORD = 0x04000000 */ - DWORD guid1; //+1C Global Unique ID 1 - DWORD guid2; //+20 Global Unique ID 2 - DWORD guid3; //+24 Global Unique ID 3 + DWORD guid1; //+1C Global Unique ID 1 + DWORD guid2; //+20 Global Unique ID 2 + DWORD guid3; //+24 Global Unique ID 3 DWORD uniqueID; //+28 BYTE ilvl; //+2C BYTE uk1[0x03]; //+2D @@ -300,7 +425,7 @@ ITEMFLAG_RUNEWORD = 0x04000000 WORD prefix[3]; //+38 WORD suffix[3]; //+3E BYTE equipLoc; //+44 - /* emplacement si �quip� + /* location if equipped * 00 = noequip/inBelt * 01 = head * 02 = neck @@ -326,7 +451,7 @@ ITEMFLAG_RUNEWORD = 0x04000000 BYTE ItemData3; //+47 //D2Common10854 D2Common10853 BYTE pEarLevel; //+48 BYTE varGfx; //+49 - char IName[0x12]; //+4A //inscribed/ear name + char IName[0x12]; //+4A //inscribed/ear name Inventory* ptInventory; //+5C Unit* ptPrevItem; //+60 Unit* ptNextItem; //+64 @@ -360,12 +485,12 @@ struct NetClient //+1A8 is ptGame //+4A8 ptNextClient /* -Kingpin: ptPclient -+16C is either act or unit type -+170 Active UniqueID for player -+174 Active ptPlayer on Client -+1a8 ptGame -+1b4 Current or next ptRoom +Kingpin: ptPclient ++16C is either act or unit type ++170 Active UniqueID for player ++174 Active ptPlayer on Client ++1a8 ptGame ++1b4 Current or next ptRoom */ }; /* @@ -376,20 +501,20 @@ struct PlayerData NetClient* ptNetClient; //+9C }; */ -struct PlayerData -{ - char name[0x10]; //+00 Player Name - void* ptQuest[3]; //+10 Quest Pointers for each difficulty +struct PlayerData +{ + char name[0x10]; //+00 Player Name + void* ptQuest[3]; //+10 Quest Pointers for each difficulty BYTE uk1[0x18]; //+1C //before : 0x14 - void* ptArenaUnit; //+34 ptArena for the Unit + void* ptArenaUnit; //+34 ptArena for the Unit BYTE uk2[0x4]; //+38 //before : 0x7 - WORD MPSourcePortalUniqueID; //+3C Source Portal Unique_ID + WORD MPSourcePortalUniqueID; //+3C Source Portal Unique_ID BYTE uk3[0x2]; //+3E - WORD MPDestPortalUniqueID; //+40 Destination Portal Unique_ID - BYTE uk4[0x06]; //+42 - BYTE ptObjectUnID; //+48 Object UniqueID for TownPortals - BYTE uk5[0x53]; //+49 - NetClient* ptNetClient; //+9C ptClient + WORD MPDestPortalUniqueID; //+40 Destination Portal Unique_ID + BYTE uk4[0x06]; //+42 + BYTE ptObjectUnID; //+48 Object UniqueID for TownPortals + BYTE uk5[0x53]; //+49 + NetClient* ptNetClient; //+9C ptClient }; @@ -400,11 +525,11 @@ struct Unit DWORD nUnitType; //+00 union{ DWORD nPlayerClass; - DWORD nTxtFileNo; + DWORD nTxtFileNo; }; //+04 DWORD nUnitId; //+08 DWORD nItemNum; //+0C - DWORD CurrentAnim; //+10 + DWORD mode; //+10 union{ MonsterData* ptMonsterData; ObjectData* ptObjectData; @@ -452,7 +577,7 @@ struct Unit BYTE uk10[0x0C]; //+D4 Unit* ptFirstMonster; //+E0 Unit* Unit1; //+E4 - Unit* Unit2; //+E8 + Unit* ptNextUnitInRoom; //+E8 BYTE uk11[0x08]; //+EC union{ CBPlayerData* ptCBPlayerData; @@ -480,60 +605,60 @@ struct ItemMod struct AIStruct { - DWORD mSpawn; // +00 - void* mAIFunc; // +04 - DWORD mUnknown1[8]; // +08 - D2Game* mGame; // +28 - DWORD mMinionOwner; // +2C - DWORD mOwnerType; // +30 + DWORD mSpawn; // +00 + void* mAIFunc; // +04 + DWORD mUnknown1[8]; // +08 + D2Game* mGame; // +28 + DWORD mMinionOwner; // +2C + DWORD mOwnerType; // +30 }; struct LocInfo { //Offset from Code - Unit* noneLoc; //+00 - Unit* headLoc; //+04 - Unit* neckLoc; //+08 - Unit* torsoLoc; //+0c - Unit* rightArmLoc; //+10 - Unit* leftArmLoc; //+14 - Unit* rightRingLoc; //+18 - Unit* leftRingLoc; //+1c - Unit* beltLoc; //+20 - Unit* feetLoc; //+24 - Unit* glovesLoc; //+28 + Unit* noneLoc; //+00 + Unit* headLoc; //+04 + Unit* neckLoc; //+08 + Unit* torsoLoc; //+0c + Unit* rightArmLoc; //+10 + Unit* leftArmLoc; //+14 + Unit* rightRingLoc; //+18 + Unit* leftRingLoc; //+1c + Unit* beltLoc; //+20 + Unit* feetLoc; //+24 + Unit* glovesLoc; //+28 }; -struct ItemData +struct ItemData { // Offset from Code DWORD quality; // +00. - DWORD lowSeed; // +04. - DWORD highSeed; // +08. - DWORD unknown1; // +0c. - DWORD startLowSeed; // +10. - DWORD cmdFlags; // +14. - DWORD flags; // +18. - DWORD unknown2[2]; // +1C - DWORD originID; // +24. - DWORD iLvl; // +28. - WORD version; // +2C. - WORD prefix; // +2E. - WORD suffix; // +30. - WORD autoPrefix; // +32. - WORD prefix1; // +34. - WORD prefix2; // +36. - WORD prefix3; // +38. - WORD suffix1; // +3A. - WORD suffix2; // +3C. - WORD suffix3; // +3E. - BYTE bodyLoc; // +40. // 0=inv/stash 4=gaucheS 5=droiteS - BYTE inPage; // +41. // FF=equip 00=inv 04=stash - BYTE unknown3[3]; // +42 - BYTE picture[8]; // +45 - DWORD ilvl; // +4C + DWORD lowSeed; // +04. + DWORD highSeed; // +08. + DWORD unknown1; // +0c. + DWORD startLowSeed; // +10. + DWORD cmdFlags; // +14. + DWORD flags; // +18. + DWORD unknown2[2]; // +1C + DWORD originID; // +24. + DWORD iLvl; // +28. + WORD version; // +2C. + WORD prefix; // +2E. + WORD suffix; // +30. + WORD autoPrefix; // +32. + WORD prefix1; // +34. + WORD prefix2; // +36. + WORD prefix3; // +38. + WORD suffix1; // +3A. + WORD suffix2; // +3C. + WORD suffix3; // +3E. + BYTE bodyLoc; // +40. // 0=inv/stash 4=gaucheS 5=droiteS + BYTE inPage; // +41. // FF=equip 00=inv 04=stash + BYTE unknown3[3]; // +42 + BYTE picture[8]; // +45 + DWORD ilvl; // +4C }; -struct PresetUnit +struct PresetUnit { //Offset from Code DWORD unitType; //+00 DWORD txtFileNo; //+04 @@ -546,128 +671,128 @@ struct PresetUnit struct MissileData { -+04 flags -+08 0 on start -+0c -1 on start -+20 nDirection -+28 range? -+2c range? -+30 level -+34 number of pierces (byte) -+35 (byte) -+36 (byte) -+37 (byte) -+38 range-activate ++04 flags ++08 0 on start ++0c -1 on start ++20 nDirection ++28 range? ++2c range? ++30 level ++34 number of pierces (byte) ++35 (byte) ++36 (byte) ++37 (byte) ++38 range-activate }; -struct Combat +struct Combat { - DWORD mHeader; // +00 : Always 0x32 + DWORD mHeader; // +00 : Always 0x32 DWORD mDisplayFlag; // +04 : Affect critical hit etc ... DWORD mPhysicalDmg; // +08 : Values are << 8 DWORD mUnknown1; // +0C DWORD mFireDmg; // +10 : Values are << 8 DWORD mUnknown2; // +14 - DWORD mBurnLeng; // +18 - DWORD mLtngDmg; // +1C : values are << 8 - DWORD mMagDmg; // +20 : values are << 8 - DWORD mColdDmg; // +24 : values are << 8 - DWORD mPoisDmg; // +28 : ?? - DWORD mPoisLeng; // +2C - DWORD mColdLeng; // +30 - DWORD mFreezeLeng; // +34 - DWORD mLifeSteal; // +38 - DWORD mManaSteal; // +3C - DWORD mUnknwon3; // +40 - DWORD mStunLeng; // +44 - DWORD mUnknown4; // +48 - DWORD mTotalDamage; // +4C - DWORD mUnknown5[6]; // +50 - DWORD mOverlay; // +68 - DWORD mUnknwon6; // +6C + DWORD mBurnLeng; // +18 + DWORD mLtngDmg; // +1C : values are << 8 + DWORD mMagDmg; // +20 : values are << 8 + DWORD mColdDmg; // +24 : values are << 8 + DWORD mPoisDmg; // +28 : ?? + DWORD mPoisLeng; // +2C + DWORD mColdLeng; // +30 + DWORD mFreezeLeng; // +34 + DWORD mLifeSteal; // +38 + DWORD mManaSteal; // +3C + DWORD mUnknwon3; // +40 + DWORD mStunLeng; // +44 + DWORD mUnknown4; // +48 + DWORD mTotalDamage; // +4C + DWORD mUnknown5[6]; // +50 + DWORD mOverlay; // +68 + DWORD mUnknwon6; // +6C }; struct Node { //Offset from Code. - DWORD flag; //+00 //Yoh : null->flag - Unit* ptItem; //+04 //Yoh : ItemData=>Unit - DWORD unID; //+08 - DWORD page; //+0c //Yoh plutot etat : inventory/stash=1; inv-belt=2; equip=3 - Node* nextNode; //+10 + DWORD flag; //+00 //Yoh : null->flag + Unit* ptItem; //+04 //Yoh : ItemData=>Unit + DWORD unID; //+08 + DWORD page; //+0c //Yoh plutot etat : inventory/stash=1; inv-belt=2; equip=3 + Node* nextNode; //+10 }; struct MonsterData // size110 : 60 { - AIStruct* AIPtr; - void* unkonwPtr1; - void* uniqueInfo; - void* spawnInfo; - void* unknownPtr2; - DWORD unkown[8]; - void* lvlPtr; - MonStatTxt* monstatPtr; + AIStruct* AIPtr; + void* unkonwPtr1; + void* uniqueInfo; + void* spawnInfo; + void* unknownPtr2; + DWORD unkown[8]; + void* lvlPtr; + MonStatTxt* monstatPtr; }; -struct Unit +struct Unit { //Offset from Code. DWORD nUnitType; //+00 - union - { - DWORD nTxtFileNo; - DWORD nPlayerClass; - }; //+04 + union + { + DWORD nTxtFileNo; + DWORD nPlayerClass; + }; //+04 DWORD nUnitId; //+08 DWORD eMode; //+0c - DWORD* unknow1; //+10 - DWORD nAct; //+14 - DWORD pActRelated; //+18 - DWORD unknown2[4]; //Unknown Data at +1C - D2Seed nSeed; //+2C - DWORD startSeed; //+34 - Path* pPos; //+38 + DWORD* unknow1; //+10 + DWORD nAct; //+14 + DWORD pActRelated; //+18 + DWORD unknown2[4]; //Unknown Data at +1C + D2Seed nSeed; //+2C + DWORD startSeed; //+34 + Path* pPos; //+38 DWORD unknown3[6]; //Unknown Data at +3C - DWORD animSpeed; //+54 - DWORD unknown32[2]; //+58 - BYTE COFString[12]; //+60 - Stats* ptStats; //+6C - - union - { + DWORD animSpeed; //+54 + DWORD unknown32[2]; //+58 + BYTE COFString[12]; //+60 + Stats* ptStats; //+6C + + union + { PlayerData* pPlayerData; MonsterData* pMonsterData; ItemData* pItemData; - MissileData* pMissile; + MissileData* pMissile; ObjectData* pObjectData; }; //+70 DWORD unknown5[2]; //+74 - BYTE unknown6[2]; //+7C - BYTE rndDmg[2]; //+7e - DWORD unknown7; //+80 + BYTE unknown6[2]; //+7C + BYTE rndDmg[2]; //+7e + DWORD unknown7; //+80 Inventory* ptInventory; //+84 DWORD unknown8[4]; //+88 - DWORD startNull; //+98 - DWORD unknown9[2]; //+9c - D2Game* ptGame; //+a4 - DWORD unknown10[4]; //+a8 + DWORD startNull; //+98 + DWORD unknown9[2]; //+9c + D2Game* ptGame; //+a4 + DWORD unknown10[4]; //+a8 DWORD nOwnerType; //+b8 DWORD nOwnerId; //+bc - DWORD unknown11[3]; //+c0 - D2Info* ptInfo; //+cc - Combat* ptCombat; //+d0 - DWORD unknown12[5]; //+d4 - DWORD flags; //+e8 - DWORD LODflag; //+ec + DWORD unknown11[3]; //+c0 + D2Info* ptInfo; //+cc + Combat* ptCombat; //+d0 + DWORD unknown12[5]; //+d4 + DWORD flags; //+e8 + DWORD LODflag; //+ec DWORD unknown13[7]; //+f0 Unit* pNext; //+10c DWORD unknown14[2]; //+110 //YOH - union + union { ItemData* ptItemData; void* ptData; diff --git a/Commons/d2BinFile.h b/Commons/d2BinFile.h index 3e99d99..7c4c21f 100644 --- a/Commons/d2BinFile.h +++ b/Commons/d2BinFile.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Stucture of binary file + Stucture of binary file =================================================================*/ @@ -9,24 +9,24 @@ #include /* -struct D2ShrinesTXT -{ - BYTE Code; //+00 - BYTE NotUsed1[3]; //+01 - DWORD Arg1; //+04 +struct D2ShrinesTXT +{ + BYTE Code; //+00 + BYTE NotUsed1[3]; //+01 + DWORD Arg1; //+04 DWORD Arg2; //+08 DWORD DurInFrames; //+0C BYTE ResetTimeInMinutes; //+10 - BYTE Rarity; //+11 - char ViewName[0x1F]; //+12 - char NiftyPhrase[0x7F]; //+32 + BYTE Rarity; //+11 + char ViewName[0x1F]; //+12 + char NiftyPhrase[0x7F]; //+32 BYTE EffectClass; //+B2 BYTE NotUsed2; //+B3 DWORD LevelMin; //+B4 };*/ - -enum D2CubeItemFlag -{ + +enum D2CubeItemFlag +{ CUBE_COWPORTAL =1, CUBE_USEITEM =0xFF, CUBE_USETYPE =0xFE, @@ -154,9 +154,20 @@ struct ObjectsBIN }; +struct ExperienceBIN//size=0x20 +{ + DWORD Amazon; + DWORD Sorceress; + DWORD Necromancer; + DWORD Paladin; + DWORD Barbarian; + DWORD Druid; + DWORD Assassin; + DWORD ExpRatio; +}; + struct LevelsBIN//size=0x220 { - }; struct GemsBIN //size: 0xC0=192 (source : fct of dll) @@ -206,130 +217,130 @@ struct GemsBIN //size: 0xC0=192 (source : fct of dll) DWORD shieldmod3max; //+BC }; -struct ItemsBIN //size: 0x1A8=424 (source : fct of dll) (nblines : 134 CA 8B) Gold:20B -{ - char FlippyFile[0x20]; //+00 - char InvFile[0x20]; //+20 - char UniqueInvFile[0x20]; //+40 - char SetInvFile[0x20]; //+60 - DWORD ItemCode; //+80 - DWORD NormCode; //+84 - DWORD UberCode; //+88 - DWORD HellCode; //+8C - DWORD AlternateGfx; //+90 - DWORD pSpell; //+94 - WORD State; //+98 - WORD cState1; //+9A - WORD cState2; //+9C - WORD Stat1; //+9E - WORD Stat2; //+A0 - WORD Stat3; //+A2 - DWORD Calc1; //+A4 - DWORD Calc2; //+A8 - DWORD Calc3; //+AC - DWORD Len; //+B0 - WORD SpellDesc; //+B4 - WORD SpellDescStr; //+B6 - DWORD SpellDescCalc; //+B8 - DWORD BetterGem; //+BC - DWORD WClass; //+C0 - DWORD TwoHandedWClass; //+C4 - DWORD TMogType; //+C8 - DWORD MinAC; //+CC - DWORD MaxAC; //+D0 - DWORD GambleCost; //+D4 - DWORD Speed; //+D8 - DWORD BitField; //+DC - DWORD Cost; //+E0 - DWORD MinStack; //+E4 - DWORD MaxStack; //+E8 - DWORD SpawnStack; //+EC - DWORD GemOffset; //+F0 - WORD NameStr; //+F4 - WORD Version; //+F6 - WORD AutoPrefix; //+F8 - WORD MissileType; //+FA - BYTE Rarity; //+FC - BYTE Level; //+FD - BYTE MinDam; //+FE - BYTE MaxDam; //+FF - BYTE MinMisDam; //+100 - BYTE MaxMisDam; //+101 - BYTE TwoHandMinDam; //+102 - BYTE TwoHandMaxDam; //+103 - BYTE RangeAdder; //+104 - BYTE NotUsed1; //+105 - WORD StrBonus; //+106 - WORD DexBonus; //+108 - WORD RegStr; //+10A - WORD RegDex; //+10C - BYTE Absorbs; //+10E - BYTE InvWidth; //+10F - BYTE InvHeight; //+110 - BYTE Block; //+111 - BYTE Durability; //+112 +struct ItemsBIN //size: 0x1A8=424 (source : fct of dll) +{ + char FlippyFile[0x20]; //+00 + char InvFile[0x20]; //+20 + char UniqueInvFile[0x20]; //+40 + char SetInvFile[0x20]; //+60 + DWORD ItemCode; //+80 + DWORD NormCode; //+84 + DWORD UberCode; //+88 + DWORD HellCode; //+8C + DWORD AlternateGfx; //+90 + DWORD pSpell; //+94 + WORD State; //+98 + WORD cState1; //+9A + WORD cState2; //+9C + WORD Stat1; //+9E + WORD Stat2; //+A0 + WORD Stat3; //+A2 + DWORD Calc1; //+A4 + DWORD Calc2; //+A8 + DWORD Calc3; //+AC + DWORD Len; //+B0 + WORD SpellDesc; //+B4 + WORD SpellDescStr; //+B6 + DWORD SpellDescCalc; //+B8 + DWORD BetterGem; //+BC + DWORD WClass; //+C0 + DWORD TwoHandedWClass; //+C4 + DWORD TMogType; //+C8 + DWORD MinAC; //+CC + DWORD MaxAC; //+D0 + DWORD GambleCost; //+D4 + DWORD Speed; //+D8 + DWORD BitField; //+DC + DWORD Cost; //+E0 + DWORD MinStack; //+E4 + DWORD MaxStack; //+E8 + DWORD SpawnStack; //+EC + DWORD GemOffset; //+F0 + WORD NameStr; //+F4 + WORD Version; //+F6 + WORD AutoPrefix; //+F8 + WORD MissileType; //+FA + BYTE Rarity; //+FC + BYTE Level; //+FD + BYTE MinDam; //+FE + BYTE MaxDam; //+FF + BYTE MinMisDam; //+100 + BYTE MaxMisDam; //+101 + BYTE TwoHandMinDam; //+102 + BYTE TwoHandMaxDam; //+103 + BYTE RangeAdder; //+104 + BYTE NotUsed1; //+105 + WORD StrBonus; //+106 + WORD DexBonus; //+108 + WORD RegStr; //+10A + WORD RegDex; //+10C + BYTE Absorbs; //+10E + BYTE InvWidth; //+10F + BYTE InvHeight; //+110 + BYTE Block; //+111 + BYTE Durability; //+112 BYTE NoDurability; //+113 - BYTE Missile; //+114 - BYTE Component; //+115 - BYTE RArm; //+116 - BYTE LArm; //+117 - BYTE Torso; //+118 - BYTE Legs; //+119 - BYTE RSpad; //+11A - BYTE LSpad; //+11B - BYTE TwoHanded; //+11C - BYTE Usable; //+11D - WORD Type; //+11E - WORD Type2; //+120 - BYTE SubType; //+122 - BYTE NotUsed2; //+123 + BYTE Missile; //+114 + BYTE Component; //+115 + BYTE RArm; //+116 + BYTE LArm; //+117 + BYTE Torso; //+118 + BYTE Legs; //+119 + BYTE RSpad; //+11A + BYTE LSpad; //+11B + BYTE TwoHanded; //+11C + BYTE Usable; //+11D + WORD Type; //+11E + WORD Type2; //+120 + BYTE SubType; //+122 + BYTE NotUsed2; //+123 WORD DropSound; //+124 WORD UseSound; //+126 BYTE DropSfxFrame; //+128 BYTE Unique; //+129 BYTE Quest; //+12A - BYTE QuestDiffCheck; //+12B - BYTE Transparent; //+12C - BYTE TransTbl; //+12D - BYTE NotUsed3; //+12E - BYTE LightRadius; //+12F - BYTE Belt; //+130 - BYTE AutoBelt; //+131 - BYTE Stackable; //+132 - BYTE Spawnable; //+133 - BYTE SpellIcon; //+134 - BYTE DurWarning; //+135 - BYTE QntWaning; //+136 - BYTE HasInv; //+137 - BYTE GemSockets; //+138 - BYTE TransmoGrify; //+139 - BYTE TMogMin; //+13A - BYTE TMogMax; //+13B - BYTE HitClass; //+13C - BYTE OneOrTwoHanded; //+13D - BYTE GemApplyType; //+13E - BYTE LevelReq; //+13F - BYTE MagicLvl; //+140 - BYTE Transform; //+141 - BYTE InvTrans; //+142 - BYTE CompactSave; //+143 - BYTE SkipName; //+144 - BYTE NotUsed4; //+145 - BYTE VendorMin[17]; //+146 - BYTE VendorMax[17]; //+157 - BYTE VendorMagicMin[17]; //+168 - BYTE VendorMagicMax[17]; //+179 - BYTE VendorMagicLvl[17]; //+18A - BYTE NotUsed5; //+19B - DWORD NightmareUpgrade; //+19C - DWORD HellUpgrade; //+1A0 - BYTE PermStoreItem; //+1A4 - BYTE Multibuy; //+1A5 + BYTE QuestDiffCheck; //+12B + BYTE Transparent; //+12C + BYTE TransTbl; //+12D + BYTE NotUsed3; //+12E + BYTE LightRadius; //+12F + BYTE Belt; //+130 + BYTE AutoBelt; //+131 + BYTE Stackable; //+132 + BYTE Spawnable; //+133 + BYTE SpellIcon; //+134 + BYTE DurWarning; //+135 + BYTE QntWaning; //+136 + BYTE HasInv; //+137 + BYTE GemSockets; //+138 + BYTE TransmoGrify; //+139 + BYTE TMogMin; //+13A + BYTE TMogMax; //+13B + BYTE HitClass; //+13C + BYTE OneOrTwoHanded; //+13D + BYTE GemApplyType; //+13E + BYTE LevelReq; //+13F + BYTE MagicLvl; //+140 + BYTE Transform; //+141 + BYTE InvTrans; //+142 + BYTE CompactSave; //+143 + BYTE SkipName; //+144 + BYTE NotUsed4; //+145 + BYTE VendorMin[17]; //+146 + BYTE VendorMax[17]; //+157 + BYTE VendorMagicMin[17]; //+168 + BYTE VendorMagicMax[17]; //+179 + BYTE VendorMagicLvl[17]; //+18A + BYTE NotUsed5; //+19B + DWORD NightmareUpgrade; //+19C + DWORD HellUpgrade; //+1A0 + BYTE PermStoreItem; //+1A4 + BYTE Multibuy; //+1A5 WORD zeros; //+1A6 }; struct RunesBIN //size: 0x120=288 (1.10 ok) -{ +{ char Name[0x40]; //+00 char RuneName[0x40]; //+40 BYTE Complete; //+80 @@ -372,7 +383,7 @@ struct RunesBIN //size: 0x120=288 (1.10 ok) /*struct ItemStatsBIN //size: 0x234=564 { BYTE uk1[0x80]; //+00 - DWORD code; //+80 // ou 0x90 + DWORD code; //+80 // ou 0x90 BYTE uk2[0xB3]; //+84 BYTE itemStat137; //+137 };*/ @@ -380,33 +391,40 @@ struct RunesBIN //size: 0x120=288 (1.10 ok) struct CharStatsBIN //size= 0xC4=196 { - WCHAR nameU[0x10]; - char name[0x10]; - BYTE baseSTR; //+20 - BYTE baseDEX; - BYTE baseENE; - BYTE baseVIT; - BYTE baseStamina; - BYTE HPAdd; - BYTE percentStr; - BYTE percentDex; - BYTE percentInt; - BYTE percentVit; - WORD manaRegen; - DWORD toHitFactor; - BYTE walkVelocity;//+30 - BYTE runVelocity; - BYTE runDrain; - BYTE lifePerLevel; - BYTE staminaPerLevel; - BYTE manaPerLevel; - BYTE lifePerVitality; - BYTE staminaPerVitality; - BYTE manaPerMagic; - BYTE blockFactor; - WORD startSkill; - DWORD baseWClass; - DWORD unknown1[3]; + WCHAR nameU[0x10]; //+00 + char name[0x10]; //+20 + BYTE baseSTR; //+30 + BYTE baseDEX; //+31 + BYTE baseENE; //+32 + BYTE baseVIT; //+33 + BYTE baseStamina; //+34 + BYTE hpadd; //+35 + BYTE percentStr; //+36 + BYTE percentInt; //+37 + BYTE percentDex; //+38 + BYTE percentVit; //+39 + BYTE manaRegen; //+3A + BYTE __3B; //+3B + DWORD toHitFactor; //+3C + BYTE walkVelocity; //+40 + BYTE runVelocity; //+41 + BYTE runDrain; //+42 + BYTE lifePerLevel; //+43 + BYTE staminaPerLevel; //+44 + BYTE manaPerLevel; //+45 + BYTE lifePerVitality; //+46 + BYTE staminaPerVitality; //+47 + BYTE manaPerMagic; //+48 + BYTE blockFactor; //+49 + WORD __4A_startSkill; //+4A + DWORD baseWClass; //+4C + BYTE StatPerLevel; //+50 + BYTE __51; //+51 + WORD StrAllSkills; //+52 + WORD StrSkillTab1; //+54 + WORD StrSkillTab2; //+56 + WORD StrSkillTab3; //+58 + WORD StrClassOnly; //+5A DWORD item1; BYTE item1Loc; BYTE item1Count; @@ -447,97 +465,97 @@ struct CharStatsBIN //size= 0xC4=196 BYTE item10Loc; BYTE item10Count; WORD item10Unknown; - BYTE unknown2[0x18]; + BYTE unknown2[0x18]; }; /* -struct D2CharStats -{ - wchar_t Class_t[0x10]; //+00 - char Class[0x10]; //+20 - BYTE Str; //+30 - BYTE Dex; //+31 - BYTE Int; //+32 - BYTE Vit; //+33 - BYTE Stamina; //+34 - BYTE HpAdd; //+35 - BYTE PercentStr; //+36 - BYTE PercentInt; //+37 - BYTE PercentDex; //+38 - BYTE PercentVit; //+39 - BYTE ManaRegen; //+3A - BYTE NotUsed1; //+3B - DWORD ToHitFactor; //+3C - BYTE WalkVelocity; //+40 - BYTE RunVelocity; //+41 - BYTE RunDrain; //+42 - BYTE LifePerLevel; //+43 - BYTE StamianPerLevel; //+44 - BYTE ManaPerLevel; //+45 - BYTE LifePerVitality; //+46 - BYTE StaminaPerVitality; //+47 - BYTE ManaPerMagic; //+48 - BYTE BlockFactor; //+49 - BYTE NotUsed2[2]; //+4A - DWORD BaseWClass; //+4C - BYTE StatPerLevel; //+50 - BYTE NotUsed3; //+51 - WORD StrAllSkills; //+52 - WORD StrSkillTab1; //+54 - WORD StrSkillTab2; //+56 - WORD StrSkillTab3; //+58 - WORD StrClassOnly; //+5A - DWORD Item1; //+5C - BYTE Item1Loc; //+60 - BYTE Item1Count; //+61 - BYTE NotUsed4[2]; //+62 - DWORD Item2; //+64 - BYTE Item2Loc; //+68 - BYTE Item2Count; //+69 - BYTE NotUsed5[2]; //+6A - DWORD Item3; //+6C - BYTE Item3Loc; //+70 - BYTE Item3Count; //+71 - BYTE NotUsed6[2]; //+72 - DWORD Item4; //+74 - BYTE Item4Loc; //+78 - BYTE Item4Count; //+79 - BYTE NotUsed7[2]; //+7A - DWORD Item5; //+7C - BYTE Item5Loc; //+80 - BYTE Item5Count; //+81 - BYTE NotUsed8[2]; //+82 - DWORD Item6; //+84 - BYTE Item6Loc; //+88 - BYTE Item6Count; //+89 - BYTE NotUsed9[2]; //+8A - DWORD Item7; //+8C - BYTE Item7Loc; //+90 - BYTE Item7Count; //+91 - BYTE NotUsed10[2]; //+92 - DWORD Item8; //+94 - BYTE Item8Loc; //+98 - BYTE Item8Count; //+99 - BYTE NotUsed11[2]; //+9A - DWORD Item9; //+9C - BYTE Item9Loc; //+A0 - BYTE Item9Count; //+A1 - BYTE NotUsed12[2]; //+A2 - DWORD Item10; //+A4 - BYTE Item10Loc; //+A8 - BYTE Item10Count; //+A9 - BYTE NotUsed13[2]; //+AA - WORD StartSkill; //+AC - WORD Skill1; //+AE - WORD Skill2; //+B0 - WORD Skill3; //+B2 - WORD Skill4; //+B4 - WORD Skill5; //+B6 - WORD Skill6; //+B8 - WORD Skill7; //+BA - WORD Skill8; //+BC - WORD Skill9; //+BE - WORD Skill10; //+C0 - BYTE NotUSed14[2]; //+C2 +struct D2CharStats +{ + wchar_t Class_t[0x10]; //+00 + char Class[0x10]; //+20 + BYTE Str; //+30 + BYTE Dex; //+31 + BYTE Int; //+32 + BYTE Vit; //+33 + BYTE Stamina; //+34 + BYTE HpAdd; //+35 + BYTE PercentStr; //+36 + BYTE PercentInt; //+37 + BYTE PercentDex; //+38 + BYTE PercentVit; //+39 + BYTE ManaRegen; //+3A + BYTE NotUsed1; //+3B + DWORD ToHitFactor; //+3C + BYTE WalkVelocity; //+40 + BYTE RunVelocity; //+41 + BYTE RunDrain; //+42 + BYTE LifePerLevel; //+43 + BYTE StamianPerLevel; //+44 + BYTE ManaPerLevel; //+45 + BYTE LifePerVitality; //+46 + BYTE StaminaPerVitality; //+47 + BYTE ManaPerMagic; //+48 + BYTE BlockFactor; //+49 + BYTE NotUsed2[2]; //+4A + DWORD BaseWClass; //+4C + BYTE StatPerLevel; //+50 + BYTE NotUsed3; //+51 + WORD StrAllSkills; //+52 + WORD StrSkillTab1; //+54 + WORD StrSkillTab2; //+56 + WORD StrSkillTab3; //+58 + WORD StrClassOnly; //+5A + DWORD Item1; //+5C + BYTE Item1Loc; //+60 + BYTE Item1Count; //+61 + BYTE NotUsed4[2]; //+62 + DWORD Item2; //+64 + BYTE Item2Loc; //+68 + BYTE Item2Count; //+69 + BYTE NotUsed5[2]; //+6A + DWORD Item3; //+6C + BYTE Item3Loc; //+70 + BYTE Item3Count; //+71 + BYTE NotUsed6[2]; //+72 + DWORD Item4; //+74 + BYTE Item4Loc; //+78 + BYTE Item4Count; //+79 + BYTE NotUsed7[2]; //+7A + DWORD Item5; //+7C + BYTE Item5Loc; //+80 + BYTE Item5Count; //+81 + BYTE NotUsed8[2]; //+82 + DWORD Item6; //+84 + BYTE Item6Loc; //+88 + BYTE Item6Count; //+89 + BYTE NotUsed9[2]; //+8A + DWORD Item7; //+8C + BYTE Item7Loc; //+90 + BYTE Item7Count; //+91 + BYTE NotUsed10[2]; //+92 + DWORD Item8; //+94 + BYTE Item8Loc; //+98 + BYTE Item8Count; //+99 + BYTE NotUsed11[2]; //+9A + DWORD Item9; //+9C + BYTE Item9Loc; //+A0 + BYTE Item9Count; //+A1 + BYTE NotUsed12[2]; //+A2 + DWORD Item10; //+A4 + BYTE Item10Loc; //+A8 + BYTE Item10Count; //+A9 + BYTE NotUsed13[2]; //+AA + WORD StartSkill; //+AC + WORD Skill1; //+AE + WORD Skill2; //+B0 + WORD Skill3; //+B2 + WORD Skill4; //+B4 + WORD Skill5; //+B6 + WORD Skill6; //+B8 + WORD Skill7; //+BA + WORD Skill8; //+BC + WORD Skill9; //+BE + WORD Skill10; //+C0 + BYTE NotUSed14[2]; //+C2 }; */ @@ -553,19 +571,28 @@ struct UniqueItemsBIN //size=0x14C (332) struct { BYTE ukf:2; BYTE carry1:1; + BYTE ladder:1; }; }; BYTE uk3[0x11F]; //+2D }; +struct SetsBIN //size=0x128 (source : fct of dll) +{ + WORD setNum; //+00 + WORD setNameIndex; //+02 + BYTE uk3[0x124]; //+04 +}; struct SetItemsBIN //size=0x1B8 (source : fct of dll) { - WORD setId; //+00 + WORD setNum; //+00 char index[0x20]; //+02 BYTE uk1; //+04 WORD setNameId; //+24 - BYTE uk2[0x192]; //+26 + BYTE uk2[0x6]; //+26 + WORD setId; //+2C + BYTE uk3[0x18A]; //+2E }; @@ -607,276 +634,276 @@ struct SkillsBIN //size=0x23C (572) }; /* -struct D2SkillsTXT -{ - WORD SkillID; //+000 - BYTE Mask1; //+002 - BYTE Mask2; //+003 - BYTE Unknown[8]; //+004 - BYTE CharClass; //+00C - BYTE unknown_1[0x17D]; //+00D - WORD Mana; //+18A - short LvlMana; //+18C - BYTE Attackrank; //+18E - BYTE LineOfSight; //+18F - DWORD Delay; //+190 - WORD SkillDesc; //+194 - BYTE unknown_2[0xA6]; //+196 +struct D2SkillsTXT +{ + WORD SkillID; //+000 + BYTE Mask1; //+002 + BYTE Mask2; //+003 + BYTE Unknown[8]; //+004 + BYTE CharClass; //+00C + BYTE unknown_1[0x17D]; //+00D + WORD Mana; //+18A + short LvlMana; //+18C + BYTE Attackrank; //+18E + BYTE LineOfSight; //+18F + DWORD Delay; //+190 + WORD SkillDesc; //+194 + BYTE unknown_2[0xA6]; //+196 }; -struct D2SkillsTXT -{ - WORD SkillID; //+000 - BYTE Mask1; //+002 - BYTE Mask2; //+003 - BYTE Unknown[8]; //+004 - BYTE CharClass; //+00C - BYTE Unknown2[3]; //+00D - BYTE anim; //+010 - BYTE monanim; //+011 - BYTE seqtrans; //+012 - BYTE seqnum; //+013 - BYTE Unknown7; //+014 - BYTE SelectProc; //+015 - BYTE seqinput; //+016 - BYTE Unknown3; //+017 - WORD itypea1; //+018 - WORD itypea2; //+01A - WORD itypea3; //+01C - WORD itypeb1; //+01E - WORD itypeb2; //+020 - WORD itypeb3; //+022 - WORD etypea1; //+024 - WORD etypea2; //+026 - WORD etypeb1; //+028 - WORD etypeb2; //+02A - WORD srvstfunc; //+02C - WORD srvdofunc; //+02E - WORD srvprgfunc1; //+030 - WORD srvprgfunc2; //+032 - WORD srvprgfunc3; //+034 - WORD Unknown8; //+036 - DWORD prgcalc1; //+038 - DWORD prgcalc2; //+03C - DWORD prgcalc3; //+040 - WORD prgdam; //+044 - WORD srvmissile; //+046 - WORD srvmissilea; //+048 - WORD srvmissileb; //+04A - WORD srvmissilec; //+04C - WORD srvoverlay; //+04E - DWORD aurafilter; //+050 - WORD aurastat1; //+054 - WORD aurastat2; //+056 - WORD aurastat3; //+058 - WORD aurastat4; //+05A - WORD aurastat5; //+05C - WORD aurastat6; //+05E - DWORD auralencalc; //+060 - DWORD aurarangecalc; //+064 - DWORD aurastatcalc1; //+068 - DWORD aurastatcalc2; //+06C - DWORD aurastatcalc3; //+070 - DWORD aurastatcalc4; //+074 - DWORD aurastatcalc5; //+078 - DWORD aurastatcalc6; //+07C - WORD aurastate; //+080 - WORD auratargetstate; //+082 - WORD auraevent1; //+084 - WORD auraevent2; //+086 - WORD auraevent3; //+088 - WORD auraeventfunc1; //+08A - WORD auraeventfunc2; //+08C - WORD auraeventfunc3; //+08E - WORD auratgtevent; //+090 - WORD auratgteventfunc; //+092 - WORD passivestate; //+094 - WORD passiveitype; //+096 - WORD passivestat1; //+098 - WORD passivestat2; //+09A - WORD passivestat3; //+09C - WORD passivestat4; //+09E - WORD passivestat5; //+0A0 - DWORD passivecalc1; //+0A4 - DWORD passivecalc2; //+0A8 - DWORD passivecalc3; //+0AC - DWORD passivecalc4; //+0B0 - DWORD passivecalc5; //+0B4 - WORD passiveevent; //+0B8 - WORD passiveeventfunc; //+0BA - WORD summon; //+0BC - BYTE pettype; //+0BE - BYTE summode; //+0BF - DWORD petmax; //+0C0 - WORD sumskill1; //+0C4 - WORD sumskill2; //+0C6 - WORD sumskill3; //+0C8 - WORD sumskill4; //+0CA - WORD sumskill5; //+0CC - DWORD sumskcalc1; //+0D0 - DWORD sumskcalc2; //+0D4 - DWORD sumskcalc3; //+0D8 - DWORD sumskcalc4; //+0DC - DWORD sumskcalc5; //+0E0 - WORD sumumod; //+0E4 - WORD sumoverlay; //+0E6 - WORD cltmissile; //+0E8 - WORD cltmissilea; //+0EA - WORD cltmissileb; //+0EC - WORD cltmissilec; //+0EE - WORD cltmissiled; //+0F0 - WORD cltstfunc; //+0F2 - WORD cltdofunc; //+0F4 - WORD cltprgfunc1; //+0F6 - WORD cltprgfunc2; //+0F8 - WORD cltprgfunc3; //+0FA - WORD stsound; //+0FC - WORD stsoundclass; //+0FE - WORD dosound; //+100 - WORD dosounda; //+102 - WORD dosoundb; //+104 - WORD castoverlay; //+106 - WORD tgtoverlay; //+108 - WORD tgtsound; //+10A - WORD prgoverlay; //+10C - WORD prgsound; //+10E - WORD cltoverlaya; //+110 - WORD cltoverlayb; //+112 - DWORD cltcalc1; //+114 - DWORD cltcalc2; //+118 - DWORD cltcalc3; //+11C - WORD ItemTarget; //+120 - WORD ItemCastSound; //+122 - WORD ItemCastOverlay; //+124 - WORD Unknown4; //+126 - DWORD perdelay; //+128 - WORD maxlvl; //+12C - WORD ResultFlags; //+12E - DWORD HitFlags; //+130 - DWORD HitClass; //+134 - DWORD calc1; //+138 - DWORD calc2; //+13C - DWORD calc3; //+140 - DWORD calc4; //+144 - DWORD Param1; //+148 - DWORD Param2; //+14C - DWORD Param3; //+150 - DWORD Param4; //+154 - DWORD Param5; //+158 - DWORD Param6; //+15C - DWORD Param7; //+160 - DWORD Param8; //+164 - WORD weapsel; //+168 - WORD ItemEffect; //+16A - BYTE ItemCltEffect; //+16C - BYTE ItemTgtDo; //+16D - BYTE ItemCheckStart; //+16E - BYTE ItemCltCheckStart; //+16F - DWORD skpoints; //+170 - WORD reqlevel; //+174 - WORD reqstr; //+176 - WORD reqdex; //+178 - WORD reqint; //+17A - WORD reqvit; //+17C - WORD reqskill1; //+17E - WORD reqskill2; //+180 - WORD reqskill3; //+182 - WORD startmana; //+184 - WORD minmana; //+186 - WORD manashift; //+188 - WORD Mana; //+18A - short LvlMana; //+18C - BYTE Attackrank; //+18E - BYTE LineOfSight; //+18F - DWORD Delay; //+190 - WORD SkillDesc; //+194 - WORD Unknown5; //+196 - DWORD ToHit; //+198 - DWORD LevToHit; //+19C - DWORD ToHitCalc; //+1A0 - BYTE HitShift; //+1A4 - WORD SrcDam; //+1A5 - BYTE Unknown6; //+1A7 - DWORD MinDam; //+1A8 - DWORD MaxDam; //+1AC - DWORD MinLevDam1; //+1B0 - DWORD MinLevDam2; //+1B4 - DWORD MinLevDam3; //+1B8 - DWORD MinLevDam4; //+1BC - DWORD MinLevDam5; //+1C0 - DWORD MaxLevDam1; //+1C4 - DWORD MaxLevDam2; //+1C8 - DWORD MaxLevDam3; //+1CC - DWORD MaxLevDam4; //+1D0 - DWORD MaxLevDam5; //+1D4 - DWORD DmgSymPerCalc; //+1D8 - DWORD EType; //+1DC - DWORD Emin; //+1E0 - DWORD Emax; //+1E4 - DWORD EMinLev1; //+1E8 - DWORD EMinLev2; //+1EC - DWORD EMinLev3; //+1F0 - DWORD EMinLev4; //+1F4 - DWORD EMinLev5; //+1F8 - DWORD EMaxLev1; //+1FC - DWORD EMaxLev2; //+200 - DWORD EMaxLev3; //+204 - DWORD EMaxLev4; //+208 - DWORD EMaxLev5; //+20C - DWORD EDmgSymPerCalc; //+210 - DWORD ELen; //+214 - DWORD ELevLen1; //+218 - DWORD ELevLen2; //+21C - DWORD ELevLen3; //+220 - DWORD ELenSymPerCalc; //+224 - WORD restrict; //+228 - WORD state1; //+22A - WORD state2; //+22C - WORD state3; //+22E - WORD aitype; //+230 - WORD aibonus; //+232 - DWORD CostMult; //+234 - DWORD CostAdd; //+238 +struct D2SkillsTXT +{ + WORD SkillID; //+000 + BYTE Mask1; //+002 + BYTE Mask2; //+003 + BYTE Unknown[8]; //+004 + BYTE CharClass; //+00C + BYTE Unknown2[3]; //+00D + BYTE anim; //+010 + BYTE monanim; //+011 + BYTE seqtrans; //+012 + BYTE seqnum; //+013 + BYTE Unknown7; //+014 + BYTE SelectProc; //+015 + BYTE seqinput; //+016 + BYTE Unknown3; //+017 + WORD itypea1; //+018 + WORD itypea2; //+01A + WORD itypea3; //+01C + WORD itypeb1; //+01E + WORD itypeb2; //+020 + WORD itypeb3; //+022 + WORD etypea1; //+024 + WORD etypea2; //+026 + WORD etypeb1; //+028 + WORD etypeb2; //+02A + WORD srvstfunc; //+02C + WORD srvdofunc; //+02E + WORD srvprgfunc1; //+030 + WORD srvprgfunc2; //+032 + WORD srvprgfunc3; //+034 + WORD Unknown8; //+036 + DWORD prgcalc1; //+038 + DWORD prgcalc2; //+03C + DWORD prgcalc3; //+040 + WORD prgdam; //+044 + WORD srvmissile; //+046 + WORD srvmissilea; //+048 + WORD srvmissileb; //+04A + WORD srvmissilec; //+04C + WORD srvoverlay; //+04E + DWORD aurafilter; //+050 + WORD aurastat1; //+054 + WORD aurastat2; //+056 + WORD aurastat3; //+058 + WORD aurastat4; //+05A + WORD aurastat5; //+05C + WORD aurastat6; //+05E + DWORD auralencalc; //+060 + DWORD aurarangecalc; //+064 + DWORD aurastatcalc1; //+068 + DWORD aurastatcalc2; //+06C + DWORD aurastatcalc3; //+070 + DWORD aurastatcalc4; //+074 + DWORD aurastatcalc5; //+078 + DWORD aurastatcalc6; //+07C + WORD aurastate; //+080 + WORD auratargetstate; //+082 + WORD auraevent1; //+084 + WORD auraevent2; //+086 + WORD auraevent3; //+088 + WORD auraeventfunc1; //+08A + WORD auraeventfunc2; //+08C + WORD auraeventfunc3; //+08E + WORD auratgtevent; //+090 + WORD auratgteventfunc; //+092 + WORD passivestate; //+094 + WORD passiveitype; //+096 + WORD passivestat1; //+098 + WORD passivestat2; //+09A + WORD passivestat3; //+09C + WORD passivestat4; //+09E + WORD passivestat5; //+0A0 + DWORD passivecalc1; //+0A4 + DWORD passivecalc2; //+0A8 + DWORD passivecalc3; //+0AC + DWORD passivecalc4; //+0B0 + DWORD passivecalc5; //+0B4 + WORD passiveevent; //+0B8 + WORD passiveeventfunc; //+0BA + WORD summon; //+0BC + BYTE pettype; //+0BE + BYTE summode; //+0BF + DWORD petmax; //+0C0 + WORD sumskill1; //+0C4 + WORD sumskill2; //+0C6 + WORD sumskill3; //+0C8 + WORD sumskill4; //+0CA + WORD sumskill5; //+0CC + DWORD sumskcalc1; //+0D0 + DWORD sumskcalc2; //+0D4 + DWORD sumskcalc3; //+0D8 + DWORD sumskcalc4; //+0DC + DWORD sumskcalc5; //+0E0 + WORD sumumod; //+0E4 + WORD sumoverlay; //+0E6 + WORD cltmissile; //+0E8 + WORD cltmissilea; //+0EA + WORD cltmissileb; //+0EC + WORD cltmissilec; //+0EE + WORD cltmissiled; //+0F0 + WORD cltstfunc; //+0F2 + WORD cltdofunc; //+0F4 + WORD cltprgfunc1; //+0F6 + WORD cltprgfunc2; //+0F8 + WORD cltprgfunc3; //+0FA + WORD stsound; //+0FC + WORD stsoundclass; //+0FE + WORD dosound; //+100 + WORD dosounda; //+102 + WORD dosoundb; //+104 + WORD castoverlay; //+106 + WORD tgtoverlay; //+108 + WORD tgtsound; //+10A + WORD prgoverlay; //+10C + WORD prgsound; //+10E + WORD cltoverlaya; //+110 + WORD cltoverlayb; //+112 + DWORD cltcalc1; //+114 + DWORD cltcalc2; //+118 + DWORD cltcalc3; //+11C + WORD ItemTarget; //+120 + WORD ItemCastSound; //+122 + WORD ItemCastOverlay; //+124 + WORD Unknown4; //+126 + DWORD perdelay; //+128 + WORD maxlvl; //+12C + WORD ResultFlags; //+12E + DWORD HitFlags; //+130 + DWORD HitClass; //+134 + DWORD calc1; //+138 + DWORD calc2; //+13C + DWORD calc3; //+140 + DWORD calc4; //+144 + DWORD Param1; //+148 + DWORD Param2; //+14C + DWORD Param3; //+150 + DWORD Param4; //+154 + DWORD Param5; //+158 + DWORD Param6; //+15C + DWORD Param7; //+160 + DWORD Param8; //+164 + WORD weapsel; //+168 + WORD ItemEffect; //+16A + BYTE ItemCltEffect; //+16C + BYTE ItemTgtDo; //+16D + BYTE ItemCheckStart; //+16E + BYTE ItemCltCheckStart; //+16F + DWORD skpoints; //+170 + WORD reqlevel; //+174 + WORD reqstr; //+176 + WORD reqdex; //+178 + WORD reqint; //+17A + WORD reqvit; //+17C + WORD reqskill1; //+17E + WORD reqskill2; //+180 + WORD reqskill3; //+182 + WORD startmana; //+184 + WORD minmana; //+186 + WORD manashift; //+188 + WORD Mana; //+18A + short LvlMana; //+18C + BYTE Attackrank; //+18E + BYTE LineOfSight; //+18F + DWORD Delay; //+190 + WORD SkillDesc; //+194 + WORD Unknown5; //+196 + DWORD ToHit; //+198 + DWORD LevToHit; //+19C + DWORD ToHitCalc; //+1A0 + BYTE HitShift; //+1A4 + WORD SrcDam; //+1A5 + BYTE Unknown6; //+1A7 + DWORD MinDam; //+1A8 + DWORD MaxDam; //+1AC + DWORD MinLevDam1; //+1B0 + DWORD MinLevDam2; //+1B4 + DWORD MinLevDam3; //+1B8 + DWORD MinLevDam4; //+1BC + DWORD MinLevDam5; //+1C0 + DWORD MaxLevDam1; //+1C4 + DWORD MaxLevDam2; //+1C8 + DWORD MaxLevDam3; //+1CC + DWORD MaxLevDam4; //+1D0 + DWORD MaxLevDam5; //+1D4 + DWORD DmgSymPerCalc; //+1D8 + DWORD EType; //+1DC + DWORD Emin; //+1E0 + DWORD Emax; //+1E4 + DWORD EMinLev1; //+1E8 + DWORD EMinLev2; //+1EC + DWORD EMinLev3; //+1F0 + DWORD EMinLev4; //+1F4 + DWORD EMinLev5; //+1F8 + DWORD EMaxLev1; //+1FC + DWORD EMaxLev2; //+200 + DWORD EMaxLev3; //+204 + DWORD EMaxLev4; //+208 + DWORD EMaxLev5; //+20C + DWORD EDmgSymPerCalc; //+210 + DWORD ELen; //+214 + DWORD ELevLen1; //+218 + DWORD ELevLen2; //+21C + DWORD ELevLen3; //+220 + DWORD ELenSymPerCalc; //+224 + WORD restrict; //+228 + WORD state1; //+22A + WORD state2; //+22C + WORD state3; //+22E + WORD aitype; //+230 + WORD aibonus; //+232 + DWORD CostMult; //+234 + DWORD CostAdd; //+238 }; Yohann: thx -Kingpin: /* -usemanaondo -repeat -TgtPlaceCheck -interrupt -leftskill -AttackNoMana -TargetItem -TargetAlly -TargetPet -TargetCorpse -SearchOpenXY -SearchEnemyNear -SearchEnemyXY -TargetableOnly -UseAttackRate -durability -enhanceable -noammo -InGame -scroll -general -periodic -aura -passive -Kick -InTown -prgstack -finishing -progressive -range -warp -weaponsnd -stsounddelay -stsuccessonly -lob -decquant -immediate +Kingpin: /* +usemanaondo +repeat +TgtPlaceCheck +interrupt +leftskill +AttackNoMana +TargetItem +TargetAlly +TargetPet +TargetCorpse +SearchOpenXY +SearchEnemyNear +SearchEnemyXY +TargetableOnly +UseAttackRate +durability +enhanceable +noammo +InGame +scroll +general +periodic +aura +passive +Kick +InTown +prgstack +finishing +progressive +range +warp +weaponsnd +stsounddelay +stsuccessonly +lob +decquant +immediate Kingpin: those columns should be there also */ @@ -895,7 +922,10 @@ struct MonStatsBIN //size=0x1A8 (424) { BYTE uk1[0x6]; //+00 WORD monsterNameID; //+06 - BYTE uk2[0x1A0]; //+08 + BYTE uk2[0x168]; //+08 + WORD skill[8]; //+170 + BYTE skillArg[8]; //+180 + BYTE uk3[0x20]; //+188 }; //+1A8 struct ItemTypesBIN //size=0xE4 (228) (source : fct of dll) @@ -1179,7 +1209,10 @@ struct DataTables//01EE6A20 * 01FDA2D0 //second comments=1.11 BYTE uk8[0x18]; //+BE0 ItemTypesBIN* itemTypes; //+BF8 DWORD nbItemTypes; //+BFC - BYTE uk9[0x18]; //+C00 + BYTE uk9[0x0C]; //+C00 + SetsBIN* sets; //+C0C //1.11 and 1.10 + DWORD nbSets; //+C10 //1.11 and 1.10 + BYTE uk9b[0x4]; //+C14 SetItemsBIN* setItems; //+C18 //1.11 and 1.10 DWORD nbSetItems; //+C1C //1.11 and 1.10 BYTE uk10[0x4]; //+C20 diff --git a/Commons/d2StringTblStruct.h b/Commons/d2StringTblStruct.h index a8c5ad7..c5c9577 100644 --- a/Commons/d2StringTblStruct.h +++ b/Commons/d2StringTblStruct.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - @brief Diablo II Tbl Structures definitions. + @brief Diablo II Tbl Structures definitions. =================================================================*/ diff --git a/Commons/d2Struct.h b/Commons/d2Struct.h index dad360c..0aff83b 100644 --- a/Commons/d2Struct.h +++ b/Commons/d2Struct.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - NOT TESTED IN 1.10 (1.09b) + NOT TESTED IN 1.10 (1.09b) =================================================================*/ @@ -15,15 +15,15 @@ struct Room; #pragma pack(1) struct sWinMessage { - void* msg; + DWORD msg; DWORD type; - DWORD uk1; + DWORD key; WORD x; WORD y; DWORD uk3; DWORD uk4; DWORD managed; - DWORD unmanaged; + DWORD unmanaged; }; #pragma pack() @@ -60,11 +60,11 @@ struct saveBitField struct BINField { - char* fieldName; - int type; - DWORD strLength; - DWORD offset; - void* lookup; + char* fieldName; + int type; + DWORD strLength; + DWORD offset; + void* lookup; }; struct ItemGenerationData //size=0x84 @@ -95,6 +95,17 @@ struct ItemGenerationData //size=0x84 }; }; +struct AIParam { + void* control; //+0x00 + void* u_0x04; //+0x04 + Unit* target; //+0x08 + void* u_0x0C; //+0x0C + void* u_0x10; //+0x10 + DWORD distanceToTarget; //+0x14 + BOOL engagedInCombat; //+0x18 + MonStatsBIN* ptMonStatsBIN; //+0x1C + void* ptMonStats2BIN; //+0x20 +}; /*=================================================================*/ /* Data Structure to Update Client */ diff --git a/Commons/d2constants.h b/Commons/d2constants.h index 04a90ad..af82d76 100644 --- a/Commons/d2constants.h +++ b/Commons/d2constants.h @@ -1,15 +1,15 @@ /*================================================================= File created by Yohann NICOLAS. - Constants of D2 - NOT TESTED IN 1.10 (from 1.09b) + Constants of D2 + NOT TESTED IN 1.10 (from 1.09b) =================================================================*/ #pragma once /*==================================================================================*/ -/* +/* * Constants & Enumerations. */ /*==================================================================================*/ @@ -18,29 +18,29 @@ enum D2TypeSize { D2TS_UNITSIZE = 0x011C }; enum D2DifficultyModes { D2DM_NORMAL, D2DM_NIGHTMARE, D2DM_HELL }; enum D2PlayerClass { D2PC_AMAZON, D2PC_SORCERESS, D2PC_NECROMANCER, D2PC_PALADIN, D2PC_BARBARIAN, D2PC_DRUID, D2PC_ASSASSIN }; +// add the prefix "c" before the number directly in the text. enum D2Color { + BLACK=6, +// BLACK_BIS=14, + DARK_GRAY=5, + GRAY=16, + LIGHT_GRAY=15, +// WHITE_BIS=13, WHITE=0, - RED=1, + BRIGHT_WHITE=18, + GOLD=4, + DARK_YELLOW=7, + YELLOW=9, + ORANGE=8, + DARKEST_GREEN=10, + DARK_GREEN=12, GREEN=2, BLUE=3, - GOLD=4, - DARK_GRAY=5, -// INVISIBLE=6, - DARK_YELLOW=7, - ORANGE=8, - YELLOW=9, - DARKEST_GREEN=0xA, - PURPLE=0xB, - DARK_GREEN=0xC, -// WHITE_BIS=0xD, -// INVISIBLE2=0xE, - LIGHT_GRAY=0xF, - GRAY=0x10, -// VERY_WIERD=0x11, - BRIGHT_WHITE=0x12, - CRYSTAL_RED=0x13, -// WIERD_YELLOW=0x14 + PURPLE=11, + RED=1, + CRYSTAL_RED=19, +// VERY_WIERD=17, }; enum D2Lang @@ -52,8 +52,8 @@ enum D2Lang LNG_POR,// Portuguese LNG_ITA,// Italian LNG_JPN,// Japanese - LNG_KOR,// Korean - LNG_SIN,// + LNG_KOR,// Korean + LNG_SIN,// LNG_CHI,// Chinese LNG_POL,// Polish LNG_RUS,// Russian @@ -445,7 +445,7 @@ enum D2Mod DEXTERITY, VITALITY, ENERGY, - MAXMANA, + MAXMANA, MAXMANA_PERCENT, MAXHP, MAXHP_PERCENT, @@ -824,6 +824,30 @@ enum D2UnitType UNIT_ROOMTILE }; +enum D2UnitMode +{ + UNIT_MODE_DEATH = 0, + UNIT_MODE_NEUTRAL, + UNIT_MODE_WALK, + UNIT_MODE_RUN, + UNIT_MODE_GET_HIT, + UNIT_MODE_TOWN_NEUTRAL, + UNIT_MODE_TOWN_WALK, + UNIT_MODE_ATTACK1, + UNIT_MODE_ATTACK2, + UNIT_MODE_BLOCK, + UNIT_MODE_CAST, + UNIT_MODE_THROW, + UNIT_MODE_KICK, + UNIT_MODE_SKILL1, + UNIT_MODE_SKILL2, + UNIT_MODE_SKILL3, + UNIT_MODE_SKILL4, + UNIT_MODE_DEAD, + UNIT_MODE_SEQUENCE, + UNIT_MODE_KNOCK_BACK +}; + enum D2BodyLoc { LOC_HEAD =1, diff --git a/PlugY/BigStash.cpp b/PlugY/BigStash.cpp index b2bf66a..6bf4242 100644 --- a/PlugY/BigStash.cpp +++ b/PlugY/BigStash.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Use a more big stash @@ -45,15 +45,26 @@ InventoryBIN* STDCALL modifStashGrid(InventoryBIN* ptInventoryBin) return ptInventoryBin; } - FCT_ASM ( caller_modifStashGrid ) - POP ESI + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] CALL D2CompileTxtFile PUSH EAX CALL modifStashGrid - JMP ESI + RETN 0x14 }} +//FCT_ASM ( caller_modifStashGrid ) +// POP ESI +// CALL D2CompileTxtFile +// PUSH EAX +// CALL modifStashGrid +// JMP ESI +//}} + FCT_ASM ( caller_changeTradeStash ) CMP onRealm,0 JNZ normalTradeStash @@ -79,30 +90,27 @@ void Install_BigStash() // modification of stash grid mem_seek R8(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25, 25C0F8); - if (version_D2Common == V114d) { - MEMT_REF4(0xFFFB61F4, caller_modifStashGrid); - } - else { - MEMC_REF4(D2CompileTxtFile, caller_modifStashGrid); - } + 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 + //0065C0F7 |. E8 F461FBFF CALL Game.006122F0 ; \Game.006122F0 // modification of stash background - mem_seek R8(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC, 89EB5); - memt_byte(0x68, 0xE8); // CALL caller_changeTradeStash - MEMT_REF4(0x00000104, caller_changeTradeStash); + mem_seek R8(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC, 89EB5); + memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash + MEMT_REF4( 0x00000104, caller_changeTradeStash); + //6FAEC61C |. 68 04010000 PUSH 104 + //6FB5643C |. 68 04010000 PUSH 104 + //6FB249BC |. 68 04010000 PUSH 104 + //6FB59D7C |. 68 04010000 PUSH 104 + //6FB3CC1C |. 68 04010000 PUSH 104 + //6FB443FC |. 68 04010000 PUSH 104 + //00489EB5 |. 68 04010000 PUSH 104 ; |Arg2 = 00000104 - //6FAEC61C |. 68 04010000 PUSH 104 - //6FB5643C |. 68 04010000 PUSH 104 - //6FB249BC |. 68 04010000 PUSH 104 - //6FB59D7C |. 68 04010000 PUSH 104 - //6FB3CC1C |. 68 04010000 PUSH 104 - //6FB443FC |. 68 04010000 PUSH 104 log_msg("\n"); isInstalled = true; diff --git a/PlugY/ClientSaveFile.cpp b/PlugY/ClientSaveFile.cpp index 052c182..ab7c90d 100644 --- a/PlugY/ClientSaveFile.cpp +++ b/PlugY/ClientSaveFile.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file for each characters. + Add an extra save file for each characters. =================================================================*/ /* @@ -23,7 +23,7 @@ BYTE * openClientSaveFile(char* name, DWORD* size) strcat(filename, ".clt"); log_msg("Client file to read : %s\n",filename); - + FILE* file = fopen(filename, "rb"); if (file) { @@ -55,7 +55,7 @@ DWORD loadClientSaveFile() if (!data) return 0; DWORD curSize = 0; - + log_msg("Load client file.\n"); if (*(DWORD*)&data[curSize] != FILE_SAVETYPE) { @@ -103,7 +103,7 @@ DWORD saveClientSaveFile() D2FogGetSavePath( (char*)data, BUFFER_SIZE); sprintf( szSaveName, "%s%s.clt", data, PCPlayerData->name ); log_msg("Client save file for saving : %s\n",szSaveName); -// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) +// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) DeleteFile(szSaveName); if (!MoveFile(szTempName, szSaveName)) log_box("Could not create the client save file."); diff --git a/PlugY/Commands.cpp b/PlugY/Commands.cpp index 2cc23d3..be8f421 100644 --- a/PlugY/Commands.cpp +++ b/PlugY/Commands.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Updating server. @@ -15,6 +15,8 @@ #include "extraOptions.h" #include "windowed.h" #include "common.h" +#include "savePlayerData.h" +#include bool active_Commands=true; @@ -35,14 +37,19 @@ const char * CMD_UNLOCK_MOUSE2 = "/unlock"; const char * CMD_RENAME_CHAR="/renamechar"; -const char * CMD_REPAGE_NAME = "/renamepage"; +const char * CMD_RENAME_PAGE = "/renamepage"; +const char * CMD_SHORT_RENAME_PAGE = "/rp"; const char * CMD_SET_INDEX = "/setindex"; const char * CMD_SET_MAIN_INDEX = "/setmainindex"; const char * CMD_RESET_INDEX = "/resetindex"; const char * CMD_INSERT_PAGE = "/insertpage"; +const char * CMD_SHORT_INSERT_PAGE = "/ip"; const char * CMD_DELETE_PAGE = "/deletepage"; -const char * CMD_SWAP = "/swap"; -const char * CMD_TOGGLE = "/toggle"; +const char * CMD_SHORT_DELETE_PAGE = "/dp"; +const char * CMD_SWAP_PAGE = "/swappage"; +const char * CMD_SHORT_SWAP_PAGE = "/sp"; +const char * CMD_TOGGLE_PAGE = "/togglepage"; +const char * CMD_SHORT_TOGGLE_PAGE = "/tp"; const char * CMD_DISPLAY_MANA_LIFE = "/dml"; const char * CMD_DISPLAY_LIFE_MANA = "/dlm"; @@ -173,29 +180,29 @@ void gambleReload(Unit* ptChar) */ -void gambleReload(Unit* ptChar) +/*void gambleReload(Unit* ptChar) { Unit* ptNPC = D2GetCurrentNPC(); if (ptNPC) { D2TogglePage(0xC,1,0); - __asm { - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - } -// D2OpenNPCMenu(ptNPC); + //Game* ptGame = ptChar->ptGame; + //DWORD caller = offset_D2Game + 0x74900; + //__asm { + // PUSH 0 + // PUSH 6 + // PUSH 2 + // PUSH ptGame + // MOV ECX, ptChar + // CALL caller + //} + //0330CD70 . 837C24 08 0D CMP DWORD PTR SS:[ESP+8],0D + D2OpenNPCMenu(ptNPC); D2ReloadGambleScreen(); } } //6FACFFD4 |. E8 77F90000 CALL D2Client.6FADF950 +*/ void savePlayers(Unit* ptChar) { @@ -207,15 +214,15 @@ void maxGold(Unit* ptChar) { log_msg("maxGold\n"); - DWORD maxGold = D2GetMaxGold(ptChar); + DWORD maxGold = D2GetMaxGold(ptChar); DWORD maxGoldBank = D2GetMaxGoldBank(ptChar); DWORD playerGold = D2GetPlayerStat(ptChar, STATS_GOLD, 0); DWORD playerGoldBank = D2GetPlayerStat(ptChar, STATS_GOLDBANK, 0); if ( (playerGold < maxGold) || (playerGoldBank < maxGoldBank) ) { - D2AddPlayerStat( ptChar, STATS_GOLD, maxGold-playerGold, 0 ); + D2AddPlayerStat( ptChar, STATS_GOLD, maxGold-playerGold, 0 ); D2AddPlayerStat( ptChar, STATS_GOLDBANK, maxGoldBank-playerGoldBank, 0 ); } else { - D2AddPlayerStat( ptChar, STATS_GOLD, 100000, 0 ); + D2AddPlayerStat( ptChar, STATS_GOLD, 100000, 0 ); } if (active_sharedGold) { @@ -263,7 +270,57 @@ void updateSharedGold(DWORD goldAmount) PCPY->sharedGold = goldAmount; } -bool renameCharacter(Unit* ptChar, const char* newName) +bool renamePage(Unit* ptChar, char* newName) +{ + Stash* ptStash = PCPY->currentStash; + if (!ptStash) + return 0; + + log_msg("Rename current page on Client : '%s' -> '%s'\n", ptStash->name, newName); + int len = strlen(newName); + // trim text + while (newName[0] == ' ') + { + newName++; + len--; + } + while (len > 0 && newName[len-1] == ' ') + { + newName[len-1] = NULL; + len--; + } + // Fix max length + if (len > 20) + { + newName[20] = NULL; + len = 20; + } + + // Check if new name is default name + char defautText[50]; + wcstombs(defautText, getDefaultStashName(ptChar), 50); + if (!strcmp(newName, defautText)) + { + newName[0] = NULL; + len = 0; + } + + // Check if the name change + if (newName[0] == NULL && (ptStash->name == NULL || ptStash->name[0] == NULL)) + return 0; + + if (ptStash->name && !strcmp(newName, ptStash->name)) + return 0; + + // Rename the page + log_msg("Rename current page valid : '%s' (%s)\n", newName, defautText); + renameCurrentStash(ptChar, newName); + for (int i = 0; i <= len; i++) + updateServer(US_PAGENAME + (newName[i] << 8)); + return 0; +} + +bool renameCharacter(Unit* ptChar, char* newName) { int len = strlen(newName); if (len < 2 || len > 15) @@ -274,7 +331,10 @@ bool renameCharacter(Unit* ptChar, const char* newName) if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_'))) return 1; } + log_msg("Rename Character : %s -> %s\n", PCPlayerData->name, newName); + // Move current save file + backupSaveFiles(PCPlayerData->name, -1); { char szCurrentFile[MAX_PATH]; char szNewFile[MAX_PATH]; @@ -282,7 +342,7 @@ bool renameCharacter(Unit* ptChar, const char* newName) //Get temporary savefile name. D2FogGetSavePath(szCurrentFile, MAX_PATH); D2FogGetSavePath(szNewFile, MAX_PATH); - strcat(szCurrentFile, ptChar->ptPlayerData->name); + strcat(szCurrentFile, PCPlayerData->name); strcat(szNewFile, newName); strcat(szCurrentFile, "."); strcat(szNewFile, "."); @@ -290,7 +350,8 @@ bool renameCharacter(Unit* ptChar, const char* newName) int newLen = strlen(szNewFile); strcpy(&szCurrentFile[curLen], "d2s"); strcpy(&szNewFile[newLen], "d2s"); - MoveFile(szCurrentFile, szNewFile); + if (!MoveFile(szCurrentFile, szNewFile)) + return 0; strcpy(&szCurrentFile[curLen], "d2x"); strcpy(&szNewFile[newLen], "d2x"); MoveFile(szCurrentFile, szNewFile); @@ -316,16 +377,19 @@ bool renameCharacter(Unit* ptChar, const char* newName) strcpy(&szNewFile[newLen], "map"); MoveFile(szCurrentFile, szNewFile); } + // Update server for (int i = 0; i <= len; i++) updateServer(US_RENAME + (newName[i] << 8)); // Update client - log_msg("Rename on Client : %s -> %s\n", ptChar->ptPlayerData->name, newName); - strcpy(ptChar->ptPlayerData->name, newName); + log_msg("Rename on Client : %s -> %s\n", PCPlayerData->name, newName); + strcpy(PCPlayerData->name, newName); + updateServer(US_SAVE); return 0; } + /****************************************************************************************************/ int STDCALL commands (char* ptText) @@ -376,41 +440,25 @@ int STDCALL commands (char* ptText) if (!strncmp(command, CMD_RENAME_CHAR, strlen(CMD_RENAME_CHAR))) { - const char* param = &ptText[strlen(CMD_RENAME_CHAR)]; + char* param = &ptText[strlen(CMD_RENAME_CHAR)]; if (param[0] != ' ') return 1; param++; return renameCharacter(ptChar, param); } - if (!strncmp(command, CMD_REPAGE_NAME,strlen(CMD_REPAGE_NAME))) + if (!strncmp(command, CMD_RENAME_PAGE, strlen(CMD_RENAME_PAGE))) { if (!active_multiPageStash) return 1; - char* param = &ptText[strlen(CMD_REPAGE_NAME)]; - Stash* ptStash = PCPY->currentStash; - if (!ptStash) - return 0; + char* param = &ptText[strlen(CMD_RENAME_PAGE)]; + return renamePage(ptChar, param); + } - int len = strlen(param); - while (len > 0 && param[0] == ' ') - { - param++; - len--; - } - if (len > 0 && len <= 15) - { - log_msg("Rename current page on Client : %s -> %s\n", ptStash->name, param); - renameCurrentStash(ptChar, param); - for (int i = 0; i <= len; i++) - updateServer(US_PAGENAME + (param[i] << 8)); - } - else if (len == 0) - { - log_msg("Rename current page on Client: %s\n", ptStash->name); - renameCurrentStash(ptChar, NULL); - updateServer(US_PAGENAME); - } - return 0; + if (!strncmp(command, CMD_SHORT_RENAME_PAGE, strlen(CMD_SHORT_RENAME_PAGE))) + { + if (!active_multiPageStash) return 1; + char* param = &ptText[strlen(CMD_SHORT_RENAME_PAGE)]; + return renamePage(ptChar, param); } if (!strcmp(command, CMD_SET_INDEX)) @@ -442,6 +490,14 @@ int STDCALL commands (char* ptText) return 0; } + if (!strcmp(command, CMD_SHORT_INSERT_PAGE)) + { + if (!active_multiPageStash) return 1; + insertStash(ptChar); + updateServer(US_INSERT_PAGE); + return 0; + } + if (!strcmp(command, CMD_DELETE_PAGE)) { if (!active_multiPageStash) return 1; @@ -450,10 +506,18 @@ int STDCALL commands (char* ptText) return 0; } - if (!strncmp(command, CMD_SWAP, strlen(CMD_SWAP))) + if (!strcmp(command, CMD_SHORT_DELETE_PAGE)) { if (!active_multiPageStash) return 1; - int page = atoi(&command[strlen(CMD_SWAP)]) - 1; + if (deleteStash(ptChar, true)) + updateServer(US_DELETE_PAGE); + return 0; + } + + if (!strncmp(command, CMD_SWAP_PAGE, strlen(CMD_SWAP_PAGE))) + { + if (!active_multiPageStash) return 1; + int page = atoi(&command[strlen(CMD_SWAP_PAGE)]) - 1; if (page < 0 && PCPY->currentStash->nextStash) page = PCPY->currentStash->nextStash->id; if (page < 0) @@ -465,10 +529,38 @@ int STDCALL commands (char* ptText) return 0; } - if (!strncmp(command, CMD_TOGGLE, strlen(CMD_TOGGLE))) + if (!strncmp(command, CMD_SHORT_SWAP_PAGE, strlen(CMD_SHORT_SWAP_PAGE))) + { + if (!active_multiPageStash) return 1; + int page = atoi(&command[strlen(CMD_SHORT_SWAP_PAGE)]) - 1; + if (page < 0 && PCPY->currentStash->nextStash) + page = PCPY->currentStash->nextStash->id; + if (page < 0) + return 1; + updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16)); + updateServer(US_SWAP2 + ((page & 0xFF0000) >> 8)); + updateServer(US_SWAP1 + (page & 0xFF00)); + updateServer(US_SWAP0 + ((page & 0xFF) << 8)); + return 0; + } + + if (!strncmp(command, CMD_TOGGLE_PAGE, strlen(CMD_TOGGLE_PAGE))) { if (!active_sharedStash) return 1; - int page = atoi(&command[strlen(CMD_TOGGLE)]) - 1; + int page = atoi(&command[strlen(CMD_TOGGLE_PAGE)]) - 1; + if (page < 0) + return 1; + updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16)); + updateServer(US_SWAP2 + ((page & 0xFF0000) >> 8)); + updateServer(US_SWAP1 + (page & 0xFF00)); + updateServer(US_SWAP0_TOGGLE + ((page & 0xFF) << 8)); + return 0; + } + + if (!strncmp(command, CMD_SHORT_TOGGLE_PAGE, strlen(CMD_SHORT_TOGGLE_PAGE))) + { + if (!active_sharedStash) return 1; + int page = atoi(&command[strlen(CMD_SHORT_TOGGLE_PAGE)]) - 1; if (page < 0) return 1; updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16)); @@ -517,6 +609,45 @@ int STDCALL commands (char* ptText) // return 0; //} + //if (!strcmp(command,"t")) + //{ + // //test(); + // FILE* file = fopen("D:\\tmp.txt", "wb+"); + // for (int i = 0; i<= 0xFFFF; i++) + // { + // fwprintf( file, L"== %04X ===================================\n%s\n", i, D2GetStringFromIndex(i) ); + // } + // fclose(file); + // return 0; + //} + + if (!strcmp(command,"aa")) + { + #pragma pack(1) + struct { + BYTE displayType;//0x15 main msg; 0x14: char popup + BYTE un; + BYTE zero; + char string[0xFF]; + char null; + char u1[0x100]; + char u2[0x100]; + char u3[0x100]; + } data; + #pragma pack() + + //D2SetNbPlayers(nbPlayersCommand); + + memset(&data,0,sizeof(data)); + data.displayType=0x15; + data.un=1; + data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10 + data.null=NULL; + sprintf(data.string, "players %u", nbPlayersCommand); + D2SendMsgToAll((BYTE*)&data); + return 0; + } + return 1; } @@ -571,7 +702,7 @@ void Install_Commands() // Run custom commmand mem_seek R8(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6, 7C548); - memt_byte( 0x83, 0xE8 ); // CALL + memt_byte( 0x83, 0xE8 ); // CALL MEMT_REF4( 0xC08508C4 , version_D2Client >= V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); //6FB71EE6 . 83C4 08 ADD ESP,8 //6FB71EE7 . 85C0 TEST EAX,EAX @@ -585,6 +716,8 @@ void Install_Commands() //6FB20AE9 |. 85C0 TEST EAX,EAX //6FB61FD6 |. 83C4 08 ADD ESP,8 //6FB61FD9 |. 85C0 TEST EAX,EAX + //0047C548 |. 83C4 08 ADD ESP,8 + //0047C54B |. 85C0 TEST EAX,EAX log_msg("\n"); diff --git a/PlugY/Common.cpp b/PlugY/Common.cpp index de11087..9a15675 100644 --- a/PlugY/Common.cpp +++ b/PlugY/Common.cpp @@ -2,7 +2,7 @@ File created by Yohann NICOLAS. Common functions. - + =================================================================*/ #include "common.h" diff --git a/PlugY/D2functions.cpp b/PlugY/D2functions.cpp index 9c3d7a1..64e4465 100644 --- a/PlugY/D2functions.cpp +++ b/PlugY/D2functions.cpp @@ -1,7 +1,7 @@ /*================================================ File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. This file implements some common and useful function related to some Diablo II mechanisms. @@ -50,43 +50,46 @@ D2S(D2Common,10598, ItemStatCostBIN*, D2Common10598, (DWORD itemStatCostID));//O D2S(D2Common,10673, ItemTypesBIN*, D2Common10673, (DWORD itemTypesID));//ONLY in 1.09 #undef D2S -//TD2SetPlayerStat V2SetPlayerStat; -TD2AddPlayerStat V2AddPlayerStat; -TD2GetPlayerStat V2GetPlayerStat; -//TD2GetPlayerStat20 V2GetPlayerStat20; -TD2GetPlayerBaseStat V2GetPlayerBaseStat; -TD2SetSkillBaseLevel V2SetSkillBaseLevel; -TD2SetSkillBaseLevelOnClient V2SetSkillBaseLevelOnClient; -TD2PrintStat V2PrintStat; -TD2CompileCubeInput V2CompileCubeInput; -TD2CompileCubeOutput V2CompileCubeOutput; -TD2BroadcastFunction V2BroadcastFunction; -TD2GetGameByClientID V2GetGameByClientID; -TD2SpawnMonster V2SpawnMonster; -TD2VerifIfNotCarry1 V2VerifIfNotCarry1; -TD2GameGetObject V2GameGetObject; -TD2TestPositionInRoom V2TestPositionInRoom; -TD2GetItemTypesBIN V2GetItemTypesBIN; -TD2CompileTxtFile compileTxtFile; +//TD2SetPlayerStat V2SetPlayerStat; +TD2AddPlayerStat V2AddPlayerStat; +TD2GetPlayerStat V2GetPlayerStat; +//TD2GetPlayerStat20 V2GetPlayerStat20; +TD2GetPlayerBaseStat V2GetPlayerBaseStat; +TD2SetSkillBaseLevel V2SetSkillBaseLevel; +TD2SetSkillBaseLevelOnClient V2SetSkillBaseLevelOnClient; +TD2PrintStat V2PrintStat; +TD2CompileCubeInput V2CompileCubeInput; +//TD2CompileCubeOutput V2CompileCubeOutput; +TD2BroadcastFunction V2BroadcastFunction; +TD2GetGameByClientID V2GetGameByClientID; +TD2SpawnSuperUnique V2SpawnSuperUnique; +TD2SpawnMonster V2SpawnMonster; +TD2VerifIfNotCarry1 V2VerifIfNotCarry1; +TD2GameGetObject V2GameGetObject; +TD2TestPositionInRoom V2TestPositionInRoom; +TD2GetItemTypesBIN V2GetItemTypesBIN; +TD2CompileTxtFile compileTxtFile; WORD (*getDescStrPos) (DWORD statID); //void (*setImage) (sDrawImageInfo* data, void* image); //void (*setFrame) (sDrawImageInfo* data, DWORD frame); -TD2SendMsgToAll V2SendMsgToAll; -TD2SetColorPopup V2SetColorPopup; -TD2LoadImage V2LoadImage; -TD2PlaySound V2PlaySound; -TD2SendToServer V2SendToServer; -TD2GetCharStatsBIN V2GetCharStatsBIN; -TD2GetItemStatCostBIN V2GetItemStatCostBIN; -TD2SendPacket V2SendPacket; -TD2LoadInventory V2LoadInventory; -TD2SaveGame V2SaveGame; -TD2LinkPortal V2LinkPortal; -TD2Game235C0 V2Game235C0; +TD2SendMsgToAll V2SendMsgToAll; +TD2SetColorPopup V2SetColorPopup; +TD2LoadImage V2LoadImage; +TD2PlaySound V2PlaySound; +TD2SendToServer V2SendToServer; +TD2GetCharStatsBIN V2GetCharStatsBIN; +TD2GetItemStatCostBIN V2GetItemStatCostBIN; +TD2SendPacket V2SendPacket; +TD2LoadInventory V2LoadInventory; +TD2SaveGame V2SaveGame; +TD2MonsterUseSkill V2MonsterUseSkill; +TD2LinkPortal V2LinkPortal; +TD2Game235C0 V2Game235C0; +TD2ReadFile V2ReadFile; //DWORD* ptNbStatDesc //DWORD* ptStatDescTable; -//TD2OpenNPCMenu V2OpenNPCMenu; +//TD2OpenNPCMenu V2OpenNPCMenu; DWORD getStatDescIDFrom (DWORD statID)//FOR 1.09 { @@ -231,7 +234,7 @@ __declspec(naked) void* STDCALL compileTxtFile_9(DWORD unused, const char* filen PUSH EDX MOV ECX,DWORD PTR SS:[ESP+0x230] LEA EDX,DWORD PTR SS:[ESP+0x28] - CALL D2ReadFile + CALL V2ReadFile TEST EAX,EAX JNZ continue_compileTxtFile PUSH 0 @@ -270,7 +273,7 @@ __declspec(naked) void* STDCALL compileTxtFile_10(DWORD unused, const char* file PUSH EDX MOV ECX,DWORD PTR SS:[ESP+0x230] LEA EDX,DWORD PTR SS:[ESP+0x28] - CALL D2ReadFile + CALL V2ReadFile TEST EAX,EAX JNZ continue_compileTxtFile PUSH 0 @@ -285,44 +288,108 @@ continue_compileTxtFile: JMP ECX }} -__declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) { - _asm { - SUB ESP, 0x20C - // MOV EAX,DWORD PTR DS:[6FDF1464] - PUSH EBX - PUSH EBP - PUSH ESI - PUSH EDI - MOV DWORD PTR SS : [ESP + 0x10], 0 - MOV EBX, DWORD PTR SS : [ESP + 0x224] - PUSH EBX - LEA EAX, DWORD PTR SS : [ESP + 0x1A] - PUSH EAX - CALL DWORD PTR SS : [wsprintf] - MOV EDX, DWORD PTR SS : [ESP + 0x228] - ADD ESP, 8 - LEA EDX, DWORD PTR SS : [ESP + 0xE] - PUSH EDX - PUSH EAX - LEA EDX, DWORD PTR SS : [ESP + 0x20] - CALL D2ReadFile - TEST EAX, EAX - JNZ continue_compileTxtFile - PUSH __LINE__ - CALL D2GetInstructionPointer - PUSH EAX - PUSH S_errorReadTxtFile - CALL D2FogAssert - ADD ESP, 0xC - PUSH - 1 - CALL exit - continue_compileTxtFile : - MOV ECX, D2CompileTxtFile - ADD ECX, 0x1EC - JMP ECX - } -} +DWORD compileTxtFile114_1; +DWORD compileTxtFile114_2; +DWORD compileTxtFile114_3; +DWORD compileTxtFile114_5; +DWORD compileTxtFile114_6; +DWORD compileTxtFile114_7; +__declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) +{_asm{ + PUSH EBP + MOV EBP,ESP + SUB ESP,0x11C + PUSH EBX + PUSH ESI + PUSH EDI + + MOV EAX,DWORD PTR SS:[EBP+0x10] + MOV ECX,DWORD PTR SS:[EBP+0x14] + PUSH EBX + PUSH ESI + MOV ESI,DWORD PTR SS:[EBP+0x8] + PUSH EDI + MOV EDI,DWORD PTR SS:[EBP+0xC] + MOV DWORD PTR SS:[EBP-0x11C],ESI + MOV DWORD PTR SS:[EBP-0x10C],EDI + MOV DWORD PTR SS:[EBP-0x110],EAX + MOV DWORD PTR SS:[EBP-0x118],ECX + MOV DWORD PTR SS:[EBP-0x108],0 + + PUSH __LINE__ + PUSH S_compileTxtFile + LEA EAX,DWORD PTR SS:[EBP-0x108] + PUSH EAX + MOV ECX,unused + MOV EDX,filename + CALL V2ReadFile + TEST EAX,EAX + JNZ continue_compileTxtFile + PUSH __LINE__ + CALL D2GetInstructionPointer + PUSH EAX + PUSH S_errorReadTxtFile + CALL D2FogAssert + ADD ESP,0xC + PUSH -1 + CALL exit +continue_compileTxtFile: + // EAX : file + // ECX : - + // EDX : - + // EBX : - + // MOV ESI,DWORD PTR SS:[EBP+8] + // MOV EDI,DWORD PTR SS:[EBP+C] + MOV ESI,DWORD PTR SS:[EBP+0xC] + + MOV ECX,DWORD PTR SS:[EBP-0x108] + PUSH ECX ; /Arg2 + PUSH EAX ; |Arg1 + CALL compileTxtFile114_1 ; \Game.006BD640 + MOV EDI,EAX + PUSH EDI ; /Arg1 + CALL compileTxtFile114_2 ; \Game.006BCDE0 + MOV EBX,EAX + MOV ESI,EBX + IMUL ESI,DWORD PTR SS:[EBP+0x18] + PUSH 0 ; /Arg3 = 00000000 + PUSH 0x904 ; |Arg2 = 00000904 + PUSH compileTxtFile114_3 ; |Arg1 = 006E6370 ASCII ".\DATATBLS\DataTbls.cpp" + MOV EDX,ESI ; | + XOR ECX,ECX ; | + CALL D2AllocMem ; \Game.0040B430 + PUSH ESI + PUSH 0 + PUSH EAX + MOV DWORD PTR SS:[EBP-0x10C],EAX + CALL compileTxtFile114_5 + MOV EDX,DWORD PTR SS:[EBP+0x18] + MOV EAX,DWORD PTR SS:[EBP-0x10C] + MOV ECX,DWORD PTR SS:[EBP-0x110] + ADD ESP,0xC + PUSH EDX + PUSH EBX + PUSH EAX + PUSH ECX + PUSH EDI + CALL compileTxtFile114_6 + PUSH EDI ; /Arg1 + CALL compileTxtFile114_7 ; \Game.006BCDA0 + + MOV EAX, DWORD PTR SS:[EBP-0x10C] + MOV ECX,DWORD PTR SS:[EBP-0x118] + TEST ECX,ECX + JE fin + MOV DWORD PTR DS:[ECX],EBX +fin: + POP EDI + POP ESI + POP EBX + MOV ESP,EBP + POP EBP + RETN 0x14 +}} __declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) {_asm{ @@ -345,7 +412,7 @@ __declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* fil PUSH EDX PUSH EAX LEA EAX,DWORD PTR SS:[ESP+0x20] - CALL D2ReadFile + CALL V2ReadFile TEST EAX,EAX JNZ continue_compileTxtFile PUSH __LINE__ @@ -372,14 +439,6 @@ Unit* STDCALL D2GetClientPlayer_111(){return ptClientChar;} DWORD *StatMouse1, *StatMouse2, *StatMouse3, *StatMouse4; void FASTCALL D2CleanStatMouseUp_111(){*StatMouse1=*StatMouse2=*StatMouse3=*StatMouse4=0;} -FCT_ASM ( D2CleanStatMouseUp_114 ) - MOV DWORD PTR DS : [StatMouse1], 0 - MOV DWORD PTR DS : [StatMouse2], 0 - MOV DWORD PTR DS : [StatMouse3], 0 - MOV DWORD PTR DS : [StatMouse4], 0 - RETN -}} - Unit* STDCALL D2GetRealItem_111(Unit* ptItem){return ptItem;} /* 1.11 : sizememory : 0x104 (LoadBuySell) 6FADA7F0 |. A1 48BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD48] @@ -422,14 +481,6 @@ FCT_ASM ( D2LoadImage_111 ) RETN }} -FCT_ASM( D2LoadImage_114 ) - PUSH EDX - MOV EAX, ECX - CALL V2LoadImage - POP EDX - RETN -}} - const char* D2FreeImage_FILE = __FILE__; FCT_ASM ( D2FreeImage_111 ) PUSH ESI @@ -468,20 +519,6 @@ FCT_ASM ( D2GetClient_111 ) RETN 4 }} -FCT_ASM( D2SetSkillBaseLevelOnClient_114 ) - PUSH EBX - PUSH EDX - PUSH ESI - PUSH DWORD PTR SS : [ESP + 0x14] - PUSH DWORD PTR SS : [ESP + 0x14] - MOV EBX, DWORD PTR SS : [ESP + 0x14] - MOV EAX, ECX - MOV ESI, EDX - CALL V2SetSkillBaseLevelOnClient - POP ESI - POP EBX - RETN 0xC -}} FCT_ASM ( D2SetSkillBaseLevelOnClient_111 ) PUSH EBX @@ -508,21 +545,19 @@ FCT_ASM ( D2GetItemStatCostBIN_111 ) }} FCT_ASM( D2SendToServer3_114 ) - PUSH EDI - PUSH ESI - PUSH EBX - PUSH ECX - MOV BYTE PTR SS : [ESP], CL - MOV WORD PTR SS : [ESP + 1], DX - MOV EDI, 3 - LEA ECX, DWORD PTR SS : [ESP] - PUSH ECX - CALL D2SendToServerXX - POP ECX - POP EBX - POP ESI - POP EDI - RETN + PUSH EDI + PUSH EBX + PUSH ECX + MOV BYTE PTR SS:[ESP],CL + MOV WORD PTR SS:[ESP+1],DX + MOV EDI,3 + LEA EDX,DWORD PTR SS:[ESP] + PUSH EDX + CALL D2SendToServerXX + POP ECX + POP EBX + POP EDI + RETN }} FCT_ASM ( D2SendToServer3_111 ) @@ -539,21 +574,17 @@ FCT_ASM ( D2SendToServer3_111 ) RETN }} -FCT_ASM( D2PrintStat_114 ) +FCT_ASM ( D2PrintStat_114 ) PUSH ESI - PUSH EBX - PUSH ECX - MOV ESI, DWORD PTR SS : [ESP + 0x1C] - PUSH DWORD PTR SS : [ESP + 0x18] - PUSH DWORD PTR SS : [ESP + 0x18] - PUSH DWORD PTR SS : [ESP + 0x18] - PUSH EDX - PUSH ECX - CALL V2PrintStat - POP ECX - POP EBX + MOV ESI,DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x10] + PUSH DWORD PTR SS:[ESP+0x10] + PUSH DWORD PTR SS:[ESP+0x10] + PUSH EDX + PUSH ECX + CALL V2PrintStat POP ESI - RETN 0x10 + RETN 0x10 }} FCT_ASM ( D2PrintStat_111 ) @@ -569,14 +600,14 @@ FCT_ASM ( D2PrintStat_111 ) RETN 0x10 }} -FCT_ASM(D2SendPacket_114) - PUSH EDI - PUSH DWORD PTR SS : [ESP + 8] +FCT_ASM ( D2SendPacket_114 ) + PUSH EDI + PUSH DWORD PTR SS:[ESP+8] PUSH EDX - MOV EDI, ECX + MOV EDI,ECX CALL V2SendPacket - POP EDI - RETN 0x4 + POP EDI + RETN 4 }} FCT_ASM ( D2SendPacket_111 ) @@ -602,22 +633,22 @@ FCT_ASM ( D2CompileCubeInput_111 ) RETN 8 }} -FCT_ASM( D2CompileCubeInput_114 ) - PUSH ECX - MOV EAX, EDX - CALL V2CompileCubeInput - RETN 8 -}} - -FCT_ASM ( D2CompileCubeOutput_111 ) - PUSH EBX - MOV EBX,ECX - PUSH EDX - CALL V2CompileCubeOutput - POP EBX +FCT_ASM ( D2CompileCubeInput_114 ) + PUSH ECX + MOV EAX,EDX + CALL V2CompileCubeInput RETN 8 }} +//FCT_ASM ( D2CompileCubeOutput_111 ) +// PUSH EBX +// MOV EBX,ECX +// PUSH EDX +// CALL V2CompileCubeOutput +// POP EBX +// RETN 8 +//}} + FCT_ASM ( D2BroadcastFunction_111 ) PUSH EDI PUSH EBX @@ -630,7 +661,7 @@ FCT_ASM ( D2BroadcastFunction_111 ) RETN 4 }} -FCT_ASM ( D2SpawnMonster_111 ) +FCT_ASM ( D2SpawnSuperUnique_111 ) PUSH DWORD PTR SS:[ESP+0x18] PUSH DWORD PTR SS:[ESP+0x14] PUSH DWORD PTR SS:[ESP+0x14] @@ -638,11 +669,11 @@ FCT_ASM ( D2SpawnMonster_111 ) PUSH ECX MOV ECX,DWORD PTR SS:[ESP+0x18] MOV EAX,DWORD PTR SS:[ESP+0x28] - CALL V2SpawnMonster + CALL V2SpawnSuperUnique RETN 0x18 }} -FCT_ASM ( D2SpawnMonster_111b ) +FCT_ASM ( D2SpawnSuperUnique_111b ) PUSH DWORD PTR SS:[ESP+0x10] PUSH DWORD PTR SS:[ESP+0x10] PUSH DWORD PTR SS:[ESP+0x10] @@ -651,24 +682,39 @@ FCT_ASM ( D2SpawnMonster_111b ) MOV EAX,DWORD PTR SS:[ESP+0x18] MOV EDX,DWORD PTR SS:[ESP+0x2C] MOV ECX,DWORD PTR SS:[ESP+0x28]//superuniqueID - CALL V2SpawnMonster + CALL V2SpawnSuperUnique RETN 0x18 }} -FCT_ASM( D2SpawnMonster_114 ) - PUSH ECX - MOV EBX, DWORD PTR SS : [ESP + 0x18] - MOV ECX, DWORD PTR SS : [ESP + 0x14] - MOV DWORD PTR SS : [ESP + 0x18], ECX - MOV ECX, DWORD PTR SS : [ESP + 0x10] - MOV DWORD PTR SS : [ESP + 0x14], ECX - MOV ECX, DWORD PTR SS : [ESP + 0xC] - MOV DWORD PTR SS : [ESP + 0x10], ECX - MOV ECX, DWORD PTR SS : [ESP + 0x8] - MOV DWORD PTR SS : [ESP + 0xC], ECX - MOV DWORD PTR SS : [ESP + 0x8], EDX - POP ECX - JMP V2SpawnMonster + +FCT_ASM( D2SpawnSuperUnique_114 ) + PUSH EBX + PUSH EDI + MOV EBX, DWORD PTR SS:[ESP+0x1C] + MOV EDI, ECX + PUSH DWORD PTR SS:[ESP+0x20] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH EDX + CALL V2SpawnSuperUnique + POP EDI + POP EBX + RETN 0x18 +}} + +FCT_ASM ( D2SpawnMonster_114 ) + PUSH DWORD PTR SS:[ESP+0x18] + PUSH DWORD PTR SS:[ESP+0x18] + PUSH EDX + PUSH ECX + PUSH DWORD PTR SS:[ESP+0x20] + PUSH DWORD PTR SS:[ESP+0x20] + MOV EDX,DWORD PTR SS:[ESP+0x20] + MOV ECX,DWORD PTR SS:[ESP+0x1C] + CALL V2SpawnMonster + RETN 0x18 }} FCT_ASM ( D2VerifIfNotCarry1_111 ) @@ -718,10 +764,6 @@ FCT_ASM ( D2SendToServer_1XX ) RETN 0xC }} -FCT_ASM( D2GetGameByClientID_114 ) - MOV ECX, DWORD PTR SS : [ESP + 0x4] - JMP V2GetGameByClientID -}} FCT_ASM ( D2GetGameByClientID_1XX ) POP EAX @@ -737,36 +779,63 @@ FCT_ASM ( D2SaveGame_1XX ) JMP V2SaveGame }} -FCT_ASM( D2SetColorPopup_114 ) - PUSH EDI - PUSH EDX - MOV EDI, ECX - CALL V2SetColorPopup - POP EDI - RETN +FCT_ASM ( D2MonsterUseSkill_111 ) + PUSH EBX + PUSH EDX + MOV EBX,ECX + MOV ECX,EDX + MOV EAX,DWORD PTR SS:[ESP+0xC] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + PUSH DWORD PTR SS:[ESP+0x1C] + CALL V2MonsterUseSkill + // Game sets monsters AiControl args[0] to 0 after this call + POP EDX + MOV EDX,DWORD PTR DS:[EDX+0x14] + MOV EDX,DWORD PTR DS:[EDX+0x28] + MOV DWORD PTR DS:[EDX+0x14],0 + POP EBX + RETN 0x14 }} + FCT_ASM( D2LinkPortal_114 ) - PUSH ECX - MOV ECX, DWORD PTR SS : [ESP + 0x8] - PUSH DWORD PTR SS : [ESP + 0x14] - PUSH DWORD PTR SS : [ESP + 0x14] - PUSH DWORD PTR SS : [ESP + 0x14] - CALL V2LinkPortal - POP ECX - RETN 0x10 + PUSH ECX + MOV ECX,DWORD PTR SS:[ESP+0x8] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + CALL V2LinkPortal + POP ECX + RETN 0x10 }} FCT_ASM( D2Game235C0_114 ) - PUSH ECX - PUSH EDX - MOV ECX, DWORD PTR SS : [ESP + 0xC] - MOV EDX, DWORD PTR SS : [ESP + 0x10] - POP EDX - POP ECX - RETN 0x8 + POP EAX + POP ECX + POP EDX + PUSH EAX + JMP V2Game235C0 }} +FCT_ASM( D2ReadFile_111 ) + MOV EAX,EDX + PUSH DWORD PTR SS:[ESP+4] + PUSH ECX + CALL V2ReadFile + RETN 0xC +}} + +/*FCT_ASM( D2SaveSPGame_111 ) + PUSH DWORD PTR SS:[ESP+0x8] + PUSH DWORD PTR SS:[ESP+0x8] + PUSH EDX + PUSH ECX + CALL V2SaveSPGame + RETN 8 +}}*/ + #define SETFCTADDR(F, I, N) setFctAddr((DWORD*)&N, (HMODULE)offset_##F, (LPCSTR)I) void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index) { @@ -790,14 +859,11 @@ void 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 F8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) if (version_##Z == V114d) { E2S(Z, I, 0, N, 0) } else { setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)(version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))))); } + #define F8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) if (version_##Z > V113d) { N = (T##N)R8(Z,A,B,C,D,E,F,G,H,I); } else setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)(version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))))); #define A8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) N = (T##N)R8(Z,A,B,C,D,E,F,G,H,I); #define C8(Z, A,B,C,D,E,F,G,H,I, T, N) pt##N = (T*)R8(Z,A,B,C,D,E,F,G,H,I); #include "../Commons/D2Funcs.h" - //D2FogMemAlloc = (TD2FogMemAlloc)(offset_D2Game + 0xB380); - //E2S(D2Game, B380, 0, D2FogMemAlloc, 0) - //return; SgptDataTables = *(DataTables**) R8(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0, 344304); if (version_D2Common < V110) { @@ -814,12 +880,17 @@ void initD2functions() #undef E2F #undef E2C - //////////////// MISC FCT //////////////// //setImage = version_D2Common >= V111 ? setImage_111 : setImage_1XX; //setFrame = version_D2Common >= V111 ? setFrame_111 : setFrame_1XX; getDescStrPos = version_D2Common >= V110 ? getDescStrPos_10 : getDescStrPos_9; - compileTxtFile = version_D2Common == V114d ? compileTxtFile_114 : version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9; + compileTxtFile114_1 = offset_D2Client + 0x002BD640; + compileTxtFile114_2 = offset_D2Client + 0x002BCDE0; + compileTxtFile114_3 = offset_D2Client + 0x002E6370; + compileTxtFile114_5 = offset_D2Client + 0x00281EF0; + compileTxtFile114_6 = offset_D2Client + 0x002BD780; + compileTxtFile114_7 = offset_D2Client + 0x002BCDA0; + compileTxtFile = version_D2Common >= V114a ? compileTxtFile_114 : version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9; //////////////// SELECT RIGHT ADDR FUNCTION //////////////// @@ -1013,7 +1084,7 @@ void initD2functions() //V3(D2LoadSuperuniques, TD2LoadSuperuniques, D2Common, 1F500, 1F510, 29FA0, 71EB0); //V3(D2GetItemStatCostBIN,TD2GetItemStatCostBIN, D2Common, 000, 000, 642B0, 13F0); //V3(D2GetItemTypesBIN, TD2GetItemTypesBIN, D2Common, 000, 000, 2B1A0, 11F0); - //V3(D2SpawnMonster, TD2SpawnMonster, D2Game, 000, 000, 3F220, 4ABE0); + //V3(D2SpawnSuperUnique, TD2SpawnSuperUnique, D2Game, 000, 000, 3F220, 4ABE0); //V3(D2ReloadGambleScreen,TD2ReloadGambleScreen, D2Game, 000, 000, 000, 8E480); //V3(D2SaveGame, TD2SaveGame, D2Game, 000, 000, 89C0, E2390); //V3(D2ClickOnStashButton,TD2ClickOnStashButton, D2Client, 000, 000, 000, A6520); @@ -1022,12 +1093,12 @@ void initD2functions() //V3(D2Game235C0, TD2Game235C0, D2Game, 000, 000, 000, D6D10); //V3(D2OpenPandPortal, TD2OpenPandPortal, D2Game, 000, 000, 000, 9B480); //V3(D2OpenPandFinalPortal,TD2OpenPandFinalPortal,D2Game, 000, 000, 000, 9B470); - //V3(D2MephIA, TD2MephIA, D2Game, 000, 000, 000, 84730); - //V3(D2DiabloIA, TD2DiabloIA, D2Game, 000, 000, 000, 75980); - //V3(D2BaalIA, TD2BaalIA, D2Game, 000, 000, 000, EAB20); - //V3(D2UberMephIA, TD2UberMephIA, D2Game, 000, 000, 000, 70320); - //V3(D2UberDiabloIA, TD2UberDiabloIA, D2Game, 000, 000, 000, 7F200); - //V3(D2UberBaalIA, TD2UberBaalIA, D2Game, 000, 000, 000, E92B0); + //V3(D2MephAI, TD2MephAI, D2Game, 000, 000, 000, 84730); + //V3(D2DiabloAI, TD2DiabloAI, D2Game, 000, 000, 000, 75980); + //V3(D2BaalAI, TD2BaalAI, D2Game, 000, 000, 000, EAB20); + //V3(D2UberMephAI, TD2UberMephAI, D2Game, 000, 000, 000, 70320); + //V3(D2UberDiabloAI, TD2UberDiabloAI, D2Game, 000, 000, 000, 7F200); + //V3(D2UberBaalAI, TD2UberBaalAI, D2Game, 000, 000, 000, E92B0); //#undef V3 @@ -1049,46 +1120,42 @@ void initD2functions() V2SendPacket = D2SendPacket; V2LoadInventory = D2LoadInventory; V2CompileCubeInput = D2CompileCubeInput; - V2CompileCubeOutput = D2CompileCubeOutput; + //V2CompileCubeOutput = D2CompileCubeOutput; V2BroadcastFunction = D2BroadcastFunction; V2GetGameByClientID = D2GetGameByClientID; + V2SpawnSuperUnique = D2SpawnSuperUnique; V2SpawnMonster = D2SpawnMonster; V2VerifIfNotCarry1 = D2VerifIfNotCarry1; V2GameGetObject = D2GameGetObject; V2TestPositionInRoom = D2TestPositionInRoom; V2GetItemTypesBIN = D2GetItemTypesBIN; V2SaveGame = D2SaveGame; + V2MonsterUseSkill = D2MonsterUseSkill; V2LinkPortal = D2LinkPortal; V2Game235C0 = D2Game235C0; + V2ReadFile = D2ReadFile; //V2OpenNPCMenu = D2OpenNPCMenu; //////////////// REDIRECT ON CUSTOM FUNCTIONS //////////////// - - if (version_D2Client == V114d) { - D2GetClientPlayer = D2GetClientPlayer_111; - D2GetClient = (TD2GetClient)D2GetClient_111; - D2LoadImage = (TD2LoadImage)D2LoadImage_114; - D2FreeImage = (TD2FreeImage)D2FreeImage_111; - D2isLODGame = D2isLODGame_111; - D2GetMouseX = D2GetMouseX_111; - D2GetMouseY = D2GetMouseY_111; - D2SendToServer3 = (TD2SendToServer3)D2SendToServer3_114; - D2SetSkillBaseLevelOnClient = (TD2SetSkillBaseLevelOnClient)D2SetSkillBaseLevelOnClient_114; - D2SendPacket = (TD2SendPacket)D2SendPacket_114; - D2GetGameByClientID = (TD2GetGameByClientID)D2GetGameByClientID_1XX; - D2SpawnMonster = (TD2SpawnMonster)D2SpawnMonster_114; - D2CompileCubeInput = (TD2CompileCubeInput)D2CompileCubeInput_114; - D2CleanStatMouseUp = (TD2CleanStatMouseUp)D2CleanStatMouseUp_114; - D2LinkPortal = (TD2LinkPortal)D2LinkPortal_114; - D2Game235C0 = (TD2Game235C0)D2Game235C0_114; - D2PrintStat = (TD2PrintStat)D2PrintStat_114; - D2SaveGame = (TD2SaveGame)D2SaveGame_1XX; - D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1)D2VerifIfNotCarry1_111; - StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650); - StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654); - StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658); - StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C); - } else if ( version_D2Client >= V111 ) { + if (version_D2Client == V114d) + { + D2SendToServer3 = (TD2SendToServer3) D2SendToServer3_114; + D2PrintStat = (TD2PrintStat)D2PrintStat_114; + D2SendPacket = (TD2SendPacket) D2SendPacket_114; + D2CompileCubeInput = (TD2CompileCubeInput) D2CompileCubeInput_114; + D2SpawnSuperUnique = (TD2SpawnSuperUnique) D2SpawnSuperUnique_114; + D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1)D2VerifIfNotCarry1_111; + D2isLODGame = D2isLODGame_111; + D2GetMouseX = D2GetMouseX_111; + D2GetMouseY = D2GetMouseY_111; + D2SpawnMonster = (TD2SpawnMonster)D2SpawnMonster_114; + D2LinkPortal = (TD2LinkPortal)D2LinkPortal_114; + D2Game235C0 = (TD2Game235C0) D2Game235C0_114; + D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX; + D2SaveGame = (TD2SaveGame) D2SaveGame_1XX; + } + else if ( version_D2Client >= V111 ) + { D2SendMsgToAll = (TD2SendMsgToAll) D2SendMsgToAll_111; D2SetColorPopup = (TD2SetColorPopup) D2SetColorPopup_111; D2LoadImage = (TD2LoadImage) D2LoadImage_111; @@ -1103,9 +1170,9 @@ void initD2functions() D2SendPacket = (TD2SendPacket) D2SendPacket_111; D2LoadInventory = (TD2LoadInventory) D2LoadInventory_111; D2CompileCubeInput = (TD2CompileCubeInput) D2CompileCubeInput_111; - D2CompileCubeOutput = (TD2CompileCubeOutput) D2CompileCubeOutput_111; + //D2CompileCubeOutput = (TD2CompileCubeOutput) D2CompileCubeOutput_111; D2BroadcastFunction = (TD2BroadcastFunction) D2BroadcastFunction_111; - D2SpawnMonster = version_D2Game >= V111b ? (TD2SpawnMonster)D2SpawnMonster_111b : (TD2SpawnMonster)D2SpawnMonster_111; + D2SpawnSuperUnique = version_D2Game >= V111b ? (TD2SpawnSuperUnique)D2SpawnSuperUnique_111b : (TD2SpawnSuperUnique)D2SpawnSuperUnique_111; D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1) D2VerifIfNotCarry1_111; D2GameGetObject = (TD2GameGetObject) D2GameGetObject_111; D2GetItemTypesBIN = (TD2GetItemTypesBIN) D2GetItemTypesBIN_111; @@ -1118,10 +1185,12 @@ void initD2functions() D2GetClientPlayer = D2GetClientPlayer_111; D2GetRealItem = D2GetRealItem_111; D2CleanStatMouseUp = D2CleanStatMouseUp_111; - StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650); - StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654); - StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658); - StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C); + D2MonsterUseSkill = (TD2MonsterUseSkill)D2MonsterUseSkill_111; + D2ReadFile = (TD2ReadFile)D2ReadFile_111; + StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, 3A0650); + StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, 3A0654); + StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, 3A0658); + StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, 3A065C); } else { D2SendToServer = (TD2SendToServer) D2SendToServer_1XX; D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX; diff --git a/PlugY/D2wrapper.cpp b/PlugY/D2wrapper.cpp index 453727e..d13608e 100644 --- a/PlugY/D2wrapper.cpp +++ b/PlugY/D2wrapper.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d and DoNotCloseNihlathakPortal by haxifix. @file D2wrapper.cpp @brief Main Diablo II extra DLL handler. @@ -10,6 +10,7 @@ =================================================================*/ +#include "plugYFiles.h" // Install_PlugYFiles() #include "globalVariable.h" // Install_VariableOnRealm() #include "commands.h" // Install_Commands() #include "othersFeatures.h" // Install_ChangeResolution() @@ -27,10 +28,10 @@ #include "extraOptions.h" // Install_AlwaysRegenMapInSP() #include "language.h" // Install_LanguageManagement() #include "windowed.h" // installed with Install_PrintPlugYVersion() +#include "savePlayerData.h" // Install_SavePlayerData() #include "customLibraries.h" #include "common.h" -#include "interface_Stash.h" int version_Game = UNKNOWN; //int version_binkw32 = UNKNOWN; @@ -175,21 +176,22 @@ void hookLibraries() { log_msg("***** Unprotect Libraries *****\n"); - if (version_Game == V114d) { - hookLibrary(S_Game, offset_Game); - } else { - hookLibrary(S_D2Client, offset_D2Client); - // hookLibrary(S_D2CMP, offset_D2CMP); - hookLibrary(S_D2Common, offset_D2Common); - hookLibrary(S_D2Game, offset_D2Game); - hookLibrary(S_D2gfx, offset_D2gfx); - hookLibrary(S_D2Lang, offset_D2Lang); - hookLibrary(S_D2Launch, offset_D2Launch); - // hookLibrary(S_D2Net, offset_D2Net); - // hookLibrary(S_D2Win, offset_D2Win); - hookLibrary(S_Fog, offset_Fog); - hookLibrary(S_Storm, offset_Storm); - } + if (version_Game >= V114a) + hookLibrary(S_Game, offset_Game); + else + { + hookLibrary(S_D2Client, offset_D2Client); + // hookLibrary(S_D2CMP, offset_D2CMP); + hookLibrary(S_D2Common, offset_D2Common); + hookLibrary(S_D2Game, offset_D2Game); + hookLibrary(S_D2gfx, offset_D2gfx); + hookLibrary(S_D2Lang, offset_D2Lang); + hookLibrary(S_D2Launch, offset_D2Launch); + // hookLibrary(S_D2Net, offset_D2Net); + // hookLibrary(S_D2Win, offset_D2Win); + hookLibrary(S_Fog, offset_Fog); + hookLibrary(S_Storm, offset_Storm); + } log_msg("\n\n"); } @@ -198,21 +200,22 @@ void unhookLibraries() { log_msg("***** Reprotect Libraries *****\n"); - if (version_Game == V114d) { - unhookLibrary(S_Game, offset_Game); - } else { - unhookLibrary(S_D2Client, offset_D2Client); - // unhookLibrary(S_D2CMP, offset_D2CMP); - unhookLibrary(S_D2Common, offset_D2Common); - unhookLibrary(S_D2Game, offset_D2Game); - unhookLibrary(S_D2gfx, offset_D2gfx); - unhookLibrary(S_D2Lang, offset_D2Lang); - unhookLibrary(S_D2Launch, offset_D2Launch); - // unhookLibrary(S_D2Net, offset_D2Net); - // unhookLibrary(S_D2Win, offset_D2Win); - unhookLibrary(S_Fog, offset_Fog); - unhookLibrary(S_Storm, offset_Storm); - } + if (version_Game >= V114a) + unhookLibrary(S_Game, offset_Game); + else + { + unhookLibrary(S_D2Client, offset_D2Client); + // unhookLibrary(S_D2CMP, offset_D2CMP); + unhookLibrary(S_D2Common, offset_D2Common); + unhookLibrary(S_D2Game, offset_D2Game); + unhookLibrary(S_D2gfx, offset_D2gfx); + unhookLibrary(S_D2Lang, offset_D2Lang); + unhookLibrary(S_D2Launch, offset_D2Launch); + // unhookLibrary(S_D2Net, offset_D2Net); + // unhookLibrary(S_D2Win, offset_D2Win); + unhookLibrary(S_Fog, offset_Fog); + unhookLibrary(S_Storm, offset_Storm); + } log_msg("\n\n"); } @@ -231,14 +234,7 @@ void freeCustomLibraries() dll->release(); freeLibrary(dll->offset); nextDll = dll->nextDll; - if (version_D2Game == V114d) - { - delete dll; - } - else - { - D2FogMemDeAlloc(dll, __FILE__, __LINE__, 0); - } + delete(dll); dll = nextDll; } } @@ -270,15 +266,15 @@ void loadCustomLibraries() log_msg("No custom libraries to load.\n"); else { - log_msg("Load custom libraries :\n"); while (curString) { if (curString[0]) { + log_msg("Load custom library : %s\n", curString); offset_currentDll = (DWORD)LoadLibrary(curString); if (!offset_currentDll) { - log_msg("Load library %s failed:\n", curString); + log_msg("Load library %s failed !\n", curString); exit(0); } nextDll = customDlls; @@ -289,8 +285,8 @@ void loadCustomLibraries() curString=strtok(NULL,"|"); } } - if (dllFilenames) - D2FogMemDeAlloc(dllFilenames, __FILE__, __LINE__, 0); + if(dllFilenames) + D2FogMemDeAlloc(dllFilenames,__FILE__,__LINE__,0); log_msg("\n\n"); } @@ -339,7 +335,7 @@ void initD2modules() if (version_Game >= V114a) { -// offset_Bnclient = offset_Game; version_Bnclient = version_Game; +// offset_Bnclient = offset_Game; version_Bnclient = version_Game; offset_D2Client = offset_Game; version_D2Client = version_Game; offset_D2CMP = offset_Game; version_D2CMP = version_Game; offset_D2Common = offset_Game; version_D2Common = version_Game; @@ -376,13 +372,13 @@ void initD2modules() GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045); //0x20000 0x6FA10000 Already Loaded 0x1E000 // GET_VERSION(D2MCPClient 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x6000 0x6F9F0000 Already Loaded - // GET_VERSION(D2Multi 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x1000 0x6F9A0000 ? - GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded - + GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded - // GET_VERSION(D2sound 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xC000 0x6F980000 Already Loaded 0xD000 GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8); //0x19000 0x6F8A0000 Already Loaded 0x1C000 GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95); //0x20000 0x6FF50000 Already Loaded 0x1F000 GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404); //0x30000 0x6FFB0000 Already Loaded - if (version_Game == UNKNOWN) - version_Game = version_D2gfx; + version_Game = version_D2gfx; } // GET_VERSION(binkw32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); // // GET_VERSION(ijl11 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x24000 0x60000000 Already Loaded - @@ -395,10 +391,12 @@ void initD2modules() extern "C" __declspec(dllexport) bool __stdcall Release() { - log_msg("\n***** ENDING DIABLO II *****\n\n" ); + log_msg("\n***** FREE LIBRARIES *****\n\n" ); freeCustomLibraries(); freeD2Libraries(); + log_msg("***** END DIABLO II *****\n" ); + log_close(); return true; } @@ -412,7 +410,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) initD2modules(); - if (version_Game < V109 || version_Game > V114d) + if (version_Game < V109 || version_Game > V113d && version_Game != V114d) { log_box("PlugY isn't compatible with this version : %s", GetVersionString(version_Game)); Release(); @@ -431,6 +429,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) log_msg("***** INSTALL FUNCTIONS *****\n"); + Install_PlugYFiles(); Install_VariableOnRealm(); if (active_Commands) @@ -456,6 +455,9 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) if (active_changingSavePath) Install_ChangingSavePath(); + if (active_AutoBackup) + Install_SavePlayerData(); + if (active_StatsShiftClickLimit) Install_StatsLimitShiftClick(); @@ -507,8 +509,14 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) if (active_EnabledCowPortalWhenCowKingWasKill) Install_EnabledCowPortalWhenCowKingWasKill(); - if (active_DoNotCloseNihlathakPortal) - Install_DoNotCloseNihlathakPortal(); + if (active_DoNotCloseNihlathakPortal) + Install_DoNotCloseNihlathakPortal(); + + if (active_MoveCainNearHarrogathWaypoint) + Install_MoveCainNearHarrogathWaypoint(); + + if (active_RemoveExperienceDiminushingReturn) + Install_RemoveExperienceDiminushingReturn(); log_msg("\nDLL patched sucessfully.\n\n\n"); @@ -516,11 +524,13 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) initCustomLibraries(); - loadLocalizedStrings(D2GetLang()); + //loadLocalizedStrings(D2GetLang()); log_msg("***** ENTERING DIABLO II *****\n\n" ); - active_logFile = active_logFile - 1; + active_logFile--; + if (active_logFile < 1) + log_close(); return NULL; } diff --git a/PlugY/Error.cpp b/PlugY/Error.cpp index 163c93f..f0796f7 100644 --- a/PlugY/Error.cpp +++ b/PlugY/Error.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Error Logger implementation. + Error Logger implementation. =================================================================*/ @@ -13,29 +13,28 @@ #include // strlen() strcat() #include // _getcwd() -DWORD active_logFile = 1; +int active_logFile = 1; static char log_file[MAX_PATH] = ""; static bool log_init = false; - +static FILE* fLogFile = NULL; void log_initfile() { if (log_init) return; - + _getcwd( log_file, MAX_PATH ); if( log_file[strlen(log_file)] != '\\') strcat(log_file, "\\"); strcat(log_file, "PlugY.log"); - - FILE* lLog = fopen( log_file, "w" ); - - if( lLog != NULL ) - { - fclose(lLog); - log_init = true; - } - + + fLogFile = fopen( log_file, "w" ); + + if( fLogFile == NULL ) + return; + + log_init = true; + log_msg("<----------------------------------------------->\n" "\n" "\t\tA Plugin by Yohann\n" @@ -46,6 +45,15 @@ void log_initfile() ,PLUGY_VERSION); } +void log_close() +{ + if (fLogFile) + { + fclose(fLogFile); + fLogFile = NULL; + } +} + void log_box( const char* pFormat, ... ) { char buffer[300]; @@ -61,7 +69,8 @@ void log_box( const char* pFormat, ... ) void log_msg( const char* pFormat, ... ) { - if (!active_logFile) return; + if (!active_logFile) + return; if( !log_init ) log_initfile(); @@ -71,13 +80,14 @@ void log_msg( const char* pFormat, ... ) va_list lArgs; va_start( lArgs, pFormat ); - FILE *lDebug = fopen( log_file, "a" ); + if ( fLogFile == NULL ) + fLogFile = fopen( log_file, "a" ); - if( lDebug != NULL ) + if( fLogFile != NULL ) { - vfprintf( lDebug, pFormat, lArgs ); - fclose( lDebug ); - } + vfprintf( fLogFile, pFormat, lArgs ); + fflush(fLogFile); + } else log_init = false; diff --git a/PlugY/ExtendedSaveFile.cpp b/PlugY/ExtendedSaveFile.cpp index b0bdfa2..1aad7a4 100644 --- a/PlugY/ExtendedSaveFile.cpp +++ b/PlugY/ExtendedSaveFile.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file for each characters. + Add an extra save file for each characters. =================================================================*/ @@ -17,7 +17,7 @@ #define FILE_EXTENDED 0x4D545343 //"CSTM" -BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS +BYTE * readExtendedSaveFile(char* name, DWORD* size) { char filename[512]; BYTE* data; @@ -45,7 +45,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS *size = 14; *((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM" *((WORD *)&data[4]) = FILE_VERSION; - *((DWORD*)&data[6]) = nbPlayersCommandByDefault - 1; + *((DWORD*)&data[6]) = (BYTE)(nbPlayersCommandByDefault == 0 ? 0 : nbPlayersCommandByDefault - 1); *((DWORD*)&data[10]) = 0;// number of stash TCustomDll* currentDll = customDlls; @@ -59,7 +59,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS } -int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS +int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize) { if (!ptChar || !PCPY || !data) return 0; @@ -99,7 +99,6 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS } - void writeExtendedSaveFile(char* name, BYTE* data, DWORD size) { char szTempName[MAX_PATH]; @@ -122,28 +121,12 @@ void writeExtendedSaveFile(char* name, BYTE* data, DWORD size) strcat(szSaveName, ".d2x"); log_msg("Extended file for saving : %s\n",szSaveName); -// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) +// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) DeleteFile(szSaveName); if (!MoveFile(szTempName, szSaveName)) log_box("Could not create the extended save file."); } -void backupExtendedSaveFile(char* name) -{ - char szBackupName[MAX_PATH]; - char szSaveName[MAX_PATH]; - - D2FogGetSavePath(szSaveName, MAX_PATH); - strcat(szSaveName, name); - strcat(szSaveName, ".d2x"); - - D2FogGetSavePath(szBackupName, MAX_PATH); - strcat(szBackupName, name); - strcat(szBackupName, ".d2x.backup"); - - CopyFile(szSaveName, szBackupName, true); -} - void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize) { @@ -151,7 +134,7 @@ void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curS *curSize += 4; *(WORD *)(*data + *curSize) = FILE_VERSION; *curSize += 2; - *(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand - 1); + *(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand == 0 ? 0 : nbPlayersCommand - 1); *curSize += 4; saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize); diff --git a/PlugY/ExtraOptions.cpp b/PlugY/ExtraOptions.cpp index df2d4ee..551e592 100644 --- a/PlugY/ExtraOptions.cpp +++ b/PlugY/ExtraOptions.cpp @@ -1,27 +1,29 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d and DoNotCloseNihlathakPortal by haxifix. More little options. =================================================================*/ #include "common.h" -#include "skillsPoints.h" +#include "infinityStash.h" #include -int active_DisplayItemLevel = false; +bool active_DisplayItemLevel = false; DWORD nbPlayersCommandByDefault = 0; DWORD nbPlayersCommand = 0; -int active_alwaysRegenMapInSP = false; -int active_RunLODs = false; -int active_AlwaysDisplayLifeMana = false; -int active_EnabledTXTFilesWithMSExcel = false; -int active_DisplayBaseStatsValue = false; -int active_LadderRunewords = false; -int active_EnabledCowPortalWhenCowKingWasKill = false; -int active_DoNotCloseNihlathakPortal = false; +bool active_alwaysRegenMapInSP = false; +bool active_RunLODs = false; +int active_AlwaysDisplayLifeMana = 0; +bool active_EnabledTXTFilesWithMSExcel = false; +bool active_DisplayBaseStatsValue = false; +bool active_LadderRunewords = false; +bool active_EnabledCowPortalWhenCowKingWasKill = false; +bool active_DoNotCloseNihlathakPortal = false; +bool active_MoveCainNearHarrogathWaypoint = false; +bool active_RemoveExperienceDiminushingReturn = false; /****************************************************************************************************/ @@ -29,25 +31,23 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem) { if (onRealm && (selectModParam==MOD_NO)) return; WCHAR text[0x50]; - _snwprintf(text, sizeof(text), L"%s: %u\n", getLocalString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem)); + _snwprintf(text, 50, L"%s: %u\n", getLocalString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem)); D2SetColorPopup(text,WHITE); wcscat(popup,text); } -FCT_ASM( caller_displayItemlevel_114 ) - PUSH ECX - PUSH EAX - PUSH EDI - PUSH ECX - LEA EAX, DWORD PTR SS : [EBP - 0x2434] - PUSH EAX - CALL displayItemlevel - POP EDI - POP EAX - POP ECX - POP EDX - PUSH 0x100 - JMP EDX +FCT_ASM ( caller_displayItemlevel_114 ) + PUSH ECX + PUSH EAX + PUSH ECX + LEA EAX,DWORD PTR SS:[EBP-0x2434] + PUSH EAX + CALL displayItemlevel + POP EAX + POP ECX + POP EDX + PUSH 0x100 + JMP EDX }} FCT_ASM ( caller_displayItemlevel_113 ) @@ -78,22 +78,19 @@ FCT_ASM ( caller_displayItemlevel_111 ) JMP EAX }} -FCT_ASM( caller_displayItemlevelSet_114 ) - PUSH ECX - PUSH EAX - PUSH EDI - PUSH ECX - LEA EAX, DWORD PTR SS : [EBP - 0x2138] - PUSH EAX - CALL displayItemlevel - POP EDI - POP EAX - POP ECX - POP EDX - PUSH 0x100 - JMP EDX +FCT_ASM ( caller_displayItemlevelSet_114 ) + PUSH ECX + PUSH EDX + PUSH ECX + LEA EAX,DWORD PTR SS:[EBP-0x2138] + PUSH EAX + CALL displayItemlevel + POP EDX + POP ECX + POP EAX + PUSH 0x100 + JMP EAX }} - FCT_ASM ( caller_displayItemlevelSet_111 ) PUSH ECX PUSH EDX @@ -176,24 +173,26 @@ void Install_DisplayItemLevel() // print the text in the final buffer mem_seek R8(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590, 8E983); memt_byte( 0x68 , 0xE8); - MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevel_114 : version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); + MEMT_REF4( 0x100, version_D2Client >= V114d ? caller_displayItemlevel_114 : version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); //6FAE38A1 . 68 00010000 PUSH 100 //6FB5DD0A |. 68 00010000 PUSH 100 - //6FB289DA |. 68 00010000 PUSH 100 + //6FB289DA |. 68 00010000 PUSH 100 //6FB5E0AA |. 68 00010000 PUSH 100 //6FB441C0 |. 68 00010000 PUSH 100 //6FB48590 |. 68 00010000 PUSH 100 + //0048E983 |. 68 00010000 PUSH 100 ; /Arg1 = 00000100 // print the text in the final buffer (for set items) mem_seek R8(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3, 8D774); memt_byte( 0x68 , 0xE8); - MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevelSet_114 : version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9); + MEMT_REF4( 0x100, version_D2Client >= V114d ? caller_displayItemlevelSet_114 : version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9); //6FAE27BE . 68 00010000 PUSH 100 //6FB5C773 |. 68 00010000 PUSH 100 //6FB27773 |. 68 00010000 PUSH 100 //6FB5CEB3 |. 68 00010000 PUSH 100 //6FB42FE3 |. 68 00010000 PUSH 100 //6FB473B3 |. 68 00010000 PUSH 100 + //0048D774 |. 68 00010000 PUSH 100 ; /Arg1 = 00000100 log_msg("\n"); @@ -206,6 +205,9 @@ char* msgNBPlayersString = "players %u"; DWORD* infoEnabledSendPlayersCommand; void SendPlayersCommand() { + if (!needToInit || onRealm) return; + needToInit = false; + #pragma pack(1) struct { BYTE displayType;//0x15 main msg; 0x14: char popup @@ -213,14 +215,20 @@ void SendPlayersCommand() BYTE zero; char string[0xFF]; char null; + char targetName[0x10]; + char null2; } data; #pragma pack() - if (!needToInit || onRealm) return; - needToInit=0; - DWORD info = *infoEnabledSendPlayersCommand; if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return; + + if (!active_multiPageStash) + nbPlayersCommand = nbPlayersCommandByDefault; + + //if (nbPlayersCommand < 2) + // return; + log_msg("SendPlayersCommand %u\n", nbPlayersCommand); D2SetNbPlayers(nbPlayersCommand); @@ -229,14 +237,21 @@ void SendPlayersCommand() data.displayType=0x15; data.un=1; data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10 - data.null=NULL; sprintf(data.string, msgNBPlayersString, nbPlayersCommand); + data.null=NULL; D2SendMsgToAll((BYTE*)&data); } +//FCT_ASM ( caller_SendPlayersCommand_old ) +// CALL SendPlayersCommand +// JMP D2GetResolution +//}} + FCT_ASM ( caller_SendPlayersCommand ) + PUSH ECX CALL SendPlayersCommand - JMP D2GetResolution + POP ECX + JMP D2PrintInterface }} void Install_SendPlayersCommand() @@ -247,17 +262,12 @@ void Install_SendPlayersCommand() log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n"); infoEnabledSendPlayersCommand = (DWORD*)R8(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC, 3A0610); - if ( version_D2Client >= V110 ) + if ( version_D2Client >= V110 ) msgNBPlayersString = (char*)R8(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C, 2D7374); // Set nb Player to default - mem_seek R8(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2, 56EF9);//6FB1C7B7-6FAA0000 - if (version_D2Client == V114d) { - MEMT_REF4(0x0009E263, caller_SendPlayersCommand); - } - else { - MEMJ_REF4(D2GetResolution, caller_SendPlayersCommand); - } +// mem_seek R8(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2, 56EF9);//6FB1C7B7-6FAA0000 +// MEMJ_REF4( D2GetResolution, caller_SendPlayersCommand_old); //6FB2723A |. E8 7D8E0300 CALL //6FB265BA |. E8 7D8E0300 CALL //6FB21B8A . E8 4F9C0400 CALL @@ -266,6 +276,20 @@ void Install_SendPlayersCommand() //6FB40161 |. E8 1ECFF7FF CALL //6FB739F1 |. E8 B896F4FF CALL //6FACD3F1 |. E8 EAFBFEFF CALL + //00456EF8 |. E8 63E20900 CALL Game.004F5160 + + // Set nb Player to default + mem_seek R8(D2Client, 90BA, 90AA, 97DA, 88E4C, 32C8C, 7CB5C, 4437C, 453CC, 4CB04);//6FB1C7B7-6FAA0000 + MEMC_REF4( D2PrintInterface, caller_SendPlayersCommand); + //6FAA90B9 . E8 62E10700 CALL D2Client.6FB27220 + //6FAA90A9 . E8 F2D40700 CALL D2Client.6FB265A0 + //6FAA97D9 . E8 92830700 CALL D2Client.6FB21B70 + //6FB38E4B . E8 A0A70100 CALL D2Client.6FB535F0 + //6FAE2C8B . E8 603D0300 CALL D2Client.6FB169F0 + //6FB2CB5B . E8 F0350100 CALL D2Client.6FB40150 + //6FAF437B . E8 60F60700 CALL D2Client.6FB739E0 + //6FAF53CB . E8 1080FDFF CALL D2Client.6FACD3E0 + //0044CB03 |. E8 D8A30000 CALL Game.00456EE0 log_msg("\n"); @@ -279,18 +303,19 @@ void Install_AlwaysRegenMapInSP() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n"); // Always regenerate maps in Single player mem_seek R8(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E, 16A20F); memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368 //6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93 - //01FE235D |. 74 09 JE SHORT D2Game.01FE2368 + //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 + //0056A20F |. 74 09 JE SHORT Game.0056A21A log_msg("\n"); @@ -313,6 +338,7 @@ void Install_RunLODs() //6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996 //6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606 //6FA8B6B0 |. 74 45 JE SHORT D2gfx.6FA8B6F7 + //004F562B |. 74 45 JE SHORT Game.004F5672 log_msg("\n"); @@ -321,16 +347,19 @@ void Install_RunLODs() /****************************************************************************************************/ -FCT_ASM(caller_AlwaysDisplayLife_114) - CMP onRealm, 0 - JNZ normalDisplayLife - CMP active_AlwaysDisplayLifeMana, 0 - JE normalDisplayLife - CMP EAX, 0x1 - RETN -normalDisplayLife : - CMP DWORD PTR DS : [0x7BEFDC], EAX - RETN +FCT_ASM (caller_AlwaysDisplayLife_114) + JNZ displayLife + CMP onRealm,0 + JNZ normalDisplayLife + CMP active_AlwaysDisplayLifeMana,0 + JE normalDisplayLife +displayLife: + POP EAX + ADD EAX,0x24 + JMP EAX +normalDisplayLife: + LEA EAX,DWORD PTR DS:[ESI-0x1E] + RETN }} FCT_ASM (caller_AlwaysDisplayLife_113) @@ -377,17 +406,18 @@ normalDisplayLife: RETN }} -FCT_ASM( caller_AlwaysDisplayMana_114 ) - CMP onRealm, 0 - JNZ normalDisplayMana - CMP active_AlwaysDisplayLifeMana, 0 - JE normalDisplayMana - POP EAX - ADD EAX, 0x32 - JMP EAX -normalDisplayMana : - CMP DWORD PTR DS : [0x7BEFE0], 0 - RETN +FCT_ASM (caller_AlwaysDisplayMana_114) + CMP onRealm,0 + JNZ normalDisplayMana + CMP active_AlwaysDisplayLifeMana,0 + JE normalDisplayMana + POP EAX + ADD EAX,0x23 + JMP EAX +normalDisplayMana: + LEA EDI,DWORD PTR DS:[ECX-0x6F] + CMP ESI,EDI + RETN }} FCT_ASM (caller_AlwaysDisplayMana_113) @@ -448,16 +478,13 @@ void Install_AlwaysDisplayLifeMana() if (isInstalled) return; log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n"); - if (version_D2Client == V114d) { - mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 98146); - memt_byte(0x39, 0xE8); - MEMT_REF4(0x7BEFDC05, caller_AlwaysDisplayLife_114); - memt_byte(0x00, 0x90); - } else if ( version_D2Client >= V113c ) { - mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 6D6FA); - memt_byte( 0x0F , 0x90); - memt_byte( 0x8C , 0xE8); - MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113); + + if ( version_D2Client >= V113c ) + { + mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 98183); + if (version_D2Client < V114d) memt_byte( 0x0F , 0x90); + memt_byte( version_D2Client >= V114d ? 0x75 : 0x8C , 0xE8); + MEMT_REF4( version_D2Client >= V114d ? 0xE2468D27 : 0x000000BC, version_D2Client >= V114d ? caller_AlwaysDisplayLife_114 : caller_AlwaysDisplayLife_113); //6FAD764A |. 0F8C BC000000 JL D2Client.6FAD770C //6FAD7650 |. 83FA 6E CMP EDX,6E //6FAD7653 |. 0F8F B3000000 JG D2Client.6FAD770C @@ -465,6 +492,9 @@ void Install_AlwaysDisplayLifeMana() //6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711 //6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1 + //6FB1D6FA |. 0F8C BC000000 JL D2Client.6FB1D7BC + //00498183 |. 75 27 JNZ SHORT Game.004981AC + //00498185 |. 8D46 E2 LEA EAX,DWORD PTR DS:[ESI-1E] } else { // Always display life. mem_seek R8(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000, 0000); @@ -475,21 +505,17 @@ void Install_AlwaysDisplayLifeMana() //6FB31733 |. A1 E4C6B86F MOV EAX,DWORD PTR DS:[6FB8C6E4] } + // Always display mana. - if (version_D2Client == V114d) { - mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 9824E); - memt_byte(0x83, 0xE8); - MEMT_REF4(0x7BEFE03D, caller_AlwaysDisplayMana_114); - memt_byte(0x00, 0x90); - memt_byte(0x00, 0x90); - } else if ( version_D2Client >= V113c ) { + 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 R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 00000); - memt_byte( 0xA1 , 0xE8); - MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113); + mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 9825D); + memt_byte( version_D2Client >= V114d ? 0x8D : 0xA1 , 0xE8); + MEMT_REF4( version_D2Client >= V114d ? 0xF73B9179 : (DWORD)ptResolutionY , version_D2Client >= V114d ? caller_AlwaysDisplayMana_114 : caller_AlwaysDisplayMana_113); //6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] //6FAD7711 |> 8B0D B4C4BC6F MOV ECX,DWORD PTR DS:[6FBCC4B4] @@ -502,6 +528,8 @@ void Install_AlwaysDisplayLifeMana() //6FAD77CB |. 81C4 28030000 ADD ESP,328 //6FAD77D1 \. C3 RETN //6FB1D7BC |> A1 3870BA6F MOV EAX,DWORD PTR DS:[6FB8BC4C] + //0049825D |. 8D79 91 LEA EDI,DWORD PTR DS:[ECX-6F] + //00498260 |. 3BF7 CMP ESI,EDI } else if ( version_D2Client >= V110 ) { @@ -553,8 +581,8 @@ void Install_EnabledTXTFilesWithMSExcel() log_msg("Patch D2Client for enabled the opening of files already opened by MS Excel. (EnabledTXTFilesWithMSExcel)\n"); - mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm == V114d ? 0xB4 : version_Storm >= V111 ? 0x12A : 0xFF) ); - memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE + mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm >= V114d ? 0xB4 : version_Storm >= V111 ? 0x12A : 0xFF) ); + memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE //6FC1C969 |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ log_msg("\n"); @@ -588,7 +616,7 @@ void STDCALL printDisplayBaseStatsValue(WORD statID, sDrawImageInfo* data, DWORD if (isOnRect(D2GetMouseX(),D2GetMouseY(),x+5,y+5,32,32)) { WCHAR text[100]; - _snwprintf(text, sizeof(text), getLocalString(STR_STATS_BASE_MIN), statValue, minValue); + _snwprintf(text, 100, getLocalString(STR_STATS_BASE_MIN), statValue, minValue); D2SetFont(1); D2PrintPopup(text, x+18, y-32, WHITE, 1); } @@ -613,31 +641,30 @@ void Install_DisplayBaseStatsValue() if (isInstalled) return; log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n"); - if (version_D2Client == V114d) goto jump; + // Always print stat button images. - mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, BF955); + mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, A7FFB); memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 - memt_byte( 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 13) ); - memt_byte( 0x24, 0x90 ); // NOP - memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + memt_byte( version_D2Client == V114d ? 0x4D : 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 12) ); + memt_byte( version_D2Client == V114d ? 0xF8 : 0x24, 0x90 ); // NOP + if (version_D2Client < V114d) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 53), 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] - jump: + //004A7FFB > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] + //004A7FFE . 53 PUSH EBX ; /Arg3 + mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C); - if (version_D2Client == V114d) { - MEMT_REF4(0x0004E3F0, caller_displayBaseStatsValue); - } else { - MEMJ_REF4(D2PrintImage, caller_displayBaseStatsValue); - } + 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 + //004A808B . E8 F0E30400 CALL Game.004F6480 ; \Game.004F6480 log_msg("\n"); @@ -650,9 +677,8 @@ void Install_DisplayBaseStatsValue() RunesBIN* STDCALL compileRunesTxt(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) { RunesBIN* ptRunesBin = (RunesBIN*)D2CompileTxtFile(unused, filename, ptFields, ptRecordCount, recordLength); - for (DWORD i = 0; i < *ptRecordCount; i++) { - ptRunesBin[i].Server = 0; - } + for (DWORD i=0; i < *ptRecordCount; i++) + ptRunesBin[i].Server=0; return ptRunesBin; } @@ -667,17 +693,14 @@ void Install_LadderRunewords() log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n"); mem_seek R8(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782, 239C40); - if (version_D2Common == V114d) { - MEMT_REF4(0xFFFD86AC, compileRunesTxt); - } else { - MEMC_REF4(D2CompileTxtFile, compileRunesTxt); - } + 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 + //00639C3F |. E8 AC86FDFF CALL Game.006122F0 ; \Game.006122F0 log_msg("\n"); @@ -705,6 +728,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill() //6FC95C68 |. 85C0 TEST EAX,EAX //6FC87508 |. 85C0 TEST EAX,EAX //6FC2EBE8 |. 85C0 TEST EAX,EAX + //00594179 |. 85C0 TEST EAX,EAX log_msg("\n"); @@ -715,19 +739,226 @@ void Install_EnabledCowPortalWhenCowKingWasKill() void Install_DoNotCloseNihlathakPortal() { - static int isInstalled = false; - if (version_D2Game < V114d || isInstalled) return; + static int isInstalled = false; + if (isInstalled) return; - log_msg("Patch D2Game to not close Nihlathak's portal. (DoNotCloseNihlathakPortal)\n"); + log_msg("Patch D2Game to not close Nihlathak's portal. (DoNotCloseNihlathakPortal)\n"); - mem_seek R8(D2Game, 0, 0, 0, 0, 0, 0, 0, 0, 18B9D7); - memt_byte(0x0F, 0x90); - memt_byte(0x85, 0x90); - memt_dword(0x000000C5, 0x90909090); + mem_seek R8(D2Game, 76B19, 77019, 86679 , 107C7, 51987, 26B67, 5AE67, 1FF27, 18B9D7); + memt_byte(0x0F, 0x90); + memt_byte(0x85, 0x90); + memt_dword( version_D2Game >= V114d ? 0x000000C5 : version_D2Game >= V111 ? 0x000000BF : 0x000000C1, 0x90909090); + //6FCA6B19 . 0F85 C1000000 JNZ D2Game.6FCA6BE0 + //6FCA7019 . 0F85 C1000000 JNZ D2Game.6FCA70E0 + //6FCB6679 . 0F85 C1000000 JNZ D2Game.6FCB6740 + //6FC307C7 . 0F85 BF000000 JNZ D2Game.6FC3088C + //6FC71987 . 0F85 BF000000 JNZ D2Game.6FC71A4C + //6FC46B67 . 0F85 BF000000 JNZ D2Game.6FC46C2C + //6FC7AE67 . 0F85 BF000000 JNZ D2Game.6FC7AF2C + //6FC3FF27 . 0F85 BF000000 JNZ D2Game.6FC3FFEC + //0058B9D7 |. 0F85 C5000000 JNZ Game.0058BAA2 - log_msg("\n"); + log_msg("\n"); - isInstalled = true; + isInstalled = true; +} + +/****************************************************************************************************/ +/* townWest.ds1: + 129A6 : 4D->76 + 129AA : 56->3A + 12ACA : 05->04 + +4 : 4D->76 + +4 : 56->3A + +4 : 4E->76 + +4 : 58->3A + +4 : 01->01 + +4 : 4C->7B + +4 : 57->50 + +4 : 02->02 + +4 : 4D->7B + +4 : 5D->41 + +4 : 01->01 + +4 : 49->7D + +4 : 5C->3E + +4 : 02->02 + +4 : 4F-> + +4 : 5B-> + +4 : 02-> +*/ + +/*char* FASTCALL usePlugYTownWest(char* filename) +{ + if (onRealm) + return filename; + + if (!strcmp(filename, "DATA\\GLOBAL\\TILES\\Expansion\\Town\\townWest.ds1")) + return "PlugY\\townWest.ds1"; + + return filename; +} + +FCT_ASM ( caller_usePlugYTownWest ) + LEA EAX,DWORD PTR SS:[EBP-0x40] + MOV ECX,EAX + CALL usePlugYTownWest + MOV ECX,EAX + RETN +}} + +FCT_ASM ( caller_usePlugYTownWest_113d ) + LEA EAX,DWORD PTR SS:[ESP+0x14] + MOV ECX,EAX + CALL usePlugYTownWest + MOV EDX,ESI + RETN +}}*/ + +/****************************************************************************************************/ + +void* FASTCALL updateHarrogath(DWORD unused, char* filename, DWORD* size, const char* __CallFile, DWORD __CallLine) +{ + if (onRealm) + return D2ReadFile(unused, filename, size, __CallFile, __CallLine); + + if (strcmp(filename, "DATA\\GLOBAL\\TILES\\Expansion\\Town\\townWest.ds1")) + return D2ReadFile(unused, filename, size, __CallFile, __CallLine); + + DWORD fileSize = 0; + if (size == NULL) + size = &fileSize; + char* data = (char*)D2ReadFile(unused, filename, size, __FILE__, __LINE__); + if (*size > 400 && + *(DWORD*)(data + *size - 0x16C) == 0x0000004D && + *(DWORD*)(data + *size - 0x168) == 0x00000056 && + *(DWORD*)(data + *size - 0x48) == 0x00000005 && + *(DWORD*)(data + *size - 0x44) == 0x0000004D && + *(DWORD*)(data + *size - 0x40) == 0x00000056 && + *(DWORD*)(data + *size - 0x3C) == 0x0000004E && + *(DWORD*)(data + *size - 0x38) == 0x00000058 && + *(DWORD*)(data + *size - 0x34) == 0x00000001 && + *(DWORD*)(data + *size - 0x30) == 0x0000004C && + *(DWORD*)(data + *size - 0x2C) == 0x00000057 && + *(DWORD*)(data + *size - 0x28) == 0x00000002 && + *(DWORD*)(data + *size - 0x24) == 0x0000004D && + *(DWORD*)(data + *size - 0x20) == 0x0000005D && + *(DWORD*)(data + *size - 0x1C) == 0x00000001 && + *(DWORD*)(data + *size - 0x18) == 0x00000049 && + *(DWORD*)(data + *size - 0x14) == 0x0000005C && + *(DWORD*)(data + *size - 0x10) == 0x00000002 && + *(DWORD*)(data + *size - 0x0C) == 0x0000004F && + *(DWORD*)(data + *size - 0x08) == 0x0000005B && + *(DWORD*)(data + *size - 0x04) == 0x00000002) + { + log_msg("update TownWest to Move Cain near Harrogath waypoint\n"); + *(DWORD*)(data + *size - 0x16C) = 0x00000076; + *(DWORD*)(data + *size - 0x168) = 0x0000003A; + *(DWORD*)(data + *size - 0x48) = 0x00000004; + *(DWORD*)(data + *size - 0x44) = 0x00000076; + *(DWORD*)(data + *size - 0x40) = 0x0000003A; + *(DWORD*)(data + *size - 0x3C) = 0x00000076; + *(DWORD*)(data + *size - 0x38) = 0x0000003A; + *(DWORD*)(data + *size - 0x34) = 0x00000001; + *(DWORD*)(data + *size - 0x30) = 0x0000007B; + *(DWORD*)(data + *size - 0x2C) = 0x00000050; + *(DWORD*)(data + *size - 0x28) = 0x00000002; + *(DWORD*)(data + *size - 0x24) = 0x0000007B; + *(DWORD*)(data + *size - 0x20) = 0x00000041; + *(DWORD*)(data + *size - 0x1C) = 0x00000001; + *(DWORD*)(data + *size - 0x18) = 0x0000007D; + *(DWORD*)(data + *size - 0x14) = 0x0000003E; + *(DWORD*)(data + *size - 0x10) = 0x00000002; + *(DWORD*)(data + *size - 0x0C) = 0x00000000; + *(DWORD*)(data + *size - 0x08) = 0x00000000; + *(DWORD*)(data + *size - 0x04) = 0x00000000; + } + else + log_msg("ERROR : Failed to update TownWest to Move Cain near Harrogath waypoint\n"); + return data; +} + +FCT_ASM ( caller_updateHarrogath ) + MOV ECX,DWORD PTR SS:[ESP+4] + PUSH 0 + PUSH 0 + PUSH DWORD PTR SS:[ESP+0x10] + MOV EDX,EAX + CALL updateHarrogath + RETN 8 +}} + +void Install_MoveCainNearHarrogathWaypoint() +{ + static int isInstalled = false; + if (isInstalled) return; + + log_msg("Patch D2Common to move Deckard Cain near Waypoint in Harrogath. (MoveCainNearHarrogathWaypoint)\n"); + mem_seek R8(D2Common, 3653E, 3654E, 45A2E , 82233, 39593, 222A3, B573, 54033, 265972); + MEMC_REF4( V2ReadFile, version_D2Common >= V111 && version_D2Common <= V113d? (TD2ReadFile)caller_updateHarrogath : updateHarrogath); + //6FD7653D |. E8 62D30300 CALL D2Common.6FDB38A4 + //6FD7654D |. E8 62D40300 CALL D2Common.6FDB39B4 + //6FD85A2D |. E8 36E80300 CALL D2Common.6FDC4268 + //6FDD2232 . E8 A974F8FF CALL D2Common.6FD596E0 + //6FD89592 . E8 3903FDFF CALL D2Common.6FD598D0 + //6FD722A2 . E8 5976FEFF CALL D2Common.6FD59900 + //6FD5B572 . E8 89E3FFFF CALL D2Common.6FD59900 + //6FDA4032 . E8 A975FBFF CALL D2Common.6FD5B5E0 + //00665971 |. E8 0317EBFF CALL Game.00517079 + + /* + mem_seek R8(D2Common, 0000, 0000, 0000 , 0000, 0000, 734AA, 6C75A, 308FA, 21E4F7); + memt_byte( 0x8D, 0xE8); + MEMT_REF4( version_D2Common >= V114d ? 0xC88BC045 : 0x8B102444, version_D2Common >= V114d ? caller_usePlugYTownWest : caller_usePlugYTownWest_113d); + if (version_D2Common < V114d) memt_byte( 0xD6, 0x90); + //6FDC34AA |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] + //6FDC34AE |. 8BD6 MOV EDX,ESI + //6FDBC75A |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] + //6FDBC75E |. 8BD6 MOV EDX,ESI + //6FD808FA |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] + //6FD808FE |. 8BD6 MOV EDX,ESI + //0061E4F7 |. 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40] + //0061E4FA |. 8BC8 MOV ECX,EAX + */ + log_msg("\n"); + + isInstalled = true; +} + + +ExperienceBIN* STDCALL modifExperienceBin(ExperienceBIN* ptExperienceBIN) +{ + for (int i=71; i<101; i++) + ptExperienceBIN[i].ExpRatio = 1024; + return ptExperienceBIN; +} + +FCT_ASM ( caller_modifExperienceBin ) + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + PUSH DWORD PTR SS:[ESP+0x14] + CALL D2CompileTxtFile + PUSH EAX + CALL modifExperienceBin + RETN 0x14 +}} + +void Install_RemoveExperienceDiminushingReturn() +{ + static int isInstalled = false; + if (isInstalled) return; + + log_msg("Patch D2Common to remove experience diminushing return. (RemoveExperienceDiminushingReturn)\n"); + + // modification of experienceBIN + mem_seek R8(D2Common, 00000, 00000, 00000, 00000, 00000, 00000, 00000, 00000, 213E42); + MEMC_REF4( D2CompileTxtFile, caller_modifExperienceBin); + //00613E41 |. E8 AAE4FFFF CALL Game.006122F0 ; \Game.006122F0 + + log_msg("\n"); + + isInstalled = true; } /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/GlobalVariable.cpp b/PlugY/GlobalVariable.cpp index 0c03f75..e905b4c 100644 --- a/PlugY/GlobalVariable.cpp +++ b/PlugY/GlobalVariable.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Updating server. @@ -9,16 +9,21 @@ #include "bigStash.h" // active_bigStash_tested #include "uberQuest.h" //active_UberQuest + resetQuestState() +#include "infinityStash.h" //active_UberQuest + resetQuestState() #include "common.h" #include -bool onRealm=false; -bool needToInit=false; +bool onRealm = false; +bool needToInit = false; int previouslyOnRealm = -1; -void STDCALL BtnPress() +// mode 0:SinglePlayer - 1:TCPIP - 2:Battlenet +void STDCALL BtnPress(int mode) { - needToInit = 1; + needToInit = true; + + loadLocalizedStrings(D2GetLang()); + // if (active_WorldEvent) // initWorldEventVariables(); if (active_UberQuest) @@ -28,19 +33,20 @@ void STDCALL BtnPress() previouslyOnRealm = onRealm; } -FCT_ASM( caller_BnetBtnPress114 ) - CMP active_DisableBattleNet, 1 - JE disableBattleNet - MOV onRealm, 1 - PUSH EAX - CALL BtnPress - POP EAX - SUB ESP, 0x3FC//400 - JMP DWORD PTR SS : [ESP + 0x3FC] -disableBattleNet : - POP EAX - POP EAX - RETN +FCT_ASM ( caller_BnetBtnPress114 ) + CMP active_DisableBattleNet,1 + JE disableBattleNet + MOV onRealm,1 + PUSH EAX + PUSH 2 + CALL BtnPress + POP EAX + SUB ESP,0x3FC//400 + JMP DWORD PTR SS:[ESP+0x3FC] +disableBattleNet: + POP EAX + POP EAX + RETN }} FCT_ASM ( caller_BnetBtnPress ) @@ -48,6 +54,7 @@ FCT_ASM ( caller_BnetBtnPress ) JE disableBattleNet MOV onRealm,1 PUSH EAX + PUSH 2 CALL BtnPress POP EAX SUB ESP,0x3FC//400 @@ -65,19 +72,18 @@ FCT_ASM ( caller_MultiPlayerBtnPress ) }} */ -FCT_ASM( caller_TCPIPBtnPress114 ) - MOV onRealm, 0 - PUSH EAX - PUSH EDX - CALL BtnPress - POP EDX - POP EAX - MOV ECX, 0x006D39BC - RETN +FCT_ASM ( caller_TCPIPBtnPress114 ) + MOV onRealm,0 + PUSH 1 + CALL BtnPress + MOV ECX,DWORD PTR SS:[ESP] + ADD ECX,0xB9B0 + JMP ECX }} FCT_ASM ( caller_TCPIPBtnPress111 ) MOV onRealm,0 + PUSH 1 CALL BtnPress MOV ESI,0x40 RETN @@ -85,6 +91,7 @@ FCT_ASM ( caller_TCPIPBtnPress111 ) FCT_ASM ( caller_TCPIPBtnPress ) MOV onRealm,0 + PUSH 1 CALL BtnPress MOV EBP,1 RETN @@ -92,6 +99,7 @@ FCT_ASM ( caller_TCPIPBtnPress ) FCT_ASM ( caller_SinglePlayerBtnPress ) MOV onRealm,0 + PUSH 0 CALL BtnPress MOV EDX,0x400 RETN @@ -131,6 +139,7 @@ void Install_VariableOnRealm() MEMT_REF4( 0x000400EC, version_D2Launch == V114d ? caller_BnetBtnPress114 : caller_BnetBtnPress); memt_byte( 0x00, 0x90 ); // NOP //6FA529E5 . 81EC 00040000 SUB ESP,400 + //0043533B |. 81EC 00040000 SUB ESP,400 // click on Multiplayer button // mem_seek R7(D2Launch, D5EC, D5CC, EFFC, 0000, 0000, 0000, 0000); @@ -139,15 +148,17 @@ void Install_VariableOnRealm() //6FA1EFFC . B8 01000000 MOV EAX,1 // click on TCP/IP button - mem_seek R8(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E, 2FFFA); - if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110) + mem_seek R8(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E, 2FFEC); + if (version_D2Launch <= V110) { memt_byte( 0xBD, 0xE8 ); // CALL MEMT_REF4( 0x00000001, caller_TCPIPBtnPress); - } else if (version_D2Launch == V114d) { - memt_byte(0xB9, 0xE8); - MEMT_REF4(0x006D39BC, caller_TCPIPBtnPress114); - } else { + } + else if (version_D2Launch >= V114d) + { + MEMT_REF4( 0x0000B9B0, caller_TCPIPBtnPress114); + //0042FFEB . E8 B0B90000 CALL Game.0043B9A0 + } else { memt_byte( 0xBE, 0xE8 ); // CALL MEMT_REF4( 0x00000040, caller_TCPIPBtnPress111); //6FA51329 . BE 40000000 MOV ESI,40 @@ -158,6 +169,7 @@ void Install_VariableOnRealm() memt_byte( 0xBA, 0xE8 ); // CALL MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress); //6FA4B726 . BA 00040000 MOV EDX,400 + //00430BC9 |. BA 00040000 MOV EDX,400 if (version_D2Game == V110) { diff --git a/PlugY/INIfile.cpp b/PlugY/INIfile.cpp index 65f3bb3..c8fa9b6 100644 --- a/PlugY/INIfile.cpp +++ b/PlugY/INIfile.cpp @@ -98,7 +98,7 @@ INIFile::INIFile() m_cache = NULL; m_sectionStart = NULL; m_sectionEnd = NULL; - + ZeroMemory((void *)m_path, sizeof(m_path)); ZeroMemory((void *)m_currentSection, sizeof(m_currentSection)); } @@ -165,7 +165,7 @@ BOOL INIFile::InitReadWrite(const char *path, int readWrite, DWORD writeCacheSiz return TRUE; } } - + // if((m_readWrite == INIFILE_MPQREAD) || (m_readWrite == INIFILE_READ)) if(m_readWrite == INIFILE_READ) { diff --git a/PlugY/InfinityStash.cpp b/PlugY/InfinityStash.cpp index 764fe9b..e72cf5a 100644 --- a/PlugY/InfinityStash.cpp +++ b/PlugY/InfinityStash.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Gestion of the infinity and shared Stash. @@ -13,13 +13,15 @@ #include "common.h" #define STASH_TAG 0x5453 //"ST" -#define JM_TAG 0x4D4A //"JM" +#define JM_TAG 0x4D4A //"JM" DWORD maxSelfPages = -1; DWORD maxSharedPages = -1; DWORD nbPagesPerIndex = 10; DWORD nbPagesPerIndex2 = 100; bool active_multiPageStash = false; +bool autoRenameStashPage = false; +int active_SharedStashInMultiPlayer = 0;//0: disabled, 1:shared in SP, 2: shared in SP & TCP/IP bool active_sharedStash = false; bool separateHardSoftStash = false; bool active_sharedGold=false; @@ -39,14 +41,14 @@ Unit* firstClassicStashItem(Unit* ptChar) return NULL; } -DWORD endStashList(Unit* ptChar, Stash* ptStash)//WORKS +DWORD endStashList(Unit* ptChar, Stash* ptStash) { Stash* stash = ptStash; - + while (stash) { if (stash->ptListItem || ((stash == PCPY->currentStash) && firstClassicStashItem(ptChar))) return 0; - if (stash->isIndex || (stash->name != NULL && stash->name[0])) return 0; + if (stash->name != NULL && stash->name[0]) return 0; stash = stash->nextStash; } return 1; @@ -64,59 +66,61 @@ DWORD endStashList(Unit* ptChar, Stash* ptStash)//WORKS //} -Stash* getLastStash(Stash* ptStash)//WORKS +Stash* getLastStash(Stash* ptStash) { - Stash* stash = ptStash; - - if (!stash) return NULL; - while (stash->nextStash) - stash = stash->nextStash; - - return stash; + if (!ptStash) + return NULL; + while (ptStash->nextStash) + ptStash = ptStash->nextStash; + return ptStash; } Stash* newStash(DWORD id) { d2_assert( id == 0xFFFFFFFF , "Too much stash", __FILE__, __LINE__); - + Stash* stash = (Stash*)malloc(sizeof(Stash));//D2AllocMem(memPool, sizeof(Stash),__FILE__,__LINE__,0); d2_assert(!stash , "Error on stash allocation.", __FILE__, __LINE__); ZeroMemory(stash, sizeof(Stash)); stash->id = id; - + return stash; } -Stash* addStash(Unit* ptChar, bool isShared) +Stash* addStash(Unit* ptChar, bool isShared, bool autoSetIndex, Stash* previous) { - Stash* previous; - Stash* stash; -// DWORD memPool = PCGame ? PCGame->memoryPool :0; - if (isShared) - { - previous = getLastStash(PCPY->sharedStash); - stash = newStash(PCPY->nbSharedPages++); - } else { - previous = getLastStash(PCPY->selfStash); - stash = newStash(PCPY->nbSelfPages++); - } + previous = getLastStash(previous ? previous : isShared ? PCPY->sharedStash : PCPY->selfStash); + if (previous) + isShared = previous->isShared; + Stash* stash = newStash(isShared ? PCPY->nbSharedPages++ : PCPY->nbSelfPages++); stash->isShared = isShared; stash->previousStash = previous; + if (previous) + { previous->nextStash = stash; + stash->isIndex = ((stash->id + 1) % nbPagesPerIndex) == 0; + stash->isMainIndex = ((stash->id + 1) % nbPagesPerIndex2) == 0; + } else if (isShared) + { PCPY->sharedStash = stash; + stash->isIndex = 1; + stash->isMainIndex = 1; + } else + { PCPY->selfStash = stash; - - log_msg("AddStash: stash->id=%d\tstash->isShared=%d\tstash->previous=%08X\tnbSelf=%d\tnbShared=%d\n", - stash->id,stash->isShared,stash->previousStash,PCPY->nbSelfPages,PCPY->nbSharedPages); - + stash->isIndex = 1; + stash->isMainIndex = 1; + } + + log_msg("AddStash: stash->id=%d\tstash->isShared=%d\tnbSelf=%d\tnbShared=%d\n", stash->id, stash->isShared, PCPY->nbSelfPages, PCPY->nbSharedPages); return stash; } -Stash* getStash(Unit* ptChar, DWORD isShared, DWORD id)//WORKS +Stash* getStash(Unit* ptChar, DWORD isShared, DWORD id) { Stash* ptStash = isShared ? PCPY->sharedStash : PCPY->selfStash; @@ -134,11 +138,11 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO { if (!newStash) return 0; - log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, bOnlyItems, bIsClient); - Stash* currentStash = PCPY->currentStash; if (currentStash == newStash) return 0; + log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, bOnlyItems, bIsClient); + d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__); // collect items to remove @@ -153,7 +157,7 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO { D2SetAnim(D2GetRealItem(ptItem),-1); if (ptPrevItem) { - ptPrevItem->CurrentAnim = (DWORD)ptNextItem;//is ptPrevItem->nextNode = ptNextItem; + ptPrevItem->mode = (DWORD)ptNextItem;//is ptPrevItem->nextNode = ptNextItem; } else { ptInventory->currentUsedSocket = (DWORD)ptNextItem;//is ptInventory->ptListItem = ptNextItem; } @@ -167,7 +171,7 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO if (currentStash) { // ptItem = setNextItem(ptItem, PCPY->currentStash->ptListItem); - ptItem->CurrentAnim = (DWORD)currentStash->ptListItem;//is ptItem->nextNode = ptListItem + ptItem->mode = (DWORD)currentStash->ptListItem;//is ptItem->nextNode = ptListItem currentStash->ptListItem = ptItem; }; } else ptPrevItem = ptItem; @@ -195,11 +199,11 @@ int changeToSelectedStash_10(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DW { if (!newStash) return 0; - log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n",newStash->id,newStash->isShared, bOnlyItems,bIsClient); - Stash* currentStash = PCPY->currentStash; if (currentStash == newStash) return 0; + log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n",newStash->id,newStash->isShared, bOnlyItems,bIsClient); + d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__); // Remove items from current page @@ -276,42 +280,79 @@ DWORD loadStash(Unit* ptChar, Stash* ptStash, BYTE data[], DWORD startSize, DWOR // Read inventory. DWORD ret = D2LoadInventory(PCGame, ptChar, (saveBitField*)&data[curSize], 0x60, maxSize-curSize, 0, &nbBytesRead); if (ret) log_msg("loadStash -> D2LoadInventory failed\n"); - log_msg("Stash loaded (%d : %s)\n", ptStash->id ,ptStash->name); + log_msg("Stash loaded (%d : %s)\n", ptStash->id, ptStash->name); *retSize=curSize + nbBytesRead; return ret; } -DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared)//WORKS +void autoSetIndex(Stash* fistStash) +{ + if (!fistStash) + return; + Stash* stash = fistStash; + while (stash) + { + if (stash->isIndex || stash->isMainIndex) + return; + stash = stash->nextStash; + } + stash = fistStash; + stash->isIndex = 1; + stash = stash->nextStash; + while (stash) + { + stash->isIndex = ((stash->id + 1) % nbPagesPerIndex) == 0; + stash->isMainIndex = ((stash->id + 1) % nbPagesPerIndex2) == 0; + stash = stash->nextStash; + } +} + +DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared) { DWORD curStash = 0; - Stash* newStash; + Stash* newStash = NULL; DWORD nbStash = *(DWORD*)&data[*curSize]; *curSize += 4; - log_msg("loadStashList\n\nnbStash = %d\n\n", nbStash); + log_msg("loadStashList nbStash=%d\n", nbStash); while (curStash < nbStash) { - newStash = addStash(ptChar, isShared); + newStash = addStash(ptChar, isShared, false, newStash); changeToSelectedStash(ptChar, newStash, 0, false); DWORD ret = loadStash(ptChar, newStash, data, *curSize, 10000000, curSize); if (ret) return ret; curStash++; } - - if (!isShared && !PCPY->selfStash) + if (nbStash <2) { - newStash = addStash(ptChar, isShared); - PCPY->currentStash = newStash; + newStash = addStash(ptChar, isShared, false, newStash); + changeToSelectedStash(ptChar, newStash, 0, false); } - - if (isShared && !PCPY->sharedStash) + + if (!isShared) { - newStash = addStash(ptChar, isShared); - if (!PCPY->currentStash) + if (PCPY->selfStash) + autoSetIndex(PCPY->selfStash); + else + { + newStash = addStash(ptChar, isShared, true, newStash); PCPY->currentStash = newStash; + } + } + + if (isShared) + { + if (PCPY->sharedStash) + autoSetIndex(PCPY->sharedStash); + else + { + newStash = addStash(ptChar, isShared, true, newStash); + if (!PCPY->currentStash) + PCPY->currentStash = newStash; + } } return 0; @@ -335,7 +376,7 @@ void saveStash(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD* if (ptStash->name) { int size = strlen(ptStash->name); - if (size > 15) size = 15; + if (size > 20) size = 20; strncpy((char*)DATA, ptStash->name, size); *curSize += size; } @@ -396,7 +437,7 @@ void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DW } /////// client -void updateSelectedStashClient(Unit* ptChar)//WORKS +void updateSelectedStashClient(Unit* ptChar) { Stash* newStash = PCPY->currentStash; if (!newStash) @@ -405,13 +446,13 @@ void updateSelectedStashClient(Unit* ptChar)//WORKS updateClient(ptChar, UC_PAGE_NAME, newStash->name); } -void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)//WORKS +void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems) { log_msg("setSelectedStashClient ID:%d, stashFlags:%d, flags:%08X\n", stashId, stashFlags, flags); Unit* ptChar = D2GetClientPlayer(); Stash* newStash = getStash(ptChar, (stashFlags & 1) == 1, stashId); if (!newStash) do - newStash = addStash(ptChar, (stashFlags & 1) == 1); + newStash = addStash(ptChar, (stashFlags & 1) == 1, true, newStash); while (newStash->id < stashId); newStash->flags = stashFlags; changeToSelectedStash(ptChar, newStash, bOnlyItems, 1); @@ -419,10 +460,13 @@ void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool b } -void selectStash(Unit* ptChar, Stash* newStash) +void selectStash(Unit* ptChar, Stash* newStash, bool forceUpdate) { if (!newStash) return; + if (!forceUpdate && newStash == PCPY->currentStash) + return; + log_msg("selectStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, 0, 0); changeToSelectedStash(ptChar, newStash, 0, 0); updateSelectedStashClient(ptChar); } @@ -452,6 +496,7 @@ void toggleToSharedStash(Unit* ptChar) void swapStash(Unit* ptChar, Stash* curStash, Stash* swpStash) { + log_msg("swapStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", swpStash->id, swpStash->isShared, 1, 0); if (!ptChar || !curStash || !swpStash || curStash == swpStash) return; changeToSelectedStash(ptChar, swpStash, 1, 0); @@ -468,13 +513,16 @@ void toggleStash(Unit* ptChar, DWORD page) void swapStash(Unit* ptChar, DWORD page, bool toggle) { - log_msg("swap stash page = %u\n", page); + log_msg("swap stash page = %u, toggle=%u\n", page, toggle); Stash* curStash = PCPY->currentStash; Stash* swpStash = curStash->isShared == toggle ? PCPY->selfStash : PCPY->sharedStash; + if (!swpStash) + swpStash = addStash(ptChar, !curStash->isShared, true, swpStash); for (DWORD i = 0; i < page; i++) { - if (curStash->nextStash == NULL) - addStash(ptChar, swpStash->isShared); + log_msg("swap stash : %i\n", i); + if (swpStash->nextStash == NULL) + addStash(ptChar, swpStash->isShared, true, swpStash); swpStash = swpStash->nextStash; } swapStash(ptChar, curStash, swpStash); @@ -483,8 +531,8 @@ void swapStash(Unit* ptChar, DWORD page, bool toggle) void insertStash(Unit* ptChar) { Stash* curStash = PCPY->currentStash; - Stash* stash = addStash(ptChar, curStash->isShared); - while (stash->previousStash != curStash) + Stash* stash = addStash(ptChar, curStash->isShared, false, curStash); + while (stash->previousStash != curStash) { stash->flags = stash->previousStash->flags; stash->name = stash->previousStash->name; @@ -513,7 +561,10 @@ bool deleteStash(Unit* ptChar, bool isClient) stash->flags = stash->nextStash->flags; stash->name = stash->nextStash->name; if (stash->nextStash->ptListItem != NULL) + { + log_msg("deleteStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", stash->id, stash->isShared, 1, isClient); changeToSelectedStash(ptChar, stash->nextStash, 1, isClient); + } stash = stash->nextStash; while (stash->nextStash) { @@ -532,15 +583,13 @@ bool deleteStash(Unit* ptChar, bool isClient) void renameCurrentStash(Unit* ptChar, char* name) { - log_msg("renameCurrentStash : %08X, %s\n", ptChar, name); + log_msg("renameCurrentStash : '%s'\n", name); Stash* stash = PCPY->currentStash; int len = 0; if (name != NULL) len = strlen(name); - log_msg("renameCurrentStash : %d\n", len); if (stash->name) D2FogMemDeAlloc(stash->name, __FILE__, __LINE__, 0); - log_msg("renameCurrentStash 3\n"); if (len > 0) { stash->name = (char *)malloc(len + 1);//D2FogMemAlloc(len,__FILE__,__LINE__,0); @@ -548,7 +597,6 @@ void renameCurrentStash(Unit* ptChar, char* name) } else stash->name = NULL; - log_msg("renameCurrentStash 4\n"); } @@ -583,7 +631,7 @@ void selectNextStash(Unit* ptChar) if (!selStash->isShared && (selStash->id >= maxSelfPages)) return; if (selStash->isShared && (selStash->id >= maxSharedPages)) return; - selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash); + selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash); if (selStash && (selStash != PCPY->currentStash)) selectStash(ptChar, selStash); @@ -656,7 +704,7 @@ void selectNextIndexStash(Unit* ptChar) { if (!selStash->isShared && (selStash->id >= maxSelfPages)) break; if (selStash->isShared && (selStash->id >= maxSharedPages)) break; - selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);; + selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash); } } if (selStash && (selStash != PCPY->currentStash)) @@ -677,13 +725,132 @@ void selectNextIndex2Stash(Unit* ptChar) { if (!selStash->isShared && (selStash->id >= maxSelfPages)) break; if (selStash->isShared && (selStash->id >= maxSharedPages)) break; - selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);; + selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash); } } if (selStash && (selStash != PCPY->currentStash)) selectStash(ptChar, selStash); } + +WCHAR* getDefaultStashName(Unit* ptChar) +{ + if (!autoRenameStashPage) + return getLocalString( PCPY->currentStash->isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER); + + int onlyOneUnique = -1; + int uniqueNameIndex = -1; + int onlyOneSet = -1; + int setNameIndex = -1; + int onlyOneMisc = -1; + int miscNameIndex = -1; + + Unit* ptItem = D2InventoryGetFirstItem(PCInventory); + int nb = 0; + while (ptItem) + { + if (D2ItemGetPage(ptItem) == 4) + { + if (onlyOneUnique != 0) + { + if (ptItem->ptItemData->quality != ITEMQUALITY_UNIQUE) + { + onlyOneUnique = 0; + uniqueNameIndex = -1; + } + else + { + int uniqueId = D2GetUniqueID(ptItem); + UniqueItemsBIN* uniqueBIN = SgptDataTables->uniqueItems + uniqueId; + if (onlyOneUnique < 0) + { + onlyOneUnique = 1; + uniqueNameIndex = uniqueBIN->uniqueNameId; + } + else if (setNameIndex != uniqueBIN->uniqueNameId) + { + onlyOneUnique = 0; + uniqueNameIndex = -1; + } + } + } + + if (onlyOneSet != 0) + { + if (ptItem->ptItemData->quality != ITEMQUALITY_SET) + { + onlyOneSet = 0; + setNameIndex = -1; + } + else + { + int uniqueID = ptItem->ptItemData->uniqueID; + SetItemsBIN* itemBIN = &SgptDataTables->setItems[uniqueID]; + SetsBIN* setBIN = &SgptDataTables->sets[itemBIN->setId]; + + if (onlyOneSet < 0) + { + onlyOneSet = 1; + setNameIndex = setBIN->setNameIndex; + } + else if (setNameIndex != setBIN->setNameIndex) + { + onlyOneSet = 0; + setNameIndex = -1; + } + } + } + + if (onlyOneMisc != 0) + { + if (ptItem->ptItemData->quality != ITEMQUALITY_NORMAL) + { + onlyOneMisc = 0; + miscNameIndex = -1; + } + else + { + ItemsBIN* ptItemsBin = D2GetItemsBIN(ptItem->nTxtFileNo); + if (onlyOneMisc < 0) + { + onlyOneMisc = 1; + miscNameIndex = ptItemsBin->NameStr; + } + else if (miscNameIndex != ptItemsBin->NameStr) + { + onlyOneMisc = 0; + miscNameIndex = -1; + } + } + } + } + ptItem = D2UnitGetNextItem(ptItem); + } + + if (onlyOneUnique == 1 && uniqueNameIndex >= 0) + return StripGender(D2GetStringFromIndex(uniqueNameIndex)); + if (onlyOneSet == 1 && setNameIndex >= 0) + return StripGender(D2GetStringFromIndex(setNameIndex)); + if (onlyOneMisc == 1 && miscNameIndex >= 0) + return StripGender(D2GetStringFromIndex(miscNameIndex)); + + return getLocalString( PCPY->currentStash->isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER); +} + +void getCurrentStashName(WCHAR* buffer, DWORD maxSize, Unit* ptChar) +{ + if (PCPY->currentStash->name && PCPY->currentStash->name[0]) + { + mbstowcs(buffer, PCPY->currentStash->name, maxSize - 1); + } + else + { + wcsncpy(buffer, getDefaultStashName(ptChar), maxSize - 1);; + } + buffer[20] = NULL; +} + + ////////////////////////////////////////////////////////////////////// Stash* curStash2; DWORD currentSawStash2; @@ -749,7 +916,7 @@ DWORD STDCALL carry1Limit(Unit* ptChar, Unit* ptItemParam, DWORD itemNum, BYTE p { if (!ptChar) return 0; Unit* ptItem = ptItemParam ? ptItemParam : D2GameGetObject(PCGame, UNIT_ITEM, itemNum); - if ((page != 4) && (D2GetItemQuality(ptItem) == 7) && ptChar) + if ((page != 4) && (D2GetItemQuality(ptItem) == ITEMQUALITY_UNIQUE) && ptChar) { int uniqueID = D2GetUniqueID(ptItem); if ((uniqueID>=0) && (uniqueID < (int)SgptDataTables->nbUniqueItems)) @@ -767,24 +934,24 @@ DWORD STDCALL carry1Limit(Unit* ptChar, Unit* ptItemParam, DWORD itemNum, BYTE p return 0; } -FCT_ASM( caller_carry1Limit_114 ) - PUSH DWORD PTR SS : [ESP + 0x08]//page - PUSH 0//EDI - PUSH DWORD PTR SS : [ESP + 0x0C] - PUSH ESI//ptChar - CALL carry1Limit - TEST EAX, EAX - JNZ end_carry1Limit - JMP D2ItemSetPage -end_carry1Limit : - ADD ESP, 0x10 - XOR EAX, EAX - POP EDI - POP EBX - POP ESI - MOV ESP, EBP - POP EBP - RETN 8 +FCT_ASM ( caller_carry1Limit_114 ) + PUSH DWORD PTR SS:[ESP+0x08]//page + PUSH 0//EDI + PUSH DWORD PTR SS:[ESP+0x0C] + PUSH ESI//ptChar + CALL carry1Limit + TEST EAX,EAX + JNZ end_carry1Limit + JMP D2ItemSetPage +end_carry1Limit: + ADD ESP,0xC + XOR EAX,EAX + POP EDI + POP EBX + POP ESI + MOV ESP,EBP + POP EBP + RETN 8 }} FCT_ASM ( caller_carry1Limit_111 ) @@ -826,24 +993,24 @@ end_carry1Limit: RETN 8 }} -FCT_ASM( caller_carry1LimitSwap_114 ) - PUSH EAX - PUSH DWORD PTR SS : [ESP + 0x20] - PUSH 0 - PUSH EDI//ptChar - CALL carry1Limit - TEST EAX, EAX - JNZ end_carry1Limit - JMP D2ItemGetPage -end_carry1Limit : - ADD ESP, 8 - XOR EAX, EAX - POP EBX - POP EDI - POP ESI - MOV ESP, EBP - POP EBP - RETN 8 +FCT_ASM ( caller_carry1LimitSwap_114 ) + PUSH EAX + PUSH DWORD PTR SS:[ESP+0x20] + PUSH 0 + PUSH EDI//ptChar + CALL carry1Limit + TEST EAX,EAX + JNZ end_carry1Limit + JMP D2ItemGetPage +end_carry1Limit: + ADD ESP,8 + XOR EAX,EAX + POP EBX + POP EDI + POP ESI + MOV ESP, EBP + POP EBP + RETN 8 }} FCT_ASM ( caller_carry1LimitSwap_112 ) @@ -923,18 +1090,18 @@ END_carry1LimitWhenDrop: RETN }}*/ -FCT_ASM( caller_carry1LimitWhenDrop_114 ) - PUSH 0 - PUSH 0 - PUSH DWORD PTR SS : [ESP + 0x10] //ptItem - PUSH EBX //ptChar - CALL carry1Limit - TEST EAX, EAX - JNZ end_carry1Limit - JMP D2CanPutItemInInv -end_carry1Limit : - XOR EAX, EAX - RETN 0x1C +FCT_ASM ( caller_carry1LimitWhenDrop_114 ) + PUSH 0 + PUSH 0 + PUSH DWORD PTR SS:[ESP+0x10] //ptItem + PUSH EBX //ptChar + CALL carry1Limit + TEST EAX,EAX + JNZ end_carry1Limit + JMP D2CanPutItemInInv +end_carry1Limit: + XOR EAX,EAX + RETN 0x1C }} FCT_ASM ( caller_carry1LimitWhenDrop_111 ) @@ -982,17 +1149,17 @@ END_carry1LimitWhenDrop: RETN }} -FCT_ASM( caller_carry1OutOfStash_114 ) - PUSH ESI - CALL D2ItemGetPage - CMP AL, 4 - JNZ continue_carry1OutOfStash - SUB DWORD PTR SS : [ESP], 0xC - RETN -continue_carry1OutOfStash : - MOV EDI, DWORD PTR SS : [EBP - 0x4] - TEST EDI, EDI - RETN +FCT_ASM ( caller_carry1OutOfStash_114 ) + PUSH ESI + CALL D2ItemGetPage + CMP AL,4 + JNZ continue_carry1OutOfStash + SUB DWORD PTR SS:[ESP],0xC + RETN +continue_carry1OutOfStash: + MOV EDI,DWORD PTR SS:[EBP-4] + TEST EDI,EDI + RETN }} FCT_ASM ( caller_carry1OutOfStash_111 ) @@ -1038,46 +1205,37 @@ void Install_MultiPageStash() // Cannot put 2 items carry1 in inventory mem_seek R8(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013, 14AC7F); - if (version_D2Game == V114d) { - MEMT_REF4(0x000DD5FD, caller_carry1Limit_114); - } else { - MEMJ_REF4(D2ItemSetPage, version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit); - } + MEMJ_REF4( D2ItemSetPage , version_D2Game >= V114d ? caller_carry1Limit_114 : 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 + //0054AC7E |. E8 FDD50D00 CALL Game.00628280 ; \Game.00628280 // Cannot put 2 items carry1 in inventory by swapping mem_seek R8(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78, 14B179); - if (version_D2Game == V114d) { - MEMT_REF4(0x000DD0D3, caller_carry1LimitSwap_114); - } else { - MEMJ_REF4(D2ItemGetPage, version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap); - } - //6FC858D8 . E8 175F0900 CALL + MEMJ_REF4( D2ItemGetPage , version_D2Game >= V114d ? caller_carry1LimitSwap_114 : 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 + //0054B178 |. E8 D3D00D00 CALL Game.00628250 ; \Game.00628250 if ( version_D2Game >= V111 ) { // Cannot put 2 items carry1 in inventory when drop cube mem_seek R8(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15, 163A89); - if (version_D2Game == V114d) { - MEMT_REF4(0x000D7EC3, caller_carry1LimitWhenDrop_114); - } else { - MEMJ_REF4(D2CanPutItemInInv, caller_carry1LimitWhenDrop_111); - } + MEMJ_REF4( D2CanPutItemInInv , version_D2Game >= V114d ? caller_carry1LimitWhenDrop_114 : caller_carry1LimitWhenDrop_111); //01FBD934 |. E8 5BD3FCFF |CALL //01FB9FD4 |. E8 3912FCFF |CALL //6FC37AD4 |. E8 0535FFFF |CALL //6FCF7B74 |. E8 232FF3FF |CALL //6FCD7B14 |. E8 7D32F5FF |CALL + //00563A88 . E8 C37E0D00 CALL Game.0063B950 ; \Game.0063B950 } else { // Cannot put 2 items carry1 in inventory when drop cube mem_seek R8(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000, 0000); @@ -1088,15 +1246,10 @@ void Install_MultiPageStash() // Verif only carry1 out of stash page when pick up an item mem_seek R8(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B, 15CADD); - if (version_D2Game == V114d) { - memt_byte(0x8B, 0xE8); - MEMT_REF4(0xFF85FC7D, caller_carry1OutOfStash_114); - } else { - memt_byte(0x8B, 0xE8); - MEMT_REF4(version_D2Game >= V111 ? 0x850C2474 : 0x85102444, version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash); - memt_byte(version_D2Game >= V111 ? 0xF6 : 0xC0, 0x90); - } - //6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10] + memt_byte( 0x8B ,0xE8); + MEMT_REF4( version_D2Game >= V114d ? 0xFF85FC7D : version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V114d ? caller_carry1OutOfStash_114 : version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash); + if (version_D2Game < V114d) memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90); + //6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10] //6FC429A2 |. 85C0 |TEST EAX,EAX //01FB8E3B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] //01FB8E3F |. 85F6 |TEST ESI,ESI @@ -1108,6 +1261,8 @@ void Install_MultiPageStash() //6FCF211F |. 85F6 |TEST ESI,ESI //6FCD301B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] //6FCD301F |. 85F6 |TEST ESI,ESI + //0055CADD |> 8B7D FC |MOV EDI,DWORD PTR SS:[EBP-4] + //0055CAE0 |. 85FF |TEST EDI,EDI log_msg("\n"); } diff --git a/PlugY/Interface_Skills.cpp b/PlugY/Interface_Skills.cpp index c4e3f09..90178f7 100644 --- a/PlugY/Interface_Skills.cpp +++ b/PlugY/Interface_Skills.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Interface functions @@ -16,7 +16,7 @@ int posXUnassignSkillBtn=-1; int posYUnassignSkillBtn=-1; -DWORD btnSkillIsDown; +DWORD btnSkillIsDown=0; DWORD getXSkillBtn() {return RX(posXUnassignSkillBtn<0? 0x243 : posXUnassignSkillBtn);} #define getLSkillBtn() 32 DWORD getYSkillBtn() {return RY(posYUnassignSkillBtn<0 ? 0x1B1 : posYUnassignSkillBtn);} @@ -29,7 +29,7 @@ void STDCALL printSkillsPageBtns() if (active_SkillsPoints && !onRealm && D2isLODGame()) { sDrawImageInfo data; - ZeroMemory(&data, sizeof(data)); + ZeroMemory(&data,sizeof(data)); setImage(&data, unassignSkillsBtnImages); setFrame(&data, btnSkillIsDown); D2PrintImage(&data, getXSkillBtn(), getYSkillBtn(), -1, 5, 0); @@ -45,9 +45,8 @@ void STDCALL printSkillsPageBtns() Unit* STDCALL skillsPageMouseDown(sWinMessage* msg) { Unit* ptChar = D2GetClientPlayer(); - log_msg("push down left button\n"); - log_msg("type=%u\nx=%u\ny=%u\n\n", msg->type, msg->x, msg->y); - if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) + + if (active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) { log_msg("push down left button unassign skill\n"); btnSkillIsDown = 1; @@ -61,8 +60,7 @@ Unit* STDCALL skillsPageMouseDown(sWinMessage* msg) void STDCALL skillsPageMouseUp() { - log_msg("push up left button\n"); - if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) + if (active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) { log_msg("push up left button unassign skill\n"); if (btnSkillIsDown) @@ -91,22 +89,22 @@ FCT_ASM ( caller_printSkillsPageBtns ) RETN }} -FCT_ASM( caller_DontPrintSkillPointsRemaining_114 ) - MOV AL, BYTE PTR DS : [onRealm] - TEST AL, AL - JNZ dontPrint - ADD DWORD PTR SS : [ESP], 0x97 - RETN - dontPrint : - MOV ECX, 0x1083 - RETN +FCT_ASM ( caller_DontPrintSkillPointsRemaining_114 ) + MOV AL,BYTE PTR DS:[onRealm] + TEST AL,AL + JNZ dontPrint + ADD DWORD PTR SS:[ESP],0x97 + RETN +dontPrint: + MOV ECX,0x1083 + RETN }} -FCT_ASM(caller_DontPrintSkillPointsRemaining_111) - MOV AL, BYTE PTR DS : [onRealm] - TEST AL, AL - JNZ dontPrint - ADD DWORD PTR SS : [ESP], 0xF2 +FCT_ASM ( caller_DontPrintSkillPointsRemaining_111 ) + MOV AL,BYTE PTR DS:[onRealm] + TEST AL,AL + JNZ dontPrint + ADD DWORD PTR SS:[ESP],0xF2 RETN dontPrint: MOV ECX,0x1083 @@ -124,10 +122,10 @@ dontPrint: RETN }} -FCT_ASM( caller_skillsPageMouseDown_114 ) - PUSH ESI - CALL skillsPageMouseDown - RETN +FCT_ASM ( caller_skillsPageMouseDown_114 ) + PUSH ESI + CALL skillsPageMouseDown + RETN }} FCT_ASM ( caller_skillsPageMouseDown_111 ) @@ -188,6 +186,11 @@ void Install_InterfaceSkills() //6FADF382 |. 5B POP EBX //6FADF383 \. C3 RETN //6FADF384 CC INT3 + //004AB7A5 |> 5F POP EDI + //004AB7A6 |. 5E POP ESI + //004AB7A7 |. 5B POP EBX + //004AB7A8 \. C3 RETN + //004AB7A9 CC INT3 } else { MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns); memt_byte( 0xC4, 0x90 ); // NOP @@ -206,42 +209,40 @@ void Install_InterfaceSkills() // Don't print "Skill Points Remaining" mem_seek R8(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4, AACE0); memt_byte( 0xB9, 0xE8 ); - MEMT_REF4( 0x00001083, version_D2Client == V114d ? caller_DontPrintSkillPointsRemaining_114 : version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining); + MEMT_REF4( 0x00001083, version_D2Client >= V114d ? caller_DontPrintSkillPointsRemaining_114 : version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining); //6FB17080 /$ B9 83100000 MOV ECX,1083 //6FAC6294 |. B9 83100000 MOV ECX,1083 //6FB3AC74 |. B9 83100000 MOV ECX,1083 //6FB2ECF4 |. B9 83100000 MOV ECX,1083 //6FB28334 |. B9 83100000 MOV ECX,1083 //6FADF7E4 |. B9 83100000 MOV ECX,1083 + //004AACE0 /$ B9 83100000 MOV ECX,1083 } // Manage mouse down (Play sound) - mem_seek R8(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112, ABC1A); - memt_byte(0xC7, 0xE8); // CALL caller_skillsPageMouseDown - MEMT_REF4(version_D2Client == V114d ? 0x00001846 : version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client == V114d ? caller_skillsPageMouseDown_114 : version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown); - memt_byte(0x00, 0x90); // NOP - memt_byte(0x00, 0x90); // NOP - + mem_seek R8(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112, ABC1A); + memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown + MEMT_REF4( version_D2Client >= V114d ? 0x00001846 : version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client == V114d ? caller_skillsPageMouseDown_114 : version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown); + memt_byte( 0x00, 0x90 ); // NOP + memt_byte( 0x00, 0x90 ); // NOP //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 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 + //004ABC1A |> C746 18 00000000 MOV DWORD PTR DS:[ESI+18],0 // Manage mouse up - mem_seek R8(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8, ABC96/*ABE38*/); - if (version_D2Client == V114d) { - MEMT_REF4(/*0xFFFFFE45*/0xFFF745F6, caller_skillsPageMouseUp); - } else { - MEMJ_REF4(D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A - } + mem_seek R8(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8, ABC96); + 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 + //004ABC95 |. E8 F645F7FF CALL Game.00420290 log_msg("\n"); diff --git a/PlugY/Interface_Stash.cpp b/PlugY/Interface_Stash.cpp index 32e153b..ebcf2b6 100644 --- a/PlugY/Interface_Stash.cpp +++ b/PlugY/Interface_Stash.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Interface stats page functions @@ -26,73 +26,118 @@ static struct DWORD nextIndex:1; DWORD putGold:1; DWORD takeGold:1; + DWORD stashName:1; }; }; } isDownBtn; bool displaySharedSetItemNameInGreen = true; -int posXPreviousBtn=-1; -int posYPreviousBtn=-1; -int posXNextBtn=-1; -int posYNextBtn=-1; -int posXSharedBtn=-1; -int posYSharedBtn=-1; -int posXPreviousIndexBtn=-1; -int posYPreviousIndexBtn=-1; -int posXNextIndexBtn=-1; -int posYNextIndexBtn=-1; -int posXPutGoldBtn=-1; -int posYPutGoldBtn=-1; -int posXTakeGoldBtn=-1; -int posYTakeGoldBtn=-1; +int posXPreviousBtn = -1; +int posYPreviousBtn = -1; +int posWPreviousBtn = 32; +int posHPreviousBtn = 32; +int posXNextBtn = -1; +int posYNextBtn = -1; +int posWNextBtn = 32; +int posHNextBtn = 32; +int posXSharedBtn = -1; +int posYSharedBtn = -1; +int posWSharedBtn = 32; +int posHSharedBtn = 32; +int posXPreviousIndexBtn = -1; +int posYPreviousIndexBtn = -1; +int posWPreviousIndexBtn = 32; +int posHPreviousIndexBtn = 32; +int posXNextIndexBtn = -1; +int posYNextIndexBtn = -1; +int posWNextIndexBtn = 32; +int posHNextIndexBtn = 32; +int posXPutGoldBtn = -1; +int posYPutGoldBtn = -1; +int posWPutGoldBtn = 32; +int posHPutGoldBtn = 32; +int posXTakeGoldBtn = -1; +int posYTakeGoldBtn = -1; +int posWTakeGoldBtn = 32; +int posHTakeGoldBtn = 32; +int posXStashNameField = -1; +int posYStashNameField = -1; +int posWStashNameField = 175; +int posHStashNameField = 20; +int posXStashGoldField = -1; +int posYStashGoldField = -1; +int posWStashGoldField = 152; +int posHStashGoldField = 18; + + +DWORD PersonalNormalPageColor = WHITE; +DWORD PersonalIndexPageColor = DARK_GREEN; +DWORD PersonalMainIndexPageColor = YELLOW; +DWORD SharedNormalPageColor = GOLD; +DWORD SharedIndexPageColor = ORANGE; +DWORD SharedMainIndexPageColor = RED; + DWORD getXPreviousBtn() {return RX(posXPreviousBtn<0? D2GetResolution()?0x80:0xAF : posXPreviousBtn);} -#define getLPreviousBtn() 32 DWORD getYPreviousBtn() {return RY(posYPreviousBtn<0 ? 0x40 : posYPreviousBtn);} -#define getHPreviousBtn() 32 - DWORD getXNextBtn() {return RX(posXNextBtn<0 ? D2GetResolution()?0xA0:0xCF :posXNextBtn);}//?169:SEL_X(0x63, 0x63, 0xCF, 0xA0));} -#define getLNextBtn() 32 DWORD getYNextBtn() {return RY(posYNextBtn<0 ? 0x40 : posYNextBtn);} -#define getHNextBtn() 32 - DWORD getXSharedBtn() {return RX(posXSharedBtn<0 ? D2GetResolution()?0x10:0x6F :posXSharedBtn);}//17:SEL_X(0xE3, 0xE3, 0x6F, 0x10));}//0xD8 -#define getLSharedBtn() 32 DWORD getYSharedBtn() {return RY(posYSharedBtn<0 ? 0x40 : posYSharedBtn);} -#define getHSharedBtn() 32 - DWORD getXPreviousIndexBtn() {return RX(posXPreviousIndexBtn<0 ? D2GetResolution()?0x60:0x8F :posXPreviousIndexBtn);}//73:SEL_X(0x18, 0x60, 0x8F, 0x60));} -#define getLPreviousIndexBtn() 32 DWORD getYPreviousIndexBtn() {return RY(posYPreviousIndexBtn<0 ? 0x40 : posYPreviousIndexBtn);} -#define getHPreviousIndexBtn() 32 - DWORD getXNextIndexBtn() {return RX(posXNextIndexBtn<0? D2GetResolution()?0xC0:0xEF : posXNextIndexBtn);}//217:SEL_X(0x128, 0xC0, 0xEF, 0xC0));} -#define getLNextIndexBtn() 32 DWORD getYNextIndexBtn() {return RY(posYNextIndexBtn<0 ? 0x40 : posYNextIndexBtn);} -#define getHNextIndexBtn() 32 - DWORD getXPutGoldBtn() {return RX(posXPutGoldBtn<0? 0x1C : posXPutGoldBtn);} -#define getLPutGoldBtn() 32 DWORD getYPutGoldBtn() {return RY(posYPutGoldBtn<0 ? 0x1A8 : posYPutGoldBtn);} -#define getHPutGoldBtn() 32 - DWORD getXTakeGoldBtn() {return RX(posXTakeGoldBtn<0? 0x105 : posXTakeGoldBtn);} -#define getLTakeGoldBtn() 32 DWORD getYTakeGoldBtn() {return RY(posYTakeGoldBtn<0 ? 0x1A8 : posYTakeGoldBtn);} -#define getHTakeGoldBtn() 32 +DWORD getXStashNameField() {return RX(posXStashNameField<0 ? 0x4A : posXStashNameField);} +DWORD getYStashNameField() {return RY(posYStashNameField<0 ? 0x19A : posYStashNameField);} +DWORD getXStashGoldField() {return RX(posXStashGoldField<0 ? 0x61 : posXStashGoldField);} +DWORD getYStashGoldField() {return RY(posYStashGoldField<0 ? 0x1B6 : posYStashGoldField);} //closeBtn x: D2C=0x113 LOD=0x110(0->0x28) y: D2C=0x41 LOD=0x40 (-0x23 -> 5) -#define isOnButtonNextStash(x,y) isOnRect(x, y, getXNextBtn(), getYNextBtn(), getLNextBtn(), getHNextBtn()) -#define isOnButtonPreviousStash(x,y) isOnRect(x, y, getXPreviousBtn(), getYPreviousBtn(), getLPreviousBtn(), getHPreviousBtn()) -#define isOnButtonToggleSharedStash(x,y) isOnRect(x, y, getXSharedBtn(), getYSharedBtn(), getLSharedBtn(), getHSharedBtn()) -#define isOnButtonNextIndexStash(x,y) isOnRect(x, y, getXNextIndexBtn(), getYNextIndexBtn(), getLNextIndexBtn(), getHNextIndexBtn()) -#define isOnButtonPreviousIndexStash(x,y) isOnRect(x, y, getXPreviousIndexBtn(), getYPreviousIndexBtn(), getLPreviousIndexBtn(), getHPreviousIndexBtn()) -#define isOnButtonPutGold(x,y) isOnRect(x, y, getXPutGoldBtn(), getYPutGoldBtn(), getLPutGoldBtn(), getHPutGoldBtn()) -#define isOnButtonTakeGold(x,y) isOnRect(x, y, getXTakeGoldBtn(), getYTakeGoldBtn(), getLTakeGoldBtn(), getHTakeGoldBtn()) +#define isOnButtonNextStash(x,y) isOnRect(x, y, getXNextBtn(), getYNextBtn(), posWNextBtn, posHNextBtn) +#define isOnButtonPreviousStash(x,y) isOnRect(x, y, getXPreviousBtn(), getYPreviousBtn(), posWPreviousBtn, posHPreviousBtn) +#define isOnButtonToggleSharedStash(x,y) isOnRect(x, y, getXSharedBtn(), getYSharedBtn(), posWSharedBtn, posHSharedBtn) +#define isOnButtonNextIndexStash(x,y) isOnRect(x, y, getXNextIndexBtn(), getYNextIndexBtn(), posWNextIndexBtn, posHNextIndexBtn) +#define isOnButtonPreviousIndexStash(x,y) isOnRect(x, y, getXPreviousIndexBtn(), getYPreviousIndexBtn(), posWPreviousIndexBtn, posHPreviousIndexBtn) +#define isOnButtonPutGold(x,y) isOnRect(x, y, getXPutGoldBtn(), getYPutGoldBtn(), posWPutGoldBtn, posHPutGoldBtn) +#define isOnButtonTakeGold(x,y) isOnRect(x, y, getXTakeGoldBtn(), getYTakeGoldBtn(), posWTakeGoldBtn, posHTakeGoldBtn) +#define isOnStashNameField(x,y) isOnRect(x, y, getXStashNameField(), getYStashNameField(), posWStashNameField, posHStashNameField) +#define isOnStashGoldField(x,y) isOnRect(x, y, getXStashGoldField(), getYStashGoldField(), posWStashGoldField, posHStashGoldField) +void UpdateStashPosition() +{ + //static int isInstalled = false; + //if (isInstalled) return; + InventoryBIN* inventory = D2GetInventoryBIN(); + if (inventory->gridY == 15) + { + posXPreviousBtn = 127; + posYPreviousBtn = 500; + posXNextBtn = 159; + posYNextBtn = 500; + posXSharedBtn = 28; + posYSharedBtn = 21; + posXPreviousIndexBtn = 95; + posYPreviousIndexBtn = 500; + posXNextIndexBtn = 191; + posYNextIndexBtn = 500; + posXPutGoldBtn = 28; + posYPutGoldBtn = 500; + posXTakeGoldBtn = 259; + posYTakeGoldBtn = 500; + //posXStashNameField = -1; + posYStashNameField = 16; + //posXStashGoldField = -1; + posYStashGoldField = 36; + } +} void* STDCALL printBtns() { @@ -134,7 +179,6 @@ void* STDCALL printBtns() LPWSTR lpText; - WCHAR text[100]; DWORD mx = D2GetMouseX(); DWORD my = D2GetMouseY(); @@ -142,31 +186,36 @@ void* STDCALL printBtns() if (isOnButtonPreviousStash(mx,my)) { lpText = getLocalString(STR_STASH_PREVIOUS_PAGE); - D2PrintPopup(lpText, getXPreviousBtn()+getLPreviousBtn()/2, getYPreviousBtn()-getHPreviousBtn(), WHITE, 1); + D2PrintPopup(lpText, getXPreviousBtn()+posWPreviousBtn/2, getYPreviousBtn()-posHPreviousBtn, WHITE, 1); } else if (isOnButtonNextStash(mx,my)) { lpText = getLocalString(STR_STASH_NEXT_PAGE); - D2PrintPopup(lpText, getXNextBtn()+getLNextBtn()/2, getYNextBtn()-getHNextBtn(), WHITE, 1); + D2PrintPopup(lpText, getXNextBtn()+posWNextBtn/2, getYNextBtn()-posHNextBtn, WHITE, 1); - } else if (active_sharedStash && isOnButtonToggleSharedStash(mx,my)) { - lpText = getLocalString(PCPY->showSharedStash ? STR_TOGGLE_TO_PERSONAL : STR_TOGGLE_TO_SHARED); - D2PrintPopup(lpText, getXSharedBtn()+getLSharedBtn()/2, getYSharedBtn()-getHSharedBtn(), WHITE, 1); + } else if (isOnButtonToggleSharedStash(mx,my)) { + if (active_sharedStash) { + lpText = getLocalString(PCPY->showSharedStash ? STR_TOGGLE_TO_PERSONAL : STR_TOGGLE_TO_SHARED); + D2PrintPopup(lpText, getXSharedBtn()+posWSharedBtn/2, getYSharedBtn()-posHSharedBtn, WHITE, 1); + } else if (active_SharedStashInMultiPlayer == 1) { + lpText = getLocalString(STR_TOGGLE_MULTI_DISABLED); + D2PrintPopup(lpText, getXPreviousIndexBtn()+posWPreviousIndexBtn/2, getYPreviousIndexBtn()-posHPreviousIndexBtn, WHITE, 1); + } } else if (isOnButtonPreviousIndexStash(mx,my)) { - _snwprintf(text, sizeof(text), getLocalString(STR_STASH_PREVIOUS_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2); - D2PrintPopup(text, getXPreviousIndexBtn()+getLPreviousIndexBtn()/2, getYPreviousIndexBtn()-getHPreviousIndexBtn(), 0, 0); + lpText = getLocalString(STR_STASH_PREVIOUS_INDEX); + D2PrintPopup(lpText, getXPreviousIndexBtn()+posWPreviousIndexBtn/2, getYPreviousIndexBtn()-posHPreviousIndexBtn, WHITE, 1); } else if (isOnButtonNextIndexStash(mx,my)) { - _snwprintf(text, sizeof(text), getLocalString(STR_STASH_NEXT_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2); - D2PrintPopup(text, getXNextIndexBtn()+getLNextIndexBtn()/2, getYNextIndexBtn()-getHNextIndexBtn(), WHITE, 1); + lpText = getLocalString(STR_STASH_NEXT_INDEX); + D2PrintPopup(lpText, getXNextIndexBtn()+posWNextIndexBtn/2, getYNextIndexBtn()-posHNextIndexBtn, WHITE, 1); } else if (active_sharedGold && isOnButtonPutGold(mx,my)) { lpText = getLocalString(STR_PUT_GOLD); - D2PrintPopup(lpText, getXPutGoldBtn()+getLPutGoldBtn()/2, getYPutGoldBtn()-getHPutGoldBtn(), WHITE, 1); + D2PrintPopup(lpText, getXPutGoldBtn()+posWPutGoldBtn/2, getYPutGoldBtn()-posHPutGoldBtn, WHITE, 1); } else if (active_sharedGold && isOnButtonTakeGold(mx,my)) { lpText = getLocalString(STR_TAKE_GOLD); - D2PrintPopup(lpText, getXTakeGoldBtn()+getLTakeGoldBtn()/2, getYTakeGoldBtn()-getHTakeGoldBtn(), WHITE, 1); + D2PrintPopup(lpText, getXTakeGoldBtn()+posWTakeGoldBtn/2, getYTakeGoldBtn()-posHTakeGoldBtn, WHITE, 1); } return D2LoadBuySelBtn(); @@ -191,6 +240,8 @@ DWORD STDCALL manageBtnDown(sWinMessage* msg) isDownBtn.putGold = 1; else if (active_sharedGold && isOnButtonTakeGold(msg->x,msg->y)) isDownBtn.takeGold = 1; + else if (isOnStashNameField(msg->x,msg->y)) + isDownBtn.stashName = 1; else return 0; D2PlaySound(4,0,0,0,0); @@ -198,7 +249,7 @@ DWORD STDCALL manageBtnDown(sWinMessage* msg) return 1; } - + DWORD STDCALL manageBtnUp(sWinMessage* msg) { if (onRealm || !D2isLODGame()) return 0; @@ -226,7 +277,7 @@ DWORD STDCALL manageBtnUp(sWinMessage* msg) if (isDownBtn.toggleToSharedStash) if (PCPY->showSharedStash) updateServer(US_SELECT_SELF); - else + else updateServer(US_SELECT_SHARED); } else if (isOnButtonPreviousIndexStash(msg->x,msg->y)) { @@ -255,6 +306,26 @@ DWORD STDCALL manageBtnUp(sWinMessage* msg) if (isDownBtn.takeGold) updateServer(US_TAKEGOLD); + } else if (isOnStashNameField(msg->x,msg->y)) { + log_msg("push up left Stash Name\n"); + if (isDownBtn.stashName && PCPY->currentStash) + { + if (GetKeyState(VK_SHIFT)<0) + { + WCHAR text[21]; + getCurrentStashName(text, 21, ptChar); + D2TogglePage(5,0,0);// Open command window + _snwprintf(ptInputCommand, 25, L"/rp %s", text); + InputCommandLen = wcslen(ptInputCommand); + } + else if (PCPY->currentStash->isMainIndex) + updateServer(US_RESET_INDEX); + else if (PCPY->currentStash->isIndex) + updateServer(US_SET_MAIN_INDEX); + else + updateServer(US_SET_INDEX); + } + } else return 0; return 1; @@ -268,41 +339,84 @@ void FASTCALL printPageNumber(LPWSTR maxGoldText, DWORD x, DWORD y, DWORD color, return; } + DWORD mx = D2GetMouseX(); + DWORD my = D2GetMouseY(); Unit* ptChar = D2GetClientPlayer(); - WCHAR popupText[100]; + WCHAR popupText[0x400]; - if (PCPY->currentStash) + if (!PCPY->currentStash) + D2PrintString(getLocalString(STR_NO_SELECTED_PAGE), x, y, WHITE, bfalse); + else { bool isShared = PCPY->currentStash->isShared; bool isIndex = PCPY->currentStash->isIndex; - DWORD currentId = PCPY->currentStash->id; + bool isMainIndex = PCPY->currentStash->isMainIndex; + DWORD currentId = PCPY->currentStash->id + 1; - if (PCPY->currentStash->name && PCPY->currentStash->name[0]) - mbstowcs(popupText,PCPY->currentStash->name,50);//strlen(PCPY->currentStash->name)+1 - else _snwprintf(popupText, sizeof(popupText), getLocalString( isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER), currentId+1); - D2PrintString(popupText, x, y, isShared ? (isIndex ? CRYSTAL_RED : RED) : (isIndex ? BRIGHT_WHITE : WHITE), bfalse); - } else { - _snwprintf(popupText, sizeof(popupText), getLocalString(STR_NO_SELECTED_PAGE)); - D2PrintString(popupText, x, y, WHITE, bfalse); + WCHAR text[21]; + getCurrentStashName(text, 21, ptChar); + + // Replace character # by number page. + int j = 0; + for (int i=0; text[i]; i++) + { + if (text[i] == L'#') + { + DWORD val = currentId; + int nbDigits = 0; + do + { + nbDigits++; + val /= 10; + } while(val); + j += nbDigits; + + val = currentId; + nbDigits = 0; + do + { + nbDigits++; + popupText[j - nbDigits] = (WCHAR)(val % 10 + 48); + val /= 10; + } while(val); + } + else + popupText[j++] = text[i]; + } + popupText[j] = NULL; + + // Check text length vs field name length + int pixelLen = D2GetPixelLen(popupText); + int len = wcslen(popupText); + while(len > 0 && pixelLen > posWStashNameField - 5) + { + len--; + popupText[len] = NULL; + pixelLen = D2GetPixelLen(popupText); + } + + DWORD color = isShared ? (isMainIndex ? SharedMainIndexPageColor : isIndex ? SharedIndexPageColor : SharedNormalPageColor) : (isMainIndex ? PersonalMainIndexPageColor : isIndex ? PersonalIndexPageColor : PersonalNormalPageColor); + D2PrintString(popupText, x, y, color, bfalse); + + if (isOnStashNameField(mx, my)) + { + _snwprintf(popupText, 0x400, getLocalString(STR_PAGE_TYPE_CHANGE), currentId); + D2PrintPopup(popupText, getXStashNameField() + posWStashNameField/2, getYStashNameField() - posHStashNameField - 2, WHITE, 1); + } } //printGoldMaxPopup - DWORD mx = D2GetMouseX(); - DWORD my = D2GetMouseY(); - if ((RX(0x5E) < mx) && (mx < RX(0xF8)) && (RY(0x1C8) < my) && (my < RY(0x1B6)) ) + if (isOnStashGoldField(mx, my)) { if (active_sharedGold) { - _snwprintf(popupText, sizeof(popupText), L"%s\n%s: %u", maxGoldText, getLocalString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold); - DWORD x = D2GetPixelLen(maxGoldText); - DWORD x2 = D2GetPixelLen(popupText) - x; - D2PrintPopup(popupText, RX(0xA8-max(x,x2)/2), RY(0x1CA), WHITE, 0); - } else - D2PrintPopup(maxGoldText, RX(0xA8), RY(0x1CA), WHITE, 1); + _snwprintf(popupText, 0x400, L"%s\n%s: %u", maxGoldText, getLocalString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold); + D2PrintPopup(popupText, getXStashGoldField() + posWStashGoldField/2, getYStashGoldField() - posHStashGoldField - 2, WHITE, 1); + } else + D2PrintPopup(maxGoldText, getXStashGoldField() + posWStashGoldField/2, getYStashGoldField() - posHStashGoldField - 2, WHITE, 1); } } - static Stash* curStash=NULL; static DWORD currentSawStash=0; Unit* STDCALL getNextItemForSet(Unit* ptItem) @@ -348,24 +462,23 @@ Unit* STDCALL initGetNextItemForSet(Inventory* ptInventory) } FCT_ASM( caller_manageBtnDown_114 ) - PUSH EBX - CALL manageBtnDown - TEST EAX, EAX - JE IS_NOT_ON_BUTTON - POP EDX - MOV EDX, DWORD PTR DS : [EDX + 0xA] - MOV DWORD PTR DS : [EDX], 1 - POP EDI - POP ESI - POP EBX - MOV ESP, EBP - POP EBP - RETN 4 -IS_NOT_ON_BUTTON : - JMP D2ClickOnStashButton + PUSH EBX + CALL manageBtnDown + TEST EAX,EAX + JE IS_NOT_ON_BUTTON + POP EDX + MOV EDX, DWORD PTR DS:[EDX+0xA] + MOV DWORD PTR DS:[EDX],1 + POP EDI + POP ESI + POP EBX + MOV ESP,EBP + POP EBP + RETN 4 +IS_NOT_ON_BUTTON: + JMP D2ClickOnStashButton }} - FCT_ASM( caller_manageBtnDown_111 ) PUSH EBP CALL manageBtnDown @@ -401,28 +514,28 @@ IS_NOT_ON_BUTTON: }} FCT_ASM( caller_manageBtnUp_114 ) - PUSH EBX - CALL manageBtnUp - MOV isDownBtn.all, 0 - TEST EAX, EAX - JE IS_NOT_ON_BUTTON - POP EDX - MOV EDX, DWORD PTR DS : [EDX + 0x33] - MOV DWORD PTR DS : [EDX], 0 - SUB EDX, 8 - MOV DWORD PTR DS : [EDX], 0 - ADD EDX, 4 - MOV DWORD PTR DS : [EDX], 0 - ADD EDX, 0x68 - MOV DWORD PTR DS : [EDX], 0 - POP EDI - POP ESI - POP EBX - MOV ESP, EBP - POP EBP - RETN 4 + PUSH EBX + CALL manageBtnUp + MOV isDownBtn.all,0 + TEST EAX,EAX + JE IS_NOT_ON_BUTTON + POP EDX + MOV EDX, DWORD PTR DS:[EDX+0x33] + MOV DWORD PTR DS:[EDX],0 + SUB EDX,8 + MOV DWORD PTR DS:[EDX],0 + ADD EDX,4 + MOV DWORD PTR DS:[EDX],0 + ADD EDX,0x64 + MOV DWORD PTR DS:[EDX],0 + POP EDI + POP ESI + POP EBX + MOV ESP,EBP + POP EBP + RETN 4 IS_NOT_ON_BUTTON: - JMP D2ClickOnStashButton + JMP D2ClickOnStashButton }} FCT_ASM( caller_manageBtnUp_111 ) @@ -474,10 +587,12 @@ IS_NOT_ON_BUTTON: JMP D2isLODGame }} -FCT_ASM( initBtnsStates_114 ) - MOV isDownBtn.all, 0 - MOV DWORD PTR DS : [0x7BCC3C], EAX - RETN +FCT_ASM ( initBtnsStates_114 ) + MOV isDownBtn.all,0 + POP ECX + MOV ESP,EBP + POP EBP + RETN }} FCT_ASM ( initBtnsStates ) @@ -499,70 +614,59 @@ void Install_InterfaceStash() // Print button images mem_seek R8(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26, 8F308); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFC52F4, printBtns); - } else { - MEMC_REF4(D2LoadBuySelBtn, printBtns); - } + 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 + //0048F307 |. E8 F452FCFF CALL Game.00454600 // print page number mem_seek R8(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03, 8F2E5); - if (version_D2Client == V114d) { - MEMT_REF4(0x00073037, printPageNumber); - } else { - MEMJ_REF4(D2PrintString, printPageNumber); - } + MEMJ_REF4( D2PrintString, printPageNumber); //6FADF374 |. E8 3FCC0800 CALL //6FB60FE2 |. E8 99C2F5FF CALL //6FB2DF62 |. E8 19F3F8FF CALL //6FB63632 |. E8 299DF5FF CALL //6FB49A32 |. E8 4739F7FF CALL //6FB4DE02 |. E8 4739F7FF CALL + //0048F2E4 |. E8 37300700 CALL Game.00502320 ; \Game.00502320 // Manage mouse down (Play sound) mem_seek R8(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76, 925B8); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFF73C4, caller_manageBtnDown_114); - } else { - MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown); - } - //6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080 + MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V114a ? caller_manageBtnDown_114 : 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 + //004925B7 |. E8 C473FFFF CALL Game.00489980 // Manage mouse up mem_seek R8(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9, 89B63); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFFFE19, caller_manageBtnUp_114); - } else { - MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp); - } - //6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080 + MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V114a ? caller_manageBtnUp_114 : 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 + //00489B62 |> E8 19FEFFFF CALL Game.00489980 // init state of button on open stash page - mem_seek R8(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A, 89ED0); - if (version_D2Client == V114d) { - memt_byte(0xA3, 0xE8); - MEMT_REF4(0x007BCC3C, initBtnsStates_114); - } else { - memt_byte(0x81, 0xE9); // CALL initBtnsStates - MEMT_REF4(0x000104C4, initBtnsStates); - memt_byte(0x00, 0x90); - } + mem_seek R8(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A, 89ED5); + if (version_D2Client >= V114d) + { + memt_byte( 0x8B, 0xE9 ); // CALL initBtnsStates + MEMT_REF4( 0xCCC35DE5, initBtnsStates_114); + } else { + memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates + MEMT_REF4( 0x000104C4, initBtnsStates); + memt_byte( 0x00, 0x90 ); + } //6FAE5B3A |> 81C4 04010000 ADD ESP,104 //6FAE5B3A |> 81C4 04010000 ADD ESP,104 //6FAEC63A |> 81C4 04010000 ADD ESP,104 @@ -571,34 +675,32 @@ void Install_InterfaceStash() //6FB59D9A |> 81C4 04010000 ADD ESP,104 //6FB3CC3A |> 81C4 04010000 ADD ESP,104 //6FB4441A |> 81C4 04010000 ADD ESP,104 + //00489ED5 |> 8BE5 MOV ESP,EBP + //00489ED7 |. 5D POP EBP + //00489ED8 \. C3 RETN + //00489ED9 CC INT3 // init the search of print in green the item set name we have in stash mem_seek R8(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24, 86774); - if (version_D2Client == V114d) { - MEMT_REF4(0x001B4B48, initGetNextItemForSet); - } else { - MEMJ_REF4(D2InventoryGetFirstItem, initGetNextItemForSet); - } + 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 + //00486773 |. E8 484B1B00 CALL Game.0063B2C0 ; \Game.0063B2C0 // Get next item for print in green the item set name we have in stash mem_seek R8(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB, 86807); - if (version_D2Client == V114d) { - MEMT_REF4(0x001B7795, getNextItemForSet); - } else { - MEMJ_REF4(D2UnitGetNextItem, getNextItemForSet); - } + 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 + //00486806 |. E8 95771B00 |CALL Game.0063DFA0 ; \Game.0063DFA0 log_msg("\n"); diff --git a/PlugY/Interface_Stats.cpp b/PlugY/Interface_Stats.cpp index b7903cb..85e6029 100644 --- a/PlugY/Interface_Stats.cpp +++ b/PlugY/Interface_Stats.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Interface functions @@ -139,14 +139,14 @@ Unit* STDCALL statsPageMouseUp(sWinMessage* msg) return ptChar; } -FCT_ASM( caller_printStatsPageBtns_114 ) - CALL printStatsPageBtns - POP EDI - POP ESI - POP EBX - MOV ESP, EBP - POP EBP - RETN +FCT_ASM ( caller_printStatsPageBtns_114 ) + CALL printStatsPageBtns + POP EDI + POP ESI + POP EBX + MOV ESP,EBP + POP EBP + RETN }} FCT_ASM ( caller_printStatsPageBtns_111 ) @@ -180,20 +180,20 @@ FCT_ASM ( caller_printStatsPageBtns_9 ) RETN }} -FCT_ASM( caller_statsPageMouseDown_114 ) - PUSH DWORD PTR SS : [ESP + 0x18] - CALL statsPageMouseDown - TEST EAX, EAX - JE fin_statsPageMouseDown - MOV EAX, DWORD PTR DS : [0x7A6A70] - RETN -fin_statsPageMouseDown : - ADD ESP, 4 - POP EDI - POP ESI - POP EBX - POP EBP - RETN 4 + +FCT_ASM ( caller_statsPageMouseDown_114 ) + PUSH DWORD PTR SS:[ESP+0x18] + CALL statsPageMouseDown + TEST EAX,EAX + JE fin_statsPageMouseDown + JMP D2GetClientPlayer +fin_statsPageMouseDown: + ADD ESP,4 + POP EDI + POP ESI + POP EBX + POP EBP + RETN 4 }} FCT_ASM ( caller_statsPageMouseDown_111 ) @@ -226,20 +226,20 @@ fin_statsPageMouseDown: RETN 4 }} -FCT_ASM( caller_statsPageMouseUp_114 ) - PUSH DWORD PTR SS : [EBP + 0x8] - CALL statsPageMouseUp - TEST EAX, EAX - JE fin_statsPageMouseUp - MOV EAX, DWORD PTR DS : [0x7A6A70] - RETN -fin_statsPageMouseUp : - POP EDI - POP ESI - POP EBX - MOV ESP, EBP - POP EBP - RETN 4 +FCT_ASM ( caller_statsPageMouseUp_114 ) + PUSH DWORD PTR SS:[EBP+0x8] + CALL statsPageMouseUp + TEST EAX,EAX + JE fin_statsPageMouseUp + JMP D2GetClientPlayer +fin_statsPageMouseUp: + ADD ESP,4 + POP EDI + POP ESI + POP EBX + MOV ESP, EBP + POP EBP + RETN 4 }} FCT_ASM ( caller_statsPageMouseUp ) @@ -279,23 +279,16 @@ void Install_InterfaceStats() { static int isInstalled = false; if (isInstalled) return; - + Install_PlugYImagesFiles(); log_msg("Patch D2Client for stats interface. (InterfaceStats)\n"); // Print new buttons images - if (version_D2Client == V114d) { - mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, A8949); - memt_byte(0x5F, 0xE9); - MEMT_REF4(0xE58B5B5E, caller_printStatsPageBtns_114); - } else { - mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, C03B6); - memt_byte(0x5F, 0xE9); // JMP - MEMT_REF4(0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111 : version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9); - } - - //6FAD0F86 . 5F POP EDI + mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, A8949); + memt_byte( 0x5F, 0xE9 ); // JMP + MEMT_REF4( version_D2Client >= V114d ? 0xE58B5B5E : 0x815B5D5E, version_D2Client >= V114d ? caller_printStatsPageBtns_114 : version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9); + //6FAD0F86 . 5F POP EDI //6FAD0F87 . 5E POP ESI //6FAD0F88 . 5D POP EBP //6FAD0F89 . 5B POP EBX @@ -330,18 +323,30 @@ void Install_InterfaceStats() //6FB703B8 |. 5D POP EBP //6FB703B9 |. 5B POP EBX //6FB703BA |. 81C4 70030000 ADD ESP,370 - //6FB703�0 \. C3 RETN + //6FB703C0 \. C3 RETN + //004A8949 . 5F POP EDI + //004A894A . 5E POP ESI + //004A894B . 5B POP EBX + //004A894C . 8BE5 MOV ESP,EBP - if ( version_D2Client >= V111 ) + if ( version_D2Client >= V114d ) { // Manage mouse down (Play sound) mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFBC5F8, caller_statsPageMouseDown_114); - } else { - memt_byte(0xA1, 0xE8); - MEMT_REF4(ptptClientChar, caller_statsPageMouseDown); - } + MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown_114); + //004A77D3 . E8 F8C5FBFF CALL Game.00463DD0 + + // Manage mouse up + mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963); + MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseUp_114); + //004A7962 |. E8 69C4FBFF CALL Game.00463DD0 + } + else if ( version_D2Client >= V111 ) + { + // Manage mouse down (Play sound) + mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4); + 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] @@ -350,12 +355,8 @@ void Install_InterfaceStats() // Manage mouse up mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFBC469, caller_statsPageMouseUp_114); - } else { - memt_byte(0xA1, 0xE8); - MEMT_REF4(ptptClientChar, caller_statsPageMouseUp); - } + 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] @@ -363,12 +364,12 @@ void Install_InterfaceStats() //6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] } else { // Manage mouse down (Play sound) - mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000, 0000); + mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4); MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown); //6FAD133C . E8 8F700500 CALL D2Client.6FB283D0 // Manage mouse up - mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000, 0000); + mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963); MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2 //6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0 } diff --git a/PlugY/Language.cpp b/PlugY/Language.cpp index 336271c..1744839 100644 --- a/PlugY/Language.cpp +++ b/PlugY/Language.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.14d by haxifix. Language management. @@ -10,7 +11,7 @@ #include -bool active_ChangeLanguage = true; +bool active_ChangeLanguage = false; DWORD selectedLanguage = LNG_ENG; bool active_LanguageManagement = false; @@ -19,12 +20,17 @@ t_availableLanguages availableLanguages; DWORD* ptCurrentLanguage; -DWORD STDCALL languageManagement () +DWORD STDCALL languageManagement() { - if (active_ChangeLanguage) *ptCurrentLanguage = selectedLanguage; + if (active_ChangeLanguage) + *ptCurrentLanguage = selectedLanguage; + if (active_LanguageManagement) - if ((*ptCurrentLanguage > LNG_RUS) || !((1 << *ptCurrentLanguage) & availableLanguages.all)) - *ptCurrentLanguage = defaultLanguage; + { + if ((*ptCurrentLanguage >= LNG_DEF) || !((1 << *ptCurrentLanguage) & availableLanguages.all)) + *ptCurrentLanguage = defaultLanguage; + } + return *ptCurrentLanguage; } @@ -33,10 +39,11 @@ void Install_LanguageManagement() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Lang for language management. (LanguageManagement)\n"); - ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang == V114d ? 0x5F : version_D2Lang >= V111 ? 0x51: 0x5C)); + ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang == V114d ? 0x4D : version_D2Lang >= V111 ? 0x51: 0x5C)); + languageManagement(); // Language management mem_seek( (DWORD)D2GetLang + (version_D2Lang == V114d ? 0x4C : version_D2Lang >= V111 ? 0x3E : 0x49));//6FC13E39-6FC10000 @@ -45,11 +52,11 @@ void Install_LanguageManagement() //6FC13E39 |. A1 EC0CC26F MOV EAX,DWORD PTR DS:[6FC20CEC] //003D91FE |. A1 1C0A3E00 MOV EAX,DWORD PTR DS:[3E0A1C] //003DA0AE |. A1 1C0A3E00 MOV EAX,DWORD PTR DS:[3E0A1C] + //0052519C |> A1 EC298800 MOV EAX,DWORD PTR DS:[8829EC] log_msg("\n"); isInstalled = true; } - /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/LoadPlayerData.cpp b/PlugY/LoadPlayerData.cpp index 737f63f..a7d9405 100644 --- a/PlugY/LoadPlayerData.cpp +++ b/PlugY/LoadPlayerData.cpp @@ -1,9 +1,9 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. - Load Player Custom Data. + Load Player Custom Data. =================================================================*/ @@ -21,6 +21,8 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar) BYTE* data; log_msg("--- Start LoadSPCustomData ---\n"); + active_sharedStash = active_SharedStashInMultiPlayer > 0; + log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash); if (!ptChar) {log_msg("LoadSPCustomData : ptChar == NULL\n");return 0x1B;}//Unknow failure @@ -38,7 +40,7 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar) data = readExtendedSaveFile(PCPlayerData->name, &size); ret = loadExtendedSaveFile(ptChar, data, size); D2FogMemDeAlloc(data,__FILE__,__LINE__,0); - if (!ret) + if (!ret && active_sharedStash) { data = readSharedSaveFile(PCPlayerData->name, &size); ret = loadSharedSaveFile(ptChar, data, size); @@ -52,19 +54,19 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar) return ret; } -FCT_ASM( caller_LoadSPPlayerCustomData_114 ) - MOV EDI, EAX - TEST EDI, EDI - JNZ JMP_LoadSPPlayerCustomData - PUSH DWORD PTR SS : [ESP + 0x1C] - CALL LoadSPCustomData - MOV EDI, EAX - TEST EDI, EDI - JNZ JMP_LoadSPPlayerCustomData - RETN -JMP_LoadSPPlayerCustomData : - ADD DWORD PTR SS : [ESP], 0x14 - RETN +FCT_ASM (caller_LoadSPPlayerCustomData_114 ) + MOV EDI,EAX + TEST EDI,EDI + JNZ JMP_LoadSPPlayerCustomData + PUSH DWORD PTR SS:[ESP+0x1C] + CALL LoadSPCustomData + MOV EDI,EAX + TEST EDI,EDI + JNZ JMP_LoadSPPlayerCustomData + RETN +JMP_LoadSPPlayerCustomData: + ADD DWORD PTR SS:[ESP],0x14 + RETN }} FCT_ASM (caller_LoadSPPlayerCustomData ) @@ -187,33 +189,31 @@ void sendData(BYTE* data, DWORD size, bool isShared) log_msg("\n"); } -static DWORD sizeExtended; -static BYTE* dataExtended; -static DWORD sizeShared; -static BYTE* dataShared; void FASTCALL SendSaveFiles (char* ptPath, DWORD maxsize, char* name) { -// DWORD size; -// BYTE* data; - D2FogGetSavePath(ptPath,maxsize); log_msg("\n--- Start SendSaveFiles ---\n"); - - log_msg("path = %s\n\nmaxsize = %d\n\nname = %s\n\n", ptPath, maxsize, name); + active_sharedStash = active_SharedStashInMultiPlayer == 2; + log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash); // Send Extended Save File log_msg("Send Extended Save File\n"); - dataExtended = readExtendedSaveFile(name, &sizeExtended); + DWORD sizeExtended = 0; + BYTE* dataExtended = readExtendedSaveFile(name, &sizeExtended); sendData(dataExtended, sizeExtended, false); D2FogMemDeAlloc(dataExtended,__FILE__,__LINE__,0); // Send Shared Save File - log_msg("Send Shared Save File\n"); - dataShared = readSharedSaveFile(name, &sizeShared); - sendData(dataShared, sizeShared, true); - D2FogMemDeAlloc(dataShared,__FILE__,__LINE__,0); + //if (active_sharedStash) + { + log_msg("Send Shared Save File\n"); + DWORD sizeShared = 0; + BYTE* dataShared = readSharedSaveFile(name, &sizeShared); + sendData(dataShared, sizeShared, true); + D2FogMemDeAlloc(dataShared,__FILE__,__LINE__,0); + } // Ending load log_msg("End SendSaveFiles.\n\n"); @@ -226,6 +226,8 @@ DWORD STDCALL ReceiveSaveFiles (DWORD clientID, t_rcvMsg* msg) if( (msg->packID != customPackID) || !msg->isCustom) return msg->packID; log_msg("Loading Receive Packet: clientID=%d\t type=%X\t finalSize=%X\t packSize=%02X\t data=%08X\n", clientID, msg->type, msg->finalSize, msg->packSize, msg->data); + active_sharedStash = active_SharedStashInMultiPlayer == 2; + log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash); bool isShared; @@ -314,6 +316,8 @@ int STDCALL ReceiveSaveFiles_9(DWORD clientID, SOCKET s, char *buf, int len, int DWORD STDCALL LoadMPCustomData(Unit* ptChar) { log_msg("Start LoadMPCustomData\n"); + active_sharedStash = active_SharedStashInMultiPlayer == 2; + log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash); if (!ptChar) return NULL; if (!ptChar) @@ -354,7 +358,7 @@ DWORD STDCALL LoadMPCustomData(Unit* ptChar) log_msg("is LOD Game\n"); if (!ret) ret = loadExtendedSaveFile(ptChar, curSF->dataExtended, curSF->sizeExtended); - if (!ret) + if (!ret && active_sharedStash) ret = loadSharedSaveFile(ptChar, curSF->dataShared, curSF->sizeShared); } else { log_msg("is not LOD Game\n"); @@ -367,21 +371,22 @@ DWORD STDCALL LoadMPCustomData(Unit* ptChar) return ret; } -FCT_ASM( caller_LoadMPPlayerCustomData_114 ) - PUSH DWORD PTR SS : [EDI] - CALL LoadMPCustomData - TEST EAX, EAX - JNZ JMP_LoadMPlayerCustomData - CMP DWORD PTR DS : [EDI], 0 - JNZ Continue_LoadMP - ADD DWORD PTR SS : [ESP], 0x1D -Continue_LoadMP : +FCT_ASM ( caller_LoadMPPlayerCustomData_114 ) + PUSH DWORD PTR SS:[EDI] + CALL LoadMPCustomData + TEST EAX,EAX + JNZ JMP_LoadMPlayerCustomData + CMP DWORD PTR DS:[EDI],0 + JNZ Continue_LoadMP + ADD DWORD PTR SS:[ESP],0x1D +Continue_LoadMP: + RETN +JMP_LoadMPlayerCustomData: + SUB DWORD PTR SS:[ESP],0x10 RETN -JMP_LoadMPlayerCustomData : - SUB DWORD PTR SS : [ESP], 0x10 - RETN }} + FCT_ASM ( caller_LoadMPPlayerCustomData_111 ) PUSH DWORD PTR SS:[EBX] CALL LoadMPCustomData @@ -443,19 +448,20 @@ FCT_ASM ( caller_SendSaveFiles ) JMP SendSaveFiles }} -FCT_ASM( caller_ReceiveSaveFiles_114 ) - PUSH ECX - PUSH EDX - LEA EBX, DWORD PTR DS : [ESI + 4] - PUSH EBX //Message - MOV EBX, DWORD PTR SS : [ESI] - PUSH EBX //ID client - CALL ReceiveSaveFiles - POP EDX - POP ECX - RETN +FCT_ASM ( caller_ReceiveSaveFiles_114 ) + PUSH ECX + PUSH EDX + LEA EBX,DWORD PTR DS:[ESI+4] + PUSH EBX //Message + MOV EBX,DWORD PTR SS:[ESI] + PUSH EBX //ID client + CALL ReceiveSaveFiles + POP EDX + POP ECX + RETN }} + FCT_ASM ( caller_ReceiveSaveFiles_111 ) PUSH ECX PUSH EDX @@ -511,15 +517,15 @@ go_to_default: void Install_LoadPlayerData() { static int isInstalled = false; - if (isInstalled || !active_PlayerCustomData) return; + if (isInstalled) return; log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n"); // Load SP player custom data. mem_seek R8(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD, 13447A); memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData - MEMT_REF4( version_D2Game == V114d ? 0x75FF85F8 : 0x75F685F0 , version_D2Game == V114d ? caller_LoadSPPlayerCustomData_114 : caller_LoadSPPlayerCustomData); - memt_byte( version_D2Game == V114d ? 0x13 : 0x16, 0x90); // NOP + MEMT_REF4( version_D2Game >= V114d ? 0x75FF85F8 : 0x75F685F0 , version_D2Game >= V114d ? caller_LoadSPPlayerCustomData_114 : caller_LoadSPPlayerCustomData); + memt_byte( version_D2Game >= V114d ? 0x13 : 0x16, 0x90); // NOP //6FC8CB0F 8BF0 MOV ESI,EAX //6FC8CB11 85F6 TEST ESI,ESI //6FC8CB13 75 16 JNZ SHORT D2Game.6FC8CB2B @@ -538,11 +544,14 @@ void Install_LoadPlayerData() //6FC5BCCD |> 8BF0 MOV ESI,EAX //6FC5BCCF |. 85F6 TEST ESI,ESI //6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9 + //0053447A |. 8BF8 MOV EDI,EAX + //0053447C |. 85FF TEST EDI,EDI + //0053447E |. 75 13 JNZ SHORT Game.00534493 // Load MP player custom data. mem_seek R8(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57, 134572); memt_byte( 0x83, 0xE8); - MEMT_REF4( version_D2Game == V114d ? 0x1D74003F : version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game == V114d ? caller_LoadMPPlayerCustomData_114 : version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9); + MEMT_REF4( version_D2Game >= V114d ? 0x1D74003F : version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V114d ? caller_LoadMPPlayerCustomData_114 : version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9); //6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0 //6FC8CC69 . 74 46 JE SHORT D2Game.6FC8CCB1 //0203B777 |> 833B 00 CMP DWORD PTR DS:[EBX],0 @@ -555,31 +564,26 @@ void Install_LoadPlayerData() //6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D //6FC5BB57 |> 833B 00 CMP DWORD PTR DS:[EBX],0 //6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D + //00534572 |> 833F 00 CMP DWORD PTR DS:[EDI],0 + //00534575 |. 74 1D JE SHORT Game.00534594 // Send save files to Server. mem_seek R8(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C, 7807E); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFF8EFCE, caller_SendSaveFiles_111); - } else { - MEMJ_REF4(D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles); - } - - //6FAAD5A1 |. E8 88D10B00 CALL + 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 + //0047807D |. E8 CEEFF8FF CALL Game.00407050 // Receive save files from client. mem_seek R8(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9, 13F114); memt_byte( 0x8B ,0xE8); - if (version_D2Game == V114d) { - MEMT_REF4(0x46B60F1E, caller_ReceiveSaveFiles_114); - memt_byte(0x04, 0x90); - } else if ( version_D2Game >= V111 ) { - MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111); - memt_byte( 0x45 ,0x90); + if ( version_D2Game >= V111 ) { + MEMT_REF4( version_D2Game >= V114d ? 0x46B60F1E : 0xB60F005D, version_D2Game >= V114d ? caller_ReceiveSaveFiles_114 : caller_ReceiveSaveFiles_111); + if (version_D2Game < V114a) memt_byte( 0x45 ,0x90); memt_byte( 0x04 ,0x90); //01FB76E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP] //01FB76EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] @@ -591,6 +595,8 @@ void Install_LoadPlayerData() //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] + //0053F114 |. 8B1E MOV EBX,DWORD PTR DS:[ESI] + //0053F116 |. 0FB646 04 MOVZX EAX,BYTE PTR DS:[ESI+4] } else { MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles); //6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI] diff --git a/PlugY/LocalizedStrings.cpp b/PlugY/LocalizedStrings.cpp index 1e978bb..70595ee 100644 --- a/PlugY/LocalizedStrings.cpp +++ b/PlugY/LocalizedStrings.cpp @@ -2,7 +2,7 @@ File created by Yohann NICOLAS. Localized strings functions. - + =================================================================*/ #include "INIfile.h" @@ -10,6 +10,8 @@ #include "common.h" #include +const char* LOCALIZED_STRINGS_FILENAME = "PlugY\\LocalizedStrings.ini"; + LPWSTR StripGender(LPWSTR text) { if (text[0] == L' ') @@ -32,11 +34,14 @@ struct LocalizedTypeString LPSTR itemStr; LPWSTR typeLocalizedString; } *sLocalizedTypeStrings; -LPWSTR sLocalizedStrings[60]; + +LPWSTR sLocalizedStrings[100]; int nbLocalizedTypeString = 0; LPWSTR getLocalString(int stringId) { + if (stringId < 0 || stringId >= 100) + return L""; return sLocalizedStrings[stringId]; } @@ -93,19 +98,29 @@ void loadLocalString(INIFileW *iniFile, int id, LPCWSTR section, LPCWSTR key) sLocalizedStrings[id] = new WCHAR[len + 1]; wcsncpy(sLocalizedStrings[id], section, len); sLocalizedStrings[id][len] = NULL; + return; } + + int j = 0; + int i = 0; if (buffer[0] == L'"' && buffer[len-1] == L'"') { - sLocalizedStrings[id] = new WCHAR[len - 1]; - wcsncpy(sLocalizedStrings[id], buffer + 1, len - 2); - sLocalizedStrings[id][len - 2] = NULL; + buffer[len-1] = NULL; + i++; + len -= 2; } - else + sLocalizedStrings[id] = new WCHAR[len + 1]; + for (; iInitReadWrite("PlugY\\LocalizedStrings.ini", INIFILE_MPQREAD, 0))//C:\\Jeux\\Blizzard\\D2\\- + if (iniFile->InitReadWrite(LOCALIZED_STRINGS_FILENAME, INIFILE_MPQREAD, 0))//C:\\Jeux\\Blizzard\\D2\\- + log_msg("File %s loaded from MPQ.\n\n", LOCALIZED_STRINGS_FILENAME); + else if (iniFile->InitReadWrite(LOCALIZED_STRINGS_FILENAME, INIFILE_READ, 0))//C:\\Jeux\\Blizzard\\D2\\- + log_msg("File %s loaded from PlugY folder.\n\n", LOCALIZED_STRINGS_FILENAME); + else { - log_msg("Failed to load LocalizedStrings, default values used.\n\n"); + log_msg("Failed to load %s.\n\n", LOCALIZED_STRINGS_FILENAME); + return; } LPCWSTR key; @@ -266,6 +289,7 @@ void loadLocalizedStrings(int language) LOAD(STR_STASH_NEXT_PAGE); LOAD(STR_TOGGLE_TO_PERSONAL); LOAD(STR_TOGGLE_TO_SHARED); + LOAD(STR_TOGGLE_MULTI_DISABLED); LOAD(STR_STASH_PREVIOUS_INDEX); LOAD(STR_STASH_NEXT_INDEX); LOAD(STR_PUT_GOLD); @@ -277,6 +301,7 @@ void loadLocalizedStrings(int language) LOAD(STR_PREVIOUS_PAGE); LOAD(STR_NEXT_PAGE); LOAD(STR_ITEM_LEVEL); + LOAD(STR_PAGE_TYPE_CHANGE); // Cube receipt : LOAD(STR_COW_PORTAL); @@ -316,6 +341,27 @@ void loadLocalizedStrings(int language) LOAD(STR_ONLY_HELL); LOAD(STR_ONLY_CLASS); + // Breakpoints : + LOAD(STR_MERCENARIES); + LOAD(STR_MERC_ACT_1); + LOAD(STR_MERC_ACT_2); + LOAD(STR_MERC_ACT_3); + LOAD(STR_MERC_ACT_5); + LOAD(STR_BREAKPOINT); + LOAD(STR_BREAKPOINTS); + LOAD(STR_BLOCK_FRAMES); + LOAD(STR_CASTING_FRAMES); + LOAD(STR_HIT_RECOVERY_FRAMES); + LOAD(STR_1H_SWINGING_WEAPON); + LOAD(STR_OTHER_WEAPONS); + LOAD(STR_HUMAN_FORM); + LOAD(STR_BEAR_FORM); + LOAD(STR_WOLF_FORM); + LOAD(STR_VAMPIRE_FORM); + LOAD(STR_SPEARS_AND_STAVES); + LOAD(STR_LIGHTNING_CHAIN_LIGHTNING); + LOAD(STR_OTHER_SPELLS); + iniFile->close(); delete iniFile; } diff --git a/PlugY/LocalizedStrings.h b/PlugY/LocalizedStrings.h index b8d0b6b..9fb08e7 100644 --- a/PlugY/LocalizedStrings.h +++ b/PlugY/LocalizedStrings.h @@ -1,9 +1,9 @@ /*============================================== -File created by Yohann NICOLAS. -Add support 1.13d by L'Autour. + 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. + this file implements some common and useful + function related to some Diablo II mechanisms. /*============================================*/ #pragma once @@ -26,6 +26,7 @@ enum eStringList STR_STASH_NEXT_PAGE, STR_TOGGLE_TO_PERSONAL, STR_TOGGLE_TO_SHARED, + STR_TOGGLE_MULTI_DISABLED, STR_STASH_PREVIOUS_INDEX, STR_STASH_NEXT_INDEX, STR_PUT_GOLD, @@ -37,6 +38,7 @@ enum eStringList STR_PREVIOUS_PAGE, STR_NEXT_PAGE, STR_ITEM_LEVEL, + STR_PAGE_TYPE_CHANGE, // STR_COW_PORTAL, STR_PANDEMONIUM_PORTAL, @@ -74,6 +76,26 @@ enum eStringList STR_ONLY_N_H, STR_ONLY_HELL, STR_ONLY_CLASS, + + STR_MERCENARIES, + STR_MERC_ACT_1, + STR_MERC_ACT_2, + STR_MERC_ACT_3, + STR_MERC_ACT_5, + STR_BREAKPOINT, + STR_BREAKPOINTS, + STR_BLOCK_FRAMES, + STR_CASTING_FRAMES, + STR_HIT_RECOVERY_FRAMES, + STR_1H_SWINGING_WEAPON, + STR_OTHER_WEAPONS, + STR_HUMAN_FORM, + STR_BEAR_FORM, + STR_WOLF_FORM, + STR_VAMPIRE_FORM, + STR_SPEARS_AND_STAVES, + STR_LIGHTNING_CHAIN_LIGHTNING, + STR_OTHER_SPELLS }; /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/MainScreen.cpp b/PlugY/MainScreen.cpp index 80d8a5f..b29005d 100644 --- a/PlugY/MainScreen.cpp +++ b/PlugY/MainScreen.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Print PlugY version on screen. @@ -35,28 +35,14 @@ void STDCALL printPlugYVersion(void** childrens, DWORD* sgnNumChildren) } } -void STDCALL printPlugYVersion114() -{ - if (active_Windowed) - SetWindowedOptions(); - if (active_PrintPlugYVersion) - { - char buf[20]; - void* textbox = D2CreateTextBox(newTextBoxData); - void** childrens = (void**)0x779350; - DWORD* sgnNumChildren = (DWORD*)0x779944; - childrens[*sgnNumChildren] = textbox; - d2_assert((*sgnNumChildren)++ >= 40, "sgnNumChildren < MAX_CHILDREN", __FILE__, __LINE__); - sprintf(buf, "PlugY %s", PLUGY_VERSION); - D2PrintLineOnTextBox(textbox, buf, colorOfPlugYVersion); - } -} - -FCT_ASM( caller_printPlugYVersion114 ) - POP ESI - CALL printPlugYVersion114 - MOV ECX, 0x115 - JMP ESI +void** childrens; +DWORD* sgnNumChildren; +FCT_ASM ( caller_printPlugYVersion114 ) + PUSH sgnNumChildren + PUSH childrens + CALL printPlugYVersion + MOV ECX,0x115 + RETN }} FCT_ASM ( caller_printPlugYVersion ) @@ -76,23 +62,27 @@ void Install_PrintPlugYVersion() log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n"); - if (version_D2Launch == V114d) { - mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 33798); - memt_byte(0xB9, 0xE8); - MEMT_REF4(0x00000115, caller_printPlugYVersion114); - } else { - // Print PlugY version. - mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 10A11); - MEMJ_REF4(D2CreateTextBox, caller_printPlugYVersion); - //6FA19638 |. E8 1BED0000 CALL - //6FA517C6 |. E8 6F81FFFF CALL - //6FA578A6 |. E8 D71FFFFF CALL - //6FA56B1F |. E8 1A2EFFFF CALL - //6FA56AF6 |. E8 432EFFFF CALL - //6FA58060 |. E8 ED18FFFF CALL - //6FA50A10 |. E8 218FFFFF CALL - } - + // Print PlugY version. + mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 33798); + if (version_D2Launch == V114d) + { + memt_byte(0xB9, 0xE8); + MEMT_REF4(0x00000115, caller_printPlugYVersion114); + childrens = (void**)(offset_Game + 0x379350); + sgnNumChildren = (DWORD*)(offset_Game + 0x379944); + //00433798 |. B9 15010000 MOV ECX,115 + } + else + { + MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion); + //6FA19638 |. E8 1BED0000 CALL + //6FA517C6 |. E8 6F81FFFF CALL + //6FA578A6 |. E8 D71FFFFF CALL + //6FA56B1F |. E8 1A2EFFFF CALL + //6FA56AF6 |. E8 432EFFFF CALL + //6FA58060 |. E8 ED18FFFF CALL + //6FA50A10 |. E8 218FFFFF CALL + } log_msg("\n"); @@ -106,6 +96,14 @@ void FASTCALL versionChange(void* screen, char* text, DWORD color) D2PrintLineOnTextBox(screen,versionText,modVersionColor); } +FCT_ASM ( caller_VersionChange_114 ) + MOV CL, BYTE PTR DS:[modVersionColor] + MOV BYTE PTR SS:[ESP+4], CL + MOV EDX,versionText + MOV ECX,ESI + RETN +}} + FCT_ASM ( caller_VersionChange_10 ) MOV CL, BYTE PTR DS:[modVersionColor] MOV BYTE PTR SS:[ESP+4], CL @@ -114,12 +112,6 @@ FCT_ASM ( caller_VersionChange_10 ) RETN }} -FCT_ASM(caller_VersionChange_114) - MOV EDX, versionText - MOV ECX, ESI - RETN -}} - void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? { static int isInstalled = false; @@ -133,14 +125,17 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? // Print LoD/Mod version. - if (version_D2Launch == V114d) { - mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000 - memt_byte(0x8D, 0xE8); // CALL - MEMT_REF4(0xCE8BC055, caller_VersionChange_114); - //memt_byte(0xCE, 0x90); // NOP - } else if (version_D2Launch >= V110) + if (version_D2Launch >= V114d) { - mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 10AE4);//6FA19721-6FA10000 + mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000 + memt_byte(0x8D, 0xE8); // CALL + MEMT_REF4(0xCE8BC055, caller_VersionChange_114); + //004337EA |. 8D55 C0 LEA EDX,DWORD PTR SS:[EBP-40] ; | + //004337ED |. 8BCE MOV ECX,ESI ; | + } + else if (version_D2Launch >= V110) + { + mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000 memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x8B102454 , caller_VersionChange_10); memt_byte( 0xCF, 0x90 ); // NOP @@ -157,7 +152,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? //6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] //6FA50AE8 |. 8BCF MOV ECX,EDI } else { - mem_seek R8(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB, 10AEB); + mem_seek R8(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB, 00000); MEMJ_REF4( D2PrintLineOnTextBox, versionChange); //6FA19729 |. E8 88EB0000 CALL //6FA518A1 |. E8 267FFFFF CALL diff --git a/PlugY/ModifMemory.cpp b/PlugY/ModifMemory.cpp index 8ecb6c7..9c49558 100644 --- a/PlugY/ModifMemory.cpp +++ b/PlugY/ModifMemory.cpp @@ -9,11 +9,10 @@ #include "parameters.h" #include "modifMemory.h" -const char* MSG_ERROR_READ_MEMORY = "Error : Read access missing to patch memory at %08X.\nPlease install a clean version of Lord of Destruction\n\n" - "You can avoid this error message by setting ActiveCkeckMemory=0 in PlugY.ini\n(WARNING: Be careful when you use it, it shouldn't be used by common user)"; -const char* MSG_CRITICAL_WRITE_MEMORY = "Error.\nWrite access missing to patch memory at %08X.\n\nPlease install a clean version of Lord of Destruction\n"; -const char* ERROR_TESTING1 = "Error : BYTE %02X wanted but %02X found to change memory at %08X\n\n"; -const char* ERROR_TESTING4 = "Error : DWORD %08X wanted but %08X found to change memory at %08X\n\n"; +const char* MSG_ERROR_READ_MEMORY = "Error : Read access missing to patch memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod."; +const char* MSG_CRITICAL_WRITE_MEMORY = "Error.\nWrite access missing to patch memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod."; +const char* ERROR_TESTING1 = "Error : BYTE %02X wanted but %02X found to change memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod."; +const char* ERROR_TESTING4 = "Error : DWORD %08X wanted but %08X found to change memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod."; void* currentMemoryPos = 0; @@ -102,11 +101,13 @@ bool testIfAlreadySet(DWORD current, DWORD wanted) void testMemory4(DWORD old, DWORD found) { if (old != found) + { if (active_CheckMemory) { log_box(ERROR_TESTING4, old, found, currentMemoryPos); exit(1); } else log_msg(ERROR_TESTING4, old, found, currentMemoryPos); + } } void memt_dword(DWORD old, DWORD val) diff --git a/PlugY/NewInterface_CubeListing.cpp b/PlugY/NewInterface_CubeListing.cpp index c2bd8dd..1c54331 100644 --- a/PlugY/NewInterface_CubeListing.cpp +++ b/PlugY/NewInterface_CubeListing.cpp @@ -42,7 +42,7 @@ void printOutputItem(CubeOutput* output, LPWSTR buf, LPINT len, LPINT nbOutputs) if ((output->quantityOrNbSockets>1) && !output->haveSockets) { - if (output->quantityOrNbSockets = 255) + if (output->quantityOrNbSockets == 255) PRINT(BUF, L"%s ", getLocalString(STR_FULL)); else PRINT(BUF, L"%u ", output->quantityOrNbSockets); @@ -305,6 +305,7 @@ void listAllCubeFormula() int len = 0; int nbCubeReceipt = 0; + int line = 0; for (int i=0; i1 ? D2GetRunesBIN(1)-1 : NULL; RunesBIN* runesLast = runesFirst? runesFirst + nbRunes : NULL; // log_msg("nbRunes(%d,%d) runesFirst(%08X, %08X) runesLast(%08X, %08X)",nbRunes,SgptDataTables->nbRunes,runesFirst, SgptDataTables->runes,runesLast,SgptDataTables->runes + SgptDataTables->nbRunes); - + int nbRunesCompleted=0; DWORD curNbRunes=0; for ( RunesBIN* runesData = runesFirst; runesData < runesLast; runesData++) @@ -210,27 +210,30 @@ DWORD STDCALL mouseRunewordsPageLeftDown(sWinMessage* msg) { if (!D2isLODGame() || !D2GetResolution()) return -1; - if (!isOnStatsPage(msg->x,msg->y)) return 1; + DWORD x = D2GetMouseX(); + DWORD y = D2GetMouseY(); + if (!isOnStatsPage(x,y)) + return 1; - if (isOnCloseBtn(msg->x,msg->y)) + if (isOnCloseBtn(x,y)) { log_msg("push down left button close\n"); isDownBtn.close = 1; D2PlaySound(4,0,0,0,0); } - else if (isOnNextPageBtn(msg->x,msg->y)) + else if (isOnNextPageBtn(x,y)) { log_msg("push down left button next page\n"); isDownBtn.nextPage = 1; D2PlaySound(4,0,0,0,0); } - else if (isOnPrevRunesBtn(msg->x,msg->y)) + else if (isOnPrevRunesBtn(x,y)) { log_msg("push down left button prev page\n"); isDownBtn.prevRunes = 1; D2PlaySound(4,0,0,0,0); } - else if (isOnNextRunesBtn(msg->x,msg->y)) + else if (isOnNextRunesBtn(x,y)) { log_msg("push down left button next runes\n"); isDownBtn.nextRunes = 1; @@ -246,24 +249,30 @@ DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg) { if (!D2isLODGame() || !D2GetResolution()) return -1; - if (!isOnStatsPage(msg->x,msg->y)) return 1; + DWORD x = D2GetMouseX(); + DWORD y = D2GetMouseY(); + if (!isOnStatsPage(x,y)) + return 1; - if (isOnCloseBtn(msg->x,msg->y)) + if (isOnCloseBtn(x,y)) { log_msg("push up left button close\n"); if (isDownBtn.close) D2TogglePage(2,1,0); } - else if (isOnNextPageBtn(msg->x,msg->y)) + else if (isOnNextPageBtn(x,y)) { log_msg("push up left button next page\n"); if (isDownBtn.nextPage) { - GoStatPage(GetCurrentPage()+1); + if (extraHiddenPage>1) + GoStatPage(GetCurrentPage()+1); + else + GoStatPage(0); log_msg("next page press\n"); } } - else if (isOnPrevRunesBtn(msg->x,msg->y)) + else if (isOnPrevRunesBtn(x,y)) { log_msg("push up left button prev runes\n"); if (isDownBtn.prevRunes) @@ -271,7 +280,7 @@ DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg) if (curRunesPage) curRunesPage--; } } - else if (isOnNextRunesBtn(msg->x,msg->y)) + else if (isOnNextRunesBtn(x,y)) { log_msg("push up left button next runes\n"); if (isDownBtn.nextRunes) diff --git a/PlugY/NewInterface_Stats.cpp b/PlugY/NewInterface_Stats.cpp index b843ee1..10fa32d 100644 --- a/PlugY/NewInterface_Stats.cpp +++ b/PlugY/NewInterface_Stats.cpp @@ -117,7 +117,7 @@ void print2Lines(WORD id, LPWSTR lpText, DWORD x, DWORD l, DWORD y) { wcsncpy(lpText, D2GetStringFromIndex(id), 0x63); lpText[0x64]= L'\0'; - + LPWSTR lptmp = lpText; while (*lptmp) { @@ -145,7 +145,7 @@ void print2Lines(WORD id, LPWSTR lpText, DWORD x, DWORD l, DWORD y) void STDCALL printNewStatsPage() { if (!D2isLODGame() || !D2GetResolution()) return D2PrintStatsPage(); - + WCHAR text[BUFSIZE]; LPWSTR lpText; DWORD nbPixel; @@ -347,7 +347,7 @@ if (version_D2Client <= V110) //print Hit Point curValue = D2GetPlayerStat(ptChar, STATS_HP, 0) / 256; - if ((ptChar->CurrentAnim != 0x11) && !curValue) curValue=1; + if ((ptChar->mode != UNIT_MODE_DEAD) && !curValue) curValue=UNIT_MODE_NEUTRAL; swprintf(text,L"%ld",curValue); @@ -523,7 +523,7 @@ if (version_D2Client <= V110) D2PrintImage(&data, getXAssVITBtn(), getYAssVITBtn(), -1, 5, 0); D2PrintImage(&data, getXAssENEBtn(), getYAssENEBtn(), -1, 5, 0); } - + if (active_StatsPoints && !onRealm) { setImage(&data, D2AssignStatsPointsBoxImages); @@ -584,9 +584,9 @@ if (version_D2Client <= V110) if ( version_D2Client <= V110 ) { DWORD avgChanceMonsterWillHitYou=53;//TODO - if (avgChanceMonsterWillHitYou<5) avgChanceMonsterWillHitYou = 5; + if (avgChanceMonsterWillHitYou<5) avgChanceMonsterWillHitYou = 5; else if (avgChanceMonsterWillHitYou>95) avgChanceMonsterWillHitYou = 95; - + int chanceToBlock = D2GetChanceToBlock(ptChar, D2isLODGame()); if (chanceToBlock <= 0) { @@ -700,8 +700,8 @@ DWORD STDCALL mouseNewStatsPageLeftDown(sWinMessage* msg) void sendAssignStats(DWORD code, DWORD nbStatPointsRemaining) { DWORD nbPoints = GetKeyState(VK_SHIFT)<0? nbStatPointsRemaining : 1; - if (active_StatsShiftClickLimit && (nbPoints>limitValueToShiftClick)) - nbPoints = limitValueToShiftClick; + if (active_StatsShiftClickLimit && (nbPoints>limitValueToShiftClick)) + nbPoints = limitValueToShiftClick; while ( nbPoints>0 ) { DWORD nbTemp = nbPoints > 0x20 ? 0x20 : nbPoints; @@ -744,7 +744,7 @@ DWORD STDCALL mouseNewStatsPageLeftUp(sWinMessage* msg) } } else if (nbStatPointsRemaining) - { + { if (isOnAssSTRBtn(msg->x,msg->y)) { log_msg("push up left button assign strengh\n"); diff --git a/PlugY/NewInterface_StatsPageTwo.cpp b/PlugY/NewInterface_StatsPageTwo.cpp index 34f48bd..dfdc8a1 100644 --- a/PlugY/NewInterface_StatsPageTwo.cpp +++ b/PlugY/NewInterface_StatsPageTwo.cpp @@ -11,10 +11,6 @@ #include "newInterfaces.h" #include "common.h" #include -#include -#include -#include -#include #define getXCloseBtn() RX(0x110) #define getLCloseBtn() 32 @@ -34,8 +30,9 @@ #define getHNextPageBtn() 32 #define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn()) +const char * STATS_INTERFACE_FILENAME = "PlugY\\statsinterface.txt"; -#define BUFSIZE 0x80 +#define BUFSIZE 0x400 static struct { @@ -62,68 +59,12 @@ struct statsInterfaceBIN }; extern int lastPage; -int nbStatsInterface; -statsInterfaceBIN* statsInterface; - -void loadStatsInterfaceDesc_114() { - char filename[0x104]; - strcpy(filename, "PlugY\\statsinterface.txt"); - char fileTemp[0x104]; - log_msg("Load custom file : %s", filename); - strcpy(fileTemp, filename); - D2FogGetInstallPath(filename, 0x104 - strlen(filename)); - strcat(filename, fileTemp); - log_msg("-> %s\n", filename); - std::ifstream statsFile(filename); - std::vector stats; - if (statsFile.is_open()) { - std::string line; - while (std::getline(statsFile, line)) { - if (line.length() > 0 && line[0] != '*') { - //log_msg("Loading stat:\n"); - //log_msg("%s\n\n", line); - stats.push_back(line); - } - } - } else { - log_msg("FAILED TO OPEN FILE: %s", filename); - } - statsFile.close(); - nbStatsInterface = stats.size(); - statsInterface = new statsInterfaceBIN[nbStatsInterface]; - for (int i = 0; i < nbStatsInterface; ++i) { - std::istringstream ss(stats[i]); - auto& stat = statsInterface[i]; - std::string token = ""; - std::getline(ss, token, '\t'); - //log_msg("Stat (%u) %s\n", i, token.c_str()); - std::getline(ss, token, '\t'); - stat.enabled = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tenabled = %u\n", stat.enabled); - std::getline(ss, token, '\t'); - stat.page = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tpage = %u\n", stat.page); - std::getline(ss, token, '\t'); - stat.x = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tx = %u\n", stat.x); - std::getline(ss, token, '\t'); - stat.y = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\ty = %u\n", stat.y); - std::getline(ss, token, '\t'); - stat.color = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tcolor = %u\n", stat.color); - std::getline(ss, token, '\t'); - stat.font = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tfont = %u\n", stat.font); - std::getline(ss, token, '\t'); - stat.statsID = token.length() == 0 ? 0 : std::stoi(token.c_str()); - //log_msg("\tstatsID = %u\n", stat.statsID); - } -} +int nbStatsInterface = 0; +statsInterfaceBIN* statsInterface = NULL; void loadStatsInterfaceDesc(DWORD mempool) { - log_msg("loadStatsInterfaceDesc(%d)\n",mempool); + log_msg("loadStatsInterfaceDesc(%d)\n", mempool); CREATE_TABLE_DESCRIPTION(8); ADD_WORD_FIELD(0, "enabled"); @@ -135,20 +76,50 @@ void loadStatsInterfaceDesc(DWORD mempool) // ADD_LOOKUP_WORD(10, "stat", lookupItemStatCost); ADD_WORD_FIELD(12, "statID"); ADD_TERM_FIELD(); - //log_msg("statsInterface=0x%08x\nnbStatsInterface=0x%08x\n", statsInterface, &nbStatsInterface); - //void* test = D2ReadFile(mempool, "PlugY\\statsinterface.txt", (DWORD*)nbStatsInterface, __FILE__, __LINE__); - //void* test = D2CompileTxtFile(mempool, "PlugY\\statsinterface.txt", TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN)); - //log_msg("D2CompileTxtFile()=0x%08x", test); - if (version_D2Game == V114d) { - loadStatsInterfaceDesc_114(); - } else { - BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, "PlugY\\statsinterface.txt"); - } + BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, STATS_INTERFACE_FILENAME); + //statsInterface = (statsInterfaceBIN*)compileTxtFile(mempool, STATS_INTERFACE_FILENAME, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN)); +/* + int nbSize=0; + char* data = (char*)D2ReadFile(mempool, STATS_INTERFACE_FILENAME, (DWORD*)&nbSize, __FILE__, __LINE__); + if (!data || nbSize <= 0) + { + D2FogAssert("statsinterface.txt missing", D2GetInstructionPointer(), __LINE__); + exit(1); + } + //statsInterface = (statsInterfaceBIN*)compileTxtFile(mempool, STATS_INTERFACE_FILENAME, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN)); + //statsInterface = (statsInterfaceBIN*)compileTxtFile((DWORD)nbSize, data, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN)); +*/ +/* + nbStatsInterface = 0; + for (int i = 0; i lastPage) lastPage = statsInterface[i].page; + + log_msg("loadStatsInterfaceDesc - fin\n"); } void freeStatsInterfaceDesc() @@ -157,21 +128,170 @@ void freeStatsInterfaceDesc() if (statsInterface) { - if (version_D2Game == V114d) { - delete[] statsInterface; - } - else { - D2FogMemDeAlloc(statsInterface, __FILE__, __LINE__, 0); - } + D2FogMemDeAlloc(statsInterface,__FILE__,__LINE__,0); statsInterface = NULL; nbStatsInterface = 0; } } +void printCharacterBreakpoints(Unit* ptChar, DWORD x, DWORD y, DWORD color, LPWSTR lpText) +{ + CharStatsBIN* charStatsBIN = D2GetCharStatsBIN(ptChar->nPlayerClass); + swprintf(lpText, L"%s : %s", getLocalString(STR_BREAKPOINTS), charStatsBIN->nameU); + D2PrintString(lpText, x, y, color, 0); y+=33; + D2SetFont(6); + + LPWSTR sBreakpoint = getLocalString(STR_BREAKPOINT); + LPWSTR sBlockFrames = getLocalString(STR_BLOCK_FRAMES); + LPWSTR sCastingFrames = getLocalString(STR_CASTING_FRAMES); + LPWSTR sHitRecoveryFrames = getLocalString(STR_HIT_RECOVERY_FRAMES); + + LPWSTR s1HSwingingWeapon = getLocalString(STR_1H_SWINGING_WEAPON); + LPWSTR sOtherWeapon = getLocalString(STR_OTHER_WEAPONS); + LPWSTR sHumanForm = getLocalString(STR_HUMAN_FORM); + LPWSTR sBearForm = getLocalString(STR_BEAR_FORM); + LPWSTR sWolfForm = getLocalString(STR_WOLF_FORM); + LPWSTR sVampireForm = getLocalString(STR_VAMPIRE_FORM); + + LPWSTR sHolyShield = D2GetStringFromIndex(0x12EC); + LPWSTR sSpearsAndStaves= getLocalString(STR_SPEARS_AND_STAVES); + LPWSTR sLightningAndChainLightnings = getLocalString(STR_LIGHTNING_CHAIN_LIGHTNING); + + switch (ptChar->nPlayerClass) + { + case D2PC_AMAZON: + swprintf(lpText, L"%s:%s\n%s - %s: %d", sBreakpoint, L"4 6 11 15 23 29 40 56 80 120 200 480", sBlockFrames, s1HSwingingWeapon, 17); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, sOtherWeapon, 5); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 14 22 32 48 68 99 152", sCastingFrames, 19); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sHitRecoveryFrames, 11); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_ASSASSIN: + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, 5); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"8 16 27 42 65 102 174", sCastingFrames, 16); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, 9); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_BARBARIAN: + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 42 86 280", sBlockFrames, 7); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 37 63 105 200", sCastingFrames, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, 9); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_DRUID: + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sBlockFrames, sHumanForm, 11); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 27 40 65 109 223", sBlockFrames, sBearForm, 12); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sBlockFrames, sWolfForm, 9); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"4 10 19 30 46 68 99 163", sCastingFrames, sHumanForm, 18); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 26 40 63 99 163", sCastingFrames, sBearForm, 16); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 14 26 40 60 95 157", sCastingFrames, sWolfForm, 16); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"3 7 13 19 29 42 63 99 174 456", sHitRecoveryFrames, s1HSwingingWeapon, 14); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 26 39 56 86 152 377", sHitRecoveryFrames, sOtherWeapon, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 24 37 54 86 152 360", sHitRecoveryFrames, sBearForm, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"9 20 42 86 280", sHitRecoveryFrames, sWolfForm, 7); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_NECROMANCER: + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sBlockFrames, 11); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"9 18 30 48 75 125", sCastingFrames, sHumanForm, 15); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 11 18 24 35 48 65 86 120 180", sCastingFrames, sVampireForm, 23); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 26 39 56 86 152 377", sHitRecoveryFrames, sHumanForm, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"2 6 10 16 24 34 48 72 117", sHitRecoveryFrames, sVampireForm, 15); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_PALADIN: + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, 5); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"86", sBlockFrames, sHolyShield, 2); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 18 30 48 75 125", sCastingFrames, 15); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"3 7 13 20 32 48 75 129 280", sHitRecoveryFrames, sSpearsAndStaves, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, sOtherWeapon, 9); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + + case D2PC_SORCERESS: + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sBlockFrames, 9); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 37 63 105 200", sCastingFrames, 13); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 23 35 52 78 117 194", sCastingFrames, sLightningAndChainLightnings, 19); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"5 9 14 20 30 42 60 86 142 280", sHitRecoveryFrames, 15); + D2PrintString(lpText, x, y, color, 0); y+=29; + break; + } +} + + +void printMercBreakpoints(Unit* ptChar, DWORD x, DWORD y, DWORD color, LPWSTR lpText) +{ + LPWSTR sBreakpoint = getLocalString(STR_BREAKPOINT); + LPWSTR sCastingFrames = getLocalString(STR_CASTING_FRAMES); + LPWSTR sHitRecoveryFrames = getLocalString(STR_HIT_RECOVERY_FRAMES); + + swprintf(lpText, L"%s : %s", getLocalString(STR_BREAKPOINTS), getLocalString(STR_MERCENARIES)); + D2PrintString(lpText, x, y, color, 0); y+=33; + D2SetFont(6); + + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"8 15 26 39 58 86 138", sCastingFrames, getLocalString(STR_MERC_ACT_3), 17); + D2PrintString(lpText, x, y, color, 0); y+=29; + y+=13; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_1), 11); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 9 14 20 30 42 60 86 142 280", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_2), 15); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 8 13 18 24 32 46 63 86 133 232 600", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_3), 17); + D2PrintString(lpText, x, y, color, 0); y+=29; + swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_5), 9); + D2PrintString(lpText, x, y, color, 0); y+=29; +} + void printStat(Unit* ptChar, DWORD statID, DWORD x, DWORD y, DWORD color, LPWSTR lpText) { LPWSTR text; - log_msg("printStat : %d\n", statID); + switch (statID) { case STATS_FIRERESIST: @@ -179,10 +299,16 @@ void printStat(Unit* ptChar, DWORD statID, DWORD x, DWORD y, DWORD color, LPWSTR case STATS_LIGHTRESIST: case STATS_POISONRESIST: text = D2GetStringFromIndex(getDescStrPos(statID)); - if (wcslen(text) > 50) return; + if (wcslen(text) > BUFSIZE) return; swprintf(lpText, L"%s +%i%%", text, D2GetPlayerStat(ptChar,statID,0)); break; - default: + case 10000: + printCharacterBreakpoints(ptChar, x, y, color, lpText); + return; + case 10001: + printMercBreakpoints(ptChar, x, y, color, lpText); + return; + default: D2PrintStat(ptChar, NULL, statID, 0, D2GetPlayerStat(ptChar,statID,0), lpText);//param2=ptChar->ptStats->ptItemStats } // D2SetFont(1); @@ -275,7 +401,7 @@ void STDCALL printNewStatsPageTwo(int currentPage) setImage(&data, D2LoadBuySelBtn()); setFrame(&data, 10 + isDownBtn.close); D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0); - + //print previous page button setFrame(&data, 12 + isDownBtn.previousPage); D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0); @@ -284,12 +410,11 @@ void STDCALL printNewStatsPageTwo(int currentPage) setFrame(&data, 14 + isDownBtn.nextPage); D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0); - //////////////////// POPUP PRINTING //////////////////// //set MouseX & MouseY DWORD mx = D2GetMouseX(); DWORD my = D2GetMouseY(); - + D2SetFont(1); if (isOnCloseBtn(mx,my)) // print popup "close" diff --git a/PlugY/NewInterfaces.cpp b/PlugY/NewInterfaces.cpp index 8807186..2bcb2f1 100644 --- a/PlugY/NewInterfaces.cpp +++ b/PlugY/NewInterfaces.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Interface functions @@ -57,9 +57,6 @@ int GetCurrentPage() void STDCALL printCustomPage() { if(onRealm) {D2PrintStatsPage();return;} - - //printNewStatsPageTwo(selectedPage); return; - if ( (selectedPage > 0) && (selectedPage<=lastPage) ) printNewStatsPageTwo(selectedPage); else if (selectedPage == lastPage+1) @@ -96,16 +93,18 @@ DWORD STDCALL mouseCustomPageLeftUp(sWinMessage* msg) return -1; } -FCT_ASM( caller_DontPrintBorder_114 ) - MOV ESI, bDontPrintBorder - TEST ESI, ESI - JE printBorder - MOV bDontPrintBorder, 0 - ADD DWORD PTR SS : [ESP], 0x14F - RETN -printBorder : - MOV ESI, DWORD PTR DS : [0x7BEF18] - RETN +FCT_ASM ( caller_DontPrintBorder_114 ) + MOV ECX,bDontPrintBorder + TEST ECX,ECX + JE printBorder + MOV bDontPrintBorder,0 + ADD DWORD PTR SS:[ESP],0xC1 + RETN +printBorder: + POP ECX + PUSH 0x48 + LEA EAX,DWORD PTR SS:[EBP-0x48] + JMP ECX }} FCT_ASM ( caller_DontPrintBorder_111 ) @@ -132,28 +131,28 @@ printBorder: RETN }} -FCT_ASM(caller_mouseCustomPageLeftDown_114) - PUSH EAX - PUSH ESI - CALL mouseCustomPageLeftDown - TEST EAX, EAX - POP EAX - JE end_mouseNewPageLDown - ;JG continue_mouseNewPageLDown - LEA ECX, DWORD PTR DS : [EAX + 0x80] - RETN -continue_mouseNewPageLDown : - POP EAX - ADD EAX, 0x170 - PUSH 0x4A7720 - JMP EAX - RETN -end_mouseNewPageLDown : - POP EDI - POP ESI - POP EBX - POP EBP - RETN 4 +FCT_ASM ( caller_mouseCustomPageLeftDown_114 ) + PUSH EAX + PUSH ESI + CALL mouseCustomPageLeftDown + TEST EAX,EAX + POP EAX + JE end_mouseNewPageLDown + JG continue_mouseNewPageLDown + LEA ECX,DWORD PTR DS:[EAX+0x80] + RETN +continue_mouseNewPageLDown: + POP EAX + ADD EAX,0x172 + PUSH EDI + JMP EAX + RETN +end_mouseNewPageLDown: + ADD ESP,4 + POP ESI + POP EBX + POP EBP + RETN 4 }} @@ -225,26 +224,26 @@ end_mouseNewPageLDown: RETN 4 }} -FCT_ASM(caller_mouseCustomPageLeftUp_114) - PUSH EBP - CALL mouseCustomPageLeftUp - TEST EAX, EAX - JE end_mouseNewPageLUp - ;JG continue_mouseNewPageLUp - MOV EAX, DWORD PTR DS : [ptWindowStartX] - MOV EAX, DWORD PTR DS : [EAX] - RETN -continue_mouseNewPageLUp : - ADD DWORD PTR SS : [ESP], 0x2C4 - RETN -end_mouseNewPageLUp : - ADD ESP, 4 - POP EDI - POP ESI - POP EBX - MOV ESP, EBP - POP EBP - RETN 4 +FCT_ASM ( caller_mouseCustomPageLeftUp_114 ) + PUSH EBP + CALL mouseCustomPageLeftUp + TEST EAX,EAX + JE end_mouseNewPageLUp + JG continue_mouseNewPageLUp + MOV EAX,DWORD PTR DS:[ptWindowStartX] + MOV EAX,DWORD PTR DS:[EAX] + RETN +continue_mouseNewPageLUp: + ADD DWORD PTR SS:[ESP],0x17D + RETN +end_mouseNewPageLUp: + ADD ESP,4 + POP EDI + POP ESI + POP EBX + MOV ESP,EBP + POP EBP + RETN 4 }} FCT_ASM ( caller_mouseCustomPageLeftUp_111 ) @@ -317,10 +316,17 @@ end_mouseNewPageLUp: -FCT_ASM( caller_resetSelectedPageByToolBar_114 ) - MOV selectedPage, 0 - MOV EDX, 2 - RETN +FCT_ASM ( caller_resetSelected_114 ) + CMP ECX,2 + JNZ NO_RESET + MOV selectedPage, 0 +NO_RESET: + POP EAX + PUSH EBX + PUSH ESI + PUSH EDI + MOV EDI,ECX + JMP EAX }} @@ -333,13 +339,6 @@ noJump: RETN }} -FCT_ASM( caller_resetSelectedPageByKey_114 ) - MOV selectedPage, 0 - MOV EDX, DWORD PTR DS : [ECX * 4 + 0x712698] - RETN -}} - - FCT_ASM ( caller_resetSelectedPageByKey ) MOV selectedPage,0 POP EAX @@ -377,12 +376,22 @@ void Install_NewInterfaces() if (selectMainPageOnOpenning) { - if ( version_D2Client >= V111 ) + if ( version_D2Client >= V114a ) { - // Reset selectedPage variable on opening stats page - mem_seek R8(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE, 7EC7A); - memt_byte( version_D2Client == V114d ? 0xBA : 0x83, 0xE8 ); // CALL caller_resetSelectedPage - MEMT_REF4( version_D2Client == V114d ? 0x00000002 : 0x1F7426F8, version_D2Client == V114d ? caller_resetSelectedPageByToolBar_114 : caller_resetSelectedPageByToolBar); + mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 55F24); + memt_byte( 0x53, 0xE8 ); // CALL caller_resetSelectedPage + MEMT_REF4( 0xF98B5756, caller_resetSelected_114); + //00455F24 |. 53 PUSH EBX + //00455F25 |. 56 PUSH ESI + //00455F26 |. 57 PUSH EDI + //00455F27 |. 8BF9 MOV EDI,ECX + } + else if ( version_D2Client >= V111 ) + { + //Reset selectedPage variable on opening stats page + mem_seek R8(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE, 7EC5C); + memt_byte( version_D2Client == V114d ? 0xB9 : 0x83, 0xE8 ); // CALL caller_resetSelectedPage + MEMT_REF4( version_D2Client == V114d ? 0x00000002 : 0x1F7426F8, caller_resetSelectedPageByToolBar); //6FAFB79E > 83F8 26 CMP EAX,26 //6FAFB7A1 . 74 1F JE SHORT D2Client.6FAFB7C2 //6FB3F73E > 83F8 26 CMP EAX,26 @@ -393,18 +402,13 @@ void Install_NewInterfaces() //6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82 //6FB741FE > 83F8 26 CMP EAX,26 //6FB74201 . 74 1F JE SHORT D2Client.6FB05E32 + //6FB741FE > 83F8 26 CMP EAX,26 + //6FB74201 . 74 1F JE SHORT D2Client.6FB74222 + //0047EC5C > B9 02000000 MOV ECX,2 - mem_seek R8(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A, 6A91D); - if (version_D2Client == V114d) { - memt_byte(0x8B, 0x90); - memt_byte(0x14, 0x90); - memt_byte(0x8D, 0xE8); - MEMT_REF4(0x00712698, caller_resetSelectedPageByKey_114); - } - else { - memt_byte(0x55, 0xE8); // CALL caller_resetSelectedPage - MEMT_REF4(0xD53BED33, caller_resetSelectedPageByKey); - } + mem_seek R8(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A, 0000); + memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage + MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey); //6FACE55A . 55 PUSH EBP //6FACE55B . 33ED XOR EBP,EBP //6FACE55D . 3BD5 CMP EDX,EBP @@ -448,29 +452,27 @@ void Install_NewInterfaces() // Print custom page mem_seek R8(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549, 57052); - if (version_D2Client == V114d) { - MEMT_REF4(0x00050CAA, printCustomPage); - } else { - MEMC_REF4(D2PrintStatsPage, printCustomPage); - } + 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 + //00457051 |. E8 AA0C0500 CALL Game.004A7D00 // Don't print Border - mem_seek R8(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6, 98707); - memt_byte( version_D2Client == V114d ? 0x8B : 0xB9, 0xE8 ); // CALL caller_DontPrintBorder - MEMT_REF4( version_D2Client == V114d ? 0x7BEF1835 : 0x00000012, version_D2Client == V114d ? caller_DontPrintBorder_114 : version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder); - if (version_D2Client == V114d) memt_byte(0x00, 0x90); - //6FAFF4C6 > B9 12000000 MOV ECX,12 + mem_seek R8(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6, 98636); + memt_byte( version_D2Client >= V114d ? 0x6A : 0xB9, 0xE8 ); // CALL caller_DontPrintBorder + MEMT_REF4( version_D2Client >= V114d ? 0xB8458D48 : 0x00000012, version_D2Client >= V114d ? caller_DontPrintBorder_114 : version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder); + //6FAFF4C6 > B9 12000000 MOV ECX,12 //6FADD366 |. B9 12000000 MOV ECX,12 //6FB65A46 |. B9 12000000 MOV ECX,12 //6FB32166 |. B9 12000000 MOV ECX,12 //6FAD71C6 |. B9 12000000 MOV ECX,12 //6FB1D2B6 |. B9 12000000 MOV ECX,12 + //00498636 |. 6A 48 PUSH 48 + //00498638 |. 8D45 B8 LEA EAX,DWORD PTR SS:[EBP-48] // Manage mouse down (Play sound) mem_seek R8(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6, A7731); @@ -483,18 +485,19 @@ void Install_NewInterfaces() //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] + //004A7731 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] // Manage mouse up mem_seek R8(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459, A78DA); memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp - MEMT_REF4( ptWindowStartX, version_D2Client == V114d ? caller_mouseCustomPageLeftUp_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9); + MEMT_REF4( ptWindowStartX, version_D2Client >= V114d ? caller_mouseCustomPageLeftUp_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9); //6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748] //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] //6FB70459 . A1 54D3BC6F MOV EAX,DWORD PTR DS:[6FBCD354] - + //004A78DA |. A1 58287A00 MOV EAX,DWORD PTR DS:[7A2858] // open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP //6FB2347D |. 8914B5 A8A6BB6F MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EDX diff --git a/PlugY/OthersFeatures.cpp b/PlugY/OthersFeatures.cpp index 967fdfc..75758a7 100644 --- a/PlugY/OthersFeatures.cpp +++ b/PlugY/OthersFeatures.cpp @@ -9,7 +9,6 @@ bool active_othersFeatures = false; - /* // Remove protect on the save file .d2s mem_seek( offset_D2Game + 0x77080);//6FC8DD5E-6FAA0000 @@ -22,7 +21,7 @@ void Install_ChangeResolution() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2gfx for . (ChangeResolution)\n"); // execute if it's our packet else continue @@ -98,7 +97,7 @@ void Install_Test2() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Game. (Test)\n"); // Test @@ -111,8 +110,6 @@ void Install_Test2() isInstalled = true; }*/ /////////////////////////////////////////////////////////////////////////////////////////////// - - void Install_OthersFeatures() { static int isInstalled = false; @@ -120,6 +117,7 @@ void Install_OthersFeatures() log_msg("Patch. (OthersFeatures)\n"); +// Install_RemoveExperienceDiminushingReturn(); // Install_ChangeResolution(); // Install_Test(); diff --git a/PlugY/Parameters.cpp b/PlugY/Parameters.cpp index fa87c8e..9a0bfa2 100644 --- a/PlugY/Parameters.cpp +++ b/PlugY/Parameters.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add DoNotCloseNihlathakPortal by haxifix. Loading parameters from ini file. @@ -13,9 +14,9 @@ #include -#define PARAMETERS_FILENAME "PlugY.ini" -#define PARAM_FIXED_FILENAME "PlugY\\PlugYFixed.ini" -#define PARAM_DEFAULT_FILENAME "PlugY\\PlugYDefault.ini" +const char* PARAMETERS_FILENAME = "PlugY.ini"; +const char* PARAM_FIXED_FILENAME = "PlugY\\PlugYFixed.ini"; +const char* PARAM_DEFAULT_FILENAME = "PlugY\\PlugYDefault.ini"; #define BUFSIZE 0x400 @@ -35,6 +36,7 @@ #include "commands.h" #include "language.h" #include "windowed.h" +#include "savePlayerData.h" char* modDataDirectory = "PlugY"; @@ -48,13 +50,13 @@ TargetMod selectModParam = MOD_NO; const char* S_GENERAL = "GENERAL"; -const char* S_dllFilenames = "DllToLoad"; -const char* S_dllFilenames2 = "DllToLoad2"; const char* S_active_plugin = "ActivePlugin"; const char* S_active_DisableBattleNet = "DisableBattleNet"; const char* S_active_logFile = "ActiveLogFile"; -const char* S_active_CheckMemory = "ActiveCheckMemory"; +const char* S_dllFilenames = "DllToLoad"; +const char* S_dllFilenames2 = "DllToLoad2"; const char* S_active_Commands = "ActiveCommands"; +const char* S_active_CheckMemory = "ActiveCheckMemory"; const char* S_active_othersFeatures = "ActiveAllOthersFeatures"; const char* S_WINDOWED = "WINDOWED"; @@ -79,44 +81,76 @@ const char* S_availableLanguages = "AvailableLanguages"; const char* S_SAVEPATH = "SAVEPATH"; const char* S_active_changingSavePath = "ActiveSavePathChange"; const char* S_savePath = "SavePath"; +const char* S_active_AutoBackup = "ActiveAutoBackup"; +const char* S_maxBackupPerCharacter = "MaxBackupPerCharacter"; const char* S_MAIN_SCREEN = "MAIN SCREEN"; const char* S_active_VersionTextChange = "ActiveVersionTextChange"; -const char* S_active_VersionTextChanges = "ActiveVersionTextChanges"; const char* S_versionText = "VersionText"; const char* S_modVersionColor = "ColorOfVersionText"; const char* S_active_PrintPlugYVersion = "ActivePrintPlugYVersion"; const char* S_colorOfPlugYVersion = "ColorOfPlugYVersion"; const char* S_STASH = "STASH"; +const char* S_active_bigStash = "ActiveBigStash"; const char* S_active_multiPageStash = "ActiveMultiPageStash"; -const char* S_maxSelfPages = "MaxPersonnalPages"; const char* S_nbPagesPerIndex = "NbPagesPerIndex"; const char* S_nbPagesPerIndex2 = "NbPagesPerIndex2"; -const char* S_active_sharedStash = "ActiveSharedStash"; -const char* S_openSharedStashOnLoading = "OpenSharedStashOnLoading"; -const char* S_maxSharedPages = "MaxSharedPages"; -const char* S_sharedStashFilename = "SharedStashFilename"; -const char* S_separateHardSoftStash = "SeparateHardcoreStash"; -const char* S_active_bigStash = "ActiveBigStash"; -const char* S_displaySharedSetItemNameInGreen = "DisplaySharedSetItemNameInGreen"; -const char* S_active_sharedGold = "ActiveSharedGold"; +const char* S_maxSelfPages = "MaxPersonnalPages"; +const char* S_autoRenameStashPage = "AutoRenameStashPage"; +const char* S_PersonalNormalPageColor = "PersonalNormalPageColor"; +const char* S_PersonalIndexPageColor = "PersonalIndexPageColor"; +const char* S_PersonalMainIndexPageColor = "PersonalMainIndexPageColor"; +const char* S_SharedNormalPageColor = "SharedNormalPageColor"; +const char* S_SharedIndexPageColor = "SharedIndexPageColor"; +const char* S_SharedMainIndexPageColor = "SharedMainIndexPageColor"; +const char* S_active_sharedStash = "ActiveSharedStash"; +const char* S_active_SharedStashInMultiPlayer = "ActiveSharedStashInMultiPlayer"; +const char* S_separateHardSoftStash = "SeparateHardcoreStash"; +const char* S_openSharedStashOnLoading = "OpenSharedStashOnLoading"; +const char* S_sharedStashFilename = "SharedStashFilename"; +const char* S_displaySharedSetItemNameInGreen = "DisplaySharedSetItemNameInGreen"; +const char* S_maxSharedPages = "MaxSharedPages"; +const char* S_active_sharedGold = "ActiveSharedGold"; const char* S_posXPreviousBtn = "PosXPreviousBtn"; const char* S_posYPreviousBtn = "PosYPreviousBtn"; +const char* S_posWPreviousBtn = "PosWPreviousBtn"; +const char* S_posHPreviousBtn = "PosHPreviousBtn"; const char* S_posXNextBtn = "PosXNextBtn"; const char* S_posYNextBtn = "PosYNextBtn"; +const char* S_posWNextBtn = "PosWNextBtn"; +const char* S_posHNextBtn = "PosHNextBtn"; const char* S_posXSharedBtn = "PosXSharedBtn"; const char* S_posYSharedBtn = "PosYSharedBtn"; +const char* S_posWSharedBtn = "PosWSharedBtn"; +const char* S_posHSharedBtn = "PosHSharedBtn"; const char* S_posXPreviousIndexBtn = "PosXPreviousIndexBtn"; const char* S_posYPreviousIndexBtn = "PosYPreviousIndexBtn"; +const char* S_posWPreviousIndexBtn = "PosWPreviousIndexBtn"; +const char* S_posHPreviousIndexBtn = "PosHPreviousIndexBtn"; const char* S_posXNextIndexBtn = "PosXNextIndexBtn"; const char* S_posYNextIndexBtn = "PosYNextIndexBtn"; +const char* S_posWNextIndexBtn = "PosWNextIndexBtn"; +const char* S_posHNextIndexBtn = "PosHNextIndexBtn"; const char* S_posXPutGoldBtn = "PosXPutGoldBtn"; const char* S_posYPutGoldBtn = "PosYPutGoldBtn"; +const char* S_posWPutGoldBtn = "PosWPutGoldBtn"; +const char* S_posHPutGoldBtn = "PosHPutGoldBtn"; const char* S_posXTakeGoldBtn = "PosXTakeGoldBtn"; const char* S_posYTakeGoldBtn = "PosYTakeGoldBtn"; +const char* S_posWTakeGoldBtn = "PosWTakeGoldBtn"; +const char* S_posHTakeGoldBtn = "PosHTakeGoldBtn"; +const char* S_posXStashNameField = "PosXStashNameField"; +const char* S_posYStashNameField = "PosYStashNameField"; +const char* S_posWStashNameField = "PosWStashNameField"; +const char* S_posHStashNameField = "PosHStashNameField"; +const char* S_posXStashGoldField = "PosXStashGoldField"; +const char* S_posYStashGoldField = "PosYStashGoldField"; +const char* S_posWStashGoldField = "PosWStashGoldField"; +const char* S_posHStashGoldField = "PosHStashGoldField"; + const char* S_STATS_POINTS = "STATS POINTS"; const char* S_active_StatsPoints = "ActiveStatsUnassignment"; @@ -124,14 +158,20 @@ const char* S_keyUsedForUnassignStatPoint = "KeyUsed"; const char* S_active_StatsShiftClickLimit = "ActiveShiftClickLimit"; const char* S_limitValueToShiftClick = "LimitValueToShiftClick"; -const char* S_SKILL_ON_LEVEL_UP = "SKILL ON LEVEL UP"; -const char* S_active_SkillPerLevelUpChange = "ActiveSkillPerLevelUp"; -const char* S_skillPerLevelUp = "SkillPerLevelUp"; - const char* S_STAT_ON_LEVEL_UP = "STAT ON LEVEL UP"; const char* S_active_StatPerLevelUpChange = "ActiveStatPerLevelUp"; const char* S_statPerLevelUp = "StatPerLevelUp"; +const char* S_SKILLS_POINTS = "SKILLS POINTS"; +const char* S_active_SkillsPoints = "ActiveSkillsUnassignment"; +const char* S_unassignSkillsPointsOneForOne = "ActiveSkillsUnassignmentOneForOne"; +const char* S_posXUnassignSkillBtn = "PosXUnassignSkillBtn"; +const char* S_posYUnassignSkillBtn = "PosYUnassignSkillBtn"; + +const char* S_SKILL_ON_LEVEL_UP = "SKILL ON LEVEL UP"; +const char* S_active_SkillPerLevelUpChange = "ActiveSkillPerLevelUp"; +const char* S_skillPerLevelUp = "SkillPerLevelUp"; + const char* S_WORLD_EVENT = "WORLD EVENT"; const char* S_active_WorldEvent = "ActiveWorldEvent"; const char* S_showSOJSoldCounterInAllDiff = "ShowCounterInAllDifficulty"; @@ -148,12 +188,27 @@ const char* S_timeBeforeAutoSellDelta = "TimeBeforeAutoSellMax"; const char* S_UBER_QUEST = "UBER QUEST"; const char* S_active_UberQuest = "ActiveUberQuest"; +const char* S_UberMephistoX = "UberMephistoX"; +const char* S_UberMephistoY = "UberMephistoY"; +const char* S_UberDiabloX = "UberDiabloX"; +const char* S_UberDiabloY = "UberDiabloY"; +const char* S_UberBaalX = "UberBaalX"; +const char* S_UberBaalY = "UberBaalY"; -const char* S_SKILLS_POINTS = "SKILLS POINTS"; -const char* S_active_SkillsPoints = "ActiveSkillsUnassignment"; -const char* S_unassignSkillsPointsOneByOne = "ActiveSkillsUnassignmentOneByOne"; -const char* S_posXUnassignSkillBtn = "PosXUnassignSkillBtn"; -const char* S_posYUnassignSkillBtn = "PosYUnassignSkillBtn"; +const char* S_active_UberMinions = "ActiveUberMinions"; +//const char* S_UberMephistoMinions = "UberMephistoMinions"; +const char* S_UberMephistoSpawnPercent = "UberMephistoSpawnPercent"; +const char* S_UberMephistoSpawnRadius = "UberMephistoSpawnRadius"; +//const char* S_UberBaalMinions = "UberBaalMinions"; +const char* S_UberBaalSpawnPercent = "UberBaalSpawnPercent"; +const char* S_UberBaalSpawnRadius = "UberBaalSpawnRadius"; +//const char* S_UberDiabloMinions = "UberDiabloMinions"; +const char* S_UberDiabloSpawnPercent = "UberDiabloSpawnPercent"; +const char* S_UberDiabloSpawnRadius = "UberDiabloSpawnRadius"; +const char* S_active_UberDiabloRushTweekAI = "ActiveUberDiabloRushTweekAI"; +const char* S_active_UberBaalTeleportTweekAI = "ActiveUberBaalTeleportTweekAI"; +const char* S_active_UberBaalChillingArmorTweekAI = "ActiveUberBaalChillingArmorTweekAI"; +const char* S_uberBaalChillingArmorTimer = "UberBaalChillingArmorTimer"; const char* S_INTERFACE = "INTERFACE"; const char* S_active_newInterfaces = "ActiveNewStatsInterface"; @@ -161,16 +216,18 @@ const char* S_selectMainPageOnOpenning = "SelectMainPageOnOpenning"; const char* S_printBackgroundOnMainPage = "PrintButtonsBackgroundOnMainStatsPage"; const char* S_EXTRA = "EXTRA"; +const char* S_active_RunLODs = "ActiveLaunchAnyNumberOfLOD"; const char* S_active_alwaysRegenMapInSP = "AlwaysRegenMapInSP"; const char* S_nbPlayersCommandByDefault = "NBPlayersByDefault"; const char* S_active_DisplayItemLevel = "ActiveDisplayItemLevel"; -const char* S_active_RunLODs = "ActiveLaunchAnyNumberOfLOD"; const char* S_active_AlwaysDisplayLifeMana = "AlwaysDisplayLifeAndManaValues"; const char* S_active_EnabledTXTFilesWithMSExcel= "EnabledTXTFilesWhenMSExcelOpenIt"; const char* S_active_DisplayBaseStatsValue = "ActiveDisplayBaseStatsValue"; const char* S_active_LadderRunewords = "ActiveLadderRunewords"; const char* S_active_EnabledCowPortalWhenCowKingWasKill = "ActiveCowPortalWhenCowKingWasKilled"; const char* S_active_DoNotCloseNihlathakPortal = "ActiveDoNotCloseNihlathakPortal"; +const char* S_active_MoveCainNearHarrogathWaypoint = "MoveCainNearHarrogathWaypoint"; +const char* S_active_RemoveExperienceDiminushingReturn = "RemoveExperienceDiminushingReturn"; const char* S_DLL = "DLL:\t"; const char* S_DEFAULT = "DEFAULT:"; @@ -207,6 +264,13 @@ else log_msg(S_DEFAULT); \ else log_msg(S_FIXED); \ else log_msg(S_USER) +int getColor(char* buffer) +{ + int val = atoi(buffer); + if (val < 1 || val > 19 || val == 17) + return 0; + return val; +} void init_ActivePlugin(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { @@ -227,8 +291,18 @@ void init_General(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFi log_msg("active_DisableBattleNet\t\t= %d\n", active_DisableBattleNet); GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_logFile, "0"); - active_logFile = atoi(buffer)+1; - log_msg("active_logFile\t\t\t\t= %d\n", active_logFile-1); + active_logFile = atoi(buffer) + 1; + log_msg("active_logFile\t\t\t\t= %d\n", active_logFile); + + GET_PRIVATE_PROFILE_STRING(S_GENERAL,S_dllFilenames,""); + strcat(buffer,"|"); + char* buf = &buffer[strlen(buffer)]; + if (!iniFixedFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize)) + if (!iniFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize)) + iniDefaultFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize); + dllFilenames = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0); + strcpy(dllFilenames,buffer); + log_msg("dllFilenames\t\t\t\t= %s\n", dllFilenames); GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_Commands, "0"); active_Commands = atoi(buffer) != 0; @@ -242,17 +316,6 @@ void init_General(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFi active_othersFeatures = atoi(buffer) != 0; log_msg("active_othersFeatures\t\t= %u\n", active_othersFeatures); - GET_PRIVATE_PROFILE_STRING(S_GENERAL,S_dllFilenames,""); - strcat(buffer,"|"); - char* buf = &buffer[strlen(buffer)]; - if (!iniFixedFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize)) - if (!iniFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize)) - iniDefaultFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize); - dllFilenames = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0); - strcpy(dllFilenames,buffer); - - log_msg("dllFilenames\t\t\t\t= %s\n",dllFilenames); - log_msg("\n"); } @@ -277,7 +340,7 @@ void init_Windowed(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_SetWindowPos, "0"); active_SetWindowPos = atoi(buffer) != 0; - log_msg("active_MoveAndResizeWindow\t= %d\n", active_SetWindowPos); + log_msg("active_SetWindowPos\t= %d\n", active_SetWindowPos); GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_X, "0"); windowedX = atoi(buffer); @@ -287,11 +350,11 @@ void init_Windowed(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF windowedY = atoi(buffer); log_msg("windowedY\t\t\t\t\t= %d\n", windowedY); - GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Width, "0"); + GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Width, "800"); windowedWidth = atoi(buffer); log_msg("windowedWidth\t\t\t\t= %d\n", windowedWidth); - GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Height, "0"); + GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Height, "600"); windowedHeight = atoi(buffer); log_msg("windowedHeight\t\t\t\t= %d\n", windowedHeight); @@ -388,7 +451,6 @@ void init_ActiveLanguage(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDe log_msg("\n"); } - void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_active_changingSavePath, "0"); @@ -416,7 +478,6 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF { active_changingSavePath = false; log_msg("active_changingSavePath\t\t= %u (no valid savePath)\n\n", active_changingSavePath); -// log_msg("\tsavePath\t\t\t= %s\n", savePath); return; } @@ -424,7 +485,7 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF { char buf[MAX_PATH]; buf[0]=NULL; - D2FogGetInstallPath(buf,MAX_PATH); + D2FogGetSavePath(buf,MAX_PATH); savePath = (char*)D2FogMemAlloc(strlen(buf) + curSize - start + 1,__FILE__,__LINE__,0); strcpy(savePath,buf); strcat(savePath,&buffer[start]); @@ -434,10 +495,18 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF } log_msg("savePath\t\t\t\t\t= %s\n", savePath); } + + GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_active_AutoBackup, "0"); + active_AutoBackup = atoi(buffer) != 0; + log_msg("active_autoBackup\t\t= %u\n", active_AutoBackup); + + GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_maxBackupPerCharacter, "5"); + maxBackupPerCharacter = atoi(buffer); + log_msg("maxBackupPerCharacter\t\t= %u\n", maxBackupPerCharacter); + log_msg("\n"); } - void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_active_VersionTextChange, "0"); @@ -449,29 +518,31 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_versionText, versionText); if (!buffer[0]) { - switch(version_D2Game) - { - //case V107: //"v 1.07" - //case V108: //"v 1.08" - //case V109: //"v 1.09" - case V109b: //"v 1.09" - case V109d: //"v 1.09" - //case V110: //"v 1.10" - //case V111: //"v 1.11" - case V111b: //"v 1.11" - //case V112: //"v 1.12" - case V113c: //"v 1.13" - case V113d: //"v 1.13" - case V114a: //"v 1.14" - //case V114b: //"v 1.14b" - //case V114c: //"v 1.14c" - //case V114d: //"v 1.14d" - strcpy(buffer, "v "); - strcat(buffer, GetVersionString(version_D2Game)); - break; - default: - active_VersionTextChange=0; - } + strcpy(buffer, "v "); + strcat(buffer, GetVersionString(version_D2Game)); + //switch(version_D2Game) + //{ + ////case V107: //"v 1.07" + ////case V108: //"v 1.08" + ////case V109: //"v 1.09" + //case V109b: //"v 1.09" + //case V109d: //"v 1.09" + ////case V110: //"v 1.10" + ////case V111: //"v 1.11" + //case V111b: //"v 1.11" + ////case V112: //"v 1.12" + //case V113c: //"v 1.13" + //case V113d: //"v 1.13" + //case V114a: //"v 1.14" + ////case V114b: //"v 1.14b" + ////case V114c: //"v 1.14c" + ////case V114d: //"v 1.14d" + // strcpy(buffer, "v "); + // strcat(buffer, GetVersionString(version_D2Game)); + // break; + //default: + // active_VersionTextChange=0; + //} } versionText = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0); @@ -479,7 +550,7 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau log_msg("versionText\t\t\t\t\t= %s\n", versionText); GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_modVersionColor, "0"); - modVersionColor = atoi(buffer); + modVersionColor = getColor(buffer); log_msg("modVersionColor\t\t\t\t= %u\n", modVersionColor); } @@ -490,10 +561,10 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau if (active_PrintPlugYVersion) { GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_colorOfPlugYVersion, "4"); - colorOfPlugYVersion = atoi(buffer); + colorOfPlugYVersion = getColor(buffer); log_msg("colorOfPlugYVersion\t\t\t= %u\n", colorOfPlugYVersion); } - + log_msg("\n"); } @@ -510,11 +581,6 @@ void init_Stash(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile if (active_multiPageStash) { active_PlayerCustomData = true; -// log_msg("active_PlayerCustomData\t\t= %d\n", active_PlayerCustomData); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSelfPages, "0"); - maxSelfPages = atoi(buffer) - 1; - log_msg("maxSelfPages\t\t\t\t= %u\n", maxSelfPages); GET_PRIVATE_PROFILE_STRING(S_STASH, S_nbPagesPerIndex, "10"); nbPagesPerIndex = atoi(buffer); @@ -526,69 +592,177 @@ void init_Stash(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile if (!nbPagesPerIndex2) nbPagesPerIndex2=100; log_msg("nbPagesPerIndex2\t\t\t= %u\n", nbPagesPerIndex2); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSelfPages, "0"); + maxSelfPages = atoi(buffer) - 1; + log_msg("maxSelfPages\t\t\t\t= %u\n", maxSelfPages); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_autoRenameStashPage, "0"); + autoRenameStashPage = atoi(buffer) != 0; + log_msg("autoRenameStashPage\t\t\t= %d\n", autoRenameStashPage); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalNormalPageColor, "0"); + PersonalNormalPageColor = getColor(buffer); + log_msg("PersonalNormalPageColor\t\t\t= %d\n", PersonalNormalPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalIndexPageColor, "12"); + PersonalIndexPageColor = getColor(buffer); + log_msg("PersonalIndexPageColor\t\t\t= %d\n", PersonalIndexPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalMainIndexPageColor, "9"); + PersonalMainIndexPageColor = getColor(buffer); + log_msg("PersonalMainIndexPageColor\t\t\t= %d\n", PersonalMainIndexPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedNormalPageColor, "4"); + SharedNormalPageColor = getColor(buffer); + log_msg("SharedNormalPageColor\t\t\t= %d\n", SharedNormalPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedIndexPageColor, "8"); + SharedIndexPageColor = getColor(buffer); + log_msg("SharedIndexPageColor\t\t\t= %d\n", SharedIndexPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedMainIndexPageColor, "1"); + SharedMainIndexPageColor = getColor(buffer); + log_msg("SharedMainIndexPageColor\t\t\t= %d\n", SharedMainIndexPageColor); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedStash, "0"); active_sharedStash = atoi(buffer) != 0; log_msg("active_sharedStash\t\t\t= %u\n", active_sharedStash); + if (active_sharedStash) + { + GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_SharedStashInMultiPlayer, "0"); + active_SharedStashInMultiPlayer = atoi(buffer) ? 2 : 1; + log_msg("active_SharedStashInMultiPlayer = %u\n", active_SharedStashInMultiPlayer); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_separateHardSoftStash, "1"); + separateHardSoftStash = atoi(buffer) != 0; + log_msg("separateHardSoftStash\t\t= %u\n", separateHardSoftStash); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_openSharedStashOnLoading, "0"); + openSharedStashOnLoading = atoi(buffer) != 0; + log_msg("openSharedStashOnLoading\t\t= %u\n", openSharedStashOnLoading); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_sharedStashFilename, "SharedStashSave"); + sharedStashFilename = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0); + strcpy(sharedStashFilename, buffer); + log_msg("sharedStashFilename\t\t\t= %s\n", sharedStashFilename); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_displaySharedSetItemNameInGreen, "1"); + displaySharedSetItemNameInGreen = atoi(buffer) != 0; + log_msg("displaySharedSetItemNameInGreen = %u\n", displaySharedSetItemNameInGreen); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSharedPages, "0"); + maxSharedPages = atoi(buffer) - 1; + log_msg("maxSharedPages\t\t\t\t= %u\n", maxSharedPages); + + GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedGold, "1"); + active_sharedGold = atoi(buffer) != 0; + log_msg("active_sharedGold\t\t\t= %u\n", active_sharedGold); + } + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousBtn,"-1"); posXPreviousBtn = atoi(buffer); + log_msg("posXPreviousBtn\t\t\t= %d\n", posXPreviousBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousBtn,"-1"); posYPreviousBtn = atoi(buffer); + log_msg("posYPreviousBtn\t\t\t= %d\n", posYPreviousBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPreviousBtn,"32"); + posWPreviousBtn = atoi(buffer); + log_msg("posWPreviousBtn\t\t\t= %d\n", posWPreviousBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPreviousBtn,"32"); + posHPreviousBtn = atoi(buffer); + log_msg("posHPreviousBtn\t\t\t= %d\n", posHPreviousBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextBtn,"-1"); posXNextBtn = atoi(buffer); + log_msg("posXNextBtn\t\t\t= %d\n", posXNextBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextBtn,"-1"); posYNextBtn = atoi(buffer); + log_msg("posYNextBtn\t\t\t= %d\n", posYNextBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWNextBtn,"32"); + posWNextBtn = atoi(buffer); + log_msg("posWNextBtn\t\t\t= %d\n", posWNextBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHNextBtn,"32"); + posHNextBtn = atoi(buffer); + log_msg("posHNextBtn\t\t\t= %d\n", posHNextBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXSharedBtn,"-1"); posXSharedBtn = atoi(buffer); + log_msg("posXSharedBtn\t\t\t= %d\n", posXSharedBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYSharedBtn,"-1"); posYSharedBtn = atoi(buffer); + log_msg("posYSharedBtn\t\t\t= %d\n", posYSharedBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWSharedBtn,"32"); + posWSharedBtn = atoi(buffer); + log_msg("posWSharedBtn\t\t\t= %d\n", posWSharedBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHSharedBtn,"32"); + posHSharedBtn = atoi(buffer); + log_msg("posHSharedBtn\t\t\t= %d\n", posHSharedBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousIndexBtn,"-1"); posXPreviousIndexBtn = atoi(buffer); + log_msg("posXPreviousIndexBtn\t\t\t= %d\n", posXPreviousIndexBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousIndexBtn,"-1"); posYPreviousIndexBtn = atoi(buffer); + log_msg("posYPreviousIndexBtn\t\t\t= %d\n", posYPreviousIndexBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPreviousIndexBtn,"32"); + posWPreviousIndexBtn = atoi(buffer); + log_msg("posWPreviousIndexBtn\t\t\t= %d\n", posWPreviousIndexBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPreviousIndexBtn,"32"); + posHPreviousIndexBtn = atoi(buffer); + log_msg("posHPreviousIndexBtn\t\t\t= %d\n", posHPreviousIndexBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextIndexBtn,"-1"); posXNextIndexBtn = atoi(buffer); + log_msg("posXNextIndexBtn\t\t\t= %d\n", posXNextIndexBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextIndexBtn,"-1"); posYNextIndexBtn = atoi(buffer); + log_msg("posYNextIndexBtn\t\t\t= %d\n", posYNextIndexBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWNextIndexBtn,"32"); + posWNextIndexBtn = atoi(buffer); + log_msg("posWNextIndexBtn\t\t\t= %d\n", posWNextIndexBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHNextIndexBtn,"32"); + posHNextIndexBtn = atoi(buffer); + log_msg("posHNextIndexBtn\t\t\t= %d\n", posHNextIndexBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPutGoldBtn,"-1"); posXPutGoldBtn = atoi(buffer); + log_msg("posXPutGoldBtn\t\t\t= %d\n", posXPutGoldBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPutGoldBtn,"-1"); posYPutGoldBtn = atoi(buffer); + log_msg("posYPutGoldBtn\t\t\t= %d\n", posYPutGoldBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPutGoldBtn,"32"); + posWPutGoldBtn = atoi(buffer); + log_msg("posWPutGoldBtn\t\t\t= %d\n", posWPutGoldBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPutGoldBtn,"32"); + posHPutGoldBtn = atoi(buffer); + log_msg("posHPutGoldBtn\t\t\t= %d\n", posHPutGoldBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXTakeGoldBtn,"-1"); posXTakeGoldBtn = atoi(buffer); + log_msg("posXTakeGoldBtn\t\t\t= %d\n", posXTakeGoldBtn); GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYTakeGoldBtn,"-1"); posYTakeGoldBtn = atoi(buffer); - - log_msg("\t Buttons Positions: %d %d %d %d %d %d %d %d %d %d\n",posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn,posYSharedBtn,posXPreviousIndexBtn,posYPreviousIndexBtn,posXNextIndexBtn,posYNextIndexBtn); - - } - - if (active_sharedStash) - { - GET_PRIVATE_PROFILE_STRING(S_STASH, S_openSharedStashOnLoading, "0"); - openSharedStashOnLoading = atoi(buffer) != 0; - log_msg("openSharedStashOnLoading\t\t= %u\n", openSharedStashOnLoading); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSharedPages, "0"); - maxSharedPages = atoi(buffer) - 1; - log_msg("maxSharedPages\t\t\t\t= %u\n", maxSharedPages); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_sharedStashFilename, "SharedStashSave"); - sharedStashFilename = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0); - strcpy(sharedStashFilename, buffer); - log_msg("sharedStashFilename\t\t\t= %s\n", sharedStashFilename); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_separateHardSoftStash, "1"); - separateHardSoftStash = atoi(buffer) != 0; - log_msg("separateHardSoftStash\t\t= %u\n", separateHardSoftStash); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_displaySharedSetItemNameInGreen, "1"); - displaySharedSetItemNameInGreen = atoi(buffer) != 0; - log_msg("displaySharedSetItemNameInGreen = %u\n", displaySharedSetItemNameInGreen); - - GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedGold, "1"); - active_sharedGold = atoi(buffer) != 0; - log_msg("active_sharedGold\t\t\t= %u\n", active_sharedGold); + log_msg("posYTakeGoldBtn\t\t\t= %d\n", posYTakeGoldBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWTakeGoldBtn,"32"); + posWTakeGoldBtn = atoi(buffer); + log_msg("posWTakeGoldBtn\t\t\t= %d\n", posWTakeGoldBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHTakeGoldBtn,"32"); + posHTakeGoldBtn = atoi(buffer); + log_msg("posHTakeGoldBtn\t\t\t= %d\n", posHTakeGoldBtn); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXStashNameField,"-1"); + posXStashNameField = atoi(buffer); + log_msg("posXStashNameField\t\t\t= %d\n", posXStashNameField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYStashNameField,"-1"); + posYStashNameField = atoi(buffer); + log_msg("posYStashNameField\t\t\t= %d\n", posYStashNameField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWStashNameField,"175"); + posWStashNameField = atoi(buffer); + log_msg("posWStashNameField\t\t\t= %d\n", posWStashNameField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHStashNameField,"20"); + posHStashNameField = atoi(buffer); + log_msg("posHStashNameField\t\t\t= %d\n", posHStashNameField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXStashGoldField,"-1"); + posXStashGoldField = atoi(buffer); + log_msg("posXStashGoldField\t\t\t= %d\n", posXStashGoldField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYStashGoldField,"-1"); + posYStashGoldField = atoi(buffer); + log_msg("posYStashGoldField\t\t\t= %d\n", posYStashGoldField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWStashGoldField,"152"); + posWStashGoldField = atoi(buffer); + log_msg("posWStashGoldField\t\t\t= %d\n", posWStashGoldField); + GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHStashGoldField,"18"); + posHStashGoldField = atoi(buffer); + log_msg("posHStashGoldField\t\t\t= %d\n", posHStashGoldField); } log_msg("\n"); @@ -620,7 +794,6 @@ void init_StatsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau log_msg("\n"); } - void init_StatPerLevelUp(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { GET_PRIVATE_PROFILE_STRING(S_STAT_ON_LEVEL_UP, S_active_StatPerLevelUpChange, "0"); @@ -642,23 +815,25 @@ void init_SkillsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa active_SkillsPoints = atoi(buffer) != 0; log_msg("active_SkillsPoints\t\t\t= %d\n", active_SkillsPoints); - GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_unassignSkillsPointsOneByOne, "0"); - unassignSkillsPointsOneByOne = atoi(buffer) != 0; - log_msg("unassignSkillsPointsOneByOne\t\t\t= %d\n", unassignSkillsPointsOneByOne); - if (unassignSkillsPointsOneByOne) + GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_unassignSkillsPointsOneForOne, "0"); + unassignSkillsPointsOneForOne = atoi(buffer) != 0; + log_msg("unassignSkillsPointsOneForOne\t\t\t= %d\n", unassignSkillsPointsOneForOne); + if (unassignSkillsPointsOneForOne) { active_SkillsPoints = true; log_msg("active_SkillsPoints\t\t\t= %d\n", active_SkillsPoints); } - GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posXUnassignSkillBtn,"-1"); - posXUnassignSkillBtn = atoi(buffer); - log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posXUnassignSkillBtn); - - GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posYUnassignSkillBtn,"-1"); - posYUnassignSkillBtn = atoi(buffer); - log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posYUnassignSkillBtn); + if (active_SkillsPoints) + { + GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posXUnassignSkillBtn,"-1"); + posXUnassignSkillBtn = atoi(buffer); + log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posXUnassignSkillBtn); + GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posYUnassignSkillBtn,"-1"); + posYUnassignSkillBtn = atoi(buffer); + log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posYUnassignSkillBtn); + } log_msg("\n"); } @@ -677,12 +852,11 @@ void init_SkillPerLevelUp(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniD log_msg("\n"); } - void init_WorldEvent(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_active_WorldEvent, "0"); active_WorldEvent = atoi(buffer) != 0; - if (active_WorldEvent && ((version_D2Game == V109b) || (version_D2Game == V109d)) ) { + if (active_WorldEvent && version_D2Game < V110) { active_WorldEvent = 0; log_msg("active_WorldEvent\t\t\t= %d (Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent); } else @@ -721,7 +895,7 @@ void init_WorldEvent(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaul log_msg("triggerAtSolJSoldMin\t\t= %d\n", triggerAtSolJSoldMin); GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_triggerAtSolJSoldDelta, "125"); - triggerAtSolJSoldDelta = atoi(buffer)-triggerAtSolJSoldMin+1; + triggerAtSolJSoldDelta = atoi(buffer) - triggerAtSolJSoldMin + 1; log_msg("triggerAtSolJSoldDelta\t\t= %d\n", triggerAtSolJSoldDelta); @@ -747,15 +921,102 @@ void init_UberQuest(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefault { GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberQuest, "0"); active_UberQuest = atoi(buffer) != 0; - if (active_UberQuest && ((version_D2Game == V109b) || (version_D2Game == V109d) || (version_D2Game == V110)) ) { + if (active_UberQuest && version_D2Game < V111) { active_UberQuest = 0; log_msg("active_UberQuest\t\t= %d (Warning : this feature is only for LoD version 1.11 or higher, so it's automatically disabled)\n", active_UberQuest); } else log_msg("active_UberQuest\t\t\t= %d\n", active_UberQuest); + if (active_UberQuest) + { + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoX, "25130"); + UberMephistoX = atoi(buffer); + log_msg("UberMephistoX\t\t= %d\n", UberMephistoX); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoY, "5143"); + UberMephistoY = atoi(buffer); + log_msg("UberMephistoY\t\t= %d\n", UberMephistoY); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloX, "25139"); + UberDiabloX = atoi(buffer); + log_msg("UberDiabloX\t\t= %d\n", UberDiabloX); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloY, "5139"); + UberDiabloY = atoi(buffer); + log_msg("UberDiabloY\t\t= %d\n", UberDiabloY); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalX, "25139"); + UberBaalX = atoi(buffer); + log_msg("UberBaalX\t\t= %d\n", UberBaalX); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalY, "5135"); + UberBaalY = atoi(buffer); + log_msg("UberBaalY\t\t= %d\n", UberBaalY); + + if (version_D2Game >= V113c) + { + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberMinions, "1"); + active_UberMinions = atoi(buffer) != 0; + log_msg("active_UberMinions\t\t= %d\n", active_UberMinions); + + //GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoMinions, "1"); + //UberMephistoNbMinions = atoi(buffer); + //UberMephistoMinions = atoi(buffer); + //log_msg("ActiveUberMinions\t= %d\n", UberMephistoMinions); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoSpawnPercent, "80"); + UberMephistoSpawnPercent = atoi(buffer); + log_msg("UberMephistoSpawnPercent\t\t= %d\n", UberMephistoSpawnPercent); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoSpawnRadius, "30"); + UberMephistoSpawnRadius = atoi(buffer); + log_msg("UberMephistoSpawnRadius\t\t= %d\n", UberMephistoSpawnRadius); + + //GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalMinions, "1"); + //UberBaalNbMinions = atoi(buffer); + //UberBaalMinions = atoi(buffer); + //log_msg("UberBaalMinions\t\t= %d\n", UberBaalMinions); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalSpawnPercent, "30"); + UberBaalSpawnPercent = atoi(buffer); + log_msg("UberBaalSpawnPercent\t\t= %d\n", UberBaalSpawnPercent); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalSpawnRadius, "30"); + UberBaalSpawnRadius = atoi(buffer); + log_msg("UberBaalSpawnRadius\t\t= %d\n", UberBaalSpawnRadius); + + //GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloMinions, "1"); + //UberDiabloNbMinions = atoi(buffer); + //UberDiabloMinions = atoi(buffer); + //log_msg("UberDiabloMinions\t\t= %d\n", UberDiabloMinions); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloSpawnPercent, "30"); + UberDiabloSpawnPercent = atoi(buffer); + log_msg("UberDiabloSpawnPercent\t\t= %d\n", UberDiabloSpawnPercent); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloSpawnRadius, "30"); + UberDiabloSpawnRadius = atoi(buffer); + log_msg("UberDiabloSpawnRadius\t\t= %d\n", UberDiabloSpawnRadius); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberDiabloRushTweekAI, "1"); + active_UberDiabloRushTweekAI = atoi(buffer) != 0; + log_msg("active_UberDiabloRushTweekAI\t\t= %d\n", active_UberDiabloRushTweekAI); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberBaalTeleportTweekAI, "1"); + active_UberBaalTeleportTweekAI = atoi(buffer) != 0; + log_msg("active_UberBaalTeleportTweekAI\t\t= %d\n", active_UberBaalTeleportTweekAI); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberBaalChillingArmorTweekAI, "1"); + active_UberBaalChillingArmorTweekAI = atoi(buffer) != 0; + log_msg("active_UberBaalChillingArmorTweekAI\t\t= %d\n", active_UberBaalChillingArmorTweekAI); + + GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_uberBaalChillingArmorTimer, "6000"); + uberBaalChillingArmorTimer = atoi(buffer); + log_msg("uberBaalChillingArmorTimer\t\t= %d\n", uberBaalChillingArmorTimer); + } + } log_msg("\n"); } - void init_NewInterfaces(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { GET_PRIVATE_PROFILE_STRING(S_INTERFACE, S_active_newInterfaces, "0"); @@ -775,11 +1036,14 @@ void init_NewInterfaces(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDef log_msg("\n"); } - void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize) { + GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RunLODs, "0"); + active_RunLODs = atoi(buffer) != 0; + log_msg("active_RunLODs\t\t\t\t= %u\n", active_RunLODs); + GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_alwaysRegenMapInSP, "0"); - active_alwaysRegenMapInSP = atoi(buffer); + active_alwaysRegenMapInSP = atoi(buffer) != 0; log_msg("active_alwaysRegenMapInSP\t= %d\n", active_alwaysRegenMapInSP); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0"); @@ -790,42 +1054,54 @@ void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0"); - active_DisplayItemLevel = atoi(buffer); + active_DisplayItemLevel = atoi(buffer) != 0; log_msg("active_DisplayItemLevel\t\t= %d\n", active_DisplayItemLevel); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_AlwaysDisplayLifeMana, "0"); active_AlwaysDisplayLifeMana = atoi(buffer); log_msg("active_AlwaysDisplayLifeMana= %d\n", active_AlwaysDisplayLifeMana); - GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RunLODs, "0"); - active_RunLODs = atoi(buffer); - log_msg("active_RunLODs\t\t\t\t= %u\n", active_RunLODs); - GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledTXTFilesWithMSExcel, "0"); - active_EnabledTXTFilesWithMSExcel = atoi(buffer); + active_EnabledTXTFilesWithMSExcel = atoi(buffer) != 0; log_msg("active_EnabledTXTFilesWithMSExcel= %u\n\n", active_EnabledTXTFilesWithMSExcel); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayBaseStatsValue, "0"); - active_DisplayBaseStatsValue = atoi(buffer); + active_DisplayBaseStatsValue = atoi(buffer) != 0; log_msg("active_DisplayBaseStatsValue= %u\n\n", active_DisplayBaseStatsValue); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_LadderRunewords, "0"); - active_LadderRunewords = atoi(buffer); - if (active_LadderRunewords && (version_D2Common == V109b || version_D2Common == V109d) ) { + active_LadderRunewords = atoi(buffer) != 0; + if (active_LadderRunewords && version_D2Common < V110) { active_LadderRunewords = 0; - log_msg("active_LadderRunewords\t= %d (Warning : Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent); + log_msg("active_LadderRunewords\t= %d (Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent); } else log_msg("active_LadderRunewords\t= %u\n\n", active_LadderRunewords); GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledCowPortalWhenCowKingWasKill, "0"); - active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer); + active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer) != 0; log_msg("active_EnabledCowPortalWhenCowKingWasKill= %u\n\n", active_EnabledCowPortalWhenCowKingWasKill); - GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DoNotCloseNihlathakPortal, "0"); - active_DoNotCloseNihlathakPortal = atoi(buffer); - log_msg("active_DoNotCloseNihlathakPortal= %u\n\n", active_DoNotCloseNihlathakPortal); -} + GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DoNotCloseNihlathakPortal, "0"); + active_DoNotCloseNihlathakPortal = atoi(buffer) != 0; + log_msg("active_DoNotCloseNihlathakPortal= %u\n\n", active_DoNotCloseNihlathakPortal); + GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_MoveCainNearHarrogathWaypoint, "0"); + active_MoveCainNearHarrogathWaypoint = atoi(buffer) != 0; + log_msg("active_MoveCainNearHarrogathWaypoint= %u\n\n", active_MoveCainNearHarrogathWaypoint); + + GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RemoveExperienceDiminushingReturn, "0"); + active_RemoveExperienceDiminushingReturn = atoi(buffer) != 0; + if (active_RemoveExperienceDiminushingReturn) + { + if (version_D2Common == V114d) + log_msg("active_RemoveExperienceDiminushingReturn= %u\n\n", active_RemoveExperienceDiminushingReturn); + else + { + active_RemoveExperienceDiminushingReturn = 0; + log_msg("active_RemoveExperienceDiminushingReturn\t= %d (Warning : this feature is only for LoD version 1.14d or higher, so it's automatically disabled)\n", active_RemoveExperienceDiminushingReturn); + } + } +} void loadParameters() @@ -858,6 +1134,7 @@ void loadParameters() if(loading) { log_msg("Reading parameters.\n\n"); + init_ActivePlugin(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE); if (active_plugin) { diff --git a/PlugY/PlayerCustomData.cpp b/PlugY/PlayerCustomData.cpp index 746c95d..d95035b 100644 --- a/PlugY/PlayerCustomData.cpp +++ b/PlugY/PlayerCustomData.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Adding custom data. Save and load infinity & shared Stash @@ -14,7 +14,7 @@ #include "loadPlayerData.h" //Install_LoadPlayerData() #include "common.h" -bool active_PlayerCustomData = true; +bool active_PlayerCustomData = false; bool openSharedStashOnLoading = false; @@ -28,8 +28,10 @@ Stash* getStashFromItem(Unit* ptChar, Unit* ptItem) while (curStash) { if (curStash == PCPY->currentStash) - curItem = D2InventoryGetFirstItem(PCInventory); - else curItem = curStash->ptListItem; + curItem = D2InventoryGetFirstItem(PCInventory); + else + curItem = curStash->ptListItem; + while (curItem) { if (D2GetRealItem(curItem) == ptItem) return curStash; @@ -37,7 +39,7 @@ Stash* getStashFromItem(Unit* ptChar, Unit* ptItem) } curStash = curStash->nextStash; } - + curStash = PCPY->sharedStash; while (curStash) { @@ -67,18 +69,26 @@ Unit* FASTCALL updateItem(Game* ptGame, DWORD type, DWORD itemNum, Unit* ptChar) return ptItem; } +void FASTCALL updateItem_111(Unit* ptItem, Unit* ptChar) +{ + if (PCGame->isLODGame && (D2ItemGetPage(ptItem) == 4)) + { + Stash* ptStash = getStashFromItem(ptChar, ptItem); + if (ptStash) + selectStash(ptChar, ptStash); + } +} void STDCALL updateClientPlayerOnLoading(Unit* ptChar) { log_msg("--- Start updateClientPlayerOnLoading ---\n"); if (PCGame->isLODGame) { - PCPY->showSharedStash = openSharedStashOnLoading; - selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash); - - log_msg("End update client on loading.\n\n"); + PCPY->showSharedStash = openSharedStashOnLoading && active_sharedStash; + selectStash(ptChar, PCPY->showSharedStash ? PCPY->sharedStash : PCPY->selfStash, true); } updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0); + log_msg("End update client on loading.\n\n"); } /**************************** INIT CUSTOM DATA ****************************/ @@ -143,7 +153,7 @@ Unit* STDCALL getNextItemToFree(Unit* ptChar, Unit* ptItem) return item;//->nUnitType == 4 ? item : NULL; } curStash = curStash->nextStash; - } + } curStash = PCPY->sharedStash; while ( curStash ) @@ -163,30 +173,11 @@ Unit* STDCALL getNextItemToFree(Unit* ptChar, Unit* ptItem) /************************ INSTALL PLAYER CUSTOM DATA ****************************/ -void FASTCALL updateItem_111(Unit* ptItem, Unit* ptChar) -{ - if (PCGame->isLODGame && (D2ItemGetPage(ptItem) == 4)) - { - Stash* ptStash = getStashFromItem(ptChar, ptItem); - if (ptStash) - selectStash(ptChar, ptStash); - } -} - -FCT_ASM( caller_updateItem_114 ) - PUSH EAX - MOV EAX, 0x552F60 - CALL EAX - PUSH EAX - PUSH ECX - PUSH EDX - MOV ECX, EAX - MOV EDX, EDI - CALL updateItem_111 - POP EDX - POP ECX - POP EAX - RETN 4 +FCT_ASM ( caller_updateItem_114 ) + PUSH EDI + PUSH DWORD PTR SS:[ESP+0x8] + CALL updateItem + RETN 4 }} FCT_ASM ( caller_updateItem_111 ) @@ -199,22 +190,6 @@ FCT_ASM ( caller_updateItem_111 ) JMP EAX }} -FCT_ASM( caller_updateItemB_114 ) - PUSH EAX - MOV EAX, 0x552F60 - CALL EAX - PUSH EAX - PUSH ECX - PUSH EDX - MOV ECX, EAX - MOV EDX, EDI - CALL updateItem_111 - POP EDX - POP ECX - POP EAX - RETN 4 -}} - FCT_ASM ( caller_updateItemB_111 ) MOV EDX,EBP CALL updateItem_111 @@ -238,15 +213,15 @@ FCT_ASM ( caller_updateItem_9 ) RETN 4 }} -FCT_ASM( caller_updateClientPlayerOnLoading_114 ) - PUSH DWORD PTR SS : [ESP + 0x14] - CALL updateClientPlayerOnLoading - POP ECX - POP EDI - POP ESI - XOR EAX, EAX - POP EBX - JMP ECX +FCT_ASM ( caller_updateClientPlayerOnLoading_114 ) + PUSH DWORD PTR SS:[ESP+0x14] + CALL updateClientPlayerOnLoading + POP ECX + POP EDI + POP ESI + XOR EAX,EAX + POP EBX + JMP ECX }} FCT_ASM ( caller_updateClientPlayerOnLoading ) @@ -260,11 +235,11 @@ FCT_ASM ( caller_updateClientPlayerOnLoading ) JMP ECX }} -FCT_ASM( callerServer_getNextItemToFree_114 ) - PUSH DWORD PTR SS : [ESP + 4] - PUSH DWORD PTR SS : [ESP + 0x10] - CALL getNextItemToFree - RETN 4 +FCT_ASM ( callerServer_getNextItemToFree_114 ) + PUSH DWORD PTR SS:[ESP+4] + PUSH DWORD PTR SS:[EBP-8] + CALL getNextItemToFree + RETN 4 }} FCT_ASM ( callerServer_getNextItemToFree_111 ) @@ -288,11 +263,11 @@ FCT_ASM ( callerServer_getNextItemToFree_9 ) RETN 4 }} -FCT_ASM( callerClient_getNextItemToFree_114 ) - PUSH DWORD PTR SS : [ESP + 4] - PUSH DWORD PTR SS : [ESP + 0xC] - CALL getNextItemToFree - RETN 4 +FCT_ASM ( callerClient_getNextItemToFree_114 ) + PUSH DWORD PTR SS:[ESP+4] + PUSH DWORD PTR SS:[EBP-4] + CALL getNextItemToFree + RETN 4 }} FCT_ASM ( callerClient_getNextItemToFree_111 ) @@ -320,9 +295,9 @@ FCT_ASM ( callerClient_getNextItemToFree_9 ) void Install_PlayerCustomData() { static int isInstalled = false; - if (isInstalled || !active_PlayerCustomData) return; + if (isInstalled) return; - Install_SavePlayerData(); + Install_SavePlayerData(); Install_LoadPlayerData(); Install_UpdateClient(); @@ -330,28 +305,21 @@ void Install_PlayerCustomData() // Initialize custom data. mem_seek(version_D2Client == V114d ? offset_D2Common + 0x221FDD : version_D2Client == V113d ? offset_D2Common + 0x170DE : version_D2Client == V113c ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 ); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFDE944F, init_PlayerCustomData); - } else { - MEMJ_REF4(D2AllocMem, init_PlayerCustomData); - } + 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 + //00621FDC |. E8 4F94DEFF CALL Game.0040B430 ; \Game.0040B430 - if ( version_D2Game >= V111 ) + if ( version_D2Game >= V111 && version_D2Game <= V113d) { // update item - mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81, 1978F3); - if (version_D2Game == V114d) { - MEMT_REF4(0xFFFBB669, caller_updateItem_114); - } else { - memt_byte(0x8B, 0xE8); // CALL - MEMT_REF4(0x52182454, caller_updateItem_111); - } + mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81, 0000); + memt_byte( 0x8B ,0xE8); // CALL + MEMT_REF4( 0x52182454, caller_updateItem_111); //0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //0200BC75 |. 52 |PUSH EDX ; /Arg1 //02023C51 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] @@ -363,13 +331,9 @@ void Install_PlayerCustomData() //6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //6FC95C85 |. 52 |PUSH EDX - mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1, 197943); - if (version_D2Game == V114d) { - MEMT_REF4(0xFFFBB619, caller_updateItemB_114); - } else { - memt_byte(0x8B, 0xE8); // CALL - MEMT_REF4(0x52182454, caller_updateItemB_111); - } + mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1, 0000); + memt_byte( 0x8B ,0xE8); // CALL + MEMT_REF4( 0x52182454, caller_updateItemB_111); //0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] //0200BCD5 |. 52 ||PUSH EDX ; /Arg1 //02023CB1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] @@ -383,23 +347,20 @@ void Install_PlayerCustomData() } else { // update item - mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000, 0000); - MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); + mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000, 1978F3); + MEMC_REF4( D2GameGetObject, version_D2Game >= V114a ? caller_updateItem_114 : version_D2Game >= V110 ? caller_updateItem : caller_updateItem_9); //6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00 - mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000, 0000); - MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); + //005978F2 |. E8 69B6FBFF |CALL Game.00552F60 ; \Game.00552F60 + mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000, 197943); + MEMC_REF4( D2GameGetObject, version_D2Game >= V114a ? caller_updateItem_114 : version_D2Game >= V110 ? caller_updateItem : caller_updateItem_9); //6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00 + //00597942 |. E8 19B6FBFF |CALL Game.00552F60 ; \Game.00552F60 //005978F2 |. E8 69B6FBFF |CALL Game.00552F60 ; \Game.00552F60 } // Update client on loading mem_seek R8(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548, 139A20);//6FC325D4-6FC30000 - if (version_D2Game == V114d) { - memt_byte(0x5F, 0xE8); // CALL - MEMT_REF4(0x5BC0335E, caller_updateClientPlayerOnLoading_114); - } else { - memt_byte(0x5F, 0xE8); // CALL - MEMT_REF4(0xC0335D5E, caller_updateClientPlayerOnLoading); - } + memt_byte( 0x5F ,0xE8); // CALL + MEMT_REF4( version_D2Game >= V114d ? 0x5BC0335E : 0xC0335D5E , version_D2Game >= V114d ? caller_updateClientPlayerOnLoading_114 : caller_updateClientPlayerOnLoading); //6FC325D4 |> 5F POP EDI //6FC325D5 |. 5E POP ESI //6FC325D6 |. 5D POP EBP @@ -424,49 +385,43 @@ void Install_PlayerCustomData() //6FD07549 |. 5E POP ESI //6FD0754A |. 5D POP EBP //6FD0754B |. 33C0 XOR EAX,EAX + //00539A20 |> 5F POP EDI + //00539A21 |. 5E POP ESI + //00539A22 |. 33C0 XOR EAX,EAX + //00539A24 |. 5B POP EBX // Free custom data. mem_seek R8(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D, 2220DD); - if (version_D2Common == V114d) { - MEMT_REF4(0xFFDE939F, free_PlayerCustomData); - } else { - MEMJ_REF4(D2FreeMem, free_PlayerCustomData); - } + 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 + //006220DC |. E8 9F93DEFF CALL Game.0040B480 ; \Game.0040B480 // Free item in Stash (Server-side) mem_seek R8(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2, 155B34); - if (version_D2Game == V114d) { - MEMT_REF4(0x000E8468, callerServer_getNextItemToFree_114); - } else { - MEMJ_REF4(D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204 - } - //6FCBD5A3 . E8 04E20500 CALL + MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V114a ? callerServer_getNextItemToFree_114 : 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 + //00555B33 |. E8 68840E00 |CALL Game.0063DFA0 ; \Game.0063DFA0 // Free item in Stash (Client-side) mem_seek R8(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4, 66D02);//6FB29B31-6FAA0000 - if (version_D2Client == V114d) { - MEMT_REF4(0x001D729A, callerClient_getNextItemToFree_114); - } else { - MEMJ_REF4(D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34 - } - - //6FB29B31 E8 340F0400 CALL + MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V114d ? callerClient_getNextItemToFree_114 : 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 + //00466D01 E8 9A721D00 |CALL Game.0063DFA0 if ( version_D2Common >= V110 ) { @@ -479,6 +434,7 @@ void Install_PlayerCustomData() //6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1 //6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31 //6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1 + //0063ADB4 |. 74 0E JE SHORT Game.0063ADC4 } else { mem_seek R8(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x74 , 0x90);//MOV EAX,EDI diff --git a/PlugY/PlugY.rc b/PlugY/PlugY.rc index f4b35a8a71a65d7a3781d4d50faa2f5ae71c5b1a..ed2613debb424c422d7aa9bda4e9eef005756e79 100644 GIT binary patch delta 34 ncmcbken)-73ob^J$uGH#8BI3Ja=&E)QrvtS8G+PZet8xE-xdoX delta 34 ncmcbken)-73ob^Z$uGH#8I3l}a=&E)QrvtS8G+PZet8xE-joX% diff --git a/PlugY/PlugY.sln b/PlugY/PlugY.sln index 53351bc..188f79b 100644 --- a/PlugY/PlugY.sln +++ b/PlugY/PlugY.sln @@ -1,41 +1,20 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcxproj", "{EB63DF4E-A019-4522-A140-9E8C7350B331}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugYInstall", "..\PlugYInstall\PlugYInstall.vcxproj", "{66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugYRun", "..\PlugYRun\PlugYRun.vcxproj", "{1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - Restore|Win32 = Restore|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.Build.0 = Debug|Win32 - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.ActiveCfg = Release|Win32 - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.Build.0 = Release|Win32 - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Restore|Win32.ActiveCfg = Release|Win32 - {EB63DF4E-A019-4522-A140-9E8C7350B331}.Restore|Win32.Build.0 = Release|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Debug|Win32.ActiveCfg = Debug|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Debug|Win32.Build.0 = Debug|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Release|Win32.ActiveCfg = Release|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Release|Win32.Build.0 = Release|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Restore|Win32.ActiveCfg = Restore|Win32 - {66A1FF3D-F0DC-4D2D-BDB9-1A853A20C42D}.Restore|Win32.Build.0 = Restore|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Debug|Win32.ActiveCfg = Debug|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Debug|Win32.Build.0 = Debug|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Release|Win32.ActiveCfg = Release|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Release|Win32.Build.0 = Release|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Restore|Win32.ActiveCfg = Release|Win32 - {1DF62C54-02A0-4E13-A5DC-F975DFBE03FC}.Restore|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcproj", "{EB63DF4E-A019-4522-A140-9E8C7350B331}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.Build.0 = Debug|Win32 + {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.ActiveCfg = Release|Win32 + {EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PlugY/PlugY.suo b/PlugY/PlugY.suo index 76ea626db13f222a0f1c801fda39eece5d35ce1e..a49635104d67f3c1ad4ca14dd573bcc2900d1b07 100644 GIT binary patch literal 102912 zcmeI52Y^<^)&6$@QEVuns90z=6r?vBy(kC*g6JwNyHuB6RV0eNp<+!m5xY^N#@I{5 z7NbTbiJEE>(=;ZQ7!&-+kIyn?)Uw3;Mtk?+_`gR=FXfsQ|{bNukQG} z8@{{STP0a^SV_~8FTQM1(mcU$B7dp>y+cU}zqb^=`0~pyJ$sEj`uSh_Us3{}E1k{s z%ytua)>{ZX)2)PUgcicq!gj*8LQ7$LL65&=S7Aq?mC#yfBkUyXEVLDN5!wlR3i}AV z3wsFdh0el(LI8R#|XoP5yD7elrUKsCkz(G2t$RVgz>@^!qLJ6 zVWKceI98Y`Oc72JrV7Ui#|tM23x#RI3}LBIDO3p4h55oPVU93cSRl+5<_YCOm2jf4 zQYaG^35$g#!ZP6uVY#qESS73$P8LoPP8Gf;oF<$p@Z3+AJ3%R0sJq)M=L_U6iSE#a zK-yU~##eRHm`3AA4sG+Fx85jisz8Gtbs@(~;zH$cw4~3HZ+MjQv{*8)?JOO{v zE&Pl63px3V^vsqh_b00y#;U9r2(u%e3sv}U$C4(clr3#2RDP+#(l($;lC)GcWsIKm zQl;P+{Ut4)PaR34&XV6o0el&xh4t5($V2;v(A|YV7~lTU1%yKn`0$irvGz~c-4w2a z;M>2y9~Z)<%|}1c{!nc3)1v-HCPdo?9MIWFe`0d+2e)Iuu zviEJy$4?^ai|Tsu3&H`}I)m?yed=O})ZG)rgr{ zak=|*|I()EkA_-0(5kbgN6J-W+N(#Kt2E41EorZwag}<~zUpPmr0XV&H%Va^>iP`* zU8SB3{X_aHqS}}%E6G9sQEAWxs%Am@7yXaEgoa7RjHuQ)eLF=dUM9(NqSU%DX@A?B z{%@;5q4JT9&V;h%4^iG{Dh(&8buCmG&?lzp;Qb^YdueMSRQ?tUi;jY_<iCr3UtWr6D5M9E&RvM5#ukdItiaj1OC>o9A0+4+y< zpRAfojYR7eCdrTFA{#0kGQNU7^uMy@k5$>vmsISaDOMH>WpNd%0|#3Ew^xLr^3j!( zECD?4WsJjf>$CK`q-32? zQ@zwM=_0So5=BFg>&CGOW}SI8iIcX7jnh|3X^1Jsm+$P|>Vq%d{}TQ$b^RS-S0TyY zM%UU4*k5DygsPOUxzW=qkMg)&8pPKiMn33VMnS#x_f$QrA<{s-^wfswxmM`@`Bt-% zb$)zQFXl!u7t%!CRsXOFu@6J*-@8gTIsi(O?``2>QJ+xmZpixEP4X$jsPYHaf7+@Q zb)@I$oxQeo?QE9Ha<;hipZ-dgVEd`|UoAT{|1EXz0y=EbIO(`~dV=)T*=>AsG~#vP z3jL-3ZLNzn$v<^ztwlIOHDb7|>cMK)J=DIt>USU6A3Y;p5B=&c-vEW_uk`g(o#`Xa z5V^e+{xs=>N@+*5L|pI2MZH(D){*1PFura&?MB$GqB(+O-K=Zc4vt3o^%-L~*>^M5 z*02y5r>(X=qL<36o3!1KsJ>vm3{fbwOWg99eW>5G#C=yy(t)KiSZ$tqy+U~ys&q5j z;0e%@3+Irr)xnXa6W>3vr1LhP4?f`Hr$&AEmv_9{`j#mz$CPaU!fsXnY0+uirC*-= z>8nrQ%#cds+qc{7{gZn-bsG8LpWZrc-x>2!M52i${b#j#`irOc9CPzGEAPH~&kqLF z?Ea(MGglO9eaDt~x2UgLq*ll5gB!!tM?B;SqW_wszx3=_-IXQ#%D+HuX<5m;0(L#^ zy|Yq}^?i~wFfHh$DD-5tG1?=&EhAjUj&a({RBGkXvm0M>?5jLa=9<#)XH-TU$Y4w` zGfKmf;QJ><7Wp(uMl1T!3$|I^p5Hktnaq*XFtw#*Zl}psVlH7if;6+LcmN!q+rxjQRRsQh*cdyPeUjGhNl%T=y31)m<*FBP)- z;}og?tyBI-snjbY*$b5CDy3$GQbXV2G)F8czpt+H$3?bJRa76S6SET~KTKTamePpl zf2RUqhlZB_z6$&902gbv_6vRP?r!E3n_wnK>lUH%_f+`(ECN5z>gQi4s?}2mnS;P8 zELH<*Q~&ppY{u(QTKPN8@4^-OtND+p{*!m8P`D(&kA6IEj3KINnff=@ZJD}>*6C*V z;@PBbsv+4kS2GIEU7-P2s%*<6{Y?Fib@j_rcG{aH@hm+ZFAwvd@JKWLG_+EHhdyME z6FO6X*FiW-fX)}-L6->~h4q5xT_t~K;pznMTk;df^$Fh1@^kMk#zWU!AV7BrKE4O# z-$!`Jcx~j;HlQa2AMOSD_ZMC?9`Su&fHnz)W6u1?0`v#xM7%$m{{y)`+=s?%D+avB zgkA861{e?jDEUXq9i8Bfmw%{uM;i})dxHGu$enJyO8Lv>KTqxq5W{{^=QoPyd7d*-1g@Q{!0E@9D408!bqheA;|5^7FsQ zhKhyf`dH!nR#a*7dj&*R8~r<8@eXO?B2SZVL!{JHARk?k`BYPHiPockVEI39v)A8B z^&`v;mPa;6T!;TreniySX4hc~%GcrMma*1y-P6u)KRq>{QfTd@GOq>h?ELfJ{MQ*o zo|I0#-r9KBH_UO78uXHrULjqV-GA1t{imgWxOz;+tI2+|dFdml;*50jn>3OaN{W0y z2MO@7eYy(}YoeaVSO=Ocz@wf{5g>HC%X6kaTid|-XEfqxnwLrwQo18-6vfzRj?%T_ z$tFJ{jilMrM0t*D>eK93)pF}bL#ID!O^w#*ZM4RKZY?gZ`S0)egD*&TGX4CfO~b=p zrj0}X8FrQ5Kf~ej6Rv|WLV%7I;Gvf%2+*+tJZP$OqJ1gwS_!OALvsaq)SY<(v{Zmc zT+0OL*8)81*P8;gs~GSIzZ)JA_5|K>!imPCuQzXG3lMIp@u<7>_t5FaLx%6q&o>^= z_yP;}cjIA8ePq0DYOHw4&p|X?(IUBCbFlteSN&K2^{0^b@-2Z`ib|DlTz|H`^?sT` zb$Q~4z9W!-#v6B={~2@Tlsqe}tLOF`V!ve1L1pA+dFT5{n>|9j5pB|6c*_NE7yJ6R zNIYNv2t>HWLa9a4)p#q#>t?*OjYqh1jQ61Nq&7;Pm7g|8Kgs2m!Viu2VuJUQ@qU!x zy(<6i3jY)1(Ow>sAM*8df&9LnPOy4PxQSLz=NpeS`?Z4A#-j{Qvv5}#k8#k|#=F&c zw87hq_qOqti1&{1J~rM8@&0MNt(19^ii{Q%gs8vqXoCZccdA_1j-nv7{&T@*uYZNx z(c;fOjnu3?s_H!XF&^!R@f_DTnk%Q|DgKC_7Pz*j@QeWcP=H6oF9;BI6(0TYZv^N) z0p9+?`vUa201y2ibr5o!i2<*lu!Z@Dnk!bxFfNLQ8;_rV)SqT@KQvw^`A2X;^s({q z|I>K8TD{sx=M+27cnxik22KfGzT`Oi`1vTLBXr}xpdDN&ttd;JJ^X&v)lllC)C zmK!T6tVoTJ%X$f`IqVCIbFrrKvQJ2)YuQ)Gx4UI%h+MpT3nPtJ-}4`ZcfL{jg=P;g zUi~aeDnlEE%^ud({>v@@LiQW8>)8Ga1a=y`neL@}B5oA(ujiLtKpw1M@hXh7^1YUA zqu=N==q;gC^K|t+{w$RKnbA%qW^dj4zTchZQh&e~hb<&kE~Vt*0sZlL!Lov|g77js z_i)79eCcnP-lMMee|_8Eh1*ZOW}I9zO`Ct}QN2r%XP2MYe?rs4HuAMJf5@1-Qr@fV zXS#f53eySs*xHPTL*=hg*m-8dq{||9QFC?%3=v8jne)m(BmGTr@Fb zQNsUJ?v{%Cb-8aC@8@!VVgByA)=I$k|Bdil;djDY!taGY2!9m*B>Y(*&UfVg#r%Jj z`#1A5KKQ`=f0z4_@DKa_Pr3gR=)yl0{zv$?Kz#p^%b4N|;Y$HkoV{ma)Y%(&$0X$pYb83sVHHO%r^4)8&UM1s`sv z{DfO%JUP)gANL}`-^;Tl9M26NX`{|VuL$r42s}fmjTrEH2|M8t9bvqI@*inD>W+C! zs?1X=L3qKo^6x0Ob%M8x{0E5FDZ$%c{{6)BV=DbDIaGi4mpjzLF}0&Qaw&IccfsFFIY4CsJj!&A&_$Rl_;6M7b8WHl zD7p&;o*VUsaL7ABfUXdHnXcY!_E)~y|I?3nAEi~D6Z{Y*M5<|BloI4yD>aW=1yO4V z2k%e;@-1_`{IpDnmgjREF{=M;zWU?rPxjEcojTs0@w*Y69s2hNR`M7#N@Svbw-WN@ zp#H~?h3sdy(?6g6?DwlZ-tD2MveV9Q>NigbowbVqwHM%pk3SYgZ7#X@k5ON`{n1+z z(h2*E+Cy8*SHAh~zD!K|Y$#nm8abV6V}DUWXv0vt{GKjQ%3tzNzB?#PX#SD?N>dkU zn*5%&_cKL&t?bWJ6yZSYAJXKr!@C%fe?n1Gq4{5+up0y@O@7a)#=CHZ{vyAxE>crN zlvto;1qsH;SuBxxJ{fQK!& ztzAg=!#j$HZl%xld4IveVJCAh__aVuV&n3=gMb|d)qnqyxyI{f`~7a)$?D6P|8lbz zqoX;Qg$euPo_Vt)rAIoG^ygp3F~S! z?pXq*3N97UOjp})c#MMg6*dU`-b*-JfY3 z9Sy#ZJ>)d`=&oXfe8z+|k^hpyUuO~5|N32F`yu}blpc8e<(DyWnN#yy7!QlfTQ2ym z@S+(ypeMKTn@F}mjPNC>MFnk)LdHcVfMSd+-?FiT=4gfh~|Zv8>atcuM_>_ z7s83S;rS0%KYihLR*18mi>V218gU-j=YDkr?8hm{2k0) zBDb^oX&d_r``Pc?RCJPgVNy0G#_kv^PA1v9&8Lvz( z{p&OKyHaks`77jpL)WT=S@O>o<_NqyF;5^q=A3aC$X#gu#pc4lM*iiA->c+jkIwbN zsq(W2>=LA?fQKddumC+G_*^_1aol<^JbKoR0{&;srH6e^fUupoM)|!WKpzY6 zE*JhOK=gO;t`O4pPtnH^4*QukM~J@0yd`7hnIInfg5eDmCQ+=S>BhrfA^#M)mBu6N z>GIRtuTAjIm49#Xj&17VBivH?8P_gL@V+PiVDTO>9%JWn-3vV_o_lJHEL2VvBRaq* zE>BoxRe}pw_(Zhv!P;u5`lzMS$h;52+qyGkL%CJN%>8RGk3E#Cn~@rRZ)?1^a+%G8 zTGc>zA0vs3*N#>?khm;iyY2S)Dc>i)WC`$li1D_POB-X*!_y>Ob78pV4zl-eCHvXz z*-Q4o@y0qAsU2wbZ>(Gws;mLtzbZ6-Pd=xG+r0E!vu($<>ar=sa1til-B?Bie|u~s0;p~|0B($$H^`j zwEDs~<$J?^rOPMgbn^W#`YTladkVYGqD`0YpFrU>)TaM^ThUz_AiuY2Q8DuQAEJPv z`R}c;k-CzbYvFQ+3g;d;y>hw2gxk!E661lSzK+jkp}&|Rtdm9U&K(Fnsj_w_!cErO z?Pb!J3nY&>ve`RO7HMzxpK#uV%jcO&Q`$K%$=1yM@i-uPnu?2yx-}}N1t#@+(!W3{ zS{a>xocS#L6IiI&(tC+yY{l1Tun6K=+uZq!r2gZ1x>-awqv*$ag`e$hYk#*`0&;r7 z?TtrI*hZiyWCf%C*UysaPnJw_{*_a2IPHcJUaZUir*zPKB`GKE-g01`-&+nHES#Tz z%{^J5cJKce-oHCWmJg@YkSG5f;&$a{z`vYu5+zXtb8sAND*s@g;zNCxJOjcsmN)2xOSrZ@JYmdf`2F{`0TW z+i$Y|JI#=`f6CXPgKyZ#5Gf-!{BC7D`VVif9Adm7ajij|1o|217QspUzx%KXf8rrAH7MqP}sKd?bN3fZ|Xbng?o@GZNTE}v0*Iw7BZ$H<1#L%XYw z%3+QfN|TRw>df2u$9)6Jx| z_|5ocwB4|k@x&@=AwSgBcm$zOLEn!y9^*IWzM*k)eOYb3_kZHHn_Pe0oacAM+Bmj3 zYI$-`^#Q({SN|2;JvC;JO&E36PZvLg)kLkJm0$@%PXE=l|8p~YXhevf$tq}d+Zkj$ zYVTkHI#M89lvuexwBK_6yMsk#aGMH;5%qm?DX0I-J6M#x>eYa+-U5EtN}RsuuN1xL zA9B6EoMzW&h(BHa(~FLy`N~7?*m};ON(>}V0RJs%vOaFyRGgi<=mXG?^zlH2~_nz}Y*>LWw1}^oRnw@|d z8r5?8C}w4WAM?puO=vFv96WQ)S5W@LRQ9v1^w<6To?nm_pDspvD%#-r!!-MYQ^1Q6 z_8033-2|V8V)wkO01sNAbouD>bVB}t3WB8=D*qXUecYl=m*2}m6?P;)l8bDpaLD+| zY4W~eKhxz0%|Dj5S6oL4q4Hl-SYQ5)Vbnx>tE(LlG+2zzzz!b=Gp-mCJdZa-deonu z>)z`3<7uAFK#pyLn>&^$2yks>v;X-E;rs<~L0p5wiMge+X@Hzb;;1dpAUtnNbWDl%`$A?6uu zys5g*&LU`$@kk##cA)c(M}FxQq05bTocvc9?*`)?B;Jk2yVH1`#rux&IAa0tJ_6?~ zKpTz6Ow3cp`=Rj|wZCAzO~#}5__6VRV?1UhvUeMI74Jg}w}VD=c$q8MQGRG2-K%53CNDRj5-D3^PT_oDHz&|Wg$>&D}rH;nhT@g|A)j`2QEg!{sHk2H1V z$IqAKr>_4b!Fyf)gT?!$@#K`er9X$t{gd&y_aE}}T)r^g9`ZjbKh#{qc-Kn(dkcPN zMa^_avGL#2+l|>0dD%Tt;qhPi-YMqwa?gJW-!Zi^VdrwvyR-k=w0>+!c8Vv8!MvNx z#Z>M4D*Oe4@ctobXFK^`hY$E<9~xP;CczKwB+#;U5wMvd(ghDNn&w7YGQVjFjMSiR z0zB?Rb3oWg@OBkwt@z6YufOxZk&T8gY^8^<4Km8eT;ZZe3tw}anR@t(G{Rm%&K5NzGXWT;^N%D1Qq?o=A(QEi{v+a8i@f`MAUHvLXHBPs>(i)vFHd{*2e^v6jNDuK0T@;dXO!-7)|A zudje(9wdgvlAkY+sg#6LZFw0 zu+Drq-!3U-c<9P$0#qfyniQM~l0pVV1n_0;q29rmUEuWp;je03`DL#+f-u)BaRhv-q@?NNhT z9sd0LwLIuzq#z+lJac$F|F(7^y#EM0KV+M^H?1UUr#GDt`a*K<(?cIhT|obamw&N+ z8b9sY1GBSQ3jT=#Qe0~8kPrQTmq1!bLwNra*9Cv#1v^B-cZSSXoiBX;3hkiX6;q-? zQL^mFK}*5$a=%YIFjy<1wfsrmPRm!metA@4+44G8%PaKNr&wzZ3YK5&^zCFSlz_-e z;wdq1pvFL0Qt-M8Zf)|AVEOsZZ@KrO8*fll8MT$)Z3N^{YtfpJx9E0|-&=J3ij4i^ zI+NV9G+r|dOLXVV=o?~H+EKd5tl_^M{Yf)qCCehS2E^l5_!pFh+ut*C=0~V=;pLb8 z{J8s!E2|dE$!K%@M!Qgc+X?78h-U_Gdx5e<0}mBkUbDZmTzt3C*1C6nNqYUu?!6hq zWS?HYe!+oM_>4SIwiOz?xwN@2x5c}DlD%(D^hdsTW0LQmcKO8>QTwNql0=Pz$GBlf zyWmSWeEj3fB7S4V_gt@yoHChcleLcDFAK;;Prf2RKNaB7B3~22e zPk`Uddm)P&!_$WF!-LR^;re%}##$@X=92yBFwJW5H8`ga5Bl`LO~jjB4&)!1Jcqpm zsJj3!J^#MU{plB2k8a<%mwSdHSu30=oF$wsoFkko@J<=CRLtD0lgpY7yziO&qTI{O zf4y90thj!axpQ?Nzj^olTH}3FF6WfrWWTx2tky=MRD5Q(;IRUU3+^!gdvYHa?zZ3e zn#(Gs5Bq@mnE`|Mh`Em?!aOPeo5D|pXN9K)e?RU|^!s^%nJ{L^;JqaGM*{Efw^2G@ zmCLMI^1j#f`*q!s&*l=AFiA@OX6Ee!3;TDu z9|`{!J{JBd{7d*mVE@Md2;BRb-2Vul3ttMTzb%Ed^@rZoJJ1!r0I~iuSl31iq_;q@ z4E9g->nh`<%kP(QU%ns6NA3t+43)n~`Dd&IrOWpt5*Ie#-`cGIbd-EQUP+VRCvgAO zAxhX3AvFJ|N&Z?rd#EzlehFEZ;QhG0kik;pCV

Ed<7fKEBTK6CVR4c&!DW&)&w96Xg|ak-Yn~`Y)C%=)iTk^a(C{;-hPT%7nE`PxkFqh&zUOu|uf_ph#B zmGk%hOpKfuxQo#H3Dke6n*fixoo>IzbuRhMYu-;{rPf1aFM_$C|sft`k;2qj$h@v0r$e&^R%i z7IAO1C0k19+y!qQZ=na?L})6o&zrs6%>~ZCqeT2EAaQ(^qYZbD$ zc=PTQ*;19!Oa$%f0EkvqV6a-w!ZuQ?;Zn<+m%QI+w~MGNGo-7ibiTB?7OH>S^LMYl^(1k*cP5t z!}yzWJ5_>JnO@8md@$X@Z3p+nlK4F^*Jl^YF2c|5|qD$$^aA776F5FLh@rG{kQ1%N9Z{%HESEmzBd0^ z16wOSn{UrM&(NP4kX$_+mZ7_RA5t6F+nLFGuSwXP*UEpL@J-=c#@`_K7U4$WCgEm* z9k;g%w+Xik-xl)4eUJF}3f~p(6TT z8Q6A8Oa1rLh07)1ZWv}b!*^L0)@j*wx<1B9$$b*cw}v5CPkvrGcQ3~@#k2WrEtjXXGfl9Om=ip2v)M?@uFs0**x99)`<>S| zo3(_feffKS-%2Q<7DBqU<)66UNrEoPJc-cnC?UQnLjRl+Pu9kypWSGj0_N?=^K^Ik zzOwu_|D}o}eQ#DW1=)Mc{Hz$Oi0S2$jDFa3P=DSKxe&)e8zpIP3uV83#c@}$ zzRq1;_B;Pv{}HcvF?kaH^wV~Zr_F!#u|2L5R*-5l|Il8^XH^qQlixe=`(MKq&nN*~ zoj8lpg_3`)1xl0OCvgAMNX3Os5GsGDW-+w!9DzRrjN55{%Y%J@x5bKPj%J<@4 zM~(WQTmQm!u6fchGTJ==k5L(G8_=~v`1#B6+4uSTH=lw&mpp$WvAbL#6R_6VOzv@V z`Awc!R}Ei3@^8OqN)Nw3%vQYglHR?PwCZP2%nm7b-P`_UksZc)qs#To*dyom{I2Nz zIh|#-Jp7PvHCxJ0Yhk&dy+GNqUWL8Rb4`DLH));ZfB$lk;y7AJ@2!*ZpaZf;k+h!+ zYLuG%yKyp4@}ds*uVpOei0j;F8LtTWYZzZAO{8rq`C*4b$~uVamJlx-#R z)X_=oEW*?4M4B<5;eI}faBz%UTLOOx51Mf%0C%RI)=Li>V z#?sB-$0qxz{gk5m?=w~?*445s(ocl0&y%dis>F{~c~_YpzCtOet1e~q7oUN0hGMMm z(L&FX!Y!ll`z_cC;iFj2$@XU>`#o=&Yboa{zVK139~CcEy;&H|i^Oj%U!<7A+ezUZ z_N`GoK3D8k&)i8kTJfA$&+V=F2(MBlUZuL|z77_T^61~g?VGT5$JvTAspZ1sU!*kV z&Lkz{8mDhuBuB!T{`_aAXKTC*?i~IvB{9byVh#`6XDfjjG;GOTg>buNx!MjhP08q|W-*_wKXTQ-Tx#4Xg_xn$bgv%H_R!bgY5*P{$ zHK~h@$Nt|X#&f%umS~32<$w`jxV6M6j<<2spP93nv&US%%tlJ$x_WLc*%~g?n(;PT zd!=bj1E(oz4afet-D01I_a({RKi_w4umetSkX$kI6o1FS)uJmOIO%N(i|RctMD=9f zsT58UqW82lNj=eHlP?=L?q zfKV5qv+e0!G-J3VvJ6MwOuI)*RCtO?R ze|LS2;s{@_%wKyJExJ&&1R{K0cQh&N=$`*(u>SS_2KzL-4bZlykoFU-Cq+WxAA+8-DvZ@Uy4P z)3b`0xEBl0;Suq!EnYMg`{&VI?d8HFa^Ay*!tL^fk*$jUSt<)|rpj}fYBc-XiE4qs zzIUipLcN?OBtX>8c-Sqw8?TGp^!e{z(YA1pKYUk(Gr=;Imj8ZX z`#(#W)j>ByX=UZFog(=k1<3ConExupHC+gm|FGm^w?dq-GC}odfqcBPyF~gjIo==q z@RPj>mmRn3J&Wn$WM4E!H8ykp)3@0NU%B|Td@^)uIABK|y2GD-4>_W|Bwj`uuZnRRb*Gs(;-A2eT^YM!qX-%*lDHFURm?k^43^ZEOa zc+SC>=G(s?7d_nUC+26AlOw1-Qrmz3!1X62d2;zn|Jzr&Kg&uWz5PX1FEujuf3w^$ zPaqAcf$ic_$qre6>>IZJ7s;(j{yBklhNUGf|NUjT6eIFKO@UZM2+jX1l7Fd1e282g z#SkGfJmppzkNNIsaYF7H#-nPj6`(7GaQi?1`a@iQX-&<3@TZT@G}(f)SnV8qy3fOZi`+jM~$4#pJ;#mbqRYSRQ}$Q|Dr{gCcj^p{;e+iQ2AXX zf3nFBAHU>(e=qs|n(u+eUc2xSqR&o`AH`FH{d^wP0Gs?e0eVV+2R$v&YcU}Rk9$5b zKZ+h+69GR|Dh51S5_ODgyt4=o;=LcJrSS;2gZzZ^?*Mb1cYvXO77qVB3%A^O-Nox~ z;Z8OltqR)?;*24@)S!*V<7^(h0|n0Lfxe0n^)a&W7)Q7npId)<-shymo>q4$j$ZoL zSFb(}kn-rMSF3uK432!KDOiu5y?XcQ%P|IBn;+O@YnL1DA1sh5bkGn1qL#UMGuH=W zBMkeE5iE1Fj9ytSpr_!woW4FyJ@V%$MT^M_uH@_DbdDr0m+t`e2+#=Y8CJe~bjdzvt__og>_6i@JtWGBPT(foo5our|J7U&{o8mev0jfac$e?IS_<$r|apBE$_jhaqgK9*6ae9l;?v}n_wf1l{>@1pXnpM9u&&Timb z1t?v9Q2j4uO)u88QM9Rlj+gv(79vePT|hCS{INi12%-6JCi$GL0Hw6c1(MS zr$k3*7cmxrIt!&Gtze7%c`2+@>}k9~a`7@RT4?<=eEu`uf0(_Kz}pGej{EciiONa+ zj^dFHMoHLwP#XbWxcuU~-WR`q>zl+)yh-wQFFF?+7V0PvE`0tw|N6c^z1Nq)HwHY~ zmiXNhO!ohN%?X}g#~+rkvJQS`FASBO((@%n>0z}%e(bqV4c0&0-lDX3b$lM0wEpxA zq-2+4E90RR{d3IT|9a&&hu@v=UgiLZ59^fr0MWaJ&tEYAmiu1MDMu}l4V+nO6ZM;M zi*H5F9WIO8zvbd{+PpOU`H#yx|L@*@iEZUOJ~{x?w^}y-X~IImm*-0PDa(_Ebp6vX z`u7`3NQnOJUp-%;gccy*|D(@*c^3#;&7LCp+go9z<-dQlTe|wTydEzf*-+jL%ho|bLBayukz0q zCfDnj^9z^nRyV3-`6bT}C6135Z(s_iI{)}-!|gJ7yp`@t=ulm8709&*;ejhGf|75Ra$GcA57@6z&zCWH!0jbzZfVZ>2`wWoN>zS(=XomC@6@NnU zS`1}!xsaygn(I1LaDhg11H3z%Jik8K|7X^pMTx#Gxh@{pH_|jiSXXqnX?vYnxJo0i zzB>CY|IX9N8d1BGxFe%UetHyN_EDA6@1e%)BzKqqF=I)%U2E_b7f(F5|B3gT9{%ww zXA!rTkDppRUGVjG7x^JSpNt>t6*^Yn-todz0iuV1N4_EzA@^M4$tk&A!1DaIKsZKW z=LyiW0z5|A&k4{!1bEQL&Z(Z=gO66;S1z-1{GKO#B0zf?k8*6!MNyx6SwD08QGK7h z>7su`v6~1dNPn^1;B6(e7McmPCwSCitcs>WTLB(cA1xn0<&KMb@XvsJ!s{UHCqUx_ zc+9)-93bi#yzTo{OBi@37_TD1n=L=H zTqh-Xi!2;_5A{FVjYKcfSAIVu${1lME{Yi8xH?z(%V|d{XUi0pTiAQgsvv}X^Onpp zkKc7kynt2~?wiJYz<5}BoB$8`nOH22jmCS~!VMOW)iCIn#_KHquZ{O7<6--9 zIy>}%@eY&!L*sGMI$p}06W1eB0pn#1T}ok#I4uz#?XQ*bs57)v_|%!9=AU9N!SF-$ z@`URukZ-7?#R;#I#W})wJ;WPnys5^cZgCT4VmR&E+2akk>4cSb`Ixep24K-oVmK>rbZB%endol0Z8z2tsryw(atIO3y?Ls*b_u_AG)pOqA) zh?64WpTOt?f(;gx!Yu-XWi(RG|4cUrL54CE4%k`92Okvo2b>md=p>bgL7WM0LWQ41B5a zZZIA?^+w}y+LEhd%%$Vw>cMzK^bF>WdIxw-?GD;(OZofC?QA^4c9DNixqd$zJkD(; zb;B&2oaijpL*-6R@X&0;i&o=4!f`GvEoPSS_K?3B7eurM*E`K=vQ!$2or&$EJ)+B1 zCUa#|x7X5FH}$w>npYjFzt~>97sGYF6vQf(U-@*aXlE+k+Pn+lPOTzUKeUu$3%p<{ z{Y`@RTjTi^BD9oW;hNMmE^$`7pks|k|1;Hi%Z!JT06nR zZ;loqdPDcL|Dd?&|2{N1Jnh@$hd!0-o;KFlMS6nCwaDGAgbBHamGCphXtl zj-KU$Xqb2|M+>7efp-FbL?;TAQ-v^1fP4>+-}ms|s-(?%t8%6M+>5SSB|yGU=GmMV zapLdS@iV;6$79!gX9pg?Y|I4WL%t`hB5VeiS9h8|JhYeNEvP{c;oq;yJVP-#mh|tn ztW*5y=L#fyO1E=zv@}HK*KK`l3l&@8S!T-m<4$Ksk0qIRu@id;ovl1g7FG5a_%h$d zDAU}=sz^7LYb>!yKC~G#1n~?ZmQUOY(&nES`xYZV|3xnSb1HTZ-#eLZfzsupyV6PW zqq@FG!9wNVCHXTf+BEt70@uHg%Lpb^{=N!(Y><5PX*&7xr#*+tKTP@WXu6~!P7JNd ztX1KbkzKQkpYi$c7V~%vIXa|Ob=k~S3(9;C;XB+QVo#R-N9ZjN&&S&~6x9&%7$F^L z;ovc%X2dr&!J8&O{l)YIkJ0sg;#C??PBgmSNpAS}Gh?08O|}R6{gd0jd(UxM{aL0p z8sAeUEx-=%Ts@V4|2KN+gSGbzl4JFXn0;-D<0ahP!#<;{&MEg;PxCDE&;N!$|Kjf@ zpU`LiHl)L~gY5c~|9;ZnTv(q|j@Zx1(#(IZlk4GmlF$$#ZiSiUm;X&m`ZH_*cUN4l z&gRVQQTSeZ_WZYQwR>})O)~XKf3p6>YkFAl)J%%7s{mm^!(&8_)dG3zY+Lz9*0TRk zz6cj>b7WlQHSST=LXtn!MP z-Db>XjN8SsJV`FzUcxcPD>L2^;xShTRT*!L{PRoCvtL}~T&vDx23q;WK&26T>oi zy9h7h5jCgyn;)`Zd6izoh{&IdbEtl$tsD5~;pSnn6Nr+QOqygMN45(*=4JO5py>j< zt%R8ZLj>Pm;nzI>+(jntmIrI;e!1{y)4XTHNb3>fk+Sd0PipMWBrGgC9xtK@TI8FvnBd#(7FN8L)OgDyDfBvPtbW3%K zwNMdt(eLf$>VNd++@A>`+Sz#cUlUv@$LBJJ+Mk@@%fIfjaak|mIV_LH=k6J}5?g9{ zWEM`}wrhIf*~leLo<_;Dl>o1~aFDQ<&{KeiRah?c7Kj603xU3OPhp|pdFW$!R~V1@ z{$RX6CU{iwH+Txw3**iB|DK+75WBU?~&+wX~`!5kfMh$L9kvrWe zZAU6`f`*)Bp(>=G!jV0nR;gN%?<=m@0rAYPpATrLr^-xHq5Vj{1#hVot*+(FO3mw8 zz8$tZDh2g@qFeSERq<>D`^4NSZkekLzC89-YQi;U{u4ivI}WkF*4C+f)9qhIs_7*A zH`1NxPbfXKyUKj&1PhohKT_wZQPxKO#gacONIu#(o&5N3xq^k}{~pO_yb7h~znJx} zdHhX!TuVq5#7_YVb=gN=8_L}jy{(5O$H8%YeV)Z|=`RLOi z%E*;xzEgv`O9Q$c7%p@VC5#y8K{*9SCQ|f<4Lo{3z6MJVdbow#N&cSlLqm+Wz5GLs zH`;jgNkj?H*u~rux|v0^B1odSx8qd5_7@xce#N(Z7e6U;gi0 zY-)DGdPP$$|3~}~y)Pga`oKBWyD#B4(Vrf2c6&N-i+qkWRvFzGM6 z{xDIs5o>_8Sa&w|Bw3sb&8l0|_sc0tfaTDg=N0d;aXoob&QS%|Ibu2SYH0ZT@A=d3 zN|`E9Zgt`mt0$zHukJz@tMXCmy9w*4h@#7lM_s(ac)U$aIO^Rs#=F6I)Vmvvcc<}M zig%aser3Ei;{DoqO>C?{yJ#Ul?V_#mXcx_!WuKpewR3szt8bQ5U4QUHNb@?5k;xXy z-HG+^{0qJROxX~8lIm`uk1y0g9qqaC%sbh0JIHvH zcz5FsNbm+4?`Y$pyCxW~T&_zalIWMdZCBp5(A2nhjOX;?E>9RiU%Z0lRqG;!!BH*zux|I(!=C)Zpl171E}!MqTH3!MXIHo z1w3CptXrA(dz{)TrttTMLPn0|iZOg|M1|T2rx~-?$!Vg2y8oOU-O^BF;dnhbSu%dq zhhC}MC@tSpDtr=r_IDb5I`&sOYPVl6cfFo|xS{+0^^y^8pM{@KG(_=+*R9yL^!p}g z@26`PZu5Pu!0pD*Jhx|pQc?F>m8O5t|IFp5k@R2mPRHpA6srHeBmJ|)A}uDLF-jUC z-|N0m`Rs-Gvqf4=e!n!~x`zIzE%-DP2_9W$j~M&Opknf|V$!HK`9E5+egDTSesb4L zrdG+Gc|?C^f2D5^B`>^{<{w4n8--k`c*Ey%!%hdrmM^}d;NLhc{KoKEiYI*JFz;v>0PiZ8tG6z@40XJCy_%CRWoe3j`{XyIuaA<;%>LFLTC&;kooPSea|6*=N8o=1gBvO4eGQL-x4Zr>?tV zTJsfHI>S_Iv&@q3q%?fhtK79&qO~e8>SP|bD6Ab z@i&0-*I@K4vkBoXVq|LH>g(|!#TouaPchBZN3qqvp3JnolBJgZ1Ue`+7i{)g;p=X0 zFTxC1eVl5Zc`CzH#Tq_WnEzW(ZkJ+sJ@DE#`yDY~tB$OvoVqhSe5{idYkC@e*%#|$ zXibct!Y!+KS4E*Y^3{s3;n#c^9oBc9_A7?D^IFB1&Wu5SHc;WXu6cV(p{eDpI#`C6i$D)a0qpPzY(YxB)jX1<5(=Pmy0{{LA5j80ZW zV-z=U-c5Bee1;_dJJs|%tW(wYow}Ou{6cH`HQoH@e)+c6Rq5J%JqvqNE0r=KqTaZUQ?If@O9t9zF&R<$ux+pDm?FapHEEz0Qv9~7tyXyH4*R=mo9p=$XSG!9c z@I8PY8knt)Hcz7x|%RcesV zmk6kH!-XDE3Ww-g$d?LO)Ze=KWlh!0RCk+{l>V8`;M)Fh$WdE$-{r(=KfG+(y7W{@ zL{cxMYeXc!t5U{fKt>zbY-Lw`qSC3k8kA-8=&KpF9b~7H*P4xJQoO8e?Kn|jU+CF2 zuChuSG}oYf^rS=TT3zZ{vqo3X3Jo^mDf{{_!5*63s(oAiv{BSQuiN~ZK&EB;^(D^c`R8PTbgGT~LnNP_P*9ru0nvHBE?l9%wR!*GX5_O?K$I@O*xMh` z`>&-d6c6i^q4naBnMSywx}@r|iN78~ln9P82#6}7+9>tD|X(LejB{vTo0ubBLh_IHWmx?Bit zf4nU|FHnAn{=dd#hsqzR_Q!5)s9644k4q!;&w2&8LI{=5S7CUkJEE}p?f-jix%gU2 zW3wrDZ*=3qka-E#VK`RFztZ1OvlMk(KWH5GdcO68V>DaAVOz}fBwrh-|9+;fZM^Y~ z7vt^5*;_apTib3N^)ESJTkHj(hN*w?+Vgo)@AS?g_iq32Kc3o-ANV6?)}Q~DowoUE z&bw~=GB$r(xnzs06MGGK35sXjdb`uN=+M&pBWBj0|2}W`y!kx)01Z%kYNt$3?LooE z%M)IY@3F;0aryrBPf;npbI8w{ZFu+BQ9Ht)RkYF1qGJZhjrM+RwtX*~f9lUzp!}DhobaTFk)(~&eDFf`w-aPx){ow+1nagxIw11VO{+>v- z9e;MSYhye9_xCEdjFZMR+jz`xZCpGiuN@ycALB<2bqZ`RXQ#%i(OjriQ#p0nFu!>jG~gt9kA^1j=lLfU)IC+K?m z`5)Pf8u9zboQlLLSlLS(B_(g%co)Z~MCFLFP%ceOvNF*WbN{ zDHI*^AIQC00Yc?JCHY>{q?bS6lu0MauW|YRM)I$*Xy?dGVjDT%tXZL{!tC$kCeH>e zbdp!{E$4}fFMgxkE%v(8k;BgjblZ&6zRTj{r54rftQ6j-t*CDCXuPlLtc#Erbllel z>iUka`&Lu_Cz)RVdWP)3jOstVUTFRAsQIS_R{x60514T4&ZS2o|m7sYRX)*Z${eLOX@LNJ$SJP5lQt}HGK-m6!jvh&;+T_2B@_(E~ zTP**yfi%MYxKaVgJCqjIUmGgY)`@sN9#K>I!0crE8=UXZls-S8y7x{r|_$L?kuJHx6=!!Ww>(er(*qRXdmT0e3Zq4 zXL(e9*Xut2tTxCG-7LVP{oNu!4+`*@d3#8J))k$YU6#ca@W_350L++OvroB9UMQ68$lJktt=;`&VeUaGK5BJON^ zo`Zh0!!*)GI+Mg~5xlm-_5w3WEd|e`u5oP-<8i%%&|IKg2}eCcA3P`czGwC(AjdG9(H;bdn@1gVVYhHsL6<-utp4dIm_v;`XBEVP8IV_`Hr%|LZ-d% zC}6KWCLAhIeCVRC0(7_lkFp&uTqleWJnsnkv3;=Z;Z+H~-=1td>`lh|T=zWUJ61^0 zM~!a1k-=T^vrY}O;#ik;@5Z+mneK6}lsd+b->cviCrz>Om0{ysvt1-pB;SY58eiGf zx&Hl33Sg>$ZrDXA6CMz-@{GvG3WR`8C1w z&XXVe5k5TRUM8F-tQX)R_i|yiaE0LSy+(f0^7RDoR{3udZZqCEx!9^b1>|t=bm3v4 zzwn3vZ@loR&`Uu7!XvMb3)pv02=F=y_X|nheEoh(z&?IjARK!8Ng>I@j{Kg$^=Hj( zCHKB89%cH1fSvl1U4yqtAl@GvZ%4V$3(%Va@e&SOlIQWZ;CX+OpJ(u%@$i2rVB7ya z!TUu18--7eN8X5pc$%7vj4vI#nn!$F=sM-p+`_@*h)v3~WrDYh{CA7z=S=9Mcn@`m z+#@X9Z26Crf0W!Y#-nbIm4B$*ql`CG{&Dit4~{n;a)K~kjWiK$^F5;4U^EGM1Zvg}GZ>82v2qJi<{I zpjEmMI(~O|xW9F^Wi+^|-}7Dhm_g6sfsu7 z*K|x-Xtl2ROvYBKE1Pd+G9;(khjv$oHz`pk;i#B=?2a@- z{sslWejyEMVg0qylFvLgR7^fLWE$0G{{JoY^^C)zV)A>rUi0f3NCwk3wl6|99x(?Luh&%as2W zLGpV?V~#?y;Ugb=9@$V@Sbwct^274qyL#Q#-<$0spRpJAcc}cURsLlbQL*x8yp~4D zk1}q5(!%;{eEYo8eiW16&)-zQMgH}=_H7|F|BED_@g$TkzjriVbs_Wrtxf({Nd83@ G-TwnnOcuca delta 3286 zcmb`Je{56N702Iko*yPLiIX~+lLgl}PDoM{97q|s`SB8)3_^$_}zQ%&3X5pd(L@h;+!_|k>!kk1u2RmF`7eBEa<4<%Ty|5$bQxR22GBr z3Cmoclr=-x0(8&;!a&L;8`FJsGi@tmt)LTxKo^LBDCh<;unok)%E|6G5^5){<`wFL z`T8IJye@w91IodS(#zxO@2yg65l^0YfTMmF>o%2aJZ9Zu#l98WSMmat|79(&)gU#u zwiNwbkO%B(d4BroCvLWQ_0sgP0?%@=9Js-Qpc0s>YS8zk$5nW)O!t#h+8%Pe`~3UA zDL?7l{CvenpZsOlcWD6>PX~S~W%$1w8K9%%Q@EX`cV>=+H=B$1-ybIrwm4#JJ!Z zQYFW%FYD`;>m=+xUG_IRv=}3@eAx?}x-(x8{GY z>xDsvq5V$%@*OwcJGW6jJC(ojerIvQ71BsXQK4yM9(6^nPOK=&NcNmjEjNk(JvGo{k0738wXar55 z8MFW$w1PGe0%5Qbw1aPgO<*(V09!yO*b2Hp1Vq6OFaWlJIM@#47IqTc`%w%Y13h3D z=mn31-QWqZ2lRoxpdXm&iJy!3CkJ$%c{L!eY2*@LxM{bT)yOU;d`LIVxKs|m8Iu`E z_?_g&V2Fn*T~x!rd$E)!I^0Qj%&Q`7jMhe?uaUmbBhxzm#m9~#PI0P*;%nA6$jg1~ zJ}x);+npyZWH)b+M|AdEkh(1WFY=+^VGtJ&*1JVzjAG&kyC^q!KlaE{ z3O~v=^LlYIKs^JCQdR*q+381WEdcT}mo2{tC%FpbT$Y?$#-2v1&qN<)jn-~#=pkYA zQJ46uMnnA5uers06%^-aQ=?UCSGc==1MfIg%d_JFc_p zulmGTKgCcy$aL`RBGQ57t_=n6u#k(>4&g9N6zgp{Q4%hcsEY*``GW@ znmfMIEME7MzOc_lUFkipqdB9^=Rxq_BW)VDhM&gFN*S;&9x5-B0sAOi^OHpw{_cY; zn5h3E)e;JTRN}{*$YKVR^#i=|tWm?r3ZmR5KQ6Md?$?c)LjJfGA%0jqT~AKKWe$oW z@pdJ7#Sak#{ELz0EoSW@6SqXxCRskL$l6UJ%R5uvi=ghqr?gKwkfc>dDEap3c4E)D zPM!++$&18til^U7BszaYmEvQKwsF)O#L2qPZx@a-3l5?IEYZM<-mn!rEOw7GhN2^3qHQ}6X*ZI h@JP#Yx6yyhaL@Sx{^!~fo_)fBF9J3+DfVg<{4XX@T-g8s diff --git a/PlugY/PlugY.vcproj b/PlugY/PlugY.vcproj index 9bc3c2f..2fceb0d 100644 --- a/PlugY/PlugY.vcproj +++ b/PlugY/PlugY.vcproj @@ -1,590 +1,590 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PlugY/PlugYFiles.cpp b/PlugY/PlugYFiles.cpp index e411306..0792480 100644 --- a/PlugY/PlugYFiles.cpp +++ b/PlugY/PlugYFiles.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Adding custom data. Save and load infinity & shared Stash @@ -30,12 +30,14 @@ DWORD STDCALL isModFile (char* filename) { if (strstr(filename, modDataDirectory) ) { + log_msg("Load custom file : %s\n", filename); + if ((GetFileAttributesA(filename) & 0x10) == 0) + return true; char fileTemp[0x104]; - log_msg("Load custom file : %s", filename); strcpy(fileTemp,filename); D2FogGetInstallPath(filename,0x104-strlen(filename)); strcat(filename,fileTemp); - log_msg("-> %s\n", filename); + log_msg("Load custom file full path : %s\n", filename); if ((GetFileAttributesA(filename) & 0x10) == 0) return true; } @@ -43,6 +45,17 @@ DWORD STDCALL isModFile (char* filename) } +DWORD STDCALL isModFile_114 (char* filename) +{ + if (strstr(filename, modDataDirectory) ) + { + log_msg("Load custom file : %s\n", filename); + if ((GetFileAttributesA(filename) & 0x10) == 0) + return true; + } + return false; +} + FCT_ASM ( caller_isModFile ) TEST ESI,ESI JNZ ISNOTMODDATA @@ -79,19 +92,38 @@ FCT_ASM ( caller_isModFile_111 ) ISNOTMODDATA: JMP DWORD PTR CS:[LeaveCriticalSection] }} +/* +FCT_ASM ( caller_isModFile_114 ) + TEST ESI,ESI + JNZ ISNOTMODDATA + MOV ESI, DWORD PTR SS:[ESP+0x130] + PUSH ESI + CALL isModFile + TEST EAX,EAX + JE ISNOTMODDATA + MOV BL, BYTE PTR SS:[ESP+0x134] + POP EAX + POP EAX + MOV EAX,D2StormMPQOpenFile + ADD EAX,0x93 + MOV EBP,GetFileAttributesA + JMP EAX +ISNOTMODDATA: + JMP DWORD PTR CS:[LeaveCriticalSection] +}} +*/ FCT_ASM( caller_isModFile_114 ) - PUSH EBX - CALL isModFile - TEST EAX, EAX - JE ISNOTMODDATA - MOV EDX, 0x00100001 -JMP ALLDONE -ISNOTMODDATA : - MOV EDX, DWORD PTR SS : [EBP + 0x10] -ALLDONE : - LEA EAX, DWORD PTR SS : [EBP - 0x108] - RETN + PUSH EDX + PUSH EBX + CALL isModFile_114 + POP EDX + TEST EAX,EAX + JE ISNOTMODDATA + MOV EDX,1 // Active -direct command +ISNOTMODDATA: + LEA EAX,DWORD PTR SS:[EBP-0x108] + RETN }} void Install_PlugYFiles() @@ -103,23 +135,24 @@ void Install_PlugYFiles() // Try in Diablo II\PlugY\ if file not found mem_seek R8(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79, 19369);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) ); - memt_byte( version_D2Client == V114d ? 0x8D : 0xFF ,0x90); // NOP - memt_byte( version_D2Client == V114d ? 0x85 : 0x15 ,0xE8); // CALL - if (version_Storm == V114d) - { - MEMT_REF4(0xFFFFFEF8, caller_isModFile_114); - } - else - { - MEMD_REF4(LeaveCriticalSection, version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile); - } - //6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection - //6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection - //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection - //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 - + if ( version_Storm >= V114a ) + { + memt_byte( 0x8D ,0x90); // NOP + memt_byte( 0x85 ,0xE8); // CALL + MEMT_REF4(0xFFFFFEF8, caller_isModFile_114); + //00419369 |. 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108] + } else { + memt_byte( 0xFF ,0x90); // NOP + memt_byte( 0x15 ,0xE8); // CALL + MEMD_REF4( LeaveCriticalSection, version_Storm >= V114a ? caller_isModFile_114 : version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile); + //6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + //6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + //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 + //0041BC81 |. FF15 14C26C00 CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + } log_msg("\n" ); @@ -150,31 +183,31 @@ void loadImagesFile(void** images, const char* name) void STDCALL loadCustomImages() { - if ( active_SkillsPoints ) loadImagesFile(&unassignSkillsBtnImages, "UnassignSkillsBtns"); - if ( active_StatsPoints ) loadImagesFile(&unassignStatsBtnImages, "UnassignStatsBtns"); + if ( active_SkillsPoints ) loadImagesFile(&unassignSkillsBtnImages, "UnassignSkillsBtns"); + if ( active_StatsPoints ) loadImagesFile(&unassignStatsBtnImages, "UnassignStatsBtns"); if ( active_multiPageStash || active_newInterfaces) loadImagesFile(&stashBtnsImages, "StashBtns"); - if ( active_sharedGold) loadImagesFile(&sharedGoldBtnsImages, "SharedGoldBtns"); - if ( active_newInterfaces ) loadImagesFile(&newStatsInterfaceImages, "EmptyPage"); - if ( active_newInterfaces ) loadImagesFile(&statsBackgroundImages, "StatsBackground"); + if ( active_sharedGold) loadImagesFile(&sharedGoldBtnsImages, "SharedGoldBtns"); + if ( active_newInterfaces ) loadImagesFile(&newStatsInterfaceImages, "EmptyPage"); + if ( active_newInterfaces ) loadImagesFile(&statsBackgroundImages, "StatsBackground"); } -#define freeImagesFile(I) if(I) {D2FreeImage(I);I=NULL;} +#define FREE_IMAGE_FILE(I) if(I) {D2FreeImage(I);I=NULL;} void STDCALL freeCustomImages() { - freeImagesFile(unassignSkillsBtnImages); - freeImagesFile(unassignStatsBtnImages); - freeImagesFile(stashBtnsImages); - freeImagesFile(sharedGoldBtnsImages); - freeImagesFile(newStatsInterfaceImages); - freeImagesFile(statsBackgroundImages); + FREE_IMAGE_FILE(unassignSkillsBtnImages); + FREE_IMAGE_FILE(unassignStatsBtnImages); + FREE_IMAGE_FILE(stashBtnsImages); + FREE_IMAGE_FILE(sharedGoldBtnsImages); + FREE_IMAGE_FILE(newStatsInterfaceImages); + FREE_IMAGE_FILE(statsBackgroundImages); } -FCT_ASM( caller_loadCustomImages_114 ) - CALL loadCustomImages - POP EAX - PUSH 0x6CC8B8 - JMP EAX +FCT_ASM ( caller_loadCustomImages_114 ) + PUSH ECX + CALL loadCustomImages + POP ECX + JMP D2LoadResImage }} FCT_ASM ( caller_loadCustomImages ) @@ -183,11 +216,10 @@ FCT_ASM ( caller_loadCustomImages ) RETN }} -FCT_ASM( caller_freeCustomImages_114 ) - CALL freeCustomImages - POP EAX - PUSH 0x7BEF30 - JMP EAX +FCT_ASM ( caller_freeCustomImages_114 ) + CALL freeCustomImages + CALL D2FreeResImages + RETN }} FCT_ASM ( caller_freeCustomImages ) @@ -206,26 +238,38 @@ void Install_PlugYImagesFiles() log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n"); // Load custom images - mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 96955); - memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68), 0xE8); - MEMT_REF4(version_D2Client == V114d ? 0x006CC8B8 : 0x0000000C, version_D2Client == V114d ? caller_loadCustomImages_114 : caller_loadCustomImages); - //6FAFE4B1 |. B9 0C000000 MOV ECX,0C - //6FADE101 |. B9 0C000000 MOV ECX,0C - //6FB667E1 |. B9 0C000000 MOV ECX,0C - //6FB32761 |. B9 0C000000 MOV ECX,0C - //6FAD7EAE |. B9 0C000000 MOV ECX,0C - //6FB1E0BE |. B9 0C000000 MOV ECX,0C + mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 9692F); + if (version_D2Client == V114d) + { + MEMC_REF4( D2LoadResImage , caller_loadCustomImages_114); + //0049692E |. E8 8DB7FBFF CALL Game.004520C0 + } else { + memt_byte( 0xB9 ,0xE8); + MEMT_REF4( 0x0000000C , caller_loadCustomImages); + //6FAFE4B1 |. B9 0C000000 MOV ECX,0C + //6FADE101 |. B9 0C000000 MOV ECX,0C + //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 R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 96AFB); - memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68),0xE8); - MEMT_REF4(version_D2Client == V114d ? 0x007BEF30 : 0x0000000C, version_D2Client == V114d ? caller_freeCustomImages_114 : caller_freeCustomImages); - //6FAFE639 |> B9 0C000000 MOV ECX,0C - //6FADD12D |> B9 0C000000 MOV ECX,0C - //6FB6580D |> B9 0C000000 MOV ECX,0C - //6FB3158D |> B9 0C000000 MOV ECX,0C - //6FAD6F8D |> B9 0C000000 MOV ECX,0C - //6FB1D07D |> B9 0C000000 MOV ECX,0C + mem_seek R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 56DED); + if (version_D2Client == V114d) + { + MEMC_REF4( D2FreeResImages , caller_freeCustomImages_114); + //00456DEC . E8 9FFB0300 CALL Game.00496990 + } else { + memt_byte( 0xB9 ,0xE8); + MEMT_REF4( 0x0000000C , caller_freeCustomImages); + //6FAFE639 |> B9 0C000000 MOV ECX,0C + //6FADD12D |> B9 0C000000 MOV ECX,0C + //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" ); @@ -234,12 +278,36 @@ void Install_PlugYImagesFiles() /****************************************************************************************************/ +/*char* STDCALL isModCompileFile (char* filename) +{ + if (strstr(filename, modDataDirectory) ) + return "."; + return NULL; +} +char * fff = "%s"; +FCT_ASM( caller_compileExcel_114 ) + PUSH ECX + PUSH EDX + PUSH EDX + CALL isModCompileFile + POP EDX + POP ECX + TEST EAX,EAX + JE ISNOTMODDATA + POP EAX + MOV DWORD PTR SS:[ESP],EDX + PUSH fff + ADD EAX,5 + PUSH EAX +ISNOTMODDATA: + LEA EAX,DWORD PTR SS:[EBP-0x108] + RETN +}}*/ void loadStatsInterfaceDesc(DWORD mempool); void freeStatsInterfaceDesc(); - void FASTCALL loadTxtFiles(DWORD mempool) { loadStatsInterfaceDesc(mempool); @@ -268,7 +336,6 @@ FCT_ASM ( caller_freeTxtFiles ) JMP D2Fog10212 }} - void Install_PlugYTxtFiles() { static int isInstalled = false; @@ -282,7 +349,7 @@ void Install_PlugYTxtFiles() // Load custom txt files mem_seek R8(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4, 25A560); - MEMC_REF4( D2LoadSuperuniques, version_D2Common == V114d ? caller_loadTxtFiles : version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); + MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 && version_D2Common < V114a ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); //6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500 //6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510 //01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0 @@ -291,14 +358,11 @@ void Install_PlugYTxtFiles() //6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0 //6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870 //6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40 + //0065A55F |. E8 7CADFFFF CALL Game.006552E0 // Free custom txt files mem_seek R8(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3, 25A1C8); - if (version_D2Common == V114d) { - MEMT_REF4(0x00062EE4, caller_freeTxtFiles); - } else { - MEMJ_REF4(D2Fog10212, caller_freeTxtFiles); - } + MEMJ_REF4( D2Fog10212, caller_freeTxtFiles ); //6FD479EB . E8 C8C00600 CALL //6FD479EB . E8 C8C00600 CALL //01B50185 |. E8 F8410700 CALL @@ -307,6 +371,16 @@ void Install_PlugYTxtFiles() //6FD94E12 |. E8 1744FCFF CALL //6FDAE8B2 |. E8 8FA9FAFF CALL //6FD5FAA2 |. E8 5FB4FFFF CALL + //0065A1C7 . E8 E42E0600 CALL Game.006BD0B0 ; \Game.006BD0B0 + + /*if ( version_D2Client >= V114a ) + { + mem_seek R8(Storm, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 2122A2); + memt_byte( 0x8D ,0x90); // NOP + memt_byte( 0x85 ,0xE8); // CALL + MEMT_REF4(0xFFFFFEF8, caller_compileExcel_114); + //006122A2 |. 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108] ; | + }*/ log_msg("\n" ); diff --git a/PlugY/SavePath.cpp b/PlugY/SavePath.cpp index d60012d..33e6120 100644 --- a/PlugY/SavePath.cpp +++ b/PlugY/SavePath.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Changing the current save path. @@ -51,43 +51,47 @@ END_CHANGESP: }} FCT_ASM( changeSavePath_114 ) - PUSH EAX - PUSH EDI - PUSH EDX - PUSH ESI - MOV ESI, EBX - MOV EDI, DWORD PTR DS : [savePath] - XOR AL, AL - CLD - OR ECX, 0xFFFFFFFF - REPNE SCAS BYTE PTR ES : [EDI] - NOT ECX - SUB EDI, ECX - XCHG EDI, ESI - CMP BYTE PTR[ESI + 1], ':' - JE END_CHANGESP - //RELATIVE_PATH: - MOV EDX, ECX - OR ECX, 0xFFFFFFFF - REPNE SCAS BYTE PTR ES : [EDI] - DEC EDI - CMP BYTE PTR[EDI - 1], '\\' - JE NEXT - MOV BYTE PTR[EDI], '\\' - INC EDI - NEXT : - MOV ECX, EDX - END_CHANGESP : - REP MOVS BYTE PTR ES : [EDI], BYTE PTR DS : [ESI] - POP ESI - POP EDX - POP EDI - POP EAX - CMP EAX, -1 - JE DONOT_JMP - ADD DWORD PTR SS : [ESP], 5 -DONOT_JMP : - RETN + PUSH EAX + PUSH EDI + PUSH EDX + PUSH ESI + MOV ESI, EBX + MOV EDI,DWORD PTR DS:[savePath] + XOR AL,AL + CLD + OR ECX,0xFFFFFFFF + REPNE SCAS BYTE PTR ES:[EDI] + NOT ECX + SUB EDI,ECX + XCHG EDI,ESI + CMP BYTE PTR [ESI+1],':' + JE END_CHANGESP +//RELATIVE_PATH: + MOV EDX,ECX + OR ECX,0xFFFFFFFF + REPNE SCAS BYTE PTR ES:[EDI] + DEC EDI + CMP BYTE PTR [EDI-1],'\\' + JE NEXT + MOV BYTE PTR [EDI],'\\' + INC EDI +NEXT: + MOV ECX,EDX +END_CHANGESP: + REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] + POP ESI + POP EDX + POP EDI + POP EAX + PUSH EBX + CALL DWORD PTR[GetFileAttributesA] + CMP EAX,-1 + JE DONOT_JMP + ADD DWORD PTR SS:[ESP],0x5 + RETN +DONOT_JMP: + ADD DWORD PTR SS:[ESP],0x1D + RETN }} FCT_ASM( changeSavePath_111 ) @@ -129,28 +133,6 @@ DONOT_JMP: RETN }} -FCT_ASM( forCreateSavePath_114 ) - PUSH EDI - MOV ESI, EBX - MOV EDI, DWORD PTR DS : [savePath] - MOV ECX, EDI - CMP BYTE PTR DS : [EDI + 1], ':' - JNZ END_CREATESP - PUSH ESI - XOR AL, AL - CLD - OR ECX, 0xFFFFFFFF - REPNE SCAS BYTE PTR ES : [EDI] - NOT ECX - SUB EDI, ECX - XCHG EDI, ESI - REP MOVS BYTE PTR ES : [EDI], BYTE PTR DS : [ESI] - POP ESI -END_CREATESP : - POP EDI - MOV DWORD PTR SS : [ESP + 8], ECX - JMP D2Storm503 -}} FCT_ASM ( forCreateSavePath ) PUSH EDI @@ -175,7 +157,6 @@ END_CREATESP: }} - void Install_ChangingSavePath() { static int isInstalled = false; @@ -185,7 +166,7 @@ void Install_ChangingSavePath() if (version_Fog >= V111) { - // Appel de notre fct d'ajout d'un sous-r�pertoire + // Call funtion to manage subfolder mem_seek R8(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146, 71A6); memt_byte( 0x83 ,0xE8); // CALL changeSavePath MEMT_REF4( 0x0575FFF8, version_Fog == V114d ? changeSavePath_114 : changeSavePath_111); @@ -199,24 +180,25 @@ void Install_ChangingSavePath() //6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90 //6FF6E146 . 83F8 FF CMP EAX,-1 //6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64 + //004071A6 |. 83F8 FF CMP EAX,-1 + //004071A9 |. 75 05 JNZ SHORT Game.004071B0 - // Pour cr�er le bon chemin de sauvegarde - mem_seek R8(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166, 71CA); - if (version_Fog == V114d) { - MEMT_REF4(0x0000C582, forCreateSavePath_114); - } else { - MEMJ_REF4(D2Storm503, forCreateSavePath); - } - //6FF68615 . E8 A246FFFF CALL - //6FF6C125 . E8 C20BFFFF CALL - //6FF6F0A5 . E8 34DDFEFF CALL - //6FF67FA5 . E8 504EFFFF CALL - //6FF6E165 . E8 6AEBFEFF CALL - + // Create the right save path + if (version_Fog < V114a) + { + mem_seek R8(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166, 71CA); + MEMJ_REF4( D2Storm503, forCreateSavePath); + //6FF68615 . E8 A246FFFF CALL + //6FF6C125 . E8 C20BFFFF CALL + //6FF6F0A5 . E8 34DDFEFF CALL + //6FF67FA5 . E8 504EFFFF CALL + //6FF6E165 . E8 6AEBFEFF CALL + //004071C9 |. E8 82C50000 CALL Game.00413750 ; \Game.00413750 + } // Remove registry update mem_seek R8(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A, 71E9); - memt_byte( version_Fog == V114d ? 0x53 : 0x56 ,0xEB); // JMP SHORT fog.6FF6862C + memt_byte( version_Fog == V114d ? 0x53 : 0x56 ,0xEB); // JMP SHORT fog.6FF6862C memt_byte( 0x6A ,0x10); // memt_byte( version_Fog == V114d ? 0x01 : 0x00 ,0x90); // NOP //6FF6861A . 56 PUSH ESI @@ -238,10 +220,10 @@ void Install_ChangingSavePath() //6FF67FAB . 6A 00 PUSH 0 //6FF6E16A . 56 PUSH ESI //6FF6E16B . 6A 00 PUSH 0 - + //004071E9 |> 53 PUSH EBX ; /Arg4 + //004071EA |. 6A 01 PUSH 1 ; |Arg3 = 00000001 } else { - - // Appel de notre fct d'ajout d'un sous-r�pertoire + // Call funtion to manage subfolder mem_seek( (DWORD)D2FogGetSavePath + 0x28);//6FF61928-6FF50000 memt_byte( 0x56 ,0x90); // NOP memt_byte( 0xFF ,0xE8); // CALL changeSavePath @@ -250,14 +232,14 @@ void Install_ChangingSavePath() //6FF61929 FFD5 CALL EBP //6FF6192B 83F8 FF CMP EAX,-1 - // Pour cr�er le bon chemin de sauvegarde + // Create the right save path mem_seek( (DWORD)D2FogGetSavePath + 0xBD);//6FF619BC MEMJ_REF4( D2Storm503, forCreateSavePath); //6FF619BC . E8 5D2A0000 CALL // Remove registry update mem_seek( (DWORD)D2FogGetSavePath + 0xC1);//6FF619C1-6FF50000 - memt_byte( 0x56 ,0xEB); // JMP SHORT FOG.6FF619D2 + memt_byte( 0x56 ,0xEB); // JMP SHORT FOG.6FF619D2 memt_byte( 0x53 ,0x0F); //6FF619C3-6FF619D2 //6FF619C1 56 PUSH ESI //6FF619C2 53 PUSH EBX diff --git a/PlugY/SavePlayerData.cpp b/PlugY/SavePlayerData.cpp index 2488b5c..018bf2c 100644 --- a/PlugY/SavePlayerData.cpp +++ b/PlugY/SavePlayerData.cpp @@ -1,17 +1,158 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. Save Player Custom Data. =================================================================*/ +#include +#include #include "infinityStash.h" #include "extendedSaveFile.h" #include "sharedSaveFile.h" #include "common.h" +bool active_AutoBackup = false; +int maxBackupPerCharacter = 5; + +/*backup +Save SP : +00530441 |. E8 CAC5FFFF CALL Game.0052CA10 + 0052CA5A |. E8 A1590000 |CALL Game.00532400 ; \Game.00532400 + 005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240 + 00532275 |. E8 B6C95256 CALL PlugY.caller_SaveSPPlayerCustomData +00530503 |. E8 98980000 |CALL Game.00539DA0 + 00539E03 . E8 F82AFFFF CALL Game.0052C900 + 0052C93B |. E8 C05A0000 CALL Game.00532400 ; \Game.00532400 + 005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240 + 00532275 |. E8 B6C95256 CALL PlugY.caller_SaveSPPlayerCustomData +Save MP : +00530441 |. E8 CAC5FFFF CALL Game.0052CA10 + 0052CA5A |. E8 A1590000 |CALL Game.00532400 ; \Game.00532400 + 005324FD |. E8 3EFEFFFF CALL Game.00532340 ; \Game.00532340 + 00532399 |. E8 62D15256 CALL PlugY.caller_SendSaveFilesToSave_11> +00530503 |. E8 98980000 |CALL Game.00539DA0 + 00539E03 . E8 F82AFFFF CALL Game.0052C900 + 0052C93B |. E8 C05A0000 CALL Game.00532400 ; \Game.00532400 + 005324FD |. E8 3EFEFFFF CALL Game.00532340 ; \Game.00532340 +*/ +void backupSaveFiles(char* name, int isHardCoreGame) +{ + if (!active_AutoBackup) + return; + + char savePath[MAX_PATH]; + char backupPath[MAX_PATH]; + char szSaveName[MAX_PATH]; + char szBackupName[MAX_PATH]; + + D2FogGetSavePath(savePath, MAX_PATH); + + // backupfiles + time_t t = time(NULL); + struct tm* tm = localtime(&t); + sprintf(backupPath, "%sbackup", savePath); + CreateDirectory(backupPath, NULL); + sprintf(backupPath, "%sbackup\\%s_%04d%02d%02d_%02d%02d%02d\\", savePath, name, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); + CreateDirectory(backupPath, NULL); + log_msg("backup directory:%s isHardcore:%d\n", backupPath, isHardCoreGame); + + sprintf(szSaveName, "%s%s.d2s", savePath, name); + sprintf(szBackupName, "%s%s.d2s", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.d2x", savePath, name); + sprintf(szBackupName, "%s%s.d2x", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.ma0", savePath, name); + sprintf(szBackupName, "%s%s.ma0", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.ma1", savePath, name); + sprintf(szBackupName, "%s%s.ma1", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.ma2", savePath, name); + sprintf(szBackupName, "%s%s.ma2", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.ma3", savePath, name); + sprintf(szBackupName, "%s%s.ma3", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + sprintf(szSaveName, "%s%s.map", savePath, name); + sprintf(szBackupName, "%s%s.map", backupPath, name); + CopyFile(szSaveName, szBackupName, true); + + if (separateHardSoftStash && isHardCoreGame != 0) + { + sprintf(szSaveName, "%s%s%s.sss", savePath, "_LOD_HC_", sharedStashFilename); + sprintf(szBackupName, "%s%s%s.sss", backupPath, "_LOD_HC_", sharedStashFilename); + CopyFile(szSaveName, szBackupName, true); + } + if (!separateHardSoftStash || isHardCoreGame != 1) + { + sprintf(szSaveName, "%s%s%s.sss", savePath, separateHardSoftStash && isHardCoreGame != 0? "_LOD_HC_" : "_LOD_", sharedStashFilename); + sprintf(szBackupName, "%s%s%s.sss", backupPath, separateHardSoftStash && isHardCoreGame != 0? "_LOD_HC_" : "_LOD_", sharedStashFilename); + CopyFile(szSaveName, szBackupName, true); + } + + // delete older backup + if (maxBackupPerCharacter > 0) + { + sprintf(szBackupName, "%sbackup\\%s_*", savePath, name); + WIN32_FIND_DATA FindFileData; + HANDLE hFind = FindFirstFile(szBackupName, &FindFileData); + if (hFind) + { + // Count nb backup folders + int nbFolders = (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; + while(FindNextFile(hFind, &FindFileData)) + nbFolders += (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; + + // delete nbFolders - maxfolder + log_msg("Backup nbFolders: %d\n", nbFolders); + nbFolders -= maxBackupPerCharacter; + if (nbFolders > 0) + { + hFind = FindFirstFile(szBackupName, &FindFileData); + do + { + if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + { + sprintf(backupPath, "%sbackup\\%s\\", savePath, FindFileData.cFileName); + log_msg("Delete backup : %s\n", backupPath); + + sprintf(szBackupName, "%s%s.d2s", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.d2x", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.ma0", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.ma1", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.ma2", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.ma3", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s%s.map", backupPath, name); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s_LOD_%s.sss", backupPath, sharedStashFilename); + DeleteFile(szBackupName); + sprintf(szBackupName, "%s_LOD_HC_%s.sss", backupPath, sharedStashFilename); + DeleteFile(szBackupName); + RemoveDirectory(backupPath); + nbFolders--; + } + FindNextFile(hFind, &FindFileData); + } + while (nbFolders > 0); + } + } + } +} void STDCALL SaveSPPlayerCustomData(Unit* ptChar) { @@ -19,46 +160,69 @@ void STDCALL SaveSPPlayerCustomData(Unit* ptChar) log_msg("\n--- Start SaveSPPlayerCustomData ---\n"); - if (PCPY->selfStashIsOpened) + NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__); + backupSaveFiles(PCPlayerData->name, ptClient->isHardCoreGame); + + if (active_PlayerCustomData) { - DWORD curSizeExt = 0; - DWORD maxSizeExt = 0x4000; - BYTE* dataExt = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeExt,__FILE__,__LINE__,0); - d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__); - saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt); - writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt); - D2FreeMem(PCGame->memoryPool, dataExt,__FILE__,__LINE__,0); + if (PCPY->selfStashIsOpened) + { + DWORD curSizeExt = 0; + DWORD maxSizeExt = 0x4000; + BYTE* dataExt = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeExt,__FILE__,__LINE__,0); + d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__); + saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt); + writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt); + D2FreeMem(PCGame->memoryPool, dataExt,__FILE__,__LINE__,0); + } + + if (active_sharedStash && PCPY->sharedStashIsOpened) + { + DWORD curSizeShr = 0; + DWORD maxSizeShr = 0x4000; + BYTE* dataShr = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeShr,__FILE__,__LINE__,0); + d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__); + saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr); + + writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, ptClient->isHardCoreGame ); + D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0); + } } - - if (active_sharedStash && PCPY->sharedStashIsOpened) - { - DWORD curSizeShr = 0; - DWORD maxSizeShr = 0x4000; - BYTE* dataShr = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeShr,__FILE__,__LINE__,0); - d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__); - saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr); - - NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__); - writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, ptClient->isHardCoreGame ); - D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0); - } - log_msg("End saving.\n\n"); } -FCT_ASM( caller_SaveSPPlayerCustomData_114 ) - CALL D2FogGetSavePath - PUSH EDI - CALL SaveSPPlayerCustomData - RETN + +FCT_ASM ( caller_SaveSPPlayerCustomData_114 ) + MOV EAX,DWORD PTR SS:[ESP+8] + TEST EAX,EAX + JE next + PUSH ECX + PUSH EDX + PUSH EDX + CALL SaveSPPlayerCustomData + POP EDX + POP ECX +next: + JMP D2SaveSPChar }} FCT_ASM ( caller_SaveSPPlayerCustomData_111 ) + MOV EAX,DWORD PTR SS:[ESP+0x14] + TEST EAX,EAX + JE next + PUSH DWORD PTR SS:[ESP+0x8] + CALL SaveSPPlayerCustomData +next: + JMP D2SaveSPChar +}} + + +/*FCT_ASM ( caller_SaveSPPlayerCustomData_111 ) CALL D2FogGetSavePath PUSH DWORD PTR SS:[ESP+0x2608] CALL SaveSPPlayerCustomData RETN -}} +}}*/ FCT_ASM ( caller_SaveSPPlayerCustomData ) CALL D2FogGetSavePath @@ -193,7 +357,7 @@ void STDCALL SendSaveFilesToSave( Unit* ptChar ) dataToSend->sizeShared = curSizeShr; dataToSend->curShared = 0; dataToSend->dataShared = dataShr; - log_msg("clientID=%d\t init=%d\t sizeExtended=%X\t curExtended=%X\t dataExtended=%X\t sizeShared=%X\t curShared=%X\t dataShared=%08X\n", + log_msg("SendSaveFilesToSave : clientID=%d\t init=%d\t sizeExtended=%d\t curExtended=%d\t dataExtended=%d\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", dataToSend->clientID, dataToSend->init, dataToSend->sizeExtended, dataToSend->curExtended, dataToSend->dataExtended, dataToSend->sizeShared, dataToSend->curShared, dataToSend->dataShared); /* NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__); @@ -208,19 +372,19 @@ void STDCALL SendSaveFilesToSave( Unit* ptChar ) D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0); } */ - log_msg("End SendSaveFilesToSave.\n\n"); + log_msg("SendSaveFilesToSave : End\n\n"); } DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient) { - log_msg("ManageNextPacketToSend: "); + log_msg("ManageNextPacketToSend\n"); s_dataToSend* dataToSend = ptDataToSend; while (dataToSend && (dataToSend->clientID != ptClient->clientID)) dataToSend = dataToSend->next; if (!dataToSend) return 1; - log_msg("clientID=%d\t init=%d\t sizeExtended=%X\t curExtended=%X\t dataExtended=%X\t sizeShared=%X\t curShared=%X\t dataShared=%08X\n", + log_msg("ManageNextPacketToSend : clientID=%d\t init=%d\t sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", dataToSend->clientID, dataToSend->init, dataToSend->sizeExtended, dataToSend->curExtended, dataToSend->dataExtended, dataToSend->sizeShared, dataToSend->curShared, dataToSend->dataShared); if (dataToSend->sizeExtended && dataToSend->dataExtended && (dataToSend->curExtended < dataToSend->sizeExtended)) @@ -234,7 +398,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient) msg->isCustom = true; msg->packSize = remainingData > 0xFE ? 0xFF : (BYTE)remainingData + 1; CopyMemory(msg->data, &dataToSend->dataExtended[dataToSend->curExtended], msg->packSize); - log_msg("Saving Send Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); + log_msg("ManageNextPacketToSend : type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7); dataToSend->init = false; dataToSend->curExtended += msg->packSize - 1; @@ -246,7 +410,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient) D2FreeMem(PClientGame->memoryPool, dataToSend->dataExtended,__FILE__,__LINE__,0); dataToSend->dataExtended = NULL; } - log_msg("End Send Packet\n"); + log_msg("ManageNextPacketToSend : End\n"); return 0;//ManageNextPacketToSend(ptClient);//return 0; } @@ -261,7 +425,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient) msg->isCustom = true; msg->packSize = remainingData > 0xFE ? 0xFF : (BYTE)remainingData + 1; CopyMemory(msg->data, &dataToSend->dataShared[dataToSend->curShared], msg->packSize); - log_msg("Saving Send Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); + log_msg("ManageNextPacketToSend : type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7); dataToSend->init = false; dataToSend->curShared += msg->packSize - 1; @@ -273,11 +437,11 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient) D2FreeMem(PClientGame->memoryPool, dataToSend->dataShared,__FILE__,__LINE__,0); dataToSend->dataShared = NULL; } - log_msg("End Send Packet\n"); + log_msg("ManageNextPacketToSend : End\n"); return 0;//ManageNextPacketToSend(ptClient);//return 0; } - log_msg("End Send Packet\n"); + log_msg("ManageNextPacketToSend : End\n"); return 1; } @@ -286,7 +450,7 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg) { if( (msg->packID != customPackID) || !msg->isCustom) return 0; - log_msg("Saving Receive Packet: id = %d\ttype=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); + log_msg("ReceiveSaveFilesToSave : Receive Packet - type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data); bool isShared; @@ -301,10 +465,10 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg) { D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0); D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0); - ZeroMemory(&receivedSaveFiles, sizeof(receivedSaveFiles));//TODO + ZeroMemory(&receivedSaveFiles, sizeof(receivedSaveFiles)); } - log_msg("receivedSaveFiles: sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", receivedSaveFiles.sizeExtended, receivedSaveFiles.curExtended, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeShared, receivedSaveFiles.curShared, receivedSaveFiles.dataShared); + log_msg("ReceiveSaveFilesToSave : sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", receivedSaveFiles.sizeExtended, receivedSaveFiles.curExtended, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeShared, receivedSaveFiles.curShared, receivedSaveFiles.dataShared); DWORD size = msg->packSize - 1; if (isShared) @@ -331,77 +495,48 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg) CopyMemory(&receivedSaveFiles.dataExtended[receivedSaveFiles.curExtended], msg->data, size); receivedSaveFiles.curExtended += size; } - log_msg("End Save Receive Packet\n"); + log_msg("ReceiveSaveFilesToSave : End\n"); return 1; } void STDCALL SaveMPPlayerCustomData(BYTE* dataD2Savefile ) { - log_msg("Start SaveMPPlayerCustomData.\n"); + log_msg("SaveMPPlayerCustomData - Start.\n"); + Unit* ptChar = D2GetClientPlayer(); - if( receivedSaveFiles.sizeExtended && (receivedSaveFiles.sizeExtended == receivedSaveFiles.curExtended) && receivedSaveFiles.sizeShared && (receivedSaveFiles.sizeShared == receivedSaveFiles.curShared) ) + backupSaveFiles(PCPlayerData->name, (dataD2Savefile[0x24] & 4) == 4); + + if (active_PlayerCustomData) { - log_msg("Saving can start\n"); - if (ptChar) + if( receivedSaveFiles.sizeExtended && (receivedSaveFiles.sizeExtended == receivedSaveFiles.curExtended) && (!active_sharedStash || receivedSaveFiles.sizeShared && (receivedSaveFiles.sizeShared == receivedSaveFiles.curShared)) ) { - writeExtendedSaveFile(PCPlayerData->name, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeExtended); - D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0); - if (active_sharedStash) - writeSharedSaveFile(PCPlayerData->name, receivedSaveFiles.dataShared, receivedSaveFiles.sizeShared, (dataD2Savefile[0x24] & 4) == 4);//6FBAB9A4-6FAA0000 - D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0); - ZeroMemory(&receivedSaveFiles,sizeof(receivedSaveFiles)); - } - log_msg("Receive Savefiles completed\n\n"); - } else { - if (ptChar) - { - log_box("Connection error : back up current save file then save with client data."); - backupSharedSaveFile(); - backupExtendedSaveFile(PCPlayerData->name); - SaveSPPlayerCustomData(ptChar); + log_msg("SaveMPPlayerCustomData - Saving can start\n"); + if (ptChar) + { + writeExtendedSaveFile(PCPlayerData->name, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeExtended); + D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0); + if (active_sharedStash) + { + writeSharedSaveFile(PCPlayerData->name, receivedSaveFiles.dataShared, receivedSaveFiles.sizeShared, (dataD2Savefile[0x24] & 4) == 4);//6FBAB9A4-6FAA0000 + D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0); + } + ZeroMemory(&receivedSaveFiles,sizeof(receivedSaveFiles)); + } + log_msg("SaveMPPlayerCustomData - Receive Savefiles completed\n\n"); + } else { + if (ptChar) + { + log_box("Connection error : save with client data."); + SaveSPPlayerCustomData(ptChar); + } } } - log_msg("--- End SaveMPPlayerCustomData. ---\n\n"); + log_msg("--- SaveMPPlayerCustomData End ---\n\n"); } -void STDCALL SaveMPPlayerCustomData_114() -{ - if (!D2isLODGame()) return; - log_msg("\n--- Start SaveMPPlayerCustomData ---\n"); - - Unit* ptChar = D2GetClientPlayer(); - - if (PCPY->selfStashIsOpened) - { - DWORD curSizeExt = 0; - DWORD maxSizeExt = 0x4000; - BYTE* dataExt = new BYTE[maxSizeExt]; - ZeroMemory(dataExt, maxSizeExt); - d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__); - saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt); - writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt); - delete[] dataExt; - } - - if (active_sharedStash && PCPY->sharedStashIsOpened) - { - DWORD curSizeShr = 0; - DWORD maxSizeShr = 0x4000; - BYTE* dataShr = new BYTE[maxSizeShr]; - ZeroMemory(dataShr, maxSizeShr); - d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__); - saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr); - - NetClient* ptClient = D2GetClient(ptChar, __FILE__, __LINE__); - writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, 0/*ptClient->isHardCoreGame*/); - delete[] dataShr; - } - - log_msg("End saving.\n\n"); -} /* @@ -468,7 +603,12 @@ end_caller_ManageNextPacketToSend_9d: RETN }} - +FCT_ASM( caller_SendSaveFilesToSave_114 ) + PUSH DWORD PTR SS:[ESP+0x4] + CALL SendSaveFilesToSave + MOV EDI,DWORD PTR SS:[EBP-0x2008] + RETN +}} FCT_ASM( caller_SendSaveFilesToSave_111 ) PUSH DWORD PTR SS:[ESP+0x2014] @@ -494,6 +634,21 @@ FCT_ASM( caller_SendSaveFilesToSave_9 ) RETN }} +FCT_ASM ( caller_ReceivedSaveFilesToSave_114 ) + CMP EDX,-1 + JE continue_rcvFct + PUSH ECX + PUSH EDX + PUSH ECX + CALL ReceiveSaveFilesToSave + POP EDX + POP ECX + TEST EAX,EAX + JE continue_rcvFct + RETN +continue_rcvFct: + JMP D2ReceivePacket +}} FCT_ASM ( caller_ReceivedSaveFilesToSave_111 ) LEA EAX,DWORD PTR SS:[ESP+0x10] @@ -529,16 +684,6 @@ continue_rcvFct: // JMP DWORD PTR SS:[ESP+0x5F0] }} -FCT_ASM( caller_SaveMPPlayerCustomData_114 ) - PUSH EAX - PUSH ECX - CALL SaveMPPlayerCustomData_114 - POP ECX - POP EAX - CMP ECX, 0xAA55AA55 - RETN -}} - FCT_ASM ( caller_SaveMPPlayerCustomData_111 ) PUSH EAX PUSH ECX @@ -550,8 +695,6 @@ FCT_ASM ( caller_SaveMPPlayerCustomData_111 ) RETN }} - - FCT_ASM ( caller_SaveMPPlayerCustomData ) PUSH ECX PUSH ECX @@ -563,89 +706,107 @@ FCT_ASM ( caller_SaveMPPlayerCustomData ) }} - void Install_SavePlayerData() { static int isInstalled = false; - if (isInstalled || !active_PlayerCustomData) return; + if (isInstalled) return; log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n"); - // Save single player custom data. - mem_seek R8(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835, 132276); - if (version_D2Game == V114d) { - MEMT_REF4(0xFFED4DD6, caller_SaveSPPlayerCustomData_114); - } else { - MEMJ_REF4(D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9); - } - //6FC8A623 E8 3E210900 CALL - //02039364 |. E8 3B0FF5FF CALL - //01F95474 |. E8 C34EFEFF CALL - //6FC64164 |. E8 EB61FCFF CALL - //6FC73F34 |. E8 DD63FBFF CALL - //6FC59834 |. E8 FB0AFDFF CALL + //Save single player custom data. + if (version_D2Game >= V111) + { + mem_seek R8(D2Game, 0000, 0000, 0000, B9801, 25911, 44601, 543D1, 39CD1, 1324EC); + MEMC_REF4( D2SaveSPChar, version_D2Game >= V114a ? caller_SaveSPPlayerCustomData_114 : version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9); + //6FCD9800 |. E8 3BFBFFFF CALL D2Game.6FCD9340 + //6FC45910 |. E8 3BFBFFFF CALL D2Game.6FC45450 + //6FC64600 |. E8 3BFBFFFF CALL D2Game.6FC64140 + //6FC743D0 |. E8 3BFBFFFF CALL D2Game.6FC73F10 + //6FC59CD0 |. E8 3BFBFFFF CALL D2Game.6FC59810 + //005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240 + } + else + { + mem_seek R8(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835, 132276); + MEMJ_REF4( D2FogGetSavePath, /*version_D2Game >= V114a ? caller_SaveSPPlayerCustomData : 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 + //00532275 |. E8 D64DEDFF CALL Game.00407050 + } - if (version_D2Game == V114d) { - // Save multiplayer player custom data. - mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 5C565); - memt_byte(0x81, 0xE8); // CALL - MEMT_REF4(0x55AA55F9, caller_SaveMPPlayerCustomData_114); - memt_byte(0xAA, 0x90); // CALL - log_msg("\n"); - isInstalled = true; - return; - } + if (active_PlayerCustomData) + { + //Send SaveFiles + mem_seek R8(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB, 132398); + memt_byte( 0x8B ,0x90); // NOP + memt_byte( version_D2Game >= V114d ? 0xBD : version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74, 0xE8); // CALL + MEMT_REF4( version_D2Game >= V114d ? 0xFFFFDFF8 : version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V114d ? caller_SendSaveFilesToSave_114 : version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9); + //6FC8A720 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10] + //6FC8A724 |. 85FF TEST EDI,EDI + //020392DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] + //020392DF |. 85C0 TEST EAX,EAX + //01F953EB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] + //01F953EF |. 85C0 TEST EAX,EAX + //6FC640DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] + //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 + //00532398 |. 8BBD F8DFFFFF MOV EDI,DWORD PTR SS:[EBP-2008] - //Send SaveFiles - mem_seek R8(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB, 132398); - 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); - //6FC8A720 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10] - //6FC8A724 |. 85FF TEST EDI,EDI - //020392DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] - //020392DF |. 85C0 TEST EAX,EAX - //01F953EB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] - //01F953EF |. 85C0 TEST EAX,EAX - //6FC640DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] - //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 R8(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3, 12E13E); + 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); + //6FC37BBB |> 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] + //02062943 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] + //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] + //0052E13E |> 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] - mem_seek R8(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3, 138FEC/*12E110*/); - 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); - //6FC37BBB |> 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] - //02062943 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] - //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 + // MEMT_REF4( (version_D2Game == V110) ? 0x50CD8BD3 : 0x50CF8BD3, (version_D2Game == V110) ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9); + //6FC37DCF |. 8BD3 |MOV EDX,EBX + //6FC37DD1 |. 8BCD |MOV ECX,EBP + //6FC37DD3 |. 50 |PUSH EAX -// mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC -// memt_byte( 0x8B ,0xE8); // CALL -// MEMT_REF4( (version_D2Game == V110) ? 0x50CD8BD3 : 0x50CF8BD3, (version_D2Game == V110) ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9); - //6FC37DCF |. 8BD3 |MOV EDX,EBX - //6FC37DD1 |. 8BCD |MOV ECX,EBP - //6FC37DD3 |. 50 |PUSH EAX + //Received SaveFiles + mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6, 4C70D); + if ( version_D2Game >= V114a ) + { + MEMC_REF4( D2ReceivePacket, caller_ReceivedSaveFilesToSave_114); + //0044C70C |. E8 3F010100 |CALL Game.0045C850 + } + else if ( version_D2Game >= V111 ) + { + 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] + } else { + //Received SaveFiles + memt_byte( 0x81 ,0x90); // NOP + memt_byte( 0xEC ,0xE8); // CALL + MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave); + //6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4 + } + } if ( version_D2Game >= V111 ) { - //Received SaveFiles - mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6, 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 R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 829C2); + mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 5C565); memt_byte( 0x81 ,0xE8); // CALL MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111); memt_byte( 0xAA ,0x90); // CALL @@ -654,14 +815,8 @@ void Install_SavePlayerData() //6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55 + //0045C565 |. 81F9 55AA55AA CMP ECX,AA55AA55 } else { - //Received SaveFiles - mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 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 R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000, 0000); memt_byte( 0x8B ,0xE8); // CALL diff --git a/PlugY/SharedSaveFile.cpp b/PlugY/SharedSaveFile.cpp index f342b38..b5bd1a0 100644 --- a/PlugY/SharedSaveFile.cpp +++ b/PlugY/SharedSaveFile.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file shared by all own characters. + Add an extra save file shared by all own characters. =================================================================*/ @@ -15,9 +15,7 @@ #define BUFFER_SIZE 0x4000 #define FILE_VERSION 0x3230 //"02" -//6FC8CE8A |. E8 A16BFAFF CALL D2Game.6FC33A30 -//$+C0 > 1F 00 00 00 03 00 00 06 ..... -// 28 0010 1000 + BYTE* readSharedSaveFile(char* name, DWORD* size) { char filename[512]; @@ -151,46 +149,12 @@ void writeSharedSaveFile(char* name, BYTE* data, DWORD size, bool isHardcore) strcat(szSaveName,".sss"); log_msg("Shared file for saving : %s\n", szSaveName); -// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) +// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING)) DeleteFile(szSaveName); if (!MoveFile(szTempName, szSaveName)) log_box("Could not create the shared save file."); } -void backupSharedSaveFile() -{ - char szBackupName[MAX_PATH]; - char szSaveName[MAX_PATH]; - - D2FogGetSavePath( szSaveName, MAX_PATH-30); - strcat(szSaveName, "_LOD_"); - strcat(szSaveName, sharedStashFilename); - strcat(szSaveName,".sss"); - - D2FogGetSavePath( szBackupName, MAX_PATH-30); - strcat(szBackupName, "_LOD_"); - strcat(szBackupName, sharedStashFilename); - strcat(szBackupName,".sss.backup"); - - CopyFile(szSaveName, szBackupName, true); - - if (separateHardSoftStash) - { - D2FogGetSavePath( szSaveName, MAX_PATH-30); - strcat(szSaveName, "_LOD_HC_"); - strcat(szSaveName, sharedStashFilename); - strcat(szSaveName,".sss"); - - D2FogGetSavePath( szBackupName, MAX_PATH-30); - strcat(szBackupName, "_LOD_HC_"); - strcat(szBackupName, sharedStashFilename); - strcat(szBackupName,".sss.backup"); - - CopyFile(szSaveName, szBackupName, true); - } -} - - void saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize) { *(DWORD *)(*data + *curSize) = FILE_SHAREDSTASH; diff --git a/PlugY/SkillPerLevelUp.cpp b/PlugY/SkillPerLevelUp.cpp index 7245274..718f757 100644 --- a/PlugY/SkillPerLevelUp.cpp +++ b/PlugY/SkillPerLevelUp.cpp @@ -1,10 +1,10 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Change Skill win per level up. - + =================================================================*/ #include "skillPerLevelUp.h" @@ -13,6 +13,13 @@ bool active_SkillPerLevelUpChange=0; DWORD skillPerLevelUp=1; +FCT_ASM ( caller_changeSkillPerLevelUp_114 ) + MOV EAX,skillPerLevelUp + IMUL EAX,EDI + MOV DWORD PTR SS:[ESP+0xC], EAX + JMP V2AddPlayerStat +}} + FCT_ASM ( caller_changeSkillPerLevelUp_111 ) MOV EAX,skillPerLevelUp @@ -33,21 +40,18 @@ void Install_SkillPerLevelUp() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n"); mem_seek R8(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5, 1709D1); - if (version_D2Game == V114d) { - MEMT_REF4(0x000B68DB, caller_changeSkillPerLevelUp); - } else { - MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp); - //6FC7ED5F |. E8 56CB0900 CALL - //02057AE4 |. E8 9F28F3FF CALL - //01FE9694 |. E8 1B0DF9FF CALL - //6FCCA454 |. E8 5F01F6FF CALL - //6FD0B1E4 |. E8 E9F2F1FF CALL - //6FD0DCA4 |. E8 FDC6F1FF CALL - } + MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeSkillPerLevelUp_114 : 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 + //005709D0 |. E8 DB680B00 CALL Game.006272B0 ; \Game.006272B0 log_msg("\n"); diff --git a/PlugY/SkillsPoints.cpp b/PlugY/SkillsPoints.cpp index e735efc..da72703 100644 --- a/PlugY/SkillsPoints.cpp +++ b/PlugY/SkillsPoints.cpp @@ -10,7 +10,7 @@ #include "common.h" bool active_SkillsPoints=0; -bool unassignSkillsPointsOneByOne=0; +bool unassignSkillsPointsOneForOne=0; int (*getskPoint)(SkillData* ptSkill); int (*getCharClass)(SkillData* ptSkill); @@ -40,9 +40,9 @@ void UnassignAllSkillsPoints(Unit* ptChar) DWORD skillID, keepBonus, maxSkillLevel; int skpoints; DWORD nbPoints = 0; + void* ptClient = D2GetClient(ptChar,__FILE__,__LINE__); SkillData* ptSkill = PCSkills->ptFirstSkill; - log_msg("\n\nUNASSIGN SKILL POINTS\n\n"); while (ptSkill) { @@ -53,7 +53,7 @@ void UnassignAllSkillsPoints(Unit* ptChar) keepBonus = !getSingleSkillValue(ptChar, STATS_ITEM_SINGLESKILL, skillID); maxSkillLevel = D2GetSkillLevel(ptChar, ptSkill, 0); skpoints = getskPoint(ptSkill); - if (skpoints == -1 || unassignSkillsPointsOneByOne) + if (skpoints == -1 || unassignSkillsPointsOneForOne) { D2SetSkillBaseLevel(ptChar, skillID, 0, keepBonus, __FILE__, __LINE__); nbPoints += maxSkillLevel; diff --git a/PlugY/StatPerLevelUp.cpp b/PlugY/StatPerLevelUp.cpp index 407df08..1521528 100644 --- a/PlugY/StatPerLevelUp.cpp +++ b/PlugY/StatPerLevelUp.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Change Stat win per level up. @@ -13,6 +13,13 @@ bool active_StatPerLevelUpChange=0; DWORD statPerLevelUp=5; +FCT_ASM ( caller_changeStatPerLevelUp_114 ) + MOV EAX,statPerLevelUp + IMUL EAX,EDI + MOV DWORD PTR SS:[ESP+0xC], EAX + JMP V2AddPlayerStat +}} + FCT_ASM ( caller_changeStatPerLevelUp_111 ) MOV EAX,statPerLevelUp IMUL EAX,EBX @@ -31,21 +38,18 @@ void Install_StatPerLevelUp() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n"); mem_seek R8(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A, 1709C6); - if (version_D2Game == V114d) { - MEMT_REF4(0x000B68E6, caller_changeStatPerLevelUp); - } else { - MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp); - //6FC7ED54 |. E8 61CB0900 CALL - //02057AD9 |. E8 AA28F3FF CALL - //01FE9689 |. E8 260DF9FF CALL - //6FCCA449 |. E8 6A01F6FF CALL - //6FD0B1D9 |. E8 F4F2F1FF CALL - //6FD0DC99 |. E8 08C7F1FF CALL - } + MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeStatPerLevelUp_114 : 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 + //005709C5 |. E8 E6680B00 CALL Game.006272B0 ; \Game.006272B0 log_msg("\n"); diff --git a/PlugY/StatsPoints.cpp b/PlugY/StatsPoints.cpp index a430cea..3802cbc 100644 --- a/PlugY/StatsPoints.cpp +++ b/PlugY/StatsPoints.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Unassign Stats Point for futher re-assignment. @@ -10,6 +10,7 @@ #include "plugYFiles.h" // Install_PlugYImagesFiles() #include "interface_Stats.h" // Install_InterfaceStats() #include "updateServer.h" +#include "extraOptions.h" #include "common.h" #include @@ -41,7 +42,7 @@ void UnassignDex(Unit* ptChar, int nb) int currentDex, removePtsNb; CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass); - + currentDex = D2GetPlayerBaseStat( ptChar, STATS_DEXTERITY, 0 ); if (currentDex <= charStats->baseDEX) return; removePtsNb = currentDex - charStats->baseDEX >= nb ? nb : currentDex - charStats->baseDEX; @@ -58,14 +59,14 @@ void UnassignVit(Unit* ptChar, int nb) int currentVit, removePtsNb, removeVitNb, removeStaNb; CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass); - + currentVit = D2GetPlayerBaseStat( ptChar, STATS_VITALITY, 0 ); if (currentVit <= charStats->baseVIT) return; removePtsNb = currentVit - charStats->baseVIT >= nb ? nb : currentVit - charStats->baseVIT; if (currentVit - removePtsNb < 1) removePtsNb = currentVit - 1; removeVitNb = removePtsNb * (charStats->lifePerVitality << 6); removeStaNb = removePtsNb * (charStats->staminaPerVitality << 6); - + log_msg("Start Unassign Vitality (cur %d, base %d, rem %d)\n",currentVit,charStats->baseVIT,removePtsNb); D2AddPlayerStat( ptChar, STATS_VITALITY, -removePtsNb ,0 ); D2AddPlayerStat( ptChar, STATS_MAXHP, -removeVitNb ,0 ); @@ -79,13 +80,13 @@ void UnassignEne(Unit* ptChar, int nb) int currentEne, removePtsNb, removeManNb; CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass); - + currentEne = D2GetPlayerBaseStat( ptChar, STATS_ENERGY, 0); if (currentEne <= charStats->baseENE) return; removePtsNb = currentEne - charStats->baseENE >= nb ? nb : currentEne - charStats->baseENE; if (currentEne - removePtsNb < 1) removePtsNb = currentEne - 1; removeManNb = removePtsNb * (charStats->manaPerMagic << 6); - + log_msg("Start Unassign Energy (cur %d, base %d, rem %d)\n",currentEne,charStats->baseENE,removePtsNb); D2AddPlayerStat( ptChar, STATS_ENERGY, -removePtsNb ,0 ); D2AddPlayerStat( ptChar, STATS_MAXMANA, -removeManNb ,0 ); @@ -163,9 +164,12 @@ void STDCALL printDisabledStatsBtn(WORD statID, sDrawImageInfo* data, DWORD x, D _snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITH_LIMIT), limitValueToShiftClick); else _snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITHOUT_LIMIT)); - wcscat(text,L"\n"); - int len = wcslen(text); - _snwprintf(text + len, sizeof(text) - len, getLocalString(STR_STATS_BASE_MIN), statValue, minValue); + if (active_DisplayBaseStatsValue) + { + wcscat(text,L"\n"); + int len = wcslen(text); + _snwprintf(text + len, sizeof(text) - len, getLocalString(STR_STATS_BASE_MIN), statValue, minValue); + } D2SetFont(1); D2PrintPopup(text, x+18, y-32, WHITE, 1); } @@ -250,12 +254,12 @@ END_UNASSGNSTATS: RETN }} -FCT_ASM( caller_setValue_114 ) - MOV CL, 0x3A - OR DX, WORD PTR DS : [ESI] - ADD DL, currentMsgID - MOV CH, DL - RETN +FCT_ASM ( caller_setValue_114 ) + MOV CL,0x3A + OR DX,WORD PTR DS:[ESI] + ADD DL, currentMsgID + MOV CH, DL + RETN }} FCT_ASM ( caller_setValue_111 ) @@ -297,18 +301,18 @@ DWORD STDCALL pushDown (DWORD num) } FCT_ASM( caller_pushDown_114 ) - PUSH EDX - PUSH DWORD PTR SS : [EBP + 0x8] - CALL pushDown - POP EDX - TEST EAX, EAX - JNZ end_pushDown - SUB DWORD PTR SS : [ESP], 0x22 - RETN + PUSH EDX + PUSH DWORD PTR SS:[EBP+0x8] + CALL pushDown + POP EDX + TEST EAX, EAX + JNZ end_pushDown + SUB DWORD PTR SS:[ESP],0x22 + RETN end_pushDown : - MOV EAX, DWORD PTR SS : [EBP + 0x8] - LEA ECX, DWORD PTR DS : [EAX * 8] - RETN + MOV EAX, DWORD PTR SS:[EBP+8] + LEA ECX, DWORD PTR DS:[EAX*8] + RETN }} FCT_ASM ( caller_pushDown_111 ) @@ -356,56 +360,58 @@ void Install_StatsPoints() memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 memt_byte( version_D2Client == V114d ? 0x4D : 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 12) ); memt_byte( version_D2Client == V114d ? 0xF8 : 0x24, 0x90 ); // NOP - if (version_D2Client < V114d) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + if (version_D2Client < V114a) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 53), 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] + //004A7FFB > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] + //004A7FFE . 53 PUSH EBX ; /Arg3 //print our buttons mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C); - if (version_D2Client == V114d) { - MEMT_REF4(0x0004E3F0, caller_printUnassignStatsBtn); - } else { - MEMJ_REF4(D2PrintImage, caller_printUnassignStatsBtn); - } + 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 + //004A808B . E8 F0E30400 CALL Game.004F6480 ; \Game.004F6480 // Always manage push down. - mem_seek R8(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579, A77E4); + mem_seek R8(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579, A77E4); memt_byte( 0x74, 0x90 ); // NOP - memt_byte(version_D2Client == V114d ? 0x62 : 0x4E, 0x90); // NOP - + memt_byte( version_D2Client == V114d ? 0x62 : 0x4E, 0x90 ); // NOP //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 //6FB6CDD9 . 74 4E JE SHORT D2Client.6FB6CE29 //6FB6F579 . 74 4E JE SHORT D2Client.6FB6F5C9 + //004A77E4 . 74 62 JE SHORT Game.004A7848 - if ( version_D2Client >= V111 ) + if ( version_D2Client >= V114d ) { // On Push down. mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4, A7863); - if (version_D2Client == V114d) { - memt_byte(0x8B, 0xE8); - MEMT_REF4(0x0C8D0845, caller_pushDown_114); - memt_byte(0xC5, 0x90); - memt_dword(0x00000000, 0x90909090); - } else { - memt_byte(0x6B, 0xE8); - MEMT_REF4(0x01BF0ED2, caller_pushDown_111); - memt_byte(0x00, 0x6B); // IMUL EDX,EDX,0E - memt_byte(0x00, 0xD2); - memt_byte(0x00, 0x0E); - } - + memt_byte(0x8B, 0xE8); + MEMT_REF4(0x0C8D0845, caller_pushDown_114); + memt_byte(0xC5, 0x90); + memt_dword(0x00000000, 0x90909090); + //004A7863 > 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] + //004A7866 . 8D0CC5 0000000>LEA ECX,DWORD PTR DS:[EAX*8] + } + else if ( version_D2Client >= V111 ) + { + // On Push down. + mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4, A7863); + memt_byte( 0x6B, 0xE8 ); + MEMT_REF4( 0x01BF0ED2, caller_pushDown_111); + memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E + memt_byte( 0x00, 0xD2 ); + memt_byte( 0x00, 0x0E ); //6FB32844 > 6BD2 0E IMUL EDX,EDX,0E //6FB32847 . BF 01000000 MOV EDI,1 //6FB392C4 > 6BD2 0E IMUL EDX,EDX,0E @@ -427,21 +433,21 @@ void Install_StatsPoints() //6FAD13B8 8D04D5 00000000 LEA EAX,DWORD PTR DS:[EDX*8] } + if ( version_D2Client >= V110 ) { // Always manage push up. mem_seek R8(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9, A7976); memt_byte( version_D2Client == V114d ? 0x0F : 0x74, 0x90 ); // NOP - memt_byte(version_D2Client == V114d ? 0x84 : version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP - if (version_D2Client == V114d) { - memt_dword(0x000000BB, 0x90909090); - } + memt_byte( version_D2Client == V114d ? 0x84 : version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP + if (version_D2Client == V114d) memt_dword(0x000000BB, 0x90909090); //6FAD152E 74 68 JE SHORT D2Client.6FAD1598 //6FB33869 . 74 65 JE SHORT D2Client.6FB338D0 //6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350 //6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0 //6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0 //6FB705E9 . 74 65 JE SHORT D2Client.6FB70650 + //004A7976 |. 0F84 BB000000 JE Game.004A7A37 // Unassign stats point when ctrl is push. mem_seek R8(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B, A79F2); @@ -459,6 +465,8 @@ void Install_StatsPoints() //6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07 //6FB7069B . 66:85C0 TEST AX,AX //6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7 + //004A79F2 |. 66:85C0 TEST AX,AX + //004A79F5 |. 7C 07 JL SHORT Game.004A79FE } else { // Always manage push up. mem_seek R8(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000, 0000); @@ -478,16 +486,14 @@ void Install_StatsPoints() mem_seek R8(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE, A7A29); if ( version_D2Client >= V111 ) { memt_byte( version_D2Client == V114d ? 0xB1 : 0x66, 0xE8 ); // CALL - if (version_D2Client == V114d) { - MEMT_REF4(0x160B663A, caller_setValue_114); - } else { - MEMT_REF4(0x15244C89, caller_setValue_111); - } + MEMT_REF4( version_D2Client == V114d ? 0x160B663A : 0x15244C89, version_D2Client == V114d ? caller_setValue_114 : caller_setValue_111); //6FB3395E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | //6FB6DF3E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | //6FB706DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | + //004A7A29 |. B1 3A |MOV CL,3A + //004A7A2B |. 66:0B16 |OR DX,WORD PTR DS:[ESI] } else { MEMC_REF4( D2SendToServer3, caller_setValue); //6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990 @@ -534,6 +540,7 @@ void Install_StatsLimitShiftClick() //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 + //004A79EC |. FF15 5CC46C00 CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState log_msg("\n"); diff --git a/PlugY/UberQuest.cpp b/PlugY/UberQuest.cpp index d184224..cbedf6b 100644 --- a/PlugY/UberQuest.cpp +++ b/PlugY/UberQuest.cpp @@ -1,57 +1,70 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Uber Quest Management. =================================================================*/ +#include #include "uberQuest.h" #include "common.h" -bool active_UberQuest=0; - -/* - void* ptQuest = D2GetPlayerData(ptChar)->ptQuest[ptGame->difficultyLevel]; - if (D2CheckQuestState(ptGame->game10F4[0xC],4,0xB) || - D2CheckQuestState(ptQuest,4,0xA) || - ptGame->ptIsLodGame && !D2CheckQuestState(ptQuest,0x28,0) -// !ptGame->ptIsLodGame && D2CheckQuestState(ptQuest,0x1A,0)TODO for !ptGame->ptIsLodGame... - { -// d2_assert(!ptChar,"openPandPortal : ptChar==NULL",__FILE__,__LINE__); -// ptChar->v6E = 0x14; -// ptChar->v70 = ptChar; -// D2Common10148(ptChar); -// ptChar->flag400 = 1; -// return 0; - } - Room* = ptRoom = D2GetRoom(ptChar); - if (D2GetLevelID(ptRoom) != 1) return 0; - Position pos1; - D2GetPosition(ptChar, &pos1); - void* ptPortal = NULL; - D2Game02059FE0(ptRoom,&pos1,3,0x400,&ptPortal,0x64); - if (!ptPortal) return 0; - Position pos2; - pos2.x = pos1.x; - pos2.y = pos1.y; - testing crash useless... - D2GetDropRoom(ptRoom, &pos2, &pos2,3,0x3E01,0xC01,0); -*/ - -/* -void* FASTCALL D2Game01F81090(Room* ptRoom, DWORD x, DWORD y);//0x1090 - -*/ - #define OBJECT_PERMANENT_PORTAL 0x3C -#define LEVEL_ACT5TOWN 109 +#define LEVEL_ACT5TOWN 109 #define LEVEL_ACT5_PANDEMONIUM1 133 #define LEVEL_ACT5_PANDEMONIUM2 134 #define LEVEL_ACT5_PANDEMONIUM3 135 #define LEVEL_ACT5_PANDEMONIUM_FINAL 136 +#define UBER_IZUAL_ID 706 +#define UBER_ANDARIEL_ID 707 +#define UBER_DURIEL_ID 708 +#define UBER_MEPHISTO_ID 704 +#define UBER_DIABLO_ID 705 +#define UBER_BAAL_ID 709 + +#define UBER_MEPHISTO_SQUELETON 725 +#define UBER_MEPHISTO_ARCHER 726 +#define UBER_MEPHISTO_FIRE 727 +#define UBER_MEPHISTO_LIGHTNING 728 +#define UBER_MEPHISTO_COLD 729 +#define UBER_MEPHISTO_POISON 730 +#define UBER_BAAL_DARK_LORD 731 +#define UBER_BAAL_SPECTER 732 +#define UBER_DIABLO_PIT_LORD 711 + + +bool active_UberQuest = false; +DWORD UberMephistoX = 25130; +DWORD UberMephistoY = 5143; +DWORD UberDiabloX = 25139; +DWORD UberDiabloY = 5139; +DWORD UberBaalX = 25139; +DWORD UberBaalY = 5135; + +bool active_UberMinions = true; +DWORD UberMephistoNbMinions = 6; +DWORD UberMephistoMinions[] = {UBER_MEPHISTO_SQUELETON, UBER_MEPHISTO_ARCHER, UBER_MEPHISTO_FIRE, UBER_MEPHISTO_LIGHTNING, UBER_MEPHISTO_COLD, UBER_MEPHISTO_POISON}; +int UberMephistoSpawnPercent = 80; +DWORD UberMephistoSpawnRadius = 30; +DWORD UberBaalNbMinions = 2; +DWORD UberBaalMinions[] = {UBER_BAAL_DARK_LORD, UBER_BAAL_SPECTER}; +int UberBaalSpawnPercent = 30; +DWORD UberBaalSpawnRadius = 30; +DWORD UberDiabloNbMinions = 1; +DWORD UberDiabloMinions[] = {UBER_DIABLO_PIT_LORD}; +int UberDiabloSpawnPercent = 30; +DWORD UberDiabloSpawnRadius = 30; + +bool active_UberDiabloRushTweekAI = false; +bool active_UberBaalTeleportTweekAI = false; +bool active_UberBaalChillingArmorTweekAI = false; +int uberBaalChillingArmorTimer = 6000; + +int uberBaalChillingArmorLastFrame = 0; + static struct { union{ @@ -72,39 +85,48 @@ static struct int count1; int count2; int count3; - int count4; - int count5; - int count6; - Room* room1; - Room* room2; - Room* room3; - Room* room4; - Room* room5; - Room* room6; } questState; + +int GetNbMonsters(Level* level, Position position, int radius); +int GetNbMonsters(Level* level); + +bool IsInRoom(Room* ptRoom, DWORD x, DWORD y) +{ + DWORD startX = version_D2Game > V112 ? ptRoom->startX : *((DWORD*)ptRoom + 6); + DWORD startY = version_D2Game > V112 ? ptRoom->startY : *((DWORD*)ptRoom + 7); + DWORD sizeX = version_D2Game > V112 ? ptRoom->sizeX : *((DWORD*)ptRoom + 8); + DWORD sizeY = version_D2Game > V112 ? ptRoom->sizeY : *((DWORD*)ptRoom + 9); + return x >= startX && x <= startX + sizeX && + y >= startY && y <= startY + sizeY; +} + +double Distance(Position p1, Position p2) +{ + return sqrt((double)(p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)); +} + void resetQuestState() { ZeroMemory(&questState,sizeof(questState)); questState.count1 = 10 + RANDOM(10); questState.count2 = 20 + RANDOM(40); questState.count3 = 10 + RANDOM(20); - int value = 5 + RANDOM(10); - questState.count4 = value + RANDOM(4); - questState.count5 = value + RANDOM(4); - questState.count6 = value + RANDOM(4); - log_msg("Uber Quest State : %d %d %d %d %d %d\n",questState.count1, questState.count2, questState.count3, questState.count4, questState.count5, questState.count6); + uberBaalChillingArmorLastFrame = 0; + log_msg("Uber Quest State : %d %d %d\n",questState.count1, questState.count2, questState.count3); } DWORD openPortalOnLevel(Game* ptGame, Unit* ptChar, DWORD levelID) { - log_msg("openning portal to level %d\n",levelID); + log_msg("Open portal to level %d\n", levelID); Room* ptRoom = D2GetRoom(ptChar); if ( D2GetLevelID(ptRoom) != LEVEL_ACT5TOWN ) return 0; //Get position in the room Position pos; D2GetPosition(ptChar, &pos); + log_msg("ptChar pos : %d %d\n", pos.x, pos.y); + if (!D2GetDropRoom(ptRoom, &pos, &pos, 3, 0x3E01, 0xC01, 0)) return 0; ptRoom = D2TestPositionInRoom(ptRoom, pos.x, pos.y); if (!ptRoom) return 0; @@ -124,11 +146,10 @@ DWORD openPortalOnLevel(Game* ptGame, Unit* ptChar, DWORD levelID) DWORD FASTCALL openPandPortal(Game* ptGame, Unit* ptChar) { log_msg("openPandPortal\n"); - Position pos; - D2GetPosition(ptChar, &pos); - log_msg("ptChar pos : %d %d\n",pos.x,pos.y); - if (ptGame->difficultyLevel != D2DM_HELL) return 0; + if (ptGame->difficultyLevel != D2DM_HELL) + return 0; + int available[3]; int nbAvailable=0; if (!questState.portal1Opened) available[nbAvailable++]=LEVEL_ACT5_PANDEMONIUM1; @@ -141,45 +162,30 @@ DWORD FASTCALL openPandPortal(Game* ptGame, Unit* ptChar) int ret = openPortalOnLevel(ptGame, ptChar, selectedTargetLevel); - if (ret) { if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM1) questState.portal1Opened = 1; else if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM2) questState.portal2Opened = 1; else if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM3) questState.portal3Opened = 1; } - log_msg("openPandPortal ending\n\n"); - return ret;//normally return ret; + + return ret; } DWORD FASTCALL openPandFinalPortal(Game* ptGame, Unit* ptChar) { log_msg("openPandFinalPortal\n"); - Position pos; - D2GetPosition(ptChar, &pos); - log_msg("ptChar pos : %d %d",pos.x,pos.y); - int ret = openPortalOnLevel(ptGame, ptChar, LEVEL_ACT5_PANDEMONIUM_FINAL); - log_msg("openPandFinalPortal ending\n"); - return ret;//normally return ret; -} -Room* selectRoom(Game* ptGame, Room* ptCurrentRoom, DWORD level) -{ -/* Room* tab[200]; - nbRoom=0; - Room* ptRoom = ptGame->mapAct[5]->ptFirstRoom; - while (ptRoom); - if(!ptCurrentRoom->nbNearRooms) return ptCurrentRoom; - int targetRoomNum = RANDOM(ptCurrentRoom->nbNearRooms); - Room* ptRoom = ptCurrentRoom->ptNearRooms; - while (targetRoomNum--) - ptRoom = ptRoom->ptNextRoom;*/ - return ptCurrentRoom; + if (ptGame->difficultyLevel != D2DM_HELL) + return 0; + + return openPortalOnLevel(ptGame, ptChar, LEVEL_ACT5_PANDEMONIUM_FINAL); } void STDCALL spawnUber(Game* ptGame, Room* ptRoom) { - log_msg("Uber Quest State : %d %d %d %d %d %d\n",questState.count1, questState.count2, questState.count3, questState.count4, questState.count5, questState.count6); + log_msg("Uber Quest State : %d %d %d\n",questState.count1, questState.count2, questState.count3); + log_msg("Uber Quest questState spawn : %d %d %d %d %d %d\n",questState.uber1Spawned, questState.uber2Spawned, questState.uber3Spawned, questState.uber4Spawned, questState.uber5Spawned, questState.uber6Spawned); switch(D2GetLevelID(ptRoom)) { case LEVEL_ACT5_PANDEMONIUM1: @@ -187,8 +193,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom) { if (questState.count1) questState.count1--; else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 707, 0)) + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_ANDARIEL_ID, 0)) questState.uber1Spawned = 1; } } @@ -198,8 +203,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom) { if (questState.count2) questState.count2--; else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 708, 0)) + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_DURIEL_ID, 0)) questState.uber2Spawned = 1; } } @@ -209,8 +213,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom) { if (questState.count3) questState.count3--; else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 706, 0)) + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_IZUAL_ID, 0)) questState.uber3Spawned = 1; } } @@ -218,110 +221,239 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom) case LEVEL_ACT5_PANDEMONIUM_FINAL: if (!questState.uber4Spawned) { - if (questState.count4) questState.count4--; - else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 704, 0)) + log_msg("Spawn Mephisto ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY); + if (IsInRoom(ptRoom, UberMephistoX, UberMephistoY)) + { + log_msg("Spawn Mephisto ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY); + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberMephistoX, UberMephistoY, -1, UBER_MEPHISTO_ID, 0)) questState.uber4Spawned = 1; } } if (!questState.uber5Spawned) { - if (questState.count5) questState.count5--; - else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 705, 0)) - questState.uber5Spawned = 1; + if (IsInRoom(ptRoom, UberDiabloX, UberDiabloY)) + { + log_msg("Spawn Diablo ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY); + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberDiabloX, UberDiabloY, -1, UBER_DIABLO_ID, 0)) + questState.uber4Spawned = 1; } } if (!questState.uber6Spawned) { - if (questState.count6) questState.count6--; - else { - Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 709, 0)) - questState.uber6Spawned = 1; + if (IsInRoom(ptRoom, UberBaalX, UberBaalY)) + { + log_msg("Spawn Baal ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY); + if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberBaalX, UberBaalY, -1, UBER_BAAL_ID, 0)) + questState.uber4Spawned = 1; } } - -// D2SpawnMonster(PCGame, ptRoom, 0, 25113, 5138, -1, 704, 0); -// D2SpawnMonster(PCGame, ptRoom, 0, 25125, 5150, -1, 705, 0); -// D2SpawnMonster(PCGame, ptRoom, 0, 25135, 5140, -1, 709, 0); } D2Game235C0(ptGame, ptRoom); } -/*DWORD STDCALL spawnUber(Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y) -{ - if (!D2WarpPlayer(ptPath, ptChar, ptRoom, x, y)) return 0; +////////////////////////////////////////////////////////////////////////////// - switch(D2GetLevelID(ptRoom)) +int GetNbMonsters(Level* level) +{ + int nbMonsters = 0; + for (RoomEx* roomEx = level->ptFirstRoomEx; roomEx; roomEx = roomEx->ptNextRoomEx) { - case LEVEL_ACT5_PANDEMONIUM1: - if (!questState.uber1Spawned) + if (roomEx->ptRoom) { - Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 707, 0); - questState.uber1Spawned = 1; - } - break; - case LEVEL_ACT5_PANDEMONIUM2: - if (!questState.uber2Spawned) - { - Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 708, 0); - questState.uber2Spawned = 1; - } - break; - case LEVEL_ACT5_PANDEMONIUM3: - if (!questState.uber3Spawned) - { - Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 706, 0); - questState.uber3Spawned = 1; - } - break; - case LEVEL_ACT5_PANDEMONIUM_FINAL: - if (!questState.uber4Spawned) - { - Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 704, 0); - ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 705, 0); - ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1); - D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 709, 0); -// D2SpawnMonster(PCGame, ptRoom, 0, 25113, 5138, -1, 704, 0); -// D2SpawnMonster(PCGame, ptRoom, 0, 25125, 5150, -1, 705, 0); -// D2SpawnMonster(PCGame, ptRoom, 0, 25135, 5140, -1, 709, 0); - questState.uber4Spawned = 1; + for (Unit* unit = roomEx->ptRoom->ptFirstUnit; unit; unit = unit->ptNextUnitInRoom) + { + if (unit->nUnitType == UNIT_MONSTER && unit->mode != UNIT_MODE_KICK && unit->nTxtFileNo != 711) + { + //log_msg("GetNbMonsters ++ / type:%d - id:%d - mode:%d\n", unit->nUnitType, unit->nTxtFileNo, unit->mode); + nbMonsters++; + } + //else log_msg("GetNbMonsters no / type:%d - id:%d - mode:%d\n", unit->nUnitType, unit->nTxtFileNo, unit->mode); + } } } - return 1; -} -*/ -void FASTCALL uberMephIA(Game* ptGame, Unit* ptMonster, DWORD* ptData) -{ - D2MephIA(ptGame, ptMonster, ptData); + return nbMonsters; } -void FASTCALL uberDiabloIA(Game* ptGame, Unit* ptMonster, DWORD* ptData) +int GetNbMonsters(Level* level, Position position, int radius) { - D2DiabloIA(ptGame, ptMonster, ptData); + int nbMonsters = 0; + for (RoomEx* roomEx = level->ptFirstRoomEx; roomEx; roomEx = roomEx->ptNextRoomEx) + { + if (roomEx->ptRoom) + { + for (Unit* unit = roomEx->ptRoom->ptFirstUnit; unit; unit = unit->ptNextUnitInRoom) + { + if (unit->nUnitType == UNIT_MONSTER && unit->mode != UNIT_MODE_KICK && unit->nTxtFileNo != 711) + { + Position p; + D2GetPosition(unit, &p); + if (Distance(position, p) <= radius) + nbMonsters++; + } + } + } + } + return nbMonsters; } - -void FASTCALL uberBaalIA(Game* ptGame, Unit* ptMonster, DWORD* ptData) +bool CastSummonMonster(Game* ptGame, Unit* ptMonster, DWORD x, DWORD y, DWORD* minions, int minionsSize, int mode) { - D2BaalIA(ptGame, ptMonster, ptData); + DWORD minionId = minions[RANDOM(minionsSize)]; + log_msg("CastSummonMonster: id:%d x:%d y:%d mode:%d\n", minionId, x, y, mode); + + Room* ptRoom = D2GetRoom(ptMonster); + + // Check nb of monsters + Level* ptLevel = ptRoom->ptRoomEx->ptLevel; + int monstersInLevel = GetNbMonsters(ptLevel); + Position position; + D2GetPosition(ptMonster, &position); + int monstersNearby = GetNbMonsters(ptLevel, position, 25); + + log_msg("CastSummonMonster nbMonsters: %d - %d\n", monstersNearby, monstersInLevel); + if (monstersNearby > 16 || monstersInLevel > 100) + return false; + + // Spawn Monster + log_msg("CastSummonMonster D2SpawnMonster(%d, %d, %08X, %08X, %d, %d, %d, %d)\n", minionId, mode, ptGame, ptRoom, x, y, 1, 0); + Unit* monster = D2SpawnMonster(minionId, mode, ptGame, ptRoom, x, y, 1, 0); + log_msg("CastSummonMonster D2SpawnMonster end\n"); + if (monster) + return true; + + // Try in near rooms + log_msg("CastSummonMonster Try in near rooms: %d - %d\n", ptRoom->startX, ptRoom->startY); + for(int i = 0; i < ptRoom->nbNearRooms; i++) + { + Room* ptRoom2 = ptRoom->ptNearRooms[i]; + if (IsInRoom(ptRoom2, x, y)) + { + log_msg("CastSummonMonster D2SpawnMonster(%d, %d, %08X, %08X, %d, %d, %d, %d)\n", minionId, mode, ptGame, ptRoom2, x, y, 1, 0); + monster = D2SpawnMonster(minionId, mode, ptGame, ptRoom2, x, y, 1, 0); + log_msg("CastSummonMonster D2SpawnMonster end\n"); + if (monster) + return true; + } + } + log_msg("CastSummonMonster end: %d - %d\n", ptRoom->startX, ptRoom->startY); + return false; +} + +void RandInCircle(Position* position, DWORD radius) +{ + double theta = RANDOMF() * 6.283185; + double r = sqrt(RANDOMF()) * radius; + position->x += (DWORD)(r * cos(theta)); + position->y += (DWORD)(r * sin(theta)); +} + +void FASTCALL uberMephAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs) +{ + log_msg("UberMephAI called.\n"); + + // Spawn Minions + if (active_UberMinions && RANDOM(100) < UberMephistoSpawnPercent && ptAIArgs->distanceToTarget < UberMephistoSpawnRadius) + { + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberMephistoMinions, UberMephistoNbMinions, 8); + } + + log_msg("Uber Mephisto AI activated.\n"); + D2MephAI(ptGame, ptMonster, ptAIArgs); +} + +void FASTCALL uberDiabloAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs) +{ + log_msg("UberDiabloAI called.\n"); + + // Spawn Minions + if (active_UberMinions && RANDOM(100) < UberDiabloSpawnPercent && ptAIArgs->distanceToTarget < UberDiabloSpawnRadius) + { + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + RandInCircle(&pos, 3); + CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberDiabloMinions, UberDiabloNbMinions, 1); + } + + // Tweek Diablo AI Rush + if (active_UberDiabloRushTweekAI && RANDOM(100) < (int)ptAIArgs->distanceToTarget - 10) + { + if (RANDOM(3) > 0)//67% to Rush + { + log_msg("Uber Diablo Run activated.\n"); + int diabloRunSkillId = 4; + D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[diabloRunSkillId], ptAIArgs->ptMonStatsBIN->skill[diabloRunSkillId], ptAIArgs->target, 0, 0); + } + else + { + log_msg("Uber Diablo Move activated.\n"); + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + D2MonsterMove(ptGame, ptMonster, NULL, 2, pos.x, pos.y, 1, 0); + } + return; + } + + log_msg("Uber Diablo AI activated.\n"); + D2DiabloAI(ptGame, ptMonster, ptAIArgs); +} + +void FASTCALL uberBaalAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs) +{ + log_msg("UberBaalAI called.\n"); + + if (active_UberMinions && RANDOM(100) < UberBaalSpawnPercent && ptAIArgs->distanceToTarget < UberBaalSpawnRadius) + { + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + RandInCircle(&pos, 3); + CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberBaalMinions, UberBaalNbMinions, 1); + } + + // Tweek Baal AI Chilling Armor + if (active_UberBaalChillingArmorTweekAI) + { + if (uberBaalChillingArmorLastFrame == 0 || ((int)ptGame->gameFrame - uberBaalChillingArmorLastFrame > uberBaalChillingArmorTimer)) + { + log_msg("Uber Baal Chilling Armor activated.\n"); + uberBaalChillingArmorLastFrame = ptGame->gameFrame; + const int baalChillingArmorSkillId = 7; + D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[baalChillingArmorSkillId], ptAIArgs->ptMonStatsBIN->skill[baalChillingArmorSkillId], NULL, 0, 0); + return; + } + } + + // Tweek Baal AI Teleport + if (active_UberBaalTeleportTweekAI && RANDOM(100) < (int)ptAIArgs->distanceToTarget - 10) + { + if (RANDOM(3) > 0)//67% to teleport + { + log_msg("Uber Baal Teleport activated.\n"); + const int baalTeleportSkillId = 4; + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[baalTeleportSkillId], ptAIArgs->ptMonStatsBIN->skill[baalTeleportSkillId], NULL/*ptAIArgs->target*/, pos.x, pos.y); + } + else + { + log_msg("Uber Baal Move activated.\n"); + Position pos; + D2GetPosition(ptAIArgs->target, &pos); + D2MonsterMove(ptGame, ptMonster, NULL, 2, pos.x, pos.y, 1, 0); + } + return; + } + + log_msg("Uber Baal AI activated.\n"); + D2BaalAI(ptGame, ptMonster, ptAIArgs); } FCT_ASM ( caller_spawnUber ) - PUSHAD - PUSH EDX - PUSH ECX - CALL spawnUber - POPAD - RETN + PUSH EDX + PUSH ECX + CALL spawnUber + RETN }} void Install_UberQuest() @@ -339,44 +471,32 @@ void Install_UberQuest() // open Red Portal VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, PAGE_EXECUTE_READWRITE, &oldProtection); mem_seek R8(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4, 2E11D0); - if (version_D2Game == V114d) { - MEMT_DWORD(0x00565A90, openPandPortal); - MEMT_DWORD(0x00565AA0, openPandFinalPortal); - } else { - MEMT_DWORD(D2OpenPandPortal, openPandPortal); - MEMT_DWORD(D2OpenPandFinalPortal, openPandFinalPortal); - } + MEMT_DWORD( D2OpenPandPortal , openPandPortal); + MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal); //0201E357 |. FFD0 |CALL EAX //01FA77E7 |. FFD0 |CALL EAX //6FCF3CC7 |. FFD0 |CALL EAX //6FC92437 |. FFD0 |CALL EAX //6FCB7127 |. FFD0 |CALL EAX + //00565D45 . FFD0 CALL EAX VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, oldProtection, &oldProtection); // manage uberIA (fct table at 0209E7E8) VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); - if (version_D2Game == V114d) { - mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330); - MEMT_DWORD(0x005FD200, uberBaalIA); - mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340); - MEMT_DWORD(0x005F81C0, uberMephIA); - mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350); - MEMT_DWORD(0x005E9DF0, uberDiabloIA); - } else { - mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330); - MEMT_DWORD(D2UberBaalIA, uberBaalIA); - mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340); - MEMT_DWORD(D2UberMephIA, uberMephIA); - mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350); - MEMT_DWORD(D2UberDiabloIA, uberDiabloIA); - } + mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330); + MEMT_DWORD( D2UberBaalAI , uberBaalAI); + mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340); + MEMT_DWORD( D2UberMephAI , uberMephAI); + mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350); + MEMT_DWORD( D2UberDiabloAI , uberDiabloAI); VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, oldProtection, &oldProtection); //0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8 //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 + //005B163D |. B8 18CA7300 MOV EAX,Game.0073CA18 // spawn Uber // mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000); @@ -384,49 +504,17 @@ void Install_UberQuest() //02028DAC |. E8 491CF7FF CALL mem_seek R8(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB, 12D1DC); - if (version_D2Game == V114d) { - MEMT_REF4(0x00015960, caller_spawnUber); - } else { - MEMC_REF4(D2Game235C0, spawnUber); - } + MEMC_REF4( V2Game235C0 , version_D2Game >= V114d ? (DWORD)caller_spawnUber : (DWORD)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 + //0052D1DB |. E8 60590100 ||CALL Game.00542B40 log_msg("\n"); isInstalled = true; } -/* -call fct to manage TP : -0201E33E |. 8B048D 78A4070>|MOV EAX,DWORD PTR DS:[ECX*4+207A478] ; D2Game.0201B480 -0201E345 |. 85C0 |TEST EAX,EAX -0201E347 |. 74 14 |JE SHORT D2Game.0201E35D -0201E349 |. 8B9424 2C01000>|MOV EDX,DWORD PTR SS:[ESP+12C] -0201E350 |. 8B8C24 2801000>|MOV ECX,DWORD PTR SS:[ESP+128] -0201E357 |. FFD0 |CALL EAX -0201E359 |. 894424 38 |MOV DWORD PTR SS:[ESP+38],EAX -DWORD FASTCALL openPortal (Unit* ptGame, Unit* ptChar) -0201C6D0 : CowPortal -0201B480 : Pand. Portal return 0 !! -0201B470 : Pand. FInal Portal - -manage IA -0202AD8B |> 66:8B46 1E MOV AX,WORD PTR DS:[ESI+1E] -0202AD8F |. 66:85C0 TEST AX,AX -0202AD92 |. 7C 13 JL SHORT D2Game.0202ADA7 -0202AD94 |. 66:3D 9400 CMP AX,94 -0202AD98 |. 73 0D JNB SHORT D2Game.0202ADA7 -0202AD9A |. 0FBFC0 MOVSX EAX,AX -0202AD9D |. C1E0 04 SHL EAX,4 -0202ADA0 |. 05 E8E70902 ADD EAX,D2Game.0209E7E8 -0202ADA5 |. 5E POP ESI -0202ADA6 |. C3 RETN -0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8 -0202ADAC |. 5E POP ESI -0202ADAD \. C3 RETN -*/ /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/UpdateClient.cpp b/PlugY/UpdateClient.cpp index 5ab6758..98dcd7d 100644 --- a/PlugY/UpdateClient.cpp +++ b/PlugY/UpdateClient.cpp @@ -1,10 +1,10 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Updating client. - + =================================================================*/ #include "updateClient.h" @@ -44,10 +44,10 @@ void updateClient(Unit* ptChar, DWORD mFunc, char* msg) packet.mFunc = (BYTE)mFunc; packet.mSize = sizeof(DataPacket); packet.mPlayerID = ptChar->nUnitId; - if (msg != NULL && strlen(msg) >= 20) + if (msg != NULL && strlen(msg) > 20) return; if (msg != NULL) - strcpy((char*)&packet.mItemID, msg); + strncpy((char*)&packet.mItemID, msg, 20); ptNetClient = D2GetClient(ptChar, __FILE__, __LINE__); @@ -60,21 +60,25 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet) log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3); switch (packet->mFunc) { - case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1; - case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1; - case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1; + case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1; + case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1; + case UC_PAGE_NAME: + { + char pageName[21]; + strncpy(pageName, (char*)&packet->mItemID, 20); + pageName[20] = NULL; + renameCurrentStash(D2GetClientPlayer(), pageName); return 1; + } default : return 0; } } -FCT_ASM( caller_handleClientUpdate_114 ) - LEA ECX, DWORD PTR SS : [ESP] - CALL handleClientUpdate - POP EDI - POP ESI - MOV ESP, EBP - POP EBP - RETN +FCT_ASM ( caller_handleClientUpdate_114 ) + LEA ECX,DWORD PTR SS:[ESP] + CALL handleClientUpdate + MOV ESP,EBP + POP EBP + RETN }} FCT_ASM ( caller_handleClientUpdate_111 ) @@ -99,18 +103,19 @@ void Install_UpdateClient() { static int isInstalled = false; if (isInstalled) return; - + log_msg("Patch D2Client for received Item packet. (UpdateClient)\n"); // execute if it's our packet else continue mem_seek R8(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96, 5EC99); - MEMT_REF4( version_D2Client == V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client == V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate); + MEMT_REF4( version_D2Client >= V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate); //6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690 //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 + //0045EC97 |. 0F87 CE000000 JA Game.0045ED6B log_msg("\n"); diff --git a/PlugY/UpdateServer.cpp b/PlugY/UpdateServer.cpp index 44bab98..6d31563 100644 --- a/PlugY/UpdateServer.cpp +++ b/PlugY/UpdateServer.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. Updating server. @@ -14,8 +14,16 @@ #include "commands.h" #include "common.h" + +void updateServer(WORD p) +{ + if (!onRealm) + D2SendToServer3(0x3A, p); +} + + int renameIndex = 0; -char renameString[16]; +char renameString[21]; DWORD PageSwap; int STDCALL handleServerUpdate(Unit* ptChar, WORD param) @@ -62,25 +70,27 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param) case US_SWAP0: swapStash(ptChar, PageSwap | arg, false); PageSwap = 0; return 1; case US_SWAP0_TOGGLE : swapStash(ptChar, PageSwap | arg, true); PageSwap = 0; return 1; case US_RENAME : - if (renameIndex == 0) - for (int i = 0; i < 16; i++) - renameString[i] = 0; + if (renameIndex == 0) + ZeroMemory(renameString, sizeof(renameString)); + if (arg != NULL && renameIndex < 15) renameString[renameIndex++] = (char)arg; - if (arg == 0) - { - renameIndex = 0; - log_msg("Rename on Server : %s -> %s\n", ptChar->ptPlayerData->name, renameString); - strcpy(ptChar->ptPlayerData->name, renameString); - strcpy(ptChar->ptPlayerData->ptNetClient->name, renameString); - } + if (arg == NULL) + { + renameString[renameIndex] = NULL; + renameIndex = 0; + log_msg("Rename on Server : %s -> %s\n", PCPlayerData->name, renameString); + strcpy(PCPlayerData->name, renameString); + strcpy(PCPlayerData->ptNetClient->name, renameString); + } return 1; case US_PAGENAME: if (renameIndex == 0) - for (int i = 0; i < 16; i++) - renameString[i] = 0; - renameString[renameIndex++] = (char)arg; - if (arg == 0) + ZeroMemory(renameString, sizeof(renameString)); + if (arg != NULL && renameIndex < 20) + renameString[renameIndex++] = (char)arg; + if (arg == NULL) { + renameString[renameIndex] = NULL; renameIndex = 0; log_msg("Rename current page on Server : %s -> %s\n", PCPY->currentStash->name, renameString); renameCurrentStash(ptChar, renameString); @@ -91,24 +101,24 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param) } } -FCT_ASM( caller_handleServerUpdate_114 ) - PUSH ESI - PUSH EBX - CALL handleServerUpdate - TEST EAX, EAX - JNZ END_RCM - MOV EAX, ESI - AND EAX, 0xFF - SHR ESI, 8 - MOV EDI, EAX - RETN -END_RCM : - ADD ESP, 8 - POP EDI - POP ESI - XOR EAX, EAX - POP EBX - RETN 8 +FCT_ASM( caller_handleServerUpdate_114) + PUSH ESI + PUSH EBX + CALL handleServerUpdate + TEST EAX,EAX + JNZ END_RCM + MOV EAX,ESI + AND EAX,0xFF + SHR ESI,8 + MOV EDI,EAX + RETN +END_RCM: + ADD ESP,8 + POP EDI + POP ESI + XOR EAX,EAX + POP EBX + RETN 8 }} FCT_ASM( caller_handleServerUpdate) @@ -180,6 +190,9 @@ void Install_UpdateServer() //066A76C3 |. C1EE 08 SHR ESI,8 //066A76C6 |. 57 PUSH EDI //066A76C7 |. 8BF8 MOV EDI,EAX + //0054BD38 |. C1EE 08 SHR ESI,8 + //0054BD3B |. 57 PUSH EDI + //0054BD3C |. 8BF8 MOV EDI,EAX } else if (version_D2Game == V110) { memt_byte( 0xC1, 0xE8 ); // CALL caller_handleServerUpdate MEMT_REF4( 0xF88B08EE, caller_handleServerUpdate); diff --git a/PlugY/Windowed.cpp b/PlugY/Windowed.cpp index dacb174..ed5992c 100644 --- a/PlugY/Windowed.cpp +++ b/PlugY/Windowed.cpp @@ -8,17 +8,17 @@ #include "windowed.h" #include "common.h" -int active_Windowed = true; +int active_Windowed = false; int setWindowedOptionsDone = false; -int active_RemoveBorder = true; -int active_WindowOnTop = true; -int active_Maximized = true; -int active_SetWindowPos = true; -int windowedX = 240; +int active_RemoveBorder = false; +int active_WindowOnTop = false; +int active_Maximized = false; +int active_SetWindowPos = false; +int windowedX = 0; int windowedY = 0; -int windowedWidth = 1440; -int windowedHeight = 1080; -int active_LockMouseOnStartup = true; +int windowedWidth = 800; +int windowedHeight = 600; +int active_LockMouseOnStartup = false; void unlockMouseCursor() { diff --git a/PlugY/WorldEvent.cpp b/PlugY/WorldEvent.cpp index e40c486..90313d3 100644 --- a/PlugY/WorldEvent.cpp +++ b/PlugY/WorldEvent.cpp @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. World Event Management. @@ -28,7 +28,7 @@ DWORD WEactive = 0; DWORD DCloneSpawned = 0; DWORD nbSOJSold = 0; -DWORD nbNeedSOJSold = 100; +DWORD nbNeedSOJSold = 0; DWORD nbManagedSOJSold = 0; DWORD nbTicksForNextSOJSold = 0; @@ -80,21 +80,26 @@ Game* STDCALL WEManagement(DWORD clientID) if (!ptGame) return ptGame; if (active_AutomaticSell) - while (GetTickCount() - prevTicks >= nbTicksForNextSOJSold) { - nbSOJSold++; - prevTicks = prevTicks + nbTicksForNextSOJSold; - nbTicksForNextSOJSold = getTicksForNextSOJSold(); + while (GetTickCount() - prevTicks >= nbTicksForNextSOJSold) + { + nbSOJSold++; + prevTicks = prevTicks + nbTicksForNextSOJSold; + nbTicksForNextSOJSold = getTicksForNextSOJSold(); + } } - if (nbSOJSold == nbManagedSOJSold) return ptGame; + if (nbSOJSold == nbManagedSOJSold) + return ptGame; DWORD newWE; if (!WEactive && (ptGame->difficultyLevel == D2DM_HELL) && (nbSOJSold >= nbNeedSOJSold)) { newWE = 1; WEactive = 1; - } else newWE = 0; + } + else + newWE = 0; if ( showSOJSoldCounterInAllDiff || (ptGame->difficultyLevel == D2DM_HELL)) worldEventBroadcast(ptGame, newWE, nbSOJSold); @@ -109,10 +114,11 @@ DWORD FASTCALL spawnDClone(Game* ptGame, Room* ptRoom, DWORD p3, DWORD p4, DWORD if (WEactive && (ptGame->difficultyLevel == D2DM_HELL) && !DCloneSpawned) { DCloneSpawned=1; - D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,worldEventmonsterID,p8); + D2SpawnSuperUnique(ptGame,ptRoom,p3,p4,p5,p6,worldEventmonsterID,p8); return 0;//no minions } - else return D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,monsterID,p8); + else + return D2SpawnSuperUnique(ptGame,ptRoom,p3,p4,p5,p6,monsterID,p8); } DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char* filename) @@ -120,27 +126,22 @@ DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char* ItemsBIN* ptItemStats = D2GetItemsBIN(ptItem->nTxtFileNo); ItemsBIN* ptWantedItemStats = D2GetItemsBIN(itemNeeded.ID); - log_msg("D2CheckItemType() = %u\n\n", D2CheckItemType(ptItem, itemNeeded.ID)); - log_msg("D2GetUniqueID() = %u\n\n", D2GetUniqueID(ptItem)); - log_msg("D2isEtheral() = %u\n\n", D2isEtheral2(ptItem, 0, 0, 0, 0, 0, 0)); - log_msg("itemNeeded.ID = %u\n\n", itemNeeded.ID); - if((itemNeeded.byItemTypeID && D2CheckItemType(ptItem,itemNeeded.ID)) || (itemNeeded.byItemID && (itemNeeded.ID == 0xFFFF)) || (itemNeeded.byItemID && !itemNeeded.includeUpgradedVersions && ((DWORD)itemNeeded.ID == ptItem->nTxtFileNo)) || (itemNeeded.byItemID && itemNeeded.includeUpgradedVersions) && ( - (ptItemStats->ItemCode == ptItemStats->NormCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) - || (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) - || (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode) - || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) - || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode) - || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->HellCode) - )) + (ptItemStats->ItemCode == ptItemStats->NormCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) + || (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) + || (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode) + || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode) + || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode) + || (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->HellCode) + )) if(!(itemNeeded.isSpecificItem && (D2GetUniqueID(ptItem) != itemNeeded.specificID-1)) && !(itemNeeded.haveNoSocket && (D2GetPlayerStat(ptItem, STATS_ITEM_NUMSOCKETS, 0) > 0)) && !(itemNeeded.haveSockets && (D2GetPlayerStat(ptItem, STATS_ITEM_NUMSOCKETS, 0) == 0)) - && !(itemNeeded.isNotEthereal && D2isEtheral(ptItem)) - && !(itemNeeded.isEthereal && !D2isEtheral(ptItem)) + && !(itemNeeded.isNotEthereal && ptItem->ptItemData->isEtheral) + && !(itemNeeded.isEthereal && !ptItem->ptItemData->isEtheral) && !(itemNeeded.isBasic && (ptItemStats->ItemCode != ptWantedItemStats->NormCode)) && !(itemNeeded.isExceptional && (ptItemStats->ItemCode != ptWantedItemStats->UberCode)) && !(itemNeeded.isElite && (ptItemStats->ItemCode != ptWantedItemStats->HellCode)) @@ -166,9 +167,16 @@ void initWorldEventVariables() WEactive = 0; while (nbSOJSold >= nbNeedSOJSold) - nbNeedSOJSold += (DWORD)(rand()/(RAND_MAX+1.0)*triggerAtSolJSoldDelta+triggerAtSolJSoldMin); + nbNeedSOJSold += (DWORD)(rand()/(RAND_MAX+1.0)*triggerAtSolJSoldDelta + triggerAtSolJSoldMin); + + log_msg("initWorldEventVariables - nbSOJSold = %d, nbNeedSOJSold = %d\n", nbSOJSold, nbNeedSOJSold); } +FCT_ASM ( caller_WEManagement_114 ) + PUSH ECX + CALL WEManagement + RETN +}} FCT_ASM ( caller_WEManagement_1XX ) POP EAX @@ -204,31 +212,29 @@ FCT_ASM ( caller_spawnDClone_111b ) }} FCT_ASM( caller_spawnDClone_114 ) - PUSH EBX - PUSH ECX - PUSH EDX - PUSH EDI - PUSH ESI + PUSH EBX + PUSH ECX + PUSH EDX + PUSH EDI + PUSH ESI - PUSH 0 - PUSH EBX - PUSH 0xFFFFFFFF - PUSH DWORD PTR SS : [ESP + 0x30] - PUSH DWORD PTR SS : [ESP + 0x30] - PUSH DWORD PTR SS : [ESP + 0x30] - MOV ECX, EDI - MOV EDX, EAX - CALL spawnDClone + PUSH 0 + PUSH EBX + PUSH 0xFFFFFFFF + PUSH DWORD PTR SS : [ESP + 0x30] + PUSH DWORD PTR SS : [ESP + 0x30] + PUSH DWORD PTR SS : [ESP + 0x30] + MOV ECX, EDI + MOV EDX, EAX + CALL spawnDClone - POP ESI - POP EDI - POP EDX - POP ECX - POP EBX - RETN 0x18 + POP ESI + POP EDI + POP EDX + POP ECX + POP EBX + RETN 0x18 }} - - FCT_ASM( caller_addClientForWE_111 ) PUSH EAX CALL initWorldEventVariables @@ -253,7 +259,7 @@ void Install_WorldEvent() if ( version_D2Game < V110 ) return; - nbSOJSold = (DWORD)(rand()/(RAND_MAX+1.0)*valueInitSOJSoldDelta+valueInitSOJSoldMin); + nbSOJSold = (DWORD)(rand()/(RAND_MAX+1.0)*valueInitSOJSoldDelta + valueInitSOJSoldMin); if (active_AutomaticSell) { prevTicks = GetTickCount(); @@ -264,60 +270,48 @@ void Install_WorldEvent() // spawn DClone mem_seek R8(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0, 1A4A4F); - if (version_D2Client == V114d) { - MEMT_REF4(0xFFFFBF8D, caller_spawnDClone_114); - } else { - MEMC_REF4(V2SpawnMonster, version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone); - } - //6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220 + MEMC_REF4( V2SpawnSuperUnique , version_D2Game >= V114a ? (DWORD)caller_spawnDClone_114 : 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 + //005A4A4E |. E8 8DBFFFFF CALL Game.005A09E0 ; \Game.005A09E0 // verify if the item sold is a trigger of WE mem_seek R8(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9, 179667); - if (version_D2Game == V114d) { - MEMT_REF4(0x000AEA35, verifIfWEItem); - } else { - MEMJ_REF4(D2TestFlags, verifIfWEItem); - } + 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 + //00579666 |. E8 35EA0A00 CALL Game.006280A0 ; \Game.006280A0 // management of the WorldEvent - mem_seek R8(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51, 1389B1); - if (version_D2Game == V114d) { - MEMT_REF4(0xFFFF752B, caller_WEManagement_1XX); - } else { - MEMC_REF4(V2GetGameByClientID, version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX); - } + mem_seek R8(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51, 12FEED); + MEMC_REF4( V2GetGameByClientID , version_D2Game >= V114a ? (DWORD)caller_WEManagement_114 : 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 + //0052FEEC |. E8 6FE9FFFF CALL Game.0052E860 + //to check : 005389B0 |. E8 2B75FFFF CALL Game.0052FEE0 // add client for the WorldEvent mem_seek R8(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F, 13F2D2); - if (version_D2Game == V114d) { - MEMT_REF4(0xFFFED27A, caller_addClientForWE); - } - else { - MEMC_REF4(D2AddClient, version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE); - } + MEMC_REF4( D2AddClient , version_D2Game >= V111 && version_D2Game <= V113d ? 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 + //0053F2D1 |. E8 7AD2FEFF CALL Game.0052C550 log_msg("\n"); diff --git a/PlugY/clientSaveFile.h b/PlugY/clientSaveFile.h index cc0a3e5..4008698 100644 --- a/PlugY/clientSaveFile.h +++ b/PlugY/clientSaveFile.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file for each characters. + Add an extra save file for each characters. =================================================================*/ #pragma once diff --git a/PlugY/common.h b/PlugY/common.h index fe4488b..5ab0923 100644 --- a/PlugY/common.h +++ b/PlugY/common.h @@ -2,9 +2,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. - /*============================================*/ #pragma once diff --git a/PlugY/customData.h b/PlugY/customData.h index 3b769e3..85a6485 100644 --- a/PlugY/customData.h +++ b/PlugY/customData.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Data added to D2 base-stucture + Data added to D2 base-stucture =================================================================*/ #pragma once diff --git a/PlugY/d2functions.h b/PlugY/d2functions.h index 61764f3..15e8bee 100644 --- a/PlugY/d2functions.h +++ b/PlugY/d2functions.h @@ -1,7 +1,7 @@ /*================================================ File created by Yohann NICOLAS. Add support 1.13d by L'Autour. - Add support 1.14d by haxifix. + Add support 1.14d by haxifix. This file implements some common and useful function related to some Diablo II mechanisms. @@ -23,13 +23,14 @@ struct s_shifting { extern s_shifting shifting; //#ifdef MSVC -#define FASTCALL __fastcall +#define FASTCALL __fastcall //#else -//#define FASTCALL __msfastcall +//#define FASTCALL __msfastcall //#endif #define STDCALL __stdcall #define FCT_ASM(N) __declspec(naked) void N() {__asm{ #define RANDOM(V) ((int)(rand()/(RAND_MAX+1.0)*(V))) +#define RANDOMF() ((double)rand() / (double)RAND_MAX) //#define RANDOM(V) (rand()%(V)) //#define PY(C) (*(PYPlayerData**)((BYTE*)(ptChar)+shifting.ptPYPlayerData)) @@ -87,7 +88,10 @@ extern DataTables* SgptDataTables; extern TD2AddPlayerStat V2AddPlayerStat; extern TD2GetGameByClientID V2GetGameByClientID; +extern TD2SpawnSuperUnique V2SpawnSuperUnique; extern TD2SpawnMonster V2SpawnMonster; +extern TD2Game235C0 V2Game235C0; +extern TD2ReadFile V2ReadFile; //extern TD2SetColorPopup V2SetColorPopup; extern WORD (*getDescStrPos) (DWORD statID); extern void* (STDCALL *compileTxtFile)(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength); @@ -102,13 +106,14 @@ void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, #define WindowStartX (*ptWindowStartX) #define GameTypeMode (*ptGameTypeMode) #define ClientTable (*ptClientTable) - +//#define CurrentNPCNum (*ptCurrentNPCNum) #define IsLodGame (*ptIsLodGame) #define DifficultyLevel (*ptDifficultyLevel) #define MouseY (*ptMouseY) #define MouseX (*ptMouseX) #define ptClientChar (*ptptClientChar) -//#define CurrentNPCNum (*ptCurrentNPCNum) +#define InputCommandLen (*ptInputCommandLen) +#define InputCommand (*ptInputCommand) void initD2functions(); diff --git a/PlugY/d2wrapper.h b/PlugY/d2wrapper.h index aaf494a..9659e80 100644 --- a/PlugY/d2wrapper.h +++ b/PlugY/d2wrapper.h @@ -1,20 +1,11 @@ /****************************************************************************** -File modified by Yohann NICOLAS. + File created by Yohann NICOLAS. -NAME -inifile.h - -DESCRIPTION -Memory cached INI file read/write class to replace legacy MS code - -COPYRIGHT -1999-2004 Ultrafunk (www.ultrafunk.com) - info@ultrafunk.com + Main Diablo II extra DLL handler. ******************************************************************************/ #pragma once -#include - extern int version_Game; //extern int version_binkw32; //extern int version_Bnclient; diff --git a/PlugY/error.h b/PlugY/error.h index 6143f86..247cb20 100644 --- a/PlugY/error.h +++ b/PlugY/error.h @@ -4,7 +4,7 @@ @file error.hpp @brief Error logger definition. - This file defiens various functions related to + This file defiens various functions related to error handling in D2External functions. ==============================================*/ @@ -12,9 +12,10 @@ #include -extern DWORD active_logFile; +extern int active_logFile; void log_initfile(); +void log_close(); void log_box( const char* pFormat, ... ); void log_msg( const char* pFormat, ... ); void d2_assert( bool pCondition, char* pLocation, char* pMessage, int pLineNbr ); diff --git a/PlugY/extendedSaveFile.h b/PlugY/extendedSaveFile.h index 475ebe8..0bb7b3d 100644 --- a/PlugY/extendedSaveFile.h +++ b/PlugY/extendedSaveFile.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file for each characters. + Add an extra save file for each characters. =================================================================*/ #pragma once diff --git a/PlugY/extraOptions.h b/PlugY/extraOptions.h index 3fbacab..1fc96dd 100644 --- a/PlugY/extraOptions.h +++ b/PlugY/extraOptions.h @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add DoNotCloseNihlathakPortal by haxifix. More little options. @@ -8,17 +9,19 @@ #include "common.h" -extern int active_DisplayItemLevel; +extern bool active_DisplayItemLevel; extern DWORD nbPlayersCommandByDefault; extern DWORD nbPlayersCommand; -extern int active_alwaysRegenMapInSP; -extern int active_RunLODs; +extern bool active_alwaysRegenMapInSP; +extern bool active_RunLODs; extern int active_AlwaysDisplayLifeMana; -extern int active_EnabledTXTFilesWithMSExcel; -extern int active_DisplayBaseStatsValue; -extern int active_LadderRunewords; -extern int active_EnabledCowPortalWhenCowKingWasKill; -extern int active_DoNotCloseNihlathakPortal; +extern bool active_EnabledTXTFilesWithMSExcel; +extern bool active_DisplayBaseStatsValue; +extern bool active_LadderRunewords; +extern bool active_EnabledCowPortalWhenCowKingWasKill; +extern bool active_DoNotCloseNihlathakPortal; +extern bool active_MoveCainNearHarrogathWaypoint; +extern bool active_RemoveExperienceDiminushingReturn; void Install_DisplayItemLevel(); void Install_SendPlayersCommand(); @@ -30,5 +33,7 @@ void Install_DisplayBaseStatsValue(); void Install_LadderRunewords(); void Install_EnabledCowPortalWhenCowKingWasKill(); void Install_DoNotCloseNihlathakPortal(); +void Install_MoveCainNearHarrogathWaypoint(); +void Install_RemoveExperienceDiminushingReturn(); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/infinityStash.h b/PlugY/infinityStash.h index af306e7..0ca6b4d 100644 --- a/PlugY/infinityStash.h +++ b/PlugY/infinityStash.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - infinity Stash gestion + infinity Stash gestion =================================================================*/ #pragma once @@ -13,13 +13,57 @@ extern DWORD maxSharedPages; extern DWORD nbPagesPerIndex; extern DWORD nbPagesPerIndex2; extern bool active_multiPageStash; +extern int active_SharedStashInMultiPlayer; extern bool active_sharedStash; extern bool active_sharedGold; extern bool separateHardSoftStash; extern char* sharedStashFilename; extern bool displaySharedSetItemNameInGreen; -extern int posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn,posYSharedBtn,posXPreviousIndexBtn,posYPreviousIndexBtn,posXNextIndexBtn,posYNextIndexBtn,posXPutGoldBtn,posYPutGoldBtn,posXTakeGoldBtn,posYTakeGoldBtn; +extern int posXPreviousBtn; +extern int posYPreviousBtn; +extern int posWPreviousBtn; +extern int posHPreviousBtn; +extern int posXNextBtn; +extern int posYNextBtn; +extern int posWNextBtn; +extern int posHNextBtn; +extern int posXSharedBtn; +extern int posYSharedBtn; +extern int posWSharedBtn; +extern int posHSharedBtn; +extern int posXPreviousIndexBtn; +extern int posYPreviousIndexBtn; +extern int posWPreviousIndexBtn; +extern int posHPreviousIndexBtn; +extern int posXNextIndexBtn; +extern int posYNextIndexBtn; +extern int posWNextIndexBtn; +extern int posHNextIndexBtn; +extern int posXPutGoldBtn; +extern int posYPutGoldBtn; +extern int posWPutGoldBtn; +extern int posHPutGoldBtn; +extern int posXTakeGoldBtn; +extern int posYTakeGoldBtn; +extern int posWTakeGoldBtn; +extern int posHTakeGoldBtn; +extern int posXStashNameField; +extern int posYStashNameField; +extern int posWStashNameField; +extern int posHStashNameField; +extern int posXStashGoldField; +extern int posYStashGoldField; +extern int posWStashGoldField; +extern int posHStashGoldField; + +extern bool autoRenameStashPage; +extern DWORD PersonalNormalPageColor; +extern DWORD PersonalIndexPageColor; +extern DWORD PersonalMainIndexPageColor; +extern DWORD SharedNormalPageColor; +extern DWORD SharedIndexPageColor; +extern DWORD SharedMainIndexPageColor; void toggleToSharedStash(Unit* ptChar); void toggleToSelfStash(Unit* ptChar); @@ -37,13 +81,17 @@ void renameCurrentStash(Unit* ptChar, char* name); void insertStash(Unit* ptChar); bool deleteStash(Unit* ptChar, bool isClient); -void selectStash(Unit* ptChar, Stash* newStash); +void updateSelectedStashClient(Unit* ptChar); +void selectStash(Unit* ptChar, Stash* newStash, bool forceUpdate = false); void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems); -Stash* addStash(Unit* ptChar, bool isShared); +Stash* addStash(Unit* ptChar, bool isShared, bool autoSetIndex, Stash* ptStash = NULL); DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared); void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD* curSize); +void getCurrentStashName(WCHAR* buffer, DWORD maxSize, Unit* ptChar); +WCHAR* getDefaultStashName(Unit* ptChar); + void Install_MultiPageStash(); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/loadPlayerData.h b/PlugY/loadPlayerData.h index 1fdb609..f31a65e 100644 --- a/PlugY/loadPlayerData.h +++ b/PlugY/loadPlayerData.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Load Player Custom Data. + Load Player Custom Data. =================================================================*/ #pragma once diff --git a/PlugY/mainScreen.h b/PlugY/mainScreen.h index 06b97c0..71495e4 100644 --- a/PlugY/mainScreen.h +++ b/PlugY/mainScreen.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add "plugY v1.00" on screen. + Print PlugY version on screen. =================================================================*/ #pragma once diff --git a/PlugY/modifMemory.h b/PlugY/modifMemory.h index b6c8fb2..9878766 100644 --- a/PlugY/modifMemory.h +++ b/PlugY/modifMemory.h @@ -2,7 +2,7 @@ File created by Yohann NICOLAS. Modification of code in memory functions. - + /*============================================*/ #pragma once @@ -20,7 +20,7 @@ void memt_dword(DWORD old, DWORD val); void memt_ref4(DWORD old, DWORD ref); //CALL -#define MEMJ_REF4(O, R) memj_ref4((DWORD)(O), (DWORD)(R)) +#define MEMJ_REF4(O, R) if (version_Game < V114a) memj_ref4((DWORD)(O), (DWORD)(R)); else memc_ref4((DWORD)(O), (DWORD)(R)) void memj_ref4(DWORD old, DWORD ref); //CALL D2Common.6FD5F500 @@ -31,6 +31,4 @@ void memc_ref4(DWORD old, DWORD ref); #define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R)) void memd_ref4(DWORD old, DWORD ref); -void patchMemory4(DWORD value); - /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/newInterfaces.h b/PlugY/newInterfaces.h index 9069564..de51f26 100644 --- a/PlugY/newInterfaces.h +++ b/PlugY/newInterfaces.h @@ -12,6 +12,7 @@ #define isOnStatsPage(x,y) ((x<400) && (y<553)) extern DWORD bDontPrintBorder; +extern int extraHiddenPage; void GoNextStatPage(); void GoPreviousStatPage(); diff --git a/PlugY/parameters.h b/PlugY/parameters.h index 1190c0e..15e4d8b 100644 --- a/PlugY/parameters.h +++ b/PlugY/parameters.h @@ -1,12 +1,12 @@ /*================================================================= File created by Yohann NICOLAS. - Loading parameters from ini file. + Loading parameters from ini file. =================================================================*/ #pragma once -#define PLUGY_VERSION "12.00" +#define PLUGY_VERSION "14.00" enum TargetMod { diff --git a/PlugY/playerCustomData.h b/PlugY/playerCustomData.h index e0a053a..41d2112 100644 --- a/PlugY/playerCustomData.h +++ b/PlugY/playerCustomData.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Data added to Player base-stucture + Data added to Player base-stucture =================================================================*/ #pragma once @@ -16,9 +16,9 @@ struct Unit; struct Stash { DWORD id; - union { - DWORD flags; - struct { + union { + DWORD flags; + struct { DWORD isShared:1; // DWORD isIndex:1; // DWORD isMainIndex:1; // @@ -35,13 +35,13 @@ struct Stash struct PYPlayerData { union { - DWORD flags; - struct { + DWORD flags; + struct { DWORD selfStashIsOpened:1; // DWORD sharedStashIsOpened:1;// DWORD showSharedStash:1; // // DWORD notOnRealm:1; //set to 1 when the player is load from client or in SP - }; + }; }; DWORD sharedGold; DWORD nbSelfPages; diff --git a/PlugY/plugYFiles.h b/PlugY/plugYFiles.h index 6345cc5..a9ec085 100644 --- a/PlugY/plugYFiles.h +++ b/PlugY/plugYFiles.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Data added to D2 base-stucture + Data added to D2 base-stucture =================================================================*/ #pragma once diff --git a/PlugY/savePath.h b/PlugY/savePath.h index 7fd9484..71d803a 100644 --- a/PlugY/savePath.h +++ b/PlugY/savePath.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Changing the current save path. + Changing the current save path. =================================================================*/ #pragma once diff --git a/PlugY/savePlayerData.h b/PlugY/savePlayerData.h index 70d2717..9e26c5a 100644 --- a/PlugY/savePlayerData.h +++ b/PlugY/savePlayerData.h @@ -1,13 +1,17 @@ /*================================================================= File created by Yohann NICOLAS. - Save Player Custom Data. + Save Player Custom Data. =================================================================*/ #pragma once #include "common.h" +extern bool active_AutoBackup; +extern int maxBackupPerCharacter; + +void backupSaveFiles(char* name, int isHardCoreGame); void Install_SavePlayerData(); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/sharedSaveFile.h b/PlugY/sharedSaveFile.h index 994af2c..5ee9f5f 100644 --- a/PlugY/sharedSaveFile.h +++ b/PlugY/sharedSaveFile.h @@ -1,7 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. - Add an extra save file shared by all own characters. + Add an extra save file shared by all own characters. =================================================================*/ #pragma once diff --git a/PlugY/skillsPoints.h b/PlugY/skillsPoints.h index 2b599d4..d9392d4 100644 --- a/PlugY/skillsPoints.h +++ b/PlugY/skillsPoints.h @@ -9,7 +9,7 @@ #include "common.h" extern bool active_SkillsPoints; -extern bool unassignSkillsPointsOneByOne; +extern bool unassignSkillsPointsOneForOne; extern int posXUnassignSkillBtn, posYUnassignSkillBtn; void UnassignAllSkillsPoints(Unit* ptChar); diff --git a/PlugY/uberQuest.h b/PlugY/uberQuest.h index b72742d..8571783 100644 --- a/PlugY/uberQuest.h +++ b/PlugY/uberQuest.h @@ -9,6 +9,33 @@ #include "common.h" extern bool active_UberQuest; +extern DWORD UberMephistoX; +extern DWORD UberMephistoY; +extern DWORD UberDiabloX; +extern DWORD UberDiabloY; +extern DWORD UberBaalX; +extern DWORD UberBaalY; + +extern bool active_UberMinions; +//extern DWORD UberMephistoNbMinions; +//extern DWORD UberMephistoMinions[]; +extern int UberMephistoSpawnPercent; +extern DWORD UberMephistoSpawnRadius; + +//extern DWORD UberBaalNbMinions; +//extern DWORD UberBaalMinions[]; +extern int UberBaalSpawnPercent; +extern DWORD UberBaalSpawnRadius; + +//extern DWORD UberDiabloNbMinions; +//extern DWORD UberDiabloMinions[]; +extern int UberDiabloSpawnPercent; +extern DWORD UberDiabloSpawnRadius; + +extern bool active_UberDiabloRushTweekAI; +extern bool active_UberBaalTeleportTweekAI; +extern bool active_UberBaalChillingArmorTweekAI; +extern int uberBaalChillingArmorTimer; void Install_UberQuest(); void resetQuestState(); diff --git a/PlugY/updateServer.h b/PlugY/updateServer.h index 9b80761..41312d8 100644 --- a/PlugY/updateServer.h +++ b/PlugY/updateServer.h @@ -8,7 +8,8 @@ #include "common.h" -__inline void updateServer(WORD p) {if (!onRealm) D2SendToServer3(0x3A, p);}; +void updateServer(WORD p); + void Install_UpdateServer(); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugYInstall/PlugYInstall.cpp b/PlugYInstall/PlugYInstall.cpp index 52643fe..a274e18 100644 --- a/PlugYInstall/PlugYInstall.cpp +++ b/PlugYInstall/PlugYInstall.cpp @@ -39,7 +39,7 @@ BYTE loadDll[] = { 0x74,0x04, //JE SHORT d2gfx.6FA7BDC1 0x6A,0x00, //PUSH 0 0xEB,0x13, //JMP SHORT d2gfx.6FA7BDC1 - 0x68,0x10,0x27,0x00,0x00, //PUSH 2710 ;Init Ordinal(10000) + 0x68,0x10,0x27,0x00,0x00, //PUSH 2710 ;Init Ordinal(10000) 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX @@ -67,7 +67,7 @@ BYTE freeDll[] = { 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX 0x75,0x13, //JNZ SHORT d2gfx.6FA7BDEF - 0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001) + 0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001) 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX @@ -265,7 +265,7 @@ int main(int argc, char * argv[]) { msgBox(boxName, MB_OK | MB_ICONEXCLAMATION, "Current version of LoD (%s) isn't compatible with PlugY.\n\n" - "Please, install a patch between 1.09 and 1.13d or 1.14.", + "Please, install a patch between 1.09 and 1.13d or 1.14d.", GetVersionString(version)); exit(0); } diff --git a/PlugYInstall/PlugYInstall.rc b/PlugYInstall/PlugYInstall.rc index 23e3a40..eae66ba 100644 --- a/PlugYInstall/PlugYInstall.rc +++ b/PlugYInstall/PlugYInstall.rc @@ -1,63 +1,63 @@ -//Script de ressources g�n�r� par Microsoft Visual C++. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// G�n�r� � partir de la ressource TEXTINCLUDE 2. -// -#ifndef APSTUDIO_INVOKED -#include "targetver.h" -#endif -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// French (France) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) -LANGUAGE LANG_FRENCH, SUBLANG_FRENCH - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,6,0 - PRODUCTVERSION 1,0,6,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040c04b0" - BEGIN - VALUE "CompanyName", "Yohann Nicolas" - VALUE "FileDescription", "PlugY patcher" - VALUE "FileVersion", "1.0.6.0" - VALUE "LegalCopyright", "Copyright (C) 2017" - VALUE "OriginalFilename", "PlugYInstall.exe" - VALUE "ProductName", "PlugY, The Survival Kit" - VALUE "ProductVersion", "12.00" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x40c, 1200 - END -END - -#endif // French (France) resources +//Script de ressources gnr par Microsoft Visual C++. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Gnr partir de la ressource TEXTINCLUDE 2. +// +#ifndef APSTUDIO_INVOKED +#include "targetver.h" +#endif +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// French (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,6,0 + PRODUCTVERSION 1,0,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040c04b0" + BEGIN + VALUE "CompanyName", "Yohann Nicolas" + VALUE "FileDescription", "PlugY patcher" + VALUE "FileVersion", "1.0.6.0" + VALUE "LegalCopyright", "Copyright (C) 2017" + VALUE "OriginalFilename", "PlugYInstall.exe" + VALUE "ProductName", "PlugY, The Survival Kit" + VALUE "ProductVersion", "14.00" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x40c, 1200 + END +END + +#endif // French (France) resources ///////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/PlugYInstall/PlugYInstall.suo b/PlugYInstall/PlugYInstall.suo index 8595ff5a4a0a9cb62eddff6545e70b5c83b135b5..e4b87bf78b5a17c28a1a23d70cd5d48c8bb43372 100644 GIT binary patch delta 1077 zcmah|-A@xi5Z`U@j=d|CuUcrY*IwxdBqAKB5s1bD4G<(!KVmR81XQ9VhJY3XG;pHE z#5X!`#za*9fXclSj65s)povfDqff>Vqd~2+XN+hfZ1UTkotd4T`OU65YEI_Tj$JAt z#D@qVe&q9c8`hX(le*UqcKE)%drh5aN`zrrcuvcJMs`Dj2{0-4FfSVLNFMq_RbU7b ztP~0GMb!1*fn;=05H3U^q6ool&?Kc97phTV-IsJ4y^7KpVis`)kwI{e30x-;w-B&i z5b&5N^nKjCbE4DRn>+AkCO0@-2CdAnFe|Dxp*2ZbNSdU`anegVZRrvjCl|KZ^ElY!eikc9`lRNv>#^R)d43l%@BF;nPGV-mH^Q0Q(5wZuF|9}{R+ZB7^ zmER-RkqPu2B`$bcaTu1PiEL#Tme>SlWm4qnJ8d??czG1QR(8WP_aQKS?e?1R*QqBl z`2RbiW$S}Zd?+v*o64#tJd*veT(7`gHJuG4#S#o#$}f=OC`qC<9gv*xK3bEl^TJ}N zZAnj3#=E(dNGlWWallMGWqpnqRPEb70pyN7He(7n;(n^YcWr3N=%Q4&+m>nQg?3*< z^)a%&JN36> cUGTta<8_UY9h=gIzX0^O2Nu|XjTAF}0#u(WKmY&$ delta 697 zcmY*WO;1x%5Pi43@AbWYQf&GSEp2ItqAe)O!U{?gkRY~OC2EXe<$}bj6^%X(8<)J3 zC?Up#_y@FaX*5;XD(cF(BDz;YSZJcu8Tp9bWbQpPXJ+oXbIrOr^K{DL+ibO3F-1}M z+H=NklV+S@~8tA+q~0tV`6@2|Y*z6|`_Jl|fNzX!<06sOhw8 zrxlTI!X7d&nUCx`83wf}Jx_q|vma?`kz=&8t`Jk(X0Op%-^N&TB}1I_V&Tp6QNSN)S1iIuECS!GRr4%@XrMd%t8acFlg z8*QstmVNd{up*t0cLnxfE!^W0l>L9K7lV;rqp0*N7nSphfxD3*D>^1Zd;@CHiYloj z%%0jssE(h}ag0PuFk>T{NKq)jq=#op4llef6!10Dj+t;CW?VYyQ*oyoR>H($Vj914 zaVuHIiY&q$kd8@d&n7h|*7xV|GIavC^YKQyEOZC8`uAmat!u(zf67h^tMkkgv)he( zDeB*uQTbI0eZ;{=aZHFkThjYZ^B6ogiCScyGG0Z7NRt<4CMqO;cXZfh|FAH&SWZ}q XA88zF3cOAnb6isF;Nfp#{zC8%crD(3 diff --git a/PlugYInstall/PlugYInstall.vcproj b/PlugYInstall/PlugYInstall.vcproj index 4d353c9..2fd82ce 100644 --- a/PlugYInstall/PlugYInstall.vcproj +++ b/PlugYInstall/PlugYInstall.vcproj @@ -1,302 +1,302 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PlugYInstaller/PlugY.ini b/PlugYInstaller/PlugY.ini index a86e59b..f7e281e 100644 --- a/PlugYInstaller/PlugY.ini +++ b/PlugYInstaller/PlugY.ini @@ -5,13 +5,13 @@ ; ; ; by Yohann Nicolas ; ; ; -; version 12.00 ; +; version 14.00 ; ; ; ;--------------------------------------------------------------------------------------; ; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation. ; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information. -; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt für weitere Informationen +; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt fr weitere Informationen [LAUNCHING] Param= @@ -49,7 +49,10 @@ SelectedLanguage=ENG [SAVEPATH] ActiveSavePathChange=0 -SavePath=Save\Mod PlugY\ +SavePath=Mod PlugY + +ActiveAutoBackup=1 +MaxBackupPerCharacter=5 [MAIN SCREEN] @@ -68,8 +71,16 @@ ActiveMultiPageStash=1 NbPagesPerIndex=10 NbPagesPerIndex2=100 MaxPersonnalPages=0 +AutoRenameStashPage=1 +PersonalNormalPageColor=0 +PersonalIndexPageColor=12 +PersonalMainIndexPageColor=9 +SharedNormalPageColor=4 +SharedIndexPageColor=8 +SharedMainIndexPageColor=1 ActiveSharedStash=1 +ActiveSharedStashInMultiPlayer=0 SeparateHardcoreStash=1 OpenSharedStashOnLoading=0 DisplaySharedSetItemNameInGreen=1 @@ -81,13 +92,13 @@ ActiveSharedGold=1 ActiveStatsUnassignment=1 KeyUsed=18 -ActiveShiftClickLimit=0 -LimitValueToShiftClick=5 +ActiveShiftClickLimit=1 +LimitValueToShiftClick=10 [SKILLS POINTS] ActiveSkillsUnassignment=1 -ActiveSkillsUnassignmentOneByOne=0 +ActiveSkillsUnassignmentOneForOne=0 [WORLD EVENT] @@ -107,6 +118,24 @@ TimeBeforeAutoSellMax=1200 [UBER QUEST] ActiveUberQuest=1 +UberMephistoX=25130 +UberMephistoY=5143 +UberDiabloX=25139 +UberDiabloY=5139 +UberBaalX=25139 +UberBaalY=5135 + +ActiveUberMinions=1 +UberMephistoSpawnPercent=80 +UberMephistoSpawnRadius=30 +UberBaalSpawnPercent=30 +UberBaalSpawnRadius=30 +UberDiabloSpawnPercent=30 +UberDiabloSpawnRadius=30 +ActiveUberDiabloRushTweekAI=1 +ActiveUberBaalTeleportTweekAI=1 +ActiveUberBaalChillingArmorTweekAI=1 +UberBaalChillingArmorTimer=6000 [INTERFACE] @@ -117,15 +146,14 @@ SelectMainPageOnOpenning=1 [EXTRA] ActiveLaunchAnyNumberOfLOD=1 AlwaysRegenMapInSP=0 -NBPlayersByDefault=0 +NBPlayersByDefault=1 ActiveDisplayItemLevel=1 AlwaysDisplayLifeAndManaValues=0 EnabledTXTFilesWhenMSExcelOpenIt=0 ActiveDisplayBaseStatsValue=1 ActiveLadderRunewords=1 ActiveCowPortalWhenCowKingWasKilled=1 - - -; More features later... :) +ActiveDoNotCloseNihlathakPortal=1 +MoveCainNearHarrogathWaypoint=1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; \ No newline at end of file diff --git a/PlugYInstaller/PlugY.nsi b/PlugYInstaller/PlugY.nsi index e840920..d9fcc22 100644 --- a/PlugYInstaller/PlugY.nsi +++ b/PlugYInstaller/PlugY.nsi @@ -1,8 +1,9 @@ -Unicode True +; File created by Yohann NICOLAS. +Unicode True !include "MUI2.nsh" -!define VERSION "12.00" +!define VERSION "v14.00" !define D2FILES "." !define NAME "PlugY, The Survival Kit" !define MOD_DIR "Mod PlugY" @@ -10,6 +11,7 @@ !define UNINSTALL_FILE "PlugY Uninstaller.exe" !define MUI_COMPONENTSPAGE_SMALLDESC +!define MUI_ICON "..\PlugYRun\PlugY.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "PlugYInstallerHeader.bmp" !define MUI_LANGDLL_REGISTRY_ROOT HKLM @@ -25,8 +27,8 @@ !define MUI_ABORTWARNING ;!define MUI_UNABORTWARNING -Name "${NAME} v${VERSION}" -OutFile "PlugY_The_Survival_Kit_v${VERSION}.exe" +Name "${NAME} ${VERSION}" +OutFile "PlugY_The_Survival_Kit_${VERSION}_Installer.exe" InstallDirRegKey HKLM "${REGKEY}" "InstallPath" ;-------------------------------- @@ -46,66 +48,79 @@ InstallDirRegKey HKLM "${REGKEY}" "InstallPath" ;-------------------------------- ; Languages !insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "TradChinese" LangString DESC_CORE ${LANG_ENGLISH} "Core files.$\nPlugY.dll will be installed in Diablo II directory." -LangString DESC_CORE ${LANG_GERMAN} "Hauptdateien.$\nPlugY.dll wird in das Installationsverzeichnis von Diablo II installiert." LangString DESC_CORE ${LANG_FRENCH} "Fichiers nécessaires.$\nPlugY.dll sera installé dans le répertoire de Diablo II." +LangString DESC_CORE ${LANG_GERMAN} "Hauptdateien.$\nPlugY.dll wird in das Installationsverzeichnis von Diablo II installiert." LangString DESC_CORE ${LANG_RUSSIAN} "Основные файлы.$\nPlugY.dll должен быть установлен в каталог Diablo II." +LangString DESC_CORE ${LANG_TRADCHINESE} "核心檔案。$\nPlugY.dll 將被安裝於 Diablo II 目錄。" LangString DESC_DESKTOP_SHORTCUTS ${LANG_ENGLISH} "Add shortcut on Desktop to launch Diablo II with ${NAME}." -LangString DESC_DESKTOP_SHORTCUTS ${LANG_GERMAN} "Fügt eine Verknüpfung auf dem Desktop mit dem Namen ${NAME} hinzu mit der Diablo II gestartet werden kann." LangString DESC_DESKTOP_SHORTCUTS ${LANG_FRENCH} "Ajoute un raccourci pour démarrer Diablo II avec ${NAME}." +LangString DESC_DESKTOP_SHORTCUTS ${LANG_GERMAN} "Fügt eine Verknüpfung auf dem Desktop mit dem Namen ${NAME} hinzu mit der Diablo II gestartet werden kann." LangString DESC_DESKTOP_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлык на рабочий стол для запуска Diablo II с ${NAME}." +LangString DESC_DESKTOP_SHORTCUTS ${LANG_TRADCHINESE} "在桌面新增捷徑以藉由 ${NAME} 執行 Diablo II。" LangString DESC_MENU_SHORTCUTS ${LANG_ENGLISH} "Add shortcuts in start menu." -LangString DESC_MENU_SHORTCUTS ${LANG_GERMAN} "Fügt Verknüpfungen im Startmenü hinzu." LangString DESC_MENU_SHORTCUTS ${LANG_FRENCH} "Ajoute des raccourcis dans le menu démarrer." +LangString DESC_MENU_SHORTCUTS ${LANG_GERMAN} "Fügt Verknüpfungen im Startmenü hinzu." LangString DESC_MENU_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлыки в главное меню." +LangString DESC_MENU_SHORTCUTS ${LANG_TRADCHINESE} "新增「開始」功能表捷徑" LangString DESC_UNINSTALLER ${LANG_ENGLISH} "Create a Windows uninstall program.$\nAdding registry keys in Windows." -LangString DESC_UNINSTALLER ${LANG_GERMAN} "Erzeugt ein Deinstallationsprogramm.$\nWindows Registrierungseinträge werden erstellt." LangString DESC_UNINSTALLER ${LANG_FRENCH} "Crée un programme Windows de désinstallation.$\nAjoute des clés de registres dans Windows." +LangString DESC_UNINSTALLER ${LANG_GERMAN} "Erzeugt ein Deinstallationsprogramm.$\nWindows Registrierungseinträge werden erstellt." LangString DESC_UNINSTALLER ${LANG_RUSSIAN} "Создать в Windows деинстллятор программы.$\nДобавляет ключи реестра в Windows." +LangString DESC_UNINSTALLER ${LANG_TRADCHINESE} "建立 Windows 解除安裝程式。$\n加入 Windows 登錄訊息。" LangString DESC_PATCH_FILE ${LANG_ENGLISH} "Patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme." +LangString DESC_PATCH_FILE ${LANG_FRENCH} "Patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI." LangString DESC_PATCH_FILE ${LANG_GERMAN} "Patcher um PlugY ohne PlugY.exe zu starten.$\nDie LiesMich-Datei MUSS vor Benutzung gelesen werden." -LangString DESC_PATCH_FILE ${LANG_FRENCH} "D2gfx.dll patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI." LangString DESC_PATCH_FILE ${LANG_RUSSIAN} "Применить патч для запуска PlugY без PlugY.exe. Подробнее смотреть в файле Readme." +LangString DESC_PATCH_FILE ${LANG_TRADCHINESE} "更改遊戲檔案以不藉由 PlugY.exe 而執行 PlugY。使用前,您「必須」閱讀「讀我檔案」。" LangString SECTION_NAME_CORE ${LANG_ENGLISH} "${NAME} (required)" -LangString SECTION_NAME_CORE ${LANG_GERMAN} "${NAME} (benötigt)" LangString SECTION_NAME_CORE ${LANG_FRENCH} "${NAME} (nécessaire)" +LangString SECTION_NAME_CORE ${LANG_GERMAN} "${NAME} (benötigt)" LangString SECTION_NAME_CORE ${LANG_RUSSIAN} "${NAME} (требуется)" +LangString SECTION_NAME_CORE ${LANG_TRADCHINESE} "${NAME} (必要)" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_ENGLISH} "Desktop Shortcut" -LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_GERMAN} "Desktopverknüpfung" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_FRENCH} "Raccourci sur le bureau" +LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_GERMAN} "Desktopverknüpfung" LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_RUSSIAN} "Ярлык на рабочем столе" +LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_TRADCHINESE} "桌面捷徑" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_ENGLISH} "Start menu Shortcuts" -LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_GERMAN} "Startmenüverknüpfungen" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_FRENCH} "Raccourcis dans le Menu démarrer" +LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_GERMAN} "Startmenüverknüpfungen" LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_RUSSIAN} "Ярлыки в в главном меню" +LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_TRADCHINESE} "「開始」功能表捷徑" LangString SECTION_NAME_UNINSTALLER ${LANG_ENGLISH} "Uninstaller (add keys registers)" -LangString SECTION_NAME_UNINSTALLER ${LANG_GERMAN} "Deinstallationsprogramm (Fügt Windows Registrierungseinträge hinzu)" LangString SECTION_NAME_UNINSTALLER ${LANG_FRENCH} "Dé-installeur (ajoute clés de registre)" -LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "Деинсталлятор (добавляет ключи реестра)" +LangString SECTION_NAME_UNINSTALLER ${LANG_GERMAN} "Deinstallationsprogramm (Fügt Windows Registrierungseinträge hinzu)" +LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "Деинсталлятор (добавляет ключи реестра)" +LangString SECTION_NAME_UNINSTALLER ${LANG_TRADCHINESE} "移除工具 (加入登錄訊息)" LangString SECTION_PATCH_FILE ${LANG_ENGLISH} "File Patcher (advanced user only)" +LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de fichier (utilisateur avancé uniquement)" LangString SECTION_PATCH_FILE ${LANG_GERMAN} "Datei Patcher (Für erfahrene Nutzer)" -LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de D2gfx.dll (utilisateur avancé uniquement)" LangString SECTION_PATCH_FILE ${LANG_RUSSIAN} "Патч для Patcher (для опытных пользователей)" +LangString SECTION_PATCH_FILE ${LANG_TRADCHINESE} "檔案級補釘 (限高級用戶)" LangString README_FILENAME ${LANG_ENGLISH} "PlugY_The_Survival_Kit_-_Readme.txt" -LangString README_FILENAME ${LANG_GERMAN} "PlugY_The_Survival_Kit_-_Liesmich.txt" LangString README_FILENAME ${LANG_FRENCH} "PlugY_The_Survival_Kit_-_LisezMoi.txt" +LangString README_FILENAME ${LANG_GERMAN} "PlugY_The_Survival_Kit_-_Liesmich.txt" LangString README_FILENAME ${LANG_RUSSIAN} "PlugY_The_Survival_Kit_-_Readme.txt" +LangString README_FILENAME ${LANG_TRADCHINESE} "PlugY_The_Survival_Kit_-_讀我檔案" LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_ENGLISH} "Error : Diablo II install directory not found.$\nPlease re-install your copy of Diablo II - Lord of Destruction." -LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_GERMAN} "Fehler : Diablo II Installationsverzeichnis nicht gefunden.$\nBitte installiere Diablo II - Lord of Destruction neu." LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_FRENCH} "Erreur : Le répertoire d'installation de Diablo II n'a pas été trouvé.$\nVeuillez ré-installer votre copie de Diablo II - Lord of Destruction." +LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_GERMAN} "Fehler : Diablo II Installationsverzeichnis nicht gefunden.$\nBitte installiere Diablo II - Lord of Destruction neu." LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_RUSSIAN} "Ошибка : каталог с установленной игрой Diablo II не найден.$\nПожалуйста переустановите вашу копию Diablo II - Lord of Destruction." +LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_TRADCHINESE} "錯誤: 找不到 Diablo II 安裝目錄$\n請重新安裝「暗黑破壞神II:毀滅之王」" Var D2Path ;-------------------------------- ; Initialisation Function .onInit - !define MUI_LANGDLL_WINDOWTITLE "${NAME} v${VERSION}" + !define MUI_LANGDLL_WINDOWTITLE "${NAME} ${VERSION}" !define MUI_LANGDLL_INFO "Select your language:" !insertmacro MUI_LANGDLL_DISPLAY !undef MUI_LANGDLL_WINDOWTITLE @@ -154,7 +169,8 @@ Section "!$(SECTION_NAME_CORE)" Core File "${D2FILES}\PlugY_The_Survival_Kit_-_Readme.txt" File "${D2FILES}\PlugY_The_Survival_Kit_-_LisezMoi.txt" File "${D2FILES}\PlugY_The_Survival_Kit_-_Liesmich.txt" - setOutPath "$D2Path\PlugY" + File "${D2FILES}\PlugY_The_Survival_Kit_-_讀我檔案.txt" + setOutPath "$INSTDIR\PlugY" File "${D2FILES}\PlugY\EmptyPage.dc6" File "${D2FILES}\PlugY\PlugYDefault.ini" File "${D2FILES}\PlugY\PlugYFixed.ini" @@ -204,7 +220,6 @@ Section $(SECTION_NAME_UNINSTALLER) Uninstaller SectionEnd Section $(SECTION_PATCH_FILE) PatchFile - SectionIn 1 SetOutPath $D2Path File "${D2FILES}\PatchD2File.exe" File "${D2FILES}\RestoreD2File.exe" @@ -233,6 +248,7 @@ Section "Uninstall" Uninstall Delete "$INSTDIR\PlugY_The_Survival_Kit_-_Readme.txt" Delete "$INSTDIR\PlugY_The_Survival_Kit_-_LisezMoi.txt" Delete "$INSTDIR\PlugY_The_Survival_Kit_-_Liesmich.txt" + Delete "$INSTDIR\PlugY_The_Survival_Kit_-_讀我檔案.txt" Delete "$D2Path\PlugY\EmptyPage.dc6" Delete "$D2Path\PlugY\PlugYDefault.ini" Delete "$D2Path\PlugY\PlugYFixed.ini" diff --git a/PlugYInstaller/PlugY/LocalizedStrings.ini b/PlugYInstaller/PlugY/LocalizedStrings.ini index 9be6ae017cce7238c49e314fac3d1d4479ac158f..5d62da39effd8454fcf7b6f6f64959930b634939 100644 GIT binary patch delta 10875 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 delta 10331 zcmbuFeQZ_b9mmgwE7a26wY9WxDel^#LSLX@5oNLzRD9_RrJ!S|NMCrh<)tlcd9xMK zsOeDnO=Zp@MxrQ;p~rz!x1b}s5yQ-8%;J^?He(hv3ohA0wA200^Yr_C&$-3LY=78$ z?&ti@ea`3i{GOL{{(hZkQEo95qk!C&JU`QXGb<*3=hm9eroY<0Tv9bfL*(k&V69yHTUhA1kK{^G&NKvNL5-$z|UPerBE5 z=55l{ZA#M!b&+J`CZxPP`?6W_^7st>uOgoEf@6r!j?al#>i1dktKxIxxO=J0&6mlg zbEXE(oVNy)M|ulh@>J>gDRiv!Le=n<*UU?fmx*QnOLY`}jmjwcnpIJJb#ULay-uy% zHCmHFb)2_GH05dba!F2s{AP0AxJQT=)I8iYe~+nQI>V2lovgt=>UNSmJF6Kd=X{Z=0 zTdvG@zc57jN(z@16_nX4hbsT`VCsCzGya=07KNe8Gm6~}ZJkjvvUV_ovvV(!bq#U< z*o-r=#IBYLS9Cw}cJubm*zU&1{g*5CG>6Bo$Ls!t@lYK&i9T^ln8uh(ob z2eM?|KB=#{Q4asGP}bDFV?GzpKNJK>QT<6tH6{JTf;xLu@4~q;|J_?A+HZN^YqkeZ zELvoL?1@E5nY_5)TwHwH-zC+U^sl--BPOXM7t8WH-q&9%lqE~f%DcBDWzC%@P2l3C z@0ri)25qhJGmSYT+0FgI#gbU|syX-3vbW6ViRFJbpKq-=Wj>Fud`sgm_7AQq)<*PT zV0EG1%KD^#O-r`Dr`4^W1)=`7H5T|UudR;x+3Tx=xT|DO+gWq^aQkW-U-)c>+`QqO zX?|(vcjd{4Gi2S&yq+7hj9PTG1~qz}cfEIu)^(W8)k>e8#_9&^KOA?Hw{S?@&AQA7 z3syJ|V`q@nMOLZdmLZgE51!kdr``1gazuZIEwvjg^0OCZzOd89hy|o$ECX zffNa(NFYT5DH2GLK#BxTP1m{RA;lm_kwA*XNXe+Kk{Zirv#4F1;4rvxJ3~ z>D*`ugh(Jn0wEFzkwA!~YN0DVGzK9CL5KuGBt}Rl07J|?_-=Q?^;U!K7VP!~y+r~! z63CH2js$WfkRx$&M35ta90}w|AZLh?8@BOTQNCH6;2pVDvwpE`Knsf|CpYbdW_ag~4 zgDZm=YJyM`gqk3(VENO|)7(_>)6~Re)C8d>h%ML$w{uoqsY9SOGSQGghy+3;5F&vP z3Hpu1EfYi#B7qPIgh;H=Yui6J>tAhmrkuKOz^;Y&e_=lJAERsBO8zZtLkR^dE z31mqiO9ELECrbob63CK3mc+`=e}KK$;oYVG`ypJ8BoHEj5DA1xAVdNo5;v_7L5KuG zBoHFOs58V&D|;W{6Gev>d-QRMgmQ?X90=t=Cj8X5AHGJF1s&FPCRJd z5=wSo!vEVt`a&~!qo`l>pgHMR{$PZCces3qzVkeil(vUY>PBdSEPv#Ezj9~3c{M2m zt25=0WJuqxe*~{8gYVBAl9=wC&Y55udm{Pa{R=T zS?)`aIe+0#G9B=D>|vw8b>OIw>)`C_kqU)=w+ojd!V&XN(&yl(Q`|BQX(duHF@ z3*o|NgMM5;)~|UkW)7t0xeH~}em;T(8>O{c^LItMB1+L6QHm~!Qglm{qH7%OG0mZW z95xhHAEoG~C`DIADY`34F$w}INA|yLQg;9I#jYfq^kr6?ZVOtpG^1}2hMr+g(yw7& z($6qAkuyEIRbYZ5r}PYSlzxVJNJ!29lN1wmKWoo5vm9L0Y z3<)wrf{c(L6C_9g3B*a<;3a}72@FXfMq-6NeV&VS>kuIl2$4XD1VSVbB7qQzTgQkX zL;@ia2$7()4Ka&!1kMtG^SctkVgrBW=&$sr?sKB!MCc6iJ{+0!5NR#U+|eG=?Ea0!0!il0cCJib_x;p^R?vU8ushortcut. (unless you install PlugY in Diablo II directory) -- Launch with the shorcut! - -Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe. - - -Si vous avez des problème pour éxécuter PlugY.exe alors utiliser PatchD2gfxDll.exe. (Ca arrive quelque fois avec Windows 2000) -- Aller dans le répertoire de Diablo II. -- Faîtes un une sauvegarde du fichier D2gfx.dll (dans le cas, où vous supprimiez PlugY avant de le restaurer). -- Lancer PatchD2gfxDll.exe (qui patchera D2gfx.dll pour lancer PlugY) -- Créer un raccourci de Diablo II.exe, entrer le répertoire du mod voulu dans "démarrer dans" de propriété->raccourci. (sauf si vous avez installé PlugY dans le répertoire de Diablo II) -- Lancer Diablo II! +------- D2File Patcher +Si vous avez des problème pour éxécuter PlugY.exe alors utiliser PatchD2File.exe. (Ca arrive quelque fois avec Windows 2000) +- Sauvegarder D2gfx.dll ou game.exe. +- Exécuter PatchD2File.exe qui modifie D2gfx.dll ou game.exe. +- Créer un raccourci de Diablo II.exe, entrer le répertoire du mod voulu dans "démarrer dans" de propriété->raccourci. +- Lancer le jeu avec le raccourci ! ******************** FAQ ****************** -=> Je ne troue pas le fichier PlugY.ini, où est-il ? -De kingpin (traduit de l'anglais): -Microsoft a dans Windows caché les extensions des fichiers connu. Ceci pour être -sûr que les nouveaux utilisateurs ne supprime pas ces fichiers par accidents. Vous -pouvez bien sûr le désactiver en ouvrant votre l'explorateur Windows, aller dans -outils->Options des dossiers->affichage, Décocher "Masquer les extensions des -fichiers dont le type est connu". Alors, vous verrez le fichier sûrement le fichier ini. +=> Je ne trouve pas le fichier PlugY.ini, où est-il ? +Dans l'explorateur Windows, aller dans outils->Options des dossiers->affichage. +Cocher "Afficher les fichiers et répertoires cachés" +Décocher "Masquer les extensions des fichiers dont le type est connu". +Le fichier PlugY.ini devrait être visible. => Comment jouer sur Battle.net avec PlugY installé ? -PlugY automatiquement désactive tous quand on va en fermé. -Mais il est recommandé de toujours retirer tous les programmes tiers quand on a va sur les royaumes. -Note: Quand bigStash est activé, vous devez redémarrer D2 pour jouer en solo/multi/ouvert après avoir jouer en fermé (et vice versa). -Astuce: Créer un raccourci et ajouter -skiptobnet à la fin du champ "cible" pour aller directement sur Battle.net. - +PlugY ne permet pas d'aller sur Battle.net. => Que faire si j'ai une erreur comme "Bad Generic File" au chargement d'un nouveau joueur ? Ceci peut apparaître quand vous avez de mauvais objets dans le fichier du coffre partagé. -Une cause possible est l'utilisation du même répertoire de sauvegarde pour des mods différents, -il suffit alors de changer ce répertoire dans PlugY.ini. - - -=> Je vois "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" dans D2YYMMDD.txt, que dois-je faire ? -Ceci est juste un avertissement sans conséquence sur le jeu, ne vous inquiéter pas. - - -=> J'ai un autre bug, que dois-je faire ? -1) Aller sur les forums de Phrozen-keep et Judgehype et lire les forums. - -2) Faîtes des recherche sur google, demander à des amis, etc. mais ne me demander pas, je n'ai plus le temps pour faire le support de PlugY. -Si un jour, j'ai assez de temps, (comme pour la version 8.00) je lirai les forums pour connaitre les problèmes les plus communs. +Une cause possible est l'utilisation du même répertoire de sauvegarde pour des mods différents. +Si c'est le cas, il suffit de changer ce répertoire dans PlugY.ini. +Vous pouvez aussi déplacer _LOD_SharedStashSave.sss et _LOD_HC_SharedStashSave.sss dans un autre répertoire. +=> IL y a "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" dans D2YYMMDD.txt, que dois-je faire ? +Ceci est juste un avertissement sans conséquence sur le jeu. ******** CONFIGURATION ******** -Configuration pour un mod précis: -- Copier PlugY.ini dans le répertoire du mod choisi (le répertoire d'où vous le lancez le mod, voir dans propriétés du raccourci). -- Dans la plupart dans cas changer le répertoire de sauvegarde. -- Ajouter toutes les dll supplémentaires dans PlugY.ini si besoin est. -- Finalement activer ou désactiver les options que vous souhaitez comme MultiPageStash, SharedStash, etc. -- Maintenant vous pouvez lancez le mod de manière classique. +Configuration pour un mod précis : +- Copier PlugY.ini, PlugY.exe et le répertoire PlugY dans le répertoire du mod choisi. +- Modifier le répertoire de sauvegarde dans plugY.ini. -D2Mod configuration: -Ajouter simplement le nom de la dll dans PlugY.ini, par exemple: "DllToLoad=D2Mod.dll" +D2Mod configuration : +Ajouter simplement le nom de la dll dans PlugY.ini, par exemple : "DllToLoad=D2Mod.dll" -Notes: +Attention : - Les objets dans le Cube sont toujours sauvegardés dans le personnage, si vous voulez les partager vous devez les retirer du cube. - -Attention: -- Ne pas éditer le fichier de configuration après avoir utilisé le mod. -- Dans des parties Multiplayers, vérifier qu'il y a la même configuration sur le serveur et les clients. -- Rappel: PlugY ne fonctionne pas sur les royaumes. +- Faite attention à la compatibilité si vous modifiez la configuration entre 2 parties. +- Dans des parties Multijoueurs, vérifier que tout le monde à la même configuration dans PlugY.ini. -Lire le readme pour les moddeurs. +Lire le fichier readme.txt pour plus d'information sur le modding. ******** COMMENTAIRES SUR LE FICHIER DE CONFIGURATION ******** -Toutes les valeurs par Défaut signifie que si on supprime cette ligne, PlugY utilise cette valeur. -Les valeurs dans PlugY.ini (inclus dans le zip) est un exemple de configuration, pas les valeurs par défaut. +La configuration dans PlugY.ini n'est pas la configuration par défaut. [LAUNCHING] Cette section contient les informations de PlugY.exe et ne fonctionne pas dans les fichiers PlugYDefault.ini et PlugYFixed.ini. @@ -469,70 +478,77 @@ Cette section contient les informations de PlugY.exe et ne fonctionne pas dans l Ajoute les paramètres transmis à LoD par sa ligne de commande. Les paramètres passé à PlugY.exe sont aussi transmis à LoD par sa ligne de commande. Par défaut aucun paramèters ne sont transmis. -Les paramètres les plus courant sont (sans les guillemets): +Les paramètres les plus courant sont (sans les guillemets) : "-w" lance la LoD en version fenêtrée. (Voir la section WINDOWED à la place) "-direct" utilise les fichiers du répertoire à la place des mpq. "-txt" recompile les fichiers .txt avant d'antrée dans une partie. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : Param= {-direct -txt -w: Ces 3 commandes sont passés à LoD par la ligne de commande} Sélectionne la dll à charger. Le répertoire courant est celui utilisé par D2 (comme modifier le champ "démarrer dans" d'un raccourci). Si auncune dll n'est spécifié, LoD est chargé sans PlugY. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : Library= {PlugY.dll: Charger PlugY.dll} [GENERAL] Active ou désactive PlugY -Les dll des champs "DllToLoad" ne sont plus chargés quand ActivePlugin=0. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Les dll des champs "DllToLoad" ne sont plus chargés quand ActivePlugin=0. +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActivePlugin=0 {0:Charge aucunes fonctions; 1:Plugin activé} Active ou désactive l'accès à BattleNet. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - DisableBattleNet=1 {0:accès à Battle.net activé; 1:accès à Battle.net désctivé} Enregistre le log dans le fichier "The PlugY.log" dans le répertoire courant. Cette fonction peut ralentir le jeu. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveLogFile=0 {0:Désactivé, aucune information n'est écrite pendant le jeu; 1:toujours activé} Charge les dll supplémentaires du mod pour les utiliser en même temps que PlugY. Séparer chaque dll par le caractère pipe (|) -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - DllToLoad= {(vide): rien à charger; D2extra.dll|myDll.dll: Charge D2extra.dll et myDll.dll} - DllToLoad2= {(vide): Même chose que DlltoLoad} Active les nouvelles commandes de PlugY. -/save: Sauvegarde la partie sans quitter (LoD 1.11 minimum). -/page 1: Affiche la page des stats de base (la page des stats doit être ouverte)(espace non obligatoire). -/page 2:Affiche la page des stats en plus (la page des stats doit être ouverte). -/page 3: Show resistance stats page Affiche la page des stats de resistances (la page des stats doit être ouverte)(espace non obligatoire). -/page 4: (bêta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte)(espace non obligatoire). -/lockmouse: Bloque le curseur de la souris dans la fenêtre. -/lock: Identique à /lockmouse. -/unlockmouse: Libère le curseur de la souris de la fenêtre. -/unlock: Identique à /unlockmouse. -/renamechar newname: Renomme la personnage et le sauvegarde. (Vous devez quittez la partie pour mettre à jour la page des stats). -/renamepage name: Renomme la page courante du coffre (MultiStash activé). -/setindex: La page courante devient un index (Les boutons d'index vont jusqu'au prochain index s'il en existe un) (MultiStash activé). -/setmainindex: La page courante devient un index principal (Les boutons d'index +shift vont jusqu'au prochain index s'il en existe un) (MultiStash activé). -/resetindex: Retire la page courante des index (MultiStash activé). -/insertpage: Insère une nouvelle page après la page courante (MultiStash activé). -/deletepage: Supprime la page courante si elle est vide (MultiStash activé). -/swap page: Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" (espace non obligatoire) (MultiStash activé). -/toggle page: Echanger le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel (espace non obligatoire) (MultiStash activé). -/dlm: Inverse le mode d'affichage: Toujours afficher les valeurs de vie et de mana. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes) -/dml: Identique à /dlm. -/dl: Inverse le mode d'affichage: Toujours afficher les valeurs de vie. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes) -/dm: Inverse le mode d'affichage: Toujours afficher les valeurs de mana. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes) -/listcube: (bêta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules actives du cube. (LoD 1.10 minimum). + /lockmouse : Bloque le curseur de la souris dans la fenêtre. + /lock : Identique à /lockmouse. + /unlockmouse : Libère le curseur de la souris de la fenêtre. + /unlock : Identique à /unlockmouse. + /renamepage name : Renomme la page courante du coffre (utiliser # pour le numéro de page). + /rp name : Renomme la page courante du coffre (utiliser # pour le numéro de page). + /setindex : La page courante devient un index. + /setmainindex : La page courante devient un index principal. + /resetindex : Retire la page courante des index. + /insertpage : Insère une nouvelle page après la page courante. + /ip : Insère une nouvelle page après la page courante. + /deletepage : Supprime la page courante si elle est vide. + /dp : Supprime la page courante si elle est vide. + /swappage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page". + /sp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page". + /togglepage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel. + /tp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel. + /dlm : Inverse le mode d'affichage: Toujours afficher les valeurs de vie et de mana. + /dml : Identique à /dlm. + /dl : Identique à /dlm. + /dm : Identique à /dlm. + /page 1 : Affiche la page des stats de base (la page des stats doit être ouverte). + /page 2 : Affiche la page des stats en plus (la page des stats doit être ouverte). + /page 3 : Affiche la page des stats de resistances (la page des stats doit être ouverte). + /page 4 : Affiche les palliers pour le joueur (la page des stats doit être ouverte). + /page 5 : Affiche les palliers pour le mercenaire (la page des stats doit être ouverte). + /page 6 : (beta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte). + /save : (beta) Sauvegarde la partie sans quitter. + /listcube : (beta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules du cube. + /renamechar newname : (beta) Renomme la personnage et le sauvegarde. - ActiveCommands=0 {0:Désactivé; 1:Activé} -Quitte D2, si PlugY if PlugY échoue lors de l'installation de toutes les fonctions. -Désactivez-le seulement si vous savez ce que vous faites. +Quitte D2, si PlugY échoue à installer toutes les fonctions. +Désactivez-le uniquement si vous savez ce que vous faites. - ActiveCheckMemory=1 {0:Désactivé; 1:Activé} Active les fonctions cachés ou non finis. (ne pas utiliser) @@ -567,11 +583,11 @@ Verrouiller le curseur da la souris dans la fenêtre en mode fenêtré. Change la langue du jeu. Vous devez avoir les fichiers de langue choisi. Toutes les versions de D2 et LOD contiennent les fichiers en anglais (sauf les voix). -Toutes les langues possibles: ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS +Toutes les langues possibles : ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS - ActiveChangeLanguage=0 {0:Désactivé; 1:Activé} - SelectedLanguage=ENG {FRA: Français sélectionné} -Pour les moddeurs qui veulent limités les languages accessibles etle language par défauts: +Pour les moddeurs qui veulent limités les languages accessibles etle language par défauts : - ActiveLanguageManagement=0 {0:Désactivé; 1:Activé} - DefaultLanguage=ENG {empty:Langue par défault de D2; FRA: Le français est la langue par défaut} - AvailableLanguages=ENG|FRA {ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS} @@ -580,17 +596,22 @@ Pour les moddeurs qui veulent limités les languages accessibles etle language p [SAVEPATH] Mettez dans cette variable le chemin d'accès des fichiers de sauvegarde. Vous pouvez aussi bien utiliser un chemin absolu ou relatif. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveSavePathChange=0 {0:Désactivé; 1=Activé, vous devez initialiser "SavePath"} - SavePath=Save\ {Save\MyMod\ ou D:\Save Games\diablo II\Current Mod\} +ACtive le backup des fichiers de sauvegardes avant la sauvegarde. +Les fichiers de backup sont sauvegardé dans un répertoire nommé "backup" dans le répertoire de sauvegarde. +- ActiveAutoBackup=0 {0:Désactivé; 1:Activé} +- MaxBackupPerCharacter=5 {5: Nombre de backup à conserver avant suppression; 0:Pas de purge des backups} + [MAIN SCREEN] Change le texte affiché dans le menu principal (premier menu) (à la place de "v 1.10") Les couleurs sont des entiers faisant référence aux couleurs définies de D2. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveVersionTextChange=0 {0:Désactivé; 1=Activé} -- VersionText= {Vide: Affiche la version courante de LoD avec la lettre de sous-version (1.11b, 1.09d) ; Nom du Mod:Texte avec une longueur maximale d'environ 23 caractères (ex: v 1.11b)} +- VersionText= {Vide: Affiche la version courante de LoD avec la lettre de sous-version (1.11b, 1.09d) ; Nom du Mod:Texte avec une longueur maximale d'environ 23 caractères (ex : v 1.11b)} - ColorOfVersionText=0 {0:blanc; 1:rouge; 4:or; etc.} - ActivePrintPlugYVersion=1 {0:Désactivé; 1=Activé) - ColorOfPlugYVersion=4 {0:blanc; 1:rouge; 4:or; etc.} @@ -600,54 +621,68 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi Ajuste le coffre pour avoir 10x10 cases. Quand bigStash est activé, vou devez redémarrer D2 pour jouer en solo/multi/ouvert après avoir jouer en fermé (et vice versa). Utilise PlugY\TradeStash.dc6 pour changer l'image de fond. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveBigStash=0 {0:Taille du coffre par défaut utilisé; 1:Activé, coffre utilise 10x10 cases} -Utilisez cette fonction pour partager et garder tous vos objets.:) -Il y a 2 coffres à pages multiples possibles: +Utilisez cette fonction pour partager et garder tous vos objets. :) +Il y a 2 coffres à pages multiples possibles : - un personnel accessible uniquement par le personnage; - un partagé entre tous vos personnages. Utilisez le bouton "Voir coffre..." pour changer de coffre. Utilisez les boutons fléchés (et le bouton shift) pour passer d'une page à l'autre. -Définition: La dernière page est la dernière page qui contient un objet. +Définition : La dernière page est la dernière page qui contient un objet. Ces coffres à pages multiples ne fonctionne pas avec des personnages Diablo II classiques ou sur les royaumes. Vous pouvez changez le nom du fichier partagé. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveMultiPageStash=0 {0:Désactivé; 1:Activé} - NbPagesPerIndex=10 {10: Les pages indexées sont 1,10,20,30,...,max} - NbPagesPerIndex2=100 {50: Les pages indexées (+shift) sont 1,50,100,150,...,max} - MaxPersonnalPages=0 {0:Nombre de pages personnelles illimitées; 1000: Maximum de 1000 pages personnelles} +- AutoRenameStashPage=0 {0:Désactivé; 1:Active le nommage automatique des pages de coffre.} +- PersonalNormalPageColor=0 {0:Couleur du nom des pages de coffre personnel sans index (voir * pour la liste des couleurs)} +- PersonalIndexPageColor=12 {0:Couleur du nom des pages de coffre personnel avec index (voir * pour la liste des couleurs)} +- PersonalMainIndexPageColor=9 {0:Couleur du nom des pages de coffre personnel principal (voir * pour la liste des couleurs)} +- SharedNormalPageColor=4 {0:Couleur du nom des pages de coffre partagé sans index (voir * pour la liste des couleurs)} +- SharedIndexPageColor=8 {0:Couleur du nom des pages de coffre partagé avec index (voir * pour la liste des couleurs) +- SharedMainIndexPageColor=1 {0:Couleur du nom des pages de coffre partagé principal (voir * pour la liste des couleurs)} + - ActiveSharedStash=0 {0:Désactivé; 1:Activé si ActiveMultiPageStash=1} +- ActiveSharedStashInMultiPlayer=0 {0:Désactivé; 1:Active le coffre partagé en multijoueur. A utiliser uniquement avec des répertoires de sauvegarde différent.} - OpenSharedStashOnLoading=0 {0:Désactivé; 1:Sélectionne le coffre partagée (au lieu du personnel) au chargement du perso} - SeparateHardcoreStash=1 {0:Même coffre partagé en HC et SC; 1:utilise 2 coffres différents} -- SharedStashFilename=SharedStashSave {xxx: Le nom du fichier sera _LOD_xxx.sss} +- SharedStashFilename=SharedStashSave {xxx : Le nom du fichier sera _LOD_xxx.sss} - displaySharedSetItemNameInGreen=1 {0:Désactivé; 1:Activé, Les noms des objets de sets dans le stash sont affichés en vert sur les autres objets de sets.} - MaxSharedPages=0 {0:Nombre de pages partagées illimitées; 5000: Maximum de 5000 pages partagées ) - ActiveSharedGold=1 {0:Désactivé; 1:Activé, utiliser les commands pour y ajouter ou retirer de l'or (voir Command section)} - PosXPreviousBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse} -Idem pour PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn. +Idem pour PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn, PosXStashNameField, PosYStashNameField, PosXStashGoldField, PosYStashGoldField. +- PosWPreviousBtn=32 {32: Largeur du boutton} +Idem pour PosHPreviousBtn, PosWNextBtn, PosHNextBtn, PosWSharedBtn, PosHSharedBtn, PosWPreviousIndexBtn, PosHPreviousIndexBtn, PosWNextIndexBtn, PosHNextIndexBtn, PosWPutGoldBtn, PosHPutGoldBtn, PosWTakeGoldBtn, PosHTakeGoldBtn, PosWStashNameField, PosHStashNameField, PosWStashGoldField, PosHStashGoldField. + [STATS POINTS] Utiles pour réparer des erreurs dans l'allocation de points de caractéristiques. -Par exemple 30 points d'énergie pour un barbare! +Par exemple 30 points d'énergie pour un barbare ! Sur la page des statistiques, appuyer sur la touche sélectionnée et cliquer sur le bouton "moins". Sélectionner une touche en changeant la valeur de KeyUsed (devriez choisi 17 ou 18) -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveStatsUnassignment=0 {0:Désactivé; 1:Activé, appuyer sur la touche sélectionnée en cliquant} - KeyUsed=18 {17:touche Contrôle sélectionnée; 18:touche Alt sélecttionnée} Utilisez la touche shift pour allouer/désallouer tous les points possibles en un click. Vous pouvez limiter le nombre de points alloué/désalloué. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveShiftCkickLimit=0 {0:Désactivé; 1:Activé} - LimitValueToShiftClick=5 (10: Alloue ou désalloue les points de stats 10 par 10} +- PosXUnassignSkillBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse.} +- PosYUnassignSkillBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse.} [STAT ON LEVEL UP] -ATTENTION: CHEAT, NE PAS UTILISER EN PARTIE NORMAL. +ATTENTION : CHEAT, NE PAS UTILISER EN PARTIE NORMAL. Change le nombre de points de Stats reçus lors d'un gain de niveau. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveStatPerLevelUp=0 {0:Désactivé; 1:Activé} - StatPerLevelUp=5 {0:aucun points gagnés; 11:onze points gagnés} @@ -655,9 +690,9 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi [SKILLS POINTS] Utiles pour réparer des erreurs dans l'allocation de points de skills. Cliquer sur le bouton de la page des skills pour désallouer tous les points de skills. -note: Prends le coût réel de chaque skills (qui peut être plus grand que 1 dans les mods). -Attention: Il y a peux de place où mettre se boutton sans bugs. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +note : Prends le coût réel de chaque skills (qui peut être plus grand que 1 dans les mods). +Attention : Il y a peux de place où mettre se boutton sans bugs. +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveSkillsUnassignment=0 {0:Désactivé; 1:Activé} - ActiveSkillsUnassignmentOneForOne=0 {0:Normal; 1:Force la déassignation 1 for 1 (pour mod spécifique).} - PosXUnassignSkillBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en X} @@ -665,9 +700,9 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi [SKILL ON LEVEL UP] -ATTENTION: CHEAT, NE PAS UTILISER EN PARTIE NORMAL. +ATTENTION : CHEAT, NE PAS UTILISER EN PARTIE NORMAL. Change le nombre de points de skills reçus lors d'un gain de niveau. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveSkillPerLevelUp=0 {0:Désactivé; 1:Activé} - SkillPerLevelUp=1 {0:aucun points gagnés; 3:trois points gagnés) @@ -679,7 +714,7 @@ Si le WorldEvent se déclenche et qu'on n'est pas dans une partie, on le perd. A partir du lancement de D2, le prochain WorldEvent peut s'enclencher entre quelques secondes et 41:40 heures après. Gardez en mémoire avant d'éditer ces variables que le World Event devrait toujours être rare. L'objet à vendre peut être changé, la valeur attendu est la même que les entrées du cube. -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveWorldEvent=0 {0:Désactivé; 1:Activé} - ShowCounterInAllDifficulty=0 {0:Affiche le message "SOJ vendu" seulement en mode enfer; 1:L'affiche dans tous les modes} - ItemsToSell=The Stone of Jordan {r01: rune EL; cap,rar,upg: N'importe quel Capuchon de mailles/Capuchon de guerre/shako rare} @@ -698,7 +733,7 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi Active la Uber Quest en local. Fonctionne uniquement en Hell. Vous devez cuber les 3 clés puis les 3 organs à Harrogath. -Note: Cette quête sera mise à jour plustard pour ressembler plus à celle des royaumes. +Note : Cette quête sera mise à jour plustard pour ressembler plus à celle des royaumes. ActiveUberQuest=0 {0:Disabled; 1:Enabled} @@ -716,10 +751,10 @@ Possibilité de ne pas afficher l'arrière plan des boutons (à utiliser si un m [EXTRA] Vous pouvez lancer plusieurs parties Diablo II sur un seul ordinateur. Par exemple, les moddeurs peuvent tester leurs mod avec des parties multijoueurs. -Attention: +Attention : Ne pas lancer des parties avec le même chemin de sauvegarde quand vous utiliser le coffre partagé. - Ne pas utiliser le même personnage en même temps bien sûr! -Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations: + Ne pas utiliser le même personnage en même temps bien sûr ! +Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations : - ActiveLaunchAnyNumberOfLOD=0 {0:Désactivé; 1:Activé} Régénère la carte à chaque nouvelle partie (comme en multijoueur). @@ -742,41 +777,60 @@ Affiche la valeur courante des caracs (sans les bonus magiques) quand la souris Active les mots runiques du ladder en dehors des royaumes. Ceci est fait par la mise à 0 de la colonne "server" du fichier runes.txt. -Donc n'utilisez pas cette colonne dans votre mod en même temps que cette fonction! +Donc n'utilisez pas cette colonne dans votre mod en même temps que cette fonction ! - ActiveLadderRunewords=0 {0:Désactivé; 1:Activé} -Active la capacit" d'ouvrir l portail vers le Cow Level dans la difficulté où le joueur à déjà tuer le Cow King. +Active la capacité d'ouvrir le portail vers le Cow Level dans la difficulté où le joueur à déjà tuer le Cow King. - ActiveCowPortalWhenCowKingWasKilled=0 {0:Désactivé; 1:Activé} +Empéche la fermeture du portail de Nihlathak. +- ActiveDoNotCloseNihlathakPortal=0 {0:Désactivé; 1:Activé} -Plus d'options dans de futures versions...:) +Déplace Deckar Cain à coté du portail d'Harrogath. +- MoveCainNearHarrogathWaypoint=0 {0:Désactivé; 1:Activé} -Mon mail à ynicolas@worldonline.fr. -Mais je ne fais plus le support de PlugY donc n'attendez pas de l'aide de ma part si vous avez des problèmes. A la place faites des recherches sur les forums. +* Liste des codes couleurs (Les codes de couleur supérieur à 12 sont noirs en 1.14d plein écran): +- Invisible: 6 +- Gris foncé: 5 +- Gris: 16 +- Gris clair: 15 +- Blanc: 0, +- Branc vif: 18 +- Or: 4 +- Jaune foncé: 7 +- Jaune: 9 +- Orange: 8 +- Vert très foncé: 10 +- Vert foncé: 12 +- Vert: 2 +- Bleu: 3 +- Violet: 11 +- Rouge: 1 +- Rouge vif: 19 -PS: Désolé pour les fôtes mais je n'ai pas envie de corriger ;) - ******** THANKS TO ******** -- Blizzard pour avoir fait Diablo II et Lord of Destruction. +- Blizzard pour avoir créé Diablo II et Lord of Destruction. - Kingpin, Afj666, Joel, SVR, Myrdinn pour leurs aides. - Pralinor pour son aide dans la convertion en 1.12. - L'Autour pour son aide dans la convertion en 1.13d. -- ChaosEnergY pour ses beta tests et sa traduction en allemand. +- Haxifix pour son aide dans la convertion en 1.14d. +- SnapChip pour l'IA des Uber dans Tristram. +- ChaosEnergY pour ses tests. - Char & Darque pour avoir corrigé mon anglais. - Shaitane, K&V, themastercaster, raspa et onyx pour leurs tests. - Golvmopp, Dark Spot in the Corner, Megalixir et Athara pour leurs aides. -- ItalianPlayer pour la traduction en italien. -- Tous les membres du Chat de ProzenKeep. -- PhrozenKeep pour tout ce qu'ils partagent pour nous (y-compris le mien ;) -- Traduction: - * Anglais: Yohann, Jurica. - * Français: Yohann - * Allemand: ChaosEnergy, TheMasterCaster. - * Italien: ItalianPlayer - * Espagnol: Acrerune - * Polonais: Serdel - * Russe: L'Autour +- Tous les membres du chat et des forums de ProzenKeep. +- L'équipe de PhrozenKeep. +- Traduction : + * Anglais : Yohann, Jurica. + * Français : Yohann + * Allemand : ChaosEnergy, TheMasterCaster, ChaosMarc. + * Italien : ItalianPlayer + * Espagnol : Acrerune + * Polonais : Serdel + * Russe : L'Autour + * Chinois: Nagahaku ;--------------------------------------------------------------------------------------; \ No newline at end of file diff --git a/PlugYInstaller/PlugY_The_Survival_Kit_-_Readme.txt b/PlugYInstaller/PlugY_The_Survival_Kit_-_Readme.txt index 1a84f29..65a77cd 100644 --- a/PlugYInstaller/PlugY_The_Survival_Kit_-_Readme.txt +++ b/PlugYInstaller/PlugY_The_Survival_Kit_-_Readme.txt @@ -4,21 +4,19 @@ ; ; ; by Yohann Nicolas ; ; ; -; version 12.00 ; +; version 14.00 ; ; ; ;--------------------------------------------------------------------------------------; -Official website: http://plugy.free.fr +Official website : http://plugy.free.fr You can make a donation if you want. ******** WARNING ******** - This plug-in works with LoD version 1.09 to 1.13d and 1.14d and mods based on. -- This plug-in doesn't work on realms Battle.net. -- All files may be changed since previous version, so uninstall any previous version. -- PlugY.ini has changed since previous version, use the one in this package. -- Don't forget to read the PlugY forum at: - http://d2mods.info/forum/viewforum.php?f=133 +- This plug-in doesn't work on Battle.net and others realms. +- All files have changed since previous version. Please don't use old files. +- LOD 1.14 change the save directory, so you must move PlugY save files manually. ******** FEATURES ******** @@ -26,73 +24,122 @@ Each features can be turn on/off via PlugY.ini (see "COMMENTS ON THE CONFIGURATI - Disable access to Battle.net. - Infinite storage space in the stash. - Shared storage space in the stash. -- Enabled the ladder only runewords out of realms. -- Local World Event and Uber Quest for singleplayer and multiplayer off-realm! +- Enable the ladder only runewords for singleplayer and TCP/IP game. +- World Event and Uber Quest for singleplayer and TCP/IP game. - Can open Cow Level Portal even when player have kill the Cow King in that difficulty. +- Prevent Nihlathak's portal from closing. +- Move Deckar Cain near the waypoint in Harrogath. - Unassign assigned skills and stats points. +- Auto backup save files before saving. - Change the selected language. - Always regenerate maps in SinglePlayer like in MultiPlayer. - Automatically execute /players X when you launch a new game. -- Added some pages for display more characters stats like %MF. +- Added some pages for display more characters stats. - Display item level in its popup. - Launch any number of Diablo II games on the same computer. - Increase the stash to 10x10 squares. - Change the save path directory. - Always display Mana and Life values above the globes. - D2 can load all files, even those opened with Microsoft Excel (disabled by default). -- Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances. -- Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder). -- Add following commands (see "COMMENTS ON THE CONFIGURATION FILE"): - /save: Save game without exit. - /page 1: Show normal stats page (stats page must be opened). - /page 2: Show extra stats page (stats page must be opened). - /page 3: Show resistance stats page (stats page must be opened). - /page 4: (beta) Show available runewords (stats page must be opened). - /lockmouse: Lock mouse cursor in the window. - /lock: Same as /lockmouse. - /unlockmouse: Unlock mouse cursor in the window. - /unlock: Same as /unlockmouse. - /renamechar newname: Rename your character and save it. - /renamepage name: Rename current page stash. - /setindex: Set current stash page as index. - /setmainindex: Set current stash page as main index. - /resetindex: Remove index flag on the current stash page. - /insertpage: Insert a new page after the current page. - /deletepage: Delete current page if empty. - /swap page: Swap the content of current stash page with the content of another page. - /toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal. - /dlm: Toggle always display mana and life mode. - /dml: Same as /dlm. - /dl: Toggle always display life mode. - /dm: Toggle always display mana mode. - /listcube: (beta) Create a "cube.txt" file in save directory containing all cube's receipts. +- Display the current stats value (without magical bonus). +- Can launch game in windowed mode. +- Add following commands (see "COMMENTS ON THE CONFIGURATION FILE") : + /lockmouse : Lock mouse cursor in the window. + /lock : Same as /lockmouse. + /unlockmouse : Unlock mouse cursor in the window. + /unlock : Same as /unlockmouse. + /renamepage name : Rename current page stash (use # for page number). + /rp name : See /renamepage. + /setindex : Set current stash page as index. + /setmainindex : Set current stash page as main index. + /resetindex : Remove index flag on the current stash page. + /insertpage : Insert a new page after the current page. + /ip : See /insertpage. + /deletepage : Delete current page if empty. + /dp : See /deletepage. + /swappage page : Swap the content of current stash page with the content of another page. + /sp page : See /swappage. + /togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. + /tp page : See /togglepage. + /dlm : Toggle always display mana and life mode. + /dml : See /dlm. + /dl : See /dlm. + /dm : See /dlm. + /page 1 : Show normal stats page (stats page must be opened). + /page 2 : Show extra stats page (stats page must be opened). + /page 3 : Show resistance stats page (stats page must be opened). + /page 4 : Show player breakpoints (stats page must be opened). + /page 5 : Show mercenaries breakpoints (stats page must be opened). + /page 6 : (beta) Show available runewords (stats page must be opened). + /save : (beta) Save game without exit. + /listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts. + /renamechar newname : (beta) Rename your character and save it. -v12.00 changes: -- Compatibily with 1.14d (thanks to haxifix) +v14.00 changes : +- Add compatibility with LOD 1.14d. (Thanks to Haxifix) +- Add auto backup save files before saving. +- Prevent Nihlathak's portal from closing. +- Move Deckar Cain near the waypoint in Harrogath. +- Change UberDiablo, UberBaal and UberMephisto starting positions in Uber Tristram. +- UberDiablo, UberBaal and UberMephisto can spawn monsters (Need LOD 1.13c or higher). (Thanks to SnapChip) +- Update UberDiablo, UberBaal and UberMephisto AI (Need LOD 1.13c or higher). (Thanks to SnapChip) +- Add player and mercenaries breakpoints in stats page 4 and 5. +- Disable shared stash in multiplayer by default. +- Change stash page color dependings of indexes flags. +- Increase the maximum length of stash page name from 15 to 20 characters. +- Enable automatic stash page naming. +- Click on page stash name to change index type. +- Shift + click on page stash name to rename it. +- Rename /swap command to /swappage. +- Rename /toggle command to /togglepage. +- Add /rp command as shortcut for /renamepage. +- Add /ip command as shortcut for /insertpage. +- Add /dp command as shortcut for /deletepage. +- Add /sp command as shortcut for /swappage. +- Add /tp command as shortcut for /togglepage. +- The relative folder for SavePath is now the D2 save folder instead of D2 install path. +- Now, the PlugY folder must be in the same directory as PlugY.ini (so in the mod folder). +- Optimize PlugY time loading and infinite stash time loading. +- Fix minimum SOJ sold value for the World Event. +- Fix crash of /swappage command when the target page wasn't created. +- Fix possible crash with stash name allocation. (Thanks to SnapChip) +- Fix NBPlayersByDefault when MultiStash was disabled. +- Fix crash when SkillsUnassignment, StatsUnassignment, NewStatsInterface, BigStash and MultiPageStash was disabled. +- Fix ActiveSkillsUnassignmentOneForOne Feature (option for mods). +- Fix crash in Polish version language. +- Fix the /players anormal message au startup. +- Fix the abnormal message that sometimes appears when starting a game with the NBPlayersByDefault option. +- Fix compatibility issue between NBPlayersByDefault option and D2MultiRes mod. +- More stash buttons parameters in PlugY (option for mods). +- Update Chinese transalation. (Thanks to Nagahaku) +- Fix some translations in different languages. -v11.02 changes: -- Add command /setmainindex: Set the current stash page as main index (shift + prev/next index button go to an main index if exists) +v12.00 changes : +- Unofficial version supporting LOD 1.14d + +v11.02 changes : +- Add command /setmainindex : Set the current stash page as main index (shift + prev/next index button go to an main index if exists) - Current number of simulated players use with /players command is save with the player and set on game loading. NBPlayersByDefault must be different to 0 in PlugY.ini. -v11.01 changes: +v11.01 changes : - Compatibily with 1.13d (thanks to L'Autour) -- Add command /unlockmouse: Unlock the mouse -- Add command /unlock: same as /unlockmouse -- Add command /renamepage: stash page name are succefully saved. -- Add command /setindex: Set the current stash page as index (prev/next index button go to an index if exists) -- Add command /resetindex: Remove index flag on the current stash page (prev/next index button go to this index if exists). -- Add command /insertpage: Insert a new page after the current page. -- Add command /deletepage: Delete current page if empty. +- Add command /unlockmouse : Unlock the mouse +- Add command /unlock : same as /unlockmouse +- Add command /renamepage : stash page name are succefully saved. +- Add command /setindex : Set the current stash page as index (prev/next index button go to an index if exists) +- Add command /resetindex : Remove index flag on the current stash page (prev/next index button go to this index if exists). +- Add command /insertpage : Insert a new page after the current page. +- Add command /deletepage : Delete current page if empty. - Add localizion in Russian and google traduction for not translated language. (thanks to L'Autour) - Add an option in PlugY.ini to select shared stash (instead of personal one) on character loading. - Rename command /rename to /renamechar. - Remove unfinished command /reload. -v11.00 changes: +v11.00 changes : - Unofficial version supporting LOD 1.13d -v10.01 changes: +v10.01 changes : - Add windowed mode. - Can lock mouse cursor in the window (windowed mode). - Can remove border (windowed mode). @@ -103,31 +150,31 @@ v10.01 changes: - Add command "/toggle page" to swap the content of current stash page with the content of another page in opposing stash shared/personal. - Add command "/rename newname" to rename your character. This feature is still in beta and you must exit the game to update the stats page. -v10.00 changes: +v10.00 changes : - Disable access to Battle.net via main menu button. - PlugY works for 1.13c version of LoD too. - Fix shortcut in start menu -v9.00 changes: +v9.00 changes : - PlugY works for 1.12 version of LoD too. - Fix somes bugs. - Add option for unassign skill for mods. -v8.00 changes: -- Easier installation: New installer. +v8.00 changes : +- Easier installation : New installer. - Can open Cow Level Portal even when player have kill the Cow King in that difficulty. - Display the real version of LoD in the main screen. (v 1.09d or v 1.11b instead of v 1.09 or v 1.11) - Add the possibility to move the unassign skills button like stash buttons. (for modders) - Fix crash when meeting a superunique monsters in Lod v1.11. - Fix skills points lost when unasssign them in mods with special skills. -- Multiplayer: Save stash files (with client's data like version before 5.00) when a deconnection or error happend during saving process. +- Multiplayer : Save stash files (with client's data like version before 5.00) when a deconnection or error happend during saving process. - Remove the "check load memory failed" message when D2gfx.dll was patched. -v7.01b changes: +v7.01b changes : - Fix the ladder only runewords features in versions 1.11 and 1.10 of LoD. - Fix wierd characters in some text. -v7.01 changes: +v7.01 changes : - Enabled the ladder only runewords out of realms. - Fixed Uber Baal AI. - Remove all param options set by default in PlugY.ini (like windowed mode). @@ -135,7 +182,7 @@ v7.01 changes: - Add an executable to launch PlugY (no more LoD's files modified) (RECALL) - Translation into spanish and polish. -v7.00 changes: +v7.00 changes : - PlugY works for 1.11b version of LoD too. - Add an executable to launch PlugY (no more LoD's files modified) - Add base value for each stat on assign buttons overtext. @@ -143,75 +190,75 @@ v7.00 changes: - Fix features which stayed enabled on Battle.net. - Translation into italian. -v6.01b changes: +v6.01b changes : - Bug fix with the display of popup on stat assignment buttons. -v6.01 changes: -- Major fix: unique carry1 items don't disappear when they are cubbed in LoD 1.10 +v6.01 changes : +- Major fix : unique carry1 items don't disappear when they are cubbed in LoD 1.10 - Keys and Uber organs aren't destroyed when we try to open a Red Porpal out of Harrogath. - Fix conflict with D2Mod for the version display. -v6.00 changes: -- PlugY works for 1.11 version of LoD too! +v6.00 changes : +- PlugY works for 1.11 version of LoD too ! - Enabled Uber Quest off realm (LoD 1.11 only). - Fixed crash on PlugY launch if LoD install isn't clean - Fixed some minor bugs and added some minor improvements. - Added command "/save" to save the game without exit (LoD 1.11 only). -v5.06 changes: +v5.06 changes : - Added buttons for shared gold. - Enabled shared gold in multiplayer. - Command "/DisplayLifeMana" is replaced by "/dlm". - Fixed some bugs. -v5.05 changes: +v5.05 changes : - Fixed bad default color in interface stats. - Added Shared gold via commands. - Command "/DisplayLifeAndMana" is now "/DisplayLifeMana". - Display green set item name in popup when it's in the shared stash. - Fixed multiplayer bugs by redoing multiplayer procedure. -v5.04 changes: -- Fixed: Stat/Skill points per level-up bug. -- Fixed: Multiplayer bugs. +v5.04 changes : +- Fixed : Stat/Skill points per level-up bug. +- Fixed : Multiplayer bugs. - PlugY/PlugYDefault.ini completed. -v5.03 changes: -- Fixed: Bug which sometimes swaps Hardcore and Softcore shared stash. +v5.03 changes : +- Fixed : Bug which sometimes swaps Hardcore and Softcore shared stash. - Added color on extra stats page. - Changed default values on extra stats page. - Set EnabledTXTFilesWhenMSExcelOpenIt=1 in PlugY.ini file. -v5.02 changes: -- Fixed: Previous bug fix which caused items to disappear. +v5.02 changes : +- Fixed : Previous bug fix which caused items to disappear. -v5.01 changes: -- Fixed: Major bugs in stash management. -- Fixed: Set back PlugY.ini with ActiveLogFile=0 by default. -- Fixed: bug when shared stash is disabled. +v5.01 changes : +- Fixed : Major bugs in stash management. +- Fixed : Set back PlugY.ini with ActiveLogFile=0 by default. +- Fixed : bug when shared stash is disabled. -v5.00 changes: -- PlugY works for 1.09, 1.09b, 1.09d versions of LoD, including mods based on these releases! +v5.00 changes : +- PlugY works for 1.09, 1.09b, 1.09d versions of LoD, including mods based on these releases ! - PlugY can load D2Mod.dll. - D2 can load all files, even those openned with Microsoft Excel. - World Event monster can be changed. - Some stuff for modders. -- Fixed: major bugs in Multiplayer: fingerprints reset, unidentified bugged items, etc. -- Fixed: Typo error in PlugY.ini (Commands). -- Fixed: No more case sensitive commands in game. -- Fixed: Select Main Stat page bug on opening -- Fixed: Replaced the display "Critical Strike/Deadly Strike" with Deadly Strike only. -- Fixed: The spawn of DiabloClone at starting of a new game -- Fixed: Some other small bugs. +- Fixed : major bugs in Multiplayer : fingerprints reset, unidentified bugged items, etc. +- Fixed : Typo error in PlugY.ini (Commands). +- Fixed : No more case sensitive commands in game. +- Fixed : Select Main Stat page bug on opening +- Fixed : Replaced the display "Critical Strike/Deadly Strike" with Deadly Strike only. +- Fixed : The spawn of DiabloClone at starting of a new game +- Fixed : Some other small bugs. -v4.04 changes: -- Fixed: Display bug when statPerLevelUp enabled. -- Fixed: Bug in saving procedure when the disk is full. +v4.04 changes : +- Fixed : Display bug when statPerLevelUp enabled. +- Fixed : Bug in saving procedure when the disk is full. - New configuration system for modders. - Always display Mana and Life values above the globes. -v4.03 changes: -- Fixed: "carry 1" unique item (unique charm) when we drop the cube. +v4.03 changes : +- Fixed : "carry 1" unique item (unique charm) when we drop the cube. - Can go directly to first or last page of stash (shift + click on next/previous). - Second index added (shift + click on index buttons) - Added data to extra stats pages (2 pages now). @@ -219,25 +266,25 @@ v4.03 changes: - Moved buttons in extra stats pages to same place as in main stats page (only in 800x600). - Can choose whether the main (first) page or the last selected page is displayed on opening the stats page. -v4.02b changes: -- Fixed: Features stay enabled in open Battle.net +v4.02b changes : +- Fixed : Features stay enabled in open Battle.net -v4.02 changes: -- Fixed: No more conflict with Battle.net (BigStash disabled on realms) -- Fixed: Missing "d" in "SeparateHardcoreStash=1" from PlugY.ini -- Fixed: By default in PlugY.ini, the language isn't changed. -- Fixed: Item level display enabled correctly for all configurations of PlugY. +v4.02 changes : +- Fixed : No more conflict with Battle.net (BigStash disabled on realms) +- Fixed : Missing "d" in "SeparateHardcoreStash=1" from PlugY.ini +- Fixed : By default in PlugY.ini, the language isn't changed. +- Fixed : Item level display enabled correctly for all configurations of PlugY. - Added data in the extra stats page. -v4.01 changes: -- Fixed: NbPlayers always set to 8 when active. +v4.01 changes : +- Fixed : NbPlayers always set to 8 when active. - Added data in the extra stats page. -v4.00b changes: -- Fixed: MSVCR70.dll not found bug. +v4.00b changes : +- Fixed : MSVCR70.dll not found bug. -v4.00 changes: +v4.00 changes : - Better optimization of the code. - Added some pages for displaying more characters stats like %MF. - Change the selected language (and for mod, default and available language). @@ -248,62 +295,62 @@ v4.00 changes: - Change installation method (can be installed directly on linux now) - The item which triggers the World Event can be changed. - Any number of "carry 1 item" (like annihilus) can be put in the stash. -- Fixed: Cannot put more than one "carry 1 item" in others page than stash. -- Fixed: display bug of socketed items in the stash. -- Fixed: removed space bug in PlugY.ini. -- Fixed: Diablo Clone can't spawn in normal and nightmare difficulty. -- Fixed: Destruction of extra minions after unassignment if you have +x bonus to the skill. +- Fixed : Cannot put more than one "carry 1 item" in others page than stash. +- Fixed : display bug of socketed items in the stash. +- Fixed : removed space bug in PlugY.ini. +- Fixed : Diablo Clone can't spawn in normal and nightmare difficulty. +- Fixed : Destruction of extra minions after unassignment if you have +x bonus to the skill. -v3.02 changes: -- Fixed: Change the number of stats points gained when player gains a level. -- Fixed: When the shared stash is disabled, you can load a game with your character. -- Fixed: You can change parameters of World Event without activating skill per level up. +v3.02 changes : +- Fixed : Change the number of stats points gained when player gains a level. +- Fixed : When the shared stash is disabled, you can load a game with your character. +- Fixed : You can change parameters of World Event without activating skill per level up. -v3.01 changes: +v3.01 changes : - Change the number of stats points gained when player gains a level. - Fixed bugs which give extra points when skills points are unassigned. - Added parameters for the WorldEvent in configuration file. - By default, World Event only SHOWS "X SOJ Sold" in hell difficulty. -v3.00 changes: -- Local World Event for singleplayer and multiplayer off-realm! +v3.00 changes : +- Local World Event for singleplayer and multiplayer off-realm ! - Unassign assigned skills points. - New background for the stash. - Can change the filename of the shared savefile. - Shared stash page number display are in red now. -v2.05 changes: -- major fix: bugs which cause D2 not to start are finally removed. +v2.05 changes : +- major fix : bugs which cause D2 not to start are finally removed. -v2.04 changes: +v2.04 changes : - Unassign stats points, skills on level up are disabled when you connect to realm (like stash). - Open a error message box instead of crash when PlugY.dll isn't found by D2. - Fixed some bugs in installation method. - Fixed bug display of buttons. - Fixed win95/98/Me saving. -v2.03b changes: +v2.03b changes : - Show PlugY version only in main screen. -v2.03 changes: -- Major fix: Correct and secure the saving procedure. +v2.03 changes : +- Major fix : Correct and secure the saving procedure. - No more crash of the host game when a character is unable to enter the game. - Unassign stats points button greyed when base stat is above 255 fixed. - Change version printing on main screen (change color & PlugY version in right corner) - Character without PlugY can join game host with PlugY enabled. -v2.02 changes: +v2.02 changes : - PlugY doesn't use D2win.dll to launch PlugY anymore. - PlugY includes a patcher/unpatcher for editing D2gfx.dll to launch PlugY. - PlugY can be launched by D2Mod system of SVR. - The infinite storage sytem is automatically disabled on a realm game. - Fixed index button bugs. -v2.01 changes: +v2.01 changes : - Fixed skill per level up bug - Fixed bug display of text in the main menu -v2.00 changes: +v2.00 changes : - Localized in German. - Change the number of Skills points gained when player gains a level. - Launch any number of Diablo II game on the same computers. @@ -317,22 +364,22 @@ v2.00 changes: - Removed page number bug when you switch between characters. - Removed set item's bug display. - Removed the bug of "carry 1" -- Add other small improvements...:) +- Add other small improvements... :) -v1.03 changes: +v1.03 changes : - Added French readme and ini files. - Removed bugs in D2Classic game (there is no multipage, it's not a bug) - Removed the bug when loading character from previous version. (like ShadowMaster character or 1.09 or D2Classic character) - Removed the bugged line in the text when you click on delete character. -* must read: You can start any mods without moving SAVES files +* must read : You can start any mods without moving SAVES files (you need to move dll files with classic script). -v1.02 changes: +v1.02 changes : - Re-changed name files due to an IE bug with colon in zip file. - Ability to change the version text print in the main menu (see ini file). -v1.01 changes: +v1.01 changes : - Localized for french version (wait for an french readme.txt) - Changed filename from "PlugY, The Survival Kit.ini" to "PlugY,The_Survival_Kit". - Added example for installation in the readme. @@ -341,21 +388,22 @@ v1.01 changes: (you can add it if you want but need to know what are you doing...) - Released in .zip file instead of .rar -v1.00 features (can all be easily enabled or disabled): +v1.00 features (can all be easily enabled or disabled) : - You can change the save path directory. - You can start any mods without moving saves files. - You can increase the stash to 10x10 squares. -- Up to 4,294,967,296 pages in the stash (e.g. infinite storage space)! - note: for LOD1.10 character only. +- Up to 4,294,967,296 pages in the stash (e.g. infinite storage space) ! + note : for LOD1.10 character only. - Any of these pages can be shared by all of your characters! ******** CONTENTS ******** -19 files, 1 folder: +20 files, 1 folder : - PlugY_The_Survival_Kit_-_Readme.txt - PlugY_The_Survival_Kit_-_LisezMoi.txt - PlugY_The_Survival_Kit_-_Liesmich.txt +- PlugY_The_Survival_Kit_-_讀我檔案.txt - PlugY.exe - PlugY.dll (in Diablo II directory) - PlugY.ini @@ -370,30 +418,28 @@ v1.00 features (can all be easily enabled or disabled): - PlugY\UnassignSkillsBtns.dc6 - PlugY\UnassignStatsBtns.dc6 - PlugY\statsinterface.txt -- PlugY Uninstaller.exe (with uninstaller option) -- PatchD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option) -- RestoreD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option) +- PatchD2File.exe (in Diablo II directory with PatchFile option) +- RestoreD2File.exe (in Diablo II directory with PatchFile option) ******** INSTALLATION ******** -Normal Installation: +Normal Installation : - Follow directive installer. -note: You can choice "Diablo II" directory as install directory. +note : You can choice "Diablo II" directory as install directory. Installation in another mod: - Copy PlugY.ini, PlugY.exe and PlugY folder (+its contents) in the targeted mod folder. - Edit PlugY.ini to configure some features (see section below). -- Run PlugY.exe and enjoy:) +- Run PlugY.exe. -note: you can move the "PlugY" folder in "Diablo II" and it will be see by all PlugY installation. -Example: -You have installed Lord of Destruction here: C:\Games\Diablo II\ -And the mod to add this plug-in is here: D:\D2Mod\MyMod\ -And the second mod to add this plug-in is here: D:\D2Mod\MyMod2\ -So the new installation is: +Example : +You have installed Lord of Destruction in : C:\Games\Diablo II\ +And the target mod is in : D:\D2Mod\MyMod\ +And the second mod is in : D:\D2Mod\MyMod2\ +So the new installation is : C:\Games\Diablo II\PlugY.dll D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6 D:\D2Mod\MyMod\PlugY\PlugYFixed.ini @@ -425,146 +471,105 @@ So the new installation is: D:\D2Mod\MyMod2\PlugY.exe -Uninstallation: Use the uninstaller or if you have check this option, simply remove all PlugY files! -Note: You can also move PlugY.dll in the mod folder but you must remove any on in D2 folder. -Note: PlugY directory and its contents can be put in a mpq. +Uninstallation : Use the uninstaller or simply remove all PlugY files. +Note : You can also move PlugY.dll in the mod folder but you must remove any on in D2 folder. +Note : PlugY directory and its contents can be put in a mpq. -------- D2gfx Patcher: - -If you have problem when you run PlugY.exe then use PatchD2gfxDll.exe. (It happend sometimes with Windows 2000) -- Go in Diablo II directory. -- Do a backup of D2gfx.dll (in the case, you remove PlugY before restore it) -- Run PatchD2gfxDll.exe (which patches D2gfx.dll for launch PlugY) -- Create a shortcut: Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory) -- Launch with the shorcut! - -Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe. +------- D2File Patcher +If you have problem when you run PlugY.exe then use PatchD2File.exe. (It happend sometimes with Windows 2000) +- Do a backup of D2gfx.dll or game.exe. +- Run PatchD2File.exe which modify D2gfx.dll or Game.exe. +- Create a shortcut : Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory) +- Launch with the shorcut ! ******************** FAQ ****************** -=> I can't find the PlugY.ini file, where is it ? ->From kingpin: -Microsoft has in their OS hidden known extensions. This is to make sure newbie -users do not delete those files by accident. You can, of course, turn this off by -opening up your Windows Explorer, selecting Tools->Folder Options. Then choose View and -mark "Show Hidden files and Folders". Unmark "Hide extensions for know file types". +=> I can't find PlugY.ini file, where is it ? +In Windows Explorer, selecting Tools->Folder Options->View. +Mark "Show Hidden files and Folders". +Unmark "Hide extensions for know file types". Then you will for sure see the ini file. => How do I Play sometimes on Battle.net when PlugY is installed ? -PlugY automatically disables features on realm. -But it's always recommended to disable any third software when you go on realm. -Note: When bigStash is enabled, you must restart D2 for play in single/multi/open after playing in closed Bnet (and vice versa). -Tips: Make a shorcut and add -skiptobnet at the of the "target" field for directly go to Battle.net. - +PlugY disable the connection to Battle.net. => What do I do if I have an error like "Bad Generic File" on loading a new Character ? This can appear when you have bad item in the shared stash file. -A possible cause is to use same save folder for different mod, in this case just change the save folder in PlugY.ini. +A possible cause is to use same save folder for different mod. +In this case, just change the save folder in PlugY.ini. You can also move the _LOD_SharedStashSave.sss and _LOD_HC_SharedStashSave.sss to another directory. - => I get "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" in D2YYMMDD.txt, what I should do ? -It's just a warning, don't worry about it, it causes no problem in game. - - -=> I have another bug, what should I do ? -1) Read my thread and post a question eventually in PhrozenKeep member annoucement forum. - -2) Search on google, ask to your friend, etc but don't ask me, I have no more time to support PlugY. -If one day, I got enough time (like for the version 8.00) I will check forums to get the more commons problems. - -Thx +It's just a warning, it causes no problem in game. ******** CONFIGURATION ******** -Configuration of this kit for a specified mod: -- Copy the PlugY.ini and PlugY.exe in the target mod directory (the directory where you start it, see it in the properties of the shortcut). -- In most cases, you will change the save directory in the ini file. -- Add all extra dll of the mod in PlugY.ini, if any. -- Finally, activate any specific features you want such as MultiPageStash, SharedStash, etc. -- Now, you can start the target mod using the classic method. +Configuration of this kit for a specified mod : +- Copy PlugY.ini, PlugY.exe and PlugY folder in the target mod directory. +- Change the save directory in PlugY.ini. -D2Mod configuration: -Just add the dll name in PlugY.ini, for example: "DllToLoad=D2Mod.dll" +D2Mod configuration : +Just add the dll name in PlugY.ini, for example : "DllToLoad=D2Mod.dll" -Note: -- Items in the Cube are always saved on the player, if you want these items shared, you must remove them from the Cube. - -Warning: -- Be careful if you want to edit the configurations files after having played with the mod. -- In multiplayer game, verify that the server has the same configuration. -- Remember: PlugY doesn't support realms. +Warning : +- Items stored in the Cube are always saved on the player, if you want to shared them, you must remove them from the Cube. +- Be careful about compatibility if you edit PlugY.inin between 2 games. +- In multiplayer game, verify that all player have the same configurations in PlugY.ini. *** Configuration for modders *** -There are 3 files with same structure to configure PlugY: +There are 3 files with same structure to configure PlugY : - "PlugY/PlugYFixed.ini" in mpq or via the switch -direct -All fields set parameters which can't be changed by users via PlugY.ini. -Use it for enabling(disabling) wanted(unwanted) features. -Only few thing should be found here. +This file override parameters set by users in PlugY.ini. +Use it to enabled(disabled) wanted(unwanted) features. Warning 1: ActivePlugin=0 doesn't work here (but ActivePlugin=1 works) -Warning 2: SavePath management doesn't work here too. +Warning 2: SavePath management is ignore in this file. Warning 3: Don't abuse it, a lot of field should be set by users. (see note below) - "PlugY/PlugYDefault.ini" in mpq or via the switch -direct -Use it for changing default values of PlugY. +Use it to change default values of PlugY. Works like PlugY.ini in an mpq in version 4.03 and before. -All fields which aren't in PlugYFixed.ini (and are always readed) should be here. -Most fields should be put here. +All fields should be here. - "PlugY.ini" in current directory only. For users' configuration (like previous version). Fields which are in PlugYFixed.ini shouldn't be found here. -In most cases, this file is the same as PlugYDefault.ini but it can be edited by user. - -Notes: -Think about each features if you really must disable it. -- The savepath management doesn't work in Fixed.ini (it's users' choice where they want to put their save files) -- The unassignment of skills can really be useful way to learn all your custom skills. I have stopped playing some mods just because I don't know what skill will be useful at very high level. It's more fun to try all skills and do the choosing after that. So don't put it in Fixed.ini -- The World Event should be configured or disabled in Fixed.ini in each mod. -- The extra pages in stats interfaces shouldn't be put in Fixed.ini - -Modders can contact me, if they want help or more details about this system. - -WARNING: Don't forget, if it's misused, players will use old version of PlugY, and I will have no other choice than to disable it. - ******** COMMENTS ON THE CONFIGURATION FILE ******** -All Default values mean, if you remove the line, PlugY will use this value. -The values in PlugY.ini (included in the zip) are an example of configuration, not default values. +The configuration in PlugY.ini are not the default configuration. [LAUNCHING] This section store info for PlugY.exe and don't work in PlugYDefault.ini and PlugYFixed.ini files. Add params to transmit to LoD on his command line. Params give to PlugY.exe are also transmitted to LoD on his command line. -By default no param are trasmited. -Most common switch are (without quote): +By default no param are transited. +Most common switch are (without quote) : "-w" open LoD in windowed form. (See WINDOWED section instead) "-direct" use files in directory instead of those in mpq. "-txt" recompile txt files before launch a game. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : Param= {-direct -txt -w: these 3 commands are passed on the command line} Select the library to load. The current directory are the one used by D2 (like set the "start in" field of a shorcut). If no library specify, it load LoD without PlugY. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : Library= {PlugY.dll: Load PlugY.dll} [GENERAL] Enable or disable all selected features. Dlls from field "DllToLoad" aren't loaded anymore when ActivePlugin=0. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActivePlugin=0 {0:Don't load any features; 1:Plugin enabled} Enable or disable BattleNet Access. @@ -580,36 +585,43 @@ Separate each dll file name by the character pipe (|) - DllToLoad2= {(empty): Same as DlltoLoad} Activate some new commands in PlugY. In parenthesis is the condition to be able to use the command. -/save: Save game without exit (LoD 1.11 minimum). -/page 1: Show normal stats page (stats page must be opened, space not mandatory). -/page 2: Show extra stats page (stats page must be opened, space not mandatory). -/page 3: Show resistance stats page (stats page must be opened, space not mandatory). -/page 4: (beta) Show available runewords (stats page must be opened, space not mandatory). -/lockmouse: Lock mouse cursor in the window. -/lock: Same as /lockmouse. -/unlockmouse: Unlock mouse cursor in the window. -/unlock: Same as /unlockmouse. -/renamechar newname: Rename your character and save it. (You must exit the game to update the stats page.) -/renamepage name: Rename current page stash (MultiStash activated). -/setindex: Set current stash page as index (prev/next index button go to an index if exists) (MultiStash activated). -/setmainindex: Set current stash page as main index (shift + prev/next index button go to an main index if exists) (MultiStash activated). -/resetindex: Remove index flag on the current stash page (MultiStash activated). -/insertpage: Insert a new page after the current page (MultiStash activated). -/deletepage: Delete current page if empty (MultiStash activated). -/swap page: Swap the content of current stash page with the content of another page (space not mandatory) (MultiStash activated). -/toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal (space not mandatory) (MultiStash activated). -/dlm: Toggle always display mana and life mode. (Since 1.13c, you can click on the bottom of each orbs) -/dml: Same as /dlm. -/dl: Toggle always display life mode. (Since 1.13c, you can click on the bottom of the orb) -/dm: Toggle always display mana mode. (Since 1.13c, you can click on the bottom of the orb) -/listcube: (beta) Create a "cube.txt" file in current directory containing all cube's receipts (LoD 1.10 minimum). + /lockmouse : Lock mouse cursor in the window. + /lock : Same as /lockmouse. + /unlockmouse : Unlock mouse cursor in the window. + /unlock : Same as /unlockmouse. + /renamepage name : Rename current page stash (use # for page nuymber). + /rp name : Rename current page stash (use # for page nuymber). + /setindex : Set current stash page as index. + /setmainindex : Set current stash page as main index. + /resetindex : Remove index flag on the current stash page. + /insertpage : Insert a new page after the current page. + /ip : Insert a new page after the current page. + /deletepage : Delete current page if empty. + /dp : Delete current page if empty. + /swappage page : Swap the content of current stash page with the content of another page. + /sp page : Swap the content of current stash page with the content of another page. + /togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. + /tp page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. + /dlm : Toggle always display mana and life mode. + /dml : Same as /dlm. + /dl : Toggle always display life mode. + /dm : Toggle always display mana mode. + /page 1 : Show normal stats page (stats page must be opened). + /page 2 : Show extra stats page (stats page must be opened). + /page 3 : Show resistance stats page (stats page must be opened). + /page 4 : Show player breakpoints (stats page must be opened). + /page 5 : Show mercenaries breakpoints (stats page must be opened). + /page 6 : (beta) Show available runewords (stats page must be opened). + /save : (beta) Save game without exit. + /listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts. + /renamechar newname : (beta) Rename your character and save it. - ActiveCommands=0 {0:Disabled; 1:Enabled} -Quit D2, if PlugY failed to installed all features. +Quit D2, if PlugY failed to install all features. Disable it only if you know what you do. - ActiveCheckMemory=1 -Activate hidden or not finished feature. (don't use it) +Activate hidden or unfinished feature. (don't use it) - ActiveAllOthersFeatures=0 {0:Disabled; 1:Enabled} @@ -628,13 +640,13 @@ Maximized and center window (keep ratio 4/3) in windowed mode (if SetWindowPos=0 Set position and size of the window in windowed mode. - SetWindowPos=0 {0:Disabled; 1:Enabled} -- X=0 {0:Window Position X} -- Y=0 {0:Window Position Y} -- Width=0 {0:Window Width} -- Height=0 {0:Window Height} +- X=0 {0:Window Position X} +- Y=0 {0:Window Position Y} +- Width=0 {0:Window Width} +- Height=0 {0:Window Height} Lock cursor mouse in the window in windowed mode. -- LockMouseOnStartup=0 {0:Disabled; 1:Enabled} +- LockMouseOnStartup=0 {0:Disabled; 1:Enabled} [LANGUAGE] @@ -645,7 +657,7 @@ All possibles languages: ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS - ActiveChangeLanguage=0 {0:Disabled; 1:Enabled} - SelectedLanguage=ENG {FRA: Select French as language} -For modders who want to restrict the available languages and the default language: +For modders who want to restrict the available languages and the default language : - ActiveLanguageManagement=0 {0:Disabled; 1:Enabled} - DefaultLanguage=ENG {empty:D2 default language; FRA:French is the default language} - AvailableLanguages=ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS {ENG|FRA} @@ -654,52 +666,69 @@ For modders who want to restrict the available languages and the default languag [SAVEPATH] This is where all of your characters and the shared stash is saved. You can use absolute or relative paths. -Following are default values, between {} are some examples values with descriptions: +It don't work in PlugYFixed.ini. +Following are default values, between {} are some examples values with descriptions : - ActiveSavePathChange=0 {0:Disabled; 1:Enabled, you must set "SavePath"} -- SavePath=Save\ {Save\MyMod\ or D:\Save Games\diablo II\Current Mod\} +- SavePath= {MyMod\ or D:\Save Games\diablo II\Current Mod\} + +Active autobackup save file just before the save. +The backup will be store in a folder name "backup" in the save folder. +- ActiveAutoBackup=0 {0:Disabled; 1:Enabled} +- MaxBackupPerCharacter=5 {5: Number of backup to keep before delete; 0:No backup purge} [MAIN SCREEN] Change the version text in the main menu (first menu)(instead of "v 1.10") Color is an integer which refers to defined D2 colors. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveVersionTextChange=0 {0:Disabled; 1:Enabled} -- VersionText= {Empty: Display the current version of LoD with the subversion letter (1.11b, 1.09d) ; Mod Name:Text with maximum length of 23 characters (ex: v 1.11b)} -- ColorOfVersionText=0 {0:white; 1:red; 4:gold; etc.} +- VersionText= {Empty: Display the current version of LoD with the subversion letter (1.11b, 1.09d) ; Mod Name:Text with maximum length of 23 characters (ex : v 1.11b)} +- ColorOfVersionText=0 {0:see * for color list} - ActivePrintPlugYVersion=1 {0:Disabled; 1:Enabled) -- ColorOfPlugYVersion=4 {0:white; 1:red; 4:gold; etc.} +- ColorOfPlugYVersion=4 {0:see * for color list} [STASH] Increase the stash to 10x10 squares. Use PlugY\TradeStash.dc6 to change the background image. When bigStash is enabled, you must restart D2 for play in single/multi/open when you have started a game in closed Bnet previously (and vice versa). -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveBigStash=0 {0:Default stash size is used; 1: Enabled, Stash uses 10x10 squared} -Use this for sharing and keep all of your items.:) -There are 2 multipage stashes: +Use this for sharing and keep all of your items. :) +There are 2 multipage stashes : - one Personal, only seen by the Player; - one Shared between your Players in this mod. Use the Toggle Button to switch between stash. Use arrow buttons on bottom the stash (and shift key) for switching between the pages. -Definition: The last page is the last page with an item in it. +Definition : The last page is the last page with an item in it. The multipage stashes are inactive for Diablo II Classic Character and on realm. You can change the name of the shared filename. -Following are default values, between {} are some examples values with descriptions: -- ActiveMultiPageStash=0 {0:Disabled; 1:Enabled} -- NbPagesPerIndex=10 {10: Index page is 1,10,20,30,...,max} -- NbPagesPerIndex2=100 {100: Index page (+shift) is 1,50,100,150,...,max} -- MaxPersonnalPages=0 {0:Infinite number of personnal pages; 1000: Maximum of 1000 shared pages} -- ActiveSharedStash=0 {0:Disabled; 1:Enabled if ActiveMultiPageStash=1} -- SeparateHardcoreStash=1 {0:Same shared stash for HC and SC; 1:Use 2 differents stashes} +Following are default values, between {} are some examples values with descriptions : +- ActiveMultiPageStash=0 {0:Disabled; 1:Enabled} +- NbPagesPerIndex=10 {10: Index page is 1,10,20,30,...,max} +- NbPagesPerIndex2=100 {100: Index page (+shift) is 1,50,100,150,...,max} +- MaxPersonnalPages=0 {0:Infinite number of personnal pages; 1000: Maximum of 1000 shared pages} +- AutoRenameStashPage=0 {0:Disabled; 1:Enabled automatic renaming page} +- PersonalNormalPageColor=0 {0:Color of the personal stash name without index (see * for color list)} +- PersonalIndexPageColor=12 {0:Color of the personal stash name with index (see * for color list)} +- PersonalMainIndexPageColor=9 {0:Color of the personal stash name with main index (see * for color list)} +- SharedNormalPageColor=4 {0:Color of the shared stash name without index (see * for color list)} +- SharedIndexPageColor=8 {0:Color of the shared stash name with index (see * for color list) +- SharedMainIndexPageColor=1 {0:Color of the shared stash name with main index (see * for color list)} + +- ActiveSharedStash=0 {0:Disabled; 1:Enabled if ActiveMultiPageStash=1} +- ActiveSharedStashInMultiPlayer=0 {0:Disabled; 1:Enabled shared stash in multiplayer. Use only with different save folders.} +- SeparateHardcoreStash=1 {0:Same shared stash for HC and SC; 1:Use 2 differents stashes} - OpenSharedStashOnLoading=0 {0:Disabled; 1:Select shared stash (instead of personal one) on character loading} - SharedStashFilename=SharedStashSave {xxx: The filename will be "_LOD_xxx.sss"} - displaySharedSetItemNameInGreen=1 {0:Disabled; 1:Enabled, set items in stash are their name displayed in green on other sets items.} - MaxSharedPages=0 {0:Infinite number of shared pages; 5000: Maximum of 5000 shared pages} - ActiveSharedGold=1 {0:Disabled; 1:Use command to put and take gold (see command section)} - PosXPreviousBtn=-1 {-1: Default position, 50: Put the button at the position 50 in absiss} -Same for PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn. +Same for PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn, PosXStashNameField, PosYStashNameField, PosXStashGoldField, PosYStashGoldField. +- PosWPreviousBtn=32 {32: Width of the button} +Same for PosHPreviousBtn, PosWNextBtn, PosHNextBtn, PosWSharedBtn, PosHSharedBtn, PosWPreviousIndexBtn, PosHPreviousIndexBtn, PosWNextIndexBtn, PosHNextIndexBtn, PosWPutGoldBtn, PosHPutGoldBtn, PosWTakeGoldBtn, PosHTakeGoldBtn, PosWStashNameField, PosHStashNameField, PosWStashGoldField, PosHStashGoldField. [STATS POINTS] @@ -707,21 +736,23 @@ Use for repairing a bad stat point assignment. For example, 30 points in energy for a barbarian! On the character stat page, press selected key and click on minus button. Select a key by setting KeyUsed (should choose 17 or 18). -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveStatsUnassignment=0 {0:Disabled 1:Enabled, press selected key when clicking} - KeyUsed=18 {17:Control key selected; 18:Alt key selected} Use the shift buton for assigning/unassigning all possible points in one click. You can define a limit value for points assigned/unassigned with shift. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveShiftClickLimit=0 {0:Disabled; 1:Enabled} - LimitValueToShiftClick=5 (10:Assign or unassign stats points, 10 by 10} +- PosXUnassignSkillBtn=-1 {-1: Default position, 50: X position of the button set to 50.} +- PosYUnassignSkillBtn=-1 {-1: Default position, 50: Y position of the button set to 50.} [STAT ON LEVEL UP] -WARNING: CHEAT, DON'T USE IN NORMAL GAME. +WARNING : CHEAT, DON'T USE IN NORMAL GAME. Change the number of Stats Points you receive when your character gains a level. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveStatPerLevelUp=0 {0:Disabled; 1:Enabled} - StatPerLevelUp=5 {0:no points win; 11:eleven points win} @@ -729,19 +760,19 @@ Following are default values, between {} are some examples values with descripti [SKILLS POINTS] Use for repairing a bad skill point assignment. Click on the button on skill page for unassigning all assigned skills points. -Note: It verifies the real cost of each skill (can be greater than 1 in mod) -Warning: There are few place where you can put this button without bugs. -Following are default values, between {} are some examples values with descriptions: +Note : It verifies the real cost of each skill (can be greater than 1 in mod) +Warning : There are few place where you can put this button without bugs. +Following are default values, between {} are some examples values with descriptions : - ActiveSkillsUnassignment=0 {0:Disabled; 1:Enabled} -- ActiveSkillsUnassignmentOneByOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).} +- ActiveSkillsUnassignmentOneForOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).} - PosXUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in X} - PosYUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in Y} [SKILL ON LEVEL UP] -WARNING: CHEAT, DON'T USE IN NORMAL GAME. +WARNING : CHEAT, DON'T USE IN NORMAL GAME. Change the number of Skills Points you receive when your character gains a level. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveSkillPerLevelUp=0 {0:Disabled; 1:Enabled} - SkillPerLevelUp=1 {0:no point gained; 3:three points gained) @@ -753,7 +784,7 @@ If the WE triggers when you aren't in the game, you lose it. From the moment you launch D2, the next WE will trigger between few seconds to 41:40 hours after. Keep in mind before editing it, World Event should be triggered rarely. The item to sell can be changed, the value expected is same as the cube input field. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveWorldEvent=0 {0:Disabled; 1:Enabled} - ShowCounterInAllDifficulty=0 {0:Show it "SOJ Sold" message only in Hell; 1:Show it in all difficulties} - ItemsToSell=The Stone of Jordan {r01: rune EL; cap,rar,upg: Any cap/war hat/shako rare} @@ -772,8 +803,24 @@ Following are default values, between {} are some examples values with descripti Activate the Uber Quest in local. It works only in Hell. You must cube the 3 keys then the 3 organs in Harrogath. -Note: This quest will be updated more later to be more similar with the one on realm. -ActiveUberQuest=0 {0:Disabled; 1:Enabled} +ActiveUberQuest=0 {0:Disabled; 1:Enabled} +UberMephistoX=25130 {25130:X position of Uber Mephisto} +UberMephistoY=5143 {5143:Y position of Uber Mephisto} +UberDiabloX=25139 {25139:X position of Uber Diablo} +UberDiabloY=5139 {5139:Y position of Uber Diablo} +UberBaalX=25139 {25139:X position of Uber Baal} +UberBaalY=5135 {5135:Y position of Uber Baal} +ActiveUberMinions=1 {0:Disabled; 1:Enabled Uber minions in Tristram} +UberMephistoSpawnPercent=80 {80:Percent chance of Uber Mephisto to spawn a minion} +UberMephistoSpawnRadius=30 {30:Radius of Uber Mephisto to spawn a minion} +UberBaalSpawnPercent=30 {30:Percent chance of Uber Baal to spawn a minion} +UberBaalSpawnRadius=30 {30:Radius of Uber Baal to spawn a minion} +UberDiabloSpawnPercent=30 {30:Percent chance of Uber Diablo to spawn a minion} +UberDiabloSpawnRadius=30 {30:Radius of Uber Diablo to spawn a minion} +ActiveUberDiabloRushTweekAI=1 {0:Disabled; 1:Enabled Uber Diablo Rush tweek} +ActiveUberBaalTeleportTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Teleport tweek} +ActiveUberBaalChillingArmorTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Chilling Armor tweek} +UberBaalChillingArmorTimer=6000 {6000:Timer between Uber Baal casting Chilling Armor} [INTERFACE] @@ -791,9 +838,9 @@ Can choose whether to display the background of buttons (Use when a mod already You can run any number of Diablo II games on one computer. For example, modder can test multiplayer game for their mod. To start the second game, you must start it with "game.exe" and not "Diablo II.exe". -Warning: Don't start games with the same savepath when you use the Shared Stash. +Warning : Don't start games with the same savepath when you use the Shared Stash. Don't use the same character in same time. -Following are default values, between {} are some examples values with descriptions: +Following are default values, between {} are some examples values with descriptions : - ActiveLaunchAnyNumberOfLOD=0 {0:Disabled; 1:Enabled} Regenerate the map each time you re-start a game (like in multiplayer). @@ -816,41 +863,60 @@ Display the stats current value (without magical bonus) when mouse pass over ass Enabled the ladder only runewords out of realms. This is done by setting to 0 the column "server" in runes.txt file. -So don't use this column in your mod with this funcion enabled! +So don't use this column in your mod with this funcion enabled ! - ActiveLadderRunewords=0 {0:Disabled; 1:Enabled} Enabled the ability to open the Cow Portal in a difficulty where the player have already killed the Cow King. - ActiveCowPortalWhenCowKingWasKilled=0 {0:Disabled; 1:Enabled} +Prevent Nihlathak's portal from closing. +- ActiveDoNotCloseNihlathakPortal=0 {0:Disabled; 1:Enabled} -More features later...:) +Move Cain near Harrogath waypoint. +- MoveCainNearHarrogathWaypoint=0 {0:Disabled; 1:Enabled} -This is my email: ynicolas@worldonline.fr. -But I don't support PlugY anymore so don't hope any help from me if you have problems. Instead go on forums... +* Color list values (color code greater than 12 is black in 1.14d fullscreen): +- Invisible: 6 +- Dark gray: 5 +- Gray: 16 +- Light gray: 15 +- White: 0, +- Bright white: 18 +- Gold: 4 +- Dark yellow: 7 +- Yellow: 9 +- Orange: 8 +- Darkest green: 10 +- Dark green: 12 +- Green: 2 +- Blue: 3 +- Purple: 11 +- Red: 1 +- Crystal red: 19 -PS: Sorry for english faults ;) - ******** THANKS TO ******** - Blizzard for making Diablo2 and Lord of Destruction. - Kingpin, Afj666, Joel, SVR, Myrdinn for their great help. -- Pralinor fo his help in the convertion to 1.12. -- L'Autour fo his help in the convertion to 1.13d. -- ChaosEnergy for testing and his translation in German. +- Pralinor for his help in the convertion to 1.12. +- L'Autour for his help in the convertion to 1.13d. +- Haxifix for his help in the convertion to 1.14d. +- SnapChip for Uber AI in Tristram. +- ChaosEnergy for his testing. - Char & Darque in the correction of my english. - Shaitane, K&V, themastercaster, raspa and onyx for testing. - Golvmopp, Dark Spot in the Corner, Megalixir and Athara for their help. -- ItalianPlayer for italian translation. - All members of ProzenKeep chat and forums for their information and feedback. -- PhrozenKeep team for all stuff they shared for us (including mine ;) -- Translation: +- PhrozenKeep team. +- Translation : * English: Yohann, Jurica. * French: Yohann - * German: ChaosEnergy, TheMasterCaster. + * German: ChaosEnergy, TheMasterCaster, ChaosMarc. * Italian: ItalianPlayer * Spanish: Acrerune * Polish: Serdel * Russian: L'Autour + * Chinese: Nagahaku ;--------------------------------------------------------------------------------------; \ No newline at end of file diff --git a/PlugYInstaller/PlugY_The_Survival_Kit_-_讀我檔案.txt b/PlugYInstaller/PlugY_The_Survival_Kit_-_讀我檔案.txt new file mode 100644 index 0000000000000000000000000000000000000000..222a7244782eca5589c8b7f4adac76555b2cfd76 GIT binary patch literal 47710 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 yVJ*YTl=+S%u] ; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX @@ -66,7 +66,7 @@ BYTE freeDll[] = { 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX 0x75,0x13, //JNZ SHORT d2gfx.6FA7BDEF - 0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001) + 0x68,0x11,0x27,0x00,0x00, //PUSH 2711 ;Release Ordinal(10001) 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress 0x85,0xC0, //TEST EAX,EAX diff --git a/PlugYRun/PlugYRun.rc b/PlugYRun/PlugYRun.rc index 2f3b86a1f50f22110ae6eb379a7ad1df9d7ccefb..1a5d9ba565433b07bfe86ad25aaebe16619711bc 100644 GIT binary patch delta 48 zcmexi@WWukGJZyr$;&HgTd{oQ6=xb{twlY^zaXmEZ&tL5nJ+LL*X0li)Zd zg;Fe0QZ7wZJX{`l=?~x`usraBl+r#R1ZpY}@JJC)JW*s2q^0FMYZFls*^Kq=oS8GT zbIx~Wk8`&~?u@dwpr}Jc#98Hxh#NN)tH`Uf)(!Rh=3Cdlgtj{q_@dgj7U9IN864 zf3JS1S}3qkw8%r&Ho;fyAuiai@@2J8vtV+NKXiJHF~`S(KkG~6T`6IcBnm4pxhDB@ z+dV?(-&|>nkfhm7ezP^>7GZ^1BTc&#qbUHwA{@62l6)@@yN3iBuedJ>zG4fB8eZ~D z3WvlpsCKFtF|<&)k6a&<<*>sI{fvYW2sg?ZB1m zMo-ZUp3{_}MGBBCExD=!hUsV-qKh?ieX1r~=50=Pu5x;}&QI1)raJQW%y zv^vDpo0|?`^nu_P8dumINC<^L?Rlp~z*(u>a+gmyd9|s1uBhf zv!jaFTNC-vey(bJfCIi5|JXF-AE~?tYX%$;)$(5_*;s2^5Fd5qtS=v>E|4-uy_BV& zfoX(DiETsLe`62Rews(?AIEbJ#1`e=ZF8qVdj{`c#BUybESEE#*h*^KCh1>+TXEsL z<}QC~~wS;pYPE%nMC|`xYwU5yTG2>8I(AE^@-b1 zW+~#wBHfj?rH<{|Xygmg9gXtamTT??WV=h*0SMzxq)us-_t{yPQoj!U29O8N0jt1y zzM*)HRBTf@6oDx}1}S?1`PLw?50EknNZ)QC1xT3$%&p>xD}IumVmm7rZ^|3k%rm~( zTM(kw{7?$_e>udSrVKdLE3u|a)@lIbwHKF_e0Q^m@HMrS6Phk>L~R~Z7x>R$hlrN^ zs@4u)m#m~^Fq$%F`-`&;Q7sGKLDLu8%IJhIXl9(iXx*G0*veRe?@@kBe^8eUNWouO Nm@n!hA{1g>PhfY)ITAL1nK%FG+vzHxAWfn&6~HsH={0a>L0pV z;P@?F*I}Alc$yb!iJveQo-Zz~6+goi|H*)q?tt~;eu#-YTruRRSoc&b55EnH-$)2y z`3z>Xn-La-bvtg`UL&|3L_k^y$>-7VAUYBC;+Q9}W@rC?Y0Fyz7t{4x!j z2!|m&OoxxfKA1M=U`_Hv)w}@}bHFMfSwyhG!^rg^K!uvc@{E?GG&M2JsC-5mrRKVA zf}c_rD(!=y+L8icZLl$-Swbt%PC*qk9p?o?DWv2mrP>Yo9Tiz)8h=4$n6Z!Y4OiHK z+&qPvJtML{HsS_5I&Qe?$UsF3XjO;IH7)&97liveB@@LhY%tATR#t?`Z9?3Ic<&v^ z?i1m$GY_&7gP6-)YO4s8N4B+oo7J|QffaW$Pf*Z$K;T;YO;EZgp%8YV1W(5v7;}Xn z7aD-oP99dBiWcj5LAi{e)!bQ1Ei6}?-fd}uL^?_bVBQlib;dNMYm-90#|J)t2~sYl z+@l(O#7~ms5Ppx>XOi@jIqd%c87AXoik!vhI9~ZVw4I4 zsl~i1ca%hkmn86nFrMfoA>>22!;4-5IX_zcI3smFNP<{7i22N#L#6P>lY*K&2xGmI z@F?I0pEC<;w;hyO7rx2J{~3W`e<+L(x|KZSzjFBMb-kG*jT;aLpGcZM6z9sJ7Osum rVPh;}wOfc1VtK@^r6V;C5}DWK!|y4z*V|V;@*!G2`Ic&GQKf$YXb=)? diff --git a/PlugYRun/PlugYRun.vcproj b/PlugYRun/PlugYRun.vcproj index 0fb0522..a8ff84b 100644 --- a/PlugYRun/PlugYRun.vcproj +++ b/PlugYRun/PlugYRun.vcproj @@ -1,231 +1,231 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 9c9a9f9..cda1f4d 100644 --- a/README.md +++ b/README.md @@ -4,49 +4,60 @@ PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction (1.09b - 1.1 Extends Diablo II - Lord of Destruction by a number of useful features ## FEATURES -Each features can be turned on/off via PlugY.ini +Each features can be turned on/off via PlugY.ini (see "COMMENTS ON THE CONFIGURATION FILE") * Disable access to Battle.net. * Infinite storage space in the stash. * Shared storage space in the stash. -* Enabled the ladder only runewords out of realms. -* Local World Event and Uber Quest for singleplayer and multiplayer off-realm ! +* Enable the ladder only runewords for singleplayer and TCP/IP game. +* World Event and Uber Quest for singleplayer and TCP/IP game. * Can open Cow Level Portal even when player have kill the Cow King in that difficulty. +* Prevent Nihlathak's portal from closing. +* Move Deckard Cain near the waypoint in Harrogath. * Unassign assigned skills and stats points. +* Auto backup save files before saving. * Change the selected language. * Always regenerate maps in SinglePlayer like in MultiPlayer. * Automatically execute /players X when you launch a new game. -* Added some pages for display more characters stats like %MF. +* Added some pages for display more characters stats. * Display item level in its popup. * Launch any number of Diablo II games on the same computer. * Increase the stash to 10x10 squares. * Change the save path directory. * Always display Mana and Life values above the globes. * D2 can load all files, even those opened with Microsoft Excel (disabled by default). -* Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances. -* Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder). -* Add following commands: - * /save : Save game without exit. - * /page 1 : Show normal stats page (stats page must be opened). - * /page 2 : Show extra stats page (stats page must be opened). - * /page 3 : Show resistance stats page (stats page must be opened). - * /page 4 : (beta) Show available runewords (stats page must be opened). +* Display the current stats value (without magical bonus). +* Can launch game in windowed mode. +* Add following commands (see "COMMENTS ON THE CONFIGURATION FILE") : * /lockmouse : Lock mouse cursor in the window. * /lock : Same as /lockmouse. * /unlockmouse : Unlock mouse cursor in the window. * /unlock : Same as /unlockmouse. - * /renamechar newname : Rename your character and save it. - * /renamepage name : Rename current page stash. - * /setindex : Set current stash page as index + * /renamepage name : Rename current page stash (use # for page number). + * /rp name : See /renamepage. + * /setindex : Set current stash page as index. + * /setmainindex : Set current stash page as main index. * /resetindex : Remove index flag on the current stash page. * /insertpage : Insert a new page after the current page. + * /ip : See /insertpage. * /deletepage : Delete current page if empty. - * /swap page : Swap the content of current stash page with the content of another page. - * /toggle page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. + * /dp : See /deletepage. + * /swappage page : Swap the content of current stash page with the content of another page. + * /sp page : See /swappage. + * /togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal. + * /tp page : See /togglepage. * /dlm : Toggle always display mana and life mode. - * /dml : Same as /dlm. - * /dl : Toggle always display life mode. - * /dm : Toggle always display mana mode. + * /dml : See /dlm. + * /dl : See /dlm. + * /dm : See /dlm. + * /page 1 : Show normal stats page (stats page must be opened). + * /page 2 : Show extra stats page (stats page must be opened). + * /page 3 : Show resistance stats page (stats page must be opened). + * /page 4 : Show player breakpoints (stats page must be opened). + * /page 5 : Show mercenaries breakpoints (stats page must be opened). + * /page 6 : (beta) Show available runewords (stats page must be opened). + * /save : (beta) Save game without exit. * /listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts. + * /renamechar newname : (beta) Rename your character and save it. ## Contribute If you want to update the translations please use the [POEditor project](https://poeditor.com/join/project/VnO1SKslPV) and create a bug-ticket nofifying me that you have done so. Please do not edit the LocalizedStrings.ini directly. If you absolutely don't want to use POEditor, edit the json files found at [PlugYInstaller/PlugY/translations](https://github.com/ChaosMarc/PlugY/tree/master/PlugYInstaller/PlugY/translations)