v14.00 by Yohann

This commit is contained in:
ChaosMarc 2021-01-04 08:07:29 +01:00
parent c8849ef0fa
commit 2597bc3946
No known key found for this signature in database
GPG Key ID: E1116DF82FEF02EC
106 changed files with 7790 additions and 7535 deletions

View File

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

View File

@ -16,6 +16,14 @@ struct Unit;
struct SkillsBIN;
struct SkillData;
struct ObjectsBIN;
struct NetClient;
struct Game;
struct ActMap;
struct ActData;
struct Level;
struct RoomEx;
struct Room;
/*=================================================================*/
/* Skill Structure. */
@ -59,7 +67,7 @@ struct Position
DWORD y;
};
struct Room//size=0x80
/*struct Room//size=0x80
{
//ptRoom +48 0 = spawn new units (monster, objects e.tc), 1 = don't spawn any new units
DWORD seed1; //+00
@ -79,17 +87,107 @@ struct Room//size=0x80
BYTE isGenerated2:1;//???
};
};
};
};*/
struct ActMap//ptGame+BC size=0x60
struct RoomEx //size=5C
{
DWORD isNotManaged;
DWORD uk4;
DWORD uk8;//size = 0x488
Room* ptFirstRoom;
DWORD __00[2]; //0x00
RoomEx** roomExNear; //0x08
DWORD __0C[5]; //0x0C
struct {
INT32 roomNumber; //0x00
void* __04; //0x04
PINT32 subNumber; //0x08
} *pType2Info; //0x20
RoomEx* ptNextRoomEx; //0x24
UINT32 roomFlags; //0x28
UINT32 roomsNearCount; //0x2C
Room* ptRoom; //0x30
INT32 posX; //0x34
INT32 posY; //0x38
INT32 sizeX; //0x3C
INT32 sizeY; //0x40
DWORD __44; //0x44
UINT32 presetType; //0x48
void* ptWarpTiles; //0x4C
DWORD __50[2]; //0x50
Level* ptLevel; //0x58
};
struct Room //size=0x80
{
Room** ptNearRooms; //0x00
DWORD __04[3]; //0x04
RoomEx* ptRoomEx; //0x10
DWORD __14[3]; //0x14
void* coll; //0x20
INT32 nbNearRooms; //0x24
DWORD __28[9]; //0x28
DWORD startX; //0x4C
DWORD startY; //0x50
DWORD sizeX; //0x54
DWORD sizeY; //0x58
DWORD __5C[6]; //0x5C
Unit* ptFirstUnit; //0x74
DWORD __78; //0x78
Room* ptNextRoom; //0x7C
};
struct Level //size=0x234
{
DWORD type; //+000
DWORD flags; //+004
DWORD __004_010[2]; //+008
RoomEx* ptFirstRoomEx; //+010
DWORD __014_01C[2]; //+014
INT32 posX; //+01C
INT32 posY; //+020
INT32 sizeX; //+024
INT32 sizeY; //+028
DWORD __0C2_1AC[96]; //+02C
Level* ptNextLevel; //+1AC
DWORD __1B0; //+1B0
ActData* ptActData; //+1B4
DWORD __1B8_1C0[2]; //+1B8
DWORD levelType; //+1C0
DWORD seed1; //+1C4
DWORD seed2; //+1C8
DWORD uk_1CC; //+1CC
UINT32 levelNo; //+1D0
DWORD __1D4_234[96]; //+1D4
};
struct ActData //size=0x488
{
DWORD seed1; //+000
DWORD seed2; //+004
DWORD nbRooms; //+008
DWORD __00C_0094[34]; //+00C
DWORD nTalRashaTombLevel; //094
DWORD __098; //+098
Game* ptGame; //+09C
DWORD __0A0_450[237]; //+0A0
BYTE difficulty; //+450
BYTE __451_46C[27]; //+451
ActMap* ptActMap; //+46C
DWORD __470_484[5]; //+470
DWORD nBossMummyTombLevel;//+484
};
struct ActMap //size=0x60
{
DWORD isNotManaged; //+00
DWORD __04; //+04
DWORD townLevel; //+08
DWORD seed; //+0C
Room* ptFirstRoom; //+10
DWORD actNumber; //+14
DWORD __18_48[12]; //+18
ActData* ptActData; //+48
DWORD __50_5C[4]; //+4C
void* ptMemoryPool; //+5C
};
struct NetClient;
//ptGame : 04E4007C
struct Game
{ //Offset from Code.
@ -104,7 +202,9 @@ struct Game
WORD unknown2; //+78
BYTE uk4[0x0E]; //+7A
NetClient* ptClient; //+88
BYTE uk8C[0x30]; //+8C
BYTE __8C[0x1C]; //+8C
DWORD gameFrame; //+A8
BYTE __AC[0x10]; //+AC
ActMap* mapAct[5]; //+BC
BYTE ukD0[0x1024]; //+D0
DWORD* game10F4; //+10F4
@ -132,7 +232,7 @@ struct Path //(8 dword)
struct Inventory
{ //Offset from Code. Size: 30 <20> 40
{ //Offset from Code. Size: 30 to 40
DWORD tag; //+00 = 0x01020304
BYTE uk1[0x04]; //+04 =? 0
Unit* ptChar; //+08
@ -200,24 +300,49 @@ struct Stats //sizeof(Stats)=0x64
DWORD unknow2; //+60 (=0)
};
struct AIControl
{
DWORD specialState; // +00 SpecialState - stuff like terror, confusion goes here
void* aiFunction; // +04 fpAiFunction(); - the primary ai function to call (void * __fastcall)(pGame,pUnit,pAiTickArgs);
DWORD aiFlags; // +08 AiFlags
DWORD ownerGUID; // +0C OwnerGUID - the global unique identifier of the boss or minion owner
DWORD ownerType; // +10 eOwnerType - the unit type of the boss or minion owner
DWORD args[3]; // +14 dwArgs[3] - three dwords holding custom data used by ai func to store counters (etc)
void* cmdCurrent; // +20 pCmdCurrents
void* cmdLast; // +24 pCmdLast
Game* ptGame; // +28 pGame
DWORD ownerGUID2; // +2C OwnerGUID - the same as +008
DWORD ownerType2; // +30 eOwnerType - the same as +00C
void* minionList; // +34 pMinionList - list of all minions, for boss units (SetBoss in MonStats, Unique, SuperUnique etc)
DWORD trapNo; // +3C eTrapNo - used by shadows for summoning traps (so they stick to one type usually)
};
struct MonsterData // sizeof(MonsterData)=0x60
{ //Offset from Code.
BYTE uk[0x16]; //+00
union {
WORD flags; //+16
struct {
WORD fuk1:1;
WORD isSuperUnique:1;
WORD isChampion:1;
WORD isUnique:1;
WORD fuk2:13;
MonStatsBIN* ptMonStats; //+000 - pMonStats - record in monstats.txt
BYTE components[0x10]; //+004 - Components[16] - bytes holding the component Ids for each component; Order: HD, TR, LG, RA, LA, RH, LH, SH, S1, S2, S3, S4, S5, S6, S7, S8
WORD seed; //+014 - NameSeed
union
{
BYTE flags; //+016 - TypeFlags
struct
{
BYTE isOther:1; // MONTYPE_OTHER(set for some champs, uniques)
BYTE isSuperUnique:1; // MONTYPE_SUPERUNIQUE
BYTE isChampion:1; // MONTYPE_CHAMPION
BYTE isUnique:1; // MONTYPE_UNIQUE
BYTE isMinion:1; // MONTYPE_MINION
BYTE isPossessed:1; // MONTYPE_POSSESSED
BYTE isGhostly:1; // MONTYPE_GHOSTLY
BYTE isMultishot:1; // MONTYPE_MULTISHOT
};
};
BYTE uk1[0x0E]; //+18
WORD superUniqueID; //+26
void* unknow1; //+28
BYTE uk2[0x38]; //+28
BYTE lastMode; //+017 - eLastMode
DWORD duriel; //+018 - dwDuriel - set only for duriel
BYTE monUModList[10]; //+01C - MonUModList[9] - nine bytes holding the Ids for each MonUMod assigned to the unit
DWORD superUniqueID; //+026
AIControl* ptAiGeneral; //+02A
BYTE uk2[0x32]; //+02E
};
struct ObjectData
@ -300,7 +425,7 @@ ITEMFLAG_RUNEWORD = 0x04000000
WORD prefix[3]; //+38
WORD suffix[3]; //+3E
BYTE equipLoc; //+44
/* emplacement si <20>quip<69>
/* location if equipped
* 00 = noequip/inBelt
* 01 = head
* 02 = neck
@ -404,7 +529,7 @@ struct Unit
}; //+04
DWORD nUnitId; //+08
DWORD nItemNum; //+0C
DWORD CurrentAnim; //+10
DWORD mode; //+10
union{
MonsterData* ptMonsterData;
ObjectData* ptObjectData;
@ -452,7 +577,7 @@ struct Unit
BYTE uk10[0x0C]; //+D4
Unit* ptFirstMonster; //+E0
Unit* Unit1; //+E4
Unit* Unit2; //+E8
Unit* ptNextUnitInRoom; //+E8
BYTE uk11[0x08]; //+EC
union{
CBPlayerData* ptCBPlayerData;

View File

@ -154,9 +154,20 @@ struct ObjectsBIN
};
struct ExperienceBIN//size=0x20
{
DWORD Amazon;
DWORD Sorceress;
DWORD Necromancer;
DWORD Paladin;
DWORD Barbarian;
DWORD Druid;
DWORD Assassin;
DWORD ExpRatio;
};
struct LevelsBIN//size=0x220
{
};
struct GemsBIN //size: 0xC0=192 (source : fct of dll)
@ -206,7 +217,7 @@ struct GemsBIN //size: 0xC0=192 (source : fct of dll)
DWORD shieldmod3max; //+BC
};
struct ItemsBIN //size: 0x1A8=424 (source : fct of dll) (nblines : 134 CA 8B) Gold:20B
struct ItemsBIN //size: 0x1A8=424 (source : fct of dll)
{
char FlippyFile[0x20]; //+00
char InvFile[0x20]; //+20
@ -380,33 +391,40 @@ struct RunesBIN //size: 0x120=288 (1.10 ok)
struct CharStatsBIN //size= 0xC4=196
{
WCHAR nameU[0x10];
char name[0x10];
BYTE baseSTR; //+20
BYTE baseDEX;
BYTE baseENE;
BYTE baseVIT;
BYTE baseStamina;
BYTE HPAdd;
BYTE percentStr;
BYTE percentDex;
BYTE percentInt;
BYTE percentVit;
WORD manaRegen;
DWORD toHitFactor;
BYTE walkVelocity;//+30
BYTE runVelocity;
BYTE runDrain;
BYTE lifePerLevel;
BYTE staminaPerLevel;
BYTE manaPerLevel;
BYTE lifePerVitality;
BYTE staminaPerVitality;
BYTE manaPerMagic;
BYTE blockFactor;
WORD startSkill;
DWORD baseWClass;
DWORD unknown1[3];
WCHAR nameU[0x10]; //+00
char name[0x10]; //+20
BYTE baseSTR; //+30
BYTE baseDEX; //+31
BYTE baseENE; //+32
BYTE baseVIT; //+33
BYTE baseStamina; //+34
BYTE hpadd; //+35
BYTE percentStr; //+36
BYTE percentInt; //+37
BYTE percentDex; //+38
BYTE percentVit; //+39
BYTE manaRegen; //+3A
BYTE __3B; //+3B
DWORD toHitFactor; //+3C
BYTE walkVelocity; //+40
BYTE runVelocity; //+41
BYTE runDrain; //+42
BYTE lifePerLevel; //+43
BYTE staminaPerLevel; //+44
BYTE manaPerLevel; //+45
BYTE lifePerVitality; //+46
BYTE staminaPerVitality; //+47
BYTE manaPerMagic; //+48
BYTE blockFactor; //+49
WORD __4A_startSkill; //+4A
DWORD baseWClass; //+4C
BYTE StatPerLevel; //+50
BYTE __51; //+51
WORD StrAllSkills; //+52
WORD StrSkillTab1; //+54
WORD StrSkillTab2; //+56
WORD StrSkillTab3; //+58
WORD StrClassOnly; //+5A
DWORD item1;
BYTE item1Loc;
BYTE item1Count;
@ -553,19 +571,28 @@ struct UniqueItemsBIN //size=0x14C (332)
struct {
BYTE ukf:2;
BYTE carry1:1;
BYTE ladder:1;
};
};
BYTE uk3[0x11F]; //+2D
};
struct SetsBIN //size=0x128 (source : fct of dll)
{
WORD setNum; //+00
WORD setNameIndex; //+02
BYTE uk3[0x124]; //+04
};
struct SetItemsBIN //size=0x1B8 (source : fct of dll)
{
WORD setId; //+00
WORD setNum; //+00
char index[0x20]; //+02
BYTE uk1; //+04
WORD setNameId; //+24
BYTE uk2[0x192]; //+26
BYTE uk2[0x6]; //+26
WORD setId; //+2C
BYTE uk3[0x18A]; //+2E
};
@ -895,7 +922,10 @@ struct MonStatsBIN //size=0x1A8 (424)
{
BYTE uk1[0x6]; //+00
WORD monsterNameID; //+06
BYTE uk2[0x1A0]; //+08
BYTE uk2[0x168]; //+08
WORD skill[8]; //+170
BYTE skillArg[8]; //+180
BYTE uk3[0x20]; //+188
}; //+1A8
struct ItemTypesBIN //size=0xE4 (228) (source : fct of dll)
@ -1179,7 +1209,10 @@ struct DataTables//01EE6A20 * 01FDA2D0 //second comments=1.11
BYTE uk8[0x18]; //+BE0
ItemTypesBIN* itemTypes; //+BF8
DWORD nbItemTypes; //+BFC
BYTE uk9[0x18]; //+C00
BYTE uk9[0x0C]; //+C00
SetsBIN* sets; //+C0C //1.11 and 1.10
DWORD nbSets; //+C10 //1.11 and 1.10
BYTE uk9b[0x4]; //+C14
SetItemsBIN* setItems; //+C18 //1.11 and 1.10
DWORD nbSetItems; //+C1C //1.11 and 1.10
BYTE uk10[0x4]; //+C20

View File

@ -15,9 +15,9 @@ struct Room;
#pragma pack(1)
struct sWinMessage
{
void* msg;
DWORD msg;
DWORD type;
DWORD uk1;
DWORD key;
WORD x;
WORD y;
DWORD uk3;
@ -95,6 +95,17 @@ struct ItemGenerationData //size=0x84
};
};
struct AIParam {
void* control; //+0x00
void* u_0x04; //+0x04
Unit* target; //+0x08
void* u_0x0C; //+0x0C
void* u_0x10; //+0x10
DWORD distanceToTarget; //+0x14
BOOL engagedInCombat; //+0x18
MonStatsBIN* ptMonStatsBIN; //+0x1C
void* ptMonStats2BIN; //+0x20
};
/*=================================================================*/
/* Data Structure to Update Client */

View File

@ -18,29 +18,29 @@ enum D2TypeSize { D2TS_UNITSIZE = 0x011C };
enum D2DifficultyModes { D2DM_NORMAL, D2DM_NIGHTMARE, D2DM_HELL };
enum D2PlayerClass { D2PC_AMAZON, D2PC_SORCERESS, D2PC_NECROMANCER, D2PC_PALADIN, D2PC_BARBARIAN, D2PC_DRUID, D2PC_ASSASSIN };
// add the prefix "ÿc" before the number directly in the text.
enum D2Color
{
BLACK=6,
// BLACK_BIS=14,
DARK_GRAY=5,
GRAY=16,
LIGHT_GRAY=15,
// WHITE_BIS=13,
WHITE=0,
RED=1,
BRIGHT_WHITE=18,
GOLD=4,
DARK_YELLOW=7,
YELLOW=9,
ORANGE=8,
DARKEST_GREEN=10,
DARK_GREEN=12,
GREEN=2,
BLUE=3,
GOLD=4,
DARK_GRAY=5,
// INVISIBLE=6,
DARK_YELLOW=7,
ORANGE=8,
YELLOW=9,
DARKEST_GREEN=0xA,
PURPLE=0xB,
DARK_GREEN=0xC,
// WHITE_BIS=0xD,
// INVISIBLE2=0xE,
LIGHT_GRAY=0xF,
GRAY=0x10,
// VERY_WIERD=0x11,
BRIGHT_WHITE=0x12,
CRYSTAL_RED=0x13,
// WIERD_YELLOW=0x14
PURPLE=11,
RED=1,
CRYSTAL_RED=19,
// VERY_WIERD=17,
};
enum D2Lang
@ -824,6 +824,30 @@ enum D2UnitType
UNIT_ROOMTILE
};
enum D2UnitMode
{
UNIT_MODE_DEATH = 0,
UNIT_MODE_NEUTRAL,
UNIT_MODE_WALK,
UNIT_MODE_RUN,
UNIT_MODE_GET_HIT,
UNIT_MODE_TOWN_NEUTRAL,
UNIT_MODE_TOWN_WALK,
UNIT_MODE_ATTACK1,
UNIT_MODE_ATTACK2,
UNIT_MODE_BLOCK,
UNIT_MODE_CAST,
UNIT_MODE_THROW,
UNIT_MODE_KICK,
UNIT_MODE_SKILL1,
UNIT_MODE_SKILL2,
UNIT_MODE_SKILL3,
UNIT_MODE_SKILL4,
UNIT_MODE_DEAD,
UNIT_MODE_SEQUENCE,
UNIT_MODE_KNOCK_BACK
};
enum D2BodyLoc
{
LOC_HEAD =1,

View File

@ -45,15 +45,26 @@ InventoryBIN* STDCALL modifStashGrid(InventoryBIN* ptInventoryBin)
return ptInventoryBin;
}
FCT_ASM ( caller_modifStashGrid )
POP ESI
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
CALL D2CompileTxtFile
PUSH EAX
CALL modifStashGrid
JMP ESI
RETN 0x14
}}
//FCT_ASM ( caller_modifStashGrid )
// POP ESI
// CALL D2CompileTxtFile
// PUSH EAX
// CALL modifStashGrid
// JMP ESI
//}}
FCT_ASM ( caller_changeTradeStash )
CMP onRealm,0
JNZ normalTradeStash
@ -79,30 +90,27 @@ void Install_BigStash()
// modification of stash grid
mem_seek R8(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5, 6CC25, 25C0F8);
if (version_D2Common == V114d) {
MEMT_REF4(0xFFFB61F4, caller_modifStashGrid);
}
else {
MEMC_REF4( D2CompileTxtFile, caller_modifStashGrid);
}
//01B64ED2 |. E8 99AEFFFF CALL D2Common.#10578
//6FDAFCB4 |. E8 A7C3FCFF CALL D2Common.#10653
//6FD7A504 |. E8 5743FEFF CALL D2Common.#10496 ; \#10496
//6FD6BDB4 |. E8 97600200 CALL D2Common.#10244 ; \#10244
//6FDD2CA4 |. E8 97C2FDFF CALL D2Common.#10849 ; \#10849
//6FDBCC24 |. E8 B7FEF9FF CALL D2Common.#10037 ; \#10037
//0065C0F7 |. E8 F461FBFF CALL Game.006122F0 ; \Game.006122F0
// modification of stash background
mem_seek R8(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C, 943FC, 89EB5);
memt_byte( 0x68, 0xE8 ); // CALL caller_changeTradeStash
MEMT_REF4( 0x00000104, caller_changeTradeStash);
//6FAEC61C |. 68 04010000 PUSH 104
//6FB5643C |. 68 04010000 PUSH 104
//6FB249BC |. 68 04010000 PUSH 104
//6FB59D7C |. 68 04010000 PUSH 104
//6FB3CC1C |. 68 04010000 PUSH 104
//6FB443FC |. 68 04010000 PUSH 104
//00489EB5 |. 68 04010000 PUSH 104 ; |Arg2 = 00000104
log_msg("\n");
isInstalled = true;

View File

@ -15,6 +15,8 @@
#include "extraOptions.h"
#include "windowed.h"
#include "common.h"
#include "savePlayerData.h"
#include <stdio.h>
bool active_Commands=true;
@ -35,14 +37,19 @@ const char * CMD_UNLOCK_MOUSE2 = "/unlock";
const char * CMD_RENAME_CHAR="/renamechar";
const char * CMD_REPAGE_NAME = "/renamepage";
const char * CMD_RENAME_PAGE = "/renamepage";
const char * CMD_SHORT_RENAME_PAGE = "/rp";
const char * CMD_SET_INDEX = "/setindex";
const char * CMD_SET_MAIN_INDEX = "/setmainindex";
const char * CMD_RESET_INDEX = "/resetindex";
const char * CMD_INSERT_PAGE = "/insertpage";
const char * CMD_SHORT_INSERT_PAGE = "/ip";
const char * CMD_DELETE_PAGE = "/deletepage";
const char * CMD_SWAP = "/swap";
const char * CMD_TOGGLE = "/toggle";
const char * CMD_SHORT_DELETE_PAGE = "/dp";
const char * CMD_SWAP_PAGE = "/swappage";
const char * CMD_SHORT_SWAP_PAGE = "/sp";
const char * CMD_TOGGLE_PAGE = "/togglepage";
const char * CMD_SHORT_TOGGLE_PAGE = "/tp";
const char * CMD_DISPLAY_MANA_LIFE = "/dml";
const char * CMD_DISPLAY_LIFE_MANA = "/dlm";
@ -173,29 +180,29 @@ void gambleReload(Unit* ptChar)
*/
void gambleReload(Unit* ptChar)
/*void gambleReload(Unit* ptChar)
{
Unit* ptNPC = D2GetCurrentNPC();
if (ptNPC)
{
D2TogglePage(0xC,1,0);
__asm {
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
// D2OpenNPCMenu(ptNPC);
//Game* ptGame = ptChar->ptGame;
//DWORD caller = offset_D2Game + 0x74900;
//__asm {
// PUSH 0
// PUSH 6
// PUSH 2
// PUSH ptGame
// MOV ECX, ptChar
// CALL caller
//}
//0330CD70 . 837C24 08 0D CMP DWORD PTR SS:[ESP+8],0D
D2OpenNPCMenu(ptNPC);
D2ReloadGambleScreen();
}
}
//6FACFFD4 |. E8 77F90000 CALL D2Client.6FADF950
*/
void savePlayers(Unit* ptChar)
{
@ -263,7 +270,57 @@ void updateSharedGold(DWORD goldAmount)
PCPY->sharedGold = goldAmount;
}
bool renameCharacter(Unit* ptChar, const char* newName)
bool renamePage(Unit* ptChar, char* newName)
{
Stash* ptStash = PCPY->currentStash;
if (!ptStash)
return 0;
log_msg("Rename current page on Client : '%s' -> '%s'\n", ptStash->name, newName);
int len = strlen(newName);
// trim text
while (newName[0] == ' ')
{
newName++;
len--;
}
while (len > 0 && newName[len-1] == ' ')
{
newName[len-1] = NULL;
len--;
}
// Fix max length
if (len > 20)
{
newName[20] = NULL;
len = 20;
}
// Check if new name is default name
char defautText[50];
wcstombs(defautText, getDefaultStashName(ptChar), 50);
if (!strcmp(newName, defautText))
{
newName[0] = NULL;
len = 0;
}
// Check if the name change
if (newName[0] == NULL && (ptStash->name == NULL || ptStash->name[0] == NULL))
return 0;
if (ptStash->name && !strcmp(newName, ptStash->name))
return 0;
// Rename the page
log_msg("Rename current page valid : '%s' (%s)\n", newName, defautText);
renameCurrentStash(ptChar, newName);
for (int i = 0; i <= len; i++)
updateServer(US_PAGENAME + (newName[i] << 8));
return 0;
}
bool renameCharacter(Unit* ptChar, char* newName)
{
int len = strlen(newName);
if (len < 2 || len > 15)
@ -274,7 +331,10 @@ bool renameCharacter(Unit* ptChar, const char* newName)
if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_')))
return 1;
}
log_msg("Rename Character : %s -> %s\n", PCPlayerData->name, newName);
// Move current save file
backupSaveFiles(PCPlayerData->name, -1);
{
char szCurrentFile[MAX_PATH];
char szNewFile[MAX_PATH];
@ -282,7 +342,7 @@ bool renameCharacter(Unit* ptChar, const char* newName)
//Get temporary savefile name.
D2FogGetSavePath(szCurrentFile, MAX_PATH);
D2FogGetSavePath(szNewFile, MAX_PATH);
strcat(szCurrentFile, ptChar->ptPlayerData->name);
strcat(szCurrentFile, PCPlayerData->name);
strcat(szNewFile, newName);
strcat(szCurrentFile, ".");
strcat(szNewFile, ".");
@ -290,7 +350,8 @@ bool renameCharacter(Unit* ptChar, const char* newName)
int newLen = strlen(szNewFile);
strcpy(&szCurrentFile[curLen], "d2s");
strcpy(&szNewFile[newLen], "d2s");
MoveFile(szCurrentFile, szNewFile);
if (!MoveFile(szCurrentFile, szNewFile))
return 0;
strcpy(&szCurrentFile[curLen], "d2x");
strcpy(&szNewFile[newLen], "d2x");
MoveFile(szCurrentFile, szNewFile);
@ -316,16 +377,19 @@ bool renameCharacter(Unit* ptChar, const char* newName)
strcpy(&szNewFile[newLen], "map");
MoveFile(szCurrentFile, szNewFile);
}
// Update server
for (int i = 0; i <= len; i++)
updateServer(US_RENAME + (newName[i] << 8));
// Update client
log_msg("Rename on Client : %s -> %s\n", ptChar->ptPlayerData->name, newName);
strcpy(ptChar->ptPlayerData->name, newName);
log_msg("Rename on Client : %s -> %s\n", PCPlayerData->name, newName);
strcpy(PCPlayerData->name, newName);
updateServer(US_SAVE);
return 0;
}
/****************************************************************************************************/
int STDCALL commands (char* ptText)
@ -376,41 +440,25 @@ int STDCALL commands (char* ptText)
if (!strncmp(command, CMD_RENAME_CHAR, strlen(CMD_RENAME_CHAR)))
{
const char* param = &ptText[strlen(CMD_RENAME_CHAR)];
char* param = &ptText[strlen(CMD_RENAME_CHAR)];
if (param[0] != ' ')
return 1;
param++;
return renameCharacter(ptChar, param);
}
if (!strncmp(command, CMD_REPAGE_NAME,strlen(CMD_REPAGE_NAME)))
if (!strncmp(command, CMD_RENAME_PAGE, strlen(CMD_RENAME_PAGE)))
{
if (!active_multiPageStash) return 1;
char* param = &ptText[strlen(CMD_REPAGE_NAME)];
Stash* ptStash = PCPY->currentStash;
if (!ptStash)
return 0;
char* param = &ptText[strlen(CMD_RENAME_PAGE)];
return renamePage(ptChar, param);
}
int len = strlen(param);
while (len > 0 && param[0] == ' ')
if (!strncmp(command, CMD_SHORT_RENAME_PAGE, strlen(CMD_SHORT_RENAME_PAGE)))
{
param++;
len--;
}
if (len > 0 && len <= 15)
{
log_msg("Rename current page on Client : %s -> %s\n", ptStash->name, param);
renameCurrentStash(ptChar, param);
for (int i = 0; i <= len; i++)
updateServer(US_PAGENAME + (param[i] << 8));
}
else if (len == 0)
{
log_msg("Rename current page on Client: %s\n", ptStash->name);
renameCurrentStash(ptChar, NULL);
updateServer(US_PAGENAME);
}
return 0;
if (!active_multiPageStash) return 1;
char* param = &ptText[strlen(CMD_SHORT_RENAME_PAGE)];
return renamePage(ptChar, param);
}
if (!strcmp(command, CMD_SET_INDEX))
@ -442,6 +490,14 @@ int STDCALL commands (char* ptText)
return 0;
}
if (!strcmp(command, CMD_SHORT_INSERT_PAGE))
{
if (!active_multiPageStash) return 1;
insertStash(ptChar);
updateServer(US_INSERT_PAGE);
return 0;
}
if (!strcmp(command, CMD_DELETE_PAGE))
{
if (!active_multiPageStash) return 1;
@ -450,10 +506,18 @@ int STDCALL commands (char* ptText)
return 0;
}
if (!strncmp(command, CMD_SWAP, strlen(CMD_SWAP)))
if (!strcmp(command, CMD_SHORT_DELETE_PAGE))
{
if (!active_multiPageStash) return 1;
int page = atoi(&command[strlen(CMD_SWAP)]) - 1;
if (deleteStash(ptChar, true))
updateServer(US_DELETE_PAGE);
return 0;
}
if (!strncmp(command, CMD_SWAP_PAGE, strlen(CMD_SWAP_PAGE)))
{
if (!active_multiPageStash) return 1;
int page = atoi(&command[strlen(CMD_SWAP_PAGE)]) - 1;
if (page < 0 && PCPY->currentStash->nextStash)
page = PCPY->currentStash->nextStash->id;
if (page < 0)
@ -465,10 +529,38 @@ int STDCALL commands (char* ptText)
return 0;
}
if (!strncmp(command, CMD_TOGGLE, strlen(CMD_TOGGLE)))
if (!strncmp(command, CMD_SHORT_SWAP_PAGE, strlen(CMD_SHORT_SWAP_PAGE)))
{
if (!active_multiPageStash) return 1;
int page = atoi(&command[strlen(CMD_SHORT_SWAP_PAGE)]) - 1;
if (page < 0 && PCPY->currentStash->nextStash)
page = PCPY->currentStash->nextStash->id;
if (page < 0)
return 1;
updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16));
updateServer(US_SWAP2 + ((page & 0xFF0000) >> 8));
updateServer(US_SWAP1 + (page & 0xFF00));
updateServer(US_SWAP0 + ((page & 0xFF) << 8));
return 0;
}
if (!strncmp(command, CMD_TOGGLE_PAGE, strlen(CMD_TOGGLE_PAGE)))
{
if (!active_sharedStash) return 1;
int page = atoi(&command[strlen(CMD_TOGGLE)]) - 1;
int page = atoi(&command[strlen(CMD_TOGGLE_PAGE)]) - 1;
if (page < 0)
return 1;
updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16));
updateServer(US_SWAP2 + ((page & 0xFF0000) >> 8));
updateServer(US_SWAP1 + (page & 0xFF00));
updateServer(US_SWAP0_TOGGLE + ((page & 0xFF) << 8));
return 0;
}
if (!strncmp(command, CMD_SHORT_TOGGLE_PAGE, strlen(CMD_SHORT_TOGGLE_PAGE)))
{
if (!active_sharedStash) return 1;
int page = atoi(&command[strlen(CMD_SHORT_TOGGLE_PAGE)]) - 1;
if (page < 0)
return 1;
updateServer(US_SWAP3 + ((page & 0xFF000000) >> 16));
@ -517,6 +609,45 @@ int STDCALL commands (char* ptText)
// return 0;
//}
//if (!strcmp(command,"t"))
//{
// //test();
// FILE* file = fopen("D:\\tmp.txt", "wb+");
// for (int i = 0; i<= 0xFFFF; i++)
// {
// fwprintf( file, L"== %04X ===================================\n%s\n", i, D2GetStringFromIndex(i) );
// }
// fclose(file);
// return 0;
//}
if (!strcmp(command,"aa"))
{
#pragma pack(1)
struct {
BYTE displayType;//0x15 main msg; 0x14: char popup
BYTE un;
BYTE zero;
char string[0xFF];
char null;
char u1[0x100];
char u2[0x100];
char u3[0x100];
} data;
#pragma pack()
//D2SetNbPlayers(nbPlayersCommand);
memset(&data,0,sizeof(data));
data.displayType=0x15;
data.un=1;
data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10
data.null=NULL;
sprintf(data.string, "players %u", nbPlayersCommand);
D2SendMsgToAll((BYTE*)&data);
return 0;
}
return 1;
}
@ -585,6 +716,8 @@ void Install_Commands()
//6FB20AE9 |. 85C0 TEST EAX,EAX
//6FB61FD6 |. 83C4 08 ADD ESP,8
//6FB61FD9 |. 85C0 TEST EAX,EAX
//0047C548 |. 83C4 08 ADD ESP,8
//0047C54B |. 85C0 TEST EAX,EAX
log_msg("\n");

View File

@ -59,9 +59,10 @@ TD2SetSkillBaseLevel V2SetSkillBaseLevel;
TD2SetSkillBaseLevelOnClient V2SetSkillBaseLevelOnClient;
TD2PrintStat V2PrintStat;
TD2CompileCubeInput V2CompileCubeInput;
TD2CompileCubeOutput V2CompileCubeOutput;
//TD2CompileCubeOutput V2CompileCubeOutput;
TD2BroadcastFunction V2BroadcastFunction;
TD2GetGameByClientID V2GetGameByClientID;
TD2SpawnSuperUnique V2SpawnSuperUnique;
TD2SpawnMonster V2SpawnMonster;
TD2VerifIfNotCarry1 V2VerifIfNotCarry1;
TD2GameGetObject V2GameGetObject;
@ -81,8 +82,10 @@ TD2GetItemStatCostBIN V2GetItemStatCostBIN;
TD2SendPacket V2SendPacket;
TD2LoadInventory V2LoadInventory;
TD2SaveGame V2SaveGame;
TD2MonsterUseSkill V2MonsterUseSkill;
TD2LinkPortal V2LinkPortal;
TD2Game235C0 V2Game235C0;
TD2ReadFile V2ReadFile;
//DWORD* ptNbStatDesc
//DWORD* ptStatDescTable;
@ -231,7 +234,7 @@ __declspec(naked) void* STDCALL compileTxtFile_9(DWORD unused, const char* filen
PUSH EDX
MOV ECX,DWORD PTR SS:[ESP+0x230]
LEA EDX,DWORD PTR SS:[ESP+0x28]
CALL D2ReadFile
CALL V2ReadFile
TEST EAX,EAX
JNZ continue_compileTxtFile
PUSH 0
@ -270,7 +273,7 @@ __declspec(naked) void* STDCALL compileTxtFile_10(DWORD unused, const char* file
PUSH EDX
MOV ECX,DWORD PTR SS:[ESP+0x230]
LEA EDX,DWORD PTR SS:[ESP+0x28]
CALL D2ReadFile
CALL V2ReadFile
TEST EAX,EAX
JNZ continue_compileTxtFile
PUSH 0
@ -285,28 +288,42 @@ continue_compileTxtFile:
JMP ECX
}}
__declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength) {
_asm {
SUB ESP, 0x20C
// MOV EAX,DWORD PTR DS:[6FDF1464]
PUSH EBX
DWORD compileTxtFile114_1;
DWORD compileTxtFile114_2;
DWORD compileTxtFile114_3;
DWORD compileTxtFile114_5;
DWORD compileTxtFile114_6;
DWORD compileTxtFile114_7;
__declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
{_asm{
PUSH EBP
MOV EBP,ESP
SUB ESP,0x11C
PUSH EBX
PUSH ESI
PUSH EDI
MOV DWORD PTR SS : [ESP + 0x10], 0
MOV EBX, DWORD PTR SS : [ESP + 0x224]
MOV EAX,DWORD PTR SS:[EBP+0x10]
MOV ECX,DWORD PTR SS:[EBP+0x14]
PUSH EBX
LEA EAX, DWORD PTR SS : [ESP + 0x1A]
PUSH ESI
MOV ESI,DWORD PTR SS:[EBP+0x8]
PUSH EDI
MOV EDI,DWORD PTR SS:[EBP+0xC]
MOV DWORD PTR SS:[EBP-0x11C],ESI
MOV DWORD PTR SS:[EBP-0x10C],EDI
MOV DWORD PTR SS:[EBP-0x110],EAX
MOV DWORD PTR SS:[EBP-0x118],ECX
MOV DWORD PTR SS:[EBP-0x108],0
PUSH __LINE__
PUSH S_compileTxtFile
LEA EAX,DWORD PTR SS:[EBP-0x108]
PUSH EAX
CALL DWORD PTR SS : [wsprintf]
MOV EDX, DWORD PTR SS : [ESP + 0x228]
ADD ESP, 8
LEA EDX, DWORD PTR SS : [ESP + 0xE]
PUSH EDX
PUSH EAX
LEA EDX, DWORD PTR SS : [ESP + 0x20]
CALL D2ReadFile
MOV ECX,unused
MOV EDX,filename
CALL V2ReadFile
TEST EAX,EAX
JNZ continue_compileTxtFile
PUSH __LINE__
@ -318,11 +335,61 @@ __declspec(naked) void* STDCALL compileTxtFile_114(DWORD unused, const char* fil
PUSH -1
CALL exit
continue_compileTxtFile:
MOV ECX, D2CompileTxtFile
ADD ECX, 0x1EC
JMP ECX
}
}
// EAX : file
// ECX : -
// EDX : -
// EBX : -
// MOV ESI,DWORD PTR SS:[EBP+8]
// MOV EDI,DWORD PTR SS:[EBP+C]
MOV ESI,DWORD PTR SS:[EBP+0xC]
MOV ECX,DWORD PTR SS:[EBP-0x108]
PUSH ECX ; /Arg2
PUSH EAX ; |Arg1
CALL compileTxtFile114_1 ; \Game.006BD640
MOV EDI,EAX
PUSH EDI ; /Arg1
CALL compileTxtFile114_2 ; \Game.006BCDE0
MOV EBX,EAX
MOV ESI,EBX
IMUL ESI,DWORD PTR SS:[EBP+0x18]
PUSH 0 ; /Arg3 = 00000000
PUSH 0x904 ; |Arg2 = 00000904
PUSH compileTxtFile114_3 ; |Arg1 = 006E6370 ASCII ".\DATATBLS\DataTbls.cpp"
MOV EDX,ESI ; |
XOR ECX,ECX ; |
CALL D2AllocMem ; \Game.0040B430
PUSH ESI
PUSH 0
PUSH EAX
MOV DWORD PTR SS:[EBP-0x10C],EAX
CALL compileTxtFile114_5
MOV EDX,DWORD PTR SS:[EBP+0x18]
MOV EAX,DWORD PTR SS:[EBP-0x10C]
MOV ECX,DWORD PTR SS:[EBP-0x110]
ADD ESP,0xC
PUSH EDX
PUSH EBX
PUSH EAX
PUSH ECX
PUSH EDI
CALL compileTxtFile114_6
PUSH EDI ; /Arg1
CALL compileTxtFile114_7 ; \Game.006BCDA0
MOV EAX, DWORD PTR SS:[EBP-0x10C]
MOV ECX,DWORD PTR SS:[EBP-0x118]
TEST ECX,ECX
JE fin
MOV DWORD PTR DS:[ECX],EBX
fin:
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
RETN 0x14
}}
__declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
{_asm{
@ -345,7 +412,7 @@ __declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* fil
PUSH EDX
PUSH EAX
LEA EAX,DWORD PTR SS:[ESP+0x20]
CALL D2ReadFile
CALL V2ReadFile
TEST EAX,EAX
JNZ continue_compileTxtFile
PUSH __LINE__
@ -372,14 +439,6 @@ Unit* STDCALL D2GetClientPlayer_111(){return ptClientChar;}
DWORD *StatMouse1, *StatMouse2, *StatMouse3, *StatMouse4;
void FASTCALL D2CleanStatMouseUp_111(){*StatMouse1=*StatMouse2=*StatMouse3=*StatMouse4=0;}
FCT_ASM ( D2CleanStatMouseUp_114 )
MOV DWORD PTR DS : [StatMouse1], 0
MOV DWORD PTR DS : [StatMouse2], 0
MOV DWORD PTR DS : [StatMouse3], 0
MOV DWORD PTR DS : [StatMouse4], 0
RETN
}}
Unit* STDCALL D2GetRealItem_111(Unit* ptItem){return ptItem;}
/* 1.11 : sizememory : 0x104 (LoadBuySell)
6FADA7F0 |. A1 48BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD48]
@ -422,14 +481,6 @@ FCT_ASM ( D2LoadImage_111 )
RETN
}}
FCT_ASM( D2LoadImage_114 )
PUSH EDX
MOV EAX, ECX
CALL V2LoadImage
POP EDX
RETN
}}
const char* D2FreeImage_FILE = __FILE__;
FCT_ASM ( D2FreeImage_111 )
PUSH ESI
@ -468,20 +519,6 @@ FCT_ASM ( D2GetClient_111 )
RETN 4
}}
FCT_ASM( D2SetSkillBaseLevelOnClient_114 )
PUSH EBX
PUSH EDX
PUSH ESI
PUSH DWORD PTR SS : [ESP + 0x14]
PUSH DWORD PTR SS : [ESP + 0x14]
MOV EBX, DWORD PTR SS : [ESP + 0x14]
MOV EAX, ECX
MOV ESI, EDX
CALL V2SetSkillBaseLevelOnClient
POP ESI
POP EBX
RETN 0xC
}}
FCT_ASM ( D2SetSkillBaseLevelOnClient_111 )
PUSH EBX
@ -509,18 +546,16 @@ FCT_ASM ( D2GetItemStatCostBIN_111 )
FCT_ASM( D2SendToServer3_114 )
PUSH EDI
PUSH ESI
PUSH EBX
PUSH ECX
MOV BYTE PTR SS:[ESP],CL
MOV WORD PTR SS:[ESP+1],DX
MOV EDI,3
LEA ECX, DWORD PTR SS : [ESP]
PUSH ECX
LEA EDX,DWORD PTR SS:[ESP]
PUSH EDX
CALL D2SendToServerXX
POP ECX
POP EBX
POP ESI
POP EDI
RETN
}}
@ -541,17 +576,13 @@ FCT_ASM ( D2SendToServer3_111 )
FCT_ASM ( D2PrintStat_114 )
PUSH ESI
PUSH EBX
PUSH ECX
MOV ESI, DWORD PTR SS : [ESP + 0x1C]
PUSH DWORD PTR SS : [ESP + 0x18]
PUSH DWORD PTR SS : [ESP + 0x18]
PUSH DWORD PTR SS : [ESP + 0x18]
MOV ESI,DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x10]
PUSH DWORD PTR SS:[ESP+0x10]
PUSH DWORD PTR SS:[ESP+0x10]
PUSH EDX
PUSH ECX
CALL V2PrintStat
POP ECX
POP EBX
POP ESI
RETN 0x10
}}
@ -576,7 +607,7 @@ FCT_ASM(D2SendPacket_114)
MOV EDI,ECX
CALL V2SendPacket
POP EDI
RETN 0x4
RETN 4
}}
FCT_ASM ( D2SendPacket_111 )
@ -609,14 +640,14 @@ FCT_ASM( D2CompileCubeInput_114 )
RETN 8
}}
FCT_ASM ( D2CompileCubeOutput_111 )
PUSH EBX
MOV EBX,ECX
PUSH EDX
CALL V2CompileCubeOutput
POP EBX
RETN 8
}}
//FCT_ASM ( D2CompileCubeOutput_111 )
// PUSH EBX
// MOV EBX,ECX
// PUSH EDX
// CALL V2CompileCubeOutput
// POP EBX
// RETN 8
//}}
FCT_ASM ( D2BroadcastFunction_111 )
PUSH EDI
@ -630,7 +661,7 @@ FCT_ASM ( D2BroadcastFunction_111 )
RETN 4
}}
FCT_ASM ( D2SpawnMonster_111 )
FCT_ASM ( D2SpawnSuperUnique_111 )
PUSH DWORD PTR SS:[ESP+0x18]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
@ -638,11 +669,11 @@ FCT_ASM ( D2SpawnMonster_111 )
PUSH ECX
MOV ECX,DWORD PTR SS:[ESP+0x18]
MOV EAX,DWORD PTR SS:[ESP+0x28]
CALL V2SpawnMonster
CALL V2SpawnSuperUnique
RETN 0x18
}}
FCT_ASM ( D2SpawnMonster_111b )
FCT_ASM ( D2SpawnSuperUnique_111b )
PUSH DWORD PTR SS:[ESP+0x10]
PUSH DWORD PTR SS:[ESP+0x10]
PUSH DWORD PTR SS:[ESP+0x10]
@ -651,24 +682,39 @@ FCT_ASM ( D2SpawnMonster_111b )
MOV EAX,DWORD PTR SS:[ESP+0x18]
MOV EDX,DWORD PTR SS:[ESP+0x2C]
MOV ECX,DWORD PTR SS:[ESP+0x28]//superuniqueID
CALL V2SpawnMonster
CALL V2SpawnSuperUnique
RETN 0x18
}}
FCT_ASM( D2SpawnSuperUnique_114 )
PUSH EBX
PUSH EDI
MOV EBX, DWORD PTR SS:[ESP+0x1C]
MOV EDI, ECX
PUSH DWORD PTR SS:[ESP+0x20]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH EDX
CALL V2SpawnSuperUnique
POP EDI
POP EBX
RETN 0x18
}}
FCT_ASM ( D2SpawnMonster_114 )
PUSH DWORD PTR SS:[ESP+0x18]
PUSH DWORD PTR SS:[ESP+0x18]
PUSH EDX
PUSH ECX
MOV EBX, DWORD PTR SS : [ESP + 0x18]
MOV ECX, DWORD PTR SS : [ESP + 0x14]
MOV DWORD PTR SS : [ESP + 0x18], ECX
MOV ECX, DWORD PTR SS : [ESP + 0x10]
MOV DWORD PTR SS : [ESP + 0x14], ECX
MOV ECX, DWORD PTR SS : [ESP + 0xC]
MOV DWORD PTR SS : [ESP + 0x10], ECX
MOV ECX, DWORD PTR SS : [ESP + 0x8]
MOV DWORD PTR SS : [ESP + 0xC], ECX
MOV DWORD PTR SS : [ESP + 0x8], EDX
POP ECX
JMP V2SpawnMonster
PUSH DWORD PTR SS:[ESP+0x20]
PUSH DWORD PTR SS:[ESP+0x20]
MOV EDX,DWORD PTR SS:[ESP+0x20]
MOV ECX,DWORD PTR SS:[ESP+0x1C]
CALL V2SpawnMonster
RETN 0x18
}}
FCT_ASM ( D2VerifIfNotCarry1_111 )
@ -718,10 +764,6 @@ FCT_ASM ( D2SendToServer_1XX )
RETN 0xC
}}
FCT_ASM( D2GetGameByClientID_114 )
MOV ECX, DWORD PTR SS : [ESP + 0x4]
JMP V2GetGameByClientID
}}
FCT_ASM ( D2GetGameByClientID_1XX )
POP EAX
@ -737,15 +779,27 @@ FCT_ASM ( D2SaveGame_1XX )
JMP V2SaveGame
}}
FCT_ASM( D2SetColorPopup_114 )
PUSH EDI
FCT_ASM ( D2MonsterUseSkill_111 )
PUSH EBX
PUSH EDX
MOV EDI, ECX
CALL V2SetColorPopup
POP EDI
RETN
MOV EBX,ECX
MOV ECX,EDX
MOV EAX,DWORD PTR SS:[ESP+0xC]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
PUSH DWORD PTR SS:[ESP+0x1C]
CALL V2MonsterUseSkill
// Game sets monsters AiControl args[0] to 0 after this call
POP EDX
MOV EDX,DWORD PTR DS:[EDX+0x14]
MOV EDX,DWORD PTR DS:[EDX+0x28]
MOV DWORD PTR DS:[EDX+0x14],0
POP EBX
RETN 0x14
}}
FCT_ASM( D2LinkPortal_114 )
PUSH ECX
MOV ECX,DWORD PTR SS:[ESP+0x8]
@ -758,15 +812,30 @@ FCT_ASM( D2LinkPortal_114 )
}}
FCT_ASM( D2Game235C0_114 )
PUSH ECX
PUSH EDX
MOV ECX, DWORD PTR SS : [ESP + 0xC]
MOV EDX, DWORD PTR SS : [ESP + 0x10]
POP EDX
POP EAX
POP ECX
RETN 0x8
POP EDX
PUSH EAX
JMP V2Game235C0
}}
FCT_ASM( D2ReadFile_111 )
MOV EAX,EDX
PUSH DWORD PTR SS:[ESP+4]
PUSH ECX
CALL V2ReadFile
RETN 0xC
}}
/*FCT_ASM( D2SaveSPGame_111 )
PUSH DWORD PTR SS:[ESP+0x8]
PUSH DWORD PTR SS:[ESP+0x8]
PUSH EDX
PUSH ECX
CALL V2SaveSPGame
RETN 8
}}*/
#define SETFCTADDR(F, I, N) setFctAddr((DWORD*)&N, (HMODULE)offset_##F, (LPCSTR)I)
void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index)
{
@ -790,14 +859,11 @@ void initD2functions()
#define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
#define E2F(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
#define E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A);
#define F8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) if (version_##Z == V114d) { E2S(Z, I, 0, N, 0) } else { setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)(version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))))); }
#define F8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) if (version_##Z > V113d) { N = (T##N)R8(Z,A,B,C,D,E,F,G,H,I); } else setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)(version_##Z == V113d? H : (version_##Z == V113c? G : (version_##Z == V112? F : (version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A))))))));
#define A8(X, Z, A,B,C,D,E,F,G,H,I, R, N, P) N = (T##N)R8(Z,A,B,C,D,E,F,G,H,I);
#define C8(Z, A,B,C,D,E,F,G,H,I, T, N) pt##N = (T*)R8(Z,A,B,C,D,E,F,G,H,I);
#include "../Commons/D2Funcs.h"
//D2FogMemAlloc = (TD2FogMemAlloc)(offset_D2Game + 0xB380);
//E2S(D2Game, B380, 0, D2FogMemAlloc, 0)
//return;
SgptDataTables = *(DataTables**) R8(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C, A33F0, 344304);
if (version_D2Common < V110)
{
@ -814,12 +880,17 @@ void initD2functions()
#undef E2F
#undef E2C
//////////////// MISC FCT ////////////////
//setImage = version_D2Common >= V111 ? setImage_111 : setImage_1XX;
//setFrame = version_D2Common >= V111 ? setFrame_111 : setFrame_1XX;
getDescStrPos = version_D2Common >= V110 ? getDescStrPos_10 : getDescStrPos_9;
compileTxtFile = version_D2Common == V114d ? compileTxtFile_114 : version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9;
compileTxtFile114_1 = offset_D2Client + 0x002BD640;
compileTxtFile114_2 = offset_D2Client + 0x002BCDE0;
compileTxtFile114_3 = offset_D2Client + 0x002E6370;
compileTxtFile114_5 = offset_D2Client + 0x00281EF0;
compileTxtFile114_6 = offset_D2Client + 0x002BD780;
compileTxtFile114_7 = offset_D2Client + 0x002BCDA0;
compileTxtFile = version_D2Common >= V114a ? compileTxtFile_114 : version_D2Common >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9;
//////////////// SELECT RIGHT ADDR FUNCTION ////////////////
@ -1013,7 +1084,7 @@ void initD2functions()
//V3(D2LoadSuperuniques, TD2LoadSuperuniques, D2Common, 1F500, 1F510, 29FA0, 71EB0);
//V3(D2GetItemStatCostBIN,TD2GetItemStatCostBIN, D2Common, 000, 000, 642B0, 13F0);
//V3(D2GetItemTypesBIN, TD2GetItemTypesBIN, D2Common, 000, 000, 2B1A0, 11F0);
//V3(D2SpawnMonster, TD2SpawnMonster, D2Game, 000, 000, 3F220, 4ABE0);
//V3(D2SpawnSuperUnique, TD2SpawnSuperUnique, D2Game, 000, 000, 3F220, 4ABE0);
//V3(D2ReloadGambleScreen,TD2ReloadGambleScreen, D2Game, 000, 000, 000, 8E480);
//V3(D2SaveGame, TD2SaveGame, D2Game, 000, 000, 89C0, E2390);
//V3(D2ClickOnStashButton,TD2ClickOnStashButton, D2Client, 000, 000, 000, A6520);
@ -1022,12 +1093,12 @@ void initD2functions()
//V3(D2Game235C0, TD2Game235C0, D2Game, 000, 000, 000, D6D10);
//V3(D2OpenPandPortal, TD2OpenPandPortal, D2Game, 000, 000, 000, 9B480);
//V3(D2OpenPandFinalPortal,TD2OpenPandFinalPortal,D2Game, 000, 000, 000, 9B470);
//V3(D2MephIA, TD2MephIA, D2Game, 000, 000, 000, 84730);
//V3(D2DiabloIA, TD2DiabloIA, D2Game, 000, 000, 000, 75980);
//V3(D2BaalIA, TD2BaalIA, D2Game, 000, 000, 000, EAB20);
//V3(D2UberMephIA, TD2UberMephIA, D2Game, 000, 000, 000, 70320);
//V3(D2UberDiabloIA, TD2UberDiabloIA, D2Game, 000, 000, 000, 7F200);
//V3(D2UberBaalIA, TD2UberBaalIA, D2Game, 000, 000, 000, E92B0);
//V3(D2MephAI, TD2MephAI, D2Game, 000, 000, 000, 84730);
//V3(D2DiabloAI, TD2DiabloAI, D2Game, 000, 000, 000, 75980);
//V3(D2BaalAI, TD2BaalAI, D2Game, 000, 000, 000, EAB20);
//V3(D2UberMephAI, TD2UberMephAI, D2Game, 000, 000, 000, 70320);
//V3(D2UberDiabloAI, TD2UberDiabloAI, D2Game, 000, 000, 000, 7F200);
//V3(D2UberBaalAI, TD2UberBaalAI, D2Game, 000, 000, 000, E92B0);
//#undef V3
@ -1049,46 +1120,42 @@ void initD2functions()
V2SendPacket = D2SendPacket;
V2LoadInventory = D2LoadInventory;
V2CompileCubeInput = D2CompileCubeInput;
V2CompileCubeOutput = D2CompileCubeOutput;
//V2CompileCubeOutput = D2CompileCubeOutput;
V2BroadcastFunction = D2BroadcastFunction;
V2GetGameByClientID = D2GetGameByClientID;
V2SpawnSuperUnique = D2SpawnSuperUnique;
V2SpawnMonster = D2SpawnMonster;
V2VerifIfNotCarry1 = D2VerifIfNotCarry1;
V2GameGetObject = D2GameGetObject;
V2TestPositionInRoom = D2TestPositionInRoom;
V2GetItemTypesBIN = D2GetItemTypesBIN;
V2SaveGame = D2SaveGame;
V2MonsterUseSkill = D2MonsterUseSkill;
V2LinkPortal = D2LinkPortal;
V2Game235C0 = D2Game235C0;
V2ReadFile = D2ReadFile;
//V2OpenNPCMenu = D2OpenNPCMenu;
//////////////// REDIRECT ON CUSTOM FUNCTIONS ////////////////
if (version_D2Client == V114d) {
D2GetClientPlayer = D2GetClientPlayer_111;
D2GetClient = (TD2GetClient)D2GetClient_111;
D2LoadImage = (TD2LoadImage)D2LoadImage_114;
D2FreeImage = (TD2FreeImage)D2FreeImage_111;
if (version_D2Client == V114d)
{
D2SendToServer3 = (TD2SendToServer3) D2SendToServer3_114;
D2PrintStat = (TD2PrintStat)D2PrintStat_114;
D2SendPacket = (TD2SendPacket) D2SendPacket_114;
D2CompileCubeInput = (TD2CompileCubeInput) D2CompileCubeInput_114;
D2SpawnSuperUnique = (TD2SpawnSuperUnique) D2SpawnSuperUnique_114;
D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1)D2VerifIfNotCarry1_111;
D2isLODGame = D2isLODGame_111;
D2GetMouseX = D2GetMouseX_111;
D2GetMouseY = D2GetMouseY_111;
D2SendToServer3 = (TD2SendToServer3)D2SendToServer3_114;
D2SetSkillBaseLevelOnClient = (TD2SetSkillBaseLevelOnClient)D2SetSkillBaseLevelOnClient_114;
D2SendPacket = (TD2SendPacket)D2SendPacket_114;
D2GetGameByClientID = (TD2GetGameByClientID)D2GetGameByClientID_1XX;
D2SpawnMonster = (TD2SpawnMonster)D2SpawnMonster_114;
D2CompileCubeInput = (TD2CompileCubeInput)D2CompileCubeInput_114;
D2CleanStatMouseUp = (TD2CleanStatMouseUp)D2CleanStatMouseUp_114;
D2LinkPortal = (TD2LinkPortal)D2LinkPortal_114;
D2Game235C0 = (TD2Game235C0) D2Game235C0_114;
D2PrintStat = (TD2PrintStat)D2PrintStat_114;
D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX;
D2SaveGame = (TD2SaveGame) D2SaveGame_1XX;
D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1)D2VerifIfNotCarry1_111;
StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650);
StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654);
StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658);
StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C);
} else if ( version_D2Client >= V111 ) {
}
else if ( version_D2Client >= V111 )
{
D2SendMsgToAll = (TD2SendMsgToAll) D2SendMsgToAll_111;
D2SetColorPopup = (TD2SetColorPopup) D2SetColorPopup_111;
D2LoadImage = (TD2LoadImage) D2LoadImage_111;
@ -1103,9 +1170,9 @@ void initD2functions()
D2SendPacket = (TD2SendPacket) D2SendPacket_111;
D2LoadInventory = (TD2LoadInventory) D2LoadInventory_111;
D2CompileCubeInput = (TD2CompileCubeInput) D2CompileCubeInput_111;
D2CompileCubeOutput = (TD2CompileCubeOutput) D2CompileCubeOutput_111;
//D2CompileCubeOutput = (TD2CompileCubeOutput) D2CompileCubeOutput_111;
D2BroadcastFunction = (TD2BroadcastFunction) D2BroadcastFunction_111;
D2SpawnMonster = version_D2Game >= V111b ? (TD2SpawnMonster)D2SpawnMonster_111b : (TD2SpawnMonster)D2SpawnMonster_111;
D2SpawnSuperUnique = version_D2Game >= V111b ? (TD2SpawnSuperUnique)D2SpawnSuperUnique_111b : (TD2SpawnSuperUnique)D2SpawnSuperUnique_111;
D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1) D2VerifIfNotCarry1_111;
D2GameGetObject = (TD2GameGetObject) D2GameGetObject_111;
D2GetItemTypesBIN = (TD2GetItemTypesBIN) D2GetItemTypesBIN_111;
@ -1118,10 +1185,12 @@ void initD2functions()
D2GetClientPlayer = D2GetClientPlayer_111;
D2GetRealItem = D2GetRealItem_111;
D2CleanStatMouseUp = D2CleanStatMouseUp_111;
StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, A0650);
StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, A0654);
StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, A0658);
StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, A065C);
D2MonsterUseSkill = (TD2MonsterUseSkill)D2MonsterUseSkill_111;
D2ReadFile = (TD2ReadFile)D2ReadFile_111;
StatMouse1 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC, 11D224, 3A0650);
StatMouse2 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0, 11D228, 3A0654);
StatMouse3 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8, 11D240, 3A0658);
StatMouse4 = (DWORD*)R8(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC, 11D244, 3A065C);
} else {
D2SendToServer = (TD2SendToServer) D2SendToServer_1XX;
D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX;

View File

@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d and DoNotCloseNihlathakPortal by haxifix.
@file D2wrapper.cpp
@brief Main Diablo II extra DLL handler.
@ -10,6 +10,7 @@
=================================================================*/
#include "plugYFiles.h" // Install_PlugYFiles()
#include "globalVariable.h" // Install_VariableOnRealm()
#include "commands.h" // Install_Commands()
#include "othersFeatures.h" // Install_ChangeResolution()
@ -27,10 +28,10 @@
#include "extraOptions.h" // Install_AlwaysRegenMapInSP()
#include "language.h" // Install_LanguageManagement()
#include "windowed.h" // installed with Install_PrintPlugYVersion()
#include "savePlayerData.h" // Install_SavePlayerData()
#include "customLibraries.h"
#include "common.h"
#include "interface_Stash.h"
int version_Game = UNKNOWN;
//int version_binkw32 = UNKNOWN;
@ -175,9 +176,10 @@ void hookLibraries()
{
log_msg("***** Unprotect Libraries *****\n");
if (version_Game == V114d) {
if (version_Game >= V114a)
hookLibrary(S_Game, offset_Game);
} else {
else
{
hookLibrary(S_D2Client, offset_D2Client);
// hookLibrary(S_D2CMP, offset_D2CMP);
hookLibrary(S_D2Common, offset_D2Common);
@ -198,9 +200,10 @@ void unhookLibraries()
{
log_msg("***** Reprotect Libraries *****\n");
if (version_Game == V114d) {
if (version_Game >= V114a)
unhookLibrary(S_Game, offset_Game);
} else {
else
{
unhookLibrary(S_D2Client, offset_D2Client);
// unhookLibrary(S_D2CMP, offset_D2CMP);
unhookLibrary(S_D2Common, offset_D2Common);
@ -231,14 +234,7 @@ void freeCustomLibraries()
dll->release();
freeLibrary(dll->offset);
nextDll = dll->nextDll;
if (version_D2Game == V114d)
{
delete dll;
}
else
{
D2FogMemDeAlloc(dll, __FILE__, __LINE__, 0);
}
delete(dll);
dll = nextDll;
}
}
@ -270,15 +266,15 @@ void loadCustomLibraries()
log_msg("No custom libraries to load.\n");
else
{
log_msg("Load custom libraries :\n");
while (curString)
{
if (curString[0])
{
log_msg("Load custom library : %s\n", curString);
offset_currentDll = (DWORD)LoadLibrary(curString);
if (!offset_currentDll)
{
log_msg("Load library %s failed:\n", curString);
log_msg("Load library %s failed !\n", curString);
exit(0);
}
nextDll = customDlls;
@ -395,10 +391,12 @@ void initD2modules()
extern "C" __declspec(dllexport) bool __stdcall Release()
{
log_msg("\n***** ENDING DIABLO II *****\n\n" );
log_msg("\n***** FREE LIBRARIES *****\n\n" );
freeCustomLibraries();
freeD2Libraries();
log_msg("***** END DIABLO II *****\n" );
log_close();
return true;
}
@ -412,7 +410,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
initD2modules();
if (version_Game < V109 || version_Game > V114d)
if (version_Game < V109 || version_Game > V113d && version_Game != V114d)
{
log_box("PlugY isn't compatible with this version : %s", GetVersionString(version_Game));
Release();
@ -431,6 +429,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
log_msg("***** INSTALL FUNCTIONS *****\n");
Install_PlugYFiles();
Install_VariableOnRealm();
if (active_Commands)
@ -456,6 +455,9 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
if (active_changingSavePath)
Install_ChangingSavePath();
if (active_AutoBackup)
Install_SavePlayerData();
if (active_StatsShiftClickLimit)
Install_StatsLimitShiftClick();
@ -510,17 +512,25 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
if (active_DoNotCloseNihlathakPortal)
Install_DoNotCloseNihlathakPortal();
if (active_MoveCainNearHarrogathWaypoint)
Install_MoveCainNearHarrogathWaypoint();
if (active_RemoveExperienceDiminushingReturn)
Install_RemoveExperienceDiminushingReturn();
log_msg("\nDLL patched sucessfully.\n\n\n");
unhookLibraries();
initCustomLibraries();
loadLocalizedStrings(D2GetLang());
//loadLocalizedStrings(D2GetLang());
log_msg("***** ENTERING DIABLO II *****\n\n" );
active_logFile = active_logFile - 1;
active_logFile--;
if (active_logFile < 1)
log_close();
return NULL;
}

View File

@ -13,11 +13,11 @@
#include <string.h> // strlen() strcat()
#include <direct.h> // _getcwd()
DWORD active_logFile = 1;
int active_logFile = 1;
static char log_file[MAX_PATH] = "";
static bool log_init = false;
static FILE* fLogFile = NULL;
void log_initfile()
{
@ -28,13 +28,12 @@ void log_initfile()
strcat(log_file, "\\");
strcat(log_file, "PlugY.log");
FILE* lLog = fopen( log_file, "w" );
fLogFile = fopen( log_file, "w" );
if( fLogFile == NULL )
return;
if( lLog != NULL )
{
fclose(lLog);
log_init = true;
}
log_msg("<----------------------------------------------->\n"
"\n"
@ -46,6 +45,15 @@ void log_initfile()
,PLUGY_VERSION);
}
void log_close()
{
if (fLogFile)
{
fclose(fLogFile);
fLogFile = NULL;
}
}
void log_box( const char* pFormat, ... )
{
char buffer[300];
@ -61,7 +69,8 @@ void log_box( const char* pFormat, ... )
void log_msg( const char* pFormat, ... )
{
if (!active_logFile) return;
if (!active_logFile)
return;
if( !log_init )
log_initfile();
@ -71,12 +80,13 @@ void log_msg( const char* pFormat, ... )
va_list lArgs;
va_start( lArgs, pFormat );
FILE *lDebug = fopen( log_file, "a" );
if ( fLogFile == NULL )
fLogFile = fopen( log_file, "a" );
if( lDebug != NULL )
if( fLogFile != NULL )
{
vfprintf( lDebug, pFormat, lArgs );
fclose( lDebug );
vfprintf( fLogFile, pFormat, lArgs );
fflush(fLogFile);
}
else
log_init = false;

View File

@ -17,7 +17,7 @@
#define FILE_EXTENDED 0x4D545343 //"CSTM"
BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
BYTE * readExtendedSaveFile(char* name, DWORD* size)
{
char filename[512];
BYTE* data;
@ -45,7 +45,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
*size = 14;
*((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM"
*((WORD *)&data[4]) = FILE_VERSION;
*((DWORD*)&data[6]) = nbPlayersCommandByDefault - 1;
*((DWORD*)&data[6]) = (BYTE)(nbPlayersCommandByDefault == 0 ? 0 : nbPlayersCommandByDefault - 1);
*((DWORD*)&data[10]) = 0;// number of stash
TCustomDll* currentDll = customDlls;
@ -59,7 +59,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
}
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)
{
if (!ptChar || !PCPY || !data) return 0;
@ -99,7 +99,6 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
}
void writeExtendedSaveFile(char* name, BYTE* data, DWORD size)
{
char szTempName[MAX_PATH];
@ -128,22 +127,6 @@ void writeExtendedSaveFile(char* name, BYTE* data, DWORD size)
log_box("Could not create the extended save file.");
}
void backupExtendedSaveFile(char* name)
{
char szBackupName[MAX_PATH];
char szSaveName[MAX_PATH];
D2FogGetSavePath(szSaveName, MAX_PATH);
strcat(szSaveName, name);
strcat(szSaveName, ".d2x");
D2FogGetSavePath(szBackupName, MAX_PATH);
strcat(szBackupName, name);
strcat(szBackupName, ".d2x.backup");
CopyFile(szSaveName, szBackupName, true);
}
void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
{
@ -151,7 +134,7 @@ void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curS
*curSize += 4;
*(WORD *)(*data + *curSize) = FILE_VERSION;
*curSize += 2;
*(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand - 1);
*(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand == 0 ? 0 : nbPlayersCommand - 1);
*curSize += 4;
saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize);

View File

@ -1,27 +1,29 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d and DoNotCloseNihlathakPortal by haxifix.
More little options.
=================================================================*/
#include "common.h"
#include "skillsPoints.h"
#include "infinityStash.h"
#include <stdio.h>
int active_DisplayItemLevel = false;
bool active_DisplayItemLevel = false;
DWORD nbPlayersCommandByDefault = 0;
DWORD nbPlayersCommand = 0;
int active_alwaysRegenMapInSP = false;
int active_RunLODs = false;
int active_AlwaysDisplayLifeMana = false;
int active_EnabledTXTFilesWithMSExcel = false;
int active_DisplayBaseStatsValue = false;
int active_LadderRunewords = false;
int active_EnabledCowPortalWhenCowKingWasKill = false;
int active_DoNotCloseNihlathakPortal = false;
bool active_alwaysRegenMapInSP = false;
bool active_RunLODs = false;
int active_AlwaysDisplayLifeMana = 0;
bool active_EnabledTXTFilesWithMSExcel = false;
bool active_DisplayBaseStatsValue = false;
bool active_LadderRunewords = false;
bool active_EnabledCowPortalWhenCowKingWasKill = false;
bool active_DoNotCloseNihlathakPortal = false;
bool active_MoveCainNearHarrogathWaypoint = false;
bool active_RemoveExperienceDiminushingReturn = false;
/****************************************************************************************************/
@ -29,7 +31,7 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem)
{
if (onRealm && (selectModParam==MOD_NO)) return;
WCHAR text[0x50];
_snwprintf(text, sizeof(text), L"%s: %u\n", getLocalString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem));
_snwprintf(text, 50, L"%s: %u\n", getLocalString(STR_ITEM_LEVEL), D2GetItemLevel(ptItem));
D2SetColorPopup(text,WHITE);
wcscat(popup,text);
}
@ -37,12 +39,10 @@ void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem)
FCT_ASM ( caller_displayItemlevel_114 )
PUSH ECX
PUSH EAX
PUSH EDI
PUSH ECX
LEA EAX,DWORD PTR SS:[EBP-0x2434]
PUSH EAX
CALL displayItemlevel
POP EDI
POP EAX
POP ECX
POP EDX
@ -80,20 +80,17 @@ FCT_ASM ( caller_displayItemlevel_111 )
FCT_ASM ( caller_displayItemlevelSet_114 )
PUSH ECX
PUSH EAX
PUSH EDI
PUSH EDX
PUSH ECX
LEA EAX,DWORD PTR SS:[EBP-0x2138]
PUSH EAX
CALL displayItemlevel
POP EDI
POP EAX
POP ECX
POP EDX
POP ECX
POP EAX
PUSH 0x100
JMP EDX
JMP EAX
}}
FCT_ASM ( caller_displayItemlevelSet_111 )
PUSH ECX
PUSH EDX
@ -176,24 +173,26 @@ void Install_DisplayItemLevel()
// print the text in the final buffer
mem_seek R8(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0, 98590, 8E983);
memt_byte( 0x68 , 0xE8);
MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevel_114 : version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9);
MEMT_REF4( 0x100, version_D2Client >= V114d ? caller_displayItemlevel_114 : version_D2Client >= V113c ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9);
//6FAE38A1 . 68 00010000 PUSH 100
//6FB5DD0A |. 68 00010000 PUSH 100
//6FB289DA |. 68 00010000 PUSH 100
//6FB5E0AA |. 68 00010000 PUSH 100
//6FB441C0 |. 68 00010000 PUSH 100
//6FB48590 |. 68 00010000 PUSH 100
//0048E983 |. 68 00010000 PUSH 100 ; /Arg1 = 00000100
// print the text in the final buffer (for set items)
mem_seek R8(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3, 973B3, 8D774);
memt_byte( 0x68 , 0xE8);
MEMT_REF4( 0x100, version_D2Client == V114d ? caller_displayItemlevelSet_114 : version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9);
MEMT_REF4( 0x100, version_D2Client >= V114d ? caller_displayItemlevelSet_114 : version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9);
//6FAE27BE . 68 00010000 PUSH 100
//6FB5C773 |. 68 00010000 PUSH 100
//6FB27773 |. 68 00010000 PUSH 100
//6FB5CEB3 |. 68 00010000 PUSH 100
//6FB42FE3 |. 68 00010000 PUSH 100
//6FB473B3 |. 68 00010000 PUSH 100
//0048D774 |. 68 00010000 PUSH 100 ; /Arg1 = 00000100
log_msg("\n");
@ -206,6 +205,9 @@ char* msgNBPlayersString = "players %u";
DWORD* infoEnabledSendPlayersCommand;
void SendPlayersCommand()
{
if (!needToInit || onRealm) return;
needToInit = false;
#pragma pack(1)
struct {
BYTE displayType;//0x15 main msg; 0x14: char popup
@ -213,14 +215,20 @@ void SendPlayersCommand()
BYTE zero;
char string[0xFF];
char null;
char targetName[0x10];
char null2;
} data;
#pragma pack()
if (!needToInit || onRealm) return;
needToInit=0;
DWORD info = *infoEnabledSendPlayersCommand;
if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return;
if (!active_multiPageStash)
nbPlayersCommand = nbPlayersCommandByDefault;
//if (nbPlayersCommand < 2)
// return;
log_msg("SendPlayersCommand %u\n", nbPlayersCommand);
D2SetNbPlayers(nbPlayersCommand);
@ -229,14 +237,21 @@ void SendPlayersCommand()
data.displayType=0x15;
data.un=1;
data.zero=0;//*(BYTE*)(offset_D2Client+0x112CFC); in 1.10
data.null=NULL;
sprintf(data.string, msgNBPlayersString, nbPlayersCommand);
data.null=NULL;
D2SendMsgToAll((BYTE*)&data);
}
//FCT_ASM ( caller_SendPlayersCommand_old )
// CALL SendPlayersCommand
// JMP D2GetResolution
//}}
FCT_ASM ( caller_SendPlayersCommand )
PUSH ECX
CALL SendPlayersCommand
JMP D2GetResolution
POP ECX
JMP D2PrintInterface
}}
void Install_SendPlayersCommand()
@ -251,13 +266,8 @@ void Install_SendPlayersCommand()
msgNBPlayersString = (char*)R8(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00, D470C, 2D7374);
// Set nb Player to default
mem_seek R8(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2, 56EF9);//6FB1C7B7-6FAA0000
if (version_D2Client == V114d) {
MEMT_REF4(0x0009E263, caller_SendPlayersCommand);
}
else {
MEMJ_REF4(D2GetResolution, caller_SendPlayersCommand);
}
// mem_seek R8(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2, 1D3F2, 56EF9);//6FB1C7B7-6FAA0000
// MEMJ_REF4( D2GetResolution, caller_SendPlayersCommand_old);
//6FB2723A |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
//6FB265BA |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
//6FB21B8A . E8 4F9C0400 CALL <JMP.&D2gfx.#10005>
@ -266,6 +276,20 @@ void Install_SendPlayersCommand()
//6FB40161 |. E8 1ECFF7FF CALL <JMP.&D2gfx.#10043>
//6FB739F1 |. E8 B896F4FF CALL <JMP.&D2gfx.#10031>
//6FACD3F1 |. E8 EAFBFEFF CALL <JMP.&D2gfx.#10012>
//00456EF8 |. E8 63E20900 CALL Game.004F5160
// Set nb Player to default
mem_seek R8(D2Client, 90BA, 90AA, 97DA, 88E4C, 32C8C, 7CB5C, 4437C, 453CC, 4CB04);//6FB1C7B7-6FAA0000
MEMC_REF4( D2PrintInterface, caller_SendPlayersCommand);
//6FAA90B9 . E8 62E10700 CALL D2Client.6FB27220
//6FAA90A9 . E8 F2D40700 CALL D2Client.6FB265A0
//6FAA97D9 . E8 92830700 CALL D2Client.6FB21B70
//6FB38E4B . E8 A0A70100 CALL D2Client.6FB535F0
//6FAE2C8B . E8 603D0300 CALL D2Client.6FB169F0
//6FB2CB5B . E8 F0350100 CALL D2Client.6FB40150
//6FAF437B . E8 60F60700 CALL D2Client.6FB739E0
//6FAF53CB . E8 1080FDFF CALL D2Client.6FACD3E0
//0044CB03 |. E8 D8A30000 CALL Game.00456EE0
log_msg("\n");
@ -291,6 +315,7 @@ void Install_AlwaysRegenMapInSP()
//6FC3E1FE |. 74 09 JE SHORT D2Game.6FC3E209
//6FD0D3BE |. 74 09 JE SHORT D2Game.6FD0D3C9
//6FC46D7E |. 74 09 JE SHORT D2Game.6FC46D89
//0056A20F |. 74 09 JE SHORT Game.0056A21A
log_msg("\n");
@ -313,6 +338,7 @@ void Install_RunLODs()
//6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996
//6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606
//6FA8B6B0 |. 74 45 JE SHORT D2gfx.6FA8B6F7
//004F562B |. 74 45 JE SHORT Game.004F5672
log_msg("\n");
@ -322,14 +348,17 @@ void Install_RunLODs()
/****************************************************************************************************/
FCT_ASM (caller_AlwaysDisplayLife_114)
JNZ displayLife
CMP onRealm,0
JNZ normalDisplayLife
CMP active_AlwaysDisplayLifeMana,0
JE normalDisplayLife
CMP EAX, 0x1
RETN
displayLife:
POP EAX
ADD EAX,0x24
JMP EAX
normalDisplayLife:
CMP DWORD PTR DS : [0x7BEFDC], EAX
LEA EAX,DWORD PTR DS:[ESI-0x1E]
RETN
}}
@ -383,10 +412,11 @@ FCT_ASM( caller_AlwaysDisplayMana_114 )
CMP active_AlwaysDisplayLifeMana,0
JE normalDisplayMana
POP EAX
ADD EAX, 0x32
ADD EAX,0x23
JMP EAX
normalDisplayMana:
CMP DWORD PTR DS : [0x7BEFE0], 0
LEA EDI,DWORD PTR DS:[ECX-0x6F]
CMP ESI,EDI
RETN
}}
@ -448,16 +478,13 @@ void Install_AlwaysDisplayLifeMana()
if (isInstalled) return;
log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n");
if (version_D2Client == V114d) {
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 98146);
memt_byte(0x39, 0xE8);
MEMT_REF4(0x7BEFDC05, caller_AlwaysDisplayLife_114);
memt_byte(0x00, 0x90);
} else if ( version_D2Client >= V113c ) {
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 6D6FA);
memt_byte( 0x0F , 0x90);
memt_byte( 0x8C , 0xE8);
MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113);
if ( version_D2Client >= V113c )
{
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A, 6D6FA, 98183);
if (version_D2Client < V114d) memt_byte( 0x0F , 0x90);
memt_byte( version_D2Client >= V114d ? 0x75 : 0x8C , 0xE8);
MEMT_REF4( version_D2Client >= V114d ? 0xE2468D27 : 0x000000BC, version_D2Client >= V114d ? caller_AlwaysDisplayLife_114 : caller_AlwaysDisplayLife_113);
//6FAD764A |. 0F8C BC000000 JL D2Client.6FAD770C
//6FAD7650 |. 83FA 6E CMP EDX,6E
//6FAD7653 |. 0F8F B3000000 JG D2Client.6FAD770C
@ -465,6 +492,9 @@ void Install_AlwaysDisplayLifeMana()
//6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711
//6FB1D717 |. 0F8C A4000000 JL D2Client.6FB1D7C1
//6FB1D6FA |. 0F8C BC000000 JL D2Client.6FB1D7BC
//00498183 |. 75 27 JNZ SHORT Game.004981AC
//00498185 |. 8D46 E2 LEA EAX,DWORD PTR DS:[ESI-1E]
} else {
// Always display life.
mem_seek R8(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000, 0000, 0000);
@ -475,21 +505,17 @@ void Install_AlwaysDisplayLifeMana()
//6FB31733 |. A1 E4C6B86F MOV EAX,DWORD PTR DS:[6FB8C6E4]
}
// Always display mana.
if (version_D2Client == V114d) {
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 9824E);
memt_byte(0x83, 0xE8);
MEMT_REF4(0x7BEFE03D, caller_AlwaysDisplayMana_114);
memt_byte(0x00, 0x90);
memt_byte(0x00, 0x90);
} else if ( version_D2Client >= V113c ) {
if ( version_D2Client >= V113c )
{
//mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711);
//memt_byte( 0x8B , 0x90);
//memt_byte( 0x0D , 0xE8);
//MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113);
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 00000);
memt_byte( 0xA1 , 0xE8);
MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113);
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C, 6D7BC, 9825D);
memt_byte( version_D2Client >= V114d ? 0x8D : 0xA1 , 0xE8);
MEMT_REF4( version_D2Client >= V114d ? 0xF73B9179 : (DWORD)ptResolutionY , version_D2Client >= V114d ? caller_AlwaysDisplayMana_114 : caller_AlwaysDisplayMana_113);
//6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
//6FAD7711 |> 8B0D B4C4BC6F MOV ECX,DWORD PTR DS:[6FBCC4B4]
@ -502,6 +528,8 @@ void Install_AlwaysDisplayLifeMana()
//6FAD77CB |. 81C4 28030000 ADD ESP,328
//6FAD77D1 \. C3 RETN
//6FB1D7BC |> A1 3870BA6F MOV EAX,DWORD PTR DS:[6FB8BC4C]
//0049825D |. 8D79 91 LEA EDI,DWORD PTR DS:[ECX-6F]
//00498260 |. 3BF7 CMP ESI,EDI
}
else if ( version_D2Client >= V110 )
{
@ -553,7 +581,7 @@ void Install_EnabledTXTFilesWithMSExcel()
log_msg("Patch D2Client for enabled the opening of files already opened by MS Excel. (EnabledTXTFilesWithMSExcel)\n");
mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm == V114d ? 0xB4 : version_Storm >= V111 ? 0x12A : 0xFF) );
mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm >= V114d ? 0xB4 : version_Storm >= V111 ? 0x12A : 0xFF) );
memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
//6FC1C969 |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ
@ -588,7 +616,7 @@ void STDCALL printDisplayBaseStatsValue(WORD statID, sDrawImageInfo* data, DWORD
if (isOnRect(D2GetMouseX(),D2GetMouseY(),x+5,y+5,32,32))
{
WCHAR text[100];
_snwprintf(text, sizeof(text), getLocalString(STR_STATS_BASE_MIN), statValue, minValue);
_snwprintf(text, 100, getLocalString(STR_STATS_BASE_MIN), statValue, minValue);
D2SetFont(1);
D2PrintPopup(text, x+18, y-32, WHITE, 1);
}
@ -613,31 +641,30 @@ void Install_DisplayBaseStatsValue()
if (isInstalled) return;
log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n");
if (version_D2Client == V114d) goto jump;
// Always print stat button images.
mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, BF955);
mem_seek R8(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5, BF955, A7FFB);
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
memt_byte( 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 13) );
memt_byte( 0x24, 0x90 ); // NOP
memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
memt_byte( version_D2Client == V114d ? 0x4D : 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 12) );
memt_byte( version_D2Client == V114d ? 0xF8 : 0x24, 0x90 ); // NOP
if (version_D2Client < V114d) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 53), 0x90 ); // NOP (V109d:0x20 , V110:0x14
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB6F955 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
jump:
//004A7FFB > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
//004A7FFE . 53 PUSH EBX ; /Arg3
mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C);
if (version_D2Client == V114d) {
MEMT_REF4(0x0004E3F0, caller_displayBaseStatsValue);
} else {
MEMJ_REF4( D2PrintImage, caller_displayBaseStatsValue);
}
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
//6FB6D23D |. E8 54FEF4FF |CALL <JMP.&D2gfx.#10041>
//6FB6F9DD |. E8 54FEF4FF |CALL <JMP.&D2gfx.#10042>
//004A808B . E8 F0E30400 CALL Game.004F6480 ; \Game.004F6480
log_msg("\n");
@ -650,9 +677,8 @@ void Install_DisplayBaseStatsValue()
RunesBIN* STDCALL compileRunesTxt(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
{
RunesBIN* ptRunesBin = (RunesBIN*)D2CompileTxtFile(unused, filename, ptFields, ptRecordCount, recordLength);
for (DWORD i = 0; i < *ptRecordCount; i++) {
for (DWORD i=0; i < *ptRecordCount; i++)
ptRunesBin[i].Server=0;
}
return ptRunesBin;
}
@ -667,17 +693,14 @@ void Install_LadderRunewords()
log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n");
mem_seek R8(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2, 63782, 239C40);
if (version_D2Common == V114d) {
MEMT_REF4(0xFFFD86AC, compileRunesTxt);
} else {
MEMC_REF4( D2CompileTxtFile, compileRunesTxt);
}
//01B6E964 |. E8 0714FFFF CALL D2Common.#10578 ; \#10578
//6FDB1761 |. E8 FAA8FCFF CALL D2Common.#10653 ; \#10653
//6FD93A71 |. E8 EAADFCFF CALL D2Common.#10496 ; \#10496
//6FDAD491 |. E8 BA49FEFF CALL D2Common.#10244 ; \#10244
//6FDC24B1 |. E8 8ACAFEFF CALL D2Common.#10849 ; \#10849
//6FDB3781 |. E8 5A93FAFF CALL D2Common.#10037 ; \#10037
//00639C3F |. E8 AC86FDFF CALL Game.006122F0 ; \Game.006122F0
log_msg("\n");
@ -705,6 +728,7 @@ void Install_EnabledCowPortalWhenCowKingWasKill()
//6FC95C68 |. 85C0 TEST EAX,EAX
//6FC87508 |. 85C0 TEST EAX,EAX
//6FC2EBE8 |. 85C0 TEST EAX,EAX
//00594179 |. 85C0 TEST EAX,EAX
log_msg("\n");
@ -716,14 +740,221 @@ void Install_EnabledCowPortalWhenCowKingWasKill()
void Install_DoNotCloseNihlathakPortal()
{
static int isInstalled = false;
if (version_D2Game < V114d || isInstalled) return;
if (isInstalled) return;
log_msg("Patch D2Game to not close Nihlathak's portal. (DoNotCloseNihlathakPortal)\n");
mem_seek R8(D2Game, 0, 0, 0, 0, 0, 0, 0, 0, 18B9D7);
mem_seek R8(D2Game, 76B19, 77019, 86679 , 107C7, 51987, 26B67, 5AE67, 1FF27, 18B9D7);
memt_byte(0x0F, 0x90);
memt_byte(0x85, 0x90);
memt_dword(0x000000C5, 0x90909090);
memt_dword( version_D2Game >= V114d ? 0x000000C5 : version_D2Game >= V111 ? 0x000000BF : 0x000000C1, 0x90909090);
//6FCA6B19 . 0F85 C1000000 JNZ D2Game.6FCA6BE0
//6FCA7019 . 0F85 C1000000 JNZ D2Game.6FCA70E0
//6FCB6679 . 0F85 C1000000 JNZ D2Game.6FCB6740
//6FC307C7 . 0F85 BF000000 JNZ D2Game.6FC3088C
//6FC71987 . 0F85 BF000000 JNZ D2Game.6FC71A4C
//6FC46B67 . 0F85 BF000000 JNZ D2Game.6FC46C2C
//6FC7AE67 . 0F85 BF000000 JNZ D2Game.6FC7AF2C
//6FC3FF27 . 0F85 BF000000 JNZ D2Game.6FC3FFEC
//0058B9D7 |. 0F85 C5000000 JNZ Game.0058BAA2
log_msg("\n");
isInstalled = true;
}
/****************************************************************************************************/
/* townWest.ds1:
129A6 : 4D->76
129AA : 56->3A
12ACA : 05->04
+4 : 4D->76
+4 : 56->3A
+4 : 4E->76
+4 : 58->3A
+4 : 01->01
+4 : 4C->7B
+4 : 57->50
+4 : 02->02
+4 : 4D->7B
+4 : 5D->41
+4 : 01->01
+4 : 49->7D
+4 : 5C->3E
+4 : 02->02
+4 : 4F->
+4 : 5B->
+4 : 02->
*/
/*char* FASTCALL usePlugYTownWest(char* filename)
{
if (onRealm)
return filename;
if (!strcmp(filename, "DATA\\GLOBAL\\TILES\\Expansion\\Town\\townWest.ds1"))
return "PlugY\\townWest.ds1";
return filename;
}
FCT_ASM ( caller_usePlugYTownWest )
LEA EAX,DWORD PTR SS:[EBP-0x40]
MOV ECX,EAX
CALL usePlugYTownWest
MOV ECX,EAX
RETN
}}
FCT_ASM ( caller_usePlugYTownWest_113d )
LEA EAX,DWORD PTR SS:[ESP+0x14]
MOV ECX,EAX
CALL usePlugYTownWest
MOV EDX,ESI
RETN
}}*/
/****************************************************************************************************/
void* FASTCALL updateHarrogath(DWORD unused, char* filename, DWORD* size, const char* __CallFile, DWORD __CallLine)
{
if (onRealm)
return D2ReadFile(unused, filename, size, __CallFile, __CallLine);
if (strcmp(filename, "DATA\\GLOBAL\\TILES\\Expansion\\Town\\townWest.ds1"))
return D2ReadFile(unused, filename, size, __CallFile, __CallLine);
DWORD fileSize = 0;
if (size == NULL)
size = &fileSize;
char* data = (char*)D2ReadFile(unused, filename, size, __FILE__, __LINE__);
if (*size > 400 &&
*(DWORD*)(data + *size - 0x16C) == 0x0000004D &&
*(DWORD*)(data + *size - 0x168) == 0x00000056 &&
*(DWORD*)(data + *size - 0x48) == 0x00000005 &&
*(DWORD*)(data + *size - 0x44) == 0x0000004D &&
*(DWORD*)(data + *size - 0x40) == 0x00000056 &&
*(DWORD*)(data + *size - 0x3C) == 0x0000004E &&
*(DWORD*)(data + *size - 0x38) == 0x00000058 &&
*(DWORD*)(data + *size - 0x34) == 0x00000001 &&
*(DWORD*)(data + *size - 0x30) == 0x0000004C &&
*(DWORD*)(data + *size - 0x2C) == 0x00000057 &&
*(DWORD*)(data + *size - 0x28) == 0x00000002 &&
*(DWORD*)(data + *size - 0x24) == 0x0000004D &&
*(DWORD*)(data + *size - 0x20) == 0x0000005D &&
*(DWORD*)(data + *size - 0x1C) == 0x00000001 &&
*(DWORD*)(data + *size - 0x18) == 0x00000049 &&
*(DWORD*)(data + *size - 0x14) == 0x0000005C &&
*(DWORD*)(data + *size - 0x10) == 0x00000002 &&
*(DWORD*)(data + *size - 0x0C) == 0x0000004F &&
*(DWORD*)(data + *size - 0x08) == 0x0000005B &&
*(DWORD*)(data + *size - 0x04) == 0x00000002)
{
log_msg("update TownWest to Move Cain near Harrogath waypoint\n");
*(DWORD*)(data + *size - 0x16C) = 0x00000076;
*(DWORD*)(data + *size - 0x168) = 0x0000003A;
*(DWORD*)(data + *size - 0x48) = 0x00000004;
*(DWORD*)(data + *size - 0x44) = 0x00000076;
*(DWORD*)(data + *size - 0x40) = 0x0000003A;
*(DWORD*)(data + *size - 0x3C) = 0x00000076;
*(DWORD*)(data + *size - 0x38) = 0x0000003A;
*(DWORD*)(data + *size - 0x34) = 0x00000001;
*(DWORD*)(data + *size - 0x30) = 0x0000007B;
*(DWORD*)(data + *size - 0x2C) = 0x00000050;
*(DWORD*)(data + *size - 0x28) = 0x00000002;
*(DWORD*)(data + *size - 0x24) = 0x0000007B;
*(DWORD*)(data + *size - 0x20) = 0x00000041;
*(DWORD*)(data + *size - 0x1C) = 0x00000001;
*(DWORD*)(data + *size - 0x18) = 0x0000007D;
*(DWORD*)(data + *size - 0x14) = 0x0000003E;
*(DWORD*)(data + *size - 0x10) = 0x00000002;
*(DWORD*)(data + *size - 0x0C) = 0x00000000;
*(DWORD*)(data + *size - 0x08) = 0x00000000;
*(DWORD*)(data + *size - 0x04) = 0x00000000;
}
else
log_msg("ERROR : Failed to update TownWest to Move Cain near Harrogath waypoint\n");
return data;
}
FCT_ASM ( caller_updateHarrogath )
MOV ECX,DWORD PTR SS:[ESP+4]
PUSH 0
PUSH 0
PUSH DWORD PTR SS:[ESP+0x10]
MOV EDX,EAX
CALL updateHarrogath
RETN 8
}}
void Install_MoveCainNearHarrogathWaypoint()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Common to move Deckard Cain near Waypoint in Harrogath. (MoveCainNearHarrogathWaypoint)\n");
mem_seek R8(D2Common, 3653E, 3654E, 45A2E , 82233, 39593, 222A3, B573, 54033, 265972);
MEMC_REF4( V2ReadFile, version_D2Common >= V111 && version_D2Common <= V113d? (TD2ReadFile)caller_updateHarrogath : updateHarrogath);
//6FD7653D |. E8 62D30300 CALL D2Common.6FDB38A4
//6FD7654D |. E8 62D40300 CALL D2Common.6FDB39B4
//6FD85A2D |. E8 36E80300 CALL D2Common.6FDC4268
//6FDD2232 . E8 A974F8FF CALL D2Common.6FD596E0
//6FD89592 . E8 3903FDFF CALL D2Common.6FD598D0
//6FD722A2 . E8 5976FEFF CALL D2Common.6FD59900
//6FD5B572 . E8 89E3FFFF CALL D2Common.6FD59900
//6FDA4032 . E8 A975FBFF CALL D2Common.6FD5B5E0
//00665971 |. E8 0317EBFF CALL Game.00517079
/*
mem_seek R8(D2Common, 0000, 0000, 0000 , 0000, 0000, 734AA, 6C75A, 308FA, 21E4F7);
memt_byte( 0x8D, 0xE8);
MEMT_REF4( version_D2Common >= V114d ? 0xC88BC045 : 0x8B102444, version_D2Common >= V114d ? caller_usePlugYTownWest : caller_usePlugYTownWest_113d);
if (version_D2Common < V114d) memt_byte( 0xD6, 0x90);
//6FDC34AA |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
//6FDC34AE |. 8BD6 MOV EDX,ESI
//6FDBC75A |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
//6FDBC75E |. 8BD6 MOV EDX,ESI
//6FD808FA |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
//6FD808FE |. 8BD6 MOV EDX,ESI
//0061E4F7 |. 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
//0061E4FA |. 8BC8 MOV ECX,EAX
*/
log_msg("\n");
isInstalled = true;
}
ExperienceBIN* STDCALL modifExperienceBin(ExperienceBIN* ptExperienceBIN)
{
for (int i=71; i<101; i++)
ptExperienceBIN[i].ExpRatio = 1024;
return ptExperienceBIN;
}
FCT_ASM ( caller_modifExperienceBin )
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
PUSH DWORD PTR SS:[ESP+0x14]
CALL D2CompileTxtFile
PUSH EAX
CALL modifExperienceBin
RETN 0x14
}}
void Install_RemoveExperienceDiminushingReturn()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Common to remove experience diminushing return. (RemoveExperienceDiminushingReturn)\n");
// modification of experienceBIN
mem_seek R8(D2Common, 00000, 00000, 00000, 00000, 00000, 00000, 00000, 00000, 213E42);
MEMC_REF4( D2CompileTxtFile, caller_modifExperienceBin);
//00613E41 |. E8 AAE4FFFF CALL Game.006122F0 ; \Game.006122F0
log_msg("\n");

View File

@ -9,6 +9,7 @@
#include "bigStash.h" // active_bigStash_tested
#include "uberQuest.h" //active_UberQuest + resetQuestState()
#include "infinityStash.h" //active_UberQuest + resetQuestState()
#include "common.h"
#include <stdio.h>
@ -16,9 +17,13 @@ bool onRealm=false;
bool needToInit = false;
int previouslyOnRealm = -1;
void STDCALL BtnPress()
// mode 0:SinglePlayer - 1:TCPIP - 2:Battlenet
void STDCALL BtnPress(int mode)
{
needToInit = 1;
needToInit = true;
loadLocalizedStrings(D2GetLang());
// if (active_WorldEvent)
// initWorldEventVariables();
if (active_UberQuest)
@ -33,6 +38,7 @@ FCT_ASM( caller_BnetBtnPress114 )
JE disableBattleNet
MOV onRealm,1
PUSH EAX
PUSH 2
CALL BtnPress
POP EAX
SUB ESP,0x3FC//400
@ -48,6 +54,7 @@ FCT_ASM ( caller_BnetBtnPress )
JE disableBattleNet
MOV onRealm,1
PUSH EAX
PUSH 2
CALL BtnPress
POP EAX
SUB ESP,0x3FC//400
@ -67,17 +74,16 @@ FCT_ASM ( caller_MultiPlayerBtnPress )
FCT_ASM ( caller_TCPIPBtnPress114 )
MOV onRealm,0
PUSH EAX
PUSH EDX
PUSH 1
CALL BtnPress
POP EDX
POP EAX
MOV ECX, 0x006D39BC
RETN
MOV ECX,DWORD PTR SS:[ESP]
ADD ECX,0xB9B0
JMP ECX
}}
FCT_ASM ( caller_TCPIPBtnPress111 )
MOV onRealm,0
PUSH 1
CALL BtnPress
MOV ESI,0x40
RETN
@ -85,6 +91,7 @@ FCT_ASM ( caller_TCPIPBtnPress111 )
FCT_ASM ( caller_TCPIPBtnPress )
MOV onRealm,0
PUSH 1
CALL BtnPress
MOV EBP,1
RETN
@ -92,6 +99,7 @@ FCT_ASM ( caller_TCPIPBtnPress )
FCT_ASM ( caller_SinglePlayerBtnPress )
MOV onRealm,0
PUSH 0
CALL BtnPress
MOV EDX,0x400
RETN
@ -131,6 +139,7 @@ void Install_VariableOnRealm()
MEMT_REF4( 0x000400EC, version_D2Launch == V114d ? caller_BnetBtnPress114 : caller_BnetBtnPress);
memt_byte( 0x00, 0x90 ); // NOP
//6FA529E5 . 81EC 00040000 SUB ESP,400
//0043533B |. 81EC 00040000 SUB ESP,400
// click on Multiplayer button
// mem_seek R7(D2Launch, D5EC, D5CC, EFFC, 0000, 0000, 0000, 0000);
@ -139,14 +148,16 @@ void Install_VariableOnRealm()
//6FA1EFFC . B8 01000000 MOV EAX,1
// click on TCP/IP button
mem_seek R8(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E, 2FFFA);
if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110)
mem_seek R8(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E, 1053E, 2FFEC);
if (version_D2Launch <= V110)
{
memt_byte( 0xBD, 0xE8 ); // CALL
MEMT_REF4( 0x00000001, caller_TCPIPBtnPress);
} else if (version_D2Launch == V114d) {
memt_byte(0xB9, 0xE8);
MEMT_REF4(0x006D39BC, caller_TCPIPBtnPress114);
}
else if (version_D2Launch >= V114d)
{
MEMT_REF4( 0x0000B9B0, caller_TCPIPBtnPress114);
//0042FFEB . E8 B0B90000 CALL Game.0043B9A0
} else {
memt_byte( 0xBE, 0xE8 ); // CALL
MEMT_REF4( 0x00000040, caller_TCPIPBtnPress111);
@ -158,6 +169,7 @@ void Install_VariableOnRealm()
memt_byte( 0xBA, 0xE8 ); // CALL
MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress);
//6FA4B726 . BA 00040000 MOV EDX,400
//00430BC9 |. BA 00040000 MOV EDX,400
if (version_D2Game == V110)
{

View File

@ -20,6 +20,8 @@ DWORD maxSharedPages = -1;
DWORD nbPagesPerIndex = 10;
DWORD nbPagesPerIndex2 = 100;
bool active_multiPageStash = false;
bool autoRenameStashPage = false;
int active_SharedStashInMultiPlayer = 0;//0: disabled, 1:shared in SP, 2: shared in SP & TCP/IP
bool active_sharedStash = false;
bool separateHardSoftStash = false;
bool active_sharedGold=false;
@ -39,14 +41,14 @@ Unit* firstClassicStashItem(Unit* ptChar)
return NULL;
}
DWORD endStashList(Unit* ptChar, Stash* ptStash)//WORKS
DWORD endStashList(Unit* ptChar, Stash* ptStash)
{
Stash* stash = ptStash;
while (stash)
{
if (stash->ptListItem || ((stash == PCPY->currentStash) && firstClassicStashItem(ptChar))) return 0;
if (stash->isIndex || (stash->name != NULL && stash->name[0])) return 0;
if (stash->name != NULL && stash->name[0]) return 0;
stash = stash->nextStash;
}
return 1;
@ -64,15 +66,13 @@ DWORD endStashList(Unit* ptChar, Stash* ptStash)//WORKS
//}
Stash* getLastStash(Stash* ptStash)//WORKS
Stash* getLastStash(Stash* ptStash)
{
Stash* stash = ptStash;
if (!stash) return NULL;
while (stash->nextStash)
stash = stash->nextStash;
return stash;
if (!ptStash)
return NULL;
while (ptStash->nextStash)
ptStash = ptStash->nextStash;
return ptStash;
}
Stash* newStash(DWORD id)
@ -87,36 +87,40 @@ Stash* newStash(DWORD id)
return stash;
}
Stash* addStash(Unit* ptChar, bool isShared)
Stash* addStash(Unit* ptChar, bool isShared, bool autoSetIndex, Stash* previous)
{
Stash* previous;
Stash* stash;
// DWORD memPool = PCGame ? PCGame->memoryPool :0;
if (isShared)
{
previous = getLastStash(PCPY->sharedStash);
stash = newStash(PCPY->nbSharedPages++);
} else {
previous = getLastStash(PCPY->selfStash);
stash = newStash(PCPY->nbSelfPages++);
}
previous = getLastStash(previous ? previous : isShared ? PCPY->sharedStash : PCPY->selfStash);
if (previous)
isShared = previous->isShared;
Stash* stash = newStash(isShared ? PCPY->nbSharedPages++ : PCPY->nbSelfPages++);
stash->isShared = isShared;
stash->previousStash = previous;
if (previous)
{
previous->nextStash = stash;
stash->isIndex = ((stash->id + 1) % nbPagesPerIndex) == 0;
stash->isMainIndex = ((stash->id + 1) % nbPagesPerIndex2) == 0;
}
else if (isShared)
{
PCPY->sharedStash = stash;
stash->isIndex = 1;
stash->isMainIndex = 1;
}
else
{
PCPY->selfStash = stash;
stash->isIndex = 1;
stash->isMainIndex = 1;
}
log_msg("AddStash: stash->id=%d\tstash->isShared=%d\tstash->previous=%08X\tnbSelf=%d\tnbShared=%d\n",
stash->id,stash->isShared,stash->previousStash,PCPY->nbSelfPages,PCPY->nbSharedPages);
log_msg("AddStash: stash->id=%d\tstash->isShared=%d\tnbSelf=%d\tnbShared=%d\n", stash->id, stash->isShared, PCPY->nbSelfPages, PCPY->nbSharedPages);
return stash;
}
Stash* getStash(Unit* ptChar, DWORD isShared, DWORD id)//WORKS
Stash* getStash(Unit* ptChar, DWORD isShared, DWORD id)
{
Stash* ptStash = isShared ? PCPY->sharedStash : PCPY->selfStash;
@ -134,11 +138,11 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO
{
if (!newStash) return 0;
log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, bOnlyItems, bIsClient);
Stash* currentStash = PCPY->currentStash;
if (currentStash == newStash) return 0;
log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, bOnlyItems, bIsClient);
d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__);
// collect items to remove
@ -153,7 +157,7 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO
{
D2SetAnim(D2GetRealItem(ptItem),-1);
if (ptPrevItem) {
ptPrevItem->CurrentAnim = (DWORD)ptNextItem;//is ptPrevItem->nextNode = ptNextItem;
ptPrevItem->mode = (DWORD)ptNextItem;//is ptPrevItem->nextNode = ptNextItem;
} else {
ptInventory->currentUsedSocket = (DWORD)ptNextItem;//is ptInventory->ptListItem = ptNextItem;
}
@ -167,7 +171,7 @@ int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DWO
if (currentStash)
{
// ptItem = setNextItem(ptItem, PCPY->currentStash->ptListItem);
ptItem->CurrentAnim = (DWORD)currentStash->ptListItem;//is ptItem->nextNode = ptListItem
ptItem->mode = (DWORD)currentStash->ptListItem;//is ptItem->nextNode = ptListItem
currentStash->ptListItem = ptItem;
};
} else ptPrevItem = ptItem;
@ -195,11 +199,11 @@ int changeToSelectedStash_10(Unit* ptChar, Stash* newStash, DWORD bOnlyItems, DW
{
if (!newStash) return 0;
log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n",newStash->id,newStash->isShared, bOnlyItems,bIsClient);
Stash* currentStash = PCPY->currentStash;
if (currentStash == newStash) return 0;
log_msg("changeToSelectedStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n",newStash->id,newStash->isShared, bOnlyItems,bIsClient);
d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__);
// Remove items from current page
@ -282,37 +286,74 @@ DWORD loadStash(Unit* ptChar, Stash* ptStash, BYTE data[], DWORD startSize, DWOR
return ret;
}
DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared)//WORKS
void autoSetIndex(Stash* fistStash)
{
if (!fistStash)
return;
Stash* stash = fistStash;
while (stash)
{
if (stash->isIndex || stash->isMainIndex)
return;
stash = stash->nextStash;
}
stash = fistStash;
stash->isIndex = 1;
stash = stash->nextStash;
while (stash)
{
stash->isIndex = ((stash->id + 1) % nbPagesPerIndex) == 0;
stash->isMainIndex = ((stash->id + 1) % nbPagesPerIndex2) == 0;
stash = stash->nextStash;
}
}
DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared)
{
DWORD curStash = 0;
Stash* newStash;
Stash* newStash = NULL;
DWORD nbStash = *(DWORD*)&data[*curSize];
*curSize += 4;
log_msg("loadStashList\n\nnbStash = %d\n\n", nbStash);
log_msg("loadStashList nbStash=%d\n", nbStash);
while (curStash < nbStash)
{
newStash = addStash(ptChar, isShared);
newStash = addStash(ptChar, isShared, false, newStash);
changeToSelectedStash(ptChar, newStash, 0, false);
DWORD ret = loadStash(ptChar, newStash, data, *curSize, 10000000, curSize);
if (ret) return ret;
curStash++;
}
if (!isShared && !PCPY->selfStash)
if (nbStash <2)
{
newStash = addStash(ptChar, isShared);
PCPY->currentStash = newStash;
newStash = addStash(ptChar, isShared, false, newStash);
changeToSelectedStash(ptChar, newStash, 0, false);
}
if (isShared && !PCPY->sharedStash)
if (!isShared)
{
newStash = addStash(ptChar, isShared);
if (PCPY->selfStash)
autoSetIndex(PCPY->selfStash);
else
{
newStash = addStash(ptChar, isShared, true, newStash);
PCPY->currentStash = newStash;
}
}
if (isShared)
{
if (PCPY->sharedStash)
autoSetIndex(PCPY->sharedStash);
else
{
newStash = addStash(ptChar, isShared, true, newStash);
if (!PCPY->currentStash)
PCPY->currentStash = newStash;
}
}
return 0;
}
@ -335,7 +376,7 @@ void saveStash(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD*
if (ptStash->name)
{
int size = strlen(ptStash->name);
if (size > 15) size = 15;
if (size > 20) size = 20;
strncpy((char*)DATA, ptStash->name, size);
*curSize += size;
}
@ -396,7 +437,7 @@ void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DW
}
/////// client
void updateSelectedStashClient(Unit* ptChar)//WORKS
void updateSelectedStashClient(Unit* ptChar)
{
Stash* newStash = PCPY->currentStash;
if (!newStash)
@ -405,13 +446,13 @@ void updateSelectedStashClient(Unit* ptChar)//WORKS
updateClient(ptChar, UC_PAGE_NAME, newStash->name);
}
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)//WORKS
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems)
{
log_msg("setSelectedStashClient ID:%d, stashFlags:%d, flags:%08X\n", stashId, stashFlags, flags);
Unit* ptChar = D2GetClientPlayer();
Stash* newStash = getStash(ptChar, (stashFlags & 1) == 1, stashId);
if (!newStash) do
newStash = addStash(ptChar, (stashFlags & 1) == 1);
newStash = addStash(ptChar, (stashFlags & 1) == 1, true, newStash);
while (newStash->id < stashId);
newStash->flags = stashFlags;
changeToSelectedStash(ptChar, newStash, bOnlyItems, 1);
@ -419,10 +460,13 @@ void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool b
}
void selectStash(Unit* ptChar, Stash* newStash)
void selectStash(Unit* ptChar, Stash* newStash, bool forceUpdate)
{
if (!newStash)
return;
if (!forceUpdate && newStash == PCPY->currentStash)
return;
log_msg("selectStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", newStash->id, newStash->isShared, 0, 0);
changeToSelectedStash(ptChar, newStash, 0, 0);
updateSelectedStashClient(ptChar);
}
@ -452,6 +496,7 @@ void toggleToSharedStash(Unit* ptChar)
void swapStash(Unit* ptChar, Stash* curStash, Stash* swpStash)
{
log_msg("swapStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", swpStash->id, swpStash->isShared, 1, 0);
if (!ptChar || !curStash || !swpStash || curStash == swpStash)
return;
changeToSelectedStash(ptChar, swpStash, 1, 0);
@ -468,13 +513,16 @@ void toggleStash(Unit* ptChar, DWORD page)
void swapStash(Unit* ptChar, DWORD page, bool toggle)
{
log_msg("swap stash page = %u\n", page);
log_msg("swap stash page = %u, toggle=%u\n", page, toggle);
Stash* curStash = PCPY->currentStash;
Stash* swpStash = curStash->isShared == toggle ? PCPY->selfStash : PCPY->sharedStash;
if (!swpStash)
swpStash = addStash(ptChar, !curStash->isShared, true, swpStash);
for (DWORD i = 0; i < page; i++)
{
if (curStash->nextStash == NULL)
addStash(ptChar, swpStash->isShared);
log_msg("swap stash : %i\n", i);
if (swpStash->nextStash == NULL)
addStash(ptChar, swpStash->isShared, true, swpStash);
swpStash = swpStash->nextStash;
}
swapStash(ptChar, curStash, swpStash);
@ -483,7 +531,7 @@ void swapStash(Unit* ptChar, DWORD page, bool toggle)
void insertStash(Unit* ptChar)
{
Stash* curStash = PCPY->currentStash;
Stash* stash = addStash(ptChar, curStash->isShared);
Stash* stash = addStash(ptChar, curStash->isShared, false, curStash);
while (stash->previousStash != curStash)
{
stash->flags = stash->previousStash->flags;
@ -513,7 +561,10 @@ bool deleteStash(Unit* ptChar, bool isClient)
stash->flags = stash->nextStash->flags;
stash->name = stash->nextStash->name;
if (stash->nextStash->ptListItem != NULL)
{
log_msg("deleteStash ID:%d\tshared:%d\tonlyItems:%d\tclient:%d\n", stash->id, stash->isShared, 1, isClient);
changeToSelectedStash(ptChar, stash->nextStash, 1, isClient);
}
stash = stash->nextStash;
while (stash->nextStash)
{
@ -532,15 +583,13 @@ bool deleteStash(Unit* ptChar, bool isClient)
void renameCurrentStash(Unit* ptChar, char* name)
{
log_msg("renameCurrentStash : %08X, %s\n", ptChar, name);
log_msg("renameCurrentStash : '%s'\n", name);
Stash* stash = PCPY->currentStash;
int len = 0;
if (name != NULL)
len = strlen(name);
log_msg("renameCurrentStash : %d\n", len);
if (stash->name)
D2FogMemDeAlloc(stash->name, __FILE__, __LINE__, 0);
log_msg("renameCurrentStash 3\n");
if (len > 0)
{
stash->name = (char *)malloc(len + 1);//D2FogMemAlloc(len,__FILE__,__LINE__,0);
@ -548,7 +597,6 @@ void renameCurrentStash(Unit* ptChar, char* name)
}
else
stash->name = NULL;
log_msg("renameCurrentStash 4\n");
}
@ -583,7 +631,7 @@ void selectNextStash(Unit* ptChar)
if (!selStash->isShared && (selStash->id >= maxSelfPages)) return;
if (selStash->isShared && (selStash->id >= maxSharedPages)) return;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash);
if (selStash && (selStash != PCPY->currentStash))
selectStash(ptChar, selStash);
@ -656,7 +704,7 @@ void selectNextIndexStash(Unit* ptChar)
{
if (!selStash->isShared && (selStash->id >= maxSelfPages)) break;
if (selStash->isShared && (selStash->id >= maxSharedPages)) break;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash);
}
}
if (selStash && (selStash != PCPY->currentStash))
@ -677,13 +725,132 @@ void selectNextIndex2Stash(Unit* ptChar)
{
if (!selStash->isShared && (selStash->id >= maxSelfPages)) break;
if (selStash->isShared && (selStash->id >= maxSharedPages)) break;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);;
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash, true, selStash);
}
}
if (selStash && (selStash != PCPY->currentStash))
selectStash(ptChar, selStash);
}
WCHAR* getDefaultStashName(Unit* ptChar)
{
if (!autoRenameStashPage)
return getLocalString( PCPY->currentStash->isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER);
int onlyOneUnique = -1;
int uniqueNameIndex = -1;
int onlyOneSet = -1;
int setNameIndex = -1;
int onlyOneMisc = -1;
int miscNameIndex = -1;
Unit* ptItem = D2InventoryGetFirstItem(PCInventory);
int nb = 0;
while (ptItem)
{
if (D2ItemGetPage(ptItem) == 4)
{
if (onlyOneUnique != 0)
{
if (ptItem->ptItemData->quality != ITEMQUALITY_UNIQUE)
{
onlyOneUnique = 0;
uniqueNameIndex = -1;
}
else
{
int uniqueId = D2GetUniqueID(ptItem);
UniqueItemsBIN* uniqueBIN = SgptDataTables->uniqueItems + uniqueId;
if (onlyOneUnique < 0)
{
onlyOneUnique = 1;
uniqueNameIndex = uniqueBIN->uniqueNameId;
}
else if (setNameIndex != uniqueBIN->uniqueNameId)
{
onlyOneUnique = 0;
uniqueNameIndex = -1;
}
}
}
if (onlyOneSet != 0)
{
if (ptItem->ptItemData->quality != ITEMQUALITY_SET)
{
onlyOneSet = 0;
setNameIndex = -1;
}
else
{
int uniqueID = ptItem->ptItemData->uniqueID;
SetItemsBIN* itemBIN = &SgptDataTables->setItems[uniqueID];
SetsBIN* setBIN = &SgptDataTables->sets[itemBIN->setId];
if (onlyOneSet < 0)
{
onlyOneSet = 1;
setNameIndex = setBIN->setNameIndex;
}
else if (setNameIndex != setBIN->setNameIndex)
{
onlyOneSet = 0;
setNameIndex = -1;
}
}
}
if (onlyOneMisc != 0)
{
if (ptItem->ptItemData->quality != ITEMQUALITY_NORMAL)
{
onlyOneMisc = 0;
miscNameIndex = -1;
}
else
{
ItemsBIN* ptItemsBin = D2GetItemsBIN(ptItem->nTxtFileNo);
if (onlyOneMisc < 0)
{
onlyOneMisc = 1;
miscNameIndex = ptItemsBin->NameStr;
}
else if (miscNameIndex != ptItemsBin->NameStr)
{
onlyOneMisc = 0;
miscNameIndex = -1;
}
}
}
}
ptItem = D2UnitGetNextItem(ptItem);
}
if (onlyOneUnique == 1 && uniqueNameIndex >= 0)
return StripGender(D2GetStringFromIndex(uniqueNameIndex));
if (onlyOneSet == 1 && setNameIndex >= 0)
return StripGender(D2GetStringFromIndex(setNameIndex));
if (onlyOneMisc == 1 && miscNameIndex >= 0)
return StripGender(D2GetStringFromIndex(miscNameIndex));
return getLocalString( PCPY->currentStash->isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER);
}
void getCurrentStashName(WCHAR* buffer, DWORD maxSize, Unit* ptChar)
{
if (PCPY->currentStash->name && PCPY->currentStash->name[0])
{
mbstowcs(buffer, PCPY->currentStash->name, maxSize - 1);
}
else
{
wcsncpy(buffer, getDefaultStashName(ptChar), maxSize - 1);;
}
buffer[20] = NULL;
}
//////////////////////////////////////////////////////////////////////
Stash* curStash2;
DWORD currentSawStash2;
@ -749,7 +916,7 @@ DWORD STDCALL carry1Limit(Unit* ptChar, Unit* ptItemParam, DWORD itemNum, BYTE p
{
if (!ptChar) return 0;
Unit* ptItem = ptItemParam ? ptItemParam : D2GameGetObject(PCGame, UNIT_ITEM, itemNum);
if ((page != 4) && (D2GetItemQuality(ptItem) == 7) && ptChar)
if ((page != 4) && (D2GetItemQuality(ptItem) == ITEMQUALITY_UNIQUE) && ptChar)
{
int uniqueID = D2GetUniqueID(ptItem);
if ((uniqueID>=0) && (uniqueID < (int)SgptDataTables->nbUniqueItems))
@ -777,7 +944,7 @@ FCT_ASM( caller_carry1Limit_114 )
JNZ end_carry1Limit
JMP D2ItemSetPage
end_carry1Limit:
ADD ESP, 0x10
ADD ESP,0xC
XOR EAX,EAX
POP EDI
POP EBX
@ -990,7 +1157,7 @@ FCT_ASM( caller_carry1OutOfStash_114 )
SUB DWORD PTR SS:[ESP],0xC
RETN
continue_carry1OutOfStash:
MOV EDI, DWORD PTR SS : [EBP - 0x4]
MOV EDI,DWORD PTR SS:[EBP-4]
TEST EDI,EDI
RETN
}}
@ -1038,46 +1205,37 @@ void Install_MultiPageStash()
// Cannot put 2 items carry1 in inventory
mem_seek R8(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3, 6B013, 14AC7F);
if (version_D2Game == V114d) {
MEMT_REF4(0x000DD5FD, caller_carry1Limit_114);
} else {
MEMJ_REF4(D2ItemSetPage, version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit);
}
MEMJ_REF4( D2ItemSetPage , version_D2Game >= V114d ? caller_carry1Limit_114 : version_D2Game >= V111 ? caller_carry1Limit_111 : caller_carry1Limit);
//6FC8504F . E8 94670900 CALL <JMP.&D2Common.#10720>
//01FD7CA2 . E8 6329FBFF CALL <JMP.&D2Common.#10485>
//01F9FE62 . E8 47A8FDFF CALL <JMP.&D2Common.#10608>
//6FCB9B02 . E8 9709F7FF CALL <JMP.&D2Common.#10223>
//6FCEF1E2 . E8 47B7F3FF CALL <JMP.&D2Common.#10012>
//6FC8B012 . E8 13F7F9FF CALL <JMP.&D2Common.#11026>
//0054AC7E |. E8 FDD50D00 CALL Game.00628280 ; \Game.00628280
// Cannot put 2 items carry1 in inventory by swapping
mem_seek R8(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8, 6BC78, 14B179);
if (version_D2Game == V114d) {
MEMT_REF4(0x000DD0D3, caller_carry1LimitSwap_114);
} else {
MEMJ_REF4(D2ItemGetPage, version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap);
}
MEMJ_REF4( D2ItemGetPage , version_D2Game >= V114d ? caller_carry1LimitSwap_114 : version_D2Game >= V112 ? caller_carry1LimitSwap_112 : version_D2Game >= V111 ? caller_carry1LimitSwap_111 : caller_carry1LimitSwap);
//6FC858D8 . E8 175F0900 CALL <JMP.&D2Common.#10719>
//01FD8967 . E8 8E1DFBFF CALL <JMP.&D2Common.#10820>
//01FA10E7 . E8 9A96FDFF CALL <JMP.&D2Common.#10505>
//6FCBB6E7 . E8 CAEDF6FF CALL <JMP.&D2Common.#10370>
//6FCF10C7 . E8 F895F3FF CALL <JMP.&D2Common.#10020>
//6FC8BC77 . E8 22E9F9FF CALL <JMP.&D2Common.#10810>
//0054B178 |. E8 D3D00D00 CALL Game.00628250 ; \Game.00628250
if ( version_D2Game >= V111 )
{
// Cannot put 2 items carry1 in inventory when drop cube
mem_seek R8(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75, B7B15, 163A89);
if (version_D2Game == V114d) {
MEMT_REF4(0x000D7EC3, caller_carry1LimitWhenDrop_114);
} else {
MEMJ_REF4(D2CanPutItemInInv, caller_carry1LimitWhenDrop_111);
}
MEMJ_REF4( D2CanPutItemInInv , version_D2Game >= V114d ? caller_carry1LimitWhenDrop_114 : caller_carry1LimitWhenDrop_111);
//01FBD934 |. E8 5BD3FCFF |CALL <JMP.&D2Common.#10855>
//01FB9FD4 |. E8 3912FCFF |CALL <JMP.&D2Common.#10813>
//6FC37AD4 |. E8 0535FFFF |CALL <JMP.&D2Common.#10289>
//6FCF7B74 |. E8 232FF3FF |CALL <JMP.&D2Common.#10133>
//6FCD7B14 |. E8 7D32F5FF |CALL <JMP.&D2Common.#10402>
//00563A88 . E8 C37E0D00 CALL Game.0063B950 ; \Game.0063B950
} else {
// Cannot put 2 items carry1 in inventory when drop cube
mem_seek R8(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000, 0000, 0000);
@ -1088,14 +1246,9 @@ void Install_MultiPageStash()
// Verif only carry1 out of stash page when pick up an item
mem_seek R8(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B, B301B, 15CADD);
if (version_D2Game == V114d) {
memt_byte( 0x8B ,0xE8);
MEMT_REF4(0xFF85FC7D, caller_carry1OutOfStash_114);
} else {
memt_byte(0x8B, 0xE8);
MEMT_REF4(version_D2Game >= V111 ? 0x850C2474 : 0x85102444, version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash);
memt_byte(version_D2Game >= V111 ? 0xF6 : 0xC0, 0x90);
}
MEMT_REF4( version_D2Game >= V114d ? 0xFF85FC7D : version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V114d ? caller_carry1OutOfStash_114 : version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash);
if (version_D2Game < V114d) memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90);
//6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10]
//6FC429A2 |. 85C0 |TEST EAX,EAX
//01FB8E3B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
@ -1108,6 +1261,8 @@ void Install_MultiPageStash()
//6FCF211F |. 85F6 |TEST ESI,ESI
//6FCD301B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
//6FCD301F |. 85F6 |TEST ESI,ESI
//0055CADD |> 8B7D FC |MOV EDI,DWORD PTR SS:[EBP-4]
//0055CAE0 |. 85FF |TEST EDI,EDI
log_msg("\n");
}

View File

@ -16,7 +16,7 @@
int posXUnassignSkillBtn=-1;
int posYUnassignSkillBtn=-1;
DWORD btnSkillIsDown;
DWORD btnSkillIsDown=0;
DWORD getXSkillBtn() {return RX(posXUnassignSkillBtn<0? 0x243 : posXUnassignSkillBtn);}
#define getLSkillBtn() 32
DWORD getYSkillBtn() {return RY(posYUnassignSkillBtn<0 ? 0x1B1 : posYUnassignSkillBtn);}
@ -45,8 +45,7 @@ void STDCALL printSkillsPageBtns()
Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
{
Unit* ptChar = D2GetClientPlayer();
log_msg("push down left button\n");
log_msg("type=%u\nx=%u\ny=%u\n\n", msg->type, msg->x, msg->y);
if (active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
{
log_msg("push down left button unassign skill\n");
@ -61,7 +60,6 @@ Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
void STDCALL skillsPageMouseUp()
{
log_msg("push up left button\n");
if (active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
{
log_msg("push up left button unassign skill\n");
@ -188,6 +186,11 @@ void Install_InterfaceSkills()
//6FADF382 |. 5B POP EBX
//6FADF383 \. C3 RETN
//6FADF384 CC INT3
//004AB7A5 |> 5F POP EDI
//004AB7A6 |. 5E POP ESI
//004AB7A7 |. 5B POP EBX
//004AB7A8 \. C3 RETN
//004AB7A9 CC INT3
} else {
MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns);
memt_byte( 0xC4, 0x90 ); // NOP
@ -206,42 +209,40 @@ void Install_InterfaceSkills()
// Don't print "Skill Points Remaining"
mem_seek R8(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4, AACE0);
memt_byte( 0xB9, 0xE8 );
MEMT_REF4( 0x00001083, version_D2Client == V114d ? caller_DontPrintSkillPointsRemaining_114 : version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining);
MEMT_REF4( 0x00001083, version_D2Client >= V114d ? caller_DontPrintSkillPointsRemaining_114 : version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining);
//6FB17080 /$ B9 83100000 MOV ECX,1083
//6FAC6294 |. B9 83100000 MOV ECX,1083
//6FB3AC74 |. B9 83100000 MOV ECX,1083
//6FB2ECF4 |. B9 83100000 MOV ECX,1083
//6FB28334 |. B9 83100000 MOV ECX,1083
//6FADF7E4 |. B9 83100000 MOV ECX,1083
//004AACE0 /$ B9 83100000 MOV ECX,1083
}
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112, ABC1A);
memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown
MEMT_REF4(version_D2Client == V114d ? 0x00001846 : version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client == V114d ? caller_skillsPageMouseDown_114 : version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
MEMT_REF4( version_D2Client >= V114d ? 0x00001846 : version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client == V114d ? caller_skillsPageMouseDown_114 : version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
memt_byte( 0x00, 0x90 ); // NOP
memt_byte( 0x00, 0x90 ); // NOP
//6FB180E4 > C743 18 00000000 MOV DWORD PTR DS:[EBX+18],0
//6FAC7BC2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//6FB3C6E2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//6FB308B2 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//6FB29C62 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//6FAE1112 > C745 18 00000000 MOV DWORD PTR SS:[EBP+18],0
//004ABC1A |> C746 18 00000000 MOV DWORD PTR DS:[ESI+18],0
// Manage mouse up
mem_seek R8(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8, ABC96/*ABE38*/);
if (version_D2Client == V114d) {
MEMT_REF4(/*0xFFFFFE45*/0xFFF745F6, caller_skillsPageMouseUp);
} else {
mem_seek R8(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8, ABC96);
MEMJ_REF4( D2FreeWinMessage, caller_skillsPageMouseUp);//0xFFF93B0A
}
//6FB18465 . E8 C07D0400 CALL <JMP.&Storm.#511>
//6FAC7557 .^E9 4248FFFF JMP <JMP.&Storm.#511>
//6FB3C077 .^E9 16FDF7FF JMP <JMP.&Storm.#511>
//6FB30247 .^E9 2CBCF8FF JMP <JMP.&Storm.#511>
//6FB295F7 .^E9 8828F9FF JMP <JMP.&Storm.#511>
//6FAE0AA7 .^E9 E0B2FDFF JMP <JMP.&Storm.#511>
//004ABC95 |. E8 F645F7FF CALL Game.00420290
log_msg("\n");

View File

@ -26,6 +26,7 @@ static struct
DWORD nextIndex:1;
DWORD putGold:1;
DWORD takeGold:1;
DWORD stashName:1;
};
};
} isDownBtn;
@ -33,66 +34,110 @@ static struct
bool displaySharedSetItemNameInGreen = true;
int posXPreviousBtn = -1;
int posYPreviousBtn = -1;
int posWPreviousBtn = 32;
int posHPreviousBtn = 32;
int posXNextBtn = -1;
int posYNextBtn = -1;
int posWNextBtn = 32;
int posHNextBtn = 32;
int posXSharedBtn = -1;
int posYSharedBtn = -1;
int posWSharedBtn = 32;
int posHSharedBtn = 32;
int posXPreviousIndexBtn = -1;
int posYPreviousIndexBtn = -1;
int posWPreviousIndexBtn = 32;
int posHPreviousIndexBtn = 32;
int posXNextIndexBtn = -1;
int posYNextIndexBtn = -1;
int posWNextIndexBtn = 32;
int posHNextIndexBtn = 32;
int posXPutGoldBtn = -1;
int posYPutGoldBtn = -1;
int posWPutGoldBtn = 32;
int posHPutGoldBtn = 32;
int posXTakeGoldBtn = -1;
int posYTakeGoldBtn = -1;
int posWTakeGoldBtn = 32;
int posHTakeGoldBtn = 32;
int posXStashNameField = -1;
int posYStashNameField = -1;
int posWStashNameField = 175;
int posHStashNameField = 20;
int posXStashGoldField = -1;
int posYStashGoldField = -1;
int posWStashGoldField = 152;
int posHStashGoldField = 18;
DWORD PersonalNormalPageColor = WHITE;
DWORD PersonalIndexPageColor = DARK_GREEN;
DWORD PersonalMainIndexPageColor = YELLOW;
DWORD SharedNormalPageColor = GOLD;
DWORD SharedIndexPageColor = ORANGE;
DWORD SharedMainIndexPageColor = RED;
DWORD getXPreviousBtn() {return RX(posXPreviousBtn<0? D2GetResolution()?0x80:0xAF : posXPreviousBtn);}
#define getLPreviousBtn() 32
DWORD getYPreviousBtn() {return RY(posYPreviousBtn<0 ? 0x40 : posYPreviousBtn);}
#define getHPreviousBtn() 32
DWORD getXNextBtn() {return RX(posXNextBtn<0 ? D2GetResolution()?0xA0:0xCF :posXNextBtn);}//?169:SEL_X(0x63, 0x63, 0xCF, 0xA0));}
#define getLNextBtn() 32
DWORD getYNextBtn() {return RY(posYNextBtn<0 ? 0x40 : posYNextBtn);}
#define getHNextBtn() 32
DWORD getXSharedBtn() {return RX(posXSharedBtn<0 ? D2GetResolution()?0x10:0x6F :posXSharedBtn);}//17:SEL_X(0xE3, 0xE3, 0x6F, 0x10));}//0xD8
#define getLSharedBtn() 32
DWORD getYSharedBtn() {return RY(posYSharedBtn<0 ? 0x40 : posYSharedBtn);}
#define getHSharedBtn() 32
DWORD getXPreviousIndexBtn() {return RX(posXPreviousIndexBtn<0 ? D2GetResolution()?0x60:0x8F :posXPreviousIndexBtn);}//73:SEL_X(0x18, 0x60, 0x8F, 0x60));}
#define getLPreviousIndexBtn() 32
DWORD getYPreviousIndexBtn() {return RY(posYPreviousIndexBtn<0 ? 0x40 : posYPreviousIndexBtn);}
#define getHPreviousIndexBtn() 32
DWORD getXNextIndexBtn() {return RX(posXNextIndexBtn<0? D2GetResolution()?0xC0:0xEF : posXNextIndexBtn);}//217:SEL_X(0x128, 0xC0, 0xEF, 0xC0));}
#define getLNextIndexBtn() 32
DWORD getYNextIndexBtn() {return RY(posYNextIndexBtn<0 ? 0x40 : posYNextIndexBtn);}
#define getHNextIndexBtn() 32
DWORD getXPutGoldBtn() {return RX(posXPutGoldBtn<0? 0x1C : posXPutGoldBtn);}
#define getLPutGoldBtn() 32
DWORD getYPutGoldBtn() {return RY(posYPutGoldBtn<0 ? 0x1A8 : posYPutGoldBtn);}
#define getHPutGoldBtn() 32
DWORD getXTakeGoldBtn() {return RX(posXTakeGoldBtn<0? 0x105 : posXTakeGoldBtn);}
#define getLTakeGoldBtn() 32
DWORD getYTakeGoldBtn() {return RY(posYTakeGoldBtn<0 ? 0x1A8 : posYTakeGoldBtn);}
#define getHTakeGoldBtn() 32
DWORD getXStashNameField() {return RX(posXStashNameField<0 ? 0x4A : posXStashNameField);}
DWORD getYStashNameField() {return RY(posYStashNameField<0 ? 0x19A : posYStashNameField);}
DWORD getXStashGoldField() {return RX(posXStashGoldField<0 ? 0x61 : posXStashGoldField);}
DWORD getYStashGoldField() {return RY(posYStashGoldField<0 ? 0x1B6 : posYStashGoldField);}
//closeBtn x: D2C=0x113 LOD=0x110(0->0x28) y: D2C=0x41 LOD=0x40 (-0x23 -> 5)
#define isOnButtonNextStash(x,y) isOnRect(x, y, getXNextBtn(), getYNextBtn(), getLNextBtn(), getHNextBtn())
#define isOnButtonPreviousStash(x,y) isOnRect(x, y, getXPreviousBtn(), getYPreviousBtn(), getLPreviousBtn(), getHPreviousBtn())
#define isOnButtonToggleSharedStash(x,y) isOnRect(x, y, getXSharedBtn(), getYSharedBtn(), getLSharedBtn(), getHSharedBtn())
#define isOnButtonNextIndexStash(x,y) isOnRect(x, y, getXNextIndexBtn(), getYNextIndexBtn(), getLNextIndexBtn(), getHNextIndexBtn())
#define isOnButtonPreviousIndexStash(x,y) isOnRect(x, y, getXPreviousIndexBtn(), getYPreviousIndexBtn(), getLPreviousIndexBtn(), getHPreviousIndexBtn())
#define isOnButtonPutGold(x,y) isOnRect(x, y, getXPutGoldBtn(), getYPutGoldBtn(), getLPutGoldBtn(), getHPutGoldBtn())
#define isOnButtonTakeGold(x,y) isOnRect(x, y, getXTakeGoldBtn(), getYTakeGoldBtn(), getLTakeGoldBtn(), getHTakeGoldBtn())
#define isOnButtonNextStash(x,y) isOnRect(x, y, getXNextBtn(), getYNextBtn(), posWNextBtn, posHNextBtn)
#define isOnButtonPreviousStash(x,y) isOnRect(x, y, getXPreviousBtn(), getYPreviousBtn(), posWPreviousBtn, posHPreviousBtn)
#define isOnButtonToggleSharedStash(x,y) isOnRect(x, y, getXSharedBtn(), getYSharedBtn(), posWSharedBtn, posHSharedBtn)
#define isOnButtonNextIndexStash(x,y) isOnRect(x, y, getXNextIndexBtn(), getYNextIndexBtn(), posWNextIndexBtn, posHNextIndexBtn)
#define isOnButtonPreviousIndexStash(x,y) isOnRect(x, y, getXPreviousIndexBtn(), getYPreviousIndexBtn(), posWPreviousIndexBtn, posHPreviousIndexBtn)
#define isOnButtonPutGold(x,y) isOnRect(x, y, getXPutGoldBtn(), getYPutGoldBtn(), posWPutGoldBtn, posHPutGoldBtn)
#define isOnButtonTakeGold(x,y) isOnRect(x, y, getXTakeGoldBtn(), getYTakeGoldBtn(), posWTakeGoldBtn, posHTakeGoldBtn)
#define isOnStashNameField(x,y) isOnRect(x, y, getXStashNameField(), getYStashNameField(), posWStashNameField, posHStashNameField)
#define isOnStashGoldField(x,y) isOnRect(x, y, getXStashGoldField(), getYStashGoldField(), posWStashGoldField, posHStashGoldField)
void UpdateStashPosition()
{
//static int isInstalled = false;
//if (isInstalled) return;
InventoryBIN* inventory = D2GetInventoryBIN();
if (inventory->gridY == 15)
{
posXPreviousBtn = 127;
posYPreviousBtn = 500;
posXNextBtn = 159;
posYNextBtn = 500;
posXSharedBtn = 28;
posYSharedBtn = 21;
posXPreviousIndexBtn = 95;
posYPreviousIndexBtn = 500;
posXNextIndexBtn = 191;
posYNextIndexBtn = 500;
posXPutGoldBtn = 28;
posYPutGoldBtn = 500;
posXTakeGoldBtn = 259;
posYTakeGoldBtn = 500;
//posXStashNameField = -1;
posYStashNameField = 16;
//posXStashGoldField = -1;
posYStashGoldField = 36;
}
}
void* STDCALL printBtns()
{
@ -134,7 +179,6 @@ void* STDCALL printBtns()
LPWSTR lpText;
WCHAR text[100];
DWORD mx = D2GetMouseX();
DWORD my = D2GetMouseY();
@ -142,31 +186,36 @@ void* STDCALL printBtns()
if (isOnButtonPreviousStash(mx,my)) {
lpText = getLocalString(STR_STASH_PREVIOUS_PAGE);
D2PrintPopup(lpText, getXPreviousBtn()+getLPreviousBtn()/2, getYPreviousBtn()-getHPreviousBtn(), WHITE, 1);
D2PrintPopup(lpText, getXPreviousBtn()+posWPreviousBtn/2, getYPreviousBtn()-posHPreviousBtn, WHITE, 1);
} else if (isOnButtonNextStash(mx,my)) {
lpText = getLocalString(STR_STASH_NEXT_PAGE);
D2PrintPopup(lpText, getXNextBtn()+getLNextBtn()/2, getYNextBtn()-getHNextBtn(), WHITE, 1);
D2PrintPopup(lpText, getXNextBtn()+posWNextBtn/2, getYNextBtn()-posHNextBtn, WHITE, 1);
} else if (active_sharedStash && isOnButtonToggleSharedStash(mx,my)) {
} else if (isOnButtonToggleSharedStash(mx,my)) {
if (active_sharedStash) {
lpText = getLocalString(PCPY->showSharedStash ? STR_TOGGLE_TO_PERSONAL : STR_TOGGLE_TO_SHARED);
D2PrintPopup(lpText, getXSharedBtn()+getLSharedBtn()/2, getYSharedBtn()-getHSharedBtn(), WHITE, 1);
D2PrintPopup(lpText, getXSharedBtn()+posWSharedBtn/2, getYSharedBtn()-posHSharedBtn, WHITE, 1);
} else if (active_SharedStashInMultiPlayer == 1) {
lpText = getLocalString(STR_TOGGLE_MULTI_DISABLED);
D2PrintPopup(lpText, getXPreviousIndexBtn()+posWPreviousIndexBtn/2, getYPreviousIndexBtn()-posHPreviousIndexBtn, WHITE, 1);
}
} else if (isOnButtonPreviousIndexStash(mx,my)) {
_snwprintf(text, sizeof(text), getLocalString(STR_STASH_PREVIOUS_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
D2PrintPopup(text, getXPreviousIndexBtn()+getLPreviousIndexBtn()/2, getYPreviousIndexBtn()-getHPreviousIndexBtn(), 0, 0);
lpText = getLocalString(STR_STASH_PREVIOUS_INDEX);
D2PrintPopup(lpText, getXPreviousIndexBtn()+posWPreviousIndexBtn/2, getYPreviousIndexBtn()-posHPreviousIndexBtn, WHITE, 1);
} else if (isOnButtonNextIndexStash(mx,my)) {
_snwprintf(text, sizeof(text), getLocalString(STR_STASH_NEXT_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
D2PrintPopup(text, getXNextIndexBtn()+getLNextIndexBtn()/2, getYNextIndexBtn()-getHNextIndexBtn(), WHITE, 1);
lpText = getLocalString(STR_STASH_NEXT_INDEX);
D2PrintPopup(lpText, getXNextIndexBtn()+posWNextIndexBtn/2, getYNextIndexBtn()-posHNextIndexBtn, WHITE, 1);
} else if (active_sharedGold && isOnButtonPutGold(mx,my)) {
lpText = getLocalString(STR_PUT_GOLD);
D2PrintPopup(lpText, getXPutGoldBtn()+getLPutGoldBtn()/2, getYPutGoldBtn()-getHPutGoldBtn(), WHITE, 1);
D2PrintPopup(lpText, getXPutGoldBtn()+posWPutGoldBtn/2, getYPutGoldBtn()-posHPutGoldBtn, WHITE, 1);
} else if (active_sharedGold && isOnButtonTakeGold(mx,my)) {
lpText = getLocalString(STR_TAKE_GOLD);
D2PrintPopup(lpText, getXTakeGoldBtn()+getLTakeGoldBtn()/2, getYTakeGoldBtn()-getHTakeGoldBtn(), WHITE, 1);
D2PrintPopup(lpText, getXTakeGoldBtn()+posWTakeGoldBtn/2, getYTakeGoldBtn()-posHTakeGoldBtn, WHITE, 1);
}
return D2LoadBuySelBtn();
@ -191,6 +240,8 @@ DWORD STDCALL manageBtnDown(sWinMessage* msg)
isDownBtn.putGold = 1;
else if (active_sharedGold && isOnButtonTakeGold(msg->x,msg->y))
isDownBtn.takeGold = 1;
else if (isOnStashNameField(msg->x,msg->y))
isDownBtn.stashName = 1;
else return 0;
D2PlaySound(4,0,0,0,0);
@ -255,6 +306,26 @@ DWORD STDCALL manageBtnUp(sWinMessage* msg)
if (isDownBtn.takeGold)
updateServer(US_TAKEGOLD);
} else if (isOnStashNameField(msg->x,msg->y)) {
log_msg("push up left Stash Name\n");
if (isDownBtn.stashName && PCPY->currentStash)
{
if (GetKeyState(VK_SHIFT)<0)
{
WCHAR text[21];
getCurrentStashName(text, 21, ptChar);
D2TogglePage(5,0,0);// Open command window
_snwprintf(ptInputCommand, 25, L"/rp %s", text);
InputCommandLen = wcslen(ptInputCommand);
}
else if (PCPY->currentStash->isMainIndex)
updateServer(US_RESET_INDEX);
else if (PCPY->currentStash->isIndex)
updateServer(US_SET_MAIN_INDEX);
else
updateServer(US_SET_INDEX);
}
} else return 0;
return 1;
@ -268,41 +339,84 @@ void FASTCALL printPageNumber(LPWSTR maxGoldText, DWORD x, DWORD y, DWORD color,
return;
}
DWORD mx = D2GetMouseX();
DWORD my = D2GetMouseY();
Unit* ptChar = D2GetClientPlayer();
WCHAR popupText[100];
WCHAR popupText[0x400];
if (PCPY->currentStash)
if (!PCPY->currentStash)
D2PrintString(getLocalString(STR_NO_SELECTED_PAGE), x, y, WHITE, bfalse);
else
{
bool isShared = PCPY->currentStash->isShared;
bool isIndex = PCPY->currentStash->isIndex;
DWORD currentId = PCPY->currentStash->id;
bool isMainIndex = PCPY->currentStash->isMainIndex;
DWORD currentId = PCPY->currentStash->id + 1;
if (PCPY->currentStash->name && PCPY->currentStash->name[0])
mbstowcs(popupText,PCPY->currentStash->name,50);//strlen(PCPY->currentStash->name)+1
else _snwprintf(popupText, sizeof(popupText), getLocalString( isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER), currentId+1);
D2PrintString(popupText, x, y, isShared ? (isIndex ? CRYSTAL_RED : RED) : (isIndex ? BRIGHT_WHITE : WHITE), bfalse);
} else {
_snwprintf(popupText, sizeof(popupText), getLocalString(STR_NO_SELECTED_PAGE));
D2PrintString(popupText, x, y, WHITE, bfalse);
WCHAR text[21];
getCurrentStashName(text, 21, ptChar);
// Replace character # by number page.
int j = 0;
for (int i=0; text[i]; i++)
{
if (text[i] == L'#')
{
DWORD val = currentId;
int nbDigits = 0;
do
{
nbDigits++;
val /= 10;
} while(val);
j += nbDigits;
val = currentId;
nbDigits = 0;
do
{
nbDigits++;
popupText[j - nbDigits] = (WCHAR)(val % 10 + 48);
val /= 10;
} while(val);
}
else
popupText[j++] = text[i];
}
popupText[j] = NULL;
// Check text length vs field name length
int pixelLen = D2GetPixelLen(popupText);
int len = wcslen(popupText);
while(len > 0 && pixelLen > posWStashNameField - 5)
{
len--;
popupText[len] = NULL;
pixelLen = D2GetPixelLen(popupText);
}
DWORD color = isShared ? (isMainIndex ? SharedMainIndexPageColor : isIndex ? SharedIndexPageColor : SharedNormalPageColor) : (isMainIndex ? PersonalMainIndexPageColor : isIndex ? PersonalIndexPageColor : PersonalNormalPageColor);
D2PrintString(popupText, x, y, color, bfalse);
if (isOnStashNameField(mx, my))
{
_snwprintf(popupText, 0x400, getLocalString(STR_PAGE_TYPE_CHANGE), currentId);
D2PrintPopup(popupText, getXStashNameField() + posWStashNameField/2, getYStashNameField() - posHStashNameField - 2, WHITE, 1);
}
}
//printGoldMaxPopup
DWORD mx = D2GetMouseX();
DWORD my = D2GetMouseY();
if ((RX(0x5E) < mx) && (mx < RX(0xF8)) && (RY(0x1C8) < my) && (my < RY(0x1B6)) )
if (isOnStashGoldField(mx, my))
{
if (active_sharedGold)
{
_snwprintf(popupText, sizeof(popupText), L"%s\n%s: %u", maxGoldText, getLocalString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold);
DWORD x = D2GetPixelLen(maxGoldText);
DWORD x2 = D2GetPixelLen(popupText) - x;
D2PrintPopup(popupText, RX(0xA8-max(x,x2)/2), RY(0x1CA), WHITE, 0);
_snwprintf(popupText, 0x400, L"%s\n%s: %u", maxGoldText, getLocalString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold);
D2PrintPopup(popupText, getXStashGoldField() + posWStashGoldField/2, getYStashGoldField() - posHStashGoldField - 2, WHITE, 1);
} else
D2PrintPopup(maxGoldText, RX(0xA8), RY(0x1CA), WHITE, 1);
D2PrintPopup(maxGoldText, getXStashGoldField() + posWStashGoldField/2, getYStashGoldField() - posHStashGoldField - 2, WHITE, 1);
}
}
static Stash* curStash=NULL;
static DWORD currentSawStash=0;
Unit* STDCALL getNextItemForSet(Unit* ptItem)
@ -365,7 +479,6 @@ IS_NOT_ON_BUTTON :
JMP D2ClickOnStashButton
}}
FCT_ASM( caller_manageBtnDown_111 )
PUSH EBP
CALL manageBtnDown
@ -413,7 +526,7 @@ FCT_ASM( caller_manageBtnUp_114 )
MOV DWORD PTR DS:[EDX],0
ADD EDX,4
MOV DWORD PTR DS:[EDX],0
ADD EDX, 0x68
ADD EDX,0x64
MOV DWORD PTR DS:[EDX],0
POP EDI
POP ESI
@ -476,7 +589,9 @@ IS_NOT_ON_BUTTON:
FCT_ASM ( initBtnsStates_114 )
MOV isDownBtn.all,0
MOV DWORD PTR DS : [0x7BCC3C], EAX
POP ECX
MOV ESP,EBP
POP EBP
RETN
}}
@ -499,65 +614,54 @@ void Install_InterfaceStash()
// Print button images
mem_seek R8(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56, 9DE26, 8F308);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFC52F4, printBtns);
} else {
MEMC_REF4( D2LoadBuySelBtn, printBtns);
}
//6FADF398 |. E8 734D0400 CALL D2Client.6FB24110
//6FB61005 |. E8 A6D3FEFF CALL D2Client.6FB4E3B0
//6FB2DF85 |. E8 3642FEFF CALL D2Client.6FB121C0
//6FB63655 |. E8 9682FDFF CALL D2Client.6FB3B8F0
//6FB49A55 |. E8 96500200 CALL D2Client.6FB6EAF0
//6FB4DE25 |. E8 76ACF7FF CALL D2Client.6FAC8AA0
//0048F307 |. E8 F452FCFF CALL Game.00454600
// print page number
mem_seek R8(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33, 9DE03, 8F2E5);
if (version_D2Client == V114d) {
MEMT_REF4(0x00073037, printPageNumber);
} else {
MEMJ_REF4( D2PrintString, printPageNumber);
}
//6FADF374 |. E8 3FCC0800 CALL <JMP.&D2Win.#10117>
//6FB60FE2 |. E8 99C2F5FF CALL <JMP.&D2Win.#10020>
//6FB2DF62 |. E8 19F3F8FF CALL <JMP.&D2Win.#10064>
//6FB63632 |. E8 299DF5FF CALL <JMP.&D2Win.#10001>
//6FB49A32 |. E8 4739F7FF CALL <JMP.&D2Win.#10150>
//6FB4DE02 |. E8 4739F7FF CALL <JMP.&D2Win.#10076>
//0048F2E4 |. E8 37300700 CALL Game.00502320 ; \Game.00502320
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6, 9FC76, 925B8);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFF73C4, caller_manageBtnDown_114);
} else {
MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown);
}
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V114a ? caller_manageBtnDown_114 : version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown);
//6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080
//6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520
//6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0
//6FB654A5 . E8 9611FFFF CALL D2Client.6FB56640
//6FB4B8A5 . E8 5614FFFF CALL D2Client.6FB3CD00
//6FB4FC75 . E8 960FFFFF CALL D2Client.6FB40C10
//004925B7 |. E8 C473FFFF CALL Game.00489980
// Manage mouse up
mem_seek R8(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9, 9FAA9, 89B63);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFFFE19, caller_manageBtnUp_114);
} else {
MEMC_REF4(version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp);
}
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V114a ? caller_manageBtnUp_114 : version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp);
//6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080
//6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520
//6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0
//6FB652D8 > E8 6313FFFF CALL D2Client.6FB56640
//6FB4B6D8 > E8 2316FFFF CALL D2Client.6FB3CD00
//6FB4FAA8 > E8 6311FFFF CALL D2Client.6FB40C10
//00489B62 |> E8 19FEFFFF CALL Game.00489980
// init state of button on open stash page
mem_seek R8(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A, 89ED0);
if (version_D2Client == V114d) {
memt_byte(0xA3, 0xE8);
MEMT_REF4(0x007BCC3C, initBtnsStates_114);
mem_seek R8(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A, 9441A, 89ED5);
if (version_D2Client >= V114d)
{
memt_byte( 0x8B, 0xE9 ); // CALL initBtnsStates
MEMT_REF4( 0xCCC35DE5, initBtnsStates_114);
} else {
memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates
MEMT_REF4( 0x000104C4, initBtnsStates);
@ -571,34 +675,32 @@ void Install_InterfaceStash()
//6FB59D9A |> 81C4 04010000 ADD ESP,104
//6FB3CC3A |> 81C4 04010000 ADD ESP,104
//6FB4441A |> 81C4 04010000 ADD ESP,104
//00489ED5 |> 8BE5 MOV ESP,EBP
//00489ED7 |. 5D POP EBP
//00489ED8 \. C3 RETN
//00489ED9 CC INT3
// init the search of print in green the item set name we have in stash
mem_seek R8(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434, 91A24, 86774);
if (version_D2Client == V114d) {
MEMT_REF4(0x001B4B48, initGetNextItemForSet);
} else {
MEMJ_REF4( D2InventoryGetFirstItem, initGetNextItemForSet);
}
//6FAE5996 |. E8 D5500800 CALL <JMP.&D2Common.#10277>
//6FB571F3 |. E8 D64EF6FF CALL <JMP.&D2Common.#10402>
//6FB21F63 |. E8 96A1F9FF CALL <JMP.&D2Common.#10535>
//6FB57313 |. E8 8250F6FF CALL <JMP.&D2Common.#11151>
//6FB3D433 |. E8 B8F0F7FF CALL <JMP.&D2Common.#10460>
//6FB41A23 |. E8 96A7F7FF CALL <JMP.&D2Common.#11040>
//00486773 |. E8 484B1B00 CALL Game.0063B2C0 ; \Game.0063B2C0
// Get next item for print in green the item set name we have in stash
mem_seek R8(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB, 91ABB, 86807);
if (version_D2Client == V114d) {
MEMT_REF4(0x001B7795, getNextItemForSet);
} else {
MEMJ_REF4( D2UnitGetNextItem, getNextItemForSet);
}
//6FAE5A1B E8 4A500800 CALL <JMP.&D2Common.#10304>
//6FB5728A |. E8 0B4FF6FF |CALL <JMP.&D2Common.#10934>
//6FB21FFA |. E8 A1A1F9FF |CALL <JMP.&D2Common.#11140>
//6FB573AA |. E8 7550F6FF |CALL <JMP.&D2Common.#10770>
//6FB3D4CA |. E8 99F0F7FF |CALL <JMP.&D2Common.#10464>
//6FB41ABA |. E8 A3A8F7FF |CALL <JMP.&D2Common.#10879>
//00486806 |. E8 95771B00 |CALL Game.0063DFA0 ; \Game.0063DFA0
log_msg("\n");

View File

@ -180,13 +180,13 @@ FCT_ASM ( caller_printStatsPageBtns_9 )
RETN
}}
FCT_ASM ( caller_statsPageMouseDown_114 )
PUSH DWORD PTR SS:[ESP+0x18]
CALL statsPageMouseDown
TEST EAX,EAX
JE fin_statsPageMouseDown
MOV EAX, DWORD PTR DS : [0x7A6A70]
RETN
JMP D2GetClientPlayer
fin_statsPageMouseDown:
ADD ESP,4
POP EDI
@ -231,9 +231,9 @@ FCT_ASM( caller_statsPageMouseUp_114 )
CALL statsPageMouseUp
TEST EAX,EAX
JE fin_statsPageMouseUp
MOV EAX, DWORD PTR DS : [0x7A6A70]
RETN
JMP D2GetClientPlayer
fin_statsPageMouseUp:
ADD ESP,4
POP EDI
POP ESI
POP EBX
@ -285,16 +285,9 @@ void Install_InterfaceStats()
log_msg("Patch D2Client for stats interface. (InterfaceStats)\n");
// Print new buttons images
if (version_D2Client == V114d) {
mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, A8949);
memt_byte(0x5F, 0xE9);
MEMT_REF4(0xE58B5B5E, caller_printStatsPageBtns_114);
} else {
mem_seek R8(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16, C03B6, C03B6);
memt_byte( 0x5F, 0xE9 ); // JMP
MEMT_REF4(0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111 : version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9);
}
MEMT_REF4( version_D2Client >= V114d ? 0xE58B5B5E : 0x815B5D5E, version_D2Client >= V114d ? caller_printStatsPageBtns_114 : version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9);
//6FAD0F86 . 5F POP EDI
//6FAD0F87 . 5E POP ESI
//6FAD0F88 . 5D POP EBP
@ -330,18 +323,30 @@ void Install_InterfaceStats()
//6FB703B8 |. 5D POP EBP
//6FB703B9 |. 5B POP EBX
//6FB703BA |. 81C4 70030000 ADD ESP,370
//6FB703<30>0 \. C3 RETN
//6FB703C0 \. C3 RETN
//004A8949 . 5F POP EDI
//004A894A . 5E POP ESI
//004A894B . 5B POP EBX
//004A894C . 8BE5 MOV ESP,EBP
if ( version_D2Client >= V111 )
if ( version_D2Client >= V114d )
{
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4);
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown_114);
//004A77D3 . E8 F8C5FBFF CALL Game.00463DD0
// Manage mouse up
mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963);
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseUp_114);
//004A7962 |. E8 69C4FBFF CALL Game.00463DD0
}
else if ( version_D2Client >= V111 )
{
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFBC5F8, caller_statsPageMouseDown_114);
} else {
memt_byte( 0xA1, 0xE8 );
MEMT_REF4( ptptClientChar, caller_statsPageMouseDown);
}
//6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
//6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
//6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
@ -350,12 +355,8 @@ void Install_InterfaceStats()
// Manage mouse up
mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFBC469, caller_statsPageMouseUp_114);
} else {
memt_byte( 0xA1, 0xE8 );
MEMT_REF4( ptptClientChar, caller_statsPageMouseUp);
}
//6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
//6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
//6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
@ -363,12 +364,12 @@ void Install_InterfaceStats()
//6FB705D3 . A1 50D0BC6F MOV EAX,DWORD PTR DS:[6FBCD050]
} else {
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000, 0000, 0000);
mem_seek R8(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8, BF568, A77D4);
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown);
//6FAD133C . E8 8F700500 CALL D2Client.6FB283D0
// Manage mouse up
mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000, 0000, 0000);
mem_seek R8(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33, C05D3, A7963);
MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2
//6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0
}

View File

@ -1,5 +1,6 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.14d by haxifix.
Language management.
@ -10,7 +11,7 @@
#include <stdio.h>
bool active_ChangeLanguage = true;
bool active_ChangeLanguage = false;
DWORD selectedLanguage = LNG_ENG;
bool active_LanguageManagement = false;
@ -21,10 +22,15 @@ DWORD* ptCurrentLanguage;
DWORD STDCALL languageManagement()
{
if (active_ChangeLanguage) *ptCurrentLanguage = selectedLanguage;
if (active_ChangeLanguage)
*ptCurrentLanguage = selectedLanguage;
if (active_LanguageManagement)
if ((*ptCurrentLanguage > LNG_RUS) || !((1 << *ptCurrentLanguage) & availableLanguages.all))
{
if ((*ptCurrentLanguage >= LNG_DEF) || !((1 << *ptCurrentLanguage) & availableLanguages.all))
*ptCurrentLanguage = defaultLanguage;
}
return *ptCurrentLanguage;
}
@ -36,7 +42,8 @@ void Install_LanguageManagement()
log_msg("Patch D2Lang for language management. (LanguageManagement)\n");
ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang == V114d ? 0x5F : version_D2Lang >= V111 ? 0x51: 0x5C));
ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang == V114d ? 0x4D : version_D2Lang >= V111 ? 0x51: 0x5C));
languageManagement();
// Language management
mem_seek( (DWORD)D2GetLang + (version_D2Lang == V114d ? 0x4C : version_D2Lang >= V111 ? 0x3E : 0x49));//6FC13E39-6FC10000
@ -45,11 +52,11 @@ void Install_LanguageManagement()
//6FC13E39 |. A1 EC0CC26F MOV EAX,DWORD PTR DS:[6FC20CEC]
//003D91FE |. A1 1C0A3E00 MOV EAX,DWORD PTR DS:[3E0A1C]
//003DA0AE |. A1 1C0A3E00 MOV EAX,DWORD PTR DS:[3E0A1C]
//0052519C |> A1 EC298800 MOV EAX,DWORD PTR DS:[8829EC]
log_msg("\n");
isInstalled = true;
}
/*================================= END OF FILE =================================*/

View File

@ -21,6 +21,8 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar)
BYTE* data;
log_msg("--- Start LoadSPCustomData ---\n");
active_sharedStash = active_SharedStashInMultiPlayer > 0;
log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash);
if (!ptChar)
{log_msg("LoadSPCustomData : ptChar == NULL\n");return 0x1B;}//Unknow failure
@ -38,7 +40,7 @@ DWORD STDCALL LoadSPCustomData(Unit* ptChar)
data = readExtendedSaveFile(PCPlayerData->name, &size);
ret = loadExtendedSaveFile(ptChar, data, size);
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
if (!ret)
if (!ret && active_sharedStash)
{
data = readSharedSaveFile(PCPlayerData->name, &size);
ret = loadSharedSaveFile(ptChar, data, size);
@ -187,33 +189,31 @@ void sendData(BYTE* data, DWORD size, bool isShared)
log_msg("\n");
}
static DWORD sizeExtended;
static BYTE* dataExtended;
static DWORD sizeShared;
static BYTE* dataShared;
void FASTCALL SendSaveFiles (char* ptPath, DWORD maxsize, char* name)
{
// DWORD size;
// BYTE* data;
D2FogGetSavePath(ptPath,maxsize);
log_msg("\n--- Start SendSaveFiles ---\n");
log_msg("path = %s\n\nmaxsize = %d\n\nname = %s\n\n", ptPath, maxsize, name);
active_sharedStash = active_SharedStashInMultiPlayer == 2;
log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash);
// Send Extended Save File
log_msg("Send Extended Save File\n");
dataExtended = readExtendedSaveFile(name, &sizeExtended);
DWORD sizeExtended = 0;
BYTE* dataExtended = readExtendedSaveFile(name, &sizeExtended);
sendData(dataExtended, sizeExtended, false);
D2FogMemDeAlloc(dataExtended,__FILE__,__LINE__,0);
// Send Shared Save File
//if (active_sharedStash)
{
log_msg("Send Shared Save File\n");
dataShared = readSharedSaveFile(name, &sizeShared);
DWORD sizeShared = 0;
BYTE* dataShared = readSharedSaveFile(name, &sizeShared);
sendData(dataShared, sizeShared, true);
D2FogMemDeAlloc(dataShared,__FILE__,__LINE__,0);
}
// Ending load
log_msg("End SendSaveFiles.\n\n");
@ -226,6 +226,8 @@ DWORD STDCALL ReceiveSaveFiles (DWORD clientID, t_rcvMsg* msg)
if( (msg->packID != customPackID) || !msg->isCustom) return msg->packID;
log_msg("Loading Receive Packet: clientID=%d\t type=%X\t finalSize=%X\t packSize=%02X\t data=%08X\n", clientID, msg->type, msg->finalSize, msg->packSize, msg->data);
active_sharedStash = active_SharedStashInMultiPlayer == 2;
log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash);
bool isShared;
@ -314,6 +316,8 @@ int STDCALL ReceiveSaveFiles_9(DWORD clientID, SOCKET s, char *buf, int len, int
DWORD STDCALL LoadMPCustomData(Unit* ptChar)
{
log_msg("Start LoadMPCustomData\n");
active_sharedStash = active_SharedStashInMultiPlayer == 2;
log_msg("active_sharedStash = %d : %d\n\n", active_sharedStash);
if (!ptChar) return NULL;
if (!ptChar)
@ -354,7 +358,7 @@ DWORD STDCALL LoadMPCustomData(Unit* ptChar)
log_msg("is LOD Game\n");
if (!ret)
ret = loadExtendedSaveFile(ptChar, curSF->dataExtended, curSF->sizeExtended);
if (!ret)
if (!ret && active_sharedStash)
ret = loadSharedSaveFile(ptChar, curSF->dataShared, curSF->sizeShared);
} else {
log_msg("is not LOD Game\n");
@ -382,6 +386,7 @@ JMP_LoadMPlayerCustomData :
RETN
}}
FCT_ASM ( caller_LoadMPPlayerCustomData_111 )
PUSH DWORD PTR SS:[EBX]
CALL LoadMPCustomData
@ -456,6 +461,7 @@ FCT_ASM( caller_ReceiveSaveFiles_114 )
RETN
}}
FCT_ASM ( caller_ReceiveSaveFiles_111 )
PUSH ECX
PUSH EDX
@ -511,15 +517,15 @@ go_to_default:
void Install_LoadPlayerData()
{
static int isInstalled = false;
if (isInstalled || !active_PlayerCustomData) return;
if (isInstalled) return;
log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n");
// Load SP player custom data.
mem_seek R8(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D, 3BCCD, 13447A);
memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData
MEMT_REF4( version_D2Game == V114d ? 0x75FF85F8 : 0x75F685F0 , version_D2Game == V114d ? caller_LoadSPPlayerCustomData_114 : caller_LoadSPPlayerCustomData);
memt_byte( version_D2Game == V114d ? 0x13 : 0x16, 0x90); // NOP
MEMT_REF4( version_D2Game >= V114d ? 0x75FF85F8 : 0x75F685F0 , version_D2Game >= V114d ? caller_LoadSPPlayerCustomData_114 : caller_LoadSPPlayerCustomData);
memt_byte( version_D2Game >= V114d ? 0x13 : 0x16, 0x90); // NOP
//6FC8CB0F 8BF0 MOV ESI,EAX
//6FC8CB11 85F6 TEST ESI,ESI
//6FC8CB13 75 16 JNZ SHORT D2Game.6FC8CB2B
@ -538,11 +544,14 @@ void Install_LoadPlayerData()
//6FC5BCCD |> 8BF0 MOV ESI,EAX
//6FC5BCCF |. 85F6 TEST ESI,ESI
//6FC5BCD1 |. 75 16 JNZ SHORT D2Game.6FC5BCE9
//0053447A |. 8BF8 MOV EDI,EAX
//0053447C |. 85FF TEST EDI,EDI
//0053447E |. 75 13 JNZ SHORT Game.00534493
// Load MP player custom data.
mem_seek R8(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217, 3BB57, 134572);
memt_byte( 0x83, 0xE8);
MEMT_REF4( version_D2Game == V114d ? 0x1D74003F : version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game == V114d ? caller_LoadMPPlayerCustomData_114 : version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9);
MEMT_REF4( version_D2Game >= V114d ? 0x1D74003F : version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V114d ? caller_LoadMPPlayerCustomData_114 : version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9);
//6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0
//6FC8CC69 . 74 46 JE SHORT D2Game.6FC8CCB1
//0203B777 |> 833B 00 CMP DWORD PTR DS:[EBX],0
@ -555,31 +564,26 @@ void Install_LoadPlayerData()
//6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D
//6FC5BB57 |> 833B 00 CMP DWORD PTR DS:[EBX],0
//6FC5BB5A |. 74 21 JE SHORT D2Game.6FC5BB7D
//00534572 |> 833F 00 CMP DWORD PTR DS:[EDI],0
//00534575 |. 74 1D JE SHORT Game.00534594
// Send save files to Server.
mem_seek R8(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C, B638C, 7807E);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFF8EFCE, caller_SendSaveFiles_111);
} else {
MEMJ_REF4( D2FogGetSavePath, version_D2Game >= V111 ? caller_SendSaveFiles_111 : caller_SendSaveFiles);
}
//6FAAD5A1 |. E8 88D10B00 CALL <JMP.&Fog.#10115>
//6FB233FB |. E8 CA8AF9FF CALL <JMP.&Fog.#10115>
//6FB0DFDB |. E8 C6DEFAFF CALL <JMP.&Fog.#10115>
//6FB2933B |. E8 6A2CF9FF CALL <JMP.&Fog.#10115>
//6FAC457B |. E8 187AFFFF CALL <JMP.&Fog.#10115>
//6FB6638B |. E8 2E5BF5FF CALL <JMP.&Fog.#10115>
//0047807D |. E8 CEEFF8FF CALL Game.00407050
// Receive save files from client.
mem_seek R8(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39, D53E9, 13F114);
memt_byte( 0x8B ,0xE8);
if (version_D2Game == V114d) {
MEMT_REF4(0x46B60F1E, caller_ReceiveSaveFiles_114);
memt_byte(0x04, 0x90);
} else if ( version_D2Game >= V111 ) {
MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111);
memt_byte( 0x45 ,0x90);
if ( version_D2Game >= V111 ) {
MEMT_REF4( version_D2Game >= V114d ? 0x46B60F1E : 0xB60F005D, version_D2Game >= V114d ? caller_ReceiveSaveFiles_114 : caller_ReceiveSaveFiles_111);
if (version_D2Game < V114a) memt_byte( 0x45 ,0x90);
memt_byte( 0x04 ,0x90);
//01FB76E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
//01FB76EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
@ -591,6 +595,8 @@ void Install_LoadPlayerData()
//6FCEAF3C |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
//6FCF53E9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
//6FCF53EC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
//0053F114 |. 8B1E MOV EBX,DWORD PTR DS:[ESI]
//0053F116 |. 0FB646 04 MOVZX EAX,BYTE PTR DS:[ESI+4]
} else {
MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles);
//6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI]

View File

@ -10,6 +10,8 @@
#include "common.h"
#include <stdio.h>
const char* LOCALIZED_STRINGS_FILENAME = "PlugY\\LocalizedStrings.ini";
LPWSTR StripGender(LPWSTR text)
{
if (text[0] == L' ')
@ -32,11 +34,14 @@ struct LocalizedTypeString
LPSTR itemStr;
LPWSTR typeLocalizedString;
} *sLocalizedTypeStrings;
LPWSTR sLocalizedStrings[60];
LPWSTR sLocalizedStrings[100];
int nbLocalizedTypeString = 0;
LPWSTR getLocalString(int stringId)
{
if (stringId < 0 || stringId >= 100)
return L"";
return sLocalizedStrings[stringId];
}
@ -93,19 +98,29 @@ void loadLocalString(INIFileW *iniFile, int id, LPCWSTR section, LPCWSTR key)
sLocalizedStrings[id] = new WCHAR[len + 1];
wcsncpy(sLocalizedStrings[id], section, len);
sLocalizedStrings[id][len] = NULL;
return;
}
int j = 0;
int i = 0;
if (buffer[0] == L'"' && buffer[len-1] == L'"')
{
sLocalizedStrings[id] = new WCHAR[len - 1];
wcsncpy(sLocalizedStrings[id], buffer + 1, len - 2);
sLocalizedStrings[id][len - 2] = NULL;
buffer[len-1] = NULL;
i++;
len -= 2;
}
sLocalizedStrings[id] = new WCHAR[len + 1];
for (; i<len; i++)
{
if (buffer[i] == L'\\' && buffer[i+1] == L'n')
{
sLocalizedStrings[id][j++] = L'\n';
i++;
}
else
{
sLocalizedStrings[id] = new WCHAR[len + 1];
wcsncpy(sLocalizedStrings[id], buffer, len);
sLocalizedStrings[id][len] = NULL;
sLocalizedStrings[id][j++] = buffer[i];
}
sLocalizedStrings[id][j] = NULL;
}
int GetPrivateProfileStringList(LPCWCHAR m_cache, LPCWSTR section, LPCWSTR key)
@ -143,7 +158,7 @@ int GetPrivateProfileStringList(LPCWCHAR m_cache, LPCWSTR section, LPCWSTR key)
// Treat next section
int i = 0;
while (nextHeader)
while (nextHeader && i < nb)
{
cur = nextHeader + wcslen(sectionString);
end = wcsstr(cur, L"]");
@ -227,12 +242,20 @@ int GetPrivateProfileStringList(LPCWCHAR m_cache, LPCWSTR section, LPCWSTR key)
void loadLocalizedStrings(int language)
{
if (sLocalizedTypeStrings)
return;
INIFileW *iniFile = new INIFileW;
log_msg("***** Load localized Strings *****\n");
if (!iniFile->InitReadWrite("PlugY\\LocalizedStrings.ini", INIFILE_MPQREAD, 0))//C:\\Jeux\\Blizzard\\D2\\-
if (iniFile->InitReadWrite(LOCALIZED_STRINGS_FILENAME, INIFILE_MPQREAD, 0))//C:\\Jeux\\Blizzard\\D2\\-
log_msg("File %s loaded from MPQ.\n\n", LOCALIZED_STRINGS_FILENAME);
else if (iniFile->InitReadWrite(LOCALIZED_STRINGS_FILENAME, INIFILE_READ, 0))//C:\\Jeux\\Blizzard\\D2\\-
log_msg("File %s loaded from PlugY folder.\n\n", LOCALIZED_STRINGS_FILENAME);
else
{
log_msg("Failed to load LocalizedStrings, default values used.\n\n");
log_msg("Failed to load %s.\n\n", LOCALIZED_STRINGS_FILENAME);
return;
}
LPCWSTR key;
@ -266,6 +289,7 @@ void loadLocalizedStrings(int language)
LOAD(STR_STASH_NEXT_PAGE);
LOAD(STR_TOGGLE_TO_PERSONAL);
LOAD(STR_TOGGLE_TO_SHARED);
LOAD(STR_TOGGLE_MULTI_DISABLED);
LOAD(STR_STASH_PREVIOUS_INDEX);
LOAD(STR_STASH_NEXT_INDEX);
LOAD(STR_PUT_GOLD);
@ -277,6 +301,7 @@ void loadLocalizedStrings(int language)
LOAD(STR_PREVIOUS_PAGE);
LOAD(STR_NEXT_PAGE);
LOAD(STR_ITEM_LEVEL);
LOAD(STR_PAGE_TYPE_CHANGE);
// Cube receipt :
LOAD(STR_COW_PORTAL);
@ -316,6 +341,27 @@ void loadLocalizedStrings(int language)
LOAD(STR_ONLY_HELL);
LOAD(STR_ONLY_CLASS);
// Breakpoints :
LOAD(STR_MERCENARIES);
LOAD(STR_MERC_ACT_1);
LOAD(STR_MERC_ACT_2);
LOAD(STR_MERC_ACT_3);
LOAD(STR_MERC_ACT_5);
LOAD(STR_BREAKPOINT);
LOAD(STR_BREAKPOINTS);
LOAD(STR_BLOCK_FRAMES);
LOAD(STR_CASTING_FRAMES);
LOAD(STR_HIT_RECOVERY_FRAMES);
LOAD(STR_1H_SWINGING_WEAPON);
LOAD(STR_OTHER_WEAPONS);
LOAD(STR_HUMAN_FORM);
LOAD(STR_BEAR_FORM);
LOAD(STR_WOLF_FORM);
LOAD(STR_VAMPIRE_FORM);
LOAD(STR_SPEARS_AND_STAVES);
LOAD(STR_LIGHTNING_CHAIN_LIGHTNING);
LOAD(STR_OTHER_SPELLS);
iniFile->close();
delete iniFile;
}

View File

@ -26,6 +26,7 @@ enum eStringList
STR_STASH_NEXT_PAGE,
STR_TOGGLE_TO_PERSONAL,
STR_TOGGLE_TO_SHARED,
STR_TOGGLE_MULTI_DISABLED,
STR_STASH_PREVIOUS_INDEX,
STR_STASH_NEXT_INDEX,
STR_PUT_GOLD,
@ -37,6 +38,7 @@ enum eStringList
STR_PREVIOUS_PAGE,
STR_NEXT_PAGE,
STR_ITEM_LEVEL,
STR_PAGE_TYPE_CHANGE,
//
STR_COW_PORTAL,
STR_PANDEMONIUM_PORTAL,
@ -74,6 +76,26 @@ enum eStringList
STR_ONLY_N_H,
STR_ONLY_HELL,
STR_ONLY_CLASS,
STR_MERCENARIES,
STR_MERC_ACT_1,
STR_MERC_ACT_2,
STR_MERC_ACT_3,
STR_MERC_ACT_5,
STR_BREAKPOINT,
STR_BREAKPOINTS,
STR_BLOCK_FRAMES,
STR_CASTING_FRAMES,
STR_HIT_RECOVERY_FRAMES,
STR_1H_SWINGING_WEAPON,
STR_OTHER_WEAPONS,
STR_HUMAN_FORM,
STR_BEAR_FORM,
STR_WOLF_FORM,
STR_VAMPIRE_FORM,
STR_SPEARS_AND_STAVES,
STR_LIGHTNING_CHAIN_LIGHTNING,
STR_OTHER_SPELLS
};
/*================================= END OF FILE =================================*/

View File

@ -35,28 +35,14 @@ void STDCALL printPlugYVersion(void** childrens, DWORD* sgnNumChildren)
}
}
void STDCALL printPlugYVersion114()
{
if (active_Windowed)
SetWindowedOptions();
if (active_PrintPlugYVersion)
{
char buf[20];
void* textbox = D2CreateTextBox(newTextBoxData);
void** childrens = (void**)0x779350;
DWORD* sgnNumChildren = (DWORD*)0x779944;
childrens[*sgnNumChildren] = textbox;
d2_assert((*sgnNumChildren)++ >= 40, "sgnNumChildren < MAX_CHILDREN", __FILE__, __LINE__);
sprintf(buf, "PlugY %s", PLUGY_VERSION);
D2PrintLineOnTextBox(textbox, buf, colorOfPlugYVersion);
}
}
void** childrens;
DWORD* sgnNumChildren;
FCT_ASM ( caller_printPlugYVersion114 )
POP ESI
CALL printPlugYVersion114
PUSH sgnNumChildren
PUSH childrens
CALL printPlugYVersion
MOV ECX,0x115
JMP ESI
RETN
}}
FCT_ASM ( caller_printPlugYVersion )
@ -76,13 +62,18 @@ void Install_PrintPlugYVersion()
log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n");
if (version_D2Launch == V114d) {
// Print PlugY version.
mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 33798);
if (version_D2Launch == V114d)
{
memt_byte(0xB9, 0xE8);
MEMT_REF4(0x00000115, caller_printPlugYVersion114);
} else {
// Print PlugY version.
mem_seek R8(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061, 10A11, 10A11);
childrens = (void**)(offset_Game + 0x379350);
sgnNumChildren = (DWORD*)(offset_Game + 0x379944);
//00433798 |. B9 15010000 MOV ECX,115
}
else
{
MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion);
//6FA19638 |. E8 1BED0000 CALL <JMP.&D2Win.#10017>
//6FA517C6 |. E8 6F81FFFF CALL <JMP.&D2Win.#10147>
@ -93,7 +84,6 @@ void Install_PrintPlugYVersion()
//6FA50A10 |. E8 218FFFFF CALL <JMP.&D2Win.#10164>
}
log_msg("\n");
isInstalled = true;
@ -106,6 +96,14 @@ void FASTCALL versionChange(void* screen, char* text, DWORD color)
D2PrintLineOnTextBox(screen,versionText,modVersionColor);
}
FCT_ASM ( caller_VersionChange_114 )
MOV CL, BYTE PTR DS:[modVersionColor]
MOV BYTE PTR SS:[ESP+4], CL
MOV EDX,versionText
MOV ECX,ESI
RETN
}}
FCT_ASM ( caller_VersionChange_10 )
MOV CL, BYTE PTR DS:[modVersionColor]
MOV BYTE PTR SS:[ESP+4], CL
@ -114,12 +112,6 @@ FCT_ASM ( caller_VersionChange_10 )
RETN
}}
FCT_ASM(caller_VersionChange_114)
MOV EDX, versionText
MOV ECX, ESI
RETN
}}
void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
{
static int isInstalled = false;
@ -133,14 +125,17 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
// Print LoD/Mod version.
if (version_D2Launch == V114d) {
if (version_D2Launch >= V114d)
{
mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000
memt_byte(0x8D, 0xE8); // CALL
MEMT_REF4(0xCE8BC055, caller_VersionChange_114);
//memt_byte(0xCE, 0x90); // NOP
} else if (version_D2Launch >= V110)
//004337EA |. 8D55 C0 LEA EDX,DWORD PTR SS:[EBP-40] ; |
//004337ED |. 8BCE MOV ECX,ESI ; |
}
else if (version_D2Launch >= V110)
{
mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 10AE4);//6FA19721-6FA10000
mem_seek R8(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134, 10AE4, 337EA);//6FA19721-6FA10000
memt_byte( 0x8D, 0xE8 ); // CALL
MEMT_REF4( 0x8B102454 , caller_VersionChange_10);
memt_byte( 0xCF, 0x90 ); // NOP
@ -157,7 +152,7 @@ void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
//6FA50AE4 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
//6FA50AE8 |. 8BCF MOV ECX,EDI
} else {
mem_seek R8(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB, 10AEB);
mem_seek R8(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B, 10AEB, 00000);
MEMJ_REF4( D2PrintLineOnTextBox, versionChange);
//6FA19729 |. E8 88EB0000 CALL <JMP.&D2Win.#10046>
//6FA518A1 |. E8 267FFFFF CALL <JMP.&D2Win.#10061>

View File

@ -9,11 +9,10 @@
#include "parameters.h"
#include "modifMemory.h"
const char* MSG_ERROR_READ_MEMORY = "Error : Read access missing to patch memory at %08X.\nPlease install a clean version of Lord of Destruction\n\n"
"You can avoid this error message by setting ActiveCkeckMemory=0 in PlugY.ini\n(WARNING: Be careful when you use it, it shouldn't be used by common user)";
const char* MSG_CRITICAL_WRITE_MEMORY = "Error.\nWrite access missing to patch memory at %08X.\n\nPlease install a clean version of Lord of Destruction\n";
const char* ERROR_TESTING1 = "Error : BYTE %02X wanted but %02X found to change memory at %08X\n\n";
const char* ERROR_TESTING4 = "Error : DWORD %08X wanted but %08X found to change memory at %08X\n\n";
const char* MSG_ERROR_READ_MEMORY = "Error : Read access missing to patch memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod.";
const char* MSG_CRITICAL_WRITE_MEMORY = "Error.\nWrite access missing to patch memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod.";
const char* ERROR_TESTING1 = "Error : BYTE %02X wanted but %02X found to change memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod.";
const char* ERROR_TESTING4 = "Error : DWORD %08X wanted but %08X found to change memory at %08X.\n\nAn option in PlugY.ini is incompatible with another mod.";
void* currentMemoryPos = 0;
@ -102,12 +101,14 @@ bool testIfAlreadySet(DWORD current, DWORD wanted)
void testMemory4(DWORD old, DWORD found)
{
if (old != found)
{
if (active_CheckMemory)
{
log_box(ERROR_TESTING4, old, found, currentMemoryPos);
exit(1);
} else log_msg(ERROR_TESTING4, old, found, currentMemoryPos);
}
}
void memt_dword(DWORD old, DWORD val)
{

View File

@ -42,7 +42,7 @@ void printOutputItem(CubeOutput* output, LPWSTR buf, LPINT len, LPINT nbOutputs)
if ((output->quantityOrNbSockets>1) && !output->haveSockets)
{
if (output->quantityOrNbSockets = 255)
if (output->quantityOrNbSockets == 255)
PRINT(BUF, L"%s ", getLocalString(STR_FULL));
else
PRINT(BUF, L"%u ", output->quantityOrNbSockets);
@ -305,6 +305,7 @@ void listAllCubeFormula()
int len = 0;
int nbCubeReceipt = 0;
int line = 0;
for (int i=0; i<nbLines; i++)
{
DWORD res = 1;
@ -315,7 +316,7 @@ void listAllCubeFormula()
if (res)
{
nbCubeReceipt++;
fwprintf(file, L"%3u: %s\n", i, buf);
fwprintf(file, L"%3u: %s\n", ++line, buf);
}
}

View File

@ -210,27 +210,30 @@ DWORD STDCALL mouseRunewordsPageLeftDown(sWinMessage* msg)
{
if (!D2isLODGame() || !D2GetResolution()) return -1;
if (!isOnStatsPage(msg->x,msg->y)) return 1;
DWORD x = D2GetMouseX();
DWORD y = D2GetMouseY();
if (!isOnStatsPage(x,y))
return 1;
if (isOnCloseBtn(msg->x,msg->y))
if (isOnCloseBtn(x,y))
{
log_msg("push down left button close\n");
isDownBtn.close = 1;
D2PlaySound(4,0,0,0,0);
}
else if (isOnNextPageBtn(msg->x,msg->y))
else if (isOnNextPageBtn(x,y))
{
log_msg("push down left button next page\n");
isDownBtn.nextPage = 1;
D2PlaySound(4,0,0,0,0);
}
else if (isOnPrevRunesBtn(msg->x,msg->y))
else if (isOnPrevRunesBtn(x,y))
{
log_msg("push down left button prev page\n");
isDownBtn.prevRunes = 1;
D2PlaySound(4,0,0,0,0);
}
else if (isOnNextRunesBtn(msg->x,msg->y))
else if (isOnNextRunesBtn(x,y))
{
log_msg("push down left button next runes\n");
isDownBtn.nextRunes = 1;
@ -246,24 +249,30 @@ DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg)
{
if (!D2isLODGame() || !D2GetResolution()) return -1;
if (!isOnStatsPage(msg->x,msg->y)) return 1;
DWORD x = D2GetMouseX();
DWORD y = D2GetMouseY();
if (!isOnStatsPage(x,y))
return 1;
if (isOnCloseBtn(msg->x,msg->y))
if (isOnCloseBtn(x,y))
{
log_msg("push up left button close\n");
if (isDownBtn.close)
D2TogglePage(2,1,0);
}
else if (isOnNextPageBtn(msg->x,msg->y))
else if (isOnNextPageBtn(x,y))
{
log_msg("push up left button next page\n");
if (isDownBtn.nextPage)
{
if (extraHiddenPage>1)
GoStatPage(GetCurrentPage()+1);
else
GoStatPage(0);
log_msg("next page press\n");
}
}
else if (isOnPrevRunesBtn(msg->x,msg->y))
else if (isOnPrevRunesBtn(x,y))
{
log_msg("push up left button prev runes\n");
if (isDownBtn.prevRunes)
@ -271,7 +280,7 @@ DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg)
if (curRunesPage) curRunesPage--;
}
}
else if (isOnNextRunesBtn(msg->x,msg->y))
else if (isOnNextRunesBtn(x,y))
{
log_msg("push up left button next runes\n");
if (isDownBtn.nextRunes)

View File

@ -347,7 +347,7 @@ if (version_D2Client <= V110)
//print Hit Point
curValue = D2GetPlayerStat(ptChar, STATS_HP, 0) / 256;
if ((ptChar->CurrentAnim != 0x11) && !curValue) curValue=1;
if ((ptChar->mode != UNIT_MODE_DEAD) && !curValue) curValue=UNIT_MODE_NEUTRAL;
swprintf(text,L"%ld",curValue);

View File

@ -11,10 +11,6 @@
#include "newInterfaces.h"
#include "common.h"
#include <stdio.h>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#define getXCloseBtn() RX(0x110)
#define getLCloseBtn() 32
@ -34,8 +30,9 @@
#define getHNextPageBtn() 32
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
const char * STATS_INTERFACE_FILENAME = "PlugY\\statsinterface.txt";
#define BUFSIZE 0x80
#define BUFSIZE 0x400
static struct
{
@ -62,64 +59,8 @@ struct statsInterfaceBIN
};
extern int lastPage;
int nbStatsInterface;
statsInterfaceBIN* statsInterface;
void loadStatsInterfaceDesc_114() {
char filename[0x104];
strcpy(filename, "PlugY\\statsinterface.txt");
char fileTemp[0x104];
log_msg("Load custom file : %s", filename);
strcpy(fileTemp, filename);
D2FogGetInstallPath(filename, 0x104 - strlen(filename));
strcat(filename, fileTemp);
log_msg("-> %s\n", filename);
std::ifstream statsFile(filename);
std::vector<std::string> stats;
if (statsFile.is_open()) {
std::string line;
while (std::getline(statsFile, line)) {
if (line.length() > 0 && line[0] != '*') {
//log_msg("Loading stat:\n");
//log_msg("%s\n\n", line);
stats.push_back(line);
}
}
} else {
log_msg("FAILED TO OPEN FILE: %s", filename);
}
statsFile.close();
nbStatsInterface = stats.size();
statsInterface = new statsInterfaceBIN[nbStatsInterface];
for (int i = 0; i < nbStatsInterface; ++i) {
std::istringstream ss(stats[i]);
auto& stat = statsInterface[i];
std::string token = "";
std::getline(ss, token, '\t');
//log_msg("Stat (%u) %s\n", i, token.c_str());
std::getline(ss, token, '\t');
stat.enabled = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tenabled = %u\n", stat.enabled);
std::getline(ss, token, '\t');
stat.page = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tpage = %u\n", stat.page);
std::getline(ss, token, '\t');
stat.x = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tx = %u\n", stat.x);
std::getline(ss, token, '\t');
stat.y = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\ty = %u\n", stat.y);
std::getline(ss, token, '\t');
stat.color = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tcolor = %u\n", stat.color);
std::getline(ss, token, '\t');
stat.font = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tfont = %u\n", stat.font);
std::getline(ss, token, '\t');
stat.statsID = token.length() == 0 ? 0 : std::stoi(token.c_str());
//log_msg("\tstatsID = %u\n", stat.statsID);
}
}
int nbStatsInterface = 0;
statsInterfaceBIN* statsInterface = NULL;
void loadStatsInterfaceDesc(DWORD mempool)
{
@ -135,20 +76,50 @@ void loadStatsInterfaceDesc(DWORD mempool)
// ADD_LOOKUP_WORD(10, "stat", lookupItemStatCost);
ADD_WORD_FIELD(12, "statID");
ADD_TERM_FIELD();
//log_msg("statsInterface=0x%08x\nnbStatsInterface=0x%08x\n", statsInterface, &nbStatsInterface);
//void* test = D2ReadFile(mempool, "PlugY\\statsinterface.txt", (DWORD*)nbStatsInterface, __FILE__, __LINE__);
//void* test = D2CompileTxtFile(mempool, "PlugY\\statsinterface.txt", TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN));
//log_msg("D2CompileTxtFile()=0x%08x", test);
if (version_D2Game == V114d) {
loadStatsInterfaceDesc_114();
} else {
BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, "PlugY\\statsinterface.txt");
}
BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, STATS_INTERFACE_FILENAME);
//statsInterface = (statsInterfaceBIN*)compileTxtFile(mempool, STATS_INTERFACE_FILENAME, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN));
/*
int nbSize=0;
char* data = (char*)D2ReadFile(mempool, STATS_INTERFACE_FILENAME, (DWORD*)&nbSize, __FILE__, __LINE__);
if (!data || nbSize <= 0)
{
D2FogAssert("statsinterface.txt missing", D2GetInstructionPointer(), __LINE__);
exit(1);
}
//statsInterface = (statsInterfaceBIN*)compileTxtFile(mempool, STATS_INTERFACE_FILENAME, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN));
//statsInterface = (statsInterfaceBIN*)compileTxtFile((DWORD)nbSize, data, TableDesc, (DWORD*)&nbStatsInterface, sizeof(statsInterfaceBIN));
*/
/*
nbStatsInterface = 0;
for (int i = 0; i<nbSize;i++)
if (data[i] == '\n') nbStatsInterface++;
if (data[nbSize - 1] != '\n') nbStatsInterface++;
nbStatsInterface--;
statsInterface = (statsInterfaceBIN*)D2FogMemAlloc(nbStatsInterface * sizeof(statsInterfaceBIN),__FILE__,__LINE__,0);
strtok(data,"\n");
for (i=0; i<nbStatsInterface; i++)
{
strtok(NULL,"\t");
statsInterface[i].enabled = atoi(strtok(NULL,"\t"));
statsInterface[i].page = atoi(strtok(NULL,"\t"));
statsInterface[i].x = atoi(strtok(NULL,"\t"));
statsInterface[i].y = atoi(strtok(NULL,"\t"));
statsInterface[i].color = atoi(strtok(NULL,"\t"));
statsInterface[i].font = atoi(strtok(NULL,"\t"));
statsInterface[i].statsID = atoi(strtok(NULL,"\t"));
strtok(NULL,"\n");
log_msg("stats : %d, %d, %d, %d, %d, %d, %d\n", statsInterface[i].enabled, statsInterface[i].page, statsInterface[i].x, statsInterface[i].y, statsInterface[i].color, statsInterface[i].font, statsInterface[i].statsID);
}
*/
lastPage = 0;
for (i=0; i<nbStatsInterface; i++)
if (statsInterface[i].page > lastPage)
lastPage = statsInterface[i].page;
log_msg("loadStatsInterfaceDesc - fin\n");
}
void freeStatsInterfaceDesc()
@ -157,21 +128,170 @@ void freeStatsInterfaceDesc()
if (statsInterface)
{
if (version_D2Game == V114d) {
delete[] statsInterface;
}
else {
D2FogMemDeAlloc(statsInterface,__FILE__,__LINE__,0);
}
statsInterface = NULL;
nbStatsInterface = 0;
}
}
void printCharacterBreakpoints(Unit* ptChar, DWORD x, DWORD y, DWORD color, LPWSTR lpText)
{
CharStatsBIN* charStatsBIN = D2GetCharStatsBIN(ptChar->nPlayerClass);
swprintf(lpText, L"%s : %s", getLocalString(STR_BREAKPOINTS), charStatsBIN->nameU);
D2PrintString(lpText, x, y, color, 0); y+=33;
D2SetFont(6);
LPWSTR sBreakpoint = getLocalString(STR_BREAKPOINT);
LPWSTR sBlockFrames = getLocalString(STR_BLOCK_FRAMES);
LPWSTR sCastingFrames = getLocalString(STR_CASTING_FRAMES);
LPWSTR sHitRecoveryFrames = getLocalString(STR_HIT_RECOVERY_FRAMES);
LPWSTR s1HSwingingWeapon = getLocalString(STR_1H_SWINGING_WEAPON);
LPWSTR sOtherWeapon = getLocalString(STR_OTHER_WEAPONS);
LPWSTR sHumanForm = getLocalString(STR_HUMAN_FORM);
LPWSTR sBearForm = getLocalString(STR_BEAR_FORM);
LPWSTR sWolfForm = getLocalString(STR_WOLF_FORM);
LPWSTR sVampireForm = getLocalString(STR_VAMPIRE_FORM);
LPWSTR sHolyShield = D2GetStringFromIndex(0x12EC);
LPWSTR sSpearsAndStaves= getLocalString(STR_SPEARS_AND_STAVES);
LPWSTR sLightningAndChainLightnings = getLocalString(STR_LIGHTNING_CHAIN_LIGHTNING);
switch (ptChar->nPlayerClass)
{
case D2PC_AMAZON:
swprintf(lpText, L"%s:%s\n%s - %s: %d", sBreakpoint, L"4 6 11 15 23 29 40 56 80 120 200 480", sBlockFrames, s1HSwingingWeapon, 17);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, sOtherWeapon, 5);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 14 22 32 48 68 99 152", sCastingFrames, 19);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sHitRecoveryFrames, 11);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_ASSASSIN:
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, 5);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"8 16 27 42 65 102 174", sCastingFrames, 16);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_BARBARIAN:
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 42 86 280", sBlockFrames, 7);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 37 63 105 200", sCastingFrames, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_DRUID:
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sBlockFrames, sHumanForm, 11);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 27 40 65 109 223", sBlockFrames, sBearForm, 12);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sBlockFrames, sWolfForm, 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"4 10 19 30 46 68 99 163", sCastingFrames, sHumanForm, 18);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 26 40 63 99 163", sCastingFrames, sBearForm, 16);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 14 26 40 60 95 157", sCastingFrames, sWolfForm, 16);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"3 7 13 19 29 42 63 99 174 456", sHitRecoveryFrames, s1HSwingingWeapon, 14);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 26 39 56 86 152 377", sHitRecoveryFrames, sOtherWeapon, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 24 37 54 86 152 360", sHitRecoveryFrames, sBearForm, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"9 20 42 86 280", sHitRecoveryFrames, sWolfForm, 7);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_NECROMANCER:
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sBlockFrames, 11);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"9 18 30 48 75 125", sCastingFrames, sHumanForm, 15);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 11 18 24 35 48 65 86 120 180", sCastingFrames, sVampireForm, 23);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 10 16 26 39 56 86 152 377", sHitRecoveryFrames, sHumanForm, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"2 6 10 16 24 34 48 72 117", sHitRecoveryFrames, sVampireForm, 15);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_PALADIN:
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"13 32 86 600", sBlockFrames, 5);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"86", sBlockFrames, sHolyShield, 2);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 18 30 48 75 125", sCastingFrames, 15);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"3 7 13 20 32 48 75 129 280", sHitRecoveryFrames, sSpearsAndStaves, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, sOtherWeapon, 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
case D2PC_SORCERESS:
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"7 15 27 48 86 200", sBlockFrames, 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"9 20 37 63 105 200", sCastingFrames, 13);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 23 35 52 78 117 194", sCastingFrames, sLightningAndChainLightnings, 19);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s: %d", sBreakpoint, L"5 9 14 20 30 42 60 86 142 280", sHitRecoveryFrames, 15);
D2PrintString(lpText, x, y, color, 0); y+=29;
break;
}
}
void printMercBreakpoints(Unit* ptChar, DWORD x, DWORD y, DWORD color, LPWSTR lpText)
{
LPWSTR sBreakpoint = getLocalString(STR_BREAKPOINT);
LPWSTR sCastingFrames = getLocalString(STR_CASTING_FRAMES);
LPWSTR sHitRecoveryFrames = getLocalString(STR_HIT_RECOVERY_FRAMES);
swprintf(lpText, L"%s : %s", getLocalString(STR_BREAKPOINTS), getLocalString(STR_MERCENARIES));
D2PrintString(lpText, x, y, color, 0); y+=33;
D2SetFont(6);
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"8 15 26 39 58 86 138", sCastingFrames, getLocalString(STR_MERC_ACT_3), 17);
D2PrintString(lpText, x, y, color, 0); y+=29;
y+=13;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"6 13 20 32 52 86 174 600", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_1), 11);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 9 14 20 30 42 60 86 142 280", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_2), 15);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"5 8 13 18 24 32 46 63 86 133 232 600", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_3), 17);
D2PrintString(lpText, x, y, color, 0); y+=29;
swprintf(lpText, L"%s : %s\n%s - %s: %d", sBreakpoint, L"7 15 27 48 86 200", sHitRecoveryFrames, getLocalString(STR_MERC_ACT_5), 9);
D2PrintString(lpText, x, y, color, 0); y+=29;
}
void printStat(Unit* ptChar, DWORD statID, DWORD x, DWORD y, DWORD color, LPWSTR lpText)
{
LPWSTR text;
log_msg("printStat : %d\n", statID);
switch (statID)
{
case STATS_FIRERESIST:
@ -179,9 +299,15 @@ void printStat(Unit* ptChar, DWORD statID, DWORD x, DWORD y, DWORD color, LPWSTR
case STATS_LIGHTRESIST:
case STATS_POISONRESIST:
text = D2GetStringFromIndex(getDescStrPos(statID));
if (wcslen(text) > 50) return;
if (wcslen(text) > BUFSIZE) return;
swprintf(lpText, L"%s +%i%%", text, D2GetPlayerStat(ptChar,statID,0));
break;
case 10000:
printCharacterBreakpoints(ptChar, x, y, color, lpText);
return;
case 10001:
printMercBreakpoints(ptChar, x, y, color, lpText);
return;
default:
D2PrintStat(ptChar, NULL, statID, 0, D2GetPlayerStat(ptChar,statID,0), lpText);//param2=ptChar->ptStats->ptItemStats
}
@ -284,7 +410,6 @@ void STDCALL printNewStatsPageTwo(int currentPage)
setFrame(&data, 14 + isDownBtn.nextPage);
D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);
//////////////////// POPUP PRINTING ////////////////////
//set MouseX & MouseY
DWORD mx = D2GetMouseX();

View File

@ -57,9 +57,6 @@ int GetCurrentPage()
void STDCALL printCustomPage()
{
if(onRealm) {D2PrintStatsPage();return;}
//printNewStatsPageTwo(selectedPage); return;
if ( (selectedPage > 0) && (selectedPage<=lastPage) )
printNewStatsPageTwo(selectedPage);
else if (selectedPage == lastPage+1)
@ -97,15 +94,17 @@ DWORD STDCALL mouseCustomPageLeftUp(sWinMessage* msg)
}
FCT_ASM ( caller_DontPrintBorder_114 )
MOV ESI, bDontPrintBorder
TEST ESI, ESI
MOV ECX,bDontPrintBorder
TEST ECX,ECX
JE printBorder
MOV bDontPrintBorder,0
ADD DWORD PTR SS : [ESP], 0x14F
ADD DWORD PTR SS:[ESP],0xC1
RETN
printBorder:
MOV ESI, DWORD PTR DS : [0x7BEF18]
RETN
POP ECX
PUSH 0x48
LEA EAX,DWORD PTR SS:[EBP-0x48]
JMP ECX
}}
FCT_ASM ( caller_DontPrintBorder_111 )
@ -139,17 +138,17 @@ FCT_ASM(caller_mouseCustomPageLeftDown_114)
TEST EAX,EAX
POP EAX
JE end_mouseNewPageLDown
;JG continue_mouseNewPageLDown
JG continue_mouseNewPageLDown
LEA ECX,DWORD PTR DS:[EAX+0x80]
RETN
continue_mouseNewPageLDown:
POP EAX
ADD EAX, 0x170
PUSH 0x4A7720
ADD EAX,0x172
PUSH EDI
JMP EAX
RETN
end_mouseNewPageLDown:
POP EDI
ADD ESP,4
POP ESI
POP EBX
POP EBP
@ -230,12 +229,12 @@ FCT_ASM(caller_mouseCustomPageLeftUp_114)
CALL mouseCustomPageLeftUp
TEST EAX,EAX
JE end_mouseNewPageLUp
;JG continue_mouseNewPageLUp
JG continue_mouseNewPageLUp
MOV EAX,DWORD PTR DS:[ptWindowStartX]
MOV EAX,DWORD PTR DS:[EAX]
RETN
continue_mouseNewPageLUp:
ADD DWORD PTR SS : [ESP], 0x2C4
ADD DWORD PTR SS:[ESP],0x17D
RETN
end_mouseNewPageLUp:
ADD ESP,4
@ -317,10 +316,17 @@ end_mouseNewPageLUp:
FCT_ASM( caller_resetSelectedPageByToolBar_114 )
FCT_ASM ( caller_resetSelected_114 )
CMP ECX,2
JNZ NO_RESET
MOV selectedPage, 0
MOV EDX, 2
RETN
NO_RESET:
POP EAX
PUSH EBX
PUSH ESI
PUSH EDI
MOV EDI,ECX
JMP EAX
}}
@ -333,13 +339,6 @@ noJump:
RETN
}}
FCT_ASM( caller_resetSelectedPageByKey_114 )
MOV selectedPage, 0
MOV EDX, DWORD PTR DS : [ECX * 4 + 0x712698]
RETN
}}
FCT_ASM ( caller_resetSelectedPageByKey )
MOV selectedPage,0
POP EAX
@ -377,12 +376,22 @@ void Install_NewInterfaces()
if (selectMainPageOnOpenning)
{
if ( version_D2Client >= V111 )
if ( version_D2Client >= V114a )
{
mem_seek R8(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 55F24);
memt_byte( 0x53, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( 0xF98B5756, caller_resetSelected_114);
//00455F24 |. 53 PUSH EBX
//00455F25 |. 56 PUSH ESI
//00455F26 |. 57 PUSH EDI
//00455F27 |. 8BF9 MOV EDI,ECX
}
else if ( version_D2Client >= V111 )
{
//Reset selectedPage variable on opening stats page
mem_seek R8(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE, 7EC7A);
memt_byte( version_D2Client == V114d ? 0xBA : 0x83, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( version_D2Client == V114d ? 0x00000002 : 0x1F7426F8, version_D2Client == V114d ? caller_resetSelectedPageByToolBar_114 : caller_resetSelectedPageByToolBar);
mem_seek R8(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E, C41FE, 7EC5C);
memt_byte( version_D2Client == V114d ? 0xB9 : 0x83, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( version_D2Client == V114d ? 0x00000002 : 0x1F7426F8, caller_resetSelectedPageByToolBar);
//6FAFB79E > 83F8 26 CMP EAX,26
//6FAFB7A1 . 74 1F JE SHORT D2Client.6FAFB7C2
//6FB3F73E > 83F8 26 CMP EAX,26
@ -393,18 +402,13 @@ void Install_NewInterfaces()
//6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82
//6FB741FE > 83F8 26 CMP EAX,26
//6FB74201 . 74 1F JE SHORT D2Client.6FB05E32
//6FB741FE > 83F8 26 CMP EAX,26
//6FB74201 . 74 1F JE SHORT D2Client.6FB74222
//0047EC5C > B9 02000000 MOV ECX,2
mem_seek R8(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A, 6A91D);
if (version_D2Client == V114d) {
memt_byte(0x8B, 0x90);
memt_byte(0x14, 0x90);
memt_byte(0x8D, 0xE8);
MEMT_REF4(0x00712698, caller_resetSelectedPageByKey_114);
}
else {
mem_seek R8(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA, 3E39A, 0000);
memt_byte( 0x55, 0xE8 ); // CALL caller_resetSelectedPage
MEMT_REF4( 0xD53BED33, caller_resetSelectedPageByKey);
}
//6FACE55A . 55 PUSH EBP
//6FACE55B . 33ED XOR EBP,EBP
//6FACE55D . 3BD5 CMP EDX,EBP
@ -448,29 +452,27 @@ void Install_NewInterfaces()
// Print custom page
mem_seek R8(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49, 1D549, 57052);
if (version_D2Client == V114d) {
MEMT_REF4(0x00050CAA, printCustomPage);
} else {
MEMC_REF4( D2PrintStatsPage, printCustomPage);
}
//6FB21FAA . E8 B1DDFAFF CALL D2Client.6FACFD60
//6FB53758 . E8 43F1FDFF CALL D2Client.6FB328A0
//6FB16B58 |. E8 C3270200 CALL D2Client.6FB39320
//6FB402B8 |. E8 C3AFFDFF CALL D2Client.6FB1B280
//6FB73B48 |. E8 5393FFFF CALL D2Client.6FB6CEA0
//6FACD548 |. E8 F3200A00 CALL D2Client.6FB1B280
//00457051 |. E8 AA0C0500 CALL Game.004A7D00
// Don't print Border
mem_seek R8(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6, 98707);
memt_byte( version_D2Client == V114d ? 0x8B : 0xB9, 0xE8 ); // CALL caller_DontPrintBorder
MEMT_REF4( version_D2Client == V114d ? 0x7BEF1835 : 0x00000012, version_D2Client == V114d ? caller_DontPrintBorder_114 : version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder);
if (version_D2Client == V114d) memt_byte(0x00, 0x90);
mem_seek R8(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6, 6D2B6, 98636);
memt_byte( version_D2Client >= V114d ? 0x6A : 0xB9, 0xE8 ); // CALL caller_DontPrintBorder
MEMT_REF4( version_D2Client >= V114d ? 0xB8458D48 : 0x00000012, version_D2Client >= V114d ? caller_DontPrintBorder_114 : version_D2Client >= V111 ? caller_DontPrintBorder_111 : caller_DontPrintBorder);
//6FAFF4C6 > B9 12000000 MOV ECX,12
//6FADD366 |. B9 12000000 MOV ECX,12
//6FB65A46 |. B9 12000000 MOV ECX,12
//6FB32166 |. B9 12000000 MOV ECX,12
//6FAD71C6 |. B9 12000000 MOV ECX,12
//6FB1D2B6 |. B9 12000000 MOV ECX,12
//00498636 |. 6A 48 PUSH 48
//00498638 |. 8D45 B8 LEA EAX,DWORD PTR SS:[EBP-48]
// Manage mouse down (Play sound)
mem_seek R8(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36, BF4D6, A7731);
@ -483,18 +485,19 @@ void Install_NewInterfaces()
//6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
//6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
//6FB6F4D6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
//004A7731 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
// Manage mouse up
mem_seek R8(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9, C0459, A78DA);
memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp
MEMT_REF4( ptWindowStartX, version_D2Client == V114d ? caller_mouseCustomPageLeftUp_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9);
MEMT_REF4( ptWindowStartX, version_D2Client >= V114d ? caller_mouseCustomPageLeftUp_114 : version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9);
//6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748]
//6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24]
//6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8]
//6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28]
//6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0]
//6FB70459 . A1 54D3BC6F MOV EAX,DWORD PTR DS:[6FBCD354]
//004A78DA |. A1 58287A00 MOV EAX,DWORD PTR DS:[7A2858]
// open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP
//6FB2347D |. 8914B5 A8A6BB6F MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EDX

View File

@ -9,7 +9,6 @@
bool active_othersFeatures = false;
/*
// Remove protect on the save file .d2s
mem_seek( offset_D2Game + 0x77080);//6FC8DD5E-6FAA0000
@ -111,8 +110,6 @@ void Install_Test2()
isInstalled = true;
}*/
///////////////////////////////////////////////////////////////////////////////////////////////
void Install_OthersFeatures()
{
static int isInstalled = false;
@ -120,6 +117,7 @@ void Install_OthersFeatures()
log_msg("Patch. (OthersFeatures)\n");
// Install_RemoveExperienceDiminushingReturn();
// Install_ChangeResolution();
// Install_Test();

View File

@ -1,5 +1,6 @@
/*=================================================================
File created by Yohann NICOLAS.
Add DoNotCloseNihlathakPortal by haxifix.
Loading parameters from ini file.
@ -13,9 +14,9 @@
#include <time.h>
#define PARAMETERS_FILENAME "PlugY.ini"
#define PARAM_FIXED_FILENAME "PlugY\\PlugYFixed.ini"
#define PARAM_DEFAULT_FILENAME "PlugY\\PlugYDefault.ini"
const char* PARAMETERS_FILENAME = "PlugY.ini";
const char* PARAM_FIXED_FILENAME = "PlugY\\PlugYFixed.ini";
const char* PARAM_DEFAULT_FILENAME = "PlugY\\PlugYDefault.ini";
#define BUFSIZE 0x400
@ -35,6 +36,7 @@
#include "commands.h"
#include "language.h"
#include "windowed.h"
#include "savePlayerData.h"
char* modDataDirectory = "PlugY";
@ -48,13 +50,13 @@ TargetMod selectModParam = MOD_NO;
const char* S_GENERAL = "GENERAL";
const char* S_dllFilenames = "DllToLoad";
const char* S_dllFilenames2 = "DllToLoad2";
const char* S_active_plugin = "ActivePlugin";
const char* S_active_DisableBattleNet = "DisableBattleNet";
const char* S_active_logFile = "ActiveLogFile";
const char* S_active_CheckMemory = "ActiveCheckMemory";
const char* S_dllFilenames = "DllToLoad";
const char* S_dllFilenames2 = "DllToLoad2";
const char* S_active_Commands = "ActiveCommands";
const char* S_active_CheckMemory = "ActiveCheckMemory";
const char* S_active_othersFeatures = "ActiveAllOthersFeatures";
const char* S_WINDOWED = "WINDOWED";
@ -79,44 +81,76 @@ const char* S_availableLanguages = "AvailableLanguages";
const char* S_SAVEPATH = "SAVEPATH";
const char* S_active_changingSavePath = "ActiveSavePathChange";
const char* S_savePath = "SavePath";
const char* S_active_AutoBackup = "ActiveAutoBackup";
const char* S_maxBackupPerCharacter = "MaxBackupPerCharacter";
const char* S_MAIN_SCREEN = "MAIN SCREEN";
const char* S_active_VersionTextChange = "ActiveVersionTextChange";
const char* S_active_VersionTextChanges = "ActiveVersionTextChanges";
const char* S_versionText = "VersionText";
const char* S_modVersionColor = "ColorOfVersionText";
const char* S_active_PrintPlugYVersion = "ActivePrintPlugYVersion";
const char* S_colorOfPlugYVersion = "ColorOfPlugYVersion";
const char* S_STASH = "STASH";
const char* S_active_bigStash = "ActiveBigStash";
const char* S_active_multiPageStash = "ActiveMultiPageStash";
const char* S_maxSelfPages = "MaxPersonnalPages";
const char* S_nbPagesPerIndex = "NbPagesPerIndex";
const char* S_nbPagesPerIndex2 = "NbPagesPerIndex2";
const char* S_active_sharedStash = "ActiveSharedStash";
const char* S_openSharedStashOnLoading = "OpenSharedStashOnLoading";
const char* S_maxSharedPages = "MaxSharedPages";
const char* S_sharedStashFilename = "SharedStashFilename";
const char* S_separateHardSoftStash = "SeparateHardcoreStash";
const char* S_active_bigStash = "ActiveBigStash";
const char* S_displaySharedSetItemNameInGreen = "DisplaySharedSetItemNameInGreen";
const char* S_active_sharedGold = "ActiveSharedGold";
const char* S_maxSelfPages = "MaxPersonnalPages";
const char* S_autoRenameStashPage = "AutoRenameStashPage";
const char* S_PersonalNormalPageColor = "PersonalNormalPageColor";
const char* S_PersonalIndexPageColor = "PersonalIndexPageColor";
const char* S_PersonalMainIndexPageColor = "PersonalMainIndexPageColor";
const char* S_SharedNormalPageColor = "SharedNormalPageColor";
const char* S_SharedIndexPageColor = "SharedIndexPageColor";
const char* S_SharedMainIndexPageColor = "SharedMainIndexPageColor";
const char* S_active_sharedStash = "ActiveSharedStash";
const char* S_active_SharedStashInMultiPlayer = "ActiveSharedStashInMultiPlayer";
const char* S_separateHardSoftStash = "SeparateHardcoreStash";
const char* S_openSharedStashOnLoading = "OpenSharedStashOnLoading";
const char* S_sharedStashFilename = "SharedStashFilename";
const char* S_displaySharedSetItemNameInGreen = "DisplaySharedSetItemNameInGreen";
const char* S_maxSharedPages = "MaxSharedPages";
const char* S_active_sharedGold = "ActiveSharedGold";
const char* S_posXPreviousBtn = "PosXPreviousBtn";
const char* S_posYPreviousBtn = "PosYPreviousBtn";
const char* S_posWPreviousBtn = "PosWPreviousBtn";
const char* S_posHPreviousBtn = "PosHPreviousBtn";
const char* S_posXNextBtn = "PosXNextBtn";
const char* S_posYNextBtn = "PosYNextBtn";
const char* S_posWNextBtn = "PosWNextBtn";
const char* S_posHNextBtn = "PosHNextBtn";
const char* S_posXSharedBtn = "PosXSharedBtn";
const char* S_posYSharedBtn = "PosYSharedBtn";
const char* S_posWSharedBtn = "PosWSharedBtn";
const char* S_posHSharedBtn = "PosHSharedBtn";
const char* S_posXPreviousIndexBtn = "PosXPreviousIndexBtn";
const char* S_posYPreviousIndexBtn = "PosYPreviousIndexBtn";
const char* S_posWPreviousIndexBtn = "PosWPreviousIndexBtn";
const char* S_posHPreviousIndexBtn = "PosHPreviousIndexBtn";
const char* S_posXNextIndexBtn = "PosXNextIndexBtn";
const char* S_posYNextIndexBtn = "PosYNextIndexBtn";
const char* S_posWNextIndexBtn = "PosWNextIndexBtn";
const char* S_posHNextIndexBtn = "PosHNextIndexBtn";
const char* S_posXPutGoldBtn = "PosXPutGoldBtn";
const char* S_posYPutGoldBtn = "PosYPutGoldBtn";
const char* S_posWPutGoldBtn = "PosWPutGoldBtn";
const char* S_posHPutGoldBtn = "PosHPutGoldBtn";
const char* S_posXTakeGoldBtn = "PosXTakeGoldBtn";
const char* S_posYTakeGoldBtn = "PosYTakeGoldBtn";
const char* S_posWTakeGoldBtn = "PosWTakeGoldBtn";
const char* S_posHTakeGoldBtn = "PosHTakeGoldBtn";
const char* S_posXStashNameField = "PosXStashNameField";
const char* S_posYStashNameField = "PosYStashNameField";
const char* S_posWStashNameField = "PosWStashNameField";
const char* S_posHStashNameField = "PosHStashNameField";
const char* S_posXStashGoldField = "PosXStashGoldField";
const char* S_posYStashGoldField = "PosYStashGoldField";
const char* S_posWStashGoldField = "PosWStashGoldField";
const char* S_posHStashGoldField = "PosHStashGoldField";
const char* S_STATS_POINTS = "STATS POINTS";
const char* S_active_StatsPoints = "ActiveStatsUnassignment";
@ -124,14 +158,20 @@ const char* S_keyUsedForUnassignStatPoint = "KeyUsed";
const char* S_active_StatsShiftClickLimit = "ActiveShiftClickLimit";
const char* S_limitValueToShiftClick = "LimitValueToShiftClick";
const char* S_SKILL_ON_LEVEL_UP = "SKILL ON LEVEL UP";
const char* S_active_SkillPerLevelUpChange = "ActiveSkillPerLevelUp";
const char* S_skillPerLevelUp = "SkillPerLevelUp";
const char* S_STAT_ON_LEVEL_UP = "STAT ON LEVEL UP";
const char* S_active_StatPerLevelUpChange = "ActiveStatPerLevelUp";
const char* S_statPerLevelUp = "StatPerLevelUp";
const char* S_SKILLS_POINTS = "SKILLS POINTS";
const char* S_active_SkillsPoints = "ActiveSkillsUnassignment";
const char* S_unassignSkillsPointsOneForOne = "ActiveSkillsUnassignmentOneForOne";
const char* S_posXUnassignSkillBtn = "PosXUnassignSkillBtn";
const char* S_posYUnassignSkillBtn = "PosYUnassignSkillBtn";
const char* S_SKILL_ON_LEVEL_UP = "SKILL ON LEVEL UP";
const char* S_active_SkillPerLevelUpChange = "ActiveSkillPerLevelUp";
const char* S_skillPerLevelUp = "SkillPerLevelUp";
const char* S_WORLD_EVENT = "WORLD EVENT";
const char* S_active_WorldEvent = "ActiveWorldEvent";
const char* S_showSOJSoldCounterInAllDiff = "ShowCounterInAllDifficulty";
@ -148,12 +188,27 @@ const char* S_timeBeforeAutoSellDelta = "TimeBeforeAutoSellMax";
const char* S_UBER_QUEST = "UBER QUEST";
const char* S_active_UberQuest = "ActiveUberQuest";
const char* S_UberMephistoX = "UberMephistoX";
const char* S_UberMephistoY = "UberMephistoY";
const char* S_UberDiabloX = "UberDiabloX";
const char* S_UberDiabloY = "UberDiabloY";
const char* S_UberBaalX = "UberBaalX";
const char* S_UberBaalY = "UberBaalY";
const char* S_SKILLS_POINTS = "SKILLS POINTS";
const char* S_active_SkillsPoints = "ActiveSkillsUnassignment";
const char* S_unassignSkillsPointsOneByOne = "ActiveSkillsUnassignmentOneByOne";
const char* S_posXUnassignSkillBtn = "PosXUnassignSkillBtn";
const char* S_posYUnassignSkillBtn = "PosYUnassignSkillBtn";
const char* S_active_UberMinions = "ActiveUberMinions";
//const char* S_UberMephistoMinions = "UberMephistoMinions";
const char* S_UberMephistoSpawnPercent = "UberMephistoSpawnPercent";
const char* S_UberMephistoSpawnRadius = "UberMephistoSpawnRadius";
//const char* S_UberBaalMinions = "UberBaalMinions";
const char* S_UberBaalSpawnPercent = "UberBaalSpawnPercent";
const char* S_UberBaalSpawnRadius = "UberBaalSpawnRadius";
//const char* S_UberDiabloMinions = "UberDiabloMinions";
const char* S_UberDiabloSpawnPercent = "UberDiabloSpawnPercent";
const char* S_UberDiabloSpawnRadius = "UberDiabloSpawnRadius";
const char* S_active_UberDiabloRushTweekAI = "ActiveUberDiabloRushTweekAI";
const char* S_active_UberBaalTeleportTweekAI = "ActiveUberBaalTeleportTweekAI";
const char* S_active_UberBaalChillingArmorTweekAI = "ActiveUberBaalChillingArmorTweekAI";
const char* S_uberBaalChillingArmorTimer = "UberBaalChillingArmorTimer";
const char* S_INTERFACE = "INTERFACE";
const char* S_active_newInterfaces = "ActiveNewStatsInterface";
@ -161,16 +216,18 @@ const char* S_selectMainPageOnOpenning = "SelectMainPageOnOpenning";
const char* S_printBackgroundOnMainPage = "PrintButtonsBackgroundOnMainStatsPage";
const char* S_EXTRA = "EXTRA";
const char* S_active_RunLODs = "ActiveLaunchAnyNumberOfLOD";
const char* S_active_alwaysRegenMapInSP = "AlwaysRegenMapInSP";
const char* S_nbPlayersCommandByDefault = "NBPlayersByDefault";
const char* S_active_DisplayItemLevel = "ActiveDisplayItemLevel";
const char* S_active_RunLODs = "ActiveLaunchAnyNumberOfLOD";
const char* S_active_AlwaysDisplayLifeMana = "AlwaysDisplayLifeAndManaValues";
const char* S_active_EnabledTXTFilesWithMSExcel= "EnabledTXTFilesWhenMSExcelOpenIt";
const char* S_active_DisplayBaseStatsValue = "ActiveDisplayBaseStatsValue";
const char* S_active_LadderRunewords = "ActiveLadderRunewords";
const char* S_active_EnabledCowPortalWhenCowKingWasKill = "ActiveCowPortalWhenCowKingWasKilled";
const char* S_active_DoNotCloseNihlathakPortal = "ActiveDoNotCloseNihlathakPortal";
const char* S_active_MoveCainNearHarrogathWaypoint = "MoveCainNearHarrogathWaypoint";
const char* S_active_RemoveExperienceDiminushingReturn = "RemoveExperienceDiminushingReturn";
const char* S_DLL = "DLL:\t";
const char* S_DEFAULT = "DEFAULT:";
@ -207,6 +264,13 @@ else log_msg(S_DEFAULT); \
else log_msg(S_FIXED); \
else log_msg(S_USER)
int getColor(char* buffer)
{
int val = atoi(buffer);
if (val < 1 || val > 19 || val == 17)
return 0;
return val;
}
void init_ActivePlugin(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
@ -228,7 +292,17 @@ void init_General(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFi
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_logFile, "0");
active_logFile = atoi(buffer) + 1;
log_msg("active_logFile\t\t\t\t= %d\n", active_logFile-1);
log_msg("active_logFile\t\t\t\t= %d\n", active_logFile);
GET_PRIVATE_PROFILE_STRING(S_GENERAL,S_dllFilenames,"");
strcat(buffer,"|");
char* buf = &buffer[strlen(buffer)];
if (!iniFixedFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize))
if (!iniFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize))
iniDefaultFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize);
dllFilenames = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
strcpy(dllFilenames,buffer);
log_msg("dllFilenames\t\t\t\t= %s\n", dllFilenames);
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_Commands, "0");
active_Commands = atoi(buffer) != 0;
@ -242,17 +316,6 @@ void init_General(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFi
active_othersFeatures = atoi(buffer) != 0;
log_msg("active_othersFeatures\t\t= %u\n", active_othersFeatures);
GET_PRIVATE_PROFILE_STRING(S_GENERAL,S_dllFilenames,"");
strcat(buffer,"|");
char* buf = &buffer[strlen(buffer)];
if (!iniFixedFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize))
if (!iniFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize))
iniDefaultFile->GetPrivateProfileString(S_GENERAL, S_dllFilenames2, NULL, buf, maxSize);
dllFilenames = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
strcpy(dllFilenames,buffer);
log_msg("dllFilenames\t\t\t\t= %s\n",dllFilenames);
log_msg("\n");
}
@ -277,7 +340,7 @@ void init_Windowed(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_SetWindowPos, "0");
active_SetWindowPos = atoi(buffer) != 0;
log_msg("active_MoveAndResizeWindow\t= %d\n", active_SetWindowPos);
log_msg("active_SetWindowPos\t= %d\n", active_SetWindowPos);
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_X, "0");
windowedX = atoi(buffer);
@ -287,11 +350,11 @@ void init_Windowed(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF
windowedY = atoi(buffer);
log_msg("windowedY\t\t\t\t\t= %d\n", windowedY);
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Width, "0");
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Width, "800");
windowedWidth = atoi(buffer);
log_msg("windowedWidth\t\t\t\t= %d\n", windowedWidth);
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Height, "0");
GET_PRIVATE_PROFILE_STRING(S_WINDOWED, S_Height, "600");
windowedHeight = atoi(buffer);
log_msg("windowedHeight\t\t\t\t= %d\n", windowedHeight);
@ -388,7 +451,6 @@ void init_ActiveLanguage(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDe
log_msg("\n");
}
void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_active_changingSavePath, "0");
@ -416,7 +478,6 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF
{
active_changingSavePath = false;
log_msg("active_changingSavePath\t\t= %u (no valid savePath)\n\n", active_changingSavePath);
// log_msg("\tsavePath\t\t\t= %s\n", savePath);
return;
}
@ -424,7 +485,7 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF
{
char buf[MAX_PATH];
buf[0]=NULL;
D2FogGetInstallPath(buf,MAX_PATH);
D2FogGetSavePath(buf,MAX_PATH);
savePath = (char*)D2FogMemAlloc(strlen(buf) + curSize - start + 1,__FILE__,__LINE__,0);
strcpy(savePath,buf);
strcat(savePath,&buffer[start]);
@ -434,10 +495,18 @@ void init_SavePath(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultF
}
log_msg("savePath\t\t\t\t\t= %s\n", savePath);
}
GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_active_AutoBackup, "0");
active_AutoBackup = atoi(buffer) != 0;
log_msg("active_autoBackup\t\t= %u\n", active_AutoBackup);
GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_maxBackupPerCharacter, "5");
maxBackupPerCharacter = atoi(buffer);
log_msg("maxBackupPerCharacter\t\t= %u\n", maxBackupPerCharacter);
log_msg("\n");
}
void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_active_VersionTextChange, "0");
@ -449,29 +518,31 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_versionText, versionText);
if (!buffer[0])
{
switch(version_D2Game)
{
//case V107: //"v 1.07"
//case V108: //"v 1.08"
//case V109: //"v 1.09"
case V109b: //"v 1.09"
case V109d: //"v 1.09"
//case V110: //"v 1.10"
//case V111: //"v 1.11"
case V111b: //"v 1.11"
//case V112: //"v 1.12"
case V113c: //"v 1.13"
case V113d: //"v 1.13"
case V114a: //"v 1.14"
//case V114b: //"v 1.14b"
//case V114c: //"v 1.14c"
//case V114d: //"v 1.14d"
strcpy(buffer, "v ");
strcat(buffer, GetVersionString(version_D2Game));
break;
default:
active_VersionTextChange=0;
}
//switch(version_D2Game)
//{
////case V107: //"v 1.07"
////case V108: //"v 1.08"
////case V109: //"v 1.09"
//case V109b: //"v 1.09"
//case V109d: //"v 1.09"
////case V110: //"v 1.10"
////case V111: //"v 1.11"
//case V111b: //"v 1.11"
////case V112: //"v 1.12"
//case V113c: //"v 1.13"
//case V113d: //"v 1.13"
//case V114a: //"v 1.14"
////case V114b: //"v 1.14b"
////case V114c: //"v 1.14c"
////case V114d: //"v 1.14d"
// strcpy(buffer, "v ");
// strcat(buffer, GetVersionString(version_D2Game));
// break;
//default:
// active_VersionTextChange=0;
//}
}
versionText = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
@ -479,7 +550,7 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau
log_msg("versionText\t\t\t\t\t= %s\n", versionText);
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_modVersionColor, "0");
modVersionColor = atoi(buffer);
modVersionColor = getColor(buffer);
log_msg("modVersionColor\t\t\t\t= %u\n", modVersionColor);
}
@ -490,7 +561,7 @@ void init_VersionText(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau
if (active_PrintPlugYVersion)
{
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_colorOfPlugYVersion, "4");
colorOfPlugYVersion = atoi(buffer);
colorOfPlugYVersion = getColor(buffer);
log_msg("colorOfPlugYVersion\t\t\t= %u\n", colorOfPlugYVersion);
}
@ -510,11 +581,6 @@ void init_Stash(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile
if (active_multiPageStash)
{
active_PlayerCustomData = true;
// log_msg("active_PlayerCustomData\t\t= %d\n", active_PlayerCustomData);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSelfPages, "0");
maxSelfPages = atoi(buffer) - 1;
log_msg("maxSelfPages\t\t\t\t= %u\n", maxSelfPages);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_nbPagesPerIndex, "10");
nbPagesPerIndex = atoi(buffer);
@ -526,71 +592,179 @@ void init_Stash(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile
if (!nbPagesPerIndex2) nbPagesPerIndex2=100;
log_msg("nbPagesPerIndex2\t\t\t= %u\n", nbPagesPerIndex2);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSelfPages, "0");
maxSelfPages = atoi(buffer) - 1;
log_msg("maxSelfPages\t\t\t\t= %u\n", maxSelfPages);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_autoRenameStashPage, "0");
autoRenameStashPage = atoi(buffer) != 0;
log_msg("autoRenameStashPage\t\t\t= %d\n", autoRenameStashPage);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalNormalPageColor, "0");
PersonalNormalPageColor = getColor(buffer);
log_msg("PersonalNormalPageColor\t\t\t= %d\n", PersonalNormalPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalIndexPageColor, "12");
PersonalIndexPageColor = getColor(buffer);
log_msg("PersonalIndexPageColor\t\t\t= %d\n", PersonalIndexPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_PersonalMainIndexPageColor, "9");
PersonalMainIndexPageColor = getColor(buffer);
log_msg("PersonalMainIndexPageColor\t\t\t= %d\n", PersonalMainIndexPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedNormalPageColor, "4");
SharedNormalPageColor = getColor(buffer);
log_msg("SharedNormalPageColor\t\t\t= %d\n", SharedNormalPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedIndexPageColor, "8");
SharedIndexPageColor = getColor(buffer);
log_msg("SharedIndexPageColor\t\t\t= %d\n", SharedIndexPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_SharedMainIndexPageColor, "1");
SharedMainIndexPageColor = getColor(buffer);
log_msg("SharedMainIndexPageColor\t\t\t= %d\n", SharedMainIndexPageColor);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedStash, "0");
active_sharedStash = atoi(buffer) != 0;
log_msg("active_sharedStash\t\t\t= %u\n", active_sharedStash);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousBtn,"-1");
posXPreviousBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousBtn,"-1");
posYPreviousBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextBtn,"-1");
posXNextBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextBtn,"-1");
posYNextBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXSharedBtn,"-1");
posXSharedBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYSharedBtn,"-1");
posYSharedBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousIndexBtn,"-1");
posXPreviousIndexBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousIndexBtn,"-1");
posYPreviousIndexBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextIndexBtn,"-1");
posXNextIndexBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextIndexBtn,"-1");
posYNextIndexBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPutGoldBtn,"-1");
posXPutGoldBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPutGoldBtn,"-1");
posYPutGoldBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXTakeGoldBtn,"-1");
posXTakeGoldBtn = atoi(buffer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYTakeGoldBtn,"-1");
posYTakeGoldBtn = atoi(buffer);
log_msg("\t Buttons Positions: %d %d %d %d %d %d %d %d %d %d\n",posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn,posYSharedBtn,posXPreviousIndexBtn,posYPreviousIndexBtn,posXNextIndexBtn,posYNextIndexBtn);
}
if (active_sharedStash)
{
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_SharedStashInMultiPlayer, "0");
active_SharedStashInMultiPlayer = atoi(buffer) ? 2 : 1;
log_msg("active_SharedStashInMultiPlayer = %u\n", active_SharedStashInMultiPlayer);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_separateHardSoftStash, "1");
separateHardSoftStash = atoi(buffer) != 0;
log_msg("separateHardSoftStash\t\t= %u\n", separateHardSoftStash);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_openSharedStashOnLoading, "0");
openSharedStashOnLoading = atoi(buffer) != 0;
log_msg("openSharedStashOnLoading\t\t= %u\n", openSharedStashOnLoading);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSharedPages, "0");
maxSharedPages = atoi(buffer) - 1;
log_msg("maxSharedPages\t\t\t\t= %u\n", maxSharedPages);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_sharedStashFilename, "SharedStashSave");
sharedStashFilename = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
strcpy(sharedStashFilename, buffer);
log_msg("sharedStashFilename\t\t\t= %s\n", sharedStashFilename);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_separateHardSoftStash, "1");
separateHardSoftStash = atoi(buffer) != 0;
log_msg("separateHardSoftStash\t\t= %u\n", separateHardSoftStash);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_displaySharedSetItemNameInGreen, "1");
displaySharedSetItemNameInGreen = atoi(buffer) != 0;
log_msg("displaySharedSetItemNameInGreen = %u\n", displaySharedSetItemNameInGreen);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_maxSharedPages, "0");
maxSharedPages = atoi(buffer) - 1;
log_msg("maxSharedPages\t\t\t\t= %u\n", maxSharedPages);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedGold, "1");
active_sharedGold = atoi(buffer) != 0;
log_msg("active_sharedGold\t\t\t= %u\n", active_sharedGold);
}
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousBtn,"-1");
posXPreviousBtn = atoi(buffer);
log_msg("posXPreviousBtn\t\t\t= %d\n", posXPreviousBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousBtn,"-1");
posYPreviousBtn = atoi(buffer);
log_msg("posYPreviousBtn\t\t\t= %d\n", posYPreviousBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPreviousBtn,"32");
posWPreviousBtn = atoi(buffer);
log_msg("posWPreviousBtn\t\t\t= %d\n", posWPreviousBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPreviousBtn,"32");
posHPreviousBtn = atoi(buffer);
log_msg("posHPreviousBtn\t\t\t= %d\n", posHPreviousBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextBtn,"-1");
posXNextBtn = atoi(buffer);
log_msg("posXNextBtn\t\t\t= %d\n", posXNextBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextBtn,"-1");
posYNextBtn = atoi(buffer);
log_msg("posYNextBtn\t\t\t= %d\n", posYNextBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWNextBtn,"32");
posWNextBtn = atoi(buffer);
log_msg("posWNextBtn\t\t\t= %d\n", posWNextBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHNextBtn,"32");
posHNextBtn = atoi(buffer);
log_msg("posHNextBtn\t\t\t= %d\n", posHNextBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXSharedBtn,"-1");
posXSharedBtn = atoi(buffer);
log_msg("posXSharedBtn\t\t\t= %d\n", posXSharedBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYSharedBtn,"-1");
posYSharedBtn = atoi(buffer);
log_msg("posYSharedBtn\t\t\t= %d\n", posYSharedBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWSharedBtn,"32");
posWSharedBtn = atoi(buffer);
log_msg("posWSharedBtn\t\t\t= %d\n", posWSharedBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHSharedBtn,"32");
posHSharedBtn = atoi(buffer);
log_msg("posHSharedBtn\t\t\t= %d\n", posHSharedBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPreviousIndexBtn,"-1");
posXPreviousIndexBtn = atoi(buffer);
log_msg("posXPreviousIndexBtn\t\t\t= %d\n", posXPreviousIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPreviousIndexBtn,"-1");
posYPreviousIndexBtn = atoi(buffer);
log_msg("posYPreviousIndexBtn\t\t\t= %d\n", posYPreviousIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPreviousIndexBtn,"32");
posWPreviousIndexBtn = atoi(buffer);
log_msg("posWPreviousIndexBtn\t\t\t= %d\n", posWPreviousIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPreviousIndexBtn,"32");
posHPreviousIndexBtn = atoi(buffer);
log_msg("posHPreviousIndexBtn\t\t\t= %d\n", posHPreviousIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXNextIndexBtn,"-1");
posXNextIndexBtn = atoi(buffer);
log_msg("posXNextIndexBtn\t\t\t= %d\n", posXNextIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYNextIndexBtn,"-1");
posYNextIndexBtn = atoi(buffer);
log_msg("posYNextIndexBtn\t\t\t= %d\n", posYNextIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWNextIndexBtn,"32");
posWNextIndexBtn = atoi(buffer);
log_msg("posWNextIndexBtn\t\t\t= %d\n", posWNextIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHNextIndexBtn,"32");
posHNextIndexBtn = atoi(buffer);
log_msg("posHNextIndexBtn\t\t\t= %d\n", posHNextIndexBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXPutGoldBtn,"-1");
posXPutGoldBtn = atoi(buffer);
log_msg("posXPutGoldBtn\t\t\t= %d\n", posXPutGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYPutGoldBtn,"-1");
posYPutGoldBtn = atoi(buffer);
log_msg("posYPutGoldBtn\t\t\t= %d\n", posYPutGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWPutGoldBtn,"32");
posWPutGoldBtn = atoi(buffer);
log_msg("posWPutGoldBtn\t\t\t= %d\n", posWPutGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHPutGoldBtn,"32");
posHPutGoldBtn = atoi(buffer);
log_msg("posHPutGoldBtn\t\t\t= %d\n", posHPutGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXTakeGoldBtn,"-1");
posXTakeGoldBtn = atoi(buffer);
log_msg("posXTakeGoldBtn\t\t\t= %d\n", posXTakeGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYTakeGoldBtn,"-1");
posYTakeGoldBtn = atoi(buffer);
log_msg("posYTakeGoldBtn\t\t\t= %d\n", posYTakeGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWTakeGoldBtn,"32");
posWTakeGoldBtn = atoi(buffer);
log_msg("posWTakeGoldBtn\t\t\t= %d\n", posWTakeGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHTakeGoldBtn,"32");
posHTakeGoldBtn = atoi(buffer);
log_msg("posHTakeGoldBtn\t\t\t= %d\n", posHTakeGoldBtn);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXStashNameField,"-1");
posXStashNameField = atoi(buffer);
log_msg("posXStashNameField\t\t\t= %d\n", posXStashNameField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYStashNameField,"-1");
posYStashNameField = atoi(buffer);
log_msg("posYStashNameField\t\t\t= %d\n", posYStashNameField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWStashNameField,"175");
posWStashNameField = atoi(buffer);
log_msg("posWStashNameField\t\t\t= %d\n", posWStashNameField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHStashNameField,"20");
posHStashNameField = atoi(buffer);
log_msg("posHStashNameField\t\t\t= %d\n", posHStashNameField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posXStashGoldField,"-1");
posXStashGoldField = atoi(buffer);
log_msg("posXStashGoldField\t\t\t= %d\n", posXStashGoldField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posYStashGoldField,"-1");
posYStashGoldField = atoi(buffer);
log_msg("posYStashGoldField\t\t\t= %d\n", posYStashGoldField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posWStashGoldField,"152");
posWStashGoldField = atoi(buffer);
log_msg("posWStashGoldField\t\t\t= %d\n", posWStashGoldField);
GET_PRIVATE_PROFILE_STRING(S_STASH, S_posHStashGoldField,"18");
posHStashGoldField = atoi(buffer);
log_msg("posHStashGoldField\t\t\t= %d\n", posHStashGoldField);
}
log_msg("\n");
}
@ -620,7 +794,6 @@ void init_StatsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefau
log_msg("\n");
}
void init_StatPerLevelUp(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING(S_STAT_ON_LEVEL_UP, S_active_StatPerLevelUpChange, "0");
@ -642,15 +815,17 @@ void init_SkillsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa
active_SkillsPoints = atoi(buffer) != 0;
log_msg("active_SkillsPoints\t\t\t= %d\n", active_SkillsPoints);
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_unassignSkillsPointsOneByOne, "0");
unassignSkillsPointsOneByOne = atoi(buffer) != 0;
log_msg("unassignSkillsPointsOneByOne\t\t\t= %d\n", unassignSkillsPointsOneByOne);
if (unassignSkillsPointsOneByOne)
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_unassignSkillsPointsOneForOne, "0");
unassignSkillsPointsOneForOne = atoi(buffer) != 0;
log_msg("unassignSkillsPointsOneForOne\t\t\t= %d\n", unassignSkillsPointsOneForOne);
if (unassignSkillsPointsOneForOne)
{
active_SkillsPoints = true;
log_msg("active_SkillsPoints\t\t\t= %d\n", active_SkillsPoints);
}
if (active_SkillsPoints)
{
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posXUnassignSkillBtn,"-1");
posXUnassignSkillBtn = atoi(buffer);
log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posXUnassignSkillBtn);
@ -658,7 +833,7 @@ void init_SkillsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posYUnassignSkillBtn,"-1");
posYUnassignSkillBtn = atoi(buffer);
log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posYUnassignSkillBtn);
}
log_msg("\n");
}
@ -677,12 +852,11 @@ void init_SkillPerLevelUp(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniD
log_msg("\n");
}
void init_WorldEvent(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_active_WorldEvent, "0");
active_WorldEvent = atoi(buffer) != 0;
if (active_WorldEvent && ((version_D2Game == V109b) || (version_D2Game == V109d)) ) {
if (active_WorldEvent && version_D2Game < V110) {
active_WorldEvent = 0;
log_msg("active_WorldEvent\t\t\t= %d (Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent);
} else
@ -747,15 +921,102 @@ void init_UberQuest(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefault
{
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberQuest, "0");
active_UberQuest = atoi(buffer) != 0;
if (active_UberQuest && ((version_D2Game == V109b) || (version_D2Game == V109d) || (version_D2Game == V110)) ) {
if (active_UberQuest && version_D2Game < V111) {
active_UberQuest = 0;
log_msg("active_UberQuest\t\t= %d (Warning : this feature is only for LoD version 1.11 or higher, so it's automatically disabled)\n", active_UberQuest);
} else
log_msg("active_UberQuest\t\t\t= %d\n", active_UberQuest);
if (active_UberQuest)
{
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoX, "25130");
UberMephistoX = atoi(buffer);
log_msg("UberMephistoX\t\t= %d\n", UberMephistoX);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoY, "5143");
UberMephistoY = atoi(buffer);
log_msg("UberMephistoY\t\t= %d\n", UberMephistoY);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloX, "25139");
UberDiabloX = atoi(buffer);
log_msg("UberDiabloX\t\t= %d\n", UberDiabloX);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloY, "5139");
UberDiabloY = atoi(buffer);
log_msg("UberDiabloY\t\t= %d\n", UberDiabloY);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalX, "25139");
UberBaalX = atoi(buffer);
log_msg("UberBaalX\t\t= %d\n", UberBaalX);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalY, "5135");
UberBaalY = atoi(buffer);
log_msg("UberBaalY\t\t= %d\n", UberBaalY);
if (version_D2Game >= V113c)
{
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberMinions, "1");
active_UberMinions = atoi(buffer) != 0;
log_msg("active_UberMinions\t\t= %d\n", active_UberMinions);
//GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoMinions, "1");
//UberMephistoNbMinions = atoi(buffer);
//UberMephistoMinions = atoi(buffer);
//log_msg("ActiveUberMinions\t= %d\n", UberMephistoMinions);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoSpawnPercent, "80");
UberMephistoSpawnPercent = atoi(buffer);
log_msg("UberMephistoSpawnPercent\t\t= %d\n", UberMephistoSpawnPercent);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberMephistoSpawnRadius, "30");
UberMephistoSpawnRadius = atoi(buffer);
log_msg("UberMephistoSpawnRadius\t\t= %d\n", UberMephistoSpawnRadius);
//GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalMinions, "1");
//UberBaalNbMinions = atoi(buffer);
//UberBaalMinions = atoi(buffer);
//log_msg("UberBaalMinions\t\t= %d\n", UberBaalMinions);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalSpawnPercent, "30");
UberBaalSpawnPercent = atoi(buffer);
log_msg("UberBaalSpawnPercent\t\t= %d\n", UberBaalSpawnPercent);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberBaalSpawnRadius, "30");
UberBaalSpawnRadius = atoi(buffer);
log_msg("UberBaalSpawnRadius\t\t= %d\n", UberBaalSpawnRadius);
//GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloMinions, "1");
//UberDiabloNbMinions = atoi(buffer);
//UberDiabloMinions = atoi(buffer);
//log_msg("UberDiabloMinions\t\t= %d\n", UberDiabloMinions);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloSpawnPercent, "30");
UberDiabloSpawnPercent = atoi(buffer);
log_msg("UberDiabloSpawnPercent\t\t= %d\n", UberDiabloSpawnPercent);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_UberDiabloSpawnRadius, "30");
UberDiabloSpawnRadius = atoi(buffer);
log_msg("UberDiabloSpawnRadius\t\t= %d\n", UberDiabloSpawnRadius);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberDiabloRushTweekAI, "1");
active_UberDiabloRushTweekAI = atoi(buffer) != 0;
log_msg("active_UberDiabloRushTweekAI\t\t= %d\n", active_UberDiabloRushTweekAI);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberBaalTeleportTweekAI, "1");
active_UberBaalTeleportTweekAI = atoi(buffer) != 0;
log_msg("active_UberBaalTeleportTweekAI\t\t= %d\n", active_UberBaalTeleportTweekAI);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_active_UberBaalChillingArmorTweekAI, "1");
active_UberBaalChillingArmorTweekAI = atoi(buffer) != 0;
log_msg("active_UberBaalChillingArmorTweekAI\t\t= %d\n", active_UberBaalChillingArmorTweekAI);
GET_PRIVATE_PROFILE_STRING(S_UBER_QUEST, S_uberBaalChillingArmorTimer, "6000");
uberBaalChillingArmorTimer = atoi(buffer);
log_msg("uberBaalChillingArmorTimer\t\t= %d\n", uberBaalChillingArmorTimer);
}
}
log_msg("\n");
}
void init_NewInterfaces(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING(S_INTERFACE, S_active_newInterfaces, "0");
@ -775,11 +1036,14 @@ void init_NewInterfaces(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDef
log_msg("\n");
}
void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
{
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RunLODs, "0");
active_RunLODs = atoi(buffer) != 0;
log_msg("active_RunLODs\t\t\t\t= %u\n", active_RunLODs);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_alwaysRegenMapInSP, "0");
active_alwaysRegenMapInSP = atoi(buffer);
active_alwaysRegenMapInSP = atoi(buffer) != 0;
log_msg("active_alwaysRegenMapInSP\t= %d\n", active_alwaysRegenMapInSP);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0");
@ -790,42 +1054,54 @@ void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefa
log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0");
active_DisplayItemLevel = atoi(buffer);
active_DisplayItemLevel = atoi(buffer) != 0;
log_msg("active_DisplayItemLevel\t\t= %d\n", active_DisplayItemLevel);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_AlwaysDisplayLifeMana, "0");
active_AlwaysDisplayLifeMana = atoi(buffer);
log_msg("active_AlwaysDisplayLifeMana= %d\n", active_AlwaysDisplayLifeMana);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RunLODs, "0");
active_RunLODs = atoi(buffer);
log_msg("active_RunLODs\t\t\t\t= %u\n", active_RunLODs);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledTXTFilesWithMSExcel, "0");
active_EnabledTXTFilesWithMSExcel = atoi(buffer);
active_EnabledTXTFilesWithMSExcel = atoi(buffer) != 0;
log_msg("active_EnabledTXTFilesWithMSExcel= %u\n\n", active_EnabledTXTFilesWithMSExcel);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayBaseStatsValue, "0");
active_DisplayBaseStatsValue = atoi(buffer);
active_DisplayBaseStatsValue = atoi(buffer) != 0;
log_msg("active_DisplayBaseStatsValue= %u\n\n", active_DisplayBaseStatsValue);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_LadderRunewords, "0");
active_LadderRunewords = atoi(buffer);
if (active_LadderRunewords && (version_D2Common == V109b || version_D2Common == V109d) ) {
active_LadderRunewords = atoi(buffer) != 0;
if (active_LadderRunewords && version_D2Common < V110) {
active_LadderRunewords = 0;
log_msg("active_LadderRunewords\t= %d (Warning : Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent);
log_msg("active_LadderRunewords\t= %d (Warning : this feature is only for LoD version 1.10 or higher, so it's automatically disabled)\n", active_WorldEvent);
} else
log_msg("active_LadderRunewords\t= %u\n\n", active_LadderRunewords);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_EnabledCowPortalWhenCowKingWasKill, "0");
active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer);
active_EnabledCowPortalWhenCowKingWasKill = atoi(buffer) != 0;
log_msg("active_EnabledCowPortalWhenCowKingWasKill= %u\n\n", active_EnabledCowPortalWhenCowKingWasKill);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DoNotCloseNihlathakPortal, "0");
active_DoNotCloseNihlathakPortal = atoi(buffer);
active_DoNotCloseNihlathakPortal = atoi(buffer) != 0;
log_msg("active_DoNotCloseNihlathakPortal= %u\n\n", active_DoNotCloseNihlathakPortal);
}
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_MoveCainNearHarrogathWaypoint, "0");
active_MoveCainNearHarrogathWaypoint = atoi(buffer) != 0;
log_msg("active_MoveCainNearHarrogathWaypoint= %u\n\n", active_MoveCainNearHarrogathWaypoint);
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_RemoveExperienceDiminushingReturn, "0");
active_RemoveExperienceDiminushingReturn = atoi(buffer) != 0;
if (active_RemoveExperienceDiminushingReturn)
{
if (version_D2Common == V114d)
log_msg("active_RemoveExperienceDiminushingReturn= %u\n\n", active_RemoveExperienceDiminushingReturn);
else
{
active_RemoveExperienceDiminushingReturn = 0;
log_msg("active_RemoveExperienceDiminushingReturn\t= %d (Warning : this feature is only for LoD version 1.14d or higher, so it's automatically disabled)\n", active_RemoveExperienceDiminushingReturn);
}
}
}
void loadParameters()
@ -858,6 +1134,7 @@ void loadParameters()
if(loading)
{
log_msg("Reading parameters.\n\n");
init_ActivePlugin(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
if (active_plugin)
{

View File

@ -14,7 +14,7 @@
#include "loadPlayerData.h" //Install_LoadPlayerData()
#include "common.h"
bool active_PlayerCustomData = true;
bool active_PlayerCustomData = false;
bool openSharedStashOnLoading = false;
@ -29,7 +29,9 @@ Stash* getStashFromItem(Unit* ptChar, Unit* ptItem)
{
if (curStash == PCPY->currentStash)
curItem = D2InventoryGetFirstItem(PCInventory);
else curItem = curStash->ptListItem;
else
curItem = curStash->ptListItem;
while (curItem)
{
if (D2GetRealItem(curItem) == ptItem) return curStash;
@ -67,18 +69,26 @@ Unit* FASTCALL updateItem(Game* ptGame, DWORD type, DWORD itemNum, Unit* ptChar)
return ptItem;
}
void FASTCALL updateItem_111(Unit* ptItem, Unit* ptChar)
{
if (PCGame->isLODGame && (D2ItemGetPage(ptItem) == 4))
{
Stash* ptStash = getStashFromItem(ptChar, ptItem);
if (ptStash)
selectStash(ptChar, ptStash);
}
}
void STDCALL updateClientPlayerOnLoading(Unit* ptChar)
{
log_msg("--- Start updateClientPlayerOnLoading ---\n");
if (PCGame->isLODGame)
{
PCPY->showSharedStash = openSharedStashOnLoading;
selectStash(ptChar, openSharedStashOnLoading ? PCPY->sharedStash : PCPY->selfStash);
log_msg("End update client on loading.\n\n");
PCPY->showSharedStash = openSharedStashOnLoading && active_sharedStash;
selectStash(ptChar, PCPY->showSharedStash ? PCPY->sharedStash : PCPY->selfStash, true);
}
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
log_msg("End update client on loading.\n\n");
}
/**************************** INIT CUSTOM DATA ****************************/
@ -163,29 +173,10 @@ Unit* STDCALL getNextItemToFree(Unit* ptChar, Unit* ptItem)
/************************ INSTALL PLAYER CUSTOM DATA ****************************/
void FASTCALL updateItem_111(Unit* ptItem, Unit* ptChar)
{
if (PCGame->isLODGame && (D2ItemGetPage(ptItem) == 4))
{
Stash* ptStash = getStashFromItem(ptChar, ptItem);
if (ptStash)
selectStash(ptChar, ptStash);
}
}
FCT_ASM ( caller_updateItem_114 )
PUSH EAX
MOV EAX, 0x552F60
CALL EAX
PUSH EAX
PUSH ECX
PUSH EDX
MOV ECX, EAX
MOV EDX, EDI
CALL updateItem_111
POP EDX
POP ECX
POP EAX
PUSH EDI
PUSH DWORD PTR SS:[ESP+0x8]
CALL updateItem
RETN 4
}}
@ -199,22 +190,6 @@ FCT_ASM ( caller_updateItem_111 )
JMP EAX
}}
FCT_ASM( caller_updateItemB_114 )
PUSH EAX
MOV EAX, 0x552F60
CALL EAX
PUSH EAX
PUSH ECX
PUSH EDX
MOV ECX, EAX
MOV EDX, EDI
CALL updateItem_111
POP EDX
POP ECX
POP EAX
RETN 4
}}
FCT_ASM ( caller_updateItemB_111 )
MOV EDX,EBP
CALL updateItem_111
@ -262,7 +237,7 @@ FCT_ASM ( caller_updateClientPlayerOnLoading )
FCT_ASM ( callerServer_getNextItemToFree_114 )
PUSH DWORD PTR SS:[ESP+4]
PUSH DWORD PTR SS : [ESP + 0x10]
PUSH DWORD PTR SS:[EBP-8]
CALL getNextItemToFree
RETN 4
}}
@ -290,7 +265,7 @@ FCT_ASM ( callerServer_getNextItemToFree_9 )
FCT_ASM ( callerClient_getNextItemToFree_114 )
PUSH DWORD PTR SS:[ESP+4]
PUSH DWORD PTR SS : [ESP + 0xC]
PUSH DWORD PTR SS:[EBP-4]
CALL getNextItemToFree
RETN 4
}}
@ -320,7 +295,7 @@ FCT_ASM ( callerClient_getNextItemToFree_9 )
void Install_PlayerCustomData()
{
static int isInstalled = false;
if (isInstalled || !active_PlayerCustomData) return;
if (isInstalled) return;
Install_SavePlayerData();
Install_LoadPlayerData();
@ -330,28 +305,21 @@ void Install_PlayerCustomData()
// Initialize custom data.
mem_seek(version_D2Client == V114d ? offset_D2Common + 0x221FDD : version_D2Client == V113d ? offset_D2Common + 0x170DE : version_D2Client == V113c ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 );
if (version_D2Client == V114d) {
MEMT_REF4(0xFFDE944F, init_PlayerCustomData);
} else {
MEMJ_REF4( D2AllocMem, init_PlayerCustomData);
}
//01BD0381 |. E8 C03F0000 CALL <JMP.&Fog.#10045>
//6FD9ED5D |. E8 94A4FBFF CALL <JMP.&Fog.#10045>
//6FDABFCD |. E8 34D2FAFF CALL <JMP.&Fog.#10045>
//6FDA85ED |. E8 240CFBFF CALL <JMP.&Fog.#10045>
//6FD809BD |. E8 6088FDFF CALL <JMP.&Fog.#10045>
//6FD670DD |. E8 0C3EFFFF CALL <JMP.&Fog.#10045>
//00621FDC |. E8 4F94DEFF CALL Game.0040B430 ; \Game.0040B430
if ( version_D2Game >= V111 )
if ( version_D2Game >= V111 && version_D2Game <= V113d)
{
// update item
mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81, 1978F3);
if (version_D2Game == V114d) {
MEMT_REF4(0xFFFBB669, caller_updateItem_114);
} else {
mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91, 75C81, 0000);
memt_byte( 0x8B ,0xE8); // CALL
MEMT_REF4( 0x52182454, caller_updateItem_111);
}
//0200BC71 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
//0200BC75 |. 52 |PUSH EDX ; /Arg1
//02023C51 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
@ -363,13 +331,9 @@ void Install_PlayerCustomData()
//6FC95C81 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
//6FC95C85 |. 52 |PUSH EDX
mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1, 197943);
if (version_D2Game == V114d) {
MEMT_REF4(0xFFFBB619, caller_updateItemB_114);
} else {
mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1, 75CE1, 0000);
memt_byte( 0x8B ,0xE8); // CALL
MEMT_REF4( 0x52182454, caller_updateItemB_111);
}
//0200BCD1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
//0200BCD5 |. 52 ||PUSH EDX ; /Arg1
//02023CB1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
@ -383,23 +347,20 @@ void Install_PlayerCustomData()
} else {
// update item
mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000, 0000);
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
mem_seek R8(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000, 0000, 1978F3);
MEMC_REF4( D2GameGetObject, version_D2Game >= V114a ? caller_updateItem_114 : version_D2Game >= V110 ? caller_updateItem : caller_updateItem_9);
//6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00
mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000, 0000);
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
//005978F2 |. E8 69B6FBFF |CALL Game.00552F60 ; \Game.00552F60
mem_seek R8(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000, 0000, 197943);
MEMC_REF4( D2GameGetObject, version_D2Game >= V114a ? caller_updateItem_114 : version_D2Game >= V110 ? caller_updateItem : caller_updateItem_9);
//6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00
//00597942 |. E8 19B6FBFF |CALL Game.00552F60 ; \Game.00552F60 //005978F2 |. E8 69B6FBFF |CALL Game.00552F60 ; \Game.00552F60
}
// Update client on loading
mem_seek R8(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12, E7548, 139A20);//6FC325D4-6FC30000
if (version_D2Game == V114d) {
memt_byte( 0x5F ,0xE8); // CALL
MEMT_REF4(0x5BC0335E, caller_updateClientPlayerOnLoading_114);
} else {
memt_byte(0x5F, 0xE8); // CALL
MEMT_REF4(0xC0335D5E, caller_updateClientPlayerOnLoading);
}
MEMT_REF4( version_D2Game >= V114d ? 0x5BC0335E : 0xC0335D5E , version_D2Game >= V114d ? caller_updateClientPlayerOnLoading_114 : caller_updateClientPlayerOnLoading);
//6FC325D4 |> 5F POP EDI
//6FC325D5 |. 5E POP ESI
//6FC325D6 |. 5D POP EBP
@ -424,49 +385,43 @@ void Install_PlayerCustomData()
//6FD07549 |. 5E POP ESI
//6FD0754A |. 5D POP EBP
//6FD0754B |. 33C0 XOR EAX,EAX
//00539A20 |> 5F POP EDI
//00539A21 |. 5E POP ESI
//00539A22 |. 33C0 XOR EAX,EAX
//00539A24 |. 5B POP EBX
// Free custom data.
mem_seek R8(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D, 1705D, 2220DD);
if (version_D2Common == V114d) {
MEMT_REF4(0xFFDE939F, free_PlayerCustomData);
} else {
MEMJ_REF4( D2FreeMem, free_PlayerCustomData);
}
//01BD0482 |. E8 C53E0000 CALL <JMP.&Fog.#10046>
//6FD9F82C |. E8 E399FBFF CALL <JMP.&Fog.#10046>
//6FDAC9CC |. E8 3BC8FAFF CALL <JMP.&Fog.#10046>
//6FDA856C |. E8 E70CFBFF CALL <JMP.&Fog.#10046>
//6FD8093C |. E8 E788FDFF CALL <JMP.&Fog.#10046>
//6FD6705C |. E8 CF3EFFFF CALL <JMP.&Fog.#10046>
//006220DC |. E8 9F93DEFF CALL Game.0040B480 ; \Game.0040B480
// Free item in Stash (Server-side)
mem_seek R8(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162, 6F7C2, 155B34);
if (version_D2Game == V114d) {
MEMT_REF4(0x000E8468, callerServer_getNextItemToFree_114);
} else {
MEMJ_REF4(D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204
}
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V114a ? callerServer_getNextItemToFree_114 : version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204
//6FCBD5A3 . E8 04E20500 CALL <JMP.&D2Common.#10304>
//02019111 |. E8 5016F7FF |CALL <JMP.&D2Common.#10934>
//0202FDB1 |. E8 30AAF4FF |CALL <JMP.&D2Common.#11140>
//6FCB4241 |. E8 8862F7FF |CALL <JMP.&D2Common.#10770>
//6FD01161 |. E8 6693F2FF |CALL <JMP.&D2Common.#10464>
//6FC8F7C1 |. E8 44AEF9FF |CALL <JMP.&D2Common.#10879>
//00555B33 |. E8 68840E00 |CALL Game.0063DFA0 ; \Game.0063DFA0
// Free item in Stash (Client-side)
mem_seek R8(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94, 621E4, 66D02);//6FB29B31-6FAA0000
if (version_D2Client == V114d) {
MEMT_REF4(0x001D729A, callerClient_getNextItemToFree_114);
} else {
MEMJ_REF4(D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34
}
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V114d ? callerClient_getNextItemToFree_114 : version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34
//6FB29B31 E8 340F0400 CALL <JMP.&D2Common.#10304>
//6FAD6403 |. E8 925DFEFF |CALL <JMP.&D2Common.#10934>
//6FAFC263 |. E8 38FFFBFF |CALL <JMP.&D2Common.#11140>
//6FACF2D3 |. E8 4CD1FEFF |CALL <JMP.&D2Common.#10770>
//6FB55C93 |. E8 D068F6FF |CALL <JMP.&D2Common.#10464>
//6FB121E3 |. E8 7AA1FAFF |CALL <JMP.&D2Common.#10879>
//00466D01 E8 9A721D00 |CALL Game.0063DFA0
if ( version_D2Common >= V110 )
{
@ -479,6 +434,7 @@ void Install_PlayerCustomData()
//6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1
//6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31
//6FD8B392 |. 74 0D JE SHORT D2Common.6FD8B3A1
//0063ADB4 |. 74 0E JE SHORT Game.0063ADC4
} else {
mem_seek R8(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
memt_byte( 0x74 , 0x90);//MOV EAX,EDI

Binary file not shown.

View File

@ -1,39 +1,18 @@

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

Binary file not shown.

View File

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

View File

@ -30,12 +30,14 @@ DWORD STDCALL isModFile (char* filename)
{
if (strstr(filename, modDataDirectory) )
{
log_msg("Load custom file : %s\n", filename);
if ((GetFileAttributesA(filename) & 0x10) == 0)
return true;
char fileTemp[0x104];
log_msg("Load custom file : %s", filename);
strcpy(fileTemp,filename);
D2FogGetInstallPath(filename,0x104-strlen(filename));
strcat(filename,fileTemp);
log_msg("-> %s\n", filename);
log_msg("Load custom file full path : %s\n", filename);
if ((GetFileAttributesA(filename) & 0x10) == 0)
return true;
}
@ -43,6 +45,17 @@ DWORD STDCALL isModFile (char* filename)
}
DWORD STDCALL isModFile_114 (char* filename)
{
if (strstr(filename, modDataDirectory) )
{
log_msg("Load custom file : %s\n", filename);
if ((GetFileAttributesA(filename) & 0x10) == 0)
return true;
}
return false;
}
FCT_ASM ( caller_isModFile )
TEST ESI,ESI
JNZ ISNOTMODDATA
@ -79,17 +92,36 @@ FCT_ASM ( caller_isModFile_111 )
ISNOTMODDATA:
JMP DWORD PTR CS:[LeaveCriticalSection]
}}
/*
FCT_ASM ( caller_isModFile_114 )
PUSH EBX
TEST ESI,ESI
JNZ ISNOTMODDATA
MOV ESI, DWORD PTR SS:[ESP+0x130]
PUSH ESI
CALL isModFile
TEST EAX,EAX
JE ISNOTMODDATA
MOV EDX, 0x00100001
JMP ALLDONE
MOV BL, BYTE PTR SS:[ESP+0x134]
POP EAX
POP EAX
MOV EAX,D2StormMPQOpenFile
ADD EAX,0x93
MOV EBP,GetFileAttributesA
JMP EAX
ISNOTMODDATA:
JMP DWORD PTR CS:[LeaveCriticalSection]
}}
*/
FCT_ASM( caller_isModFile_114 )
PUSH EDX
PUSH EBX
CALL isModFile_114
POP EDX
TEST EAX,EAX
JE ISNOTMODDATA
MOV EDX,1 // Active -direct command
ISNOTMODDATA:
MOV EDX, DWORD PTR SS : [EBP + 0x10]
ALLDONE :
LEA EAX,DWORD PTR SS:[EBP-0x108]
RETN
}}
@ -103,23 +135,24 @@ void Install_PlugYFiles()
// Try in Diablo II\PlugY\ if file not found
mem_seek R8(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89, 2DA79, 19369);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) );
memt_byte( version_D2Client == V114d ? 0x8D : 0xFF ,0x90); // NOP
memt_byte( version_D2Client == V114d ? 0x85 : 0x15 ,0xE8); // CALL
if (version_Storm == V114d)
if ( version_Storm >= V114a )
{
memt_byte( 0x8D ,0x90); // NOP
memt_byte( 0x85 ,0xE8); // CALL
MEMT_REF4(0xFFFFFEF8, caller_isModFile_114);
}
else
{
MEMD_REF4(LeaveCriticalSection, version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile);
}
//00419369 |. 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108]
} else {
memt_byte( 0xFF ,0x90); // NOP
memt_byte( 0x15 ,0xE8); // CALL
MEMD_REF4( LeaveCriticalSection, version_Storm >= V114a ? caller_isModFile_114 : version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile);
//6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//6FC1DA79 |. FF15 3C32C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
//0041BC81 |. FF15 14C26C00 CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
}
log_msg("\n" );
@ -158,23 +191,23 @@ void STDCALL loadCustomImages()
if ( active_newInterfaces ) loadImagesFile(&statsBackgroundImages, "StatsBackground");
}
#define freeImagesFile(I) if(I) {D2FreeImage(I);I=NULL;}
#define FREE_IMAGE_FILE(I) if(I) {D2FreeImage(I);I=NULL;}
void STDCALL freeCustomImages()
{
freeImagesFile(unassignSkillsBtnImages);
freeImagesFile(unassignStatsBtnImages);
freeImagesFile(stashBtnsImages);
freeImagesFile(sharedGoldBtnsImages);
freeImagesFile(newStatsInterfaceImages);
freeImagesFile(statsBackgroundImages);
FREE_IMAGE_FILE(unassignSkillsBtnImages);
FREE_IMAGE_FILE(unassignStatsBtnImages);
FREE_IMAGE_FILE(stashBtnsImages);
FREE_IMAGE_FILE(sharedGoldBtnsImages);
FREE_IMAGE_FILE(newStatsInterfaceImages);
FREE_IMAGE_FILE(statsBackgroundImages);
}
FCT_ASM ( caller_loadCustomImages_114 )
PUSH ECX
CALL loadCustomImages
POP EAX
PUSH 0x6CC8B8
JMP EAX
POP ECX
JMP D2LoadResImage
}}
FCT_ASM ( caller_loadCustomImages )
@ -185,9 +218,8 @@ FCT_ASM ( caller_loadCustomImages )
FCT_ASM ( caller_freeCustomImages_114 )
CALL freeCustomImages
POP EAX
PUSH 0x7BEF30
JMP EAX
CALL D2FreeResImages
RETN
}}
FCT_ASM ( caller_freeCustomImages )
@ -206,26 +238,38 @@ void Install_PlugYImagesFiles()
log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n");
// Load custom images
mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 96955);
memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68), 0xE8);
MEMT_REF4(version_D2Client == V114d ? 0x006CC8B8 : 0x0000000C, version_D2Client == V114d ? caller_loadCustomImages_114 : caller_loadCustomImages);
mem_seek R8(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE, 6E0BE, 9692F);
if (version_D2Client == V114d)
{
MEMC_REF4( D2LoadResImage , caller_loadCustomImages_114);
//0049692E |. E8 8DB7FBFF CALL Game.004520C0
} else {
memt_byte( 0xB9 ,0xE8);
MEMT_REF4( 0x0000000C , caller_loadCustomImages);
//6FAFE4B1 |. B9 0C000000 MOV ECX,0C
//6FADE101 |. B9 0C000000 MOV ECX,0C
//6FB667E1 |. B9 0C000000 MOV ECX,0C
//6FB32761 |. B9 0C000000 MOV ECX,0C
//6FAD7EAE |. B9 0C000000 MOV ECX,0C
//6FB1E0BE |. B9 0C000000 MOV ECX,0C
}
// Free custom images
mem_seek R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 96AFB);
memt_byte(V8(D2Client, B9, B9, B9, B9, B9, B9, B9, B9, 68),0xE8);
MEMT_REF4(version_D2Client == V114d ? 0x007BEF30 : 0x0000000C, version_D2Client == V114d ? caller_freeCustomImages_114 : caller_freeCustomImages);
mem_seek R8(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D, 6D07D, 56DED);
if (version_D2Client == V114d)
{
MEMC_REF4( D2FreeResImages , caller_freeCustomImages_114);
//00456DEC . E8 9FFB0300 CALL Game.00496990
} else {
memt_byte( 0xB9 ,0xE8);
MEMT_REF4( 0x0000000C , caller_freeCustomImages);
//6FAFE639 |> B9 0C000000 MOV ECX,0C
//6FADD12D |> B9 0C000000 MOV ECX,0C
//6FB6580D |> B9 0C000000 MOV ECX,0C
//6FB3158D |> B9 0C000000 MOV ECX,0C
//6FAD6F8D |> B9 0C000000 MOV ECX,0C
//6FB1D07D |> B9 0C000000 MOV ECX,0C
}
log_msg("\n" );
@ -234,12 +278,36 @@ void Install_PlugYImagesFiles()
/****************************************************************************************************/
/*char* STDCALL isModCompileFile (char* filename)
{
if (strstr(filename, modDataDirectory) )
return ".";
return NULL;
}
char * fff = "%s";
FCT_ASM( caller_compileExcel_114 )
PUSH ECX
PUSH EDX
PUSH EDX
CALL isModCompileFile
POP EDX
POP ECX
TEST EAX,EAX
JE ISNOTMODDATA
POP EAX
MOV DWORD PTR SS:[ESP],EDX
PUSH fff
ADD EAX,5
PUSH EAX
ISNOTMODDATA:
LEA EAX,DWORD PTR SS:[EBP-0x108]
RETN
}}*/
void loadStatsInterfaceDesc(DWORD mempool);
void freeStatsInterfaceDesc();
void FASTCALL loadTxtFiles(DWORD mempool)
{
loadStatsInterfaceDesc(mempool);
@ -268,7 +336,6 @@ FCT_ASM ( caller_freeTxtFiles )
JMP D2Fog10212
}}
void Install_PlugYTxtFiles()
{
static int isInstalled = false;
@ -282,7 +349,7 @@ void Install_PlugYTxtFiles()
// Load custom txt files
mem_seek R8(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4, 855E4, 25A560);
MEMC_REF4( D2LoadSuperuniques, version_D2Common == V114d ? caller_loadTxtFiles : version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles );
MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 && version_D2Common < V114a ? caller_loadTxtFiles_111 : caller_loadTxtFiles );
//6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500
//6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510
//01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0
@ -291,14 +358,11 @@ void Install_PlugYTxtFiles()
//6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0
//6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870
//6FDD55E3 |. E8 58B6FFFF CALL D2Common.6FDD0C40 ; \D2Common.6FDD0C40
//0065A55F |. E8 7CADFFFF CALL Game.006552E0
// Free custom txt files
mem_seek R8(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3, FAA3, 25A1C8);
if (version_D2Common == V114d) {
MEMT_REF4(0x00062EE4, caller_freeTxtFiles);
} else {
MEMJ_REF4( D2Fog10212, caller_freeTxtFiles );
}
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
//6FD479EB . E8 C8C00600 CALL <JMP.&Fog.#10212>
//01B50185 |. E8 F8410700 CALL <JMP.&Fog.#10212>
@ -307,6 +371,16 @@ void Install_PlugYTxtFiles()
//6FD94E12 |. E8 1744FCFF CALL <JMP.&Fog.#10212>
//6FDAE8B2 |. E8 8FA9FAFF CALL <JMP.&Fog.#10212>
//6FD5FAA2 |. E8 5FB4FFFF CALL <JMP.&Fog.#10212>
//0065A1C7 . E8 E42E0600 CALL Game.006BD0B0 ; \Game.006BD0B0
/*if ( version_D2Client >= V114a )
{
mem_seek R8(Storm, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 2122A2);
memt_byte( 0x8D ,0x90); // NOP
memt_byte( 0x85 ,0xE8); // CALL
MEMT_REF4(0xFFFFFEF8, caller_compileExcel_114);
//006122A2 |. 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108] ; |
}*/
log_msg("\n" );

View File

@ -83,10 +83,14 @@ FCT_ASM( changeSavePath_114 )
POP EDX
POP EDI
POP EAX
PUSH EBX
CALL DWORD PTR[GetFileAttributesA]
CMP EAX,-1
JE DONOT_JMP
ADD DWORD PTR SS : [ESP], 5
ADD DWORD PTR SS:[ESP],0x5
RETN
DONOT_JMP:
ADD DWORD PTR SS:[ESP],0x1D
RETN
}}
@ -129,28 +133,6 @@ DONOT_JMP:
RETN
}}
FCT_ASM( forCreateSavePath_114 )
PUSH EDI
MOV ESI, EBX
MOV EDI, DWORD PTR DS : [savePath]
MOV ECX, EDI
CMP BYTE PTR DS : [EDI + 1], ':'
JNZ END_CREATESP
PUSH ESI
XOR AL, AL
CLD
OR ECX, 0xFFFFFFFF
REPNE SCAS BYTE PTR ES : [EDI]
NOT ECX
SUB EDI, ECX
XCHG EDI, ESI
REP MOVS BYTE PTR ES : [EDI], BYTE PTR DS : [ESI]
POP ESI
END_CREATESP :
POP EDI
MOV DWORD PTR SS : [ESP + 8], ECX
JMP D2Storm503
}}
FCT_ASM ( forCreateSavePath )
PUSH EDI
@ -175,7 +157,6 @@ END_CREATESP:
}}
void Install_ChangingSavePath()
{
static int isInstalled = false;
@ -185,7 +166,7 @@ void Install_ChangingSavePath()
if (version_Fog >= V111)
{
// Appel de notre fct d'ajout d'un sous-r<>pertoire
// Call funtion to manage subfolder
mem_seek R8(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86, 1E146, 71A6);
memt_byte( 0x83 ,0xE8); // CALL changeSavePath
MEMT_REF4( 0x0575FFF8, version_Fog == V114d ? changeSavePath_114 : changeSavePath_111);
@ -199,20 +180,21 @@ void Install_ChangingSavePath()
//6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90
//6FF6E146 . 83F8 FF CMP EAX,-1
//6FF6E149 . 75 05 JNZ SHORT Fog.6FF50F64
//004071A6 |. 83F8 FF CMP EAX,-1
//004071A9 |. 75 05 JNZ SHORT Game.004071B0
// Pour cr<63>er le bon chemin de sauvegarde
// Create the right save path
if (version_Fog < V114a)
{
mem_seek R8(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6, 1E166, 71CA);
if (version_Fog == V114d) {
MEMT_REF4(0x0000C582, forCreateSavePath_114);
} else {
MEMJ_REF4( D2Storm503, forCreateSavePath);
}
//6FF68615 . E8 A246FFFF CALL <JMP.&Storm.#503>
//6FF6C125 . E8 C20BFFFF CALL <JMP.&Storm.#503>
//6FF6F0A5 . E8 34DDFEFF CALL <JMP.&Storm.#503>
//6FF67FA5 . E8 504EFFFF CALL <JMP.&Storm.#503>
//6FF6E165 . E8 6AEBFEFF CALL <JMP.&Storm.#503>
//004071C9 |. E8 82C50000 CALL Game.00413750 ; \Game.00413750
}
// Remove registry update
mem_seek R8(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA, 1E16A, 71E9);
@ -238,10 +220,10 @@ void Install_ChangingSavePath()
//6FF67FAB . 6A 00 PUSH 0
//6FF6E16A . 56 PUSH ESI
//6FF6E16B . 6A 00 PUSH 0
//004071E9 |> 53 PUSH EBX ; /Arg4
//004071EA |. 6A 01 PUSH 1 ; |Arg3 = 00000001
} else {
// Appel de notre fct d'ajout d'un sous-r<>pertoire
// Call funtion to manage subfolder
mem_seek( (DWORD)D2FogGetSavePath + 0x28);//6FF61928-6FF50000
memt_byte( 0x56 ,0x90); // NOP
memt_byte( 0xFF ,0xE8); // CALL changeSavePath
@ -250,7 +232,7 @@ void Install_ChangingSavePath()
//6FF61929 FFD5 CALL EBP
//6FF6192B 83F8 FF CMP EAX,-1
// Pour cr<63>er le bon chemin de sauvegarde
// Create the right save path
mem_seek( (DWORD)D2FogGetSavePath + 0xBD);//6FF619BC
MEMJ_REF4( D2Storm503, forCreateSavePath);
//6FF619BC . E8 5D2A0000 CALL <JMP.&Storm.#503>

View File

@ -1,17 +1,158 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Save Player Custom Data.
=================================================================*/
#include <time.h>
#include <stdio.h>
#include "infinityStash.h"
#include "extendedSaveFile.h"
#include "sharedSaveFile.h"
#include "common.h"
bool active_AutoBackup = false;
int maxBackupPerCharacter = 5;
/*backup
Save SP :
00530441 |. E8 CAC5FFFF CALL Game.0052CA10
0052CA5A |. E8 A1590000 |CALL Game.00532400 ; \Game.00532400
005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240
00532275 |. E8 B6C95256 CALL PlugY.caller_SaveSPPlayerCustomData
00530503 |. E8 98980000 |CALL Game.00539DA0
00539E03 . E8 F82AFFFF CALL Game.0052C900
0052C93B |. E8 C05A0000 CALL Game.00532400 ; \Game.00532400
005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240
00532275 |. E8 B6C95256 CALL PlugY.caller_SaveSPPlayerCustomData
Save MP :
00530441 |. E8 CAC5FFFF CALL Game.0052CA10
0052CA5A |. E8 A1590000 |CALL Game.00532400 ; \Game.00532400
005324FD |. E8 3EFEFFFF CALL Game.00532340 ; \Game.00532340
00532399 |. E8 62D15256 CALL PlugY.caller_SendSaveFilesToSave_11>
00530503 |. E8 98980000 |CALL Game.00539DA0
00539E03 . E8 F82AFFFF CALL Game.0052C900
0052C93B |. E8 C05A0000 CALL Game.00532400 ; \Game.00532400
005324FD |. E8 3EFEFFFF CALL Game.00532340 ; \Game.00532340
*/
void backupSaveFiles(char* name, int isHardCoreGame)
{
if (!active_AutoBackup)
return;
char savePath[MAX_PATH];
char backupPath[MAX_PATH];
char szSaveName[MAX_PATH];
char szBackupName[MAX_PATH];
D2FogGetSavePath(savePath, MAX_PATH);
// backupfiles
time_t t = time(NULL);
struct tm* tm = localtime(&t);
sprintf(backupPath, "%sbackup", savePath);
CreateDirectory(backupPath, NULL);
sprintf(backupPath, "%sbackup\\%s_%04d%02d%02d_%02d%02d%02d\\", savePath, name, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
CreateDirectory(backupPath, NULL);
log_msg("backup directory:%s isHardcore:%d\n", backupPath, isHardCoreGame);
sprintf(szSaveName, "%s%s.d2s", savePath, name);
sprintf(szBackupName, "%s%s.d2s", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.d2x", savePath, name);
sprintf(szBackupName, "%s%s.d2x", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.ma0", savePath, name);
sprintf(szBackupName, "%s%s.ma0", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.ma1", savePath, name);
sprintf(szBackupName, "%s%s.ma1", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.ma2", savePath, name);
sprintf(szBackupName, "%s%s.ma2", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.ma3", savePath, name);
sprintf(szBackupName, "%s%s.ma3", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
sprintf(szSaveName, "%s%s.map", savePath, name);
sprintf(szBackupName, "%s%s.map", backupPath, name);
CopyFile(szSaveName, szBackupName, true);
if (separateHardSoftStash && isHardCoreGame != 0)
{
sprintf(szSaveName, "%s%s%s.sss", savePath, "_LOD_HC_", sharedStashFilename);
sprintf(szBackupName, "%s%s%s.sss", backupPath, "_LOD_HC_", sharedStashFilename);
CopyFile(szSaveName, szBackupName, true);
}
if (!separateHardSoftStash || isHardCoreGame != 1)
{
sprintf(szSaveName, "%s%s%s.sss", savePath, separateHardSoftStash && isHardCoreGame != 0? "_LOD_HC_" : "_LOD_", sharedStashFilename);
sprintf(szBackupName, "%s%s%s.sss", backupPath, separateHardSoftStash && isHardCoreGame != 0? "_LOD_HC_" : "_LOD_", sharedStashFilename);
CopyFile(szSaveName, szBackupName, true);
}
// delete older backup
if (maxBackupPerCharacter > 0)
{
sprintf(szBackupName, "%sbackup\\%s_*", savePath, name);
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(szBackupName, &FindFileData);
if (hFind)
{
// Count nb backup folders
int nbFolders = (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;
while(FindNextFile(hFind, &FindFileData))
nbFolders += (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;
// delete nbFolders - maxfolder
log_msg("Backup nbFolders: %d\n", nbFolders);
nbFolders -= maxBackupPerCharacter;
if (nbFolders > 0)
{
hFind = FindFirstFile(szBackupName, &FindFileData);
do
{
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
sprintf(backupPath, "%sbackup\\%s\\", savePath, FindFileData.cFileName);
log_msg("Delete backup : %s\n", backupPath);
sprintf(szBackupName, "%s%s.d2s", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.d2x", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.ma0", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.ma1", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.ma2", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.ma3", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s%s.map", backupPath, name);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s_LOD_%s.sss", backupPath, sharedStashFilename);
DeleteFile(szBackupName);
sprintf(szBackupName, "%s_LOD_HC_%s.sss", backupPath, sharedStashFilename);
DeleteFile(szBackupName);
RemoveDirectory(backupPath);
nbFolders--;
}
FindNextFile(hFind, &FindFileData);
}
while (nbFolders > 0);
}
}
}
}
void STDCALL SaveSPPlayerCustomData(Unit* ptChar)
{
@ -19,6 +160,11 @@ void STDCALL SaveSPPlayerCustomData(Unit* ptChar)
log_msg("\n--- Start SaveSPPlayerCustomData ---\n");
NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
backupSaveFiles(PCPlayerData->name, ptClient->isHardCoreGame);
if (active_PlayerCustomData)
{
if (PCPY->selfStashIsOpened)
{
DWORD curSizeExt = 0;
@ -38,27 +184,45 @@ void STDCALL SaveSPPlayerCustomData(Unit* ptChar)
d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__);
saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr);
NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, ptClient->isHardCoreGame );
D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0);
}
}
log_msg("End saving.\n\n");
}
FCT_ASM ( caller_SaveSPPlayerCustomData_114 )
CALL D2FogGetSavePath
PUSH EDI
MOV EAX,DWORD PTR SS:[ESP+8]
TEST EAX,EAX
JE next
PUSH ECX
PUSH EDX
PUSH EDX
CALL SaveSPPlayerCustomData
RETN
POP EDX
POP ECX
next:
JMP D2SaveSPChar
}}
FCT_ASM ( caller_SaveSPPlayerCustomData_111 )
MOV EAX,DWORD PTR SS:[ESP+0x14]
TEST EAX,EAX
JE next
PUSH DWORD PTR SS:[ESP+0x8]
CALL SaveSPPlayerCustomData
next:
JMP D2SaveSPChar
}}
/*FCT_ASM ( caller_SaveSPPlayerCustomData_111 )
CALL D2FogGetSavePath
PUSH DWORD PTR SS:[ESP+0x2608]
CALL SaveSPPlayerCustomData
RETN
}}
}}*/
FCT_ASM ( caller_SaveSPPlayerCustomData )
CALL D2FogGetSavePath
@ -193,7 +357,7 @@ void STDCALL SendSaveFilesToSave( Unit* ptChar )
dataToSend->sizeShared = curSizeShr;
dataToSend->curShared = 0;
dataToSend->dataShared = dataShr;
log_msg("clientID=%d\t init=%d\t sizeExtended=%X\t curExtended=%X\t dataExtended=%X\t sizeShared=%X\t curShared=%X\t dataShared=%08X\n",
log_msg("SendSaveFilesToSave : clientID=%d\t init=%d\t sizeExtended=%d\t curExtended=%d\t dataExtended=%d\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n",
dataToSend->clientID, dataToSend->init, dataToSend->sizeExtended, dataToSend->curExtended, dataToSend->dataExtended, dataToSend->sizeShared, dataToSend->curShared, dataToSend->dataShared);
/* NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
@ -208,19 +372,19 @@ void STDCALL SendSaveFilesToSave( Unit* ptChar )
D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0);
}
*/
log_msg("End SendSaveFilesToSave.\n\n");
log_msg("SendSaveFilesToSave : End\n\n");
}
DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
{
log_msg("ManageNextPacketToSend: ");
log_msg("ManageNextPacketToSend\n");
s_dataToSend* dataToSend = ptDataToSend;
while (dataToSend && (dataToSend->clientID != ptClient->clientID))
dataToSend = dataToSend->next;
if (!dataToSend) return 1;
log_msg("clientID=%d\t init=%d\t sizeExtended=%X\t curExtended=%X\t dataExtended=%X\t sizeShared=%X\t curShared=%X\t dataShared=%08X\n",
log_msg("ManageNextPacketToSend : clientID=%d\t init=%d\t sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n",
dataToSend->clientID, dataToSend->init, dataToSend->sizeExtended, dataToSend->curExtended, dataToSend->dataExtended, dataToSend->sizeShared, dataToSend->curShared, dataToSend->dataShared);
if (dataToSend->sizeExtended && dataToSend->dataExtended && (dataToSend->curExtended < dataToSend->sizeExtended))
@ -234,7 +398,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
msg->isCustom = true;
msg->packSize = remainingData > 0xFE ? 0xFF : (BYTE)remainingData + 1;
CopyMemory(msg->data, &dataToSend->dataExtended[dataToSend->curExtended], msg->packSize);
log_msg("Saving Send Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
log_msg("ManageNextPacketToSend : type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7);
dataToSend->init = false;
dataToSend->curExtended += msg->packSize - 1;
@ -246,7 +410,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
D2FreeMem(PClientGame->memoryPool, dataToSend->dataExtended,__FILE__,__LINE__,0);
dataToSend->dataExtended = NULL;
}
log_msg("End Send Packet\n");
log_msg("ManageNextPacketToSend : End\n");
return 0;//ManageNextPacketToSend(ptClient);//return 0;
}
@ -261,7 +425,7 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
msg->isCustom = true;
msg->packSize = remainingData > 0xFE ? 0xFF : (BYTE)remainingData + 1;
CopyMemory(msg->data, &dataToSend->dataShared[dataToSend->curShared], msg->packSize);
log_msg("Saving Send Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
log_msg("ManageNextPacketToSend : type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7);
dataToSend->init = false;
dataToSend->curShared += msg->packSize - 1;
@ -273,11 +437,11 @@ DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
D2FreeMem(PClientGame->memoryPool, dataToSend->dataShared,__FILE__,__LINE__,0);
dataToSend->dataShared = NULL;
}
log_msg("End Send Packet\n");
log_msg("ManageNextPacketToSend : End\n");
return 0;//ManageNextPacketToSend(ptClient);//return 0;
}
log_msg("End Send Packet\n");
log_msg("ManageNextPacketToSend : End\n");
return 1;
}
@ -286,7 +450,7 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg)
{
if( (msg->packID != customPackID) || !msg->isCustom) return 0;
log_msg("Saving Receive Packet: id = %d\ttype=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
log_msg("ReceiveSaveFilesToSave : Receive Packet - type=%d\t init=%d\t finalSize=%d\t packSize=%d\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
bool isShared;
@ -301,10 +465,10 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg)
{
D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0);
D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0);
ZeroMemory(&receivedSaveFiles, sizeof(receivedSaveFiles));//TODO
ZeroMemory(&receivedSaveFiles, sizeof(receivedSaveFiles));
}
log_msg("receivedSaveFiles: sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", receivedSaveFiles.sizeExtended, receivedSaveFiles.curExtended, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeShared, receivedSaveFiles.curShared, receivedSaveFiles.dataShared);
log_msg("ReceiveSaveFilesToSave : sizeExtended=%d\t curExtended=%d\t dataExtended=%08X\t sizeShared=%d\t curShared=%d\t dataShared=%08X\n", receivedSaveFiles.sizeExtended, receivedSaveFiles.curExtended, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeShared, receivedSaveFiles.curShared, receivedSaveFiles.dataShared);
DWORD size = msg->packSize - 1;
if (isShared)
@ -331,77 +495,48 @@ DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg)
CopyMemory(&receivedSaveFiles.dataExtended[receivedSaveFiles.curExtended], msg->data, size);
receivedSaveFiles.curExtended += size;
}
log_msg("End Save Receive Packet\n");
log_msg("ReceiveSaveFilesToSave : End\n");
return 1;
}
void STDCALL SaveMPPlayerCustomData(BYTE* dataD2Savefile )
{
log_msg("Start SaveMPPlayerCustomData.\n");
log_msg("SaveMPPlayerCustomData - Start.\n");
Unit* ptChar = D2GetClientPlayer();
if( receivedSaveFiles.sizeExtended && (receivedSaveFiles.sizeExtended == receivedSaveFiles.curExtended) && receivedSaveFiles.sizeShared && (receivedSaveFiles.sizeShared == receivedSaveFiles.curShared) )
backupSaveFiles(PCPlayerData->name, (dataD2Savefile[0x24] & 4) == 4);
if (active_PlayerCustomData)
{
log_msg("Saving can start\n");
if( receivedSaveFiles.sizeExtended && (receivedSaveFiles.sizeExtended == receivedSaveFiles.curExtended) && (!active_sharedStash || receivedSaveFiles.sizeShared && (receivedSaveFiles.sizeShared == receivedSaveFiles.curShared)) )
{
log_msg("SaveMPPlayerCustomData - Saving can start\n");
if (ptChar)
{
writeExtendedSaveFile(PCPlayerData->name, receivedSaveFiles.dataExtended, receivedSaveFiles.sizeExtended);
D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0);
if (active_sharedStash)
{
writeSharedSaveFile(PCPlayerData->name, receivedSaveFiles.dataShared, receivedSaveFiles.sizeShared, (dataD2Savefile[0x24] & 4) == 4);//6FBAB9A4-6FAA0000
D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0);
}
ZeroMemory(&receivedSaveFiles,sizeof(receivedSaveFiles));
}
log_msg("Receive Savefiles completed\n\n");
log_msg("SaveMPPlayerCustomData - Receive Savefiles completed\n\n");
} else {
if (ptChar)
{
log_box("Connection error : back up current save file then save with client data.");
backupSharedSaveFile();
backupExtendedSaveFile(PCPlayerData->name);
log_box("Connection error : save with client data.");
SaveSPPlayerCustomData(ptChar);
}
}
log_msg("--- End SaveMPPlayerCustomData. ---\n\n");
}
log_msg("--- SaveMPPlayerCustomData End ---\n\n");
}
void STDCALL SaveMPPlayerCustomData_114()
{
if (!D2isLODGame()) return;
log_msg("\n--- Start SaveMPPlayerCustomData ---\n");
Unit* ptChar = D2GetClientPlayer();
if (PCPY->selfStashIsOpened)
{
DWORD curSizeExt = 0;
DWORD maxSizeExt = 0x4000;
BYTE* dataExt = new BYTE[maxSizeExt];
ZeroMemory(dataExt, maxSizeExt);
d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__);
saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt);
writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt);
delete[] dataExt;
}
if (active_sharedStash && PCPY->sharedStashIsOpened)
{
DWORD curSizeShr = 0;
DWORD maxSizeShr = 0x4000;
BYTE* dataShr = new BYTE[maxSizeShr];
ZeroMemory(dataShr, maxSizeShr);
d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__);
saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr);
NetClient* ptClient = D2GetClient(ptChar, __FILE__, __LINE__);
writeSharedSaveFile(PCPlayerData->name, dataShr, curSizeShr, 0/*ptClient->isHardCoreGame*/);
delete[] dataShr;
}
log_msg("End saving.\n\n");
}
/*
@ -468,7 +603,12 @@ end_caller_ManageNextPacketToSend_9d:
RETN
}}
FCT_ASM( caller_SendSaveFilesToSave_114 )
PUSH DWORD PTR SS:[ESP+0x4]
CALL SendSaveFilesToSave
MOV EDI,DWORD PTR SS:[EBP-0x2008]
RETN
}}
FCT_ASM( caller_SendSaveFilesToSave_111 )
PUSH DWORD PTR SS:[ESP+0x2014]
@ -494,6 +634,21 @@ FCT_ASM( caller_SendSaveFilesToSave_9 )
RETN
}}
FCT_ASM ( caller_ReceivedSaveFilesToSave_114 )
CMP EDX,-1
JE continue_rcvFct
PUSH ECX
PUSH EDX
PUSH ECX
CALL ReceiveSaveFilesToSave
POP EDX
POP ECX
TEST EAX,EAX
JE continue_rcvFct
RETN
continue_rcvFct:
JMP D2ReceivePacket
}}
FCT_ASM ( caller_ReceivedSaveFilesToSave_111 )
LEA EAX,DWORD PTR SS:[ESP+0x10]
@ -529,16 +684,6 @@ continue_rcvFct:
// JMP DWORD PTR SS:[ESP+0x5F0]
}}
FCT_ASM( caller_SaveMPPlayerCustomData_114 )
PUSH EAX
PUSH ECX
CALL SaveMPPlayerCustomData_114
POP ECX
POP EAX
CMP ECX, 0xAA55AA55
RETN
}}
FCT_ASM ( caller_SaveMPPlayerCustomData_111 )
PUSH EAX
PUSH ECX
@ -550,8 +695,6 @@ FCT_ASM ( caller_SaveMPPlayerCustomData_111 )
RETN
}}
FCT_ASM ( caller_SaveMPPlayerCustomData )
PUSH ECX
PUSH ECX
@ -563,44 +706,45 @@ FCT_ASM ( caller_SaveMPPlayerCustomData )
}}
void Install_SavePlayerData()
{
static int isInstalled = false;
if (isInstalled || !active_PlayerCustomData) return;
if (isInstalled) return;
log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n");
//Save single player custom data.
mem_seek R8(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835, 132276);
if (version_D2Game == V114d) {
MEMT_REF4(0xFFED4DD6, caller_SaveSPPlayerCustomData_114);
} else {
MEMJ_REF4(D2FogGetSavePath, version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9);
if (version_D2Game >= V111)
{
mem_seek R8(D2Game, 0000, 0000, 0000, B9801, 25911, 44601, 543D1, 39CD1, 1324EC);
MEMC_REF4( D2SaveSPChar, version_D2Game >= V114a ? caller_SaveSPPlayerCustomData_114 : version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 : version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9);
//6FCD9800 |. E8 3BFBFFFF CALL D2Game.6FCD9340
//6FC45910 |. E8 3BFBFFFF CALL D2Game.6FC45450
//6FC64600 |. E8 3BFBFFFF CALL D2Game.6FC64140
//6FC743D0 |. E8 3BFBFFFF CALL D2Game.6FC73F10
//6FC59CD0 |. E8 3BFBFFFF CALL D2Game.6FC59810
//005324EB |. E8 50FDFFFF CALL Game.00532240 ; \Game.00532240
}
else
{
mem_seek R8(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35, 39835, 132276);
MEMJ_REF4( D2FogGetSavePath, /*version_D2Game >= V114a ? caller_SaveSPPlayerCustomData : version_D2Game >= V111 ? caller_SaveSPPlayerCustomData_111 :*/ version_D2Game != V109b ? caller_SaveSPPlayerCustomData : caller_SaveSPPlayerCustomData_9);
//6FC8A623 E8 3E210900 CALL <JMP.&Fog.#10115>
//02039364 |. E8 3B0FF5FF CALL <JMP.&Fog.#10115>
//01F95474 |. E8 C34EFEFF CALL <JMP.&Fog.#10115>
//6FC64164 |. E8 EB61FCFF CALL <JMP.&Fog.#10115>
//6FC73F34 |. E8 DD63FBFF CALL <JMP.&Fog.#10115>
//6FC59834 |. E8 FB0AFDFF CALL <JMP.&Fog.#10115>
if (version_D2Game == V114d) {
// Save multiplayer player custom data.
mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 5C565);
memt_byte(0x81, 0xE8); // CALL
MEMT_REF4(0x55AA55F9, caller_SaveMPPlayerCustomData_114);
memt_byte(0xAA, 0x90); // CALL
log_msg("\n");
isInstalled = true;
return;
//00532275 |. E8 D64DEDFF CALL Game.00407050
}
if (active_PlayerCustomData)
{
//Send SaveFiles
mem_seek R8(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB, 397AB, 132398);
memt_byte( 0x8B ,0x90); // NOP
memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL
MEMT_REF4( version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9);
memt_byte( version_D2Game >= V114d ? 0xBD : version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74, 0xE8); // CALL
MEMT_REF4( version_D2Game >= V114d ? 0xFFFFDFF8 : version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V114d ? caller_SendSaveFilesToSave_114 : version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9);
//6FC8A720 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10]
//6FC8A724 |. 85FF TEST EDI,EDI
//020392DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
@ -613,8 +757,9 @@ void Install_SavePlayerData()
//6FC73EAF |. 85C0 TEST EAX,EAX
//6FC597AB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
//6FC597AF |. 85C0 TEST EAX,EAX
//00532398 |. 8BBD F8DFFFFF MOV EDI,DWORD PTR SS:[EBP-2008]
mem_seek R8(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3, 138FEC/*12E110*/);
mem_seek R8(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173, BEDD3, 12E13E);
memt_byte( 0x8B ,0x90); // NOP
memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL
MEMT_REF4( version_D2Game >= V110 ? 0x0000017C : version_D2Game == V109d ? 0x0000174 : 0x00000150, version_D2Game >= V110 ? caller_ManageNextPacketToSend : version_D2Game == V109d ? caller_ManageNextPacketToSend_9d : caller_ManageNextPacketToSend_9);
@ -624,6 +769,7 @@ void Install_SavePlayerData()
//6FCC89D3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
//6FC4D173 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
//6FCDEDD3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
//0052E13E |> 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
// mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC
// memt_byte( 0x8B ,0xE8); // CALL
@ -632,10 +778,15 @@ void Install_SavePlayerData()
//6FC37DD1 |. 8BCD |MOV ECX,EBP
//6FC37DD3 |. 50 |PUSH EAX
if ( version_D2Game >= V111 )
{
//Received SaveFiles
mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6, 448E6);
mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946, 448E6, 4C70D);
if ( version_D2Game >= V114a )
{
MEMC_REF4( D2ReceivePacket, caller_ReceivedSaveFilesToSave_114);
//0044C70C |. E8 3F010100 |CALL Game.0045C850
}
else if ( version_D2Game >= V111 )
{
memt_byte( 0x0F ,0xE8);
MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111);
//6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
@ -643,9 +794,19 @@ void Install_SavePlayerData()
//6FB2BCD6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
//6FAF3946 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
//6FAF48E6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
} else {
//Received SaveFiles
memt_byte( 0x81 ,0x90); // NOP
memt_byte( 0xEC ,0xE8); // CALL
MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave);
//6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4
}
}
if ( version_D2Game >= V111 )
{
// Save multiplayer player custom data.
mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 829C2);
mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572, 829C2, 5C565);
memt_byte( 0x81 ,0xE8); // CALL
MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111);
memt_byte( 0xAA ,0x90); // CALL
@ -654,14 +815,8 @@ void Install_SavePlayerData()
//6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55
//6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55
//6FB329C2 |. 81F9 55AA55AA CMP ECX,AA55AA55
//0045C565 |. 81F9 55AA55AA CMP ECX,AA55AA55
} else {
//Received SaveFiles
mem_seek R8(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000, 0000, 0000);
memt_byte( 0x81 ,0x90); // NOP
memt_byte( 0xEC ,0xE8); // CALL
MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave);
//6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4
// Save multiplayer player custom data.
mem_seek R8(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000, 0000, 0000);
memt_byte( 0x8B ,0xE8); // CALL

View File

@ -15,9 +15,7 @@
#define BUFFER_SIZE 0x4000
#define FILE_VERSION 0x3230 //"02"
//6FC8CE8A |. E8 A16BFAFF CALL D2Game.6FC33A30
//$+C0 > 1F 00 00 00 03 00 00 06 .....
// 28 0010 1000
BYTE* readSharedSaveFile(char* name, DWORD* size)
{
char filename[512];
@ -157,40 +155,6 @@ void writeSharedSaveFile(char* name, BYTE* data, DWORD size, bool isHardcore)
log_box("Could not create the shared save file.");
}
void backupSharedSaveFile()
{
char szBackupName[MAX_PATH];
char szSaveName[MAX_PATH];
D2FogGetSavePath( szSaveName, MAX_PATH-30);
strcat(szSaveName, "_LOD_");
strcat(szSaveName, sharedStashFilename);
strcat(szSaveName,".sss");
D2FogGetSavePath( szBackupName, MAX_PATH-30);
strcat(szBackupName, "_LOD_");
strcat(szBackupName, sharedStashFilename);
strcat(szBackupName,".sss.backup");
CopyFile(szSaveName, szBackupName, true);
if (separateHardSoftStash)
{
D2FogGetSavePath( szSaveName, MAX_PATH-30);
strcat(szSaveName, "_LOD_HC_");
strcat(szSaveName, sharedStashFilename);
strcat(szSaveName,".sss");
D2FogGetSavePath( szBackupName, MAX_PATH-30);
strcat(szBackupName, "_LOD_HC_");
strcat(szBackupName, sharedStashFilename);
strcat(szBackupName,".sss.backup");
CopyFile(szSaveName, szBackupName, true);
}
}
void saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
{
*(DWORD *)(*data + *curSize) = FILE_SHAREDSTASH;

View File

@ -13,6 +13,13 @@
bool active_SkillPerLevelUpChange=0;
DWORD skillPerLevelUp=1;
FCT_ASM ( caller_changeSkillPerLevelUp_114 )
MOV EAX,skillPerLevelUp
IMUL EAX,EDI
MOV DWORD PTR SS:[ESP+0xC], EAX
JMP V2AddPlayerStat
}}
FCT_ASM ( caller_changeSkillPerLevelUp_111 )
MOV EAX,skillPerLevelUp
@ -37,17 +44,14 @@ void Install_SkillPerLevelUp()
log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n");
mem_seek R8(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5, 1709D1);
if (version_D2Game == V114d) {
MEMT_REF4(0x000B68DB, caller_changeSkillPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeSkillPerLevelUp_114 : version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
//6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518>
//02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109>
//01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645>
}
//005709D0 |. E8 DB680B00 CALL Game.006272B0 ; \Game.006272B0
log_msg("\n");

View File

@ -10,7 +10,7 @@
#include "common.h"
bool active_SkillsPoints=0;
bool unassignSkillsPointsOneByOne=0;
bool unassignSkillsPointsOneForOne=0;
int (*getskPoint)(SkillData* ptSkill);
int (*getCharClass)(SkillData* ptSkill);
@ -40,9 +40,9 @@ void UnassignAllSkillsPoints(Unit* ptChar)
DWORD skillID, keepBonus, maxSkillLevel;
int skpoints;
DWORD nbPoints = 0;
void* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
SkillData* ptSkill = PCSkills->ptFirstSkill;
log_msg("\n\nUNASSIGN SKILL POINTS\n\n");
while (ptSkill)
{
@ -53,7 +53,7 @@ void UnassignAllSkillsPoints(Unit* ptChar)
keepBonus = !getSingleSkillValue(ptChar, STATS_ITEM_SINGLESKILL, skillID);
maxSkillLevel = D2GetSkillLevel(ptChar, ptSkill, 0);
skpoints = getskPoint(ptSkill);
if (skpoints == -1 || unassignSkillsPointsOneByOne)
if (skpoints == -1 || unassignSkillsPointsOneForOne)
{
D2SetSkillBaseLevel(ptChar, skillID, 0, keepBonus, __FILE__, __LINE__);
nbPoints += maxSkillLevel;

View File

@ -13,6 +13,13 @@
bool active_StatPerLevelUpChange=0;
DWORD statPerLevelUp=5;
FCT_ASM ( caller_changeStatPerLevelUp_114 )
MOV EAX,statPerLevelUp
IMUL EAX,EDI
MOV DWORD PTR SS:[ESP+0xC], EAX
JMP V2AddPlayerStat
}}
FCT_ASM ( caller_changeStatPerLevelUp_111 )
MOV EAX,statPerLevelUp
IMUL EAX,EBX
@ -35,17 +42,14 @@ void Install_StatPerLevelUp()
log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n");
mem_seek R8(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A, 1709C6);
if (version_D2Game == V114d) {
MEMT_REF4(0x000B68E6, caller_changeStatPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeStatPerLevelUp_114 : version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
//6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518>
//02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109>
//01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645>
}
//005709C5 |. E8 E6680B00 CALL Game.006272B0 ; \Game.006272B0
log_msg("\n");

View File

@ -10,6 +10,7 @@
#include "plugYFiles.h" // Install_PlugYImagesFiles()
#include "interface_Stats.h" // Install_InterfaceStats()
#include "updateServer.h"
#include "extraOptions.h"
#include "common.h"
#include <stdio.h>
@ -163,9 +164,12 @@ void STDCALL printDisabledStatsBtn(WORD statID, sDrawImageInfo* data, DWORD x, D
_snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITH_LIMIT), limitValueToShiftClick);
else
_snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITHOUT_LIMIT));
if (active_DisplayBaseStatsValue)
{
wcscat(text,L"\n");
int len = wcslen(text);
_snwprintf(text + len, sizeof(text) - len, getLocalString(STR_STATS_BASE_MIN), statValue, minValue);
}
D2SetFont(1);
D2PrintPopup(text, x+18, y-32, WHITE, 1);
}
@ -306,7 +310,7 @@ FCT_ASM( caller_pushDown_114 )
SUB DWORD PTR SS:[ESP],0x22
RETN
end_pushDown :
MOV EAX, DWORD PTR SS : [EBP + 0x8]
MOV EAX, DWORD PTR SS:[EBP+8]
LEA ECX, DWORD PTR DS:[EAX*8]
RETN
}}
@ -356,56 +360,58 @@ void Install_StatsPoints()
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
memt_byte( version_D2Client == V114d ? 0x4D : 0x4C, V8(D2Client, 12, 12, 13, 13, 13, 13, 13, 13, 12) );
memt_byte( version_D2Client == V114d ? 0xF8 : 0x24, 0x90 ); // NOP
if (version_D2Client < V114d) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
if (version_D2Client < V114a) memt_byte( V8(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C, 1C, 53), 0x90 ); // NOP (V109d:0x20 , V110:0x14
//6FAD0073 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
//6FB32BBA > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB3963A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB1B59A > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB6D1B5 |> 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//6FB6F955 > 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
//004A7FFB > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
//004A7FFE . 53 PUSH EBX ; /Arg3
//print our buttons
mem_seek R8(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E, BF9DE, A808C);
if (version_D2Client == V114d) {
MEMT_REF4(0x0004E3F0, caller_printUnassignStatsBtn);
} else {
MEMJ_REF4( D2PrintImage, caller_printUnassignStatsBtn);
}
//6FB32C53 . E8 82A3F8FF CALL <JMP.&D2gfx.#10047>
//6FB396D3 . E8 D238F8FF CALL <JMP.&D2gfx.#10044>
//6FB1B636 . E8 431AFAFF CALL <JMP.&D2gfx.#10024>
//6FB6D23D . E8 54FEF4FF CALL <JMP.&D2gfx.#10041>
//6FB6F9DD . E8 ECD5F4FF CALL <JMP.&D2gfx.#10042>
//004A808B . E8 F0E30400 CALL Game.004F6480 ; \Game.004F6480
// Always manage push down.
mem_seek R8(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9, BF579, A77E4);
memt_byte( 0x74, 0x90 ); // NOP
memt_byte( version_D2Client == V114d ? 0x62 : 0x4E, 0x90 ); // NOP
//6FAD134D 74 4E JE SHORT D2Client.6FAD139D
//6FB327D9 . 74 4E JE SHORT D2Client.6FB32829
//6FB39259 . 74 4E JE SHORT D2Client.6FB392A9
//6FB1B1B9 74 4E JE SHORT D2Client.6FB1B209
//6FB6CDD9 . 74 4E JE SHORT D2Client.6FB6CE29
//6FB6F579 . 74 4E JE SHORT D2Client.6FB6F5C9
//004A77E4 . 74 62 JE SHORT Game.004A7848
if ( version_D2Client >= V111 )
if ( version_D2Client >= V114d )
{
// On Push down.
mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4, A7863);
if (version_D2Client == V114d) {
memt_byte(0x8B, 0xE8);
MEMT_REF4(0x0C8D0845, caller_pushDown_114);
memt_byte(0xC5, 0x90);
memt_dword(0x00000000, 0x90909090);
} else {
//004A7863 > 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
//004A7866 . 8D0CC5 0000000>LEA ECX,DWORD PTR DS:[EAX*8]
}
else if ( version_D2Client >= V111 )
{
// On Push down.
mem_seek R8(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44, BF5E4, A7863);
memt_byte( 0x6B, 0xE8 );
MEMT_REF4( 0x01BF0ED2, caller_pushDown_111);
memt_byte( 0x00, 0x6B ); // IMUL EDX,EDX,0E
memt_byte( 0x00, 0xD2 );
memt_byte( 0x00, 0x0E );
}
//6FB32844 > 6BD2 0E IMUL EDX,EDX,0E
//6FB32847 . BF 01000000 MOV EDI,1
//6FB392C4 > 6BD2 0E IMUL EDX,EDX,0E
@ -427,21 +433,21 @@ void Install_StatsPoints()
//6FAD13B8 8D04D5 00000000 LEA EAX,DWORD PTR DS:[EDX*8]
}
if ( version_D2Client >= V110 )
{
// Always manage push up.
mem_seek R8(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49, C05E9, A7976);
memt_byte( version_D2Client == V114d ? 0x0F : 0x74, 0x90 ); // NOP
memt_byte( version_D2Client == V114d ? 0x84 : version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP
if (version_D2Client == V114d) {
memt_dword(0x000000BB, 0x90909090);
}
if (version_D2Client == V114d) memt_dword(0x000000BB, 0x90909090);
//6FAD152E 74 68 JE SHORT D2Client.6FAD1598
//6FB33869 . 74 65 JE SHORT D2Client.6FB338D0
//6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350
//6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0
//6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0
//6FB705E9 . 74 65 JE SHORT D2Client.6FB70650
//004A7976 |. 0F84 BB000000 JE Game.004A7A37
// Unassign stats point when ctrl is push.
mem_seek R8(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB, C069B, A79F2);
@ -459,6 +465,8 @@ void Install_StatsPoints()
//6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07
//6FB7069B . 66:85C0 TEST AX,AX
//6FB7069E . 7C 07 JL SHORT D2Client.6FB706A7
//004A79F2 |. 66:85C0 TEST AX,AX
//004A79F5 |. 7C 07 JL SHORT Game.004A79FE
} else {
// Always manage push up.
mem_seek R8(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000, 0000, 0000);
@ -478,16 +486,14 @@ void Install_StatsPoints()
mem_seek R8(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E, C06DE, A7A29);
if ( version_D2Client >= V111 ) {
memt_byte( version_D2Client == V114d ? 0xB1 : 0x66, 0xE8 ); // CALL
if (version_D2Client == V114d) {
MEMT_REF4(0x160B663A, caller_setValue_114);
} else {
MEMT_REF4(0x15244C89, caller_setValue_111);
}
MEMT_REF4( version_D2Client == V114d ? 0x160B663A : 0x15244C89, version_D2Client == V114d ? caller_setValue_114 : caller_setValue_111);
//6FB3395E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX
//6FB3A3DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX
//6FB1C33E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
//6FB6DF3E . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
//6FB706DE . 66:894C24 15 MOV WORD PTR SS:[ESP+15],CX ; |
//004A7A29 |. B1 3A |MOV CL,3A
//004A7A2B |. 66:0B16 |OR DX,WORD PTR DS:[ESI]
} else {
MEMC_REF4( D2SendToServer3, caller_setValue);
//6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990
@ -534,6 +540,7 @@ void Install_StatsLimitShiftClick()
//6FB1C2F5 . FF15 10F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
//6FB6DEF5 . FF15 04F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
//6FB70695 . FF15 2001B86F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
//004A79EC |. FF15 5CC46C00 CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
log_msg("\n");

View File

@ -7,44 +7,10 @@
=================================================================*/
#include <math.h>
#include "uberQuest.h"
#include "common.h"
bool active_UberQuest=0;
/*
void* ptQuest = D2GetPlayerData(ptChar)->ptQuest[ptGame->difficultyLevel];
if (D2CheckQuestState(ptGame->game10F4[0xC],4,0xB) ||
D2CheckQuestState(ptQuest,4,0xA) ||
ptGame->ptIsLodGame && !D2CheckQuestState(ptQuest,0x28,0)
// !ptGame->ptIsLodGame && D2CheckQuestState(ptQuest,0x1A,0)TODO for !ptGame->ptIsLodGame...
{
// d2_assert(!ptChar,"openPandPortal : ptChar==NULL",__FILE__,__LINE__);
// ptChar->v6E = 0x14;
// ptChar->v70 = ptChar;
// D2Common10148(ptChar);
// ptChar->flag400 = 1;
// return 0;
}
Room* = ptRoom = D2GetRoom(ptChar);
if (D2GetLevelID(ptRoom) != 1) return 0;
Position pos1;
D2GetPosition(ptChar, &pos1);
void* ptPortal = NULL;
D2Game02059FE0(ptRoom,&pos1,3,0x400,&ptPortal,0x64);
if (!ptPortal) return 0;
Position pos2;
pos2.x = pos1.x;
pos2.y = pos1.y;
testing crash useless...
D2GetDropRoom(ptRoom, &pos2, &pos2,3,0x3E01,0xC01,0);
*/
/*
void* FASTCALL D2Game01F81090(Room* ptRoom, DWORD x, DWORD y);//0x1090
*/
#define OBJECT_PERMANENT_PORTAL 0x3C
#define LEVEL_ACT5TOWN 109
#define LEVEL_ACT5_PANDEMONIUM1 133
@ -52,6 +18,53 @@ void* FASTCALL D2Game01F81090(Room* ptRoom, DWORD x, DWORD y);//0x1090
#define LEVEL_ACT5_PANDEMONIUM3 135
#define LEVEL_ACT5_PANDEMONIUM_FINAL 136
#define UBER_IZUAL_ID 706
#define UBER_ANDARIEL_ID 707
#define UBER_DURIEL_ID 708
#define UBER_MEPHISTO_ID 704
#define UBER_DIABLO_ID 705
#define UBER_BAAL_ID 709
#define UBER_MEPHISTO_SQUELETON 725
#define UBER_MEPHISTO_ARCHER 726
#define UBER_MEPHISTO_FIRE 727
#define UBER_MEPHISTO_LIGHTNING 728
#define UBER_MEPHISTO_COLD 729
#define UBER_MEPHISTO_POISON 730
#define UBER_BAAL_DARK_LORD 731
#define UBER_BAAL_SPECTER 732
#define UBER_DIABLO_PIT_LORD 711
bool active_UberQuest = false;
DWORD UberMephistoX = 25130;
DWORD UberMephistoY = 5143;
DWORD UberDiabloX = 25139;
DWORD UberDiabloY = 5139;
DWORD UberBaalX = 25139;
DWORD UberBaalY = 5135;
bool active_UberMinions = true;
DWORD UberMephistoNbMinions = 6;
DWORD UberMephistoMinions[] = {UBER_MEPHISTO_SQUELETON, UBER_MEPHISTO_ARCHER, UBER_MEPHISTO_FIRE, UBER_MEPHISTO_LIGHTNING, UBER_MEPHISTO_COLD, UBER_MEPHISTO_POISON};
int UberMephistoSpawnPercent = 80;
DWORD UberMephistoSpawnRadius = 30;
DWORD UberBaalNbMinions = 2;
DWORD UberBaalMinions[] = {UBER_BAAL_DARK_LORD, UBER_BAAL_SPECTER};
int UberBaalSpawnPercent = 30;
DWORD UberBaalSpawnRadius = 30;
DWORD UberDiabloNbMinions = 1;
DWORD UberDiabloMinions[] = {UBER_DIABLO_PIT_LORD};
int UberDiabloSpawnPercent = 30;
DWORD UberDiabloSpawnRadius = 30;
bool active_UberDiabloRushTweekAI = false;
bool active_UberBaalTeleportTweekAI = false;
bool active_UberBaalChillingArmorTweekAI = false;
int uberBaalChillingArmorTimer = 6000;
int uberBaalChillingArmorLastFrame = 0;
static struct
{
union{
@ -72,39 +85,48 @@ static struct
int count1;
int count2;
int count3;
int count4;
int count5;
int count6;
Room* room1;
Room* room2;
Room* room3;
Room* room4;
Room* room5;
Room* room6;
} questState;
int GetNbMonsters(Level* level, Position position, int radius);
int GetNbMonsters(Level* level);
bool IsInRoom(Room* ptRoom, DWORD x, DWORD y)
{
DWORD startX = version_D2Game > V112 ? ptRoom->startX : *((DWORD*)ptRoom + 6);
DWORD startY = version_D2Game > V112 ? ptRoom->startY : *((DWORD*)ptRoom + 7);
DWORD sizeX = version_D2Game > V112 ? ptRoom->sizeX : *((DWORD*)ptRoom + 8);
DWORD sizeY = version_D2Game > V112 ? ptRoom->sizeY : *((DWORD*)ptRoom + 9);
return x >= startX && x <= startX + sizeX &&
y >= startY && y <= startY + sizeY;
}
double Distance(Position p1, Position p2)
{
return sqrt((double)(p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}
void resetQuestState()
{
ZeroMemory(&questState,sizeof(questState));
questState.count1 = 10 + RANDOM(10);
questState.count2 = 20 + RANDOM(40);
questState.count3 = 10 + RANDOM(20);
int value = 5 + RANDOM(10);
questState.count4 = value + RANDOM(4);
questState.count5 = value + RANDOM(4);
questState.count6 = value + RANDOM(4);
log_msg("Uber Quest State : %d %d %d %d %d %d\n",questState.count1, questState.count2, questState.count3, questState.count4, questState.count5, questState.count6);
uberBaalChillingArmorLastFrame = 0;
log_msg("Uber Quest State : %d %d %d\n",questState.count1, questState.count2, questState.count3);
}
DWORD openPortalOnLevel(Game* ptGame, Unit* ptChar, DWORD levelID)
{
log_msg("openning portal to level %d\n",levelID);
log_msg("Open portal to level %d\n", levelID);
Room* ptRoom = D2GetRoom(ptChar);
if ( D2GetLevelID(ptRoom) != LEVEL_ACT5TOWN ) return 0;
//Get position in the room
Position pos;
D2GetPosition(ptChar, &pos);
log_msg("ptChar pos : %d %d\n", pos.x, pos.y);
if (!D2GetDropRoom(ptRoom, &pos, &pos, 3, 0x3E01, 0xC01, 0)) return 0;
ptRoom = D2TestPositionInRoom(ptRoom, pos.x, pos.y);
if (!ptRoom) return 0;
@ -124,11 +146,10 @@ DWORD openPortalOnLevel(Game* ptGame, Unit* ptChar, DWORD levelID)
DWORD FASTCALL openPandPortal(Game* ptGame, Unit* ptChar)
{
log_msg("openPandPortal\n");
Position pos;
D2GetPosition(ptChar, &pos);
log_msg("ptChar pos : %d %d\n",pos.x,pos.y);
if (ptGame->difficultyLevel != D2DM_HELL) return 0;
if (ptGame->difficultyLevel != D2DM_HELL)
return 0;
int available[3];
int nbAvailable=0;
if (!questState.portal1Opened) available[nbAvailable++]=LEVEL_ACT5_PANDEMONIUM1;
@ -141,45 +162,30 @@ DWORD FASTCALL openPandPortal(Game* ptGame, Unit* ptChar)
int ret = openPortalOnLevel(ptGame, ptChar, selectedTargetLevel);
if (ret)
{
if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM1) questState.portal1Opened = 1;
else if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM2) questState.portal2Opened = 1;
else if (selectedTargetLevel == LEVEL_ACT5_PANDEMONIUM3) questState.portal3Opened = 1;
}
log_msg("openPandPortal ending\n\n");
return ret;//normally return ret;
return ret;
}
DWORD FASTCALL openPandFinalPortal(Game* ptGame, Unit* ptChar)
{
log_msg("openPandFinalPortal\n");
Position pos;
D2GetPosition(ptChar, &pos);
log_msg("ptChar pos : %d %d",pos.x,pos.y);
int ret = openPortalOnLevel(ptGame, ptChar, LEVEL_ACT5_PANDEMONIUM_FINAL);
log_msg("openPandFinalPortal ending\n");
return ret;//normally return ret;
}
Room* selectRoom(Game* ptGame, Room* ptCurrentRoom, DWORD level)
{
/* Room* tab[200];
nbRoom=0;
Room* ptRoom = ptGame->mapAct[5]->ptFirstRoom;
while (ptRoom);
if(!ptCurrentRoom->nbNearRooms) return ptCurrentRoom;
int targetRoomNum = RANDOM(ptCurrentRoom->nbNearRooms);
Room* ptRoom = ptCurrentRoom->ptNearRooms;
while (targetRoomNum--)
ptRoom = ptRoom->ptNextRoom;*/
return ptCurrentRoom;
if (ptGame->difficultyLevel != D2DM_HELL)
return 0;
return openPortalOnLevel(ptGame, ptChar, LEVEL_ACT5_PANDEMONIUM_FINAL);
}
void STDCALL spawnUber(Game* ptGame, Room* ptRoom)
{
log_msg("Uber Quest State : %d %d %d %d %d %d\n",questState.count1, questState.count2, questState.count3, questState.count4, questState.count5, questState.count6);
log_msg("Uber Quest State : %d %d %d\n",questState.count1, questState.count2, questState.count3);
log_msg("Uber Quest questState spawn : %d %d %d %d %d %d\n",questState.uber1Spawned, questState.uber2Spawned, questState.uber3Spawned, questState.uber4Spawned, questState.uber5Spawned, questState.uber6Spawned);
switch(D2GetLevelID(ptRoom))
{
case LEVEL_ACT5_PANDEMONIUM1:
@ -187,8 +193,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom)
{
if (questState.count1) questState.count1--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 707, 0))
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_ANDARIEL_ID, 0))
questState.uber1Spawned = 1;
}
}
@ -198,8 +203,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom)
{
if (questState.count2) questState.count2--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 708, 0))
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_DURIEL_ID, 0))
questState.uber2Spawned = 1;
}
}
@ -209,8 +213,7 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom)
{
if (questState.count3) questState.count3--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 706, 0))
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, 0, 0, -1, UBER_IZUAL_ID, 0))
questState.uber3Spawned = 1;
}
}
@ -218,109 +221,238 @@ void STDCALL spawnUber(Game* ptGame, Room* ptRoom)
case LEVEL_ACT5_PANDEMONIUM_FINAL:
if (!questState.uber4Spawned)
{
if (questState.count4) questState.count4--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 704, 0))
log_msg("Spawn Mephisto ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY);
if (IsInRoom(ptRoom, UberMephistoX, UberMephistoY))
{
log_msg("Spawn Mephisto ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY);
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberMephistoX, UberMephistoY, -1, UBER_MEPHISTO_ID, 0))
questState.uber4Spawned = 1;
}
}
if (!questState.uber5Spawned)
{
if (questState.count5) questState.count5--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 705, 0))
questState.uber5Spawned = 1;
if (IsInRoom(ptRoom, UberDiabloX, UberDiabloY))
{
log_msg("Spawn Diablo ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY);
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberDiabloX, UberDiabloY, -1, UBER_DIABLO_ID, 0))
questState.uber4Spawned = 1;
}
}
if (!questState.uber6Spawned)
{
if (questState.count6) questState.count6--;
else {
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 709, 0))
questState.uber6Spawned = 1;
if (IsInRoom(ptRoom, UberBaalX, UberBaalY))
{
log_msg("Spawn Baal ptRoom: startX:%d - startY:%d / x:%d y:%d\n", ptRoom->startX, ptRoom->startY, ptRoom->sizeX, ptRoom->sizeY);
if (D2SpawnSuperUnique(ptGame, ptRoom, 0, UberBaalX, UberBaalY, -1, UBER_BAAL_ID, 0))
questState.uber4Spawned = 1;
}
}
// D2SpawnMonster(PCGame, ptRoom, 0, 25113, 5138, -1, 704, 0);
// D2SpawnMonster(PCGame, ptRoom, 0, 25125, 5150, -1, 705, 0);
// D2SpawnMonster(PCGame, ptRoom, 0, 25135, 5140, -1, 709, 0);
}
D2Game235C0(ptGame, ptRoom);
}
/*DWORD STDCALL spawnUber(Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y)
{
if (!D2WarpPlayer(ptPath, ptChar, ptRoom, x, y)) return 0;
//////////////////////////////////////////////////////////////////////////////
switch(D2GetLevelID(ptRoom))
int GetNbMonsters(Level* level)
{
case LEVEL_ACT5_PANDEMONIUM1:
if (!questState.uber1Spawned)
int nbMonsters = 0;
for (RoomEx* roomEx = level->ptFirstRoomEx; roomEx; roomEx = roomEx->ptNextRoomEx)
{
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 707, 0);
questState.uber1Spawned = 1;
if (roomEx->ptRoom)
{
for (Unit* unit = roomEx->ptRoom->ptFirstUnit; unit; unit = unit->ptNextUnitInRoom)
{
if (unit->nUnitType == UNIT_MONSTER && unit->mode != UNIT_MODE_KICK && unit->nTxtFileNo != 711)
{
//log_msg("GetNbMonsters ++ / type:%d - id:%d - mode:%d\n", unit->nUnitType, unit->nTxtFileNo, unit->mode);
nbMonsters++;
}
break;
case LEVEL_ACT5_PANDEMONIUM2:
if (!questState.uber2Spawned)
{
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 708, 0);
questState.uber2Spawned = 1;
}
break;
case LEVEL_ACT5_PANDEMONIUM3:
if (!questState.uber3Spawned)
{
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 706, 0);
questState.uber3Spawned = 1;
}
break;
case LEVEL_ACT5_PANDEMONIUM_FINAL:
if (!questState.uber4Spawned)
{
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 704, 0);
ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 705, 0);
ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 709, 0);
// D2SpawnMonster(PCGame, ptRoom, 0, 25113, 5138, -1, 704, 0);
// D2SpawnMonster(PCGame, ptRoom, 0, 25125, 5150, -1, 705, 0);
// D2SpawnMonster(PCGame, ptRoom, 0, 25135, 5140, -1, 709, 0);
questState.uber4Spawned = 1;
//else log_msg("GetNbMonsters no / type:%d - id:%d - mode:%d\n", unit->nUnitType, unit->nTxtFileNo, unit->mode);
}
}
return 1;
}
*/
void FASTCALL uberMephIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
{
D2MephIA(ptGame, ptMonster, ptData);
return nbMonsters;
}
void FASTCALL uberDiabloIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
int GetNbMonsters(Level* level, Position position, int radius)
{
D2DiabloIA(ptGame, ptMonster, ptData);
int nbMonsters = 0;
for (RoomEx* roomEx = level->ptFirstRoomEx; roomEx; roomEx = roomEx->ptNextRoomEx)
{
if (roomEx->ptRoom)
{
for (Unit* unit = roomEx->ptRoom->ptFirstUnit; unit; unit = unit->ptNextUnitInRoom)
{
if (unit->nUnitType == UNIT_MONSTER && unit->mode != UNIT_MODE_KICK && unit->nTxtFileNo != 711)
{
Position p;
D2GetPosition(unit, &p);
if (Distance(position, p) <= radius)
nbMonsters++;
}
}
}
}
return nbMonsters;
}
void FASTCALL uberBaalIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
bool CastSummonMonster(Game* ptGame, Unit* ptMonster, DWORD x, DWORD y, DWORD* minions, int minionsSize, int mode)
{
D2BaalIA(ptGame, ptMonster, ptData);
DWORD minionId = minions[RANDOM(minionsSize)];
log_msg("CastSummonMonster: id:%d x:%d y:%d mode:%d\n", minionId, x, y, mode);
Room* ptRoom = D2GetRoom(ptMonster);
// Check nb of monsters
Level* ptLevel = ptRoom->ptRoomEx->ptLevel;
int monstersInLevel = GetNbMonsters(ptLevel);
Position position;
D2GetPosition(ptMonster, &position);
int monstersNearby = GetNbMonsters(ptLevel, position, 25);
log_msg("CastSummonMonster nbMonsters: %d - %d\n", monstersNearby, monstersInLevel);
if (monstersNearby > 16 || monstersInLevel > 100)
return false;
// Spawn Monster
log_msg("CastSummonMonster D2SpawnMonster(%d, %d, %08X, %08X, %d, %d, %d, %d)\n", minionId, mode, ptGame, ptRoom, x, y, 1, 0);
Unit* monster = D2SpawnMonster(minionId, mode, ptGame, ptRoom, x, y, 1, 0);
log_msg("CastSummonMonster D2SpawnMonster end\n");
if (monster)
return true;
// Try in near rooms
log_msg("CastSummonMonster Try in near rooms: %d - %d\n", ptRoom->startX, ptRoom->startY);
for(int i = 0; i < ptRoom->nbNearRooms; i++)
{
Room* ptRoom2 = ptRoom->ptNearRooms[i];
if (IsInRoom(ptRoom2, x, y))
{
log_msg("CastSummonMonster D2SpawnMonster(%d, %d, %08X, %08X, %d, %d, %d, %d)\n", minionId, mode, ptGame, ptRoom2, x, y, 1, 0);
monster = D2SpawnMonster(minionId, mode, ptGame, ptRoom2, x, y, 1, 0);
log_msg("CastSummonMonster D2SpawnMonster end\n");
if (monster)
return true;
}
}
log_msg("CastSummonMonster end: %d - %d\n", ptRoom->startX, ptRoom->startY);
return false;
}
void RandInCircle(Position* position, DWORD radius)
{
double theta = RANDOMF() * 6.283185;
double r = sqrt(RANDOMF()) * radius;
position->x += (DWORD)(r * cos(theta));
position->y += (DWORD)(r * sin(theta));
}
void FASTCALL uberMephAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs)
{
log_msg("UberMephAI called.\n");
// Spawn Minions
if (active_UberMinions && RANDOM(100) < UberMephistoSpawnPercent && ptAIArgs->distanceToTarget < UberMephistoSpawnRadius)
{
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberMephistoMinions, UberMephistoNbMinions, 8);
}
log_msg("Uber Mephisto AI activated.\n");
D2MephAI(ptGame, ptMonster, ptAIArgs);
}
void FASTCALL uberDiabloAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs)
{
log_msg("UberDiabloAI called.\n");
// Spawn Minions
if (active_UberMinions && RANDOM(100) < UberDiabloSpawnPercent && ptAIArgs->distanceToTarget < UberDiabloSpawnRadius)
{
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
RandInCircle(&pos, 3);
CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberDiabloMinions, UberDiabloNbMinions, 1);
}
// Tweek Diablo AI Rush
if (active_UberDiabloRushTweekAI && RANDOM(100) < (int)ptAIArgs->distanceToTarget - 10)
{
if (RANDOM(3) > 0)//67% to Rush
{
log_msg("Uber Diablo Run activated.\n");
int diabloRunSkillId = 4;
D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[diabloRunSkillId], ptAIArgs->ptMonStatsBIN->skill[diabloRunSkillId], ptAIArgs->target, 0, 0);
}
else
{
log_msg("Uber Diablo Move activated.\n");
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
D2MonsterMove(ptGame, ptMonster, NULL, 2, pos.x, pos.y, 1, 0);
}
return;
}
log_msg("Uber Diablo AI activated.\n");
D2DiabloAI(ptGame, ptMonster, ptAIArgs);
}
void FASTCALL uberBaalAI(Game* ptGame, Unit* ptMonster, AIParam* ptAIArgs)
{
log_msg("UberBaalAI called.\n");
if (active_UberMinions && RANDOM(100) < UberBaalSpawnPercent && ptAIArgs->distanceToTarget < UberBaalSpawnRadius)
{
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
RandInCircle(&pos, 3);
CastSummonMonster(ptGame, ptMonster, pos.x, pos.y, UberBaalMinions, UberBaalNbMinions, 1);
}
// Tweek Baal AI Chilling Armor
if (active_UberBaalChillingArmorTweekAI)
{
if (uberBaalChillingArmorLastFrame == 0 || ((int)ptGame->gameFrame - uberBaalChillingArmorLastFrame > uberBaalChillingArmorTimer))
{
log_msg("Uber Baal Chilling Armor activated.\n");
uberBaalChillingArmorLastFrame = ptGame->gameFrame;
const int baalChillingArmorSkillId = 7;
D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[baalChillingArmorSkillId], ptAIArgs->ptMonStatsBIN->skill[baalChillingArmorSkillId], NULL, 0, 0);
return;
}
}
// Tweek Baal AI Teleport
if (active_UberBaalTeleportTweekAI && RANDOM(100) < (int)ptAIArgs->distanceToTarget - 10)
{
if (RANDOM(3) > 0)//67% to teleport
{
log_msg("Uber Baal Teleport activated.\n");
const int baalTeleportSkillId = 4;
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
D2MonsterUseSkill(ptGame, ptMonster, ptAIArgs->ptMonStatsBIN->skillArg[baalTeleportSkillId], ptAIArgs->ptMonStatsBIN->skill[baalTeleportSkillId], NULL/*ptAIArgs->target*/, pos.x, pos.y);
}
else
{
log_msg("Uber Baal Move activated.\n");
Position pos;
D2GetPosition(ptAIArgs->target, &pos);
D2MonsterMove(ptGame, ptMonster, NULL, 2, pos.x, pos.y, 1, 0);
}
return;
}
log_msg("Uber Baal AI activated.\n");
D2BaalAI(ptGame, ptMonster, ptAIArgs);
}
FCT_ASM ( caller_spawnUber )
PUSHAD
PUSH EDX
PUSH ECX
CALL spawnUber
POPAD
RETN
}}
@ -339,44 +471,32 @@ void Install_UberQuest()
// open Red Portal
VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, PAGE_EXECUTE_READWRITE, &oldProtection);
mem_seek R8(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0, FA2C4, 2E11D0);
if (version_D2Game == V114d) {
MEMT_DWORD(0x00565A90, openPandPortal);
MEMT_DWORD(0x00565AA0, openPandFinalPortal);
} else {
MEMT_DWORD( D2OpenPandPortal , openPandPortal);
MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal);
}
//0201E357 |. FFD0 |CALL EAX
//01FA77E7 |. FFD0 |CALL EAX
//6FCF3CC7 |. FFD0 |CALL EAX
//6FC92437 |. FFD0 |CALL EAX
//6FCB7127 |. FFD0 |CALL EAX
//00565D45 . FFD0 CALL EAX
VirtualProtect((LPVOID)R8(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0, FA2C4, 2E11D0), 8, oldProtection, &oldProtection);
// manage uberIA (fct table at 0209E7E8)
VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection);
if (version_D2Game == V114d) {
mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330);
MEMT_DWORD(0x005FD200, uberBaalIA);
MEMT_DWORD( D2UberBaalAI , uberBaalAI);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340);
MEMT_DWORD(0x005F81C0, uberMephIA);
MEMT_DWORD( D2UberMephAI , uberMephAI);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350);
MEMT_DWORD(0x005E9DF0, uberDiabloIA);
} else {
mem_seek R8(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0, 10F618, 33D330);
MEMT_DWORD(D2UberBaalIA, uberBaalIA);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0, 10F628, 33D340);
MEMT_DWORD(D2UberMephIA, uberMephIA);
mem_seek R8(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0, 10F638, 33D350);
MEMT_DWORD(D2UberDiabloIA, uberDiabloIA);
}
MEMT_DWORD( D2UberDiabloAI , uberDiabloAI);
VirtualProtect((LPVOID)(R8(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788, 10ED00, 33CA18) + 145*0x10), 0x30, oldProtection, &oldProtection);
//0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8
//01FD2BE7 |> B8 D0EC0702 MOV EAX,D2Game.0207ECD0
//6FC3B597 |> B8 58EFD26F MOV EAX,D2Game.6FD2EF58
//6FCBD157 |> B8 88E7D26F MOV EAX,D2Game.6FD2E788
//6FC5C617 |> B8 00EDD26F MOV EAX,D2Game.6FD2ED00
//005B163D |. B8 18CA7300 MOV EAX,Game.0073CA18
// spawn Uber
// mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000);
@ -384,49 +504,17 @@ void Install_UberQuest()
//02028DAC |. E8 491CF7FF CALL <JMP.&D2Common.#10872>
mem_seek R8(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB, BE9AB, 12D1DC);
if (version_D2Game == V114d) {
MEMT_REF4(0x00015960, caller_spawnUber);
} else {
MEMC_REF4(D2Game235C0, spawnUber);
}
MEMC_REF4( V2Game235C0 , version_D2Game >= V114d ? (DWORD)caller_spawnUber : (DWORD)spawnUber);
//020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10
//02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0
//6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410
//6FC4CCAA |. E8 3134FFFF ||CALL D2Game.6FC400E0
//6FCDE9AA |. E8 D1AFF9FF ||CALL D2Game.6FC79980
//0052D1DB |. E8 60590100 ||CALL Game.00542B40
log_msg("\n");
isInstalled = true;
}
/*
call fct to manage TP :
0201E33E |. 8B048D 78A4070>|MOV EAX,DWORD PTR DS:[ECX*4+207A478] ; D2Game.0201B480
0201E345 |. 85C0 |TEST EAX,EAX
0201E347 |. 74 14 |JE SHORT D2Game.0201E35D
0201E349 |. 8B9424 2C01000>|MOV EDX,DWORD PTR SS:[ESP+12C]
0201E350 |. 8B8C24 2801000>|MOV ECX,DWORD PTR SS:[ESP+128]
0201E357 |. FFD0 |CALL EAX
0201E359 |. 894424 38 |MOV DWORD PTR SS:[ESP+38],EAX
DWORD FASTCALL openPortal (Unit* ptGame, Unit* ptChar)
0201C6D0 : CowPortal
0201B480 : Pand. Portal return 0 !!
0201B470 : Pand. FInal Portal
manage IA
0202AD8B |> 66:8B46 1E MOV AX,WORD PTR DS:[ESI+1E]
0202AD8F |. 66:85C0 TEST AX,AX
0202AD92 |. 7C 13 JL SHORT D2Game.0202ADA7
0202AD94 |. 66:3D 9400 CMP AX,94
0202AD98 |. 73 0D JNB SHORT D2Game.0202ADA7
0202AD9A |. 0FBFC0 MOVSX EAX,AX
0202AD9D |. C1E0 04 SHL EAX,4
0202ADA0 |. 05 E8E70902 ADD EAX,D2Game.0209E7E8
0202ADA5 |. 5E POP ESI
0202ADA6 |. C3 RETN
0202ADA7 |> B8 E8E70902 MOV EAX,D2Game.0209E7E8
0202ADAC |. 5E POP ESI
0202ADAD \. C3 RETN
*/
/*================================= END OF FILE =================================*/

View File

@ -44,10 +44,10 @@ void updateClient(Unit* ptChar, DWORD mFunc, char* msg)
packet.mFunc = (BYTE)mFunc;
packet.mSize = sizeof(DataPacket);
packet.mPlayerID = ptChar->nUnitId;
if (msg != NULL && strlen(msg) >= 20)
if (msg != NULL && strlen(msg) > 20)
return;
if (msg != NULL)
strcpy((char*)&packet.mItemID, msg);
strncpy((char*)&packet.mItemID, msg, 20);
ptNetClient = D2GetClient(ptChar, __FILE__, __LINE__);
@ -62,7 +62,13 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet)
{
case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1;
case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1;
case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1;
case UC_PAGE_NAME:
{
char pageName[21];
strncpy(pageName, (char*)&packet->mItemID, 20);
pageName[20] = NULL;
renameCurrentStash(D2GetClientPlayer(), pageName); return 1;
}
default : return 0;
}
}
@ -70,8 +76,6 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet)
FCT_ASM ( caller_handleClientUpdate_114 )
LEA ECX,DWORD PTR SS:[ESP]
CALL handleClientUpdate
POP EDI
POP ESI
MOV ESP,EBP
POP EBP
RETN
@ -104,13 +108,14 @@ void Install_UpdateClient()
// execute if it's our packet else continue
mem_seek R8(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96, 5EC99);
MEMT_REF4( version_D2Client == V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client == V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
MEMT_REF4( version_D2Client >= V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
//6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690
//6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789
//6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59
//6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9
//6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969
//6FB34D94 |. 0F87 CF000000 JA D2Client.6FB34E69
//0045EC97 |. 0F87 CE000000 JA Game.0045ED6B
log_msg("\n");

View File

@ -14,8 +14,16 @@
#include "commands.h"
#include "common.h"
void updateServer(WORD p)
{
if (!onRealm)
D2SendToServer3(0x3A, p);
}
int renameIndex = 0;
char renameString[16];
char renameString[21];
DWORD PageSwap;
int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
@ -63,24 +71,26 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
case US_SWAP0_TOGGLE : swapStash(ptChar, PageSwap | arg, true); PageSwap = 0; return 1;
case US_RENAME :
if (renameIndex == 0)
for (int i = 0; i < 16; i++)
renameString[i] = 0;
ZeroMemory(renameString, sizeof(renameString));
if (arg != NULL && renameIndex < 15)
renameString[renameIndex++] = (char)arg;
if (arg == 0)
if (arg == NULL)
{
renameString[renameIndex] = NULL;
renameIndex = 0;
log_msg("Rename on Server : %s -> %s\n", ptChar->ptPlayerData->name, renameString);
strcpy(ptChar->ptPlayerData->name, renameString);
strcpy(ptChar->ptPlayerData->ptNetClient->name, renameString);
log_msg("Rename on Server : %s -> %s\n", PCPlayerData->name, renameString);
strcpy(PCPlayerData->name, renameString);
strcpy(PCPlayerData->ptNetClient->name, renameString);
}
return 1;
case US_PAGENAME:
if (renameIndex == 0)
for (int i = 0; i < 16; i++)
renameString[i] = 0;
ZeroMemory(renameString, sizeof(renameString));
if (arg != NULL && renameIndex < 20)
renameString[renameIndex++] = (char)arg;
if (arg == 0)
if (arg == NULL)
{
renameString[renameIndex] = NULL;
renameIndex = 0;
log_msg("Rename current page on Server : %s -> %s\n", PCPY->currentStash->name, renameString);
renameCurrentStash(ptChar, renameString);
@ -180,6 +190,9 @@ void Install_UpdateServer()
//066A76C3 |. C1EE 08 SHR ESI,8
//066A76C6 |. 57 PUSH EDI
//066A76C7 |. 8BF8 MOV EDI,EAX
//0054BD38 |. C1EE 08 SHR ESI,8
//0054BD3B |. 57 PUSH EDI
//0054BD3C |. 8BF8 MOV EDI,EAX
} else if (version_D2Game == V110) {
memt_byte( 0xC1, 0xE8 ); // CALL caller_handleServerUpdate
MEMT_REF4( 0xF88B08EE, caller_handleServerUpdate);

View File

@ -8,17 +8,17 @@
#include "windowed.h"
#include "common.h"
int active_Windowed = true;
int active_Windowed = false;
int setWindowedOptionsDone = false;
int active_RemoveBorder = true;
int active_WindowOnTop = true;
int active_Maximized = true;
int active_SetWindowPos = true;
int windowedX = 240;
int active_RemoveBorder = false;
int active_WindowOnTop = false;
int active_Maximized = false;
int active_SetWindowPos = false;
int windowedX = 0;
int windowedY = 0;
int windowedWidth = 1440;
int windowedHeight = 1080;
int active_LockMouseOnStartup = true;
int windowedWidth = 800;
int windowedHeight = 600;
int active_LockMouseOnStartup = false;
void unlockMouseCursor()
{

View File

@ -28,7 +28,7 @@ DWORD WEactive = 0;
DWORD DCloneSpawned = 0;
DWORD nbSOJSold = 0;
DWORD nbNeedSOJSold = 100;
DWORD nbNeedSOJSold = 0;
DWORD nbManagedSOJSold = 0;
DWORD nbTicksForNextSOJSold = 0;
@ -80,21 +80,26 @@ Game* STDCALL WEManagement(DWORD clientID)
if (!ptGame) return ptGame;
if (active_AutomaticSell)
{
while (GetTickCount() - prevTicks >= nbTicksForNextSOJSold)
{
nbSOJSold++;
prevTicks = prevTicks + nbTicksForNextSOJSold;
nbTicksForNextSOJSold = getTicksForNextSOJSold();
}
}
if (nbSOJSold == nbManagedSOJSold) return ptGame;
if (nbSOJSold == nbManagedSOJSold)
return ptGame;
DWORD newWE;
if (!WEactive && (ptGame->difficultyLevel == D2DM_HELL) && (nbSOJSold >= nbNeedSOJSold))
{
newWE = 1;
WEactive = 1;
} else newWE = 0;
}
else
newWE = 0;
if ( showSOJSoldCounterInAllDiff || (ptGame->difficultyLevel == D2DM_HELL))
worldEventBroadcast(ptGame, newWE, nbSOJSold);
@ -109,10 +114,11 @@ DWORD FASTCALL spawnDClone(Game* ptGame, Room* ptRoom, DWORD p3, DWORD p4, DWORD
if (WEactive && (ptGame->difficultyLevel == D2DM_HELL) && !DCloneSpawned)
{
DCloneSpawned=1;
D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,worldEventmonsterID,p8);
D2SpawnSuperUnique(ptGame,ptRoom,p3,p4,p5,p6,worldEventmonsterID,p8);
return 0;//no minions
}
else return D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,monsterID,p8);
else
return D2SpawnSuperUnique(ptGame,ptRoom,p3,p4,p5,p6,monsterID,p8);
}
DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char* filename)
@ -120,11 +126,6 @@ DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char*
ItemsBIN* ptItemStats = D2GetItemsBIN(ptItem->nTxtFileNo);
ItemsBIN* ptWantedItemStats = D2GetItemsBIN(itemNeeded.ID);
log_msg("D2CheckItemType() = %u\n\n", D2CheckItemType(ptItem, itemNeeded.ID));
log_msg("D2GetUniqueID() = %u\n\n", D2GetUniqueID(ptItem));
log_msg("D2isEtheral() = %u\n\n", D2isEtheral2(ptItem, 0, 0, 0, 0, 0, 0));
log_msg("itemNeeded.ID = %u\n\n", itemNeeded.ID);
if((itemNeeded.byItemTypeID && D2CheckItemType(ptItem,itemNeeded.ID))
|| (itemNeeded.byItemID && (itemNeeded.ID == 0xFFFF))
|| (itemNeeded.byItemID && !itemNeeded.includeUpgradedVersions && ((DWORD)itemNeeded.ID == ptItem->nTxtFileNo))
@ -139,8 +140,8 @@ DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char*
if(!(itemNeeded.isSpecificItem && (D2GetUniqueID(ptItem) != itemNeeded.specificID-1))
&& !(itemNeeded.haveNoSocket && (D2GetPlayerStat(ptItem, STATS_ITEM_NUMSOCKETS, 0) > 0))
&& !(itemNeeded.haveSockets && (D2GetPlayerStat(ptItem, STATS_ITEM_NUMSOCKETS, 0) == 0))
&& !(itemNeeded.isNotEthereal && D2isEtheral(ptItem))
&& !(itemNeeded.isEthereal && !D2isEtheral(ptItem))
&& !(itemNeeded.isNotEthereal && ptItem->ptItemData->isEtheral)
&& !(itemNeeded.isEthereal && !ptItem->ptItemData->isEtheral)
&& !(itemNeeded.isBasic && (ptItemStats->ItemCode != ptWantedItemStats->NormCode))
&& !(itemNeeded.isExceptional && (ptItemStats->ItemCode != ptWantedItemStats->UberCode))
&& !(itemNeeded.isElite && (ptItemStats->ItemCode != ptWantedItemStats->HellCode))
@ -167,8 +168,15 @@ void initWorldEventVariables()
while (nbSOJSold >= nbNeedSOJSold)
nbNeedSOJSold += (DWORD)(rand()/(RAND_MAX+1.0)*triggerAtSolJSoldDelta + triggerAtSolJSoldMin);
log_msg("initWorldEventVariables - nbSOJSold = %d, nbNeedSOJSold = %d\n", nbSOJSold, nbNeedSOJSold);
}
FCT_ASM ( caller_WEManagement_114 )
PUSH ECX
CALL WEManagement
RETN
}}
FCT_ASM ( caller_WEManagement_1XX )
POP EAX
@ -227,8 +235,6 @@ FCT_ASM( caller_spawnDClone_114 )
POP EBX
RETN 0x18
}}
FCT_ASM( caller_addClientForWE_111 )
PUSH EAX
CALL initWorldEventVariables
@ -264,60 +270,48 @@ void Install_WorldEvent()
// spawn DClone
mem_seek R8(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280, CFBD0, 1A4A4F);
if (version_D2Client == V114d) {
MEMT_REF4(0xFFFFBF8D, caller_spawnDClone_114);
} else {
MEMC_REF4(V2SpawnMonster, version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone);
}
MEMC_REF4( V2SpawnSuperUnique , version_D2Game >= V114a ? (DWORD)caller_spawnDClone_114 : version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone);
//6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220
//01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0
//0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0
//6FC6156F |. E8 1CF6FFFF CALL D2Game.6FC60B90 ; \D2Game.6FC60B90
//6FC4527F |. E8 CCF6FFFF CALL D2Game.6FC44950 ; \D2Game.6FC44950
//6FCEFBCF |. E8 4CE2FFFF CALL D2Game.6FCEDE20 ; \D2Game.6FCEDE20
//005A4A4E |. E8 8DBFFFFF CALL Game.005A09E0 ; \Game.005A09E0
// verify if the item sold is a trigger of WE
mem_seek R8(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29, 72BE9, 179667);
if (version_D2Game == V114d) {
MEMT_REF4(0x000AEA35, verifIfWEItem);
} else {
MEMJ_REF4( D2TestFlags , verifIfWEItem);
}
//6FCC77CF |. E8 32400500 CALL <JMP.&D2Common.#10707>
//0200E798 |. E8 E9BDF7FF CALL <JMP.&D2Common.#10911>
//02002858 |. E8 E57DF7FF CALL <JMP.&D2Common.#10303>
//6FCA4498 |. E8 3B62F8FF CALL <JMP.&D2Common.#10989>
//6FCDFB28 |. E8 77ADF4FF CALL <JMP.&D2Common.#10202>
//6FC92BE8 |. E8 DD7AF9FF CALL <JMP.&D2Common.#10458>
//00579666 |. E8 35EA0A00 CALL Game.006280A0 ; \Game.006280A0
// management of the WorldEvent
mem_seek R8(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51, 1389B1);
if (version_D2Game == V114d) {
MEMT_REF4(0xFFFF752B, caller_WEManagement_1XX);
} else {
MEMC_REF4(V2GetGameByClientID, version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX);
}
mem_seek R8(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791, E5F51, 12FEED);
MEMC_REF4( V2GetGameByClientID , version_D2Game >= V114a ? (DWORD)caller_WEManagement_114 : version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX);
//6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0
//01FD1F00 |. E8 1BE60800 CALL D2Game.02060520
//02035680 |. E8 1BF30100 CALL D2Game.020549A0
//6FD0BF40 |. E8 1BA4FBFF CALL D2Game.6FCC6360
//6FC6A790 |. E8 4B03FEFF CALL D2Game.6FC4AAE0
//6FD05F50 |. E8 AB67FDFF CALL D2Game.6FCDC700
//0052FEEC |. E8 6FE9FFFF CALL Game.0052E860
//to check : 005389B0 |. E8 2B75FFFF CALL Game.0052FEE0
// add client for the WorldEvent
mem_seek R8(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF, D556F, 13F2D2);
if (version_D2Game == V114d) {
MEMT_REF4(0xFFFED27A, caller_addClientForWE);
}
else {
MEMC_REF4(D2AddClient, version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE);
}
MEMC_REF4( D2AddClient , version_D2Game >= V111 && version_D2Game <= V113d ? caller_addClientForWE_111 : caller_addClientForWE);
//6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60
//01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0
//01FE0559 |. E8 B27C0700 CALL D2Game.02058210
//6FC8265E |. E8 FD890800 CALL D2Game.6FD0B060
//6FCEB0BE |. E8 6DE8F7FF CALL D2Game.6FC69930
//6FCF556E |. E8 FDFA0000 CALL D2Game.6FD05070
//0053F2D1 |. E8 7AD2FEFF CALL Game.0052C550
log_msg("\n");

View File

@ -2,9 +2,6 @@
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
this file implements some common and useful
function related to some Diablo II mechanisms.
/*============================================*/
#pragma once

View File

@ -30,6 +30,7 @@ extern s_shifting shifting;
#define STDCALL __stdcall
#define FCT_ASM(N) __declspec(naked) void N() {__asm{
#define RANDOM(V) ((int)(rand()/(RAND_MAX+1.0)*(V)))
#define RANDOMF() ((double)rand() / (double)RAND_MAX)
//#define RANDOM(V) (rand()%(V))
//#define PY(C) (*(PYPlayerData**)((BYTE*)(ptChar)+shifting.ptPYPlayerData))
@ -87,7 +88,10 @@ extern DataTables* SgptDataTables;
extern TD2AddPlayerStat V2AddPlayerStat;
extern TD2GetGameByClientID V2GetGameByClientID;
extern TD2SpawnSuperUnique V2SpawnSuperUnique;
extern TD2SpawnMonster V2SpawnMonster;
extern TD2Game235C0 V2Game235C0;
extern TD2ReadFile V2ReadFile;
//extern TD2SetColorPopup V2SetColorPopup;
extern WORD (*getDescStrPos) (DWORD statID);
extern void* (STDCALL *compileTxtFile)(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength);
@ -102,13 +106,14 @@ void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color,
#define WindowStartX (*ptWindowStartX)
#define GameTypeMode (*ptGameTypeMode)
#define ClientTable (*ptClientTable)
//#define CurrentNPCNum (*ptCurrentNPCNum)
#define IsLodGame (*ptIsLodGame)
#define DifficultyLevel (*ptDifficultyLevel)
#define MouseY (*ptMouseY)
#define MouseX (*ptMouseX)
#define ptClientChar (*ptptClientChar)
//#define CurrentNPCNum (*ptCurrentNPCNum)
#define InputCommandLen (*ptInputCommandLen)
#define InputCommand (*ptInputCommand)
void initD2functions();

View File

@ -1,20 +1,11 @@
/******************************************************************************
File modified by Yohann NICOLAS.
File created by Yohann NICOLAS.
NAME
inifile.h
DESCRIPTION
Memory cached INI file read/write class to replace legacy MS code
COPYRIGHT
©1999-2004 Ultrafunk (www.ultrafunk.com) - info@ultrafunk.com
Main Diablo II extra DLL handler.
******************************************************************************/
#pragma once
#include <windows.h>
extern int version_Game;
//extern int version_binkw32;
//extern int version_Bnclient;

View File

@ -12,9 +12,10 @@
#include <windows.h>
extern DWORD active_logFile;
extern int active_logFile;
void log_initfile();
void log_close();
void log_box( const char* pFormat, ... );
void log_msg( const char* pFormat, ... );
void d2_assert( bool pCondition, char* pLocation, char* pMessage, int pLineNbr );

View File

@ -1,5 +1,6 @@
/*=================================================================
File created by Yohann NICOLAS.
Add DoNotCloseNihlathakPortal by haxifix.
More little options.
@ -8,17 +9,19 @@
#include "common.h"
extern int active_DisplayItemLevel;
extern bool active_DisplayItemLevel;
extern DWORD nbPlayersCommandByDefault;
extern DWORD nbPlayersCommand;
extern int active_alwaysRegenMapInSP;
extern int active_RunLODs;
extern bool active_alwaysRegenMapInSP;
extern bool active_RunLODs;
extern int active_AlwaysDisplayLifeMana;
extern int active_EnabledTXTFilesWithMSExcel;
extern int active_DisplayBaseStatsValue;
extern int active_LadderRunewords;
extern int active_EnabledCowPortalWhenCowKingWasKill;
extern int active_DoNotCloseNihlathakPortal;
extern bool active_EnabledTXTFilesWithMSExcel;
extern bool active_DisplayBaseStatsValue;
extern bool active_LadderRunewords;
extern bool active_EnabledCowPortalWhenCowKingWasKill;
extern bool active_DoNotCloseNihlathakPortal;
extern bool active_MoveCainNearHarrogathWaypoint;
extern bool active_RemoveExperienceDiminushingReturn;
void Install_DisplayItemLevel();
void Install_SendPlayersCommand();
@ -30,5 +33,7 @@ void Install_DisplayBaseStatsValue();
void Install_LadderRunewords();
void Install_EnabledCowPortalWhenCowKingWasKill();
void Install_DoNotCloseNihlathakPortal();
void Install_MoveCainNearHarrogathWaypoint();
void Install_RemoveExperienceDiminushingReturn();
/*================================= END OF FILE =================================*/

View File

@ -13,13 +13,57 @@ extern DWORD maxSharedPages;
extern DWORD nbPagesPerIndex;
extern DWORD nbPagesPerIndex2;
extern bool active_multiPageStash;
extern int active_SharedStashInMultiPlayer;
extern bool active_sharedStash;
extern bool active_sharedGold;
extern bool separateHardSoftStash;
extern char* sharedStashFilename;
extern bool displaySharedSetItemNameInGreen;
extern int posXPreviousBtn,posYPreviousBtn,posXNextBtn,posYNextBtn,posXSharedBtn,posYSharedBtn,posXPreviousIndexBtn,posYPreviousIndexBtn,posXNextIndexBtn,posYNextIndexBtn,posXPutGoldBtn,posYPutGoldBtn,posXTakeGoldBtn,posYTakeGoldBtn;
extern int posXPreviousBtn;
extern int posYPreviousBtn;
extern int posWPreviousBtn;
extern int posHPreviousBtn;
extern int posXNextBtn;
extern int posYNextBtn;
extern int posWNextBtn;
extern int posHNextBtn;
extern int posXSharedBtn;
extern int posYSharedBtn;
extern int posWSharedBtn;
extern int posHSharedBtn;
extern int posXPreviousIndexBtn;
extern int posYPreviousIndexBtn;
extern int posWPreviousIndexBtn;
extern int posHPreviousIndexBtn;
extern int posXNextIndexBtn;
extern int posYNextIndexBtn;
extern int posWNextIndexBtn;
extern int posHNextIndexBtn;
extern int posXPutGoldBtn;
extern int posYPutGoldBtn;
extern int posWPutGoldBtn;
extern int posHPutGoldBtn;
extern int posXTakeGoldBtn;
extern int posYTakeGoldBtn;
extern int posWTakeGoldBtn;
extern int posHTakeGoldBtn;
extern int posXStashNameField;
extern int posYStashNameField;
extern int posWStashNameField;
extern int posHStashNameField;
extern int posXStashGoldField;
extern int posYStashGoldField;
extern int posWStashGoldField;
extern int posHStashGoldField;
extern bool autoRenameStashPage;
extern DWORD PersonalNormalPageColor;
extern DWORD PersonalIndexPageColor;
extern DWORD PersonalMainIndexPageColor;
extern DWORD SharedNormalPageColor;
extern DWORD SharedIndexPageColor;
extern DWORD SharedMainIndexPageColor;
void toggleToSharedStash(Unit* ptChar);
void toggleToSelfStash(Unit* ptChar);
@ -37,13 +81,17 @@ void renameCurrentStash(Unit* ptChar, char* name);
void insertStash(Unit* ptChar);
bool deleteStash(Unit* ptChar, bool isClient);
void selectStash(Unit* ptChar, Stash* newStash);
void updateSelectedStashClient(Unit* ptChar);
void selectStash(Unit* ptChar, Stash* newStash, bool forceUpdate = false);
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags, bool bOnlyItems);
Stash* addStash(Unit* ptChar, bool isShared);
Stash* addStash(Unit* ptChar, bool isShared, bool autoSetIndex, Stash* ptStash = NULL);
DWORD loadStashList(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize, bool isShared);
void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD* curSize);
void getCurrentStashName(WCHAR* buffer, DWORD maxSize, Unit* ptChar);
WCHAR* getDefaultStashName(Unit* ptChar);
void Install_MultiPageStash();
/*================================= END OF FILE =================================*/

View File

@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add "plugY v1.00" on screen.
Print PlugY version on screen.
=================================================================*/
#pragma once

View File

@ -20,7 +20,7 @@ void memt_dword(DWORD old, DWORD val);
void memt_ref4(DWORD old, DWORD ref);
//CALL <JMP.&D2gfx.#10047>
#define MEMJ_REF4(O, R) memj_ref4((DWORD)(O), (DWORD)(R))
#define MEMJ_REF4(O, R) if (version_Game < V114a) memj_ref4((DWORD)(O), (DWORD)(R)); else memc_ref4((DWORD)(O), (DWORD)(R))
void memj_ref4(DWORD old, DWORD ref);
//CALL D2Common.6FD5F500
@ -31,6 +31,4 @@ void memc_ref4(DWORD old, DWORD ref);
#define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R))
void memd_ref4(DWORD old, DWORD ref);
void patchMemory4(DWORD value);
/*================================= END OF FILE =================================*/

View File

@ -12,6 +12,7 @@
#define isOnStatsPage(x,y) ((x<400) && (y<553))
extern DWORD bDontPrintBorder;
extern int extraHiddenPage;
void GoNextStatPage();
void GoPreviousStatPage();

View File

@ -6,7 +6,7 @@
=================================================================*/
#pragma once
#define PLUGY_VERSION "12.00"
#define PLUGY_VERSION "14.00"
enum TargetMod
{

View File

@ -8,6 +8,10 @@
#include "common.h"
extern bool active_AutoBackup;
extern int maxBackupPerCharacter;
void backupSaveFiles(char* name, int isHardCoreGame);
void Install_SavePlayerData();
/*================================= END OF FILE =================================*/

View File

@ -9,7 +9,7 @@
#include "common.h"
extern bool active_SkillsPoints;
extern bool unassignSkillsPointsOneByOne;
extern bool unassignSkillsPointsOneForOne;
extern int posXUnassignSkillBtn, posYUnassignSkillBtn;
void UnassignAllSkillsPoints(Unit* ptChar);

View File

@ -9,6 +9,33 @@
#include "common.h"
extern bool active_UberQuest;
extern DWORD UberMephistoX;
extern DWORD UberMephistoY;
extern DWORD UberDiabloX;
extern DWORD UberDiabloY;
extern DWORD UberBaalX;
extern DWORD UberBaalY;
extern bool active_UberMinions;
//extern DWORD UberMephistoNbMinions;
//extern DWORD UberMephistoMinions[];
extern int UberMephistoSpawnPercent;
extern DWORD UberMephistoSpawnRadius;
//extern DWORD UberBaalNbMinions;
//extern DWORD UberBaalMinions[];
extern int UberBaalSpawnPercent;
extern DWORD UberBaalSpawnRadius;
//extern DWORD UberDiabloNbMinions;
//extern DWORD UberDiabloMinions[];
extern int UberDiabloSpawnPercent;
extern DWORD UberDiabloSpawnRadius;
extern bool active_UberDiabloRushTweekAI;
extern bool active_UberBaalTeleportTweekAI;
extern bool active_UberBaalChillingArmorTweekAI;
extern int uberBaalChillingArmorTimer;
void Install_UberQuest();
void resetQuestState();

View File

@ -8,7 +8,8 @@
#include "common.h"
__inline void updateServer(WORD p) {if (!onRealm) D2SendToServer3(0x3A, p);};
void updateServer(WORD p);
void Install_UpdateServer();
/*================================= END OF FILE =================================*/

View File

@ -265,7 +265,7 @@ int main(int argc, char * argv[])
{
msgBox(boxName, MB_OK | MB_ICONEXCLAMATION,
"Current version of LoD (%s) isn't compatible with PlugY.\n\n"
"Please, install a patch between 1.09 and 1.13d or 1.14.",
"Please, install a patch between 1.09 and 1.13d or 1.14d.",
GetVersionString(version));
exit(0);
}

View File

@ -1,11 +1,11 @@
//Script de ressources g<EFBFBD>n<EFBFBD>r<EFBFBD> par Microsoft Visual C++.
//Script de ressources généré par Microsoft Visual C++.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// G<EFBFBD>n<EFBFBD>r<EFBFBD> <20> partir de la ressource TEXTINCLUDE 2.
// Généré à partir de la ressource TEXTINCLUDE 2.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
@ -50,7 +50,7 @@ BEGIN
VALUE "LegalCopyright", "Copyright (C) 2017"
VALUE "OriginalFilename", "PlugYInstall.exe"
VALUE "ProductName", "PlugY, The Survival Kit"
VALUE "ProductVersion", "12.00"
VALUE "ProductVersion", "14.00"
END
END
BLOCK "VarFileInfo"

Binary file not shown.

View File

@ -5,13 +5,13 @@
; ;
; by Yohann Nicolas ;
; ;
; version 12.00 ;
; version 14.00 ;
; ;
;--------------------------------------------------------------------------------------;
; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation.
; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information.
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt für weitere Informationen
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt für weitere Informationen
[LAUNCHING]
Param=
@ -49,7 +49,10 @@ SelectedLanguage=ENG
[SAVEPATH]
ActiveSavePathChange=0
SavePath=Save\Mod PlugY\
SavePath=Mod PlugY
ActiveAutoBackup=1
MaxBackupPerCharacter=5
[MAIN SCREEN]
@ -68,8 +71,16 @@ ActiveMultiPageStash=1
NbPagesPerIndex=10
NbPagesPerIndex2=100
MaxPersonnalPages=0
AutoRenameStashPage=1
PersonalNormalPageColor=0
PersonalIndexPageColor=12
PersonalMainIndexPageColor=9
SharedNormalPageColor=4
SharedIndexPageColor=8
SharedMainIndexPageColor=1
ActiveSharedStash=1
ActiveSharedStashInMultiPlayer=0
SeparateHardcoreStash=1
OpenSharedStashOnLoading=0
DisplaySharedSetItemNameInGreen=1
@ -81,13 +92,13 @@ ActiveSharedGold=1
ActiveStatsUnassignment=1
KeyUsed=18
ActiveShiftClickLimit=0
LimitValueToShiftClick=5
ActiveShiftClickLimit=1
LimitValueToShiftClick=10
[SKILLS POINTS]
ActiveSkillsUnassignment=1
ActiveSkillsUnassignmentOneByOne=0
ActiveSkillsUnassignmentOneForOne=0
[WORLD EVENT]
@ -107,6 +118,24 @@ TimeBeforeAutoSellMax=1200
[UBER QUEST]
ActiveUberQuest=1
UberMephistoX=25130
UberMephistoY=5143
UberDiabloX=25139
UberDiabloY=5139
UberBaalX=25139
UberBaalY=5135
ActiveUberMinions=1
UberMephistoSpawnPercent=80
UberMephistoSpawnRadius=30
UberBaalSpawnPercent=30
UberBaalSpawnRadius=30
UberDiabloSpawnPercent=30
UberDiabloSpawnRadius=30
ActiveUberDiabloRushTweekAI=1
ActiveUberBaalTeleportTweekAI=1
ActiveUberBaalChillingArmorTweekAI=1
UberBaalChillingArmorTimer=6000
[INTERFACE]
@ -117,15 +146,14 @@ SelectMainPageOnOpenning=1
[EXTRA]
ActiveLaunchAnyNumberOfLOD=1
AlwaysRegenMapInSP=0
NBPlayersByDefault=0
NBPlayersByDefault=1
ActiveDisplayItemLevel=1
AlwaysDisplayLifeAndManaValues=0
EnabledTXTFilesWhenMSExcelOpenIt=0
ActiveDisplayBaseStatsValue=1
ActiveLadderRunewords=1
ActiveCowPortalWhenCowKingWasKilled=1
; More features later... :)
ActiveDoNotCloseNihlathakPortal=1
MoveCainNearHarrogathWaypoint=1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -1,8 +1,9 @@
Unicode True
; File created by Yohann NICOLAS.
Unicode True
!include "MUI2.nsh"
!define VERSION "12.00"
!define VERSION "v14.00"
!define D2FILES "."
!define NAME "PlugY, The Survival Kit"
!define MOD_DIR "Mod PlugY"
@ -10,6 +11,7 @@
!define UNINSTALL_FILE "PlugY Uninstaller.exe"
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_ICON "..\PlugYRun\PlugY.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "PlugYInstallerHeader.bmp"
!define MUI_LANGDLL_REGISTRY_ROOT HKLM
@ -25,8 +27,8 @@
!define MUI_ABORTWARNING
;!define MUI_UNABORTWARNING
Name "${NAME} v${VERSION}"
OutFile "PlugY_The_Survival_Kit_v${VERSION}.exe"
Name "${NAME} ${VERSION}"
OutFile "PlugY_The_Survival_Kit_${VERSION}_Installer.exe"
InstallDirRegKey HKLM "${REGKEY}" "InstallPath"
;--------------------------------
@ -46,66 +48,79 @@ InstallDirRegKey HKLM "${REGKEY}" "InstallPath"
;--------------------------------
; Languages
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "TradChinese"
LangString DESC_CORE ${LANG_ENGLISH} "Core files.$\nPlugY.dll will be installed in Diablo II directory."
LangString DESC_CORE ${LANG_GERMAN} "Hauptdateien.$\nPlugY.dll wird in das Installationsverzeichnis von Diablo II installiert."
LangString DESC_CORE ${LANG_FRENCH} "Fichiers nécessaires.$\nPlugY.dll sera installé dans le répertoire de Diablo II."
LangString DESC_CORE ${LANG_GERMAN} "Hauptdateien.$\nPlugY.dll wird in das Installationsverzeichnis von Diablo II installiert."
LangString DESC_CORE ${LANG_RUSSIAN} "Основные файлы.$\nPlugY.dll должен быть установлен в каталог Diablo II."
LangString DESC_CORE ${LANG_TRADCHINESE} "核心檔案。$\nPlugY.dll 將被安裝於 Diablo II 目錄。"
LangString DESC_DESKTOP_SHORTCUTS ${LANG_ENGLISH} "Add shortcut on Desktop to launch Diablo II with ${NAME}."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_GERMAN} "Fügt eine Verknüpfung auf dem Desktop mit dem Namen ${NAME} hinzu mit der Diablo II gestartet werden kann."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_FRENCH} "Ajoute un raccourci pour démarrer Diablo II avec ${NAME}."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_GERMAN} "Fügt eine Verknüpfung auf dem Desktop mit dem Namen ${NAME} hinzu mit der Diablo II gestartet werden kann."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлык на рабочий стол для запуска Diablo II с ${NAME}."
LangString DESC_DESKTOP_SHORTCUTS ${LANG_TRADCHINESE} "在桌面新增捷徑以藉由 ${NAME} 執行 Diablo II。"
LangString DESC_MENU_SHORTCUTS ${LANG_ENGLISH} "Add shortcuts in start menu."
LangString DESC_MENU_SHORTCUTS ${LANG_GERMAN} "Fügt Verknüpfungen im Startmenü hinzu."
LangString DESC_MENU_SHORTCUTS ${LANG_FRENCH} "Ajoute des raccourcis dans le menu démarrer."
LangString DESC_MENU_SHORTCUTS ${LANG_GERMAN} "Fügt Verknüpfungen im Startmenü hinzu."
LangString DESC_MENU_SHORTCUTS ${LANG_RUSSIAN} "Добавить ярлыки в главное меню."
LangString DESC_MENU_SHORTCUTS ${LANG_TRADCHINESE} "新增「開始」功能表捷徑"
LangString DESC_UNINSTALLER ${LANG_ENGLISH} "Create a Windows uninstall program.$\nAdding registry keys in Windows."
LangString DESC_UNINSTALLER ${LANG_GERMAN} "Erzeugt ein Deinstallationsprogramm.$\nWindows Registrierungseinträge werden erstellt."
LangString DESC_UNINSTALLER ${LANG_FRENCH} "Crée un programme Windows de désinstallation.$\nAjoute des clés de registres dans Windows."
LangString DESC_UNINSTALLER ${LANG_GERMAN} "Erzeugt ein Deinstallationsprogramm.$\nWindows Registrierungseinträge werden erstellt."
LangString DESC_UNINSTALLER ${LANG_RUSSIAN} "Создать в Windows деинстллятор программы.$\nДобавляет ключи реестра в Windows."
LangString DESC_UNINSTALLER ${LANG_TRADCHINESE} "建立 Windows 解除安裝程式。$\n加入 Windows 登錄訊息。"
LangString DESC_PATCH_FILE ${LANG_ENGLISH} "Patcher to run PlugY without PlugY.exe. Before use it, you MUST read the readme."
LangString DESC_PATCH_FILE ${LANG_FRENCH} "Patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI."
LangString DESC_PATCH_FILE ${LANG_GERMAN} "Patcher um PlugY ohne PlugY.exe zu starten.$\nDie LiesMich-Datei MUSS vor Benutzung gelesen werden."
LangString DESC_PATCH_FILE ${LANG_FRENCH} "D2gfx.dll patcheur pour lancer PlugY sans PlugY.exe. Avant de l'utiliser, vous DEVEZ lire le LISEZ-MOI."
LangString DESC_PATCH_FILE ${LANG_RUSSIAN} "Применить патч для запуска PlugY без PlugY.exe. Подробнее смотреть в файле Readme."
LangString DESC_PATCH_FILE ${LANG_TRADCHINESE} "更改遊戲檔案以不藉由 PlugY.exe 而執行 PlugY。使用前您「必須」閱讀「讀我檔案」。"
LangString SECTION_NAME_CORE ${LANG_ENGLISH} "${NAME} (required)"
LangString SECTION_NAME_CORE ${LANG_GERMAN} "${NAME} (benötigt)"
LangString SECTION_NAME_CORE ${LANG_FRENCH} "${NAME} (nécessaire)"
LangString SECTION_NAME_CORE ${LANG_GERMAN} "${NAME} (benötigt)"
LangString SECTION_NAME_CORE ${LANG_RUSSIAN} "${NAME} (требуется)"
LangString SECTION_NAME_CORE ${LANG_TRADCHINESE} "${NAME} (必要)"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_ENGLISH} "Desktop Shortcut"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_GERMAN} "Desktopverknüpfung"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_FRENCH} "Raccourci sur le bureau"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_GERMAN} "Desktopverknüpfung"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_RUSSIAN} "Ярлык на рабочем столе"
LangString SECTION_NAME_DESKTOP_SHORTCUT ${LANG_TRADCHINESE} "桌面捷徑"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_ENGLISH} "Start menu Shortcuts"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_GERMAN} "Startmenüverknüpfungen"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_FRENCH} "Raccourcis dans le Menu démarrer"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_GERMAN} "Startmenüverknüpfungen"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_RUSSIAN} "Ярлыки в в главном меню"
LangString SECTION_NAME_STARTMENU_SHORTCUTS ${LANG_TRADCHINESE} "「開始」功能表捷徑"
LangString SECTION_NAME_UNINSTALLER ${LANG_ENGLISH} "Uninstaller (add keys registers)"
LangString SECTION_NAME_UNINSTALLER ${LANG_GERMAN} "Deinstallationsprogramm (Fügt Windows Registrierungseinträge hinzu)"
LangString SECTION_NAME_UNINSTALLER ${LANG_FRENCH} "Dé-installeur (ajoute clés de registre)"
LangString SECTION_NAME_UNINSTALLER ${LANG_GERMAN} "Deinstallationsprogramm (Fügt Windows Registrierungseinträge hinzu)"
LangString SECTION_NAME_UNINSTALLER ${LANG_RUSSIAN} "Деинсталлятор (добавляет ключи реестра)"
LangString SECTION_NAME_UNINSTALLER ${LANG_TRADCHINESE} "移除工具 (加入登錄訊息)"
LangString SECTION_PATCH_FILE ${LANG_ENGLISH} "File Patcher (advanced user only)"
LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de fichier (utilisateur avancé uniquement)"
LangString SECTION_PATCH_FILE ${LANG_GERMAN} "Datei Patcher (Für erfahrene Nutzer)"
LangString SECTION_PATCH_FILE ${LANG_FRENCH} "Patcheur de D2gfx.dll (utilisateur avancé uniquement)"
LangString SECTION_PATCH_FILE ${LANG_RUSSIAN} "Патч для Patcher (для опытных пользователей)"
LangString SECTION_PATCH_FILE ${LANG_TRADCHINESE} "檔案級補釘 (限高級用戶)"
LangString README_FILENAME ${LANG_ENGLISH} "PlugY_The_Survival_Kit_-_Readme.txt"
LangString README_FILENAME ${LANG_GERMAN} "PlugY_The_Survival_Kit_-_Liesmich.txt"
LangString README_FILENAME ${LANG_FRENCH} "PlugY_The_Survival_Kit_-_LisezMoi.txt"
LangString README_FILENAME ${LANG_GERMAN} "PlugY_The_Survival_Kit_-_Liesmich.txt"
LangString README_FILENAME ${LANG_RUSSIAN} "PlugY_The_Survival_Kit_-_Readme.txt"
LangString README_FILENAME ${LANG_TRADCHINESE} "PlugY_The_Survival_Kit_-_讀我檔案"
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_ENGLISH} "Error : Diablo II install directory not found.$\nPlease re-install your copy of Diablo II - Lord of Destruction."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_GERMAN} "Fehler : Diablo II Installationsverzeichnis nicht gefunden.$\nBitte installiere Diablo II - Lord of Destruction neu."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_FRENCH} "Erreur : Le répertoire d'installation de Diablo II n'a pas été trouvé.$\nVeuillez ré-installer votre copie de Diablo II - Lord of Destruction."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_GERMAN} "Fehler : Diablo II Installationsverzeichnis nicht gefunden.$\nBitte installiere Diablo II - Lord of Destruction neu."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_RUSSIAN} "Ошибка : каталог с установленной игрой Diablo II не найден.$\nПожалуйста переустановите вашу копию Diablo II - Lord of Destruction."
LangString ERROR_NO_D2_DIRECTORY_FOUND ${LANG_TRADCHINESE} "錯誤: 找不到 Diablo II 安裝目錄$\n請重新安裝「暗黑破壞神II毀滅之王」"
Var D2Path
;--------------------------------
; Initialisation
Function .onInit
!define MUI_LANGDLL_WINDOWTITLE "${NAME} v${VERSION}"
!define MUI_LANGDLL_WINDOWTITLE "${NAME} ${VERSION}"
!define MUI_LANGDLL_INFO "Select your language:"
!insertmacro MUI_LANGDLL_DISPLAY
!undef MUI_LANGDLL_WINDOWTITLE
@ -154,7 +169,8 @@ Section "!$(SECTION_NAME_CORE)" Core
File "${D2FILES}\PlugY_The_Survival_Kit_-_Readme.txt"
File "${D2FILES}\PlugY_The_Survival_Kit_-_LisezMoi.txt"
File "${D2FILES}\PlugY_The_Survival_Kit_-_Liesmich.txt"
setOutPath "$D2Path\PlugY"
File "${D2FILES}\PlugY_The_Survival_Kit_-_讀我檔案.txt"
setOutPath "$INSTDIR\PlugY"
File "${D2FILES}\PlugY\EmptyPage.dc6"
File "${D2FILES}\PlugY\PlugYDefault.ini"
File "${D2FILES}\PlugY\PlugYFixed.ini"
@ -204,7 +220,6 @@ Section $(SECTION_NAME_UNINSTALLER) Uninstaller
SectionEnd
Section $(SECTION_PATCH_FILE) PatchFile
SectionIn 1
SetOutPath $D2Path
File "${D2FILES}\PatchD2File.exe"
File "${D2FILES}\RestoreD2File.exe"
@ -233,6 +248,7 @@ Section "Uninstall" Uninstall
Delete "$INSTDIR\PlugY_The_Survival_Kit_-_Readme.txt"
Delete "$INSTDIR\PlugY_The_Survival_Kit_-_LisezMoi.txt"
Delete "$INSTDIR\PlugY_The_Survival_Kit_-_Liesmich.txt"
Delete "$INSTDIR\PlugY_The_Survival_Kit_-_讀我檔案.txt"
Delete "$D2Path\PlugY\EmptyPage.dc6"
Delete "$D2Path\PlugY\PlugYDefault.ini"
Delete "$D2Path\PlugY\PlugYFixed.ini"

View File

@ -6,13 +6,17 @@
; ;
; by Yohann Nicolas ;
; ;
; version 12.00 ;
; version 14.00 ;
; ;
;--------------------------------------------------------------------------------------;
; See PlugY_The_Survival_Kit_-_Readme.txt file for more documentation.
; Voir le fichier PlugY_The_Survival_Kit_-_LisezMoi.txt pour plus d'information.
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt f<>r weitere Informationen
; Siehe PlugY_The_Survival_Kit_-_Liesmich.txt für weitere Informationen
[LAUNCHING]
Param=
Library=PlugY.dll
[GENERAL]
@ -51,7 +55,10 @@ AvailableLanguages=ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS
[SAVEPATH]
ActiveSavePathChange=0
SavePath=Save\
SavePath=
ActiveAutoBackup=0
MaxBackupPerCharacter=5
[MAIN SCREEN]
@ -70,8 +77,16 @@ ActiveMultiPageStash=0
NbPagesPerIndex=10
NbPagesPerIndex2=100
MaxPersonnalPages=0
AutoRenameStashPage=0
PersonalNormalPageColor=0
PersonalIndexPageColor=12
PersonalMainIndexPageColor=9
SharedNormalPageColor=4
SharedIndexPageColor=8
SharedMainIndexPageColor=1
ActiveSharedStash=0
ActiveSharedStashInMultiPlayer=0
SeparateHardcoreStash=1
OpenSharedStashOnLoading=0
SharedStashFilename=SharedStashSave
@ -81,18 +96,40 @@ ActiveSharedGold=1
PosXPreviousBtn=-1
PosYPreviousBtn=-1
PosWPreviousBtn=32
PosHPreviousBtn=32
PosXNextBtn=-1
PosYNextBtn=-1
PosWNextBtn=32
PosHNextBtn=32
PosXSharedBtn=-1
PosYSharedBtn=-1
PosWSharedBtn=32
PosHSharedBtn=32
PosXPreviousIndexBtn=-1
PosYPreviousIndexBtn=-1
PosWPreviousIndexBtn=32
PosHPreviousIndexBtn=32
PosXNextIndexBtn=-1
PosYNextIndexBtn=-1
PosWNextIndexBtn=32
PosHNextIndexBtn=32
PosXPutGoldBtn=-1
PosYPutGoldBtn=-1
PosWPutGoldBtn=32
PosHPutGoldBtn=32
PosXTakeGoldBtn=-1
PosYTakeGoldBtn=-1
PosWTakeGoldBtn=32
PosHTakeGoldBtn=32
PosXStashNameField=-1
PosYStashNameField=-1
PosWStashNameField=175
PosHStashNameField=20
PosXStashGoldField=-1
PosYStashGoldField=-1
PosWStashGoldField=152
PosHStashGoldField=18
[STATS POINTS]
@ -110,7 +147,7 @@ StatPerLevelUp=5
[SKILLS POINTS]
ActiveSkillsUnassignment=0
ActiveSkillsUnassignmentOneByOne=0
ActiveSkillsUnassignmentOneForOne=0
PosXUnassignSkillBtn=-1
PosYUnassignSkillBtn=-1
@ -137,6 +174,24 @@ TimeBeforeAutoSellMax=1200
[UBER QUEST]
ActiveUberQuest=0
UberMephistoX=25130
UberMephistoY=5143
UberDiabloX=25139
UberDiabloY=5139
UberBaalX=25139
UberBaalY=5135
ActiveUberMinions=1
UberMephistoSpawnPercent=80
UberMephistoSpawnRadius=30
UberBaalSpawnPercent=30
UberBaalSpawnRadius=30
UberDiabloSpawnPercent=30
UberDiabloSpawnRadius=30
ActiveUberDiabloRushTweekAI=1
ActiveUberBaalTeleportTweekAI=1
ActiveUberBaalChillingArmorTweekAI=1
UberBaalChillingArmorTimer=6000
[INTERFACE]
@ -155,8 +210,7 @@ EnabledTXTFilesWhenMSExcelOpenIt=0
ActiveDisplayBaseStatsValue=0
ActiveLadderRunewords=0
ActiveCowPortalWhenCowKingWasKilled=0
; More features later... :)
ActiveDoNotCloseNihlathakPortal=0
MoveCainNearHarrogathWaypoint=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

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

View File

@ -40,3 +40,5 @@ item_absorbfire_percent 1 2 25 175 1 6 142 0
item_absorbcold_percent 1 2 25 160 3 6 148 0
item_absorblight_percent 1 2 25 145 9 6 144 0
item_poisonlengthresist 1 2 25 130 2 6 110 0
player breakpoints 1 3 25 445 1 10000 0
mercenaries breakpoints 1 4 25 445 1 10001 0

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,7 +4,7 @@
; ;
; von Yohann Nicolas ;
; ;
; version 12.00 ;
; version 14.00 ;
; ;
;--------------------------------------------------------------------------------------;
@ -12,13 +12,11 @@ Offizielle website: http://plugy.free.fr
Ihr dürft gerne spenden, falls ihr möchtet.
WARNUNG:
******** WARNUNG ********
- Dieses Plug-In ist NUR für LOD 1.09 bis 1.13d und 1.14d!
- Dieses Plug-In ist NICHT das closed Battle.net!
- Alle Dateien können sich seit der letzten Version verändert haben, benutzt keine alten Dateien!
- PlugY.ini wurde stark verändert, bitte nehmt die Neue!
- Bitte lest im PlugY-Forum:
http://d2mods.info/forum/viewforum.php?f=133
- Mit LOD 1.14 wurde der Speicherort der Spielstände geändert. Bitte verschiebt die Spielstände manuell.
******** ALLE FUNKTIONEN ********
@ -27,52 +25,101 @@ Jedes Feature kann via PlugY.ini an/ausgeschaltet werden (siehe "Kommentare aus
- Nahezu unbegrenzter Speicherplatz im Goldschatz.
- Gemeinsam genutzter Speicherplatz im Goldschatz.
- Die Ladder-Only Runenwörter können für den Singleplayer aktiviert werden.
- Lokaler World Event! (nicht 1.09)
- Lokaler Uber Quest! (nicht 1.09 und 1.10)
- Zurücksetzen von Fertigkeitspunkten
- Lokales World Event und Überquest im Singleplayer und via TCP/IP
- Das Portal zum Kuh-Level bleibt geöffnet, wenn der Kuhkönig in dieser Schwierigkeit getötet wurde.
- Das Portal zu Nihlathak bleibt geöffnet, wenn der Wegpunkt in dieser Schwierigkeit aktiviert wurde.
- Deckard Cain steht jetzt in Harrogath am Wegpunkt.
- Man kann die Skill- und Statuspunkte zurücksetzen.
- Man kann die gewählte Sprache verändern
- Man kann einstellen das im Einzelspieler-Modus die Karte mit jedem Spiel erneuert wird
- Man kann /players X automatisch ausführen lassen
- Es gibt eine weitere Charakter Anzeige Seite mit zusätzlichen Informationen
- Anzeige des Itemlevel in der Gegenstandsinfo
- Automatisches Backup von Spielständen vor dem eigentlichen Speichern.
- Man kann die gewählte Sprache verändern.
- Man kann einstellen das im Einzelspieler-Modus die Karte mit jedem Spiel erneuert wird.
- Man kann /players X automatisch ausführen lassen.
- Es gibt weitere Charakter Anzeige Seiten mit zusätzlichen Informationen.
- Anzeige des Itemlevel in der Gegenstandsinfo.
- Man kann beliebig oft Diablo II auf dem gleichen Computer starten.
- Der Goldschatz hat 10x10 Felder.
- Man kann das "SAVE" Verzeichnis ändern.
- Man kann die Versionsanzeige im Hauptbildschirm anpassen.
- Diablo kann nun auf Text-Dateien laden die von Microsoft Excel geöffnet sind.
- Die Truhe hat 10x10 Felder.
- Man kann das save Verzeichnis ändern.
- Man kann eine permanente Anzeige der Mana und Lebensanzeige aktivieren.
- Diablo kann nun auf Text-Dateien laden die von Microsoft Excel geöffnet sind. (Standardmäßig deaktiviert).
- Die Basiswerte der Statuspunkte werden angezeigt (Ohne Boni von magischen Gegenständen).
- Das Spiel kann im Fenstermodus gestartet werden.
- Folgende Befehle hinzugefügt (siehe "Kommentare aus der Konfigurationsdatei") :
/save: Speichert das Spiel ohne es zu beenden.
/page 1: Zeigt die normale Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 2: Zeigt die extra Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 3: Zeigt die Resistenzen Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 4: (Beta) Zeigt alle verfügbaren Runenwörter (Die Spielerinfo-Seite muss geöffnet sein).
/lockmouse : Begrenzt den Mauszeiger auf das Fenster.
/lock: Siehe /lockmouse.
/unlockmouse: Entfernt die Begrenzung des Mauszeigers auf das Fenster.
/unlock: Siehe /unlockmouse.
/renamechar newname: Speichert und benennt den Char um.
/renamepage name: Benennt die aktuelle Truhenseite um.
/renamepage name: Benennt die aktuelle Truhenseite um (# als Seitenzahl verwenden).
/rp name : Siehe /renamepage.
/setindex: Fügt einen Index für die aktuelle Truhenseite hinzu.
/setmainindex: Fügt einen Haupt-Index für die aktuelle Truhenseite hinzu.
/resetindex: Entfernt den Index von der aktuellen Truhenseite
/insertpage: Fügt eine neue Truhenseite hinter der aktuellen ein.
/ip : Siehe /insertpage.
/deletepage: Löscht die aktuelle Truhenseite, sofern sie leer ist.
/swap page: Tauscht den Inhalt der aktuellen Truhenseite mit einer anderen.
/toggle page: Tauscht den Inhalt der aktuellen Truhenseite mit einer anderen aus der alternativen Truhe (Gemeinsam/Persönlich).
/dp : Siehe /deletepage.
/swappage page: Tauscht den Inhalt der aktuellen Truhenseite mit einer anderen.
/sp page : Siehe /swappage.
/togglepage page : Tauscht den Inhalt der aktuellen Truhenseite mit einer anderen aus der alternativen Truhe (Gemeinsam/Persönlich).
/tp page : Siehe /togglepage.
/dlm: Aktiviert/Deaktiviert die permanente Anzeige der Mana und Lebensanzeige.
/dml: Siehe /dlm.
/dl: Aktiviert/Deaktiviert die permanente Anzeige der Lebensanzeige.
/dm: Aktiviert/Deaktiviert die permanente Anzeige der Manaanzeige.
/page 1 : Zeigt die normale Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 2 : Zeigt die extra Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 3 : Zeigt die Resistenzen Spielerinfo-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 4 : Zeigt die Spieler-Breakpoint-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 5 : Zeigt die Söldner-Breakpoint-Seite (Die Spielerinfo-Seite muss geöffnet sein).
/page 6 : (Beta) Zeigt alle verfügbaren Runenwörter (Die Spielerinfo-Seite muss geöffnet sein).
/save: (Beta) Speichert das Spiel ohne es zu beenden.
/listcube: (Beta) Erstellt eine "cube.txt" Datei im Savegame-Verzeichnis mit allen Würfelrezepten.
/renamechar newname: (Beta) Speichert und benennt den Char um.
v14.00 Änderungen :
- Kompatibilität mit 1.14d (Vielen Dank an Haxifix)
- Automatisches Backup von Spielständen vor dem eigentlichen Speichern
- Das Portal zu Nihlathak bleibt geöffnet, wenn der Wegpunkt in dieser Schwierigkeit aktiviert wurde.
- Deckard Cain steht jetzt in Harrogath am Wegpunkt.
- Die Startpositionen von UberDiablo, UberBaal und UberMephisto in Uber Tristram wurden korrigiert.
- UberDiablo, UberBaal and UberMephisto beschwören jetzt Monster (LOD 1.13c oder höher). (Vielen Dank an SnapChip)
- Die AIs von UberDiablo, UberBaal und UberMephisto wurden korrigiert (LOD 1.13c oder höher). (Vielen Dank an SnapChip)
- Spieler (/page 4) und Söldner (/page 5)-Breakpoint-Seiten hinuzgefügt.
- Die gemeinsame Truhe wird im Multiplayer jetzt standardmäßig deaktiviert.
- Die Farbe des Seitennamens spiegelt jetzt den Index der Seite wieder.
- Die Maximale Länge von Seitennamen wurde von 15 auf 20 Zeichen erhöht.
- Automatisches Umbenennen von Seiten kann aktiviert werden.
- Der Indextyp von Seiten kann per Klick auf den Seitennamen angepasst werden.
- Seiten können per Shift-Klick umbenannt werden.
- Der /swap Befehl wurde zu /swappage umbenannt.
- Der /toggle Befehl wurde zu /togglepage umbenannt.
- Der /rp Befehl wurde als Abkürzung für /renamepage hinzugefügt.
- Der /ip Befehl wurde als Abkürzung für /insertpage hinzugefügt.
- Der /dp Befehl wurde als Abkürzung für /deletepage hinzugefügt.
- Der /sp Befehl wurde als Abkürzung für /swappage hinzugefügt.
- Der /tp Befehl wurde als Abkürzung für /togglepage hinzugefügt.
- Der relative Pfad für die SavePath Einstellung geht nun von D2 Savegame-Verzeichnis aus und nicht vom Installations-Verzeichnis.
- Der PlugY Ordner muss jetzt im gleichen Verzeichnis sein, wie die PlugY.ini (also ggf. im Mod Verzeichnis).
- Die Ladezeiten von PlugY und der unendlichen Truhe wurden verbessert.
- Die TriggerAtEachSOJSoldMin Einstellung wurde korrigiert.
- Ein Crash beim /swappage Befehl wenn die Zielseite noch nicht existiert wurde korrigiert.
- Ein Crash beim Umbenennen von Seiten wurde korrigiert. (Vielen Dank an SnapChip)
- Probleme mit der NBPlayersByDefault Einstellung bei aktivierter MultiStash wurden korrigiert.
- Ein Crash wurde behoben wenn SkillsUnassignment, StatsUnassignment, NewStatsInterface, BigStash und MultiPageStash deaktiviert waren.
- Die ActiveSkillsUnassignmentOneForOne Einstellung wurde korrigiert (Einstellung für Mods).
- Crash in der Polnischen Version korrigiert.
- Die seltsame Nachricht, die manchmal beim Spielstart erschien wenn NBPlayersByDefault aktiviert war, wurde behoben.
- Die Kompatibilitätsprobleme zwischen der NBPlayersByDefault Einstellung und D2MultiRes wurden behoben.
- Mehr Optionen für die zusätzlichen Truhen-Buttons hinzugefügt (Einstellung für Mods).
- Chinese Übersetzung aktualisiert. (Vielen Dank an Nagahaku Lonegirl)
- Übersetzungsfehler in diversen Sprachen korrigiert.
v12.00 Änderungen :
Kompatibilität mit 1.14d (Vielen Dank an haxifix)
- Inoffizielle Version mit Unterstützung für LOD 1.14d
v11.02 Änderungen :
Befehl /setmainindex hinzugefügt: Fügt einen Haupt-Index für die aktuelle Truhenseite hinzu (Shift + vorheriger/nächster Index Button springen zum nächsten Haupt-Index)
Der aktuelle /players x Wert wird am Spielstand gespeichert und beim nächsten Spiel wieder angewandt. NBPlayersByDefault muss dafür in der PlugY.ini auf 0 konfiguriert sein.
- Befehl /setmainindex hinzugefügt: Fügt einen Haupt-Index für die aktuelle Truhenseite hinzu (Shift + vorheriger/nächster Index Button springen zum nächsten Haupt-Index)
- Der aktuelle /players x Wert wird am Spielstand gespeichert und beim nächsten Spiel wieder angewandt. NBPlayersByDefault muss dafür in der PlugY.ini auf 0 konfiguriert sein.
v11.01 Änderungen :
- Kompatibilität mit 1.13d (Vielen Dank an L'Autour)
@ -211,7 +258,7 @@ v4.04 Änderungen:
v4.03 Änderungen
- Behoben: Wenn man einen "carry1" - einzigartigen Gegenstand (einzigartiger Zauber) in den Würfel steckt
- Man kann direkt zur ersten und letzten Seite der Kiste gehen (shift + klick auf Nächste/Vorherige Seite)
- Man kann direkt zur ersten und letzten Seite der Kiste gehen (shift + Klick auf Nächste/Vorherige Seite)
- Zweiten Index hinzugefügt (shift + Klick auf den Index Knopf)
- Weitere Status Informationen hinzugefügt (Jetzt 2 Seiten)
- Vorherige Seite - Button hinzugefügt auf der Hauptstatusseite (nur in 800x600)
@ -341,10 +388,11 @@ v1.00 Funktionen (es können alle einfach ein- und ausgeschaltet werden):
******** INHALT ********
19 Dateien, 1 Ordner:
20 Dateien, 1 Ordner :
- PlugY_The_Survival_Kit_-_Readme.txt
- PlugY_The_Survival_Kit_-_LisezMoi.txt
- PlugY_The_Survival_Kit_-_Liesmich.txt
- PlugY_The_Survival_Kit_-_讀我檔案.txt
- PlugY.exe
- PlugY.dll (in Diablo II directory)
- PlugY.ini
@ -359,9 +407,8 @@ v1.00 Funktionen (es können alle einfach ein- und ausgeschaltet werden):
- PlugY\UnassignSkillsBtns.dc6
- PlugY\UnassignStatsBtns.dc6
- PlugY\statsinterface.txt
- PlugY Uninstaller.exe (with uninstaller option)
- PatchD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option)
- RestoreD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option)
- PatchD2gfxDll.exe (in Diablo II directory with PatchFile option)
- RestoreD2gfxDll.exe (in Diablo II directory with PatchFile option)
@ -375,19 +422,37 @@ Installation:
Beispiel :
Du hast LoD in folgendem Verzeichnis installiert : C:\Games\Diablo II\
Der Mod und PlugY befindet sich hier : D:\D2Mod\MyMod\
And the second mod is in : D:\D2Mod\MyMod2\
Dann müssen die Einstellungen wie folgt lauten :
C:\Games\Diablo II\PlugY.dll
C:\Games\Diablo II\PlugY\EmptyPage.dc6
C:\Games\Diablo II\PlugY\SharedGoldBtns.dc6
C:\Games\Diablo II\PlugY\StashBtns.dc6
C:\Games\Diablo II\PlugY\TradeStash.dc6
C:\Games\Diablo II\PlugY\StatsBackground.dc6
C:\Games\Diablo II\PlugY\UnassignSkillsBtns.dc6
C:\Games\Diablo II\PlugY\UnassignStatsBtns.dc6
C:\Games\Diablo II\PlugY\statsinterface.txt
C:\Games\Diablo II\PlugY\LocalizedStrings.ini
D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod\PlugY\PlugYFixed.ini
D:\D2Mod\MyMod\PlugY\PlugYDefault.ini
D:\D2Mod\MyMod\PlugY\EmptyPage.dc6
D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod\PlugY\StashBtns.dc6
D:\D2Mod\MyMod\PlugY\TradeStash.dc6
D:\D2Mod\MyMod\PlugY\StatsBackground.dc6
D:\D2Mod\MyMod\PlugY\UnassignSkillsBtns.dc6
D:\D2Mod\MyMod\PlugY\UnassignStatsBtns.dc6
D:\D2Mod\MyMod\PlugY\statsinterface.txt
D:\D2Mod\MyMod\PlugY\LocalizedStrings.ini
D:\D2Mod\MyMod\PlugY.ini
D:\D2Mod\MyMod\PlugY.exe
D:\D2Mod\MyMod2\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod2\PlugY\PlugYFixed.ini
D:\D2Mod\MyMod2\PlugY\PlugYDefault.ini
D:\D2Mod\MyMod2\PlugY\EmptyPage.dc6
D:\D2Mod\MyMod2\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod2\PlugY\StashBtns.dc6
D:\D2Mod\MyMod2\PlugY\TradeStash.dc6
D:\D2Mod\MyMod2\PlugY\StatsBackground.dc6
D:\D2Mod\MyMod2\PlugY\UnassignSkillsBtns.dc6
D:\D2Mod\MyMod2\PlugY\UnassignStatsBtns.dc6
D:\D2Mod\MyMod2\PlugY\statsinterface.txt
D:\D2Mod\MyMod2\PlugY\LocalizedStrings.ini
D:\D2Mod\MyMod2\PlugY.ini
D:\D2Mod\MyMod2\PlugY.exe
Deinstallation : Einfach alle PlugY-Dateien löschen
@ -405,6 +470,39 @@ Wenn das Spiel unter Windows 2000 nicht startet nimm auch die alte Installation.
Hinweis: Man kann ebenfalls die PlugY.dll in das Mod Verzeichnis installieren und die dc6 Dateien in das mpq.
******************** FAQ ******************
Ich kann die PlugY.ini nicht finden ?
Öffne im Explorer Extras/Ordneroptionen/Anzeige und nimm den Haken raus bei Erweiterung bekannter Dateien ausblenden
Generell sehr sinnvoll, da man so leichter Viren identifiziert (zB virus.txt.exe da würde man sonst nur txt statt auch das exe sehen..) !
Wie kann ich gelegentlich im Battle.net spielen, wenn PlugY aktiviert ist ?
2 Möglichkeiten:
1) Starte PlugY_Uninstall.bat bevor Du Diablo2 startest und starte PlugY_Install.exe danach wenn Du wieder Einzelspieler spielen willst
2) Nutze die klassische Installation. (Vergiss nicht die PlugY.ini im Diablo2 Verzeichnis zu entfernen)
Tips: Erzeuge eine Verknüpfung und füge -skiptobnet im "Ziel" Feld mit einem Leerzeichen hinter dem Anführungszeichen hinzu, um direkt ins Battle.Net zu gelangen ohne die Videos.
Was tun wenn man "Bad Generic File" mit einem neuen Charakter bekommt ?
Dies passiert wenn man einen "schlechten" Gegenstand in der gemeinsamen Kiste hat
Eine mögliche Ursache ist das Du das SAVE Verzeichnis für mehrere MODs benutzt, in diesem Fall musst Du das SAVE Verzeichnis in der PlugY.ini ändern.
I sehe "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" in der D2YYMMDD.txt ?
Das sind nur Warnungen, die Ihr einfach ignorieren könnt
Ich habe einen anderen Fehler, was kann ich tun ?
1) Lies meinen Thread und poste eine Frage im PhrozenKeep member annoucement forum.
2) Wenn dir das nicht weitergeholfen hat, sende mir eine email (at ynicolas@worldonline.fr) mit "PlugY bug" im Betreff und schreib auf Englisch oder Französisch, da ich kein Deutsch spreche
Hänge bitte folgende Dateien an:
- PlugY.ini
- PlugY.log (dazu muss active_logfile=1 in der plugY.ini aktiviert sein)
- D2XXYYZZ.txt log Log Datei von Diablo
- Beantworte die Fragen: wann,wo,wie,warum,... passiert das, und evtl. mit welchem MOD ?
Danke
Warum sind die fingerprint auf meinen Gegenständen auf 0 zurückgesetzt?
- Anscheinend ein Bug, warnt mich bitte, falls ihr ihn habt.
******** KONFIGURATION ********
Wie konfiguriert man dieses Plug-In für einen MOD:
@ -461,39 +559,6 @@ Modder können mich erreichen, wenn sie Hilfe brauchen oder mehr Details über d
WARNUNG : Vergesst nicht, dass wenn Konfigurations-System missbraucht wird werden die Benutzer auf alte PlugY Versionen zurückgreifen und ich werde kein andere Möglichkeit haben als es zu deaktivieren.
******************** FAQ ******************
Ich kann die PlugY.ini nicht finden ?
Öffne im Explorer Extras/Ordneroptionen/Anzeige und nimm den Haken raus bei Erweiterung bekannter Dateien ausblenden
Generell sehr sinnvoll, da man so leichter Viren identifiziert (zB virus.txt.exe da würde man sonst nur txt statt auch das exe sehen..)!
Wie kann ich gelegentlich im Battle.net spielen, wenn PlugY aktiviert ist ?
2 Möglichkeiten:
1) Starte PlugY_Uninstall.bat bevor Du Diablo2 startest und starte PlugY_Install.exe danach wenn Du wieder Einzelspieler spielen willst
2) Nutze die klassische Installation. (Vergiss nicht die PlugY.ini im Diablo2 Verzeichnis zu entfernen)
Tips: Erzeuge eine Verknüpfung und füge -skiptobnet im "Ziel" Feld mit einem Leerzeichen hinter dem Anführungszeichen hinzu, um direkt ins Battle.Net zu gelangen ohne die Videos.
Was tun wenn man "Bad Generic File" mit einem neuen Charakter bekommt ?
Dies passiert wenn man einen "schlechten" Gegenstand in der gemeinsamen Kiste hat
Eine mögliche Ursache ist das Du das SAVE Verzeichnis für mehrere MODs benutzt, in diesem Fall musst Du das SAVE Verzeichnis in der PlugY.ini ändern.
I sehe "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" in der D2YYMMDD.txt ?
Das sind nur Warnungen, die Ihr einfach ignorieren könnt
Ich habe einen anderen Fehler, was kann ich tun ?
1) Lies meinen Thread und poste eine Frage im PhrozenKeep member annoucement forum.
2) Wenn dir das nicht weitergeholfen hat, sende mir eine email (at ynicolas@worldonline.fr) mit "PlugY bug" im Betreff und schreib auf Englisch oder Französisch, da ich kein Deutsch spreche
Hänge bitte folgende Dateien an:
- PlugY.ini
- PlugY.log (dazu muss active_logfile=1 in der plugY.ini aktiviert sein)
- D2XXYYZZ.txt log Log Datei von Diablo
- Beantworte die Fragen: wann,wo,wie,warum,... passiert das, und evtl. mit welchem MOD ?
Danke
Warum sind die fingerprint auf meinen Gegenständen auf 0 zurückgesetzt?
- Anscheinend ein Bug, warnt mich bitte, falls ihr ihn habt.
******** Kommentare aus der Konfigurationsdatei ********
Standardwerte bedeuten, das sie auch benutzt werden, wenn Ihr die Zeilen in der PlugY.ini löscht.
Die Werte in der PlugY.ini (die dem ZIP beiliegt) sind ein Beispiel einer Konfiguration, nicht die Standardwerte.value.
@ -523,16 +588,16 @@ Beispiel:
- ActivePlugin=0 (Deaktiviert, alle DLLs werden geladen außer PlugY.dll)
- ActivePlugin=1 (Aktiviert, Standard)
Erzeugen der Log-Datei "PlugY.log" im aktuellen Verzeichnis.
Beispiel:
- ActiveLogFile=0 (Deaktiviert, Standard, keine Informationen werden während des Spiels geschrieben)
- ActiveLogFile=1 (Aktiviert)
Aktiviert oder deaktiviert den Battle.net Zugang.
Beispiel:
- DisableBattleNet=1 (Deaktiviert Battle.net access, Standard)
- DisableBattleNet=0 (Aktiviert Battle.net access)
Erzeugen der Log-Datei "PlugY.log" im aktuellen Verzeichnis.
Beispiel:
- ActiveLogFile=0 (Deaktiviert, Standard, keine Informationen werden während des Spiels geschrieben)
- ActiveLogFile=1 (Aktiviert)
Laden von weiteren DLLs, wenn PlugY genutzt wird.
Trenne jeden DLL-Namen durch das Zeichen Pipe (|)
Alle Dateien im "DllToLoad"-Feld werden immer geladen.
@ -544,29 +609,36 @@ Beispiele um zwei DLLs für einen MOD zu laden, und der Standard:
Neue Kommandos in PlugY hinzugefügt, diese können während des Spiels genutzt werden
/save: Save game without exit (LoD 1.11 minimum).
/page 1: Show normal stats page (stats page must be opened, space not mandatory).
/page 2: Show extra stats page (stats page must be opened, space not mandatory).
/page 3: Show resistance stats page (stats page must be opened, space not mandatory).
/page 4: (beta) Show available runewords (stats page must be opened, space not mandatory).
/lockmouse : Lock mouse cursor in the window.
/lock : Same as /lockmouse.
/unlockmouse : Unlock mouse cursor in the window.
/unlock : Same as /unlockmouse.
/renamechar newname: Rename your character and save it. (You must exit the game to update the stats page.)
/renamepage name: Rename current page stash (MultiStash activated).
/setindex: Set current stash page as index (prev/next index button go to an index if exists) (MultiStash activated).
/setmainindex: Set current stash page as main index (shift + prev/next index button go to an main index if exists) (MultiStash activated).
/resetindex: Remove index flag on the current stash page (MultiStash activated).
/insertpage: Insert a new page after the current page (MultiStash activated).
/deletepage: Delete current page if empty (MultiStash activated).
/swap page: Swap the content of current stash page with the content of another page (space not mandatory) (MultiStash activated).
/toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal (space not mandatory) (MultiStash activated).
/dlm: Toggle always display mana and life mode. (Since 1.13c, you can click on the bottom of each orbs)
/renamepage name : Rename current page stash (use # for page nuymber).
/rp name : Rename current page stash (use # for page nuymber).
/setindex : Set current stash page as index.
/setmainindex : Set current stash page as main index.
/resetindex : Remove index flag on the current stash page.
/insertpage : Insert a new page after the current page.
/ip : Insert a new page after the current page.
/deletepage : Delete current page if empty.
/dp : Delete current page if empty.
/swappage page : Swap the content of current stash page with the content of another page.
/sp page : Swap the content of current stash page with the content of another page.
/togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/tp page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/dlm : Toggle always display mana and life mode.
/dml : Same as /dlm.
/dl: Toggle always display life mode. (Since 1.13c, you can click on the bottom of the orb)
/dm: Toggle always display mana mode. (Since 1.13c, you can click on the bottom of the orb)
/listcube: (beta) Create a "cube.txt" file in current directory containing all cube's receipts (LoD 1.10 minimum).
/dl : Toggle always display life mode.
/dm : Toggle always display mana mode.
/page 1 : Show normal stats page (stats page must be opened).
/page 2 : Show extra stats page (stats page must be opened).
/page 3 : Show resistance stats page (stats page must be opened).
/page 4 : Show player breakpoints (stats page must be opened).
/page 5 : Show mercenaries breakpoints (stats page must be opened).
/page 6 : (beta) Show available runewords (stats page must be opened).
/save : (beta) Save game without exit.
/listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts.
/renamechar newname : (beta) Rename your character and save it.
- ActiveCommands=0 (0=Aus; 1=Ein)
Beendet D2, wenn PlugY nicht alle Features installieren konnte.
@ -622,6 +694,11 @@ Beispiele:
- ActiveSavePathChange=0 {0:Disabled; 1:Aktiviert, man muss "SavePath" ausfüllen}
- SavePath=Save\ {Save\MyMod\ or D:\Save Games\diablo II\Current Mod\}
Active autobackup save file just before the save.
The backup will be store in a folder name "backup" in the save folder.
- ActiveAutoBackup=0 {0:Disabled; 1:Enabled}
- MaxBackupPerCharacter=5 {5: Number of backup to keep before delete; 0:No backup purge}
[MAIN SCREEN]
Hier kann man die Versionsinfo des Hauptbildschirms ändern (Original ist : v 1.10)
@ -635,6 +712,12 @@ Beispiele:
[STASH]
Größenänderung des Goldschatz auf 10x10 Felder.
Benutze PlugY\TradeStash.dc6 um das Hintergrundbild zu ändern.
Beispiel:
- ActiveBigStash=0 (Deaktiviert, Standard, original Goldkistengröße aus der MPQ wird benutzt)
- ActiveBigStash=1 (Aktiviert)
Es gibt zwei Goldschatzkisten mit Mehrfach-Seiten :
- eine persönliche die nur der Spieler sieht ;
- eine gemeinsame die jeder Spieler sieht.
@ -650,26 +733,33 @@ Beispiele für den Mehrfachseiten-Goldschatz:
- NbPagesPerIndex=10 (Standard, Index Seiten sind :1,10,20,30,...,max)
- NbPagesPerIndex=5 (Index Seiten sind :1,5,10,15,...,max)
- NbPagesPerIndex2=100 {50: Index Seite (+shift) ist 1, 50, 100, 150,...max)
Beispiel Konfiguration des persönlichen Goldschatz :
- MaxPersonnalPages=0 (Standard, nahezu unbegrenzte Speicherseiten in dem persönlichen Goldschatz)
- MaxPersonnalPages=1000 (Maximum von 1000 persönlichen Speicherseiten)
- AutoRenameStashPage=0 {0:Disabled; 1:Enabled automatic renaming page}
- PersonalNormalPageColor=0 {0:Color of the personal stash name without index (see * for color list)}
- PersonalIndexPageColor=12 {0:Color of the personal stash name with index (see * for color list)}
- PersonalMainIndexPageColor=9 {0:Color of the personal stash name with main index (see * for color list)}
- SharedNormalPageColor=4 {0:Color of the shared stash name without index (see * for color list)}
- SharedIndexPageColor=8 {0:Color of the shared stash name with index (see * for color list)
- SharedMainIndexPageColor=1 {0:Color of the shared stash name with main index (see * for color list)}
Beispiel Konfiguration des gemeinsamen Goldschatz :
- ActiveSharedStash=0 (Deaktiviert, Standard)
- ActiveSharedStash=1 (Aktiviert, nur wenn auch ActiveMultiPageStash=1 ist, sonst deaktiviert)
- MaxSharedPages=0 (Standard, nahezu unbegrenzte Speicherseiten in dem gemeinsamen Goldschatz)
- MaxSharedPages=50000 (Maximum von 50000 gemeinsamen Speicherseiten)
- ActiveSharedStashInMultiPlayer=0 {0:Disabled; 1:Enabled shared stash in multiplayer. Use only with different save folders.}
- SeparateHardcoreStash=1 {0:HC und SC teilen sich die selbe Truhe; 1:HC und SC haben getrennte Truhen}
- OpenSharedStashOnLoading=0 {0:Deaktiviert; 1:Standardmäßig wird die gemeinsame Truhe geöffnet statt der persönlichen}
- SharedStashFilename=MeinGemeinsamerGoldSchatz {Die Datei heißt dann: _LOD_MeinGemeinsamerGoldSchatz.sss}
- displaySharedSetItemNameInGreen=1 {0:Disabled; 1:Enabled, set items in stash are their name displayed in green on other sets items.}
- MaxSharedPages=0 (Standard, nahezu unbegrenzte Speicherseiten in dem gemeinsamen Goldschatz)
- MaxSharedPages=50000 (Maximum von 50000 gemeinsamen Speicherseiten)
- ActiveSharedGold=1 {0:Deaktiviert; 1:Schaltet die Kommandos frei, um Gold in der gemeinsame Kiste nutzen zu können (siehe Kommando-Abschnitt)}
Größenänderung des Goldschatz auf 10x10 Felder.
Benutze PlugY\TradeStash.dc6 um das Hintergrundbild zu ändern.
Beispiel:
- ActiveBigStash=0 (Deaktiviert, Standard, original Goldkistengröße aus der MPQ wird benutzt)
- ActiveBigStash=1 (Aktiviert)
- PosXPreviousBtn=-1 {-1: Default position, 50: Put the button at the position 50 in absiss}
Same for PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn, PosXStashNameField, PosYStashNameField, PosXStashGoldField, PosYStashGoldField.
- PosWPreviousBtn=32 {32: Width of the button}
Same for PosHPreviousBtn, PosWNextBtn, PosHNextBtn, PosWSharedBtn, PosHSharedBtn, PosWPreviousIndexBtn, PosHPreviousIndexBtn, PosWNextIndexBtn, PosHNextIndexBtn, PosWPutGoldBtn, PosHPutGoldBtn, PosWTakeGoldBtn, PosHTakeGoldBtn, PosWStashNameField, PosHStashNameField, PosWStashGoldField, PosHStashGoldField.
[STATS POINTS]
@ -690,6 +780,8 @@ Beispiel:
- ActiveShiftClickLimit=0 (Deaktiviert, Standard)
- ActiveShiftClickLimit=1 (Aktiviert)
- LimitValueToShiftClick=5 (Standard, es werden maximal 5 Statuspunkte auf einmal verändert)
- PosXUnassignSkillBtn=-1 {-1: Default position, 50: X position of the button set to 50.}
- PosYUnassignSkillBtn=-1 {-1: Default position, 50: Y position of the button set to 50.}
[STAT ON LEVEL UP]
@ -706,13 +798,13 @@ Klickt auf den Knopf auf der Fertigkeits-Seite, um alle Punkte zurückzusetzen .
Hinweis: überprüft die wahren "Kosten" für jede Fertigkeit (kann größer als 1 sein in einem MOD)
Im folgenden die Standardwerte und in {} einige Beispiel Werte mit Beschreibungen:
- ActiveSkillsUnassignment=0 {0: Ausgeschaltet ; 1: Eingeschaltet }
- ActiveSkillsUnassignmentOneByOne=0 {0:Normal; 1:Das Zurücksetzen wird für jeden Punkt einzeln durchgeführt (für Mods).}
- ActiveSkillsUnassignmentOneForOne=0 {0:Normal; 1:Das Zurücksetzen wird für jeden Punkt einzeln durchgeführt (für Mods).}
- PosXUnassignSkillBtn=-1 {-1: Standardposition, 50: Platziert den Knopf an der X-Position 50}
- PosYUnassignSkillBtn=-1 {-1: Standardposition, 50: Platziert den Knopf an der Y-Position 50}
[SKILL ON LEVEL UP]
WARNING: CHEAT, DON'T USE IN NORMAL GAME.
WARNING : CHEAT, NICHT IM NORMALEN SPIEL BENUTZEN.
Ändert die Menge der Fertigkeitspunkte beim LevelUp.
Beispiel :
- ActiveSkillPerLevelUp=0 (Deaktiviert, Standard)
@ -754,6 +846,23 @@ Dies muss jeweils in Harrogath erfolgen
Notiz: Dieser Quest wird in einer späteren PlugY Version mehr dem Verhalten im Battle.net angepasst
Warnung: Aktuell sind die über-Monster direkt neben dem Portal, also sei vorsichtig, wenn Du durch das Portal gehst!
ActiveUberQuest=0 {0:Deaktiviert; 1:Aktiviert}
UberMephistoX=25130 {25130:X position of Uber Mephisto}
UberMephistoY=5143 {5143:Y position of Uber Mephisto}
UberDiabloX=25139 {25139:X position of Uber Diablo}
UberDiabloY=5139 {5139:Y position of Uber Diablo}
UberBaalX=25139 {25139:X position of Uber Baal}
UberBaalY=5135 {5135:Y position of Uber Baal}
ActiveUberMinions=1 {0:Disabled; 1:Enabled Uber minions in Tristram}
UberMephistoSpawnPercent=80 {80:Percent chance of Uber Mephisto to spawn a minion}
UberMephistoSpawnRadius=30 {30:Radius of Uber Mephisto to spawn a minion}
UberBaalSpawnPercent=30 {30:Percent chance of Uber Baal to spawn a minion}
UberBaalSpawnRadius=30 {30:Radius of Uber Baal to spawn a minion}
UberDiabloSpawnPercent=30 {30:Percent chance of Uber Diablo to spawn a minion}
UberDiabloSpawnRadius=30 {30:Radius of Uber Diablo to spawn a minion}
ActiveUberDiabloRushTweekAI=1 {0:Disabled; 1:Enabled Uber Diablo Rush tweek}
ActiveUberBaalTeleportTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Teleport tweek}
ActiveUberBaalChillingArmorTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Chilling Armor tweek}
UberBaalChillingArmorTimer=6000 {6000:Timer between Uber Baal casting Chilling Armor}
[INTERFACE]
@ -796,13 +905,37 @@ Das wird ermöglicht indem die Spalte "Server" in der runes.txt deaktiviert wird
Benutze diese Spalte also nicht in deinem Mod wenn diese Funktion aktiviert ist.
- ActiveLadderRunewords=0 {0:Deaktiviert; 1:Aktiviert}
Enabled the ability to open the Cow Portal in a difficulty where the player have already killed the Cow King.
- ActiveCowPortalWhenCowKingWasKilled=0 {0:Disabled; 1:Enabled}
Weitere Funktionen folgen...: )
Prevent Nihlathak's portal from closing.
- ActiveDoNotCloseNihlathakPortal=0 {0:Disabled; 1:Enabled}
Move Cain near Harrogath waypoint.
- MoveCainNearHarrogathWaypoint=0 {0:Disabled; 1:Enabled}
Wenn Ihr Anregungen habt, Fehler findet oder Konflikte mit MODs feststellt, schickt eine eMail an ynicolas@worldonline.fr mit "DiabloII" als Betreffzeile!
Zur Korrektur der deutschen Übersetzung bitte eine eMail an ChaosEnergy@planetdiablo.com
* Color list values (color code greater than 12 is black in 1.14d fullscreen):
- Invisible: 6
- Dark gray: 5
- Gray: 16
- Light gray: 15
- White: 0,
- Bright white: 18
- Gold: 4
- Dark yellow: 7
- Yellow: 9
- Orange: 8
- Darkest green: 10
- Dark green: 12
- Green: 2
- Blue: 3
- Purple: 11
- Red: 1
- Crystal red: 19
******** Dank geht an: ********
- Blizzard für Diablo2 und Lord of Destruction.
@ -819,10 +952,11 @@ Zur Korrektur der deutschen Übersetzung bitte eine eMail an ChaosEnergy@planetd
- Übersetzung :
* Englisch: Yohann, Jurica.
* Französisch: Yohann
* Deutsch: ChaosEnergy, TheMasterCaster.
* Deutsch: ChaosEnergy, TheMasterCaster, ChaosMarc.
* Italienisch: ItalianPlayer
* Spanish: Acrerune
* Polnisch: Serdel
* Russisch: L'Autour
* Chinesisch: Nagahaku
;--------------------------------------------------------------------------------------;

View File

@ -4,74 +4,118 @@
; ;
; par Yohann Nicolas ;
; ;
; version 12.00 ;
; version 14.00 ;
; ;
;--------------------------------------------------------------------------------------;
Site officiel : http://plugy.free.fr
Vous pouvez y faire un don si vous le souhaitez.
******** ATTENTION ********
- Ce plugin fonctionne sur LoD version 1.09 à 1.13d et 1.14d et sur leurs mods.
- Ce plugin ne fonctionne pas sur les royaumes Battle.net.
- Tous les fichiers ont changés depuis les versions précédentes, donc déinstaller toutes les versions précédentes.
- Ce plugin ne fonctionne pas sur sur Battle.net et les autres royaumes.
- PlugY.ini a été modifié depuis les versions précédentes, utiliser celui fourni dans cette archive.
- N'oubliez pas de lire les forums:
http://forum.judgehype.com/judgehype/ModsetModding/liste_sujet-1.htm
http://d2mods.info/forum/viewforum.php?f=133 (anglais)
- LOD 1.14 change le répertoire de sauvegarde, vous devez donc déplacer vos fichiers de sauvegardes de PlugY manuellement.
******** CARACTERISTIQUES ********
Toutes ces fonctions peuvent être activé/désactivé via PlugY.ini (voir "COMMENTAIRES SUR LE FICHIER DE CONFIGURATION")
- Désactive l'accès à Battle.net
- Espace de stockage infini dans le coffre!
- Espace de stockage partagé dans le coffre!
- Active les mots runiques du ladder en dehors des royaumes.
- World Event et Uber Quest en Local pour le monojoueur et le multijoueur hors royaumes!
- Espace de stockage infini dans le coffre.
- Espace de stockage partagé dans le coffre.
- Active les mots runiques du ladder pour le monojoueur et le TCP/IP.
- World Event et Uber Quest en Local pour le monojoueur et le TCP/IP.
- Permet d'ouvrir le portail vers le Cow Level même quand on a tuer le Cow King dans cette difficulté.
- Désalloue les points de capacités(skills) et de statistiques précédemment allouées.
- Empéche la fermeture du portail de Nihlathak.
- Déplace Deckar Cain à coté du portail d'Harrogath.
- Désalloue les points de capacités et de caractèristiques précédemment allouées.
- Crée un backup des fichiers de sauvegarde avant de sauvegarder.
- Change la langue du jeu.
- Régénère toujours la carte en monojoueur comme en multijoueur.
- Exécute automatiquement la comande /players X au lancement d'une partie.
- Ajoute des pages supplémentaires pour l'affichage de plus de statistiques du perso comme le %MF.
- Ajoute des pages supplémentaires pour l'affichage de plus de statistiques.
- Affiche le niveau de l'objet dans son popup.
- Permet de lancer autant de fois que l'on veut Diablo II sur le même ordinateur.
- Le coffre contient 10x10 cases.
- Change le répertoire de sauvegarde.
- Affiche toujours les valeurs numériques de mana et de vie au-dessus des globes correspondants.
- D2 peut charger tout les fichiers, même ceux ouvert par Microsoft Excel (désactivé par defaut).
- Affiche la valeur courante des caracs (sans les bonus magiques).
- Localisé en français, anglais, allemand, italien, espagnol et polonais.
- Affiche la valeur courante des caractéristiques (sans les bonus magiques).
- Permet de lancer en mode fenêtré.
- Ajout des commandes suivantes (voir "COMMENTAIRES SUR LE FICHIER DE CONFIGURATION") :
/save: Sauvegarde la partie sans quitter.
/page 1: Affiche la page des stats de base (la page des stats doit être ouverte).
/page 2: Affiche la page des stats en plus (la page des stats doit être ouverte).
/page 3: Affiche la page des stats de resistances (la page des stats doit être ouverte).
/page 4: (bêta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte).
/lockmouse : Bloque le curseur de la souris dans la fenêtre.
/lock : Identique à /lockmouse.
/unlockmouse : Libère le curseur de la souris de la fenêtre.
/unlock : Identique à /unlockmouse.
/renamechar newname: Renomme la personnage et le sauvegarde.
/renamepage name: Renomme la page courante du coffre.
/renamepage name : Renomme la page courante du coffre (utiliser # pour le numéro de page).
/rp name : Renomme la page courante du coffre (utiliser # pour le numéro de page).
/setindex : La page courante devient un index.
/setmainindex : La page courante devient un index principal.
/resetindex : Retire la page courante des index.
/insertpage : Insère une nouvelle page après la page courante.
/ip : Insère une nouvelle page après la page courante.
/deletepage : Supprime la page courante si elle est vide.
/swap page: Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page".
/toggle page: Echanger le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel (espace non obligatoire).
/dp : Supprime la page courante si elle est vide.
/swappage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page".
/sp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page".
/togglepage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel.
/tp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel.
/dlm : Inverse le mode d'affichage: Toujours afficher les valeurs de vie et de mana.
/dml : Identique à /dlm.
/dl: Inverse le mode d'affichage: Toujours afficher les valeurs de vie.
/dm: Inverse le mode d'affichage: Toujours afficher les valeurs de mana.
/listcube: (bêta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules actives du cube.
/dl : Identique à /dlm.
/dm : Identique à /dlm.
/page 1 : Affiche la page des stats de base (la page des stats doit être ouverte).
/page 2 : Affiche la page des stats en plus (la page des stats doit être ouverte).
/page 3 : Affiche la page des stats de resistances (la page des stats doit être ouverte).
/page 4 : Affiche les palliers pour le joueur (la page des stats doit être ouverte).
/page 5 : Affiche les palliers pour le mercenaire (la page des stats doit être ouverte).
/page 6 : (beta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte).
/save : (beta) Sauvegarde la partie sans quitter.
/listcube : (beta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules du cube.
/renamechar newname : (beta) Renomme la personnage et le sauvegarde.
Changements apportés par la v14.00:
- Ajout de la compatibilité avec la version 1.13d de LOD. (merci à Haxifix)
- Crée un backup des fichiers de sauvegardes avant de sauvegarder.
- Empéche la fermeture du portail de Nihlathak.
- Déplace Deckar Cain à coté du portail d'Harrogath.
- Modifie les points de départs de UberDiablo, UberBaal and UberMephisto dans Uber Tritram.
- UberDiablo, UberBaal and UberMephisto peuvent invoquer des monstres (Nécessite LOD 1.13c ou plus). (Merci à SnapChip)
- Update UberDiablo, UberBaal and UberMephisto AI (Nécessite LOD 1.13c or higher). (Merci à SnapChip)
- Ajout des seuils pour le joueur et les mercenaires dans les pages de stats 4 et 5.
- Par défaut désactive le coffre partagé en multijoueur.
- Change la couleur du nom de la page du coffre en fonction du statut d'index.
- Augmente la taille maximal des noms de page dans le coffre de 15 à 20 caractères.
- Active le nommage automatique des pages.
- Cliquer sur le nom d'une page du coffre pour changer son type d'index.
- Shift + clic sur le nom d'une page du coffre pour le renommer.
- Renomme la commande /swap en /swappage.
- Renomme la commande /toggle en /togglepage.
- Ajout de la commande /rp comme racourci pour /renamepage.
- Ajout de la commande /ip comme racourci pour /insertpage.
- Ajout de la commande /dp comme racourci pour /deletepage.
- Ajout de la commande /sp comme racourci pour /swappage.
- Ajout de la commande /tp comme racourci pour /togglepage.
- Le répertoire relatif pour SavePath est maiontyenant le répertoire de sauvegarde de D2 au lieu du répertoire d'installation.
- Maintenant le répertoire PlugY doit être dans le même répertoire que PlugY.ini (c'est-à-dire dans le répertoire du mod).
- Améliore les temps de chargement de PlugY et de chargement du coffre.
- Corrige le nombre minimum de SOJ à vendre pour le World Event.
- Corrige le crash de la commande /swappage quand la page cible n'avait pas été créé.
- Corrige un crash possible lors de l'allocation du nom d'une page de coffre. (mmerci à SnapChip)
- Corrige NBPlayersByDefault quand le coffre multiple est désactivé.
- Corrige le crash qaund SkillsUnassignment, StatsUnassignment, NewStatsInterface, BigStash et MultiPageStash était désactivés.
- Corrige le fonctionnalité ActiveSkillsUnassignmentOneForOne (option pour les mods).
- Corrige un crash dans la version polonaise.
- Corrige le message anormal appraissant parfois au démarage d'une partie avezc l'option NBPlayersByDefault.
- Correce le problème de compatibilité entre l'option NBPlayersByDefault et le mod D2MultiRes.
- Plus de paramètres pour les bouttons du coffre dans PlugY.ini (option pour les mods).
- Mise à jour de la traduction chinoise. (Merci à Nagahaku)
- Correction de certaines traductions dans différentes langues.
Changements apportés par la v12.00:
- Ajout de la compatibilité avec la version 1.14d de LOD. (merci à haxifix)
- Version non officielle ajoutant la compatibilité pour LoD 1.14d
Changements apportés par la v11.02 :
- Ajout de la commande /setmainindex : La page courante devient un index principal.
@ -92,7 +136,7 @@ Changements apportés par la v11.01:
- Suppression de la commande non terminé : /reload.
Changements apportés par la v11.00 :
- Version non officielle ajoutant le support pour LoD 1.13d
- Version non officielle ajoutant la compatibilité pour LoD 1.13d
Changements apportés par la v10.01 :
- Ajout du mode fenêtré.
@ -123,7 +167,7 @@ Changements apportés par la v8.00:
- Corrige le crash quand le joueur rencontrait un monstre superunique avec LoD 1.11.
- Corrige la perte de points de skills quand on les désassign dans un mod qui contient des skills spéciaux?
- Multiplayer : Sauvegarde les fichiers du stash (avec les données du client comme avec les versions d'avant 5.00) quand il y a une déconnection ou une erreur apparait durant la procédure de sauvegarde.
- Remove the "check load memory failed" message when D2gfx.dll was patched.
- Supprime le message "check load memory failed" quand D2gfx.dll a été modifié.
Changements apportés par la v7.02 :
- Corrige la perte de points de skills quand on les désalloue dans les mods contenant des skills spéciaux.
@ -299,10 +343,11 @@ Changements apportés par la v2.03:
******** CONTENU ********
19 fichiers, 1 répertoire:
20 fichiers, 1 répertoire :
- PlugY_The_Survival_Kit_-_Readme.txt
- PlugY_The_Survival_Kit_-_LisezMoi.txt
- PlugY_The_Survival_Kit_-_Liesmich.txt
- PlugY_The_Survival_Kit_-_讀我檔案.txt
- PlugY.exe
- PlugY.dll (in Diablo II directory)
- PlugY.ini
@ -317,9 +362,8 @@ Changements apportés par la v2.03:
- PlugY\UnassignSkillsBtns.dc6
- PlugY\UnassignStatsBtns.dc6
- PlugY\statsinterface.txt
- PlugY Uninstaller.exe (avec l'option dé-installeur)
- PatchD2gfxDll.exe (dans le répertoire de Diablo II avec l'option Patcheur D2gfxDll)
- RestoreD2gfxDll.exe (dans le répertoire de Diablo II avec l'option Patcheur D2gfxDll)
- PatchD2File.exe (dans le répertoire de Diablo II avec l'option PatchFile)
- RestoreD2File.exe (dans le répertoire de Diablo II avec l'option PatchFile)
@ -330,18 +374,16 @@ Installation normale:
note : Vous pouvez choisir le répertoire de "Diablo II" comme répertoire d'installation.
Installation dans un autre mod
- Copier PlugY.ini, PlugY.exe et PlugY folder (+son sontenu) dans le répertoire du mod ciblé.
- Copier PlugY.ini, PlugY.exe et le répertoire PlugY\ (+son sontenu) dans le répertoire du mod ciblé.
- Editer PlugY.ini pour configurer les options (voir section plus bas).
- Lancer le jeu PlugY.exe et amusez-vous:)
note: Vous pouvez déplacer le répertoire "PlugY" dans celui de "Diablo II" et il sera vu par toutes les installation.
- Lancer le jeu PlugY.exe.
Exemple :
Si vous avez installé Lord of Destruction ici: C:\Jeux\Diablo II\Diablo II.exe
Si vous avez installé Lord of Destruction dans : C:\Jeux\Diablo II\
Et que le mod ciblé se trouve dans : D:\D2Mod\MyMod\
Et qu'un second mod se trouve dans : D:\D2Mod\MyMod2\
Alors la configuration classique est ceci:
Alors la nouvelle configuration est :
C:\Jeux\Diablo II\PlugY.dll
D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6
D:\D2Mod\MyMod\PlugY\PlugYFixed.ini
@ -373,95 +415,62 @@ Alors la configuration classique est ceci:
D:\D2Mod\MyMod2\PlugY.exe
Désinstallation: Run uninstaller ou si vous n'avez pas activé cette options, supprimer semplement tous les fichiers de PlugY.
NOTE: Vous pouvez aussi déplacer PlugY.dll dans le répertoire du mod mais vous devez le supprimer du répertoire de D2.
Désinstallation : Exécuter le désinstalleur ou supprimer simplement tous les fichiers de PlugY.
Note : Vous pouvez aussi déplacer PlugY.dll dans le répertoire du mod mais vous devez le supprimer du répertoire de D2.
Note : Le répertoire "PlugY" et son contenu peut être placé dans un mpq.
------- D2gfx Patcher:
If you have problem when you run PlugY.exe then use PatchD2gfxDll.exe. (It happend sometimes with Windows 2000)
- Go in Diablo II directory.
- Do a backup of D2gfx.dll (in the case, you remove PlugY before restore it)
- Run PatchD2gfxDll.exe (which patches D2gfx.dll for launch PlugY, you can backup this file before)
- Create a shortcut: Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory)
- Launch with the shorcut!
Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe.
Si vous avez des problème pour éxécuter PlugY.exe alors utiliser PatchD2gfxDll.exe. (Ca arrive quelque fois avec Windows 2000)
- Aller dans le répertoire de Diablo II.
- Faîtes un une sauvegarde du fichier D2gfx.dll (dans le cas, où vous supprimiez PlugY avant de le restaurer).
- Lancer PatchD2gfxDll.exe (qui patchera D2gfx.dll pour lancer PlugY)
- Créer un raccourci de Diablo II.exe, entrer le répertoire du mod voulu dans "démarrer dans" de propriété->raccourci. (sauf si vous avez installé PlugY dans le répertoire de Diablo II)
- Lancer Diablo II!
------- D2File Patcher
Si vous avez des problème pour éxécuter PlugY.exe alors utiliser PatchD2File.exe. (Ca arrive quelque fois avec Windows 2000)
- Sauvegarder D2gfx.dll ou game.exe.
- Exécuter PatchD2File.exe qui modifie D2gfx.dll ou game.exe.
- Créer un raccourci de Diablo II.exe, entrer le répertoire du mod voulu dans "démarrer dans" de propriété->raccourci.
- Lancer le jeu avec le raccourci !
******************** FAQ ******************
=> Je ne troue pas le fichier PlugY.ini, où est-il ?
De kingpin (traduit de l'anglais):
Microsoft a dans Windows caché les extensions des fichiers connu. Ceci pour être
sûr que les nouveaux utilisateurs ne supprime pas ces fichiers par accidents. Vous
pouvez bien sûr le désactiver en ouvrant votre l'explorateur Windows, aller dans
outils->Options des dossiers->affichage, Décocher "Masquer les extensions des
fichiers dont le type est connu". Alors, vous verrez le fichier sûrement le fichier ini.
=> Je ne trouve pas le fichier PlugY.ini, où est-il ?
Dans l'explorateur Windows, aller dans outils->Options des dossiers->affichage.
Cocher "Afficher les fichiers et répertoires cachés"
Décocher "Masquer les extensions des fichiers dont le type est connu".
Le fichier PlugY.ini devrait être visible.
=> Comment jouer sur Battle.net avec PlugY installé ?
PlugY automatiquement désactive tous quand on va en fermé.
Mais il est recommandé de toujours retirer tous les programmes tiers quand on a va sur les royaumes.
Note: Quand bigStash est activé, vous devez redémarrer D2 pour jouer en solo/multi/ouvert après avoir jouer en fermé (et vice versa).
Astuce: Créer un raccourci et ajouter -skiptobnet à la fin du champ "cible" pour aller directement sur Battle.net.
PlugY ne permet pas d'aller sur Battle.net.
=> Que faire si j'ai une erreur comme "Bad Generic File" au chargement d'un nouveau joueur ?
Ceci peut apparaître quand vous avez de mauvais objets dans le fichier du coffre partagé.
Une cause possible est l'utilisation du même répertoire de sauvegarde pour des mods différents,
il suffit alors de changer ce répertoire dans PlugY.ini.
=> Je vois "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" dans D2YYMMDD.txt, que dois-je faire ?
Ceci est juste un avertissement sans conséquence sur le jeu, ne vous inquiéter pas.
=> J'ai un autre bug, que dois-je faire ?
1) Aller sur les forums de Phrozen-keep et Judgehype et lire les forums.
2) Faîtes des recherche sur google, demander à des amis, etc. mais ne me demander pas, je n'ai plus le temps pour faire le support de PlugY.
Si un jour, j'ai assez de temps, (comme pour la version 8.00) je lirai les forums pour connaitre les problèmes les plus communs.
Une cause possible est l'utilisation du même répertoire de sauvegarde pour des mods différents.
Si c'est le cas, il suffit de changer ce répertoire dans PlugY.ini.
Vous pouvez aussi déplacer _LOD_SharedStashSave.sss et _LOD_HC_SharedStashSave.sss dans un autre répertoire.
=> IL y a "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" dans D2YYMMDD.txt, que dois-je faire ?
Ceci est juste un avertissement sans conséquence sur le jeu.
******** CONFIGURATION ********
Configuration pour un mod précis :
- Copier PlugY.ini dans le répertoire du mod choisi (le répertoire d'où vous le lancez le mod, voir dans propriétés du raccourci).
- Dans la plupart dans cas changer le répertoire de sauvegarde.
- Ajouter toutes les dll supplémentaires dans PlugY.ini si besoin est.
- Finalement activer ou désactiver les options que vous souhaitez comme MultiPageStash, SharedStash, etc.
- Maintenant vous pouvez lancez le mod de manière classique.
- Copier PlugY.ini, PlugY.exe et le répertoire PlugY dans le répertoire du mod choisi.
- Modifier le répertoire de sauvegarde dans plugY.ini.
D2Mod configuration :
Ajouter simplement le nom de la dll dans PlugY.ini, par exemple : "DllToLoad=D2Mod.dll"
Notes:
- Les objets dans le Cube sont toujours sauvegardés dans le personnage, si vous voulez les partager vous devez les retirer du cube.
Attention :
- Ne pas éditer le fichier de configuration après avoir utilisé le mod.
- Dans des parties Multiplayers, vérifier qu'il y a la même configuration sur le serveur et les clients.
- Rappel: PlugY ne fonctionne pas sur les royaumes.
- Les objets dans le Cube sont toujours sauvegardés dans le personnage, si vous voulez les partager vous devez les retirer du cube.
- Faite attention à la compatibilité si vous modifiez la configuration entre 2 parties.
- Dans des parties Multijoueurs, vérifier que tout le monde à la même configuration dans PlugY.ini.
Lire le readme pour les moddeurs.
Lire le fichier readme.txt pour plus d'information sur le modding.
******** COMMENTAIRES SUR LE FICHIER DE CONFIGURATION ********
Toutes les valeurs par Défaut signifie que si on supprime cette ligne, PlugY utilise cette valeur.
Les valeurs dans PlugY.ini (inclus dans le zip) est un exemple de configuration, pas les valeurs par défaut.
La configuration dans PlugY.ini n'est pas la configuration par défaut.
[LAUNCHING]
Cette section contient les informations de PlugY.exe et ne fonctionne pas dans les fichiers PlugYDefault.ini et PlugYFixed.ini.
@ -506,33 +515,40 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi
- DllToLoad2= {(vide): Même chose que DlltoLoad}
Active les nouvelles commandes de PlugY.
/save: Sauvegarde la partie sans quitter (LoD 1.11 minimum).
/page 1: Affiche la page des stats de base (la page des stats doit être ouverte)(espace non obligatoire).
/page 2:Affiche la page des stats en plus (la page des stats doit être ouverte).
/page 3: Show resistance stats page Affiche la page des stats de resistances (la page des stats doit être ouverte)(espace non obligatoire).
/page 4: (bêta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte)(espace non obligatoire).
/lockmouse : Bloque le curseur de la souris dans la fenêtre.
/lock : Identique à /lockmouse.
/unlockmouse : Libère le curseur de la souris de la fenêtre.
/unlock : Identique à /unlockmouse.
/renamechar newname: Renomme la personnage et le sauvegarde. (Vous devez quittez la partie pour mettre à jour la page des stats).
/renamepage name: Renomme la page courante du coffre (MultiStash activé).
/setindex: La page courante devient un index (Les boutons d'index vont jusqu'au prochain index s'il en existe un) (MultiStash activé).
/setmainindex: La page courante devient un index principal (Les boutons d'index +shift vont jusqu'au prochain index s'il en existe un) (MultiStash activé).
/resetindex: Retire la page courante des index (MultiStash activé).
/insertpage: Insère une nouvelle page après la page courante (MultiStash activé).
/deletepage: Supprime la page courante si elle est vide (MultiStash activé).
/swap page: Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" (espace non obligatoire) (MultiStash activé).
/toggle page: Echanger le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel (espace non obligatoire) (MultiStash activé).
/dlm: Inverse le mode d'affichage: Toujours afficher les valeurs de vie et de mana. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes)
/renamepage name : Renomme la page courante du coffre (utiliser # pour le numéro de page).
/rp name : Renomme la page courante du coffre (utiliser # pour le numéro de page).
/setindex : La page courante devient un index.
/setmainindex : La page courante devient un index principal.
/resetindex : Retire la page courante des index.
/insertpage : Insère une nouvelle page après la page courante.
/ip : Insère une nouvelle page après la page courante.
/deletepage : Supprime la page courante si elle est vide.
/dp : Supprime la page courante si elle est vide.
/swappage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page".
/sp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page".
/togglepage page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel.
/tp page : Echange le contenu de la page actuelle du coffre avec le contenu d'une autre "page" du coffre opposé partagé/personnel.
/dlm : Inverse le mode d'affichage: Toujours afficher les valeurs de vie et de mana.
/dml : Identique à /dlm.
/dl: Inverse le mode d'affichage: Toujours afficher les valeurs de vie. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes)
/dm: Inverse le mode d'affichage: Toujours afficher les valeurs de mana. (Depuis LoD 1.13c, vous pouvez cliquer sur la partie inférieure des orbes)
/listcube: (bêta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules actives du cube. (LoD 1.10 minimum).
/dl : Identique à /dlm.
/dm : Identique à /dlm.
/page 1 : Affiche la page des stats de base (la page des stats doit être ouverte).
/page 2 : Affiche la page des stats en plus (la page des stats doit être ouverte).
/page 3 : Affiche la page des stats de resistances (la page des stats doit être ouverte).
/page 4 : Affiche les palliers pour le joueur (la page des stats doit être ouverte).
/page 5 : Affiche les palliers pour le mercenaire (la page des stats doit être ouverte).
/page 6 : (beta) Affiche la page des mots runiques actifs (la page des stats doit être ouverte).
/save : (beta) Sauvegarde la partie sans quitter.
/listcube : (beta) Crée un fichier "cube.txt" dans le répertoire de sauvegarde contenant toutes les formules du cube.
/renamechar newname : (beta) Renomme la personnage et le sauvegarde.
- ActiveCommands=0 {0:Désactivé; 1:Activé}
Quitte D2, si PlugY if PlugY échoue lors de l'installation de toutes les fonctions.
Désactivez-le seulement si vous savez ce que vous faites.
Quitte D2, si PlugY échoue à installer toutes les fonctions.
Désactivez-le uniquement si vous savez ce que vous faites.
- ActiveCheckMemory=1 {0:Désactivé; 1:Activé}
Active les fonctions cachés ou non finis. (ne pas utiliser)
@ -584,6 +600,11 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi
- ActiveSavePathChange=0 {0:Désactivé; 1=Activé, vous devez initialiser "SavePath"}
- SavePath=Save\ {Save\MyMod\ ou D:\Save Games\diablo II\Current Mod\}
ACtive le backup des fichiers de sauvegardes avant la sauvegarde.
Les fichiers de backup sont sauvegardé dans un répertoire nommé "backup" dans le répertoire de sauvegarde.
- ActiveAutoBackup=0 {0:Désactivé; 1:Activé}
- MaxBackupPerCharacter=5 {5: Nombre de backup à conserver avant suppression; 0:Pas de purge des backups}
[MAIN SCREEN]
Change le texte affiché dans le menu principal (premier menu) (à la place de "v 1.10")
@ -617,7 +638,16 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi
- NbPagesPerIndex=10 {10: Les pages indexées sont 1,10,20,30,...,max}
- NbPagesPerIndex2=100 {50: Les pages indexées (+shift) sont 1,50,100,150,...,max}
- MaxPersonnalPages=0 {0:Nombre de pages personnelles illimitées; 1000: Maximum de 1000 pages personnelles}
- AutoRenameStashPage=0 {0:Désactivé; 1:Active le nommage automatique des pages de coffre.}
- PersonalNormalPageColor=0 {0:Couleur du nom des pages de coffre personnel sans index (voir * pour la liste des couleurs)}
- PersonalIndexPageColor=12 {0:Couleur du nom des pages de coffre personnel avec index (voir * pour la liste des couleurs)}
- PersonalMainIndexPageColor=9 {0:Couleur du nom des pages de coffre personnel principal (voir * pour la liste des couleurs)}
- SharedNormalPageColor=4 {0:Couleur du nom des pages de coffre partagé sans index (voir * pour la liste des couleurs)}
- SharedIndexPageColor=8 {0:Couleur du nom des pages de coffre partagé avec index (voir * pour la liste des couleurs)
- SharedMainIndexPageColor=1 {0:Couleur du nom des pages de coffre partagé principal (voir * pour la liste des couleurs)}
- ActiveSharedStash=0 {0:Désactivé; 1:Activé si ActiveMultiPageStash=1}
- ActiveSharedStashInMultiPlayer=0 {0:Désactivé; 1:Active le coffre partagé en multijoueur. A utiliser uniquement avec des répertoires de sauvegarde différent.}
- OpenSharedStashOnLoading=0 {0:Désactivé; 1:Sélectionne le coffre partagée (au lieu du personnel) au chargement du perso}
- SeparateHardcoreStash=1 {0:Même coffre partagé en HC et SC; 1:utilise 2 coffres différents}
- SharedStashFilename=SharedStashSave {xxx : Le nom du fichier sera _LOD_xxx.sss}
@ -625,7 +655,10 @@ Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs signifi
- MaxSharedPages=0 {0:Nombre de pages partagées illimitées; 5000: Maximum de 5000 pages partagées )
- ActiveSharedGold=1 {0:Désactivé; 1:Activé, utiliser les commands pour y ajouter ou retirer de l'or (voir Command section)}
- PosXPreviousBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse}
Idem pour PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn.
Idem pour PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn, PosXStashNameField, PosYStashNameField, PosXStashGoldField, PosYStashGoldField.
- PosWPreviousBtn=32 {32: Largeur du boutton}
Idem pour PosHPreviousBtn, PosWNextBtn, PosHNextBtn, PosWSharedBtn, PosHSharedBtn, PosWPreviousIndexBtn, PosHPreviousIndexBtn, PosWNextIndexBtn, PosHNextIndexBtn, PosWPutGoldBtn, PosHPutGoldBtn, PosWTakeGoldBtn, PosHTakeGoldBtn, PosWStashNameField, PosHStashNameField, PosWStashGoldField, PosHStashGoldField.
[STATS POINTS]
@ -642,6 +675,8 @@ Vous pouvez limiter le nombre de points alloué/désalloué.
Ci-dessous, les valeurs par défauts et entre {} des exemples avec leurs significations :
- ActiveShiftCkickLimit=0 {0:Désactivé; 1:Activé}
- LimitValueToShiftClick=5 (10: Alloue ou désalloue les points de stats 10 par 10}
- PosXUnassignSkillBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse.}
- PosYUnassignSkillBtn=-1 {-1: Position par défaut, 50: Déplace le bouton à la position 50 en abscisse.}
[STAT ON LEVEL UP]
@ -745,38 +780,57 @@ Ceci est fait par la mise à 0 de la colonne "server" du fichier runes.txt.
Donc n'utilisez pas cette colonne dans votre mod en même temps que cette fonction !
- ActiveLadderRunewords=0 {0:Désactivé; 1:Activé}
Active la capacit" d'ouvrir l portail vers le Cow Level dans la difficulté où le joueur à déjà tuer le Cow King.
Active la capacité d'ouvrir le portail vers le Cow Level dans la difficulté où le joueur à déjà tuer le Cow King.
- ActiveCowPortalWhenCowKingWasKilled=0 {0:Désactivé; 1:Activé}
Empéche la fermeture du portail de Nihlathak.
- ActiveDoNotCloseNihlathakPortal=0 {0:Désactivé; 1:Activé}
Plus d'options dans de futures versions...:)
Déplace Deckar Cain à coté du portail d'Harrogath.
- MoveCainNearHarrogathWaypoint=0 {0:Désactivé; 1:Activé}
Mon mail à ynicolas@worldonline.fr.
Mais je ne fais plus le support de PlugY donc n'attendez pas de l'aide de ma part si vous avez des problèmes. A la place faites des recherches sur les forums.
* Liste des codes couleurs (Les codes de couleur supérieur à 12 sont noirs en 1.14d plein écran):
- Invisible: 6
- Gris foncé: 5
- Gris: 16
- Gris clair: 15
- Blanc: 0,
- Branc vif: 18
- Or: 4
- Jaune foncé: 7
- Jaune: 9
- Orange: 8
- Vert très foncé: 10
- Vert foncé: 12
- Vert: 2
- Bleu: 3
- Violet: 11
- Rouge: 1
- Rouge vif: 19
PS: Désolé pour les fôtes mais je n'ai pas envie de corriger ;)
******** THANKS TO ********
- Blizzard pour avoir fait Diablo II et Lord of Destruction.
- Blizzard pour avoir créé Diablo II et Lord of Destruction.
- Kingpin, Afj666, Joel, SVR, Myrdinn pour leurs aides.
- Pralinor pour son aide dans la convertion en 1.12.
- L'Autour pour son aide dans la convertion en 1.13d.
- ChaosEnergY pour ses beta tests et sa traduction en allemand.
- Haxifix pour son aide dans la convertion en 1.14d.
- SnapChip pour l'IA des Uber dans Tristram.
- ChaosEnergY pour ses tests.
- Char & Darque pour avoir corrigé mon anglais.
- Shaitane, K&V, themastercaster, raspa et onyx pour leurs tests.
- Golvmopp, Dark Spot in the Corner, Megalixir et Athara pour leurs aides.
- ItalianPlayer pour la traduction en italien.
- Tous les membres du Chat de ProzenKeep.
- PhrozenKeep pour tout ce qu'ils partagent pour nous (y-compris le mien ;)
- Tous les membres du chat et des forums de ProzenKeep.
- L'équipe de PhrozenKeep.
- Traduction :
* Anglais : Yohann, Jurica.
* Français : Yohann
* Allemand: ChaosEnergy, TheMasterCaster.
* Allemand : ChaosEnergy, TheMasterCaster, ChaosMarc.
* Italien : ItalianPlayer
* Espagnol : Acrerune
* Polonais : Serdel
* Russe : L'Autour
* Chinois: Nagahaku
;--------------------------------------------------------------------------------------;

View File

@ -4,7 +4,7 @@
; ;
; by Yohann Nicolas ;
; ;
; version 12.00 ;
; version 14.00 ;
; ;
;--------------------------------------------------------------------------------------;
@ -14,11 +14,9 @@ You can make a donation if you want.
******** WARNING ********
- This plug-in works with LoD version 1.09 to 1.13d and 1.14d and mods based on.
- This plug-in doesn't work on realms Battle.net.
- All files may be changed since previous version, so uninstall any previous version.
- PlugY.ini has changed since previous version, use the one in this package.
- Don't forget to read the PlugY forum at:
http://d2mods.info/forum/viewforum.php?f=133
- This plug-in doesn't work on Battle.net and others realms.
- All files have changed since previous version. Please don't use old files.
- LOD 1.14 change the save directory, so you must move PlugY save files manually.
******** FEATURES ********
@ -26,50 +24,99 @@ Each features can be turn on/off via PlugY.ini (see "COMMENTS ON THE CONFIGURATI
- Disable access to Battle.net.
- Infinite storage space in the stash.
- Shared storage space in the stash.
- Enabled the ladder only runewords out of realms.
- Local World Event and Uber Quest for singleplayer and multiplayer off-realm!
- Enable the ladder only runewords for singleplayer and TCP/IP game.
- World Event and Uber Quest for singleplayer and TCP/IP game.
- Can open Cow Level Portal even when player have kill the Cow King in that difficulty.
- Prevent Nihlathak's portal from closing.
- Move Deckar Cain near the waypoint in Harrogath.
- Unassign assigned skills and stats points.
- Auto backup save files before saving.
- Change the selected language.
- Always regenerate maps in SinglePlayer like in MultiPlayer.
- Automatically execute /players X when you launch a new game.
- Added some pages for display more characters stats like %MF.
- Added some pages for display more characters stats.
- Display item level in its popup.
- Launch any number of Diablo II games on the same computer.
- Increase the stash to 10x10 squares.
- Change the save path directory.
- Always display Mana and Life values above the globes.
- D2 can load all files, even those opened with Microsoft Excel (disabled by default).
- Display the stats current value (without magical bonus) like Magic/gold find or maximum resistances.
- Can launch game in windowed mode with some options (lock mouse/resize/on top/noborder).
- Display the current stats value (without magical bonus).
- Can launch game in windowed mode.
- Add following commands (see "COMMENTS ON THE CONFIGURATION FILE") :
/save: Save game without exit.
/page 1: Show normal stats page (stats page must be opened).
/page 2: Show extra stats page (stats page must be opened).
/page 3: Show resistance stats page (stats page must be opened).
/page 4: (beta) Show available runewords (stats page must be opened).
/lockmouse : Lock mouse cursor in the window.
/lock : Same as /lockmouse.
/unlockmouse : Unlock mouse cursor in the window.
/unlock : Same as /unlockmouse.
/renamechar newname: Rename your character and save it.
/renamepage name: Rename current page stash.
/renamepage name : Rename current page stash (use # for page number).
/rp name : See /renamepage.
/setindex : Set current stash page as index.
/setmainindex : Set current stash page as main index.
/resetindex : Remove index flag on the current stash page.
/insertpage : Insert a new page after the current page.
/ip : See /insertpage.
/deletepage : Delete current page if empty.
/swap page: Swap the content of current stash page with the content of another page.
/toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/dp : See /deletepage.
/swappage page : Swap the content of current stash page with the content of another page.
/sp page : See /swappage.
/togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/tp page : See /togglepage.
/dlm : Toggle always display mana and life mode.
/dml: Same as /dlm.
/dl: Toggle always display life mode.
/dm: Toggle always display mana mode.
/dml : See /dlm.
/dl : See /dlm.
/dm : See /dlm.
/page 1 : Show normal stats page (stats page must be opened).
/page 2 : Show extra stats page (stats page must be opened).
/page 3 : Show resistance stats page (stats page must be opened).
/page 4 : Show player breakpoints (stats page must be opened).
/page 5 : Show mercenaries breakpoints (stats page must be opened).
/page 6 : (beta) Show available runewords (stats page must be opened).
/save : (beta) Save game without exit.
/listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts.
/renamechar newname : (beta) Rename your character and save it.
v14.00 changes :
- Add compatibility with LOD 1.14d. (Thanks to Haxifix)
- Add auto backup save files before saving.
- Prevent Nihlathak's portal from closing.
- Move Deckar Cain near the waypoint in Harrogath.
- Change UberDiablo, UberBaal and UberMephisto starting positions in Uber Tristram.
- UberDiablo, UberBaal and UberMephisto can spawn monsters (Need LOD 1.13c or higher). (Thanks to SnapChip)
- Update UberDiablo, UberBaal and UberMephisto AI (Need LOD 1.13c or higher). (Thanks to SnapChip)
- Add player and mercenaries breakpoints in stats page 4 and 5.
- Disable shared stash in multiplayer by default.
- Change stash page color dependings of indexes flags.
- Increase the maximum length of stash page name from 15 to 20 characters.
- Enable automatic stash page naming.
- Click on page stash name to change index type.
- Shift + click on page stash name to rename it.
- Rename /swap command to /swappage.
- Rename /toggle command to /togglepage.
- Add /rp command as shortcut for /renamepage.
- Add /ip command as shortcut for /insertpage.
- Add /dp command as shortcut for /deletepage.
- Add /sp command as shortcut for /swappage.
- Add /tp command as shortcut for /togglepage.
- The relative folder for SavePath is now the D2 save folder instead of D2 install path.
- Now, the PlugY folder must be in the same directory as PlugY.ini (so in the mod folder).
- Optimize PlugY time loading and infinite stash time loading.
- Fix minimum SOJ sold value for the World Event.
- Fix crash of /swappage command when the target page wasn't created.
- Fix possible crash with stash name allocation. (Thanks to SnapChip)
- Fix NBPlayersByDefault when MultiStash was disabled.
- Fix crash when SkillsUnassignment, StatsUnassignment, NewStatsInterface, BigStash and MultiPageStash was disabled.
- Fix ActiveSkillsUnassignmentOneForOne Feature (option for mods).
- Fix crash in Polish version language.
- Fix the /players anormal message au startup.
- Fix the abnormal message that sometimes appears when starting a game with the NBPlayersByDefault option.
- Fix compatibility issue between NBPlayersByDefault option and D2MultiRes mod.
- More stash buttons parameters in PlugY (option for mods).
- Update Chinese transalation. (Thanks to Nagahaku)
- Fix some translations in different languages.
v12.00 changes :
- Compatibily with 1.14d (thanks to haxifix)
- Unofficial version supporting LOD 1.14d
v11.02 changes :
- Add command /setmainindex : Set the current stash page as main index (shift + prev/next index button go to an main index if exists)
@ -352,10 +399,11 @@ v1.00 features (can all be easily enabled or disabled):
******** CONTENTS ********
19 files, 1 folder:
20 files, 1 folder :
- PlugY_The_Survival_Kit_-_Readme.txt
- PlugY_The_Survival_Kit_-_LisezMoi.txt
- PlugY_The_Survival_Kit_-_Liesmich.txt
- PlugY_The_Survival_Kit_-_讀我檔案.txt
- PlugY.exe
- PlugY.dll (in Diablo II directory)
- PlugY.ini
@ -370,9 +418,8 @@ v1.00 features (can all be easily enabled or disabled):
- PlugY\UnassignSkillsBtns.dc6
- PlugY\UnassignStatsBtns.dc6
- PlugY\statsinterface.txt
- PlugY Uninstaller.exe (with uninstaller option)
- PatchD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option)
- RestoreD2gfxDll.exe (in Diablo II directory with Patcher D2gfxDll option)
- PatchD2File.exe (in Diablo II directory with PatchFile option)
- RestoreD2File.exe (in Diablo II directory with PatchFile option)
@ -385,14 +432,13 @@ note: You can choice "Diablo II" directory as install directory.
Installation in another mod:
- Copy PlugY.ini, PlugY.exe and PlugY folder (+its contents) in the targeted mod folder.
- Edit PlugY.ini to configure some features (see section below).
- Run PlugY.exe and enjoy:)
- Run PlugY.exe.
note: you can move the "PlugY" folder in "Diablo II" and it will be see by all PlugY installation.
Example :
You have installed Lord of Destruction here: C:\Games\Diablo II\
And the mod to add this plug-in is here: D:\D2Mod\MyMod\
And the second mod to add this plug-in is here: D:\D2Mod\MyMod2\
You have installed Lord of Destruction in : C:\Games\Diablo II\
And the target mod is in : D:\D2Mod\MyMod\
And the second mod is in : D:\D2Mod\MyMod2\
So the new installation is :
C:\Games\Diablo II\PlugY.dll
D:\D2Mod\MyMod\PlugY\SharedGoldBtns.dc6
@ -425,127 +471,86 @@ So the new installation is:
D:\D2Mod\MyMod2\PlugY.exe
Uninstallation: Use the uninstaller or if you have check this option, simply remove all PlugY files!
Uninstallation : Use the uninstaller or simply remove all PlugY files.
Note : You can also move PlugY.dll in the mod folder but you must remove any on in D2 folder.
Note : PlugY directory and its contents can be put in a mpq.
------- D2gfx Patcher:
------- D2File Patcher
If you have problem when you run PlugY.exe then use PatchD2gfxDll.exe. (It happend sometimes with Windows 2000)
- Go in Diablo II directory.
- Do a backup of D2gfx.dll (in the case, you remove PlugY before restore it)
- Run PatchD2gfxDll.exe (which patches D2gfx.dll for launch PlugY)
If you have problem when you run PlugY.exe then use PatchD2File.exe. (It happend sometimes with Windows 2000)
- Do a backup of D2gfx.dll or game.exe.
- Run PatchD2File.exe which modify D2gfx.dll or Game.exe.
- Create a shortcut : Enter target mod directory in "start in" field of properties->shortcut. (unless you install PlugY in Diablo II directory)
- Launch with the shorcut !
Before uninstall PlugY Restore your D2gfx.dll with your backup file or run RestoreD2gfxDll.exe.
******************** FAQ ******************
=> I can't find the PlugY.ini file, where is it ?
>From kingpin:
Microsoft has in their OS hidden known extensions. This is to make sure newbie
users do not delete those files by accident. You can, of course, turn this off by
opening up your Windows Explorer, selecting Tools->Folder Options. Then choose View and
mark "Show Hidden files and Folders". Unmark "Hide extensions for know file types".
=> I can't find PlugY.ini file, where is it ?
In Windows Explorer, selecting Tools->Folder Options->View.
Mark "Show Hidden files and Folders".
Unmark "Hide extensions for know file types".
Then you will for sure see the ini file.
=> How do I Play sometimes on Battle.net when PlugY is installed ?
PlugY automatically disables features on realm.
But it's always recommended to disable any third software when you go on realm.
Note: When bigStash is enabled, you must restart D2 for play in single/multi/open after playing in closed Bnet (and vice versa).
Tips: Make a shorcut and add -skiptobnet at the of the "target" field for directly go to Battle.net.
PlugY disable the connection to Battle.net.
=> What do I do if I have an error like "Bad Generic File" on loading a new Character ?
This can appear when you have bad item in the shared stash file.
A possible cause is to use same save folder for different mod, in this case just change the save folder in PlugY.ini.
A possible cause is to use same save folder for different mod.
In this case, just change the save folder in PlugY.ini.
You can also move the _LOD_SharedStashSave.sss and _LOD_HC_SharedStashSave.sss to another directory.
=> I get "sUnitItemInsertItemInvGridBase failed at 1046 in C:\projects\D2\head\Diablo2\Source\D2Client\UNIT\Item.cpp" in D2YYMMDD.txt, what I should do ?
It's just a warning, don't worry about it, it causes no problem in game.
=> I have another bug, what should I do ?
1) Read my thread and post a question eventually in PhrozenKeep member annoucement forum.
2) Search on google, ask to your friend, etc but don't ask me, I have no more time to support PlugY.
If one day, I got enough time (like for the version 8.00) I will check forums to get the more commons problems.
Thx
It's just a warning, it causes no problem in game.
******** CONFIGURATION ********
Configuration of this kit for a specified mod :
- Copy the PlugY.ini and PlugY.exe in the target mod directory (the directory where you start it, see it in the properties of the shortcut).
- In most cases, you will change the save directory in the ini file.
- Add all extra dll of the mod in PlugY.ini, if any.
- Finally, activate any specific features you want such as MultiPageStash, SharedStash, etc.
- Now, you can start the target mod using the classic method.
- Copy PlugY.ini, PlugY.exe and PlugY folder in the target mod directory.
- Change the save directory in PlugY.ini.
D2Mod configuration :
Just add the dll name in PlugY.ini, for example : "DllToLoad=D2Mod.dll"
Note:
- Items in the Cube are always saved on the player, if you want these items shared, you must remove them from the Cube.
Warning :
- Be careful if you want to edit the configurations files after having played with the mod.
- In multiplayer game, verify that the server has the same configuration.
- Remember: PlugY doesn't support realms.
- Items stored in the Cube are always saved on the player, if you want to shared them, you must remove them from the Cube.
- Be careful about compatibility if you edit PlugY.inin between 2 games.
- In multiplayer game, verify that all player have the same configurations in PlugY.ini.
*** Configuration for modders ***
There are 3 files with same structure to configure PlugY :
- "PlugY/PlugYFixed.ini" in mpq or via the switch -direct
All fields set parameters which can't be changed by users via PlugY.ini.
Use it for enabling(disabling) wanted(unwanted) features.
Only few thing should be found here.
This file override parameters set by users in PlugY.ini.
Use it to enabled(disabled) wanted(unwanted) features.
Warning 1: ActivePlugin=0 doesn't work here (but ActivePlugin=1 works)
Warning 2: SavePath management doesn't work here too.
Warning 2: SavePath management is ignore in this file.
Warning 3: Don't abuse it, a lot of field should be set by users. (see note below)
- "PlugY/PlugYDefault.ini" in mpq or via the switch -direct
Use it for changing default values of PlugY.
Use it to change default values of PlugY.
Works like PlugY.ini in an mpq in version 4.03 and before.
All fields which aren't in PlugYFixed.ini (and are always readed) should be here.
Most fields should be put here.
All fields should be here.
- "PlugY.ini" in current directory only.
For users' configuration (like previous version).
Fields which are in PlugYFixed.ini shouldn't be found here.
In most cases, this file is the same as PlugYDefault.ini but it can be edited by user.
Notes:
Think about each features if you really must disable it.
- The savepath management doesn't work in Fixed.ini (it's users' choice where they want to put their save files)
- The unassignment of skills can really be useful way to learn all your custom skills. I have stopped playing some mods just because I don't know what skill will be useful at very high level. It's more fun to try all skills and do the choosing after that. So don't put it in Fixed.ini
- The World Event should be configured or disabled in Fixed.ini in each mod.
- The extra pages in stats interfaces shouldn't be put in Fixed.ini
Modders can contact me, if they want help or more details about this system.
WARNING: Don't forget, if it's misused, players will use old version of PlugY, and I will have no other choice than to disable it.
******** COMMENTS ON THE CONFIGURATION FILE ********
All Default values mean, if you remove the line, PlugY will use this value.
The values in PlugY.ini (included in the zip) are an example of configuration, not default values.
The configuration in PlugY.ini are not the default configuration.
[LAUNCHING]
This section store info for PlugY.exe and don't work in PlugYDefault.ini and PlugYFixed.ini files.
Add params to transmit to LoD on his command line.
Params give to PlugY.exe are also transmitted to LoD on his command line.
By default no param are trasmited.
By default no param are transited.
Most common switch are (without quote) :
"-w" open LoD in windowed form. (See WINDOWED section instead)
"-direct" use files in directory instead of those in mpq.
@ -580,36 +585,43 @@ Separate each dll file name by the character pipe (|)
- DllToLoad2= {(empty): Same as DlltoLoad}
Activate some new commands in PlugY. In parenthesis is the condition to be able to use the command.
/save: Save game without exit (LoD 1.11 minimum).
/page 1: Show normal stats page (stats page must be opened, space not mandatory).
/page 2: Show extra stats page (stats page must be opened, space not mandatory).
/page 3: Show resistance stats page (stats page must be opened, space not mandatory).
/page 4: (beta) Show available runewords (stats page must be opened, space not mandatory).
/lockmouse : Lock mouse cursor in the window.
/lock : Same as /lockmouse.
/unlockmouse : Unlock mouse cursor in the window.
/unlock : Same as /unlockmouse.
/renamechar newname: Rename your character and save it. (You must exit the game to update the stats page.)
/renamepage name: Rename current page stash (MultiStash activated).
/setindex: Set current stash page as index (prev/next index button go to an index if exists) (MultiStash activated).
/setmainindex: Set current stash page as main index (shift + prev/next index button go to an main index if exists) (MultiStash activated).
/resetindex: Remove index flag on the current stash page (MultiStash activated).
/insertpage: Insert a new page after the current page (MultiStash activated).
/deletepage: Delete current page if empty (MultiStash activated).
/swap page: Swap the content of current stash page with the content of another page (space not mandatory) (MultiStash activated).
/toggle page: Swap the content of current stash page with the content of another page in opposing stash shared/personal (space not mandatory) (MultiStash activated).
/dlm: Toggle always display mana and life mode. (Since 1.13c, you can click on the bottom of each orbs)
/renamepage name : Rename current page stash (use # for page nuymber).
/rp name : Rename current page stash (use # for page nuymber).
/setindex : Set current stash page as index.
/setmainindex : Set current stash page as main index.
/resetindex : Remove index flag on the current stash page.
/insertpage : Insert a new page after the current page.
/ip : Insert a new page after the current page.
/deletepage : Delete current page if empty.
/dp : Delete current page if empty.
/swappage page : Swap the content of current stash page with the content of another page.
/sp page : Swap the content of current stash page with the content of another page.
/togglepage page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/tp page : Swap the content of current stash page with the content of another page in opposing stash shared/personal.
/dlm : Toggle always display mana and life mode.
/dml : Same as /dlm.
/dl: Toggle always display life mode. (Since 1.13c, you can click on the bottom of the orb)
/dm: Toggle always display mana mode. (Since 1.13c, you can click on the bottom of the orb)
/listcube: (beta) Create a "cube.txt" file in current directory containing all cube's receipts (LoD 1.10 minimum).
/dl : Toggle always display life mode.
/dm : Toggle always display mana mode.
/page 1 : Show normal stats page (stats page must be opened).
/page 2 : Show extra stats page (stats page must be opened).
/page 3 : Show resistance stats page (stats page must be opened).
/page 4 : Show player breakpoints (stats page must be opened).
/page 5 : Show mercenaries breakpoints (stats page must be opened).
/page 6 : (beta) Show available runewords (stats page must be opened).
/save : (beta) Save game without exit.
/listcube : (beta) Create a "cube.txt" file in save directory containing all cube's receipts.
/renamechar newname : (beta) Rename your character and save it.
- ActiveCommands=0 {0:Disabled; 1:Enabled}
Quit D2, if PlugY failed to installed all features.
Quit D2, if PlugY failed to install all features.
Disable it only if you know what you do.
- ActiveCheckMemory=1
Activate hidden or not finished feature. (don't use it)
Activate hidden or unfinished feature. (don't use it)
- ActiveAllOthersFeatures=0 {0:Disabled; 1:Enabled}
@ -654,9 +666,15 @@ For modders who want to restrict the available languages and the default languag
[SAVEPATH]
This is where all of your characters and the shared stash is saved.
You can use absolute or relative paths.
It don't work in PlugYFixed.ini.
Following are default values, between {} are some examples values with descriptions :
- ActiveSavePathChange=0 {0:Disabled; 1:Enabled, you must set "SavePath"}
- SavePath=Save\ {Save\MyMod\ or D:\Save Games\diablo II\Current Mod\}
- SavePath= {MyMod\ or D:\Save Games\diablo II\Current Mod\}
Active autobackup save file just before the save.
The backup will be store in a folder name "backup" in the save folder.
- ActiveAutoBackup=0 {0:Disabled; 1:Enabled}
- MaxBackupPerCharacter=5 {5: Number of backup to keep before delete; 0:No backup purge}
[MAIN SCREEN]
@ -665,9 +683,9 @@ Color is an integer which refers to defined D2 colors.
Following are default values, between {} are some examples values with descriptions :
- ActiveVersionTextChange=0 {0:Disabled; 1:Enabled}
- VersionText= {Empty: Display the current version of LoD with the subversion letter (1.11b, 1.09d) ; Mod Name:Text with maximum length of 23 characters (ex : v 1.11b)}
- ColorOfVersionText=0 {0:white; 1:red; 4:gold; etc.}
- ColorOfVersionText=0 {0:see * for color list}
- ActivePrintPlugYVersion=1 {0:Disabled; 1:Enabled)
- ColorOfPlugYVersion=4 {0:white; 1:red; 4:gold; etc.}
- ColorOfPlugYVersion=4 {0:see * for color list}
[STASH]
@ -691,7 +709,16 @@ Following are default values, between {} are some examples values with descripti
- NbPagesPerIndex=10 {10: Index page is 1,10,20,30,...,max}
- NbPagesPerIndex2=100 {100: Index page (+shift) is 1,50,100,150,...,max}
- MaxPersonnalPages=0 {0:Infinite number of personnal pages; 1000: Maximum of 1000 shared pages}
- AutoRenameStashPage=0 {0:Disabled; 1:Enabled automatic renaming page}
- PersonalNormalPageColor=0 {0:Color of the personal stash name without index (see * for color list)}
- PersonalIndexPageColor=12 {0:Color of the personal stash name with index (see * for color list)}
- PersonalMainIndexPageColor=9 {0:Color of the personal stash name with main index (see * for color list)}
- SharedNormalPageColor=4 {0:Color of the shared stash name without index (see * for color list)}
- SharedIndexPageColor=8 {0:Color of the shared stash name with index (see * for color list)
- SharedMainIndexPageColor=1 {0:Color of the shared stash name with main index (see * for color list)}
- ActiveSharedStash=0 {0:Disabled; 1:Enabled if ActiveMultiPageStash=1}
- ActiveSharedStashInMultiPlayer=0 {0:Disabled; 1:Enabled shared stash in multiplayer. Use only with different save folders.}
- SeparateHardcoreStash=1 {0:Same shared stash for HC and SC; 1:Use 2 differents stashes}
- OpenSharedStashOnLoading=0 {0:Disabled; 1:Select shared stash (instead of personal one) on character loading}
- SharedStashFilename=SharedStashSave {xxx: The filename will be "_LOD_xxx.sss"}
@ -699,7 +726,9 @@ Following are default values, between {} are some examples values with descripti
- MaxSharedPages=0 {0:Infinite number of shared pages; 5000: Maximum of 5000 shared pages}
- ActiveSharedGold=1 {0:Disabled; 1:Use command to put and take gold (see command section)}
- PosXPreviousBtn=-1 {-1: Default position, 50: Put the button at the position 50 in absiss}
Same for PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn.
Same for PosYPreviousBtn, PosXNextBtn, PosYNextBtn, PosXSharedBtn, PosYSharedBtn, PosXPreviousIndexBtn, PosYPreviousIndexBtn, PosXNextIndexBtn, PosYNextIndexBtn, PosXPutGoldBtn, PosYPutGoldBtn, PosXTakeGoldBtn, PosYTakeGoldBtn, PosXStashNameField, PosYStashNameField, PosXStashGoldField, PosYStashGoldField.
- PosWPreviousBtn=32 {32: Width of the button}
Same for PosHPreviousBtn, PosWNextBtn, PosHNextBtn, PosWSharedBtn, PosHSharedBtn, PosWPreviousIndexBtn, PosHPreviousIndexBtn, PosWNextIndexBtn, PosHNextIndexBtn, PosWPutGoldBtn, PosHPutGoldBtn, PosWTakeGoldBtn, PosHTakeGoldBtn, PosWStashNameField, PosHStashNameField, PosWStashGoldField, PosHStashGoldField.
[STATS POINTS]
@ -716,6 +745,8 @@ You can define a limit value for points assigned/unassigned with shift.
Following are default values, between {} are some examples values with descriptions :
- ActiveShiftClickLimit=0 {0:Disabled; 1:Enabled}
- LimitValueToShiftClick=5 (10:Assign or unassign stats points, 10 by 10}
- PosXUnassignSkillBtn=-1 {-1: Default position, 50: X position of the button set to 50.}
- PosYUnassignSkillBtn=-1 {-1: Default position, 50: Y position of the button set to 50.}
[STAT ON LEVEL UP]
@ -733,7 +764,7 @@ Note: It verifies the real cost of each skill (can be greater than 1 in mod)
Warning : There are few place where you can put this button without bugs.
Following are default values, between {} are some examples values with descriptions :
- ActiveSkillsUnassignment=0 {0:Disabled; 1:Enabled}
- ActiveSkillsUnassignmentOneByOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).}
- ActiveSkillsUnassignmentOneForOne=0 {0:Normal; 1:Force the skill unassign 1 for 1 (for mods).}
- PosXUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in X}
- PosYUnassignSkillBtn=-1 {-1: Default position, 50: Put the button at the position 50 in Y}
@ -772,8 +803,24 @@ Following are default values, between {} are some examples values with descripti
Activate the Uber Quest in local.
It works only in Hell.
You must cube the 3 keys then the 3 organs in Harrogath.
Note: This quest will be updated more later to be more similar with the one on realm.
ActiveUberQuest=0 {0:Disabled; 1:Enabled}
UberMephistoX=25130 {25130:X position of Uber Mephisto}
UberMephistoY=5143 {5143:Y position of Uber Mephisto}
UberDiabloX=25139 {25139:X position of Uber Diablo}
UberDiabloY=5139 {5139:Y position of Uber Diablo}
UberBaalX=25139 {25139:X position of Uber Baal}
UberBaalY=5135 {5135:Y position of Uber Baal}
ActiveUberMinions=1 {0:Disabled; 1:Enabled Uber minions in Tristram}
UberMephistoSpawnPercent=80 {80:Percent chance of Uber Mephisto to spawn a minion}
UberMephistoSpawnRadius=30 {30:Radius of Uber Mephisto to spawn a minion}
UberBaalSpawnPercent=30 {30:Percent chance of Uber Baal to spawn a minion}
UberBaalSpawnRadius=30 {30:Radius of Uber Baal to spawn a minion}
UberDiabloSpawnPercent=30 {30:Percent chance of Uber Diablo to spawn a minion}
UberDiabloSpawnRadius=30 {30:Radius of Uber Diablo to spawn a minion}
ActiveUberDiabloRushTweekAI=1 {0:Disabled; 1:Enabled Uber Diablo Rush tweek}
ActiveUberBaalTeleportTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Teleport tweek}
ActiveUberBaalChillingArmorTweekAI=1 {0:Disabled; 1:Enabled Uber Baal Chilling Armor tweek}
UberBaalChillingArmorTimer=6000 {6000:Timer between Uber Baal casting Chilling Armor}
[INTERFACE]
@ -822,35 +869,54 @@ So don't use this column in your mod with this funcion enabled!
Enabled the ability to open the Cow Portal in a difficulty where the player have already killed the Cow King.
- ActiveCowPortalWhenCowKingWasKilled=0 {0:Disabled; 1:Enabled}
Prevent Nihlathak's portal from closing.
- ActiveDoNotCloseNihlathakPortal=0 {0:Disabled; 1:Enabled}
More features later...:)
Move Cain near Harrogath waypoint.
- MoveCainNearHarrogathWaypoint=0 {0:Disabled; 1:Enabled}
This is my email: ynicolas@worldonline.fr.
But I don't support PlugY anymore so don't hope any help from me if you have problems. Instead go on forums...
* Color list values (color code greater than 12 is black in 1.14d fullscreen):
- Invisible: 6
- Dark gray: 5
- Gray: 16
- Light gray: 15
- White: 0,
- Bright white: 18
- Gold: 4
- Dark yellow: 7
- Yellow: 9
- Orange: 8
- Darkest green: 10
- Dark green: 12
- Green: 2
- Blue: 3
- Purple: 11
- Red: 1
- Crystal red: 19
PS: Sorry for english faults ;)
******** THANKS TO ********
- Blizzard for making Diablo2 and Lord of Destruction.
- Kingpin, Afj666, Joel, SVR, Myrdinn for their great help.
- Pralinor fo his help in the convertion to 1.12.
- L'Autour fo his help in the convertion to 1.13d.
- ChaosEnergy for testing and his translation in German.
- Pralinor for his help in the convertion to 1.12.
- L'Autour for his help in the convertion to 1.13d.
- Haxifix for his help in the convertion to 1.14d.
- SnapChip for Uber AI in Tristram.
- ChaosEnergy for his testing.
- Char & Darque in the correction of my english.
- Shaitane, K&V, themastercaster, raspa and onyx for testing.
- Golvmopp, Dark Spot in the Corner, Megalixir and Athara for their help.
- ItalianPlayer for italian translation.
- All members of ProzenKeep chat and forums for their information and feedback.
- PhrozenKeep team for all stuff they shared for us (including mine ;)
- PhrozenKeep team.
- Translation :
* English: Yohann, Jurica.
* French: Yohann
* German: ChaosEnergy, TheMasterCaster.
* German: ChaosEnergy, TheMasterCaster, ChaosMarc.
* Italian: ItalianPlayer
* Spanish: Acrerune
* Polish: Serdel
* Russian: L'Autour
* Chinese: Nagahaku
;--------------------------------------------------------------------------------------;

Binary file not shown.

Binary file not shown.

View File

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