diff --git a/Commons/D2Funcs.h b/Commons/D2Funcs.h index 9e923ea..fcfa805 100644 --- a/Commons/D2Funcs.h +++ b/Commons/D2Funcs.h @@ -1,5 +1,6 @@ /*====================================================================== File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Declares the type for a STDCALL or FASTCALL function pointer called N with arguments list P, returning R, namedInDLL D and at @A @@ -148,68 +149,68 @@ //F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID)); -F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); -F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826, DWORD, D2GetLevelID, (Room* ptRoom)); -F7(STD, D2Common,10138,10138,10138,10623,10491,11043,10654, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); +F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346,10907, DWORD, D2Common11084, (Room* ptRoom, DWORD zero)); +F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826,10691, DWORD, D2GetLevelID, (Room* ptRoom)); +F7(STD, D2Common,10138,10138,10138,10623,10491,11043,10654,10716, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD)); //F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit)); -F7(STD, D2Common,10242,10242,10242,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); -F7(STD, D2Common,10246,10246,10246,10855,10813,10289,10133, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line)); -F7(STD, D2Common,10243,10243,10243,10461,10827,10936,10646, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); -F7(STD, D2Common,10249,10249,10249,10880,11068,10436,11107, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll -F7(STD, D2Common,10250,10250,10250,00000,00000,00000,00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll +F7(STD, D2Common,10242,10242,10242,00000,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient)); +F7(STD, D2Common,10246,10246,10246,10855,10813,10289,10133,10402, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line)); +F7(STD, D2Common,10243,10243,10243,10461,10827,10936,10646,10490, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem)); +F7(STD, D2Common,10249,10249,10249,10880,11068,10436,11107,10963, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll +F7(STD, D2Common,10250,10250,10250,00000,00000,00000,00000,00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll //F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc)); -F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); -F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); -F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464, Unit*, D2UnitGetNextItem, (Unit* ptItem)); -F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147, Unit*, D2GetRealItem, (Unit* ptUnit)); +F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow)); +F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460,11040, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory)); +F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464,10879, Unit*, D2UnitGetNextItem, (Unit* ptItem)); +F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147,10897, Unit*, D2GetRealItem, (Unit* ptUnit)); //F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar)); //F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar)); -F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 +F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10 //F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos)); -F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 +F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10 //F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos)); -F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141, void, D2GetPosition, (Unit* ptUnit, Position* pos)); -F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); -F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331, Room*, D2GetRoom, (Unit* ptUnit)); +F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141,11166, void, D2GetPosition, (Unit* ptUnit, Position* pos)); +F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060,11025, DWORD, D2GetMaxGoldBank, (Unit* ptUnit)); +F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331,10846, Room*, D2GetRoom, (Unit* ptUnit)); //F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode)); //F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject)); -F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356, PlayerData*,D2InitPlayerData, (Unit* ptChar)); +F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356,10404, PlayerData*,D2InitPlayerData, (Unit* ptChar)); //F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar)); -F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920, PlayerData*,D2GetPlayerData, (Unit* ptChar)); -F7(STD, D2Common,10431,10431,10431,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar)); -F7(STD, D2Common,10433,10433,10433,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); -F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049, DWORD, D2GetMaxGold, (Unit* ptUnit)); -F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); +F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920,11103, PlayerData*,D2GetPlayerData, (Unit* ptChar)); +F7(STD, D2Common,10431,10431,10431,00000,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar)); +F7(STD, D2Common,10433,10433,10433,00000,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame)); +F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049,11159, DWORD, D2GetMaxGold, (Unit* ptUnit)); +F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090,10193, DWORD, D2Common10572, (Unit* ptObject, DWORD value)); //F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex)); //F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex)); //F7(STD, D2Common,10470,10470,10470,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum)); -F7(STD, D2Common,00000,00000,00000,10471,11160,10866,10258, BYTE, D2GetObjectFlags, (Unit* ptObject)); -F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); +F7(STD, D2Common,00000,00000,00000,10471,11160,10866,10258,10040, BYTE, D2GetObjectFlags, (Unit* ptObject)); +F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111,10033, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags)); //F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000, DWORD, D2Common10471, (void*)); //F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000, DWORD, D2Common10472, (void*)); //F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one)); //F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags)); //F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD)); //F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats)); -F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); +F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame)); //F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index)); -F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b -F7(STD, D2Common,10519,10519,10519,11092,10061,10658,10973, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551,10645, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b +F7(STD, D2Common,10519,10519,10519,11092,10061,10658,10973,10550, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b //F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index)); -F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b +F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587,10216, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b //F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit)); -F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); -F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); -F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); -F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); -F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); -F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); -F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); -F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); -F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); -F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); +F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar)); +F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar)); +F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar)); +F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar)); +F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar)); +F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar)); +F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar)); +F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar)); +F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar)); +F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar)); //F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit)); //F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem)); //F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats)); @@ -217,35 +218,35 @@ F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000, DWORD, D2havePoiso //F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000, void, D2FreeBinFiles, ()); //F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool)); //F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value)); -F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); -F7(STD, D2Common,10600,10600,10600,10573,10262,10887,10695, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); +F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849,10037, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)); +F7(STD, D2Common,10600,10600,10600,10573,10262,10887,10695,10994, ItemsBIN*, D2GetItemsBIN, (DWORD itemID)); //F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID)); //F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID)); -F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); -F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); -F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675, int, D2GetNbCubeMainBIN, ()); +F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806,10619, GemsBIN*, D2GetGemsBIN, (DWORD gemID)); +F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783,10393, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID)); +F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675,10235, int, D2GetNbCubeMainBIN, ()); //F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID)); -F7(STD, D2Common,10628,10628,10628,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); -F7(STD, D2Common,10629,10629,10629,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID)); -F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); +F7(STD, D2Common,10628,10628,10628,00000,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level)); +F7(STD, D2Common,10629,10629,10629,00000,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID)); +F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218,10694, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel)); //F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk)); //F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id)); -F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106, DWORD, D2GetItemQuality, (Unit* ptItem)); -F7(STD, D2Common,10707,10707,10707,10911,10303,10989,10202, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); +F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106,10911, DWORD, D2GetItemQuality, (Unit* ptItem)); +F7(STD, D2Common,10707,10707,10707,10911,10303,10989,10202,10458, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file)); //F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue)); //F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit)); //F7(STD, D2Common,10711,10711,10711,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1 -F7(STD, D2Common,10717,10717,10717,10898,10100,10410,10086, DWORD, D2GetItemLevel, (Unit* ptItem)); -F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020, BYTE, D2ItemGetPage, (Unit* ptUnit)); -F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); -F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); -F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620, int, D2GetUniqueID, (Unit* ptItem)); -F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); +F7(STD, D2Common,10717,10717,10717,10898,10100,10410,10086,10008, DWORD, D2GetItemLevel, (Unit* ptItem)); +F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020,10810, BYTE, D2ItemGetPage, (Unit* ptUnit)); +F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012,11026, void, D2ItemSetPage, (Unit* ptItem, BYTE page)); +F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744,10601, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype)); +F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620,10075, int, D2GetUniqueID, (Unit* ptItem)); +F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim)); //F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height); //F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit)); //F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem)); -F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032, int*, D2GetNbRunesBIN, ());//return the point on th number -F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006, RunesBIN*, D2GetRunesBIN, (int runesID)); +F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032,10981, int*, D2GetNbRunesBIN, ());//return the point on th number +F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006,10405, RunesBIN*, D2GetRunesBIN, (int runesID)); //F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem)); //F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem)); //F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem)); @@ -254,35 +255,35 @@ F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006, RunesBIN*, D2GetRun //F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD)); //F7(STD, D2Common,10872,10872,10872,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y)); //F7(STD, D2Common,10875,10875,10875,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem)); -F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 -F7(STD, D2Common,10881,10881,10881,10956,11156,10218,10987, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); +F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107,10963, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 +F7(STD, D2Common,10881,10881,10881,10956,11156,10218,10987,10665, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6)); //F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000, void, DoNothing916, ()); //F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID)); //F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID)); //F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID)); -F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); +F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302,10335, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD)); //F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line)); //F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill)); -F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); +F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306,10007, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus)); //F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two)); //F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState)); //F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber)); //F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID)); //F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex)); //F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD)); -F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 -A7(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); -A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); -A7(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); -A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); +F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435,11081, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447 +A7(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, 17B0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID)); +A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020,5B0E0, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2)); +A7(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60,5AB20, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2)); +A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, 1160, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId)); //A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize)); -A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); +A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, 17E0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id)); //A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD)); //A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats)); //A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem)); -A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); +A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, B5E0, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD)); //A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string)); -A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 +A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870,80C40, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -307,24 +308,24 @@ A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870, void, D2LoadSuper //E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b //E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI -A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420, void*, D2LoadImage, (const char* filename, DWORD filetype)); -A7(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000, void, D2FreeImage, (void* image));//6FAA1140 -A7(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! +A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420,A9480, void*, D2LoadImage, (const char* filename, DWORD filetype)); +A7(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000,00000, void, D2FreeImage, (void* image));//6FAA1140 +A7(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0,B6890, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !! //A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80 -A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 -A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0, void, D2PrintStatsPage, ()); +A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80 +A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0,BF640, void, D2PrintStatsPage, ()); //A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990 -A7(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b -A7(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI +A7(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10,2CE40, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b +A7(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0,18820, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI //A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0 -A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); +A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70,26270, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD)); //A7(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl)); -A7(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150, Unit*, D2GetCurrentNPC, ()); -A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX -A7(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); -A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI -A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0, void*, D2LoadBuySelBtn, ()); -A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0, void, D2ReloadGambleScreen, ()); +A7(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150,790D0, Unit*, D2GetCurrentNPC, ()); +A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0,B61F0, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX +A7(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790,1C190, void, D2TogglePage, (DWORD a, DWORD b, DWORD c)); +A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00,90C10, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI +A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0,18AA0, void*, D2LoadBuySelBtn, ()); +A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0,7DC60, void, D2ReloadGambleScreen, ()); //A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI @@ -369,43 +370,43 @@ A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0, void, D2ReloadGamb //E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b -F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049, void, D2SetNbPlayers, (DWORD nbPlayers)); +F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049,10002, void, D2SetNbPlayers, (DWORD nbPlayers)); //A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0 -A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930, void, D2AddClient, (DWORD clientID));//BY EAX -A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 -A7(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 -A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData -A7(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX +A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930,E5070, void, D2AddClient, (DWORD clientID));//BY EAX +A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0,BC700, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 +A7(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820,BB510, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0 +A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0,DB780, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData +A7(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0,DD4F0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX //A7(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0 //A7(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0 //A7(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0 -A7(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); -A7(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem +A7(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0,15F40, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID)); +A7(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070,B2F70, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem //A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80 -A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); +A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, 1340, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y)); //A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410 //A7(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00 //A7(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610 //A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10 -A7(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param -A7(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); +A7(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950,CDE20, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param +A7(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0,59980, void, D2Game235C0, (Game* ptGame, Room* ptRoom)); //A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0 //A7(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500 -A7(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0 -A7(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 +A7(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810,3A4C0, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0 +A7(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0,6DC40, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00 //A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220, Unit*, D2GetOwnerMonster, (Unit* ptMonster)); //A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0 -A7(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3)); -A7(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); -A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); -A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); -A7(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90,6FE10, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3)); +A7(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180,941E0, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar)); +A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170,941D0, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar)); +A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610,31920, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60,4EAD0, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610,C8850, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0,49480, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0,2C3F0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*)); +A7(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80,C6EC0, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*)); //A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one)); -A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830, void, D2SaveGame, (Game* ptGame) ); +A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830,BE660, void, D2SaveGame, (Game* ptGame) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -413,8 +414,8 @@ A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830, void, D2SaveGame, (G //D2S(D2Net,10020, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//ONLY 1.11b //D2S(D2Net,10018, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));//ONLY 1.11b -F7(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before -F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); +F7(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024,10015, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before +F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002,10012, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -439,25 +440,25 @@ F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002, DWORD, D2SendToClien ////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 //D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10 -F7(STD, Fog, 10023,10023,10023,00000,00000,00000,00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10) -F7(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); -F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); -F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); -F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103, DWORD, D2MPQCloseFile, (void* mpqfile)); -F7(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); -F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); -F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); -F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); +F7(STD, Fog, 10023,10023,10023,00000,00000,00000,00000,00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10) +F7(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024,10024, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line)); +F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F7(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F7(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero)); +F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf)); +F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103,10103, DWORD, D2MPQCloseFile, (void* mpqfile)); +F7(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD)); +F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset)); +F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize)); +F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize)); //F7(STD, Fog, 10126,10126,10126,10126,10126,10126,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0 //F7(STD, Fog, 10127,10127,10127,10127,10127,10127,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0 //F7(STD, Fog, 10128,10128,10128,10128,10128,10128,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0 //F7(STD, Fog, 10130,10130,10130,10130,10130,10130,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840 -F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow)); +F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow)); //F7(STD, Fog, 10217,10217,10217,10217,10217,10217,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840 -F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265, int, D2GetInstructionPointer, ()); +F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265,10265, int, D2GetInstructionPointer, ()); //Fog10213 getIndexFromLookupTable (&table,code,bool) @@ -476,12 +477,12 @@ F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265, int, D2GetInstructionP ////E2F(D2Lang,2CD0, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth ////E2S(D2Lang,1670, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf -//F7(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 -F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); +F7(FAST, D2Lang, 10003,10003,10003,10002,10004,10010,10011,10011, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0 +F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003,10004, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum)); //F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0 -F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009, DWORD, D2GetLang, ()); -F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 -//F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 +F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009,10001, DWORD, D2GetLang, ());//14b 00522A20 +F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210 +F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000,10005, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960 //A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0 //A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60 //A7(FAST, D2Lang, 00000,00000,03640,00000,00000,00000,00000, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640 @@ -497,9 +498,9 @@ F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000, DWORD, D2PrintBigNu //D2S(Storm,511, void, D2FreeWinMessage, (sWinMessage* msg));//1.11/1.11b //F7(STD, Storm, 253, 253, 253, 253, 253, 253, 000, void, D2StormMPQCloseFile, (void* mpqfile)); -F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) -F7(STD, Storm, 503, 503, 503, 503, 503, 503, 503, void, D2Storm503, (DWORD, DWORD, DWORD)); -F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg)); +F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, 268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer)) +F7(STD, Storm, 503, 503, 503, 503, 503, 503, 503, 503, void, D2Storm503, (DWORD, DWORD, DWORD)); +F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg)); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -511,12 +512,12 @@ F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessa //D2S(D2gfx,10000, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));//ONLY 1.11b //D2S(D2gfx,10044, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );//ONLY 1.11b -F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031, DWORD, D2GetResolution,() ); +F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031,10012, DWORD, D2GetResolution,() ); //F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) ); //F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000, DWORD, D2ShowWindow,() ); //F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0 -F7(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); -F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); +F7(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014,10028, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl)); +F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041,10042, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -530,36 +531,36 @@ F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041, void, D2PrintImage,( //D2F(D2Win,10132, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 //D2S(D2Win,10113, void*, D2CreateTextBox,(DWORD* data) );//ONLY 1.11b -F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); -F7(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); -F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028, DWORD, D2GetPixelLen,(LPWSTR s) ); -F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184, DWORD, D2SetFont,(DWORD fontID) ); -F7(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); -F7(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 -F7(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 -F7(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098, void*, D2CreateTextBox,(DWORD* data) ); +F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022,10051, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) ); +F7(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150,10076, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) ); +F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028,10150, DWORD, D2GetPixelLen,(LPWSTR s) ); +F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184,10047, DWORD, D2SetFont,(DWORD fontID) ); +F7(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085,10137, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) ); +F7(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260 +F7(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000,00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080 +F7(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098,10164, void*, D2CreateTextBox,(DWORD* data) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //D2CMP : ????0000 //D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11 -F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065, DWORD, D2CMP10014, (void* image) ); +F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065,10020, DWORD, D2CMP10014, (void* image) ); //ONLY UNTIL 1.10 : -A7(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080 -A7(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d) -A7(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0 -A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 -A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0 -A7(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000, void, D2CleanStatMouseUp, ());//6FAABF60 -A7(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 +A7(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080 +A7(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000,00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d) +A7(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0 +A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0 +A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0 +A7(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000,00000, void, D2CleanStatMouseUp, ());//6FAABF60 +A7(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990 //A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20 //A7(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0 //A7(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40 //A7(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70 -A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 +A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000,00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// VARIABLES //////// @@ -581,22 +582,23 @@ A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000, NetClient*, D2GetCli //E2C(D2Client,11C1E0,Unit*, ptClientChar);//1.11b //C7(D2Common,000000,000000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20 -C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, DWORD, ResolutionY);//0x258 = 600 -C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, DWORD, ResolutionX);//0x320 = 800 -C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 -C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0, DWORD, WindowStartX);//0x50 = 80 +C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C,F7038, DWORD, ResolutionY);//0x258 = 600 +C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48,F7034, DWORD, ResolutionX);//0x320 = 800 +C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4,11D358, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 +C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0,11D354, DWORD, WindowStartX);//0x50 = 80 //C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000 -C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8, NetClient*, ClientTable); +C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8,1105E0, NetClient*, ClientTable); //C7(D2Client,000000,000000,000000,000000,104225,000000,000000, DWORD, CurrentNPCNum); -C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854, DWORD, IsLodGame); -C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000, BYTE, DifficultyLevel); -C7(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824, DWORD, MouseY);//0x258 = 600 -C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828, DWORD, MouseX);//0x320 = 800 -C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC, Unit*, ptClientChar); +C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854,1087B4, DWORD, IsLodGame); +C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,000000, BYTE, DifficultyLevel); +//C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000,11D1D8, BYTE, DifficultyLevel); +C7(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824,11C94C, DWORD, MouseY);//0x258 = 600 +C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828,11C950, DWORD, MouseX);//0x320 = 800 +C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC,11D050, Unit*, ptClientChar); -C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000, DWORD, NbStatDesc); -C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000, DWORD, StatDescTable); +C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000,000000, DWORD, NbStatDesc); +C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000,000000, DWORD, StatDescTable); /* NEXT NOT TESTED IN 1.10 (1.09b fct) D2_STD(D2Common10066, void, D2RemoveFromRoom, (DrlgRoom1* hRoom, DWORD untitype, DWORD unitID), 0x6FD7CFD0); diff --git a/Commons/VersionInfo.cpp b/Commons/VersionInfo.cpp new file mode 100644 index 0000000..9e7be5e --- /dev/null +++ b/Commons/VersionInfo.cpp @@ -0,0 +1,118 @@ +#include "VersionInfo.h" +#pragma comment(lib, "Version.Lib") // Delphi 7 - ! :( + + +bool IsFile(char* sPath) +{ + bool bFile = false; + HANDLE hFile = CreateFile + ( + sPath, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + if(hFile != INVALID_HANDLE_VALUE) + { + CloseHandle(hFile); + bFile = true; + } + return bFile; +} + +bool GetAppVersion(char* FileName, TFileVersion* VerInfo){ // + VerInfo->full = -1; + if(!IsFile(FileName)){ // + return false; // - + } + DWORD FSize = GetFileVersionInfoSize(FileName,NULL); // + if(FSize==0){ // 0 + return false; + } + LPVOID pBlock = (char*)malloc(FSize); // + GetFileVersionInfo(FileName,NULL,FSize,pBlock); // + LPVOID MS; + UINT LS; + try{ + VerQueryValue(pBlock,"\\",&MS,&LS); // + } + catch(...){ + return false; // + } + VS_FIXEDFILEINFO FixedFileInfo; // + memmove(&FixedFileInfo, MS, LS); // + + DWORD FileVersionMS = FixedFileInfo.dwFileVersionMS; + DWORD FileVersionLS = FixedFileInfo.dwFileVersionLS; + + VerInfo->major = HIWORD(FileVersionMS) ; // + VerInfo->minor = LOWORD(FileVersionMS); // + VerInfo->revision = HIWORD(FileVersionLS); + VerInfo->subrevision = LOWORD(FileVersionLS); + + return true; // +} + + +#define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" +#define GAMEFILE "\\Game.exe" +bool GetD2Path(char* buf, DWORD bufsize) +{ + HKEY hKey; + DWORD type; + int res; + if (RegOpenKeyEx(HKEY_CURRENT_USER, SUBKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + res = RegQueryValueEx(hKey,"InstallPath",NULL,&type,(LPBYTE)buf,&bufsize); + RegCloseKey(hKey); + if (res!=ERROR_SUCCESS) return false; + } else if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + res = RegQueryValueEx(hKey,"InstallPath",NULL,&type,(LPBYTE)buf,&bufsize); + RegCloseKey(hKey); + if (res!=ERROR_SUCCESS) return false; + } else { + return false; + } + strcat(buf, GAMEFILE); + if (GetFileAttributes(buf) == INVALID_FILE_ATTRIBUTES) + return false; + return true; +}; + +int GetVerD2(TFileVersion GameVer) +{ + if ((GameVer.major != 1)||(GameVer.minor != 0)) return -1; + switch (GameVer.revision) + { + case 9: + if (GameVer.subrevision == 20) return v109b; + if (GameVer.subrevision == 22) return v109d; + break; + case 10: + if (GameVer.subrevision == 39) return v110; + break; + case 11: + if (GameVer.subrevision == 45) return v111; + if (GameVer.subrevision == 46) return v111b; + break; + case 12: + if (GameVer.subrevision == 49) return v112; + break; + case 13: + if (GameVer.subrevision == 60) return v113c; + if (GameVer.subrevision == 64) return v113d; + break; + } + return -1; +} + + +int GetD2Version(char* PathGameExe) +{ + TFileVersion GameVer = {-1}; + if (! GetAppVersion(PathGameExe, &GameVer)) return -1; + int ver = GetVerD2(GameVer); + return ver; +} \ No newline at end of file diff --git a/Commons/VersionInfo.h b/Commons/VersionInfo.h new file mode 100644 index 0000000..679fdf2 --- /dev/null +++ b/Commons/VersionInfo.h @@ -0,0 +1,30 @@ +#include + +union TFileVersion +{ + __int64 full; + struct { + WORD subrevision; + WORD revision; + WORD minor; + WORD major; + }; + WORD w[4]; +}; + +enum eGameVersion +{ + v109b=0, + v109d, + v110, + v111, + v111b, + v112, + v113c, + v113d, + v114a +}; + +bool GetAppVersion(char* FileName, TFileVersion* VerInfo); // +bool GetD2Path(char* buf, DWORD bufsize); +int GetD2Version(char* PathGameExe); \ No newline at end of file diff --git a/PlugY/BigStash.cpp b/PlugY/BigStash.cpp index 80cbe06..152a24b 100644 --- a/PlugY/BigStash.cpp +++ b/PlugY/BigStash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Use a more big stash @@ -78,16 +79,17 @@ void Install_BigStash() log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n"); // modification of stash grid - mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5); + mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25); MEMC_REF4( D2CompileTxtFile, caller_modifStashGrid); //01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578 //6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653 //6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496 //6FD6BDB4 |. E8 97600200 CALL D2Common.#10244 ; \#10244 //6FDD2CA4 |. E8 97C2FDFF CALL D2Common.#10849 ; \#10849 + //6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037 // modification of stash background - mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C); + mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC); memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash MEMT_REF4( 0x00000104, caller_changeTradeStash); //6FAEC61C |. 68 04010000 PUSH 104 @@ -95,6 +97,7 @@ void Install_BigStash() //6FB249BC |. 68 04010000 PUSH 104 //6FB59D7C |. 68 04010000 PUSH 104 //6FB3CC1C |. 68 04010000 PUSH 104 + //6FB443FC |. 68 04010000 PUSH 104 log_msg("\n"); diff --git a/PlugY/Commands.cpp b/PlugY/Commands.cpp index 722cfed..c61eabc 100644 --- a/PlugY/Commands.cpp +++ b/PlugY/Commands.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -15,6 +16,7 @@ #include "newInterface_CubeListing.h" #include "extraOptions.h" + bool active_Commands=true; bool active_listAllCubeFormula=true; @@ -140,13 +142,15 @@ void updateSharedGold(DWORD goldAmount) int STDCALL commands (char* ptText) { + //return 0; Unit* ptChar = D2GetClientPlayer(); - + //return 0; char command[MAX_CMD_SIZE]; ZeroMemory(command,MAX_CMD_SIZE); + //return 0; strncpy(command,ptText,MAX_CMD_SIZE-1); - strlwr(command); - + //return 0; + strlwr(command); if (!strncmp(command,CMD_RENAME,strlen(CMD_RENAME))) { if (!active_multiPageStash) return 1; @@ -220,7 +224,6 @@ int STDCALL commands (char* ptText) active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana; return 0; } - return 1; } @@ -248,6 +251,19 @@ MANAGESOUNDCHAOSDEBUG: RETN 8 }} +FCT_ASM ( caller_Commands_113d ) + TEST EAX,EAX + JE MANAGESOUNDCHAOSDEBUG + PUSH EDI + CALL commands + TEST EAX,EAX + JNZ MANAGESOUNDCHAOSDEBUG + ADD DWORD PTR SS:[ESP],7 +MANAGESOUNDCHAOSDEBUG: + RETN 8 +}} + + void Install_Commands() { static int isInstalled = false; @@ -261,9 +277,9 @@ void Install_Commands() active_savegame = version_D2Common >= V111; // Run custom commmand - mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6); - memt_byte( 0x83, 0xE8 ); // CALL - MEMT_REF4( 0xC08508C4 , version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); + mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6, B1FD6); + memt_byte( 0x83, 0xE8 ); // CALL + MEMT_REF4( 0xC08508C4 , version_D2Client == V113d ? caller_Commands_113d : version_D2Client >= V111 ? caller_Commands_111 : caller_Commands); //6FB71EE6 . 83C4 08 ADD ESP,8 //6FB71EE7 . 85C0 TEST EAX,EAX //6FB41C16 |. 83C4 08 ADD ESP,8 @@ -272,9 +288,9 @@ void Install_Commands() //6FB36929 |. 85C0 TEST EAX,EAX //6FB20AE6 |. 83C4 08 ADD ESP,8 //6FB20AE9 |. 85C0 TEST EAX,EAX - //6FB20AE6 |. 83C4 08 ADD ESP,8 - //6FB20AE9 |. 85C0 TEST EAX,EAX + //6FB61FD6 |. 83C4 08 ADD ESP,8 + //6FB61FD9 |. 85C0 TEST EAX,EAX log_msg("\n"); isInstalled = true; diff --git a/PlugY/Common.cpp b/PlugY/Common.cpp index 0ee02f4..5bc4137 100644 --- a/PlugY/Common.cpp +++ b/PlugY/Common.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + *Modified by L'Autour. Common functions. @@ -8,9 +9,12 @@ #include "common.h" #include "error.h" #include "d2functions.h" +#include "INIfile.h" +#define sPlugyExt ".\\PlugY\\PlugYLocal.dll" s_shifting shifting; + bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h) {return (x>=x0) && (xy0-h) && (y<=y0);} @@ -22,445 +26,120 @@ void freeMessage(sWinMessage* msg) D2FreeWinMessage(msg); } +//MS C++__fastcall(ecx,edx,) vs Delphi register(eax,edx,ecx) - :( -LPWSTR getString(LPWSTR eng, LPWSTR esp, LPWSTR deu, LPWSTR fra, LPWSTR por, LPWSTR ita, LPWSTR jpn, LPWSTR kor, LPWSTR sin, LPWSTR chi, LPWSTR pol, LPWSTR rus) +typedef int (__stdcall *p_UCS2toUTF8)(char*, int, LPWSTR, int); +p_UCS2toUTF8 _UCS2toUTF8; + +int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc) { - switch(D2GetLang()) - { - case LNG_ENG: return eng; - case LNG_ESP: return esp; - case LNG_DEU: return deu; - case LNG_FRA: return fra; - case LNG_POR: return por; - case LNG_ITA: return ita; - case LNG_JPN: return jpn; - case LNG_KOR: return kor; - case LNG_SIN: return sin; - case LNG_CHI: return chi; - case LNG_POL: return pol; - case LNG_RUS: return rus; - case LNG_DEF: - default: return eng; - } + if (_UCS2toUTF8 == NULL) return 0; + return _UCS2toUTF8(dst, maxdst, src, lensrc); } -#define LANGUAGE(I,ENG,FRA,DEU,ITA,ESP,POL/*,CHI*/) case I : return getString(L##ENG,L##ESP,L##DEU,L##FRA,L##ENG,L##ITA,L##ENG,L##ENG,L##ENG,L##ENG,L##POL,L##ENG) + +typedef int (__stdcall *p_UTF8toUCS2)(LPWSTR, int, char*, int); +p_UTF8toUCS2 _UTF8toUCS2; + +int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc) +{ + if (_UTF8toUCS2 == NULL) return 0; + return _UTF8toUCS2(dst, maxdst, src, lensrc); +} + +typedef const LPWSTR(__fastcall *p_getTypeString)(DWORD, char**); +p_getTypeString _getTypeString; + +const LPWSTR getTypeString(DWORD code, char** IdxStr) +{ + if (_getTypeString == NULL) return L"#"; + return _getTypeString(code, IdxStr); +} + +typedef LPWSTR(__fastcall *p_getTranslatedString)(int); +p_getTranslatedString _getTranslatedString; LPWSTR getTranslatedString(int stringID) { - switch(stringID) - { -/* LANGUAGE2( STR_STATS_UNASSIGN_WITH_LIMIT, - "+Alt: ;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points", -// "+Alt: \x91CD\x5206\x914D;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points", - "+Alt: Dsallocation, +Shift: par %d points,", - "+Alt: Zurcksetzen, +Shift: um %d Punkte", - "+Alt: Rimuovi, +Shift: Assegna %d punti", - "+Alt: Quita, +Shift: por %d puntos", - "+Alt: \37325\20998\37197;,+Shift:%d \28857\25968"); -*/ - LANGUAGE( STR_STATS_UNASSIGN_WITH_LIMIT, - "+Alt: Unassign, +Shift: by %d points", - "+Alt: Dsallocation, +Shift: par %d points", - "+Alt: Zurcksetzen, +Shift: um %d Punkte", - "+Alt: Rimuovi, +Shift: Assegna %d punti", - "+Alt: Quita, +Shift: por %d puntos", - "+Alt: Odejmij, +Shift: %d punktw"); -// "+Alt: ????, +Shift: %d ??"); + if (_getTranslatedString == NULL) return L"#"; + return _getTranslatedString(stringID); +} - LANGUAGE( STR_STATS_UNASSIGN_WITHOUT_LIMIT, - "+Alt: Unassign, +Shift: all remaining points", - "+Alt: Dsallocation, +Shift: Tous les points restants", - "+Alt: Zurcksetzen, +Shift: Alle verbleibenden Punkte", - "+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti", - "+Alt: Quita, +Shift: Todos los puntos restantes", - "+Alt: Odejmij, +Shift: wszystkie pozostale punkty"); -// "+Alt: ????, +Shift: ???"); +typedef int(__stdcall *p_wSprintStringLastGender)(LPWSTR, int, int); +p_wSprintStringLastGender _wSprintStringLastGender; - LANGUAGE( STR_STATS_BASE_MIN, - "Base: %d (Min: %d)", - "Base: %d (Min: %d)", - "Basiswert: %d (Min: %d)", - "Base: %d (Min: %d)", - "Base: %d (Min: %d)", - "Bazowo: %d (Minimum: %d)"); -// "??: %d(??: %d)"); +int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID) +{ + if (_wSprintStringLastGender == NULL) return 0; + return _wSprintStringLastGender(buf, lenbuf, stringID); +} - LANGUAGE( STR_SKILLS_UNASSIGN, - "Un-allocate all skills points", - "Dsalloue tous les points d'aptitudes", - "Alle Fertigkeitspunkte zurcksetzen", - "Rimuovi tutte le abilit", - "Quita todos los puntos de habilidades", - "Rozdaj od nowa wszystkie punkty umiejetnosci"); -// "????????"); +typedef LPWSTR(__fastcall *p_cutStringGender)(LPWSTR); +p_cutStringGender _cutStringGender; - LANGUAGE( STR_STASH_PREVIOUS_PAGE, - "Previous Page (+shift: First Page)", - "Page prcdente (+shift: Premire page)", - "Vorherige Seite (+shift: Erste Seite)", - "Pagina Precedente (+shift: Prima Pagina)", - "Pagina anterior (+shift: Primera Pagina)", - "Poprzednia Strona (+shift: Pierwsza Strona)"); -// "??? (+shift: ??)"); +LPWSTR cutStringGender(LPWSTR str) +{ + if (_cutStringGender == NULL) return str; + return _cutStringGender(str); +} - LANGUAGE( STR_STASH_NEXT_PAGE, - "Next Page (+shift: Last not empty Page)", - "Page suivante (+shift: Dernire page non vide)", - "Nchste Seite (+shift: Letzte nicht leere Seite )", - "Pagina Successiva (+shift: Ultima Pagina non vuota)", - "Pagina Siguiente (+shift: Ultima pagina non vacia)", - "Nastepna Strona (+shift: Ostatnia nie pusta Strona)"); -// "??? (+shift: ?????"); +typedef LPWSTR(__fastcall *p_setMonoString)(LPWSTR); +p_setMonoString _setMonoString; - LANGUAGE( STR_TOGGLE_TO_PERSONAL, - "Toggle to Personal Stash", - "Voir coffre personnel", - "Wechselt zum persnlichen Goldschatz", - "Vai all'Inventario Personale", - "Ver el cofre personal", - "Przejdz do Skrzyni Osobistej"); -// "????????"); - - LANGUAGE( STR_TOGGLE_TO_SHARED, - "Toggle to Shared Stash", - "Voir coffre partag", - "Wechselt zum gemeinsamen Goldschatz", - "Vai all'Inventario Condiviso", - "Ver el cofre compartido", - "Przejdz do Skrzyni Wsplnej"); -// "????????"); - - LANGUAGE( STR_STASH_PREVIOUS_INDEX, - "Previous Index : by %d Pages (+Shift: %d)", - "Index prcdent : par %d pages (+shift: %d)", - "Vorheriger Index: in %d Seiten (+shift: %d)", - "Schermata Precedente : Indietro di %d Pagine (+Shift: %d)", - "Indice anterior : por %d paginas (+shift: %d)", - "Poprzednia Strona : po %d Stron (+Shift: %d)"); -// "???? : %d ? (+Shift:%d)"); - - LANGUAGE( STR_STASH_NEXT_INDEX, - "Next Index : by %d Pages (+shift: %d)", - "Index suivant : par %d pages (+shift: %d)", - "Nchster Index: in %d Seiten (+shift: %d)", - "Schermata Successiva : Avanti di %d Pagine (+shift: %d)", - "Indice siguiente : por %d paginas (+shift: %d)", - "Nastepna Strona : po %d Stron (+shift: %d)"); -// "???? : %d ? (+shift:%d)"); - - LANGUAGE( STR_PUT_GOLD, - "Put Gold", - "Poser de l'Or", - "Gib Gold", - "Immetti Oro", - "Poner oro", - "Zdeponuj Zloto"); -// "????"); - - LANGUAGE( STR_TAKE_GOLD, - "Take Gold", - "Prendre de l'Or", - "Nehme Gold", - "Ritira Oro", - "Tomar oro", - "Wyplac zloto"); -// "????"); - - LANGUAGE( STR_PERSONAL_PAGE_NUMBER, - "Personal Page n%u", - "Page perso n%u", - "Persnliche Seite n%u", - "Pagina Personale n%u", - "Pagina personal n%u", - "Strona Osobista n%u"); -// "????? n%u"); - - LANGUAGE( STR_SHARED_PAGE_NUMBER, - "Shared Page n%u", - "Page partage n%u", - "Gemeinsame Seite n%u", - "Pagina Condivisa n%u", - "Pagina personal n%u", - "Strona Wsplna n%u"); -// "????? n%u"); - - LANGUAGE( STR_NO_SELECTED_PAGE, - "No selected page", - "Aucune page slectionne", - "Keine ausgewhlte Seite", - "Nessuna pagina selezionata", - "Ninguna pagina seleccionada", - "Nie zaznaczono strony"); -// "????"); - - LANGUAGE( STR_SHARED_GOLD_QUANTITY, - "Shared Gold : %u", - "Or partag : %u", - "Gemeinsamen Gold : %u", - "Oro Condiviso : %u", - "Oro compartido : %u", - "Wsplne Zloto : %u"); -// "????: %u"); - - LANGUAGE( STR_PREVIOUS_PAGE, - "Previous Page", - "Page prcdente", - "Vorherige Seite", - "Pagina Precedente", - "Pagina anterior", - "Poprzednia Strona"); -// "???"); - - LANGUAGE( STR_NEXT_PAGE, - "Next Page", - "Page suivante", - "Nchste Seite", - "Pagina Successiva", - "Pagina siguiente", - "Nastepna Strona"); -// "???"); - - default : return L""; - } +LPWSTR setMonoString(LPWSTR str) +{ + if (_setMonoString == NULL) return str; + return _setMonoString(str); } -/*=================================================================*/ +typedef bool(__fastcall *p_initTranslatedString)(int); -const char* SNONE=""; -const char* c_shie[3]={"Shield (Not Class Specific)",SNONE,SNONE}; -const char* c_tors[3]={"Body Armor",SNONE,SNONE}; -const char* c_gold[3]={"Gold",SNONE,SNONE}; -const char* c_bowq[3]={"Arrow",SNONE,SNONE}; -const char* c_xboq[3]={"Bolt",SNONE,SNONE}; -const char* c_play[3]={"Ear",SNONE,SNONE}; -const char* c_herb[3]={"Herb",SNONE,SNONE}; -const char* c_poti[3]={"Potion",SNONE,SNONE}; -const char* c_ring[3]={"Ring",SNONE,SNONE}; -const char* c_elix[3]={"Elixir",SNONE,SNONE}; -const char* c_amul[3]={"Amulet",SNONE,SNONE}; -const char* c_char[3]={"Charm",SNONE,SNONE}; -const char* c_boot[3]={"Boot",SNONE,SNONE}; -const char* c_glov[3]={"Glove",SNONE,SNONE}; -const char* c_book[3]={"Book",SNONE,SNONE}; -const char* c_belt[3]={"Belt",SNONE,SNONE}; -const char* c_gem[3]={"Gem",SNONE,SNONE}; -const char* c_torc[3]={"Torch",SNONE,SNONE}; -const char* c_scro[3]={"Scroll",SNONE,SNONE}; -const char* c_scep[3]={"Scepter",SNONE,SNONE}; -const char* c_wand[3]={"Wand",SNONE,SNONE}; -const char* c_staf[3]={"Staff",SNONE,SNONE}; -const char* c_bow[3]={"Bow",SNONE,SNONE}; -const char* c_axe[3]={"Axe",SNONE,SNONE}; -const char* c_club[3]={"Club",SNONE,SNONE}; -const char* c_swor[3]={"Sword",SNONE,SNONE}; -const char* c_hamm[3]={"Hammer",SNONE,SNONE}; -const char* c_knif[3]={"Knife",SNONE,SNONE}; -const char* c_spea[3]={"Spear",SNONE,SNONE}; -const char* c_pole[3]={"Polearm",SNONE,SNONE}; -const char* c_xbow[3]={"Crossbow",SNONE,SNONE}; -const char* c_mace[3]={"Mace",SNONE,SNONE}; -const char* c_helm[3]={"Helm",SNONE,SNONE}; +HINSTANCE PlugyLocalLib = NULL; -const char* c_tpot[3]={"Missile Potion",SNONE,SNONE}; -const char* c_ques[3]={"Quest Item",SNONE,SNONE}; -const char* c_body[3]={"Body Part",SNONE,SNONE}; -const char* c_key[3]={"Key",SNONE,SNONE}; -const char* c_tkni[3]={"Throwing Knife",SNONE,SNONE}; -const char* c_taxe[3]={"Throwing Axe",SNONE,SNONE}; -const char* c_jave[3]={"Javelin",SNONE,SNONE}; -const char* c_weap[3]={"Weapon",SNONE,SNONE}; -const char* c_mele[3]={"Melee Weapon",SNONE,SNONE}; -const char* c_miss[3]={"Missile Weapon",SNONE,SNONE}; -const char* c_thro[3]={"Throwing Weapon",SNONE,SNONE}; -const char* c_comb[3]={"Combo Weapon",SNONE,SNONE}; -const char* c_armo[3]={"Armor",SNONE,SNONE}; -const char* c_shld[3]={"Any Shield",SNONE,SNONE}; -const char* c_misc[3]={"Miscellaneous",SNONE,SNONE}; -const char* c_sock[3]={"Socket Filler",SNONE,SNONE}; -const char* c_seco[3]={"Second Hand Item",SNONE,SNONE}; -const char* c_rod[3]={"Staves And Rods",SNONE,SNONE}; -const char* c_misl[3]={"Missile",SNONE,SNONE}; -const char* c_blun[3]={"Blunt",SNONE,SNONE}; - -const char* c_jewl[3]={"Jewel",SNONE,SNONE}; -const char* c_clas[3]={"Class Specific",SNONE,SNONE}; -const char* c_amaz[3]={"Amazon Item",SNONE,SNONE}; -const char* c_barb[3]={"Barbarian Item",SNONE,SNONE}; -const char* c_necr[3]={"Necromancer Item",SNONE,SNONE}; -const char* c_pala[3]={"Paladin Item",SNONE,SNONE}; -const char* c_sorc[3]={"Sorceress Item",SNONE,SNONE}; -const char* c_assn[3]={"Assassin Item",SNONE,SNONE}; -const char* c_drui[3]={"Druid Item",SNONE,SNONE}; -const char* c_h2h[3]={"Claw",SNONE,SNONE}; -const char* c_orb[3]={"Orb",SNONE,SNONE}; -const char* c_head[3]={"Voodoo Heads",SNONE,SNONE}; -const char* c_ashd[3]={"Paladin Shield",SNONE,SNONE}; -const char* c_phlm[3]={"Barbarian Helm",SNONE,SNONE}; -const char* c_pelt[3]={"Druid Helm",SNONE,SNONE}; -const char* c_cloa[3]={"Cloak",SNONE,SNONE}; -const char* c_rune[3]={"Rune",SNONE,SNONE}; -const char* c_circ[3]={"Circlet",SNONE,SNONE}; -const char* c_hpot[3]={"Healing Potion",SNONE,SNONE}; -const char* c_mpot[3]={"Mana Potion",SNONE,SNONE}; -const char* c_rpot[3]={"Rejuvenation potion",SNONE,SNONE}; -const char* c_spot[3]={"Stamina Potion",SNONE,SNONE}; -const char* c_apot[3]={"Antidote Potion",SNONE,SNONE}; -const char* c_wpot[3]={"Thawing Potion",SNONE,SNONE}; -const char* c_scha[3]={"Small Charm",SNONE,SNONE}; -const char* c_mcha[3]={"Large Charm",SNONE,SNONE}; -const char* c_lcha[3]={"Grand Charm",SNONE,SNONE}; -const char* c_abow[3]={"Amazon Bow",SNONE,SNONE}; -const char* c_aspe[3]={"Amazon Spear",SNONE,SNONE}; -const char* c_ajav[3]={"Amazon Javelin",SNONE,SNONE}; -const char* c_h2h2[3]={"Assassin Claw",SNONE,SNONE}; -const char* c_mboq[3]={"Magic Arrow",SNONE,SNONE}; -const char* c_mxbq[3]={"Magic Bolt",SNONE,SNONE}; -const char* c_gem0[3]={"Chipped Gem",SNONE,SNONE}; -const char* c_gem1[3]={"Flawed Gem",SNONE,SNONE}; -const char* c_gem2[3]={"Normal Gem",SNONE,SNONE}; -const char* c_gem3[3]={"Flawless Gem",SNONE,SNONE}; -const char* c_gem4[3]={"Perfect Gem",SNONE,SNONE}; -const char* c_gema[3]={"Amethyst",SNONE,SNONE}; -const char* c_gemd[3]={"Diamond",SNONE,SNONE}; -const char* c_geme[3]={"Emerald",SNONE,SNONE}; -const char* c_gemr[3]={"Ruby",SNONE,SNONE}; -const char* c_gems[3]={"Sapphire",SNONE,SNONE}; -const char* c_gemt[3]={"Topaz",SNONE,SNONE}; -const char* c_gemz[3]={"Skull",SNONE,SNONE}; - -const char* getTypeString (DWORD code) +bool initLocaleStrings() { - DWORD lang = 0;//D2GetLang(); - if ((lang == LNG_FRA) || (lang == LNG_DEU)) lang--; - else lang = 0; - switch (code) - { - case BIN('s','h','i','e') : return c_shie[0]; - case BIN('t','o','r','s') : return c_tors[0]; - case BIN('g','o','l','d') : return c_gold[0]; - case BIN('b','o','w','q') : return c_bowq[0]; - case BIN('x','b','o','q') : return c_xboq[0]; - case BIN('p','l','a','y') : return c_play[0]; - case BIN('h','e','r','b') : return c_herb[0]; - case BIN('p','o','t','i') : return c_poti[0]; - case BIN('r','i','n','g') : return c_ring[0]; - case BIN('e','l','i','x') : return c_elix[0]; - case BIN('a','m','u','l') : return c_amul[0]; - case BIN('c','h','a','r') : return c_char[0]; - case BIN('b','o','o','t') : return c_boot[0]; - case BIN('g','l','o','v') : return c_glov[0]; - case BIN('b','o','o','k') : return c_book[0]; - case BIN('b','e','l','t') : return c_belt[0]; - case BIN('g','e','m',' ') : return c_gem[0]; - case BIN('t','o','r','c') : return c_torc[0]; - case BIN('s','c','r','o') : return c_scro[0]; - case BIN('s','c','e','p') : return c_scep[0]; - case BIN('w','a','n','d') : return c_wand[0]; - case BIN('s','t','a','f') : return c_staf[0]; - case BIN('b','o','w',' ') : return c_bow[0]; - case BIN('a','x','e',' ') : return c_axe[0]; - case BIN('c','l','u','b') : return c_club[0]; - case BIN('s','w','o','r') : return c_swor[0]; - case BIN('h','a','m','m') : return c_hamm[0]; - case BIN('k','n','i','f') : return c_knif[0]; - case BIN('s','p','e','a') : return c_spea[0]; - case BIN('p','o','l','e') : return c_pole[0]; - case BIN('x','b','o','w') : return c_xbow[0]; - case BIN('m','a','c','e') : return c_mace[0]; - case BIN('h','e','l','m') : return c_helm[0]; - case BIN('t','p','o','t') : return c_tpot[0]; - case BIN('q','u','e','s') : return c_ques[0]; - case BIN('b','o','d','y') : return c_body[0]; - case BIN('k','e','y',' ') : return c_key[0]; - case BIN('t','k','n','i') : return c_tkni[0]; - case BIN('t','a','x','e') : return c_taxe[0]; - case BIN('j','a','v','e') : return c_jave[0]; - case BIN('w','e','a','p') : return c_weap[0]; - case BIN('m','e','l','e') : return c_mele[0]; - case BIN('m','i','s','s') : return c_miss[0]; - case BIN('t','h','r','o') : return c_thro[0]; - case BIN('c','o','m','b') : return c_comb[0]; - case BIN('a','r','m','o') : return c_armo[0]; - case BIN('s','h','l','d') : return c_shld[0]; - case BIN('m','i','s','c') : return c_misc[0]; - case BIN('s','o','c','k') : return c_sock[0]; - case BIN('s','e','c','o') : return c_seco[0]; - case BIN('r','o','d',' ') : return c_rod[0]; - case BIN('m','i','s','l') : return c_misl[0]; - case BIN('b','l','u','n') : return c_blun[0]; - case BIN('j','e','w','l') : return c_jewl[0]; - case BIN('c','l','a','s') : return c_clas[0]; - case BIN('a','m','a','z') : return c_amaz[0]; - case BIN('b','a','r','b') : return c_barb[0]; - case BIN('n','e','c','r') : return c_necr[0]; - case BIN('p','a','l','a') : return c_pala[0]; - case BIN('s','o','r','c') : return c_sorc[0]; - case BIN('a','s','s','n') : return c_assn[0]; - case BIN('d','r','u','i') : return c_drui[0]; - case BIN('h','2','h',' ') : return c_h2h[0]; - case BIN('h','2','h','2') : return c_h2h2[0]; - case BIN('o','r','b',' ') : return c_orb[0]; - case BIN('h','e','a','d') : return c_head[0]; - case BIN('a','s','h','d') : return c_ashd[0]; - case BIN('p','h','l','m') : return c_phlm[0]; - case BIN('p','e','l','t') : return c_pelt[0]; - case BIN('c','l','o','a') : return c_cloa[0]; - case BIN('r','u','n','e') : return c_rune[0]; - case BIN('c','i','r','c') : return c_circ[0]; - case BIN('h','p','o','t') : return c_hpot[0]; - case BIN('m','p','o','t') : return c_mpot[0]; - case BIN('r','p','o','t') : return c_rpot[0]; - case BIN('s','p','o','t') : return c_spot[0]; - case BIN('a','p','o','t') : return c_apot[0]; - case BIN('w','p','o','t') : return c_wpot[0]; - case BIN('s','c','h','a') : return c_scha[0]; - case BIN('m','c','h','a') : return c_mcha[0]; - case BIN('l','c','h','a') : return c_lcha[0]; - case BIN('a','b','o','w') : return c_abow[0]; - case BIN('a','s','p','e') : return c_aspe[0]; - case BIN('a','j','a','v') : return c_ajav[0]; - case BIN('m','b','o','q') : return c_mboq[0]; - case BIN('m','x','b','q') : return c_mxbq[0]; - case BIN('g','e','m','0') : return c_gem0[0]; - case BIN('g','e','m','1') : return c_gem1[0]; - case BIN('g','e','m','2') : return c_gem2[0]; - case BIN('g','e','m','3') : return c_gem3[0]; - case BIN('g','e','m','4') : return c_gem4[0]; - case BIN('g','e','m','a') : return c_gema[0]; - case BIN('g','e','m','d') : return c_gemd[0]; - case BIN('g','e','m','e') : return c_geme[0]; - case BIN('g','e','m','r') : return c_gemr[0]; - case BIN('g','e','m','s') : return c_gems[0]; - case BIN('g','e','m','t') : return c_gemt[0]; - case BIN('g','e','m','z') : return c_gemz[0]; - default: return NULL; - } + p_initTranslatedString initTranslatedString; + + PlugyLocalLib = LoadLibrary(sPlugyExt); + + if (PlugyLocalLib != NULL) + { + log_msg("Loading PlugYLocal.dll\n"); + initTranslatedString = (p_initTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall initTranslatedString"); + if (NULL != initTranslatedString) + { + log_msg("Loading local strings from PlugYLocal.ini\n"); + + _UCS2toUTF8 = (p_UCS2toUTF8)GetProcAddress(PlugyLocalLib, "__stdcall UCS2toUTF8"); + _UTF8toUCS2 = (p_UTF8toUCS2)GetProcAddress(PlugyLocalLib, "__stdcall UTF8toUCS2"); + + _getTypeString = (p_getTypeString)GetProcAddress(PlugyLocalLib, "__fastcall getTypeString"); + _cutStringGender = (p_cutStringGender)GetProcAddress(PlugyLocalLib, "__fastcall cutStringGender"); + _wSprintStringLastGender = (p_wSprintStringLastGender)GetProcAddress(PlugyLocalLib, "__stdcall wSprintStringLastGender"); + _setMonoString = (p_setMonoString)GetProcAddress(PlugyLocalLib, "__fastcall setMonoString"); + + _getTranslatedString = (p_getTranslatedString)GetProcAddress(PlugyLocalLib, "__fastcall getTranslatedString"); + if ((NULL != _getTranslatedString) && + (NULL != _getTypeString)) + { + initTranslatedString(D2GetLang()); + return true; + } + log_msg("Failed loading local strings\n"); + } + + if (FreeLibrary(PlugyLocalLib)) + { + PlugyLocalLib = NULL; + } + } else log_msg("Failed loading PlugYLocal.dll\n"); + return false; } -char* getTypeAString (WORD id, char* lpText, DWORD size) +void freeLocaleStrings() { - ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id); - if (!itemTypeData) - { - strncpy(lpText, "Bad Type", size); - return lpText; - } - - const char* string = getTypeString(itemTypeData->code); - if (!string) - { - struct { - DWORD code; - BYTE zero; - } code; - code.code = itemTypeData->code; - code.zero = 0; - strncpy(lpText, (char*)&code, size); - } else - strncpy(lpText, string, size); - - return lpText; + if (PlugyLocalLib == NULL) return; + FreeLibrary(PlugyLocalLib); } LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size) @@ -468,22 +147,35 @@ LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size) ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id); if (!itemTypeData) { - mbstowcs(lpText, "Bad Type", size); + wcsncpy(lpText, L"Bad Type", size); return lpText; } - const char* string = getTypeString(itemTypeData->code); + char* idxstr; + LPWSTR string = getTypeString(itemTypeData->code, &idxstr); + + if (idxstr) + { + LPWSTR string2 = D2GetStringFromString(idxstr); + if (string2) + { + wcsncpy(lpText, string2, size); + return lpText; + } + } if (!string) { struct { DWORD code; BYTE zero; - } code; + } code; code.code = itemTypeData->code; code.zero = 0; - mbstowcs(lpText, (char*)&code, size); + UTF8toUCS2(lpText,size, (char*)&code, 0xFFFF); } else - mbstowcs(lpText, string, size); - + wcsncpy(lpText, string, size); return lpText; } + + + /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/D2functions.cpp b/PlugY/D2functions.cpp index 753de83..4203e21 100644 --- a/PlugY/D2functions.cpp +++ b/PlugY/D2functions.cpp @@ -1,5 +1,6 @@ /*================================================ File created by Yohann NICOLAS. + *Add support 1.13d by L'Autour. This file implements some common and useful function related to some Diablo II mechanisms. @@ -16,9 +17,9 @@ #define E2S(F, A, R, N, P) T##N N; #define E2F(F, A, R, N, P) T##N N; #define E2C(F, A, T, N) T* pt##N; -#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N; -#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N; -#define C7(Z, A,B,C,D,E,F,G, T, N) T* pt##N; +#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N; +#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) T##N N; +#define C7(Z, A,B,C,D,E,F,G,H, T, N) T* pt##N; #include "../Commons/D2Funcs.h" DataTables* SgptDataTables; @@ -616,12 +617,12 @@ bool initD2functions() #define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A); #define E2F(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A); #define E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A); - #define F7(X, Z, A,B,C,D,E,F,G, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113? G : (version_##Z == V112? F : version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A))))))); - #define A7(X, Z, A,B,C,D,E,F,G, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G); - #define C7(Z, A,B,C,D,E,F,G, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G); + #define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A))))))))); + #define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G,H); + #define C7(Z, A,B,C,D,E,F,G,H, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G,H); #include "../Commons/D2Funcs.h" - SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C); + SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0); if (version_D2Common < V110) { D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09 @@ -915,10 +916,10 @@ bool initD2functions() D2GetClientPlayer = D2GetClientPlayer_111; D2GetRealItem = D2GetRealItem_111; D2CleanStatMouseUp = D2CleanStatMouseUp_111; - StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC); - StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0); - StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8); - StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC); + StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224); + StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228); + StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240); + StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244); } else { D2SendToServer = (TD2SendToServer) D2SendToServer_1XX; D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX; @@ -946,16 +947,16 @@ bool initD2functions() //////////////// STRUCTURE MANAGEMENT //////////////// - + //L'Autour - ?????? // shifting.ptPYPlayerData = V7(D2Common,118,118,F4,F4,F4,F4,F4); - shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49)); - shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14); - shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80); - shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8); - shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60); - shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8); - shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34); - shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00); + shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49,49)); + shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14,14); + shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80,80); + shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8,1A8); + shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60,60); + shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8,A8); + shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34,34); + shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00,00); return true; } diff --git a/PlugY/D2wrapper.cpp b/PlugY/D2wrapper.cpp index 7552405..649e5e0 100644 --- a/PlugY/D2wrapper.cpp +++ b/PlugY/D2wrapper.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. @file D2wrapper.cpp @brief Main Diablo II extra DLL handler. @@ -31,26 +32,27 @@ #include "uberQuest.h" // Install_UberQuest() #include "extraOptions.h" // Install_AlwaysRegenMapInSP() #include "language.h" // Install_LanguageManagement() +#include "../Commons/VersionInfo.h" - -int version_SmackW32=V113; -int version_D2Common=V113; -int version_ijl11=V113; -int version_D2Gdi=V113; -int version_D2Win=V113; -int version_D2sound=V113; -int version_D2MCPCLI=V113; -int version_D2Launch=V113; -int version_D2gfx=V113; -int version_D2Client=V113; -int version_D2Net=V113; -int version_D2Lang=V113; -int version_D2Game=V113; -int version_D2CMP=V113; -int version_Bnclient=V113; -int version_Fog=V113; -int version_Storm=V113; - +//------------------------- +int version_SmackW32=V113d; +int version_D2Common=V113d; +int version_ijl11=V113d; +int version_D2Gdi=V113d; +int version_D2Win=V113d; +int version_D2sound=V113d; +int version_D2MCPCLI=V113d; +int version_D2Launch=V113d; +int version_D2gfx=V113d; +int version_D2Client=V113d; +int version_D2Net=V113d; +int version_D2Lang=V113d; +int version_D2Game=V113d; +int version_D2CMP=V113d; +int version_Bnclient=V113d; +int version_Fog=V113d; +int version_Storm=V113d; +//------------------------- DWORD offset_SmackW32=NULL; DWORD offset_D2Common=NULL; @@ -375,6 +377,7 @@ bool initD2version() } */ +/* void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113, const char * filename) { log_msg("version of %s\t",filename); @@ -432,6 +435,47 @@ bool initD2version() log_msg("\n\n"); return true; } +*/ + +const char sD2Ver[8][7] = {{"v1.09b"},{"v1.09d"},{"v1.10 "},{"v1.11 "},{"v1.11b"},{"v1.12 "},{"v1.13c"},{"v1.13d"}}; + +bool initD2version() +{ + char currentpath[MAX_PATH]; + if (! GetD2Path(currentpath, MAX_PATH)) + { + log_msg("Path to Game.exe not found"); + return false; + } + log_msg("***** Get Game.exe version *****\n"); + + int ver = GetD2Version(currentpath); + if (ver == -1) return false; + //-------------------- + version_SmackW32=ver; + version_D2Common=ver; + version_ijl11=ver; + version_D2Gdi=ver; + version_D2Win=ver; + version_D2sound=ver; + version_D2MCPCLI=ver; + version_D2Launch=ver; + version_D2gfx=ver; + version_D2Client=ver; + version_D2Net=ver; + version_D2Lang=ver; + version_D2Game=ver; + version_D2CMP=ver; + version_Bnclient=ver; + version_Fog=ver; + version_Storm=ver; + //------------------- + log_msg("version Game.exe - "); + log_msg(sD2Ver[ver]); + log_msg("\n"); + + return true; +} //////////////////////////////////// EXPORTS FUNCTIONS //////////////////////////////////// extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) @@ -445,7 +489,12 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) loadD2Libraries(); - if (!initD2version()) return NULL; + if (!initD2version()) + { + log_msg("wrong G ame.exe version\n"); + return NULL; + } + if (!initD2functions()) return NULL; @@ -539,6 +588,10 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName) unhookLibraries(); + log_msg("\n*****Loading locale strings.*****\n"); + initLocaleStrings(); + log_msg("\n\n\n"); + initCustomLibraries(); log_msg("***** ENTERING DIABLO II *****\n\n" ); @@ -555,6 +608,7 @@ extern "C" __declspec(dllexport) bool __stdcall Release() log_msg("\n***** ENDING DIABLO II *****\n\n" ); freeCustomLibraries(); + freeLocaleStrings(); freeD2Libraries(); return true; } diff --git a/PlugY/ExtraOptions.cpp b/PlugY/ExtraOptions.cpp index e8d6cc3..44b0500 100644 --- a/PlugY/ExtraOptions.cpp +++ b/PlugY/ExtraOptions.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. More little options. @@ -26,7 +27,9 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem) { if (onRealm && (selectModParam==MOD_NO)) return; WCHAR text[0x50]; - swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem)); + //swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem)); + swprintf(text, getTranslatedString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem)); + wcscat(text,L"\n"); D2SetColorPopup(text,WHITE); wcscat(popup,text); } @@ -139,17 +142,18 @@ void Install_DisplayItemLevel() log_msg("Patch D2Client for display item popup. (DisplayPopup)\n"); // print the text in the final buffer - mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0); + mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590); memt_byte( 0x68 , 0xE8); - MEMT_REF4( 0x100, version_D2Client >= V113 ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); + MEMT_REF4( 0x100, version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9); //6FAE38A1 . 68 00010000 PUSH 100 //6FB5DD0A |. 68 00010000 PUSH 100 //6FB289DA |. 68 00010000 PUSH 100 //6FB5E0AA |. 68 00010000 PUSH 100 //6FB441C0 |. 68 00010000 PUSH 100 + //6FB48590 |. 68 00010000 PUSH 100 // print the text in the final buffer (for set items) - mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3); + mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3); memt_byte( 0x68 , 0xE8); MEMT_REF4( 0x100, version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9); //6FAE27BE . 68 00010000 PUSH 100 @@ -157,6 +161,7 @@ void Install_DisplayItemLevel() //6FB27773 |. 68 00010000 PUSH 100 //6FB5CEB3 |. 68 00010000 PUSH 100 //6FB42FE3 |. 68 00010000 PUSH 100 + //6FB473B3 |. 68 00010000 PUSH 100 log_msg("\n"); @@ -208,12 +213,12 @@ void Install_SendPlayersCommand() log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n"); - infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394); + infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394, 11D1DC); if ( version_D2Client >= V110 ) - msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00); + msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C); // Set nb Player to default - mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2);//6FB1C7B7-6FAA0000 + mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2);//6FB1C7B7-6FAA0000 MEMJ_REF4( D2GetResolution , caller_SendPlayersCommand); //6FB2723A |. E8 7D8E0300 CALL //6FB265BA |. E8 7D8E0300 CALL @@ -222,6 +227,7 @@ void Install_SendPlayersCommand() //6FB16A01 |. E8 AA65FAFF CALL //6FB40161 |. E8 1ECFF7FF CALL //6FB739F1 |. E8 B896F4FF CALL + //6FACD3F1 |. E8 EAFBFEFF CALL log_msg("\n"); @@ -239,13 +245,14 @@ void Install_AlwaysRegenMapInSP() log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n"); // Always regenerate maps in Single player - mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE); + mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE, 26D7E); memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368 //6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93 //01FE235D |. 74 09 JE SHORT D2Game.01FE2368 //01F9966D |. 74 09 JE SHORT D2Game.01F99678 //6FC3E1FE |. 74 09 JE SHORT D2Game.6FC3E209 //6FD0D3BE |. 74 09 JE SHORT D2Game.6FD0D3C9 + //6FC46D7E |. 74 09 JE SHORT D2Game.6FC46D89 log_msg("\n"); @@ -262,11 +269,12 @@ void Install_RunLODs() log_msg("Patch D2gfx for launch any number of Diablo II game in the same computer. (RunLODs)\n"); // execute if it's our packet else continue - mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF); + mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF, B6B0); memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6 //6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6 //6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996 //6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606 + //6FA8B6B0 |. 74 45 JE SHORT D2gfx.6FA8B6F7 log_msg("\n"); @@ -381,9 +389,9 @@ void Install_AlwaysDisplayLifeMana() log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n"); - if ( version_D2Client >= V113 ) + if ( version_D2Client >= V113c ) { - mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A); + mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA); memt_byte( 0x0F , 0x90); memt_byte( 0x8C , 0xE8); MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113); @@ -393,10 +401,13 @@ void Install_AlwaysDisplayLifeMana() //6FAD7659 |. A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] //6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711 + //-- + //6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1 + } else { // Always display life. - mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000); + mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000); memt_byte( 0xA1 , 0xE8); MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife); //6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60] @@ -406,13 +417,13 @@ void Install_AlwaysDisplayLifeMana() // Always display mana. - if ( version_D2Client >= V113 ) + if ( version_D2Client >= V113c ) { //mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711); //memt_byte( 0x8B , 0x90); //memt_byte( 0x0D , 0xE8); //MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113); - mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C); + mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC); memt_byte( 0xA1 , 0xE8); MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113); //6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C] @@ -426,10 +437,12 @@ void Install_AlwaysDisplayLifeMana() //6FAD77CA |. 5B POP EBX //6FAD77CB |. 81C4 28030000 ADD ESP,328 //6FAD77D1 \. C3 RETN + //-- + //6FB1D7BC |> A1 3870BA6F MOV EAX,DWORD PTR DS:[6FB8BC4C] } else if ( version_D2Client >= V110 ) { - mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000); + mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000, 0000); memt_byte( 0x5F , 0xE8); MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana); memt_byte( 0xC4 , 0x90); // NOP @@ -454,7 +467,7 @@ void Install_AlwaysDisplayLifeMana() //6FB3181F |. 81C4 5C020000 ADD ESP,25C //6FB31825 |. C3 RETN } else { - mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xE9 , 0xE8); MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9); //6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0 @@ -539,23 +552,25 @@ void Install_DisplayBaseStatsValue() log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n"); // Always print stat button images. - mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5); + mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 - memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) ); + memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( 0x24, 0x90 ); // NOP - memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] + //6FB6F955 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] - mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E); + mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); MEMJ_REF4( D2PrintImage, caller_displayBaseStatsValue); //6FB32C53 . E8 82A3F8FF CALL //6FB396D3 . E8 D238F8FF CALL //6FB1B636 . E8 431AFAFF CALL //6FB6D23D |. E8 54FEF4FF |CALL + //6FB6F9DD |. E8 54FEF4FF |CALL log_msg("\n"); @@ -583,13 +598,14 @@ void Install_LadderRunewords() log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n"); - mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2); + mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782); MEMC_REF4( D2CompileTxtFile, compileRunesTxt); //01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578 //6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653 //6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496 //6FDAD491 |. E8 BA49FEFF CALL D2Common.#10244 ; \#10244 //6FDC24B1 |. E8 8ACAFEFF CALL D2Common.#10849 ; \#10849 + //6FDB3781 |. E8 5A93FAFF CALL D2Common.#10037 ; \#10037 log_msg("\n"); @@ -607,7 +623,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill() log_msg("Patch D2Game for enabled the opening of Cow Portal when player have already kill the cow king in that difficulty. (EnabledCowPortalWhenCowKingWasKill)\n"); - mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508); + mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508, EBE8); memt_byte( 0x85 , 0x33); // XOR EAX,EAX //6FC8DFF7 . 85C0 TEST EAX,EAX //6FC8E457 . 85C0 TEST EAX,EAX @@ -616,6 +632,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill() //01FEDB68 |. 85C0 TEST EAX,EAX //6FC95C68 |. 85C0 TEST EAX,EAX //6FC87508 |. 85C0 TEST EAX,EAX + //6FC2EBE8 |. 85C0 TEST EAX,EAX log_msg("\n"); diff --git a/PlugY/GlobalVariable.cpp b/PlugY/GlobalVariable.cpp index a302a26..7d7d29d 100644 --- a/PlugY/GlobalVariable.cpp +++ b/PlugY/GlobalVariable.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -101,7 +102,7 @@ void Install_VariableOnRealm() log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n"); // click on Battle.net button - mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295); + mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295, 11C65); memt_byte( 0x81, 0xE8 ); // CALL MEMT_REF4( 0x000400EC, caller_BnetBtnPress); memt_byte( 0x00, 0x90 ); // NOP @@ -114,7 +115,7 @@ void Install_VariableOnRealm() //6FA1EFFC . B8 01000000 MOV EAX,1 // click on TCP/IP button - mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E); + mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E); if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110) { memt_byte( 0xBD, 0xE8 ); // CALL @@ -126,7 +127,7 @@ void Install_VariableOnRealm() } // click on SinglePlayer button - mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36); + mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36, A906); memt_byte( 0xBA, 0xE8 ); // CALL MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress); //6FA4B726 . BA 00040000 MOV EDX,400 @@ -135,7 +136,7 @@ void Install_VariableOnRealm() { log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n"); //Bug crash ptClient search fix (for Megalixir Mod). - mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x39 ,0xE8); MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug); memt_byte( 0xC1 ,0x90); diff --git a/PlugY/InfinityStash.cpp b/PlugY/InfinityStash.cpp index 97f80a1..f30c0c2 100644 --- a/PlugY/InfinityStash.cpp +++ b/PlugY/InfinityStash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Gestion of the infinity and shared Stash. @@ -80,7 +81,7 @@ Stash* newStash(DWORD id) d2_assert( id == 0xFFFFFFFF , "trop de stash", __FILE__, __LINE__); Stash* stash = (Stash*)malloc(sizeof(Stash));//D2AllocMem(memPool, sizeof(Stash),__FILE__,__LINE__,0); - d2_assert(!stash , "pb de gnration de stash", __FILE__, __LINE__); + d2_assert(!stash , "pb de generation de stash", __FILE__, __LINE__); ZeroMemory(stash, sizeof(Stash)); stash->id = id; @@ -804,42 +805,45 @@ void Install_MultiPageStash() log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n"); // Cannot put 2 items carry1 in inventory - mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3); + mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013); MEMJ_REF4( D2ItemSetPage , version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit); //6FC8504F . E8 94670900 CALL //01FD7CA2 . E8 6329FBFF CALL //01F9FE62 . E8 47A8FDFF CALL //6FCB9B02 . E8 9709F7FF CALL //6FCEF1E2 . E8 47B7F3FF CALL + //6FC8B012 . E8 13F7F9FF CALL // Cannot put 2 items carry1 in inventory by swapping - mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8); + mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78); MEMJ_REF4( D2ItemGetPage , version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap); //6FC858D8 . E8 175F0900 CALL //01FD8967 . E8 8E1DFBFF CALL //01FA10E7 . E8 9A96FDFF CALL //6FCBB6E7 . E8 CAEDF6FF CALL //6FCF10C7 . E8 F895F3FF CALL + //6FC8BC77 . E8 22E9F9FF CALL if ( version_D2Game >= V111 ) { // Cannot put 2 items carry1 in inventory when drop cube - mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75); + mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15); MEMJ_REF4( D2CanPutItemInInv , caller_carry1LimitWhenDrop_111); //01FBD934 |. E8 5BD3FCFF |CALL //01FB9FD4 |. E8 3912FCFF |CALL //6FC37AD4 |. E8 0535FFFF |CALL //6FCF7B74 |. E8 232FF3FF |CALL + //6FCD7B14 |. E8 7D32F5FF |CALL } else { // Cannot put 2 items carry1 in inventory when drop cube - mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xBA ,0xE8); MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop); //6FC44341 |. BA 06080000 |MOV EDX,806 } // Verif only carry1 out of stash page when pick up an item - mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B); + mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B); memt_byte( 0x8B ,0xE8); MEMT_REF4( version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash); memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90); @@ -853,6 +857,8 @@ void Install_MultiPageStash() //6FC3209F |. 85F6 |TEST ESI,ESI //6FCF211B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] //6FCF211F |. 85F6 |TEST ESI,ESI + //6FCD301B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C] + //6FCD301F |. 85F6 |TEST ESI,ESI log_msg("\n"); } diff --git a/PlugY/Interface_Skills.cpp b/PlugY/Interface_Skills.cpp index a3a99f0..20177b6 100644 --- a/PlugY/Interface_Skills.cpp +++ b/PlugY/Interface_Skills.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -36,7 +37,7 @@ void STDCALL printSkillsPageBtns() if ( isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY())) { - LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN); + LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN); D2PrintPopup(popupText, getXSkillBtn()+getLSkillBtn()/2, getYSkillBtn()-getHSkillBtn(), 0, 1); } } @@ -140,7 +141,7 @@ void Install_InterfaceSkills() log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n"); // Print new buttons images - mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20); + mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380); memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns if ( version_D2Client >= V111 ) { MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111); @@ -164,6 +165,11 @@ void Install_InterfaceSkills() //6FB27F22 |. 5B POP EBX //6FB27F23 \. C3 RETN //6FB27F24 CC INT3 + //6FADF380 |> 5F POP EDI + //6FADF381 |. 5E POP ESI + //6FADF382 |. 5B POP EBX + //6FADF383 \. C3 RETN + //6FADF384 CC INT3 } else { MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns); memt_byte( 0xC4, 0x90 ); // NOP @@ -180,7 +186,7 @@ void Install_InterfaceSkills() if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1) { // Don't print "Skill Points Remaining" - mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334); + mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4); memt_byte( 0xB9, 0xE8 ); MEMT_REF4( 0x00001083, version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining); //6FB17080 /$ B9 83100000 MOV ECX,1083 @@ -188,10 +194,11 @@ void Install_InterfaceSkills() //6FB3AC74 |. B9 83100000 MOV ECX,1083 //6FB2ECF4 |. B9 83100000 MOV ECX,1083 //6FB28334 |. B9 83100000 MOV ECX,1083 + //6FADF7E4 |. B9 83100000 MOV ECX,1083 } // Manage mouse down (Play sound) - mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62); + mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112); memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown); memt_byte( 0x00, 0x90 ); // NOP @@ -199,17 +206,19 @@ void Install_InterfaceSkills() //6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0 //6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 //6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 - //6FB308B2 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0 - //6FB29C62 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0 + //6FB308B2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 + //6FB29C62 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 + //6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0 // Manage mouse up - mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8); + mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8); MEMJ_REF4( D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A //6FB18465 . E8 C07D0400 CALL //6FAC7557 .^E9 4248FFFF JMP //6FB3C077 .^E9 16FDF7FF JMP //6FB30247 .^E9 2CBCF8FF JMP //6FB295F7 .^E9 8828F9FF JMP + //6FAE0AA7 .^E9 E0B2FDFF JMP log_msg("\n"); diff --git a/PlugY/Interface_Stash.cpp b/PlugY/Interface_Stash.cpp index f59f2a9..f97172f 100644 --- a/PlugY/Interface_Stash.cpp +++ b/PlugY/Interface_Stash.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface stats page functions @@ -450,43 +451,47 @@ void Install_InterfaceStash() log_msg("Patch D2Client for stash interface. (InterfaceStash)\n"); // Print button images - mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56); + mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26); MEMC_REF4( D2LoadBuySelBtn, printBtns); //6FADF398 |. E8 734D0400 CALL D2Client.6FB24110 //6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0 //6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0 //6FB63655 |. E8 9682FDFF CALL D2Client.6FB3B8F0 //6FB49A55 |. E8 96500200 CALL D2Client.6FB6EAF0 + //6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0 // print page number - mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33); + mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03); MEMJ_REF4( D2PrintString, printPageNumber); //6FADF374 |. E8 3FCC0800 CALL //6FB60FE2 |. E8 99C2F5FF CALL //6FB2DF62 |. E8 19F3F8FF CALL //6FB63632 |. E8 299DF5FF CALL - //6FB49A32 |. E8 4739F7FF CALL + //6FB49A32 |. E8 91F4F6FF CALL + //6FB4DE02 |. E8 4739F7FF CALL // Manage mouse down (Play sound) - mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6); + mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76); MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown); //6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080 //6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520 //6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0 //6FB654A5 . E8 9611FFFF CALL D2Client.6FB56640 //6FB4B8A5 . E8 5614FFFF CALL D2Client.6FB3CD00 + //6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10 // Manage mouse up - mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9); + mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9); MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp); //6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080 //6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520 //6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0 //6FB652D8 > E8 6313FFFF CALL D2Client.6FB56640 //6FB4B6D8 > E8 2316FFFF CALL D2Client.6FB3CD00 + //6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10 // init state of button on open stash page - mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A); + mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A); memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates MEMT_REF4( 0x000104C4, initBtnsStates); memt_byte( 0x00, 0x90 ); @@ -497,24 +502,27 @@ void Install_InterfaceStash() //6FB249DA |> 81C4 04010000 ADD ESP,104 //6FB59D9A |> 81C4 04010000 ADD ESP,104 //6FB3CC3A |> 81C4 04010000 ADD ESP,104 + //6FB4441A |> 81C4 04010000 ADD ESP,104 // init the search of print in green the item set name we have in stash - mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434); + mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24); MEMJ_REF4( D2InventoryGetFirstItem, initGetNextItemForSet); //6FAE5996 |. E8 D5500800 CALL //6FB571F3 |. E8 D64EF6FF CALL //6FB21F63 |. E8 96A1F9FF CALL //6FB57313 |. E8 8250F6FF CALL //6FB3D433 |. E8 B8F0F7FF CALL + //6FB41A23 |. E8 96A7F7FF CALL // Get next item for print in green the item set name we have in stash - mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB); + mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB); MEMJ_REF4( D2UnitGetNextItem, getNextItemForSet); //6FAE5A1B E8 4A500800 CALL //6FB5728A |. E8 0B4FF6FF |CALL //6FB21FFA |. E8 A1A1F9FF |CALL //6FB573AA |. E8 7550F6FF |CALL //6FB3D4CA |. E8 99F0F7FF |CALL + //6FB41ABA |. E8 A3A8F7FF |CALL log_msg("\n"); diff --git a/PlugY/Interface_Stats.cpp b/PlugY/Interface_Stats.cpp index b95c7ac..43996ef 100644 --- a/PlugY/Interface_Stats.cpp +++ b/PlugY/Interface_Stats.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -48,17 +49,17 @@ void STDCALL printStatsPageBtns() sDrawImageInfo data; ZeroMemory(&data,sizeof(data)); - + if (printBackgroundOnMainPage && D2GetResolution()) - { + { setImage(&data, statsBackgroundImages); - setFrame(&data, 1); + setFrame(&data, 1); D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0); } - + setImage(&data, D2LoadBuySelBtn()); if (D2GetResolution()) - { + { setFrame(&data, 12 + isDownBtn.previousPage); D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0); } @@ -67,12 +68,12 @@ void STDCALL printStatsPageBtns() D2SetFont(1); if (D2GetResolution() && isOnPreviousPageBtn(mx,my)) //print popup "previous page" - { + { lpText = getTranslatedString(STR_PREVIOUS_PAGE); D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1); } else if ( isOnNextPageBtn(mx,my)) - { + { lpText = getTranslatedString(STR_NEXT_PAGE); D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1); } @@ -245,7 +246,7 @@ void Install_InterfaceStats() log_msg("Patch D2Client for stats interface. (InterfaceStats)\n"); // Print new buttons images - mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16); + mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6); memt_byte( 0x5F, 0xE9 ); // JMP MEMT_REF4( 0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9); //6FAD0F86 . 5F POP EDI @@ -278,34 +279,41 @@ void Install_InterfaceStats() //6FB6DC19 |. 5B POP EBX //6FB6DC1A |. 81C4 70030000 ADD ESP,370 //6FB6DC20 \. C3 RETN - + //6FB703B6 |. 5F POP EDI + //6FB703B7 |. 5E POP ESI + //6FB703B8 |. 5D POP EBP + //6FB703B9 |. 5B POP EBX + //6FB703BA |. 81C4 70030000 ADD ESP,370 + //6FB7030 \. C3 RETN if ( version_D2Client >= V111 ) { // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8); + mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568); memt_byte( 0xA1, 0xE8 ); MEMT_REF4( ptptClientChar, caller_statsPageMouseDown); //6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB6CDC8 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC] + //6FB6F568 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] // Manage mouse up - mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33); + mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3); memt_byte( 0xA1, 0xE8 ); MEMT_REF4( ptptClientChar, caller_statsPageMouseUp); //6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0] //6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0] //6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0] //6FB6DE33 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC] + //6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050] } else { // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000); + mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000); MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown); //6FAD133C . E8 8F700500 CALL D2Client.6FB283D0 // Manage mouse up - mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000); + mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000); MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2 //6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0 } diff --git a/PlugY/LoadPlayerData.cpp b/PlugY/LoadPlayerData.cpp index 5636bec..f96d7d4 100644 --- a/PlugY/LoadPlayerData.cpp +++ b/PlugY/LoadPlayerData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Load Player Custom Data. @@ -476,7 +477,7 @@ void Install_LoadPlayerData() log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n"); // Load SP player custom data. - mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D); + mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD); memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData MEMT_REF4( 0x75F685F0 , caller_LoadSPPlayerCustomData); memt_byte( 0x16, 0x90); // NOP @@ -495,9 +496,12 @@ void Install_LoadPlayerData() //6FC7638D |> 8BF0 MOV ESI,EAX //6FC7638F |. 85F6 TEST ESI,ESI //6FC76391 |. 75 16 JNZ SHORT D2Game.6FC763A9 + //6FC5BCCD |> 8BF0 MOV ESI,EAX + //6FC5BCCF |. 85F6 TEST ESI,ESI + //6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9 // Load MP player custom data. - mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217); + mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57); memt_byte( 0x83, 0xE8); MEMT_REF4( version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9); //6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0 @@ -510,18 +514,21 @@ void Install_LoadPlayerData() //6FC6644A |. 74 21 JE SHORT D2Game.6FC6646D //6FC76217 |> 833B 00 CMP DWORD PTR DS:[EBX],0 //6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D + //6FC5BB57 |> 833B 00 CMP DWORD PTR DS:[EBX],0 + //6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D // Send save files to Server. - mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C); + mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C); MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles); //6FAAD5A1 |. E8 88D10B00 CALL //6FB233FB |. E8 CA8AF9FF CALL //6FB0DFDB |. E8 C6DEFAFF CALL //6FB2933B |. E8 6A2CF9FF CALL //6FAC457B |. E8 187AFFFF CALL + //6FB6638B |. E8 2E5BF5FF CALL // Receive save files from client. - mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39); + mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9); memt_byte( 0x8B ,0xE8); if ( version_D2Game >= V111 ) { MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111); @@ -535,6 +542,8 @@ void Install_LoadPlayerData() //6FC824DC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] //6FCEAF39 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP] //6FCEAF3C |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] + //6FCF53E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP] + //6FCF53EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4] } else { MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles); //6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI] @@ -543,7 +552,7 @@ void Install_LoadPlayerData() if ( version_Fog <= V109d ) { - mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x8B ,0xE8); MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d); memt_byte( 0x44 ,0x90); diff --git a/PlugY/MainScreen.cpp b/PlugY/MainScreen.cpp index b024f23..fa18aef 100644 --- a/PlugY/MainScreen.cpp +++ b/PlugY/MainScreen.cpp @@ -1,5 +1,7 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. + Add "plugY v1.00" on screen. @@ -46,7 +48,7 @@ void Install_PrintPlugYVersion() log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n"); // Print PlugY version. - mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061); + mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11); MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion); //6FA19638 |. E8 1BED0000 CALL //6FA517C6 |. E8 6F81FFFF CALL @@ -54,6 +56,7 @@ void Install_PrintPlugYVersion() //6FA56B1F |. E8 1A2EFFFF CALL //6FA56AF6 |. E8 432EFFFF CALL //6FA58060 |. E8 ED18FFFF CALL + //6FA50A10 |. E8 218FFFFF CALL log_msg("\n"); @@ -91,7 +94,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? // Print LoD/Mod version. if (version_D2Launch >= V110) { - mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134);//6FA19721-6FA10000 + mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4);//6FA19721-6FA10000 memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x8B102454 , caller_VersionChange_10); memt_byte( 0xCF, 0x90 ); // NOP @@ -105,14 +108,17 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ???? //6FA56BCF |. 8BCF MOV ECX,EDI //6FA58134 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] //6FA58138 |. 8BCF MOV ECX,EDI + //6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10] + //6FA50AE8 |. 8BCF MOV ECX,EDI } else { - mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B); + mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB); MEMJ_REF4( D2PrintLineOnTextBox, versionChange); //6FA19729 |. E8 88EB0000 CALL //6FA518A1 |. E8 267FFFFF CALL //6FA57981 |. E8 781EFFFF CALL //6FA56BD1 |. E8 EA2CFFFF CALL //6FA5813A |. E8 8F17FFFF CALL + //6FA50AEA |. E8 DF8CFFFF CALL } log_msg("\n"); diff --git a/PlugY/NewInterface_CubeListing.cpp b/PlugY/NewInterface_CubeListing.cpp index 745ab9c..e63e0f9 100644 --- a/PlugY/NewInterface_CubeListing.cpp +++ b/PlugY/NewInterface_CubeListing.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Modified by L'Autour. Cube Listing functions @@ -14,62 +15,98 @@ const char* CUBEFORMULA_FILE = "cube.txt"; -const char * STRING_ERROR="***Error***"; +const LPWSTR STRING_ERROR= L"***Error***"; -#define BUF (&buf[strlen(buf)]) - +#define lenbuf 512 +#define lenbufi 256 +#define BUF &buf[cntbuf], lenbuf-cntbuf +bool InNoSocket; //~~~~~ /* 6FC9275F |. E8 ECCCFFFF |CALL D2Game.6FC8F450 ; \D2Game.6FC8F450 */ -void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs) +void printOutput(CubeOutput* output, WCHAR* buf, BYTE* nbOutputs) { if (!output->outputType) return; + + int cntbuf = wcslen(buf); + if (*nbOutputs) - sprintf(BUF," + "); + cntbuf += swprintf(BUF,L" + "); *nbOutputs += 1; if (output->outputType == 1) { - sprintf(BUF,"Cow Portal"); + swprintf(BUF,getTranslatedString(STR_COW_PORTAL)); return; } else if (output->outputType == 2) { - sprintf(BUF,"Pandemonium Portal"); + swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_PORTAL)); return; } else if (output->outputType == 3) { - sprintf(BUF,"Pandemonium Final Portal"); + swprintf(BUF,getTranslatedString(STR_PANDEMONIUM_FINAL_PORTAL)); return; } if ((output->quantityOrNbSockets>1) && !output->haveSockets) - sprintf(BUF,"%u ", output->quantityOrNbSockets); - + { + if (output->quantityOrNbSockets == 255) + {cntbuf += swprintf(BUF,getTranslatedString(STR_FULL));} + else + {cntbuf += swprintf(BUF,L"%u ", output->quantityOrNbSockets);} + } + + //------------------------------------------------------------------------------- + WCHAR itembuf[lenbufi]; + LPWSTR itemstr = &itembuf[0]; + if (!(output->isSpecificItem)) + { + ItemsBIN* items; LPWSTR string; + switch (output->outputType) + { + case 0xFC: + items = D2GetItemsBIN(output->ID); + wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi); + break; + case 0xFD: + getTypeUString(output->ID, itemstr, lenbufi); + break; + case 0xFE: wcsncpy(itemstr, getTranslatedString(STR_ITEM),lenbufi);break; + case 0xFF: wcsncpy(itemstr, getTranslatedString(STR_ITEM_SAME_TYPE),lenbufi);break; + default: swprintf(BUF,STRING_ERROR);return; + } + + itemstr = cutStringGender(itemstr); + } + //------------------------------------------------------------------------------- if (output->repair) - sprintf(BUF,"repair "); + cntbuf += wSprintStringLastGender(BUF, STR_REPAIR); + + if ((output->repair)&&(output->recharge)) + cntbuf += wSprintStringLastGender(BUF, STR_AND); if (output->recharge) - sprintf(BUF,"recharge "); + cntbuf += wSprintStringLastGender(BUF, STR_RECHARGE); if (output->isEthereal) - sprintf(BUF,"ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL); if (output->destroysFillers) - sprintf(BUF,"destroys Fillers "); + cntbuf += wSprintStringLastGender(BUF, STR_DESTROY_FILLERS); if (output->removeFillers) - sprintf(BUF,"remove Fillers "); + cntbuf += wSprintStringLastGender(BUF, STR_REMOVE_FILLERS); if (output->regeneratesUnique) - sprintf(BUF,"regenerate "); + cntbuf += wSprintStringLastGender(BUF, STR_REGENERATE); if (output->upgradeToExceptional) - sprintf(BUF,"exceptional "); + cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL); if (output->upgradeToElite) - sprintf(BUF,"elite "); + cntbuf += wSprintStringLastGender(BUF, STR_ELITE); if (output->isSpecificItem) { @@ -77,131 +114,163 @@ void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs) { UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + output->specificID-1; LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else if (output->quality == ITEMQUALITY_SET) { SetItemsBIN* setItems = SgptDataTables->setItems + output->specificID-1; LPWSTR string = D2GetStringFromIndex(setItems->setNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else { - sprintf(BUF,STRING_ERROR);return; + swprintf(BUF,STRING_ERROR);return; } } else { switch (output->quality) { - case 1:sprintf(BUF,"Cracked ");break; - case 2:sprintf(BUF,"Normal ");break; - case 3:sprintf(BUF,"Superior ");break; - case 4:sprintf(BUF,"Magic ");break; - case 5:sprintf(BUF,"Set ");break; - case 6:sprintf(BUF,"Rare ");break; - case 7:sprintf(BUF,"Unique ");break; - case 8:sprintf(BUF,"Crafted ");break; - case 9:sprintf(BUF,"Tempered ");break; - } - ItemsBIN* items;LPWSTR string; + case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break; + case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break; + case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break; + case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break; + case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break; + case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break; + case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break; + case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break; + case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break; + } /* + ItemsBIN* items; LPWSTR string; switch (output->outputType) { case 0xFC: items = D2GetItemsBIN(output->ID); string = D2GetStringFromIndex(items->NameStr); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); break; case 0xFD: - getTypeAString(output->ID,BUF,50); -// WCHAR string[50]; -// getTypeString(input->ID,string,50); -// wcstombs(BUF, string, wcslen(string)+1); + getTypeUString(output->ID,BUF); break; - case 0xFE: sprintf(BUF,"Item");break; - case 0xFF: sprintf(BUF,"Item of the same type");break; - default: sprintf(BUF,STRING_ERROR);return; + case 0xFE: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM));break; + case 0xFF: cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM_SAME_TYPE));break; + default: cntbuf += swprintf(BUF,STRING_ERROR);return; + } */ + cntbuf += swprintf(BUF,setMonoString(itemstr)); + + } + if ((output->haveSockets==1)||InNoSocket) + { + if(output->quantityOrNbSockets>1) + { + swprintf(BUF,getTranslatedString(STR_WITH_N_SOCKETS), output->quantityOrNbSockets); + } else + { + swprintf(BUF,getTranslatedString(STR_WITH_SOCKET)); } } - if ((output->quantityOrNbSockets>1) && (output->haveSockets==1)) - sprintf(BUF," with %u sockets", output->quantityOrNbSockets); + } -void printInput(CubeInput* input, char* buf, BYTE* nbInputs)//maxsize) +void printInput(CubeInput* input, WCHAR* buf, BYTE* nbInputs)//maxsize) { if (!input->byItemID && !input->byItemTypeID) return; + + int cntbuf = wcslen(buf); + if (*nbInputs) - sprintf(BUF," + "); + cntbuf += swprintf(BUF,L" + "); BYTE nb = input->quantity > 0 ? input->quantity : 1; *nbInputs += nb; if (nb>1) - sprintf(BUF,"%u ", nb); + cntbuf += swprintf(BUF,L"%u ", nb); + WCHAR itembuf[lenbufi]; + LPWSTR itemstr = &itembuf[0]; + //------------------------------------------------------------------------------- + if (!(input->isSpecificItem)) + { + if (input->byItemTypeID) { + getTypeUString(input->ID, itemstr, lenbufi); + } else if (input->ID == 0xFFFF) { + wcsncpy(itemstr, getTranslatedString(STR_ITEM), lenbufi); + } else { + ItemsBIN* items = D2GetItemsBIN(input->ID); + wcsncpy(itemstr, D2GetStringFromIndex(items->NameStr), lenbufi); + } + itemstr = cutStringGender(itemstr); + } + //------------------------------------------------------------------------------- if (input->isEthereal) - sprintf(BUF,"ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_ETHERAL); if (input->isNotEthereal) - sprintf(BUF,"not ethereal "); + cntbuf += wSprintStringLastGender(BUF, STR_NOT_ETHERAL); if (input->isNotRuneword) - sprintf(BUF,"not runeword "); + cntbuf += wSprintStringLastGender(BUF, STR_NOT_RUNEWORD); if (input->isBasic) - sprintf(BUF,"basic "); + cntbuf += wSprintStringLastGender(BUF, STR_BASIC); if (input->isExceptional) - sprintf(BUF,"exceptional "); + cntbuf += wSprintStringLastGender(BUF, STR_EXCEPTIONAL); if (input->isElite) - sprintf(BUF,"elite "); + cntbuf += wSprintStringLastGender(BUF, STR_ELITE); if (input->isSpecificItem) { if (input->quality == ITEMQUALITY_UNIQUE) { UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + input->specificID-1; LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else if (input->quality == ITEMQUALITY_SET) { SetItemsBIN* setItems = SgptDataTables->setItems + input->specificID-1; LPWSTR string = D2GetStringFromIndex(setItems->setNameId); - wcstombs(BUF, string, wcslen(string)+1); + cntbuf += swprintf(BUF,string); } else { - sprintf(BUF,STRING_ERROR);return; + swprintf(BUF,STRING_ERROR);return; } } else { switch (input->quality) { - case 1:sprintf(BUF,"Cracked ");break; - case 2:sprintf(BUF,"Normal ");break; - case 3:sprintf(BUF,"Superior ");break; - case 4:sprintf(BUF,"Magic ");break; - case 5:sprintf(BUF,"Set ");break; - case 6:sprintf(BUF,"Rare ");break; - case 7:sprintf(BUF,"Unique ");break; - case 8:sprintf(BUF,"Crafted ");break; - case 9:sprintf(BUF,"Tempered ");break; - } + + case 1:cntbuf += wSprintStringLastGender(BUF, STR_CRACKED);break; + case 2:cntbuf += wSprintStringLastGender(BUF, STR_NORMAL);break; + case 3:cntbuf += wSprintStringLastGender(BUF, STR_SUPERIOR);break; + case 4:cntbuf += wSprintStringLastGender(BUF, STR_MAGIC);break; + case 5:cntbuf += wSprintStringLastGender(BUF, STR_SET);break; + case 6:cntbuf += wSprintStringLastGender(BUF, STR_RARE);break; + case 7:cntbuf += wSprintStringLastGender(BUF, STR_UNIQUE);break; + case 8:cntbuf += wSprintStringLastGender(BUF, STR_CRAFTED);break; + case 9:cntbuf += wSprintStringLastGender(BUF, STR_TEMPERED);break; + }/* if (input->byItemTypeID) { - getTypeAString(input->ID,BUF,50); + getTypeUString(input->ID,BUF); } else if (input->ID == 0xFFFF) { - sprintf(BUF,"Item"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ITEM)); } else { ItemsBIN* items = D2GetItemsBIN(input->ID); LPWSTR string = D2GetStringFromIndex(items->NameStr); - wcstombs(BUF, string, wcslen(string)+1); - } + cntbuf += swprintf(BUF,string); + }*/ + cntbuf += swprintf(BUF,itemstr); } if (input->includeUpgradedVersions && !input->isElite) - sprintf(BUF,"(or upgraded) "); + cntbuf += swprintf(BUF,getTranslatedString(STR_OR_UPGRADED)); if (input->haveNoSocket) - sprintf(BUF," with no socket"); + { + cntbuf += swprintf(BUF,getTranslatedString(STR_WITHOUT_SOCKET)); + InNoSocket = true;//~~~~~ + } if (input->haveSockets) - sprintf(BUF," with sockets"); + swprintf(BUF,getTranslatedString(STR_WITH_SOCKET)); } -DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) +DWORD print(CubeMainBIN* curForm, WCHAR* buf, DWORD)//maxsize) { if (!buf || !curForm || !curForm->enabled) return 0; - + InNoSocket = false; //~~~~~ BYTE realNbInputs=0; printInput(&curForm->input1, buf, &realNbInputs); printInput(&curForm->input2, buf, &realNbInputs); @@ -211,14 +280,15 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) printInput(&curForm->input6, buf, &realNbInputs); printInput(&curForm->input7, buf, &realNbInputs); + int cntbuf = wcslen(buf); if (realNbInputs != curForm->numinputs) { - sprintf(BUF," *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs); + cntbuf += swprintf(BUF,L" *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs); return 1; } - sprintf(BUF," => "); + cntbuf += swprintf(BUF,L" => "); BYTE realNbOutputs=0; printOutput(&curForm->output1, buf, &realNbOutputs); printOutput(&curForm->output2, buf, &realNbOutputs); @@ -226,24 +296,24 @@ DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize) // if (curForm->ladder) -// sprintf(BUF," [ladder only]"); +// cntbuf += swprintf(BUF," [ladder only]"); if (curForm->minDiff == 1) - sprintf(BUF," [Nightmare and Hell only]"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_N_H)); else if (curForm->minDiff == 2) - sprintf(BUF," [Hell only]"); + cntbuf += swprintf(BUF,getTranslatedString(STR_ONLY_HELL)); if (curForm->playerClass != 0xFF) { CharStatsBIN* charStats = D2GetCharStatsBIN(curForm->playerClass); - sprintf(BUF, " [%s only]", charStats->name); + cntbuf += swprintf(BUF, getTranslatedString(STR_ONLY_CLASS), charStats->name); } if ((curForm->op>0) && (curForm->op!=28)) - sprintf(BUF, " [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value); + cntbuf += swprintf(BUF, L" [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value); // if (curForm->version == 100) -// sprintf(BUF, " [expansion only]"); +// cntbuf += swprintf(BUF, " [expansion only]"); return 1; } @@ -268,12 +338,24 @@ void listAllCubeFormula() int nbLines = D2GetNbCubeMainBIN();//SgptDataTables->nbCubemain log_msg("nbLines : %d\n",nbLines); - char buf[300]; + WCHAR buf[lenbuf]; + char bufa[lenbuf]; + + if (D2GetLang() != LNG_DEU) + { + bufa[0] = (char)0xEF; + bufa[1] = (char)0xBB; + bufa[2] = (char)0xBF; + bufa[3] = (char)0x00; + fprintf(file,"%s",bufa); + } + for (int i=0; icubemain + i; - if (res) fprintf(file,"%4u: %s\n",i,buf); + DWORD res = print(D2GetCubeMainBIN(i), buf, lenbuf);//SgptDataTables->cubemain + i; + UCS2toUTF8(&bufa[0], lenbuf, &buf[0], lenbuf); + if (res) fprintf(file,"%4u: %s\n",i,bufa); if (res) fflush(file); } diff --git a/PlugY/NewInterfaces.cpp b/PlugY/NewInterfaces.cpp index 66102ba..4092d70 100644 --- a/PlugY/NewInterfaces.cpp +++ b/PlugY/NewInterfaces.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Interface functions @@ -69,6 +70,7 @@ void STDCALL printCustomPage() DWORD STDCALL mouseCustomPageLeftDown(sWinMessage* msg) { + if(onRealm) return -1; if ( (selectedPage > 0) && (selectedPage<=lastPage) ) return mouseNewStatsPageTwoLeftDown(msg); @@ -310,7 +312,7 @@ void Install_NewInterfaces() if ( version_D2Client >= V111 ) { //Reset selectedPage variable on opening stats page - mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E); + mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE); memt_byte( 0x83, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0x1F7426F8, caller_resetSelectedPageByToolBar); //6FAFB79E > 83F8 26 CMP EAX,26 @@ -321,8 +323,10 @@ void Install_NewInterfaces() //6FB05E11 . 74 1F JE SHORT D2Client.6FB05E32 //6FB15F5E > 83F8 26 CMP EAX,26 //6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82 + //6FB741FE > 83F8 26 CMP EAX,26 + //6FB74201 . 74 1F JE SHORT D2Client.6FB05E32 - mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA); + mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A); memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey); //6FACE55A . 55 PUSH EBP @@ -337,7 +341,9 @@ void Install_NewInterfaces() //6FAEC5EA . 55 PUSH EBP //6FAEC5EB . 33ED XOR EBP,EBP //6FAEC5ED . 3BD5 CMP EDX,EBP - + //6FAEE39A . 55 PUSH EBP + //6FAEE39B . 33ED XOR EBP,EBP + //6FAEE39D . 3BD5 CMP EDX,EBP //For Toggle fct : (not used for open the stat page) // mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218); @@ -355,7 +361,7 @@ void Install_NewInterfaces() //6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP } else { //Reset selectedPage variable on opening stats page - mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218); + mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000, 0000);//((DWORD)D2TogglePage+0x218); memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage); //6FB23478 |. 85C0 TEST EAX,EAX @@ -365,16 +371,17 @@ void Install_NewInterfaces() } // Print custom page - mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49); + mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549); MEMC_REF4( D2PrintStatsPage, printCustomPage); //6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60 //6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0 //6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320 //6FB402B8 |. E8 C3AFFDFF CALL D2Client.6FB1B280 //6FB73B48 |. E8 5393FFFF CALL D2Client.6FB6CEA0 + //6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280 // Don't print Border - mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6); + mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6); memt_byte( 0xB9, 0xE8 ); // CALL caller_DontPrintBorder MEMT_REF4( 0x00000012, version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder); //6FAFF4C6 > B9 12000000 MOV ECX,12 @@ -382,27 +389,30 @@ void Install_NewInterfaces() //6FB65A46 |. B9 12000000 MOV ECX,12 //6FB32166 |. B9 12000000 MOV ECX,12 //6FAD71C6 |. B9 12000000 MOV ECX,12 + //6FB1D2B6 |. B9 12000000 MOV ECX,12 // Manage mouse down (Play sound) - mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36); + mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6); memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x00008088, version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9); memt_byte( 0x00, 0x90 ); // NOP //6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] //6FB391B6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] - //6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] - //6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] + //6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80] // Manage mouse up - mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9); + mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459); memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp MEMT_REF4( ptWindowStartX, version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9); //6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748] //6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24] //6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8] - //6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28] - //6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0] + //6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28] + //6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0] + //6FB70459 . A1 54D3BC6F MOV EAX,DWORD PTR DS:[6FBCD354] // open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP diff --git a/PlugY/PlayerCustomData.cpp b/PlugY/PlayerCustomData.cpp index d001ef8..d53624a 100644 --- a/PlugY/PlayerCustomData.cpp +++ b/PlugY/PlayerCustomData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Adding custom data. Save and load infinity & shared Stash @@ -270,18 +271,19 @@ void Install_PlayerCustomData() log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n"); // Initialize custom data. - mem_seek( version_D2Client == V113 ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 ); + mem_seek( version_D2Client == V113d ? offset_D2Common + 0x170DE : version_D2Client == V113c ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 ); MEMJ_REF4( D2AllocMem, init_PlayerCustomData); //01BD0381 |. E8 C03F0000 CALL //6FD9ED5D |. E8 94A4FBFF CALL //6FDABFCD |. E8 34D2FAFF CALL //6FDA85ED |. E8 240CFBFF CALL //6FD809BD |. E8 6088FDFF CALL + //6FD670DD |. E8 0C3EFFFF CALL if ( version_D2Game >= V111 ) { // update item - mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91); + mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x52182454, caller_updateItem_111); //0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] @@ -292,8 +294,10 @@ void Install_PlayerCustomData() //6FC7F2A5 |. 52 |PUSH EDX ; /Arg1 //6FCBBB91 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] //6FCBBB95 |. 52 |PUSH EDX + //6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18] + //6FC95C85 |. 52 |PUSH EDX - mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1); + mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x52182454, caller_updateItemB_111); //0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] @@ -304,19 +308,21 @@ void Install_PlayerCustomData() //6FC7F305 |. 52 ||PUSH EDX ; /Arg1 //6FCBBBF1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] //6FCBBBF5 |. 52 ||PUSH EDX + //6FC95CE1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18] + //6FC95CE5 |. 52 ||PUSH EDX } else { // update item - mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000); + mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); //6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00 - mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000); + mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000); MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9); //6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00 } // Update client on loading - mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12);//6FC325D4-6FC30000 + mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548);//6FC325D4-6FC30000 memt_byte( 0x5F ,0xE8); // CALL MEMT_REF4( 0xC0335D5E , caller_updateClientPlayerOnLoading); //6FC325D4 |> 5F POP EDI @@ -339,57 +345,65 @@ void Install_PlayerCustomData() //6FC6BF13 |. 5E POP ESI //6FC6BF14 |. 5D POP EBP //6FC6BF15 |. 33C0 XOR EAX,EAX + //6FD07548 |> 5F POP EDI + //6FD07549 |. 5E POP ESI + //6FD0754A |. 5D POP EBP + //6FD0754B |. 33C0 XOR EAX,EAX // Free custom data. - mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D); + mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D); MEMJ_REF4( D2FreeMem, free_PlayerCustomData); //01BD0482 |. E8 C53E0000 CALL //6FD9F82C |. E8 E399FBFF CALL //6FDAC9CC |. E8 3BC8FAFF CALL //6FDA856C |. E8 E70CFBFF CALL //6FD8093C |. E8 E788FDFF CALL + //6FD6705C |. E8 CF3EFFFF CALL // Free item in Stash (Server-side) - mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162); + mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2); MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204 //6FCBD5A3 . E8 04E20500 CALL //02019111 |. E8 5016F7FF |CALL //0202FDB1 |. E8 30AAF4FF |CALL //6FCB4241 |. E8 8862F7FF |CALL //6FD01161 |. E8 6693F2FF |CALL + //6FC8F7C1 |. E8 44AEF9FF |CALL // Free item in Stash (Client-side) - mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94);//6FB29B31-6FAA0000 + mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4);//6FB29B31-6FAA0000 MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34 //6FB29B31 E8 340F0400 CALL //6FAD6403 |. E8 925DFEFF |CALL //6FAFC263 |. E8 38FFFBFF |CALL //6FACF2D3 |. E8 4CD1FEFF |CALL //6FB55C93 |. E8 D068F6FF |CALL + //6FB121E3 |. E8 7AA1FAFF |CALL if ( version_D2Common >= V110 ) { // Test if it's already removed from inventory - mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23); + mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23, 3B393); memt_byte( 0x0D , 0x07); //01D2E688 75 0D JNZ SHORT D2Common.01D2E697 //6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41 //6FD92132 |. 74 0D JE SHORT D2Common.6FD92141 //6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1 //6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31 + //6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1 } else { - mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x35 , 0x90);//NOP //6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD - mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x0F , 0x90);//MOV EAX,EDI memt_byte( 0x84 , 0x90);//NOP memt_dword( 0x000000BF , 0x90909090);//NOP //6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F - mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x74 , 0x90);//MOV EAX,EDI memt_byte( 0x6F , 0x90);//NOP //6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD diff --git a/PlugY/PlugY.aps b/PlugY/PlugY.aps index ddd515b..7a4caa8 100644 Binary files a/PlugY/PlugY.aps and b/PlugY/PlugY.aps differ diff --git a/PlugY/PlugY.rc b/PlugY/PlugY.rc index fb9713a..c8ed211 100644 --- a/PlugY/PlugY.rc +++ b/PlugY/PlugY.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 10,0,0,0 - PRODUCTVERSION 10,0,0,0 + FILEVERSION 11,0,0,0 + PRODUCTVERSION 11,0,0,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,11 +81,12 @@ BEGIN BEGIN BLOCK "040004b0" BEGIN + VALUE "Comments", "Modified by L'Autour" VALUE "CompanyName", "Yohann Nicolas" - VALUE "FileVersion", "10.00" + VALUE "FileVersion", "11.00" VALUE "OriginalFilename", "PlugY.dll" VALUE "ProductName", "PlugY, The Survival Kit" - VALUE "ProductVersion", "10.00" + VALUE "ProductVersion", "11.00" END END BLOCK "VarFileInfo" diff --git a/PlugY/PlugY.suo b/PlugY/PlugY.suo index f209d63..f644524 100644 Binary files a/PlugY/PlugY.suo and b/PlugY/PlugY.suo differ diff --git a/PlugY/PlugY.vcproj b/PlugY/PlugY.vcproj index 6efbfd6..b99c648 100644 --- a/PlugY/PlugY.vcproj +++ b/PlugY/PlugY.vcproj @@ -152,6 +152,7 @@ @@ -361,6 +362,14 @@ RelativePath="WorldEvent.cpp" > + + + + + + @@ -561,6 +574,10 @@ RelativePath="..\Commons\updatingConst.h" > + + = V111 ? caller_isModFile_111 : caller_isModFile); @@ -97,6 +98,7 @@ void Install_PlugYFiles() //6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection //6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection + //6FC1DA79 |. FF15 3C32C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection log_msg("\n" ); @@ -170,7 +172,7 @@ void Install_PlugYImagesFiles() log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n"); // Load custom images - mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE); + mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE); memt_byte( 0xB9 ,0xE8); MEMT_REF4( 0x0000000C , caller_loadCustomImages); //6FAFE4B1 |. B9 0C000000 MOV ECX,0C @@ -178,9 +180,10 @@ void Install_PlugYImagesFiles() //6FB667E1 |. B9 0C000000 MOV ECX,0C //6FB32761 |. B9 0C000000 MOV ECX,0C //6FAD7EAE |. B9 0C000000 MOV ECX,0C + //6FB1E0BE |. B9 0C000000 MOV ECX,0C // Free custom images - mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D); + mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D); memt_byte( 0xB9 ,0xE8); MEMT_REF4( 0x0000000C , caller_freeCustomImages); //6FAFE639 |> B9 0C000000 MOV ECX,0C @@ -188,6 +191,7 @@ void Install_PlugYImagesFiles() //6FB6580D |> B9 0C000000 MOV ECX,0C //6FB3158D |> B9 0C000000 MOV ECX,0C //6FAD6F8D |> B9 0C000000 MOV ECX,0C + //6FB1D07D |> B9 0C000000 MOV ECX,0C log_msg("\n" ); @@ -243,7 +247,7 @@ void Install_PlugYTxtFiles() // lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000); // Load custom txt files - mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4); + mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4); MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles ); //6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500 //6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510 @@ -252,9 +256,10 @@ void Install_PlugYTxtFiles() //6FD87443 |. E8 58B6FFFF CALL D2Common.6FD82AA0 ; \D2Common.6FD82AA0 //6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0 //6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870 + //6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40 // Free custom txt files - mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3); + mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3); MEMJ_REF4( D2Fog10212, caller_freeTxtFiles ); //6FD479EB . E8 C8C00600 CALL //6FD479EB . E8 C8C00600 CALL @@ -263,6 +268,7 @@ void Install_PlugYTxtFiles() //6FD65AB2 |. E8 B537FFFF CALL //6FD94E12 |. E8 1744FCFF CALL //6FDAE8B2 |. E8 8FA9FAFF CALL + //6FD5FAA2 |. E8 5FB4FFFF CALL log_msg("\n" ); diff --git a/PlugY/SavePath.cpp b/PlugY/SavePath.cpp index 31d9346..6f485d2 100644 --- a/PlugY/SavePath.cpp +++ b/PlugY/SavePath.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Changing the current save path. @@ -123,7 +124,7 @@ void Install_ChangingSavePath() if (version_Fog >= V111) { // Appel de notre fct d'ajout d'un sous-rpertoire - mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86); + mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146); memt_byte( 0x83 ,0xE8); // CALL changeSavePath MEMT_REF4( 0x0575FFF8, changeSavePath_111); //6FF685F6 . 83F8 FF CMP EAX,-1 @@ -134,18 +135,21 @@ void Install_ChangingSavePath() //6FF6F089 . 75 05 JNZ SHORT Fog.6FF6F090 //6FF67F86 . 83F8 FF CMP EAX,-1 //6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90 + //6FF6E146 . 83F8 FF CMP EAX,-1 + //6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64 // Pour crer le bon chemin de sauvegarde - mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6); + mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166); MEMJ_REF4( D2Storm503, forCreateSavePath); //6FF68615 . E8 A246FFFF CALL //6FF6C125 . E8 C20BFFFF CALL //6FF6F0A5 . E8 34DDFEFF CALL //6FF67FA5 . E8 504EFFFF CALL + //6FF6E165 . E8 6AEBFEFF CALL // Remove registry update - mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA); + mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A); memt_byte( 0x56 ,0xEB); // JMP SHORT fog.6FF6862C memt_byte( 0x6A ,0x10); // memt_byte( 0x00 ,0x90); // NOP @@ -166,6 +170,8 @@ void Install_ChangingSavePath() //6FF6F0B7 . E8 58DDFEFF CALL //6FF67FAA . 56 PUSH ESI //6FF67FAB . 6A 00 PUSH 0 + //6FF6E16A . 56 PUSH ESI + //6FF6E16B . 6A 00 PUSH 0 } else { diff --git a/PlugY/SavePlayerData.cpp b/PlugY/SavePlayerData.cpp index 09ba097..b5a15c1 100644 --- a/PlugY/SavePlayerData.cpp +++ b/PlugY/SavePlayerData.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Save Player Custom Data. @@ -521,16 +522,17 @@ void Install_SavePlayerData() log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n"); //Save single player custom data. - mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35); + mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835); MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9); //6FC8A623 E8 3E210900 CALL //02039364 |. E8 3B0FF5FF CALL //01F95474 |. E8 C34EFEFF CALL //6FC64164 |. E8 EB61FCFF CALL //6FC73F34 |. E8 DD63FBFF CALL + //6FC59834 |. E8 FB0AFDFF CALL //Send SaveFiles - mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB); + mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB); memt_byte( 0x8B ,0x90); // NOP memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL MEMT_REF4( version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9); @@ -544,8 +546,10 @@ void Install_SavePlayerData() //6FC640DF |. 85C0 TEST EAX,EAX //6FC73EAB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] //6FC73EAF |. 85C0 TEST EAX,EAX + //6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] + //6FC597AF |. 85C0 TEST EAX,EAX - mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173); + mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3); memt_byte( 0x8B ,0x90); // NOP memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL MEMT_REF4( version_D2Game >= V110 ? 0x0000017C : version_D2Game == V109d ? 0x0000174 : 0x00000150, version_D2Game >= V110 ? caller_ManageNextPacketToSend : version_D2Game == V109d ? caller_ManageNextPacketToSend_9d : caller_ManageNextPacketToSend_9); @@ -554,6 +558,7 @@ void Install_SavePlayerData() //02056D83 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] //6FCC89D3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] //6FC4D173 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] + //6FCDEDD3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C] // mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC // memt_byte( 0x8B ,0xE8); // CALL @@ -565,16 +570,17 @@ void Install_SavePlayerData() if ( version_D2Game >= V111 ) { //Received SaveFiles - mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946); + mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6); memt_byte( 0x0F ,0xE8); MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111); //6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FAE2076 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FB2BCD6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] //6FAF3946 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] + //6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C] // Save multiplayer player custom data. - mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572); + mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2); memt_byte( 0x81 ,0xE8); // CALL MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111); memt_byte( 0xAA ,0x90); // CALL @@ -582,16 +588,17 @@ void Install_SavePlayerData() //6FB6D7F2 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55 //6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55 + //6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55 } else { //Received SaveFiles - mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000); + mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000); memt_byte( 0x81 ,0x90); // NOP memt_byte( 0xEC ,0xE8); // CALL MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave); //6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4 // Save multiplayer player custom data. - mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000); + mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000); memt_byte( 0x8B ,0xE8); // CALL MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData); //6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX] diff --git a/PlugY/SkillPerLevelUp.cpp b/PlugY/SkillPerLevelUp.cpp index 3bec02c..a63f7b5 100644 --- a/PlugY/SkillPerLevelUp.cpp +++ b/PlugY/SkillPerLevelUp.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Change Skill win per level up. @@ -36,14 +37,14 @@ void Install_SkillPerLevelUp() log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n"); - mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5); + mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5); MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp); //6FC7ED5F |. E8 56CB0900 CALL //02057AE4 |. E8 9F28F3FF CALL //01FE9694 |. E8 1B0DF9FF CALL //6FCCA454 |. E8 5F01F6FF CALL //6FD0B1E4 |. E8 E9F2F1FF CALL - + //6FD0DCA4 |. E8 FDC6F1FF CALL log_msg("\n"); diff --git a/PlugY/StatPerLevelUp.cpp b/PlugY/StatPerLevelUp.cpp index 747429c..4be88d6 100644 --- a/PlugY/StatPerLevelUp.cpp +++ b/PlugY/StatPerLevelUp.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Change Stat win per level up. @@ -34,13 +35,14 @@ void Install_StatPerLevelUp() log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n"); - mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA); + mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A); MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp); //6FC7ED54 |. E8 61CB0900 CALL //02057AD9 |. E8 AA28F3FF CALL //01FE9689 |. E8 260DF9FF CALL //6FCCA449 |. E8 6A01F6FF CALL //6FD0B1D9 |. E8 F4F2F1FF CALL + //6FD0DC99 |. E8 08C7F1FF CALL log_msg("\n"); diff --git a/PlugY/StatsPoints.cpp b/PlugY/StatsPoints.cpp index f56b45b..9b451cb 100644 --- a/PlugY/StatsPoints.cpp +++ b/PlugY/StatsPoints.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Unassign Stats Point for futher re-assignment. @@ -331,39 +332,42 @@ void Install_StatsPoints() //if ( version_D2Client < V113 ) { // Always print stat button images. - mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5); + mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955); memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088 - memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) ); + memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13, 13) ); memt_byte( 0x24, 0x90 ); // NOP - memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 + memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14 //6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14] //6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] + //6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C] //print our buttons - mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E); + mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE); MEMJ_REF4( D2PrintImage, caller_printUnassignStatsBtn); //6FB32C53 . E8 82A3F8FF CALL //6FB396D3 . E8 D238F8FF CALL //6FB1B636 . E8 431AFAFF CALL //6FB6D23D . E8 54FEF4FF CALL + //6FB6F9DD . E8 ECD5F4FF CALL // Always manage push down. - mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9); + mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579); memt_byte( 0x74, 0x90 ); // NOP memt_byte( 0x4E, 0x90 ); // NOP - //6FAD134D 74 4E JE SHORT D2Client.6FAD139D + //6FAD134D 74 4E JE SHORT D2Client.6FAD139D //6FB327D9 . 74 4E JE SHORT D2Client.6FB32829 //6FB39259 . 74 4E JE SHORT D2Client.6FB392A9 - //6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209 + //6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209 //6FB6CDD9 . 74 4E JE SHORT D2Client.6FB6CE29 + //6FB6F579 . 74 4E JE SHORT D2Client.6FB6F5C9 if ( version_D2Client >= V111 ) { // On Push down. - mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44); + mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4); memt_byte( 0x6B, 0xE8 ); MEMT_REF4( 0x01BF0ED2, caller_pushDown_111); memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E @@ -377,10 +381,12 @@ void Install_StatsPoints() //6FB1B227 BF 01000000 MOV EDI,1 //6FB6CE44 > 6BD2 0E IMUL EDX,EDX,0E //6FB6CE47 . BF 01000000 MOV EDI,1 + //6FB6F5E4 > 6BD2 0E IMUL EDX,EDX,0E + //6FB6F5E7 . BF 01000000 MOV EDI,1 } else { // On Push down. - mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000); + mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000, 0000); memt_byte( 0x8D, 0xE8 ); // CALL MEMT_REF4( 0x0000D504, caller_pushDown); memt_byte( 0x00, 0x90 ); // NOP @@ -392,17 +398,18 @@ void Install_StatsPoints() if ( version_D2Client >= V110 ) { // Always manage push up. - mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49); + mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9); memt_byte( 0x74, 0x90 ); // NOP memt_byte( version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP //6FAD152E 74 68 JE SHORT D2Client.6FAD1598 //6FB33869 . 74 65 JE SHORT D2Client.6FB338D0 //6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350 - //6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0 + //6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0 //6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0 + //6FB705E9 . 74 65 JE SHORT D2Client.6FB70650 // Unassign stats point when ctrl is push. - mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB); + mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B); memt_byte( 0x66, 0xE8 ); // CALL MEMT_REF4( 0x077CC085, caller_UnassignStats); //6FAD15D3 . 66:85C0 TEST AX,AX @@ -415,23 +422,25 @@ void Install_StatsPoints() //6FB1C2FE . 7C 07 JL SHORT D2Client.6FB1C307 //6FB6DEFB . 66:85C0 TEST AX,AX //6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07 + //6FB7069B . 66:85C0 TEST AX,AX + //6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7 } else { // Always manage push up. - mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0x0F, 0x90 ); // NOP memt_byte( 0x84, 0x90 ); // NOP memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP //6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9 // Unassign stats point when ctrl is push. - mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000); + mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000, 0000); memt_byte( 0xB8, 0xE8 ); // CALL MEMT_REF4( 0x00000001, caller_UnassignStats_9); //6FACACC9 . B8 01000000 MOV EAX,1 } // Set the id for the calling function. - mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E); + mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE); if ( version_D2Client >= V111 ) { memt_byte( 0x66, 0xE8 ); // CALL MEMT_REF4( 0x15244C89, caller_setValue_111); @@ -439,6 +448,7 @@ void Install_StatsPoints() //6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX //6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | //6FB6DF3E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | + //6FB706DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; | } else { MEMC_REF4( D2SendToServer3, caller_setValue); //6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990 @@ -475,7 +485,7 @@ void Install_StatsLimitShiftClick() log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n"); // Limit the assigment of stat points. - mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5); + mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5, C0695); memt_byte( 0xFF, 0x90 ); // NOP memt_byte( 0x15, 0xE8 ); // CALL MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift); @@ -484,6 +494,7 @@ void Install_StatsLimitShiftClick() //6FB3A395 . FF15 08F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>] //6FB1C2F5 . FF15 10F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState //6FB6DEF5 . FF15 04F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState + //6FB70695 . FF15 2001B86F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState log_msg("\n"); diff --git a/PlugY/UberQuest.cpp b/PlugY/UberQuest.cpp index c4fc399..240acda 100644 --- a/PlugY/UberQuest.cpp +++ b/PlugY/UberQuest.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Uber Quest Management. @@ -327,42 +328,45 @@ void Install_UberQuest() DWORD oldProtection; // open Red Portal - VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, PAGE_EXECUTE_READWRITE, &oldProtection); - mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0); + VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, PAGE_EXECUTE_READWRITE, &oldProtection); + mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4); MEMT_DWORD( D2OpenPandPortal , openPandPortal); MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal); //0201E357 |. FFD0 |CALL EAX //01FA77E7 |. FFD0 |CALL EAX //6FCF3CC7 |. FFD0 |CALL EAX //6FC92437 |. FFD0 |CALL EAX - VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, oldProtection, &oldProtection); + //6FCB7127 |. FFD0 |CALL EAX + VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4), 8, oldProtection, &oldProtection); // manage uberIA (fct table at 0209E7E8) - VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0); + VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618); MEMT_DWORD( D2UberBaalIA , uberBaalIA); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628); MEMT_DWORD( D2UberMephIA , uberMephIA); - mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0); + mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638); MEMT_DWORD( D2UberDiabloIA , uberDiabloIA); - VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, oldProtection, &oldProtection); + VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00) + 145*0x10), 0x30, oldProtection, &oldProtection); //0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8 //01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0 //6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58 //6FCBD157 |> B8 88E7D26F MOV EAX,D2Game.6FD2E788 + //6FC5C617 |> B8 00EDD26F MOV EAX,D2Game.6FD2ED00 // spawn Uber // mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000); // MEMJ_REF4( D2WarpPlayer , spawnUber); //02028DAC |. E8 491CF7FF CALL - mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB); + mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB); MEMC_REF4( D2Game235C0 , spawnUber); //020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10 //02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0 //6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410 //6FC4CCAA |. E8 3134FFFF ||CALL D2Game.6FC400E0 + //6FCDE9AA |. E8 D1AFF9FF ||CALL D2Game.6FC79980 log_msg("\n"); diff --git a/PlugY/UpdateClient.cpp b/PlugY/UpdateClient.cpp index df230e2..e09b102 100644 --- a/PlugY/UpdateClient.cpp +++ b/PlugY/UpdateClient.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating client. @@ -74,13 +75,14 @@ void Install_UpdateClient() log_msg("Patch D2Client for received Item packet. (UpdateClient)\n"); // execute if it's our packet else continue - mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896); + mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96); MEMT_REF4( version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate); //6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690 //6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789 //6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59 //6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9 //6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969 + //6FB34D94 |. 0F87 CF000000 JA D2Client.6FB34E69 log_msg("\n"); diff --git a/PlugY/UpdateServer.cpp b/PlugY/UpdateServer.cpp index 07cb3f9..0dd4044 100644 --- a/PlugY/UpdateServer.cpp +++ b/PlugY/UpdateServer.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Updating server. @@ -100,7 +101,7 @@ void Install_UpdateServer() log_msg("Patch D2Game for received button click message. (UpdateServer)\n"); // manage button click message from Client. - mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983); + mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983, 676C3); if (version_D2Game >= V111) { memt_byte( 0xC1, 0x57 ); // PUSH EDI memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate diff --git a/PlugY/WorldEvent.cpp b/PlugY/WorldEvent.cpp index d5df6d5..e18b501 100644 --- a/PlugY/WorldEvent.cpp +++ b/PlugY/WorldEvent.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. World Event Management. @@ -231,40 +232,44 @@ void Install_WorldEvent() log_msg("Patch D2Game for active World Event. (WorldEvent)\n"); // spawn DClone - mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280); + mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0); MEMC_REF4( V2SpawnMonster , version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone); //6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220 //01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0 //0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0 //6FC6156F |. E8 1CF6FFFF CALL D2Game.6FC60B90 ; \D2Game.6FC60B90 //6FC4527F |. E8 CCF6FFFF CALL D2Game.6FC44950 ; \D2Game.6FC44950 + //6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20 // verify if the item sold is a trigger of WE - mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29); + mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9); MEMJ_REF4( D2TestFlags , verifIfWEItem); //6FCC77CF |. E8 32400500 CALL //0200E798 |. E8 E9BDF7FF CALL //02002858 |. E8 E57DF7FF CALL //6FCA4498 |. E8 3B62F8FF CALL //6FCDFB28 |. E8 77ADF4FF CALL + //6FC92BE8 |. E8 DD7AF9FF CALL // management of the WorldEvent - mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791); + mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51); MEMC_REF4( V2GetGameByClientID , version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX); //6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0 //01FD1F00 |. E8 1BE60800 CALL D2Game.02060520 //02035680 |. E8 1BF30100 CALL D2Game.020549A0 //6FD0BF40 |. E8 1BA4FBFF CALL D2Game.6FCC6360 //6FC6A790 |. E8 4B03FEFF CALL D2Game.6FC4AAE0 + //6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700 // add client for the WorldEvent - mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF); + mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F); MEMC_REF4( D2AddClient , version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE); //6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60 //01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0 //01FE0559 |. E8 B27C0700 CALL D2Game.02058210 //6FC8265E |. E8 FD890800 CALL D2Game.6FD0B060 //6FCEB0BE |. E8 6DE8F7FF CALL D2Game.6FC69930 + //6FCF556E |. E8 FDFA0000 CALL D2Game.6FD05070 log_msg("\n"); diff --git a/PlugY/common.h b/PlugY/common.h index 3aaf109..2e1b588 100644 --- a/PlugY/common.h +++ b/PlugY/common.h @@ -1,5 +1,6 @@ /*============================================== File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. this file implements some common and useful function related to some Diablo II mechanisms. @@ -54,8 +55,8 @@ extern s_shifting shifting; #define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData #define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills -#define R7(Z,A,B,C,D,E,F,G) (offset_##Z + (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))) -#define V7(Z,A,B,C,D,E,F,G) (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))) +#define R7(Z,A,B,C,D,E,F,G,H) (offset_##Z + (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))))) +#define V7(Z,A,B,C,D,E,F,G,H) (version_##Z == V113d? 0x##H : (version_##Z == V113c? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))) // Convert 4 char code in a DWORD code @@ -74,7 +75,9 @@ enum eFileVersion V111, V111b, V112, - V113 + V113c, + V113d, + V114a }; extern int version_SmackW32; @@ -118,7 +121,19 @@ extern DWORD offset_Storm; extern const char* S_CloneBattles; extern const char* S_DarkAlliance; +int UCS2toUTF8(char* dst, int maxdst, LPWSTR src, int lensrc); +int UTF8toUCS2(LPWSTR dst, int maxdst, char* src, int lensrc); + + +bool initLocaleStrings(); +void freeLocaleStrings(); + +const LPWSTR getTypeString (DWORD code, char** IdxStr); LPWSTR getTranslatedString(int stringID); +int wSprintStringLastGender(LPWSTR buf, int lenbuf,int stringID); +LPWSTR cutStringGender(LPWSTR str); +LPWSTR setMonoString(LPWSTR str); + enum eStringList { STR_STATS_UNASSIGN_WITH_LIMIT=0, @@ -138,12 +153,47 @@ enum eStringList STR_TAKE_GOLD, STR_SHARED_GOLD_QUANTITY, STR_PREVIOUS_PAGE, - STR_NEXT_PAGE + STR_NEXT_PAGE, + STR_ITEM_LEVEL, + STR_COW_PORTAL, + STR_PANDEMONIUM_PORTAL, + STR_PANDEMONIUM_FINAL_PORTAL, + STR_FULL, + STR_REPAIR, + STR_AND, + STR_RECHARGE, + STR_DESTROY_FILLERS, + STR_REMOVE_FILLERS, + STR_REGENERATE, + STR_WITH_N_SOCKETS, + STR_ETHERAL, + STR_NOT_ETHERAL, + STR_NOT_RUNEWORD, + STR_BASIC, + STR_EXCEPTIONAL, + STR_ELITE, + STR_CRACKED, + STR_NORMAL, + STR_SUPERIOR, + STR_MAGIC, + STR_SET, + STR_RARE, + STR_UNIQUE, + STR_CRAFTED, + STR_TEMPERED, + STR_ITEM, + STR_ITEM_SAME_TYPE, + STR_OR_UPGRADED, + STR_WITHOUT_SOCKET, + STR_WITH_SOCKET, + STR_ONLY_N_H, + STR_ONLY_HELL, + STR_ONLY_CLASS }; bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h); void freeMessage(sWinMessage* msg); LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size); -char* getTypeAString (WORD id, char* lpText, DWORD size); +//char* getTypeAString (WORD id, char* lpText, DWORD size); /*================================= END OF FILE =================================*/ \ No newline at end of file diff --git a/PlugY/d2functions.h b/PlugY/d2functions.h index a131e87..7b02b42 100644 --- a/PlugY/d2functions.h +++ b/PlugY/d2functions.h @@ -1,5 +1,6 @@ /*================================================ File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. This file implements some common and useful function related to some Diablo II mechanisms. @@ -15,9 +16,9 @@ #define E2S(F, A, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N; #define E2F(F, A, R, N, P) typedef R (FASTCALL *T##N) P; extern T##N N; #define E2C(F, A, T, N) extern T* pt##N; -#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; -#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; -#define C7(Z, A,B,C,D,E,F,G, T, N) extern T* pt##N; +#define F7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; +#define A7(X, Z, A,B,C,D,E,F,G,H, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N; +#define C7(Z, A,B,C,D,E,F,G,H, T, N) extern T* pt##N; #include "../Commons/D2Funcs.h" extern DataTables* SgptDataTables; diff --git a/PlugY/parameters.h b/PlugY/parameters.h index 3e5fc45..f50cf7d 100644 --- a/PlugY/parameters.h +++ b/PlugY/parameters.h @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Modified by 1.13d by L'Autour. Loading parameters from ini file. @@ -7,7 +8,7 @@ #pragma once -#define PLUGY_VERSION "10.00" +#define PLUGY_VERSION "11.00" #define LOG_FILE "PlugY.log" diff --git a/PlugYInstall/PlugYInstall.aps b/PlugYInstall/PlugYInstall.aps index 7cc6293..0be97cd 100644 Binary files a/PlugYInstall/PlugYInstall.aps and b/PlugYInstall/PlugYInstall.aps differ diff --git a/PlugYInstall/PlugYInstall.cpp b/PlugYInstall/PlugYInstall.cpp index 2c3c56e..b859adf 100644 --- a/PlugYInstall/PlugYInstall.cpp +++ b/PlugYInstall/PlugYInstall.cpp @@ -1,5 +1,6 @@ /*================================================================= File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. Patch D2gfx.dll to install PlugY. @@ -7,41 +8,46 @@ #include #include +#include "../Commons/VersionInfo.h" const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation"; const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit "; -int CALL_LOAD[7] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423}; -BYTE callNewLoad[7][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary +int CALL_LOAD[8] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423,0xAA03}; +BYTE callNewLoad[8][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary {0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary {0xE8,0x8B,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA73875 ;install loadlibrary {0xE8,0xD8,0x42,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88B28 ;install loadlibrary {0xE8,0xD8,0x19,0x00,0x00,0x90},// JMP 6FA8CE00-6FA8B428 ;install loadlibrary {0xE8,0x98,0x3E,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88F68 ;install loadlibrary - {0xE8,0xD8,0x19,0x00,0x00,0x90}};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary -BYTE callOldLoad[7][6]={{0xFF,0x15,0x3C,0xC0,0xA7,0x6F}, + {0xE8,0xD8,0x19,0x00,0x00,0x90},// JMP 6FA8CE00-6FA8B428 ;install loadlibrary + {0xE8,0xF8,0x23,0x00,0x00,0x90}};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary +BYTE callOldLoad[8][6]={{0xFF,0x15,0x3C,0xC0,0xA7,0x6F}, {0xFF,0x15,0x3C,0xC0,0xA7,0x6F}, {0xFF,0x15,0x40,0xC0,0xA7,0x6F}, {0xFF,0x15,0x1C,0xD1,0xA8,0x6F}, {0xFF,0x15,0x1C,0xD1,0xA8,0x6F}, {0xFF,0x15,0x1C,0xD1,0xA8,0x6F}, + {0xFF,0x15,0x1C,0xD1,0xA8,0x6F}, {0xFF,0x15,0x1C,0xD1,0xA8,0x6F}}; -int CALL_FREE[7] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA}; -BYTE callNewFree[7][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary +int CALL_FREE[8] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA,0xA9AA}; +BYTE callNewFree[8][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary {0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary {0xE8,0xD2,0x83,0x00,0x00,0x90}, // JMP 6FA7BE44-6FA73A72 ;install freelibrary {0xE8,0x75,0x43,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88ACF ;install freelibrary {0xE8,0x75,0x1A,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary {0xE8,0x35,0x3F,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88F0F ;install freelibrary - {0xE8,0x75,0x1A,0x00,0x00,0x90}};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary -BYTE callOldFree[7][6]={{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] + {0xE8,0x75,0x1A,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary + {0xE8,0x95,0x24,0x00,0x00,0x90}};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary +BYTE callOldFree[8][6]={{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] {0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] {0xFF,0x15,0x48,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] {0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] {0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] {0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] - {0xFF,0x15,0x2C,0xD1,0xA8,0x6F}};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] + {0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] + {0xFF,0x15,0x24,0xD1,0xA8,0x6F}};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] int CALLER_LOADPLUGY = 0xBE00;//6FA7BE00-6FA70000 BYTE caller_LoadPlugY[]={ @@ -108,9 +114,9 @@ enum eFileVersion V111b, V112, V113c, - UNKNOW + V113d }; - +/* int getVersion(FILE *dll) { int ver; @@ -143,7 +149,7 @@ int getVersion(FILE *dll) ver = UNKNOW; return ver; } - +*/ void updateData(int version) { @@ -164,6 +170,7 @@ void updateData(int version) case V111b: case V112: case V113c: + case V113d: CALLER_LOADPLUGY += 0x1000; CALLER_FREEPLUGY += 0x1000; S_INIT += 0x1000; @@ -172,9 +179,16 @@ void updateData(int version) *(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C; *(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C; *(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C; + if (version == V113d) + { + *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D124; + *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D124; + } else + { + *(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C; + *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C; + } *(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120; - *(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C; caller_LoadPlugY[13] += 0x10; caller_LoadPlugY[14]++; caller_LoadPlugY[25]++; @@ -192,6 +206,18 @@ void updateData(int version) ////////////////////////////// EXPORTED FUNCTIONS ////////////////////////////// +int GetD2Ver() +{ + char currentpath[MAX_PATH]; + if (! GetD2Path(currentpath, MAX_PATH)) + { + MessageBox(0,"Can't find path to Game.exe.", + boxNameInstall, MB_OK|MB_ICONEXCLAMATION); + exit(0);; + } + return GetD2Version(currentpath); +} + void Patch() { if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n" @@ -215,9 +241,12 @@ void Patch() exit(0); } - int version = getVersion(dll); + //int version = getVersion(dll); + + int version = GetD2Ver(); - if (version == UNKNOW) + //if (version == UNKNOW) + if (version == -1) { MessageBox(0,"Bad version of D2gfx.dll.\n" "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" @@ -341,9 +370,11 @@ void Unpatch() exit(0); } - int version = getVersion(dll); + //int version = getVersion(dll); + int version = GetD2Ver(); - if (version == UNKNOW) + //if (version == UNKNOW) + if (version == -1) { MessageBox(0,"Bad version of D2gfx.dll.\n" "You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n" diff --git a/PlugYInstall/PlugYInstall.rc b/PlugYInstall/PlugYInstall.rc index 66ed8d3..b62a53f 100644 --- a/PlugYInstall/PlugYInstall.rc +++ b/PlugYInstall/PlugYInstall.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,4,0 - PRODUCTVERSION 1,0,4,0 + FILEVERSION 1,0,5,0 + PRODUCTVERSION 1,0,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,10 +81,10 @@ BEGIN BEGIN BLOCK "040c04b0" BEGIN - VALUE "FileVersion", "1.04" + VALUE "FileVersion", "1.05" VALUE "OriginalFilename", "PlugY_Install.exe" VALUE "ProductName", "PlugY Installation" - VALUE "ProductVersion", "1.04" + VALUE "ProductVersion", "1.05" END END BLOCK "VarFileInfo" diff --git a/PlugYInstall/PlugYInstall.suo b/PlugYInstall/PlugYInstall.suo index b7dd910..1c9f7b7 100644 Binary files a/PlugYInstall/PlugYInstall.suo and b/PlugYInstall/PlugYInstall.suo differ diff --git a/PlugYInstall/PlugYInstall.vcproj b/PlugYInstall/PlugYInstall.vcproj index bca4a99..b5749fc 100644 --- a/PlugYInstall/PlugYInstall.vcproj +++ b/PlugYInstall/PlugYInstall.vcproj @@ -269,6 +269,14 @@ RelativePath="PlugYInstall.cpp" > + + + + + + + + ') + ); + + IniName: AnsiString; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function InitTranslatedString(_EAX: Integer;_EDX: Integer; iLng: Integer): Boolean; register; +var + IniFile: PIniFile; + CurLng: AnsiString; + S: UTF8String; + i: Integer; +begin + Result := False; + if not FileExists(IniName) then Exit; + + if (iLng < 0)or(iLng > MaxLng) then iLng := 0; + CurLng := sLng[iLng]; + + IniFile := OpenIniFile(IniName); + IniFile.Mode := ifmRead; + for i := 0 to MaxStr do + begin + IniFile.Section := LocalStrings[i].name; + S := IniFile.ValueString(CurLng, ''); + if S <> '' then LocalStrings[i].value := UTF8Decode(S); + end; + for i := 0 to MaxType do + begin + IniFile.Section := StrTypes[i].c; + S := IniFile.ValueString(CurLng, ''); + if S <> '' then + begin + StrTypes[i].s := UTF8Decode(S); + StrTypes[i].k := ''; + end; + end; + Result := True; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function GetTranslatedString(_EAX: Integer;_EDX: Integer; Idx: Integer): PWideChar; register; +begin + if (Idx < 0)or(Idx > MaxStr) then Idx := MaxStr + 1; + Result := @LocalStrings[Idx].Value[1]; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function GetTypeString(_EAX: Integer;out IdxStr: PAnsiChar; Code: Cardinal): PWideChar; register; +var + i: Integer; +begin + i := 0; + while i <= MaxType do + begin + if Code = StrTypes[i].dw then Break; + Inc(i); + end; + if StrTypes[i].k = '' then + IdxStr := nil + else + IdxStr := PAnsiChar(StrTypes[i].k); + Result := PWideChar(StrTypes[i].s); +end; + +function WSprintStringLastGender(buf: PWideChar; lenbuf: Integer; Idx: Integer): Integer; stdcall; +var + i, p, L: Integer; + S: WideString; +begin + S := GetTranslatedString(0,0,Idx); + + if Gender <> '' then + begin + p := Pos(Gender, S); + if p <> 0 then + begin + L := Length(S); + p := p + Length(Gender); + for i := p to L do + if S[i] = '[' then Break; + S := Copy(S, p, i - p); + end; + end; + + Result := Min(lenbuf - 1, Length(S)); + for i := 1 to Result do + buf[i-1] := S[i]; + buf[Result + 1] := #$0000; +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function SetMonoString(_EAX: Integer;_EDX: Integer; InStr: PWideChar): PWideChar; register; +var + StrList: PWStrList; + i: Integer; + S: WideString; +begin + Result := InStr; + if Result = nil then Exit; + StrList := NewWStrList; + StrList.Text := InStr; + i := Strlist.Count - 1; + if i = 0 then Exit; + S := StrList.Items[i]; + while i > 0 do + begin + Dec(i); + S := S + '. ' + StrList.Items[i]; + end; + Move(S[1], InStr[0], Length(S) shl 1); +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +function CutStringGender(_EAX: Integer;_EDX: Integer; InStr: PWideChar): PWideChar; register; +var + i, j: Integer; +begin + Result := InStr; + Gender := ''; + if (InStr = nil)or(InStr[0] <> '[') then Exit; + i := 1; + while (InStr[i] <> #$0000) do + begin + if InStr[i] = ']' then + begin + if (i < 2)or(InStr[i+1] = #$0000) then Exit; + SetLength(Gender, i + 1); + for j := 0 to i do + Gender[j+1] := InStr[j]; + Result := @InStr[i+1]; + Exit; + end; + Inc(i); + end; +end; + +{ +const + NcColor = 14; + LenCode = 9; + +type + TTextColor = array[0..LenCode - 1] of AnsiChar; + +const + cColor: array[0..NcColor - 1] of TTextColor = ( + ('\','w','h','i','t','e',';',#00,#00), + ('\','g','r','e','y',';',#00,#00,#00), + ('\','r','e','d',';',#00,#00,#00,#00), + ('\','g','r','e','e','n',';',#00,#00), + ('\','b','l','u','e',';',#00,#00,#00), + ('\','g','o','l','d',';',#00,#00,#00), + ('\','d','g','r','e','y',';',#00,#00), + ('\','b','l','a','c','k',';',#00,#00), + ('\','t','a','n',';',#00,#00,#00,#00), + ('\','o','r','a','n','g','e',';',#00), + ('\','y','e','l','l','o','w',';',#00), + ('\','d','g','r','e','e','n',';',#00), + ('\','p','u','r','p','l','e',';',#00), + ('\','c','o','l','o','r',';',#00,#00)); + //lengths of strings in cColor table, without '\' + cColLength: array[0..NcColor-1] of Byte = (6,5,4,6,5,5,6,6,4,7,7,7,7,6); + pColor: PAnsiChar = @cColor[NcColor-1][1]; +var + SaveToTbl: Byte = 0; + +//ANSI convert ColorApi to ColorCode +//optional UCS2 convert '\n' to $0A +function ColorApi2ColorCode(Src: PAnsiChar; Dst: PAnsiChar; + SourceChars: Integer): Integer; +//EAX: Src +//EDX: Dst +//ECX: Length Src +//Result: OutLength -> EAX +asm + //backup + PUSHF + CLD // + PUSH ESI + PUSH EDI + PUSH EBX + PUSH EBP + + PUSH EDX // + MOV EDI, Dst + TEST Src, Src // + JZ @Exit + MOV ESI, Src +// ECX Src +@NextChar: + // EAX + XOR EAX, EAX + LODSB //MOV AL, [ESI]+ + // ( ) + TEST AL, AL + JZ @Exit + // '\' + CMP AL, '\' + JE @Slash + +@CopyChar: + //normal chars + STOSB //MOV [EDI]+, AL + +// +@Loop: + LOOP @NextChar + +@Exit: + MOV BYTE PTR [EDI], $00 // + POP EAX // + XCHG EAX, EDI + //get length of Dst + SUB EAX, EDI + //restore + POP EBP + POP EBX + POP EDI + POP ESI + POPF + RET + +@Slash: + // + CMP ECX, 1 + JB @CopyChar // if ECX < 1 + // + LODSB //MOV AL, [ESI]+ + // + CMP AL, 'n' + JNZ @TestColor + // ECX + DEC ECX + + //test Save2Tbl + CMP SaveToTbl, 0 + JNZ @UnixReturn + //save '\n' + MOV AL, '\' + STOSB //MOV [EDI]+, AL + MOV AL, 'n' + JMP @CopyChar + +@UnixReturn: + //save UnixNewLine + MOV AL, $0A + JMP @CopyChar + +// : +@TestColor: + // + //CMP MacroColorView, $00 + //JE @StoreSlash + + //backup + PUSH ECX + PUSH EDI + // ESI + DEC ESI + // + MOV EBX, ESI + // + MOV EAX, NcColor + // + // ( '') + MOV EBP, pColor + // '\' + //(-1, .. EAX) + LEA EDX, [cColLength - 1] + +@CmpStr: + // + MOV EDI, EBP + // + MOVZX ECX, BYTE PTR [EDX + EAX] + // + //(, , .. Src ) + REPE CMPSB + // + JZ @ColorCode + // + MOV ESI, EBX + // + SUB EBP, LenCode + // + DEC EAX + // + JA @CmpStr //if EAX > 0 +// '\' + //restore + POP EDI + POP ECX +@StoreSlash: + // '\' + MOV AL, '\' + JMP @CopyChar + +// +// AL cColor +@ColorCode: + //restore + POP EDI + // ColorCode + MOVZX EDX, BYTE PTR [EDX + EAX]// + ADD AL, $2E //1..14 + $2E = $2F..$3C + //backup EAX + MOV ECX, EAX + //save ColorCode + MOV AX, $63FF + STOSW //MOVD [EDI]+, AX + //restore EAX + MOV EAX, ECX + //test \color; + CMP AL, $3C + JE @FullColorCode + //add number to ColorCode + STOSB //MOVD [EDI]+, AL + +@FullColorCode: + //restore ECX + POP ECX + SUB ECX, EDX // ECX + JZ @Exit // + //ESI + JMP @NextChar //ECX >= 1 +end; + +//MS C++__fastcall(ecx,edx) vs Delphi register(eax,edx,ecx) - :( +procedure ReplaceColorCode(_EAX: Integer;_EDX: Integer; Str: PAnsiChar); register; +var + i, L, n: Integer; +begin + L := Length(Str); + n := ColorApi2ColorCode(Str, Str, L); + Dec(L); + for i := n to L do + begin + //Str[i] := ' '; + end; + //MsgOK(Str); +end; +} + +//Decode string from UCS2 to UTF8 +//WideCharToMultiByte not support CP_UTF8 in Windows 95 +function UCS2ToUTF8(Dest: PAnsiChar; MaxDestBytes: Integer; + Source: PWideChar; SourceChars: Integer): Integer; +//EAX: @Dest +//EDX: MaxDestBytes +//ECX: @Source +//(ESP): SourceChars; +//Result: DestChars of @Dest -> EAX +asm + //backup + PUSHF + CLD //set (ESI)+ + PUSH EBX + PUSH ESI + PUSH EDI + + PUSH Dest //backup @Dst + MOV EDI, Dest + TEST Source, Source //test NULL string + JZ @Exit + MOV ESI, Source + MOV ECX, SourceChars + +@NextChar: + //test length of Dst + DEC EDX + JLE @Exit + //get next char to EAX + XOR EAX, EAX + LODSW //MOV AX, [ESI]+ + //test NULL char (end of string) + TEST EAX, EAX + JZ @Exit +//decode UCS2 to UTF8 +@Ucs2ToUtf8: + //test UCS2-char in $0000..$007F + CMP AX, $007F + JA @11xxxxxx //if AX > $7F +//UTF8-char: 0xxxxxxx + //AH = 00000000; AL = 0xxxxxxx +@0xxxxxxx: + //save UTF8-char + STOSB //MOVB [EDI]+, AL +//end Loop +@Loop: + LOOP @NextChar + JMP @Exit + +@11xxxxxx: + //test length of Dst + DEC EDX + JLE @Exit + //test UCS2-char in $0080..$07FF + CMP AX, $07FF + JA @1110xxxx //if AX > $07FF +//UTF8-char: 110xxxxx 10xxxxxx + //AH = 00000xxx; AL = xxxxxxxx + //get first byte UTF8-char to AL + ROR AX, 6 //AH = xxxxxx00; AL = 000xxxxx + //get second byte UTF8-char to AH + SHR AH, 2 //AH = 00xxxxxx + OR AX, $80C0 //AH = 10xxxxxx; AL = 110xxxxx + //save UTF8-char + STOSW //MOVW [EDI]+, AX + JMP @Loop + +//UTF8-char: 1110xxxx 10xxxxxx 10xxxxxx +@1110xxxx: + //test length of Dst + DEC EDX + JLE @Exit + //save lobyte of UCS2-char + MOV BL, AL + //AH = xxxxxxxx; AL = xxxxxxxx + //get first byte UTF8-char UTF8 to AL + ROL AX, 4 //AL = ????xxxx; AH = xxxxxx?? + AND AL, $0F //AL = 0000xxxx + //get second byte UTF8-char to AH + SHR AH, 2 //AH = 00xxxxxx + OR AX, $80E0 //AH = 10xxxxxx; AL = 1110xxxx + //save first bytes UTF8-char + STOSW //MOVW [EDI]+, AX + //get second byte UTF8-char to AL + XCHG EAX, EBX //??xxxxxx + AND AL, $3F //00xxxxxx + OR AL, $80 //10xxxxxx + //save third byte UTF8-char + JMP @0xxxxxxx + +@Exit: + MOV BYTE PTR [EDI], $00 //set end-char of Dst + POP EAX //restore @Dst + XCHG EAX, EDI + //get length of Dst to Result + SUB EAX, EDI + //restore + POP EDI + POP ESI + POP EBX + POPF +end; + +function _UCS2ToUTF8(Dest: PAnsiChar; MaxDestBytes: Integer; + Source: PWideChar; SourceChars: Integer): Integer; stdcall; +begin + Result := UCS2ToUTF8(Dest, MaxDestBytes, Source, SourceChars); +end; + +//Decode string from UTF8 to UCS2 +function UTF8ToUCS2(Dest: PWideChar; MaxDestBytes: Integer; + Source: PAnsiChar; SourceChars: Integer): Integer; +//EAX: @Dest +//EDX: MaxDestBytes +//ECX: @Source +//(ESP): SourceChars; +//Result: DestChars of @Dest -> EAX +//if errors then +//Result: -(DestChars of @Dest) -> EAX +asm + //backup + PUSHF + CLD //set (ESI)+ + PUSH EBX + PUSH ESI + PUSH EDI + + PUSH Dest //backup @Dst + MOV EDI, Dest + TEST Source, Source //test NULL string + JZ @Exit + MOV ESI, Source + MOV ECX, SourceChars + +@NextChar: + //test length of Dst + SUB EDX, 2 + JLE @Exit + //get next char to EAX + XOR EAX, EAX + LODSB //MOV AL, [ESI]+ + //test NULL char (end of string) + TEST AL, AL + JZ @Exit +//decode UTF8 to UCS2 +@Utf8ToUcs2: + //test first byte UTF8 = 0xxxxxxx + TEST AL, $80 + JNZ @1xxxxxxx +//UTF8: 0xxxxxxx (AH = 0) +@SaveU16: + STOSW //MOVW [EDI]+, EAX +@Loop: + LOOP @NextChar + JMP @Exit + +@1xxxxxxx: + //test first byte UTF8 = 10xxxxxx + TEST AL, $40 //01000000 + JZ @Exit //Error UTF8: 10xxxxxx + //test first byte UTF8 = 1111xxxx + CMP AL, $F0 //11110000 + JAE @Exit //Error UTF8 to UCS2: 1111xxxx ( if AL >= $F0) + //test exist second byte UTF8 + JECXZ @Exit // DEC ECX; if ECX = 0 + //backup first byte UTF8 + MOV AH, AL //11xxxxxx + //load second byte UTF8 + LODSB //MOV AL, [ESI]+ + //test second byte UTF8 = 10xxxxxx + TEST AL, $40 //01000000 + JNE @Exit //Error UTF8: 10xxxxxx + //test second byte UTF8 = 110xxxxx + TEST AH, $20 //00100000 + JNZ @1110xxxx //third byte UTF8 +//UTF8: 110xxxxx 10xxxxxx + //backup first byte UTF8 + MOV BL, AH //110xxxxx + //get high byte UCS2 + SHR AH, 2 //00110xxx + AND AX, $073F //AH: 00000xxx; AL: 00xxxxxx + //get low byte USC2 + SHL BL, 6 //xx000000 + OR AL, BL //xxxxxxxx + //AX: 00000xxx:xxxxxxxx + JMP @SaveU16 + +@1110xxxx: + //test exist third byte UTF8 + JeCXZ @Exit // DEC ECX; if ECX = 0 + //backup second byte UTF8 + MOV BL, AL //10xxxxxx + //load third byte UTF8 + LODSB //MOV AL, [ESI]+ + //test third byte UTF8 = 10xxxxxx + CMP AL, $C0 //11000000 + JAE @Exit //Error UTF8: 11xxxxxx ( if AL >= $C0) +//UTF8: 1110xxxx 10xxxxxx 10xxxxxx + //get bytes UCS2 : xx00000:0000xxxx + AND BX, $003F //DX := 00000000:00xxxxxx + ROR BX, 2 //BL := 0000xxxx; BH := xx000000 + //get low byte UTF8 + AND AL, $3F //00xxxxxx + OR AL, BH //xxxxxxxx + //get high byte UCS2 + SHL AH, 4 //xxxx0000 + OR AH, BL //xxxxxxxx + JMP @SaveU16 + +@Exit: + XOR EAX, EAX + MOV [EDI],AX //set end-char of Dst + POP EAX //restore @Dst + XCHG EAX, EDI + //get length of Dst to Result + SUB EAX, EDI + SHR EAX, 1 + //restore + POP EDI + POP ESI + POP EBX + POPF +end ; //asm + + +function _UTF8ToUCS2(Dest: PWideChar; MaxDestBytes: Integer; + Source: PAnsiChar; SourceChars: Integer): Integer; stdcall; +begin + Result := UTF8ToUCS2(Dest, MaxDestBytes, Source, SourceChars); +end; + +exports + _UCS2ToUTF8 name '__stdcall UCS2toUTF8', + _UTF8ToUCS2 name '__stdcall UTF8toUCS2', + //ReplaceColorCode name 'replaceColorCode', + SetMonoString name '__fastcall setMonoString', + WSprintStringLastGender name '__stdcall wSprintStringLastGender', + CutStringGender name '__fastcall cutStringGender', + GetTypeString name '__fastcall getTypeString', + GetTranslatedString name '__fastcall getTranslatedString', + InitTranslatedString name '__fastcall initTranslatedString'; + +var + i, j: Integer; + S: UTF8String; + b: Boolean; +begin + IniName := GetStartDir + NamePlugyLocal; + if FileExists(IniName) then Exit; + S := #$EF#$BB#$BF';UTF8'; + for i := 0 to MaxStr do + begin + S := S + #$0D#$0A'[' + LocalStrings[i].name + ']'#$0D#$0A + sLng[0] + '="' + + LocalStrings[i].value + '"'#$0D#$0A; + for j := 1 to MaxLng do + S := S + sLng[j] + '='#$0D#$0A; + end; + for i := 0 to MaxType do + begin + S := S + #$0D#$0A; + b := (StrTypes[i].k <> ''); + if b then + S := S + ';'; + S := S + '[' + StrTypes[i].c + ']'#$0D#$0A; + + if b then + S := S + ';'; + S := S + sLng[0] + '="' + StrTypes[i].s + '"'#$0D#$0A; + if not b then + begin + for j := 1 to MaxLng do + S := S + sLng[j] + '='#$0D#$0A; + end; + end; + StrSaveToFile(IniName, S); +end. diff --git a/PlugYLocal/PlugYLocal.ini b/PlugYLocal/PlugYLocal.ini new file mode 100644 index 0000000..dcec7bf --- /dev/null +++ b/PlugYLocal/PlugYLocal.ini @@ -0,0 +1,1655 @@ +;UTF8 +;Sorry for https:;translate.google.com +[STR_STATS_UNASSIGN_WITH_LIMIT] +ENG="+Alt: Unassign, +Shift: by %d points" +ESP="+Alt: Désallocation, +Shift: par %d points" +DEU="+Alt: Zurücksetzen, +Shift: um %d Punkte" +FRA="+Alt: Rimuovi, +Shift: Assegna %d punti" +POR="+Alt: Quita, +Shift: por %d puntos" +ITA="+Alt: Odejmij, +Shift: %d punktów" +JPN="+Alt: 取消加点, +Shift: %d 点数" +KOR="+Alt: 할당, +Shift: %d 포인트로" +SIN= +CHI="+Alt: 分配, +Shift: %d 分" +POL="+Alt: Przypisywanie, +Shift: o %d punkty" +RUS="+Alt: Вычесть, +Shift: по %d очка" + +[STR_STATS_UNASSIGN_WITHOUT_LIMIT] +ENG="+Alt: Unassign, +Shift: all remaining points" +ESP="+Alt: Désallocation, +Shift: Tous les points restants" +DEU="+Alt: Zurücksetzen, +Shift: Alle verbleibenden Punkte" +FRA="+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti" +POR="+Alt: Quita, +Shift: Todos los puntos restantes" +ITA="+Alt: Odejmij, +Shift: wszystkie pozostale punkty" +JPN="+Alt: 取消加点, +Shift: 所有剩" +KOR="+Alt: 할당, +Shift: 남아있는 모든 포인트를" +SIN= +CHI="+Alt:分配, + Shift: 所有剩余点" +POL="+Alt: Przypisywanie, +Shift: wszystkie pozostałe punkty" +RUS="+Alt: Вычесть, +Shift: все оставшиеся очки" + +[STR_STATS_BASE_MIN] +ENG="Base: %d (Min: %d)" +ESP="Base: %d (Min: %d)" +DEU="Basiswert: %d (Min: %d)" +FRA="Base: %d (Min: %d)" +POR="Base: %d (Min: %d)" +ITA="Bazowo: %d (Minimum: %d)" +JPN="基础: %d (最小: %d)" +KOR="기본: %d (최소: %d)" +SIN= +CHI="基地: %d (最小: %d)" +POL="Podstawowe %d Min.: %d)" +RUS="Базовое: %d (Мин.: %d)" + +[STR_SKILLS_UNASSIGN] +ENG="Un-allocate all skills points" +ESP="Désalloue tous les points d'aptitudes" +DEU="Alle Fertigkeitspunkte zurücksetzen" +FRA="Rimuovi tutte le abilità" +POR="Quita todos los puntos de habilidades" +ITA="Rozdaj od nowa wszystkie punkty umiejetnosci" +JPN="取消所有技能加点" +KOR="모든 스킬 포인트를 해제 할당" +SIN= +CHI="取消分配所有技能點" +POL="Un przydzielić wszystkie punkty umiejętności" +RUS="Сбросить все навыки" + +[STR_STASH_PREVIOUS_PAGE] +ENG="Previous Page (+Shift: First Page)" +ESP="Page précédente (+Shift: Première page)" +DEU="Vorherige Seite (+Shift: Erste Seite)" +FRA="Pagina Precedente (+Shift: Prima Pagina)" +POR="Pagina anterior (+Shift: Primera Pagina)" +ITA="Poprzednia Strona (+Shift: Pierwsza Strona)" +JPN="上一页 (+Shift: 首页)" +KOR="이전 페이지 (+Shift: 첫 페이지)" +SIN= +CHI="上一頁 (+Shift: 第一頁)" +POL="Poprzednia strona (+Shift: pierwsza strona)" +RUS="Предыдущая страница (+Shift: первая страница)" + +[STR_STASH_NEXT_PAGE] +ENG="Next Page (+Shift: Last not empty Page)" +ESP="Page suivante (+Shift: Dernière page non vide)" +DEU="Nächste Seite (+Shift: Letzte nicht leere Seite )" +FRA="Pagina Successiva (+Shift: Ultima Pagina non vuota)" +POR="Pagina Siguiente (+Shift: Ultima pagina non vacia)" +ITA="Nastepna Strona (+Shift: Ostatnia nie pusta Strona)" +JPN="下一页 (+Shift: 最后非空页)" +KOR="다음 페이지 (+Shift: 마지막 비어 있지 않은 페이지)" +SIN= +CHI="下一頁 (+Shift: 最後非空頁)" +POL="Następna strona (+Shift: Ostatnio nie pusta strona)" +RUS="Последняя страница (+Shift: последняя непустая страница)" + +[STR_TOGGLE_TO_PERSONAL] +ENG="Toggle to Personal Stash" +ESP="Voir coffre personnel" +DEU="Wechselt zum persönlichen Goldschatz" +FRA="Vai all'Inventario Personale" +POR="Ver el cofre personal" +ITA="Przejdz do Skrzyni Osobistej" +JPN="切换到个人储物箱" +KOR="개인 은닉로 전환" +SIN= +CHI="切換到個人藏匿處" +POL="Przełącz do osobistego pierś" +RUS="Переключить на личный сундук" + +[STR_TOGGLE_TO_SHARED] +ENG="Toggle to Shared Stash" +ESP="Voir coffre partagé" +DEU="Wechselt zum gemeinsamen Goldschatz" +FRA="Vai all'Inventario Condiviso" +POR="Ver el cofre compartido" +ITA="Przejdz do Skrzyni Wspólnej" +JPN="切换到共享储物箱" +KOR="공유 은닉로 전환" +SIN= +CHI="切換到共享藏匿處" +POL="Przełącz się na wspólnym pierś" +RUS="Переключить на общий сундук" + +[STR_STASH_PREVIOUS_INDEX] +ENG="Previous Index : by %d Pages (+Shift: %d)" +ESP="Index précédent : par %d pages (+shift: %d)" +DEU="Vorheriger Index: in %d Seiten (+shift: %d)" +FRA="Schermata Precedente : Indietro di %d Pagine (+Shift: %d)" +POR="Indice anterior : por %d paginas (+shift: %d)" +ITA="Poprzednia Strona : po %d Stron (+Shift: %d)" +JPN="向前索引 : %d 页 (+Shift: %d)" +KOR="이전 색인 : %d 페이지로 (+Shift: %d)" +SIN= +CHI="上一頁目錄 : %d 個頁面 (+Shift: %d)" +POL="Poprzednie Index : przez %d Pages (+Shift: %d)" +RUS="Переход назад на %d страниц (+Shift: %d)" + +[STR_STASH_NEXT_INDEX] +ENG="Next Index : by %d Pages (+shift: %d)" +ESP="Index suivant : par %d pages (+shift: %d)" +DEU="Nächster Index: in %d Seiten (+shift: %d)" +FRA="Schermata Successiva : Avanti di %d Pagine (+shift: %d)" +POR="Indice siguiente : por %d paginas (+shift: %d)" +ITA="Nastepna Strona : po %d Stron (+shift: %d)" +JPN="向后索引 : %d 页 (+shift: %d)" +KOR="다음 인덱스 : %d 페이지로 (+shift: %d)" +SIN= +CHI="下一頁索引 : %d 個頁面 (+shift: %d)" +POL="Następny Index : przez d% Strony (+shift: %d)" +RUS="Переход вперед : на %d страниц (+shift: %d)" + +[STR_PUT_GOLD] +ENG="Put Gold" +ESP="Poser de l'Or" +DEU="Gib Gold" +FRA="Immetti Oro" +POR="Poner oro" +ITA="Zdeponuj Zloto" +JPN="放入金币" +KOR="골드 넣어" +SIN= +CHI="金放" +POL="Put złoto" +RUS="Добавить золото" + +[STR_TAKE_GOLD] +ENG="Take Gold" +ESP="Prendre de l'Or" +DEU="Nehme Gold" +FRA="Ritira Oro" +POR="Tomar oro" +ITA="Wyplac zloto" +JPN="取出金币" +KOR="금을" +SIN= +CHI="拿到金牌" +POL="Weź złoto" +RUS="Забрать золото" + +[STR_PERSONAL_PAGE_NUMBER] +ENG="Personal Page n°%u" +ESP="Page perso n°%u" +DEU="Persönliche Seite n°%u" +FRA="Pagina Personale n°%u" +POR="Pagina personal n°%u" +ITA="Strona Osobista n°%u" +JPN="个人储物箱 n°%u" +KOR="개인 페이지 n°%u" +SIN= +CHI="個人主頁 n°%u" +POL="Strona osobista n°%u" +RUS="Личная страница n°%u" + +[STR_SHARED_PAGE_NUMBER] +ENG="Shared Page n°%u" +ESP="Page partagée n°%u" +DEU="Gemeinsame Seite n°%u" +FRA="Pagina Condivisa n°%u" +POR="Pagina personal n°%u" +ITA="Strona Wspólna n°%u" +JPN="共享储物箱 n°%u" +KOR="공유 페이지 n°%u" +SIN= +CHI="共享頁 n°%u" +POL="Wspólna strona n°%u" +RUS="Общая страница N°%u" + +[STR_NO_SELECTED_PAGE] +ENG="No selected page" +ESP="Aucune page sélectionnée" +DEU="Keine ausgewählte Seite" +FRA="Nessuna pagina selezionata" +POR="Ninguna pagina seleccionada" +ITA="Nie zaznaczono strony" +JPN="未使用页" +KOR="없음 선택한 페이지가 없습니다" +SIN= +CHI="沒有選擇的頁" +POL="Nie wybrano stronę" +RUS="Нет указанной страницы" + +[STR_SHARED_GOLD_QUANTITY] +ENG="Shared Gold : %u" +ESP="Or partagé : %u" +DEU="Gemeinsamen Gold : %u" +FRA="Oro Condiviso : %u" +POR="Oro compartido : %u" +ITA="Wspólne Zloto : %u" +JPN="共享金币 : %u" +KOR="공유 골드 : %u" +SIN= +CHI="共享金 : %u" +POL="Wspólna Złoto : %u" +RUS="Общее золото : %u" + +[STR_PREVIOUS_PAGE] +ENG="Previous Page" +ESP="Page précédente" +DEU="Vorherige Seite" +FRA="Pagina Precedente" +POR="Pagina anterior" +ITA="Poprzednia Strona" +JPN="上一页" +KOR="이전 페이지" +SIN= +CHI="上一頁" +POL="Poprzednia strona" +RUS="Предыдущая страница" + +[STR_NEXT_PAGE] +ENG="Next Page" +ESP="Page suivante" +DEU="Nächste Seite" +FRA="Pagina Successiva" +POR="Pagina siguiente" +ITA="Nastepna Strona" +JPN="下一页" +KOR="다음 페이지" +SIN= +CHI="下一頁" +POL="Następna strona" +RUS="Следующая страница" + +[STR_ITEM_LEVEL] +ENG="Item Level: %u" +ESP="Nivel de objeto: %u" +DEU="Gegenstandsstufe: %u" +FRA="Niveau d'objet: %u" +POR="Nível do item: %u" +ITA="Livello oggetto" +JPN="アイテム・レベル: %u" +KOR="아이템 레벨: %u" +SIN= +CHI="物品等級: %u" +POL="Poziom przedmiotu: %u" +RUS="Уровень предмета: %u" + +;who should - add translation +[STR_COW_PORTAL] +ENG="Cow Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Коровий портал" + +[STR_PANDEMONIUM_PORTAL] +ENG="Pandemonium Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Адский Портал" + +[STR_PANDEMONIUM_FINAL_PORTAL] +ENG="Pandemonium Final Portal" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Финальный Адский Портал" + +[STR_FULL] +ENG="Fully " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Полностью " + +[STR_REPAIR] +ENG="Repair " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Починенный [fs]Починенная [ns]Починенное [pl]Починенные " + +[STR_AND] +ENG="and " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="и " + +[STR_RECHARGE] +ENG="Recharge " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Перезаряженный [fs]Перезаряженная [ns]Перезаряженное [pl]Перезаряженные " + +[STR_DESTROY_FILLERS] +ENG="Destroys Fillers " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Без ячеек " + +[STR_REMOVE_FILLERS] +ENG="Remove Fillers " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="С пустыми ячейками в " + +[STR_REGENERATE] +ENG="Regenerate " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Восстановленный [fs]Восстановленная [ns]Восстановленное [pl]Восстановленные " + +[STR_WITH_N_SOCKETS] +ENG="with %u Sockets " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="c %u ячейками " + +[STR_ETHERAL] +ENG="Ethereal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Эфирный [fs]Эфирная [ns]Эфирное [pl]Эфирные " + +[STR_NOT_ETHERAL] +ENG="Not Ethereal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Не эфирный [fs]Не эфирная [ns]Не эфирное [pl]Не эфирные " + +[STR_NOT_RUNEWORD] +ENG="Not Runeword " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Без рунного слова " + +[STR_BASIC] +ENG="Basic " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Простой [fs]Простая [ns]Простое [pl]Простые " + +[STR_EXCEPTIONAL] +ENG="Exceptional " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Исключительный [fs]Исключительная [ns]Исключительное [pl]Исключительные " + +[STR_ELITE] +ENG="Elite " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Элитный [fs]Элитная [ns]Элитное [pl]Элитные " + +[STR_CRACKED] +ENG="Cracked " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Сломанный [fs]Сломанная [ns]Сломанное [pl]Сломанные " + +[STR_NORMAL] +ENG="Normal " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Нормальный [fs]Нормальная [ns]Нормальное [pl]Нормальные " + +[STR_SUPERIOR] +ENG="Superior " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Превосходный [fs]Превосходная [ns]Превосходное [pl]Превосходные " + +[STR_MAGIC] +ENG="Magic " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Магический [fs]Магическая [ns]Магическое [pl]Магические " + +[STR_SET] +ENG="Set " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Наборный [fs]Наборная [ns]Наборное [pl]Наборные " + +[STR_RARE] +ENG="Rare " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Редкий [fs]Редкая [ns]Редкое [pl]Редкие " + +[STR_UNIQUE] +ENG="Unique " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Уникальный [fs]Уникальная [ns]Уникальное [pl]Уникальные " + +[STR_CRAFTED] +ENG="Crafted " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Создаваемый [fs]Создаваемая [ns]Создаваемое [pl]Создаваемые " + +[STR_TEMPERED] +ENG="Tempered " +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Закаленный [fs]Закаленная [ns]Закаленное [pl]Закаленные " + +[STR_ITEM] +ENG="Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет" + +[STR_ITEM_SAME_TYPE] +ENG="Item of the same type" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет того же типа" + +[STR_OR_UPGRADED] +ENG=" (or upgraded)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (или выше уровнем)" + +[STR_WITHOUT_SOCKET] +ENG=" without Socket" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" без ячеек" + +[STR_WITH_SOCKET] +ENG=" with Sockets" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" с ячейками" + + +[STR_ONLY_N_H] +ENG=" (Nightmare and Hell only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только на уровнях Кошмар и Ад)" + +[STR_ONLY_HELL] +ENG=" (Hell only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только на уровне Ад)" + +[STR_ONLY_CLASS] +ENG=" (%s only)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS=" (только %s)" + +[shie] +ENG="Shield (Not Class Specific)" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Щит (без привязки к классу)" + +[tors] +ENG="Body Armor" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Нательная броня" + +;[gold] +;ENG="Gold" + +;[bowq] +;ENG="Arrows" + +;[xboq] +;ENG="Bolts" + +;[play] +;ENG="Ear" + +;[herb] +;ENG="Herb" + +[poti] +ENG="Potion" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Зелье" + +;[ring] +;ENG="Ring" + +;[elix] +;ENG="Elixir" + +;[amul] +;ENG="Amulet" + +[char] +ENG="Charm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[msы]Талисман" + +;[boot] +;ENG="Boots" + +[glov] +ENG="Gloves" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[pl]Перчатки" + +[book] +ENG="Book" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Книга" + +;[belt] +;ENG="Belt" + +[gem ] +ENG="Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Драгоценный камень" + +;[torc] +;ENG="Torch" + +[scro] +ENG="Scroll" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Свиток" + +;[scep] +;ENG="Scepter" + +;[wand] +;ENG="Wand" + +[staf] +ENG="Staff" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Посох" + +[bow ] +ENG="Bow" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Лук" + +;[axe ] +;ENG="Axe" + +;[club] +;ENG="Club" + +[swor] +ENG="Sword" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Меч" + +[hamm] +ENG="Hammer" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Молот" + +[knif] +ENG="Knife" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Нож" + +;[spea] +;ENG="Spear" + +[pole] +ENG="Polearm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Алебарада" + +;[xbow] +;ENG="Crossbow" + +;[mace] +;ENG="Mace" + +;[helm] +;ENG="Helm" + +[tpot] +ENG="Missile Potion" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Зелье стрельбы" + +[ques] +ENG="Quest Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Квестовая вещь" + +[body] +ENG="Body Part" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Часть тела" + +;[key ] +;ENG="Key" + +;[tkni] +;ENG="Throwing Knife" + +;[taxe] +;ENG="Throwing Axe" + +;[jave] +;ENG="Javelin" + +[weap] +ENG="Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Оружие" + +[mele] +ENG="Melee Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Оружие ближнего боя" + +[miss] +ENG="Missile Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Стреляющее оружие" + +[thro] +ENG="Throwing Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Метательное оружие" + +[comb] +ENG="Combo Weapon" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Комбинированное оружие" + +[armo] +ENG="Armor" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Броня" + +[shld] +ENG="Any Shield" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Любой щит" + +[misc] +ENG="Miscellaneous" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Любой предмет" + +[sock] +ENG="Socket Filler" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS= + +[seco] +ENG="Second Hand Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для второй руки" + +[rod ] +ENG="Staves And Rods" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[pl]Посохи и Жезлы" + +[misl] +ENG="Missile" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Снаряд" + +[blun] +ENG="Blunt" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Тупое оружие" + +;[jewl] +;ENG="Jewel" + +[clas] +ENG="Class Specific" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS= + +[amaz] +ENG="Amazon Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для амазонки" + +[barb] +ENG="Barbarian Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для варвара" + +[necr] +ENG="Necromancer Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для некроманта" + +[pala] +ENG="Paladin Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для паладина" + +[sorc] +ENG="Sorceress Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для волшебницы" + +[assn] +ENG="Assassin Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для ассасины" + +[drui] +ENG="Druid Item" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Предмет для друида" + +[h2h ] +ENG="Claw" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Коготь" + +[h2h2] +ENG="Assassin Claw" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Коготь ассасин" + +[orb ] +ENG="Orb" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Сфера" + +[head] +ENG="Voodoo Heads" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[fs]Голова Вуду" + +[ashd] +ENG="Paladin Shield" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Щит паладина" + +[phlm] +ENG="Barbarian Helm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Шлем варвара" + +[pelt] +ENG="Druid Helm" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Шлем друида" + +;[cloa] +;ENG="Cloak" + +[rune] +ENG="Rune" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Руна" + +;[circ] +;ENG="Circlet" + +;[hpot] +;ENG="Healing Potion" + +;[mpot] +;ENG="Mana Potion" + +;[rpot] +;ENG="Rejuvenation potion" + +;[spot] +;ENG="Stamina Potion" + +;[apot] +;ENG="Antidote Potion" + +;[wpot] +;ENG="Thawing Potion" + +;[scha] +;ENG="Small Charm" + +;[mcha] +;ENG="Large Charm" + +;[lcha] +;ENG="Grand Charm" + +[abow] +ENG="Amazon Bow" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Лук амазонки" + +[aspe] +ENG="Amazon Spear" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ns]Копье амазонки" + +[ajav] +ENG="Amazon Javelin" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="[ms]Дротик амазонки" + +[mboq] +ENG="Magic Arrows" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Магические стрелы" + +[mxbq] +ENG="Magic Bolts" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Магические арбалетные стрелы" + +[gem0] +ENG="Chipped Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Надколотый драгоценный камень" + +[gem1] +ENG="Flawed Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Мутный драгоценный камень" + +[gem2] +ENG="Normal Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Нормальный драгоценный камень" + +[gem3] +ENG="Flawless Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Безупречный драгоценный камень" + +[gem4] +ENG="Perfect Gem" +ESP= +DEU= +FRA= +POR= +ITA= +JPN= +KOR= +SIN= +CHI= +POL= +RUS="Идеальный драгоценный камень" + +;[gema] +;ENG="Amethyst" + +;[gemd] +;ENG="Diamond" + +;[geme] +;ENG="Emerald" + +;[gemr] +;ENG="Ruby" + +;[gems] +;ENG="Sapphire" + +;[gemt] +;ENG="Topaz" + +;[gemz] +;ENG="Skull" diff --git a/PlugYLocal/PlugYLocal.res b/PlugYLocal/PlugYLocal.res new file mode 100644 index 0000000..d817fad Binary files /dev/null and b/PlugYLocal/PlugYLocal.res differ diff --git a/PlugYRun/PlugYRun.aps b/PlugYRun/PlugYRun.aps index c472084..d861253 100644 Binary files a/PlugYRun/PlugYRun.aps and b/PlugYRun/PlugYRun.aps differ diff --git a/PlugYRun/PlugYRun.cpp b/PlugYRun/PlugYRun.cpp index 4b0552d..9175dec 100644 --- a/PlugYRun/PlugYRun.cpp +++ b/PlugYRun/PlugYRun.cpp @@ -1,9 +1,11 @@ /* File created by Yohann NICOLAS. + Add support 1.13d by L'Autour. */ #include #include #include +#include "../Commons/VersionInfo.h" //#using //#using //using namespace EnvDTE; @@ -32,13 +34,14 @@ $+40 >CD AB BA DC 00 00 00 00 ͫ */ #define SUBKEY "Software\\Blizzard Entertainment\\Diablo II" -#define GAMEFILE "\\Game.exe " +#define GAMEFILE "\\Game.exe" #define INIFILE "\\PlugY.ini" #define LAUNCHING "LAUNCHING" #define LOD_VERSION "LodVersionFolder" #define PARAM "Param" #define LIBRARY_NAME "Library" + BYTE loadDll[]={ 0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4] 0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA @@ -101,6 +104,7 @@ BYTE freeDll[]={ //LPCSTR dllName = "PlugY.dll"; LPCSTR initFctName = "_Init@4"; LPCSTR releaseFctName = "_Release@0"; + static bool versionXP; typedef int (__stdcall* tDebugActiveProcessStop)(DWORD); @@ -113,24 +117,27 @@ void assertion(LPCSTR msg) exit(1); } -bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) +bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd, int ver) { BYTE buf[200]; DWORD pos=0; SIZE_T nb=0; - DWORD version; + SIZE_T nb2=0; + //DWORD version; int res; - - // Get Version and needed addresses. - res = ReadProcessMemory(h,(LPVOID)(addr+0x110),&version,4,&nb);//0x80 - if (!res || (nb!=4)) assertion("Read to get current d2gfx version in memory failed"); + + // Get Version and needed addresses. +/* res = ReadProcessMemory(h,(LPVOID)(addr+0x110),&version,4,&nb);//0x80 + if (!res || (nb!=4)) assertion("Read to get current d2gfx version in memory failed"); +*/ DWORD loadCallerAddr = addr; DWORD freeCallerAddr = addr; DWORD loadLibraryAddr = addr; DWORD freeLibraryAddr = addr; DWORD getProcAddressAddr = addr; // GET_VERSION(D2gfx, 110, 000054EB, 00001000, 0000C000, 42E6C22A, 43028B19);//110 +/* switch (version) { case 0x000054EB://1.09b 0x00949FA8: @@ -169,7 +176,7 @@ bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) freeLibraryAddr += 0xD12C; getProcAddressAddr += 0xD120; break; - case 0x00000000://1.13c + case 0x00000000://1.13 loadCallerAddr += 0xB423; freeCallerAddr += 0xB3CA; loadLibraryAddr += 0xD11C; @@ -178,8 +185,67 @@ bool installPlugY(HANDLE h, DWORD addr, char* libraryName, int isAdd) break; default: assertion("Wrong version of the library D2gfx.dll"); + }*/ + + switch (ver) + { + case v109b: + case v109d: + loadCallerAddr += 0x389B; + freeCallerAddr += 0x3A8C; + loadLibraryAddr += 0xC03C; + freeLibraryAddr += 0xC044; + getProcAddressAddr += 0xC038; + break; + case v110: + loadCallerAddr += 0x3870; + freeCallerAddr += 0x3A6D; + loadLibraryAddr += 0xC040; + freeLibraryAddr += 0xC048; + getProcAddressAddr += 0xC03C; + break; + case v111: + loadCallerAddr += 0x8B23; + freeCallerAddr += 0x8ACA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case v111b: + loadCallerAddr += 0xB423; + freeCallerAddr += 0xB3CA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case v112: + loadCallerAddr += 0x8F63; + freeCallerAddr += 0x8F0A; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case v113c: + loadCallerAddr += 0xB423; + freeCallerAddr += 0xB3CA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD12C; + getProcAddressAddr += 0xD120; + break; + case v113d: + loadCallerAddr += 0xAA03; + freeCallerAddr += 0xA9AA; + loadLibraryAddr += 0xD11C; + freeLibraryAddr += 0xD124; + getProcAddressAddr += 0xD120; + break; + default: + return false;//assertion("Wrong version of the Game.exe"); } +//const char sD2Ver[8][7] = {{"v1.09b"},{"v1.09d"},{"v1.10 "},{"v1.11 "},{"v1.11b"},{"v1.12 "},{"v1.13c"},{"v1.13d"}}; +//assertion(sD2Ver[version]); + //Verify if memory are ok. bool alreadyInstalled = false; res = ReadProcessMemory(h,(LPVOID)loadCallerAddr,buf,6,&nb); @@ -360,7 +426,7 @@ bool launchNormal(char* command, char* currentDirectory) return success?true:false; } -bool launchGame98(char* command, char* currentDirectory, char* libraryName) +bool launchGame98(char* command, char* currentDirectory, char* libraryName, int ver) { // MessageBox(0, "LAUNCH 98", "PlugYRun", MB_OK|MB_ICONASTERISK); STARTUPINFO si; @@ -383,14 +449,14 @@ bool launchGame98(char* command, char* currentDirectory, char* libraryName) if (isD2gfx(pi.hProcess,(LPVOID)0x6FA80000)) { // MessageBox(0, "INSTALL 98", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, 0x6FA80000, libraryName, 1); + installPlugY(pi.hProcess, 0x6FA80000, libraryName, 1, ver); ResumeThread(pi.hThread); return true; } if (isD2gfx(pi.hProcess,(LPVOID)0x6FA70000)) { // MessageBox(0, "INSTALL 98", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, 0x6FA70000, libraryName, 0); + installPlugY(pi.hProcess, 0x6FA70000, libraryName, 0, ver); ResumeThread(pi.hThread); return true; } @@ -401,7 +467,7 @@ bool launchGame98(char* command, char* currentDirectory, char* libraryName) } -bool launchGameXP(char* command, char* currentDirectory, char* libraryName) +bool launchGameXP(char* command, char* currentDirectory, char* libraryName, int ver) { // MessageBox(0, "LAUNCH XP", "PlugYRun", MB_OK|MB_ICONASTERISK); STARTUPINFO si; @@ -442,7 +508,7 @@ bool launchGameXP(char* command, char* currentDirectory, char* libraryName) if(isD2gfx(pi.hProcess, DebugEvent.u.LoadDll.lpBaseOfDll)) { // MessageBox(0, "INSTALL XP", "PlugYRun", MB_OK|MB_ICONASTERISK); - installPlugY(pi.hProcess, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000); + installPlugY(pi.hProcess, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll, libraryName, (DWORD)DebugEvent.u.LoadDll.lpBaseOfDll == 0x6FA8000, ver); CloseHandle(DebugEvent.u.LoadDll.hFile); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); @@ -465,6 +531,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine char currrentDirectory[MAX_PATH]; char iniFileName[MAX_PATH]; char command[MAX_PATH+50]; + int ver; // MessageBox(NULL,"START","PlugYRun",MB_OK); //Get Current Directory. @@ -489,6 +556,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine if (!getWinReg(command, MAX_PATH+50)) return 1; + ver = GetD2Version(command); + if (ver == -1) assertion("Wrong version of the Game.exe"); + strcat(command, " "); + //Add params. strcat(command,lpCmdLine); len = strlen(command); @@ -496,7 +567,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine //copyLodVersionFiles(); - char libraryName[50]; + char libraryName[50]; if (!GetPrivateProfileString(LAUNCHING,LIBRARY_NAME,"",libraryName,50,iniFileName) || !libraryName[0]) return !launchNormal(command, currrentDirectory); @@ -506,9 +577,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { debugActiveProcessStop = (tDebugActiveProcessStop) GetProcAddress(module,"DebugActiveProcessStop"); if (debugActiveProcessStop) - return !launchGameXP(command, currrentDirectory, libraryName); + return !launchGameXP(command, currrentDirectory, libraryName, ver); } - return !launchGame98(command, currrentDirectory, libraryName); + return !launchGame98(command, currrentDirectory, libraryName, ver); } diff --git a/PlugYRun/PlugYRun.rc b/PlugYRun/PlugYRun.rc index 289a11d..d5bcbde 100644 --- a/PlugYRun/PlugYRun.rc +++ b/PlugYRun/PlugYRun.rc @@ -65,8 +65,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,3,0 - PRODUCTVERSION 1,0,3,0 + FILEVERSION 1,0,5,0 + PRODUCTVERSION 1,0,5,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -81,11 +81,12 @@ BEGIN BEGIN BLOCK "040c04b0" BEGIN + VALUE "Comments", "Modified by L'Autour" VALUE "CompanyName", "Yohann NICOLAS" - VALUE "FileVersion", "1.03" + VALUE "FileVersion", "1.05" VALUE "OriginalFilename", "PlugY.exe" VALUE "ProductName", "PlugY launcher." - VALUE "ProductVersion", "1.03" + VALUE "ProductVersion", "1.05" END END BLOCK "VarFileInfo" diff --git a/PlugYRun/PlugYRun.suo b/PlugYRun/PlugYRun.suo index f38be8e..cca6eed 100644 Binary files a/PlugYRun/PlugYRun.suo and b/PlugYRun/PlugYRun.suo differ diff --git a/PlugYRun/PlugYRun.vcproj b/PlugYRun/PlugYRun.vcproj index cef86b6..ffaa739 100644 --- a/PlugYRun/PlugYRun.vcproj +++ b/PlugYRun/PlugYRun.vcproj @@ -174,7 +174,7 @@ /> @@ -189,6 +189,14 @@ RelativePath="PlugYRun.cpp" > + + + + + + + +