mirror of
https://gitlab.com/hashborgir/plugy.git
synced 2024-11-30 04:26:02 +00:00
added original source from http://plugy.free.fr
This commit is contained in:
parent
deeb863aec
commit
32b737d55e
856
Commons/D2Funcs.h
Normal file
856
Commons/D2Funcs.h
Normal file
@ -0,0 +1,856 @@
|
|||||||
|
/*======================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Declares the type for a STDCALL or FASTCALL function pointer
|
||||||
|
called N with arguments list P, returning R, namedInDLL D and at @A
|
||||||
|
|
||||||
|
======================================================================*/
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Common :
|
||||||
|
////D2S(D2Common,10001, DWORD, D2GetActIDFromLevel, (DWORD levelID));
|
||||||
|
//D2S(D2Common,11084, DWORD, D2Common11084, (Room* ptRoom, DWORD zero));//use only in 1.11/1.11b
|
||||||
|
//D2S(D2Common,11021, DWORD, D2GetLevelID, (Room* ptRoom));//1.11b
|
||||||
|
//D2S(D2Common,10491, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD));//1.11b
|
||||||
|
////D2S(D2Common,10149, Inventory*, D2GetInventory, (Unit* ptUnit));
|
||||||
|
//D2S(D2Common,10242, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient));
|
||||||
|
//D2S(D2Common,10813, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10827, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,11068, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//ONLY 1.11b result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
|
||||||
|
//D2S(D2Common,10250, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
|
||||||
|
////D2S(D2Common,10257, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc));
|
||||||
|
//D2S(D2Common,10273, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow));
|
||||||
|
//D2S(D2Common,10535, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,11140, Unit*, D2UnitGetNextItem, (Unit* ptItem));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10748, Unit*, D2GetRealItem, (Unit* ptUnit));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10321, SkillData*, D2GetLeftSkill, (Unit* ptChar));
|
||||||
|
////D2S(D2Common,10322, SkillData*, D2GetRightSkill, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10326, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10
|
||||||
|
////D2S(D2Common,10328, void, D2SetPosX, (Unit* ptUnit, DWORD pos));
|
||||||
|
//D2S(D2Common,10329, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10
|
||||||
|
////D2S(D2Common,10331, void, D2SetPosY, (Unit* ptUnit, DWORD pos));
|
||||||
|
//D2S(D2Common,10056, void, D2GetPosition, (Unit* ptUnit, Position* pos));//1.11b
|
||||||
|
//D2S(D2Common,10864, DWORD, D2GetMaxGoldBank, (Unit* ptUnit));//1.11b
|
||||||
|
//D2S(D2Common,10933, Room*, D2GetRoom, (Unit* ptUnit));//1.11b
|
||||||
|
////D2S(D2Common,10348, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode));
|
||||||
|
//D2S(D2Common,10394, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject));
|
||||||
|
//D2S(D2Common,10079, PlayerData*,D2InitPlayerData, (Unit* ptChar));//1.11b
|
||||||
|
//D2S(D2Common,10329, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar));//1.11b
|
||||||
|
//D2S(D2Common,10800, PlayerData*,D2GetPlayerData, (Unit* ptChar));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10431, DWORD, D2GetDefence, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10433, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame));
|
||||||
|
//D2S(D2Common,11131, DWORD, D2GetMaxGold, (Unit* ptUnit));//1.11b
|
||||||
|
//D2S(D2Common,10572, DWORD, D2Common10572, (Unit* ptObject, DWORD value));//use only in 1.11/1.11b
|
||||||
|
////D2S(D2Common,10463, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
////D2S(D2Common,10464, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
////D2S(D2Common,10465, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
////D2S(D2Common,10466, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex));
|
||||||
|
////D2S(D2Common,10470, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum));
|
||||||
|
//D2S(D2Common,11160, BYTE, D2GetObjectFlags, (Unit* ptObject));
|
||||||
|
//D2S(D2Common,11048, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags));
|
||||||
|
////D2S(D2Common,10471, DWORD, D2Common10471, (void*));//UNTL 1.10
|
||||||
|
////D2S(D2Common,10472, DWORD, D2Common10472, (void*));
|
||||||
|
////D2S(D2Common,10475, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one));
|
||||||
|
////D2S(D2Common,10481, void*, D2Common10481, (Unit* ptUnit, DWORD flags));
|
||||||
|
////D2S(D2Common,10484, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD));
|
||||||
|
////D2S(D2Common,10485, void, D2FreeStats, (Stats* ptStats));
|
||||||
|
//D2S(D2Common,10487, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame));
|
||||||
|
////D2S(D2Common,10517, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));
|
||||||
|
//D2S(D2Common,10627, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10061, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10520, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index));
|
||||||
|
//D2S(D2Common,10550, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10527, DWORD, D2Common10527, (Unit* ptUnit));
|
||||||
|
//D2S(D2Common,10539, DWORD, D2haveDefenceBonus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10540, DWORD, D2haveFireResBonus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10541, DWORD, D2haveColdResBonus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10542, DWORD, D2haveLightResBonus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10543, DWORD, D2havePoisonResBonus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10546, DWORD, D2haveDefenceMalus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10547, DWORD, D2haveFireResMalus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10548, DWORD, D2haveColdResMalus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10549, DWORD, D2haveLightResMalus, (Unit* ptChar));
|
||||||
|
//D2S(D2Common,10550, DWORD, D2havePoisonResMalus, (Unit* ptChar));
|
||||||
|
////D2S(D2Common,10552, DWORD, D2Common10552, (Unit* ptUnit));
|
||||||
|
////D2S(D2Common,10567, DWORD, D2CanBeBroken, (Unit* ptItem));
|
||||||
|
////D2S(D2Common,10573, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats));
|
||||||
|
////D2S(D2Common,10574, void*, D2SetEnabledStat, (Unit* ptItem, DWORD statId, DWORD disabled));
|
||||||
|
////D2S(D2Common,10575, void, D2FreeBinFiles, ());
|
||||||
|
////D2S(D2Common,10576, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool));
|
||||||
|
////D2S(D2Common,10651, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value));//ONLY 1.11
|
||||||
|
//D2S(D2Common,10496, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10262, ItemsBIN*, D2GetItemsBIN, (DWORD itemID));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10601, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID));
|
||||||
|
////D2S(D2Common,10604, AffixBIN*, D2GetAffixBIN, (int affixID));
|
||||||
|
//D2S(D2Common,10523, GemsBIN*, D2GetGemsBIN, (DWORD gemID));//1.11b
|
||||||
|
//D2S(D2Common,10258, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,11135, int, D2GetNbCubeMainBIN, ());//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10737, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID));
|
||||||
|
//D2S(D2Common,10628, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level));
|
||||||
|
//D2S(D2Common,10629, DWORD, D2GetMaxLevel, (DWORD classID));
|
||||||
|
//D2S(D2Common,10309, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel));
|
||||||
|
////D2S(D2Common,10659, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk));
|
||||||
|
////D2S(D2Common,10953, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id));//1.11b
|
||||||
|
//D2S(D2Common,10899, DWORD, D2GetItemQuality, (Unit* ptItem));//1.11b
|
||||||
|
//D2S(D2Common,10303, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10708, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue));
|
||||||
|
////D2S(D2Common,10709, DWORD, D2GetFlags, (Unit* ptUnit));
|
||||||
|
////D2S(D2Common,10711, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1
|
||||||
|
//D2S(D2Common,10100, DWORD, D2GetItemLevel, (Unit* ptItem));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10505, BYTE, D2ItemGetPage, (Unit* ptUnit));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10608, void, D2ItemSetPage, (Unit* ptItem, BYTE page));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10890, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10685, int, D2GetUniqueID, (Unit* ptItem));//1.11b
|
||||||
|
//D2S(D2Common,10734, void, D2SetAnim, (Unit* ptUnit, int anim));
|
||||||
|
////D2S(D2Common,10749, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height);
|
||||||
|
////D2S(D2Common,10751, DWORD, D2GetItemType, (Unit* ptUnit));
|
||||||
|
////D2S(D2Common,10757, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem));
|
||||||
|
//D2S(D2Common,10877, int*, D2GetNbRunesBIN, ());//ONLY 1.11b //return the point on th number
|
||||||
|
//D2S(D2Common,10296, RunesBIN*, D2GetRunesBIN, (int runesID));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10792, DWORD, D2CanBeRare, (Unit* ptItem));
|
||||||
|
////D2S(D2Common,10810, BYTE, D2CheckHasInv, (Unit* ptItem));
|
||||||
|
////D2S(D2Common,10813, DWORD, D2GetStaffMods, (Unit* ptItem));
|
||||||
|
////D2S(D2Common,11085, DWORD, D2GetNbSocket, (Unit* ptItem));//1.11b
|
||||||
|
////D2S(D2Common,10840, DWORD, D2Common10840, (Unit* ptItem, Unit* ptChar));
|
||||||
|
////D2S(D2Common,10855, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD));
|
||||||
|
////D2S(D2Common,10872, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y));
|
||||||
|
////D2S(D2Common,10875, WORD, D2GetItemVersion, (Unit* ptItem));
|
||||||
|
//D2S(D2Common,11068, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10 //1.11b
|
||||||
|
//D2S(D2Common,11156, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6));//1.11b
|
||||||
|
////D2S(D2Common,10916, void, DoNothing916, ());
|
||||||
|
////D2S(D2Common,10105, void, D2Common10027, (Unit* ptChar, DWORD skillID));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10950, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID));
|
||||||
|
////D2S(D2Common,10256, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID));//ONLY 1.11b
|
||||||
|
//D2S(D2Common,10255, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,10963, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line));
|
||||||
|
////D2F(D2Common,10966, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill));
|
||||||
|
//D2S(D2Common,10109, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus));//ONLY 1.11b
|
||||||
|
////D2S(D2Common,11023, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two));
|
||||||
|
////D2S(D2Common,11007, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState));
|
||||||
|
////D2S(D2Common,11041, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber));
|
||||||
|
////D2S(D2Common,11042, int, D2GetNbSkillsPerPlayer, (DWORD playerID));
|
||||||
|
////D2S(D2Common,11269, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex));
|
||||||
|
////D2S(D2Common,11270, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD));
|
||||||
|
//D2S(D2Common,10074, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//ONLY 1.11b (not 10447)
|
||||||
|
//E2F(D2Common,1800, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID));//1.11b /NOT in 1.10
|
||||||
|
//E2F(D2Common,1A100, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2));//1.11b
|
||||||
|
//E2F(D2Common,19B40, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2));//1.11b
|
||||||
|
//E2F(D2Common,1380, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId));//ONLY 1.11b
|
||||||
|
////E2F(D2Common,62FD0, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize));
|
||||||
|
//E2F(D2Common,12F0, ItemStatCostBIN*, D2GetItemStatCostBIN, (DWORD id));//ONLY 1.11b
|
||||||
|
////E2F(D2Common,764A0, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD));
|
||||||
|
////E2S(D2Common,76E30, void, D2PreUpdateDisabledStat, (Stats* ptStats));
|
||||||
|
////E2F(D2Common,76C10, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem));
|
||||||
|
//E2F(D2Common,98D0, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD));//1.11b
|
||||||
|
////E2F(D2Common,94D0, void*, D2GetStringIDForTxtFile,(const char * string));
|
||||||
|
//E2S(D2Common,32AA0, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10 (1.11b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//F7(STD, D2Common,00000,00000,00000,00000,10001,00000,00000, DWORD, D2GetActIDFromLevel, (DWORD levelID));
|
||||||
|
F7(STD, D2Common,00000,00000,00000,10188,11084,11109,10346, DWORD, D2Common11084, (Room* ptRoom, DWORD zero));
|
||||||
|
F7(STD, D2Common,10057,10057,10057,10332,11021,10511,10826, DWORD, D2GetLevelID, (Room* ptRoom));
|
||||||
|
F7(STD, D2Common,10138,10138,10138,10623,10491,11043,10654, Room*, D2GetDropRoom, (Room* ptRoom, Position*, Position*, DWORD, DWORD, DWORD, DWORD));
|
||||||
|
//F7(STD, D2Common,10149,10149,10149,00000,00000,00000,00000, Inventory*, D2GetInventory, (Unit* ptUnit));
|
||||||
|
F7(STD, D2Common,10242,10242,10242,00000,00000,00000,00000, Unit*, D2Common10242, (Inventory* ptInventory, Unit* ptItem, DWORD bIsClient));
|
||||||
|
F7(STD, D2Common,10246,10246,10246,10855,10813,10289,10133, Unit*, D2CanPutItemInInv, (Inventory* ptInventory, Unit* ptItem, DWORD p3, DWORD zero, Unit* ptUnit, const char* file, DWORD line));
|
||||||
|
F7(STD, D2Common,10243,10243,10243,10461,10827,10936,10646, Unit*, D2InvRemoveItem, (Inventory* ptInventory, Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10249,10249,10249,10880,11068,10436,11107, DWORD, D2InvAddItem, (Inventory* ptInventory, Unit* ptItem, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));//result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
|
||||||
|
F7(STD, D2Common,10250,10250,10250,00000,00000,00000,00000, DWORD, D2Common10250, (const char* file, DWORD line, Inventory* ptInventory, DWORD posX, DWORD posY, DWORD vValueC, DWORD bIsClient, BYTE page));// result : boolean 0=echec ; vValueC = 0 for Game.dll, 1 for Clientdll
|
||||||
|
//F7(STD, D2Common,10257,10257,10257,00000,00000,00000,00000, Unit*, D2GetItemFromBodyLoc, (Inventory* ptInventory, DWORD bodyloc));
|
||||||
|
F7(STD, D2Common,10273,10273,10273,00000,00000,00000,00000, DWORD, D2Common10273, (Inventory* ptInventory, void* unknow));
|
||||||
|
F7(STD, D2Common,10277,10277,10277,10402,10535,11151,10460, Unit*, D2InventoryGetFirstItem, (Inventory* ptInventory));
|
||||||
|
F7(STD, D2Common,10304,10304,10304,10934,11140,10770,10464, Unit*, D2UnitGetNextItem, (Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10305,10305,10305,11095,10748,10852,11147, Unit*, D2GetRealItem, (Unit* ptUnit));
|
||||||
|
//F7(STD, D2Common,10321,10321,10321,00000,00000,00000,00000, SkillData*, D2GetLeftSkill, (Unit* ptChar));
|
||||||
|
//F7(STD, D2Common,10322,10322,10322,00000,00000,00000,00000, SkillData*, D2GetRightSkill, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10326,10326,00000,00000,00000,00000,00000, DWORD, D2GetPosX, (Unit* ptUnit));//NOT IN 1.10
|
||||||
|
//F7(STD, D2Common,10328,10328,10328,00000,00000,00000,00000, void, D2SetPosX, (Unit* ptUnit, DWORD pos));
|
||||||
|
F7(STD, D2Common,10329,10329,00000,00000,00000,00000,00000, DWORD, D2GetPosY, (Unit* ptUnit));//NOT IN 1.10
|
||||||
|
//F7(STD, D2Common,10331,10331,10331,00000,00000,00000,00000, void, D2SetPosY, (Unit* ptUnit, DWORD pos));
|
||||||
|
F7(STD, D2Common,10332,10332,10332,11080,10056,10543,10141, void, D2GetPosition, (Unit* ptUnit, Position* pos));
|
||||||
|
F7(STD, D2Common,10339,10339,10339,10455,10864,10941,11060, DWORD, D2GetMaxGoldBank, (Unit* ptUnit));
|
||||||
|
F7(STD, D2Common,10342,10342,10342,10172,10933,10366,10331, Room*, D2GetRoom, (Unit* ptUnit));
|
||||||
|
//F7(STD, D2Common,10348,10348,10348,00000,00000,00000,00000, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode));
|
||||||
|
//F7(STD, D2Common,10394,10394,10394,00000,00000,00000,00000, ObjectsBIN*,D2GetObjectsBIN, (Unit* ptObject));
|
||||||
|
F7(STD, D2Common,10420,10420,10420,10218,10079,11097,10356, PlayerData*,D2InitPlayerData, (Unit* ptChar));
|
||||||
|
//F7(STD, D2Common,10421,10421,10421,10914,10329,00000,00000, DWORD, D2FreePlayerData, (DWORD game1C, Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10424,10424,10424,10562,10800,10860,10920, PlayerData*,D2GetPlayerData, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10431,10431,10431,00000,00000,00000,00000, DWORD, D2GetDefence, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10433,10433,10433,00000,00000,00000,00000, DWORD, D2GetChanceToBlock, (Unit* ptChar, DWORD isLODGame));
|
||||||
|
F7(STD, D2Common,10439,10439,10439,10343,11131,10729,10049, DWORD, D2GetMaxGold, (Unit* ptUnit));
|
||||||
|
F7(STD, D2Common,00000,00000,00000,10440,10572,10481,11090, DWORD, D2Common10572, (Unit* ptObject, DWORD value));
|
||||||
|
//F7(STD, D2Common,10463,10463,10463,00000,00000,00000,00000, DWORD, D2SetStatWithNoTest, ( Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
//F7(STD, D2Common,10464,10464,10464,00000,00000,00000,00000, void, D2AddStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
//F7(STD, D2Common,10465,10465,10465,00000,00000,00000,00000, DWORD, D2SetStat, (Stats* ptStats, DWORD statID, DWORD statValue, DWORD statIndex));
|
||||||
|
//F7(STD, D2Common,10466,10466,10466,00000,00000,00000,00000, int, D2GetStat, (Stats* ptStats, DWORD statID, DWORD statIndex));
|
||||||
|
//F7(STD, D2Common,10470,10470,10470,00000,00000,00000,00000, Stats*, D2AllocNewStats, (DWORD nUnitId, DWORD flags, DWORD uk18, DWORD nUnitType, DWORD nItemNum));
|
||||||
|
F7(STD, D2Common,00000,00000,00000,10471,11160,10866,10258, BYTE, D2GetObjectFlags, (Unit* ptObject));
|
||||||
|
F7(STD, D2Common,00000,00000,00000,10572,11048,10150,10111, void, D2SetObjectFlags, (Unit* ptObject, BYTE flags));
|
||||||
|
//F7(STD, D2Common,10471,10471,10471,00000,00000,00000,00000, DWORD, D2Common10471, (void*));
|
||||||
|
//F7(STD, D2Common,10472,10472,10472,00000,00000,00000,00000, DWORD, D2Common10472, (void*));
|
||||||
|
//F7(STD, D2Common,10475,10475,10475,00000,00000,00000,00000, void, D2UpdateDisabledStat, (Stats* ptCharStats, Stats* ptStats, DWORD one));
|
||||||
|
//F7(STD, D2Common,10481,10481,10481,00000,00000,00000,00000, void*, D2Common10481, (Unit* ptUnit, DWORD flags));
|
||||||
|
//F7(STD, D2Common,10484,10484,10484,00000,00000,00000,00000, Stats*, D2GetAffixStats, (Unit* ptItem, DWORD, DWORD));
|
||||||
|
//F7(STD, D2Common,10485,10485,10485,00000,00000,00000,00000, void, D2FreeStats, (Stats* ptStats));
|
||||||
|
F7(STD, D2Common,10487,10487,10487,00000,00000,00000,00000, DWORD, D2isInState, (Unit* ptChar, DWORD isLODGame));
|
||||||
|
//F7(STD, D2Common,10517,10517,10517,00000,00000,00000,00000, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));
|
||||||
|
F7(STD, D2Common,10518,10518,10518,10109,10627,10762,10551, void, D2AddPlayerStat, (Unit* ptChar, DWORD statID, int amount, DWORD index));//ONLY 1.11b
|
||||||
|
F7(STD, D2Common,10519,10519,10519,11092,10061,10658,10973, int, D2GetPlayerStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
|
||||||
|
//F7(STD, D2Common,10520,10520,10520,00000,00000,00000,00000, int, D2GetPlayerStat20, (Unit* ptChar, DWORD statID, DWORD index));
|
||||||
|
F7(STD, D2Common,10521,10521,10521,10733,10550,10494,10587, int, D2GetPlayerBaseStat, (Unit* ptChar, DWORD statID, DWORD index));//ONLY 1.11b
|
||||||
|
//F7(STD, D2Common,10527,10527,10527,00000,00000,00000,00000, DWORD, D2Common10527, (Unit* ptUnit));
|
||||||
|
F7(STD, D2Common,10539,10539,10539,00000,00000,00000,00000, DWORD, D2haveDefenceBonus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10540,10540,10540,00000,00000,00000,00000, DWORD, D2haveFireResBonus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10541,10541,10541,00000,00000,00000,00000, DWORD, D2haveColdResBonus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10542,10542,10542,00000,00000,00000,00000, DWORD, D2haveLightResBonus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10543,10543,10543,00000,00000,00000,00000, DWORD, D2havePoisonResBonus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10546,10546,10546,00000,00000,00000,00000, DWORD, D2haveDefenceMalus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10547,10547,10547,00000,00000,00000,00000, DWORD, D2haveFireResMalus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10548,10548,10548,00000,00000,00000,00000, DWORD, D2haveColdResMalus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10549,10549,10549,00000,00000,00000,00000, DWORD, D2haveLightResMalus, (Unit* ptChar));
|
||||||
|
F7(STD, D2Common,10550,10550,10550,00000,00000,00000,00000, DWORD, D2havePoisonResMalus, (Unit* ptChar));
|
||||||
|
//F7(STD, D2Common,10552,10552,10552,00000,00000,00000,00000, DWORD, D2Common10552, (Unit* ptUnit));
|
||||||
|
//F7(STD, D2Common,10567,10567,10567,00000,00000,00000,00000, DWORD, D2CanBeBroken, (Unit* ptItem));
|
||||||
|
//F7(STD, D2Common,10573,10573,10573,00000,00000,00000,00000, void, D2CopyStats, (Stats* ptDestStats, Stats* ptSrcStats));
|
||||||
|
//F7(STD, D2Common,10574,10574,10574,00000,00000,00000,00000, void*, D2SetEnabledStat, (Unit* ptItem, DWORD statId, DWORD disabled));
|
||||||
|
//F7(STD, D2Common,10575,10575,10575,00000,00000,00000,00000, void, D2FreeBinFiles, ());
|
||||||
|
//F7(STD, D2Common,10576,10576,10576,00000,00000,00000,00000, void, D2LoadBinFiles, (DWORD zero1, DWORD zero2, bool));
|
||||||
|
//F7(STD, D2Common,00000,00000,00000,10651,10651,00000,00000, DWORD, D2CheckQuestState, (void* ptQuest, DWORD index, DWORD value));
|
||||||
|
F7(STD, D2Common,10578,10578,10578,10653,10496,10244,10849, void*, D2CompileTxtFile, (DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength));
|
||||||
|
F7(STD, D2Common,10600,10600,10600,10573,10262,10887,10695, ItemsBIN*, D2GetItemsBIN, (DWORD itemID));
|
||||||
|
//F7(STD, D2Common,10601,10601,10601,00000,00000,00000,00000, ItemsBIN*, D2GetByCodeItemStatsBIN, (DWORD code, DWORD* itemID));
|
||||||
|
//F7(STD, D2Common,10604,10604,10604,00000,00000,00000,00000, AffixBIN*, D2GetAffixBIN, (int affixID));
|
||||||
|
F7(STD, D2Common,10616,10616,10616,10500,10523,10774,10806, GemsBIN*, D2GetGemsBIN, (DWORD gemID));
|
||||||
|
F7(STD, D2Common,11232,11232,11232,10746,10258,10913,10783, CubeMainBIN*,D2GetCubeMainBIN, (DWORD cubemainID));
|
||||||
|
F7(STD, D2Common,11233,11233,11233,10639,11135,10390,10675, int, D2GetNbCubeMainBIN, ());
|
||||||
|
//F7(STD, D2Common,10737,10737,10737,00000,00000,00000,00000, LevelsBIN*, D2GetLevelsBIN, (DWORD levelID));
|
||||||
|
F7(STD, D2Common,10628,10628,10628,00000,00000,00000,00000, DWORD, D2GetNextLevelXP, (DWORD classID, DWORD level));
|
||||||
|
F7(STD, D2Common,10629,10629,10629,00000,00000,00000,00000, DWORD, D2GetMaxLevel, (DWORD classID));
|
||||||
|
F7(STD, D2Common,10655,10655,10655,10655,10309,10297,10218, DifficultyLevelsBIN*, D2GetDifficultyLevelsBIN, (DWORD difficultyLevel));
|
||||||
|
//F7(STD, D2Common,10659,10659,10659,00000,00000,00000,00000, TreasureClassBIN*, D2GetTreasureClassBIN, (WORD id, DWORD uk));
|
||||||
|
//F7(STD, D2Common,10668,10668,10668,10450,10953,00000,00000, SuperUniqueBIN*, D2GetSuperUniqueBIN, (WORD id));
|
||||||
|
F7(STD, D2Common,10695,10695,10695,10927,10899,10276,10106, DWORD, D2GetItemQuality, (Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10707,10707,10707,10911,10303,10989,10202, DWORD, D2TestFlags, (Unit* ptUnit, DWORD flags, DWORD line, const char* file));
|
||||||
|
//F7(STD, D2Common,10708,10708,10708,00000,00000,00000,00000, void, D2SetFlags, (Unit* ptUnit, DWORD flags, DWORD bitNewValue));
|
||||||
|
//F7(STD, D2Common,10709,10709,10709,00000,00000,00000,00000, DWORD, D2GetFlags, (Unit* ptUnit));
|
||||||
|
//F7(STD, D2Common,10711,10711,10711,00000,00000,00000,00000, void, D2ItemSetFlags, (Unit* ptItem, DWORD flags, DWORD toSet));// toSet = 0 for set to 0 the selected flags else set to 1
|
||||||
|
F7(STD, D2Common,10717,10717,10717,10898,10100,10410,10086, DWORD, D2GetItemLevel, (Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10719,10719,10719,10820,10505,10370,10020, BYTE, D2ItemGetPage, (Unit* ptUnit));
|
||||||
|
F7(STD, D2Common,10720,10720,10720,10485,10608,10223,10012, void, D2ItemSetPage, (Unit* ptItem, BYTE page));
|
||||||
|
F7(STD, D2Common,10731,10731,10731,11017,10890,10231,10744, DWORD, D2CheckItemType, (Unit* ptItem, DWORD itype));
|
||||||
|
F7(STD, D2Common,10732,10732,10732,10692,10685,10280,10620, int, D2GetUniqueID, (Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10734,10734,10734,00000,00000,00000,00000, void, D2SetAnim, (Unit* ptUnit, int anim));
|
||||||
|
//F7(STD, D2Common,10749,10749,10749,00000,00000,00000,00000, void, D2GetWidthHeight, (Unit* ptItem, BYTE* Width, BYTE* Height);
|
||||||
|
//F7(STD, D2Common,10751,10751,10751,00000,00000,00000,00000, DWORD, D2GetItemType, (Unit* ptUnit));
|
||||||
|
//F7(STD, D2Common,10757,10757,10757,00000,00000,00000,00000, DWORD, D2GetItemLevelReq, (Unit* ptChar, Unit* ptItem));
|
||||||
|
F7(STD, D2Common,10619,10619,10619,10687,10877,10321,11032, int*, D2GetNbRunesBIN, ());//return the point on th number
|
||||||
|
F7(STD, D2Common,10620,10620,10620,10775,10296,10622,10006, RunesBIN*, D2GetRunesBIN, (int runesID));
|
||||||
|
//F7(STD, D2Common,10792,10792,10792,00000,00000,00000,00000, DWORD, D2CanBeRare, (Unit* ptItem));
|
||||||
|
//F7(STD, D2Common,10810,10810,10810,00000,00000,00000,00000, BYTE, D2CheckHasInv, (Unit* ptItem));
|
||||||
|
//F7(STD, D2Common,10813,10813,10813,00000,00000,00000,00000, DWORD, D2GetStaffMods, (Unit* ptItem));
|
||||||
|
//F7(STD, D2Common,10816,10816,10816,10816,11085,00000,00000, DWORD, D2GetNbSocket, (Unit* ptItem));
|
||||||
|
//F7(STD, D2Common,10840,10840,10840,00000,00000,00000,00000, DWORD, D2Common10840, (Unit* ptItem, Unit* ptChar));
|
||||||
|
//F7(STD, D2Common,10855,10855,10855,00000,00000,00000,00000, void, D2AddAffix, (DWORD, DWORD, Unit* ptItem, AffixBIN* ptAffix, DWORD, DWORD));
|
||||||
|
//F7(STD, D2Common,10872,10872,10872,00000,00000,00000,00000, DWORD, D2WarpPlayer, (Path* ptPath, Unit* ptChar, Room* ptRoom, DWORD x, DWORD y));
|
||||||
|
//F7(STD, D2Common,10875,10875,10875,00000,00000,00000,00000, WORD, D2GetItemVersion, (Unit* ptItem));
|
||||||
|
F7(STD, D2Common,11163,11163,11163,10880,11068,10436,11107, DWORD, D2isEtheral, (Unit* ptItem));//ONLY UNTIL 1.10
|
||||||
|
F7(STD, D2Common,10881,10881,10881,10956,11156,10218,10987, DWORD, D2SaveItem, (Unit* ptItem, saveBitField* data, DWORD startSize, DWORD p4, DWORD p5, DWORD p6));
|
||||||
|
//F7(STD, D2Common,10916,10916,10916,00000,00000,00000,00000, void, DoNothing916, ());
|
||||||
|
//F7(STD, D2Common,10940,10940,10940,10027,10105,10953,00000, void, D2Common10027, (Unit* ptChar, DWORD skillID));
|
||||||
|
//F7(STD, D2Common,10950,10950,10950,00000,00000,00000,00000, SkillData*, D2GetSkillPointer, (Unit* ptChar, WORD SkillID));
|
||||||
|
//F7(STD, D2Common,10952,10952,10952,10950,10256,10858,00000, SkillData*, D2IncSkillBaseLevel, (Unit* ptChar, DWORD skillID));
|
||||||
|
F7(STD, D2Common,10953,10953,10953,10099,10255,10210,10302, void, D2SetSkillBaseLevel,(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD));
|
||||||
|
//F7(STD, D2Common,10963,10963,10963,00000,00000,00000,00000, DWORD, D2GetSkillID, (SkillData* ptSkill, const char* file, DWORD line));
|
||||||
|
//F7(FAST, D2Common,10966,10966,10966,00000,00000,00000,00000, SkillsBIN*, D2GetSkillsBIN, (SkillData* ptSkill));
|
||||||
|
F7(STD, D2Common,10968,10968,10968,10700,10109,10904,10306, DWORD, D2GetSkillLevel, (Unit* ptChar, SkillData* ptSkill, DWORD includingBonus));
|
||||||
|
//F7(STD, D2Common,11023,11023,11023,00000,00000,00000,00000, DWORD, D2GetCriticalStrikeFromMasteries, (Unit* ptChar, Unit* ptItem, DWORD zero, DWORD two));
|
||||||
|
//F7(STD, D2Common,11007,11007,11007,00000,00000,00000,00000, bool, D2TestQuestState, (void* ptQuest, DWORD QuestID, DWORD QuestState));
|
||||||
|
//F7(STD, D2Common,11041,11041,11041,00000,00000,00000,00000, int, D2GetPlayerSkillID, (DWORD playerID, DWORD skillNumber));
|
||||||
|
//F7(STD, D2Common,11042,11042,11042,00000,00000,00000,00000, int, D2GetNbSkillsPerPlayer, (DWORD playerID));
|
||||||
|
//F7(STD, D2Common,11269,11269,11269,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStat, (Stats* ptStats, DWORD statID, D2Stat* allIndex, DWORD maxIndex));
|
||||||
|
//F7(STD, D2Common,11270,11270,11270,00000,00000,00000,00000, DWORD, D2GetAllIndexFromStatID, (Unit* ptItem, DWORD statID, D2Stat* allIndex, DWORD));
|
||||||
|
F7(STD, D2Common,11276,11276,11276,10254,10074,10111,10435, DWORD, D2GetSkillCost, (Unit* ptChar, int skpoints, DWORD skillID, DWORD curSkillLevel));//not 10447
|
||||||
|
A7(FAST, D2Common,00000,00000,82C80, 15D0, 1800, 1220, 12D0, CharStatsBIN*, D2GetCharStatsBIN, (DWORD charID));
|
||||||
|
A7(FAST, D2Common,00000,00000,12410,5D7D0,1A100,116C0,1C020, DWORD, D2CompileCubeInput, (CubeInput* cubeinput, char* s, DWORD p1, DWORD p2));
|
||||||
|
A7(FAST, D2Common,00000,00000,12910,5D210,19B40,11100,1BA60, DWORD, D2CompileCubeOutput, (CubeOutput* cubeoutput, char* s, DWORD p1, DWORD p2));
|
||||||
|
A7(FAST, D2Common,00000,00000,2B1A0, 11F0, 1380, 1140, 1300, ItemTypesBIN*, D2GetItemTypesBIN, (DWORD itemTypesId));
|
||||||
|
//A7(FAST, D2Common,00000,00000,62FD0,00000,00000,00000,00000, void, D2EncodeValueCheckMax, (saveBitField* data, DWORD value, DWORD bitSize));
|
||||||
|
A7(FAST, D2Common,00000,00000,642B0, 13F0, 12F0, 1540, 17A0, ItemStatCostBIN*,D2GetItemStatCostBIN, (DWORD id));
|
||||||
|
//A7(FAST, D2Common,00000,00000,764A0,00000,00000,00000,00000, void*, D2Common764A0, (Stats* ptStats, DWORD stat, ItemStatCostBIN* itemStatCost ,DWORD));
|
||||||
|
//A7(STD, D2Common,00000,00000,76E30,00000,00000,00000,00000, void, D2PreUpdateDisabledStat, (Stats* ptStats));
|
||||||
|
//A7(FAST, D2Common,00000,00000,76C10,00000,00000,00000,00000, void, D2ApplyStat,(Stats* ptCharStats, DWORD statId, DWORD value, Unit* ptItem));
|
||||||
|
A7(FAST, D2Common,738A4,739B4,84268, 96E0, 98D0, 9900, 9900, void*, D2ReadFile,(DWORD unused, char* filename, DWORD* size, const char*, DWORD));
|
||||||
|
//A7(FAST, D2Common,00000,00000, 94D0,00000,00000,00000,00000, void*, D2GetStringIDForTxtFile,(const char * string));
|
||||||
|
A7(STD, D2Common,1F500,1F510,29FA0,71EB0,32AA0,7D2A0,59870, void, D2LoadSuperuniques,(DWORD mempool));//FASCALL UNTIL 1.10
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Client : 6FAA0000
|
||||||
|
//E2F(D2Client,A9070, void*, D2LoadImage, (const char* filename, DWORD filetype));//1.11
|
||||||
|
//E2F(D2Client,0000, void, D2FreeImage, (void* image));//6FAA1140 // NOT IN 1.11
|
||||||
|
//E2F(D2Client,5E4E0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !!
|
||||||
|
////E2S(D2Client,15A80, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80
|
||||||
|
//E2S(D2Client,15A80, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80
|
||||||
|
//E2S(D2Client,89320, void, D2PrintStatsPage, ());//ONLY 1.11b
|
||||||
|
////E2F(D2Client,45990, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990
|
||||||
|
//E2F(D2Client,21250, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b
|
||||||
|
//E2F(D2Client,62070, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI
|
||||||
|
////E2F(D2Client,869F0, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0
|
||||||
|
//E2F(D2Client,54210, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD));//1.11b
|
||||||
|
////E2F(D2Client,BB0F0, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl));//UNITL 1.10
|
||||||
|
//E2F(D2Client,571C0, Unit*, D2GetCurrentNPC, ());//1.11b
|
||||||
|
//E2F(D2Client,5DE40, void, D2SendToServerXX,(DWORD size, BYTE * data));//ONLY 1.11b by EBX
|
||||||
|
//E2F(D2Client,65690, void, D2TogglePage, (DWORD a, DWORD b, DWORD c));//1.11b
|
||||||
|
//E2F(D2Client,710C0, void, D2ClickOnStashButton, (DWORD x, DWORD y));//STRICT 1.11/1.11b BY x=ESI y=EDI
|
||||||
|
//E2S(D2Client,621C0, void*, D2LoadBuySelBtn, ());//1.11b
|
||||||
|
//E2F(D2Client,5BA90, void, D2ReloadGambleScreen, ());//1.11b
|
||||||
|
//E2F(D2Client,1FEB0, void, D2OpenNPCMenu, (Unit* ptNPC));//1.11b by ESI
|
||||||
|
|
||||||
|
A7(FAST, D2Client, 1000, 1000, 1000,75D00,A9070,BEF70,2B420, void*, D2LoadImage, (const char* filename, DWORD filetype));
|
||||||
|
A7(FAST, D2Client, 1150, 1150, 1140,00000,00000,00000,00000, void, D2FreeImage, (void* image));//6FAA1140
|
||||||
|
A7(FAST, D2Client, D640, D630, DB50,73620,5E4E0,79670,147A0, void, D2SendMsgToAll,(BYTE* data));//1.11 and 1.11b by ESI !!
|
||||||
|
//A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, int, D2GetAvgChanceMonsterWillHitYou, ());//6FAB5A80
|
||||||
|
A7(STD, D2Client,00000,00000,15A80,00000,00000,00000,00000, DWORD, D2GetLastMonsterIDFight, ());//6FAB5A80
|
||||||
|
A7(STD, D2Client,29800,297F0,2FD60,828A0,89320,6B280,BCEA0, void, D2PrintStatsPage, ());
|
||||||
|
//A7(FAST, D2Client,00000,00000,45990,00000,00000,00000,00000, Unit*, D245990, (Inventory*,DWORD idItem);//6FAE5990
|
||||||
|
A7(FAST, D2Client,4BB20,4BB20,521C0,B8CB0,21250,88EA0,54E10, DWORD, D2PrintStat,(Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText));//statID=EAX, lpText=ESI 1.11b
|
||||||
|
A7(FAST, D2Client,85A60,84DE0,80430,9EEB0,62070,8B7A0,BF5F0, LPWSTR, D2SetColorPopup, (LPWSTR popupText, DWORD color));//1.11 and 1.11b BY EDI
|
||||||
|
//A7(FAST, D2Client,00000,00000,869F0,00000,00000,00000,00000, Unit*, D2ClientGetObject, (DWORD itemNum, DWORD type));//6FB269F0
|
||||||
|
A7(FAST, D2Client,B4360,B36E0,B5820,3ACC0,54210,31FA0,88A70, DWORD, D2PlaySound, (DWORD id, DWORD, DWORD, DWORD, DWORD));
|
||||||
|
//A7(FAST, D2Client,B9970,B8CF0,BB0F0,00000,00000,00000,00000, void, D2FillRect,(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl));
|
||||||
|
A7(FAST, D2Client,00000,00000,00000,00000,571C0,18450,46150, Unit*, D2GetCurrentNPC, ());
|
||||||
|
A7(FAST, D2Client,00000,00000,00000,73260,5DE40,791A0,143E0, void, D2SendToServerXX,(DWORD size, BYTE * data));//by EBX
|
||||||
|
A7(FAST, D2Client,88940,87CC0,83260,A1F30,65690,8EF00,C2790, void, D2TogglePage, (DWORD a, DWORD b, DWORD c));
|
||||||
|
A7(FAST, D2Client,00000,00000,00000,A6520,710C0,A6640,8CD00, void, D2ClickOnStashButton, (DWORD x, DWORD y));//BY x=ESI y=EDI
|
||||||
|
A7(STD, D2Client,897B0,88B30,84110,9E3B0,621C0,8B8F0,BEAF0, void*, D2LoadBuySelBtn, ());
|
||||||
|
A7(FAST, D2Client,00000,00000,00000,8E480,5BA90,1CC00,4ABE0, void, D2ReloadGambleScreen, ());
|
||||||
|
//A7(FAST, D2Client,00000,00000,00000,00000,1FEB0,5CDD0,00000, void, D2OpenNPCMenu, (Unit* ptNPC));//by ESI
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Game : 6FC30000
|
||||||
|
//D2F(D2Game,10007, void, D2SetNbPlayers, (DWORD nbPlayers));//1.11b
|
||||||
|
////E2F(D2Game,01DE0, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0
|
||||||
|
//E2F(D2Game,E8210, void, D2AddClient, (DWORD clientID));//BY EAX //1.11b
|
||||||
|
//E2S(D2Game,E49A0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0 //1.11b
|
||||||
|
//E2F(D2Game,E36D0, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0//1.11b
|
||||||
|
//E2F(D2Game,A0D50, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData //1.11b
|
||||||
|
//E2F(D2Game,A3F20, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//ONLY 1.11 by EAX,ESI,EBX
|
||||||
|
////E2F(D2Game,0E6F0, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0
|
||||||
|
////E2F(D2Game,10FB0, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0
|
||||||
|
////E2F(D2Game,110E0, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0
|
||||||
|
//E2S(D2Game,109F0, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID));//ONLY 1.11b
|
||||||
|
//E2F(D2Game,43E60, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem//1.11b
|
||||||
|
////E2F(D2Game,1ED80, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80
|
||||||
|
//E2F(D2Game,01DF0, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y));//1.11b
|
||||||
|
////E2F(D2Game,22410, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410
|
||||||
|
////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)
|
||||||
|
//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
|
||||||
|
//E2F(D2Game,25D50, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0//1.11b
|
||||||
|
//E2F(D2Game,BEF80, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00//1.11b
|
||||||
|
//E2F(D2Game,F1C50, Unit*, D2GetOwnerMonster, (Unit* ptMonster));//ONLY 1.11b
|
||||||
|
////E2F(D2Game,E08D0, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0
|
||||||
|
//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,92420, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one));//1.11b
|
||||||
|
//E2S(D2Game,E66D0, void, D2SaveGame, (Game* ptGame));//1.11b
|
||||||
|
|
||||||
|
|
||||||
|
F7(FAST, D2Game,10059,10059,10059,10039,10007,10037,10049, void, D2SetNbPlayers, (DWORD nbPlayers));
|
||||||
|
//A7(FAST, D2Game,00000,00000,01DE0,00000,00000,00000,00000, void*, D2GetClientByClientID, (Game* ptGame, DWORD clientID));//6FC31DE0
|
||||||
|
A7(FAST, D2Game,00000,00000, 6C60,E3DA0,E8210,EB060,49930, void, D2AddClient, (DWORD clientID));//BY EAX
|
||||||
|
A7(STD, D2Game,00000,00000, 94E0,E0520,E49A0,A6360,2AAE0, Game*, D2GetGameByClientID, (DWORD clientID));//6FC394E0
|
||||||
|
A7(FAST, D2Game,00000,00000, B0E0,DF250,E36D0,A5080,29820, void, D2BroadcastFunction, (Game* ptGame, void* fct, void* param));//00DAB0E0
|
||||||
|
A7(FAST, D2Game, C380, C650, C710,41420,A0D50,7D220,8A3E0, DWORD, D2SendPacket, (void* ptNetClient, LPVOID pData, DWORD size));//EAX=ptNetClient [ESP]=pData
|
||||||
|
A7(FAST, D2Game, D650, D920, DB50,44D00,A3F20,802E0,8D5F0, void, D2SetSkillBaseLevelOnClient, (void* ptClient, Unit* ptChar, DWORD skillID, DWORD sLvl, DWORD bRemove));//by EAX,ESI,EBX
|
||||||
|
//A7(FAST, D2Game,00000,00000,0E6F0,00000,00000,00000,00000, void, D2UpdateClientItem, (NetClient* ptNetClient, Unit* ptChar, Unit* ptItem,DWORD,DWORD,DWORD));//6FC3E6F0
|
||||||
|
//A7(FAST, D2Game,00000,00000,10FB0,00000,00000,00000,00000, DWORD, D2UpdateInventory, (Game* ptGame, Unit* ptChar, void* ptNetClient, Inventory* pInventory));//6FC40FB0
|
||||||
|
//A7(FAST, D2Game,00000,00000,110E0,00000,00000,00000,00000, DWORD, D2UpdateItem, (Unit* ptChar, Unit* ptItem, Unit* ptSocketedItem, void* ptNetClient));//6FC410E0
|
||||||
|
A7(STD, D2Game,00000,00000,00000,27230,109F0,AE930,A22E0, DWORD, D2LinkPortal, (Game* ptGame, Unit* ptObject, DWORD levelEndID, DWORD levelStartID));
|
||||||
|
A7(FAST, D2Game,00000,00000,128F0,38D90,43E60,11FF0,D2070, DWORD, D2VerifIfNotCarry1, (Unit* ptItem, ItemsBIN* itemsData, Unit* ptFirstItem));// BY EBX=itemsData EAX=ptFirstItem [ESP]=ptItem
|
||||||
|
//A7(FAST, D2Game,00000,00000,1ED80,00000,00000,00000,00000, Unit*, D2CreateItem, (Game* ptGame, ItemGenerationData* itemGenerationData, DWORD));//6FC4ED80
|
||||||
|
A7(FAST, D2Game,00000,00000,22070, 1090, 1DF0, 11F0, 1280, Room*, D2TestPositionInRoom, (Room* ptRoom, DWORD x, DWORD y));
|
||||||
|
//A7(FAST, D2Game,00000,00000,22410,00000,00000,00000,00000, void, D2AddStaffModAffixes, (Unit* ptItem, ItemGenerationData* itemParam));//6FC52410
|
||||||
|
//A7(FAST, D2Game,00000,00000,22C00,00000,00000,00000,00000, WORD, D2GetNewAffix, (Unit* ptItem, DWORD testIfSpawnable, DWORD mustSelectOne, DWORD addToItem, DWORD isPrefix, int affixID, WORD autoAffixGroupID));//6FC52C00
|
||||||
|
//A7(FAST, D2Game,00000,00000,23610,00000,00000,00000,00000, WORD, D2GetRareAffixName, (Unit* ptItem, DWORD wantPrefix));//6FC53610
|
||||||
|
//A7(FAST, D2Game,00000,00000,3AD10,00000,00000,00000,00000, DWORD, D2GetSuperUniqueMonsterID, (Game* ptGame, Unit* ptMonster));//6FC6AD10
|
||||||
|
A7(FAST, D2Game,00000,00000,3F220,4ABE0,EC7E0,40B90,24950, DWORD, D2SpawnMonster, (Game* ptGame, Room* ptRoom, DWORD zero1, DWORD x, DWORD y, DWORD minusOne, DWORD superuniqueID, DWORD zero2));//wrong param
|
||||||
|
A7(STD, D2Game,00000,00000,00000,D6D10,235C0, D410,200E0, void, D2Game235C0, (Game* ptGame, Room* ptRoom));
|
||||||
|
//A7(FAST, D2Game,00000,00000,4C7B0,00000,00000,00000,00000, Unit*, D2GetSkillItem, (Unit* ptChar));//6FC7C7B0
|
||||||
|
//A7(FAST, D2Game,00000,00000,5A500,00000,00000,00000,00000, DWORD, D2SavePlayer, (Game* ptGame, Unit* ptChar, char* playername, DWORD zero));//6FC8A500
|
||||||
|
A7(FAST, D2Game,4F100,4F500,5B8A0,B9D70,25D50,44950,54810, DWORD, D2LoadInventory, (Game* ptGame, Unit* pChar, saveBitField* pdata, DWORD p2, DWORD maxSize, DWORD p4, DWORD *ptNbBytesRead));//6FC8B8A0
|
||||||
|
A7(FAST, D2Game,7BAE0,7BFD0,8BB00,97620,BEF80,93650,E03A0, Unit*, D2GameGetObject, (Game* ptGame, DWORD type, DWORD itemNum));//6FCBBB00
|
||||||
|
//A7(FAST, D2Game,00000,00000,9F320,501C0,F1C50,F1A50,F3220, Unit*, D2GetOwnerMonster, (Unit* ptMonster));
|
||||||
|
//A7(FAST, D2Game,00000,00000,E08D0,00000,00000,00000,00000, void, D2UpdateSkillDataAfterUnassignment, (Game* ptGame, Unit* ptChar, DWORD skillID));//6FD108D0
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,99760,C09E0,94E70,E1D90, Unit*, D2CreateUnit, (DWORD type, DWORD id, DWORD x, DWORD y, Game* ptGame, Room* ptRoom, DWORD uk1, DWORD uk2, DWORD uk3));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,9B480,34920,D1AA0,70180, void, D2OpenPandPortal, (Game* ptGame, Unit* ptChar));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,9B470,34910,D1A90,70170, void, D2OpenPandFinalPortal, (Game* ptGame, Unit* ptChar));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,84730,85AA0,DBE90,A9610, void, D2MephIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,75980,D7BD0,CD0F0,85B60, void, D2DiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,EAB20,2BC80,B3B90,B8610, void, D2BaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,70320,D2D70,C2A90,7B4E0, void, D2UberMephIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,7F200,7FE60,D6250,A39D0, void, D2UberDiabloIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
A7(FAST, D2Game,00000,00000,00000,E92B0,2A300,B2210,B6C80, void, D2UberBaalIA, (Game* ptGame, Unit* ptMonster, DWORD*));
|
||||||
|
//A7(FAST, D2Game,00000,00000,00000,00000,92420,00000,00000, void, D2ReloadGambleScreenGame, (Unit* ptNPC, Game* ptGame, Unit* ptChar, DWORD, DWORD one));
|
||||||
|
A7(STD, D2Game,00000,00000, 89C0,E2390,E66D0,A8090,2C830, void, D2SaveGame, (Game* ptGame) );
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Net : 6FC00000
|
||||||
|
//D2S(D2Net,10020, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//ONLY 1.11b
|
||||||
|
//D2S(D2Net,10018, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));//ONLY 1.11b
|
||||||
|
|
||||||
|
F7(STD, D2Net, 10005,10005,10005,10035,10020,10036,10024, DWORD, D2SendToServer, (DWORD size, DWORD one, void* data));//(DWORD zero, void* data, DWORD size) for 1.10 and before
|
||||||
|
F7(STD, D2Net, 10006,10006,10006,10018,10018,10015,10002, DWORD, D2SendToClient, (DWORD zero, DWORD clientID, void* data, DWORD size));
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//Fog : 6FF50000
|
||||||
|
//D2S(Fog,10023, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//ONLY 1.11/1.11b (STDCALL until 1.10)
|
||||||
|
//D2F(Fog,10024, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line));//ONLY 1.11/1.11b (STDCALL until 1.10)
|
||||||
|
//D2F(Fog,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
|
||||||
|
//D2F(Fog,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));//1.11b
|
||||||
|
//D2F(Fog,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));//1.11b
|
||||||
|
//D2F(Fog,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));//1.11b
|
||||||
|
//D2F(Fog,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf));//1.11
|
||||||
|
//D2F(Fog,10103, DWORD, D2MPQCloseFile, (void* mpqfile));//1.11
|
||||||
|
//D2F(Fog,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD));//1.11
|
||||||
|
//D2F(Fog,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset));//1.11
|
||||||
|
//D2F(Fog,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize));//1.11b
|
||||||
|
//D2F(Fog,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize));//1.11b
|
||||||
|
////D2S(Fog,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0
|
||||||
|
////D2S(Fog,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0
|
||||||
|
////D2S(Fog,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0
|
||||||
|
////D2S(Fog,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840
|
||||||
|
//D2S(Fog,10212, void, D2Fog10212, (DWORD unknow));//1.11b
|
||||||
|
////D2S(Fog,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840
|
||||||
|
//D2S(Fog,10265, int, D2GetInstructionPointer, ());//ONLY 1.11/1.11b NOT 1.10
|
||||||
|
|
||||||
|
F7(STD, Fog, 10023,10023,10023,00000,00000,00000,00000, void, D2FogAssertOld, (const char* ptMessage, DWORD eip, DWORD line));//(STDCALL until 1.10)
|
||||||
|
F7(FAST, Fog, 00000,00000,00000,10024,10024,10024,10024, void, D2FogAssert, (const char* ptMessage, DWORD eip, DWORD line));
|
||||||
|
F7(FAST, Fog, 10042,10042,10042,10042,10042,10042,10042, void*, D2FogMemAlloc, (DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
|
||||||
|
F7(FAST, Fog, 10043,10043,10043,10043,10043,10043,10043, void*, D2FogMemDeAlloc, (void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
|
||||||
|
F7(FAST, Fog, 10045,10045,10045,10045,10045,10045,10045, void*, D2AllocMem, (DWORD,DWORD dwMemSize, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
|
||||||
|
F7(FAST, Fog, 10046,10046,10046,10046,10046,10046,10046, void*, D2FreeMem, (DWORD,void* ptMemLoc, LPCSTR lpszErrFile, DWORD ErrLine, DWORD Zero));
|
||||||
|
F7(FAST, Fog, 10102,10102,10102,10102,10102,10102,10102, DWORD, D2MPQOpenFile, (char* ptPath, void** buf));
|
||||||
|
F7(FAST, Fog, 10103,10103,10103,10103,10103,10103,10103, DWORD, D2MPQCloseFile, (void* mpqfile));
|
||||||
|
F7(FAST, Fog, 10104,10104,10104,10104,10104,10104,10104, DWORD, D2MPQReadFile, (void* mpqfile, BYTE* buffer, DWORD nbToRead, DWORD* nbRead,DWORD,DWORD,DWORD));
|
||||||
|
F7(FAST, Fog, 10105,10105,10105,10105,10105,10105,10105, DWORD, D2MPQGetSizeFile, (void* mpqfile, DWORD* toReset));
|
||||||
|
F7(FAST, Fog, 10115,10115,10115,10115,10115,10115,10115, void, D2FogGetSavePath, (char* ptPath, DWORD maxsize));
|
||||||
|
F7(FAST, Fog, 10116,10116,10116,10116,10116,10116,10116, void, D2FogGetInstallPath, (char* ptPath, DWORD maxsize));
|
||||||
|
//F7(STD, Fog, 10126,10126,10126,10126,10126,10126,10126, DWORD, D2InitBitField, (saveBitField* data, BYTE* buf, DWORD bufsize));//6FF536C0
|
||||||
|
//F7(STD, Fog, 10127,10127,10127,10127,10127,10127,10127, DWORD, D2GetBitFieldSize, (saveBitField* data));//6FF536C0
|
||||||
|
//F7(STD, Fog, 10128,10128,10128,10128,10128,10128,10128, void, D2EncodeValue, (saveBitField* data, DWORD value, DWORD bitSize));//6FF536C0
|
||||||
|
//F7(STD, Fog, 10130,10130,10130,10130,10130,10130,10130, DWORD, D2DecodeValue, (saveBitField* data,DWORD readingSize));//6FF53840
|
||||||
|
F7(STD, Fog, 10212,10212,10212,10212,10212,10212,10212, void, D2Fog10212, (DWORD unknow));
|
||||||
|
//F7(STD, Fog, 10217,10217,10217,10217,10217,10217,10217, int, D2GetIDFromLookUpTable, (void* table, char* string, bool));//6FF53840
|
||||||
|
F7(STD, Fog, 00000,00000,00000,10265,10265,10265,10265, int, D2GetInstructionPointer, ());
|
||||||
|
//Fog10213 getIndexFromLookupTable (&table,code,bool)
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Lang : 6FC10000
|
||||||
|
////D2F(D2Lang,10003, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0
|
||||||
|
//D2F(D2Lang,10000, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum));//ONLY 1.11b
|
||||||
|
////D2S(D2Lang,10006, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0
|
||||||
|
//D2S(D2Lang,10013, DWORD, D2GetLang, ());//ONLY 1.11b
|
||||||
|
//D2S(D2Lang,10010, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210
|
||||||
|
////D2S(D2Lang,10013, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960
|
||||||
|
////E2F(D2Lang,29B0, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0
|
||||||
|
////E2F(D2Lang,2E60, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60
|
||||||
|
////E2F(D2Lang,3640, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640
|
||||||
|
////E2F(D2Lang,3A90, WORD, D2GetStrAndIndexFromString, (void* ptFile, void* ptMemLoc, LPSTR String, LPWSTR RetString));//6FC13A90
|
||||||
|
////E2F(D2Lang,2CD0, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth
|
||||||
|
////E2S(D2Lang,1670, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf
|
||||||
|
|
||||||
|
//F7(FAST, D2Lang, 10003,10003,10003,00000,00000,00000,00000, LPWSTR, D2GetStringFromString, (const char* ptString));//6FC13BC0
|
||||||
|
F7(FAST, D2Lang, 10004,10004,10004,10005,10000,10005,10003, LPWSTR, D2GetStringFromIndex, (WORD dwIndexNum));
|
||||||
|
//F7(STD, D2Lang, 10006,10006,10006,00000,00000,00000,00000, void, D2GetStringLang, (LPSTR ptLang, DWORD Zero));//6FC13FB0
|
||||||
|
F7(STD, D2Lang, 10007,10007,10007,10009,10013,10002,10009, DWORD, D2GetLang, ());
|
||||||
|
F7(STD, D2Lang, 10010,10010,10010,00000,00000,00000,00000, DWORD, D2PrintBigNumber, (LPWSTR ptBuf , DWORD number, DWORD size));//6FC14210
|
||||||
|
//F7(STD, D2Lang, 10013,10013,10013,00000,00000,00000,00000, DWORD, D2GetStringAndIndexFromString, (const char* ptString , LPWSTR result));//6FC13960
|
||||||
|
//A7(FAST, D2Lang, 00000,00000,029B0,00000,00000,00000,00000, DWORD, D2UnicodeWidth, (DWORD MemLoc, WORD Size));//6FC129B0
|
||||||
|
//A7(FAST, D2Lang, 00000,00000,02E60,00000,00000,00000,00000, LPWSTR, D2GetStrFromIndex , (void* ptFile, void* ptMemLoc, DWORD dwIndexNum));//6FC12E60
|
||||||
|
//A7(FAST, D2Lang, 00000,00000,03640,00000,00000,00000,00000, TblHeader*, D2LoadTblFile, (LPCSTR lpszFileName));//6FC13640
|
||||||
|
//A7(FAST, D2Lang, 00000,00000,03A90,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, DWORD, D2unicodenwidth, (char* ptChar, DWORD size));//6FC12CD0_unicodenwidth
|
||||||
|
//A7(STD, D2Lang, 00000,00000,01670,00000,00000,00000,00000, DWORD, D2swprintf, (DWORD bufSize, LPWSTR buf, LPWSTR string, ...));//6FC11670_sprintf
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//Storm : 6FFB0000
|
||||||
|
////D2S(Storm,253, void, D2StormMPQCloseFile, (void* mpqfile));
|
||||||
|
//D2S(Storm,268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer));//1.11b
|
||||||
|
//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, void, D2StormMPQCloseFile, (void* mpqfile));
|
||||||
|
F7(STD, Storm, 268, 268, 268, 268, 268, 268, 268, DWORD, D2StormMPQOpenFile, (DWORD zero, LPCSTR fileName, DWORD dwSearchScope, void** buffer))
|
||||||
|
F7(STD, Storm, 503, 503, 503, 503, 503, 503, 503, void, D2Storm503, (DWORD, DWORD, DWORD));
|
||||||
|
F7(STD, Storm, 511, 511, 511, 511, 511, 511, 511, void, D2FreeWinMessage, (sWinMessage* msg));
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2gfx : 6FA70000
|
||||||
|
//D2S(D2gfx,10063, DWORD, D2GetResolution,() );//ONLY 1.11b
|
||||||
|
////D2S(D2gfx,10023, DWORD, D2CreateMainWindow,(DWORD,DWORD) );
|
||||||
|
////D2S(D2gfx,10026, DWORD, D2ShowWindow,() );
|
||||||
|
////D2S(D2gfx,10027, HWND, D2GetWindowHandle,() );//6FA749C0
|
||||||
|
//D2S(D2gfx,10000, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));//ONLY 1.11b
|
||||||
|
//D2S(D2gfx,10044, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );//ONLY 1.11b
|
||||||
|
|
||||||
|
F7(STD, D2gfx, 10005,10005,10005,10000,10063,10043,10031, DWORD, D2GetResolution,() );
|
||||||
|
//F7,STD, D2gfx, 10023,10023,10023,00000,00000,00000,00000, DWORD, D2CreateMainWindow,(DWORD,DWORD) );
|
||||||
|
//F7(STD, D2gfx, 10026,10026,10026,00000,00000,00000,00000, DWORD, D2ShowWindow,() );
|
||||||
|
//F7,STD, D2gfx, 10027,10027,10027,00000,00000,00000,00000, HWND, D2GetWindowHandle,() );//6FA749C0
|
||||||
|
F7(STD, D2gfx, 10055,10055,10055,10028,10000,10062,10014, void, D2FillArea,(DWORD x1, DWORD y1, DWORD x2, DWORD y2, DWORD color, DWORD transTbl));
|
||||||
|
F7(STD, D2gfx, 10072,10072,10072,10047,10044,10024,10041, void, D2PrintImage,(sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6) );
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2Win : 6F8E0000 (1.10 and 1.11)
|
||||||
|
//D2F(D2Win,10075, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) );//ONLY 1.11b
|
||||||
|
//D2F(D2Win,10064, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) );//ONLY 1.11b
|
||||||
|
//D2F(D2Win,10128, DWORD, D2GetPixelLen,(LPWSTR s) );//ONLY 1.11b
|
||||||
|
//D2F(D2Win,10170, DWORD, D2SetFont,(DWORD fontID) );//ONLY 1.11b
|
||||||
|
//D2F(D2Win,10039, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) );//ONLY 1.11b
|
||||||
|
//D2F(D2Win,10131, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260
|
||||||
|
//D2F(D2Win,10132, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080
|
||||||
|
//D2S(D2Win,10113, void*, D2CreateTextBox,(DWORD* data) );//ONLY 1.11b
|
||||||
|
|
||||||
|
F7(FAST, D2Win, 10046,10046,10046,10061,10075,10015,10022, void, D2PrintLineOnTextBox,(void* screen, char* s, DWORD color) );
|
||||||
|
F7(FAST, D2Win, 10117,10117,10117,10020,10064,10001,10150, void, D2PrintString,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD bfalse) );
|
||||||
|
F7(FAST, D2Win, 10121,10121,10121,10034,10128,10132,10028, DWORD, D2GetPixelLen,(LPWSTR s) );
|
||||||
|
F7(FAST, D2Win, 10127,10127,10127,10141,10170,10010,10184, DWORD, D2SetFont,(DWORD fontID) );
|
||||||
|
F7(FAST, D2Win, 10129,10129,10129,10118,10039,10031,10085, void, D2PrintPopup,(LPWSTR s, DWORD x, DWORD y, DWORD color, DWORD center) );
|
||||||
|
F7(FAST, D2Win, 10131,10131,10131,00000,00000,00000,00000, void, D2GetPixelRect,(LPWSTR s, DWORD* x, DWORD* y) );//6F8AB260
|
||||||
|
F7(FAST, D2Win, 10132,10132,10132,00000,00000,00000,00000, DWORD, D2PrintTextPopup,(LPWSTR s, DWORD x, DWORD y, DWORD uk, DWORD type, DWORD color) );//6F8AB080
|
||||||
|
F7(STD, D2Win, 10017,10017,10017,10147,10113,10098,10098, void*, D2CreateTextBox,(DWORD* data) );
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//D2CMP : ????0000
|
||||||
|
//D2S(D2CMP,10014, DWORD, D2CMP10014, (void* image) );//ONLY 1.11
|
||||||
|
|
||||||
|
F7(STD, D2CMP, 10032,10032,10032,10021,10014,10106,10065, DWORD, D2CMP10014, (void* image) );
|
||||||
|
|
||||||
|
|
||||||
|
//ONLY UNTIL 1.10 :
|
||||||
|
A7(FAST, D2Client, BA00, B9F0, C080,00000,00000,00000,00000, DWORD, D2isLODGame, ());//6FAAC080
|
||||||
|
A7(FAST, D2Client, 00000,00000, C090,00000,00000,00000,00000, BYTE, D2GetDifficultyLevel, ());//6FAAC090 1.09 should be BA10 (b) BA00 (d)
|
||||||
|
A7(STD, D2Client, B6670,B59F0,B7BC0,00000,00000,00000,00000, DWORD, D2GetMouseX, ());//6FB57BC0
|
||||||
|
A7(STD, D2Client, B6680,B5A00,B7BD0,00000,00000,00000,00000, DWORD, D2GetMouseY, ());//6FB57BD0
|
||||||
|
A7(STD, D2Client, 8DC40,8CFC0,883D0,00000,00000,00000,00000, Unit*, D2GetClientPlayer, ());//6FB283D0
|
||||||
|
A7(FAST, D2Client, B920, B910, BF60,00000,00000,00000,00000, void, D2CleanStatMouseUp, ());//6FAABF60
|
||||||
|
A7(FAST, D2Client, D210, D200, D990,00000,00000,00000,00000, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990
|
||||||
|
//A7(FAST, D2Client, 00000,00000, DA20,00000,00000,00000,00000, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20
|
||||||
|
//A7(FAST, D2Client, 00000,00000, D9E0,00000,00000,00000,00000, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0
|
||||||
|
//A7(FAST, D2Client, 00000,00000, DA40,00000,00000,00000,00000, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40
|
||||||
|
//A7(FAST, D2Client, 00000,00000, DA70,00000,00000,00000,00000, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70
|
||||||
|
A7(FAST, D2Game, 7C2C0,7C7B0,8C2E0,00000,00000,00000,00000, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//////// VARIABLES ////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//Data D2Client : 6FAA0000
|
||||||
|
////E2C(D2Common,96A20, DataTables*,SgptDataTables); //03836A20 - 037A0000 //01EE6A20
|
||||||
|
//E2C(D2Client,F4FC8, DWORD, ResolutionY);//0x258 = 600 //1.11b
|
||||||
|
//E2C(D2Client,F4FC4, DWORD, ResolutionX);//0x320 = 800 //1.11b
|
||||||
|
//E2C(D2Client,11BEFC,DWORD, NegWindowStartY);//0xFFFFFFC4 = -60 //1.11b
|
||||||
|
//E2C(D2Client,11BEF8,DWORD, WindowStartX);//0x50 = 80 //1.11b
|
||||||
|
////E2C(D2Launch,2CD5C, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000
|
||||||
|
//E2C(D2Game, 111718,NetClient*, ClientTable);//1.11
|
||||||
|
////E2C(D2Client,104225,DWORD, CurrentNPCNum);//1.11b
|
||||||
|
//E2C(D2Client,11A2F4,DWORD, IsLodGame);//1.11
|
||||||
|
//E2C(D2Client,11BFB8,BYTE, DifficultyLevel);//1.11
|
||||||
|
//E2C(D2Client,11B414,DWORD, MouseY);//0x258 = 600 //1.11b
|
||||||
|
//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
|
||||||
|
C7(D2Client, D50E8, D40E0, D40F0, F5C60, F4FC8, DC6E4, DBC4C, DWORD, ResolutionY);//0x258 = 600
|
||||||
|
C7(D2Client, D50EC, D40E4, D40F4, F5C5C, F4FC4, DC6E0, DBC48, DWORD, ResolutionX);//0x320 = 800
|
||||||
|
C7(D2Client,125AD8,124958,11A74C,11BD28,11BEFC,11BD2C,11B9A4, DWORD, NegWindowStartY);//0xFFFFFFC4 = -60
|
||||||
|
C7(D2Client,125AD4,124954,11A748,11BD24,11BEF8,11BD28,11B9A0, DWORD, WindowStartX);//0x50 = 80
|
||||||
|
//C7(D2Launch, 55818, 56088, 2CD5C,000000, 2CD5C,000000,000000, DWORD, GameTypeMode);//0x50 = 80 //6FA3CD5C-6FA10000
|
||||||
|
C7(D2Game, F2A80, F2918,113FB8,111718,1115E0,1105E0,1107B8, NetClient*, ClientTable);
|
||||||
|
//C7(D2Client,000000,000000,000000,000000,104225,000000,000000, DWORD, CurrentNPCNum);
|
||||||
|
C7(D2Client,000000,000000,000000, FB3F4,11A2F4,10330C,119854, DWORD, IsLodGame);
|
||||||
|
C7(D2Client,000000,000000,10795C,11BFB8,11C2A8,11BFF4,000000, BYTE, DifficultyLevel);
|
||||||
|
C7(D2Client,000000,000000,000000,10A40C,11B414,101634,11B824, DWORD, MouseY);//0x258 = 600
|
||||||
|
C7(D2Client,000000,000000,000000,10A410,11B418,101638,11B828, DWORD, MouseX);//0x320 = 800
|
||||||
|
C7(D2Client,000000,000000,000000,11C4F0,11C1E0,11C3D0,11BBFC, Unit*, ptClientChar);
|
||||||
|
|
||||||
|
|
||||||
|
C7(D2Client, DB918, DA828,000000,000000,000000,000000,000000, DWORD, NbStatDesc);
|
||||||
|
C7(D2Client, DAF98, D9EA8,000000,000000,000000,000000,000000, DWORD, StatDescTable);
|
||||||
|
|
||||||
|
/* NEXT NOT TESTED IN 1.10 (1.09b fct)
|
||||||
|
D2_STD(D2Common10066, void, D2RemoveFromRoom, (DrlgRoom1* hRoom, DWORD untitype, DWORD unitID), 0x6FD7CFD0);
|
||||||
|
D2_STD(D2Common10082, DWORD, D2IsTown, (DrlgRoom1* hRoom), 0x6FD7D8A0);
|
||||||
|
D2_STD(D2Common10180, Unit*, D2GetTargetFromPath, (Path* hPath), 0x6FD9C4C0);
|
||||||
|
D2_STD(D2Common10184, void, D2SetPathParameter, (Path* hPath, DWORD value), 0x6FD9C5D0);
|
||||||
|
D2_STD(D2Common10240, Inventory*, D2InitInventory, (DWORD zero, DWORD param1, DWORD param2, DWORD param3, DWORD one), 0x6FD7E920);
|
||||||
|
D2_STD(D2Common10253, bool, D2EquipUnit, (Unit* ptTaker, Unit* ptItem, DWORD bodyloc), 0x6FD80020);
|
||||||
|
D2_STD(D2Common10258, Unit*, D2GetWeaponUnit, (Inventory* ptInventory), 0x6FD802D0);
|
||||||
|
D2_STD(D2Common10261, void*, D2SetMouseItem, (Inventory* ptInventory, Unit* ptUnit), 0x6FD80520);
|
||||||
|
D2_STD(D2Common10310, Node*, D2GetNodeForItem, (Inventory* ptInventory, Unit* ptUnit), 0x6FD82FB0);
|
||||||
|
D2_STD(D2Common10320, SkillData*, D2GetStartingSkill, (Unit* ptUnit), 0x6FDAD8C0);
|
||||||
|
D2_STD(D2Common10321, SkillData*, D2GetLeftHandSkill, (Unit* ptUnit), 0x6FDAD900);
|
||||||
|
//D2_STD(D2Common10322, SkillData*, D2GetRightSkill, (Unit* ptUnit), 0x6FDAD940);
|
||||||
|
D2_STD(D2Common10323, SkillData*, D2GetCurrentSkill, (Unit* ptUnit), 0x6FDAD9C0);
|
||||||
|
D2_STD(D2Common10326, DWORD, D2UNITGetXpos, ( Unit* ptUnit ), 0x6FDADA00);
|
||||||
|
D2_STD(D2Common10329, DWORD, D2UNITGetYpos, ( Unit* ptUnit ), 0x6FDADB70);
|
||||||
|
//D2_STD(D2Common10348, void, D2SetUnitMode, (Unit* ptUnit, DWORD mode), 0x6FDAEBD0);
|
||||||
|
D2_STD(D2Common10395, ShrinesTXT*, D2GetShrinesTXTRowFromID, (DWORD shrineID), 0x6FDAFE20);
|
||||||
|
D2_STD(D2Common10659, void*, D2GetTCFromID, (DWORD TCIndex), 0x6FD5E1C0);
|
||||||
|
//D2_STD(D2Common10517, void, D2SetPlayerStat, (Unit* ptChar, DWORD statID, DWORD Amount), 0x6FDA7D30);
|
||||||
|
//D2_STD(D2Common10581, CharStatsBIN*,D2GetCharStatsBIN, (DWORD classID), offset_D2Common + 0x6FD47430);
|
||||||
|
D2_STD(D2Common10746, DWORD, D2GetCode, (Unit* ptUnit), 0x6FD8AD70);
|
||||||
|
D2_STD(D2Common10749, void, D2ITEMSGetItemDimensions, (Unit* ptItem, DWORD* x, DWORD* y, char* filename, DWORD line), 0x6FD8AF00);
|
||||||
|
D2_STD(D2Common10795, DWORD, D2GetMaxStack, (Unit* ptUnit), 0x6FD8EEF0);
|
||||||
|
D2_STD(D2Common10804, DWORD, D2GetSpellIcon, (Unit* ptUnit), 0x6FD8F190);
|
||||||
|
D2_STD(D2Common10821, DWORD, D2IsSocketValid, (Unit* ptItem ), 0x6FD8FD70);
|
||||||
|
//D2_STD(D2Common10854, void, D2RemoveItem, (Unit* ptUnit, BYTE page), 0x6FD89DC0);
|
||||||
|
D2_STD(D2Common10868, void, D2SetMod, (Unit* ptUnit, ItemMod* ptProperty, int one), 0x6FD88950);
|
||||||
|
D2_FST(D2Common10918, DWORD, D2GetRandomInt, (D2Seed* ptSeed, int max), 0x6FDA0B10);
|
||||||
|
D2_STD(D2Common10952, Unit*, D2AddSingleSkill, (Unit* ptChar, WORD SkillID), 0x6FDA1CB0); // WORD ?
|
||||||
|
D2_FST(D2Common10966, Unit*, D2GetSkillPointerFromClient, (Unit* ptClientChar), 0x6FDA33A0);
|
||||||
|
D2_FST(D2Common6FC82E00,DWORD, D2GetItemNum, (D2Game* ptGame, DWORD lvl, DWORD typenum), 0x6FC82E00);
|
||||||
|
|
||||||
|
D2_FST(D2Game6FC3E3F0, void, D2ClientItemRemove, (void* ptClient, Unit* ptChar, Unit* ptItem, DWORD twenty), 0x6FC3E3F0);
|
||||||
|
D2_FST(D2Game6FC3E640, void, D2FireScrollGraph, (void* ptClient, Unit* ptItem, int one, DWORD dwStatID, DWORD dwStatNum), 0x6FC3E640);
|
||||||
|
D2_FST(D2Game6FC3E6C0, void, D2SetMouseIcon, (void* ptGame, Unit* ptChar, int nSpellicon, int zero, int one, DWORD dwUnknown), 0x6FC3E6C0);
|
||||||
|
D2_FST(D2Game6FC3E740, void*, D2ResetMouse, (void* ptClient, Unit* ptChar), 0x6FC3E740);
|
||||||
|
D2_FST(D2Game6FC45BD0, DWORD, D2SwapItem, (D2Game* ptGame, Unit* ptChar, DWORD dwSrcID, DWORD dwTrgID, int x, int y, void* ptMouse), 0x6FC45BD0);
|
||||||
|
D2_FST(D2Game6FC45FE0, void, D2RemoveItemMem, (D2Game* ptGame, Unit* ptChar, Unit* ptItem, DWORD zero), 0x6FC45FE0);
|
||||||
|
D2_FST(D2Game6FC480D0, DWORD, D2PutScroll, (D2Game* ptGame, Unit* ptChar, DWORD dwSrcID, DWORD dwTrgID, void* ptMouse), 0x6FC480D0);
|
||||||
|
D2_FST(D2Game6FC497B0, void, D2UpdatePlayer, (void * ptGame, Unit* ptChar, DWORD nUnitType), 0x6FC497B0);
|
||||||
|
D2_FST(D2Game6FC4E170, void*, D2RemoveItemFromMem, (void* ptGame, Unit* ptItem), 0x6FC4E170);
|
||||||
|
D2_FST(D2Game6FC4E290, void*, D2GetPtrFromCode, (void* ptChar, DWORD itemcode), 0x6FC4E290);
|
||||||
|
D2_FST(D2Game6FC87E40, void, D2SpawnItem, (void* ptGame, Unit* ptChar, DWORD itemCode, DWORD ilvl, DWORD quality, DWORD one), 0x6FC87E40);
|
||||||
|
D2_FST(D2Game6FC4EF60, void, D2DropTC, (void* ptGame, Unit* ptChar, Unit* ptNPC, void* ptTC, DWORD z5, DWORD ilvl, DWORD z1, DWORD z2, DWORD z3, DWORD z4), 0x6FC4EF60);
|
||||||
|
D2_FST(D2Game6FCABAE0, Unit*, D2GetPtrFromID, (D2Game* ptGame, int UnitType, DWORD UniqueID), 0x6FCABAE0);
|
||||||
|
D2_FST(D2Game6FCABB70, void, D2SpawnPlague, (void* u1,Unit* ptMissile), 0x6FCABB70);
|
||||||
|
|
||||||
|
D2_FST(D2Client6FAB9AF0,void, D2FireClientMissile, (Unit* ptUnit), 0x6FAB9AF0);
|
||||||
|
D2_FST(D2Client6FAE6600,void, D2CubeLight, (DWORD code), 0x6FAE6600);
|
||||||
|
D2_FST(D2Client6FB22270,void, D2ScrollText, (Unit* ptUnit, DWORD ptText, int zero), 0x6FB22270);
|
||||||
|
D2_FST(D2Client6FB2C1E0,Unit*, D2GetClientUnit, (DWORD itemID, DWORD nUnitType), 0x6FB2C1E0);
|
||||||
|
D2_FST(D2Client6FB30470,void, D2ClientUpdatePlayer, (Unit* ptChar, DWORD nUnitType), 0x6FB30470);
|
||||||
|
|
||||||
|
|
||||||
|
Storm 1.09:
|
||||||
|
251 SFileAuthenticateArchive
|
||||||
|
252 SFileCloseArchive
|
||||||
|
253 SFileCloseFile
|
||||||
|
254 SFileDdaBegin
|
||||||
|
255 SFileDdaBeginEx
|
||||||
|
256 SFileDdaDestroy
|
||||||
|
257 SFileDdaEnd
|
||||||
|
258 SFileDdaGetPos
|
||||||
|
259 SFileDdaGetVolume
|
||||||
|
260 SFileDdaInitialize
|
||||||
|
261 SFileDdaSetVolume
|
||||||
|
262 SFileDestroy
|
||||||
|
263 SFileEnableDirectAccess
|
||||||
|
264 SFileGetFileArchive
|
||||||
|
265 SFileGetFileSize
|
||||||
|
266 SFileOpenArchive
|
||||||
|
267 SFileOpenFile
|
||||||
|
268 SFileOpenFileEx
|
||||||
|
269 SFileReadFile
|
||||||
|
270 SFileSetBasePath
|
||||||
|
271 SFileSetFilePointer
|
||||||
|
272 SFileSetLocale
|
||||||
|
273 SFileGetBasePath
|
||||||
|
274 SFileSetIoErrorMode
|
||||||
|
275 SFileGetArchiveName
|
||||||
|
276 SFileGetFileName
|
||||||
|
277 SFileGetArchiveInfo
|
||||||
|
278 SFileSetPlatform
|
||||||
|
279 SFileLoadFile
|
||||||
|
280 SFileUnloadFile
|
||||||
|
281 SFileLoadFileEx
|
||||||
|
282 SFilePrioritizeRequest
|
||||||
|
283 SFile_CancelRequest
|
||||||
|
284 SFileSetAsyncBudget
|
||||||
|
285 SFileSetDataChunkSize
|
||||||
|
286 SFileEnableSeekOptimization
|
||||||
|
287 SFileReadFileEx
|
||||||
|
288 SFile_CancelRequestEx
|
||||||
|
289 SFileReadFileEx2
|
||||||
|
290 SFileLoadFileEx2
|
||||||
|
|
||||||
|
Storm1.08
|
||||||
|
401 SMemAlloc
|
||||||
|
403 SMemFree
|
||||||
|
404 SMemGetSize
|
||||||
|
405 SMemReAlloc
|
||||||
|
481 SMemFindNextBlock
|
||||||
|
482 SMemFindNextHeap
|
||||||
|
483 SMemGetHeapByCaller
|
||||||
|
484 SMemGetHeapByPtr
|
||||||
|
485 SMemHeapAlloc
|
||||||
|
486 SMemHeapCreate
|
||||||
|
487 SMemHeapDestroy
|
||||||
|
488 SMemHeapFree
|
||||||
|
489 SMemHeapReAlloc
|
||||||
|
490 SMemHeapSize
|
||||||
|
491 SMemCopy
|
||||||
|
492 SMemFill
|
||||||
|
493 SMemMove
|
||||||
|
494 SMemZero
|
||||||
|
495 SMemCmp
|
||||||
|
496 SMemSetDebugFlags
|
||||||
|
497 SMemDumpState
|
||||||
|
*/
|
||||||
|
//Kingpin: D2Common #10027 is used to get dest unit (used for get type5 object in next room)
|
||||||
|
//D2Common10247, (ptInventory, ptItem, x,y,0xC,void*,void*,BYTE page) verif if items can be put in inventory
|
||||||
|
//D2Common10252 CheckGrid mouse over inventory/stash/etc. grid
|
||||||
|
//D2Common10284 returns current number of used sockets arg1 = ptInventory //KP
|
||||||
|
//D2Common10367 Returns number of rows in belt Kingpin: arg1 = ptItem
|
||||||
|
//D2Common10526 Kingpin know arg1 = ptUnit, arg3 = _FILE_, arg4 = ptGame
|
||||||
|
//D2Common10573 arg2 ptStatsList
|
||||||
|
//D2Common10660 is for sure returning tc entry it uses act, difficulty as params and one more, arg3 = depends of area level (0-2)
|
||||||
|
//D2Common11064 Kingpin: Check if monster and check if current animation mode is allowed arg1 = ptUnit
|
||||||
|
//D2Common11257 Get MaxID from SuperUnique.bin adress in memory arg1 = hcIdx
|
||||||
|
|
||||||
|
//D2LoadItem D2Common10883 + 0x60370);//01D40370-1ce0000
|
||||||
|
//D2TcEx (select what item to drop from the treasureclass) at:6FC51360
|
||||||
|
//D2_STD(D2Common10578, BYTE*, D2LoadBinFile, (...), offset_D2Common + 0xFD70); //01CFFD70-01CF0000
|
||||||
|
//Kingpin :I have noted that 10732 is this: get set/unique # [[+70]+24]
|
||||||
|
/*
|
||||||
|
Kingpin: d2common #11270
|
||||||
|
Kingpin: Check MonType.txt line to see if it match (returns a boolan)
|
||||||
|
Kingpin: arg1 = unknown
|
||||||
|
arg2 = damage_vs_montype (stat from intestatscost.txt)
|
||||||
|
arg3 = ptUnit
|
||||||
|
arg4 = 80 (maxline maybe, but is only guessing)
|
||||||
|
|
||||||
|
//d2game.6FD1D660 reverse player name :P
|
||||||
|
|
||||||
|
|
||||||
|
Kingpin: figured out a new t hing related to D2common #10466 :P
|
||||||
|
Yohann: ah ?
|
||||||
|
Kingpin: get stat (from itemstatscost.txt) used to calculated frames (life, missile, mana e.tc)
|
||||||
|
Kingpin: arg1 = ptUnit
|
||||||
|
Kingpin: arg2 = stat_id
|
||||||
|
Kingpin: arg3 = table index
|
||||||
|
|
||||||
|
|
||||||
|
D2Game.6FCBC900 Get Target ptUnit
|
||||||
|
|
||||||
|
Kingpin: D2Client.6FB18770 returns a boolean if you have enough mana for skill
|
||||||
|
Kingpin: D2Client.6FB18AC0 sets it to selectable or not
|
||||||
|
D2Common #10480 Return ptState arg1 = ptUnit, arg2 = state_id
|
||||||
|
D2Common #10479 Get State_ID from ptState+14
|
||||||
|
D2Common #11265 Get Skill_ID from ptState+1C Arg1 = ptState
|
||||||
|
|
||||||
|
Kingpin: D2Common #10497 Get Duration of State
|
||||||
|
Kingpin: arg1 = state_id
|
||||||
|
|
||||||
|
|
||||||
|
D2Client.6FB5B0F0
|
||||||
|
Function: Draw Filled Rectangle
|
||||||
|
void FASTCALL D2ClientFillRect(int x, int y, int Width, int Height, ULONG ulColor, ULONG transTbl);
|
||||||
|
D2_FST(D2Client6FB5B0F0,void, D2ClientFillRect,(int x, int y, int Width, int Height, DWORD col, DWORD transTbl), offset_D2Client + 0xBB0F0);//6FB5B0F0-6FAA0000
|
||||||
|
D2Gfx.#10055
|
||||||
|
Function: Draw Filled Rectangle
|
||||||
|
void STDCALL D2GfxFillRect(int left, int top, int right, int bottom, ULONG ulColor, ULONG transTbl);
|
||||||
|
NOTES:
|
||||||
|
color = Palette index.
|
||||||
|
transTbl = pl2 transform table index ...
|
||||||
|
0 = 75% transparent
|
||||||
|
1 = 50% transparent
|
||||||
|
2 = 25% transparent
|
||||||
|
3 = color blend 1 //white is transparent black is solid
|
||||||
|
4 = color blend 2 //black is transparent white is solid
|
||||||
|
5 = normal draw
|
||||||
|
6 = color blend 3 // screen + color
|
||||||
|
7 = hilight
|
||||||
|
|
||||||
|
|
||||||
|
6FAE7831 E8 9A380800 CALL <JMP.&D2Common.#10252> ; click inventory
|
||||||
|
6FAE8D44 E8 87230800 CALL <JMP.&D2Common.#10252> ; Right click inventory
|
||||||
|
6FAE8972 E8 59270800 CALL <JMP.&D2Common.#10252> ; mouse over
|
||||||
|
|
||||||
|
|
||||||
|
D2Client.6FACFCD0 then that set color for the text (it calls in this function #10121 and 10117)
|
||||||
|
Kingpin: and the position
|
||||||
|
Kingpin: arg1 = Xpos
|
||||||
|
arg2 = Ypos
|
||||||
|
arg3 = Pointer to Unicode String
|
||||||
|
arg4 = Color
|
||||||
|
|
||||||
|
Kingpin: 10470 has as first arg ptGame +1C (memory alloc thing)
|
||||||
|
Kingpin: arg2 = flags i guess since they use 0x40 again
|
||||||
|
Kingpin: arg3 = 0 (no idea what it used for)
|
||||||
|
Kingpin: arg4 = 4 (same here, no idea)
|
||||||
|
Kingpin: arg5 = uniqueID
|
||||||
|
|
||||||
|
Kingpin: 10868 SetMod
|
||||||
|
arg1 = ptItem
|
||||||
|
arg2 = ItemMod
|
||||||
|
arg3 = 1
|
||||||
|
Kingpin: 11232 Get Cube Recipe Record (Line) from Cubemain.bin Address in memory
|
||||||
|
Kingpin: i have no parameters for 11232
|
||||||
|
Kingpin: 11233 Get Number of Cube Recipes
|
||||||
|
|
||||||
|
Kingpin: edi contains target unit
|
||||||
|
Kingpin: 10342 get ptRoom from target unit
|
||||||
|
Kingpin: ecx = unique unit id
|
||||||
|
Kingpin: ebx = unit type
|
||||||
|
Kingpin: eax = ptRoom
|
||||||
|
Kingpin: 10066 remove unit from room
|
||||||
|
|
||||||
|
D2Game.6FCBC900 ; Get Target Unit
|
||||||
|
Arg1 = ptPlayer (ptUnit)
|
||||||
|
Arg2 = ptGame
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#10962 Add skill to player
|
||||||
|
Kingpin: arg1 ptPlayer
|
||||||
|
arg2 SkillID
|
||||||
|
Kingpin: arg3 Skill Level
|
||||||
|
|
||||||
|
10602 Gets an item ID # from an item code
|
||||||
|
|
||||||
|
Kingpin: get Prefix/suffix
|
||||||
|
Kingpin: #10699 arg1 = ptItem, arg2 = prefix Index
|
||||||
|
Kingpin: #10701 arg1 = ptItem, arg2 = suffix index
|
||||||
|
|
||||||
|
|
||||||
|
D2EquipUnit STDCALL_FUNCTION(int, D2Common280D, (Inventory* ptInventory, Unit* ptItem, int bodylocation));
|
||||||
|
D2AddItemToInventory STDCALL_FUNCTION(int, D2Common2802, (Inventory* ptInventory, Unit* ptItem, int nodePage));
|
||||||
|
Kingpin: in my notes it should start here
|
||||||
|
Kingpin: 6FC51360 /$ 55 PUSH EBP
|
||||||
|
|
||||||
|
D2DropTC FASTCALL_FUNCTION(void, D2Game6FC51360, (D2Game* ptGame, Unit* ptChar, Unit* ptNPC, void* ptTC, DWORD z5, DWORD ilvl, DWORD z1, DWORD z2, DWORD z3, DWORD z4));
|
||||||
|
|
||||||
|
Kingpin: D2CreateItemUnit FASTCALL_FUNCTION(Unit*, D2Game6FC501A0, (Unit* ptPlayer, DWORD itemCode, D2Game* ptGame, DWORD uk1, DWORD quality, DWORD uk3, DWORD uk4, DWORD Lvl, DWORD uk5, DWORD uk6, DWORD uk7));
|
||||||
|
ptItem = D2CreateItemUnit(ptPlayer, D2GetItemIDfromCode(CharstatTXT->Item1), PCGame, 4, 2, 1, 1, D2GetUnitStat(ptPlayer,STATS_LEVEL,0), 0, 0, 0);
|
||||||
|
|
||||||
|
Kingpin: monsterData +28 holds ptGame
|
||||||
|
Kingpin: ptGame +2C UniqueID (owner ID)
|
||||||
|
Kingpin: ptGame +30 UnitType
|
||||||
|
srvDoFunc 15 adds temporarly a stat
|
||||||
|
|
||||||
|
Kingpin: we have 10041 that get ptRoom from ptAct, XOffset&Yoffset
|
||||||
|
|
||||||
|
*/
|
||||||
|
/*================================= END OF FILE =================================*/
|
672
Commons/D2UnitStruct.h
Normal file
672
Commons/D2UnitStruct.h
Normal file
@ -0,0 +1,672 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
@brief Diablo II Unit Structures definitions.
|
||||||
|
|
||||||
|
NOT TESTED IN 1.10 (1.09b)
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
struct CBPlayerData;
|
||||||
|
struct CBItemData;
|
||||||
|
struct Unit;
|
||||||
|
|
||||||
|
/*=================================================================*/
|
||||||
|
/* Skill Structure. */
|
||||||
|
/*=================================================================*/
|
||||||
|
|
||||||
|
struct SkillData
|
||||||
|
{ //Offset from Code. (size = 0x3C or 0x40)
|
||||||
|
SkillsBIN* ptSkillBin; //+00
|
||||||
|
SkillData* ptNextSkill; //+04
|
||||||
|
DWORD mode; //+08
|
||||||
|
DWORD uk1[3]; //+0C
|
||||||
|
DWORD targetInfo; //+18
|
||||||
|
DWORD targetType; //+1c
|
||||||
|
DWORD targetUNID; //+20
|
||||||
|
DWORD uk2; //+24
|
||||||
|
DWORD slvl; //+28
|
||||||
|
DWORD slvlBonus; //+2c
|
||||||
|
DWORD uk3; //+30
|
||||||
|
int state; //+34 (-1 if index exist)
|
||||||
|
DWORD param1; //+38 (nb current charge)
|
||||||
|
DWORD param2; //+3C
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Skills
|
||||||
|
{ //Offset from Code.
|
||||||
|
DWORD gameRelated; //+00
|
||||||
|
SkillData* ptFirstSkill; //+04
|
||||||
|
SkillData* ptLeftSkill; //+08
|
||||||
|
SkillData* ptRightSkill; //+0c
|
||||||
|
SkillData* ptCurrentSkill; //+10
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*=================================================================*/
|
||||||
|
/* Unit Data Structure. */
|
||||||
|
/*=================================================================*/
|
||||||
|
|
||||||
|
struct Position
|
||||||
|
{
|
||||||
|
DWORD x;
|
||||||
|
DWORD y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Room//size=0x80
|
||||||
|
{
|
||||||
|
//ptRoom +48 0 = spawn new units (monster, objects e.tc), 1 = don't spawn any new units
|
||||||
|
DWORD seed1; //+00
|
||||||
|
DWORD seed2; //+04
|
||||||
|
BYTE uk8[0x1C]; //+08
|
||||||
|
Room* ptNearRooms; //+24
|
||||||
|
DWORD nbNearRooms; //+28
|
||||||
|
Unit* unit; //+2C
|
||||||
|
BYTE uk5[0x44]; //+30
|
||||||
|
Room* ptNextRoom; //+74
|
||||||
|
union
|
||||||
|
{
|
||||||
|
BYTE flags; //+78
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
BYTE isGenerated:1;
|
||||||
|
BYTE isGenerated2:1;//???
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ActMap//ptGame+BC size=0x60
|
||||||
|
{
|
||||||
|
DWORD isNotManaged;
|
||||||
|
DWORD uk4;
|
||||||
|
DWORD uk8;//size = 0x488
|
||||||
|
Room* ptFirstRoom;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct NetClient;
|
||||||
|
//ptGame : 04E4007C
|
||||||
|
struct Game
|
||||||
|
{ //Offset from Code.
|
||||||
|
BYTE uk1[0x18]; //+00
|
||||||
|
DWORD _ptLock; //+18 Unknown
|
||||||
|
DWORD memoryPool; //+1C Memory Pool (??)
|
||||||
|
BYTE uk2[0x4D]; //+20
|
||||||
|
BYTE difficultyLevel; //+6D (Difficulty 0,1 or 2)
|
||||||
|
WORD unknown1; //+6E Cube puts 4 here
|
||||||
|
DWORD isLODGame; //+70 (D2=0 LOD =1) (DWORD ?)
|
||||||
|
BYTE uk3[0x04]; //+71
|
||||||
|
WORD unknown2; //+78
|
||||||
|
BYTE uk4[0x0E]; //+7A
|
||||||
|
NetClient* ptClient; //+88
|
||||||
|
BYTE uk8C[0x30]; //+8C
|
||||||
|
ActMap* mapAct[5]; //+BC
|
||||||
|
BYTE ukD0[0x1024]; //+D0
|
||||||
|
DWORD* game10F4; //+10F4
|
||||||
|
BYTE uk6[0x28]; //+10F8
|
||||||
|
Unit* units[0xA00]; //+1120
|
||||||
|
Unit* roomtitles[0x200]; //+1B20
|
||||||
|
};
|
||||||
|
//WORD ptGame+28 game ID ?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct Path //(8 dword)
|
||||||
|
{ //Offset from Code. Size: 20
|
||||||
|
WORD uk1; //+00
|
||||||
|
WORD mapx; //+02
|
||||||
|
WORD uk2; //+04
|
||||||
|
WORD mapy; //+06
|
||||||
|
DWORD uk3; //+08
|
||||||
|
DWORD x; //+0C
|
||||||
|
DWORD y; //+10
|
||||||
|
DWORD uk6; //+14
|
||||||
|
DWORD uk7; //+18
|
||||||
|
Room* ptRoom; //+1C
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Inventory
|
||||||
|
{ //Offset from Code. Size: 30 à 40
|
||||||
|
DWORD tag; //+00 = 0x01020304
|
||||||
|
BYTE uk1[0x04]; //+04 =? 0
|
||||||
|
Unit* ptChar; //+08
|
||||||
|
Unit* ptItem; //+0C
|
||||||
|
BYTE uk2[0x10]; //+10
|
||||||
|
Unit* inventory1; //+20
|
||||||
|
BYTE uk3[0x04]; //+24
|
||||||
|
DWORD currentUsedSocket; //+28 //Kingpin : a variable to know how many sockets that have added to item
|
||||||
|
DWORD Inventory2C; //+2C //one value
|
||||||
|
DWORD Inventory30; //+30
|
||||||
|
void* ptCorpse; //+34
|
||||||
|
BYTE uk5[0x04]; //+38
|
||||||
|
DWORD nextCorpseId; //+3C //max = 15
|
||||||
|
BYTE uk6[0x04]; //+40
|
||||||
|
};
|
||||||
|
|
||||||
|
struct D2Stat
|
||||||
|
{
|
||||||
|
WORD index;
|
||||||
|
WORD id;
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Stats //sizeof(Stats)=0x64
|
||||||
|
{
|
||||||
|
DWORD nUnitId; //+00
|
||||||
|
Unit* ptUnit; //+04
|
||||||
|
DWORD nUnitType; //+08
|
||||||
|
DWORD nItemNum; //+0C
|
||||||
|
union
|
||||||
|
{
|
||||||
|
DWORD flags; //+10
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
DWORD fuk1:13; //0x00001FFF
|
||||||
|
DWORD isDisabled:1; //0x00002000
|
||||||
|
DWORD fuk2:17; //0x7FFFC000
|
||||||
|
DWORD dontUseBaseValue:1;//0x80000000
|
||||||
|
};
|
||||||
|
};
|
||||||
|
DWORD id; //+14
|
||||||
|
DWORD uk18; //+18
|
||||||
|
BYTE uk2[0x08]; //+1C
|
||||||
|
D2Stat* ptBaseStatsTable; //+24
|
||||||
|
WORD nbBaseStats; //+28
|
||||||
|
WORD sizeOfBaseStatsTable; //+2A ??
|
||||||
|
Stats* ptStats; //+2C
|
||||||
|
BYTE uk3[0x04]; //+30
|
||||||
|
Stats* ptItemStats; //+34
|
||||||
|
BYTE uk4[0x04]; //+38
|
||||||
|
Stats* ptAffixStats; //+3C
|
||||||
|
Stats* ptNextStats2; //+40
|
||||||
|
union
|
||||||
|
{
|
||||||
|
Unit* ptChar; //+44
|
||||||
|
Unit* ptItem;
|
||||||
|
};
|
||||||
|
D2Stat* ptStatsTable; //+48
|
||||||
|
WORD nbStats; //+4C
|
||||||
|
WORD sizeOfStatsTable; //+4E ??
|
||||||
|
BYTE uk5[0x8]; //+50
|
||||||
|
BYTE* unknow0; //+58 (sizeof(*unknow0)=0x30 (calculated)
|
||||||
|
DWORD unknow1; //+5C (=0)
|
||||||
|
DWORD unknow2; //+60 (=0)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
BYTE uk1[0x0E]; //+18
|
||||||
|
WORD superUniqueID; //+26
|
||||||
|
void* unknow1; //+28
|
||||||
|
BYTE uk2[0x38]; //+28
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ObjectData
|
||||||
|
{
|
||||||
|
ObjectsBIN* ptObjectsBIN;
|
||||||
|
BYTE levelID;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
Kingpin: struct MonsterData
|
||||||
|
{
|
||||||
|
BYTE uk1[0x13]; // +00
|
||||||
|
DWORD Flags; // +14
|
||||||
|
DWORD uk2; // +18
|
||||||
|
DWORD MinionOwnerID; // +1C
|
||||||
|
BYTE uk3[0x5]; // +20
|
||||||
|
WORD SuperUniqueID; // +26 Superunique ID of monster
|
||||||
|
D2Game* ptGame; // +28 ptGame
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define F2_ITEM_IS_IDENTIFIED 0x10 //or F_IS_IDENTIFIED ?
|
||||||
|
|
||||||
|
struct ItemData//size=0x74
|
||||||
|
{ //Offset from Code.
|
||||||
|
DWORD quality; //+00
|
||||||
|
DWORD seedLow; //+04
|
||||||
|
DWORD seedHi; //+08
|
||||||
|
DWORD playerID; //+0C #10734 / #10735 (PCInventory->ptPlayer->0C)
|
||||||
|
DWORD seedStarting; //+10
|
||||||
|
DWORD flags1; //+14
|
||||||
|
union {
|
||||||
|
DWORD flags2; //+18
|
||||||
|
struct {
|
||||||
|
DWORD fuk1:1; //0x00000001
|
||||||
|
DWORD isIndentified:1; //0x00000002
|
||||||
|
DWORD fuk2:2; //0x0000000C
|
||||||
|
DWORD isUnindentified:1; //0x00000010
|
||||||
|
DWORD fuk3:3; //0x000000E0
|
||||||
|
DWORD isBroken:1; //0x00000100
|
||||||
|
DWORD fuk4:2; //0x00000600
|
||||||
|
DWORD isSocketed:1; //0x00000800
|
||||||
|
DWORD fuk5:10; //0x003FF000
|
||||||
|
DWORD isEtheral:1; //0x00400000
|
||||||
|
DWORD fuk6:3; //0x03800000
|
||||||
|
DWORD isRuneword:1; //0x04000000
|
||||||
|
DWORD fuk7:1; //0x08000000
|
||||||
|
DWORD isPersonalized:1; //0x10000000
|
||||||
|
DWORD fuk8:3; //0xE0000000
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
ITEMFLAG_NEWITEM = 0x00000001,
|
||||||
|
ITEMFLAG_TAGETING = 0x00000004,
|
||||||
|
ITEMFLAG_UNIDENTIFIED = 0x00000010,
|
||||||
|
ITEMFLAG_QUANTITY = 0x00000020,
|
||||||
|
ITEMFLAG_Durability = 0x00000100,
|
||||||
|
ITEMFLAG_UNKNOWN2 = 0x00000400,
|
||||||
|
ITEMFLAG_SOCKETED = 0x00000800,
|
||||||
|
ITEMFLAG_NON_SELLABLE = 0x00001000,
|
||||||
|
ITEMFLAG_NEWITEM2 = 0x00002000,
|
||||||
|
ITEMFLAG_UNKNOWN3 = 0x00004000,
|
||||||
|
ITEMFLAG_CHECKSECPRICE = 0x00010000,
|
||||||
|
ITEMFLAG_CHECKGAMBLEPRICE = 0x00020000,
|
||||||
|
ITEMFLAG_UNKNOWN4 = 0x00080000,
|
||||||
|
ITEMFLAG_INDESTRUCTIBLE(ETHERAL) = 0x00400000,
|
||||||
|
ITEMFLAG_UNKNOWN5 = 0x00800000,
|
||||||
|
ITEMFLAG_FROMPLAYER = 0x01000000,
|
||||||
|
ITEMFLAG_RUNEWORD = 0x04000000
|
||||||
|
*/
|
||||||
|
DWORD guid1; //+1C Global Unique ID 1
|
||||||
|
DWORD guid2; //+20 Global Unique ID 2
|
||||||
|
DWORD guid3; //+24 Global Unique ID 3
|
||||||
|
DWORD uniqueID; //+28
|
||||||
|
BYTE ilvl; //+2C
|
||||||
|
BYTE uk1[0x03]; //+2D
|
||||||
|
WORD version; //+30
|
||||||
|
WORD rarePrefix; //+32
|
||||||
|
WORD rareSuffix; //+34
|
||||||
|
WORD autoPref; //+36
|
||||||
|
WORD prefix[3]; //+38
|
||||||
|
WORD suffix[3]; //+3E
|
||||||
|
BYTE equipLoc; //+44
|
||||||
|
/* emplacement si équipé
|
||||||
|
* 00 = noequip/inBelt
|
||||||
|
* 01 = head
|
||||||
|
* 02 = neck
|
||||||
|
* 03 = tors
|
||||||
|
* 04 = rarm
|
||||||
|
* 05 = larm
|
||||||
|
* 06 = lrin
|
||||||
|
* 07 = rrin
|
||||||
|
* 08 = belt
|
||||||
|
* 09 = feet
|
||||||
|
* 0A = glov
|
||||||
|
* 0B = ralt
|
||||||
|
* 0C = lalt
|
||||||
|
*/
|
||||||
|
BYTE page; //+45
|
||||||
|
/* page dans laquel se trouve l'item
|
||||||
|
* FF = mouse/equip/onEarth
|
||||||
|
* 00 = inventory
|
||||||
|
* 01 = cube
|
||||||
|
* 04 = stash
|
||||||
|
*/
|
||||||
|
BYTE uk4[0x01]; //+46
|
||||||
|
BYTE ItemData3; //+47 //D2Common10854 D2Common10853
|
||||||
|
BYTE pEarLevel; //+48
|
||||||
|
BYTE varGfx; //+49
|
||||||
|
char IName[0x12]; //+4A //inscribed/ear name
|
||||||
|
Inventory* ptInventory; //+5C
|
||||||
|
Unit* ptPrevItem; //+60
|
||||||
|
Unit* ptNextItem; //+64
|
||||||
|
BYTE uk8[0x01]; //+68
|
||||||
|
BYTE ItemData2; //+69
|
||||||
|
BYTE uk9[0x0A]; //+6A
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct NetClient
|
||||||
|
{
|
||||||
|
DWORD clientID; //+00
|
||||||
|
BYTE uk1[0x06]; //+04
|
||||||
|
union { //+0A
|
||||||
|
WORD flag;
|
||||||
|
struct {
|
||||||
|
WORD f1:1;
|
||||||
|
WORD f2:1;
|
||||||
|
WORD isHardCoreGame:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
BYTE uk2[0x170]; //+0C
|
||||||
|
BYTE* savefile; //+17C
|
||||||
|
DWORD finalSize; //+180
|
||||||
|
DWORD counter; //+184
|
||||||
|
DWORD currentSize; //+188
|
||||||
|
BYTE uk3[0x1C]; //+18C
|
||||||
|
Game* ptGame; //+1A8
|
||||||
|
//+1A8 is ptGame
|
||||||
|
//+4A8 ptNextClient
|
||||||
|
/*
|
||||||
|
Kingpin: ptPclient
|
||||||
|
+16C is either act or unit type
|
||||||
|
+170 Active UniqueID for player
|
||||||
|
+174 Active ptPlayer on Client
|
||||||
|
+1a8 ptGame
|
||||||
|
+1b4 Current or next ptRoom
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
struct PlayerData
|
||||||
|
{
|
||||||
|
char name[0x10]; //+00 (size min 0x08 max 0x11)
|
||||||
|
BYTE uk1[0x8C]; //+10
|
||||||
|
NetClient* ptNetClient; //+9C
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
struct PlayerData
|
||||||
|
{
|
||||||
|
char name[0x10]; //+00 Player Name
|
||||||
|
void* ptQuest[3]; //+10 Quest Pointers for each difficulty
|
||||||
|
BYTE uk1[0x18]; //+1C //before : 0x14
|
||||||
|
void* ptArenaUnit; //+34 ptArena for the Unit
|
||||||
|
BYTE uk2[0x4]; //+38 //before : 0x7
|
||||||
|
WORD MPSourcePortalUniqueID; //+3C Source Portal Unique_ID
|
||||||
|
BYTE uk3[0x2]; //+3E
|
||||||
|
WORD MPDestPortalUniqueID; //+40 Destination Portal Unique_ID
|
||||||
|
BYTE uk4[0x06]; //+42
|
||||||
|
BYTE ptObjectUnID; //+48 Object UniqueID for TownPortals
|
||||||
|
BYTE uk5[0x53]; //+49
|
||||||
|
NetClient* ptNetClient; //+9C ptClient
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define F1_IS_SPAWNED 0x10 //or F_IS_IDENTIFIED ?
|
||||||
|
#define F2_IS_LOD 0x2000000
|
||||||
|
struct Unit
|
||||||
|
{ //Offset from Code. Size: 0xF4+4
|
||||||
|
DWORD nUnitType; //+00
|
||||||
|
union{
|
||||||
|
DWORD nPlayerClass;
|
||||||
|
DWORD nTxtFileNo;
|
||||||
|
}; //+04
|
||||||
|
DWORD nUnitId; //+08
|
||||||
|
DWORD nItemNum; //+0C
|
||||||
|
DWORD CurrentAnim; //+10
|
||||||
|
union{
|
||||||
|
MonsterData* ptMonsterData;
|
||||||
|
ObjectData* ptObjectData;
|
||||||
|
ItemData* ptItemData;
|
||||||
|
PlayerData* ptPlayerData;
|
||||||
|
}; //+14
|
||||||
|
BYTE act; //+18
|
||||||
|
BYTE uk12[3]; //+19
|
||||||
|
void* ptAct; //+1C
|
||||||
|
DWORD SeedLow; //+20
|
||||||
|
DWORD SeedHi; //+24
|
||||||
|
DWORD SeedStarting; //+28
|
||||||
|
Path* path; //+2C
|
||||||
|
BYTE uk1[0x08]; //+30
|
||||||
|
Path* ptPos; //+38
|
||||||
|
DWORD animSpeed; //+3C
|
||||||
|
BYTE uk2[0x04]; //+40
|
||||||
|
DWORD curFrame; //+44
|
||||||
|
DWORD remainingFrame; //+48
|
||||||
|
WORD animSpeedW; //+4C
|
||||||
|
BYTE actionFlag; //+4E
|
||||||
|
BYTE uk3[0x1]; //+4F
|
||||||
|
void* ptAnimData; //+50
|
||||||
|
BYTE uk4[0x08]; //+54
|
||||||
|
Stats* ptStats; //+5C
|
||||||
|
Inventory* ptInventory; //+60
|
||||||
|
BYTE uk5[0x1C]; //+64
|
||||||
|
Game* ptGame; //+80
|
||||||
|
BYTE uk6[0x24]; //+84
|
||||||
|
Skills* ptSkills; //+A8
|
||||||
|
void* ptCombatData; //+AC
|
||||||
|
BYTE uk7[0x08]; //+B0
|
||||||
|
DWORD itemCode; //+B8 for an item being dropped by this unit
|
||||||
|
BYTE uk8[0x08]; //+BC
|
||||||
|
DWORD flags1; //+C4
|
||||||
|
union{
|
||||||
|
DWORD flags2; //+C8 //flags
|
||||||
|
struct{
|
||||||
|
DWORD ukf1:25;
|
||||||
|
DWORD isLod:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
BYTE uk9[0x04]; //+CC
|
||||||
|
DWORD clientId; //+D0
|
||||||
|
BYTE uk10[0x0C]; //+D4
|
||||||
|
Unit* ptFirstMonster; //+E0
|
||||||
|
Unit* Unit1; //+E4
|
||||||
|
Unit* Unit2; //+E8
|
||||||
|
BYTE uk11[0x08]; //+EC
|
||||||
|
union{
|
||||||
|
CBPlayerData* ptCBPlayerData;
|
||||||
|
CBItemData* ptCBItemData;
|
||||||
|
void* ptCBData;
|
||||||
|
}; //+F4
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
struct D2Game
|
||||||
|
{
|
||||||
|
DWORD unknown[19];
|
||||||
|
WORD difficulty;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ItemMod
|
||||||
|
{
|
||||||
|
DWORD mID; // +00 Mod ID, get it from properties.txt
|
||||||
|
DWORD mParam; // +04 First Property
|
||||||
|
DWORD mMinimum; // +04 Second Property, Min Value
|
||||||
|
DWORD mMaximum; // +04 Third Property, Max Value
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AIStruct
|
||||||
|
{
|
||||||
|
DWORD mSpawn; // +00
|
||||||
|
void* mAIFunc; // +04
|
||||||
|
DWORD mUnknown1[8]; // +08
|
||||||
|
D2Game* mGame; // +28
|
||||||
|
DWORD mMinionOwner; // +2C
|
||||||
|
DWORD mOwnerType; // +30
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct LocInfo
|
||||||
|
{ //Offset from Code
|
||||||
|
Unit* noneLoc; //+00
|
||||||
|
Unit* headLoc; //+04
|
||||||
|
Unit* neckLoc; //+08
|
||||||
|
Unit* torsoLoc; //+0c
|
||||||
|
Unit* rightArmLoc; //+10
|
||||||
|
Unit* leftArmLoc; //+14
|
||||||
|
Unit* rightRingLoc; //+18
|
||||||
|
Unit* leftRingLoc; //+1c
|
||||||
|
Unit* beltLoc; //+20
|
||||||
|
Unit* feetLoc; //+24
|
||||||
|
Unit* glovesLoc; //+28
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ItemData
|
||||||
|
{ // Offset from Code
|
||||||
|
DWORD quality; // +00.
|
||||||
|
DWORD lowSeed; // +04.
|
||||||
|
DWORD highSeed; // +08.
|
||||||
|
DWORD unknown1; // +0c.
|
||||||
|
DWORD startLowSeed; // +10.
|
||||||
|
DWORD cmdFlags; // +14.
|
||||||
|
DWORD flags; // +18.
|
||||||
|
DWORD unknown2[2]; // +1C
|
||||||
|
DWORD originID; // +24.
|
||||||
|
DWORD iLvl; // +28.
|
||||||
|
WORD version; // +2C.
|
||||||
|
WORD prefix; // +2E.
|
||||||
|
WORD suffix; // +30.
|
||||||
|
WORD autoPrefix; // +32.
|
||||||
|
WORD prefix1; // +34.
|
||||||
|
WORD prefix2; // +36.
|
||||||
|
WORD prefix3; // +38.
|
||||||
|
WORD suffix1; // +3A.
|
||||||
|
WORD suffix2; // +3C.
|
||||||
|
WORD suffix3; // +3E.
|
||||||
|
BYTE bodyLoc; // +40. // 0=inv/stash 4=gaucheS 5=droiteS
|
||||||
|
BYTE inPage; // +41. // FF=equip 00=inv 04=stash
|
||||||
|
BYTE unknown3[3]; // +42
|
||||||
|
BYTE picture[8]; // +45
|
||||||
|
DWORD ilvl; // +4C
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PresetUnit
|
||||||
|
{ //Offset from Code
|
||||||
|
DWORD unitType; //+00
|
||||||
|
DWORD txtFileNo; //+04
|
||||||
|
DWORD unknown1[1]; //Unkonwn Data at +08
|
||||||
|
DWORD xPos; //+0c
|
||||||
|
DWORD yPos; //+10
|
||||||
|
DWORD unknown2[2]; //Unknown data at +14
|
||||||
|
PresetUnit* pNext; //+1c
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MissileData
|
||||||
|
{
|
||||||
|
+04 flags
|
||||||
|
+08 0 on start
|
||||||
|
+0c -1 on start
|
||||||
|
+20 nDirection
|
||||||
|
+28 range?
|
||||||
|
+2c range?
|
||||||
|
+30 level
|
||||||
|
+34 number of pierces (byte)
|
||||||
|
+35 (byte)
|
||||||
|
+36 (byte)
|
||||||
|
+37 (byte)
|
||||||
|
+38 range-activate
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Combat
|
||||||
|
{
|
||||||
|
DWORD mHeader; // +00 : Always 0x32
|
||||||
|
DWORD mDisplayFlag; // +04 : Affect critical hit etc ...
|
||||||
|
DWORD mPhysicalDmg; // +08 : Values are << 8
|
||||||
|
DWORD mUnknown1; // +0C
|
||||||
|
DWORD mFireDmg; // +10 : Values are << 8
|
||||||
|
DWORD mUnknown2; // +14
|
||||||
|
DWORD mBurnLeng; // +18
|
||||||
|
DWORD mLtngDmg; // +1C : values are << 8
|
||||||
|
DWORD mMagDmg; // +20 : values are << 8
|
||||||
|
DWORD mColdDmg; // +24 : values are << 8
|
||||||
|
DWORD mPoisDmg; // +28 : ??
|
||||||
|
DWORD mPoisLeng; // +2C
|
||||||
|
DWORD mColdLeng; // +30
|
||||||
|
DWORD mFreezeLeng; // +34
|
||||||
|
DWORD mLifeSteal; // +38
|
||||||
|
DWORD mManaSteal; // +3C
|
||||||
|
DWORD mUnknwon3; // +40
|
||||||
|
DWORD mStunLeng; // +44
|
||||||
|
DWORD mUnknown4; // +48
|
||||||
|
DWORD mTotalDamage; // +4C
|
||||||
|
DWORD mUnknown5[6]; // +50
|
||||||
|
DWORD mOverlay; // +68
|
||||||
|
DWORD mUnknwon6; // +6C
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Node
|
||||||
|
{ //Offset from Code.
|
||||||
|
DWORD flag; //+00 //Yoh : null->flag
|
||||||
|
Unit* ptItem; //+04 //Yoh : ItemData=>Unit
|
||||||
|
DWORD unID; //+08
|
||||||
|
DWORD page; //+0c //Yoh plutot etat : inventory/stash=1; inv-belt=2; equip=3
|
||||||
|
Node* nextNode; //+10
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct MonsterData // size110 : 60
|
||||||
|
{
|
||||||
|
AIStruct* AIPtr;
|
||||||
|
void* unkonwPtr1;
|
||||||
|
void* uniqueInfo;
|
||||||
|
void* spawnInfo;
|
||||||
|
void* unknownPtr2;
|
||||||
|
DWORD unkown[8];
|
||||||
|
void* lvlPtr;
|
||||||
|
MonStatTxt* monstatPtr;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Unit
|
||||||
|
{ //Offset from Code.
|
||||||
|
DWORD nUnitType; //+00
|
||||||
|
union
|
||||||
|
{
|
||||||
|
DWORD nTxtFileNo;
|
||||||
|
DWORD nPlayerClass;
|
||||||
|
}; //+04
|
||||||
|
|
||||||
|
DWORD nUnitId; //+08
|
||||||
|
DWORD eMode; //+0c
|
||||||
|
DWORD* unknow1; //+10
|
||||||
|
DWORD nAct; //+14
|
||||||
|
DWORD pActRelated; //+18
|
||||||
|
DWORD unknown2[4]; //Unknown Data at +1C
|
||||||
|
D2Seed nSeed; //+2C
|
||||||
|
DWORD startSeed; //+34
|
||||||
|
Path* pPos; //+38
|
||||||
|
DWORD unknown3[6]; //Unknown Data at +3C
|
||||||
|
DWORD animSpeed; //+54
|
||||||
|
DWORD unknown32[2]; //+58
|
||||||
|
BYTE COFString[12]; //+60
|
||||||
|
Stats* ptStats; //+6C
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
PlayerData* pPlayerData;
|
||||||
|
MonsterData* pMonsterData;
|
||||||
|
ItemData* pItemData;
|
||||||
|
MissileData* pMissile;
|
||||||
|
ObjectData* pObjectData;
|
||||||
|
}; //+70
|
||||||
|
|
||||||
|
DWORD unknown5[2]; //+74
|
||||||
|
BYTE unknown6[2]; //+7C
|
||||||
|
BYTE rndDmg[2]; //+7e
|
||||||
|
DWORD unknown7; //+80
|
||||||
|
Inventory* ptInventory; //+84
|
||||||
|
DWORD unknown8[4]; //+88
|
||||||
|
DWORD startNull; //+98
|
||||||
|
DWORD unknown9[2]; //+9c
|
||||||
|
D2Game* ptGame; //+a4
|
||||||
|
DWORD unknown10[4]; //+a8
|
||||||
|
DWORD nOwnerType; //+b8
|
||||||
|
DWORD nOwnerId; //+bc
|
||||||
|
DWORD unknown11[3]; //+c0
|
||||||
|
D2Info* ptInfo; //+cc
|
||||||
|
Combat* ptCombat; //+d0
|
||||||
|
DWORD unknown12[5]; //+d4
|
||||||
|
DWORD flags; //+e8
|
||||||
|
DWORD LODflag; //+ec
|
||||||
|
DWORD unknown13[7]; //+f0
|
||||||
|
Unit* pNext; //+10c
|
||||||
|
DWORD unknown14[2]; //+110 //YOH
|
||||||
|
union
|
||||||
|
{
|
||||||
|
ItemData* ptItemData;
|
||||||
|
void* ptData;
|
||||||
|
}; //+118 //YOH
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
/*================================= END OF FILE =================================*/
|
1263
Commons/d2BinFile.h
Normal file
1263
Commons/d2BinFile.h
Normal file
File diff suppressed because it is too large
Load Diff
43
Commons/d2StringTblStruct.h
Normal file
43
Commons/d2StringTblStruct.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
@brief Diablo II Tbl Structures definitions.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
struct TblHeader
|
||||||
|
{
|
||||||
|
WORD usCRC; // +00
|
||||||
|
WORD NumElementsOffset; // +02
|
||||||
|
DWORD HashTableSizeOffset; // +04
|
||||||
|
BYTE VersionOffset; // +08
|
||||||
|
DWORD IndexStart; // +09
|
||||||
|
DWORD NumLoopsOffset; // +0D
|
||||||
|
DWORD IndexEnd; // +11 (FileLen)
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TblNode
|
||||||
|
{
|
||||||
|
BYTE ActiveOffset; // +00
|
||||||
|
WORD KeyIndex; // +01
|
||||||
|
DWORD HashValueOffset; // +03
|
||||||
|
DWORD KeyOffset; // +07
|
||||||
|
DWORD StringOffset; // +0B
|
||||||
|
WORD StringLength; // +0F
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
//#define TBLHEADERSIZE 0x15
|
||||||
|
//#define TBLNODESIZE 0x11
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
118
Commons/d2Struct.h
Normal file
118
Commons/d2Struct.h
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
NOT TESTED IN 1.10 (1.09b)
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
struct Unit;
|
||||||
|
struct Game;
|
||||||
|
struct Room;
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
struct sWinMessage
|
||||||
|
{
|
||||||
|
void* msg;
|
||||||
|
DWORD type;
|
||||||
|
DWORD uk1;
|
||||||
|
WORD x;
|
||||||
|
WORD y;
|
||||||
|
DWORD uk3;
|
||||||
|
DWORD uk4;
|
||||||
|
DWORD managed;
|
||||||
|
DWORD unmanaged;
|
||||||
|
};
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
/*
|
||||||
|
struct sDrawImageInfo//size = 0x48 (until 1.10)
|
||||||
|
{
|
||||||
|
void* reserved;
|
||||||
|
void* image;
|
||||||
|
DWORD frame;
|
||||||
|
DWORD zero[0xF];
|
||||||
|
};*/
|
||||||
|
|
||||||
|
struct sDrawImageInfo//size = 0x48
|
||||||
|
{
|
||||||
|
DWORD uk1;
|
||||||
|
DWORD uk2;
|
||||||
|
void* image;
|
||||||
|
DWORD uk3;
|
||||||
|
DWORD uk4;
|
||||||
|
void* reserved;
|
||||||
|
DWORD uk5[0xB];
|
||||||
|
DWORD frame;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct saveBitField
|
||||||
|
{
|
||||||
|
BYTE* data;
|
||||||
|
DWORD maxBits;
|
||||||
|
DWORD currentByte;
|
||||||
|
DWORD currentBit;
|
||||||
|
DWORD overflaw;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BINField
|
||||||
|
{
|
||||||
|
char* fieldName;
|
||||||
|
int type;
|
||||||
|
DWORD strLength;
|
||||||
|
DWORD offset;
|
||||||
|
void* lookup;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ItemGenerationData //size=0x84
|
||||||
|
{
|
||||||
|
Unit* ptMonster; //+00
|
||||||
|
BYTE uk1[0x04]; //+04
|
||||||
|
Game* ptGame; //+08
|
||||||
|
DWORD ilvl; //+0C
|
||||||
|
BYTE uk2[0x04]; //+10
|
||||||
|
DWORD nTxtFileNo; //+14
|
||||||
|
DWORD unknow1; //+18
|
||||||
|
DWORD x; //+1C
|
||||||
|
DWORD y; //+20
|
||||||
|
Room* ptRoom; //+24
|
||||||
|
WORD unknow2; //+28
|
||||||
|
WORD gameUnknown2; //+2A
|
||||||
|
BYTE uk3[0x04]; //+2C
|
||||||
|
DWORD quality; //+30
|
||||||
|
BYTE uk4[0x34]; //+34
|
||||||
|
int prefixID[3]; //+68 (-1: no prefix; 0:random prefix)
|
||||||
|
int suffixID[3]; //+74 (-1: no suffix; 0:random suffix)
|
||||||
|
union { //+80
|
||||||
|
DWORD flags;
|
||||||
|
struct {
|
||||||
|
DWORD fuk1:5; //0x0000001F
|
||||||
|
DWORD unknow3:1; //0x00000020
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*=================================================================*/
|
||||||
|
/* Data Structure to Update Client */
|
||||||
|
/*=================================================================*/
|
||||||
|
struct DataPacket
|
||||||
|
{
|
||||||
|
BYTE mType; // +00 Packet Type
|
||||||
|
BYTE mFunc; // +02 Function to Call
|
||||||
|
BYTE mSize; // +04 Size of the Packet
|
||||||
|
DWORD mReserved; // +06 Used with items
|
||||||
|
BYTE mUnitType; // +0A Always '0'
|
||||||
|
DWORD mPlayerID; // +0C The Player ID (ptUnit + 08h)
|
||||||
|
DWORD mItemID; // +10 The Item ID
|
||||||
|
DWORD mMod1_ID; // +14 The Stat/Mod ID
|
||||||
|
DWORD mParam1; // +18 3 Paramters
|
||||||
|
DWORD mParam2; // +1C
|
||||||
|
DWORD mParam3; // +20
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
843
Commons/d2constants.h
Normal file
843
Commons/d2constants.h
Normal file
@ -0,0 +1,843 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Constants of D2
|
||||||
|
NOT TESTED IN 1.10 (from 1.09b)
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*==================================================================================*/
|
||||||
|
/*
|
||||||
|
* Constants & Enumerations.
|
||||||
|
*/
|
||||||
|
/*==================================================================================*/
|
||||||
|
|
||||||
|
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 };
|
||||||
|
|
||||||
|
enum D2Color
|
||||||
|
{
|
||||||
|
WHITE=0,
|
||||||
|
RED=1,
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2Lang
|
||||||
|
{
|
||||||
|
LNG_ENG=0,// English
|
||||||
|
LNG_ESP,// Spanish
|
||||||
|
LNG_DEU,// German
|
||||||
|
LNG_FRA,// French
|
||||||
|
LNG_POR,// Portuguese
|
||||||
|
LNG_ITA,// Italian
|
||||||
|
LNG_JPN,// Japanese
|
||||||
|
LNG_KOR,// Korean
|
||||||
|
LNG_SIN,//
|
||||||
|
LNG_CHI,// Chinese
|
||||||
|
LNG_POL,// Polish
|
||||||
|
LNG_RUS,// Russian
|
||||||
|
LNG_DEF,// Default : English
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum D2GameTypeMode
|
||||||
|
{
|
||||||
|
// MODE_SINGLE = 0,
|
||||||
|
MODE_CLOSED = 1,
|
||||||
|
MODE_TCP,
|
||||||
|
MODE_OPEN,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2CStat
|
||||||
|
{
|
||||||
|
STATS_STRENGTH = 0,
|
||||||
|
STATS_ENERGY,
|
||||||
|
STATS_DEXTERITY,
|
||||||
|
STATS_VITALITY,
|
||||||
|
STATS_STATPTS,
|
||||||
|
STATS_NEWSKILLS,
|
||||||
|
STATS_HP,
|
||||||
|
STATS_MAXHP,
|
||||||
|
STATS_MANA,
|
||||||
|
STATS_MAXMANA,
|
||||||
|
STATS_STAMINA,
|
||||||
|
STATS_MAXSTAMINA,
|
||||||
|
STATS_LEVEL,
|
||||||
|
STATS_EXPERIENCE,
|
||||||
|
STATS_GOLD,
|
||||||
|
STATS_GOLDBANK,
|
||||||
|
STATS_ITEM_ARMOR_PERCENT,//0x10
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_MINDAMAGE_PERCENT,
|
||||||
|
STATS_TOHIT,
|
||||||
|
STATS_TOBLOCK,
|
||||||
|
STATS_MINDAMAGE,
|
||||||
|
STATS_MAXDAMAGE,
|
||||||
|
STATS_SECONDARY_MINDAMAGE,
|
||||||
|
STATS_SECONDARY_MAXDAMAGE,
|
||||||
|
STATS_DAMAGEPERCENT,
|
||||||
|
STATS_MANARECOVERY,
|
||||||
|
STATS_MANARECOVERYBONUS,
|
||||||
|
STATS_STAMINARECOVERYBONUS,
|
||||||
|
STATS_LASTEXP,
|
||||||
|
STATS_NEXTEXP,
|
||||||
|
STATS_ARMORCLASS,
|
||||||
|
STATS_ARMORCLASS_VS_MISSILE,//0x20
|
||||||
|
STATS_ARMORCLASS_VS_HTH,//0x21
|
||||||
|
STATS_NORMAL_DAMAGE_REDUCTION,
|
||||||
|
STATS_MAGIC_DAMAGE_REDUCTION,
|
||||||
|
STATS_DAMAGERESIST,
|
||||||
|
STATS_MAGICRESIST,
|
||||||
|
STATS_MAXMAGICRESIST,
|
||||||
|
STATS_FIRERESIST,//0x27
|
||||||
|
STATS_MAXFIRERESIST,
|
||||||
|
STATS_LIGHTRESIST,//0x29
|
||||||
|
STATS_MAXLIGHTRESIST,
|
||||||
|
STATS_COLDRESIST,//0x2B
|
||||||
|
STATS_MAXCOLDRESIST,
|
||||||
|
STATS_POISONRESIST,
|
||||||
|
STATS_MAXPOISONRESIST,
|
||||||
|
STATS_DAMAGEAURA,
|
||||||
|
STATS_FIREMINDAM,//0x30
|
||||||
|
STATS_FIREMAXDAM,
|
||||||
|
STATS_LIGHTMINDAM,
|
||||||
|
STATS_LIGHTMAXDAM,
|
||||||
|
STATS_MAGICMINDAM,
|
||||||
|
STATS_MAGICMAXDAM,
|
||||||
|
STATS_COLDMINDAM,
|
||||||
|
STATS_COLDMAXDAM,
|
||||||
|
STATS_COLDLENGTH,
|
||||||
|
STATS_POISONMINDAM,
|
||||||
|
STATS_POISONMAXDAM,
|
||||||
|
STATS_POISONLENGTH,
|
||||||
|
STATS_LIFEDRAINMINDAM,
|
||||||
|
STATS_LIFEDRAINMAXDAM,
|
||||||
|
STATS_MANADRAINMINDAM,
|
||||||
|
STATS_MANADRAINMAXDAM,
|
||||||
|
STATS_STAMDRAINMINDAM,//0x40
|
||||||
|
STATS_STAMDRAINMAXDAM,
|
||||||
|
STATS_STUNLENGTH,
|
||||||
|
STATS_VELOCITYPERCENT,
|
||||||
|
STATS_ATTACKRATE,
|
||||||
|
STATS_OTHER_ANIMRATE,
|
||||||
|
STATS_QUANTITY,
|
||||||
|
STATS_VALUE,
|
||||||
|
STATS_DURABILITY,
|
||||||
|
STATS_MAXDURABILITY,
|
||||||
|
STATS_HPREGEN,
|
||||||
|
STATS_ITEM_MAXDURABILITY_PERCENT,
|
||||||
|
STATS_ITEM_MAXHP_PERCENT,
|
||||||
|
STATS_ITEM_MAXMANA_PERCENT,
|
||||||
|
STATS_ITEM_ATTACKERTAKESDAMAGE,
|
||||||
|
STATS_ITEM_GOLDBONUS,
|
||||||
|
STATS_ITEM_MAGICBONUS,//0x50
|
||||||
|
STATS_ITEM_KNOCKBACK,
|
||||||
|
STATS_ITEM_TIMEDURATION,
|
||||||
|
STATS_ITEM_ADDCLASSSKILLS, //STATS_ITEM_ADDAMASKILLPOINTS
|
||||||
|
STATS_UNSENTPARAM1, //STATS_ITEM_ADDPALSKILLPOINTS
|
||||||
|
STATS_ADDEXPERIENCE, //STATS_ITEM_ADDNECSKILLPOINTS
|
||||||
|
STATS_HEALAFTERKILL, //STATS_ITEM_ADDSORSKILLPOINTS
|
||||||
|
STATS_REDUCESPRICES, //STATS_ITEM_ADDBARSKILLPOINTS
|
||||||
|
STATS_ITEM_DOUBLEHERBDURATION,
|
||||||
|
STATS_ITEM_LIGHTRADIUS,
|
||||||
|
STATS_ITEM_LIGHTCOLOR,
|
||||||
|
STATS_ITEM_REQ_PERCENT,
|
||||||
|
STATS_LEVELREQ, //STATS_ITEM_FASTATTACKRATE
|
||||||
|
STATS_ITEM_FASTERATTACKRATE,
|
||||||
|
STATS_ITEM_LEVELREQPCT, //STATS_ITEM_FASTESTATTACKRATE,
|
||||||
|
STATS_LASTBLOCKFRAME, //STATS_ITEM_FASTMOVEVELOCITY,
|
||||||
|
STATS_ITEM_FASTERMOVEVELOCITY,//0x60
|
||||||
|
STATS_NONCLASSKILL, //STATS_ITEM_FASTESTMOVEVELOCITY,
|
||||||
|
STATS_STATE, //STATS_ITEM_FASTGETHITRATE,
|
||||||
|
STATS_ITEM_FASTERGETHITRATE,
|
||||||
|
STATS_MONSTER_PLAYERCOUNT, //STATS_ITEM_FASTESTGETHITRATE,
|
||||||
|
STATS_SKILL_POISON_OVERRIDE_LENGTH, //STATS_ITEM_FASTBLOCKRATE,
|
||||||
|
STATS_ITEM_FASTERBLOCKRATE,
|
||||||
|
STATS_SKILL_BYPASS_UNDEAD, //STATS_ITEM_FASTESTBLOCKRATE,
|
||||||
|
STATS_SKILL_BYPASS_DEMONS, //STATS_ITEM_FASTCASTRATE,
|
||||||
|
STATS_ITEM_FASTERCASTRATE,
|
||||||
|
STATS_SKILL_BYPASS_BEASTS, //STATS_ITEM_FASTESTCASTRATE,
|
||||||
|
STATS_ITEM_SINGLESKILL, //STATS_ITEM_SINGLESKILL1,
|
||||||
|
STATS_ITEM_RESTINPEACE, //STATS_ITEM_SINGLESKILL2,
|
||||||
|
STATS_CURSE_RESISTANCE, //STATS_ITEM_SINGLESKILL3,
|
||||||
|
STATS_ITEM_POISONLENGTHRESIST,
|
||||||
|
STATS_ITEM_NORMALDAMAGE,
|
||||||
|
STATS_ITEM_HOWL,//0x70
|
||||||
|
STATS_ITEM_STUPIDITY,
|
||||||
|
STATS_ITEM_DAMAGETOMANA,
|
||||||
|
STATS_ITEM_IGNORETARGETAC,
|
||||||
|
STATS_ITEM_FRACTIONALTARGETAC,
|
||||||
|
STATS_ITEM_PREVENTHEAL,
|
||||||
|
STATS_ITEM_HALFFREEZEDURATION,
|
||||||
|
STATS_ITEM_TOHIT_PERCENT,
|
||||||
|
STATS_ITEM_DAMAGETARGETAC,
|
||||||
|
STATS_ITEM_DEMONDAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_UNDEADDAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_DEMON_TOHIT,
|
||||||
|
STATS_ITEM_UNDEAD_TOHIT,
|
||||||
|
STATS_ITEM_THROWABLE,
|
||||||
|
STATS_ITEM_ELEMSKILL, //STATS_ITEM_FIRESKILL,
|
||||||
|
STATS_ITEM_ALLSKILLS,
|
||||||
|
STATS_ITEM_ATTACKERTAKESLIGHTDAMAGE,//0x80
|
||||||
|
STATS_IRONMAIDEN_LEVEL,
|
||||||
|
STATS_LIFETAP_LEVEL,
|
||||||
|
STATS_THORNS_LEVEL,
|
||||||
|
STATS_BONEARMOR,
|
||||||
|
STATS_BONEARMORMAX,
|
||||||
|
STATS_ITEM_FREEZE,
|
||||||
|
STATS_ITEM_OPENWOUNDS,
|
||||||
|
STATS_ITEM_CRUSHINGBLOW,
|
||||||
|
STATS_ITEM_KICKDAMAGE,
|
||||||
|
STATS_ITEM_MANAAFTERKILL,
|
||||||
|
STATS_ITEM_HEALAFTERDEMONKILL,
|
||||||
|
STATS_ITEM_EXTRABLOOD,
|
||||||
|
STATS_ITEM_DEADLYSTRIKE,
|
||||||
|
STATS_ITEM_ABSORBFIRE_PERCENT,
|
||||||
|
STATS_ITEM_ABSORBFIRE,
|
||||||
|
STATS_ITEM_ABSORBLIGHT_PERCENT,
|
||||||
|
STATS_ITEM_ABSORBLIGHT,
|
||||||
|
STATS_ITEM_ABSORBMAGIC_PERCENT,
|
||||||
|
STATS_ITEM_ABSORBMAGIC,
|
||||||
|
STATS_ITEM_ABSORBCOLD_PERCENT,
|
||||||
|
STATS_ITEM_ABSORBCOLD,
|
||||||
|
STATS_ITEM_SLOW,
|
||||||
|
STATS_ITEM_AURA, //STATS_ITEM_BLESSEDAIM,
|
||||||
|
STATS_ITEM_INDESTRUCTIBLE, //STATS_ITEM_DEFIANCE,
|
||||||
|
STATS_ITEM_CANNOTBEFROZEN,
|
||||||
|
STATS_ITEM_STAMINADRAINPCT,
|
||||||
|
STATS_ITEM_REANIMATE,
|
||||||
|
STATS_ITEM_PIERCE,
|
||||||
|
STATS_ITEM_MAGICARROW,
|
||||||
|
STATS_ITEM_EXPLOSIVEARROW,
|
||||||
|
STATS_ITEM_THROW_MINDAMAGE,
|
||||||
|
STATS_ITEM_THROW_MAXDAMAGE,
|
||||||
|
STATS_SKILL_HANDOFATHENA,
|
||||||
|
STATS_SKILL_STAMINAPERCENT,
|
||||||
|
STATS_SKILL_PASSIVE_STAMINAPERCENT,
|
||||||
|
STATS_SKILL_CONCENTRATION,
|
||||||
|
STATS_SKILL_ENCHANT,
|
||||||
|
STATS_SKILL_PIERCE,
|
||||||
|
STATS_SKILL_CONVICTION,
|
||||||
|
STATS_SKILL_CHILLINGARMOR,
|
||||||
|
STATS_SKILL_FRENZY,
|
||||||
|
STATS_SKILL_DECREPIFY,
|
||||||
|
STATS_SKILL_ARMOR_PERCENT,
|
||||||
|
STATS_ALIGNMENT,
|
||||||
|
STATS_TARGET0,
|
||||||
|
STATS_TARGET1,
|
||||||
|
STATS_GOLDLOST,
|
||||||
|
STATS_CONVERSION_LEVEL,
|
||||||
|
STATS_CONVERSION_MAXHP,
|
||||||
|
STATS_UNIT_DOOVERLAY,
|
||||||
|
STATS_ATTACK_VS_MONTYPE, //STATS_ITEM_ADDDRUSKILLPOINTS,
|
||||||
|
STATS_DAMAGE_VS_MONTYPE, //STATS_ITEM_ADDASSSKILLPOINTS,
|
||||||
|
STATS_FADE, //STATS_ITEM_ADDSKILL_SINGLE4,
|
||||||
|
STATS_ARMOR_OVERRIDE_PERCENT, //STATS_ITEM_ADDSKILL_SINGLE5,
|
||||||
|
STATS_UNUSED183, //STATS_ITEM_ADDSKILL_SINGLE6,
|
||||||
|
STATS_UNUSED184, //STATS_ITEM_ADDSKILL_SINGLE7,
|
||||||
|
STATS_UNUSED185, //STATS_ITEM_ADDSKILL_SINGLE8,
|
||||||
|
STATS_UNUSED186, //STATS_ITEM_ADDSKILL_SINGLE9,
|
||||||
|
STATS_UNUSED187, //STATS_ITEM_ADDSKILL_SINGLE10,
|
||||||
|
STATS_ADDSKILL_TAB, //STATS_ITEM_ADDSKILL_TAB1,
|
||||||
|
STATS_UNUSED189, //STATS_ITEM_ADDSKILL_TAB2,
|
||||||
|
STATS_UNUSED190, //STATS_ITEM_ADDSKILL_TAB3,
|
||||||
|
STATS_UNUSED191, //STATS_ITEM_ADDSKILL_TAB4,
|
||||||
|
STATS_UNUSED192, //STATS_ITEM_ADDSKILL_TAB5,
|
||||||
|
STATS_UNUSED193, //STATS_ITEM_ADDSKILL_TAB6,
|
||||||
|
STATS_ITEM_NUMSOCKETS,
|
||||||
|
STATS_ITEM_SKILLONATTACK, //STATS_ITEM_SKILLONATTACK1,
|
||||||
|
STATS_ITEM_SKILLONKILL, //STATS_ITEM_SKILLONATTACK2,
|
||||||
|
STATS_ITEM_SKILLONDEATH, //STATS_ITEM_SKILLONATTACK3,
|
||||||
|
STATS_ITEM_SKILLONHIT, //STATS_ITEM_SKILLONHIT1,
|
||||||
|
STATS_ITEM_SKILLONLEVELUP, //STATS_ITEM_SKILLONHIT2,
|
||||||
|
STATS_UNUSED200, //STATS_ITEM_SKILLONHIT3,
|
||||||
|
STATS_ITEM_SKILLONGETHIT, //STATS_ITEM_SKILLONGETHIT1,
|
||||||
|
STATS_UNUSED202, //STATS_ITEM_SKILLONGETHIT2,
|
||||||
|
STATS_UNUSED203, //STATS_ITEM_SKILLONGETHIT3,
|
||||||
|
STATS_ITEM_CHARGED_SKILL, //STATS_ITEM_CHARGED_SKILL0,
|
||||||
|
STATS_UNUSED205, //STATS_ITEM_CHARGED_SKILL1,
|
||||||
|
STATS_UNUSED206, //STATS_ITEM_CHARGED_SKILL2,
|
||||||
|
STATS_UNUSED207, //STATS_ITEM_CHARGED_SKILL3,
|
||||||
|
STATS_UNUSED208, //STATS_ITEM_CHARGED_SKILL4,
|
||||||
|
STATS_UNUSED209, //STATS_ITEM_CHARGED_SKILL5,
|
||||||
|
STATS_UNUSED210, //STATS_ITEM_CHARGED_SKILL6,
|
||||||
|
STATS_UNUSED211, //STATS_ITEM_CHARGED_SKILL7,
|
||||||
|
STATS_UNUSED212, //STATS_ITEM_CHARGED_SKILL8,
|
||||||
|
STATS_UNUSED213, //STATS_ITEM_CHARGED_SKILL9,
|
||||||
|
STATS_ITEM_ARMOR_PERLEVEL,
|
||||||
|
STATS_ITEM_ARMORPERCENT_PERLEVEL,
|
||||||
|
STATS_ITEM_HP_PERLEVEL,
|
||||||
|
STATS_ITEM_MANA_PERLEVEL,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERLEVEL,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERCENT_PERLEVEL,
|
||||||
|
STATS_ITEM_STRENGTH_PERLEVEL,
|
||||||
|
STATS_ITEM_DEXTERITY_PERLEVEL,
|
||||||
|
STATS_ITEM_ENERGY_PERLEVEL,
|
||||||
|
STATS_ITEM_VITALITY_PERLEVEL,
|
||||||
|
STATS_ITEM_TOHIT_PERLEVEL,
|
||||||
|
STATS_ITEM_TOHITPERCENT_PERLEVEL,
|
||||||
|
STATS_ITEM_COLD_DAMAGEMAX_PERLEVEL,
|
||||||
|
STATS_ITEM_FIRE_DAMAGEMAX_PERLEVEL,
|
||||||
|
STATS_ITEM_LTNG_DAMAGEMAX_PERLEVEL,
|
||||||
|
STATS_ITEM_POIS_DAMAGEMAX_PERLEVEL,
|
||||||
|
STATS_ITEM_RESIST_COLD_PERLEVEL,
|
||||||
|
STATS_ITEM_RESIST_FIRE_PERLEVEL,
|
||||||
|
STATS_ITEM_RESIST_LTNG_PERLEVEL,
|
||||||
|
STATS_ITEM_RESIST_POIS_PERLEVEL,
|
||||||
|
STATS_ITEM_ABSORB_COLD_PERLEVEL,
|
||||||
|
STATS_ITEM_ABSORB_FIRE_PERLEVEL,
|
||||||
|
STATS_ITEM_ABSORB_LTNG_PERLEVEL,
|
||||||
|
STATS_ITEM_ABSORB_POIS_PERLEVEL,
|
||||||
|
STATS_ITEM_THORNS_PERLEVEL,
|
||||||
|
STATS_ITEM_FIND_GOLD_PERLEVEL,
|
||||||
|
STATS_ITEM_FIND_MAGIC_PERLEVEL,
|
||||||
|
STATS_ITEM_REGENSTAMINA_PERLEVEL,
|
||||||
|
STATS_ITEM_STAMINA_PERLEVEL,
|
||||||
|
STATS_ITEM_DAMAGE_DEMON_PERLEVEL,
|
||||||
|
STATS_ITEM_DAMAGE_UNDEAD_PERLEVEL,
|
||||||
|
STATS_ITEM_TOHIT_DEMON_PERLEVEL,
|
||||||
|
STATS_ITEM_TOHIT_UNDEAD_PERLEVEL,
|
||||||
|
STATS_ITEM_CRUSHINGBLOW_PERLEVEL,
|
||||||
|
STATS_ITEM_OPENWOUNDS_PERLEVEL,
|
||||||
|
STATS_ITEM_KICK_DAMAGE_PERLEVEL,
|
||||||
|
STATS_ITEM_DEADLYSTRIKE_PERLEVEL,
|
||||||
|
STATS_ITEM_FIND_GEMS_PERLEVEL,
|
||||||
|
STATS_ITEM_REPLENISH_DURABILITY,
|
||||||
|
STATS_ITEM_REPLENISH_QUANTITY,
|
||||||
|
STATS_ITEM_EXTRA_STACK,
|
||||||
|
STATS_ITEM_FIND_ITEM,
|
||||||
|
STATS_ITEM_SLASH_DAMAGE,
|
||||||
|
STATS_ITEM_SLASH_DAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_CRUSH_DAMAGE,
|
||||||
|
STATS_ITEM_CRUSH_DAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_THRUST_DAMAGE,
|
||||||
|
STATS_ITEM_THRUST_DAMAGE_PERCENT,
|
||||||
|
STATS_ITEM_ABSORB_SLASH,
|
||||||
|
STATS_ITEM_ABSORB_CRUSH,
|
||||||
|
STATS_ITEM_ABSORB_THRUST,
|
||||||
|
STATS_ITEM_ABSORB_SLASH_PERCENT,
|
||||||
|
STATS_ITEM_ABSORB_CRUSH_PERCENT,
|
||||||
|
STATS_ITEM_ABSORB_THRUST_PERCENT,
|
||||||
|
STATS_ITEM_ARMOR_BYTIME,
|
||||||
|
STATS_ITEM_ARMORPERCENT_BYTIME,
|
||||||
|
STATS_ITEM_HP_BYTIME,
|
||||||
|
STATS_ITEM_MANA_BYTIME,
|
||||||
|
STATS_ITEM_MAXDAMAGE_BYTIME,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERCENT_BYTIME,
|
||||||
|
STATS_ITEM_STRENGTH_BYTIME,
|
||||||
|
STATS_ITEM_DEXTERITY_BYTIME,
|
||||||
|
STATS_ITEM_ENERGY_BYTIME,
|
||||||
|
STATS_ITEM_VITALITY_BYTIME,
|
||||||
|
STATS_ITEM_TOHIT_BYTIME,
|
||||||
|
STATS_ITEM_TOHITPERCENT_BYTIME,
|
||||||
|
STATS_ITEM_COLD_DAMAGEMAX_BYTIME,
|
||||||
|
STATS_ITEM_FIRE_DAMAGEMAX_BYTIME,
|
||||||
|
STATS_ITEM_LTNG_DAMAGEMAX_BYTIME,
|
||||||
|
STATS_ITEM_POIS_DAMAGEMAX_BYTIME,
|
||||||
|
STATS_ITEM_RESIST_COLD_BYTIME,
|
||||||
|
STATS_ITEM_RESIST_FIRE_BYTIME,
|
||||||
|
STATS_ITEM_RESIST_LTNG_BYTIME,
|
||||||
|
STATS_ITEM_RESIST_POIS_BYTIME,
|
||||||
|
STATS_ITEM_ABSORB_COLD_BYTIME,
|
||||||
|
STATS_ITEM_ABSORB_FIRE_BYTIME,
|
||||||
|
STATS_ITEM_ABSORB_LTNG_BYTIME,
|
||||||
|
STATS_ITEM_ABSORB_POIS_BYTIME,
|
||||||
|
STATS_ITEM_FIND_GOLD_BYTIME,
|
||||||
|
STATS_ITEM_FIND_MAGIC_BYTIME,
|
||||||
|
STATS_ITEM_REGENSTAMINA_BYTIME,
|
||||||
|
STATS_ITEM_STAMINA_BYTIME,
|
||||||
|
STATS_ITEM_DAMAGE_DEMON_BYTIME,
|
||||||
|
STATS_ITEM_DAMAGE_UNDEAD_BYTIME,
|
||||||
|
STATS_ITEM_TOHIT_DEMON_BYTIME,
|
||||||
|
STATS_ITEM_TOHIT_UNDEAD_BYTIME,
|
||||||
|
STATS_ITEM_CRUSHINGBLOW_BYTIME,
|
||||||
|
STATS_ITEM_OPENWOUNDS_BYTIME,
|
||||||
|
STATS_ITEM_KICK_DAMAGE_BYTIME,
|
||||||
|
STATS_ITEM_DEADLYSTRIKE_BYTIME,
|
||||||
|
STATS_ITEM_FIND_GEMS_BYTIME,
|
||||||
|
STATS_ITEM_PIERCE_COLD,
|
||||||
|
STATS_ITEM_PIERCE_FIRE,
|
||||||
|
STATS_ITEM_PIERCE_LTNG,
|
||||||
|
STATS_ITEM_PIERCE_POIS,
|
||||||
|
STATS_ITEM_DAMAGE_VS_MONSTER,
|
||||||
|
STATS_ITEM_DAMAGE_PERCENT_VS_MONSTER,
|
||||||
|
STATS_ITEM_TOHIT_VS_MONSTER,
|
||||||
|
STATS_ITEM_TOHIT_PERCENT_VS_MONSTER,
|
||||||
|
STATS_ITEM_AC_VS_MONSTER,
|
||||||
|
STATS_ITEM_AC_PERCENT_VS_MONSTER,
|
||||||
|
STATS_FIRELENGTH,
|
||||||
|
STATS_BURNINGMIN,
|
||||||
|
STATS_BURNINGMAX,
|
||||||
|
STATS_PROGRESSIVE_DAMAGE,
|
||||||
|
STATS_PROGRESSIVE_STEAL,
|
||||||
|
STATS_PROGRESSIVE_OTHER,
|
||||||
|
STATS_PROGRESSIVE_FIRE,
|
||||||
|
STATS_PROGRESSIVE_COLD,
|
||||||
|
STATS_PROGRESSIVE_LIGHTNING,
|
||||||
|
STATS_ITEM_EXTRA_CHARGES,
|
||||||
|
STATS_PROGRESSIVE_TOHIT,
|
||||||
|
STATS_POISON_COUNT,
|
||||||
|
STATS_DAMAGE_FRAMERATE,
|
||||||
|
STATS_PIERCE_IDX,
|
||||||
|
STATS_PASSIVE_FIRE_MASTERY,///////////////////////// NEW FOR 1.10
|
||||||
|
STATS_PASSIVE_LTNG_MASTERY,
|
||||||
|
STATS_PASSIVE_COLD_MASTERY,
|
||||||
|
STATS_PASSIVE_POUS_MASTERY,
|
||||||
|
STATS_PASSIVE_FIRE_PIERCE,
|
||||||
|
STATS_PASSIVE_LTNG_PIERCE,
|
||||||
|
STATS_PASSIVE_COLD_PIERCE,
|
||||||
|
STATS_PASSIVE_POIS_PIERCE,
|
||||||
|
STATS_PASSIVE_CRITICAL_STRIKE,
|
||||||
|
STATS_PASSIVE_DODGE,
|
||||||
|
STATS_PASSIVE_AVOID,
|
||||||
|
STATS_PASSIVE_EVADE,
|
||||||
|
STATS_PASSIVE_WARMTH,
|
||||||
|
STATS_PASSIVE_MASTERY_MELEE_TH,
|
||||||
|
STATS_PASSIVE_MASTERY_MELEE_DMG,
|
||||||
|
STATS_PASSIVE_MASTERY_MELEE_CRIT,
|
||||||
|
STATS_PASSIVE_MASTERY_THROW_TH,
|
||||||
|
STATS_PASSIVE_MASTERY_THROW_DMG,
|
||||||
|
STATS_PASSIVE_MASTERY_THROW_CRIT,
|
||||||
|
STATS_PASSIVE_WEAPONBLOCK,
|
||||||
|
STATS_PASSIVE_SUMMON_RESIST,
|
||||||
|
STATS_MODIFIERLIST_SKILL,
|
||||||
|
STATS_MODIFIERLIST_LEVEL,
|
||||||
|
STATS_LAST_SENT_HP_PCT,
|
||||||
|
STATS_SOURCE_UNIT_TYPE,
|
||||||
|
STATS_SOURCE_UNIT_ID,
|
||||||
|
STATS_SHORTPARAM1,
|
||||||
|
STATS_QUESTITEMDIFFICULTY,
|
||||||
|
STATS_PASSIVE_MAG_MASTERY,
|
||||||
|
STATS_PASSIVE_MAG_PIERCE
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2Mod
|
||||||
|
{
|
||||||
|
ARMORCLASS = 0,
|
||||||
|
ARMORCLASS_VS_MISSILE,
|
||||||
|
ARMORCLASS_VS_HTH,
|
||||||
|
NORMAL_DAMAGE_REDUCTION,
|
||||||
|
NORMAL_DAMAGE_REDUCTION_PCT,
|
||||||
|
ARMOR_PERCENT,
|
||||||
|
MAGIC_DAMAGE_REDUCTION,
|
||||||
|
STRENGTH,
|
||||||
|
DEXTERITY,
|
||||||
|
VITALITY,
|
||||||
|
ENERGY,
|
||||||
|
MAXMANA,
|
||||||
|
MAXMANA_PERCENT,
|
||||||
|
MAXHP,
|
||||||
|
MAXHP_PERCENT,
|
||||||
|
TOHIT,
|
||||||
|
TOBLOCK,
|
||||||
|
COLDMINDAM,
|
||||||
|
COLDMAXDAM,
|
||||||
|
COLDLENGTH,
|
||||||
|
FIREMINDAM,
|
||||||
|
FIREMAXDAM,
|
||||||
|
LIGHTMINDAM,
|
||||||
|
LIGHTMAXDAM,
|
||||||
|
POISONMINDAM,
|
||||||
|
POISONMAXDAM,
|
||||||
|
POISONLENGTH,
|
||||||
|
MINDAMAGE,
|
||||||
|
MAXDAMAGE,
|
||||||
|
WEAPONDAMAGE_PERCENT,
|
||||||
|
DAMAGETOMANA,
|
||||||
|
FIRERESIST,
|
||||||
|
MAXFIRERESIST,
|
||||||
|
LIGHTRESIST,
|
||||||
|
MAXLIGHTRESIST,
|
||||||
|
COLDRESIST,
|
||||||
|
MAXCOLDRESIST,
|
||||||
|
MAGICRESIST,
|
||||||
|
MAXMAGICRESIST,
|
||||||
|
POISONRESIST,
|
||||||
|
MAXPOISONRESIST,
|
||||||
|
RESISTALL,
|
||||||
|
MAXRESISTALL,
|
||||||
|
ASBORBFIRE_PERCENT,
|
||||||
|
ASBORBFIRE,
|
||||||
|
ASBORBLIGHT_PERCENT,
|
||||||
|
ASBORBLIGHT,
|
||||||
|
ASBORBMAGIC_PERCENT,
|
||||||
|
ASBORBMAGIC,
|
||||||
|
ASBORBCOLD_PERCENT,
|
||||||
|
ASBORBCOLD,
|
||||||
|
MAXDURABILITY,
|
||||||
|
MAXDURABILITY_PERCENT,
|
||||||
|
HITPOINTS_DELTA,
|
||||||
|
ATTACKERTAKES_DAMAGE,
|
||||||
|
FASTATTACKRATE,
|
||||||
|
FASTERATTACKRATE,
|
||||||
|
FASTESTATTACKRATE,
|
||||||
|
GOLDBONUS,
|
||||||
|
MAGICBONUS,
|
||||||
|
KNOCKBACK,
|
||||||
|
REGENSTAMINA_PERCENT,
|
||||||
|
REGENMANA_PERCENT,
|
||||||
|
BASESTAMINA,
|
||||||
|
TIMEDURATION,
|
||||||
|
MANASTEAL,
|
||||||
|
LIFESTEAL,
|
||||||
|
ADDAMASKILLPOINTS,
|
||||||
|
ADDPALSKILLPOINTS,
|
||||||
|
ADDNECSKILLPOINTS,
|
||||||
|
ADDSORSKILLPOINTS,
|
||||||
|
ADDBARSKILLPOINTS,
|
||||||
|
DOUBLEHERBDURATION,
|
||||||
|
LIGHTRADIUS,
|
||||||
|
LIGHTCOLOR,
|
||||||
|
REQ_PERCENT,
|
||||||
|
FASTMOVEVELOCITY,
|
||||||
|
FASTERMOVEVELOCITY,
|
||||||
|
FASTESTMOVEVELOCITY,
|
||||||
|
FASTGETHITRATE,
|
||||||
|
FASTERGETHITRATE,
|
||||||
|
FASTESTGETHITRATE,
|
||||||
|
FASTBLOCKRATE,
|
||||||
|
FASTERBLOCKRATE,
|
||||||
|
FASTESTBLOCKRATE,
|
||||||
|
FASTCASTRATE,
|
||||||
|
FASTERCASTRATE,
|
||||||
|
FASTESTCASTRATE,
|
||||||
|
POISONLENGTHRESIST,
|
||||||
|
NORMALDAMAGE,
|
||||||
|
HOWL,
|
||||||
|
STUPIDITY,
|
||||||
|
IGNORETARGETAC,
|
||||||
|
FRACTIONALTARGETAC,
|
||||||
|
PREVENTHEAL,
|
||||||
|
HALFFREEZEDURATION,
|
||||||
|
TOHIT_PERCENT,
|
||||||
|
DAMAGETARGETAC,
|
||||||
|
DEMONDAMAGE_PERCENT,
|
||||||
|
UNDEADDAMAGE_PERCENT,
|
||||||
|
DEMON_TOHIT,
|
||||||
|
UNDEAD_TOHIT,
|
||||||
|
THROWABLE,
|
||||||
|
FIRESKILL,
|
||||||
|
ALLSKILLS,
|
||||||
|
ATTACKERTAKESLIGHT_DAMAGE,
|
||||||
|
FREEZE,
|
||||||
|
OPENWOUNDS,
|
||||||
|
CRUSHINGBLOW,
|
||||||
|
KICKDAMAGE,
|
||||||
|
MANAAFTERKILL,
|
||||||
|
HEALAFTERDEMONKILL,
|
||||||
|
EXTRABLOOD,
|
||||||
|
DEADLYSTRIKE,
|
||||||
|
SLOW,
|
||||||
|
CANNOTBEFROZEN,
|
||||||
|
STAMINADRAINPCT,
|
||||||
|
REANIMATE,
|
||||||
|
PIERCE,
|
||||||
|
MAGICARROW,
|
||||||
|
EXPLOSIVEARROW,
|
||||||
|
ADDDRUSKILLPOINTS,
|
||||||
|
ADDASSSKILLPOINTS,
|
||||||
|
ADDSKILL,
|
||||||
|
ADDTAB,
|
||||||
|
ADDSKILL_PASSIVES,
|
||||||
|
SKILL_ON_ATTACK,
|
||||||
|
SKILL_ON_HIT,
|
||||||
|
SKILL_ON_GETHIT,
|
||||||
|
GEMBONUS,
|
||||||
|
DURABILITY_OVER_TIME,
|
||||||
|
FIRE_EFFECTS,
|
||||||
|
LIGHTNING_EFFECTS,
|
||||||
|
SOCKETS,
|
||||||
|
FIRE_DAMAGE_MINMAX,
|
||||||
|
LIGHT_DAMAGE_MINMAX,
|
||||||
|
MAGIC_DAMAGE_MINMAX,
|
||||||
|
COLD_DAMAGE_MINMAXLEN,
|
||||||
|
POIS_DAMAGE_MINMAXLEN,
|
||||||
|
THROW_DAMAGE_MINMAX,
|
||||||
|
DAMAGE_MINMAX,
|
||||||
|
STATS_ITEM_ARMOR_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ARMORPERCENT_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_HP_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_MANA_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERCENT_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_STRENGTH_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_DEXTERITY_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ENERGY_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_VITALITY_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_TOHIT_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_TOHITPERCENT_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_COLD_DAMAGEMAX_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_FIRE_DAMAGEMAX_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_LTNG_DAMAGEMAX_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_POIS_DAMAGEMAX_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_RESIST_COLD_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_RESIST_FIRE_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_RESIST_LTNG_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_RESIST_POIS_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ABSORB_COLD_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ABSORB_FIRE_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ABSORB_LTNG_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_ABSORB_POIS_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_THORNS_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_FIND_GOLD_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_FIND_MAGIC_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_REGENSTAMINA_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_STAMINA_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_DEMON_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_UNDEAD_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_TOHIT_DEMON_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_TOHIT_UNDEAD_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_CRUSHINGBLOW_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_OPENWOUNDS_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_KICK_DAMAGE_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_DEADLYSTRIKE_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_FIND_GEMS_PERLEVEL_MOD,
|
||||||
|
STATS_ITEM_REPLENISH_DURABILITY_MOD,
|
||||||
|
STATS_ITEM_REPLENISH_QUANTITY_MOD,
|
||||||
|
STATS_ITEM_EXTRA_STACK_MOD,
|
||||||
|
STATS_ITEM_FIND_ITEM_MOD,
|
||||||
|
STATS_ITEM_SLASH_DAMAGE_MOD,
|
||||||
|
STATS_ITEM_SLASH_DAMAGE_PERCENT_MOD,
|
||||||
|
STATS_ITEM_CRUSH_DAMAGE_MOD,
|
||||||
|
STATS_ITEM_CRUSH_DAMAGE_PERCENT_MOD,
|
||||||
|
STATS_ITEM_THRUST_DAMAGE_MOD,
|
||||||
|
STATS_ITEM_THRUST_DAMAGE_PERCENT_MOD,
|
||||||
|
STATS_ITEM_ABSORB_SLASH_MOD,
|
||||||
|
STATS_ITEM_ABSORB_CRUSH_MOD,
|
||||||
|
STATS_ITEM_ABSORB_THRUST_MOD,
|
||||||
|
STATS_ITEM_ABSORB_SLASH_PERCENT_MOD,
|
||||||
|
STATS_ITEM_ABSORB_CRUSH_PERCENT_MOD,
|
||||||
|
STATS_ITEM_ABSORB_THRUST_PERCENT_MOD,
|
||||||
|
STATS_ITEM_ARMOR_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ARMORPERCENT_BYTIME_MOD,
|
||||||
|
STATS_ITEM_HP_BYTIME_MOD,
|
||||||
|
STATS_ITEM_MANA_BYTIME_MOD,
|
||||||
|
STATS_ITEM_MAXDAMAGE_BYTIME_MOD,
|
||||||
|
STATS_ITEM_MAXDAMAGE_PERCENT_BYTIME_MOD,
|
||||||
|
STATS_ITEM_STRENGTH_BYTIME_MOD,
|
||||||
|
STATS_ITEM_DEXTERITY_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ENERGY_BYTIME_MOD,
|
||||||
|
STATS_ITEM_VITALITY_BYTIME_MOD,
|
||||||
|
STATS_ITEM_TOHIT_BYTIME_MOD,
|
||||||
|
STATS_ITEM_TOHITPERCENT_BYTIME_MOD,
|
||||||
|
STATS_ITEM_COLD_DAMAGEMAX_BYTIME_MOD,
|
||||||
|
STATS_ITEM_FIRE_DAMAGEMAX_BYTIME_MOD,
|
||||||
|
STATS_ITEM_LTNG_DAMAGEMAX_BYTIME_MOD,
|
||||||
|
STATS_ITEM_POIS_DAMAGEMAX_BYTIME_MOD,
|
||||||
|
STATS_ITEM_RESIST_COLD_BYTIME_MOD,
|
||||||
|
STATS_ITEM_RESIST_FIRE_BYTIME_MOD,
|
||||||
|
STATS_ITEM_RESIST_LTNG_BYTIME_MOD,
|
||||||
|
STATS_ITEM_RESIST_POIS_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ABSORB_COLD_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ABSORB_FIRE_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ABSORB_LTNG_BYTIME_MOD,
|
||||||
|
STATS_ITEM_ABSORB_POIS_BYTIME_MOD,
|
||||||
|
STATS_ITEM_FIND_GOLD_BYTIME_MOD,
|
||||||
|
STATS_ITEM_FIND_MAGIC_BYTIME_MOD,
|
||||||
|
STATS_ITEM_REGENSTAMINA_BYTIME_MOD,
|
||||||
|
STATS_ITEM_STAMINA_BYTIME_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_DEMON_BYTIME_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_UNDEAD_BYTIME_MOD,
|
||||||
|
STATS_ITEM_TOHIT_DEMON_BYTIME_MOD,
|
||||||
|
STATS_ITEM_TOHIT_UNDEAD_BYTIME_MOD,
|
||||||
|
STATS_ITEM_CRUSHINGBLOW_BYTIME_MOD,
|
||||||
|
STATS_ITEM_OPENWOUNDS_BYTIME_MOD,
|
||||||
|
STATS_ITEM_KICK_DAMAGE_BYTIME_MOD,
|
||||||
|
STATS_ITEM_DEADLYSTRIKE_BYTIME_MOD,
|
||||||
|
STATS_ITEM_FIND_GEMS_BYTIME_MOD,
|
||||||
|
STATS_ITEM_PIERCE_COLD_MOD,
|
||||||
|
STATS_ITEM_PIERCE_FIRE_MOD,
|
||||||
|
STATS_ITEM_PIERCE_LTNG_MOD,
|
||||||
|
STATS_ITEM_PIERCE_POIS_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_VS_MONSTER_MOD,
|
||||||
|
STATS_ITEM_DAMAGE_PERCENT_VS_MONSTER_MOD,
|
||||||
|
STATS_ITEM_TOHIT_VS_MONSTER_MOD,
|
||||||
|
STATS_ITEM_TOHIT_PERCENT_VS_MONSTER_MOD,
|
||||||
|
STATS_ITEM_AC_VS_MONSTER_MOD,
|
||||||
|
STATS_ITEM_AC_PERCENT_VS_MONSTER_MOD,
|
||||||
|
INDESTRUCTIBLE,
|
||||||
|
STATS_ITEM_CHARGED_SKILL_MOD
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2ItemFlags
|
||||||
|
{
|
||||||
|
ITEMFLAG_NEWITEM = 0x00000001,
|
||||||
|
ITEMFLAG_MAGICAL = 0x00000010,
|
||||||
|
ITEMFLAG_SOCKETED = 0x00000800,
|
||||||
|
ITEMFLAG_EAR = 0x00001000,
|
||||||
|
ITEMFLAG_NEWITEM2 = 0x00002000,
|
||||||
|
ITEMFLAG_CHECKSECPRICE = 0x00010000,
|
||||||
|
ITEMFLAG_CHACKGAMBLEPRICE = 0x00020000,
|
||||||
|
ITEMFLAG_ETHERAL = 0x00400000,
|
||||||
|
ITEMFLAG_FROMPLAYER = 0x01000000
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2ItemTtype
|
||||||
|
{
|
||||||
|
TYPE_NONE0 = 0,
|
||||||
|
TYPE_NONE1,
|
||||||
|
TYPE_SHIELD,
|
||||||
|
TYPR_ARMOR,
|
||||||
|
TYPE_GOLD,
|
||||||
|
TYPE_BOW_QUIVER,
|
||||||
|
TYPE_CROSSBOW_QUIVER,
|
||||||
|
TYPE_PLAYER_BODY_PART,
|
||||||
|
TYPE_HERB,
|
||||||
|
TYPE_POTION,
|
||||||
|
TYPE_RING,
|
||||||
|
TYPE_ELIXIR,
|
||||||
|
TYPE_AMULET,
|
||||||
|
TYPE_CHARM,
|
||||||
|
TYPE_NOT_USED14,
|
||||||
|
TYPE_BOOTS,
|
||||||
|
TYPE_GLOVES,
|
||||||
|
TYPE_NOT_USED17,
|
||||||
|
TYPE_BOOK,
|
||||||
|
TYPE_BELT,
|
||||||
|
TYPE_GEM,
|
||||||
|
TYPE_TORCH,
|
||||||
|
TYPE_SCROLL,
|
||||||
|
TYPE_NOT_USED23,
|
||||||
|
TYPE_SCEPTER,
|
||||||
|
TYPE_WAND,
|
||||||
|
TYPE_STAFF,
|
||||||
|
TYPE_BOW,
|
||||||
|
TYPE_AXE,
|
||||||
|
TYPE_CLUB,
|
||||||
|
TYPE_SWORD,
|
||||||
|
TYPE_HAMMER,
|
||||||
|
TYPE_KNIFE,
|
||||||
|
TYPE_SPEAR,
|
||||||
|
TYPE_POLEARM,
|
||||||
|
TYPE_CROSSBOW,
|
||||||
|
TYPE_MACE,
|
||||||
|
TYPE_HELM,
|
||||||
|
TYPE_MISSILE_POTION,
|
||||||
|
TYPE_QUEST,
|
||||||
|
TYPE_BODY_PART,
|
||||||
|
TYPE_KEY,
|
||||||
|
TYPE_THROWING_KNIFE,
|
||||||
|
TYPE_THROWING_AXE,
|
||||||
|
TYPE_JAVELIN,
|
||||||
|
TYPE_WEAPON,
|
||||||
|
TYPE_MELEE_WEAPON,
|
||||||
|
TYPE_MISSILE_WEAPON,
|
||||||
|
TYPE_THROWN_WEAPON,
|
||||||
|
TYPE_COMBO_WEAPON,
|
||||||
|
TYPE_ANY_ARMOR,
|
||||||
|
TYPE_ANY_SHIELD,
|
||||||
|
TYPE_MISCELLANEOUS,
|
||||||
|
TYPE_SOCKET_FILLER,
|
||||||
|
TYPE_SECOND_HAND,
|
||||||
|
TYPE_STAVES_AND_RODS,
|
||||||
|
TYPE_MISSILE,
|
||||||
|
TYPE_BLUNT,
|
||||||
|
//Expansion
|
||||||
|
TYPE_JEWEL,
|
||||||
|
TYPE_CLASS_SPECIFIC,
|
||||||
|
TYPE_AMAZON_ITEM,
|
||||||
|
TYPE_BARBARIAN_ITEM,
|
||||||
|
TYPE_NECROMANCER_ITEM,
|
||||||
|
TYPE_PALADIN_ITEM,
|
||||||
|
TYPE_SORCERESS_ITEM,
|
||||||
|
TYPE_ASSASSIN_ITEM,
|
||||||
|
TYPE_DRUID_ITEM,
|
||||||
|
TYPE_HAND_TO_HAND,
|
||||||
|
TYPE_ORB,
|
||||||
|
TYPE_VOODOO_HEADS,
|
||||||
|
TYPE_AURIC_SHIELDS,
|
||||||
|
TYPE_PRIMAL_HELM,
|
||||||
|
TYPE_PELT,
|
||||||
|
TYPE_CLOAK,
|
||||||
|
TYPE_RUNE,
|
||||||
|
TYPE_CIRCLET,
|
||||||
|
TYPE_HEALING_POTION,
|
||||||
|
TYPE_MANA_POTION,
|
||||||
|
TYPE_REJUV_POTION,
|
||||||
|
TYPE_STAMINA_POTION,
|
||||||
|
TYPE_ANTIDOTE_POTION,
|
||||||
|
TYPE_THAWING_POTION,
|
||||||
|
TYPE_SMALL_CHARM,
|
||||||
|
TYPE_MEDIUM_CHARM,
|
||||||
|
TYPE_LARGE_CHARM,
|
||||||
|
TYPE_AMAZON_BOW,
|
||||||
|
TYPE_AMAZON_SPEAR,
|
||||||
|
TYPE_AMAZON_JAVELIN,
|
||||||
|
TYPE_HAND_TO_HAND2,
|
||||||
|
TYPE_MAGIC_BOW_QUIVER,
|
||||||
|
TYPE_MAGIC_CROSSBOW_QUIVER,
|
||||||
|
TYPE_CHIPPED_GEM,
|
||||||
|
TYPE_FLAWED_GEM,
|
||||||
|
TYPE_STANDARD_GEM,
|
||||||
|
TYPE_FLAWLESS_GEM,
|
||||||
|
TYPE_PERFECT_GEM,
|
||||||
|
TYPE_AMETHYST,
|
||||||
|
TYPE_DIAMOND,
|
||||||
|
TYPE_EMERALD,
|
||||||
|
TYPE_RUBY,
|
||||||
|
TYPE_SAPPHIRE,
|
||||||
|
TYPE_TOPAZ,
|
||||||
|
TYPE_SKULL
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2ItemQuality
|
||||||
|
{
|
||||||
|
ITEMQUALITY_CRACKED = 1,
|
||||||
|
ITEMQUALITY_NORMAL,
|
||||||
|
ITEMQUALITY_SUPERIOR,
|
||||||
|
ITEMQUALITY_MAGIC,
|
||||||
|
ITEMQUALITY_SET,
|
||||||
|
ITEMQUALITY_RARE,
|
||||||
|
ITEMQUALITY_UNIQUE,
|
||||||
|
ITEMQUALITY_CRAFTED,
|
||||||
|
ITEMQUALITY_TEMPERED
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2UnitType
|
||||||
|
{
|
||||||
|
UNIT_PLAYER = 0,
|
||||||
|
UNIT_MONSTER,
|
||||||
|
UNIT_OBJECT,
|
||||||
|
UNIT_MISSILE,
|
||||||
|
UNIT_ITEM,
|
||||||
|
UNIT_ROOMTILE
|
||||||
|
};
|
||||||
|
|
||||||
|
enum D2BodyLoc
|
||||||
|
{
|
||||||
|
LOC_HEAD =1,
|
||||||
|
LOC_NECK,
|
||||||
|
LOC_TORS,
|
||||||
|
LOC_RARM,
|
||||||
|
LOC_LARM,
|
||||||
|
LOC_LRIN,
|
||||||
|
LOC_RRIN,
|
||||||
|
LOC_BELT,
|
||||||
|
LOC_FEET,
|
||||||
|
LOC_GLOV,
|
||||||
|
LOC_RALT,
|
||||||
|
LOC_LALT
|
||||||
|
};
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
54
Commons/updatingConst.h
Normal file
54
Commons/updatingConst.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating Client and Server constantes.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum UpdateClientConst
|
||||||
|
{
|
||||||
|
UC_SELECT_STASH=0x18,
|
||||||
|
UC_SHARED_GOLD,
|
||||||
|
UC_ADD_STAT,
|
||||||
|
UC_ADD_SYNERGY,
|
||||||
|
UC_TEST1,
|
||||||
|
UC_TEST2,
|
||||||
|
UC_TEST3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum UpdateServerConst
|
||||||
|
{
|
||||||
|
US_UNASSIGN_STR_POINT=0x10,//Don't change these first 8 value
|
||||||
|
US_UNASSIGN_ENE_POINT,
|
||||||
|
US_UNASSIGN_DEX_POINT,
|
||||||
|
US_UNASSIGN_VIT_POINT,
|
||||||
|
US_UNASSIGN_STR_POINTS,
|
||||||
|
US_UNASSIGN_ENE_POINTS,
|
||||||
|
US_UNASSIGN_DEX_POINTS,
|
||||||
|
US_UNASSIGN_VIT_POINTS,
|
||||||
|
US_UNASSIGN_SKILLS,
|
||||||
|
US_SELECT_PREVIOUS,
|
||||||
|
US_SELECT_NEXT,
|
||||||
|
US_SELECT_SELF,
|
||||||
|
US_SELECT_SHARED,
|
||||||
|
US_SELECT_PREVIOUS_INDEX,
|
||||||
|
US_SELECT_NEXT_INDEX,
|
||||||
|
US_SELECT_PREVIOUS2,
|
||||||
|
US_SELECT_NEXT2,
|
||||||
|
US_SELECT_PREVIOUS_INDEX2,
|
||||||
|
US_SELECT_NEXT_INDEX2,
|
||||||
|
US_WORLDEVENT,
|
||||||
|
US_STARTSAVE,
|
||||||
|
US_MAXGOLD,
|
||||||
|
US_PUTGOLD,
|
||||||
|
US_TAKEGOLD,
|
||||||
|
|
||||||
|
//For CB
|
||||||
|
US_TEST1,
|
||||||
|
US_TEST2,
|
||||||
|
US_TEST3
|
||||||
|
};
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
104
PlugY/BigStash.cpp
Normal file
104
PlugY/BigStash.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Use a more big stash
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "plugYFiles.h" // Install_PlugYFiles()
|
||||||
|
|
||||||
|
bool active_bigStash = false;
|
||||||
|
bool active_bigStash_tested = false;
|
||||||
|
|
||||||
|
const char* tradeStash_RefFile= "%s\\TradeStash";
|
||||||
|
const BYTE gridX_BB = 10;
|
||||||
|
const BYTE gridY_BB = 10;
|
||||||
|
const DWORD gridLeft_BB = 16;
|
||||||
|
const DWORD gridRight_BB = 302;
|
||||||
|
const DWORD gridTop_BB = 82;
|
||||||
|
const DWORD gridbottom_BB = 371;
|
||||||
|
|
||||||
|
InventoryBIN* STDCALL modifStashGrid(InventoryBIN* ptInventoryBin)
|
||||||
|
{
|
||||||
|
active_bigStash_tested = true;
|
||||||
|
if ( onRealm || !active_bigStash) return ptInventoryBin;
|
||||||
|
|
||||||
|
InventoryBIN* inventory=ptInventoryBin+12;
|
||||||
|
inventory->gridX = gridX_BB;
|
||||||
|
inventory->gridY = gridY_BB;
|
||||||
|
inventory->gridLeft = gridLeft_BB;
|
||||||
|
inventory->gridRight = gridRight_BB;
|
||||||
|
inventory->gridTop = gridTop_BB;
|
||||||
|
inventory->gridBottom = gridbottom_BB;
|
||||||
|
|
||||||
|
inventory = ptInventoryBin+28;
|
||||||
|
inventory->gridX = gridX_BB;
|
||||||
|
inventory->gridY = gridY_BB;
|
||||||
|
inventory->gridLeft = gridLeft_BB + 80;
|
||||||
|
inventory->gridRight = gridRight_BB + 80;
|
||||||
|
inventory->gridTop = gridTop_BB + 60;
|
||||||
|
inventory->gridBottom = gridbottom_BB + 60;
|
||||||
|
|
||||||
|
return ptInventoryBin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_modifStashGrid )
|
||||||
|
POP ESI
|
||||||
|
CALL D2CompileTxtFile
|
||||||
|
PUSH EAX
|
||||||
|
CALL modifStashGrid
|
||||||
|
JMP ESI
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_changeTradeStash )
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalTradeStash
|
||||||
|
MOV EAX,modDataDirectory
|
||||||
|
MOV DWORD PTR SS:[ESP+0x8],EAX
|
||||||
|
MOV EAX,tradeStash_RefFile
|
||||||
|
MOV DWORD PTR SS:[ESP+0x4],EAX
|
||||||
|
normalTradeStash:
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x104
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_BigStash()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlugYFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Common & D2Client for make 10x10 squares in the stash. (BigStash)\n");
|
||||||
|
|
||||||
|
// modification of stash grid
|
||||||
|
mem_seek R7(D2Common, C9F3, CA03, 14ED3, 5FCB5, 2A505, 1BDB5, 82CA5);
|
||||||
|
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
|
||||||
|
|
||||||
|
// modification of stash background
|
||||||
|
mem_seek R7(D2Client, 45B1C, 45B1C, 4C61C, A643C, 749BC, A9D7C, 8CC1C);
|
||||||
|
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
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
115
PlugY/ClientSaveFile.cpp
Normal file
115
PlugY/ClientSaveFile.cpp
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file for each characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
/*
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 0x4000
|
||||||
|
#define FILE_VERSION 0x3130 //"01"
|
||||||
|
#define FILE_SAVETYPE 0x544E4C43 //"CLNT"
|
||||||
|
|
||||||
|
|
||||||
|
BYTE * openClientSaveFile(char* name, DWORD* size)
|
||||||
|
{
|
||||||
|
char filename[512];
|
||||||
|
BYTE* data;
|
||||||
|
d2_assert(!name, "Bad file name (NULL)", __FILE__, __LINE__);
|
||||||
|
D2FogGetSavePath( filename, 512-5);
|
||||||
|
strncat(filename, name, 512 - strlen(filename) - 5);
|
||||||
|
strcat(filename, ".clt");
|
||||||
|
|
||||||
|
log_msg("Client file to read : %s\n",filename);
|
||||||
|
|
||||||
|
FILE* file = fopen(filename, "rb");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
*size = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0);
|
||||||
|
DWORD nbRead = fread(data, 1, *size, file);
|
||||||
|
fclose(file);
|
||||||
|
d2_assert(nbRead != *size , "nbRead from client save file != size", __FILE__, __LINE__);
|
||||||
|
} else {
|
||||||
|
log_msg("Can't open client save file in mode \"rb\" (is not an error if it's a new player)\n");
|
||||||
|
*size = 6;
|
||||||
|
data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0);
|
||||||
|
*((DWORD*)&data[0]) = FILE_SAVETYPE; //"CSTM"
|
||||||
|
*((WORD *)&data[4]) = FILE_VERSION;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD loadClientSaveFile()
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
DWORD size=0;
|
||||||
|
log_msg("Load client file\n");
|
||||||
|
if (!ptChar || !PCPlayerData) return 0;
|
||||||
|
|
||||||
|
BYTE* data = openClientSaveFile(PCPlayerData->name,&size);
|
||||||
|
if (!data) return 0;
|
||||||
|
|
||||||
|
DWORD curSize = 0;
|
||||||
|
|
||||||
|
log_msg("Load client file.\n");
|
||||||
|
if (*(DWORD*)&data[curSize] != FILE_SAVETYPE)
|
||||||
|
{
|
||||||
|
log_msg("loadClientSaveFile -> bad header\n");
|
||||||
|
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
curSize += 4;
|
||||||
|
|
||||||
|
if (*(WORD *)&data[curSize] != FILE_VERSION)
|
||||||
|
{
|
||||||
|
log_msg("loadClientSaveFile -> bad file version\n");
|
||||||
|
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
curSize += 2;
|
||||||
|
|
||||||
|
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD saveClientSaveFile()
|
||||||
|
{
|
||||||
|
DWORD curSize = 0;
|
||||||
|
BYTE data[BUFFER_SIZE];
|
||||||
|
char szTempName[MAX_PATH];
|
||||||
|
char szSaveName[MAX_PATH];
|
||||||
|
FILE* customSaveFile;
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
D2FogGetSavePath( (char*)data, BUFFER_SIZE);
|
||||||
|
sprintf( szTempName, "%s%s.cl~", data, PCPlayerData->name );
|
||||||
|
log_msg("Client tmp file for saving : %s\n",szTempName);
|
||||||
|
customSaveFile = fopen(szTempName, "wb+");
|
||||||
|
|
||||||
|
*(DWORD *)&data[curSize] = FILE_SAVETYPE;
|
||||||
|
curSize += 4;
|
||||||
|
*(WORD *)&data[curSize] = FILE_VERSION;
|
||||||
|
curSize += 2;
|
||||||
|
|
||||||
|
fwrite(data, curSize, 1, customSaveFile);
|
||||||
|
fclose(customSaveFile);
|
||||||
|
|
||||||
|
D2FogGetSavePath( (char*)data, BUFFER_SIZE);
|
||||||
|
sprintf( szSaveName, "%s%s.clt", data, PCPlayerData->name );
|
||||||
|
log_msg("Client save file for saving : %s\n",szSaveName);
|
||||||
|
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
|
||||||
|
DeleteFile(szSaveName);
|
||||||
|
if (!MoveFile(szTempName, szSaveName))
|
||||||
|
log_box("Could not create the client save file.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
283
PlugY/Commands.cpp
Normal file
283
PlugY/Commands.cpp
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating server.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include "updateClient.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include "newInterface_CubeListing.h"
|
||||||
|
#include "extraOptions.h"
|
||||||
|
|
||||||
|
bool active_Commands=true;
|
||||||
|
|
||||||
|
bool active_listAllCubeFormula=true;
|
||||||
|
bool active_savegame=false;
|
||||||
|
|
||||||
|
#define MAX_CMD_SIZE 200
|
||||||
|
|
||||||
|
const char * CMD_RENAME="/rename";
|
||||||
|
const char * CMD_LISTCUBEFORMULA="/listcube";
|
||||||
|
const char * CMD_SELECTPAGE="/page";
|
||||||
|
|
||||||
|
const char * CMD_RELOAD="/reload";
|
||||||
|
|
||||||
|
const char * CMD_STARTSAVE="/save";
|
||||||
|
|
||||||
|
const char * CMD_MAXGOLD="/maxgold";
|
||||||
|
|
||||||
|
const char * CMD_DISPLAY_MANA_LIFE = "/dml";
|
||||||
|
const char * CMD_DISPLAY_LIFE_MANA = "/dlm";
|
||||||
|
const char * CMD_DISPLAY_LIFE = "/dl";
|
||||||
|
const char * CMD_DISPLAY_MANA = "/dm";
|
||||||
|
|
||||||
|
/*
|
||||||
|
$+21C8 02020648 |. 6A 01 PUSH 1
|
||||||
|
$+21CA 0202064A |. 52 PUSH EDX
|
||||||
|
$+21CB 0202064B |. 57 PUSH EDI
|
||||||
|
$+21CC 0202064C |. 55 PUSH EBP
|
||||||
|
$+21CD 0202064D |. 8BC3 MOV EAX,EBX
|
||||||
|
$+21CF 0202064F |. E8 2CDEFFFF CALL D2Game.0201E480
|
||||||
|
*/
|
||||||
|
|
||||||
|
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);
|
||||||
|
D2ReloadGambleScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//6FACFFD4 |. E8 77F90000 CALL D2Client.6FADF950
|
||||||
|
|
||||||
|
void savePlayers(Unit* ptChar)
|
||||||
|
{
|
||||||
|
if (active_savegame)
|
||||||
|
D2SaveGame(PCGame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void maxGold(Unit* ptChar)
|
||||||
|
{
|
||||||
|
log_msg("maxGold\n");
|
||||||
|
|
||||||
|
DWORD maxGold = D2GetMaxGold(ptChar);
|
||||||
|
DWORD maxGoldBank = D2GetMaxGoldBank(ptChar);
|
||||||
|
DWORD playerGold = D2GetPlayerStat(ptChar, STATS_GOLD, 0);
|
||||||
|
DWORD playerGoldBank = D2GetPlayerStat(ptChar, STATS_GOLDBANK, 0);
|
||||||
|
if ( (playerGold < maxGold) || (playerGoldBank < maxGoldBank) ) {
|
||||||
|
D2AddPlayerStat( ptChar, STATS_GOLD, maxGold-playerGold, 0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_GOLDBANK, maxGoldBank-playerGoldBank, 0 );
|
||||||
|
} else {
|
||||||
|
D2AddPlayerStat( ptChar, STATS_GOLD, 100000, 0 );
|
||||||
|
}
|
||||||
|
if (active_sharedGold)
|
||||||
|
{
|
||||||
|
PCPY->sharedGold = 0xFFFFFFFF;
|
||||||
|
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void putGold(Unit* ptChar, DWORD amount)
|
||||||
|
{
|
||||||
|
if (!active_sharedGold) return;
|
||||||
|
log_msg("putGold : %d\n", amount);
|
||||||
|
|
||||||
|
DWORD playerGold = D2GetPlayerStat(ptChar, STATS_GOLD, 0);
|
||||||
|
DWORD toAdd = 0xFFFFFFFF - PCPY->sharedGold;
|
||||||
|
if (playerGold < toAdd)
|
||||||
|
toAdd = playerGold;
|
||||||
|
if (amount && (toAdd > amount))
|
||||||
|
toAdd = amount;
|
||||||
|
D2AddPlayerStat(ptChar, STATS_GOLD, 0-toAdd, 0);
|
||||||
|
PCPY->sharedGold += toAdd;
|
||||||
|
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void takeGold(Unit* ptChar, DWORD amount)
|
||||||
|
{
|
||||||
|
if (!active_sharedGold) return;
|
||||||
|
log_msg("takeGold : %d\n", amount);
|
||||||
|
|
||||||
|
DWORD maxGold = D2GetMaxGold(ptChar) - D2GetPlayerStat(ptChar, STATS_GOLD, 0);
|
||||||
|
// DWORD maxGoldBank = D2GetMaxGoldBank(ptChar) - D2GetPlayerStat(ptChar, STATS_GOLDBANK, 0);
|
||||||
|
DWORD toAdd = maxGold < PCPY->sharedGold ? maxGold : PCPY->sharedGold;
|
||||||
|
if (amount && (toAdd > amount))
|
||||||
|
toAdd = amount;
|
||||||
|
D2AddPlayerStat( ptChar, STATS_GOLD, toAdd, 0 );
|
||||||
|
PCPY->sharedGold -= toAdd;
|
||||||
|
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void updateSharedGold(DWORD goldAmount)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
log_msg("SharedGold = %d\n",goldAmount);
|
||||||
|
PCPY->sharedGold = goldAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
int STDCALL commands (char* ptText)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
char command[MAX_CMD_SIZE];
|
||||||
|
ZeroMemory(command,MAX_CMD_SIZE);
|
||||||
|
strncpy(command,ptText,MAX_CMD_SIZE-1);
|
||||||
|
strlwr(command);
|
||||||
|
|
||||||
|
if (!strncmp(command,CMD_RENAME,strlen(CMD_RENAME)))
|
||||||
|
{
|
||||||
|
if (!active_multiPageStash) return 1;
|
||||||
|
char* param = &command[strlen(CMD_RENAME)];
|
||||||
|
DWORD len = strlen(param);
|
||||||
|
if (len && (param[0] != ' ')) return 1;
|
||||||
|
|
||||||
|
Stash* ptStash = PCPY->currentStash;
|
||||||
|
if (!ptStash) return 0;
|
||||||
|
if (len>1)
|
||||||
|
{
|
||||||
|
D2FogMemDeAlloc(ptStash->name,__FILE__,__LINE__,0);
|
||||||
|
ptStash->name = (char *)malloc(len);//D2FogMemAlloc(len,__FILE__,__LINE__,0);
|
||||||
|
strcpy(ptStash->name,¶m[1]);
|
||||||
|
} else {
|
||||||
|
D2FogMemDeAlloc(ptStash->name,__FILE__,__LINE__,0);
|
||||||
|
ptStash->name = NULL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_LISTCUBEFORMULA))
|
||||||
|
{
|
||||||
|
if (!active_listAllCubeFormula) return 1;
|
||||||
|
listAllCubeFormula();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(command,CMD_SELECTPAGE,strlen(CMD_SELECTPAGE)))
|
||||||
|
{
|
||||||
|
if (!active_newInterfaces) return 1;
|
||||||
|
GoStatPage(atoi(&command[strlen(CMD_SELECTPAGE)])-1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_RELOAD))
|
||||||
|
{
|
||||||
|
if (onRealm) return 1;
|
||||||
|
gambleReload(ptChar);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_STARTSAVE))
|
||||||
|
{
|
||||||
|
if (onRealm) return 1;
|
||||||
|
updateServer(US_STARTSAVE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_MAXGOLD))
|
||||||
|
{
|
||||||
|
if (onRealm) return 1;
|
||||||
|
updateServer(US_MAXGOLD);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_DISPLAY_LIFE))
|
||||||
|
{
|
||||||
|
active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_DISPLAY_MANA))
|
||||||
|
{
|
||||||
|
active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(command,CMD_DISPLAY_LIFE_MANA) || !strcmp(command,CMD_DISPLAY_MANA_LIFE))
|
||||||
|
{
|
||||||
|
active_AlwaysDisplayLifeMana = !active_AlwaysDisplayLifeMana;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_Commands )
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE MANAGESOUNDCHAOSDEBUG
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
CALL commands
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ MANAGESOUNDCHAOSDEBUG
|
||||||
|
ADD DWORD PTR SS:[ESP],7
|
||||||
|
MANAGESOUNDCHAOSDEBUG:
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_Commands_111 )
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE MANAGESOUNDCHAOSDEBUG
|
||||||
|
PUSH ESI
|
||||||
|
CALL commands
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ MANAGESOUNDCHAOSDEBUG
|
||||||
|
ADD DWORD PTR SS:[ESP],7
|
||||||
|
MANAGESOUNDCHAOSDEBUG:
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_Commands()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_UpdateServer();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for install commands. (Commands)\n");
|
||||||
|
|
||||||
|
active_listAllCubeFormula = version_D2Common >= V110;
|
||||||
|
active_savegame = version_D2Common >= V111;
|
||||||
|
|
||||||
|
// Run custom commmand
|
||||||
|
mem_seek R7(D2Client, 2C120, 2C110, 32BDD, C1EE6, 91C16, 86926, 70AE6);
|
||||||
|
memt_byte( 0x83, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0xC08508C4 , version_D2Client >= V111 ? caller_Commands_111 : caller_Commands);
|
||||||
|
//6FB71EE6 . 83C4 08 ADD ESP,8
|
||||||
|
//6FB71EE7 . 85C0 TEST EAX,EAX
|
||||||
|
//6FB41C16 |. 83C4 08 ADD ESP,8
|
||||||
|
//6FB41C19 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FB36926 |. 83C4 08 ADD ESP,8
|
||||||
|
//6FB36929 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FB20AE6 |. 83C4 08 ADD ESP,8
|
||||||
|
//6FB20AE9 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FB20AE6 |. 83C4 08 ADD ESP,8
|
||||||
|
//6FB20AE9 |. 85C0 TEST EAX,EAX
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
489
PlugY/Common.cpp
Normal file
489
PlugY/Common.cpp
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Common functions.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
s_shifting shifting;
|
||||||
|
|
||||||
|
bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h)
|
||||||
|
{return (x>=x0) && (x<x0+l) && (y>y0-h) && (y<=y0);}
|
||||||
|
|
||||||
|
|
||||||
|
void freeMessage(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
msg->managed=1;
|
||||||
|
msg->unmanaged=0;
|
||||||
|
D2FreeWinMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LPWSTR getString(LPWSTR eng, LPWSTR esp, LPWSTR deu, LPWSTR fra, LPWSTR por, LPWSTR ita, LPWSTR jpn, LPWSTR kor, LPWSTR sin, LPWSTR chi, LPWSTR pol, LPWSTR rus)
|
||||||
|
{
|
||||||
|
switch(D2GetLang())
|
||||||
|
{
|
||||||
|
case LNG_ENG: return eng;
|
||||||
|
case LNG_ESP: return esp;
|
||||||
|
case LNG_DEU: return deu;
|
||||||
|
case LNG_FRA: return fra;
|
||||||
|
case LNG_POR: return por;
|
||||||
|
case LNG_ITA: return ita;
|
||||||
|
case LNG_JPN: return jpn;
|
||||||
|
case LNG_KOR: return kor;
|
||||||
|
case LNG_SIN: return sin;
|
||||||
|
case LNG_CHI: return chi;
|
||||||
|
case LNG_POL: return pol;
|
||||||
|
case LNG_RUS: return rus;
|
||||||
|
case LNG_DEF:
|
||||||
|
default: return eng;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define LANGUAGE(I,ENG,FRA,DEU,ITA,ESP,POL/*,CHI*/) case I : return getString(L##ENG,L##ESP,L##DEU,L##FRA,L##ENG,L##ITA,L##ENG,L##ENG,L##ENG,L##ENG,L##POL,L##ENG)
|
||||||
|
|
||||||
|
LPWSTR getTranslatedString(int stringID)
|
||||||
|
{
|
||||||
|
switch(stringID)
|
||||||
|
{
|
||||||
|
/* LANGUAGE2( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||||
|
"+Alt: ;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
// "+Alt: \x91CD\x5206\x914D;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
"+Alt: Désallocation, +Shift: par %d points,",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: um %d Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||||
|
"+Alt: Quita, +Shift: por %d puntos",
|
||||||
|
"+Alt: \37325\20998\37197;,+Shift:%d \28857\25968");
|
||||||
|
*/
|
||||||
|
LANGUAGE( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||||
|
"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
"+Alt: Désallocation, +Shift: par %d points",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: um %d Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||||
|
"+Alt: Quita, +Shift: por %d puntos",
|
||||||
|
"+Alt: Odejmij, +Shift: %d punktów");
|
||||||
|
// "+Alt: ????, +Shift: %d ??");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STATS_UNASSIGN_WITHOUT_LIMIT,
|
||||||
|
"+Alt: Unassign, +Shift: all remaining points",
|
||||||
|
"+Alt: Désallocation, +Shift: Tous les points restants",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: Alle verbleibenden Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti",
|
||||||
|
"+Alt: Quita, +Shift: Todos los puntos restantes",
|
||||||
|
"+Alt: Odejmij, +Shift: wszystkie pozostale punkty");
|
||||||
|
// "+Alt: ????, +Shift: ???");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STATS_BASE_MIN,
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Basiswert: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Bazowo: %d (Minimum: %d)");
|
||||||
|
// "??: %d(??: %d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SKILLS_UNASSIGN,
|
||||||
|
"Un-allocate all skills points",
|
||||||
|
"Désalloue tous les points d'aptitudes",
|
||||||
|
"Alle Fertigkeitspunkte zurücksetzen",
|
||||||
|
"Rimuovi tutte le abilità",
|
||||||
|
"Quita todos los puntos de habilidades",
|
||||||
|
"Rozdaj od nowa wszystkie punkty umiejetnosci");
|
||||||
|
// "????????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_PREVIOUS_PAGE,
|
||||||
|
"Previous Page (+shift: First Page)",
|
||||||
|
"Page précédente (+shift: Première page)",
|
||||||
|
"Vorherige Seite (+shift: Erste Seite)",
|
||||||
|
"Pagina Precedente (+shift: Prima Pagina)",
|
||||||
|
"Pagina anterior (+shift: Primera Pagina)",
|
||||||
|
"Poprzednia Strona (+shift: Pierwsza Strona)");
|
||||||
|
// "??? (+shift: ??)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_NEXT_PAGE,
|
||||||
|
"Next Page (+shift: Last not empty Page)",
|
||||||
|
"Page suivante (+shift: Dernière page non vide)",
|
||||||
|
"Nächste Seite (+shift: Letzte nicht leere Seite )",
|
||||||
|
"Pagina Successiva (+shift: Ultima Pagina non vuota)",
|
||||||
|
"Pagina Siguiente (+shift: Ultima pagina non vacia)",
|
||||||
|
"Nastepna Strona (+shift: Ostatnia nie pusta Strona)");
|
||||||
|
// "??? (+shift: ?????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TOGGLE_TO_PERSONAL,
|
||||||
|
"Toggle to Personal Stash",
|
||||||
|
"Voir coffre personnel",
|
||||||
|
"Wechselt zum persönlichen Goldschatz",
|
||||||
|
"Vai all'Inventario Personale",
|
||||||
|
"Ver el cofre personal",
|
||||||
|
"Przejdz do Skrzyni Osobistej");
|
||||||
|
// "????????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TOGGLE_TO_SHARED,
|
||||||
|
"Toggle to Shared Stash",
|
||||||
|
"Voir coffre partagé",
|
||||||
|
"Wechselt zum gemeinsamen Goldschatz",
|
||||||
|
"Vai all'Inventario Condiviso",
|
||||||
|
"Ver el cofre compartido",
|
||||||
|
"Przejdz do Skrzyni Wspólnej");
|
||||||
|
// "????????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_PREVIOUS_INDEX,
|
||||||
|
"Previous Index : by %d Pages (+Shift: %d)",
|
||||||
|
"Index précédent : par %d pages (+shift: %d)",
|
||||||
|
"Vorheriger Index: in %d Seiten (+shift: %d)",
|
||||||
|
"Schermata Precedente : Indietro di %d Pagine (+Shift: %d)",
|
||||||
|
"Indice anterior : por %d paginas (+shift: %d)",
|
||||||
|
"Poprzednia Strona : po %d Stron (+Shift: %d)");
|
||||||
|
// "???? : %d ? (+Shift:%d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_NEXT_INDEX,
|
||||||
|
"Next Index : by %d Pages (+shift: %d)",
|
||||||
|
"Index suivant : par %d pages (+shift: %d)",
|
||||||
|
"Nächster Index: in %d Seiten (+shift: %d)",
|
||||||
|
"Schermata Successiva : Avanti di %d Pagine (+shift: %d)",
|
||||||
|
"Indice siguiente : por %d paginas (+shift: %d)",
|
||||||
|
"Nastepna Strona : po %d Stron (+shift: %d)");
|
||||||
|
// "???? : %d ? (+shift:%d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PUT_GOLD,
|
||||||
|
"Put Gold",
|
||||||
|
"Poser de l'Or",
|
||||||
|
"Gib Gold",
|
||||||
|
"Immetti Oro",
|
||||||
|
"Poner oro",
|
||||||
|
"Zdeponuj Zloto");
|
||||||
|
// "????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TAKE_GOLD,
|
||||||
|
"Take Gold",
|
||||||
|
"Prendre de l'Or",
|
||||||
|
"Nehme Gold",
|
||||||
|
"Ritira Oro",
|
||||||
|
"Tomar oro",
|
||||||
|
"Wyplac zloto");
|
||||||
|
// "????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PERSONAL_PAGE_NUMBER,
|
||||||
|
"Personal Page n°%u",
|
||||||
|
"Page perso n°%u",
|
||||||
|
"Persönliche Seite n°%u",
|
||||||
|
"Pagina Personale n°%u",
|
||||||
|
"Pagina personal n°%u",
|
||||||
|
"Strona Osobista n°%u");
|
||||||
|
// "????? n°%u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SHARED_PAGE_NUMBER,
|
||||||
|
"Shared Page n°%u",
|
||||||
|
"Page partagée n°%u",
|
||||||
|
"Gemeinsame Seite n°%u",
|
||||||
|
"Pagina Condivisa n°%u",
|
||||||
|
"Pagina personal n°%u",
|
||||||
|
"Strona Wspólna n°%u");
|
||||||
|
// "????? n°%u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_NO_SELECTED_PAGE,
|
||||||
|
"No selected page",
|
||||||
|
"Aucune page sélectionnée",
|
||||||
|
"Keine ausgewählte Seite",
|
||||||
|
"Nessuna pagina selezionata",
|
||||||
|
"Ninguna pagina seleccionada",
|
||||||
|
"Nie zaznaczono strony");
|
||||||
|
// "????");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SHARED_GOLD_QUANTITY,
|
||||||
|
"Shared Gold : %u",
|
||||||
|
"Or partagé : %u",
|
||||||
|
"Gemeinsamen Gold : %u",
|
||||||
|
"Oro Condiviso : %u",
|
||||||
|
"Oro compartido : %u",
|
||||||
|
"Wspólne Zloto : %u");
|
||||||
|
// "????: %u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PREVIOUS_PAGE,
|
||||||
|
"Previous Page",
|
||||||
|
"Page précédente",
|
||||||
|
"Vorherige Seite",
|
||||||
|
"Pagina Precedente",
|
||||||
|
"Pagina anterior",
|
||||||
|
"Poprzednia Strona");
|
||||||
|
// "???");
|
||||||
|
|
||||||
|
LANGUAGE( STR_NEXT_PAGE,
|
||||||
|
"Next Page",
|
||||||
|
"Page suivante",
|
||||||
|
"Nächste Seite",
|
||||||
|
"Pagina Successiva",
|
||||||
|
"Pagina siguiente",
|
||||||
|
"Nastepna Strona");
|
||||||
|
// "???");
|
||||||
|
|
||||||
|
default : return L"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*=================================================================*/
|
||||||
|
|
||||||
|
const char* SNONE="";
|
||||||
|
const char* c_shie[3]={"Shield (Not Class Specific)",SNONE,SNONE};
|
||||||
|
const char* c_tors[3]={"Body Armor",SNONE,SNONE};
|
||||||
|
const char* c_gold[3]={"Gold",SNONE,SNONE};
|
||||||
|
const char* c_bowq[3]={"Arrow",SNONE,SNONE};
|
||||||
|
const char* c_xboq[3]={"Bolt",SNONE,SNONE};
|
||||||
|
const char* c_play[3]={"Ear",SNONE,SNONE};
|
||||||
|
const char* c_herb[3]={"Herb",SNONE,SNONE};
|
||||||
|
const char* c_poti[3]={"Potion",SNONE,SNONE};
|
||||||
|
const char* c_ring[3]={"Ring",SNONE,SNONE};
|
||||||
|
const char* c_elix[3]={"Elixir",SNONE,SNONE};
|
||||||
|
const char* c_amul[3]={"Amulet",SNONE,SNONE};
|
||||||
|
const char* c_char[3]={"Charm",SNONE,SNONE};
|
||||||
|
const char* c_boot[3]={"Boot",SNONE,SNONE};
|
||||||
|
const char* c_glov[3]={"Glove",SNONE,SNONE};
|
||||||
|
const char* c_book[3]={"Book",SNONE,SNONE};
|
||||||
|
const char* c_belt[3]={"Belt",SNONE,SNONE};
|
||||||
|
const char* c_gem[3]={"Gem",SNONE,SNONE};
|
||||||
|
const char* c_torc[3]={"Torch",SNONE,SNONE};
|
||||||
|
const char* c_scro[3]={"Scroll",SNONE,SNONE};
|
||||||
|
const char* c_scep[3]={"Scepter",SNONE,SNONE};
|
||||||
|
const char* c_wand[3]={"Wand",SNONE,SNONE};
|
||||||
|
const char* c_staf[3]={"Staff",SNONE,SNONE};
|
||||||
|
const char* c_bow[3]={"Bow",SNONE,SNONE};
|
||||||
|
const char* c_axe[3]={"Axe",SNONE,SNONE};
|
||||||
|
const char* c_club[3]={"Club",SNONE,SNONE};
|
||||||
|
const char* c_swor[3]={"Sword",SNONE,SNONE};
|
||||||
|
const char* c_hamm[3]={"Hammer",SNONE,SNONE};
|
||||||
|
const char* c_knif[3]={"Knife",SNONE,SNONE};
|
||||||
|
const char* c_spea[3]={"Spear",SNONE,SNONE};
|
||||||
|
const char* c_pole[3]={"Polearm",SNONE,SNONE};
|
||||||
|
const char* c_xbow[3]={"Crossbow",SNONE,SNONE};
|
||||||
|
const char* c_mace[3]={"Mace",SNONE,SNONE};
|
||||||
|
const char* c_helm[3]={"Helm",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* c_tpot[3]={"Missile Potion",SNONE,SNONE};
|
||||||
|
const char* c_ques[3]={"Quest Item",SNONE,SNONE};
|
||||||
|
const char* c_body[3]={"Body Part",SNONE,SNONE};
|
||||||
|
const char* c_key[3]={"Key",SNONE,SNONE};
|
||||||
|
const char* c_tkni[3]={"Throwing Knife",SNONE,SNONE};
|
||||||
|
const char* c_taxe[3]={"Throwing Axe",SNONE,SNONE};
|
||||||
|
const char* c_jave[3]={"Javelin",SNONE,SNONE};
|
||||||
|
const char* c_weap[3]={"Weapon",SNONE,SNONE};
|
||||||
|
const char* c_mele[3]={"Melee Weapon",SNONE,SNONE};
|
||||||
|
const char* c_miss[3]={"Missile Weapon",SNONE,SNONE};
|
||||||
|
const char* c_thro[3]={"Throwing Weapon",SNONE,SNONE};
|
||||||
|
const char* c_comb[3]={"Combo Weapon",SNONE,SNONE};
|
||||||
|
const char* c_armo[3]={"Armor",SNONE,SNONE};
|
||||||
|
const char* c_shld[3]={"Any Shield",SNONE,SNONE};
|
||||||
|
const char* c_misc[3]={"Miscellaneous",SNONE,SNONE};
|
||||||
|
const char* c_sock[3]={"Socket Filler",SNONE,SNONE};
|
||||||
|
const char* c_seco[3]={"Second Hand Item",SNONE,SNONE};
|
||||||
|
const char* c_rod[3]={"Staves And Rods",SNONE,SNONE};
|
||||||
|
const char* c_misl[3]={"Missile",SNONE,SNONE};
|
||||||
|
const char* c_blun[3]={"Blunt",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* c_jewl[3]={"Jewel",SNONE,SNONE};
|
||||||
|
const char* c_clas[3]={"Class Specific",SNONE,SNONE};
|
||||||
|
const char* c_amaz[3]={"Amazon Item",SNONE,SNONE};
|
||||||
|
const char* c_barb[3]={"Barbarian Item",SNONE,SNONE};
|
||||||
|
const char* c_necr[3]={"Necromancer Item",SNONE,SNONE};
|
||||||
|
const char* c_pala[3]={"Paladin Item",SNONE,SNONE};
|
||||||
|
const char* c_sorc[3]={"Sorceress Item",SNONE,SNONE};
|
||||||
|
const char* c_assn[3]={"Assassin Item",SNONE,SNONE};
|
||||||
|
const char* c_drui[3]={"Druid Item",SNONE,SNONE};
|
||||||
|
const char* c_h2h[3]={"Claw",SNONE,SNONE};
|
||||||
|
const char* c_orb[3]={"Orb",SNONE,SNONE};
|
||||||
|
const char* c_head[3]={"Voodoo Heads",SNONE,SNONE};
|
||||||
|
const char* c_ashd[3]={"Paladin Shield",SNONE,SNONE};
|
||||||
|
const char* c_phlm[3]={"Barbarian Helm",SNONE,SNONE};
|
||||||
|
const char* c_pelt[3]={"Druid Helm",SNONE,SNONE};
|
||||||
|
const char* c_cloa[3]={"Cloak",SNONE,SNONE};
|
||||||
|
const char* c_rune[3]={"Rune",SNONE,SNONE};
|
||||||
|
const char* c_circ[3]={"Circlet",SNONE,SNONE};
|
||||||
|
const char* c_hpot[3]={"Healing Potion",SNONE,SNONE};
|
||||||
|
const char* c_mpot[3]={"Mana Potion",SNONE,SNONE};
|
||||||
|
const char* c_rpot[3]={"Rejuvenation potion",SNONE,SNONE};
|
||||||
|
const char* c_spot[3]={"Stamina Potion",SNONE,SNONE};
|
||||||
|
const char* c_apot[3]={"Antidote Potion",SNONE,SNONE};
|
||||||
|
const char* c_wpot[3]={"Thawing Potion",SNONE,SNONE};
|
||||||
|
const char* c_scha[3]={"Small Charm",SNONE,SNONE};
|
||||||
|
const char* c_mcha[3]={"Large Charm",SNONE,SNONE};
|
||||||
|
const char* c_lcha[3]={"Grand Charm",SNONE,SNONE};
|
||||||
|
const char* c_abow[3]={"Amazon Bow",SNONE,SNONE};
|
||||||
|
const char* c_aspe[3]={"Amazon Spear",SNONE,SNONE};
|
||||||
|
const char* c_ajav[3]={"Amazon Javelin",SNONE,SNONE};
|
||||||
|
const char* c_h2h2[3]={"Assassin Claw",SNONE,SNONE};
|
||||||
|
const char* c_mboq[3]={"Magic Arrow",SNONE,SNONE};
|
||||||
|
const char* c_mxbq[3]={"Magic Bolt",SNONE,SNONE};
|
||||||
|
const char* c_gem0[3]={"Chipped Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem1[3]={"Flawed Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem2[3]={"Normal Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem3[3]={"Flawless Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem4[3]={"Perfect Gem",SNONE,SNONE};
|
||||||
|
const char* c_gema[3]={"Amethyst",SNONE,SNONE};
|
||||||
|
const char* c_gemd[3]={"Diamond",SNONE,SNONE};
|
||||||
|
const char* c_geme[3]={"Emerald",SNONE,SNONE};
|
||||||
|
const char* c_gemr[3]={"Ruby",SNONE,SNONE};
|
||||||
|
const char* c_gems[3]={"Sapphire",SNONE,SNONE};
|
||||||
|
const char* c_gemt[3]={"Topaz",SNONE,SNONE};
|
||||||
|
const char* c_gemz[3]={"Skull",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* getTypeString (DWORD code)
|
||||||
|
{
|
||||||
|
DWORD lang = 0;//D2GetLang();
|
||||||
|
if ((lang == LNG_FRA) || (lang == LNG_DEU)) lang--;
|
||||||
|
else lang = 0;
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case BIN('s','h','i','e') : return c_shie[0];
|
||||||
|
case BIN('t','o','r','s') : return c_tors[0];
|
||||||
|
case BIN('g','o','l','d') : return c_gold[0];
|
||||||
|
case BIN('b','o','w','q') : return c_bowq[0];
|
||||||
|
case BIN('x','b','o','q') : return c_xboq[0];
|
||||||
|
case BIN('p','l','a','y') : return c_play[0];
|
||||||
|
case BIN('h','e','r','b') : return c_herb[0];
|
||||||
|
case BIN('p','o','t','i') : return c_poti[0];
|
||||||
|
case BIN('r','i','n','g') : return c_ring[0];
|
||||||
|
case BIN('e','l','i','x') : return c_elix[0];
|
||||||
|
case BIN('a','m','u','l') : return c_amul[0];
|
||||||
|
case BIN('c','h','a','r') : return c_char[0];
|
||||||
|
case BIN('b','o','o','t') : return c_boot[0];
|
||||||
|
case BIN('g','l','o','v') : return c_glov[0];
|
||||||
|
case BIN('b','o','o','k') : return c_book[0];
|
||||||
|
case BIN('b','e','l','t') : return c_belt[0];
|
||||||
|
case BIN('g','e','m',' ') : return c_gem[0];
|
||||||
|
case BIN('t','o','r','c') : return c_torc[0];
|
||||||
|
case BIN('s','c','r','o') : return c_scro[0];
|
||||||
|
case BIN('s','c','e','p') : return c_scep[0];
|
||||||
|
case BIN('w','a','n','d') : return c_wand[0];
|
||||||
|
case BIN('s','t','a','f') : return c_staf[0];
|
||||||
|
case BIN('b','o','w',' ') : return c_bow[0];
|
||||||
|
case BIN('a','x','e',' ') : return c_axe[0];
|
||||||
|
case BIN('c','l','u','b') : return c_club[0];
|
||||||
|
case BIN('s','w','o','r') : return c_swor[0];
|
||||||
|
case BIN('h','a','m','m') : return c_hamm[0];
|
||||||
|
case BIN('k','n','i','f') : return c_knif[0];
|
||||||
|
case BIN('s','p','e','a') : return c_spea[0];
|
||||||
|
case BIN('p','o','l','e') : return c_pole[0];
|
||||||
|
case BIN('x','b','o','w') : return c_xbow[0];
|
||||||
|
case BIN('m','a','c','e') : return c_mace[0];
|
||||||
|
case BIN('h','e','l','m') : return c_helm[0];
|
||||||
|
case BIN('t','p','o','t') : return c_tpot[0];
|
||||||
|
case BIN('q','u','e','s') : return c_ques[0];
|
||||||
|
case BIN('b','o','d','y') : return c_body[0];
|
||||||
|
case BIN('k','e','y',' ') : return c_key[0];
|
||||||
|
case BIN('t','k','n','i') : return c_tkni[0];
|
||||||
|
case BIN('t','a','x','e') : return c_taxe[0];
|
||||||
|
case BIN('j','a','v','e') : return c_jave[0];
|
||||||
|
case BIN('w','e','a','p') : return c_weap[0];
|
||||||
|
case BIN('m','e','l','e') : return c_mele[0];
|
||||||
|
case BIN('m','i','s','s') : return c_miss[0];
|
||||||
|
case BIN('t','h','r','o') : return c_thro[0];
|
||||||
|
case BIN('c','o','m','b') : return c_comb[0];
|
||||||
|
case BIN('a','r','m','o') : return c_armo[0];
|
||||||
|
case BIN('s','h','l','d') : return c_shld[0];
|
||||||
|
case BIN('m','i','s','c') : return c_misc[0];
|
||||||
|
case BIN('s','o','c','k') : return c_sock[0];
|
||||||
|
case BIN('s','e','c','o') : return c_seco[0];
|
||||||
|
case BIN('r','o','d',' ') : return c_rod[0];
|
||||||
|
case BIN('m','i','s','l') : return c_misl[0];
|
||||||
|
case BIN('b','l','u','n') : return c_blun[0];
|
||||||
|
case BIN('j','e','w','l') : return c_jewl[0];
|
||||||
|
case BIN('c','l','a','s') : return c_clas[0];
|
||||||
|
case BIN('a','m','a','z') : return c_amaz[0];
|
||||||
|
case BIN('b','a','r','b') : return c_barb[0];
|
||||||
|
case BIN('n','e','c','r') : return c_necr[0];
|
||||||
|
case BIN('p','a','l','a') : return c_pala[0];
|
||||||
|
case BIN('s','o','r','c') : return c_sorc[0];
|
||||||
|
case BIN('a','s','s','n') : return c_assn[0];
|
||||||
|
case BIN('d','r','u','i') : return c_drui[0];
|
||||||
|
case BIN('h','2','h',' ') : return c_h2h[0];
|
||||||
|
case BIN('h','2','h','2') : return c_h2h2[0];
|
||||||
|
case BIN('o','r','b',' ') : return c_orb[0];
|
||||||
|
case BIN('h','e','a','d') : return c_head[0];
|
||||||
|
case BIN('a','s','h','d') : return c_ashd[0];
|
||||||
|
case BIN('p','h','l','m') : return c_phlm[0];
|
||||||
|
case BIN('p','e','l','t') : return c_pelt[0];
|
||||||
|
case BIN('c','l','o','a') : return c_cloa[0];
|
||||||
|
case BIN('r','u','n','e') : return c_rune[0];
|
||||||
|
case BIN('c','i','r','c') : return c_circ[0];
|
||||||
|
case BIN('h','p','o','t') : return c_hpot[0];
|
||||||
|
case BIN('m','p','o','t') : return c_mpot[0];
|
||||||
|
case BIN('r','p','o','t') : return c_rpot[0];
|
||||||
|
case BIN('s','p','o','t') : return c_spot[0];
|
||||||
|
case BIN('a','p','o','t') : return c_apot[0];
|
||||||
|
case BIN('w','p','o','t') : return c_wpot[0];
|
||||||
|
case BIN('s','c','h','a') : return c_scha[0];
|
||||||
|
case BIN('m','c','h','a') : return c_mcha[0];
|
||||||
|
case BIN('l','c','h','a') : return c_lcha[0];
|
||||||
|
case BIN('a','b','o','w') : return c_abow[0];
|
||||||
|
case BIN('a','s','p','e') : return c_aspe[0];
|
||||||
|
case BIN('a','j','a','v') : return c_ajav[0];
|
||||||
|
case BIN('m','b','o','q') : return c_mboq[0];
|
||||||
|
case BIN('m','x','b','q') : return c_mxbq[0];
|
||||||
|
case BIN('g','e','m','0') : return c_gem0[0];
|
||||||
|
case BIN('g','e','m','1') : return c_gem1[0];
|
||||||
|
case BIN('g','e','m','2') : return c_gem2[0];
|
||||||
|
case BIN('g','e','m','3') : return c_gem3[0];
|
||||||
|
case BIN('g','e','m','4') : return c_gem4[0];
|
||||||
|
case BIN('g','e','m','a') : return c_gema[0];
|
||||||
|
case BIN('g','e','m','d') : return c_gemd[0];
|
||||||
|
case BIN('g','e','m','e') : return c_geme[0];
|
||||||
|
case BIN('g','e','m','r') : return c_gemr[0];
|
||||||
|
case BIN('g','e','m','s') : return c_gems[0];
|
||||||
|
case BIN('g','e','m','t') : return c_gemt[0];
|
||||||
|
case BIN('g','e','m','z') : return c_gemz[0];
|
||||||
|
default: return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char* getTypeAString (WORD id, char* lpText, DWORD size)
|
||||||
|
{
|
||||||
|
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||||
|
if (!itemTypeData)
|
||||||
|
{
|
||||||
|
strncpy(lpText, "Bad Type", size);
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* string = getTypeString(itemTypeData->code);
|
||||||
|
if (!string)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
DWORD code;
|
||||||
|
BYTE zero;
|
||||||
|
} code;
|
||||||
|
code.code = itemTypeData->code;
|
||||||
|
code.zero = 0;
|
||||||
|
strncpy(lpText, (char*)&code, size);
|
||||||
|
} else
|
||||||
|
strncpy(lpText, string, size);
|
||||||
|
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size)
|
||||||
|
{
|
||||||
|
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||||
|
if (!itemTypeData)
|
||||||
|
{
|
||||||
|
mbstowcs(lpText, "Bad Type", size);
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
const char* string = getTypeString(itemTypeData->code);
|
||||||
|
if (!string)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
DWORD code;
|
||||||
|
BYTE zero;
|
||||||
|
} code;
|
||||||
|
code.code = itemTypeData->code;
|
||||||
|
code.zero = 0;
|
||||||
|
mbstowcs(lpText, (char*)&code, size);
|
||||||
|
} else
|
||||||
|
mbstowcs(lpText, string, size);
|
||||||
|
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
/*================================= END OF FILE =================================*/
|
489
PlugY/CommonUTF8.cpp
Normal file
489
PlugY/CommonUTF8.cpp
Normal file
@ -0,0 +1,489 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Common functions.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
s_shifting shifting;
|
||||||
|
|
||||||
|
bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h)
|
||||||
|
{return (x>=x0) && (x<x0+l) && (y>y0-h) && (y<=y0);}
|
||||||
|
|
||||||
|
|
||||||
|
void freeMessage(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
msg->managed=1;
|
||||||
|
msg->unmanaged=0;
|
||||||
|
D2FreeWinMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LPWSTR getString(LPWSTR eng, LPWSTR esp, LPWSTR deu, LPWSTR fra, LPWSTR por, LPWSTR ita, LPWSTR jpn, LPWSTR kor, LPWSTR sin, LPWSTR chi, LPWSTR pol, LPWSTR rus)
|
||||||
|
{
|
||||||
|
switch(D2GetLang())
|
||||||
|
{
|
||||||
|
case LNG_ENG: return eng;
|
||||||
|
case LNG_ESP: return esp;
|
||||||
|
case LNG_DEU: return deu;
|
||||||
|
case LNG_FRA: return fra;
|
||||||
|
case LNG_POR: return por;
|
||||||
|
case LNG_ITA: return ita;
|
||||||
|
case LNG_JPN: return jpn;
|
||||||
|
case LNG_KOR: return kor;
|
||||||
|
case LNG_SIN: return sin;
|
||||||
|
case LNG_CHI: return chi;
|
||||||
|
case LNG_POL: return pol;
|
||||||
|
case LNG_RUS: return rus;
|
||||||
|
case LNG_DEF:
|
||||||
|
default: return eng;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define LANGUAGE(I,ENG,FRA,DEU,ITA,ESP,POL,CHI) case I : return getString(L##ENG,L##ESP,L##DEU,L##FRA,L##ENG,L##ITA,L##ENG,L##ENG,L##ENG,L##ENG,L##POL,L##ENG)
|
||||||
|
|
||||||
|
LPWSTR getTranslatedString(int stringID)
|
||||||
|
{
|
||||||
|
switch(stringID)
|
||||||
|
{
|
||||||
|
/* LANGUAGE2( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||||
|
"+Alt: ;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
// "+Alt: \x91CD\x5206\x914D;,+Shift: %d \x70B9\x6570",//"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
"+Alt: Désallocation, +Shift: par %d points,",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: um %d Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||||
|
"+Alt: Quita, +Shift: por %d puntos",
|
||||||
|
"+Alt: \37325\20998\37197;,+Shift:%d \28857\25968");
|
||||||
|
*/
|
||||||
|
LANGUAGE( STR_STATS_UNASSIGN_WITH_LIMIT,
|
||||||
|
"+Alt: Unassign, +Shift: by %d points",
|
||||||
|
"+Alt: Désallocation, +Shift: par %d points",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: um %d Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna %d punti",
|
||||||
|
"+Alt: Quita, +Shift: por %d puntos",
|
||||||
|
"+Alt: Odejmij, +Shift: %d punktów");
|
||||||
|
// "+Alt: 取消加点, +Shift: %d 点数");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STATS_UNASSIGN_WITHOUT_LIMIT,
|
||||||
|
"+Alt: Unassign, +Shift: all remaining points",
|
||||||
|
"+Alt: Désallocation, +Shift: Tous les points restants",
|
||||||
|
"+Alt: Zurücksetzen, +Shift: Alle verbleibenden Punkte",
|
||||||
|
"+Alt: Rimuovi, +Shift: Assegna tutti i punti rimanenti",
|
||||||
|
"+Alt: Quita, +Shift: Todos los puntos restantes",
|
||||||
|
"+Alt: Odejmij, +Shift: wszystkie pozostale punkty");
|
||||||
|
// "+Alt: 取消加点, +Shift: 所有剩");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STATS_BASE_MIN,
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Basiswert: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Base: %d (Min: %d)",
|
||||||
|
"Bazowo: %d (Minimum: %d)");
|
||||||
|
// "基础: %d(最小: %d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SKILLS_UNASSIGN,
|
||||||
|
"Un-allocate all skills points",
|
||||||
|
"Désalloue tous les points d'aptitudes",
|
||||||
|
"Alle Fertigkeitspunkte zurücksetzen",
|
||||||
|
"Rimuovi tutte le abilità",
|
||||||
|
"Quita todos los puntos de habilidades",
|
||||||
|
"Rozdaj od nowa wszystkie punkty umiejetnosci");
|
||||||
|
// "取消所有技能加点");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_PREVIOUS_PAGE,
|
||||||
|
"Previous Page (+shift: First Page)",
|
||||||
|
"Page précédente (+shift: Première page)",
|
||||||
|
"Vorherige Seite (+shift: Erste Seite)",
|
||||||
|
"Pagina Precedente (+shift: Prima Pagina)",
|
||||||
|
"Pagina anterior (+shift: Primera Pagina)",
|
||||||
|
"Poprzednia Strona (+shift: Pierwsza Strona)");
|
||||||
|
// "上一页 (+shift: 首页)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_NEXT_PAGE,
|
||||||
|
"Next Page (+shift: Last not empty Page)",
|
||||||
|
"Page suivante (+shift: Dernière page non vide)",
|
||||||
|
"Nächste Seite (+shift: Letzte nicht leere Seite )",
|
||||||
|
"Pagina Successiva (+shift: Ultima Pagina non vuota)",
|
||||||
|
"Pagina Siguiente (+shift: Ultima pagina non vacia)",
|
||||||
|
"Nastepna Strona (+shift: Ostatnia nie pusta Strona)");
|
||||||
|
// "下一页 (+shift: 最后非空页");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TOGGLE_TO_PERSONAL,
|
||||||
|
"Toggle to Personal Stash",
|
||||||
|
"Voir coffre personnel",
|
||||||
|
"Wechselt zum persönlichen Goldschatz",
|
||||||
|
"Vai all'Inventario Personale",
|
||||||
|
"Ver el cofre personal",
|
||||||
|
"Przejdz do Skrzyni Osobistej");
|
||||||
|
// "切换到个人储物箱");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TOGGLE_TO_SHARED,
|
||||||
|
"Toggle to Shared Stash",
|
||||||
|
"Voir coffre partagé",
|
||||||
|
"Wechselt zum gemeinsamen Goldschatz",
|
||||||
|
"Vai all'Inventario Condiviso",
|
||||||
|
"Ver el cofre compartido",
|
||||||
|
"Przejdz do Skrzyni Wspólnej");
|
||||||
|
// "切换到共享储物箱");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_PREVIOUS_INDEX,
|
||||||
|
"Previous Index : by %d Pages (+Shift: %d)",
|
||||||
|
"Index précédent : par %d pages (+shift: %d)",
|
||||||
|
"Vorheriger Index: in %d Seiten (+shift: %d)",
|
||||||
|
"Schermata Precedente : Indietro di %d Pagine (+Shift: %d)",
|
||||||
|
"Indice anterior : por %d paginas (+shift: %d)",
|
||||||
|
"Poprzednia Strona : po %d Stron (+Shift: %d)");
|
||||||
|
// "向前索引 : %d 页 (+Shift:%d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_STASH_NEXT_INDEX,
|
||||||
|
"Next Index : by %d Pages (+shift: %d)",
|
||||||
|
"Index suivant : par %d pages (+shift: %d)",
|
||||||
|
"Nächster Index: in %d Seiten (+shift: %d)",
|
||||||
|
"Schermata Successiva : Avanti di %d Pagine (+shift: %d)",
|
||||||
|
"Indice siguiente : por %d paginas (+shift: %d)",
|
||||||
|
"Nastepna Strona : po %d Stron (+shift: %d)");
|
||||||
|
// "向后索引 : %d 页 (+shift:%d)");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PUT_GOLD,
|
||||||
|
"Put Gold",
|
||||||
|
"Poser de l'Or",
|
||||||
|
"Gib Gold",
|
||||||
|
"Immetti Oro",
|
||||||
|
"Poner oro",
|
||||||
|
"Zdeponuj Zloto");
|
||||||
|
// "放入金币");
|
||||||
|
|
||||||
|
LANGUAGE( STR_TAKE_GOLD,
|
||||||
|
"Take Gold",
|
||||||
|
"Prendre de l'Or",
|
||||||
|
"Nehme Gold",
|
||||||
|
"Ritira Oro",
|
||||||
|
"Tomar oro",
|
||||||
|
"Wyplac zloto");
|
||||||
|
// "取出金币");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PERSONAL_PAGE_NUMBER,
|
||||||
|
"Personal Page n°%u",
|
||||||
|
"Page perso n°%u",
|
||||||
|
"Persönliche Seite n°%u",
|
||||||
|
"Pagina Personale n°%u",
|
||||||
|
"Pagina personal n°%u",
|
||||||
|
"Strona Osobista n°%u");
|
||||||
|
// "个人储物箱 n°%u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SHARED_PAGE_NUMBER,
|
||||||
|
"Shared Page n°%u",
|
||||||
|
"Page partagée n°%u",
|
||||||
|
"Gemeinsame Seite n°%u",
|
||||||
|
"Pagina Condivisa n°%u",
|
||||||
|
"Pagina personal n°%u",
|
||||||
|
"Strona Wspólna n°%u");
|
||||||
|
// "共享储物箱 n°%u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_NO_SELECTED_PAGE,
|
||||||
|
"No selected page",
|
||||||
|
"Aucune page sélectionnée",
|
||||||
|
"Keine ausgewählte Seite",
|
||||||
|
"Nessuna pagina selezionata",
|
||||||
|
"Ninguna pagina seleccionada",
|
||||||
|
"Nie zaznaczono strony");
|
||||||
|
// "未使用页");
|
||||||
|
|
||||||
|
LANGUAGE( STR_SHARED_GOLD_QUANTITY,
|
||||||
|
"Shared Gold : %u",
|
||||||
|
"Or partagé : %u",
|
||||||
|
"Gemeinsamen Gold : %u",
|
||||||
|
"Oro Condiviso : %u",
|
||||||
|
"Oro compartido : %u",
|
||||||
|
"Wspólne Zloto : %u");
|
||||||
|
// "共享金币: %u");
|
||||||
|
|
||||||
|
LANGUAGE( STR_PREVIOUS_PAGE,
|
||||||
|
"Previous Page",
|
||||||
|
"Page précédente",
|
||||||
|
"Vorherige Seite",
|
||||||
|
"Pagina Precedente",
|
||||||
|
"Pagina anterior",
|
||||||
|
"Poprzednia Strona");
|
||||||
|
// "上一页");
|
||||||
|
|
||||||
|
LANGUAGE( STR_NEXT_PAGE,
|
||||||
|
"Next Page",
|
||||||
|
"Page suivante",
|
||||||
|
"Nächste Seite",
|
||||||
|
"Pagina Successiva",
|
||||||
|
"Pagina siguiente",
|
||||||
|
"Nastepna Strona");
|
||||||
|
// "下一页");
|
||||||
|
|
||||||
|
default : return L"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*=================================================================*/
|
||||||
|
|
||||||
|
const char* SNONE="";
|
||||||
|
const char* c_shie[3]={"Shield (Not Class Specific)",SNONE,SNONE};
|
||||||
|
const char* c_tors[3]={"Body Armor",SNONE,SNONE};
|
||||||
|
const char* c_gold[3]={"Gold",SNONE,SNONE};
|
||||||
|
const char* c_bowq[3]={"Arrow",SNONE,SNONE};
|
||||||
|
const char* c_xboq[3]={"Bolt",SNONE,SNONE};
|
||||||
|
const char* c_play[3]={"Ear",SNONE,SNONE};
|
||||||
|
const char* c_herb[3]={"Herb",SNONE,SNONE};
|
||||||
|
const char* c_poti[3]={"Potion",SNONE,SNONE};
|
||||||
|
const char* c_ring[3]={"Ring",SNONE,SNONE};
|
||||||
|
const char* c_elix[3]={"Elixir",SNONE,SNONE};
|
||||||
|
const char* c_amul[3]={"Amulet",SNONE,SNONE};
|
||||||
|
const char* c_char[3]={"Charm",SNONE,SNONE};
|
||||||
|
const char* c_boot[3]={"Boot",SNONE,SNONE};
|
||||||
|
const char* c_glov[3]={"Glove",SNONE,SNONE};
|
||||||
|
const char* c_book[3]={"Book",SNONE,SNONE};
|
||||||
|
const char* c_belt[3]={"Belt",SNONE,SNONE};
|
||||||
|
const char* c_gem[3]={"Gem",SNONE,SNONE};
|
||||||
|
const char* c_torc[3]={"Torch",SNONE,SNONE};
|
||||||
|
const char* c_scro[3]={"Scroll",SNONE,SNONE};
|
||||||
|
const char* c_scep[3]={"Scepter",SNONE,SNONE};
|
||||||
|
const char* c_wand[3]={"Wand",SNONE,SNONE};
|
||||||
|
const char* c_staf[3]={"Staff",SNONE,SNONE};
|
||||||
|
const char* c_bow[3]={"Bow",SNONE,SNONE};
|
||||||
|
const char* c_axe[3]={"Axe",SNONE,SNONE};
|
||||||
|
const char* c_club[3]={"Club",SNONE,SNONE};
|
||||||
|
const char* c_swor[3]={"Sword",SNONE,SNONE};
|
||||||
|
const char* c_hamm[3]={"Hammer",SNONE,SNONE};
|
||||||
|
const char* c_knif[3]={"Knife",SNONE,SNONE};
|
||||||
|
const char* c_spea[3]={"Spear",SNONE,SNONE};
|
||||||
|
const char* c_pole[3]={"Polearm",SNONE,SNONE};
|
||||||
|
const char* c_xbow[3]={"Crossbow",SNONE,SNONE};
|
||||||
|
const char* c_mace[3]={"Mace",SNONE,SNONE};
|
||||||
|
const char* c_helm[3]={"Helm",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* c_tpot[3]={"Missile Potion",SNONE,SNONE};
|
||||||
|
const char* c_ques[3]={"Quest Item",SNONE,SNONE};
|
||||||
|
const char* c_body[3]={"Body Part",SNONE,SNONE};
|
||||||
|
const char* c_key[3]={"Key",SNONE,SNONE};
|
||||||
|
const char* c_tkni[3]={"Throwing Knife",SNONE,SNONE};
|
||||||
|
const char* c_taxe[3]={"Throwing Axe",SNONE,SNONE};
|
||||||
|
const char* c_jave[3]={"Javelin",SNONE,SNONE};
|
||||||
|
const char* c_weap[3]={"Weapon",SNONE,SNONE};
|
||||||
|
const char* c_mele[3]={"Melee Weapon",SNONE,SNONE};
|
||||||
|
const char* c_miss[3]={"Missile Weapon",SNONE,SNONE};
|
||||||
|
const char* c_thro[3]={"Throwing Weapon",SNONE,SNONE};
|
||||||
|
const char* c_comb[3]={"Combo Weapon",SNONE,SNONE};
|
||||||
|
const char* c_armo[3]={"Armor",SNONE,SNONE};
|
||||||
|
const char* c_shld[3]={"Any Shield",SNONE,SNONE};
|
||||||
|
const char* c_misc[3]={"Miscellaneous",SNONE,SNONE};
|
||||||
|
const char* c_sock[3]={"Socket Filler",SNONE,SNONE};
|
||||||
|
const char* c_seco[3]={"Second Hand Item",SNONE,SNONE};
|
||||||
|
const char* c_rod[3]={"Staves And Rods",SNONE,SNONE};
|
||||||
|
const char* c_misl[3]={"Missile",SNONE,SNONE};
|
||||||
|
const char* c_blun[3]={"Blunt",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* c_jewl[3]={"Jewel",SNONE,SNONE};
|
||||||
|
const char* c_clas[3]={"Class Specific",SNONE,SNONE};
|
||||||
|
const char* c_amaz[3]={"Amazon Item",SNONE,SNONE};
|
||||||
|
const char* c_barb[3]={"Barbarian Item",SNONE,SNONE};
|
||||||
|
const char* c_necr[3]={"Necromancer Item",SNONE,SNONE};
|
||||||
|
const char* c_pala[3]={"Paladin Item",SNONE,SNONE};
|
||||||
|
const char* c_sorc[3]={"Sorceress Item",SNONE,SNONE};
|
||||||
|
const char* c_assn[3]={"Assassin Item",SNONE,SNONE};
|
||||||
|
const char* c_drui[3]={"Druid Item",SNONE,SNONE};
|
||||||
|
const char* c_h2h[3]={"Claw",SNONE,SNONE};
|
||||||
|
const char* c_orb[3]={"Orb",SNONE,SNONE};
|
||||||
|
const char* c_head[3]={"Voodoo Heads",SNONE,SNONE};
|
||||||
|
const char* c_ashd[3]={"Paladin Shield",SNONE,SNONE};
|
||||||
|
const char* c_phlm[3]={"Barbarian Helm",SNONE,SNONE};
|
||||||
|
const char* c_pelt[3]={"Druid Helm",SNONE,SNONE};
|
||||||
|
const char* c_cloa[3]={"Cloak",SNONE,SNONE};
|
||||||
|
const char* c_rune[3]={"Rune",SNONE,SNONE};
|
||||||
|
const char* c_circ[3]={"Circlet",SNONE,SNONE};
|
||||||
|
const char* c_hpot[3]={"Healing Potion",SNONE,SNONE};
|
||||||
|
const char* c_mpot[3]={"Mana Potion",SNONE,SNONE};
|
||||||
|
const char* c_rpot[3]={"Rejuvenation potion",SNONE,SNONE};
|
||||||
|
const char* c_spot[3]={"Stamina Potion",SNONE,SNONE};
|
||||||
|
const char* c_apot[3]={"Antidote Potion",SNONE,SNONE};
|
||||||
|
const char* c_wpot[3]={"Thawing Potion",SNONE,SNONE};
|
||||||
|
const char* c_scha[3]={"Small Charm",SNONE,SNONE};
|
||||||
|
const char* c_mcha[3]={"Large Charm",SNONE,SNONE};
|
||||||
|
const char* c_lcha[3]={"Grand Charm",SNONE,SNONE};
|
||||||
|
const char* c_abow[3]={"Amazon Bow",SNONE,SNONE};
|
||||||
|
const char* c_aspe[3]={"Amazon Spear",SNONE,SNONE};
|
||||||
|
const char* c_ajav[3]={"Amazon Javelin",SNONE,SNONE};
|
||||||
|
const char* c_h2h2[3]={"Assassin Claw",SNONE,SNONE};
|
||||||
|
const char* c_mboq[3]={"Magic Arrow",SNONE,SNONE};
|
||||||
|
const char* c_mxbq[3]={"Magic Bolt",SNONE,SNONE};
|
||||||
|
const char* c_gem0[3]={"Chipped Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem1[3]={"Flawed Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem2[3]={"Normal Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem3[3]={"Flawless Gem",SNONE,SNONE};
|
||||||
|
const char* c_gem4[3]={"Perfect Gem",SNONE,SNONE};
|
||||||
|
const char* c_gema[3]={"Amethyst",SNONE,SNONE};
|
||||||
|
const char* c_gemd[3]={"Diamond",SNONE,SNONE};
|
||||||
|
const char* c_geme[3]={"Emerald",SNONE,SNONE};
|
||||||
|
const char* c_gemr[3]={"Ruby",SNONE,SNONE};
|
||||||
|
const char* c_gems[3]={"Sapphire",SNONE,SNONE};
|
||||||
|
const char* c_gemt[3]={"Topaz",SNONE,SNONE};
|
||||||
|
const char* c_gemz[3]={"Skull",SNONE,SNONE};
|
||||||
|
|
||||||
|
const char* getTypeString (DWORD code)
|
||||||
|
{
|
||||||
|
DWORD lang = 0;//D2GetLang();
|
||||||
|
if ((lang == LNG_FRA) || (lang == LNG_DEU)) lang--;
|
||||||
|
else lang = 0;
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case BIN('s','h','i','e') : return c_shie[0];
|
||||||
|
case BIN('t','o','r','s') : return c_tors[0];
|
||||||
|
case BIN('g','o','l','d') : return c_gold[0];
|
||||||
|
case BIN('b','o','w','q') : return c_bowq[0];
|
||||||
|
case BIN('x','b','o','q') : return c_xboq[0];
|
||||||
|
case BIN('p','l','a','y') : return c_play[0];
|
||||||
|
case BIN('h','e','r','b') : return c_herb[0];
|
||||||
|
case BIN('p','o','t','i') : return c_poti[0];
|
||||||
|
case BIN('r','i','n','g') : return c_ring[0];
|
||||||
|
case BIN('e','l','i','x') : return c_elix[0];
|
||||||
|
case BIN('a','m','u','l') : return c_amul[0];
|
||||||
|
case BIN('c','h','a','r') : return c_char[0];
|
||||||
|
case BIN('b','o','o','t') : return c_boot[0];
|
||||||
|
case BIN('g','l','o','v') : return c_glov[0];
|
||||||
|
case BIN('b','o','o','k') : return c_book[0];
|
||||||
|
case BIN('b','e','l','t') : return c_belt[0];
|
||||||
|
case BIN('g','e','m',' ') : return c_gem[0];
|
||||||
|
case BIN('t','o','r','c') : return c_torc[0];
|
||||||
|
case BIN('s','c','r','o') : return c_scro[0];
|
||||||
|
case BIN('s','c','e','p') : return c_scep[0];
|
||||||
|
case BIN('w','a','n','d') : return c_wand[0];
|
||||||
|
case BIN('s','t','a','f') : return c_staf[0];
|
||||||
|
case BIN('b','o','w',' ') : return c_bow[0];
|
||||||
|
case BIN('a','x','e',' ') : return c_axe[0];
|
||||||
|
case BIN('c','l','u','b') : return c_club[0];
|
||||||
|
case BIN('s','w','o','r') : return c_swor[0];
|
||||||
|
case BIN('h','a','m','m') : return c_hamm[0];
|
||||||
|
case BIN('k','n','i','f') : return c_knif[0];
|
||||||
|
case BIN('s','p','e','a') : return c_spea[0];
|
||||||
|
case BIN('p','o','l','e') : return c_pole[0];
|
||||||
|
case BIN('x','b','o','w') : return c_xbow[0];
|
||||||
|
case BIN('m','a','c','e') : return c_mace[0];
|
||||||
|
case BIN('h','e','l','m') : return c_helm[0];
|
||||||
|
case BIN('t','p','o','t') : return c_tpot[0];
|
||||||
|
case BIN('q','u','e','s') : return c_ques[0];
|
||||||
|
case BIN('b','o','d','y') : return c_body[0];
|
||||||
|
case BIN('k','e','y',' ') : return c_key[0];
|
||||||
|
case BIN('t','k','n','i') : return c_tkni[0];
|
||||||
|
case BIN('t','a','x','e') : return c_taxe[0];
|
||||||
|
case BIN('j','a','v','e') : return c_jave[0];
|
||||||
|
case BIN('w','e','a','p') : return c_weap[0];
|
||||||
|
case BIN('m','e','l','e') : return c_mele[0];
|
||||||
|
case BIN('m','i','s','s') : return c_miss[0];
|
||||||
|
case BIN('t','h','r','o') : return c_thro[0];
|
||||||
|
case BIN('c','o','m','b') : return c_comb[0];
|
||||||
|
case BIN('a','r','m','o') : return c_armo[0];
|
||||||
|
case BIN('s','h','l','d') : return c_shld[0];
|
||||||
|
case BIN('m','i','s','c') : return c_misc[0];
|
||||||
|
case BIN('s','o','c','k') : return c_sock[0];
|
||||||
|
case BIN('s','e','c','o') : return c_seco[0];
|
||||||
|
case BIN('r','o','d',' ') : return c_rod[0];
|
||||||
|
case BIN('m','i','s','l') : return c_misl[0];
|
||||||
|
case BIN('b','l','u','n') : return c_blun[0];
|
||||||
|
case BIN('j','e','w','l') : return c_jewl[0];
|
||||||
|
case BIN('c','l','a','s') : return c_clas[0];
|
||||||
|
case BIN('a','m','a','z') : return c_amaz[0];
|
||||||
|
case BIN('b','a','r','b') : return c_barb[0];
|
||||||
|
case BIN('n','e','c','r') : return c_necr[0];
|
||||||
|
case BIN('p','a','l','a') : return c_pala[0];
|
||||||
|
case BIN('s','o','r','c') : return c_sorc[0];
|
||||||
|
case BIN('a','s','s','n') : return c_assn[0];
|
||||||
|
case BIN('d','r','u','i') : return c_drui[0];
|
||||||
|
case BIN('h','2','h',' ') : return c_h2h[0];
|
||||||
|
case BIN('h','2','h','2') : return c_h2h2[0];
|
||||||
|
case BIN('o','r','b',' ') : return c_orb[0];
|
||||||
|
case BIN('h','e','a','d') : return c_head[0];
|
||||||
|
case BIN('a','s','h','d') : return c_ashd[0];
|
||||||
|
case BIN('p','h','l','m') : return c_phlm[0];
|
||||||
|
case BIN('p','e','l','t') : return c_pelt[0];
|
||||||
|
case BIN('c','l','o','a') : return c_cloa[0];
|
||||||
|
case BIN('r','u','n','e') : return c_rune[0];
|
||||||
|
case BIN('c','i','r','c') : return c_circ[0];
|
||||||
|
case BIN('h','p','o','t') : return c_hpot[0];
|
||||||
|
case BIN('m','p','o','t') : return c_mpot[0];
|
||||||
|
case BIN('r','p','o','t') : return c_rpot[0];
|
||||||
|
case BIN('s','p','o','t') : return c_spot[0];
|
||||||
|
case BIN('a','p','o','t') : return c_apot[0];
|
||||||
|
case BIN('w','p','o','t') : return c_wpot[0];
|
||||||
|
case BIN('s','c','h','a') : return c_scha[0];
|
||||||
|
case BIN('m','c','h','a') : return c_mcha[0];
|
||||||
|
case BIN('l','c','h','a') : return c_lcha[0];
|
||||||
|
case BIN('a','b','o','w') : return c_abow[0];
|
||||||
|
case BIN('a','s','p','e') : return c_aspe[0];
|
||||||
|
case BIN('a','j','a','v') : return c_ajav[0];
|
||||||
|
case BIN('m','b','o','q') : return c_mboq[0];
|
||||||
|
case BIN('m','x','b','q') : return c_mxbq[0];
|
||||||
|
case BIN('g','e','m','0') : return c_gem0[0];
|
||||||
|
case BIN('g','e','m','1') : return c_gem1[0];
|
||||||
|
case BIN('g','e','m','2') : return c_gem2[0];
|
||||||
|
case BIN('g','e','m','3') : return c_gem3[0];
|
||||||
|
case BIN('g','e','m','4') : return c_gem4[0];
|
||||||
|
case BIN('g','e','m','a') : return c_gema[0];
|
||||||
|
case BIN('g','e','m','d') : return c_gemd[0];
|
||||||
|
case BIN('g','e','m','e') : return c_geme[0];
|
||||||
|
case BIN('g','e','m','r') : return c_gemr[0];
|
||||||
|
case BIN('g','e','m','s') : return c_gems[0];
|
||||||
|
case BIN('g','e','m','t') : return c_gemt[0];
|
||||||
|
case BIN('g','e','m','z') : return c_gemz[0];
|
||||||
|
default: return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char* getTypeAString (WORD id, char* lpText, DWORD size)
|
||||||
|
{
|
||||||
|
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||||
|
if (!itemTypeData)
|
||||||
|
{
|
||||||
|
strncpy(lpText, "Bad Type", size);
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* string = getTypeString(itemTypeData->code);
|
||||||
|
if (!string)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
DWORD code;
|
||||||
|
BYTE zero;
|
||||||
|
} code;
|
||||||
|
code.code = itemTypeData->code;
|
||||||
|
code.zero = 0;
|
||||||
|
strncpy(lpText, (char*)&code, size);
|
||||||
|
} else
|
||||||
|
strncpy(lpText, string, size);
|
||||||
|
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size)
|
||||||
|
{
|
||||||
|
ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(id);
|
||||||
|
if (!itemTypeData)
|
||||||
|
{
|
||||||
|
mbstowcs(lpText, "Bad Type", size);
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
const char* string = getTypeString(itemTypeData->code);
|
||||||
|
if (!string)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
DWORD code;
|
||||||
|
BYTE zero;
|
||||||
|
} code;
|
||||||
|
code.code = itemTypeData->code;
|
||||||
|
code.zero = 0;
|
||||||
|
mbstowcs(lpText, (char*)&code, size);
|
||||||
|
} else
|
||||||
|
mbstowcs(lpText, string, size);
|
||||||
|
|
||||||
|
return lpText;
|
||||||
|
}
|
||||||
|
/*================================= END OF FILE =================================*/
|
89
PlugY/CustomLibraries.cpp
Normal file
89
PlugY/CustomLibraries.cpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Language management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "customLibraries.h"
|
||||||
|
|
||||||
|
|
||||||
|
TCustomDll* customDlls=NULL;
|
||||||
|
|
||||||
|
void TCustomDll::init()
|
||||||
|
{
|
||||||
|
if (initFct)
|
||||||
|
initFct();
|
||||||
|
};
|
||||||
|
|
||||||
|
void TCustomDll::release()
|
||||||
|
{
|
||||||
|
if (releaseFct)
|
||||||
|
releaseFct();
|
||||||
|
};
|
||||||
|
|
||||||
|
void TCustomDll::saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (saveExtendedSaveFileFct)
|
||||||
|
saveExtendedSaveFileFct(ptChar, data, maxSize, curSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
int TCustomDll::loadExtendedSaveFile(Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (loadExtendedSaveFileFct)
|
||||||
|
return loadExtendedSaveFileFct(ptChar, data, maxSize, curSize);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int TCustomDll::initExtendedSaveFile(BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (initExtendedSaveFileFct)
|
||||||
|
return initExtendedSaveFileFct(data, maxSize, curSize);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void TCustomDll::saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (saveSharedSaveFileFct)
|
||||||
|
saveSharedSaveFileFct(ptChar, data, maxSize, curSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
int TCustomDll::loadSharedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (loadSharedSaveFileFct)
|
||||||
|
return loadSharedSaveFileFct(ptChar, data, maxSize, curSize);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int TCustomDll::initSharedSaveFile(BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
if (initSharedSaveFileFct)
|
||||||
|
return initSharedSaveFileFct(data, maxSize, curSize);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void TCustomDll::initialize(DWORD offsetDll)
|
||||||
|
{
|
||||||
|
offset = offsetDll;
|
||||||
|
|
||||||
|
initFct = GetProcAddress(module,(LPCSTR)"_Init@0");
|
||||||
|
if (!initFct)
|
||||||
|
initFct = GetProcAddress(module,(LPCSTR)10000);
|
||||||
|
|
||||||
|
releaseFct = GetProcAddress(module,(LPCSTR)"_Release@0");
|
||||||
|
if (!releaseFct)
|
||||||
|
releaseFct = GetProcAddress(module,(LPCSTR)10001);
|
||||||
|
|
||||||
|
saveExtendedSaveFileFct = (TsaveSaveFile) GetProcAddress(module,"_saveExtendedSaveFile@16");
|
||||||
|
loadExtendedSaveFileFct = (TloadSaveFile) GetProcAddress(module,"_loadExtendedSaveFile@16");
|
||||||
|
initExtendedSaveFileFct = (TinitSaveFile) GetProcAddress(module,"_initExtendedSaveFile@12");
|
||||||
|
saveSharedSaveFileFct = (TsaveSaveFile) GetProcAddress(module,"_saveSharedSaveFile@16");
|
||||||
|
loadSharedSaveFileFct = (TloadSaveFile) GetProcAddress(module,"_loadSharedSaveFile@16");
|
||||||
|
initSharedSaveFileFct = (TinitSaveFile) GetProcAddress(module,"_initSharedSaveFile@12");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
962
PlugY/D2functions.cpp
Normal file
962
PlugY/D2functions.cpp
Normal file
@ -0,0 +1,962 @@
|
|||||||
|
/*================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
This file implements some common and useful
|
||||||
|
function related to some Diablo II mechanisms.
|
||||||
|
|
||||||
|
================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define D2S(F, I, R, N, P) T##N N;
|
||||||
|
#define D2F(F, I, R, N, P) T##N N;
|
||||||
|
#define E2S(F, A, R, N, P) T##N N;
|
||||||
|
#define E2F(F, A, R, N, P) T##N N;
|
||||||
|
#define E2C(F, A, T, N) T* pt##N;
|
||||||
|
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N;
|
||||||
|
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) T##N N;
|
||||||
|
#define C7(Z, A,B,C,D,E,F,G, T, N) T* pt##N;
|
||||||
|
|
||||||
|
#include "../Commons/D2Funcs.h"
|
||||||
|
DataTables* SgptDataTables;
|
||||||
|
//E2F(D2Client,0, DWORD, D2isLODGame, ());//6FAAC080
|
||||||
|
//E2F(D2Client,0, BYTE, D2GetDifficultyLevel, ());//6FAAC090
|
||||||
|
//E2S(D2Client,0, DWORD, D2GetMouseX, ());//6FB57BC0
|
||||||
|
//E2S(D2Client,0, DWORD, D2GetMouseY, ());//6FB57BD0
|
||||||
|
//E2S(D2Client,0, Unit*, D2GetClientPlayer, ());//6FB283D0
|
||||||
|
//E2F(D2Client,0, void, D2SendToServer3, (BYTE type, WORD p));//6FAAD990
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));//6FAAD9E0
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer5, (BYTE type, DWORD p));//6FAADA20
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));//6FAADA40
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));//6FAADA70
|
||||||
|
//E2F(D2Game,0, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));//6FCBC2E0
|
||||||
|
//E2F(D2Client,0, void, D2CleanStatMouseUp, ());//6FAABF60
|
||||||
|
#undef F7
|
||||||
|
#undef A7
|
||||||
|
#undef C7
|
||||||
|
#undef D2S
|
||||||
|
#undef D2F
|
||||||
|
#undef E2S
|
||||||
|
#undef E2F
|
||||||
|
#undef E2C
|
||||||
|
|
||||||
|
#define D2S(F, I, R, N, P) typedef R (STDCALL *T##N) P; T##N N;
|
||||||
|
D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09
|
||||||
|
D2S(D2Common,10598, ItemStatCostBIN*, D2Common10598, (DWORD itemStatCostID));//ONLY in 1.09
|
||||||
|
D2S(D2Common,10673, ItemTypesBIN*, D2Common10673, (DWORD itemTypesID));//ONLY in 1.09
|
||||||
|
#undef D2S
|
||||||
|
|
||||||
|
//TD2SetPlayerStat V2SetPlayerStat;
|
||||||
|
TD2AddPlayerStat V2AddPlayerStat;
|
||||||
|
TD2GetPlayerStat V2GetPlayerStat;
|
||||||
|
//TD2GetPlayerStat20 V2GetPlayerStat20;
|
||||||
|
TD2GetPlayerBaseStat V2GetPlayerBaseStat;
|
||||||
|
TD2SetSkillBaseLevel V2SetSkillBaseLevel;
|
||||||
|
TD2SetSkillBaseLevelOnClient V2SetSkillBaseLevelOnClient;
|
||||||
|
TD2PrintStat V2PrintStat;
|
||||||
|
TD2CompileCubeInput V2CompileCubeInput;
|
||||||
|
TD2CompileCubeOutput V2CompileCubeOutput;
|
||||||
|
TD2BroadcastFunction V2BroadcastFunction;
|
||||||
|
TD2GetGameByClientID V2GetGameByClientID;
|
||||||
|
TD2SpawnMonster V2SpawnMonster;
|
||||||
|
TD2VerifIfNotCarry1 V2VerifIfNotCarry1;
|
||||||
|
TD2GameGetObject V2GameGetObject;
|
||||||
|
TD2TestPositionInRoom V2TestPositionInRoom;
|
||||||
|
TD2GetItemTypesBIN V2GetItemTypesBIN;
|
||||||
|
TD2CompileTxtFile compileTxtFile;
|
||||||
|
WORD (*getDescStrPos) (DWORD statID);
|
||||||
|
//void (*setImage) (sDrawImageInfo* data, void* image);
|
||||||
|
//void (*setFrame) (sDrawImageInfo* data, DWORD frame);
|
||||||
|
TD2SendMsgToAll V2SendMsgToAll;
|
||||||
|
TD2SetColorPopup V2SetColorPopup;
|
||||||
|
TD2LoadImage V2LoadImage;
|
||||||
|
TD2PlaySound V2PlaySound;
|
||||||
|
TD2SendToServer V2SendToServer;
|
||||||
|
TD2GetCharStatsBIN V2GetCharStatsBIN;
|
||||||
|
TD2GetItemStatCostBIN V2GetItemStatCostBIN;
|
||||||
|
TD2SendPacket V2SendPacket;
|
||||||
|
TD2LoadInventory V2LoadInventory;
|
||||||
|
TD2SaveGame V2SaveGame;
|
||||||
|
|
||||||
|
//DWORD* ptNbStatDesc
|
||||||
|
//DWORD* ptStatDescTable;
|
||||||
|
//TD2OpenNPCMenu V2OpenNPCMenu;
|
||||||
|
|
||||||
|
DWORD getStatDescIDFrom (DWORD statID)//FOR 1.09
|
||||||
|
{
|
||||||
|
DWORD* desc = ptStatDescTable;
|
||||||
|
DWORD curDesc = 0;
|
||||||
|
while (curDesc < *ptNbStatDesc)
|
||||||
|
{
|
||||||
|
if (*desc == statID)
|
||||||
|
return curDesc;
|
||||||
|
desc+=4;
|
||||||
|
curDesc++;
|
||||||
|
}
|
||||||
|
return curDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//FCT_ASM ( D2SetPlayerStat_9 )//(Unit* ptChar, DWORD statID, DWORD amount, DWORD index)
|
||||||
|
// PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
// PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
// PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
// CALL V2SetPlayerStat
|
||||||
|
// RETN 0x10
|
||||||
|
//}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2AddPlayerStat_9 )//(Unit* ptChar, DWORD statID, DWORD amount, DWORD index)
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
CALL V2AddPlayerStat
|
||||||
|
RETN 0x10
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetPlayerStat_9 )//(Unit* ptChar, DWORD statID, DWORD index)
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
CALL V2GetPlayerStat
|
||||||
|
RETN 0x0C
|
||||||
|
}}
|
||||||
|
|
||||||
|
//FCT_ASM ( D2GetPlayerStat20_9 )//(Unit* ptChar, DWORD statID, DWORD index)
|
||||||
|
// PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
// PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
// CALL V2GetPlayerStat20
|
||||||
|
// RETN 0x0C
|
||||||
|
//}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetPlayerBaseStat_9 )//(Unit* ptChar, DWORD statID, DWORD index)
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
CALL V2GetPlayerBaseStat
|
||||||
|
RETN 0x0C
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SetSkillBaseLevel_9 )//(Unit* ptChar, DWORD skillID, DWORD slvl, DWORD bRemove, char*, DWORD));
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
CALL V2SetSkillBaseLevel
|
||||||
|
RETN 0x18
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SetSkillBaseLevelOnClient_9 )//(void* ptClient, Unit* ptChar, DWORD skillID, DWORD newValue, DWORD zero)
|
||||||
|
POP EAX
|
||||||
|
MOV ECX,EDX
|
||||||
|
POP EDX
|
||||||
|
PUSH EAX
|
||||||
|
JMP V2SetSkillBaseLevelOnClient
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetCharStatsBIN_9 )
|
||||||
|
PUSH ECX
|
||||||
|
CALL D2Common10581
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetItemStatCostBIN_9 )
|
||||||
|
PUSH ECX
|
||||||
|
CALL D2Common10598
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetItemTypesBIN_9 )
|
||||||
|
PUSH ECX
|
||||||
|
CALL D2Common10673
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD FASTCALL D2PrintStat_9 (Unit* ptItem, Stats* ptStats, DWORD statID, DWORD statIndex, DWORD statValue, LPWSTR lpText)
|
||||||
|
{
|
||||||
|
DWORD curDesc = getStatDescIDFrom(statID);
|
||||||
|
if (curDesc < *ptNbStatDesc)
|
||||||
|
return V2PrintStat(ptItem, (Stats*)curDesc, statValue, 0, 0, lpText);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setImage(sDrawImageInfo* data, void* image){((void**)data)[shifting.ptImage/4]=image;}//0x4 0x8 0x3C
|
||||||
|
void setFrame(sDrawImageInfo* data, DWORD frame){((DWORD*)data)[shifting.ptFrame/4]=frame;}//0x8 0x44 0x40
|
||||||
|
|
||||||
|
//void setImage_111(sDrawImageInfo* data, void* image){data->image=image;}//0x8 0x44
|
||||||
|
//void setImage_1XX(sDrawImageInfo* data, void* image){((void**)data)[1]=image;}//0x4 0x8
|
||||||
|
//void setFrame_111(sDrawImageInfo* data, DWORD frame){data->frame=frame;}
|
||||||
|
//void setFrame_1XX(sDrawImageInfo* data, DWORD frame){((DWORD*)data)[2]=frame;}
|
||||||
|
|
||||||
|
|
||||||
|
WORD getDescStrPos_9 (DWORD statID)
|
||||||
|
{
|
||||||
|
DWORD* desc = &ptStatDescTable[getStatDescIDFrom(statID)*4];
|
||||||
|
return (WORD)*(desc+2);
|
||||||
|
}
|
||||||
|
WORD getDescStrPos_10 (DWORD statID)
|
||||||
|
{
|
||||||
|
ItemStatCostBIN* itemStatCost = D2GetItemStatCostBIN(statID);
|
||||||
|
return itemStatCost->descstrpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char* S_compileTxtFile = "compileTxtFile";
|
||||||
|
const char* S_errorReadTxtFile = "pbData";
|
||||||
|
__declspec(naked) void* STDCALL compileTxtFile_9(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
|
||||||
|
{_asm{
|
||||||
|
SUB ESP,0x210
|
||||||
|
// MOV EAX,DWORD PTR DS:[1BEA28C]
|
||||||
|
PUSH EBX
|
||||||
|
PUSH EBP
|
||||||
|
PUSH ESI
|
||||||
|
PUSH EDI
|
||||||
|
MOV ESI,DWORD PTR SS:[ESP+0x228]
|
||||||
|
MOV DWORD PTR SS:[ESP+0x10],0
|
||||||
|
|
||||||
|
MOV EDI,wsprintf
|
||||||
|
PUSH ESI
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
PUSH EAX
|
||||||
|
CALL EDI
|
||||||
|
ADD ESP,8
|
||||||
|
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH 0
|
||||||
|
PUSH S_compileTxtFile
|
||||||
|
PUSH EDX
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x230]
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP+0x28]
|
||||||
|
CALL D2ReadFile
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ continue_compileTxtFile
|
||||||
|
PUSH 0
|
||||||
|
PUSH S_compileTxtFile
|
||||||
|
PUSH S_errorReadTxtFile
|
||||||
|
CALL D2FogAssertOld
|
||||||
|
PUSH -1
|
||||||
|
CALL exit
|
||||||
|
continue_compileTxtFile:
|
||||||
|
MOV ECX,D2CompileTxtFile
|
||||||
|
ADD ECX,0x305
|
||||||
|
JMP ECX
|
||||||
|
}}
|
||||||
|
|
||||||
|
__declspec(naked) void* STDCALL compileTxtFile_10(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
|
||||||
|
{_asm{
|
||||||
|
SUB ESP,0x210
|
||||||
|
// MOV EAX,DWORD PTR DS:[1BEA28C]
|
||||||
|
PUSH EBX
|
||||||
|
PUSH EBP
|
||||||
|
MOV EBP,DWORD PTR SS:[ESP+0x220]
|
||||||
|
PUSH ESI
|
||||||
|
PUSH EDI
|
||||||
|
MOV DWORD PTR SS:[ESP+0x10],0
|
||||||
|
|
||||||
|
MOV EBX,wsprintf
|
||||||
|
PUSH EBP
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
PUSH EAX
|
||||||
|
CALL EBX
|
||||||
|
ADD ESP,8
|
||||||
|
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH 0
|
||||||
|
PUSH S_compileTxtFile
|
||||||
|
PUSH EDX
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x230]
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP+0x28]
|
||||||
|
CALL D2ReadFile
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ continue_compileTxtFile
|
||||||
|
PUSH 0
|
||||||
|
PUSH S_compileTxtFile
|
||||||
|
PUSH S_errorReadTxtFile
|
||||||
|
CALL D2FogAssertOld
|
||||||
|
PUSH -1
|
||||||
|
CALL exit
|
||||||
|
continue_compileTxtFile:
|
||||||
|
MOV ECX,D2CompileTxtFile
|
||||||
|
ADD ECX,0x2ED
|
||||||
|
JMP ECX
|
||||||
|
}}
|
||||||
|
|
||||||
|
__declspec(naked) void* STDCALL compileTxtFile_111(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
|
||||||
|
{_asm{
|
||||||
|
SUB ESP,0x20C
|
||||||
|
// MOV EAX,DWORD PTR DS:[6FDF1464]
|
||||||
|
PUSH EBX
|
||||||
|
PUSH EBP
|
||||||
|
PUSH ESI
|
||||||
|
PUSH EDI
|
||||||
|
MOV DWORD PTR SS:[ESP+0x10],0
|
||||||
|
MOV EBX,DWORD PTR SS:[ESP+0x224]
|
||||||
|
|
||||||
|
PUSH EBX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1C]
|
||||||
|
PUSH EAX
|
||||||
|
CALL DWORD PTR SS:[wsprintf]
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+0x228]
|
||||||
|
ADD ESP,8
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH EDX
|
||||||
|
PUSH EAX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
CALL D2ReadFile
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ continue_compileTxtFile
|
||||||
|
PUSH __LINE__
|
||||||
|
CALL D2GetInstructionPointer
|
||||||
|
PUSH EAX
|
||||||
|
PUSH S_errorReadTxtFile
|
||||||
|
CALL D2FogAssert
|
||||||
|
ADD ESP,0xC
|
||||||
|
PUSH -1
|
||||||
|
CALL exit
|
||||||
|
continue_compileTxtFile:
|
||||||
|
MOV ECX,D2CompileTxtFile
|
||||||
|
ADD ECX,0x1EC
|
||||||
|
JMP ECX
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD FASTCALL D2isLODGame_111(){return IsLodGame;}
|
||||||
|
BYTE FASTCALL D2GetDifficultyLevel_111(){return DifficultyLevel;}
|
||||||
|
DWORD STDCALL D2GetMouseX_111(){return MouseX;}
|
||||||
|
DWORD STDCALL D2GetMouseY_111(){return MouseY;}
|
||||||
|
Unit* STDCALL D2GetClientPlayer_111(){return ptClientChar;}
|
||||||
|
|
||||||
|
DWORD *StatMouse1, *StatMouse2, *StatMouse3, *StatMouse4;
|
||||||
|
void FASTCALL D2CleanStatMouseUp_111(){*StatMouse1=*StatMouse2=*StatMouse3=*StatMouse4=0;}
|
||||||
|
|
||||||
|
Unit* STDCALL D2GetRealItem_111(Unit* ptItem){return ptItem;}
|
||||||
|
/* 1.11 : sizememory : 0x104 (LoadBuySell)
|
||||||
|
6FADA7F0 |. A1 48BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD48]
|
||||||
|
6FADA7F5 |. 3BC3 CMP EAX,EBX
|
||||||
|
6FADA7F7 |. 75 27 JNZ SHORT D2Client.6FADA820
|
||||||
|
6FADA7F9 |. 68 C407B86F PUSH D2Client.6FB807C4 ; /<%s> = "DATA\GLOBAL"
|
||||||
|
6FADA7FE |. 8D4424 6C LEA EAX,DWORD PTR SS:[ESP+6C] ; |
|
||||||
|
6FADA802 |. 68 483BB86F PUSH D2Client.6FB83B48 ; |Format = "%s\ui\panel\buysellbtn"
|
||||||
|
6FADA807 |. 50 PUSH EAX ; |s
|
||||||
|
6FADA808 |. FF15 FCF0B76F CALL DWORD PTR DS:[<&USER32.wsprintfA>] ; \wsprintfA
|
||||||
|
6FADA80E |. 83C4 0C ADD ESP,0C
|
||||||
|
6FADA811 |. 53 PUSH EBX ; /Arg1
|
||||||
|
6FADA812 |. 8D4424 6C LEA EAX,DWORD PTR SS:[ESP+6C] ; |
|
||||||
|
6FADA816 |. E8 E5B40400 CALL D2Client.6FB25D00 ; \D2Client.6FB25D00
|
||||||
|
6FADA81B |. A3 48BDBC6F MOV DWORD PTR DS:[6FBCBD48],EAX
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( D2SendMsgToAll_111 )
|
||||||
|
PUSH ESI
|
||||||
|
MOV ESI,ECX
|
||||||
|
CALL V2SendMsgToAll
|
||||||
|
POP ESI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SetColorPopup_111 )
|
||||||
|
PUSH EDI
|
||||||
|
PUSH EDX
|
||||||
|
MOV EDI,ECX
|
||||||
|
CALL V2SetColorPopup
|
||||||
|
POP EDI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2LoadImage_111 )
|
||||||
|
PUSH EDX
|
||||||
|
MOV EAX,ECX
|
||||||
|
CALL V2LoadImage
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
const char* D2FreeImage_FILE = __FILE__;
|
||||||
|
FCT_ASM ( D2FreeImage_111 )
|
||||||
|
PUSH ESI
|
||||||
|
MOV ESI,ECX
|
||||||
|
PUSH ESI
|
||||||
|
CALL D2CMP10014
|
||||||
|
TEST ESI,ESI
|
||||||
|
JE END_D2Free
|
||||||
|
PUSH 0
|
||||||
|
PUSH __LINE__
|
||||||
|
MOV EDX,D2FreeImage_FILE ; ASCII "C:\projects\D2\head\Diablo2\Source\D2Client\CORE\ARCHIVE.CPP"
|
||||||
|
MOV ECX,ESI
|
||||||
|
CALL D2FogMemDeAlloc
|
||||||
|
END_D2Free:
|
||||||
|
POP ESI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( D2PlaySound_111 )
|
||||||
|
PUSH EBX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH EDX
|
||||||
|
MOV EBX,ECX
|
||||||
|
CALL V2PlaySound
|
||||||
|
POP EBX
|
||||||
|
RETN 0xC
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetClient_111 )
|
||||||
|
PUSH ECX
|
||||||
|
CALL D2GetPlayerData
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX+0x9C]
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( D2SetSkillBaseLevelOnClient_111 )
|
||||||
|
PUSH EBX
|
||||||
|
PUSH ESI
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
MOV EBX, DWORD PTR SS:[ESP+0x14]
|
||||||
|
MOV EAX,ECX
|
||||||
|
MOV ESI,EDX
|
||||||
|
CALL V2SetSkillBaseLevelOnClient
|
||||||
|
POP ESI
|
||||||
|
POP EBX
|
||||||
|
RETN 0xC
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetCharStatsBIN_111 )
|
||||||
|
MOV EAX,ECX
|
||||||
|
JMP V2GetCharStatsBIN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetItemStatCostBIN_111 )
|
||||||
|
MOV EAX,ECX
|
||||||
|
JMP V2GetItemStatCostBIN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SendToServer3_111 )
|
||||||
|
PUSH EBX
|
||||||
|
PUSH ECX
|
||||||
|
MOV BYTE PTR SS:[ESP],CL
|
||||||
|
MOV WORD PTR SS:[ESP+1],DX
|
||||||
|
MOV EBX,3
|
||||||
|
LEA EDX,DWORD PTR SS:[ESP]
|
||||||
|
PUSH EDX
|
||||||
|
CALL D2SendToServerXX
|
||||||
|
POP ECX
|
||||||
|
POP EBX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2PrintStat_111 )
|
||||||
|
PUSH ESI
|
||||||
|
MOV ESI,DWORD PTR SS:[ESP+0x14]
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x08]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
CALL V2PrintStat
|
||||||
|
POP ESI
|
||||||
|
RETN 0x10
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SendPacket_111 )
|
||||||
|
POP EAX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH EAX
|
||||||
|
MOV EAX,ECX
|
||||||
|
JMP V2SendPacket
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2LoadInventory_111 )
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+4]
|
||||||
|
MOV DWORD PTR SS:[ESP+4],EDX
|
||||||
|
JMP V2LoadInventory
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2CompileCubeInput_111 )
|
||||||
|
PUSH EBX
|
||||||
|
MOV EBX,ECX
|
||||||
|
MOV EAX,EDX
|
||||||
|
CALL V2CompileCubeInput
|
||||||
|
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
|
||||||
|
PUSH EBX
|
||||||
|
MOV EAX,ECX
|
||||||
|
MOV EDI,EDX
|
||||||
|
MOV EBX,DWORD PTR SS:[ESP+0xC]
|
||||||
|
CALL V2BroadcastFunction
|
||||||
|
POP EBX
|
||||||
|
POP EDI
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SpawnMonster_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
PUSH ECX
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x18]
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x28]
|
||||||
|
CALL V2SpawnMonster
|
||||||
|
RETN 0x18
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SpawnMonster_111b )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x18]
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+0x2C]
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x28]//superuniqueID
|
||||||
|
CALL V2SpawnMonster
|
||||||
|
RETN 0x18
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2VerifIfNotCarry1_111 )
|
||||||
|
PUSH EBX
|
||||||
|
PUSH ECX
|
||||||
|
MOV EBX,EDX
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0xC]
|
||||||
|
CALL V2VerifIfNotCarry1
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GameGetObject_111 )
|
||||||
|
MOV EAX,EDX
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+4]
|
||||||
|
CALL V2GameGetObject
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( D2TestPositionInRoom_111 )
|
||||||
|
PUSH EDI
|
||||||
|
PUSH EBX
|
||||||
|
MOV EDI,DWORD PTR SS:[ESP+0xC]
|
||||||
|
MOV EAX,ECX
|
||||||
|
MOV EBX,EDX
|
||||||
|
CALL V2TestPositionInRoom
|
||||||
|
POP EBX
|
||||||
|
POP EDI
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetItemTypesBIN_111)
|
||||||
|
MOV EAX,ECX
|
||||||
|
JMP V2GetItemTypesBIN
|
||||||
|
}}
|
||||||
|
|
||||||
|
//FCT_ASM ( D2OpenNPCMenu_111)
|
||||||
|
// MOV ESI,ECX
|
||||||
|
// JMP V2OpenNPCMenu
|
||||||
|
//}}
|
||||||
|
FCT_ASM ( D2SendToServer_1XX )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH 0
|
||||||
|
CALL V2SendToServer
|
||||||
|
RETN 0xC
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( D2GetGameByClientID_1XX )
|
||||||
|
POP EAX
|
||||||
|
POP ECX
|
||||||
|
PUSH EAX
|
||||||
|
JMP V2GetGameByClientID
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( D2SaveGame_1XX )
|
||||||
|
POP EAX
|
||||||
|
POP ECX
|
||||||
|
PUSH EAX
|
||||||
|
JMP V2SaveGame
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define SETFCTADDR(F, I, N) setFctAddr((DWORD*)&N, (HMODULE)offset_##F, (LPCSTR)I)
|
||||||
|
void setFctAddr(DWORD* addr, HMODULE module, LPCSTR index)
|
||||||
|
{
|
||||||
|
if (index)
|
||||||
|
{
|
||||||
|
*addr = (DWORD)GetProcAddress(module,index);
|
||||||
|
if (!*addr)
|
||||||
|
{
|
||||||
|
log_msg("Bad index fct %d for %08X\n",index,module);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
*addr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool initD2functions()
|
||||||
|
{
|
||||||
|
// #define D2S(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I);
|
||||||
|
// #define D2F(F, I, R, N, P) N = (F##I)GetProcAddress((HMODULE)offset_##F, (LPCSTR)I);
|
||||||
|
#define D2S(F, I, R, N, P) SETFCTADDR(F, I, N);
|
||||||
|
#define D2F(F, I, R, N, P) SETFCTADDR(F, I, N);
|
||||||
|
#define E2S(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
|
||||||
|
#define E2F(F, A, R, N, P) N = (T##N)(offset_##F + 0x##A);
|
||||||
|
#define E2C(F, A, T, N) pt##N = (T*)(offset_##F + 0x##A);
|
||||||
|
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) setFctAddr((DWORD*)&N, (HMODULE)offset_##Z, (LPCSTR)((version_##Z == V113? G : (version_##Z == V112? F : version_##Z == V111b? E : (version_##Z == V111? D : (version_##Z == V110? C : (version_##Z == V109d? B : A)))))));
|
||||||
|
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) N = (T##N)R7(Z,A,B,C,D,E,F,G);
|
||||||
|
#define C7(Z, A,B,C,D,E,F,G, T, N) pt##N = (T*)R7(Z,A,B,C,D,E,F,G);
|
||||||
|
|
||||||
|
#include "../Commons/D2Funcs.h"
|
||||||
|
SgptDataTables = *(DataTables**) R7(D2Common, 0000, 0000, 96A20, 9B74C, 9EE8C, 9B500, 99E1C);
|
||||||
|
if (version_D2Common < V110)
|
||||||
|
{
|
||||||
|
D2S(D2Common,10581, CharStatsBIN*, D2Common10581, (DWORD charID));//ONLY in 1.09
|
||||||
|
D2S(D2Common,10598, ItemStatCostBIN*, D2Common10598, (DWORD itemStatCostID));//ONLY in 1.09
|
||||||
|
D2S(D2Common,10673, ItemTypesBIN*, D2Common10673, (DWORD itemTypesID));//ONLY in 1.09
|
||||||
|
}
|
||||||
|
#undef F7
|
||||||
|
#undef A7
|
||||||
|
#undef C7
|
||||||
|
#undef D2S
|
||||||
|
#undef D2F
|
||||||
|
#undef E2S
|
||||||
|
#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 >= V111 ? compileTxtFile_111 : version_D2Common == V110 ? compileTxtFile_10 : compileTxtFile_9;
|
||||||
|
|
||||||
|
|
||||||
|
//////////////// SELECT RIGHT ADDR FUNCTION ////////////////
|
||||||
|
//#define V3(V,T,F,A,B,C,D)\
|
||||||
|
// if (version_##F == V109b) V = (T) (offset_##F + 0x##A);\
|
||||||
|
// else if (version_##F == V109d) V = (T) (offset_##F + 0x##B);\
|
||||||
|
// else if (version_##F == V110) V = (T) (offset_##F + 0x##C);\
|
||||||
|
// else if (version_##F == V111) V = (T) (offset_##F + 0x##D)
|
||||||
|
|
||||||
|
//if (version_D2Common != V111b)
|
||||||
|
//{
|
||||||
|
//SETFCTADDR( D2Common, 10332, D2GetLevelID);
|
||||||
|
//SETFCTADDR( D2Common, 10623, D2GetDropRoom);
|
||||||
|
//SETFCTADDR( D2Common, 10461, D2InvRemoveItem);
|
||||||
|
//SETFCTADDR( D2Common, 10855, D2CanPutItemInInv);
|
||||||
|
//SETFCTADDR( D2Common, 10880, D2InvAddItem);
|
||||||
|
//SETFCTADDR( D2Common, 10402, D2InventoryGetFirstItem);
|
||||||
|
//SETFCTADDR( D2Common, 10934, D2UnitGetNextItem);
|
||||||
|
//SETFCTADDR( D2Common, 11095, D2GetRealItem);
|
||||||
|
//SETFCTADDR( D2Common, 11080, D2GetPosition);
|
||||||
|
//SETFCTADDR( D2Common, 10455, D2GetMaxGoldBank);
|
||||||
|
//SETFCTADDR( D2Common, 10172, D2GetRoom);
|
||||||
|
//SETFCTADDR( D2Common, 10218, D2InitPlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10914, D2FreePlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10562, D2GetPlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10343, D2GetMaxGold);
|
||||||
|
//SETFCTADDR( D2Common, 10500, D2GetGemsBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10109, D2AddPlayerStat);
|
||||||
|
//SETFCTADDR( D2Common, 11092, D2GetPlayerStat);
|
||||||
|
//SETFCTADDR( D2Common, 10733, D2GetPlayerBaseStat);
|
||||||
|
//SETFCTADDR( D2Common, 10653, D2CompileTxtFile);
|
||||||
|
//SETFCTADDR( D2Common, 10573, D2GetItemsBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10687, D2GetNbRunesBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10775, D2GetRunesBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10450, D2GetSuperUniqueBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10927, D2GetItemQuality);
|
||||||
|
//SETFCTADDR( D2Common, 10911, D2TestFlags);
|
||||||
|
//SETFCTADDR( D2Common, 10898, D2GetItemLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10820, D2ItemGetPage);
|
||||||
|
//SETFCTADDR( D2Common, 10485, D2ItemSetPage);
|
||||||
|
//SETFCTADDR( D2Common, 11017, D2CheckItemType);
|
||||||
|
//SETFCTADDR( D2Common, 10692, D2GetUniqueID);
|
||||||
|
//SETFCTADDR( D2Common, 10816, D2GetNbSocket);
|
||||||
|
//SETFCTADDR( D2Common, 10880, D2isEtheral);
|
||||||
|
//SETFCTADDR( D2Common, 10956, D2SaveItem);
|
||||||
|
//SETFCTADDR( D2Common, 10950, D2IncSkillBaseLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10700, D2GetSkillLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10027, D2Common10027);
|
||||||
|
//SETFCTADDR( D2Common, 10099, D2SetSkillBaseLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10746, D2GetCubeMainBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10639, D2GetNbCubeMainBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10254, D2GetSkillCost);
|
||||||
|
//SETFCTADDR( D2Common, 10471, D2GetObjectFlags);
|
||||||
|
//SETFCTADDR( D2Common, 10572, D2SetObjectFlags);
|
||||||
|
//SETFCTADDR( D2Common, 10188, D2Common11084);
|
||||||
|
//SETFCTADDR( D2Common, 10440, D2Common10572);
|
||||||
|
//SETFCTADDR( D2Common, 10655, D2GetDifficultyLevelsBIN);
|
||||||
|
//SETFCTADDR( D2Game, 10039, D2SetNbPlayers);
|
||||||
|
//SETFCTADDR( D2Win, 10061, D2PrintLineOnTextBox);
|
||||||
|
//SETFCTADDR( D2Win, 10020, D2PrintString);
|
||||||
|
//SETFCTADDR( D2Win, 10034, D2GetPixelLen);
|
||||||
|
//SETFCTADDR( D2Win, 10141, D2SetFont);
|
||||||
|
//SETFCTADDR( D2Win, 10118, D2PrintPopup);
|
||||||
|
//SETFCTADDR( D2Win, 10147, D2CreateTextBox);
|
||||||
|
//SETFCTADDR( D2Lang, 10009, D2GetLang);
|
||||||
|
//SETFCTADDR( D2Lang, 10005, D2GetStringFromIndex);
|
||||||
|
//SETFCTADDR( D2gfx, 10000, D2GetResolution);
|
||||||
|
//SETFCTADDR( D2gfx, 10047, D2PrintImage);
|
||||||
|
//SETFCTADDR( D2gfx, 10028, D2FillArea);
|
||||||
|
//SETFCTADDR( D2Net, 10035, D2SendToServer);
|
||||||
|
////SETFCTADDR( D2Net, 10018, D2SendToClient);//SAME IN BOTH VERSION
|
||||||
|
//SETFCTADDR( D2CMP, 10021, D2CMP10014);
|
||||||
|
//if (version_D2Common != V111)
|
||||||
|
//{
|
||||||
|
//setImage = setImage_1XX;
|
||||||
|
//setFrame = setFrame_1XX;
|
||||||
|
//SETFCTADDR( D2Common, 10057, D2GetLevelID);
|
||||||
|
//SETFCTADDR( D2Common, 10138, D2GetDropRoom);
|
||||||
|
//SETFCTADDR( D2Common, 10243, D2InvRemoveItem);
|
||||||
|
//SETFCTADDR( D2Common, 10246, D2CanPutItemInInv);
|
||||||
|
//SETFCTADDR( D2Common, 10249, D2InvAddItem);
|
||||||
|
//SETFCTADDR( D2Common, 10277, D2InventoryGetFirstItem);
|
||||||
|
//SETFCTADDR( D2Common, 10304, D2UnitGetNextItem);
|
||||||
|
//SETFCTADDR( D2Common, 10305, D2GetRealItem);
|
||||||
|
//SETFCTADDR( D2Common, 10332, D2GetPosition);
|
||||||
|
//SETFCTADDR( D2Common, 10339, D2GetMaxGoldBank);
|
||||||
|
//SETFCTADDR( D2Common, 10342, D2GetRoom);
|
||||||
|
//SETFCTADDR( D2Common, 10420, D2InitPlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10421, D2FreePlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10424, D2GetPlayerData);
|
||||||
|
//SETFCTADDR( D2Common, 10439, D2GetMaxGold);
|
||||||
|
//SETFCTADDR( D2Common, 10616, D2GetGemsBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10518, D2AddPlayerStat);
|
||||||
|
//SETFCTADDR( D2Common, 10519, D2GetPlayerStat);
|
||||||
|
//SETFCTADDR( D2Common, 10521, D2GetPlayerBaseStat);
|
||||||
|
//SETFCTADDR( D2Common, 10578, D2CompileTxtFile);
|
||||||
|
//SETFCTADDR( D2Common, 10600, D2GetItemsBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10619, D2GetNbRunesBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10620, D2GetRunesBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10668, D2GetSuperUniqueBIN);
|
||||||
|
//SETFCTADDR( D2Common, 10695, D2GetItemQuality);
|
||||||
|
//SETFCTADDR( D2Common, 10707, D2TestFlags);
|
||||||
|
//SETFCTADDR( D2Common, 10717, D2GetItemLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10719, D2ItemGetPage);
|
||||||
|
//SETFCTADDR( D2Common, 10720, D2ItemSetPage);
|
||||||
|
//SETFCTADDR( D2Common, 10731, D2CheckItemType);
|
||||||
|
//SETFCTADDR( D2Common, 10732, D2GetUniqueID);
|
||||||
|
//SETFCTADDR( D2Common, 10816, D2GetNbSocket);
|
||||||
|
//SETFCTADDR( D2Common, 11163, D2isEtheral);
|
||||||
|
//SETFCTADDR( D2Common, 10881, D2SaveItem);
|
||||||
|
//SETFCTADDR( D2Common, 10952, D2IncSkillBaseLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10968, D2GetSkillLevel);
|
||||||
|
//SETFCTADDR( D2Common, 10940, D2Common10027);
|
||||||
|
//SETFCTADDR( D2Common, 10953, D2SetSkillBaseLevel);
|
||||||
|
//SETFCTADDR( D2Common, 11232, D2GetCubeMainBIN);
|
||||||
|
//SETFCTADDR( D2Common, 11233, D2GetNbCubeMainBIN);
|
||||||
|
//SETFCTADDR( D2Common, 11276, D2GetSkillCost);
|
||||||
|
//SETFCTADDR( D2Common, 10655, D2GetDifficultyLevelsBIN);
|
||||||
|
//SETFCTADDR( D2Game, 10059, D2SetNbPlayers);
|
||||||
|
//SETFCTADDR( D2Win, 10046, D2PrintLineOnTextBox);
|
||||||
|
//SETFCTADDR( D2Win, 10117, D2PrintString);
|
||||||
|
//SETFCTADDR( D2Win, 10121, D2GetPixelLen);
|
||||||
|
//SETFCTADDR( D2Win, 10127, D2SetFont);
|
||||||
|
//SETFCTADDR( D2Win, 10129, D2PrintPopup);
|
||||||
|
//SETFCTADDR( D2Win, 10017, D2CreateTextBox);
|
||||||
|
//SETFCTADDR( D2Lang, 10007, D2GetLang);
|
||||||
|
//SETFCTADDR( D2Lang, 10004, D2GetStringFromIndex);
|
||||||
|
//SETFCTADDR( D2gfx, 10005, D2GetResolution);
|
||||||
|
//SETFCTADDR( D2gfx, 10072, D2PrintImage);
|
||||||
|
//SETFCTADDR( D2gfx, 10055, D2FillArea);
|
||||||
|
//SETFCTADDR( D2Net, 10005, D2SendToServer); //(DWORD zero, void* data, DWORD size)
|
||||||
|
//SETFCTADDR( D2Net, 10006, D2SendToClient);
|
||||||
|
//SETFCTADDR( Fog, 10023, D2FogAssertOld);
|
||||||
|
//SETFCTADDR( D2CMP, 10032, D2CMP10014);
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
|
||||||
|
//V3(ptResolutionY, DWORD*, D2Client, D50E8, D40E0, D40F0, F5C60);
|
||||||
|
//V3(ptResolutionX, DWORD*, D2Client, D50EC, D40E4, D40F4, F5C5C);
|
||||||
|
//V3(ptNegWindowStartY, DWORD*, D2Client, 125AD8, 124958, 11A74C, 11BD28);
|
||||||
|
//V3(ptWindowStartX, DWORD*, D2Client, 125AD4, 124954, 11A748, 11BD24);
|
||||||
|
//V3(ptGameTypeMode, DWORD*, D2Launch, 55818, 56088, 2CD5C, 0000);
|
||||||
|
//V3(ptClientTable, NetClient**, D2Game, F2A80, F2918, 113FB8, 111718);
|
||||||
|
//V3(ptIsLodGame, DWORD*, D2Client, 0000, 0000, 0000, FB3F4);
|
||||||
|
//V3(ptDifficultyLevel, BYTE*, D2Client, 0000, 0000, 10795C, 11BFB8);
|
||||||
|
//V3(ptMouseY, DWORD*, D2Client, 0000, 0000, 0000, 10A40C);
|
||||||
|
//V3(ptMouseX, DWORD*, D2Client, 0000, 0000, 0000, 10A410);
|
||||||
|
//V3(ptptClientChar, Unit**, D2Client, 0000, 0000, 0000, 11C4F0);
|
||||||
|
//V3(ptNbStatDesc, DWORD*, D2Client, DB918, DA828, 0000, 0000);
|
||||||
|
//V3(ptStatDescTable, DWORD*, D2Client, DAF98, D9EA8, 0000, 0000);
|
||||||
|
|
||||||
|
//V3(D2LoadImage, TD2LoadImage, D2Client, 1000, 1000, 1000, 75D00);
|
||||||
|
//V3(D2FreeImage, TD2FreeImage, D2Client, 1150, 1150, 1140, 0000);
|
||||||
|
//V3(D2CleanStatMouseUp, TD2CleanStatMouseUp, D2Client, B920, B910, BF60, 0000);
|
||||||
|
//V3(D2isLODGame, TD2isLODGame, D2Client, BA00, B9F0, C080, 0000);
|
||||||
|
//V3(D2GetDifficultyLevel,TD2GetDifficultyLevel, D2Client, 000, 000, C090, 0000);//1.09 should be BA10 (b) BA00 (d)
|
||||||
|
//V3(D2SendToServer3, TD2SendToServer3, D2Client, D210, D200, D990, 0000);
|
||||||
|
//V3(D2SendToServer7, TD2SendToServer7, D2Client, 000, 000, D9E0, 0000);
|
||||||
|
//V3(D2SendToServer5, TD2SendToServer5, D2Client, 000, 000, DA20, 0000);
|
||||||
|
//V3(D2SendToServer9, TD2SendToServer9, D2Client, 000, 000, DA40, 0000);
|
||||||
|
//V3(D2SendToServer13, TD2SendToServer13, D2Client, 000, 000, DA70, 0000);
|
||||||
|
//V3(D2SendMsgToAll, TD2SendMsgToAll, D2Client, D640, D630, DB50, 73620);
|
||||||
|
//V3(D2PrintStatsPage, TD2PrintStatsPage, D2Client, 29800, 297F0, 2FD60, 828A0);
|
||||||
|
//V3(D2SetColorPopup, TD2SetColorPopup, D2Client, 85A60, 84DE0, 80430, 9EEB0);
|
||||||
|
//V3(D2SendToServerXX, TD2SendToServerXX, D2Client, 000, 000, 000, 73260);
|
||||||
|
//V3(D2TogglePage, TD2TogglePage, D2Client, 88940, 87CC0, 83260, A1F30);
|
||||||
|
//V3(D2LoadBuySelBtn, TD2LoadBuySelBtn, D2Client, 897B0, 88B30, 84110, 9E3B0);
|
||||||
|
//V3(D2GetClientPlayer, TD2GetClientPlayer, D2Client, 8DC40, 8CFC0, 883D0, 0000);
|
||||||
|
//V3(D2PlaySound, TD2PlaySound, D2Client, B4360, B36E0, B5820, 3ACC0);
|
||||||
|
//V3(D2GetMouseX, TD2GetMouseX, D2Client, B6670, B59F0, B7BC0, 0000);
|
||||||
|
//V3(D2GetMouseY, TD2GetMouseY, D2Client, B6680, B5A00, B7BD0, 0000);
|
||||||
|
// //V3(D2FillRect, TD2FillRect, D2Client, B9970, B8CF0, BB0F0, 0000);
|
||||||
|
|
||||||
|
//V3(D2PrintStat, TD2PrintStat, D2Client, 4BB20, 4BB20, 521C0, B8CB0);
|
||||||
|
|
||||||
|
//V3(D2AddClient, TD2AddClient, D2Game, 000, 000, 6C60, E3DA0);
|
||||||
|
//V3(D2SendPacket, TD2SendPacket, D2Game, C380, C650, C710, 41420);
|
||||||
|
//V3(D2GetGameByClientID, TD2GetGameByClientID, D2Game, 000, 000, 94E0, E0520);
|
||||||
|
//V3(D2BroadcastFunction, TD2BroadcastFunction, D2Game, 000, 000, B0E0, DF250);
|
||||||
|
//V3(D2SetSkillBaseLevelOnClient, TD2SetSkillBaseLevelOnClient,D2Game, D650, D920, DB50, 44D00);
|
||||||
|
//V3(D2VerifIfNotCarry1, TD2VerifIfNotCarry1, D2Game, 000, 000, 128F0, 38D90);
|
||||||
|
//V3(D2TestPositionInRoom,TD2TestPositionInRoom, D2Game, 000, 000, 22070, 01090);
|
||||||
|
//V3(D2LoadInventory, TD2LoadInventory, D2Game, 4F100, 4F500, 5B8A0, B9D70);
|
||||||
|
//V3(D2GameGetObject, TD2GameGetObject, D2Game, 7BAE0, 7BFD0, 8BB00, 97620);
|
||||||
|
//V3(D2GetClient, TD2GetClient, D2Game, 7C2C0, 7C7B0, 8C2E0, 000);
|
||||||
|
//V3(D2GetOwnerMonster, TD2GetOwnerMonster, D2Game, 000, 000, 9F320, 501C0);
|
||||||
|
//V3(D2ReadFile, TD2ReadFile, D2Common, 738A4, 739B4, 84268, 96E0);//1.11
|
||||||
|
//V3(D2CompileCubeInput, TD2CompileCubeInput, D2Common, 000, 000, 12410, 5D7D0);
|
||||||
|
//V3(D2CompileCubeOutput, TD2CompileCubeOutput, D2Common, 000, 000, 12910, 5D210);
|
||||||
|
//V3(D2GetCharStatsBIN, TD2GetCharStatsBIN, D2Common, 000, 000, 82C80, 015D0);
|
||||||
|
//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(D2ReloadGambleScreen,TD2ReloadGambleScreen, D2Game, 000, 000, 000, 8E480);
|
||||||
|
//V3(D2SaveGame, TD2SaveGame, D2Game, 000, 000, 89C0, E2390);
|
||||||
|
//V3(D2ClickOnStashButton,TD2ClickOnStashButton, D2Client, 000, 000, 000, A6520);
|
||||||
|
//V3(D2CreateUnit, TD2CreateUnit, D2Game, 000, 000, 000, 99760);
|
||||||
|
//V3(D2LinkPortal, TD2LinkPortal, D2Game, 000, 000, 000, 27230);
|
||||||
|
//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);
|
||||||
|
|
||||||
|
//#undef V3
|
||||||
|
|
||||||
|
//V2SetPlayerStat = D2SetPlayerStat;
|
||||||
|
V2AddPlayerStat = D2AddPlayerStat;
|
||||||
|
V2GetPlayerStat = D2GetPlayerStat;
|
||||||
|
//V2GetPlayerStat20 = D2GetPlayerStat20;
|
||||||
|
V2GetPlayerBaseStat = D2GetPlayerBaseStat;
|
||||||
|
V2SetSkillBaseLevel = D2SetSkillBaseLevel;
|
||||||
|
V2SetSkillBaseLevelOnClient = D2SetSkillBaseLevelOnClient;
|
||||||
|
V2PrintStat = D2PrintStat;
|
||||||
|
V2SendMsgToAll = D2SendMsgToAll;
|
||||||
|
V2SetColorPopup = D2SetColorPopup;
|
||||||
|
V2LoadImage = D2LoadImage;
|
||||||
|
V2PlaySound = D2PlaySound;
|
||||||
|
V2GetCharStatsBIN = D2GetCharStatsBIN;
|
||||||
|
V2GetItemStatCostBIN = D2GetItemStatCostBIN;
|
||||||
|
V2SendToServer = D2SendToServer;
|
||||||
|
V2SendPacket = D2SendPacket;
|
||||||
|
V2LoadInventory = D2LoadInventory;
|
||||||
|
V2CompileCubeInput = D2CompileCubeInput;
|
||||||
|
V2CompileCubeOutput = D2CompileCubeOutput;
|
||||||
|
V2BroadcastFunction = D2BroadcastFunction;
|
||||||
|
V2GetGameByClientID = D2GetGameByClientID;
|
||||||
|
V2SpawnMonster = D2SpawnMonster;
|
||||||
|
V2VerifIfNotCarry1 = D2VerifIfNotCarry1;
|
||||||
|
V2GameGetObject = D2GameGetObject;
|
||||||
|
V2TestPositionInRoom = D2TestPositionInRoom;
|
||||||
|
V2GetItemTypesBIN = D2GetItemTypesBIN;
|
||||||
|
V2SaveGame = D2SaveGame;
|
||||||
|
//V2OpenNPCMenu = D2OpenNPCMenu;
|
||||||
|
//////////////// REDIRECT ON CUSTOM FUNCTIONS ////////////////
|
||||||
|
|
||||||
|
if ( version_D2Client >= V111 )
|
||||||
|
{
|
||||||
|
D2SendMsgToAll = (TD2SendMsgToAll) D2SendMsgToAll_111;
|
||||||
|
D2SetColorPopup = (TD2SetColorPopup) D2SetColorPopup_111;
|
||||||
|
D2LoadImage = (TD2LoadImage) D2LoadImage_111;
|
||||||
|
D2FreeImage = (TD2FreeImage) D2FreeImage_111;
|
||||||
|
D2PlaySound = (TD2PlaySound) D2PlaySound_111;
|
||||||
|
D2GetClient = (TD2GetClient) D2GetClient_111;
|
||||||
|
D2SendToServer3 = (TD2SendToServer3) D2SendToServer3_111;
|
||||||
|
D2SetSkillBaseLevelOnClient = (TD2SetSkillBaseLevelOnClient) D2SetSkillBaseLevelOnClient_111;
|
||||||
|
D2GetCharStatsBIN = (TD2GetCharStatsBIN) D2GetCharStatsBIN_111;
|
||||||
|
D2GetItemStatCostBIN = (TD2GetItemStatCostBIN) D2GetItemStatCostBIN_111;
|
||||||
|
D2PrintStat = (TD2PrintStat) D2PrintStat_111;
|
||||||
|
D2SendPacket = (TD2SendPacket) D2SendPacket_111;
|
||||||
|
D2LoadInventory = (TD2LoadInventory) D2LoadInventory_111;
|
||||||
|
D2CompileCubeInput = (TD2CompileCubeInput) D2CompileCubeInput_111;
|
||||||
|
D2CompileCubeOutput = (TD2CompileCubeOutput) D2CompileCubeOutput_111;
|
||||||
|
D2BroadcastFunction = (TD2BroadcastFunction) D2BroadcastFunction_111;
|
||||||
|
D2SpawnMonster = version_D2Game >= V111b ? (TD2SpawnMonster)D2SpawnMonster_111b : (TD2SpawnMonster)D2SpawnMonster_111;
|
||||||
|
D2VerifIfNotCarry1 = (TD2VerifIfNotCarry1) D2VerifIfNotCarry1_111;
|
||||||
|
D2GameGetObject = (TD2GameGetObject) D2GameGetObject_111;
|
||||||
|
D2GetItemTypesBIN = (TD2GetItemTypesBIN) D2GetItemTypesBIN_111;
|
||||||
|
D2TestPositionInRoom = (TD2TestPositionInRoom) D2TestPositionInRoom_111;
|
||||||
|
//D2OpenNPCMenu = (TD2OpenNPCMenu) D2OpenNPCMenu_111;
|
||||||
|
D2isLODGame = D2isLODGame_111;
|
||||||
|
D2GetDifficultyLevel = D2GetDifficultyLevel_111;
|
||||||
|
D2GetMouseX = D2GetMouseX_111;
|
||||||
|
D2GetMouseY = D2GetMouseY_111;
|
||||||
|
D2GetClientPlayer = D2GetClientPlayer_111;
|
||||||
|
D2GetRealItem = D2GetRealItem_111;
|
||||||
|
D2CleanStatMouseUp = D2CleanStatMouseUp_111;
|
||||||
|
StatMouse1 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C004, 11C2F4, 11C040, 11C3DC);
|
||||||
|
StatMouse2 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C008, 11C2F8, 11C044, 11C3E0);
|
||||||
|
StatMouse3 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C020, 11C310, 11C05C, 11C3F8);
|
||||||
|
StatMouse4 = (DWORD*)R7(D2Client, 0000, 0000, 0000, 11C024, 11C314, 11C060, 11C3FC);
|
||||||
|
} else {
|
||||||
|
D2SendToServer = (TD2SendToServer) D2SendToServer_1XX;
|
||||||
|
D2GetGameByClientID = (TD2GetGameByClientID) D2GetGameByClientID_1XX;
|
||||||
|
D2SaveGame = (TD2SaveGame) D2SaveGame_1XX;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( version_D2Common <= V109d )
|
||||||
|
{
|
||||||
|
//D2SetPlayerStat = (TD2SetPlayerStat) D2SetPlayerStat_9;
|
||||||
|
D2AddPlayerStat = (TD2AddPlayerStat) D2AddPlayerStat_9;
|
||||||
|
D2GetPlayerStat = (TD2GetPlayerStat) D2GetPlayerStat_9;
|
||||||
|
//D2GetPlayerStat20 = (TD2GetPlayerStat20) D2GetPlayerStat20_9;
|
||||||
|
D2GetPlayerBaseStat = (TD2GetPlayerBaseStat) D2GetPlayerBaseStat_9;
|
||||||
|
D2SetSkillBaseLevel = (TD2SetSkillBaseLevel) D2SetSkillBaseLevel_9;
|
||||||
|
D2GetCharStatsBIN = (TD2GetCharStatsBIN) D2GetCharStatsBIN_9;
|
||||||
|
D2GetItemStatCostBIN = (TD2GetItemStatCostBIN) D2GetItemStatCostBIN_9;
|
||||||
|
D2GetItemTypesBIN = (TD2GetItemTypesBIN) D2GetItemTypesBIN_9;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( version_D2Client <= V109d )
|
||||||
|
D2PrintStat = (TD2PrintStat) D2PrintStat_9;
|
||||||
|
|
||||||
|
if ( version_D2Game <= V109d )
|
||||||
|
D2SetSkillBaseLevelOnClient = (TD2SetSkillBaseLevelOnClient) D2SetSkillBaseLevelOnClient_9;
|
||||||
|
|
||||||
|
|
||||||
|
//////////////// STRUCTURE MANAGEMENT ////////////////
|
||||||
|
|
||||||
|
// shifting.ptPYPlayerData = V7(D2Common,118,118,F4,F4,F4,F4,F4);
|
||||||
|
shifting.ptPYPlayerData = *(DWORD*)((DWORD)D2InitPlayerData + V7(D2Common,5D,5D,5D,49,49,49,49));
|
||||||
|
shifting.ptSpecificData = V7(D2Common,70,70,14,14,14,14,14);
|
||||||
|
shifting.ptGame = V7(D2Common,A4,A4,80,80,80,80,80);
|
||||||
|
shifting.ptClientGame = V7(D2Common,170,194,1A8,1A8,1A8,1A8,1A8);
|
||||||
|
shifting.ptInventory = V7(D2Common,84,84,60,60,60,60,60);
|
||||||
|
shifting.ptSkills = V7(D2Common,CC,CC,A8,A8,A8,A8,A8);
|
||||||
|
shifting.ptImage = V7(D2Common,04,04,04,08,08,3C,34);
|
||||||
|
shifting.ptFrame = V7(D2Common,08,08,08,44,44,40,00);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
562
PlugY/D2wrapper.cpp
Normal file
562
PlugY/D2wrapper.cpp
Normal file
@ -0,0 +1,562 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
@file D2wrapper.cpp
|
||||||
|
@brief Main Diablo II extra DLL handler.
|
||||||
|
|
||||||
|
This is the sources of the D2DLL class.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
// Core Class Headers
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "customLibraries.h"
|
||||||
|
|
||||||
|
/* Beginning of Custom Header */
|
||||||
|
#include "globalVariable.h" // Install_VariableOnRealm()
|
||||||
|
#include "commands.h" // Install_Commands()
|
||||||
|
#include "othersFeatures.h" // Install_ChangeResolution()
|
||||||
|
#include "mainScreen.h" // Install_PrintPlugYVersion() Install_VersionChange()
|
||||||
|
#include "savePath.h" // Install_ChangingSavePath()
|
||||||
|
#include "bigStash.h" // Install_BigStash()
|
||||||
|
#include "skillPerLevelUp.h" // Install_SkillPerLevelUp()
|
||||||
|
#include "statPerLevelUp.h" // Install_StatPerLevelUp()
|
||||||
|
#include "statsPoints.h" // Install_StatsPoints() Install_StatsLimitShiftClick()
|
||||||
|
#include "skillsPoints.h" // Install_SkillsPoints()
|
||||||
|
#include "infinityStash.h" // Install_MultiPageStash()
|
||||||
|
#include "newInterfaces.h" // Install_NewInterfaces()
|
||||||
|
#include "worldEvent.h" // Install_WorldEvent()
|
||||||
|
#include "uberQuest.h" // Install_UberQuest()
|
||||||
|
#include "extraOptions.h" // Install_AlwaysRegenMapInSP()
|
||||||
|
#include "language.h" // Install_LanguageManagement()
|
||||||
|
|
||||||
|
|
||||||
|
int version_SmackW32=V113;
|
||||||
|
int version_D2Common=V113;
|
||||||
|
int version_ijl11=V113;
|
||||||
|
int version_D2Gdi=V113;
|
||||||
|
int version_D2Win=V113;
|
||||||
|
int version_D2sound=V113;
|
||||||
|
int version_D2MCPCLI=V113;
|
||||||
|
int version_D2Launch=V113;
|
||||||
|
int version_D2gfx=V113;
|
||||||
|
int version_D2Client=V113;
|
||||||
|
int version_D2Net=V113;
|
||||||
|
int version_D2Lang=V113;
|
||||||
|
int version_D2Game=V113;
|
||||||
|
int version_D2CMP=V113;
|
||||||
|
int version_Bnclient=V113;
|
||||||
|
int version_Fog=V113;
|
||||||
|
int version_Storm=V113;
|
||||||
|
|
||||||
|
|
||||||
|
DWORD offset_SmackW32=NULL;
|
||||||
|
DWORD offset_D2Common=NULL;
|
||||||
|
DWORD offset_ijl11=NULL;
|
||||||
|
DWORD offset_D2Gdi=NULL;
|
||||||
|
DWORD offset_D2Win=NULL;
|
||||||
|
DWORD offset_D2sound=NULL;
|
||||||
|
DWORD offset_D2Multi=NULL;
|
||||||
|
DWORD offset_D2MCPCLI=NULL;
|
||||||
|
DWORD offset_D2Launch=NULL;
|
||||||
|
DWORD offset_D2gfx=NULL;
|
||||||
|
DWORD offset_D2Game=NULL;
|
||||||
|
DWORD offset_D2Client=NULL;
|
||||||
|
DWORD offset_D2Net=NULL;
|
||||||
|
DWORD offset_D2Lang=NULL;
|
||||||
|
DWORD offset_D2CMP=NULL;
|
||||||
|
DWORD offset_Bnclient=NULL;
|
||||||
|
DWORD offset_Fog=NULL;
|
||||||
|
DWORD offset_Storm=NULL;
|
||||||
|
// manque : Game.exe D2DDraw.dll D2Direct3D.dll D2Glide.dll
|
||||||
|
|
||||||
|
const char* S_SmackW32 = "SmackW32.dll";
|
||||||
|
const char* S_D2Common = "D2Common.dll";
|
||||||
|
const char* S_ijl11 = "ijl11.dll";
|
||||||
|
const char* S_D2Gdi = "D2Gdi.dll";
|
||||||
|
const char* S_D2Win = "D2Win.dll";
|
||||||
|
const char* S_D2sound = "D2sound.dll";
|
||||||
|
const char* S_D2Multi = "D2Multi.dll";
|
||||||
|
const char* S_D2MCPCLI = "D2MCPClient.dll";
|
||||||
|
const char* S_D2Launch = "D2Launch.dll";
|
||||||
|
const char* S_D2gfx = "D2gfx.dll";
|
||||||
|
const char* S_D2Game = "D2Game.dll";
|
||||||
|
const char* S_D2Client = "D2Client.dll";
|
||||||
|
const char* S_D2Net = "D2Net.dll";
|
||||||
|
const char* S_D2Lang = "D2Lang.dll";
|
||||||
|
const char* S_D2CMP = "D2CMP.dll";
|
||||||
|
const char* S_Bnclient = "Bnclient.dll";
|
||||||
|
const char* S_Fog = "Fog.dll";
|
||||||
|
const char* S_Storm = "Storm.dll";
|
||||||
|
|
||||||
|
const char* S_CloneBattles ="CloneBattles.dll";
|
||||||
|
const char* S_DarkAlliance ="DarkAlliance.dll";
|
||||||
|
|
||||||
|
DWORD loadLibrary( const char* libraryName)
|
||||||
|
{
|
||||||
|
DWORD offset;
|
||||||
|
/* char currentpath[MAX_PATH];
|
||||||
|
|
||||||
|
if (!strcmp(libraryName,"D2Common.dll") || !strcmp(libraryName,"D2Game.dll") || !strcmp(libraryName,"D2Client.dll"))
|
||||||
|
{
|
||||||
|
GetCurrentDirectory(MAX_PATH,currentpath);
|
||||||
|
strncat(currentpath,"\\",MAX_PATH);
|
||||||
|
strncat(currentpath,libraryName,MAX_PATH);
|
||||||
|
log_msg("Load = %s : ",currentpath);
|
||||||
|
offset = (DWORD)LoadLibrary(currentpath);
|
||||||
|
log_msg("offset = %08X\n",offset);
|
||||||
|
if (offset)
|
||||||
|
{
|
||||||
|
log_msg("%s loaded successfully at: %08X\n", libraryName, offset);
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
offset = (DWORD)LoadLibrary(libraryName);
|
||||||
|
if (!offset)
|
||||||
|
{
|
||||||
|
log_msg("Failed to load library : %s\n", libraryName);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
log_msg("%s loaded successfully at: %08X\n", libraryName, offset);
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeLibrary( DWORD library )
|
||||||
|
{
|
||||||
|
if (library)
|
||||||
|
FreeLibrary((HINSTANCE__ *)library);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the protection scheme of a loaded
|
||||||
|
// DLL called libraryName in memory space at address addr+size to allow us to customize it.
|
||||||
|
void hookLibrary(const char* libraryName, DWORD addr)
|
||||||
|
{
|
||||||
|
DWORD dw=0;
|
||||||
|
BYTE* offsetPESignature = addr + *(BYTE**)((BYTE*)addr + 0x3C);
|
||||||
|
DWORD sizeOfCode = *(DWORD*)(offsetPESignature + 0x1C);
|
||||||
|
BYTE* baseOfCode = addr + *(BYTE**)(offsetPESignature + 0x2C);
|
||||||
|
if( !VirtualProtect(baseOfCode, sizeOfCode, PAGE_EXECUTE_READWRITE, &dw) )
|
||||||
|
{
|
||||||
|
log_msg("Failed to hook library : %s. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
log_msg("%s successfully hooked. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unhookLibrary(const char* libraryName, DWORD addr)
|
||||||
|
{
|
||||||
|
DWORD dw=0;
|
||||||
|
BYTE* offsetPESignature = addr + *(BYTE**)((BYTE*)addr + 0x3C);
|
||||||
|
DWORD sizeOfCode = *(DWORD*)(offsetPESignature + 0x1C);
|
||||||
|
BYTE* baseOfCode = addr + *(BYTE**)(offsetPESignature + 0x2C);
|
||||||
|
if( !VirtualProtect(baseOfCode, sizeOfCode, PAGE_EXECUTE_READ, &dw) )
|
||||||
|
log_msg("Failed to unhook library : %s. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode);
|
||||||
|
else
|
||||||
|
log_msg("%s successfully unhooked. (%08X,%08X)\n", libraryName ,baseOfCode, sizeOfCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loadD2Libraries ()
|
||||||
|
{
|
||||||
|
log_msg("***** Load D2 Libraries *****\n");
|
||||||
|
|
||||||
|
offset_SmackW32 = loadLibrary( S_SmackW32); //0xD000 0x03B90000 Already Loaded -
|
||||||
|
offset_D2Common = loadLibrary( S_D2Common); //0x8D000 0x037A0000 0x7C000
|
||||||
|
offset_ijl11 = loadLibrary( S_ijl11); //0x24000 0x60000000 Already Loaded -
|
||||||
|
offset_D2Gdi = loadLibrary( S_D2Gdi); //0x7000 0x6F830000 Already Loaded -
|
||||||
|
offset_D2Win = loadLibrary( S_D2Win); //0x19000 0x6F8A0000 Already Loaded 0x1C000
|
||||||
|
offset_D2sound = loadLibrary( S_D2sound); //0xC000 0x6F980000 Already Loaded 0xD000
|
||||||
|
// offset_D2Multi = loadLibrary( S_D2Multi); //0x1000 0x6F9A0000 ?
|
||||||
|
// offset_D2MCPCLI = loadLibrary( S_D2MCPCLI); //0x6000 0x6F9F0000 Already Loaded -
|
||||||
|
offset_D2Launch = loadLibrary( S_D2Launch); //0x20000 0x6FA10000 Already Loaded 0x1E000
|
||||||
|
offset_D2gfx = loadLibrary( S_D2gfx); //0xB000 0x6FA70000 Already Loaded -
|
||||||
|
offset_D2Game = loadLibrary( S_D2Game); //0xF6000 0x6FC30000 0xCF000
|
||||||
|
offset_D2Client = loadLibrary( S_D2Client); //0xCC000 0x6FAA0000 0xCA000
|
||||||
|
offset_D2Net = loadLibrary( S_D2Net); //0x6000 0x6FC00000 Already Loaded -
|
||||||
|
offset_D2Lang = loadLibrary( S_D2Lang); //0x0A000 0x6FC10000 Already Loaded -
|
||||||
|
offset_D2CMP = loadLibrary( S_D2CMP); //0x18000 0x6FDF0000 Already Loaded 0x19000
|
||||||
|
offset_Bnclient = loadLibrary( S_Bnclient); //0x15000 0x6FF00000 Already Loaded -
|
||||||
|
offset_Fog = loadLibrary( S_Fog); //0x20000 0x6FF50000 Already Loaded 0x1F000
|
||||||
|
offset_Storm = loadLibrary( S_Storm); //0x30000 0x6FFB0000 Already Loaded -
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void freeD2Libraries()
|
||||||
|
{
|
||||||
|
log_msg("***** Free Libraries *****\n");
|
||||||
|
|
||||||
|
freeLibrary( offset_SmackW32 );
|
||||||
|
freeLibrary( offset_D2Common );
|
||||||
|
freeLibrary( offset_ijl11 );
|
||||||
|
freeLibrary( offset_D2Gdi );
|
||||||
|
freeLibrary( offset_D2Win );
|
||||||
|
freeLibrary( offset_D2sound );
|
||||||
|
// freeLibrary( offset_D2Multi );
|
||||||
|
// freeLibrary( offset_D2MCPCLI );
|
||||||
|
freeLibrary( offset_D2Launch );
|
||||||
|
freeLibrary( offset_D2gfx );
|
||||||
|
freeLibrary( offset_D2Game );
|
||||||
|
freeLibrary( offset_D2Client );
|
||||||
|
freeLibrary( offset_D2Net );
|
||||||
|
freeLibrary( offset_D2Lang );
|
||||||
|
freeLibrary( offset_D2CMP );
|
||||||
|
freeLibrary( offset_Bnclient );
|
||||||
|
freeLibrary( offset_Fog );
|
||||||
|
freeLibrary( offset_Storm );
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void hookLibraries()
|
||||||
|
{
|
||||||
|
log_msg("***** Unprotect Libraries *****\n");
|
||||||
|
|
||||||
|
hookLibrary(S_D2Common, offset_D2Common);
|
||||||
|
hookLibrary(S_D2Client, offset_D2Client);
|
||||||
|
hookLibrary(S_D2Lang, offset_D2Lang);
|
||||||
|
hookLibrary(S_D2Game, offset_D2Game);
|
||||||
|
hookLibrary(S_Fog, offset_Fog);
|
||||||
|
hookLibrary(S_Storm, offset_Storm);
|
||||||
|
// hookLibrary(S_D2Win, offset_D2Win);
|
||||||
|
hookLibrary(S_D2Launch, offset_D2Launch);
|
||||||
|
hookLibrary(S_D2gfx, offset_D2gfx);
|
||||||
|
// hookLibrary(S_D2Gdi, offset_D2Gdi);
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void unhookLibraries()
|
||||||
|
{
|
||||||
|
log_msg("***** Reprotect Libraries *****\n");
|
||||||
|
|
||||||
|
unhookLibrary(S_D2Common, offset_D2Common);
|
||||||
|
unhookLibrary(S_D2Client, offset_D2Client);
|
||||||
|
unhookLibrary(S_D2Lang, offset_D2Lang);
|
||||||
|
unhookLibrary(S_D2Game, offset_D2Game);
|
||||||
|
unhookLibrary(S_Fog, offset_Fog);
|
||||||
|
unhookLibrary(S_Storm, offset_Storm);
|
||||||
|
// unhookLibrary(S_D2Win, offset_D2Win);
|
||||||
|
unhookLibrary(S_D2Launch, offset_D2Launch);
|
||||||
|
unhookLibrary(S_D2gfx, offset_D2gfx);
|
||||||
|
// unhookLibrary(S_D2Gdi, offset_D2Gdi);
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeCustomLibraries()
|
||||||
|
{
|
||||||
|
log_msg("***** Free custom libraries *****\n");
|
||||||
|
|
||||||
|
TCustomDll* dll=customDlls;
|
||||||
|
TCustomDll* nextDll;
|
||||||
|
while (dll)
|
||||||
|
{
|
||||||
|
dll->release();
|
||||||
|
freeLibrary(dll->offset);
|
||||||
|
nextDll = dll->nextDll;
|
||||||
|
D2FogMemDeAlloc(dll,__FILE__,__LINE__,0);
|
||||||
|
dll = nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initCustomLibraries()
|
||||||
|
{
|
||||||
|
log_msg("***** Init custom libraries *****\n");
|
||||||
|
|
||||||
|
TCustomDll* dll=customDlls;
|
||||||
|
while (dll)
|
||||||
|
{
|
||||||
|
dll->init();
|
||||||
|
dll = dll->nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadCustomLibraries()
|
||||||
|
{
|
||||||
|
char* curString = NULL;
|
||||||
|
TCustomDll* nextDll;
|
||||||
|
DWORD offset_currentDll;
|
||||||
|
|
||||||
|
log_msg("***** Custom libraries *****\n");
|
||||||
|
|
||||||
|
if (dllFilenames)
|
||||||
|
curString = strtok(dllFilenames,"|");
|
||||||
|
|
||||||
|
if (!curString)
|
||||||
|
log_msg("No custom libraries to load.\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_msg("Load custom libraries :\n");
|
||||||
|
while (curString)
|
||||||
|
{
|
||||||
|
if (curString[0])
|
||||||
|
{
|
||||||
|
offset_currentDll = loadLibrary(curString);
|
||||||
|
if (offset_currentDll)
|
||||||
|
{
|
||||||
|
nextDll = customDlls;
|
||||||
|
customDlls = new(TCustomDll);
|
||||||
|
customDlls->nextDll = nextDll;
|
||||||
|
customDlls->initialize(offset_currentDll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curString=strtok(NULL,"|");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dllFilenames)
|
||||||
|
D2FogMemDeAlloc(dllFilenames,__FILE__,__LINE__,0);
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
void getVersion(DWORD addr, DWORD addr111, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111a, DWORD v111b, DWORD v112, DWORD v113, const char * filename)
|
||||||
|
{
|
||||||
|
log_msg("version of %s\t",filename);
|
||||||
|
|
||||||
|
if (addr==v109b) {
|
||||||
|
*ver = V109b;
|
||||||
|
log_msg("1.09b\n");
|
||||||
|
} else if (addr==v109d) {
|
||||||
|
*ver = V109d;
|
||||||
|
log_msg("1.09d\n");
|
||||||
|
} else if (addr==v110) {
|
||||||
|
*ver = V110;
|
||||||
|
log_msg("1.10\n");
|
||||||
|
} else if ((addr==v111) && (addr111==v111a)) {
|
||||||
|
*ver = V111;
|
||||||
|
log_msg("1.11\n");
|
||||||
|
} else if ((addr==v111) && (addr111==v111b)) {
|
||||||
|
*ver = V111b;
|
||||||
|
log_msg("1.11b\n");
|
||||||
|
} else if (addr==v112) {
|
||||||
|
*ver = V112;
|
||||||
|
log_msg("1.12\n");
|
||||||
|
} else if (addr==v113) {
|
||||||
|
*ver = V113;
|
||||||
|
log_msg("1.13\n");
|
||||||
|
} else {
|
||||||
|
*ver = V113;
|
||||||
|
log_msg("unknow, try with 1.13\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define GET_VERSION(F,X,Y,A,B,C,D,E,G,H,I) getVersion(*(DWORD*)(offset_##F + 0x##X), *(DWORD*)(offset_##F + 0x##Y), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, 0x##I, S_##F)
|
||||||
|
bool initD2version()
|
||||||
|
{
|
||||||
|
log_msg("***** Get dll versions *****\n");
|
||||||
|
|
||||||
|
|
||||||
|
//GET_VERSION(SmackW32
|
||||||
|
GET_VERSION(D2Common, 80, 108, B03A26A0, 9E3DE7CC, 0355C185, 8402CA7A, 42E6C2E5, 43028BA5, E58C71DA, 00000000);
|
||||||
|
//GET_VERSION(ijl11
|
||||||
|
GET_VERSION(D2Gdi, 80, 108, 90CFD95A, 86CE337B, A8CCC67B, 06059D7D, 42E6C248, 43028B2F, 5D6490A2, 00000000);
|
||||||
|
GET_VERSION(D2Win, 80, 108, B595A0CD, 1995DAD2, A8F5E2FD, B6DAB75A, 42E6C266, 43028B44, 6AA01FF5, 00000000);
|
||||||
|
//GET_VERSION(D2sound
|
||||||
|
//GET_VERSION(D2MCPCLI
|
||||||
|
GET_VERSION(D2Launch, 80, 100, A66532FF, 66678CC5, 686223E5, 80B0E2C6, 42E6C275, 43028B50, 205A4C0F, 00000000);
|
||||||
|
GET_VERSION(D2gfx, 80, 110, 00949FA8, 018866A8, 401526B2, 575C8A5E, 42E6C22A, 43028B19, ACBE1B9E, 00000000);
|
||||||
|
GET_VERSION(D2Client, 80, 108, 03522F39, 6730B639, C9817825, 37EC6E13, 42E6C43F, 43028CA5, 61A3B3D5, 00000000);
|
||||||
|
GET_VERSION(D2Net, 80, 0F0, E60F4DEA, 940E178B, 890FCC0B, C293A9D5, 42E6C20D, 43028B05, 19FA9F76, 00000000);
|
||||||
|
GET_VERSION(D2Lang, 80, 0F8, 111DCCB7, 13978953, DF917353, B91BAEA2, 42E6C213, 43028B09, B7B3978E, 00000000);
|
||||||
|
GET_VERSION(D2Game, 80, 108, B0805792, 8BB2C392, 92FA18E6, 00B6F7B7, 42E6C375, 43028C0D, BD8DD8E5, 00000000);
|
||||||
|
GET_VERSION(D2CMP, 80, 0F8, BA755486, 9A77DFEE, 38F44382, 4059B13F, 42E6C203, 43028AFE, 33A9427B, 00000000);
|
||||||
|
//GET_VERSION(Bnclient
|
||||||
|
GET_VERSION(Fog, 80, 100, 6F16123B, 75990846, 7E7ED3C7, D333B997, 42E6C1F0, 43028AF2, D3BD4F1B, 00000000);
|
||||||
|
GET_VERSION(Storm, E0, 110, 3B4B41D8, 3B8AB1CE, 00004550, 9C2BECC4, 42E6C1CA, 43028AD9, E4FA2944, 00000000);
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
void getVersion(DWORD addr, int* ver, DWORD v109b, DWORD v109d, DWORD v110, DWORD v111, DWORD v111b, DWORD v112, DWORD v113, const char * filename)
|
||||||
|
{
|
||||||
|
log_msg("version of %s\t",filename);
|
||||||
|
|
||||||
|
if (addr==v109b) {
|
||||||
|
*ver = V109b;
|
||||||
|
log_msg("1.09b\n");
|
||||||
|
} else if (addr==v109d) {
|
||||||
|
*ver = V109d;
|
||||||
|
log_msg("1.09d\n");
|
||||||
|
} else if (addr==v110) {
|
||||||
|
*ver = V110;
|
||||||
|
log_msg("1.10\n");
|
||||||
|
} else if (addr==v111) {
|
||||||
|
*ver = V111;
|
||||||
|
log_msg("1.11\n");
|
||||||
|
} else if (addr==v111b) {
|
||||||
|
*ver = V111b;
|
||||||
|
log_msg("1.11b\n");
|
||||||
|
} else if (addr==v112) {
|
||||||
|
*ver = V112;
|
||||||
|
log_msg("1.12\n");
|
||||||
|
} else if (addr==v113) {
|
||||||
|
*ver = V113;
|
||||||
|
log_msg("1.13\n");
|
||||||
|
} else {
|
||||||
|
*ver = V113;
|
||||||
|
log_msg("unknow, try with 1.13\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define GET_VERSION(F,X,A,B,C,D,E,G,H) getVersion(*(DWORD*)(offset_##F + 0x##X), &version_##F, 0x##A, 0x##B, 0x##C, 0x##D, 0x##E, 0x##G, 0x##H, S_##F)
|
||||||
|
bool initD2version()
|
||||||
|
{
|
||||||
|
log_msg("***** Get dll versions *****\n");
|
||||||
|
|
||||||
|
//GET_VERSION(SmackW32
|
||||||
|
GET_VERSION(D2Common, 10CA, A1E86FDC, B1E86FDC, 72D03B42, F883057E, 16746AC6, 00FE81C3, 74FE85DB);
|
||||||
|
//GET_VERSION(ijl11
|
||||||
|
GET_VERSION(D2Gdi, 105, B4000000, 0B210E00, E4000000, 48000401, 2F000401, 00000000, B7000401);
|
||||||
|
GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8);
|
||||||
|
//GET_VERSION(D2sound
|
||||||
|
//GET_VERSION(D2MCPCLI
|
||||||
|
GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045);
|
||||||
|
GET_VERSION(D2gfx, 10D, EB000000, 006FA700, 00000010, 2A000401, 19000401, 0B210E00, 00000000);
|
||||||
|
GET_VERSION(D2Client, 17F, 00000000, 14500000, 12500000, 0D814800, 0D812800, 0DA01000, 0DA03000);
|
||||||
|
GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808);
|
||||||
|
GET_VERSION(D2Lang, 126D, FC45048B, F445048B, 02C18313, C4830000, 00C6E045, 8B48408B, 0C75FF0C);
|
||||||
|
// GET_VERSION(D2Game, 1010, D22A78A1, D22910A1, D43FB0A1, 03E8506F, 53E8506F, 89E8506F, 63E8506F);
|
||||||
|
GET_VERSION(D2Game, 1092, 18968BF1, 38968BF1, 28968BF1, F6335608, C690C5B9, 895FD713, 56535700);
|
||||||
|
GET_VERSION(D2CMP, 1359, 3C686FE0, 38686FE0, 8BF78B56, 4C880424, 07C71824, CCCCCCCC, C7000005);
|
||||||
|
//GET_VERSION(Bnclient
|
||||||
|
GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95);
|
||||||
|
GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404);
|
||||||
|
|
||||||
|
log_msg("\n\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//////////////////////////////////// EXPORTS FUNCTIONS ////////////////////////////////////
|
||||||
|
|
||||||
|
extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
|
||||||
|
{
|
||||||
|
if (IniName) log_msg("* PlugY is called from D2mod.dll\n\n");
|
||||||
|
else log_msg("* PlugY is called from D2gfx.dll\n\n");
|
||||||
|
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return NULL;
|
||||||
|
isInstalled=true;
|
||||||
|
|
||||||
|
loadD2Libraries();
|
||||||
|
|
||||||
|
if (!initD2version()) return NULL;
|
||||||
|
|
||||||
|
if (!initD2functions()) return NULL;
|
||||||
|
|
||||||
|
loadParameters();
|
||||||
|
|
||||||
|
if (!active_plugin) return NULL;
|
||||||
|
|
||||||
|
loadCustomLibraries();
|
||||||
|
|
||||||
|
hookLibraries();
|
||||||
|
|
||||||
|
log_msg("***** INSTALL FUNCTIONS *****\n");
|
||||||
|
|
||||||
|
Install_VariableOnRealm();
|
||||||
|
|
||||||
|
if (active_Commands)
|
||||||
|
Install_Commands();
|
||||||
|
|
||||||
|
if (active_ChangeLanguage || active_LanguageManagement)
|
||||||
|
Install_LanguageManagement();
|
||||||
|
|
||||||
|
if (active_VersionTextChange)
|
||||||
|
Install_VersionChange();
|
||||||
|
|
||||||
|
if (active_PrintPlugYVersion)
|
||||||
|
Install_PrintPlugYVersion();
|
||||||
|
|
||||||
|
if (active_StatsPoints)
|
||||||
|
Install_StatsPoints();
|
||||||
|
else if (active_DisplayBaseStatsValue)
|
||||||
|
Install_DisplayBaseStatsValue();
|
||||||
|
|
||||||
|
if (active_SkillsPoints)
|
||||||
|
Install_SkillsPoints();
|
||||||
|
|
||||||
|
if (active_changingSavePath)
|
||||||
|
Install_ChangingSavePath();
|
||||||
|
|
||||||
|
if (active_StatsShiftClickLimit)
|
||||||
|
Install_StatsLimitShiftClick();
|
||||||
|
|
||||||
|
if (active_RunLODs)
|
||||||
|
Install_RunLODs();
|
||||||
|
|
||||||
|
if (active_bigStash)
|
||||||
|
Install_BigStash();
|
||||||
|
|
||||||
|
if (active_SkillPerLevelUpChange)
|
||||||
|
Install_SkillPerLevelUp();
|
||||||
|
|
||||||
|
if (active_StatPerLevelUpChange)
|
||||||
|
Install_StatPerLevelUp();
|
||||||
|
|
||||||
|
if (active_multiPageStash)
|
||||||
|
Install_MultiPageStash();
|
||||||
|
|
||||||
|
if (active_othersFeatures)
|
||||||
|
Install_OthersFeatures();
|
||||||
|
|
||||||
|
if (active_newInterfaces)
|
||||||
|
Install_NewInterfaces();
|
||||||
|
|
||||||
|
if (active_WorldEvent)
|
||||||
|
Install_WorldEvent();
|
||||||
|
|
||||||
|
if (active_UberQuest)
|
||||||
|
Install_UberQuest();
|
||||||
|
|
||||||
|
if (active_alwaysRegenMapInSP)
|
||||||
|
Install_AlwaysRegenMapInSP();
|
||||||
|
|
||||||
|
if (nbPlayersCommandByDefault)
|
||||||
|
Install_SendPlayersCommand();
|
||||||
|
|
||||||
|
if (active_DisplayItemLevel)
|
||||||
|
Install_DisplayItemLevel();
|
||||||
|
|
||||||
|
if (active_AlwaysDisplayLifeMana)
|
||||||
|
Install_AlwaysDisplayLifeMana();
|
||||||
|
|
||||||
|
if (active_EnabledTXTFilesWithMSExcel)
|
||||||
|
Install_EnabledTXTFilesWithMSExcel();
|
||||||
|
|
||||||
|
if (active_LadderRunewords)
|
||||||
|
Install_LadderRunewords();
|
||||||
|
|
||||||
|
if (active_EnabledCowPortalWhenCowKingWasKill)
|
||||||
|
Install_EnabledCowPortalWhenCowKingWasKill();
|
||||||
|
|
||||||
|
log_msg("\nDLL patched sucessfully.\n\n\n");
|
||||||
|
|
||||||
|
unhookLibraries();
|
||||||
|
|
||||||
|
initCustomLibraries();
|
||||||
|
|
||||||
|
log_msg("***** ENTERING DIABLO II *****\n\n" );
|
||||||
|
|
||||||
|
active_logFile = active_logFile - 1;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" __declspec(dllexport) bool __stdcall Release()
|
||||||
|
{
|
||||||
|
log_msg("\n***** ENDING DIABLO II *****\n\n" );
|
||||||
|
|
||||||
|
freeCustomLibraries();
|
||||||
|
freeD2Libraries();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
103
PlugY/Error.cpp
Normal file
103
PlugY/Error.cpp
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Error Logger implementation.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include <stdio.h> // fopen() fclose() fprintf() vfprintf()
|
||||||
|
#include <stdarg.h> // ...
|
||||||
|
#include <string.h> // strlen() strcat()
|
||||||
|
#include <direct.h> // _getcwd()
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h" // Fog_assert()
|
||||||
|
|
||||||
|
DWORD active_logFile = 1;
|
||||||
|
|
||||||
|
static char log_file[MAX_PATH] = "";
|
||||||
|
static bool log_init = false;
|
||||||
|
|
||||||
|
|
||||||
|
void log_initfile()
|
||||||
|
{
|
||||||
|
if (log_init) return;
|
||||||
|
|
||||||
|
_getcwd( log_file, MAX_PATH );
|
||||||
|
if( log_file[strlen(log_file)] != '\\')
|
||||||
|
strcat(log_file, "\\");
|
||||||
|
strcat(log_file, LOG_FILE);
|
||||||
|
|
||||||
|
FILE* lLog = fopen( log_file, "w" );
|
||||||
|
|
||||||
|
if( lLog != NULL )
|
||||||
|
{
|
||||||
|
fclose(lLog);
|
||||||
|
log_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("<----------------------------------------------->\n"
|
||||||
|
"\n"
|
||||||
|
"\t\tA Plugin by Yohann\n"
|
||||||
|
"\t\tversion %s\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"<---------- Starting Diablo II Plugin ---------->\n\n\n"
|
||||||
|
,PLUGY_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_box( const char* pFormat, ... )
|
||||||
|
{
|
||||||
|
char buffer[300];
|
||||||
|
va_list lArgs;
|
||||||
|
va_start( lArgs, pFormat );
|
||||||
|
vsprintf( buffer, pFormat, lArgs );
|
||||||
|
va_end(lArgs);
|
||||||
|
|
||||||
|
log_msg(buffer);
|
||||||
|
MessageBox(NULL, buffer, "PlugY, The Survival Kit", MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void log_msg( const char* pFormat, ... )
|
||||||
|
{
|
||||||
|
if (!active_logFile) return;
|
||||||
|
|
||||||
|
if( !log_init )
|
||||||
|
log_initfile();
|
||||||
|
|
||||||
|
if( log_init )
|
||||||
|
{
|
||||||
|
va_list lArgs;
|
||||||
|
va_start( lArgs, pFormat );
|
||||||
|
|
||||||
|
FILE *lDebug = fopen( log_file, "a" );
|
||||||
|
|
||||||
|
if( lDebug != NULL )
|
||||||
|
{
|
||||||
|
vfprintf( lDebug, pFormat, lArgs );
|
||||||
|
fclose( lDebug );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
log_init = false;
|
||||||
|
|
||||||
|
va_end(lArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void d2_assert( bool pCondition, char* pMessage, char* pLocation, int pLineNbr )
|
||||||
|
{
|
||||||
|
if( pCondition )
|
||||||
|
{
|
||||||
|
log_msg("\n"
|
||||||
|
"*-----------------------*\n"
|
||||||
|
"Assertion fail at line %d of %s :\n"
|
||||||
|
"%s\n"
|
||||||
|
"*-----------------------*\n",
|
||||||
|
pLineNbr, pLocation, pMessage);
|
||||||
|
MessageBox(NULL, pMessage, "Diablo 2 Error", MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
166
PlugY/ExtendedSaveFile.cpp
Normal file
166
PlugY/ExtendedSaveFile.cpp
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file for each characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "extendedSaveFile.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "customLibraries.h"
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 0x4000
|
||||||
|
#define FILE_VERSION 0x3130 //"01"
|
||||||
|
#define FILE_EXTENDED 0x4D545343 //"CSTM"
|
||||||
|
|
||||||
|
|
||||||
|
BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
|
||||||
|
{
|
||||||
|
char filename[512];
|
||||||
|
BYTE* data;
|
||||||
|
d2_assert(!name, "Bad file name (NULL)", __FILE__, __LINE__);
|
||||||
|
D2FogGetSavePath( filename, 512-5);
|
||||||
|
strncat(filename, name, 512 - strlen(filename) - 5);
|
||||||
|
strcat(filename, ".d2x");
|
||||||
|
|
||||||
|
log_msg("Extended file to read : %s\n",filename);
|
||||||
|
|
||||||
|
FILE* file = fopen(filename, "rb");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
*size = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0);
|
||||||
|
DWORD nbRead = fread(data, 1, *size, file);
|
||||||
|
fclose(file);
|
||||||
|
d2_assert(nbRead != *size , "nbRead from extented save file != size", __FILE__, __LINE__);
|
||||||
|
} else {
|
||||||
|
log_msg("Can't open extented save file in mode \"rb\" (is not an error if it's a new player)\n");
|
||||||
|
DWORD maxSize = 100;
|
||||||
|
data = (BYTE*)D2FogMemAlloc(maxSize,__FILE__,__LINE__,0);
|
||||||
|
*size = 14;
|
||||||
|
*((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM"
|
||||||
|
*((WORD *)&data[4]) = FILE_VERSION;
|
||||||
|
*((DWORD*)&data[6]) = 0;// not used
|
||||||
|
*((DWORD*)&data[10]) = 0;// number of stash
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (currentDll)
|
||||||
|
{
|
||||||
|
currentDll->initExtendedSaveFile(&data, &maxSize, size);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
|
||||||
|
{
|
||||||
|
if (!ptChar || !PCPY || !data) return 0;
|
||||||
|
|
||||||
|
log_msg("Load extended file\n");
|
||||||
|
|
||||||
|
DWORD curSize = 0;
|
||||||
|
|
||||||
|
if (*(DWORD*)&data[curSize] != FILE_EXTENDED)
|
||||||
|
{
|
||||||
|
log_msg("loadExtendedSaveFile -> bad header\n");
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
curSize += 4;
|
||||||
|
|
||||||
|
if (*(WORD *)&data[curSize] != FILE_VERSION)
|
||||||
|
{
|
||||||
|
log_msg("loadExtendedSaveFile -> bad file version\n");
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
curSize += 2;
|
||||||
|
curSize += 4;
|
||||||
|
|
||||||
|
int ret = loadStashList(ptChar, data, maxSize, &curSize, false);
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (!ret && currentDll)
|
||||||
|
{
|
||||||
|
ret = currentDll->loadExtendedSaveFile(ptChar, data, maxSize, &curSize);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
|
||||||
|
PCPY->selfStashIsOpened = true;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void writeExtendedSaveFile(char* name, BYTE* data, DWORD size)
|
||||||
|
{
|
||||||
|
char szTempName[MAX_PATH];
|
||||||
|
char szSaveName[MAX_PATH];
|
||||||
|
|
||||||
|
//Get temporary savefile name.
|
||||||
|
D2FogGetSavePath(szTempName, MAX_PATH);
|
||||||
|
strcat(szTempName, name);
|
||||||
|
strcat(szTempName, ".d2~");
|
||||||
|
log_msg("Extended temporary file for saving : %s\n",szTempName);
|
||||||
|
|
||||||
|
//Write data in savefile.
|
||||||
|
FILE* customSaveFile = fopen(szTempName, "wb+");
|
||||||
|
fwrite(data, size, 1, customSaveFile);
|
||||||
|
fclose(customSaveFile);
|
||||||
|
|
||||||
|
//Get real savefile name.
|
||||||
|
D2FogGetSavePath(szSaveName, MAX_PATH);
|
||||||
|
strcat(szSaveName, name);
|
||||||
|
strcat(szSaveName, ".d2x");
|
||||||
|
log_msg("Extended file for saving : %s\n",szSaveName);
|
||||||
|
|
||||||
|
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
|
||||||
|
DeleteFile(szSaveName);
|
||||||
|
if (!MoveFile(szTempName, szSaveName))
|
||||||
|
log_box("Could not create the extended save file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void backupExtendedSaveFile(char* name)
|
||||||
|
{
|
||||||
|
char szBackupName[MAX_PATH];
|
||||||
|
char szSaveName[MAX_PATH];
|
||||||
|
|
||||||
|
D2FogGetSavePath(szSaveName, MAX_PATH);
|
||||||
|
strcat(szSaveName, name);
|
||||||
|
strcat(szSaveName, ".d2x");
|
||||||
|
|
||||||
|
D2FogGetSavePath(szBackupName, MAX_PATH);
|
||||||
|
strcat(szBackupName, name);
|
||||||
|
strcat(szBackupName, ".d2x.backup");
|
||||||
|
|
||||||
|
CopyFile(szSaveName, szBackupName, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
*(DWORD *)(*data + *curSize) = FILE_EXTENDED; //"CSTM"
|
||||||
|
*curSize += 4;
|
||||||
|
*(WORD *)(*data + *curSize) = FILE_VERSION;
|
||||||
|
*curSize += 2;
|
||||||
|
*(DWORD *)(*data + *curSize) = 0;
|
||||||
|
*curSize += 4;
|
||||||
|
|
||||||
|
saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize);
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (currentDll)
|
||||||
|
{
|
||||||
|
currentDll->saveExtendedSaveFile(ptChar, data, maxSize, curSize);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
625
PlugY/ExtraOptions.cpp
Normal file
625
PlugY/ExtraOptions.cpp
Normal file
@ -0,0 +1,625 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
More little options.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int active_RunLODs = false;
|
||||||
|
int active_alwaysRegenMapInSP = false;
|
||||||
|
DWORD nbPlayersCommandByDefault = 1;
|
||||||
|
int active_DisplayItemLevel = false;
|
||||||
|
int active_AlwaysDisplayLifeMana = false;
|
||||||
|
int active_EnabledTXTFilesWithMSExcel = false;
|
||||||
|
int active_DisplayBaseStatsValue = false;
|
||||||
|
int active_LadderRunewords = false;
|
||||||
|
int active_EnabledCowPortalWhenCowKingWasKill = false;
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void STDCALL displayItemlevel(LPWSTR popup, Unit* ptItem)
|
||||||
|
{
|
||||||
|
if (onRealm && (selectModParam==MOD_NO)) return;
|
||||||
|
WCHAR text[0x50];
|
||||||
|
swprintf(text, L"Item Level: %u\n", D2GetItemLevel(ptItem));
|
||||||
|
D2SetColorPopup(text,WHITE);
|
||||||
|
wcscat(popup,text);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevel_113 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EAX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1E70]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EAX
|
||||||
|
POP ECX
|
||||||
|
POP EDX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EDX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevel_111 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1E74]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevelSet_111 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1958]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevel )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x5018]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevelSet )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1220]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevel_9 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x501C]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayItemlevelSet_9 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x1224]
|
||||||
|
PUSH EAX
|
||||||
|
CALL displayItemlevel
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
PUSH 0x100
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_DisplayItemLevel()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for display item popup. (DisplayPopup)\n");
|
||||||
|
|
||||||
|
// print the text in the final buffer
|
||||||
|
mem_seek R7(D2Client, 3D47C, 3D47C, 438A1, ADD0A, 789DA, AE0AA, 941C0);
|
||||||
|
memt_byte( 0x68 , 0xE8);
|
||||||
|
MEMT_REF4( 0x100, version_D2Client >= V113 ? caller_displayItemlevel_113 : version_D2Client >= V111 ? caller_displayItemlevel_111 : version_D2Client == V110 ? caller_displayItemlevel : caller_displayItemlevel_9);
|
||||||
|
//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
|
||||||
|
|
||||||
|
// print the text in the final buffer (for set items)
|
||||||
|
mem_seek R7(D2Client, 3C452, 3C452, 427BE, AC773, 77773, ACEB3, 92FE3);
|
||||||
|
memt_byte( 0x68 , 0xE8);
|
||||||
|
MEMT_REF4( 0x100, version_D2Client >= V111 ? caller_displayItemlevelSet_111 : version_D2Client == V110 ? caller_displayItemlevelSet : caller_displayItemlevelSet_9);
|
||||||
|
//6FAE27BE . 68 00010000 PUSH 100
|
||||||
|
//6FB5C773 |. 68 00010000 PUSH 100
|
||||||
|
//6FB27773 |. 68 00010000 PUSH 100
|
||||||
|
//6FB5CEB3 |. 68 00010000 PUSH 100
|
||||||
|
//6FB42FE3 |. 68 00010000 PUSH 100
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
char* msgNBPlayersString = "players %u";
|
||||||
|
DWORD* infoEnabledSendPlayersCommand;
|
||||||
|
void SendPlayersCommand()
|
||||||
|
{
|
||||||
|
#pragma pack(1)
|
||||||
|
struct {
|
||||||
|
BYTE displayType;//0x15 main msg; 0x14: char popup
|
||||||
|
BYTE un;
|
||||||
|
BYTE zero;
|
||||||
|
char string[0xFF];
|
||||||
|
char null;
|
||||||
|
} data;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
if (!needToInit || onRealm) return;
|
||||||
|
needToInit=0;
|
||||||
|
|
||||||
|
DWORD info = *infoEnabledSendPlayersCommand;
|
||||||
|
if ((info != 0) && (info != 1) && (info != 6) && (info != 8)) return;
|
||||||
|
|
||||||
|
D2SetNbPlayers(nbPlayersCommandByDefault);
|
||||||
|
|
||||||
|
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, msgNBPlayersString, nbPlayersCommandByDefault);
|
||||||
|
D2SendMsgToAll((BYTE*)&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SendPlayersCommand )
|
||||||
|
CALL SendPlayersCommand
|
||||||
|
JMP D2GetResolution
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_SendPlayersCommand()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for init default nb /players. (SendPlayersCommand)\n");
|
||||||
|
|
||||||
|
infoEnabledSendPlayersCommand = (DWORD*)R7(D2Client, 111D60, 110BC0, 107960, 11BFBC, 11C2AC, 11BFF8, 11C394);
|
||||||
|
if ( version_D2Client >= V110 )
|
||||||
|
msgNBPlayersString = (char*)R7(D2Client, 0000, 0000, D8448, D06A8, D4748, D4680, D4E00);
|
||||||
|
|
||||||
|
// Set nb Player to default
|
||||||
|
mem_seek R7(D2Client, 8723B, 865BB, 81B8B, A3602, 66A02, 90162, C39F2);//6FB1C7B7-6FAA0000
|
||||||
|
MEMJ_REF4( D2GetResolution , caller_SendPlayersCommand);
|
||||||
|
//6FB2723A |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
|
||||||
|
//6FB265BA |. E8 7D8E0300 CALL <JMP.&D2gfx.#10005>
|
||||||
|
//6FB21B8A . E8 4F9C0400 CALL <JMP.&D2gfx.#10005>
|
||||||
|
//6FB53601 |. E8 E099F6FF CALL <JMP.&D2gfx.#10000>
|
||||||
|
//6FB16A01 |. E8 AA65FAFF CALL <JMP.&D2gfx.#10063>
|
||||||
|
//6FB40161 |. E8 1ECFF7FF CALL <JMP.&D2gfx.#10043>
|
||||||
|
//6FB739F1 |. E8 B896F4FF CALL <JMP.&D2gfx.#10031>
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
void Install_AlwaysRegenMapInSP()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for always regenerate maps in Single player. (AlwaysRegenMapInSP)\n");
|
||||||
|
|
||||||
|
// Always regenerate maps in Single player
|
||||||
|
mem_seek R7(D2Game, 517ED, 51BFA, 5DE88, 6235D, 2966D, 1E1FE, ED3BE);
|
||||||
|
memt_byte( 0x74 , 0xEB); // JMP SHORT D2Game.01FE2368
|
||||||
|
//6FC8DE88 |. 74 09 JE SHORT D2Game.6FC8DE93
|
||||||
|
//01FE235D |. 74 09 JE SHORT D2Game.01FE2368
|
||||||
|
//01F9966D |. 74 09 JE SHORT D2Game.01F99678
|
||||||
|
//6FC3E1FE |. 74 09 JE SHORT D2Game.6FC3E209
|
||||||
|
//6FD0D3BE |. 74 09 JE SHORT D2Game.6FD0D3C9
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void Install_RunLODs()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2gfx for launch any number of Diablo II game in the same computer. (RunLODs)\n");
|
||||||
|
|
||||||
|
// execute if it's our packet else continue
|
||||||
|
mem_seek R7(D2gfx, 447C, 447C, 446A, 84CF, 84AF, 894F, 85BF);
|
||||||
|
memt_byte( 0x74, 0xEB ); // JMP SHORT D2gfx.6FA884F6
|
||||||
|
//6FA884AF |. 74 45 JE SHORT D2gfx.6FA884F6
|
||||||
|
//6FA8894F |. 74 45 JE SHORT D2gfx.6FA88996
|
||||||
|
//6FA885BF |. 74 45 JE SHORT D2gfx.6FA88606
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayLife_113)
|
||||||
|
POP EAX
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayLife
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayLife
|
||||||
|
ADD EAX,0x28
|
||||||
|
JMP EAX
|
||||||
|
normalDisplayLife:
|
||||||
|
CMP EDX,0x1E
|
||||||
|
JGE cont
|
||||||
|
ADD EAX,0xBC
|
||||||
|
cont:
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayLife_111)
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayLife
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayLife
|
||||||
|
POP EAX
|
||||||
|
ADD EAX,0x25
|
||||||
|
JMP EAX
|
||||||
|
normalDisplayLife:
|
||||||
|
MOV EAX,ptResolutionY
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayLife)
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayLife
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayLife
|
||||||
|
POP EAX
|
||||||
|
ADD EAX,0x28
|
||||||
|
JMP EAX
|
||||||
|
normalDisplayLife:
|
||||||
|
MOV EAX,ptResolutionY
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayMana_113)
|
||||||
|
MOV EAX,DWORD PTR DS:[ptResolutionY]
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayMana
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayMana
|
||||||
|
POP EAX
|
||||||
|
ADD EAX,0x3C
|
||||||
|
JMP EAX
|
||||||
|
normalDisplayMana:
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayMana)
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayMana
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayMana
|
||||||
|
POP EAX
|
||||||
|
MOV WORD PTR SS:[ESP+0x14],0
|
||||||
|
ADD EAX,0x38
|
||||||
|
JMP EAX
|
||||||
|
normalDisplayMana:
|
||||||
|
POP EAX
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x25C
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM (caller_AlwaysDisplayMana_9)
|
||||||
|
CMP onRealm,0
|
||||||
|
JNZ normalDisplayMana
|
||||||
|
CMP active_AlwaysDisplayLifeMana,0
|
||||||
|
JE normalDisplayMana
|
||||||
|
ADD DWORD PTR SS:[ESP],0x32
|
||||||
|
LEA ECX,DWORD PTR SS:[ESP+0x24]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
CALL D2PrintString
|
||||||
|
MOV WORD PTR SS:[ESP+0x24],0
|
||||||
|
RETN 0xC
|
||||||
|
normalDisplayMana:
|
||||||
|
POP EAX
|
||||||
|
ADD EAX,0xC2
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_AlwaysDisplayLifeMana()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for always display life and mana. (ALwaysPrintLifeMana)\n");
|
||||||
|
|
||||||
|
if ( version_D2Client >= V113 )
|
||||||
|
{
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2764A);
|
||||||
|
memt_byte( 0x0F , 0x90);
|
||||||
|
memt_byte( 0x8C , 0xE8);
|
||||||
|
MEMT_REF4( 0x000000BC, caller_AlwaysDisplayLife_113);
|
||||||
|
//6FAD764A |. 0F8C BC000000 JL D2Client.6FAD770C
|
||||||
|
//6FAD7650 |. 83FA 6E CMP EDX,6E
|
||||||
|
//6FAD7653 |. 0F8F B3000000 JG D2Client.6FAD770C
|
||||||
|
//6FAD7659 |. A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
|
||||||
|
|
||||||
|
//6FAD7667 |. 0F8C A4000000 JL D2Client.6FAD7711
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Always display life.
|
||||||
|
mem_seek R7(D2Client, 58B32, 58B32, 5F102, 2D713, B5DF3, 81733, 0000);
|
||||||
|
memt_byte( 0xA1 , 0xE8);
|
||||||
|
MEMT_REF4( ptResolutionY , version_D2Client >= V111 ? caller_AlwaysDisplayLife_111 : caller_AlwaysDisplayLife);
|
||||||
|
//6FADD713 |. A1 605CBA6F MOV EAX,DWORD PTR DS:[6FBA5C60]
|
||||||
|
//6FB65DF3 |. A1 C84FBA6F MOV EAX,DWORD PTR DS:[6FBA4FC8]
|
||||||
|
//6FB31733 |. A1 E4C6B86F MOV EAX,DWORD PTR DS:[6FB8C6E4]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Always display mana.
|
||||||
|
if ( version_D2Client >= V113 )
|
||||||
|
{
|
||||||
|
//mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 27711);
|
||||||
|
//memt_byte( 0x8B , 0x90);
|
||||||
|
//memt_byte( 0x0D , 0xE8);
|
||||||
|
//MEMT_REF4( offset_D2Client + 0x11C4B4 , caller_AlwaysDisplayMana_113);
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 0000, 0000, 0000, 0000, 2770C);
|
||||||
|
memt_byte( 0xA1 , 0xE8);
|
||||||
|
MEMT_REF4( ptResolutionY , caller_AlwaysDisplayMana_113);
|
||||||
|
//6FAD770C |> A1 4CBCB86F MOV EAX,DWORD PTR DS:[6FB8BC4C]
|
||||||
|
//6FAD7711 |> 8B0D B4C4BC6F MOV ECX,DWORD PTR DS:[6FBCC4B4]
|
||||||
|
|
||||||
|
//6FAD7708 |. 8B5424 10 MOV EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
|
||||||
|
//6FAD77C7 |> 5F POP EDI
|
||||||
|
//6FAD77C8 |. 5E POP ESI
|
||||||
|
//6FAD77C9 |. 5D POP EBP
|
||||||
|
//6FAD77CA |. 5B POP EBX
|
||||||
|
//6FAD77CB |. 81C4 28030000 ADD ESP,328
|
||||||
|
//6FAD77D1 \. C3 RETN
|
||||||
|
}
|
||||||
|
else if ( version_D2Client >= V110 )
|
||||||
|
{
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 5F1E6, 2D7FB, B5EDB, 8181B, 0000);
|
||||||
|
memt_byte( 0x5F , 0xE8);
|
||||||
|
MEMT_REF4( 0x815B5D5E , caller_AlwaysDisplayMana);
|
||||||
|
memt_byte( 0xC4 , 0x90); // NOP
|
||||||
|
memt_byte( 0x5C , 0x90); // NOP
|
||||||
|
memt_byte( 0x02 , 0x90); // NOP
|
||||||
|
memt_byte( 0x00 , 0x90); // NOP
|
||||||
|
memt_byte( 0x00 , 0x90); // NOP
|
||||||
|
//6FADD7FB |. 5F POP EDI
|
||||||
|
//6FADD7FC |. 5E POP ESI
|
||||||
|
//6FADD7FD |. 5D POP EBP
|
||||||
|
//6FADD7FE |. 5B POP EBX
|
||||||
|
//6FADD7FF |. 81C4 5C020000 ADD ESP,25C
|
||||||
|
//6FB65EDB |. 5F POP EDI
|
||||||
|
//6FB65EDC |. 5E POP ESI
|
||||||
|
//6FB65EDD |. 5D POP EBP
|
||||||
|
//6FB65EDE |. 5B POP EBX
|
||||||
|
//6FB65EDF |. 81C4 5C020000 ADD ESP,25C
|
||||||
|
//6FB3181B |. 5F POP EDI
|
||||||
|
//6FB3181C |. 5E POP ESI
|
||||||
|
//6FB3181D |. 5D POP EBP
|
||||||
|
//6FB3181E |. 5B POP EBX
|
||||||
|
//6FB3181F |. 81C4 5C020000 ADD ESP,25C
|
||||||
|
//6FB31825 |. C3 RETN
|
||||||
|
} else {
|
||||||
|
mem_seek R7(D2Client, 58C09, 58C09, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0xE9 , 0xE8);
|
||||||
|
MEMT_REF4( 0x000000C2 , caller_AlwaysDisplayMana_9);
|
||||||
|
//6FAF8C09 . E9 C2000000 JMP D2Client.6FAF8CD0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_AlwaysDisplayLifeMana==2)
|
||||||
|
active_AlwaysDisplayLifeMana=0;
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void Install_EnabledTXTFilesWithMSExcel()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for enabled the opening of files already opened by MS Excel. (EnabledTXTFilesWithMSExcel)\n");
|
||||||
|
|
||||||
|
mem_seek( (DWORD)D2StormMPQOpenFile + (version_Storm >= V111 ? 0x12A : 0xFF) );
|
||||||
|
memt_byte( 0x01 , 0x03); //; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
|
||||||
|
//6FC1C969 |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void STDCALL printDisplayBaseStatsValue(WORD statID, sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6)
|
||||||
|
{
|
||||||
|
if ( onRealm || !D2isLODGame())
|
||||||
|
{
|
||||||
|
D2PrintImage(data,x,y,p4,p5,p6);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
int minValue=1;
|
||||||
|
switch (statID)
|
||||||
|
{
|
||||||
|
case STATS_STRENGTH: minValue = charStats->baseSTR; break;
|
||||||
|
case STATS_DEXTERITY: minValue = charStats->baseDEX; break;
|
||||||
|
case STATS_VITALITY: minValue = charStats->baseVIT; break;
|
||||||
|
case STATS_ENERGY: minValue = charStats->baseENE; break;
|
||||||
|
}
|
||||||
|
int statValue = D2GetPlayerBaseStat(ptChar, statID, 0);
|
||||||
|
|
||||||
|
if (isOnRect(D2GetMouseX(),D2GetMouseY(),x+5,y+5,32,32))
|
||||||
|
{
|
||||||
|
WCHAR text[100];
|
||||||
|
swprintf(text, getTranslatedString(STR_STATS_BASE_MIN), statValue, minValue);
|
||||||
|
D2SetFont(1);
|
||||||
|
D2PrintPopup(text, x+18, y-32, WHITE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( D2GetPlayerBaseStat(ptChar, 4, 0) <= 0)
|
||||||
|
setFrame(data, 2);
|
||||||
|
D2PrintImage(data,x,y,p4,p5,p6);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_displayBaseStatsValue )
|
||||||
|
POP EAX
|
||||||
|
XOR ECX,ECX
|
||||||
|
MOV CX,WORD PTR DS:[ESI+8]
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EAX
|
||||||
|
JMP printDisplayBaseStatsValue
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_DisplayBaseStatsValue()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for display base stats value. (DisplayBaseStatsValue)\n");
|
||||||
|
|
||||||
|
// Always print stat button images.
|
||||||
|
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5);
|
||||||
|
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
|
||||||
|
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) );
|
||||||
|
memt_byte( 0x24, 0x90 ); // NOP
|
||||||
|
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||||
|
//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]
|
||||||
|
|
||||||
|
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E);
|
||||||
|
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>
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
RunesBIN* STDCALL compileRunesTxt(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength)
|
||||||
|
{
|
||||||
|
RunesBIN* ptRunesBin = (RunesBIN*)D2CompileTxtFile(unused, filename, ptFields, ptRecordCount, recordLength);
|
||||||
|
for (DWORD i=0; i < *ptRecordCount; i++)
|
||||||
|
ptRunesBin[i].Server=0;
|
||||||
|
return ptRunesBin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Install_LadderRunewords()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
if ( version_D2Common < V110 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Common for enabled the ladder only runewords. (LadderRunewords)\n");
|
||||||
|
|
||||||
|
mem_seek R7(D2Common, 0000, 0000, 1E965, 61762, 43A72, 5D492, 724B2);
|
||||||
|
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
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void Install_EnabledCowPortalWhenCowKingWasKill()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for enabled the opening of Cow Portal when player have already kill the cow king in that difficulty. (EnabledCowPortalWhenCowKingWasKill)\n");
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 5DFF7, 5E457, 6C5E7 , B1278, 5DB68, 75C68, 67508);
|
||||||
|
memt_byte( 0x85 , 0x33); // XOR EAX,EAX
|
||||||
|
//6FC8DFF7 . 85C0 TEST EAX,EAX
|
||||||
|
//6FC8E457 . 85C0 TEST EAX,EAX
|
||||||
|
//6FC9C5E7 . 85C0 TEST EAX,EAX
|
||||||
|
//02061278 |. 85C0 TEST EAX,EAX
|
||||||
|
//01FEDB68 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FC95C68 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FC87508 |. 85C0 TEST EAX,EAX
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
152
PlugY/GlobalVariable.cpp
Normal file
152
PlugY/GlobalVariable.cpp
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating server.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "bigStash.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "uberQuest.h"
|
||||||
|
#include "worldEvent.h"
|
||||||
|
|
||||||
|
bool onRealm=false;
|
||||||
|
bool needToInit=false;
|
||||||
|
int previouslyOnRealm = -1;
|
||||||
|
|
||||||
|
void STDCALL BtnPress()
|
||||||
|
{
|
||||||
|
needToInit = 1;
|
||||||
|
// if (active_WorldEvent)
|
||||||
|
// initWorldEventVariables();
|
||||||
|
if (active_UberQuest)
|
||||||
|
resetQuestState();
|
||||||
|
d2_assert(active_bigStash_tested && onRealm && (previouslyOnRealm==0), "Need to restart after play an open game with the Big Stash",__FILE__,__LINE__);
|
||||||
|
d2_assert(active_bigStash_tested && !onRealm && (previouslyOnRealm>0), "Need to restart after play an closed game with the Big Stash",__FILE__,__LINE__);
|
||||||
|
previouslyOnRealm = onRealm;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_BnetBtnPress )
|
||||||
|
CMP active_DisableBattleNet,1
|
||||||
|
JE disableBattleNet
|
||||||
|
MOV onRealm,1
|
||||||
|
PUSH EAX
|
||||||
|
CALL BtnPress
|
||||||
|
POP EAX
|
||||||
|
SUB ESP,0x3FC//400
|
||||||
|
JMP DWORD PTR SS:[ESP+0x3FC]
|
||||||
|
disableBattleNet:
|
||||||
|
POP EAX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FCT_ASM ( caller_MultiPlayerBtnPress )
|
||||||
|
CALL BtnPress
|
||||||
|
MOV EAX,1
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
*/
|
||||||
|
|
||||||
|
FCT_ASM ( caller_TCPIPBtnPress111 )
|
||||||
|
MOV onRealm,0
|
||||||
|
CALL BtnPress
|
||||||
|
MOV ESI,0x40
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_TCPIPBtnPress )
|
||||||
|
MOV onRealm,0
|
||||||
|
CALL BtnPress
|
||||||
|
MOV EBP,1
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SinglePlayerBtnPress )
|
||||||
|
MOV onRealm,0
|
||||||
|
CALL BtnPress
|
||||||
|
MOV EDX,0x400
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_fixClientRemovingBug )
|
||||||
|
TEST ECX,ECX
|
||||||
|
JE notFound
|
||||||
|
CMP DWORD PTR DS:[ECX],EBP
|
||||||
|
JE found
|
||||||
|
next:
|
||||||
|
MOV EAX,ECX
|
||||||
|
MOV ECX,DWORD PTR DS:[EAX+0x4A8]
|
||||||
|
TEST ECX,ECX
|
||||||
|
JE notFound
|
||||||
|
CMP DWORD PTR DS:[ECX],EBP
|
||||||
|
JNZ next
|
||||||
|
found:
|
||||||
|
ADD DWORD PTR SS:[ESP],0xB
|
||||||
|
RETN
|
||||||
|
notFound:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1D
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_VariableOnRealm()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Launch for set not on realm variable. (VariableonRealm)\n");
|
||||||
|
|
||||||
|
// click on Battle.net button
|
||||||
|
mem_seek R7(D2Launch, 8195, 81A5, 9915, 129E5, 18AA5, 17D15, 19295);
|
||||||
|
memt_byte( 0x81, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x000400EC, caller_BnetBtnPress);
|
||||||
|
memt_byte( 0x00, 0x90 ); // NOP
|
||||||
|
//6FA529E5 . 81EC 00040000 SUB ESP,400
|
||||||
|
|
||||||
|
// click on Multiplayer button
|
||||||
|
// mem_seek R7(D2Launch, D5EC, D5CC, EFFC, 0000, 0000, 0000, 0000);
|
||||||
|
// memt_byte( 0xB8, 0xE8 ); // CALL
|
||||||
|
// MEMT_REF4( 0x00000001, caller_MultiPlayerBtnPress);
|
||||||
|
//6FA1EFFC . B8 01000000 MOV EAX,1
|
||||||
|
|
||||||
|
// click on TCP/IP button
|
||||||
|
mem_seek R7(D2Launch, 87B9, 87C9, 9F99, 11329, 17409, 16659, 17B8E);
|
||||||
|
if (version_D2Launch == V109b || version_D2Launch == V109d || version_D2Launch == V110)
|
||||||
|
{
|
||||||
|
memt_byte( 0xBD, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x00000001, caller_TCPIPBtnPress);
|
||||||
|
} else {
|
||||||
|
memt_byte( 0xBE, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x00000040, caller_TCPIPBtnPress111);
|
||||||
|
//6FA51329 . BE 40000000 MOV ESI,40
|
||||||
|
}
|
||||||
|
|
||||||
|
// click on SinglePlayer button
|
||||||
|
mem_seek R7(D2Launch, D1F6, D1E6, EC16, B726, 117E6, 10A56, 11F36);
|
||||||
|
memt_byte( 0xBA, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x00000400, caller_SinglePlayerBtnPress);
|
||||||
|
//6FA4B726 . BA 00040000 MOV EDX,400
|
||||||
|
|
||||||
|
if (version_D2Game == V110)
|
||||||
|
{
|
||||||
|
log_msg("\nPatch D2Game for fixing ptClient removing bug. (VariableonRealm)\n");
|
||||||
|
//Bug crash ptClient search fix (for Megalixir Mod).
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 2B97, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x39 ,0xE8);
|
||||||
|
MEMT_REF4( 0x8B0C7429 , caller_fixClientRemovingBug);
|
||||||
|
memt_byte( 0xC1 ,0x90);
|
||||||
|
//6FC32B97 |> 3929 CMP DWORD PTR DS:[ECX],EBP
|
||||||
|
//6FC32B99 |. 74 0C JE SHORT D2Game.6FC32BA7
|
||||||
|
//6FC32B9B |> 8BC1 MOV EAX,ECX
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
359
PlugY/INIfile.cpp
Normal file
359
PlugY/INIfile.cpp
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
File modified by Yohann NICOLAS.
|
||||||
|
|
||||||
|
NAME
|
||||||
|
INIfile.cpp
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Memory cached INI file read/write class to replace legacy MS code
|
||||||
|
|
||||||
|
COPYRIGHT
|
||||||
|
©1999-2004 Ultrafunk (www.ultrafunk.com) - info@ultrafunk.com
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "INIfile.h"
|
||||||
|
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getprivateprofilestring.asp
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
// First a few support routines
|
||||||
|
|
||||||
|
static char *strstri(char *text, char *string)
|
||||||
|
{
|
||||||
|
char *found = NULL;
|
||||||
|
|
||||||
|
if(text && string)
|
||||||
|
{
|
||||||
|
int len = strlen(string);
|
||||||
|
if(len)
|
||||||
|
{
|
||||||
|
while(*text)
|
||||||
|
{
|
||||||
|
if(strnicmp(string, text, len) == 0)
|
||||||
|
{
|
||||||
|
found = text;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
text++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL chrcmp(char c, char *string)
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<strlen(string); i++)
|
||||||
|
{
|
||||||
|
if(c == string[i])
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL FileExists(char *name)
|
||||||
|
{
|
||||||
|
DWORD attr = GetFileAttributes(name);
|
||||||
|
return ( (attr != (DWORD)-1) && !(attr & FILE_ATTRIBUTE_DIRECTORY) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
INIFile::INIFile()
|
||||||
|
{
|
||||||
|
m_readWrite = 0;
|
||||||
|
m_file = NULL;
|
||||||
|
m_cache = NULL;
|
||||||
|
m_cacheWritePos = 0;
|
||||||
|
m_sectionStart = NULL;
|
||||||
|
m_sectionEnd = NULL;
|
||||||
|
|
||||||
|
ZeroMemory((void *)m_path, sizeof(m_path));
|
||||||
|
ZeroMemory((void *)m_currentSection, sizeof(m_currentSection));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
INIFile::~INIFile()
|
||||||
|
{
|
||||||
|
if(m_file)
|
||||||
|
CloseHandle(m_file);
|
||||||
|
|
||||||
|
if(m_cache)
|
||||||
|
delete [] m_cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BOOL INIFile::InitReadWrite(char *path, int readWrite, DWORD writeCacheSize)
|
||||||
|
{
|
||||||
|
if(path)
|
||||||
|
{
|
||||||
|
m_readWrite = readWrite;
|
||||||
|
m_cacheWritePos = 0;
|
||||||
|
m_sectionStart = NULL;
|
||||||
|
m_sectionEnd = NULL;
|
||||||
|
|
||||||
|
ZeroMemory((void *)m_path, sizeof(m_path));
|
||||||
|
ZeroMemory((void *)m_currentSection, sizeof(m_currentSection));
|
||||||
|
|
||||||
|
strncpy(m_path, path, sizeof(m_path));
|
||||||
|
|
||||||
|
if(m_file)
|
||||||
|
{
|
||||||
|
CloseHandle(m_file);
|
||||||
|
m_file = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_cache)
|
||||||
|
{
|
||||||
|
delete [] m_cache;
|
||||||
|
m_cache = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If read, the open file and cache content in memory
|
||||||
|
if(m_readWrite == INIFILE_MPQREAD)
|
||||||
|
{
|
||||||
|
void* refFile;
|
||||||
|
if ( D2MPQOpenFile(m_path,&refFile) )
|
||||||
|
{
|
||||||
|
DWORD fileSize = D2MPQGetSizeFile(refFile, NULL);
|
||||||
|
m_cache = new char[fileSize + 1];
|
||||||
|
if(m_cache)
|
||||||
|
{
|
||||||
|
DWORD read;
|
||||||
|
if(D2MPQReadFile(refFile, (BYTE*)m_cache, fileSize, &read, NULL, NULL, NULL) == 0)
|
||||||
|
{
|
||||||
|
delete [] m_cache;
|
||||||
|
m_cache = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_cache[fileSize] = 0;
|
||||||
|
}
|
||||||
|
D2MPQCloseFile(refFile);
|
||||||
|
if(m_cache)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if((m_readWrite == INIFILE_MPQREAD) || (m_readWrite == INIFILE_READ))
|
||||||
|
if(m_readWrite == INIFILE_READ)
|
||||||
|
{
|
||||||
|
if(FileExists(m_path))
|
||||||
|
{
|
||||||
|
m_file = CreateFile(m_path,
|
||||||
|
GENERIC_READ,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if(m_file != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD fileSize = GetFileSize(m_file, NULL);
|
||||||
|
|
||||||
|
m_cache = new char[fileSize + 1];
|
||||||
|
if(m_cache)
|
||||||
|
{
|
||||||
|
DWORD read;
|
||||||
|
|
||||||
|
if(ReadFile(m_file, m_cache, fileSize, &read, NULL) == 0)
|
||||||
|
{
|
||||||
|
delete [] m_cache;
|
||||||
|
m_cache = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_cache[fileSize] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(m_file);
|
||||||
|
m_file = NULL;
|
||||||
|
|
||||||
|
if(m_cache)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If write, then create write cache memory buffer
|
||||||
|
if(m_readWrite == INIFILE_WRITE)
|
||||||
|
{
|
||||||
|
m_cache = new char[writeCacheSize];
|
||||||
|
|
||||||
|
if(m_cache)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL INIFile::close()
|
||||||
|
{
|
||||||
|
BOOL success = FALSE;
|
||||||
|
|
||||||
|
// If read, then kill the memory cached settings
|
||||||
|
if(m_readWrite == INIFILE_READ)
|
||||||
|
{
|
||||||
|
// Just to be sure, close the settings file again if it's still open for some reason
|
||||||
|
if(m_file)
|
||||||
|
{
|
||||||
|
CloseHandle(m_file);
|
||||||
|
m_file = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_cache)
|
||||||
|
{
|
||||||
|
delete [] m_cache;
|
||||||
|
m_cache = NULL;
|
||||||
|
|
||||||
|
success = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just to be sure, reset section position markers
|
||||||
|
m_sectionStart = NULL;
|
||||||
|
m_sectionEnd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If write, then commit (write) cached settings file to disk
|
||||||
|
if(m_readWrite == INIFILE_WRITE)
|
||||||
|
{
|
||||||
|
if(m_path && m_cache)
|
||||||
|
{
|
||||||
|
m_file = CreateFile(m_path,
|
||||||
|
GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if(m_file != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD written;
|
||||||
|
WriteFile(m_file, m_cache, m_cacheWritePos, &written, NULL);
|
||||||
|
|
||||||
|
CloseHandle(m_file);
|
||||||
|
m_file = NULL;
|
||||||
|
|
||||||
|
if(written == m_cacheWritePos)
|
||||||
|
success = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] m_cache;
|
||||||
|
m_cache = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
static char delimiterEnd[] = "\r\n\0";
|
||||||
|
|
||||||
|
|
||||||
|
int INIFile::GetPrivateProfileString(const char *section, const char *key, const char *def, char *dest, DWORD size)
|
||||||
|
{
|
||||||
|
DWORD copied = 0;
|
||||||
|
|
||||||
|
if((m_cache) && (section && key && dest && size))
|
||||||
|
{
|
||||||
|
if(stricmp(section, m_currentSection) != 0)
|
||||||
|
{
|
||||||
|
strncpy(m_currentSection, section, MAX_SECTIONNAME_LENGTH);
|
||||||
|
|
||||||
|
char headerString[MAX_SECTIONNAME_LENGTH];
|
||||||
|
ZeroMemory((void *)headerString, sizeof(headerString));
|
||||||
|
// _snprintf(headerString, MAX_SECTIONNAME_LENGTH, "[%s]\r\n", section);
|
||||||
|
_snprintf(headerString, MAX_SECTIONNAME_LENGTH, "[%s]", section);
|
||||||
|
|
||||||
|
// Locate section start in buffer
|
||||||
|
m_sectionStart = strstri(m_cache, headerString);
|
||||||
|
|
||||||
|
// We found the start section
|
||||||
|
if(m_sectionStart)
|
||||||
|
{
|
||||||
|
// Keys start after the "[" + section + "]" header
|
||||||
|
m_sectionStart += strlen(section) + 2;
|
||||||
|
|
||||||
|
// Locate section end in buffer
|
||||||
|
m_sectionEnd = strstr(m_sectionStart, "\r\n[");
|
||||||
|
|
||||||
|
// If no next section is found, then use end of buffer
|
||||||
|
if(m_sectionEnd == NULL)
|
||||||
|
m_sectionEnd = m_cache + strlen(m_cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_sectionStart && m_sectionEnd)
|
||||||
|
{
|
||||||
|
char keyString[MAX_KEYNAME_LENGTH];
|
||||||
|
ZeroMemory((void *)keyString, sizeof(keyString));
|
||||||
|
_snprintf(keyString, MAX_KEYNAME_LENGTH, "\r\n%s=", key);
|
||||||
|
|
||||||
|
if(char *s = strstri(m_sectionStart, keyString))
|
||||||
|
{
|
||||||
|
if(s < m_sectionEnd)
|
||||||
|
{
|
||||||
|
s += strlen(keyString);
|
||||||
|
|
||||||
|
while(*s && (copied < size) && (chrcmp(*s, delimiterEnd) == FALSE))
|
||||||
|
{
|
||||||
|
*dest++ = *s++;
|
||||||
|
copied++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dest = 0;
|
||||||
|
copied++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!copied && def)
|
||||||
|
strncpy(dest, def, size);
|
||||||
|
|
||||||
|
return copied; // Do not include the terminating null character
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL INIFile::WritePrivateProfileString(char *section, char *key, char *string)
|
||||||
|
{
|
||||||
|
if(!section || !key || !string) return false;
|
||||||
|
|
||||||
|
if(stricmp(section, m_currentSection) != 0)
|
||||||
|
{
|
||||||
|
if(m_cacheWritePos == 0)
|
||||||
|
m_cacheWritePos += sprintf((m_cache + m_cacheWritePos), "[%s]\r\n", section);
|
||||||
|
else
|
||||||
|
m_cacheWritePos += sprintf((m_cache + m_cacheWritePos), "\r\n[%s]\r\n", section);
|
||||||
|
|
||||||
|
strncpy(m_currentSection, section, MAX_SECTIONNAME_LENGTH);
|
||||||
|
}
|
||||||
|
m_cacheWritePos += sprintf((m_cache + m_cacheWritePos), "%s=%s\r\n", key, string);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
54
PlugY/INIfile.h
Normal file
54
PlugY/INIfile.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
File modified 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
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _INIFILE_H
|
||||||
|
#define _INIFILE_H
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define INIFILE_READ 10
|
||||||
|
#define INIFILE_WRITE 20
|
||||||
|
#define INIFILE_MPQREAD 30
|
||||||
|
|
||||||
|
#define MAX_SECTIONNAME_LENGTH 128
|
||||||
|
#define MAX_KEYNAME_LENGTH 128
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
class INIFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
INIFile();
|
||||||
|
~INIFile();
|
||||||
|
|
||||||
|
BOOL InitReadWrite(char *path, int readWrite, DWORD writeCacheSize);
|
||||||
|
BOOL close();
|
||||||
|
int GetPrivateProfileString(const char *section, const char *key, const char *def, char *dest, DWORD size);
|
||||||
|
BOOL WritePrivateProfileString(char *section, char *key, char *string);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_readWrite;
|
||||||
|
char m_path[_MAX_PATH];
|
||||||
|
HANDLE m_file;
|
||||||
|
char *m_cache;
|
||||||
|
DWORD m_cacheWritePos;
|
||||||
|
char *m_sectionStart;
|
||||||
|
char *m_sectionEnd;
|
||||||
|
char m_currentSection[MAX_SECTIONNAME_LENGTH];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _INIFILE_H
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
864
PlugY/InfinityStash.cpp
Normal file
864
PlugY/InfinityStash.cpp
Normal file
@ -0,0 +1,864 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Gestion of the infinity and shared Stash.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateClient.h"
|
||||||
|
#include "interface_Stash.h"
|
||||||
|
|
||||||
|
#define STASH_TAG 0x5453 //"ST"
|
||||||
|
#define JM_TAG 0x4D4A //"JM"
|
||||||
|
|
||||||
|
DWORD maxSelfPages = -1;
|
||||||
|
DWORD maxSharedPages = -1;
|
||||||
|
DWORD nbPagesPerIndex = 10;
|
||||||
|
DWORD nbPagesPerIndex2 = 100;
|
||||||
|
bool active_multiPageStash = false;
|
||||||
|
bool active_sharedStash = false;
|
||||||
|
bool separateHardSoftStash = false;
|
||||||
|
bool active_sharedGold=false;
|
||||||
|
char* sharedStashFilename = NULL;
|
||||||
|
|
||||||
|
typedef int (*TchangeToSelectedStash)(Unit* ptChar, Stash* newStash, DWORD bIsClient);
|
||||||
|
|
||||||
|
Unit* firstClassicStashItem(Unit* ptChar)
|
||||||
|
{
|
||||||
|
Unit* ptItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
if (D2ItemGetPage(D2GetRealItem(ptItem)) == 4)
|
||||||
|
return ptItem;
|
||||||
|
ptItem = D2UnitGetNextItem(ptItem);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD endStashList(Unit* ptChar, Stash* ptStash)//WORKS
|
||||||
|
{
|
||||||
|
Stash* stash = ptStash;
|
||||||
|
|
||||||
|
while (stash)
|
||||||
|
{
|
||||||
|
if (stash->ptListItem || ((stash == PCPY->currentStash) && firstClassicStashItem(ptChar))) return 0;
|
||||||
|
stash = stash->nextStash;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool isInList(Stash* list, Stash* pStash)
|
||||||
|
//{
|
||||||
|
// Stash* ptStash = list;
|
||||||
|
// while(ptStash)
|
||||||
|
// {
|
||||||
|
// if (ptStash->id == pStash->id) return true;
|
||||||
|
// ptStash = ptStash->nextStash;
|
||||||
|
// }
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
Stash* getLastStash(Stash* ptStash)//WORKS
|
||||||
|
{
|
||||||
|
Stash* stash = ptStash;
|
||||||
|
|
||||||
|
if (!stash) return NULL;
|
||||||
|
while (stash->nextStash)
|
||||||
|
stash = stash->nextStash;
|
||||||
|
|
||||||
|
return stash;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stash* newStash(DWORD id)
|
||||||
|
{
|
||||||
|
d2_assert( id == 0xFFFFFFFF , "trop de stash", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
Stash* stash = (Stash*)malloc(sizeof(Stash));//D2AllocMem(memPool, sizeof(Stash),__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!stash , "pb de génération de stash", __FILE__, __LINE__);
|
||||||
|
ZeroMemory(stash, sizeof(Stash));
|
||||||
|
stash->id = id;
|
||||||
|
|
||||||
|
return stash;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stash* addStash(Unit* ptChar, bool isShared)
|
||||||
|
{
|
||||||
|
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++);
|
||||||
|
}
|
||||||
|
|
||||||
|
stash->isShared = isShared;
|
||||||
|
stash->previousStash = previous;
|
||||||
|
if (previous)
|
||||||
|
previous->nextStash = stash;
|
||||||
|
else if (isShared)
|
||||||
|
PCPY->sharedStash = stash;
|
||||||
|
else
|
||||||
|
PCPY->selfStash = stash;
|
||||||
|
|
||||||
|
log_msg("AddStash: stash->id=%d\tstash->isShared=%d\tstash->previous=%08X\tnbSelf=%d\tnbShared=%d\n",
|
||||||
|
stash->id,stash->isShared,stash->previousStash,PCPY->nbSelfPages,PCPY->nbSharedPages);
|
||||||
|
|
||||||
|
return stash;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stash* getStash(Unit* ptChar, DWORD isShared, DWORD id)//WORKS
|
||||||
|
{
|
||||||
|
Stash* ptStash = isShared ? PCPY->sharedStash : PCPY->selfStash;
|
||||||
|
|
||||||
|
while(ptStash)
|
||||||
|
{
|
||||||
|
if (ptStash->id == id) return ptStash;
|
||||||
|
ptStash = ptStash->nextStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int changeToSelectedStash_9(Unit* ptChar, Stash* newStash, DWORD bIsClient)
|
||||||
|
{
|
||||||
|
if (!newStash) return 0;
|
||||||
|
|
||||||
|
log_msg("changeToSelectedStash ID:%d\tshared:%d\tclient:%d\n",newStash->id,newStash->id,bIsClient);
|
||||||
|
|
||||||
|
Stash* currentStash = PCPY->currentStash;
|
||||||
|
if (currentStash == newStash) return 0;
|
||||||
|
|
||||||
|
d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__);
|
||||||
|
|
||||||
|
// collect items to remove
|
||||||
|
Inventory* ptInventory = PCInventory;
|
||||||
|
Unit* ptNextItem;
|
||||||
|
Unit* ptPrevItem = NULL;
|
||||||
|
Unit* ptItem = D2InventoryGetFirstItem(ptInventory);
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
ptNextItem = D2UnitGetNextItem(ptItem);
|
||||||
|
if (D2ItemGetPage(D2GetRealItem(ptItem)) == 4)
|
||||||
|
{
|
||||||
|
D2SetAnim(D2GetRealItem(ptItem),-1);
|
||||||
|
if (ptPrevItem) {
|
||||||
|
ptPrevItem->CurrentAnim = (DWORD)ptNextItem;//is ptPrevItem->nextNode = ptNextItem;
|
||||||
|
} else {
|
||||||
|
ptInventory->currentUsedSocket = (DWORD)ptNextItem;//is ptInventory->ptListItem = ptNextItem;
|
||||||
|
}
|
||||||
|
if (!ptNextItem)
|
||||||
|
ptInventory->Inventory2C = (DWORD)ptPrevItem;
|
||||||
|
|
||||||
|
ptInventory->Inventory30 = ptInventory->Inventory30 - 1;
|
||||||
|
D2Common10250(__FILE__,__LINE__,ptInventory, D2GetPosX(D2GetRealItem(ptItem)), D2GetPosY(D2GetRealItem(ptItem)), 0xC, bIsClient, 4);
|
||||||
|
// ptItem = D2InvRemoveItem(PCInventory, D2GetRealItem(ptItem));
|
||||||
|
// D2Common10250(__FILE__,__LINE__,PCInventory, D2GetPosX(ptItem), D2GetPosY(ptItem), 0xC, bIsClient, 4);
|
||||||
|
if (currentStash)
|
||||||
|
{
|
||||||
|
// ptItem = setNextItem(ptItem, PCPY->currentStash->ptListItem);
|
||||||
|
ptItem->CurrentAnim = (DWORD)currentStash->ptListItem;//is ptItem->nextNode = ptListItem
|
||||||
|
currentStash->ptListItem = ptItem;
|
||||||
|
};
|
||||||
|
} else ptPrevItem = ptItem;
|
||||||
|
ptItem = ptNextItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add items of new stash
|
||||||
|
PCPY->currentStash = newStash;
|
||||||
|
ptItem = newStash->ptListItem;
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
D2InvAddItem(PCInventory, D2GetRealItem(ptItem), D2GetPosX(D2GetRealItem(ptItem)), D2GetPosY(D2GetRealItem(ptItem)), 0xC, bIsClient, 4);
|
||||||
|
D2Common10242(PCInventory, D2GetRealItem(ptItem), 1);
|
||||||
|
ptItem = D2UnitGetNextItem(ptItem);
|
||||||
|
}
|
||||||
|
newStash->ptListItem = NULL;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int changeToSelectedStash_10(Unit* ptChar, Stash* newStash, DWORD bIsClient)
|
||||||
|
{
|
||||||
|
if (!newStash) return 0;
|
||||||
|
|
||||||
|
log_msg("changeToSelectedStash ID:%d\tshared:%d\tclient:%d\n",newStash->id,newStash->id,bIsClient);
|
||||||
|
|
||||||
|
Stash* currentStash = PCPY->currentStash;
|
||||||
|
if (currentStash == newStash) return 0;
|
||||||
|
|
||||||
|
d2_assert( currentStash && currentStash->ptListItem, "ERROR : currentStash isn't empty (ptListItem != NULL)",__FILE__,__LINE__);
|
||||||
|
|
||||||
|
// Remove items from current page
|
||||||
|
Unit* ptNextItem;
|
||||||
|
Unit* ptItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
ptNextItem = D2UnitGetNextItem(ptItem);
|
||||||
|
if (D2ItemGetPage(ptItem) == 4)
|
||||||
|
{
|
||||||
|
BYTE tmp = ptItem->ptItemData->ItemData2;
|
||||||
|
ptItem = D2InvRemoveItem(PCInventory, ptItem);
|
||||||
|
ptItem->ptItemData->ItemData2 = tmp;
|
||||||
|
if (currentStash)
|
||||||
|
{
|
||||||
|
ptItem->ptItemData->ptNextItem = currentStash->ptListItem;
|
||||||
|
currentStash->ptListItem = ptItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptItem = ptNextItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add items of new stash
|
||||||
|
PCPY->currentStash = newStash;
|
||||||
|
ptItem = newStash->ptListItem;
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
D2InvAddItem(PCInventory, ptItem, ptItem->path->x, ptItem->path->y, 0xC, bIsClient, 4);
|
||||||
|
ptItem = D2UnitGetNextItem(ptItem);
|
||||||
|
}
|
||||||
|
newStash->ptListItem = NULL;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TchangeToSelectedStash changeToSelectedStash;
|
||||||
|
|
||||||
|
|
||||||
|
DWORD loadStash(Unit* ptChar, Stash* ptStash, BYTE data[], DWORD startSize, DWORD maxSize, DWORD* retSize)
|
||||||
|
{
|
||||||
|
DWORD curSize = startSize;
|
||||||
|
DWORD nbBytesRead;
|
||||||
|
|
||||||
|
log_msg("loadStash\n");
|
||||||
|
|
||||||
|
*retSize = curSize;
|
||||||
|
if( *(WORD *)&data[curSize] != STASH_TAG )//"ST"
|
||||||
|
{
|
||||||
|
log_msg("loadStash -> Bad tag of stash of character %s : %04X\n",PCPlayerData->name,*(WORD *)&data[curSize]);
|
||||||
|
return 0x7;//Unable to enter game. Bad inventory data
|
||||||
|
}
|
||||||
|
curSize += 2;
|
||||||
|
|
||||||
|
// if (strlen((char *)&data[curSize]) > 0xF)
|
||||||
|
// *(char *)&data[curSize+0xF] = NULL;
|
||||||
|
if (strlen((char *)&data[curSize]))
|
||||||
|
ptStash->name = (char*)malloc(strlen((char *)&data[curSize]));//D2AllocMem(PCGame->memoryPool, strlen((char *)&data[curSize]),__FILE__,__LINE__,0);
|
||||||
|
if (ptStash->name)
|
||||||
|
strcpy(ptStash->name, (char *)&data[curSize]);
|
||||||
|
curSize += strlen((char *)&data[curSize]) + 1;
|
||||||
|
|
||||||
|
DWORD ret = D2LoadInventory(PCGame, ptChar, (saveBitField*)&data[curSize], 0x60, maxSize-curSize, 0, &nbBytesRead);
|
||||||
|
if (ret) log_msg("loadStash -> D2LoadInventory failed\n");
|
||||||
|
log_msg("Stash loaded (%d : %s)\n", ptStash->id ,ptStash->name);
|
||||||
|
|
||||||
|
*retSize=curSize + nbBytesRead;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD loadStashList(Unit* ptChar, BYTE data[], DWORD maxSize, DWORD* curSize, bool isShared)//WORKS
|
||||||
|
{
|
||||||
|
DWORD curStash = 0;
|
||||||
|
Stash* newStash;
|
||||||
|
|
||||||
|
DWORD nbStash = *(DWORD*)&data[*curSize];
|
||||||
|
*curSize += 4;
|
||||||
|
|
||||||
|
while (curStash < nbStash)
|
||||||
|
{
|
||||||
|
newStash = addStash(ptChar, isShared);
|
||||||
|
changeToSelectedStash(ptChar, newStash, false);
|
||||||
|
DWORD ret = loadStash(ptChar, newStash, data, *curSize, 10000000, curSize);
|
||||||
|
if (ret) return ret;
|
||||||
|
curStash++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isShared && !PCPY->selfStash)
|
||||||
|
{
|
||||||
|
newStash = addStash(ptChar, isShared);
|
||||||
|
PCPY->currentStash = newStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isShared && !PCPY->sharedStash)
|
||||||
|
{
|
||||||
|
newStash = addStash(ptChar, isShared);
|
||||||
|
if (!PCPY->currentStash)
|
||||||
|
PCPY->currentStash = newStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//ADDDATA(DWORD, curSize, 0);
|
||||||
|
|
||||||
|
#define DATA (*data + *curSize)
|
||||||
|
#define ADDDATA(T) (T*)DATA; *curSize += sizeof(T)
|
||||||
|
#define SETDATA(T,V) *(T*)DATA = V; *curSize += sizeof(T)
|
||||||
|
|
||||||
|
void saveStash(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
//write "ST"
|
||||||
|
SETDATA(WORD, STASH_TAG);
|
||||||
|
|
||||||
|
//save name
|
||||||
|
if (ptStash->name)
|
||||||
|
{
|
||||||
|
int size = strlen(ptStash->name);
|
||||||
|
if (size > 15) size = 15;
|
||||||
|
strncpy((char*)DATA, ptStash->name, size);
|
||||||
|
*curSize += size;
|
||||||
|
}
|
||||||
|
SETDATA(char, NULL);
|
||||||
|
|
||||||
|
//Write "JM" of inventory
|
||||||
|
SETDATA(WORD, JM_TAG);
|
||||||
|
|
||||||
|
//Get position of counter of items in inventory
|
||||||
|
WORD* ptNBItem = ADDDATA(WORD);
|
||||||
|
*ptNBItem = 0;
|
||||||
|
|
||||||
|
//Get first item
|
||||||
|
Unit* ptItem;
|
||||||
|
if ((ptStash->id == PCPY->currentStash->id) && (ptStash->isShared == PCPY->currentStash->isShared))
|
||||||
|
ptItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
else
|
||||||
|
ptItem = ptStash->ptListItem;
|
||||||
|
|
||||||
|
//Write all items
|
||||||
|
while (ptItem)
|
||||||
|
{
|
||||||
|
if (D2ItemGetPage(D2GetRealItem(ptItem)) == 4)
|
||||||
|
{
|
||||||
|
int nbBytes = D2SaveItem(D2GetRealItem(ptItem), (saveBitField*)DATA, *maxSize - *curSize, 1, 1, 0);
|
||||||
|
d2_assert(!nbBytes, "!\"Character has too many items\"", __FILE__, __LINE__ );
|
||||||
|
*curSize += nbBytes;
|
||||||
|
(*ptNBItem)++;
|
||||||
|
}
|
||||||
|
ptItem = D2UnitGetNextItem(ptItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void saveStashList(Unit* ptChar, Stash* ptStash, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
DWORD curSizeNbStash = *curSize;
|
||||||
|
*curSize += sizeof(DWORD);
|
||||||
|
|
||||||
|
DWORD nbStash=0;
|
||||||
|
|
||||||
|
while(ptStash)
|
||||||
|
{
|
||||||
|
if (*curSize + 0x2000 > *maxSize)
|
||||||
|
{
|
||||||
|
BYTE* oldData = *data;
|
||||||
|
*maxSize *= 2;
|
||||||
|
*data = (BYTE *)D2AllocMem(PCGame->memoryPool, *maxSize,__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!*data, "Error : Memory allocation", __FILE__, __LINE__);
|
||||||
|
CopyMemory(*data, oldData, *curSize);
|
||||||
|
D2FreeMem(PCGame->memoryPool, oldData,__FILE__,__LINE__,0);
|
||||||
|
}
|
||||||
|
saveStash(ptChar, ptStash, data, maxSize, curSize);
|
||||||
|
nbStash++;
|
||||||
|
ptStash = endStashList(ptChar, ptStash->nextStash) ? NULL : ptStash->nextStash;
|
||||||
|
}
|
||||||
|
*(DWORD*)(*data + curSizeNbStash) = nbStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////// client
|
||||||
|
void updateSelectedStashClient(Unit* ptChar)//WORKS
|
||||||
|
{
|
||||||
|
Stash* newStash = PCPY->currentStash;
|
||||||
|
updateClient(ptChar, UC_SELECT_STASH, newStash->id, newStash->flags, PCPY->flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags)//WORKS
|
||||||
|
{
|
||||||
|
log_msg("setSelectedStashClient ID:%d, isShared:%d, flags:%08X\n", stashId, stashFlags&1, flags);
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
Stash* newStash = getStash(ptChar, stashFlags&1, stashId);
|
||||||
|
if (!newStash) do
|
||||||
|
newStash = addStash(ptChar, stashFlags&1);
|
||||||
|
while (newStash->id < stashId);
|
||||||
|
changeToSelectedStash(ptChar, newStash, 1);
|
||||||
|
PCPY->flags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void selectStash(Unit* ptChar, Stash* newStash)//WORKS
|
||||||
|
{
|
||||||
|
changeToSelectedStash(ptChar, newStash, 0);
|
||||||
|
updateSelectedStashClient(ptChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///// public functions
|
||||||
|
void toggleToSelfStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->selfStash;
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
{
|
||||||
|
PCPY->showSharedStash = false;
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleToSharedStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->sharedStash;
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
{
|
||||||
|
PCPY->showSharedStash = true;
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void selectPreviousStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->currentStash->previousStash;
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void selectPrevious2Stash(Unit* ptChar)// Select first stash
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->showSharedStash ? PCPY->sharedStash : PCPY->selfStash;
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectNextStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->currentStash;
|
||||||
|
if (!selStash->isShared && (selStash->id >= maxSelfPages)) return;
|
||||||
|
if (selStash->isShared && (selStash->id >= maxSharedPages)) return;
|
||||||
|
|
||||||
|
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);
|
||||||
|
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void selectNext2Stash(Unit* ptChar)//select last stash
|
||||||
|
{
|
||||||
|
Stash* selStash = PCPY->showSharedStash ? PCPY->sharedStash : PCPY->selfStash;//PCPY->currentStash;
|
||||||
|
Stash* lastStash = NULL;
|
||||||
|
Unit* currentStashItem = firstClassicStashItem(ptChar);
|
||||||
|
while (selStash)
|
||||||
|
{
|
||||||
|
if (selStash->ptListItem || (selStash == PCPY->currentStash) && currentStashItem) lastStash=selStash;
|
||||||
|
selStash = selStash->nextStash;
|
||||||
|
}
|
||||||
|
if (!lastStash)
|
||||||
|
lastStash = PCPY->showSharedStash ? PCPY->sharedStash : PCPY->selfStash;
|
||||||
|
if (lastStash != PCPY->currentStash)
|
||||||
|
selectStash(ptChar, lastStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectPreviousIndexStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
selectPreviousStash(ptChar);
|
||||||
|
Stash* selStash = PCPY->currentStash;
|
||||||
|
while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex != 0))
|
||||||
|
selStash = selStash->previousStash;
|
||||||
|
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectPreviousIndex2Stash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
selectPreviousStash(ptChar);
|
||||||
|
Stash* selStash = PCPY->currentStash;
|
||||||
|
while (selStash->previousStash && ((selStash->id+1) % nbPagesPerIndex2 != 0))
|
||||||
|
selStash = selStash->previousStash;
|
||||||
|
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectNextIndexStash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
selectNextStash(ptChar);
|
||||||
|
Stash* selStash = PCPY->currentStash;
|
||||||
|
while ((selStash->id+1) % nbPagesPerIndex != 0)
|
||||||
|
{
|
||||||
|
if (!selStash->isShared && (selStash->id >= maxSelfPages)) break;
|
||||||
|
if (selStash->isShared && (selStash->id >= maxSharedPages)) break;
|
||||||
|
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);;
|
||||||
|
}
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectNextIndex2Stash(Unit* ptChar)
|
||||||
|
{
|
||||||
|
selectNextStash(ptChar);
|
||||||
|
Stash* selStash = PCPY->currentStash;
|
||||||
|
while ((selStash->id+1) % nbPagesPerIndex2 != 0)
|
||||||
|
{
|
||||||
|
if (!selStash->isShared && (selStash->id >= maxSelfPages)) break;
|
||||||
|
if (selStash->isShared && (selStash->id >= maxSharedPages)) break;
|
||||||
|
selStash = selStash->nextStash ? selStash->nextStash : addStash(ptChar, PCPY->showSharedStash);;
|
||||||
|
}
|
||||||
|
if (selStash && (selStash != PCPY->currentStash))
|
||||||
|
selectStash(ptChar, selStash);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
Stash* curStash2;
|
||||||
|
DWORD currentSawStash2;
|
||||||
|
|
||||||
|
Unit* STDCALL getNextItem(Unit* ptChar, Unit* ptItem)
|
||||||
|
{
|
||||||
|
Unit* item = D2UnitGetNextItem(ptItem);
|
||||||
|
if (item) return item;
|
||||||
|
|
||||||
|
if (!curStash2)
|
||||||
|
{
|
||||||
|
switch (currentSawStash2)
|
||||||
|
{
|
||||||
|
case 0: curStash2 = PCPY->selfStash;
|
||||||
|
currentSawStash2 = 1;
|
||||||
|
break;
|
||||||
|
case 1: curStash2 = PCPY->sharedStash;
|
||||||
|
currentSawStash2 = 2;
|
||||||
|
break;
|
||||||
|
default: return NULL;//case 2:
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
curStash2 = curStash2->nextStash;
|
||||||
|
}
|
||||||
|
if (curStash2)
|
||||||
|
{
|
||||||
|
item = curStash2->ptListItem;
|
||||||
|
if (item) return item;
|
||||||
|
}
|
||||||
|
return getNextItem(ptChar,item);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* STDCALL initGetNextItem(Unit* ptChar, Unit* ptItem)
|
||||||
|
{
|
||||||
|
if (ptChar->nUnitType != UNIT_PLAYER) return NULL;
|
||||||
|
if (!PCPY) return NULL;
|
||||||
|
|
||||||
|
curStash2 = NULL;
|
||||||
|
currentSawStash2 = 0;
|
||||||
|
if (ptItem) return ptItem;
|
||||||
|
return getNextItem(ptChar,ptItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_initGetNextItem )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x20]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0xC]
|
||||||
|
CALL initGetNextItem
|
||||||
|
MOV EDI,EAX
|
||||||
|
TEST EDI,EDI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_getNextItem )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10]
|
||||||
|
CALL getNextItem
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL carry1Limit(Unit* ptChar, Unit* ptItemParam, DWORD itemNum, BYTE page)
|
||||||
|
{
|
||||||
|
if (!ptChar) return 0;
|
||||||
|
Unit* ptItem = ptItemParam ? ptItemParam : D2GameGetObject(PCGame, UNIT_ITEM, itemNum);
|
||||||
|
if ((page != 4) && (D2GetItemQuality(ptItem) == 7) && ptChar)
|
||||||
|
{
|
||||||
|
int uniqueID = D2GetUniqueID(ptItem);
|
||||||
|
if ((uniqueID>=0) && (uniqueID < (int)SgptDataTables->nbUniqueItems))
|
||||||
|
{
|
||||||
|
UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + uniqueID;
|
||||||
|
if (uniqueItems && (uniqueItems->carry1==1))
|
||||||
|
{
|
||||||
|
ItemsBIN* ptItemsBin = D2GetItemsBIN(ptItem->nTxtFileNo);
|
||||||
|
Unit* ptFirstItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
if (ptItemsBin && ptFirstItem)
|
||||||
|
return D2VerifIfNotCarry1(ptItem, ptItemsBin, ptFirstItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1Limit_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x08]//page
|
||||||
|
PUSH 0//EDI
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x0C]
|
||||||
|
PUSH ESI//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2ItemSetPage
|
||||||
|
end_carry1Limit:
|
||||||
|
ADD ESP,0xC
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EDI
|
||||||
|
POP EBX
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1Limit )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x08]//page
|
||||||
|
PUSH 0//EBP
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x0C]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x28]//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2ItemSetPage
|
||||||
|
end_carry1Limit:
|
||||||
|
ADD ESP,0xC
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x24
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1LimitSwap_112 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
PUSH 0
|
||||||
|
PUSH ESI//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2ItemGetPage
|
||||||
|
end_carry1Limit:
|
||||||
|
ADD ESP,8
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EDI
|
||||||
|
POP EBP
|
||||||
|
POP ESI
|
||||||
|
POP EBX
|
||||||
|
POP ECX
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1LimitSwap_111 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EBP
|
||||||
|
PUSH 0
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x24]//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2ItemGetPage
|
||||||
|
end_carry1Limit:
|
||||||
|
ADD ESP,8
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EDI
|
||||||
|
POP EBP
|
||||||
|
POP ESI
|
||||||
|
POP EBX
|
||||||
|
POP ECX
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1LimitSwap )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x20]
|
||||||
|
PUSH 0
|
||||||
|
PUSH EBP//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2ItemGetPage
|
||||||
|
end_carry1Limit:
|
||||||
|
ADD ESP,8
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x4C
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FCT_ASM ( caller_carry1LimitWhenDrop )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH 0
|
||||||
|
PUSH ESI//ptItem
|
||||||
|
PUSH EDI//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
POP EAX
|
||||||
|
JE END_carry1LimitWhenDrop
|
||||||
|
MOV EDX,0x806
|
||||||
|
RETN
|
||||||
|
END_carry1LimitWhenDrop:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1F
|
||||||
|
RETN
|
||||||
|
}}*/
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1LimitWhenDrop_111 )
|
||||||
|
PUSH 0
|
||||||
|
PUSH 0
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10] //ptItem
|
||||||
|
PUSH ESI //ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2CanPutItemInInv
|
||||||
|
end_carry1Limit:
|
||||||
|
XOR EAX,EAX
|
||||||
|
RETN 0x1C
|
||||||
|
}}
|
||||||
|
/*
|
||||||
|
FCT_ASM ( caller_carry1LimitWhenDrop )
|
||||||
|
PUSH 0
|
||||||
|
PUSH 0
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x10] //ptItem
|
||||||
|
PUSH EDI //ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
JNZ end_carry1Limit
|
||||||
|
JMP D2CanPutItemInInv
|
||||||
|
end_carry1Limit:
|
||||||
|
XOR EAX,EAX
|
||||||
|
RETN 0x1C
|
||||||
|
}}*/
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1LimitWhenDrop )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH 0
|
||||||
|
PUSH 0
|
||||||
|
PUSH ESI//ptItem
|
||||||
|
PUSH EDI//ptChar
|
||||||
|
CALL carry1Limit
|
||||||
|
TEST EAX,EAX
|
||||||
|
POP EAX
|
||||||
|
JNZ END_carry1LimitWhenDrop
|
||||||
|
MOV EDX,0x806
|
||||||
|
RETN
|
||||||
|
END_carry1LimitWhenDrop:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1F
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1OutOfStash_111 )
|
||||||
|
PUSH EDI
|
||||||
|
CALL D2ItemGetPage
|
||||||
|
CMP AL,4
|
||||||
|
JNZ continue_carry1OutOfStash
|
||||||
|
ADD DWORD PTR SS:[ESP],0x17C
|
||||||
|
RETN
|
||||||
|
continue_carry1OutOfStash:
|
||||||
|
MOV ESI,DWORD PTR SS:[ESP+0x10]
|
||||||
|
TEST ESI,ESI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_carry1OutOfStash )
|
||||||
|
PUSH ESI
|
||||||
|
CALL D2ItemGetPage
|
||||||
|
CMP AL,4
|
||||||
|
JNZ continue_carry1OutOfStash
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1AF
|
||||||
|
RETN
|
||||||
|
continue_carry1OutOfStash:
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x14]
|
||||||
|
TEST EAX,EAX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_MultiPageStash()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlayerCustomData();
|
||||||
|
Install_InterfaceStash();
|
||||||
|
|
||||||
|
changeToSelectedStash = version_D2Common >= V110 ? changeToSelectedStash_10 : changeToSelectedStash_9;
|
||||||
|
|
||||||
|
if ( version_D2Game >= V110 )
|
||||||
|
{
|
||||||
|
log_msg("Patch D2Game for carry1 unique item. (MultiPageStash)\n");
|
||||||
|
|
||||||
|
// Cannot put 2 items carry1 in inventory
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 55050, 57CA3, 2FE63, 99B03, CF1E3);
|
||||||
|
MEMJ_REF4( D2ItemSetPage , 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>
|
||||||
|
|
||||||
|
// Cannot put 2 items carry1 in inventory by swapping
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 558D9, 58968, 310E8, 9B6E8, D10C8);
|
||||||
|
MEMJ_REF4( D2ItemGetPage , 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>
|
||||||
|
|
||||||
|
if ( version_D2Game >= V111 )
|
||||||
|
{
|
||||||
|
// Cannot put 2 items carry1 in inventory when drop cube
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, 3D935, 49FD5, 17AD5, D7B75);
|
||||||
|
MEMJ_REF4( D2CanPutItemInInv , 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>
|
||||||
|
} else {
|
||||||
|
// Cannot put 2 items carry1 in inventory when drop cube
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 14341, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0xBA ,0xE8);
|
||||||
|
MEMT_REF4( 0x00000806 , caller_carry1LimitWhenDrop);
|
||||||
|
//6FC44341 |. BA 06080000 |MOV EDX,806
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verif only carry1 out of stash page when pick up an item
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 1299E, 38E3B, 43F0B, 1209B, D211B);
|
||||||
|
memt_byte( 0x8B ,0xE8);
|
||||||
|
MEMT_REF4( version_D2Game >= V111 ? 0x850C2474 : 0x85102444 , version_D2Game >= V111 ? caller_carry1OutOfStash_111 : caller_carry1OutOfStash);
|
||||||
|
memt_byte( version_D2Game >= V111 ? 0xF6 : 0xC0 ,0x90);
|
||||||
|
//6FC4299E |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FC429A2 |. 85C0 |TEST EAX,EAX
|
||||||
|
//01FB8E3B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||||
|
//01FB8E3F |. 85F6 |TEST ESI,ESI
|
||||||
|
//01FB3F0B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||||
|
//01FB3F0F |. 85F6 |TEST ESI,ESI
|
||||||
|
//6FC3209B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||||
|
//6FC3209F |. 85F6 |TEST ESI,ESI
|
||||||
|
//6FCF211B |. 8B7424 0C |MOV ESI,DWORD PTR SS:[ESP+C]
|
||||||
|
//6FCF211F |. 85F6 |TEST ESI,ESI
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
219
PlugY/Interface_Skills.cpp
Normal file
219
PlugY/Interface_Skills.cpp
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h" // Install_UpdateServer()
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "skillsPoints.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int posXUnassignSkillBtn=-1;
|
||||||
|
int posYUnassignSkillBtn=-1;
|
||||||
|
|
||||||
|
DWORD btnSkillIsDown;
|
||||||
|
DWORD getXSkillBtn() {return RX(posXUnassignSkillBtn<0? 0x243 : posXUnassignSkillBtn);}
|
||||||
|
#define getLSkillBtn() 32
|
||||||
|
DWORD getYSkillBtn() {return RY(posYUnassignSkillBtn<0 ? 0x1B1 : posYUnassignSkillBtn);}
|
||||||
|
#define getHSkillBtn() 32
|
||||||
|
#define isOnButtonUnassignSkill(x,y) isOnRect(x, y, getXSkillBtn(), getYSkillBtn(), getLSkillBtn(), getHSkillBtn())
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL printSkillsPageBtns()
|
||||||
|
{
|
||||||
|
if (active_SkillsPoints && !onRealm && D2isLODGame())
|
||||||
|
{
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
setImage(&data, unassignSkillsBtnImages);
|
||||||
|
setFrame(&data, btnSkillIsDown);
|
||||||
|
D2PrintImage(&data, getXSkillBtn(), getYSkillBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if ( isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
||||||
|
{
|
||||||
|
LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN);
|
||||||
|
D2PrintPopup(popupText, getXSkillBtn()+getLSkillBtn()/2, getYSkillBtn()-getHSkillBtn(), 0, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
||||||
|
{
|
||||||
|
log_msg("push down left button unassign skill\n");
|
||||||
|
btnSkillIsDown = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
freeMessage(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ptChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL skillsPageMouseUp()
|
||||||
|
{
|
||||||
|
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
||||||
|
{
|
||||||
|
log_msg("push up left button unassign skill\n");
|
||||||
|
if (btnSkillIsDown)
|
||||||
|
updateServer(US_UNASSIGN_SKILLS);
|
||||||
|
}
|
||||||
|
btnSkillIsDown = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printSkillsPageBtns_111 )
|
||||||
|
CALL printSkillsPageBtns
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printSkillsPageBtns )
|
||||||
|
CALL printSkillsPageBtns
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x48
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_DontPrintSkillPointsRemaining_111 )
|
||||||
|
MOV AL,BYTE PTR DS:[onRealm]
|
||||||
|
TEST AL,AL
|
||||||
|
JNZ dontPrint
|
||||||
|
ADD DWORD PTR SS:[ESP],0xF2
|
||||||
|
RETN
|
||||||
|
dontPrint:
|
||||||
|
MOV ECX,0x1083
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_DontPrintSkillPointsRemaining )
|
||||||
|
MOV AL,BYTE PTR DS:[onRealm]
|
||||||
|
TEST AL,AL
|
||||||
|
JNZ dontPrint
|
||||||
|
ADD DWORD PTR SS:[ESP],0x9D
|
||||||
|
RETN
|
||||||
|
dontPrint:
|
||||||
|
MOV ECX,0x1083
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_skillsPageMouseDown_111 )
|
||||||
|
PUSH EBP
|
||||||
|
CALL skillsPageMouseDown
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_skillsPageMouseDown )
|
||||||
|
PUSH EBX
|
||||||
|
CALL skillsPageMouseDown
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_skillsPageMouseUp )
|
||||||
|
CALL skillsPageMouseUp
|
||||||
|
JMP D2FreeWinMessage
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_InterfaceSkills()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_UpdateServer();
|
||||||
|
Install_PlugYImagesFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n");
|
||||||
|
|
||||||
|
// Print new buttons images
|
||||||
|
mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20);
|
||||||
|
memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns
|
||||||
|
if ( version_D2Client >= V111 ) {
|
||||||
|
MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111);
|
||||||
|
//6FAC6190 5F POP EDI
|
||||||
|
//6FAC6191 5E POP ESI
|
||||||
|
//6FAC6192 5B POP EBX
|
||||||
|
//6FAC6193 C3 RETN
|
||||||
|
//6FAC6194 CC INT3
|
||||||
|
//6FB3A9C0 |> 5F POP EDI
|
||||||
|
//6FB3A9C1 |. 5E POP ESI
|
||||||
|
//6FB3A9C2 |. 5B POP EBX
|
||||||
|
//6FB3A9C3 \. C3 RETN
|
||||||
|
//6FB3A9C4 CC INT3
|
||||||
|
//6FB2F320 |> 5F POP EDI
|
||||||
|
//6FB2F321 |. 5E POP ESI
|
||||||
|
//6FB2F322 |. 5B POP EBX
|
||||||
|
//6FB2F323 \. C3 RETN
|
||||||
|
//6FB2F324 CC INT3
|
||||||
|
//6FB27F20 |> 5F POP EDI
|
||||||
|
//6FB27F21 |. 5E POP ESI
|
||||||
|
//6FB27F22 |. 5B POP EBX
|
||||||
|
//6FB27F23 \. C3 RETN
|
||||||
|
//6FB27F24 CC INT3
|
||||||
|
} else {
|
||||||
|
MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns);
|
||||||
|
memt_byte( 0xC4, 0x90 ); // NOP
|
||||||
|
memt_byte( 0x48, 0x90 ); // NOP
|
||||||
|
memt_byte( 0xC3, 0x90 ); // NOP
|
||||||
|
//6FB17073 |. 5F POP EDI
|
||||||
|
//6FB17074 |. 5E POP ESI
|
||||||
|
//6FB17075 |. 5D POP EBP
|
||||||
|
//6FB17076 |. 5B POP EBX
|
||||||
|
//6FB17077 |. 83C4 48 ADD ESP,48
|
||||||
|
//6FB1707A \. C3 RETN
|
||||||
|
}
|
||||||
|
|
||||||
|
if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1)
|
||||||
|
{
|
||||||
|
// Don't print "Skill Points Remaining"
|
||||||
|
mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334);
|
||||||
|
memt_byte( 0xB9, 0xE8 );
|
||||||
|
MEMT_REF4( 0x00001083, 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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manage mouse down (Play sound)
|
||||||
|
mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62);
|
||||||
|
memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown
|
||||||
|
MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
|
||||||
|
memt_byte( 0x00, 0x90 ); // NOP
|
||||||
|
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 000000>MOV DWORD PTR SS:[EBP+18],0
|
||||||
|
//6FB29C62 > C745 18 000000>MOV DWORD PTR SS:[EBP+18],0
|
||||||
|
|
||||||
|
// Manage mouse up
|
||||||
|
mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8);
|
||||||
|
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>
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
524
PlugY/Interface_Stash.cpp
Normal file
524
PlugY/Interface_Stash.cpp
Normal file
@ -0,0 +1,524 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface stats page functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "interface_Stash.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD previous:1;
|
||||||
|
DWORD next:1;
|
||||||
|
DWORD toggleToSharedStash:1;
|
||||||
|
DWORD previousIndex:1;
|
||||||
|
DWORD nextIndex:1;
|
||||||
|
DWORD putGold:1;
|
||||||
|
DWORD takeGold:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} isDownBtn;
|
||||||
|
|
||||||
|
bool displaySharedSetItemNameInGreen = true;
|
||||||
|
int posXPreviousBtn=-1;
|
||||||
|
int posYPreviousBtn=-1;
|
||||||
|
int posXNextBtn=-1;
|
||||||
|
int posYNextBtn=-1;
|
||||||
|
int posXSharedBtn=-1;
|
||||||
|
int posYSharedBtn=-1;
|
||||||
|
int posXPreviousIndexBtn=-1;
|
||||||
|
int posYPreviousIndexBtn=-1;
|
||||||
|
int posXNextIndexBtn=-1;
|
||||||
|
int posYNextIndexBtn=-1;
|
||||||
|
int posXPutGoldBtn=-1;
|
||||||
|
int posYPutGoldBtn=-1;
|
||||||
|
int posXTakeGoldBtn=-1;
|
||||||
|
int posYTakeGoldBtn=-1;
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
//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())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void* STDCALL printBtns()
|
||||||
|
{
|
||||||
|
if (onRealm || !D2isLODGame()) return D2LoadBuySelBtn();
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
setImage(&data, stashBtnsImages);
|
||||||
|
|
||||||
|
setFrame(&data, 0 + isDownBtn.previous);
|
||||||
|
D2PrintImage(&data, getXPreviousBtn(), getYPreviousBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
setFrame(&data, 2 + isDownBtn.next);
|
||||||
|
D2PrintImage(&data, getXNextBtn(), getYNextBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if (active_sharedStash)
|
||||||
|
{
|
||||||
|
setFrame(&data, 4 + isDownBtn.toggleToSharedStash + (PCPY->showSharedStash?2:0) );
|
||||||
|
D2PrintImage(&data, getXSharedBtn(), getYSharedBtn(), -1, 5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
setFrame(&data, 8 + isDownBtn.previousIndex);
|
||||||
|
D2PrintImage(&data, getXPreviousIndexBtn(), getYPreviousIndexBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
setFrame(&data, 10 + isDownBtn.nextIndex);
|
||||||
|
D2PrintImage(&data, getXNextIndexBtn(), getYNextIndexBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if (active_sharedGold)
|
||||||
|
{
|
||||||
|
setImage(&data, sharedGoldBtnsImages);
|
||||||
|
setFrame(&data, 0 + isDownBtn.putGold);
|
||||||
|
D2PrintImage(&data, getXPutGoldBtn(), getYPutGoldBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
setFrame(&data, 2 + isDownBtn.takeGold);
|
||||||
|
D2PrintImage(&data, getXTakeGoldBtn(), getYTakeGoldBtn(), -1, 5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LPWSTR lpText;
|
||||||
|
WCHAR text[100];
|
||||||
|
DWORD mx = D2GetMouseX();
|
||||||
|
DWORD my = D2GetMouseY();
|
||||||
|
|
||||||
|
D2SetFont(1);
|
||||||
|
|
||||||
|
if (isOnButtonPreviousStash(mx,my)) {
|
||||||
|
lpText = getTranslatedString(STR_STASH_PREVIOUS_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXPreviousBtn()+getLPreviousBtn()/2, getYPreviousBtn()-getHPreviousBtn(), WHITE, 1);
|
||||||
|
|
||||||
|
} else if (isOnButtonNextStash(mx,my)) {
|
||||||
|
lpText = getTranslatedString(STR_STASH_NEXT_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXNextBtn()+getLNextBtn()/2, getYNextBtn()-getHNextBtn(), WHITE, 1);
|
||||||
|
|
||||||
|
} else if (active_sharedStash && isOnButtonToggleSharedStash(mx,my)) {
|
||||||
|
lpText = getTranslatedString(PCPY->showSharedStash ? STR_TOGGLE_TO_PERSONAL : STR_TOGGLE_TO_SHARED);
|
||||||
|
D2PrintPopup(lpText, getXSharedBtn()+getLSharedBtn()/2, getYSharedBtn()-getHSharedBtn(), WHITE, 1);
|
||||||
|
|
||||||
|
} else if (isOnButtonPreviousIndexStash(mx,my)) {
|
||||||
|
swprintf(text, getTranslatedString(STR_STASH_PREVIOUS_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
|
||||||
|
D2PrintPopup(text, getXPreviousIndexBtn()+getLPreviousIndexBtn()/2, getYPreviousIndexBtn()-getHPreviousIndexBtn(), 0, 0);
|
||||||
|
|
||||||
|
} else if (isOnButtonNextIndexStash(mx,my)) {
|
||||||
|
swprintf(text, getTranslatedString(STR_STASH_NEXT_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
|
||||||
|
D2PrintPopup(text, getXNextIndexBtn()+getLNextIndexBtn()/2, getYNextIndexBtn()-getHNextIndexBtn(), WHITE, 1);
|
||||||
|
|
||||||
|
} else if (active_sharedGold && isOnButtonPutGold(mx,my)) {
|
||||||
|
lpText = getTranslatedString(STR_PUT_GOLD);
|
||||||
|
D2PrintPopup(lpText, getXPutGoldBtn()+getLPutGoldBtn()/2, getYPutGoldBtn()-getHPutGoldBtn(), WHITE, 1);
|
||||||
|
|
||||||
|
} else if (active_sharedGold && isOnButtonTakeGold(mx,my)) {
|
||||||
|
lpText = getTranslatedString(STR_TAKE_GOLD);
|
||||||
|
D2PrintPopup(lpText, getXTakeGoldBtn()+getLTakeGoldBtn()/2, getYTakeGoldBtn()-getHTakeGoldBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return D2LoadBuySelBtn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL manageBtnDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (onRealm || !D2isLODGame()) return 0;
|
||||||
|
|
||||||
|
if (isOnButtonPreviousStash(msg->x,msg->y))
|
||||||
|
isDownBtn.previous = 1;
|
||||||
|
else if (isOnButtonNextStash(msg->x,msg->y))
|
||||||
|
isDownBtn.next = 1;
|
||||||
|
else if (active_sharedStash && isOnButtonToggleSharedStash(msg->x,msg->y))
|
||||||
|
isDownBtn.toggleToSharedStash = 1;
|
||||||
|
else if (isOnButtonPreviousIndexStash(msg->x,msg->y))
|
||||||
|
isDownBtn.previousIndex = 1;
|
||||||
|
else if (isOnButtonNextIndexStash(msg->x,msg->y))
|
||||||
|
isDownBtn.nextIndex = 1;
|
||||||
|
else if (active_sharedGold && isOnButtonPutGold(msg->x,msg->y))
|
||||||
|
isDownBtn.putGold = 1;
|
||||||
|
else if (active_sharedGold && isOnButtonTakeGold(msg->x,msg->y))
|
||||||
|
isDownBtn.takeGold = 1;
|
||||||
|
else return 0;
|
||||||
|
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
freeMessage(msg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL manageBtnUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (onRealm || !D2isLODGame()) return 0;
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if (isOnButtonPreviousStash(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left button previous\n");
|
||||||
|
if (isDownBtn.previous)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_SELECT_PREVIOUS2);
|
||||||
|
else
|
||||||
|
updateServer(US_SELECT_PREVIOUS);
|
||||||
|
|
||||||
|
} else if (isOnButtonNextStash(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left button next\n");
|
||||||
|
if (isDownBtn.next)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_SELECT_NEXT2);
|
||||||
|
else
|
||||||
|
updateServer(US_SELECT_NEXT);
|
||||||
|
|
||||||
|
} else if (active_sharedStash && isOnButtonToggleSharedStash(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left button shared\n");
|
||||||
|
if (isDownBtn.toggleToSharedStash)
|
||||||
|
if (PCPY->showSharedStash)
|
||||||
|
updateServer(US_SELECT_SELF);
|
||||||
|
else
|
||||||
|
updateServer(US_SELECT_SHARED);
|
||||||
|
|
||||||
|
} else if (isOnButtonPreviousIndexStash(msg->x,msg->y)) {
|
||||||
|
log_msg("select left button previous index\n");
|
||||||
|
if (isDownBtn.previousIndex)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_SELECT_PREVIOUS_INDEX2);
|
||||||
|
else
|
||||||
|
updateServer(US_SELECT_PREVIOUS_INDEX);
|
||||||
|
|
||||||
|
} else if (isOnButtonNextIndexStash(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left button next index\n");
|
||||||
|
if (isDownBtn.nextIndex)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_SELECT_NEXT_INDEX2);
|
||||||
|
else
|
||||||
|
updateServer(US_SELECT_NEXT_INDEX);
|
||||||
|
|
||||||
|
} else if (active_sharedGold && isOnButtonPutGold(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left put gold\n");
|
||||||
|
if (isDownBtn.putGold)
|
||||||
|
updateServer(US_PUTGOLD);
|
||||||
|
|
||||||
|
} else if (active_sharedGold && isOnButtonTakeGold(msg->x,msg->y)) {
|
||||||
|
log_msg("push up left take gold\n");
|
||||||
|
if (isDownBtn.takeGold)
|
||||||
|
updateServer(US_TAKEGOLD);
|
||||||
|
|
||||||
|
} else return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FASTCALL printPageNumber(LPWSTR maxGoldText, DWORD x, DWORD y, DWORD color, DWORD bfalse)
|
||||||
|
{
|
||||||
|
if (onRealm || !D2isLODGame() )
|
||||||
|
{
|
||||||
|
D2PrintString(maxGoldText,x,y,color,bfalse);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
WCHAR popupText[100];
|
||||||
|
|
||||||
|
if (PCPY->currentStash)
|
||||||
|
{
|
||||||
|
bool isShared = PCPY->currentStash->isShared;
|
||||||
|
DWORD currentId = PCPY->currentStash->id;
|
||||||
|
|
||||||
|
if (PCPY->currentStash->name && PCPY->currentStash->name[0])
|
||||||
|
mbstowcs(popupText,PCPY->currentStash->name,50);//strlen(PCPY->currentStash->name)+1
|
||||||
|
else swprintf(popupText, getTranslatedString( isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER), currentId+1);
|
||||||
|
D2PrintString(popupText,x,y, isShared?RED:WHITE ,bfalse);
|
||||||
|
} else {
|
||||||
|
swprintf(popupText, getTranslatedString(STR_NO_SELECTED_PAGE));
|
||||||
|
D2PrintString(popupText,x,y, WHITE ,bfalse);
|
||||||
|
}
|
||||||
|
|
||||||
|
//printGoldMaxPopup
|
||||||
|
DWORD mx = D2GetMouseX();
|
||||||
|
DWORD my = D2GetMouseY();
|
||||||
|
if ((RX(0x5E) < mx) && (mx < RX(0xF8)) && (RY(0x1C8) < my) && (my < RY(0x1B6)) )
|
||||||
|
{
|
||||||
|
if (active_sharedGold)
|
||||||
|
{
|
||||||
|
swprintf(popupText, L"%s\n", maxGoldText);
|
||||||
|
swprintf(popupText+wcslen(popupText), getTranslatedString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold);
|
||||||
|
DWORD x = D2GetPixelLen(maxGoldText);
|
||||||
|
DWORD x2 = D2GetPixelLen(popupText) - x;
|
||||||
|
D2PrintPopup(popupText, RX(0xA8-max(x,x2)/2), RY(0x1CA), WHITE, 0);
|
||||||
|
} else
|
||||||
|
D2PrintPopup(maxGoldText, RX(0xA8), RY(0x1CA), WHITE, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Stash* curStash=NULL;
|
||||||
|
static DWORD currentSawStash=0;
|
||||||
|
Unit* STDCALL getNextItemForSet(Unit* ptItem)
|
||||||
|
{
|
||||||
|
Unit* item = ptItem?D2UnitGetNextItem(ptItem):NULL;
|
||||||
|
if (item) return item;
|
||||||
|
|
||||||
|
if (!curStash)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
switch (currentSawStash)
|
||||||
|
{
|
||||||
|
case 0: curStash = PCPY->selfStash;
|
||||||
|
currentSawStash = displaySharedSetItemNameInGreen ? 1 : 2;
|
||||||
|
break;
|
||||||
|
case 1: curStash = PCPY->sharedStash;
|
||||||
|
currentSawStash = 2;
|
||||||
|
break;
|
||||||
|
default:return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
curStash = curStash->nextStash;
|
||||||
|
}
|
||||||
|
if (curStash)
|
||||||
|
{
|
||||||
|
item = curStash->ptListItem;
|
||||||
|
if (item) return item;
|
||||||
|
}
|
||||||
|
return getNextItemForSet(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* STDCALL initGetNextItemForSet(Inventory* ptInventory)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
if (ptChar->nUnitType != UNIT_PLAYER) return NULL;
|
||||||
|
if (!PCPY) return NULL;
|
||||||
|
|
||||||
|
curStash = NULL;
|
||||||
|
currentSawStash = 0;
|
||||||
|
Unit* item = D2InventoryGetFirstItem(ptInventory);
|
||||||
|
if (item) return item;
|
||||||
|
return getNextItemForSet(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM( caller_manageBtnDown_111 )
|
||||||
|
PUSH EBP
|
||||||
|
CALL manageBtnDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE IS_NOT_ON_BUTTON
|
||||||
|
POP EDX
|
||||||
|
MOV EDX, DWORD PTR DS:[EDX+0x10]
|
||||||
|
MOV DWORD PTR DS:[EDX],1
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
IS_NOT_ON_BUTTON:
|
||||||
|
JMP D2ClickOnStashButton
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_manageBtnDown )
|
||||||
|
PUSH EDI
|
||||||
|
CALL manageBtnDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE IS_NOT_ON_BUTTON
|
||||||
|
POP EDX
|
||||||
|
MOV EDX, DWORD PTR DS:[EDX+0xF3]
|
||||||
|
MOV DWORD PTR DS:[EDX],1
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
IS_NOT_ON_BUTTON:
|
||||||
|
JMP D2isLODGame
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_manageBtnUp_111 )
|
||||||
|
PUSH EBX
|
||||||
|
CALL manageBtnUp
|
||||||
|
MOV isDownBtn.all,0
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE IS_NOT_ON_BUTTON
|
||||||
|
POP EDX
|
||||||
|
MOV EDX, DWORD PTR DS:[EDX+0x1A]
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
SUB EDX,8
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
ADD EDX,4
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
ADD EDX,0x68
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
POP ECX
|
||||||
|
RETN 4
|
||||||
|
IS_NOT_ON_BUTTON:
|
||||||
|
JMP D2ClickOnStashButton
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_manageBtnUp )
|
||||||
|
PUSH EBP
|
||||||
|
CALL manageBtnUp
|
||||||
|
MOV isDownBtn.all,0
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE IS_NOT_ON_BUTTON
|
||||||
|
POP EDX
|
||||||
|
MOV EDX, DWORD PTR DS:[EDX+0xEA]
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
SUB EDX,8
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
ADD EDX,4
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
ADD EDX,0x68
|
||||||
|
MOV DWORD PTR DS:[EDX],0
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
IS_NOT_ON_BUTTON:
|
||||||
|
JMP D2isLODGame
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( initBtnsStates )
|
||||||
|
MOV isDownBtn.all,0
|
||||||
|
ADD ESP,0x104
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_InterfaceStash()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_UpdateServer();
|
||||||
|
Install_PlugYImagesFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for stash interface. (InterfaceStash)\n");
|
||||||
|
|
||||||
|
// Print button images
|
||||||
|
mem_seek R7(D2Client, 39060, 39060, 3F399, B1006, 7DF86, B3656, 99A56);
|
||||||
|
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
|
||||||
|
|
||||||
|
// print page number
|
||||||
|
mem_seek R7(D2Client, 3903C, 3903C, 3F375, B0FE3, 7DF63, B3633, 99A33);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// Manage mouse down (Play sound)
|
||||||
|
mem_seek R7(D2Client, 45091, 45091, 4BBA1, B4666, 7FDD6, B54A6, 9B8A6);
|
||||||
|
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnDown_111 : caller_manageBtnDown);
|
||||||
|
//6FAEBBA0 > E8 DB04FCFF CALL D2Client.6FAAC080
|
||||||
|
//6FB64665 . E8 B61EFFFF CALL D2Client.6FB56520
|
||||||
|
//6FB2FDD5 . E8 E612FFFF CALL D2Client.6FB210C0
|
||||||
|
//6FB654A5 . E8 9611FFFF CALL D2Client.6FB56640
|
||||||
|
//6FB4B8A5 . E8 5614FFFF CALL D2Client.6FB3CD00
|
||||||
|
|
||||||
|
// Manage mouse up
|
||||||
|
mem_seek R7(D2Client, 455F9, 455F9, 4C0F9, B57B9, 7FC09, B52D9, 9B6D9);
|
||||||
|
MEMC_REF4( version_D2Client >= V111 ? (DWORD)D2ClickOnStashButton : (DWORD)D2isLODGame, version_D2Client >= V111 ? caller_manageBtnUp_111 : caller_manageBtnUp);
|
||||||
|
//6FAEC0F8 > E8 83FFFBFF CALL D2Client.6FAAC080
|
||||||
|
//6FB657B8 > E8 630DFFFF CALL D2Client.6FB56520
|
||||||
|
//6FB2FC08 > E8 B314FFFF CALL D2Client.6FB210C0
|
||||||
|
//6FB652D8 > E8 6313FFFF CALL D2Client.6FB56640
|
||||||
|
//6FB4B6D8 > E8 2316FFFF CALL D2Client.6FB3CD00
|
||||||
|
|
||||||
|
// init state of button on open stash page
|
||||||
|
mem_seek R7(D2Client, 45B3A, 45B3A, 4C63A, A645A, 749DA, A9D9A, 8CC3A);
|
||||||
|
memt_byte( 0x81, 0xE9 ); // CALL initBtnsStates
|
||||||
|
MEMT_REF4( 0x000104C4, initBtnsStates);
|
||||||
|
memt_byte( 0x00, 0x90 );
|
||||||
|
//6FAE5B3A |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FAE5B3A |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FAEC63A |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FB5645A |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FB249DA |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FB59D9A |> 81C4 04010000 ADD ESP,104
|
||||||
|
//6FB3CC3A |> 81C4 04010000 ADD ESP,104
|
||||||
|
|
||||||
|
// init the search of print in green the item set name we have in stash
|
||||||
|
mem_seek R7(D2Client, 3F098, 3F098, 45997, A71F4, 71F64, A7314, 8D434);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// Get next item for print in green the item set name we have in stash
|
||||||
|
mem_seek R7(D2Client, 3F0FA, 3F0FA, 45A1C, A728B, 71FFB, A73AB, 8D4CB);
|
||||||
|
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>
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
318
PlugY/Interface_Stats.cpp
Normal file
318
PlugY/Interface_Stats.cpp
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD previousPage:1;
|
||||||
|
DWORD nextPage:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} isDownBtn;
|
||||||
|
|
||||||
|
#define getXPreviousPageBtn() RX(0x19)//0x70
|
||||||
|
#define getLPreviousPageBtn() 32
|
||||||
|
#define getYPreviousPageBtn() RY(0x40)
|
||||||
|
#define getHPreviousPageBtn() 32
|
||||||
|
#define isOnPreviousPageBtn(x,y) isOnRect(x, y, getXPreviousPageBtn(), getYPreviousPageBtn(), getLPreviousPageBtn(), getHPreviousPageBtn())
|
||||||
|
|
||||||
|
#define getXNextPageBtn() RX(D2GetResolution()?0x43:0x8A)
|
||||||
|
#define getLNextPageBtn() 32
|
||||||
|
#define getYNextPageBtn() RY(D2GetResolution()?0x40:0x70)
|
||||||
|
#define getHNextPageBtn() 32
|
||||||
|
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL printStatsPageBtns()
|
||||||
|
{
|
||||||
|
if (!active_newInterfaces || !D2isLODGame() ) return;
|
||||||
|
|
||||||
|
LPWSTR lpText;
|
||||||
|
DWORD mx = D2GetMouseX();
|
||||||
|
DWORD my = D2GetMouseY();
|
||||||
|
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
|
||||||
|
if (printBackgroundOnMainPage && D2GetResolution())
|
||||||
|
{
|
||||||
|
setImage(&data, statsBackgroundImages);
|
||||||
|
setFrame(&data, 1);
|
||||||
|
D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
setImage(&data, D2LoadBuySelBtn());
|
||||||
|
if (D2GetResolution())
|
||||||
|
{
|
||||||
|
setFrame(&data, 12 + isDownBtn.previousPage);
|
||||||
|
D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0);
|
||||||
|
}
|
||||||
|
setFrame(&data, 14 + isDownBtn.nextPage);
|
||||||
|
D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
D2SetFont(1);
|
||||||
|
if (D2GetResolution() && isOnPreviousPageBtn(mx,my)) //print popup "previous page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_PREVIOUS_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if ( isOnNextPageBtn(mx,my))
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_NEXT_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* STDCALL statsPageMouseDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if (!active_newInterfaces || !D2isLODGame() ) return ptChar;
|
||||||
|
|
||||||
|
if (D2GetResolution() && isOnPreviousPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button previous page\n");
|
||||||
|
isDownBtn.previousPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
freeMessage(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button next page\n");
|
||||||
|
isDownBtn.nextPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
freeMessage(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ptChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Unit* STDCALL statsPageMouseUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if (!active_newInterfaces || !D2isLODGame() ) return ptChar;
|
||||||
|
|
||||||
|
if (D2GetResolution() && isOnPreviousPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button previous page\n");
|
||||||
|
if (isDownBtn.previousPage)
|
||||||
|
{
|
||||||
|
GoPreviousStatPage();
|
||||||
|
log_msg("previous page press\n");
|
||||||
|
isDownBtn.all=0;
|
||||||
|
freeMessage(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button next page\n");
|
||||||
|
if (isDownBtn.nextPage)
|
||||||
|
{
|
||||||
|
GoNextStatPage();
|
||||||
|
log_msg("next page press\n");
|
||||||
|
isDownBtn.all=0;
|
||||||
|
freeMessage(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isDownBtn.all=0;
|
||||||
|
return ptChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printStatsPageBtns_111 )
|
||||||
|
CALL printStatsPageBtns
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x370
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printStatsPageBtns )
|
||||||
|
CALL printStatsPageBtns
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x3B0
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printStatsPageBtns_9 )
|
||||||
|
CALL printStatsPageBtns
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,0x374
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_statsPageMouseDown_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x20]
|
||||||
|
CALL statsPageMouseDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE fin_statsPageMouseDown
|
||||||
|
RETN
|
||||||
|
fin_statsPageMouseDown:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_statsPageMouseDown )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x18]
|
||||||
|
CALL statsPageMouseDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE fin_statsPageMouseDown
|
||||||
|
RETN
|
||||||
|
fin_statsPageMouseDown:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_statsPageMouseUp )
|
||||||
|
PUSH EBP
|
||||||
|
CALL statsPageMouseUp
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE fin_statsPageMouseUp
|
||||||
|
RETN
|
||||||
|
fin_statsPageMouseUp:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,8
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_statsPageMouseUp_9 )
|
||||||
|
PUSH EBP
|
||||||
|
CALL statsPageMouseUp
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE fin_statsPageMouseUp
|
||||||
|
RETN
|
||||||
|
fin_statsPageMouseUp:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
POP ECX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_InterfaceStats()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlugYImagesFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for stats interface. (InterfaceStats)\n");
|
||||||
|
|
||||||
|
// Print new buttons images
|
||||||
|
mem_seek R7(D2Client, 2A7BE, 2A7AE, 30F86, 83636, 8A0B6, 6C016, BDC16);
|
||||||
|
memt_byte( 0x5F, 0xE9 ); // JMP
|
||||||
|
MEMT_REF4( 0x815B5D5E, version_D2Client >= V111 ? caller_printStatsPageBtns_111: version_D2Client == V110 ? caller_printStatsPageBtns : caller_printStatsPageBtns_9);
|
||||||
|
//6FAD0F86 . 5F POP EDI
|
||||||
|
//6FAD0F87 . 5E POP ESI
|
||||||
|
//6FAD0F88 . 5D POP EBP
|
||||||
|
//6FAD0F89 . 5B POP EBX
|
||||||
|
//6FAD0F8A . 81C4 B0030000 ADD ESP,3B0
|
||||||
|
//6FAD0F90 . C3 RETN
|
||||||
|
//6FB33636 . 5F POP EDI
|
||||||
|
//6FB33637 . 5E POP ESI
|
||||||
|
//6FB33638 . 5D POP EBP
|
||||||
|
//6FB33639 . 5B POP EBX
|
||||||
|
//6FB3363A . 81C4 70030000 ADD ESP,370
|
||||||
|
//6FB33640 . C3 RETN
|
||||||
|
//6FB3A0B6 . 5F POP EDI
|
||||||
|
//6FB3A0B7 . 5E POP ESI
|
||||||
|
//6FB3A0B8 . 5D POP EBP
|
||||||
|
//6FB3A0B9 . 5B POP EBX
|
||||||
|
//6FB3A0BA . 81C4 70030000 ADD ESP,370
|
||||||
|
//6FB3A0C0 . C3 RETN
|
||||||
|
//6FB1C016 . 5F POP EDI
|
||||||
|
//6FB1C017 . 5E POP ESI
|
||||||
|
//6FB1C018 . 5D POP EBP
|
||||||
|
//6FB1C019 . 5B POP EBX
|
||||||
|
//6FB1C01A . 81C4 70030000 ADD ESP,370
|
||||||
|
//6FB1C020 . C3 RETN
|
||||||
|
//6FB6DC16 |. 5F POP EDI
|
||||||
|
//6FB6DC17 |. 5E POP ESI
|
||||||
|
//6FB6DC18 |. 5D POP EBP
|
||||||
|
//6FB6DC19 |. 5B POP EBX
|
||||||
|
//6FB6DC1A |. 81C4 70030000 ADD ESP,370
|
||||||
|
//6FB6DC20 \. C3 RETN
|
||||||
|
|
||||||
|
if ( version_D2Client >= V111 )
|
||||||
|
{
|
||||||
|
// Manage mouse down (Play sound)
|
||||||
|
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, BCDC8);
|
||||||
|
memt_byte( 0xA1, 0xE8 );
|
||||||
|
MEMT_REF4( ptptClientChar, caller_statsPageMouseDown);
|
||||||
|
//6FB327C8 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
|
||||||
|
//6FB39248 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
|
||||||
|
//6FB1B1A8 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
|
||||||
|
//6FB6CDC8 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC]
|
||||||
|
|
||||||
|
// Manage mouse up
|
||||||
|
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, BDE33);
|
||||||
|
memt_byte( 0xA1, 0xE8 );
|
||||||
|
MEMT_REF4( ptptClientChar, caller_statsPageMouseUp);
|
||||||
|
//6FB33853 . A1 F0C4BC6F MOV EAX,DWORD PTR DS:[6FBCC4F0]
|
||||||
|
//6FB3A2D3 . A1 E0C1BC6F MOV EAX,DWORD PTR DS:[6FBCC1E0]
|
||||||
|
//6FB1C233 . A1 D0C3BC6F MOV EAX,DWORD PTR DS:[6FBCC3D0]
|
||||||
|
//6FB6DE33 . A1 FCBBBC6F MOV EAX,DWORD PTR DS:[6FBCBBFC]
|
||||||
|
} else {
|
||||||
|
// Manage mouse down (Play sound)
|
||||||
|
mem_seek R7(D2Client, 2AA6D, 2AA5D, 3133D, 827C8, 89248, 6B1A8, 0000);
|
||||||
|
MEMC_REF4( D2GetClientPlayer, caller_statsPageMouseDown);
|
||||||
|
//6FAD133C . E8 8F700500 CALL D2Client.6FB283D0
|
||||||
|
|
||||||
|
// Manage mouse up
|
||||||
|
mem_seek R7(D2Client, 2AC43, 2AC33, 3151A, 83853, 8A2D3, 6C233, 0000);
|
||||||
|
MEMC_REF4( D2GetClientPlayer, version_D2Client == V110 ? caller_statsPageMouseUp : caller_statsPageMouseUp_9);//0x00056EB2
|
||||||
|
//6FAD1519 . E8 B26E0500 CALL D2Client.6FB283D0
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
57
PlugY/Language.cpp
Normal file
57
PlugY/Language.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Language management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "language.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
bool active_ChangeLanguage = true;
|
||||||
|
DWORD selectedLanguage = LNG_ENG;
|
||||||
|
|
||||||
|
bool active_LanguageManagement = false;
|
||||||
|
DWORD defaultLanguage = LNG_ENG;
|
||||||
|
t_availableLanguages availableLanguages;
|
||||||
|
|
||||||
|
DWORD* ptCurrentLanguage;
|
||||||
|
|
||||||
|
DWORD STDCALL languageManagement ()
|
||||||
|
{
|
||||||
|
if (active_ChangeLanguage) *ptCurrentLanguage = selectedLanguage;
|
||||||
|
if (active_LanguageManagement)
|
||||||
|
if ((*ptCurrentLanguage > LNG_RUS) || !((1 << *ptCurrentLanguage) & availableLanguages.all))
|
||||||
|
*ptCurrentLanguage = defaultLanguage;
|
||||||
|
return *ptCurrentLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_LanguageManagement()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Lang for language management. (LanguageManagement)\n");
|
||||||
|
|
||||||
|
ptCurrentLanguage = *(DWORD**)((DWORD)D2GetLang + (version_D2Lang >= V111 ? 0x51: 0x5C));
|
||||||
|
|
||||||
|
// Language management
|
||||||
|
mem_seek( (DWORD)D2GetLang + (version_D2Lang >= V111 ? 0x3E : 0x49));//6FC13E39-6FC10000
|
||||||
|
memt_byte( 0xA1 , 0xE8);
|
||||||
|
MEMT_REF4( ptCurrentLanguage, 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]
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
566
PlugY/LoadPlayerData.cpp
Normal file
566
PlugY/LoadPlayerData.cpp
Normal file
@ -0,0 +1,566 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Load Player Custom Data.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "extendedSaveFile.h"
|
||||||
|
#include "sharedSaveFile.h"
|
||||||
|
|
||||||
|
|
||||||
|
/************************************ LOADING ***********************************/
|
||||||
|
|
||||||
|
DWORD STDCALL LoadSPCustomData(Unit* ptChar)
|
||||||
|
{
|
||||||
|
DWORD size = 0;
|
||||||
|
BYTE* data;
|
||||||
|
|
||||||
|
log_msg("--- Start LoadSPCustomData ---\n");
|
||||||
|
|
||||||
|
if (!ptChar)
|
||||||
|
{log_msg("LoadSPCustomData : ptChar == NULL\n");return 0x1B;}//Unknow failure
|
||||||
|
if (ptChar->nUnitType != UNIT_PLAYER)
|
||||||
|
{log_msg("LoadSPCustomData : ptChar->nUnitType != UNIT_PLAYER\n");return 0x1B;}//Unknow failure
|
||||||
|
if (!PCPlayerData)
|
||||||
|
{log_msg("LoadSPCustomData : PCPlayerData == NULL\n");return 0x1B;}//Unknow failure
|
||||||
|
if (!PCGame)
|
||||||
|
{log_msg("LoadSPCustomData : PCGame == NULL\n");return 0x1B;}//Unknow failure
|
||||||
|
|
||||||
|
DWORD ret=0;
|
||||||
|
if (PCGame->isLODGame)
|
||||||
|
{
|
||||||
|
log_msg("is LOD Game\n");
|
||||||
|
data = readExtendedSaveFile(PCPlayerData->name, &size);
|
||||||
|
ret = loadExtendedSaveFile(ptChar, data, size);
|
||||||
|
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
data = readSharedSaveFile(PCPlayerData->name, &size);
|
||||||
|
ret = loadSharedSaveFile(ptChar, data, size);
|
||||||
|
D2FogMemDeAlloc(data,__FILE__,__LINE__,0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_msg("is not LOD Game\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("End LoadSPCustomData.\n\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM (caller_LoadSPPlayerCustomData )
|
||||||
|
MOV ESI,EAX
|
||||||
|
TEST ESI,ESI
|
||||||
|
JNZ JMP_LoadSPPlayerCustomData
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
CALL LoadSPCustomData
|
||||||
|
MOV ESI,EAX
|
||||||
|
TEST ESI,ESI
|
||||||
|
JNZ JMP_LoadSPPlayerCustomData
|
||||||
|
RETN
|
||||||
|
JMP_LoadSPPlayerCustomData:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x17
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
return value :
|
||||||
|
0:ok
|
||||||
|
1:Unable to enter game. Bad character version
|
||||||
|
2:Unable to enter game. Bad character quest data
|
||||||
|
3:Unable to enter game. Bad character waypoint data
|
||||||
|
4:Unable to enter game. Bad character stats data
|
||||||
|
5:Unable to enter game. Bad character skills data
|
||||||
|
6:Unable to enter game
|
||||||
|
7:Unable to enter game. Bad inventory data
|
||||||
|
8:Unable to enter game. Bad dead bodies
|
||||||
|
9:Unable to enter game. Bad header
|
||||||
|
0A:Unable to enter game. bad hireables
|
||||||
|
0B:Unable to enter game, bad intro data
|
||||||
|
0C:Unable to enter game. bad item
|
||||||
|
0D:Unable to enter game, bad dead body item
|
||||||
|
0E:Unable to enter game, generic bad file
|
||||||
|
0F:Game is full
|
||||||
|
10:Version do not match....
|
||||||
|
11:Unable to enter game,Your character must kill Baal to play nightmare game
|
||||||
|
12:Unable to enter game,Your character must kill Baal in nightmare difficulty to play hell game
|
||||||
|
13:Unable to enter game, a normal character cannot join a game create an harcore character.
|
||||||
|
14:Unable to enter game, an harcore character cannot join a game create by a normal character.
|
||||||
|
15:A dead character cannot join or create any game
|
||||||
|
16:unknow failure
|
||||||
|
17:Unable to enter game. A D2 Character cannot join an expansion character
|
||||||
|
18:Expansion cannot join D2
|
||||||
|
19:Failures to join game
|
||||||
|
1A:Unable to enter game
|
||||||
|
1B:unknow failure
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
TS_SAVE_PERSONAL=0,
|
||||||
|
TS_SAVE_SHARED,
|
||||||
|
TS_PUTGOLD,
|
||||||
|
TS_TAKEGOLD
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
typedef struct {
|
||||||
|
BYTE packID;
|
||||||
|
BYTE packSize;
|
||||||
|
DWORD finalSize:31;
|
||||||
|
DWORD isCustom:1;
|
||||||
|
BYTE type;
|
||||||
|
BYTE data[0xFF];
|
||||||
|
} t_rcvMsg;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
struct s_MPSaveFile
|
||||||
|
{
|
||||||
|
DWORD clientID;
|
||||||
|
int sizeExtended;
|
||||||
|
int curExtended;
|
||||||
|
BYTE* dataExtended;
|
||||||
|
int sizeShared;
|
||||||
|
int curShared;
|
||||||
|
BYTE* dataShared;
|
||||||
|
s_MPSaveFile* prev;
|
||||||
|
s_MPSaveFile* next;
|
||||||
|
bool completed;
|
||||||
|
};
|
||||||
|
|
||||||
|
static BYTE customPackID = 0x6C;
|
||||||
|
static s_MPSaveFile * receivedSaveFiles = NULL;
|
||||||
|
|
||||||
|
void freeCurrentCF(DWORD memoryPool, s_MPSaveFile** curSF)
|
||||||
|
{
|
||||||
|
if (*curSF == NULL) return;
|
||||||
|
D2FreeMem(memoryPool, (*curSF)->dataExtended,__FILE__,__LINE__,0);
|
||||||
|
D2FreeMem(memoryPool, (*curSF)->dataShared,__FILE__,__LINE__,0);
|
||||||
|
if ((*curSF)->next)
|
||||||
|
(*curSF)->next->prev = (*curSF)->prev;
|
||||||
|
if ((*curSF)->prev)
|
||||||
|
(*curSF)->prev->next = (*curSF)->next;
|
||||||
|
else
|
||||||
|
receivedSaveFiles = (*curSF)->next;
|
||||||
|
D2FreeMem(memoryPool, *curSF,__FILE__,__LINE__,0);
|
||||||
|
*curSF = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sendData(BYTE* data, DWORD size, bool isShared)
|
||||||
|
{
|
||||||
|
t_rcvMsg pack;
|
||||||
|
// d2_assert(size >= 0x40000000, "size of file > 0x40000000", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
pack.packID = customPackID;
|
||||||
|
pack.finalSize = size;
|
||||||
|
pack.isCustom = true;
|
||||||
|
pack.type = isShared ? TS_SAVE_SHARED : TS_SAVE_PERSONAL;
|
||||||
|
|
||||||
|
DWORD sended = 0;
|
||||||
|
while (sended < size)
|
||||||
|
{
|
||||||
|
pack.packSize = (BYTE) (size - sended > 0xFE ? 0xFF : size - sended + 1);
|
||||||
|
CopyMemory(pack.data, &data[sended], pack.packSize);
|
||||||
|
log_msg("Loading Send Packet: \ttype=%X\t finalSize=%X\t packSize=%02X\t data=%08X\n", pack.type, pack.finalSize, pack.packSize, pack.data);
|
||||||
|
D2SendToServer(pack.packSize+7, 0, &pack);
|
||||||
|
sended += pack.packSize -1;
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
|
||||||
|
// Send Extended Save File
|
||||||
|
log_msg("Send Extended Save File\n");
|
||||||
|
dataExtended = readExtendedSaveFile(name, &sizeExtended);
|
||||||
|
sendData(dataExtended, sizeExtended, false);
|
||||||
|
D2FogMemDeAlloc(dataExtended,__FILE__,__LINE__,0);
|
||||||
|
|
||||||
|
// Send Shared Save File
|
||||||
|
log_msg("Send Shared Save File\n");
|
||||||
|
dataShared = readSharedSaveFile(name, &sizeShared);
|
||||||
|
sendData(dataShared, sizeShared, true);
|
||||||
|
D2FogMemDeAlloc(dataShared,__FILE__,__LINE__,0);
|
||||||
|
|
||||||
|
// Ending load
|
||||||
|
log_msg("End SendSaveFiles.\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
bool isShared;
|
||||||
|
|
||||||
|
switch (msg->type)
|
||||||
|
{
|
||||||
|
case TS_SAVE_PERSONAL : isShared = false;break;
|
||||||
|
case TS_SAVE_SHARED : isShared = true;break;
|
||||||
|
// case TS_PUTGOLD : putGold(ptChar, (DWORD)msg->data); return 0;
|
||||||
|
// case TS_TAKEGOLD : takeGold(ptChar, (DWORD)msg->data); return 0;
|
||||||
|
default: return 0;//return msg->packID;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetClient* ptClient = ptClientTable[clientID & 0xFF];
|
||||||
|
|
||||||
|
s_MPSaveFile* curSF = receivedSaveFiles;
|
||||||
|
while (curSF && (clientID != curSF->clientID) )
|
||||||
|
curSF = curSF->next;
|
||||||
|
|
||||||
|
if (curSF && curSF->completed)
|
||||||
|
freeCurrentCF(0 * PClientGame->memoryPool, &curSF);
|
||||||
|
|
||||||
|
|
||||||
|
if (!curSF)
|
||||||
|
{
|
||||||
|
curSF = (s_MPSaveFile *)D2AllocMem(0 * PClientGame->memoryPool, sizeof(s_MPSaveFile),__FILE__,__LINE__,0);
|
||||||
|
ZeroMemory(curSF, sizeof(s_MPSaveFile));
|
||||||
|
curSF->clientID = clientID;
|
||||||
|
curSF->next = receivedSaveFiles;
|
||||||
|
if (receivedSaveFiles) receivedSaveFiles->prev = curSF;
|
||||||
|
receivedSaveFiles = curSF;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("curSF = %08X\tcurSF->completed = %d\n", curSF, curSF->completed);
|
||||||
|
|
||||||
|
|
||||||
|
DWORD size = msg->packSize - 1;
|
||||||
|
if (isShared)
|
||||||
|
{
|
||||||
|
if (curSF->sizeShared == 0)
|
||||||
|
curSF->sizeShared = msg->finalSize;
|
||||||
|
d2_assert(curSF->sizeShared != msg->finalSize, "Size of shared file has change", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
if (!curSF->dataShared)
|
||||||
|
curSF->dataShared = (BYTE *)D2AllocMem(0 * PClientGame->memoryPool, curSF->sizeShared,__FILE__,__LINE__,0);// d2_assert(!curSF->dataShared, "Can't malloc data", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
CopyMemory(&curSF->dataShared[curSF->curShared], msg->data, size);
|
||||||
|
curSF->curShared += size;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (curSF->sizeExtended == 0)
|
||||||
|
curSF->sizeExtended = msg->finalSize;
|
||||||
|
d2_assert(curSF->sizeExtended != msg->finalSize, "Size of extented file has change", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
if (!curSF->dataExtended)
|
||||||
|
curSF->dataExtended = (BYTE *)D2AllocMem( 0 * PClientGame->memoryPool, curSF->sizeExtended,__FILE__,__LINE__,0);// d2_assert(!curSF->dataExtended, "Can't malloc data", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
CopyMemory(&curSF->dataExtended[curSF->curExtended], msg->data, size);
|
||||||
|
curSF->curExtended += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( curSF->sizeExtended && (curSF->sizeExtended == curSF->curExtended) && curSF->sizeShared && (curSF->sizeShared == curSF->curShared) )
|
||||||
|
{
|
||||||
|
curSF->completed = true;
|
||||||
|
log_msg("ReceiveSaveFiles completed.\n");
|
||||||
|
}
|
||||||
|
log_msg("End Load Receive Packet\n");
|
||||||
|
|
||||||
|
return msg->packID+10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
typedef int (STDCALL * t_fct_recv)(SOCKET s, char *buf, int len, int flags);
|
||||||
|
t_fct_recv fct_recv;
|
||||||
|
int STDCALL ReceiveSaveFiles_9(DWORD clientID, SOCKET s, char *buf, int len, int flags)
|
||||||
|
{
|
||||||
|
t_rcvMsg* msg = (t_rcvMsg*) buf;
|
||||||
|
int nb = fct_recv(s,buf,len,flags);
|
||||||
|
if ((nb<6) || (msg->packID != customPackID) || !msg->isCustom || (msg->packSize+7 != nb))
|
||||||
|
return nb;
|
||||||
|
ReceiveSaveFiles(clientID,msg);
|
||||||
|
msg->packSize = 1;
|
||||||
|
return 7;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
DWORD STDCALL LoadMPCustomData(Unit* ptChar)
|
||||||
|
{
|
||||||
|
log_msg("Start LoadMPCustomData\n");
|
||||||
|
|
||||||
|
if (!ptChar) return NULL;
|
||||||
|
if (!ptChar)
|
||||||
|
{log_msg("LoadMPCustomData : ptChar == NULL\n");return 0x1B;}//Unknow failure
|
||||||
|
if (ptChar->nUnitType != UNIT_PLAYER)
|
||||||
|
{log_msg("LoadMPCustomData : ptChar->nUnitType != UNIT_PLAYER\n");return 0x1B;}//Unknow failure
|
||||||
|
if (!PCPlayerData)
|
||||||
|
{log_msg("LoadMPCustomData : PCPlayerData == NULL\n");return 0x1B;}//Unknow failure
|
||||||
|
|
||||||
|
NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
|
||||||
|
|
||||||
|
s_MPSaveFile* curSF = receivedSaveFiles;
|
||||||
|
while (curSF && (ptClient->clientID != curSF->clientID) )
|
||||||
|
curSF = curSF->next;
|
||||||
|
|
||||||
|
DWORD ret=0;
|
||||||
|
|
||||||
|
if (!curSF)
|
||||||
|
{
|
||||||
|
log_msg("Server has received no data from extra save files of character %s\n", PCPlayerData->name);
|
||||||
|
ret = 0xE;//Unable to enter game, generic bad file
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret && !curSF->completed)
|
||||||
|
{
|
||||||
|
log_msg("Server hasn't receive all data from extra save files of character %s\n",PCPlayerData->name);
|
||||||
|
ret = 0xE;//Unable to enter game, generic bad file
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret && !PCGame)
|
||||||
|
{
|
||||||
|
log_msg("LoadMPCustomData : PCGame == NULL\n");
|
||||||
|
ret = 0x1B;//Unknow failure
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PCGame->isLODGame)
|
||||||
|
{
|
||||||
|
log_msg("is LOD Game\n");
|
||||||
|
if (!ret)
|
||||||
|
ret = loadExtendedSaveFile(ptChar, curSF->dataExtended, curSF->sizeExtended);
|
||||||
|
if (!ret)
|
||||||
|
ret = loadSharedSaveFile(ptChar, curSF->dataShared, curSF->sizeShared);
|
||||||
|
} else {
|
||||||
|
log_msg("is not LOD Game\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
freeCurrentCF(PCGame->memoryPool, &curSF);
|
||||||
|
|
||||||
|
log_msg("--- End LoadMPCustomData. ---\n\n");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_LoadMPPlayerCustomData_111 )
|
||||||
|
PUSH DWORD PTR SS:[EBX]
|
||||||
|
CALL LoadMPCustomData
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ JMP_LoadMPlayerCustomData
|
||||||
|
CMP DWORD PTR DS:[EBX],0
|
||||||
|
JNZ Continue_LoadMP
|
||||||
|
ADD DWORD PTR SS:[ESP],0x21
|
||||||
|
Continue_LoadMP:
|
||||||
|
RETN
|
||||||
|
JMP_LoadMPlayerCustomData:
|
||||||
|
SUB DWORD PTR SS:[ESP],0x12
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_LoadMPPlayerCustomData )
|
||||||
|
PUSH DWORD PTR SS:[EDI]
|
||||||
|
CALL LoadMPCustomData
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ JMP_LoadMPlayerCustomData
|
||||||
|
CMP DWORD PTR DS:[EDI],0
|
||||||
|
JNZ Continue_LoadMP
|
||||||
|
ADD DWORD PTR SS:[ESP],0x46
|
||||||
|
Continue_LoadMP:
|
||||||
|
RETN
|
||||||
|
JMP_LoadMPlayerCustomData:
|
||||||
|
SUB DWORD PTR SS:[ESP],0xD
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_LoadMPPlayerCustomData_9 )
|
||||||
|
PUSH DWORD PTR SS:[EDI]
|
||||||
|
CALL LoadMPCustomData
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ JMP_LoadMPlayerCustomData
|
||||||
|
CMP DWORD PTR DS:[EDI],0
|
||||||
|
JNZ Continue_LoadMP
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1D
|
||||||
|
Continue_LoadMP:
|
||||||
|
RETN
|
||||||
|
JMP_LoadMPlayerCustomData:
|
||||||
|
SUB DWORD PTR SS:[ESP],0x13
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SendSaveFiles_111 )
|
||||||
|
POP EAX
|
||||||
|
PUSH DWORD PTR CS:[EAX+0x01] //"name"
|
||||||
|
PUSH EAX
|
||||||
|
JMP SendSaveFiles
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SendSaveFiles )
|
||||||
|
POP EAX
|
||||||
|
PUSH DWORD PTR CS:[EAX+0x0F] //"name"
|
||||||
|
PUSH EAX
|
||||||
|
JMP SendSaveFiles
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_ReceiveSaveFiles_111 )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
LEA EBX,DWORD PTR DS:[EBP+4]
|
||||||
|
PUSH EBX //Message
|
||||||
|
MOV EBX,DWORD PTR SS:[EBP]
|
||||||
|
PUSH EBX //ID client
|
||||||
|
CALL ReceiveSaveFiles
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_ReceiveSaveFiles )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
LEA EDI,DWORD PTR DS:[ESI+4]
|
||||||
|
PUSH EDI //Message
|
||||||
|
MOV EDI,DWORD PTR DS:[ESI]
|
||||||
|
PUSH EDI //ID client
|
||||||
|
CALL ReceiveSaveFiles
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_BugFix109b )
|
||||||
|
MOV EAX,DWORD PTR DS:[EDI+0xBD0]
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE go_to_default
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
MOV DWORD PTR SS:[ESP+0x24],EAX
|
||||||
|
RETN
|
||||||
|
go_to_default:
|
||||||
|
SUB DWORD PTR SS:[ESP],0x4B
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_BugFix109d )
|
||||||
|
MOV EAX,DWORD PTR DS:[ESI+0xAB0]
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE go_to_default
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
MOV DWORD PTR SS:[ESP+0x24],EAX
|
||||||
|
RETN
|
||||||
|
go_to_default:
|
||||||
|
SUB DWORD PTR SS:[ESP],0x4B
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_LoadPlayerData()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled || !active_PlayerCustomData) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game & D2Client for load Player's custom data. (LoadPlayerData)\n");
|
||||||
|
|
||||||
|
// Load SP player custom data.
|
||||||
|
mem_seek R7(D2Game, 5046F, 5086F, 5CB0F, BB8ED, 278CD, 465BD, 5638D);
|
||||||
|
memt_byte( 0x8B, 0xE8); // CALL caller_LoadSPPlayerCustomData
|
||||||
|
MEMT_REF4( 0x75F685F0 , caller_LoadSPPlayerCustomData);
|
||||||
|
memt_byte( 0x16, 0x90); // NOP
|
||||||
|
//6FC8CB0F 8BF0 MOV ESI,EAX
|
||||||
|
//6FC8CB11 85F6 TEST ESI,ESI
|
||||||
|
//6FC8CB13 75 16 JNZ SHORT D2Game.6FC8CB2B
|
||||||
|
//0203B8ED |> 8BF0 MOV ESI,EAX
|
||||||
|
//0203B8EF |. 85F6 TEST ESI,ESI
|
||||||
|
//0203B8F1 |. 75 16 JNZ SHORT D2Game.0203B909
|
||||||
|
//01F978CD |> 8BF0 MOV ESI,EAX
|
||||||
|
//01F978CF |. 85F6 TEST ESI,ESI
|
||||||
|
//01F978D1 |. 75 16 JNZ SHORT D2Game.01F978E9
|
||||||
|
//6FC665BD |> 8BF0 MOV ESI,EAX
|
||||||
|
//6FC665BF |. 85F6 TEST ESI,ESI
|
||||||
|
//6FC665C1 |. 75 16 JNZ SHORT D2Game.6FC665D9
|
||||||
|
//6FC7638D |> 8BF0 MOV ESI,EAX
|
||||||
|
//6FC7638F |. 85F6 TEST ESI,ESI
|
||||||
|
//6FC76391 |. 75 16 JNZ SHORT D2Game.6FC763A9
|
||||||
|
|
||||||
|
// Load MP player custom data.
|
||||||
|
mem_seek R7(D2Game, 50790, 50B90, 5CC66, BB777, 27757, 46447, 56217);
|
||||||
|
memt_byte( 0x83, 0xE8);
|
||||||
|
MEMT_REF4( version_D2Game >= V111 ? 0x2174003B : version_D2Game == V110 ? 0x4674003F : 0x1D74003F, version_D2Game >= V111 ? caller_LoadMPPlayerCustomData_111 : version_D2Game == V110 ? caller_LoadMPPlayerCustomData: caller_LoadMPPlayerCustomData_9);
|
||||||
|
//6FC8CC66 . 833F 00 CMP DWORD PTR DS:[EDI],0
|
||||||
|
//6FC8CC69 . 74 46 JE SHORT D2Game.6FC8CCB1
|
||||||
|
//0203B777 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||||
|
//0203B77A |. 74 21 JE SHORT D2Game.0203B79D
|
||||||
|
//01F97757 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||||
|
//01F9775A |. 74 21 JE SHORT D2Game.01F9777D
|
||||||
|
//6FC66447 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||||
|
//6FC6644A |. 74 21 JE SHORT D2Game.6FC6646D
|
||||||
|
//6FC76217 |> 833B 00 CMP DWORD PTR DS:[EBX],0
|
||||||
|
//6FC7621A |. 74 21 JE SHORT D2Game.6FC7623D
|
||||||
|
|
||||||
|
// Send save files to Server.
|
||||||
|
mem_seek R7(D2Client, CF42, CF32, D5A2, 733FC, 5DFDC, 7933C, 1457C);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// Receive save files from client.
|
||||||
|
mem_seek R7(D2Game, 183A, 183A, 191A, 376E9, 703D9, 624D9, CAF39);
|
||||||
|
memt_byte( 0x8B ,0xE8);
|
||||||
|
if ( version_D2Game >= V111 ) {
|
||||||
|
MEMT_REF4( 0xB60F005D, caller_ReceiveSaveFiles_111);
|
||||||
|
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]
|
||||||
|
//01FE03D9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
|
||||||
|
//01FE03DC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||||
|
//6FC824D9 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
|
||||||
|
//6FC824DC |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||||
|
//6FCEAF39 |. 8B5D 00 MOV EBX,DWORD PTR SS:[EBP]
|
||||||
|
//6FCEAF3C |. 0FB645 04 MOVZX EAX,BYTE PTR SS:[EBP+4]
|
||||||
|
} else {
|
||||||
|
MEMT_REF4( 0x04468A3E, caller_ReceiveSaveFiles);
|
||||||
|
//6FC3191A |. 8B3E MOV EDI,DWORD PTR DS:[ESI]
|
||||||
|
//6FC3191C |. 8A46 04 MOV AL,BYTE PTR DS:[ESI+4]
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( version_Fog <= V109d )
|
||||||
|
{
|
||||||
|
mem_seek R7(Fog, 47DE, 45AE, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x8B ,0xE8);
|
||||||
|
MEMT_REF4( 0x891C2444, version_Fog == V109b? caller_BugFix109b : caller_BugFix109d);
|
||||||
|
memt_byte( 0x44 ,0x90);
|
||||||
|
memt_byte( 0x24 ,0x90);
|
||||||
|
memt_byte( 0x20 ,0x90);
|
||||||
|
//6FF545AE |> 8B4424 1C |MOV EAX,DWORD PTR SS:[ESP+1C] ; Case 2 of switch 6FF5454C
|
||||||
|
//6FF545B2 |. 894424 20 |MOV DWORD PTR SS:[ESP+20],EAX
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( version_D2Game == V109b || version_D2Game == V109d )
|
||||||
|
customPackID -= 3;
|
||||||
|
else if ( version_D2Game == V110 )
|
||||||
|
customPackID --;
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
123
PlugY/MainScreen.cpp
Normal file
123
PlugY/MainScreen.cpp
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add "plugY v1.00" on screen.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
char* versionText = "";
|
||||||
|
bool active_VersionTextChange = 0;
|
||||||
|
BYTE modVersionColor = 0;
|
||||||
|
bool active_PrintPlugYVersion = 1;
|
||||||
|
BYTE colorOfPlugYVersion = 4;
|
||||||
|
|
||||||
|
DWORD newTextBoxData[]={4,0x237,0x243,0xC8,0x14,0,0,0,0,0,0,2};//type,x,y,l,h,?,?,?,?,?,?,?(0,257,C8,28)
|
||||||
|
|
||||||
|
void STDCALL printPlugYVersion(void** childrens, DWORD* sgnNumChildren)
|
||||||
|
{
|
||||||
|
char buf[20];
|
||||||
|
void* textbox = D2CreateTextBox(newTextBoxData);
|
||||||
|
childrens[*sgnNumChildren]=textbox;
|
||||||
|
d2_assert((*sgnNumChildren)++ >= 40,"sgnNumChildren < MAX_CHILDREN", __FILE__, __LINE__);
|
||||||
|
sprintf(buf, "PlugY %s", PLUGY_VERSION);
|
||||||
|
D2PrintLineOnTextBox(textbox, buf, colorOfPlugYVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printPlugYVersion )
|
||||||
|
POP ESI
|
||||||
|
PUSH DWORD PTR [ESI+2]
|
||||||
|
PUSH DWORD PTR [ESI+9]
|
||||||
|
CALL printPlugYVersion
|
||||||
|
CALL D2CreateTextBox
|
||||||
|
JMP ESI
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_PrintPlugYVersion()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Launch to print PlugY version. (PrintPlugYVersion)\n");
|
||||||
|
|
||||||
|
// Print PlugY version.
|
||||||
|
mem_seek R7(D2Launch, 7F5D, 7F7D, 9639, 117C7, 178A7, 16AF7, 18061);
|
||||||
|
MEMJ_REF4( D2CreateTextBox, caller_printPlugYVersion);
|
||||||
|
//6FA19638 |. E8 1BED0000 CALL <JMP.&D2Win.#10017>
|
||||||
|
//6FA517C6 |. E8 6F81FFFF CALL <JMP.&D2Win.#10147>
|
||||||
|
//6FA578A6 |. E8 D71FFFFF CALL <JMP.&D2Win.#10113>
|
||||||
|
//6FA56B1F |. E8 1A2EFFFF CALL <JMP.&D2Win.#10098>
|
||||||
|
//6FA56AF6 |. E8 432EFFFF CALL <JMP.&D2Win.#10098>
|
||||||
|
//6FA58060 |. E8 ED18FFFF CALL <JMP.&D2Win.#10098>
|
||||||
|
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************************/
|
||||||
|
|
||||||
|
void FASTCALL versionChange(void* screen, char* text, DWORD color)
|
||||||
|
{
|
||||||
|
D2PrintLineOnTextBox(screen,versionText,modVersionColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_VersionChange_10 )
|
||||||
|
MOV CL, BYTE PTR DS:[modVersionColor]
|
||||||
|
MOV BYTE PTR SS:[ESP+4], CL
|
||||||
|
MOV EDX,versionText
|
||||||
|
MOV ECX,EDI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_VersionChange()// BUG WITH 2MOD if D2Mod started before PlugY ????
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Launch to print Mod version. (VersionChange)\n");
|
||||||
|
|
||||||
|
//6FA18012 |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
|
||||||
|
//6FA18016 |. 8BCE MOV ECX,ESI
|
||||||
|
//6FA18018 |. 6A 00 PUSH 0
|
||||||
|
|
||||||
|
|
||||||
|
// Print LoD/Mod version.
|
||||||
|
if (version_D2Launch >= V110)
|
||||||
|
{
|
||||||
|
mem_seek R7(D2Launch, 00000, 00000, 9723, 1189B, 1797B, 16BCB, 18134);//6FA19721-6FA10000
|
||||||
|
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x8B102454 , caller_VersionChange_10);
|
||||||
|
memt_byte( 0xCF, 0x90 ); // NOP
|
||||||
|
//6FA19723 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FA19727 |. 8BCF MOV ECX,EDI
|
||||||
|
//6FA5189B |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FA5189F |. 8BCF MOV ECX,EDI
|
||||||
|
//6FA5797B |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FA5797F |. 8BCF MOV ECX,EDI
|
||||||
|
//6FA56BCB |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FA56BCF |. 8BCF MOV ECX,EDI
|
||||||
|
//6FA58134 |. 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FA58138 |. 8BCF MOV ECX,EDI
|
||||||
|
} else {
|
||||||
|
mem_seek R7(D2Launch, 801B, 803B, 972A, 118A2, 17982, 16BD2, 1813B);
|
||||||
|
MEMJ_REF4( D2PrintLineOnTextBox, versionChange);
|
||||||
|
//6FA19729 |. E8 88EB0000 CALL <JMP.&D2Win.#10046>
|
||||||
|
//6FA518A1 |. E8 267FFFFF CALL <JMP.&D2Win.#10061>
|
||||||
|
//6FA57981 |. E8 781EFFFF CALL <JMP.&D2Win.#10075>
|
||||||
|
//6FA56BD1 |. E8 EA2CFFFF CALL <JMP.&D2Win.#10015>
|
||||||
|
//6FA5813A |. E8 8F17FFFF CALL <JMP.&D2Win.#10022>
|
||||||
|
}
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
234
PlugY/ModifMemory.cpp
Normal file
234
PlugY/ModifMemory.cpp
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Modification of code in memory functions.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "modifMemory.h"
|
||||||
|
#include "d2functions.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";
|
||||||
|
|
||||||
|
|
||||||
|
void* currentMemoryPos = 0;
|
||||||
|
|
||||||
|
DWORD mem_seek(DWORD newPos)
|
||||||
|
{
|
||||||
|
currentMemoryPos = (void*)newPos;
|
||||||
|
return (DWORD)currentMemoryPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void patchMemory1(BYTE value)
|
||||||
|
{
|
||||||
|
if (IsBadWritePtr(currentMemoryPos,1))
|
||||||
|
{
|
||||||
|
log_box(MSG_CRITICAL_WRITE_MEMORY, currentMemoryPos);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*(BYTE*)currentMemoryPos = value;
|
||||||
|
currentMemoryPos = (LPVOID)((DWORD)currentMemoryPos + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void patchMemory4(DWORD value)
|
||||||
|
{
|
||||||
|
if (IsBadWritePtr(currentMemoryPos,4))
|
||||||
|
{
|
||||||
|
log_box(MSG_CRITICAL_WRITE_MEMORY, currentMemoryPos);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*(DWORD*)currentMemoryPos = value;
|
||||||
|
currentMemoryPos = (LPVOID)((DWORD)currentMemoryPos + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
BYTE getMemory1(LPVOID mempos)
|
||||||
|
{
|
||||||
|
if (IsBadReadPtr(mempos,1))
|
||||||
|
{
|
||||||
|
log_box(MSG_ERROR_READ_MEMORY, currentMemoryPos);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return *(BYTE*)mempos;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD getMemory4(LPVOID mempos)
|
||||||
|
{
|
||||||
|
if (IsBadReadPtr(mempos,4))
|
||||||
|
{
|
||||||
|
log_box(MSG_ERROR_READ_MEMORY, currentMemoryPos);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return *(DWORD*)mempos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void memt_byte(BYTE old, BYTE val)
|
||||||
|
{
|
||||||
|
BYTE current = getMemory1(currentMemoryPos);
|
||||||
|
if ( current == val)
|
||||||
|
{
|
||||||
|
log_msg("Warning : BYTE %02X is already set at memory %08X\n", val, currentMemoryPos);
|
||||||
|
currentMemoryPos = (LPVOID)((DWORD)currentMemoryPos + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( old != current)
|
||||||
|
{
|
||||||
|
if (active_CheckMemory)
|
||||||
|
{
|
||||||
|
log_box(ERROR_TESTING1, old, current, currentMemoryPos);
|
||||||
|
exit(1);
|
||||||
|
} else log_msg(ERROR_TESTING1, old, current, currentMemoryPos);
|
||||||
|
}
|
||||||
|
log_msg("BYTE\t%08X : %02X->%02X\n", currentMemoryPos, old, val);
|
||||||
|
patchMemory1(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool testIfAlreadySet(DWORD current, DWORD wanted)
|
||||||
|
{
|
||||||
|
if (current == wanted)
|
||||||
|
{
|
||||||
|
log_msg("Warning : DWORD %08X is already set at memory %08X\n", wanted, currentMemoryPos);
|
||||||
|
currentMemoryPos = (LPVOID)((DWORD)currentMemoryPos + 4);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
DWORD current = getMemory4(currentMemoryPos);
|
||||||
|
DWORD wanted = val;
|
||||||
|
if (testIfAlreadySet(current, wanted)) return;
|
||||||
|
testMemory4(old, current);
|
||||||
|
log_msg("DWORD\t%08X : %08X->%08X\n", currentMemoryPos, old, wanted);
|
||||||
|
patchMemory4(wanted);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void memt_ref4(DWORD old, DWORD ref)
|
||||||
|
{
|
||||||
|
DWORD current = getMemory4(currentMemoryPos);
|
||||||
|
DWORD wanted = ref-(DWORD)currentMemoryPos-4;
|
||||||
|
if (testIfAlreadySet(current, wanted)) return;
|
||||||
|
testMemory4(old, current);
|
||||||
|
log_msg("DWORD\t%08X : %08X->%08X\n", currentMemoryPos, old, wanted);
|
||||||
|
patchMemory4(wanted);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memc_ref4(DWORD old, DWORD ref)
|
||||||
|
{
|
||||||
|
DWORD current = getMemory4(currentMemoryPos);
|
||||||
|
DWORD wanted = ref-(DWORD)currentMemoryPos-4;
|
||||||
|
if (testIfAlreadySet(current, wanted)) return;
|
||||||
|
testMemory4(old, current + (DWORD)currentMemoryPos + 4);
|
||||||
|
log_msg("DWORD\t%08X : %08X->%08X\n", currentMemoryPos, old, wanted);
|
||||||
|
patchMemory4(wanted);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memj_ref4(DWORD old, DWORD ref)
|
||||||
|
{
|
||||||
|
DWORD current = getMemory4(currentMemoryPos);
|
||||||
|
DWORD wanted = ref-(DWORD)currentMemoryPos-4;
|
||||||
|
if (testIfAlreadySet(current, wanted)) return;
|
||||||
|
testMemory4(old, getMemory4((LPVOID)getMemory4((LPVOID)(current + (DWORD)currentMemoryPos + 6))));
|
||||||
|
log_msg("DWORD\t%08X : %08X->%08X\n", currentMemoryPos, old, wanted);
|
||||||
|
patchMemory4(wanted);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void memd_ref4(DWORD old, DWORD ref)
|
||||||
|
{
|
||||||
|
DWORD current = getMemory4(currentMemoryPos);
|
||||||
|
DWORD wanted = ref-(DWORD)currentMemoryPos-4;
|
||||||
|
if (testIfAlreadySet(current, wanted)) return;
|
||||||
|
testMemory4(old, getMemory4((LPVOID)current));
|
||||||
|
log_msg("DWORD\t%08X : %08X->%08X\n", currentMemoryPos, old, wanted);
|
||||||
|
patchMemory4(wanted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
void mem_byte(BYTE val)
|
||||||
|
{
|
||||||
|
if ( *(BYTE*)currentMemoryPos == val)
|
||||||
|
{
|
||||||
|
log_msg("Warning : BYTE at %08X is already set to %02X\n", currentMemoryPos, val);
|
||||||
|
currentMemoryPos += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log_msg("BYTE\t%08X : %02X\n", currentMemoryPos, val);
|
||||||
|
*(BYTE*)currentMemoryPos = val;
|
||||||
|
currentMemoryPos += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_word(WORD val)
|
||||||
|
{
|
||||||
|
if ( *(WORD*)currentMemoryPos == val)
|
||||||
|
{
|
||||||
|
log_msg("Warning : WORD at %08X is already set to %04X\n", currentMemoryPos, val);
|
||||||
|
currentMemoryPos += 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log_msg("WORD\t%08X : %04X\n", currentMemoryPos, val);
|
||||||
|
*(WORD*)currentMemoryPos = val;
|
||||||
|
currentMemoryPos += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void memt_word(WORD old, WORD val)
|
||||||
|
{
|
||||||
|
if ( *(WORD*)currentMemoryPos == val)
|
||||||
|
{
|
||||||
|
log_msg("Warning : WORD at %08X is already set to %04X (normal:%04X)\n", currentMemoryPos, val, old);
|
||||||
|
currentMemoryPos += 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( *(WORD*)currentMemoryPos != old)
|
||||||
|
{
|
||||||
|
log_msg("WORD %04X found, want %04X at %08X\n", *(WORD*)currentMemoryPos, old, currentMemoryPos);
|
||||||
|
if (active_CheckMemory)
|
||||||
|
{
|
||||||
|
log_box(MSG_ERROR_MEMORY);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_msg("WORD\t%08X : %04X->%04X\n", currentMemoryPos, old, val);
|
||||||
|
*(WORD*)currentMemoryPos = val;
|
||||||
|
currentMemoryPos += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mem_dword(DWORD val)
|
||||||
|
{
|
||||||
|
if ( *(DWORD*)currentMemoryPos == val)
|
||||||
|
{
|
||||||
|
log_msg("Warning : DWORD at %08X is already set to %08X\n", currentMemoryPos, val);
|
||||||
|
currentMemoryPos += 4;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log_msg("DWORD\t%08X : %08X\n", currentMemoryPos, val);
|
||||||
|
*(DWORD*)currentMemoryPos = val;
|
||||||
|
currentMemoryPos += 4;
|
||||||
|
}
|
||||||
|
void mem_ref4(DWORD ref)
|
||||||
|
{
|
||||||
|
log_msg("DWORD\t%08X : %08X\n", currentMemoryPos, ref-(DWORD)currentMemoryPos-4);
|
||||||
|
*(DWORD*)currentMemoryPos = ref-(DWORD)currentMemoryPos-4;
|
||||||
|
currentMemoryPos += 4;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*================================= END OF FILE =================================*/
|
306
PlugY/NewInterface_CubeListing.cpp
Normal file
306
PlugY/NewInterface_CubeListing.cpp
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Cube Listing functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateClient.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <direct.h> // _getcwd()
|
||||||
|
|
||||||
|
|
||||||
|
const char* CUBEFORMULA_FILE = "cube.txt";
|
||||||
|
const char * STRING_ERROR="***Error***";
|
||||||
|
|
||||||
|
|
||||||
|
#define BUF (&buf[strlen(buf)])
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
6FC9275F |. E8 ECCCFFFF |CALL D2Game.6FC8F450 ; \D2Game.6FC8F450
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
void printOutput(CubeOutput* output, char* buf, BYTE* nbOutputs)
|
||||||
|
{
|
||||||
|
if (!output->outputType)
|
||||||
|
return;
|
||||||
|
if (*nbOutputs)
|
||||||
|
sprintf(BUF," + ");
|
||||||
|
*nbOutputs += 1;
|
||||||
|
|
||||||
|
if (output->outputType == 1) {
|
||||||
|
sprintf(BUF,"Cow Portal");
|
||||||
|
return;
|
||||||
|
} else if (output->outputType == 2) {
|
||||||
|
sprintf(BUF,"Pandemonium Portal");
|
||||||
|
return;
|
||||||
|
} else if (output->outputType == 3) {
|
||||||
|
sprintf(BUF,"Pandemonium Final Portal");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((output->quantityOrNbSockets>1) && !output->haveSockets)
|
||||||
|
sprintf(BUF,"%u ", output->quantityOrNbSockets);
|
||||||
|
|
||||||
|
if (output->repair)
|
||||||
|
sprintf(BUF,"repair ");
|
||||||
|
|
||||||
|
if (output->recharge)
|
||||||
|
sprintf(BUF,"recharge ");
|
||||||
|
|
||||||
|
if (output->isEthereal)
|
||||||
|
sprintf(BUF,"ethereal ");
|
||||||
|
|
||||||
|
if (output->destroysFillers)
|
||||||
|
sprintf(BUF,"destroys Fillers ");
|
||||||
|
|
||||||
|
if (output->removeFillers)
|
||||||
|
sprintf(BUF,"remove Fillers ");
|
||||||
|
|
||||||
|
if (output->regeneratesUnique)
|
||||||
|
sprintf(BUF,"regenerate ");
|
||||||
|
|
||||||
|
if (output->upgradeToExceptional)
|
||||||
|
sprintf(BUF,"exceptional ");
|
||||||
|
|
||||||
|
if (output->upgradeToElite)
|
||||||
|
sprintf(BUF,"elite ");
|
||||||
|
|
||||||
|
|
||||||
|
if (output->isSpecificItem) {
|
||||||
|
if (output->quality == ITEMQUALITY_UNIQUE)
|
||||||
|
{
|
||||||
|
UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + output->specificID-1;
|
||||||
|
LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
} else if (output->quality == ITEMQUALITY_SET) {
|
||||||
|
SetItemsBIN* setItems = SgptDataTables->setItems + output->specificID-1;
|
||||||
|
LPWSTR string = D2GetStringFromIndex(setItems->setNameId);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
} else {
|
||||||
|
sprintf(BUF,STRING_ERROR);return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (output->quality)
|
||||||
|
{
|
||||||
|
case 1:sprintf(BUF,"Cracked ");break;
|
||||||
|
case 2:sprintf(BUF,"Normal ");break;
|
||||||
|
case 3:sprintf(BUF,"Superior ");break;
|
||||||
|
case 4:sprintf(BUF,"Magic ");break;
|
||||||
|
case 5:sprintf(BUF,"Set ");break;
|
||||||
|
case 6:sprintf(BUF,"Rare ");break;
|
||||||
|
case 7:sprintf(BUF,"Unique ");break;
|
||||||
|
case 8:sprintf(BUF,"Crafted ");break;
|
||||||
|
case 9:sprintf(BUF,"Tempered ");break;
|
||||||
|
}
|
||||||
|
ItemsBIN* items;LPWSTR string;
|
||||||
|
switch (output->outputType)
|
||||||
|
{
|
||||||
|
case 0xFC:
|
||||||
|
items = D2GetItemsBIN(output->ID);
|
||||||
|
string = D2GetStringFromIndex(items->NameStr);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
break;
|
||||||
|
case 0xFD:
|
||||||
|
getTypeAString(output->ID,BUF,50);
|
||||||
|
// WCHAR string[50];
|
||||||
|
// getTypeString(input->ID,string,50);
|
||||||
|
// wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
break;
|
||||||
|
case 0xFE: sprintf(BUF,"Item");break;
|
||||||
|
case 0xFF: sprintf(BUF,"Item of the same type");break;
|
||||||
|
default: sprintf(BUF,STRING_ERROR);return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((output->quantityOrNbSockets>1) && (output->haveSockets==1))
|
||||||
|
sprintf(BUF," with %u sockets", output->quantityOrNbSockets);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printInput(CubeInput* input, char* buf, BYTE* nbInputs)//maxsize)
|
||||||
|
{
|
||||||
|
if (!input->byItemID && !input->byItemTypeID)
|
||||||
|
return;
|
||||||
|
if (*nbInputs)
|
||||||
|
sprintf(BUF," + ");
|
||||||
|
|
||||||
|
BYTE nb = input->quantity > 0 ? input->quantity : 1;
|
||||||
|
*nbInputs += nb;
|
||||||
|
if (nb>1)
|
||||||
|
sprintf(BUF,"%u ", nb);
|
||||||
|
|
||||||
|
if (input->isEthereal)
|
||||||
|
sprintf(BUF,"ethereal ");
|
||||||
|
|
||||||
|
if (input->isNotEthereal)
|
||||||
|
sprintf(BUF,"not ethereal ");
|
||||||
|
|
||||||
|
if (input->isNotRuneword)
|
||||||
|
sprintf(BUF,"not runeword ");
|
||||||
|
|
||||||
|
if (input->isBasic)
|
||||||
|
sprintf(BUF,"basic ");
|
||||||
|
|
||||||
|
if (input->isExceptional)
|
||||||
|
sprintf(BUF,"exceptional ");
|
||||||
|
|
||||||
|
if (input->isElite)
|
||||||
|
sprintf(BUF,"elite ");
|
||||||
|
|
||||||
|
if (input->isSpecificItem) {
|
||||||
|
if (input->quality == ITEMQUALITY_UNIQUE)
|
||||||
|
{
|
||||||
|
UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + input->specificID-1;
|
||||||
|
LPWSTR string = D2GetStringFromIndex(uniqueItems->uniqueNameId);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
} else if (input->quality == ITEMQUALITY_SET) {
|
||||||
|
SetItemsBIN* setItems = SgptDataTables->setItems + input->specificID-1;
|
||||||
|
LPWSTR string = D2GetStringFromIndex(setItems->setNameId);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
} else {
|
||||||
|
sprintf(BUF,STRING_ERROR);return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (input->quality)
|
||||||
|
{
|
||||||
|
case 1:sprintf(BUF,"Cracked ");break;
|
||||||
|
case 2:sprintf(BUF,"Normal ");break;
|
||||||
|
case 3:sprintf(BUF,"Superior ");break;
|
||||||
|
case 4:sprintf(BUF,"Magic ");break;
|
||||||
|
case 5:sprintf(BUF,"Set ");break;
|
||||||
|
case 6:sprintf(BUF,"Rare ");break;
|
||||||
|
case 7:sprintf(BUF,"Unique ");break;
|
||||||
|
case 8:sprintf(BUF,"Crafted ");break;
|
||||||
|
case 9:sprintf(BUF,"Tempered ");break;
|
||||||
|
}
|
||||||
|
if (input->byItemTypeID) {
|
||||||
|
getTypeAString(input->ID,BUF,50);
|
||||||
|
} else if (input->ID == 0xFFFF) {
|
||||||
|
sprintf(BUF,"Item");
|
||||||
|
} else {
|
||||||
|
ItemsBIN* items = D2GetItemsBIN(input->ID);
|
||||||
|
LPWSTR string = D2GetStringFromIndex(items->NameStr);
|
||||||
|
wcstombs(BUF, string, wcslen(string)+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (input->includeUpgradedVersions && !input->isElite)
|
||||||
|
sprintf(BUF,"(or upgraded) ");
|
||||||
|
|
||||||
|
if (input->haveNoSocket)
|
||||||
|
sprintf(BUF," with no socket");
|
||||||
|
|
||||||
|
if (input->haveSockets)
|
||||||
|
sprintf(BUF," with sockets");
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD print(CubeMainBIN* curForm, char* buf, DWORD)//maxsize)
|
||||||
|
{
|
||||||
|
if (!buf || !curForm || !curForm->enabled) return 0;
|
||||||
|
|
||||||
|
BYTE realNbInputs=0;
|
||||||
|
printInput(&curForm->input1, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input2, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input3, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input4, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input5, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input6, buf, &realNbInputs);
|
||||||
|
printInput(&curForm->input7, buf, &realNbInputs);
|
||||||
|
|
||||||
|
|
||||||
|
if (realNbInputs != curForm->numinputs)
|
||||||
|
{
|
||||||
|
sprintf(BUF," *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(BUF," => ");
|
||||||
|
BYTE realNbOutputs=0;
|
||||||
|
printOutput(&curForm->output1, buf, &realNbOutputs);
|
||||||
|
printOutput(&curForm->output2, buf, &realNbOutputs);
|
||||||
|
printOutput(&curForm->output3, buf, &realNbOutputs);
|
||||||
|
|
||||||
|
|
||||||
|
// if (curForm->ladder)
|
||||||
|
// sprintf(BUF," [ladder only]");
|
||||||
|
|
||||||
|
if (curForm->minDiff == 1)
|
||||||
|
sprintf(BUF," [Nightmare and Hell only]");
|
||||||
|
else if (curForm->minDiff == 2)
|
||||||
|
sprintf(BUF," [Hell only]");
|
||||||
|
|
||||||
|
if (curForm->playerClass != 0xFF)
|
||||||
|
{
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(curForm->playerClass);
|
||||||
|
sprintf(BUF, " [%s only]", charStats->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((curForm->op>0) && (curForm->op!=28))
|
||||||
|
sprintf(BUF, " [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value);
|
||||||
|
|
||||||
|
// if (curForm->version == 100)
|
||||||
|
// sprintf(BUF, " [expansion only]");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#undef BUF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void listAllCubeFormula()
|
||||||
|
{
|
||||||
|
char filename[MAX_PATH];
|
||||||
|
_getcwd( filename, MAX_PATH );
|
||||||
|
if( filename[strlen(filename)] != '\\')
|
||||||
|
strcat(filename, "\\");
|
||||||
|
strcat(filename, CUBEFORMULA_FILE);
|
||||||
|
|
||||||
|
FILE* file = fopen(filename, "w");
|
||||||
|
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
log_msg("\n\n********** Print all cube formula **********\n");//SgptDataTables->nbCubemain\n"
|
||||||
|
|
||||||
|
int nbLines = D2GetNbCubeMainBIN();//SgptDataTables->nbCubemain
|
||||||
|
log_msg("nbLines : %d\n",nbLines);
|
||||||
|
|
||||||
|
char buf[300];
|
||||||
|
for (int i=0; i<nbLines; i++)
|
||||||
|
{
|
||||||
|
buf[0]=NULL;
|
||||||
|
DWORD res = print(D2GetCubeMainBIN(i), buf, 300);//SgptDataTables->cubemain + i;
|
||||||
|
if (res) fprintf(file,"%4u: %s\n",i,buf);
|
||||||
|
if (res) fflush(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
log_msg("\n********** Printing over **********\n\n");
|
||||||
|
|
||||||
|
/* _getcwd( filename, MAX_PATH );
|
||||||
|
if( filename[strlen(filename)] != '\\')
|
||||||
|
strcat(filename, "\\");
|
||||||
|
strcat(filename, "tmp.txt");
|
||||||
|
|
||||||
|
file = fopen(filename, "w");
|
||||||
|
|
||||||
|
ItemStatCostBIN* itemStatCost;
|
||||||
|
LPWSTR lpText;
|
||||||
|
for (i=0;i<=STATS_ITEM_CHARGED_SKILL_MOD;i++)
|
||||||
|
{
|
||||||
|
buf[0]='\0';
|
||||||
|
itemStatCost = D2GetItemStatCostBIN(i);
|
||||||
|
lpText = D2GetStringFromIndex(itemStatCost->descstrpos);
|
||||||
|
wcstombs(&buf[0],lpText,100);
|
||||||
|
strcat(buf,"\t - \t");
|
||||||
|
lpText = D2GetStringFromIndex(itemStatCost->descstrneg);
|
||||||
|
wcstombs(&buf[strlen(buf)],lpText,100);
|
||||||
|
fprintf(file,"%03d %03X \t- %s\n",i,i,buf);
|
||||||
|
}
|
||||||
|
fclose(file);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
291
PlugY/NewInterface_Runewords.cpp
Normal file
291
PlugY/NewInterface_Runewords.cpp
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h" // Install_UpdateServer()
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define NB_RUNES_PER_PAGE 25
|
||||||
|
|
||||||
|
#define getXCloseBtn() 360
|
||||||
|
#define getLCloseBtn() 32
|
||||||
|
#define getYCloseBtn() (ResolutionY - 60)
|
||||||
|
#define getHCloseBtn() 32
|
||||||
|
#define isOnCloseBtn(x,y) isOnRect(x, y, getXCloseBtn(), getYCloseBtn(), getLCloseBtn(), getHCloseBtn())
|
||||||
|
|
||||||
|
#define getXNextPageBtn() 120
|
||||||
|
#define getLNextPageBtn() 32
|
||||||
|
#define getYNextPageBtn() (ResolutionY - 60)
|
||||||
|
#define getHNextPageBtn() 32
|
||||||
|
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
|
||||||
|
|
||||||
|
#define getXPrevRunesBtn() 168
|
||||||
|
#define getLPrevRunesBtn() 32
|
||||||
|
#define getYPrevRunesBtn() (ResolutionY - 60)
|
||||||
|
#define getHPrevRunesBtn() 32
|
||||||
|
#define isOnPrevRunesBtn(x,y) isOnRect(x, y, getXPrevRunesBtn(), getYPrevRunesBtn(), getLPrevRunesBtn(), getHPrevRunesBtn())
|
||||||
|
|
||||||
|
#define getXNextRunesBtn() 200
|
||||||
|
#define getLNextRunesBtn() 32
|
||||||
|
#define getYNextRunesBtn() (ResolutionY - 60)
|
||||||
|
#define getHNextRunesBtn() 32
|
||||||
|
#define isOnNextRunesBtn(x,y) isOnRect(x, y, getXNextRunesBtn(), getYNextRunesBtn(), getLNextRunesBtn(), getHNextRunesBtn())
|
||||||
|
|
||||||
|
int curRunesPage=0;
|
||||||
|
int maxRunesPage=0xFFFF;
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD close:1;
|
||||||
|
DWORD nextPage:1;
|
||||||
|
DWORD prevRunes:1;
|
||||||
|
DWORD nextRunes:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} isDownBtn;
|
||||||
|
|
||||||
|
|
||||||
|
void printRuneword(RunesBIN* runesData, DWORD pos)
|
||||||
|
{
|
||||||
|
WCHAR temp[50];
|
||||||
|
WCHAR runesList[50];
|
||||||
|
WCHAR typesList[50];
|
||||||
|
LPWSTR lpText = D2GetStringFromIndex(runesData->RuneNameID);
|
||||||
|
D2SetFont(6);
|
||||||
|
DWORD nbPixel = D2GetPixelLen(lpText);
|
||||||
|
DWORD x1 = (nbPixel >= 195) ? 0 : 195-nbPixel;
|
||||||
|
D2PrintString(lpText, x1, 10 + pos*20, GOLD, 0);//MILIEU(0x00,0x70,nbPixel)
|
||||||
|
|
||||||
|
typesList[0]=L'\0';
|
||||||
|
DWORD numItype=0;
|
||||||
|
while (numItype<6)
|
||||||
|
{
|
||||||
|
WORD type = runesData->Itypes[numItype];
|
||||||
|
if (!type) break;
|
||||||
|
getTypeUString(type,temp,50);
|
||||||
|
if (numItype) wcscat(typesList,L"/");
|
||||||
|
wcscat(typesList,temp);
|
||||||
|
numItype++;
|
||||||
|
}
|
||||||
|
nbPixel = D2GetPixelLen(typesList);
|
||||||
|
x1 = (nbPixel >= 195) ? 0 : 195-nbPixel;
|
||||||
|
D2PrintString(typesList, x1, 20 + pos*20, WHITE, 0);//MILIEU(0x70,0xA0,nbPixel)
|
||||||
|
|
||||||
|
runesList[0]=L'\0';
|
||||||
|
DWORD numRune=0;
|
||||||
|
int curRuneID = runesData->Runes[0];
|
||||||
|
while ((curRuneID>0) && (numRune<6))
|
||||||
|
{
|
||||||
|
ItemsBIN* itemsData = D2GetItemsBIN(curRuneID);
|
||||||
|
d2_assert( !itemsData , "itemsData", __FILE__, __LINE__);
|
||||||
|
GemsBIN* gemData = D2GetGemsBIN(itemsData->GemOffset);
|
||||||
|
if (gemData) {
|
||||||
|
d2_assert( !gemData , "gemData", __FILE__, __LINE__);
|
||||||
|
mbstowcs(temp, gemData->letter, 50);
|
||||||
|
if (numRune) wcscat(runesList,L" ");
|
||||||
|
// else wcscat(runesList,L"");
|
||||||
|
wcscat(runesList,temp);}
|
||||||
|
numRune++;
|
||||||
|
curRuneID = runesData->Runes[numRune];
|
||||||
|
}
|
||||||
|
// wcscat(runesList,L"");
|
||||||
|
D2SetFont(1);
|
||||||
|
DWORD y1;
|
||||||
|
nbPixel = D2GetPixelLen(runesList);
|
||||||
|
if (nbPixel>195)
|
||||||
|
{
|
||||||
|
D2SetFont(6);
|
||||||
|
nbPixel = D2GetPixelLen(runesList);
|
||||||
|
y1=16;
|
||||||
|
x1 = nbPixel>195 ? 395-nbPixel : 204;
|
||||||
|
} else {
|
||||||
|
x1=205;
|
||||||
|
y1=18;
|
||||||
|
}
|
||||||
|
|
||||||
|
// x1 = (nbPixel < 145) ? 155 : 300-nbPixel;
|
||||||
|
D2PrintString(runesList, x1, y1 + pos*20, WHITE, 0);//MILIEU(0xD0,0xA0,nbPixel)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFSIZE 0x80
|
||||||
|
//6FB21FAA
|
||||||
|
void STDCALL printRunewordsPage()
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return D2PrintStatsPage();
|
||||||
|
|
||||||
|
LPWSTR lpText;
|
||||||
|
bDontPrintBorder = true;
|
||||||
|
|
||||||
|
//Init data for print image
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
|
||||||
|
//print background
|
||||||
|
/* setImage(&data, newStatsInterfaceImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, 0, 256, -1, 5, 0);
|
||||||
|
setFrame(&data, 1);
|
||||||
|
D2PrintImage(&data, 256,256, -1, 5, 0);
|
||||||
|
setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, 0, 512, -1, 5, 0);
|
||||||
|
setFrame(&data, 3);
|
||||||
|
D2PrintImage(&data, 256,512, -1, 5, 0);
|
||||||
|
setFrame(&data, 4);
|
||||||
|
D2PrintImage(&data, 0, 552, -1, 5, 0);
|
||||||
|
setFrame(&data, 5);
|
||||||
|
D2PrintImage(&data, 256,552, -1, 5, 0);
|
||||||
|
*/
|
||||||
|
fillRect(0,0,400,552,0,5);
|
||||||
|
|
||||||
|
//print button close
|
||||||
|
setImage(&data, D2LoadBuySelBtn());
|
||||||
|
setFrame(&data, 10 + isDownBtn.close);
|
||||||
|
D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print next page button
|
||||||
|
setFrame(&data, isDownBtn.nextPage);
|
||||||
|
D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print previous runes button
|
||||||
|
setImage(&data, stashBtnsImages);
|
||||||
|
setFrame(&data, isDownBtn.prevRunes);
|
||||||
|
D2PrintImage(&data, getXPrevRunesBtn(), getYPrevRunesBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print previous runes button
|
||||||
|
setFrame(&data, 2 + isDownBtn.nextRunes);
|
||||||
|
D2PrintImage(&data, getXNextRunesBtn(), getYNextRunesBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
D2SetFont(6);
|
||||||
|
|
||||||
|
//146;//B400
|
||||||
|
int nbRunes = *D2GetNbRunesBIN();
|
||||||
|
RunesBIN* runesFirst = nbRunes>1 ? D2GetRunesBIN(1)-1 : NULL;
|
||||||
|
RunesBIN* runesLast = runesFirst? runesFirst + nbRunes : NULL;
|
||||||
|
// log_msg("nbRunes(%d,%d) runesFirst(%08X, %08X) runesLast(%08X, %08X)",nbRunes,SgptDataTables->nbRunes,runesFirst, SgptDataTables->runes,runesLast,SgptDataTables->runes + SgptDataTables->nbRunes);
|
||||||
|
|
||||||
|
int nbRunesCompleted=0;
|
||||||
|
DWORD curNbRunes=0;
|
||||||
|
for ( RunesBIN* runesData = runesFirst; runesData < runesLast; runesData++)
|
||||||
|
{
|
||||||
|
if (!runesData->Complete || runesData->Server) continue;
|
||||||
|
nbRunesCompleted++;
|
||||||
|
if ( (curRunesPage * NB_RUNES_PER_PAGE < nbRunesCompleted) &&
|
||||||
|
(nbRunesCompleted <= (curRunesPage+1) * NB_RUNES_PER_PAGE) )
|
||||||
|
printRuneword(runesData, curNbRunes++);
|
||||||
|
}
|
||||||
|
maxRunesPage = nbRunesCompleted ? (nbRunesCompleted-1) / NB_RUNES_PER_PAGE : 0;
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////// POPUP PRINTING ////////////////////
|
||||||
|
//set MouseX & MouseY
|
||||||
|
DWORD x = D2GetMouseX();
|
||||||
|
DWORD y = D2GetMouseY();
|
||||||
|
|
||||||
|
if (isOnCloseBtn(x,y)) // print popup "close"
|
||||||
|
{
|
||||||
|
D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(x,y)) // print popup "next page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_NEXT_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DWORD STDCALL mouseRunewordsPageLeftDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return -1;
|
||||||
|
|
||||||
|
if (!isOnStatsPage(msg->x,msg->y)) return 1;
|
||||||
|
|
||||||
|
if (isOnCloseBtn(msg->x,msg->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))
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
log_msg("push down left button next runes\n");
|
||||||
|
isDownBtn.nextRunes = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
freeMessage(msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return -1;
|
||||||
|
|
||||||
|
if (!isOnStatsPage(msg->x,msg->y)) return 1;
|
||||||
|
|
||||||
|
if (isOnCloseBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button close\n");
|
||||||
|
if (isDownBtn.close)
|
||||||
|
D2TogglePage(2,1,0);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button next page\n");
|
||||||
|
if (isDownBtn.nextPage)
|
||||||
|
{
|
||||||
|
GoStatPage(GetCurrentPage()+1);
|
||||||
|
log_msg("next page press\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isOnPrevRunesBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button prev runes\n");
|
||||||
|
if (isDownBtn.prevRunes)
|
||||||
|
{
|
||||||
|
if (curRunesPage) curRunesPage--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isOnNextRunesBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button next runes\n");
|
||||||
|
if (isDownBtn.nextRunes)
|
||||||
|
{
|
||||||
|
if (curRunesPage < maxRunesPage) curRunesPage++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
D2CleanStatMouseUp();
|
||||||
|
freeMessage(msg);
|
||||||
|
isDownBtn.all=0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
823
PlugY/NewInterface_Stats.cpp
Normal file
823
PlugY/NewInterface_Stats.cpp
Normal file
@ -0,0 +1,823 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h" // Install_UpdateServer()
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define getXCloseBtn() 360
|
||||||
|
#define getLCloseBtn() 32
|
||||||
|
#define getYCloseBtn() (ResolutionY - 60)
|
||||||
|
#define getHCloseBtn() 32
|
||||||
|
#define isOnCloseBtn(x,y) isOnRect(x, y, getXCloseBtn(), getYCloseBtn(), getLCloseBtn(), getHCloseBtn())
|
||||||
|
|
||||||
|
#define getXPreviousPageBtn() RX(0x19)//0x70
|
||||||
|
#define getLPreviousPageBtn() 32
|
||||||
|
#define getYPreviousPageBtn() RY(0x40)
|
||||||
|
#define getHPreviousPageBtn() 32
|
||||||
|
#define isOnPreviousPageBtn(x,y) isOnRect(x, y, getXPreviousPageBtn(), getYPreviousPageBtn(), getLPreviousPageBtn(), getHPreviousPageBtn())
|
||||||
|
|
||||||
|
#define getXNextPageBtn() RX(D2GetResolution()?0x43:0x8A)
|
||||||
|
#define getLNextPageBtn() 32
|
||||||
|
#define getYNextPageBtn() RY(D2GetResolution()?0x40:0x70)
|
||||||
|
#define getHNextPageBtn() 32
|
||||||
|
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define getXNextPageBtn() 120
|
||||||
|
#define getLNextPageBtn() 32
|
||||||
|
#define getYNextPageBtn() (ResolutionY - 60)
|
||||||
|
#define getHNextPageBtn() 32
|
||||||
|
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define getLAssignBtn() 32
|
||||||
|
#define getHAssignBtn() 32
|
||||||
|
|
||||||
|
#define getXAssSTRBtn() 0x7D+35
|
||||||
|
#define getYAssSTRBtn() 0x6A
|
||||||
|
#define isOnAssSTRBtn(x,y) isOnRect(x, y, getXAssSTRBtn(), getYAssSTRBtn(), getLAssignBtn(), getHAssignBtn())
|
||||||
|
|
||||||
|
#define getXAssDEXBtn() 0x7D+35
|
||||||
|
#define getYAssDEXBtn() 0xA8
|
||||||
|
#define isOnAssDEXBtn(x,y) isOnRect(x, y, getXAssDEXBtn(), getYAssDEXBtn(), getLAssignBtn(), getHAssignBtn())
|
||||||
|
|
||||||
|
#define getXAssVITBtn() 0x7D+35
|
||||||
|
#define getYAssVITBtn() 0xFE
|
||||||
|
#define isOnAssVITBtn(x,y) isOnRect(x, y, getXAssVITBtn(), getYAssVITBtn(), getLAssignBtn(), getHAssignBtn())
|
||||||
|
|
||||||
|
#define getXAssENEBtn() 0x7D+35
|
||||||
|
#define getYAssENEBtn() 0x13C
|
||||||
|
#define isOnAssENEBtn(x,y) isOnRect(x, y, getXAssENEBtn(), getYAssENEBtn(), getLAssignBtn(), getHAssignBtn())
|
||||||
|
|
||||||
|
|
||||||
|
#define getLUnassignBtn() 32
|
||||||
|
#define getHUnassignBtn() 32
|
||||||
|
|
||||||
|
#define getXUnaSTRBtn() 0x7D
|
||||||
|
#define getYUnaSTRBtn() getYAssSTRBtn()
|
||||||
|
#define isOnUnaSTRBtn(x,y) isOnRect(x, y, getXUnaSTRBtn(), getYUnaSTRBtn(), getLUnassignBtn(), getHUnassignBtn())
|
||||||
|
|
||||||
|
#define getXUnaDEXBtn() 0x7D
|
||||||
|
#define getYUnaDEXBtn() getYAssDEXBtn()
|
||||||
|
#define isOnUnaDEXBtn(x,y) isOnRect(x, y, getXUnaDEXBtn(), getYUnaDEXBtn(), getLUnassignBtn(), getHUnassignBtn())
|
||||||
|
|
||||||
|
#define getXUnaVITBtn() 0x7D
|
||||||
|
#define getYUnaVITBtn() getYAssVITBtn()
|
||||||
|
#define isOnUnaVITBtn(x,y) isOnRect(x, y, getXUnaVITBtn(), getYUnaVITBtn(), getLUnassignBtn(), getHUnassignBtn())
|
||||||
|
|
||||||
|
#define getXUnaENEBtn() 0x7D
|
||||||
|
#define getYUnaENEBtn() getYAssENEBtn()
|
||||||
|
#define isOnUnaENEBtn(x,y) isOnRect(x, y, getXUnaENEBtn(), getYUnaENEBtn(), getLUnassignBtn(), getHUnassignBtn())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void** ptD2RemainingStatsPointsBoxImages = (void**)0x6FBB5E50;
|
||||||
|
#define D2RemainingStatsPointsBoxImages (*ptD2RemainingStatsPointsBoxImages)
|
||||||
|
|
||||||
|
void** ptD2AssignStatsPointsBoxImages = (void**)0x6FBB5BB8;
|
||||||
|
#define D2AssignStatsPointsBoxImages (*ptD2AssignStatsPointsBoxImages)
|
||||||
|
|
||||||
|
void** ptD2AssignStatsPointsBtnImages = (void**)0x6FBB5BB4;
|
||||||
|
#define D2AssignStatsPointsBtnImages (*ptD2AssignStatsPointsBtnImages)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD close:1;
|
||||||
|
DWORD AssSTR:1;
|
||||||
|
DWORD AssDEX:1;
|
||||||
|
DWORD AssVIT:1;
|
||||||
|
DWORD AssENE:1;
|
||||||
|
DWORD UnaSTR:1;
|
||||||
|
DWORD UnaDEX:1;
|
||||||
|
DWORD UnaVIT:1;
|
||||||
|
DWORD UnaENE:1;
|
||||||
|
DWORD previousPage:1;
|
||||||
|
DWORD nextPage:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} isDownBtn;
|
||||||
|
|
||||||
|
|
||||||
|
void print2Lines(WORD id, LPWSTR lpText, DWORD x, DWORD l, DWORD y)
|
||||||
|
{
|
||||||
|
wcsncpy(lpText, D2GetStringFromIndex(id), 0x63);
|
||||||
|
lpText[0x64]= L'\0';
|
||||||
|
|
||||||
|
LPWSTR lptmp = lpText;
|
||||||
|
while (*lptmp)
|
||||||
|
{
|
||||||
|
if (*lptmp==L'\n')
|
||||||
|
{
|
||||||
|
*lptmp = L'\0';
|
||||||
|
if (*(++lptmp))
|
||||||
|
{
|
||||||
|
DWORD nbPixel = D2GetPixelLen(lpText);
|
||||||
|
D2PrintString(lpText, MILIEU(x,l,nbPixel), y-4, WHITE, 0);
|
||||||
|
nbPixel = D2GetPixelLen(lptmp);
|
||||||
|
D2PrintString(lptmp, MILIEU(x,l,nbPixel), y+4, WHITE, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lptmp++;
|
||||||
|
}
|
||||||
|
DWORD nbPixel = D2GetPixelLen(lpText);
|
||||||
|
D2PrintString(lpText, MILIEU(x,l,nbPixel), y, WHITE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFSIZE 0x80
|
||||||
|
void STDCALL printNewStatsPage()
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return D2PrintStatsPage();
|
||||||
|
|
||||||
|
WCHAR text[BUFSIZE];
|
||||||
|
LPWSTR lpText;
|
||||||
|
DWORD nbPixel;
|
||||||
|
DWORD curValue,baseValue,color;
|
||||||
|
DWORD x1,y1,reset=0;
|
||||||
|
bDontPrintBorder = true;
|
||||||
|
|
||||||
|
int curRes,maxRes;
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
d2_assert(!ptChar, "Printing stats page : no character selected",__FILE__,__LINE__);
|
||||||
|
d2_assert(ptChar->nUnitType != UNIT_PLAYER, "Printing stats page : bad unit type",__FILE__,__LINE__);
|
||||||
|
|
||||||
|
//Init data for print image
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
|
||||||
|
//print background
|
||||||
|
/* setImage(&data, newStatsInterfaceImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, 0, 256, -1, 5, 0);
|
||||||
|
setFrame(&data, 1);
|
||||||
|
D2PrintImage(&data, 256,256, -1, 5, 0);
|
||||||
|
setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, 0, 512, -1, 5, 0);
|
||||||
|
setFrame(&data, 3);
|
||||||
|
D2PrintImage(&data, 256,512, -1, 5, 0);
|
||||||
|
setFrame(&data, 4);
|
||||||
|
D2PrintImage(&data, 0, 552, -1, 5, 0);
|
||||||
|
setFrame(&data, 5);
|
||||||
|
D2PrintImage(&data, 256,552, -1, 5, 0);
|
||||||
|
*/
|
||||||
|
fillRect(0,0,400,552,0,5);
|
||||||
|
|
||||||
|
//print button close
|
||||||
|
setImage(&data, D2LoadBuySelBtn());
|
||||||
|
setFrame(&data, 10 + isDownBtn.close);
|
||||||
|
D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print previous page button
|
||||||
|
setFrame(&data, 12 + isDownBtn.previousPage);
|
||||||
|
D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print next page button
|
||||||
|
setFrame(&data, 14 + isDownBtn.nextPage);
|
||||||
|
D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
DifficultyLevelsBIN* difficultyLevels = D2GetDifficultyLevelsBIN (D2GetDifficultyLevel());
|
||||||
|
|
||||||
|
//print fixed text
|
||||||
|
D2SetFont(6);
|
||||||
|
print2Lines(0xFD9, text, 0x0B, 0x29, 0x2C); //level //0x34-0xB
|
||||||
|
print2Lines(0xFDA, text, 0x41, 0x73, 0x2C); //Experience //0xB4-0x41
|
||||||
|
print2Lines(0xFDB, text, 0xC1, 0x73, 0x2C); //Next Level //0x134-0xC1
|
||||||
|
print2Lines(0xFDC, text, 0x0A, 0x3F, 0x61); //Strengh //0x49-0xA
|
||||||
|
print2Lines(0xFDE, text, 0x0A, 0x3F, 0xA0); //Dexterity //0x49-0xA
|
||||||
|
print2Lines(0xFE0, text, 0xAE, 0x5E, 0xCF); //Defence //0x10C-0xAE
|
||||||
|
print2Lines(0xFE2, text, 0x0A, 0x3F, 0xF5); //Vitality //0x49-0xA
|
||||||
|
print2Lines(0xFE3, text, 0xAE, 0x36, 0xF5); //Stamina //0xE4-0xAE
|
||||||
|
print2Lines(0xFE4, text, 0xAE, 0x36, 0x10D);//Life //0xE4-0xAE
|
||||||
|
print2Lines(0xFE5, text, 0x0A, 0x3F, 0x133);//Energy //0x49-0xA
|
||||||
|
print2Lines(0xFE6, text, 0xAE, 0x36, 0x133);//Mana //0xE4-0xAE
|
||||||
|
print2Lines(0xFE7, text, 0xBE, 0x4E, 0x15A);//Fire.Resistance //0x10C-0xBE
|
||||||
|
print2Lines(0xFE8, text, 0xBE, 0x4E, 0x172);//Cold.Resistance //0x10C-0xBE
|
||||||
|
print2Lines(0xFE9, text, 0xBE, 0x4E, 0x18B);//Lightning.Resistance //0x10C-0xBE
|
||||||
|
print2Lines(0xFEA, text, 0xBE, 0x4E, 0x1A3);//Poison.Resistance //0x10C-0xBE
|
||||||
|
|
||||||
|
// print class
|
||||||
|
D2SetFont(1);
|
||||||
|
lpText = charStats->nameU;
|
||||||
|
nbPixel = D2GetPixelLen(lpText);
|
||||||
|
D2PrintString(lpText, MILIEU(0xC1,0x76,nbPixel), 0x19, WHITE, 0);
|
||||||
|
|
||||||
|
// print name
|
||||||
|
char* string = PCPlayerData->name;
|
||||||
|
int usize = strlen(string);
|
||||||
|
if (usize>9)
|
||||||
|
D2SetFont(usize < 12?0:6);
|
||||||
|
mbstowcs(text,string,BUFSIZE);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xD,0x94,nbPixel), 0x19, WHITE, 0);
|
||||||
|
|
||||||
|
D2SetFont(1);
|
||||||
|
|
||||||
|
// print level value
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_LEVEL, 0);
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_LEVEL, 0);
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xD,0x29,nbPixel), 0x3B, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
if (version_D2Client <= V110)
|
||||||
|
{
|
||||||
|
//print Experience
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_EXPERIENCE, 0);
|
||||||
|
D2PrintBigNumber(text, curValue, BUFSIZE);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x43,0x72,nbPixel), 0x3B, WHITE, 0);
|
||||||
|
|
||||||
|
//print next level
|
||||||
|
DWORD plvl = D2GetPlayerBaseStat(ptChar, STATS_LEVEL, 0);
|
||||||
|
if (plvl < D2GetMaxLevel(ptChar->nPlayerClass))
|
||||||
|
curValue = D2GetNextLevelXP(ptChar->nPlayerClass, plvl);
|
||||||
|
else
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_NEXTEXP, 0);
|
||||||
|
D2PrintBigNumber(text,curValue,BUFSIZE);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xC3,0x72,nbPixel), 0x3B, WHITE, 0);
|
||||||
|
|
||||||
|
//print strength
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_STRENGTH, 0);
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_STRENGTH, 0);
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x4D,0x24,nbPixel), 0x63, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print dexterity
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_DEXTERITY, 0);
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_DEXTERITY, 0);
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x4D,0x24,nbPixel), 0xA1, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print vitality
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_VITALITY, 0);
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_VITALITY, 0);
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x4D,0x24,nbPixel), 0xF7, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print energy
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_ENERGY, 0);
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_ENERGY, 0);
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color=0;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x4D,0x24,nbPixel), 0x134, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
|
||||||
|
//print max stamina
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_MAXSTAMINA, 0) / 256;
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_MAXSTAMINA, 0) / 256;
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xE8,0x24,nbPixel), 0xF6, color, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
//print stamina
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_STAMINA, 0) / 256;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x24,nbPixel), 0xF6, WHITE, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
//print max Hit Point
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_MAXHP, 0) / 256;
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_MAXHP, 0) / 256;
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xE8,0x24,nbPixel), 0x10E, color, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//print Hit Point
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_HP, 0) / 256;
|
||||||
|
if ((ptChar->CurrentAnim != 0x11) && !curValue) curValue=1;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x24,nbPixel), 0x10E, WHITE, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
//print max mana
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_MAXMANA, 0) / 256;
|
||||||
|
baseValue = D2GetPlayerBaseStat(ptChar, STATS_MAXMANA, 0) / 256;
|
||||||
|
if (curValue != baseValue) color = curValue < baseValue ? RED : BLUE;
|
||||||
|
else color = WHITE;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0xE8,0x24,nbPixel), 0x134, color, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
//print mana
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_MANA, 0) / 256;
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
|
||||||
|
if (curValue > 999) reset=1;
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if (0x24<x1) reset = 1;
|
||||||
|
if (reset) D2SetFont(0);
|
||||||
|
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x24,nbPixel), 0x134, WHITE, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
// print defence
|
||||||
|
curValue = D2GetDefence(ptChar);
|
||||||
|
color = D2haveDefenceBonus(ptChar) ? BLUE : WHITE;
|
||||||
|
if (PCInventory && D2Common10273(PCInventory,0) && D2isInState(ptChar,0x65))
|
||||||
|
color = BLUE;
|
||||||
|
if (D2haveDefenceMalus(ptChar)) color = RED;
|
||||||
|
|
||||||
|
if ( D2GetLang() == LNG_JPN)
|
||||||
|
{
|
||||||
|
D2GetPixelRect(text,&x1,&y1);
|
||||||
|
if ((0x24<x1) || (curValue > 999))
|
||||||
|
{reset = 1; D2SetFont(0);}
|
||||||
|
}
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curValue);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x23,nbPixel), 0xD1, color, 0);//ESI,EBX,EDI
|
||||||
|
if (reset) {D2SetFont(1); reset=0;}
|
||||||
|
|
||||||
|
|
||||||
|
//print fire resistance
|
||||||
|
curRes = D2GetPlayerStat(ptChar, STATS_FIRERESIST, 0) + difficultyLevels->resistPenalty;
|
||||||
|
color = D2haveFireResBonus(ptChar) ? BLUE : WHITE;
|
||||||
|
if (D2haveFireResMalus(ptChar)) color = RED;
|
||||||
|
maxRes = 75 + D2GetPlayerStat(ptChar, STATS_MAXFIRERESIST, 0);
|
||||||
|
if (maxRes>95) maxRes = 95;
|
||||||
|
if (curRes < -100) curRes=-100;
|
||||||
|
if (curRes > maxRes) curRes = maxRes;
|
||||||
|
if ((curRes == maxRes) && (color != BLUE)) color = GOLD;
|
||||||
|
else if (curRes < 0) color = RED;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curRes);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x23,nbPixel), 0x15C, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print lightning resistance
|
||||||
|
curRes = D2GetPlayerStat(ptChar, STATS_LIGHTRESIST, 0) + difficultyLevels->resistPenalty;
|
||||||
|
color = D2haveLightResBonus(ptChar) ? BLUE : WHITE;
|
||||||
|
if (D2haveLightResMalus(ptChar)) color = RED;
|
||||||
|
maxRes = 75 + D2GetPlayerStat(ptChar, STATS_MAXLIGHTRESIST, 0);
|
||||||
|
if (maxRes>95) maxRes = 95;
|
||||||
|
if (curRes < -100) curRes=-100;
|
||||||
|
if (curRes > maxRes) curRes = maxRes;
|
||||||
|
if ((curRes == maxRes) && (color != BLUE)) color = GOLD;
|
||||||
|
else if (curRes < 0) color = RED;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curRes);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x23,nbPixel), 0x174, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print cold resistance
|
||||||
|
curRes = D2GetPlayerStat(ptChar, STATS_COLDRESIST, 0) + difficultyLevels->resistPenalty;
|
||||||
|
color = D2haveColdResBonus(ptChar) ? BLUE : WHITE;
|
||||||
|
if (D2haveColdResMalus(ptChar)) color = RED;
|
||||||
|
maxRes = 75 + D2GetPlayerStat(ptChar, STATS_MAXCOLDRESIST, 0);
|
||||||
|
if (maxRes>95) maxRes = 95;
|
||||||
|
if (curRes < -100) curRes=-100;
|
||||||
|
if (curRes > maxRes) curRes = maxRes;
|
||||||
|
if ((curRes == maxRes) && (color != BLUE)) color = GOLD;
|
||||||
|
else if (curRes < 0) color = RED;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curRes);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x23,nbPixel), 0x18C, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
//print poison resistance
|
||||||
|
curRes = D2GetPlayerStat(ptChar, STATS_POISONRESIST, 0) + difficultyLevels->resistPenalty;
|
||||||
|
color = D2havePoisonResBonus(ptChar) ? BLUE : WHITE;
|
||||||
|
if (D2havePoisonResMalus(ptChar)) color = RED;
|
||||||
|
maxRes = 75 + D2GetPlayerStat(ptChar, STATS_MAXPOISONRESIST, 0);
|
||||||
|
if (maxRes>95) maxRes = 95;
|
||||||
|
if (curRes < -100) curRes=-100;
|
||||||
|
if (curRes > maxRes) curRes = maxRes;
|
||||||
|
if ((curRes == maxRes) && (color != BLUE)) color = GOLD;
|
||||||
|
else if (curRes < 0) color = RED;
|
||||||
|
|
||||||
|
swprintf(text,L"%ld",curRes);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(0x111,0x23,nbPixel), 0x1A4, color, 0);//ESI,EBX,EDI
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////// STAT POINTS REMAINING MANAGEMENT ////////////////////
|
||||||
|
//print Assign box of btns : Str,Dex,Ene,Vit
|
||||||
|
setImage(&data, D2AssignStatsPointsBoxImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, getXAssSTRBtn()-3, getYAssSTRBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssDEXBtn()-3, getYAssDEXBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssENEBtn()-3, getYAssENEBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssVITBtn()-3, getYAssVITBtn()+4, -1, 5, 0);
|
||||||
|
|
||||||
|
DWORD nbStatPointsRemaining = D2GetPlayerBaseStat(ptChar, 4, 0);
|
||||||
|
if (nbStatPointsRemaining)
|
||||||
|
{
|
||||||
|
//print stat point remaining box image
|
||||||
|
setImage(&data, D2RemainingStatsPointsBoxImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, 3, 0x16C, -1, 5, 0);
|
||||||
|
|
||||||
|
//print "Stat Points Remaining"
|
||||||
|
D2SetFont(6);
|
||||||
|
lpText = D2GetStringFromIndex(0xFEB);
|
||||||
|
nbPixel = D2GetPixelLen(lpText);
|
||||||
|
D2PrintString(lpText, MILIEU(11,78,nbPixel), 0x163, RED, 0);//163
|
||||||
|
lpText = D2GetStringFromIndex(0xFEC);
|
||||||
|
nbPixel = D2GetPixelLen(lpText);
|
||||||
|
D2PrintString(lpText, MILIEU(11,78,nbPixel), 0x16B, RED, 0);
|
||||||
|
|
||||||
|
//print Stat Points Remaining number
|
||||||
|
D2SetFont(1);
|
||||||
|
swprintf(text, L"%i", nbStatPointsRemaining);
|
||||||
|
nbPixel = D2GetPixelLen(text);
|
||||||
|
D2PrintString(text, MILIEU(92,36,nbPixel), 0x168, WHITE, 0);
|
||||||
|
|
||||||
|
setImage(&data, D2AssignStatsPointsBtnImages);
|
||||||
|
setFrame(&data, isDownBtn.AssSTR);
|
||||||
|
D2PrintImage(&data, getXAssSTRBtn(), getYAssSTRBtn(), -1, 5, 0);
|
||||||
|
setFrame(&data, isDownBtn.AssDEX);
|
||||||
|
D2PrintImage(&data, getXAssDEXBtn(), getYAssDEXBtn(), -1, 5, 0);
|
||||||
|
setFrame(&data, isDownBtn.AssVIT);
|
||||||
|
D2PrintImage(&data, getXAssVITBtn(), getYAssVITBtn(), -1, 5, 0);
|
||||||
|
setFrame(&data, isDownBtn.AssENE);
|
||||||
|
D2PrintImage(&data, getXAssENEBtn(), getYAssENEBtn(), -1, 5, 0);
|
||||||
|
} else {
|
||||||
|
setImage(&data, D2AssignStatsPointsBtnImages);
|
||||||
|
setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, getXAssSTRBtn(), getYAssSTRBtn(), -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssDEXBtn(), getYAssDEXBtn(), -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssVITBtn(), getYAssVITBtn(), -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXAssENEBtn(), getYAssENEBtn(), -1, 5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_StatsPoints && !onRealm)
|
||||||
|
{
|
||||||
|
setImage(&data, D2AssignStatsPointsBoxImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, getXUnaSTRBtn()-3, getYUnaSTRBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXUnaDEXBtn()-3, getYUnaDEXBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXUnaENEBtn()-3, getYUnaENEBtn()+4, -1, 5, 0);
|
||||||
|
D2PrintImage(&data, getXUnaVITBtn()-3, getYUnaVITBtn()+4, -1, 5, 0);
|
||||||
|
|
||||||
|
setImage(&data, unassignStatsBtnImages);
|
||||||
|
if ((int)charStats->baseSTR < D2GetPlayerBaseStat(ptChar, STATS_STRENGTH, 0))
|
||||||
|
setFrame(&data, isDownBtn.UnaSTR);
|
||||||
|
else data.frame = 2;
|
||||||
|
D2PrintImage(&data, getXUnaSTRBtn(), getYUnaSTRBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if ((int)charStats->baseDEX < D2GetPlayerBaseStat(ptChar, STATS_DEXTERITY, 0))
|
||||||
|
setFrame(&data, isDownBtn.UnaDEX);
|
||||||
|
else setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, getXUnaDEXBtn(), getYUnaDEXBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if ((int)charStats->baseVIT < D2GetPlayerBaseStat(ptChar, STATS_VITALITY, 0))
|
||||||
|
setFrame(&data, isDownBtn.UnaVIT);
|
||||||
|
else setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, getXUnaVITBtn(), getYUnaVITBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
if ((int)charStats->baseENE < D2GetPlayerBaseStat(ptChar, STATS_ENERGY, 0))
|
||||||
|
setFrame(&data, isDownBtn.UnaENE);
|
||||||
|
else setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, getXUnaENEBtn(), getYUnaENEBtn(), -1, 5, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////// POPUP PRINTING ////////////////////
|
||||||
|
//set MouseX & MouseY
|
||||||
|
DWORD x = D2GetMouseX();
|
||||||
|
DWORD y = D2GetMouseY();
|
||||||
|
|
||||||
|
|
||||||
|
if (isOnCloseBtn(x,y)) // print popup "close"
|
||||||
|
{
|
||||||
|
//lpText = D2GetStringFromIndex(0x1030);
|
||||||
|
//nbPixel = D2GetPixelLen(lpText);
|
||||||
|
//D2PrintPopup(lpText, getXCloseBtn()+getLCloseBtn()/2-nbPixel/2, getYCloseBtn()-getHCloseBtn(), WHITE, 0);
|
||||||
|
D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(x,y)) //print popup "previous page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_PREVIOUS_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(x,y)) //print popup "next page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_NEXT_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnRect(x, y, 0xAD, 0x137, 0x15, 0x13))
|
||||||
|
{
|
||||||
|
if ( version_D2Client <= V110 )
|
||||||
|
{
|
||||||
|
DWORD avgChanceMonsterWillHitYou=53;//TODO
|
||||||
|
if (avgChanceMonsterWillHitYou<5) avgChanceMonsterWillHitYou = 5;
|
||||||
|
else if (avgChanceMonsterWillHitYou>95) avgChanceMonsterWillHitYou = 95;
|
||||||
|
|
||||||
|
int chanceToBlock = D2GetChanceToBlock(ptChar, D2isLODGame());
|
||||||
|
if (chanceToBlock <= 0)
|
||||||
|
{
|
||||||
|
//......TODO
|
||||||
|
chanceToBlock=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int monsterID = D2GetLastMonsterIDFight();
|
||||||
|
MonStatsBIN* monStats = SgptDataTables->monStats + monsterID;
|
||||||
|
d2_assert((monsterID<0) || (monsterID >= (int)SgptDataTables->nbMonStats) || !monStats, "ptStats", __FILE__, __LINE__);
|
||||||
|
LPWSTR monsterStr = D2GetStringFromIndex(monStats->monsterNameID);
|
||||||
|
if (chanceToBlock)
|
||||||
|
swprintf(text,D2GetStringFromIndex(0x2779),chanceToBlock,avgChanceMonsterWillHitYou,monsterStr,avgChanceMonsterWillHitYou);
|
||||||
|
else
|
||||||
|
swprintf(text,D2GetStringFromIndex(0x2778),monsterStr,avgChanceMonsterWillHitYou);
|
||||||
|
//D2swprintf(0x80
|
||||||
|
D2PrintTextPopup(text,0x8B,0xA5,*(BYTE*)0x6FBB1A50,2,WHITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DWORD STDCALL mouseNewStatsPageLeftDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return -1;
|
||||||
|
|
||||||
|
if (!isOnStatsPage(msg->x,msg->y)) return 1;
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if (isOnCloseBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button close\n");
|
||||||
|
isDownBtn.close = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button previous page\n");
|
||||||
|
isDownBtn.previousPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button next page\n");
|
||||||
|
isDownBtn.nextPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (D2GetPlayerBaseStat(ptChar, 4, 0))
|
||||||
|
{
|
||||||
|
if (isOnAssSTRBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button assign strengh\n");
|
||||||
|
isDownBtn.AssSTR = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnAssDEXBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button assign dexterity\n");
|
||||||
|
isDownBtn.AssDEX = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnAssVITBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button assign vitality\n");
|
||||||
|
isDownBtn.AssVIT = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnAssENEBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button assign energy\n");
|
||||||
|
isDownBtn.AssENE = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (active_StatsPoints && !onRealm)
|
||||||
|
{
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
if (isOnUnaSTRBtn(msg->x,msg->y) && ((int)charStats->baseSTR < D2GetPlayerBaseStat(ptChar, STATS_STRENGTH, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push down left button unassign strengh\n");
|
||||||
|
isDownBtn.UnaSTR = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnUnaDEXBtn(msg->x,msg->y) && ((int)charStats->baseDEX < D2GetPlayerBaseStat(ptChar, STATS_DEXTERITY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push down left button unassign dexterity\n");
|
||||||
|
isDownBtn.UnaDEX = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnUnaVITBtn(msg->x,msg->y) && ((int)charStats->baseVIT < D2GetPlayerBaseStat(ptChar, STATS_VITALITY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push down left button unassign vitality\n");
|
||||||
|
isDownBtn.UnaVIT = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnUnaENEBtn(msg->x,msg->y) && ((int)charStats->baseENE < D2GetPlayerBaseStat(ptChar, STATS_ENERGY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push down left button unassign energy\n");
|
||||||
|
isDownBtn.UnaENE = 1;
|
||||||
|
D2PlaySound(5,0,0,0,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
freeMessage(msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sendAssignStats(DWORD code, DWORD nbStatPointsRemaining)
|
||||||
|
{
|
||||||
|
DWORD nbPoints = GetKeyState(VK_SHIFT)<0? nbStatPointsRemaining : 1;
|
||||||
|
if (active_StatsShiftClickLimit && (nbPoints>limitValueToShiftClick))
|
||||||
|
nbPoints = limitValueToShiftClick;
|
||||||
|
while ( nbPoints>0 )
|
||||||
|
{
|
||||||
|
DWORD nbTemp = nbPoints > 0x20 ? 0x20 : nbPoints;
|
||||||
|
D2SendToServer3(0x3A, (WORD)(code + (nbTemp-1)*256));
|
||||||
|
nbPoints -= nbTemp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD STDCALL mouseNewStatsPageLeftUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame() || !D2GetResolution()) return -1;
|
||||||
|
|
||||||
|
if (!isOnStatsPage(msg->x,msg->y)) return 1;
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
DWORD nbStatPointsRemaining = D2GetPlayerBaseStat(ptChar, 4, 0);
|
||||||
|
|
||||||
|
if (isOnCloseBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button close\n");
|
||||||
|
if (isDownBtn.close)
|
||||||
|
D2TogglePage(2,1,0);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button previous page\n");
|
||||||
|
if (isDownBtn.previousPage)
|
||||||
|
{
|
||||||
|
GoStatPage(GetCurrentPage()-1);
|
||||||
|
log_msg("previous page press\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button next page\n");
|
||||||
|
if (isDownBtn.nextPage)
|
||||||
|
{
|
||||||
|
GoNextStatPage();
|
||||||
|
log_msg("next page press\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (nbStatPointsRemaining)
|
||||||
|
{
|
||||||
|
if (isOnAssSTRBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button assign strengh\n");
|
||||||
|
if (isDownBtn.AssSTR)
|
||||||
|
sendAssignStats(0,nbStatPointsRemaining);
|
||||||
|
}
|
||||||
|
else if (isOnAssDEXBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button assign dexterity\n");
|
||||||
|
if (isDownBtn.AssDEX)
|
||||||
|
sendAssignStats(2,nbStatPointsRemaining);
|
||||||
|
}
|
||||||
|
else if (isOnAssVITBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button assign vitality\n");
|
||||||
|
if (isDownBtn.AssVIT)
|
||||||
|
sendAssignStats(3,nbStatPointsRemaining);
|
||||||
|
}
|
||||||
|
else if (isOnAssENEBtn(msg->x,msg->y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button assign energy\n");
|
||||||
|
if (isDownBtn.AssENE)
|
||||||
|
sendAssignStats(1,nbStatPointsRemaining);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (active_StatsPoints && !onRealm)
|
||||||
|
{
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
if (isOnUnaSTRBtn(msg->x,msg->y) && ((int)charStats->baseSTR < D2GetPlayerBaseStat(ptChar, STATS_STRENGTH, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push up left button unassign strengh\n");
|
||||||
|
if (isDownBtn.UnaSTR)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_UNASSIGN_STR_POINTS);
|
||||||
|
else
|
||||||
|
updateServer(US_UNASSIGN_STR_POINT);
|
||||||
|
}
|
||||||
|
else if (isOnUnaDEXBtn(msg->x,msg->y) && ((int)charStats->baseDEX < D2GetPlayerBaseStat(ptChar, STATS_DEXTERITY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push up left button unassign dexterity\n");
|
||||||
|
if (isDownBtn.UnaDEX)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_UNASSIGN_DEX_POINTS);
|
||||||
|
else
|
||||||
|
updateServer(US_UNASSIGN_DEX_POINT);
|
||||||
|
}
|
||||||
|
else if (isOnUnaVITBtn(msg->x,msg->y) && ((int)charStats->baseVIT < D2GetPlayerBaseStat(ptChar, STATS_VITALITY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push up left button unassign vitality\n");
|
||||||
|
if (isDownBtn.UnaVIT)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_UNASSIGN_VIT_POINTS);
|
||||||
|
else
|
||||||
|
updateServer(US_UNASSIGN_VIT_POINT);
|
||||||
|
}
|
||||||
|
else if (isOnUnaENEBtn(msg->x,msg->y) && ((int)charStats->baseENE < D2GetPlayerBaseStat(ptChar, STATS_ENERGY, 0)))
|
||||||
|
{
|
||||||
|
log_msg("push up left button unassign energy\n");
|
||||||
|
if (isDownBtn.UnaENE)
|
||||||
|
if (GetKeyState(VK_SHIFT)<0)
|
||||||
|
updateServer(US_UNASSIGN_ENE_POINTS);
|
||||||
|
else
|
||||||
|
updateServer(US_UNASSIGN_ENE_POINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
D2CleanStatMouseUp();
|
||||||
|
freeMessage(msg);
|
||||||
|
isDownBtn.all=0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
307
PlugY/NewInterface_StatsPageTwo.cpp
Normal file
307
PlugY/NewInterface_StatsPageTwo.cpp
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface stats page 2 functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include "plugYFiles.h"
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define getXCloseBtn() RX(0x110)
|
||||||
|
#define getLCloseBtn() 32
|
||||||
|
#define getYCloseBtn() RY(0x40)
|
||||||
|
#define getHCloseBtn() 32
|
||||||
|
#define isOnCloseBtn(x,y) isOnRect(x, y, getXCloseBtn(), getYCloseBtn(), getLCloseBtn(), getHCloseBtn())
|
||||||
|
|
||||||
|
#define getXPreviousPageBtn() RX(D2GetResolution()?0x19:0x77)//0x70
|
||||||
|
#define getLPreviousPageBtn() 32
|
||||||
|
#define getYPreviousPageBtn() RY(0x40)
|
||||||
|
#define getHPreviousPageBtn() 32
|
||||||
|
#define isOnPreviousPageBtn(x,y) isOnRect(x, y, getXPreviousPageBtn(), getYPreviousPageBtn(), getLPreviousPageBtn(), getHPreviousPageBtn())
|
||||||
|
|
||||||
|
#define getXNextPageBtn() RX(D2GetResolution()?0x43:0xA1)//0x70
|
||||||
|
#define getLNextPageBtn() 32
|
||||||
|
#define getYNextPageBtn() RY(0x40)
|
||||||
|
#define getHNextPageBtn() 32
|
||||||
|
#define isOnNextPageBtn(x,y) isOnRect(x, y, getXNextPageBtn(), getYNextPageBtn(), getLNextPageBtn(), getHNextPageBtn())
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFSIZE 0x80
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD close:1;
|
||||||
|
DWORD previousPage:1;
|
||||||
|
DWORD nextPage:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} isDownBtn;
|
||||||
|
|
||||||
|
|
||||||
|
struct statsInterfaceBIN
|
||||||
|
{
|
||||||
|
WORD enabled;
|
||||||
|
WORD page;
|
||||||
|
WORD x;
|
||||||
|
WORD y;
|
||||||
|
WORD color;
|
||||||
|
WORD font;
|
||||||
|
WORD statsID;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int lastPage;
|
||||||
|
int nbStatsInterface;
|
||||||
|
statsInterfaceBIN* statsInterface;
|
||||||
|
|
||||||
|
void loadStatsInterfaceDesc(DWORD mempool)
|
||||||
|
{
|
||||||
|
log_msg("loadStatsInterfaceDesc(%d)\n",mempool);
|
||||||
|
|
||||||
|
CREATE_TABLE_DESCRIPTION(8);
|
||||||
|
ADD_WORD_FIELD(0, "enabled");
|
||||||
|
ADD_WORD_FIELD(2, "page");
|
||||||
|
ADD_WORD_FIELD(4, "x");
|
||||||
|
ADD_WORD_FIELD(6, "y");
|
||||||
|
ADD_WORD_FIELD(8, "color");
|
||||||
|
ADD_WORD_FIELD(10, "font");
|
||||||
|
// ADD_LOOKUP_WORD(10, "stat", lookupItemStatCost);
|
||||||
|
ADD_WORD_FIELD(12, "statID");
|
||||||
|
ADD_TERM_FIELD();
|
||||||
|
BUILD_BIN(statsInterfaceBIN, statsInterface, nbStatsInterface, "PlugY\\statsinterface.txt");
|
||||||
|
|
||||||
|
lastPage = 0;
|
||||||
|
for (i=0; i<nbStatsInterface; i++)
|
||||||
|
if (statsInterface[i].page > lastPage)
|
||||||
|
lastPage = statsInterface[i].page;
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeStatsInterfaceDesc()
|
||||||
|
{
|
||||||
|
log_msg("freeStatsInterfaceDesc()\n");
|
||||||
|
|
||||||
|
if (statsInterface)
|
||||||
|
{
|
||||||
|
D2FogMemDeAlloc(statsInterface,__FILE__,__LINE__,0);
|
||||||
|
statsInterface = NULL;
|
||||||
|
nbStatsInterface = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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:
|
||||||
|
case STATS_COLDRESIST:
|
||||||
|
case STATS_LIGHTRESIST:
|
||||||
|
case STATS_POISONRESIST:
|
||||||
|
text = D2GetStringFromIndex(getDescStrPos(statID));
|
||||||
|
if (wcslen(text) > 50) return;
|
||||||
|
swprintf(lpText, L"%s +%i%%", text, D2GetPlayerStat(ptChar,statID,0));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
D2PrintStat(ptChar, NULL, statID, 0, D2GetPlayerStat(ptChar,statID,0), lpText);//param2=ptChar->ptStats->ptItemStats
|
||||||
|
}
|
||||||
|
// D2SetFont(1);
|
||||||
|
// if (D2GetPixelLen(lpText)>0x110)
|
||||||
|
// D2SetFont(6);
|
||||||
|
D2PrintString(lpText, x, y, color, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void manageStatLine(Unit* ptChar, statsInterfaceBIN* statLine, int currentPage, LPWSTR lpText)
|
||||||
|
{
|
||||||
|
if (!statLine->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (statLine->page != currentPage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (statLine->font)
|
||||||
|
D2SetFont(statLine->font);
|
||||||
|
|
||||||
|
printStat(ptChar, statLine->statsID, RX(statLine->x), RY(statLine->y), statLine->color, lpText);
|
||||||
|
}
|
||||||
|
|
||||||
|
void STDCALL printNewStatsPageTwo(int currentPage)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame()) return D2PrintStatsPage();
|
||||||
|
|
||||||
|
WCHAR text[BUFSIZE];
|
||||||
|
LPWSTR lpText;
|
||||||
|
bDontPrintBorder = false;
|
||||||
|
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
d2_assert(!ptChar, "Printing stats page : no character selected",__FILE__,__LINE__);
|
||||||
|
d2_assert(ptChar->nUnitType != UNIT_PLAYER, "Printing stats page : bad unit type",__FILE__,__LINE__);
|
||||||
|
|
||||||
|
//Init data for print image
|
||||||
|
sDrawImageInfo data;
|
||||||
|
ZeroMemory(&data,sizeof(data));
|
||||||
|
|
||||||
|
//print background
|
||||||
|
fillRect(RX(0),RY(480),320,432,0,5);//552
|
||||||
|
setImage(&data, newStatsInterfaceImages);
|
||||||
|
setFrame(&data, 0);
|
||||||
|
D2PrintImage(&data, RX(0), RY(224), -1, 5, 0);
|
||||||
|
setFrame(&data, 1);
|
||||||
|
D2PrintImage(&data, RX(256),RY(224), -1, 5, 0);//256
|
||||||
|
setFrame(&data, 2);
|
||||||
|
D2PrintImage(&data, RX(0), RY(48), -1, 5, 0);//432
|
||||||
|
setFrame(&data, 3);
|
||||||
|
D2PrintImage(&data, RX(256),RY(48), -1, 5, 0);
|
||||||
|
|
||||||
|
D2SetFont(1);
|
||||||
|
for (int i=0; i<nbStatsInterface; i++)
|
||||||
|
manageStatLine(ptChar, &statsInterface[i], currentPage, text);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// DWORD x,y;
|
||||||
|
// DWORD curValue;
|
||||||
|
// CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
// DifficultyLevelsBIN* difficultyLevels = D2GetDifficultyLevelsBIN (D2GetDifficultyLevel());
|
||||||
|
//print deadly Strike / Critical Strike
|
||||||
|
x=RX(25);
|
||||||
|
y=RY(445);
|
||||||
|
Unit* ptItem = D2GetSkillItem(ptChar);
|
||||||
|
DWORD cs = ptItem ? D2GetCriticalStrikeFromMasteries(ptChar,ptItem,0,2) : 0;
|
||||||
|
cs = cs>100?100:cs;
|
||||||
|
cs += D2GetPlayerStat(ptChar, STATS_PASSIVE_CRITICAL_STRIKE, 0)*(100-cs)/100;
|
||||||
|
cs = cs>100?100:cs;
|
||||||
|
//SkillDescBIN* skilldesc = SgptDataTables->skilldesc + 9;
|
||||||
|
LPWSTR lpCS = D2GetStringFromIndex(skilldesc->strNameID);
|
||||||
|
|
||||||
|
lpText = D2GetStringFromIndex(getDescStrPos(STATS_ITEM_DEADLYSTRIKE));
|
||||||
|
curValue = D2GetPlayerStat(ptChar, STATS_ITEM_DEADLYSTRIKE, 0);
|
||||||
|
|
||||||
|
cs += curValue*(100-cs)/100;
|
||||||
|
curValue = cs>100?100:cs;
|
||||||
|
|
||||||
|
swprintf(text,L"%i%% %s/%s",curValue,lpCS,lpText);
|
||||||
|
D2SetFont(1);
|
||||||
|
D2SetFont( D2GetPixelLen(text)>0x110 ? 6 : 1);
|
||||||
|
D2PrintString(text, x, y, WHITE, 0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//print background previous/next page buttons
|
||||||
|
setImage(&data, statsBackgroundImages);
|
||||||
|
setFrame(&data, D2GetResolution()?1:0);
|
||||||
|
D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0);
|
||||||
|
|
||||||
|
//print button close
|
||||||
|
setImage(&data, D2LoadBuySelBtn());
|
||||||
|
setFrame(&data, 10 + isDownBtn.close);
|
||||||
|
D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print previous page button
|
||||||
|
setFrame(&data, 12 + isDownBtn.previousPage);
|
||||||
|
D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
//print next page button
|
||||||
|
setFrame(&data, 14 + isDownBtn.nextPage);
|
||||||
|
D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////// POPUP PRINTING ////////////////////
|
||||||
|
//set MouseX & MouseY
|
||||||
|
DWORD mx = D2GetMouseX();
|
||||||
|
DWORD my = D2GetMouseY();
|
||||||
|
|
||||||
|
D2SetFont(1);
|
||||||
|
|
||||||
|
if (isOnCloseBtn(mx,my)) // print popup "close"
|
||||||
|
{
|
||||||
|
D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(mx,my)) //print popup "previous page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_PREVIOUS_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(mx,my)) //print popup "next page"
|
||||||
|
{
|
||||||
|
lpText = getTranslatedString(STR_NEXT_PAGE);
|
||||||
|
D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DWORD STDCALL mouseNewStatsPageTwoLeftDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame()) return -1;
|
||||||
|
|
||||||
|
DWORD x = D2GetMouseX();
|
||||||
|
DWORD y = D2GetMouseY();
|
||||||
|
if (!isOnStatsPage(x,y)) return 1;
|
||||||
|
|
||||||
|
if (isOnCloseBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button close\n");
|
||||||
|
isDownBtn.close = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button previous page\n");
|
||||||
|
isDownBtn.previousPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push down left button next page\n");
|
||||||
|
isDownBtn.nextPage = 1;
|
||||||
|
D2PlaySound(4,0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
freeMessage(msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL mouseNewStatsPageTwoLeftUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame()) return -1;
|
||||||
|
|
||||||
|
DWORD x = D2GetMouseX();
|
||||||
|
DWORD y = D2GetMouseY();
|
||||||
|
if (!isOnStatsPage(x,y)) return 1;
|
||||||
|
|
||||||
|
if (isOnCloseBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button close\n");
|
||||||
|
if (isDownBtn.close)
|
||||||
|
D2TogglePage(2,1,0);
|
||||||
|
}
|
||||||
|
else if (isOnPreviousPageBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button previous page\n");
|
||||||
|
if (isDownBtn.previousPage)
|
||||||
|
GoPreviousStatPage();
|
||||||
|
}
|
||||||
|
else if (isOnNextPageBtn(x,y))
|
||||||
|
{
|
||||||
|
log_msg("push up left button next page\n");
|
||||||
|
if (isDownBtn.nextPage)
|
||||||
|
GoNextStatPage();
|
||||||
|
}
|
||||||
|
D2CleanStatMouseUp();
|
||||||
|
freeMessage(msg);
|
||||||
|
isDownBtn.all=0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
416
PlugY/NewInterfaces.cpp
Normal file
416
PlugY/NewInterfaces.cpp
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "globalVariable.h"
|
||||||
|
#include "updateServer.h" // Install_UpdateServer()
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "interface_Stats.h"// Install_InterfaceStats()
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include "newInterface_Stats.h"
|
||||||
|
#include "newInterface_StatsPageTwo.h"
|
||||||
|
#include "newInterface_Runewords.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
bool active_newInterfaces=false;
|
||||||
|
bool selectMainPageOnOpenning=true;
|
||||||
|
bool printBackgroundOnMainPage=true;
|
||||||
|
|
||||||
|
DWORD bDontPrintBorder=false;
|
||||||
|
|
||||||
|
int selectedPage=0;
|
||||||
|
int lastPage=0;
|
||||||
|
int extraHiddenPage=0;
|
||||||
|
|
||||||
|
void GoNextStatPage()
|
||||||
|
{
|
||||||
|
selectedPage++;
|
||||||
|
if ( selectedPage > lastPage)
|
||||||
|
selectedPage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoPreviousStatPage()
|
||||||
|
{
|
||||||
|
selectedPage--;
|
||||||
|
if ( selectedPage < 0 )
|
||||||
|
selectedPage = lastPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GoStatPage(int page)
|
||||||
|
{
|
||||||
|
if ( (page >= 0) && (page <= lastPage + (D2GetResolution()? extraHiddenPage : 0)) )
|
||||||
|
selectedPage = page;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetCurrentPage()
|
||||||
|
{
|
||||||
|
return selectedPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL printCustomPage()
|
||||||
|
{
|
||||||
|
if(onRealm) {D2PrintStatsPage();return;}
|
||||||
|
if ( (selectedPage > 0) && (selectedPage<=lastPage) )
|
||||||
|
printNewStatsPageTwo(selectedPage);
|
||||||
|
else if (selectedPage == lastPage+1)
|
||||||
|
printRunewordsPage();
|
||||||
|
else if (selectedPage == lastPage+2)
|
||||||
|
printNewStatsPage();
|
||||||
|
else
|
||||||
|
D2PrintStatsPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD STDCALL mouseCustomPageLeftDown(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if(onRealm) return -1;
|
||||||
|
if ( (selectedPage > 0) && (selectedPage<=lastPage) )
|
||||||
|
return mouseNewStatsPageTwoLeftDown(msg);
|
||||||
|
else if (selectedPage == lastPage+1)
|
||||||
|
return mouseRunewordsPageLeftDown(msg);
|
||||||
|
else if (selectedPage == lastPage+2)
|
||||||
|
return mouseNewStatsPageLeftDown(msg);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD STDCALL mouseCustomPageLeftUp(sWinMessage* msg)
|
||||||
|
{
|
||||||
|
if(onRealm) return -1;
|
||||||
|
if ( (selectedPage > 0) && (selectedPage <= lastPage) )
|
||||||
|
return mouseNewStatsPageTwoLeftUp(msg);
|
||||||
|
else if (selectedPage == lastPage+1)
|
||||||
|
return mouseRunewordsPageLeftUp(msg);
|
||||||
|
else if (selectedPage == lastPage+2)
|
||||||
|
return mouseNewStatsPageLeftUp(msg);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_DontPrintBorder_111 )
|
||||||
|
MOV ECX,bDontPrintBorder
|
||||||
|
TEST ECX,ECX
|
||||||
|
JE printBorder
|
||||||
|
MOV bDontPrintBorder,0
|
||||||
|
ADD DWORD PTR SS:[ESP],0xBC
|
||||||
|
RETN
|
||||||
|
printBorder:
|
||||||
|
MOV ECX,0x12
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_DontPrintBorder )
|
||||||
|
MOV ECX,bDontPrintBorder
|
||||||
|
TEST ECX,ECX
|
||||||
|
JE printBorder
|
||||||
|
MOV bDontPrintBorder,0
|
||||||
|
ADD DWORD PTR SS:[ESP],0xB6
|
||||||
|
RETN
|
||||||
|
printBorder:
|
||||||
|
MOV ECX,0x12
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftDown_111 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH ESI
|
||||||
|
CALL mouseCustomPageLeftDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
POP EAX
|
||||||
|
JE end_mouseNewPageLDown
|
||||||
|
JG continue_mouseNewPageLDown
|
||||||
|
LEA ECX,DWORD PTR DS:[EAX+0x80]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLDown:
|
||||||
|
POP EAX
|
||||||
|
ADD EAX,0x143
|
||||||
|
PUSH EDI
|
||||||
|
JMP EAX
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLDown:
|
||||||
|
ADD ESP,4
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftDown )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EDI
|
||||||
|
CALL mouseCustomPageLeftDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
POP EAX
|
||||||
|
JE end_mouseNewPageLDown
|
||||||
|
JG continue_mouseNewPageLDown
|
||||||
|
LEA ECX,DWORD PTR DS:[EAX+0x80]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLDown:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x152
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLDown:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftDown_9 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EDI
|
||||||
|
CALL mouseCustomPageLeftDown
|
||||||
|
TEST EAX,EAX
|
||||||
|
POP EAX
|
||||||
|
JE end_mouseNewPageLDown
|
||||||
|
JG continue_mouseNewPageLDown
|
||||||
|
LEA ECX,DWORD PTR DS:[EAX+0x80]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLDown:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x149
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLDown:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftUp_111 )
|
||||||
|
PUSH EBP
|
||||||
|
CALL mouseCustomPageLeftUp
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE end_mouseNewPageLUp
|
||||||
|
JG continue_mouseNewPageLUp
|
||||||
|
MOV EAX,DWORD PTR DS:[ptWindowStartX]
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLUp:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x2C4
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLUp:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,8
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftUp )
|
||||||
|
PUSH EBP
|
||||||
|
CALL mouseCustomPageLeftUp
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE end_mouseNewPageLUp
|
||||||
|
JG continue_mouseNewPageLUp
|
||||||
|
MOV EAX,DWORD PTR DS:[ptWindowStartX]
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLUp:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1AE
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLUp:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
ADD ESP,8
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_mouseCustomPageLeftUp_9 )
|
||||||
|
PUSH EBP
|
||||||
|
CALL mouseCustomPageLeftUp
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE end_mouseNewPageLUp
|
||||||
|
JG continue_mouseNewPageLUp
|
||||||
|
MOV EAX,DWORD PTR DS:[ptWindowStartX]
|
||||||
|
MOV EAX,DWORD PTR DS:[EAX]
|
||||||
|
RETN
|
||||||
|
continue_mouseNewPageLUp:
|
||||||
|
ADD DWORD PTR SS:[ESP],0x16A
|
||||||
|
RETN
|
||||||
|
end_mouseNewPageLUp:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
POP EBX
|
||||||
|
POP ECX
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_resetSelectedPageByToolBar )
|
||||||
|
MOV selectedPage,0
|
||||||
|
CMP EAX,0x26
|
||||||
|
JNZ noJump
|
||||||
|
ADD DWORD PTR SS:[ESP],0x1F
|
||||||
|
noJump:
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_resetSelectedPageByKey )
|
||||||
|
MOV selectedPage,0
|
||||||
|
POP EAX
|
||||||
|
PUSH EBP
|
||||||
|
XOR EBP,EBP
|
||||||
|
CMP EDX,EBP
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_resetSelectedPage )
|
||||||
|
TEST EAX,EAX
|
||||||
|
SETE DL
|
||||||
|
JNZ END_resetSelectedPage
|
||||||
|
CMP ESI,2
|
||||||
|
JNZ END_resetSelectedPage
|
||||||
|
MOV selectedPage,0
|
||||||
|
END_resetSelectedPage:
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_NewInterfaces()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_UpdateServer();
|
||||||
|
Install_PlugYImagesFiles();
|
||||||
|
Install_PlugYTxtFiles();
|
||||||
|
Install_InterfaceStats();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for new custom page interface. (NewInterfaces)\n");
|
||||||
|
if ( version_D2Client >= V110 )
|
||||||
|
extraHiddenPage=1;
|
||||||
|
|
||||||
|
if (selectMainPageOnOpenning)
|
||||||
|
{
|
||||||
|
if ( version_D2Client >= V111 )
|
||||||
|
{
|
||||||
|
//Reset selectedPage variable on opening stats page
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 0000, 4B79E, 8F73E, 55E0E, 65F5E);
|
||||||
|
memt_byte( 0x83, 0xE8 ); // CALL caller_resetSelectedPage
|
||||||
|
MEMT_REF4( 0x1F7426F8, caller_resetSelectedPageByToolBar);
|
||||||
|
//6FAFB79E > 83F8 26 CMP EAX,26
|
||||||
|
//6FAFB7A1 . 74 1F JE SHORT D2Client.6FAFB7C2
|
||||||
|
//6FB3F73E > 83F8 26 CMP EAX,26
|
||||||
|
//6FB3F741 . 74 1F JE SHORT D2Client.6FB3F762
|
||||||
|
//6FB05E0E > 83F8 26 CMP EAX,26
|
||||||
|
//6FB05E11 . 74 1F JE SHORT D2Client.6FB05E32
|
||||||
|
//6FB15F5E > 83F8 26 CMP EAX,26
|
||||||
|
//6FB15F61 . 74 1F JE SHORT D2Client.6FB15F82
|
||||||
|
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 0000, 1E55A, 6A8FA, A31DA, 3C5EA);
|
||||||
|
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
|
||||||
|
//6FB1A8FA . 55 PUSH EBP
|
||||||
|
//6FB1A8FB . 33ED XOR EBP,EBP
|
||||||
|
//6FB1A8FD . 3BD5 CMP EDX,EBP
|
||||||
|
//6FB531DA . 55 PUSH EBP
|
||||||
|
//6FB531DB . 33ED XOR EBP,EBP
|
||||||
|
//6FB531DD . 3BD5 CMP EDX,EBP
|
||||||
|
//6FAEC5EA . 55 PUSH EBP
|
||||||
|
//6FAEC5EB . 33ED XOR EBP,EBP
|
||||||
|
//6FAEC5ED . 3BD5 CMP EDX,EBP
|
||||||
|
|
||||||
|
|
||||||
|
//For Toggle fct : (not used for open the stat page)
|
||||||
|
// mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218);
|
||||||
|
// memt_byte( 0x3B, 0xE8 );
|
||||||
|
// MEMT_REF4( 0x393974C5, caller_resetSelectedPage_111);
|
||||||
|
// memt_byte( 0x28, 0x90 ); // NOP
|
||||||
|
//6FB51FBE |. 3BC5 CMP EAX,EBP ; Case 2 of switch 6FB51FB8
|
||||||
|
//6FB51FC0 |. 74 39 JE SHORT D2Client.6FB51FFB
|
||||||
|
//6FB51FC2 |. 3928 CMP DWORD PTR DS:[EAX],EBP
|
||||||
|
//6FB1571E |. 3BC5 CMP EAX,EBP ; Case 2 of switch 6FB15718
|
||||||
|
//6FB15720 |. 74 39 JE SHORT D2Client.6FB1575B
|
||||||
|
//6FB15722 |. 3928 CMP DWORD PTR DS:[EAX],EBP
|
||||||
|
//6FB3EF8E |. 3BC5 CMP EAX,EBP ; Case 2 of switch 6FB3EF88
|
||||||
|
//6FB3EF90 |. 74 39 JE SHORT D2Client.6FB3EFCB
|
||||||
|
//6FB3EF92 |. 3928 CMP DWORD PTR DS:[EAX],EBP
|
||||||
|
} else {
|
||||||
|
//Reset selectedPage variable on opening stats page
|
||||||
|
mem_seek R7(D2Client, 88B58, 87ED8, 83478, A1FBE, 6571E, 8EF8E, 0000);//((DWORD)D2TogglePage+0x218);
|
||||||
|
memt_byte( 0x85, 0xE8 ); // CALL caller_resetSelectedPage
|
||||||
|
MEMT_REF4( 0xC2940FC0, caller_resetSelectedPage);
|
||||||
|
//6FB23478 |. 85C0 TEST EAX,EAX
|
||||||
|
//6FB2347A |. 0F94C2 SETE DL
|
||||||
|
//FOR 1.11
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print custom page
|
||||||
|
mem_seek R7(D2Client, 87697, 86A17, 81FAB, A3759, 66B59, 902B9, C3B49);
|
||||||
|
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
|
||||||
|
|
||||||
|
// Don't print Border
|
||||||
|
mem_seek R7(D2Client, 58EF6, 58EF6, 5F4C6, 2D366, B5A46, 82166, 271C6);
|
||||||
|
memt_byte( 0xB9, 0xE8 ); // CALL caller_DontPrintBorder
|
||||||
|
MEMT_REF4( 0x00000012, 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
|
||||||
|
|
||||||
|
// Manage mouse down (Play sound)
|
||||||
|
mem_seek R7(D2Client, 2A9DC, 2A9CC, 312A5, 82736, 891B6, 6B116, BCD36);
|
||||||
|
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x00008088, version_D2Client >= V111 ? caller_mouseCustomPageLeftDown_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftDown : caller_mouseCustomPageLeftDown_9);
|
||||||
|
memt_byte( 0x00, 0x90 ); // NOP
|
||||||
|
//6FAD12A5 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||||
|
//6FB32736 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||||
|
//6FB391B6 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||||
|
//6FB1B116 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||||
|
//6FB6CD36 . 8D88 80000000 LEA ECX,DWORD PTR DS:[EAX+80]
|
||||||
|
|
||||||
|
// Manage mouse up
|
||||||
|
mem_seek R7(D2Client, 2ABBB, 2ABAB, 3148D, 836D9, 8A159, 6C0B9, BDCB9);
|
||||||
|
memt_byte( 0xA1, 0xE8 ); // CALL caller_mouseCustomPageLeftUp
|
||||||
|
MEMT_REF4( ptWindowStartX, version_D2Client >= V111 ? caller_mouseCustomPageLeftUp_111 : version_D2Client == V110 ? caller_mouseCustomPageLeftUp : caller_mouseCustomPageLeftUp_9);
|
||||||
|
//6FAD148D . A1 48A7BB6F MOV EAX,DWORD PTR DS:[6FBBA748]
|
||||||
|
//6FB336D9 . A1 24BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD24]
|
||||||
|
//6FB3A159 . A1 F8BEBC6F MOV EAX,DWORD PTR DS:[6FBCBEF8]
|
||||||
|
//6FB1C0B9 . A1 28BDBC6F MOV EAX,DWORD PTR DS:[6FBCBD28]
|
||||||
|
//6FB6DCB9 . A1 A0B9BC6F MOV EAX,DWORD PTR DS:[6FBCB9A0]
|
||||||
|
|
||||||
|
|
||||||
|
// open page : 6FB23515 |> 892CB5 A8A6BB6>MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EBP
|
||||||
|
//6FB2347D |. 8914B5 A8A6BB6F MOV DWORD PTR DS:[ESI*4+6FBBA6A8],EDX
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
131
PlugY/OthersFeatures.cpp
Normal file
131
PlugY/OthersFeatures.cpp
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Others features.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
bool active_othersFeatures = false;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Remove protect on the save file .d2s
|
||||||
|
mem_seek( offset_D2Game + 0x77080);//6FC8DD5E-6FAA0000
|
||||||
|
memt_byte( 0x74, 0xEB ); // JMP SHORT D2Game.6FC8DD6D
|
||||||
|
//6FC8DD5E 74 0D JE SHORT D2Game.6FC8DD6D
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
void Install_ChangeResolution()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2gfx for . (ChangeResolution)\n");
|
||||||
|
|
||||||
|
// execute if it's our packet else continue
|
||||||
|
mem_seek( offset_D2Client + 0x23ED);//6FAA23EC-6FAA0000
|
||||||
|
memt_dword( 0x280, 0x400 );
|
||||||
|
//6FAA23EC B8 80020000 MOV EAX,280 ; Case 0 of switch 6FAA23C2
|
||||||
|
mem_seek( offset_D2Client + 0x23F7);//6FAA23F1-6FAA0000
|
||||||
|
memt_dword( 0x1E0, 0x300 );
|
||||||
|
//6FAA23F1 C705 F040B76F E0>MOV DWORD PTR DS:[6FB740F0],1E0
|
||||||
|
|
||||||
|
// change resolution
|
||||||
|
mem_seek R7(D2gfx, 4B91, 4B91, 4B61, 0000, 0000, 0000, 0000);
|
||||||
|
memt_dword( 0x280, 0x400 );
|
||||||
|
//6FA74B5D > C74424 14 8002>MOV DWORD PTR SS:[ESP+14],280 ; Case 0 of switch 6FA74B45
|
||||||
|
mem_seek R7(D2gfx, 4B96, 4B96, 4B66, 0000, 0000, 0000, 0000);
|
||||||
|
memt_dword( 0x1E0, 0x300 );
|
||||||
|
//6FA74B65 . B8 E0010000 MOV EAX,1E0
|
||||||
|
|
||||||
|
// refresh size
|
||||||
|
mem_seek( offset_D2Gdi + 0x118F);//6F831189-6F830000
|
||||||
|
memt_dword( 0x280, 0x400 );
|
||||||
|
//6F831189 |> C705 7CC0836F >MOV DWORD PTR DS:[6F83C07C],280
|
||||||
|
mem_seek( offset_D2Gdi + 0x1199);//6F831193-6F830000
|
||||||
|
memt_dword( 0x1E0, 0x300 );
|
||||||
|
//6F831193 |. C705 8CC4836F >MOV DWORD PTR DS:[6F83C48C],1E0
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DWORD SetDisabledStat(Unit* ptItem, Stats* ptStats, DWORD disabled)
|
||||||
|
{
|
||||||
|
if (!ptItem || !ptStats)
|
||||||
|
return 0;
|
||||||
|
if (disabled)
|
||||||
|
{
|
||||||
|
if (!ptStats->isDisabled)
|
||||||
|
{
|
||||||
|
D2PreUpdateDisabledStat(ptStats);
|
||||||
|
ptStats->isDisabled = 1;
|
||||||
|
D2UpdateDisabledStat(ptItem->ptStats,ptStats,1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (ptStats->isDisabled)
|
||||||
|
{
|
||||||
|
D2PreUpdateDisabledStat(ptStats);
|
||||||
|
ptStats->isDisabled = 0;
|
||||||
|
D2UpdateDisabledStat(ptItem->ptStats,ptStats,1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void STDCALL Test2Fct (Unit* ptChar, Unit* ptItem)
|
||||||
|
{
|
||||||
|
SetDisabledStat(ptItem, ptItem->ptStats->ptStatsList, 0);//(DWORD)(rand()/(RAND_MAX+1.0)*2));
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_Test2 )
|
||||||
|
PUSH EDI //ptItem
|
||||||
|
PUSH ESI //ptChar
|
||||||
|
CALL Test2Fct
|
||||||
|
POP ECX
|
||||||
|
PUSH EBX
|
||||||
|
MOV EAX,DWORD PTR DS:[ESI]
|
||||||
|
XOR EBX,EBX
|
||||||
|
JMP ECX
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_Test2()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game. (Test)\n");
|
||||||
|
|
||||||
|
// Test
|
||||||
|
mem_seek( offset_D2Game + 0x1253C);//6FC4253C-6FC30000
|
||||||
|
memt_byte( 0x8B, 0xE8 ); // CALL caller_BnetBtnPress
|
||||||
|
MEMT_REF4( 0xDB335306, caller_Test2);
|
||||||
|
//6FC4253C |> 8B06 MOV EAX,DWORD PTR DS:[ESI]
|
||||||
|
//6FC4253E |. 53 PUSH EBX
|
||||||
|
//6FC4253F |. 33DB XOR EBX,EBX
|
||||||
|
isInstalled = true;
|
||||||
|
}*/
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
void Install_OthersFeatures()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch. (OthersFeatures)\n");
|
||||||
|
|
||||||
|
// Install_ChangeResolution();
|
||||||
|
// Install_Test();
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
818
PlugY/Parameters.cpp
Normal file
818
PlugY/Parameters.cpp
Normal file
@ -0,0 +1,818 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Loading parameters from ini file.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
// Core Class Headers
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "parameters.h" // loadParameters()
|
||||||
|
#include "D2functions.h"
|
||||||
|
#include "INIfile.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define PARAMETERS_FILENAME "PlugY.ini"
|
||||||
|
#define PARAM_FIXED_FILENAME "PlugY\\PlugYFixed.ini"
|
||||||
|
#define PARAM_DEFAULT_FILENAME "PlugY\\PlugYDefault.ini"
|
||||||
|
|
||||||
|
#define BUFSIZE 0x400
|
||||||
|
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "mainScreen.h"
|
||||||
|
#include "skillPerLevelUp.h"
|
||||||
|
#include "statPerLevelUp.h"
|
||||||
|
#include "savePath.h"
|
||||||
|
#include "bigStash.h"
|
||||||
|
#include "skillsPoints.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "othersFeatures.h"
|
||||||
|
#include "newInterfaces.h"
|
||||||
|
#include "worldEvent.h"
|
||||||
|
#include "uberQuest.h"
|
||||||
|
#include "extraOptions.h"
|
||||||
|
#include "commands.h"
|
||||||
|
#include "language.h"
|
||||||
|
extern bool displayGreenSetItemIncludeSharedStash;
|
||||||
|
|
||||||
|
|
||||||
|
char* modDataDirectory = "PlugY";
|
||||||
|
bool active_plugin = true;
|
||||||
|
bool active_DisableBattleNet = true;
|
||||||
|
bool active_CheckMemory = true;
|
||||||
|
bool active_D2Mod = false;
|
||||||
|
char* dllFilenames;
|
||||||
|
|
||||||
|
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_active_Commands = "ActiveCommands";
|
||||||
|
const char* S_active_othersFeatures = "ActiveAllOthersFeatures";
|
||||||
|
|
||||||
|
const char* S_LANGUAGE = "LANGUAGE";
|
||||||
|
const char* S_active_ChangeLanguage = "ActiveChangeLanguage";
|
||||||
|
const char* S_selectedLanguage = "SelectedLanguage";
|
||||||
|
const char* S_active_LanguageManagement = "ActiveLanguageManagement";
|
||||||
|
const char* S_defaultLanguage = "DefaultLanguage";
|
||||||
|
const char* S_availableLanguages = "AvailableLanguages";
|
||||||
|
|
||||||
|
const char* S_SAVEPATH = "SAVEPATH";
|
||||||
|
const char* S_active_changingSavePath = "ActiveSavePathChange";
|
||||||
|
const char* S_savePath = "SavePath";
|
||||||
|
|
||||||
|
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_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_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_posXPreviousBtn = "PosXPreviousBtn";
|
||||||
|
const char* S_posYPreviousBtn = "PosYPreviousBtn";
|
||||||
|
const char* S_posXNextBtn = "PosXNextBtn";
|
||||||
|
const char* S_posYNextBtn = "PosYNextBtn";
|
||||||
|
const char* S_posXSharedBtn = "PosXSharedBtn";
|
||||||
|
const char* S_posYSharedBtn = "PosYSharedBtn";
|
||||||
|
const char* S_posXPreviousIndexBtn = "PosXPreviousIndexBtn";
|
||||||
|
const char* S_posYPreviousIndexBtn = "PosYPreviousIndexBtn";
|
||||||
|
const char* S_posXNextIndexBtn = "PosXNextIndexBtn";
|
||||||
|
const char* S_posYNextIndexBtn = "PosYNextIndexBtn";
|
||||||
|
const char* S_posXPutGoldBtn = "PosXPutGoldBtn";
|
||||||
|
const char* S_posYPutGoldBtn = "PosYPutGoldBtn";
|
||||||
|
const char* S_posXTakeGoldBtn = "PosXTakeGoldBtn";
|
||||||
|
const char* S_posYTakeGoldBtn = "PosYTakeGoldBtn";
|
||||||
|
|
||||||
|
const char* S_STATS_POINTS = "STATS POINTS";
|
||||||
|
const char* S_active_StatsPoints = "ActiveStatsUnassignment";
|
||||||
|
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_WORLD_EVENT = "WORLD EVENT";
|
||||||
|
const char* S_active_WorldEvent = "ActiveWorldEvent";
|
||||||
|
const char* S_showSOJSoldCounterInAllDiff = "ShowCounterInAllDifficulty";
|
||||||
|
const char* S_itemsToSell = "ItemsToSell";
|
||||||
|
const char* S_worldEventmonsterID = "MonsterID";
|
||||||
|
const char* S_valueOfOwnSOJSold = "OwnSOJSoldChargeFor";
|
||||||
|
const char* S_valueInitSOJSoldMin = "InititalSOJSoldMin";
|
||||||
|
const char* S_valueInitSOJSoldDelta = "InititalSOJSoldMax";
|
||||||
|
const char* S_triggerAtSolJSoldMin = "TriggerAtEachSOJSoldMin";
|
||||||
|
const char* S_triggerAtSolJSoldDelta = "TriggerAtEachSOJSoldMax";
|
||||||
|
const char* S_active_AutomaticSell = "ActiveAutoSell";
|
||||||
|
const char* S_timeBeforeAutoSellMin = "TimeBeforeAutoSellMin";
|
||||||
|
const char* S_timeBeforeAutoSellDelta = "TimeBeforeAutoSellMax";
|
||||||
|
|
||||||
|
const char* S_UBER_QUEST = "UBER QUEST";
|
||||||
|
const char* S_active_UberQuest = "ActiveUberQuest";
|
||||||
|
|
||||||
|
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_INTERFACE = "INTERFACE";
|
||||||
|
const char* S_active_newInterfaces = "ActiveNewStatsInterface";
|
||||||
|
const char* S_selectMainPageOnOpenning = "SelectMainPageOnOpenning";
|
||||||
|
const char* S_printBackgroundOnMainPage = "PrintButtonsBackgroundOnMainStatsPage";
|
||||||
|
|
||||||
|
const char* S_EXTRA = "EXTRA";
|
||||||
|
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_DLL = "DLL:\t";
|
||||||
|
const char* S_DEFAULT = "DEFAULT:";
|
||||||
|
const char* S_USER = "USER:\t";
|
||||||
|
const char* S_FIXED = "FIXED:\t";
|
||||||
|
|
||||||
|
|
||||||
|
#define GET_PRIVATE_PROFILE_STRING(S,F,D)\
|
||||||
|
if (!iniFixedFile->GetPrivateProfileString(S, F, NULL, buffer, maxSize)) \
|
||||||
|
if (!iniFile->GetPrivateProfileString(S, F, NULL, buffer, maxSize)) \
|
||||||
|
if (!iniDefaultFile->GetPrivateProfileString(S, F, D, buffer, maxSize)) \
|
||||||
|
log_msg(S_DLL); \
|
||||||
|
else log_msg(S_DEFAULT); \
|
||||||
|
else log_msg(S_USER); \
|
||||||
|
else log_msg(S_FIXED)
|
||||||
|
|
||||||
|
#define GET_PRIVATE_PROFILE_STRING2(S,F,D)\
|
||||||
|
if (!iniFile->GetPrivateProfileString(S, F, NULL, buffer, maxSize)) \
|
||||||
|
if (!iniDefaultFile->GetPrivateProfileString(S, F, D, buffer, maxSize)) \
|
||||||
|
log_msg(S_DLL); \
|
||||||
|
else log_msg(S_DEFAULT); \
|
||||||
|
else log_msg(S_USER)
|
||||||
|
|
||||||
|
|
||||||
|
#define GET_PRIVATE_PROFILE_STRING3(S,F,D)\
|
||||||
|
if (!iniFile->GetPrivateProfileString(S, F, NULL, buffer, maxSize)) \
|
||||||
|
if (!iniFixedFile->GetPrivateProfileString(S, F, NULL, buffer, maxSize)) \
|
||||||
|
if (!iniDefaultFile->GetPrivateProfileString(S, F, D, buffer, maxSize)) \
|
||||||
|
log_msg(S_DLL); \
|
||||||
|
else log_msg(S_DEFAULT); \
|
||||||
|
else log_msg(S_FIXED); \
|
||||||
|
else log_msg(S_USER)
|
||||||
|
|
||||||
|
|
||||||
|
void init_ActivePlugin(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
iniFixedFile->GetPrivateProfileString(S_GENERAL, S_active_plugin, "0", buffer, maxSize);
|
||||||
|
active_plugin = atoi(buffer) != 0;
|
||||||
|
if (!active_plugin)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING2(S_GENERAL, S_active_plugin, "1");
|
||||||
|
active_plugin = atoi(buffer) != 0;
|
||||||
|
} else log_msg(S_FIXED);
|
||||||
|
log_msg("active_plugin\t\t\t\t= %u\n", active_plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_General(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_DisableBattleNet, "0");
|
||||||
|
active_DisableBattleNet = atoi(buffer) != 0;
|
||||||
|
log_msg("active_DisableBattleNet\t\t\t\t= %d\n", active_DisableBattleNet);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_logFile, "0");
|
||||||
|
active_logFile = atoi(buffer)+1;
|
||||||
|
log_msg("active_logFile\t\t\t\t= %d\n", active_logFile-1);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_Commands, "0");
|
||||||
|
active_Commands = atoi(buffer) != 0;
|
||||||
|
log_msg("active_Commands\t\t\t\t= %d\n", active_Commands);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_CheckMemory, "1");
|
||||||
|
active_CheckMemory = atoi(buffer) != 0;
|
||||||
|
log_msg("active_CheckMemory\t\t\t= %d\n", active_CheckMemory);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_GENERAL, S_active_othersFeatures, "0");
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_ActiveLanguage(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_LANGUAGE, S_active_ChangeLanguage, "0");
|
||||||
|
active_ChangeLanguage = atoi(buffer) != 0;
|
||||||
|
log_msg("active_ChangeLanguage\t\t= %d\n", active_ChangeLanguage);
|
||||||
|
|
||||||
|
if (active_ChangeLanguage)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_LANGUAGE, S_selectedLanguage, "ENG");
|
||||||
|
strupr(buffer);
|
||||||
|
switch (*(DWORD*)buffer)
|
||||||
|
{
|
||||||
|
case BIN('E','N','G',0) : selectedLanguage=LNG_ENG;break;
|
||||||
|
case BIN('E','S','P',0) : selectedLanguage=LNG_ESP;break;
|
||||||
|
case BIN('D','E','U',0) : selectedLanguage=LNG_DEU;break;
|
||||||
|
case BIN('F','R','A',0) : selectedLanguage=LNG_FRA;break;
|
||||||
|
case BIN('P','O','R',0) : selectedLanguage=LNG_POR;break;
|
||||||
|
case BIN('I','T','A',0) : selectedLanguage=LNG_ITA;break;
|
||||||
|
case BIN('J','P','N',0) : selectedLanguage=LNG_JPN;break;
|
||||||
|
case BIN('K','O','R',0) : selectedLanguage=LNG_KOR;break;
|
||||||
|
case BIN('S','I','N',0) : selectedLanguage=LNG_SIN;break;
|
||||||
|
case BIN('C','H','I',0) : selectedLanguage=LNG_CHI;break;
|
||||||
|
case BIN('P','O','L',0) : selectedLanguage=LNG_POL;break;
|
||||||
|
case BIN('R','U','S',0) : selectedLanguage=LNG_RUS;break;
|
||||||
|
default: active_ChangeLanguage = false;
|
||||||
|
log_msg("active_ChangeLanguage\t\t= %d (because bad language string : %s)\n", active_ChangeLanguage, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (active_ChangeLanguage)
|
||||||
|
log_msg("selectedLanguage\t\t\t= %u\n", selectedLanguage);
|
||||||
|
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_LANGUAGE, S_active_LanguageManagement, "0");
|
||||||
|
active_LanguageManagement = atoi(buffer) != 0;
|
||||||
|
log_msg("active_LanguageManagement\t= %d\n", active_LanguageManagement);
|
||||||
|
|
||||||
|
if (active_LanguageManagement)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_LANGUAGE, S_defaultLanguage, "ENG");
|
||||||
|
strupr(buffer);
|
||||||
|
switch (*(DWORD*)buffer)
|
||||||
|
{
|
||||||
|
case BIN('E','N','G',0) : defaultLanguage=LNG_ENG;break;
|
||||||
|
case BIN('E','S','P',0) : defaultLanguage=LNG_ESP;break;
|
||||||
|
case BIN('D','E','U',0) : defaultLanguage=LNG_DEU;break;
|
||||||
|
case BIN('F','R','A',0) : defaultLanguage=LNG_FRA;break;
|
||||||
|
case BIN('P','O','R',0) : defaultLanguage=LNG_POR;break;
|
||||||
|
case BIN('I','T','A',0) : defaultLanguage=LNG_ITA;break;
|
||||||
|
case BIN('J','P','N',0) : defaultLanguage=LNG_JPN;break;
|
||||||
|
case BIN('K','O','R',0) : defaultLanguage=LNG_KOR;break;
|
||||||
|
case BIN('S','I','N',0) : defaultLanguage=LNG_SIN;break;
|
||||||
|
case BIN('C','H','I',0) : defaultLanguage=LNG_CHI;break;
|
||||||
|
case BIN('P','O','L',0) : defaultLanguage=LNG_POL;break;
|
||||||
|
case BIN('R','U','S',0) : defaultLanguage=LNG_RUS;break;
|
||||||
|
default: defaultLanguage=LNG_ENG;
|
||||||
|
}
|
||||||
|
log_msg("defaultLanguage\t\t\t= %d\n", defaultLanguage);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_LANGUAGE, S_availableLanguages, "ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS");
|
||||||
|
availableLanguages.all = 0;
|
||||||
|
strupr(buffer);
|
||||||
|
char* curString = strtok(buffer,"|");
|
||||||
|
while (curString)
|
||||||
|
{
|
||||||
|
switch (*(DWORD*)curString)
|
||||||
|
{
|
||||||
|
case BIN('E','N','G',0) : availableLanguages.eng=1;break;
|
||||||
|
case BIN('E','S','P',0) : availableLanguages.esp=1;break;
|
||||||
|
case BIN('D','E','U',0) : availableLanguages.deu=1;break;
|
||||||
|
case BIN('F','R','A',0) : availableLanguages.fra=1;break;
|
||||||
|
case BIN('P','O','R',0) : availableLanguages.por=1;break;
|
||||||
|
case BIN('I','T','A',0) : availableLanguages.ita=1;break;
|
||||||
|
case BIN('J','P','N',0) : availableLanguages.jpn=1;break;
|
||||||
|
case BIN('K','O','R',0) : availableLanguages.kor=1;break;
|
||||||
|
case BIN('S','I','N',0) : availableLanguages.sin=1;break;
|
||||||
|
case BIN('C','H','I',0) : availableLanguages.chi=1;break;
|
||||||
|
case BIN('P','O','L',0) : availableLanguages.pol=1;break;
|
||||||
|
case BIN('R','U','S',0) : availableLanguages.rus=1;break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
curString=strtok(NULL,"|");
|
||||||
|
}
|
||||||
|
log_msg("availableLanguage.all\t\t= 0x%04X\n\n",availableLanguages.all);
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
active_changingSavePath = atoi(buffer) != 0;
|
||||||
|
log_msg("active_changingSavePath\t\t= %u\n", active_changingSavePath);
|
||||||
|
|
||||||
|
if (active_changingSavePath)
|
||||||
|
{
|
||||||
|
int curSize = 0;
|
||||||
|
int start = 0;
|
||||||
|
GET_PRIVATE_PROFILE_STRING3(S_SAVEPATH, S_savePath, "Save\\");
|
||||||
|
|
||||||
|
while (buffer[curSize])
|
||||||
|
curSize++;
|
||||||
|
|
||||||
|
if ( (curSize>0) && buffer[curSize-1] != (BYTE)'\\')
|
||||||
|
{
|
||||||
|
buffer[curSize++] = (BYTE)'\\';
|
||||||
|
buffer[curSize]='\0';
|
||||||
|
}
|
||||||
|
while (buffer[start] == '\\')
|
||||||
|
start++;
|
||||||
|
|
||||||
|
if (!buffer[start])
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer[start+1]!=':')
|
||||||
|
{
|
||||||
|
char buf[MAX_PATH];
|
||||||
|
buf[0]=NULL;
|
||||||
|
D2FogGetInstallPath(buf,MAX_PATH);
|
||||||
|
savePath = (char*)D2FogMemAlloc(strlen(buf) + curSize - start + 1,__FILE__,__LINE__,0);
|
||||||
|
strcpy(savePath,buf);
|
||||||
|
strcat(savePath,&buffer[start]);
|
||||||
|
} else {
|
||||||
|
savePath = (char*)D2FogMemAlloc(curSize-start+1,__FILE__,__LINE__,0);
|
||||||
|
strcpy(savePath,&buffer[start]);
|
||||||
|
}
|
||||||
|
log_msg("savePath\t\t\t\t\t= %s\n", savePath);
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
active_VersionTextChange = atoi(buffer) != 0;
|
||||||
|
log_msg("active_VersionTextChange\t= %u\n", active_VersionTextChange);
|
||||||
|
|
||||||
|
if (active_VersionTextChange)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_versionText, versionText);
|
||||||
|
if (!buffer[0])
|
||||||
|
{
|
||||||
|
switch(version_D2Game)
|
||||||
|
{
|
||||||
|
case V109b: strcpy(buffer, "v 1.09b");break;
|
||||||
|
case V109d: strcpy(buffer, "v 1.09d");break;
|
||||||
|
//case V110: strcpy(buffer, "v 1.10");break;
|
||||||
|
//case V111: strcpy(buffer, "v 1.11");break;
|
||||||
|
case V111b: strcpy(buffer, "v 1.11b");break;
|
||||||
|
default:
|
||||||
|
active_VersionTextChange=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
versionText = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
|
||||||
|
strcpy(versionText,buffer);
|
||||||
|
log_msg("versionText\t\t\t\t\t= %s\n", versionText);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_modVersionColor, "0");
|
||||||
|
modVersionColor = atoi(buffer);
|
||||||
|
log_msg("modVersionColor\t\t\t\t= %u\n", modVersionColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_active_PrintPlugYVersion, "1");
|
||||||
|
active_PrintPlugYVersion = atoi(buffer) != 0;
|
||||||
|
log_msg("active_PrintPlugYVersion\t= %u\n", active_PrintPlugYVersion);
|
||||||
|
|
||||||
|
|
||||||
|
if (active_PrintPlugYVersion)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_MAIN_SCREEN, S_colorOfPlugYVersion, "4");
|
||||||
|
colorOfPlugYVersion = atoi(buffer);
|
||||||
|
log_msg("colorOfPlugYVersion\t\t\t= %u\n", colorOfPlugYVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_Stash(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_bigStash, "0");
|
||||||
|
active_bigStash = atoi(buffer) != 0;
|
||||||
|
log_msg("active_bigStash\t\t\t\t= %u\n", active_bigStash);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_multiPageStash, "0");
|
||||||
|
active_multiPageStash = atoi(buffer) != 0;
|
||||||
|
log_msg("active_multiPageStash\t\t= %u\n", active_multiPageStash);
|
||||||
|
|
||||||
|
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);
|
||||||
|
if (!nbPagesPerIndex) nbPagesPerIndex=10;
|
||||||
|
log_msg("nbPagesPerIndex\t\t\t\t= %u\n", nbPagesPerIndex);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_nbPagesPerIndex2, "100");
|
||||||
|
nbPagesPerIndex2 = atoi(buffer);
|
||||||
|
if (!nbPagesPerIndex2) nbPagesPerIndex2=100;
|
||||||
|
log_msg("nbPagesPerIndex2\t\t\t= %u\n", nbPagesPerIndex2);
|
||||||
|
|
||||||
|
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_maxSharedPages, "0");
|
||||||
|
maxSharedPages = atoi(buffer) - 1;
|
||||||
|
log_msg("maxSharedPages\t\t\t\t= %u\n", maxSharedPages);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_sharedStashFilename, "SharedStashSave");
|
||||||
|
sharedStashFilename = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
|
||||||
|
strcpy(sharedStashFilename, buffer);
|
||||||
|
log_msg("sharedStashFilename\t\t\t= %s\n", sharedStashFilename);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_separateHardSoftStash, "1");
|
||||||
|
separateHardSoftStash = atoi(buffer) != 0;
|
||||||
|
log_msg("separateHardSoftStash\t\t= %u\n", separateHardSoftStash);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_displaySharedSetItemNameInGreen, "1");
|
||||||
|
displaySharedSetItemNameInGreen = atoi(buffer) != 0;
|
||||||
|
log_msg("displaySharedSetItemNameInGreen = %u\n", displaySharedSetItemNameInGreen);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STASH, S_active_sharedGold, "1");
|
||||||
|
active_sharedGold = atoi(buffer) != 0;
|
||||||
|
log_msg("active_sharedGold\t\t\t= %u\n", active_sharedGold);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_StatsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STATS_POINTS, S_active_StatsPoints, "0");
|
||||||
|
active_StatsPoints = atoi(buffer) != 0;
|
||||||
|
log_msg("active_StatsPoints\t\t\t= %u\n", active_StatsPoints);
|
||||||
|
|
||||||
|
if (active_StatsPoints)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STATS_POINTS, S_keyUsedForUnassignStatPoint, "18");
|
||||||
|
keyUsedForUnassignStatPoint = atoi(buffer);
|
||||||
|
log_msg("keyUsedForUnassignStatPoint\t= %u (0x%x)\n", keyUsedForUnassignStatPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STATS_POINTS, S_active_StatsShiftClickLimit, "0");
|
||||||
|
active_StatsShiftClickLimit = atoi(buffer) != 0;
|
||||||
|
log_msg("active_StatsShiftClickLimit\t= %u\n", active_StatsShiftClickLimit);
|
||||||
|
|
||||||
|
if (active_StatsShiftClickLimit)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STATS_POINTS, S_limitValueToShiftClick, "5");
|
||||||
|
limitValueToShiftClick = atoi(buffer);
|
||||||
|
log_msg("limitValueToShiftClick\t\t= %u\n", limitValueToShiftClick);
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
active_StatPerLevelUpChange = atoi(buffer) != 0;
|
||||||
|
log_msg("active_StatPerLevelUpChange\t= %u\n", active_StatPerLevelUpChange);
|
||||||
|
|
||||||
|
if (active_StatPerLevelUpChange)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_STAT_ON_LEVEL_UP, S_statPerLevelUp, "5");
|
||||||
|
statPerLevelUp = atoi(buffer);
|
||||||
|
log_msg("statPerLevelUp\t\t\t\t= %u\n", statPerLevelUp);
|
||||||
|
}
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_SkillsPoints(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_active_SkillsPoints, "0");
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
active_SkillsPoints = true;
|
||||||
|
log_msg("active_SkillsPoints\t\t\t= %d\n", active_SkillsPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posXUnassignSkillBtn,"-1");
|
||||||
|
posXUnassignSkillBtn = atoi(buffer);
|
||||||
|
log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posXUnassignSkillBtn);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_SKILLS_POINTS, S_posYUnassignSkillBtn,"-1");
|
||||||
|
posYUnassignSkillBtn = atoi(buffer);
|
||||||
|
log_msg("posXUnassignSkillBtn\t\t\t= %d\n", posYUnassignSkillBtn);
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_SkillPerLevelUp(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_SKILL_ON_LEVEL_UP, S_active_SkillPerLevelUpChange, "0");
|
||||||
|
active_SkillPerLevelUpChange = atoi(buffer) != 0;
|
||||||
|
log_msg("active_SkillPerLevelUpChange= %u\n", active_SkillPerLevelUpChange);
|
||||||
|
|
||||||
|
if (active_SkillPerLevelUpChange)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_SKILL_ON_LEVEL_UP, S_skillPerLevelUp, "1");
|
||||||
|
skillPerLevelUp = atoi(buffer);
|
||||||
|
log_msg("skillPerLevelUp\t\t\t\t= %u\n", skillPerLevelUp);
|
||||||
|
}
|
||||||
|
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)) ) {
|
||||||
|
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
|
||||||
|
log_msg("active_WorldEvent\t\t\t= %d\n", active_WorldEvent);
|
||||||
|
|
||||||
|
if (active_WorldEvent)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_showSOJSoldCounterInAllDiff, "0");
|
||||||
|
showSOJSoldCounterInAllDiff = atoi(buffer);
|
||||||
|
log_msg("showSOJSoldCounterInAllDiff\t= %d\n", showSOJSoldCounterInAllDiff);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_itemsToSell, itemsToSell);
|
||||||
|
if (strlen(buffer)>50) buffer[50]='\0';
|
||||||
|
itemsToSell = (char*)D2FogMemAlloc(strlen(buffer)+1,__FILE__,__LINE__,0);
|
||||||
|
strcpy(itemsToSell,buffer);
|
||||||
|
log_msg("itemsToSell\t\t\t\t\t= %s\n", itemsToSell);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_worldEventmonsterID, "333");
|
||||||
|
worldEventmonsterID = atoi(buffer);
|
||||||
|
log_msg("worldEventmonsterID\t\t\t= %d\n", worldEventmonsterID);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_valueOfOwnSOJSold, "100");
|
||||||
|
valueOfOwnSOJSold = atoi(buffer);
|
||||||
|
log_msg("valueOfOwnSOJSold\t\t\t= %d\n", valueOfOwnSOJSold);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_valueInitSOJSoldMin, "200");
|
||||||
|
valueInitSOJSoldMin = atoi(buffer);
|
||||||
|
log_msg("valueInitSOJSoldMin\t\t\t= %d\n", valueInitSOJSoldMin);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_valueInitSOJSoldDelta, "3000");
|
||||||
|
valueInitSOJSoldDelta = atoi(buffer)-valueInitSOJSoldMin+1;
|
||||||
|
log_msg("valueInitSOJSoldDelta\t\t= %d\n", valueInitSOJSoldDelta);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_triggerAtSolJSoldMin, "75");
|
||||||
|
triggerAtSolJSoldMin = atoi(buffer);
|
||||||
|
log_msg("triggerAtSolJSoldMin\t\t= %d\n", triggerAtSolJSoldMin);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_triggerAtSolJSoldDelta, "125");
|
||||||
|
triggerAtSolJSoldDelta = atoi(buffer)-triggerAtSolJSoldMin+1;
|
||||||
|
log_msg("triggerAtSolJSoldDelta\t\t= %d\n", triggerAtSolJSoldDelta);
|
||||||
|
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_active_AutomaticSell, "1");
|
||||||
|
active_AutomaticSell = atoi(buffer) != 0;
|
||||||
|
log_msg("active_AutomaticSell\t\t= %d\n", active_AutomaticSell);
|
||||||
|
|
||||||
|
if (active_AutomaticSell)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_timeBeforeAutoSellMin, "0");
|
||||||
|
timeBeforeAutoSellMin = atoi(buffer)*1000;
|
||||||
|
log_msg("timeBeforeAutoSellMin\t\t= %d\n", timeBeforeAutoSellMin);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_WORLD_EVENT, S_timeBeforeAutoSellDelta, "1200");
|
||||||
|
timeBeforeAutoSellDelta = atoi(buffer)*1000-timeBeforeAutoSellMin+1;
|
||||||
|
log_msg("timeBeforeAutoSellDelta\t\t= %d\n", timeBeforeAutoSellDelta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_UberQuest(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
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)) ) {
|
||||||
|
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);
|
||||||
|
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");
|
||||||
|
active_newInterfaces = atoi(buffer) != 0;
|
||||||
|
log_msg("active_newInterfaces\t\t= %d\n", active_newInterfaces);
|
||||||
|
|
||||||
|
if (active_newInterfaces)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_INTERFACE, S_selectMainPageOnOpenning, "1");
|
||||||
|
selectMainPageOnOpenning = atoi(buffer) != 0;
|
||||||
|
log_msg("selectMainPageOnOpenning\t= %u\n", selectMainPageOnOpenning);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_INTERFACE, S_printBackgroundOnMainPage, "1");
|
||||||
|
printBackgroundOnMainPage = atoi(buffer) != 0;
|
||||||
|
log_msg("printBackgroundOnMainPage\t= %u\n", printBackgroundOnMainPage);
|
||||||
|
}
|
||||||
|
log_msg("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void init_ExtraOptions(INIFile* iniFile, INIFile* iniFixedFile, INIFile* iniDefaultFile, char* buffer, DWORD maxSize)
|
||||||
|
{
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_alwaysRegenMapInSP, "0");
|
||||||
|
active_alwaysRegenMapInSP = atoi(buffer);
|
||||||
|
log_msg("active_alwaysRegenMapInSP\t= %d\n", active_alwaysRegenMapInSP);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_nbPlayersCommandByDefault, "0");
|
||||||
|
nbPlayersCommandByDefault = atoi(buffer);
|
||||||
|
if (version_D2Common == V110)
|
||||||
|
{if (nbPlayersCommandByDefault > 8) nbPlayersCommandByDefault=8;}
|
||||||
|
else if (nbPlayersCommandByDefault > 64) nbPlayersCommandByDefault=64;
|
||||||
|
log_msg("nbPlayersCommandByDefault\t= %d\n", nbPlayersCommandByDefault);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayItemLevel, "0");
|
||||||
|
active_DisplayItemLevel = atoi(buffer);
|
||||||
|
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);
|
||||||
|
log_msg("active_EnabledTXTFilesWithMSExcel= %u\n\n", active_EnabledTXTFilesWithMSExcel);
|
||||||
|
|
||||||
|
GET_PRIVATE_PROFILE_STRING(S_EXTRA, S_active_DisplayBaseStatsValue, "0");
|
||||||
|
active_DisplayBaseStatsValue = atoi(buffer);
|
||||||
|
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 = 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);
|
||||||
|
} 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);
|
||||||
|
log_msg("active_EnabledCowPortalWhenCowKingWasKill= %u\n\n", active_EnabledCowPortalWhenCowKingWasKill);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void loadParameters()
|
||||||
|
{
|
||||||
|
char buffer[BUFSIZE];
|
||||||
|
int loading=0;
|
||||||
|
INIFile *iniFile = new INIFile;
|
||||||
|
INIFile *iniFixedFile = new INIFile;
|
||||||
|
INIFile *iniDefaultFile = new INIFile;
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
log_msg("***** PARAMETERS *****\n");
|
||||||
|
if (iniFile->InitReadWrite(PARAMETERS_FILENAME, INIFILE_READ, 0))
|
||||||
|
{
|
||||||
|
log_msg("Parameters file is opened.\n\n");
|
||||||
|
loading = 1;
|
||||||
|
}
|
||||||
|
if (iniFixedFile->InitReadWrite(PARAM_FIXED_FILENAME, INIFILE_MPQREAD, 0))
|
||||||
|
{
|
||||||
|
log_msg("Fixed Parameters file is opened.\n\n");
|
||||||
|
loading = 1;
|
||||||
|
}
|
||||||
|
if (iniDefaultFile->InitReadWrite(PARAM_DEFAULT_FILENAME, INIFILE_MPQREAD, 0))
|
||||||
|
{
|
||||||
|
log_msg("Default Parameters file is opened.\n\n");
|
||||||
|
loading = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(loading)
|
||||||
|
{
|
||||||
|
log_msg("Reading parameters.\n\n");
|
||||||
|
init_ActivePlugin(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
if (active_plugin)
|
||||||
|
{
|
||||||
|
init_General(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_ActiveLanguage(iniFile, iniFixedFile, iniDefaultFile, buffer,BUFSIZE);
|
||||||
|
init_SavePath(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_VersionText(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_Stash(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_StatsPoints(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_StatPerLevelUp(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_SkillsPoints(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_SkillPerLevelUp(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_WorldEvent(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_UberQuest(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_NewInterfaces(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
init_ExtraOptions(iniFile, iniFixedFile, iniDefaultFile, buffer, BUFSIZE);
|
||||||
|
}
|
||||||
|
log_msg("Reading parameters end.\n\n\n");
|
||||||
|
} else {
|
||||||
|
log_msg("\nCan't open parameters files: Default values used.\n\n\n");
|
||||||
|
active_plugin = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iniFile)
|
||||||
|
iniFile->close();
|
||||||
|
if (iniFixedFile)
|
||||||
|
iniFixedFile->close();
|
||||||
|
if (iniDefaultFile)
|
||||||
|
iniDefaultFile->close();
|
||||||
|
|
||||||
|
|
||||||
|
delete iniFile;
|
||||||
|
delete iniDefaultFile;
|
||||||
|
delete iniFixedFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
403
PlugY/PlayerCustomData.cpp
Normal file
403
PlugY/PlayerCustomData.cpp
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Adding custom data.
|
||||||
|
Save and load infinity & shared Stash
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "updateClient.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "savePlayerData.h" //Install_SavePlayerData()
|
||||||
|
#include "loadPlayerData.h" //Install_LoadPlayerData()
|
||||||
|
|
||||||
|
bool active_PlayerCustomData = true;
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************** UPDATING ***********************************/
|
||||||
|
|
||||||
|
Stash* getStashFromItem(Unit* ptChar, Unit* ptItem)
|
||||||
|
{
|
||||||
|
Stash* curStash = PCPY->selfStash;
|
||||||
|
Unit* curItem;
|
||||||
|
while (curStash)
|
||||||
|
{
|
||||||
|
if (curStash == PCPY->currentStash)
|
||||||
|
curItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
else curItem = curStash->ptListItem;
|
||||||
|
while (curItem)
|
||||||
|
{
|
||||||
|
if (D2GetRealItem(curItem) == ptItem) return curStash;
|
||||||
|
curItem = D2UnitGetNextItem(curItem);
|
||||||
|
}
|
||||||
|
curStash = curStash->nextStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
curStash = PCPY->sharedStash;
|
||||||
|
while (curStash)
|
||||||
|
{
|
||||||
|
if (curStash == PCPY->currentStash)
|
||||||
|
curItem = D2InventoryGetFirstItem(PCInventory);
|
||||||
|
else curItem = curStash->ptListItem;
|
||||||
|
while (curItem)
|
||||||
|
{
|
||||||
|
if (D2GetRealItem(curItem) == ptItem) return curStash;
|
||||||
|
curItem = D2UnitGetNextItem(curItem);
|
||||||
|
}
|
||||||
|
curStash = curStash->nextStash;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Unit* FASTCALL updateItem(Game* ptGame, DWORD type, DWORD itemNum, Unit* ptChar)
|
||||||
|
{
|
||||||
|
Unit* ptItem = D2GameGetObject(ptGame, type, itemNum);
|
||||||
|
if (ptGame->isLODGame && (D2ItemGetPage(ptItem) == 4))
|
||||||
|
{
|
||||||
|
Stash* ptStash = getStashFromItem(ptChar, ptItem);
|
||||||
|
if (!ptStash) return NULL;
|
||||||
|
selectStash(ptChar, ptStash);
|
||||||
|
}
|
||||||
|
return ptItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL updateClientPlayerOnLoading(Unit* ptChar)
|
||||||
|
{
|
||||||
|
log_msg("--- Start updateClientPlayerOnLoading ---\n");
|
||||||
|
if (PCGame->isLODGame)
|
||||||
|
{
|
||||||
|
selectStash(ptChar, PCPY->selfStash);
|
||||||
|
log_msg("End update client on loading.\n\n");
|
||||||
|
}
|
||||||
|
updateClient(ptChar, UC_SHARED_GOLD, PCPY->sharedGold, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************** INIT CUSTOM DATA ****************************/
|
||||||
|
|
||||||
|
PlayerData* FASTCALL init_PlayerCustomData(DWORD p1, DWORD size, LPCSTR file, DWORD line, DWORD p5)
|
||||||
|
{
|
||||||
|
log_msg("init_PlayerCustomData\n");
|
||||||
|
PlayerData* playerData = (PlayerData*)D2AllocMem(p1,size+sizeof(PYPlayerData),file,line,p5);
|
||||||
|
ZeroMemory((BYTE*)playerData + shifting.ptPYPlayerData, sizeof(PYPlayerData));
|
||||||
|
return playerData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************** FREE CUSTOM DATA ****************************/
|
||||||
|
|
||||||
|
|
||||||
|
void freeStash(Stash* ptStash)
|
||||||
|
{
|
||||||
|
if (!ptStash) return;
|
||||||
|
freeStash(ptStash->nextStash);
|
||||||
|
free(ptStash->nextStash);// D2FogMemDeAlloc(ptStash->nextStash,__FILE__,__LINE__,0);
|
||||||
|
if(ptStash->name)
|
||||||
|
{
|
||||||
|
free(ptStash->name);//D2FogMemDeAlloc(ptStash->name,__FILE__,__LINE__,0);
|
||||||
|
ptStash->name = NULL;
|
||||||
|
}
|
||||||
|
ptStash->nextStash = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FASTCALL free_PlayerCustomData(DWORD p1, PlayerData* playerData, LPCSTR file, DWORD line, DWORD p5)
|
||||||
|
{
|
||||||
|
log_msg("free_PlayerCustomData\n");
|
||||||
|
PYPlayerData* ptPYPlayerData = (PYPlayerData*)((DWORD)playerData + shifting.ptPYPlayerData);
|
||||||
|
|
||||||
|
freeStash(ptPYPlayerData->selfStash);
|
||||||
|
free(ptPYPlayerData->selfStash);//D2FogMemDeAlloc(ptPYPlayerData->selfStash,__FILE__,__LINE__,0);
|
||||||
|
ptPYPlayerData->selfStash = NULL;
|
||||||
|
|
||||||
|
freeStash(ptPYPlayerData->sharedStash);
|
||||||
|
free(ptPYPlayerData->sharedStash);//D2FogMemDeAlloc(ptPYPlayerData->sharedStash,__FILE__,__LINE__,0);
|
||||||
|
ptPYPlayerData->sharedStash = NULL;
|
||||||
|
|
||||||
|
D2FreeMem(p1,playerData,file,line,p5);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit* STDCALL getNextItemToFree(Unit* ptChar, Unit* ptItem)
|
||||||
|
{
|
||||||
|
Unit* item = D2UnitGetNextItem(ptItem);
|
||||||
|
if (item) return item;
|
||||||
|
|
||||||
|
if (ptChar->nUnitType != UNIT_PLAYER) return NULL;
|
||||||
|
if (!PCPlayerData) return NULL;
|
||||||
|
if (!PCPY) return NULL;
|
||||||
|
|
||||||
|
Stash* curStash = PCPY->selfStash;
|
||||||
|
while ( curStash )
|
||||||
|
{
|
||||||
|
if (curStash->ptListItem)
|
||||||
|
{
|
||||||
|
item = curStash->ptListItem;
|
||||||
|
curStash->ptListItem = NULL;
|
||||||
|
return item;//->nUnitType == 4 ? item : NULL;
|
||||||
|
}
|
||||||
|
curStash = curStash->nextStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
curStash = PCPY->sharedStash;
|
||||||
|
while ( curStash )
|
||||||
|
{
|
||||||
|
if (curStash->ptListItem)
|
||||||
|
{
|
||||||
|
item = curStash->ptListItem;
|
||||||
|
curStash->ptListItem = NULL;
|
||||||
|
return item->nUnitType == 4 ? item : NULL;
|
||||||
|
}
|
||||||
|
curStash = curStash->nextStash;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************ 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_111 )
|
||||||
|
MOV ECX,ESI
|
||||||
|
MOV EDX,EBP
|
||||||
|
CALL updateItem_111
|
||||||
|
POP EAX
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH EDX
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_updateItemB_111 )
|
||||||
|
MOV EDX,EBP
|
||||||
|
CALL updateItem_111
|
||||||
|
POP EAX
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH EDX
|
||||||
|
JMP EAX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_updateItem )
|
||||||
|
PUSH EBP
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
CALL updateItem
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_updateItem_9 )
|
||||||
|
PUSH EBX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x8]
|
||||||
|
CALL updateItem
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_updateClientPlayerOnLoading )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
CALL updateClientPlayerOnLoading
|
||||||
|
POP ECX
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
POP EBP
|
||||||
|
XOR EAX,EAX
|
||||||
|
JMP ECX
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( callerServer_getNextItemToFree_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x30]
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( callerServer_getNextItemToFree )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x28]
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( callerServer_getNextItemToFree_9 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( callerClient_getNextItemToFree_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH EBX
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( callerClient_getNextItemToFree )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x24]
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( callerClient_getNextItemToFree_9 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x28]
|
||||||
|
CALL getNextItemToFree
|
||||||
|
RETN 4
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_PlayerCustomData()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled || !active_PlayerCustomData) return;
|
||||||
|
|
||||||
|
Install_SavePlayerData();
|
||||||
|
Install_LoadPlayerData();
|
||||||
|
Install_UpdateClient();
|
||||||
|
|
||||||
|
log_msg("Patch D2Game & D2Client & D2Common for Player's custom data. (PlayerCustomData)\n");
|
||||||
|
|
||||||
|
// Initialize custom data.
|
||||||
|
mem_seek( version_D2Client == V113 ? offset_D2Common + 0x309BE : version_D2Client == V112 ? offset_D2Common + 0x585EE : version_D2Client == V111b ? offset_D2Common + 0x5BFCE : version_D2Common == V111 ? offset_D2Common + 0x4ED5E :(DWORD)D2InitPlayerData + 0x62 );
|
||||||
|
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>
|
||||||
|
|
||||||
|
if ( version_D2Game >= V111 )
|
||||||
|
{
|
||||||
|
// update item
|
||||||
|
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 9BB91);
|
||||||
|
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]
|
||||||
|
//02023C55 |. 52 |PUSH EDX ; /Arg1
|
||||||
|
//6FC7F2A1 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
|
||||||
|
//6FC7F2A5 |. 52 |PUSH EDX ; /Arg1
|
||||||
|
//6FCBBB91 |> 8B5424 18 |MOV EDX,DWORD PTR SS:[ESP+18]
|
||||||
|
//6FCBBB95 |. 52 |PUSH EDX
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 9BBF1);
|
||||||
|
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]
|
||||||
|
//02023CB5 |. 52 ||PUSH EDX ; /Arg1
|
||||||
|
//6FC7F301 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
|
||||||
|
//6FC7F305 |. 52 ||PUSH EDX ; /Arg1
|
||||||
|
//6FCBBBF1 |> 8B5424 18 ||MOV EDX,DWORD PTR SS:[ESP+18]
|
||||||
|
//6FCBBBF5 |. 52 ||PUSH EDX
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// update item
|
||||||
|
mem_seek R7(D2Game, 10933, 10C03, 1100D, 8BC71, C3C51, 5F2A1, 0000);
|
||||||
|
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
|
||||||
|
//6FC4100C |. E8 EFAA0700 |CALL D2Game.6FCBBB00
|
||||||
|
mem_seek R7(D2Game, 1097B, 10C4B, 11058, 8BCD1, C3CB1, 5F301, 0000);
|
||||||
|
MEMC_REF4( D2GameGetObject, version_D2Game == V110?caller_updateItem: caller_updateItem_9);
|
||||||
|
//6FC41057 |. E8 A4AA0700 ||CALL D2Game.6FCBBB00
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update client on loading
|
||||||
|
mem_seek R7(D2Game, 23EB, 2426, 25D4, 53482, C6A32, ED502, 4BF12);//6FC325D4-6FC30000
|
||||||
|
memt_byte( 0x5F ,0xE8); // CALL
|
||||||
|
MEMT_REF4( 0xC0335D5E , caller_updateClientPlayerOnLoading);
|
||||||
|
//6FC325D4 |> 5F POP EDI
|
||||||
|
//6FC325D5 |. 5E POP ESI
|
||||||
|
//6FC325D6 |. 5D POP EBP
|
||||||
|
//6FC325D7 |. 33C0 XOR EAX,EAX
|
||||||
|
//01FD3482 |> 5F POP EDI
|
||||||
|
//01FD3483 |. 5E POP ESI
|
||||||
|
//01FD3484 |. 5D POP EBP
|
||||||
|
//01FD3485 |. 33C0 XOR EAX,EAX
|
||||||
|
//02026A32 |> 5F POP EDI
|
||||||
|
//02026A33 |. 5E POP ESI
|
||||||
|
//02026A34 |. 5D POP EBP
|
||||||
|
//02026A35 |. 33C0 XOR EAX,EAX
|
||||||
|
//6FD0D502 |> 5F POP EDI
|
||||||
|
//6FD0D503 |. 5E POP ESI
|
||||||
|
//6FD0D504 |. 5D POP EBP
|
||||||
|
//6FD0D505 |. 33C0 XOR EAX,EAX
|
||||||
|
//6FC6BF12 |> 5F POP EDI
|
||||||
|
//6FC6BF13 |. 5E POP ESI
|
||||||
|
//6FC6BF14 |. 5D POP EBP
|
||||||
|
//6FC6BF15 |. 33C0 XOR EAX,EAX
|
||||||
|
|
||||||
|
// Free custom data.
|
||||||
|
mem_seek R7(D2Common, 7055C, 7065C, 80483, 4F82D, 5C9CD, 5856D, 3093D);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// Free item in Stash (Server-side)
|
||||||
|
mem_seek R7(D2Game, 7D12B, 7D62B, 8D5A4, 99112, BFDB2, 94242, E1162);
|
||||||
|
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerServer_getNextItemToFree_111 : version_D2Game == V110 ? callerServer_getNextItemToFree : callerServer_getNextItemToFree_9);//0x0005E204
|
||||||
|
//6FCBD5A3 . E8 04E20500 CALL <JMP.&D2Common.#10304>
|
||||||
|
//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>
|
||||||
|
|
||||||
|
// Free item in Stash (Client-side)
|
||||||
|
mem_seek R7(D2Client, 8EF8F, 8E30F, 89B32, 26404, 4C264, 1F2D4, A5C94);//6FB29B31-6FAA0000
|
||||||
|
MEMJ_REF4( D2UnitGetNextItem, version_D2Game >= V111 ? callerClient_getNextItemToFree_111 : version_D2Game == V110 ? callerClient_getNextItemToFree : callerClient_getNextItemToFree_9);//0x00040F34
|
||||||
|
//6FB29B31 E8 340F0400 CALL <JMP.&D2Common.#10304>
|
||||||
|
//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>
|
||||||
|
|
||||||
|
if ( version_D2Common >= V110 )
|
||||||
|
{
|
||||||
|
// Test if it's already removed from inventory
|
||||||
|
mem_seek R7(D2Common, 0000, 0000, 4E689, 26E33, 42133, 6AE93, 21B23);
|
||||||
|
memt_byte( 0x0D , 0x07);
|
||||||
|
//01D2E688 75 0D JNZ SHORT D2Common.01D2E697
|
||||||
|
//6FD76E32 |. 74 0D JE SHORT D2Common.6FD76E41
|
||||||
|
//6FD92132 |. 74 0D JE SHORT D2Common.6FD92141
|
||||||
|
//6FDBAE92 |. 74 0D JE SHORT D2Common.6FDBAEA1
|
||||||
|
//6FD71B22 |. 74 0D JE SHORT D2Common.6FD71B31
|
||||||
|
} else {
|
||||||
|
mem_seek R7(D2Game, 7D176, 7D676, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x74 , 0x90);//MOV EAX,EDI
|
||||||
|
memt_byte( 0x35 , 0x90);//NOP
|
||||||
|
//6FCAD176 |. 74 35 |JE SHORT D2Game.6FCAD1AD
|
||||||
|
|
||||||
|
mem_seek R7(D2Client, 8F0CA, 8E44A, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x0F , 0x90);//MOV EAX,EDI
|
||||||
|
memt_byte( 0x84 , 0x90);//NOP
|
||||||
|
memt_dword( 0x000000BF , 0x90909090);//NOP
|
||||||
|
//6FB2F0CA |. 0F84 BF000000 |JE D2Client.6FB2F18F
|
||||||
|
|
||||||
|
mem_seek R7(D2Client, 8F13C, 8E4BC, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x74 , 0x90);//MOV EAX,EDI
|
||||||
|
memt_byte( 0x6F , 0x90);//NOP
|
||||||
|
//6FB2F13C |. 74 6F |JE SHORT D2Client.6FB2F1AD
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
BIN
PlugY/PlugY.aps
Normal file
BIN
PlugY/PlugY.aps
Normal file
Binary file not shown.
22
PlugY/PlugY.cpp
Normal file
22
PlugY/PlugY.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Main file of this DLL
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
BOOL WINAPI DllMain(HANDLE /*hModule*/, DWORD dwReason, LPVOID /*lpReserved*/)
|
||||||
|
{
|
||||||
|
switch(dwReason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
111
PlugY/PlugY.rc
Normal file
111
PlugY/PlugY.rc
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
|
//
|
||||||
|
#include "afxres.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// English (U.S.) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"#include ""afxres.h""\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#endif // English (U.S.) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// French (France) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 10,0,0,0
|
||||||
|
PRODUCTVERSION 10,0,0,0
|
||||||
|
FILEFLAGSMASK 0x17L
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x4L
|
||||||
|
FILETYPE 0x2L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040004b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "Yohann Nicolas"
|
||||||
|
VALUE "FileVersion", "10.00"
|
||||||
|
VALUE "OriginalFilename", "PlugY.dll"
|
||||||
|
VALUE "ProductName", "PlugY, The Survival Kit"
|
||||||
|
VALUE "ProductVersion", "10.00"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x400, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // French (France) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
19
PlugY/PlugY.sln
Normal file
19
PlugY/PlugY.sln
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcproj", "{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
BIN
PlugY/PlugY.suo
Normal file
BIN
PlugY/PlugY.suo
Normal file
Binary file not shown.
574
PlugY/PlugY.vcproj
Normal file
574
PlugY/PlugY.vcproj
Normal file
@ -0,0 +1,574 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8,00"
|
||||||
|
Name="PlugY"
|
||||||
|
ProjectGUID="{F5E47DA0-4D85-41E4-954D-29237DF8AFCB}"
|
||||||
|
RootNamespace="PlugY"
|
||||||
|
Keyword="ExtStoredProcProj"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="Debug"
|
||||||
|
IntermediateDirectory="Debug"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
MkTypLibCompatible="false"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="false"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="opends60.lib"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="Release"
|
||||||
|
IntermediateDirectory="Release"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
MkTypLibCompatible="false"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
OmitFramePointers="true"
|
||||||
|
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_DEPRECATE;_CRT_ NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T"
|
||||||
|
StringPooling="false"
|
||||||
|
ExceptionHandling="0"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
BufferSecurityCheck="false"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="false"
|
||||||
|
DebugInformationFormat="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="opends60.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="false"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
CommandLine="copy $(TargetPath) "..\PlugYInstaller\PlugY.dll"
copy $(TargetPath) "D:\Jeux\Blizzard\Diablo II\PlugY.dll"
copy $(TargetPath) "D:\www\PlugY.dll"
"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;odl;idl;hpj;bat;asm"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="BigStash.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="ClientSaveFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Commands.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Common.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="CustomLibraries.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="D2functions.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="D2wrapper.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Error.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="ExtendedSaveFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="ExtraOptions.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="GlobalVariable.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="InfinityStash.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="INIfile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Interface_Skills.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Interface_Stash.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Interface_Stats.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Language.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="LoadPlayerData.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="MainScreen.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="ModifMemory.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="NewInterface_CubeListing.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="NewInterface_Runewords.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="NewInterface_Stats.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="NewInterface_StatsPageTwo.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="NewInterfaces.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="OthersFeatures.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="Parameters.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="PlayerCustomData.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="PlugY.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="PlugY.rc"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="PlugYFiles.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="SavePath.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="SavePlayerData.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="SharedSaveFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="SkillPerLevelUp.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="SkillsPoints.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="StatPerLevelUp.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="StatsPoints.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="UberQuest.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="UpdateClient.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="UpdateServer.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="WorldEvent.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="bigStash.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="clientSaveFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="commands.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="common.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="customData.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="customLibraries.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="d2functions.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="error.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="extendedSaveFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="extraOptions.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="globalVariable.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="infinityStash.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="INIfile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="interface_Skills.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="interface_Stash.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="interface_Stats.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="language.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="loadPlayerData.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="mainScreen.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="modifMemory.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="newInterface_CubeListing.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="newInterface_Runewords.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="newInterface_Stats.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="newInterface_StatsPageTwo.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="newInterfaces.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="othersFeatures.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="parameters.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="playerCustomData.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="plugYFiles.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="resource.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="savePath.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="savePlayerData.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="sharedSaveFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="skillPerLevelUp.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="skillsPoints.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="statPerLevelUp.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="statsPoints.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="uberQuest.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="updateClient.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="updateServer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="worldEvent.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Commons"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\d2BinFile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\d2constants.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\D2Funcs.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\d2StringTblStruct.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\d2Struct.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\D2UnitStruct.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Commons\updatingConst.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
65
PlugY/PlugY.vcproj.ATHLON64.Yohann.user
Normal file
65
PlugY/PlugY.vcproj.ATHLON64.Yohann.user
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioUserFile
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8,00"
|
||||||
|
ShowAllFiles="false"
|
||||||
|
>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command=""
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ATHLON64"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command=""
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ATHLON64"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
</VisualStudioUserFile>
|
273
PlugY/PlugYFiles.cpp
Normal file
273
PlugY/PlugYFiles.cpp
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Adding custom data.
|
||||||
|
Save and load infinity & shared Stash
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "plugYFiles.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
//#include "newInterfaces.h"
|
||||||
|
extern bool active_SkillsPoints, active_StatsPoints, active_newInterfaces, active_multiPageStash, active_sharedGold;
|
||||||
|
|
||||||
|
void* unassignSkillsBtnImages = NULL;
|
||||||
|
void* unassignStatsBtnImages = NULL;
|
||||||
|
void* stashBtnsImages = NULL;
|
||||||
|
void* newStatsInterfaceImages = NULL;
|
||||||
|
void* statsBackgroundImages = NULL;
|
||||||
|
void* sharedGoldBtnsImages = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
//void* lookupItemStatCost = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL isModFile (char* filename)
|
||||||
|
{
|
||||||
|
if (strstr(filename, modDataDirectory) )
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
if ((GetFileAttributesA(filename) & 0x10) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_isModFile )
|
||||||
|
TEST ESI,ESI
|
||||||
|
JNZ ISNOTMODDATA
|
||||||
|
MOV EBP, DWORD PTR SS:[ESP+0x140]
|
||||||
|
PUSH EBP
|
||||||
|
CALL isModFile
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE ISNOTMODDATA
|
||||||
|
MOV BL, BYTE PTR SS:[ESP+0x144]
|
||||||
|
POP EAX
|
||||||
|
POP EAX
|
||||||
|
MOV EAX,D2StormMPQOpenFile
|
||||||
|
ADD EAX,0x9A
|
||||||
|
JMP EAX
|
||||||
|
ISNOTMODDATA:
|
||||||
|
JMP DWORD PTR CS:[LeaveCriticalSection]
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_isModFile_111 )
|
||||||
|
TEST EDI,EDI
|
||||||
|
JNZ ISNOTMODDATA
|
||||||
|
MOV ESI, DWORD PTR SS:[ESP+0x130]
|
||||||
|
PUSH ESI
|
||||||
|
CALL isModFile
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE ISNOTMODDATA
|
||||||
|
MOV BL, BYTE PTR SS:[ESP+0x134]
|
||||||
|
POP EAX
|
||||||
|
POP EAX
|
||||||
|
MOV EAX,D2StormMPQOpenFile
|
||||||
|
ADD EAX,0xBD
|
||||||
|
MOV EBP,GetFileAttributesA
|
||||||
|
JMP EAX
|
||||||
|
ISNOTMODDATA:
|
||||||
|
JMP DWORD PTR CS:[LeaveCriticalSection]
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_PlugYFiles()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch Storm to found custom file. (PlugYFiles)\n");
|
||||||
|
|
||||||
|
// Try in Diablo II\PlugY\ if file not found
|
||||||
|
mem_seek R7(Storm, 192C6, 19296, 18677, 2CC69, 14259, 121E9, 28D89);//( (DWORD)D2Storm268 + V7(Storm, 01A8, 01A8, 01AB, 0429, 0429, 0429, 0000) );
|
||||||
|
memt_byte( 0xFF ,0x90); // NOP
|
||||||
|
memt_byte( 0x15 ,0xE8); // CALL
|
||||||
|
MEMD_REF4( LeaveCriticalSection, version_Storm >= V111 ? caller_isModFile_111 : caller_isModFile);
|
||||||
|
//6FFC8677 |. FF15 F411FE6F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||||
|
//6FC1CC69 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||||
|
//6FC04259 |. FF15 3832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||||
|
//6FC021E9 |. FF15 4432C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||||
|
//6FC18D89 |. FF15 5832C36F CALL DWORD PTR DS:[<&KERNEL32.LeaveCriti>; \LeaveCriticalSection
|
||||||
|
|
||||||
|
|
||||||
|
log_msg("\n" );
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
//6FFC7EF0 >/$ 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10]
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
void loadImagesFile(void** images, const char* name)
|
||||||
|
{
|
||||||
|
if(!images || !name) return;
|
||||||
|
if(!*images)
|
||||||
|
{
|
||||||
|
char buffer[MAX_PATH];
|
||||||
|
sprintf(buffer, "%s\\%s", modDataDirectory, name);
|
||||||
|
log_msg("Images file to load : %s\n",buffer);
|
||||||
|
|
||||||
|
*images = D2LoadImage(buffer,0);
|
||||||
|
if (!*images)
|
||||||
|
{
|
||||||
|
sprintf(buffer, "Don't find Buttons Images File : %s.dc6", name);
|
||||||
|
d2_assert(!*images, buffer, __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void STDCALL loadCustomImages()
|
||||||
|
{
|
||||||
|
if ( active_SkillsPoints ) loadImagesFile(&unassignSkillsBtnImages, "UnassignSkillsBtns");
|
||||||
|
if ( active_StatsPoints ) loadImagesFile(&unassignStatsBtnImages, "UnassignStatsBtns");
|
||||||
|
if ( active_multiPageStash || active_newInterfaces) loadImagesFile(&stashBtnsImages, "StashBtns");
|
||||||
|
if ( active_sharedGold) loadImagesFile(&sharedGoldBtnsImages, "SharedGoldBtns");
|
||||||
|
if ( active_newInterfaces ) loadImagesFile(&newStatsInterfaceImages, "EmptyPage");
|
||||||
|
if ( active_newInterfaces ) loadImagesFile(&statsBackgroundImages, "StatsBackground");
|
||||||
|
}
|
||||||
|
|
||||||
|
#define freeImagesFile(I) if(I) {D2FreeImage(I);I=NULL;}
|
||||||
|
|
||||||
|
void STDCALL freeCustomImages()
|
||||||
|
{
|
||||||
|
freeImagesFile(unassignSkillsBtnImages);
|
||||||
|
freeImagesFile(unassignStatsBtnImages);
|
||||||
|
freeImagesFile(stashBtnsImages);
|
||||||
|
freeImagesFile(sharedGoldBtnsImages);
|
||||||
|
freeImagesFile(newStatsInterfaceImages);
|
||||||
|
freeImagesFile(statsBackgroundImages);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_loadCustomImages )
|
||||||
|
CALL loadCustomImages
|
||||||
|
MOV ECX,0x0C
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_freeCustomImages )
|
||||||
|
CALL freeCustomImages
|
||||||
|
MOV ECX,0x0C
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_PlugYImagesFiles()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlugYFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client to load/free custom images. (PlugYImagesFiles)\n");
|
||||||
|
|
||||||
|
// Load custom images
|
||||||
|
mem_seek R7(D2Client, 57E21, 57E21, 5E4B1, 2E101, B67E1, 82761, 27EAE);
|
||||||
|
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
|
||||||
|
|
||||||
|
// Free custom images
|
||||||
|
mem_seek R7(D2Client, 57FA9, 57FA9, 5E639, 2D12D, B580D, 8158D, 26F8D);
|
||||||
|
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
|
||||||
|
|
||||||
|
log_msg("\n" );
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
void loadStatsInterfaceDesc(DWORD mempool);
|
||||||
|
void freeStatsInterfaceDesc();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FASTCALL loadTxtFiles(DWORD mempool)
|
||||||
|
{
|
||||||
|
loadStatsInterfaceDesc(mempool);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FASTCALL freeTxtFiles()
|
||||||
|
{
|
||||||
|
freeStatsInterfaceDesc();
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_loadTxtFiles_111 )
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+4]
|
||||||
|
CALL loadTxtFiles
|
||||||
|
JMP D2LoadSuperuniques
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_loadTxtFiles )
|
||||||
|
PUSH ECX
|
||||||
|
CALL loadTxtFiles
|
||||||
|
POP ECX
|
||||||
|
JMP D2LoadSuperuniques
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_freeTxtFiles )
|
||||||
|
CALL freeTxtFiles
|
||||||
|
JMP D2Fog10212
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_PlugYTxtFiles()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlugYFiles();
|
||||||
|
|
||||||
|
log_msg("Patch D2Common to load/free custom txt files. (PlugYTxtFiles)\n");
|
||||||
|
|
||||||
|
// lookupItemStatCost = (void*)R7(D2Common, A1D70, A1D70, AA1D8, 0000, 0000, 0000, 0000);
|
||||||
|
|
||||||
|
// Load custom txt files
|
||||||
|
mem_seek R7(D2Common, 7F4B, 7F4B, 2F7D7, 76854, 37444, 81C44, 5D6E4);
|
||||||
|
MEMC_REF4( D2LoadSuperuniques, version_D2Common >= V111 ? caller_loadTxtFiles_111 : caller_loadTxtFiles );
|
||||||
|
//6FD47F4A |. E8 B1750100 CALL D2Common.6FD5F500
|
||||||
|
//6FD47F4A |. E8 C1750100 CALL D2Common.6FD5F510
|
||||||
|
//01B6F7D6 |. E8 C5A7FFFF CALL D2Common.01B69FA0
|
||||||
|
//6FDC6853 |. E8 58B6FFFF CALL D2Common.6FDC1EB0 ; \D2Common.6FDC1EB0
|
||||||
|
//6FD87443 |. E8 58B6FFFF CALL D2Common.6FD82AA0 ; \D2Common.6FD82AA0
|
||||||
|
//6FDD1C43 |. E8 58B6FFFF CALL D2Common.6FDCD2A0 ; \D2Common.6FDCD2A0
|
||||||
|
//6FDAD6E3 |. E8 88C1FFFF CALL D2Common.6FDA9870 ; \D2Common.6FDA9870
|
||||||
|
|
||||||
|
// Free custom txt files
|
||||||
|
mem_seek R7(D2Common, 79EC, 79EC, 10186, 332B3, 15AB3, 44E13, 5E8B3);
|
||||||
|
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>
|
||||||
|
//6FD832B2 |. E8 755FFDFF CALL <JMP.&Fog.#10212>
|
||||||
|
//6FD65AB2 |. E8 B537FFFF CALL <JMP.&Fog.#10212>
|
||||||
|
//6FD94E12 |. E8 1744FCFF CALL <JMP.&Fog.#10212>
|
||||||
|
//6FDAE8B2 |. E8 8FA9FAFF CALL <JMP.&Fog.#10212>
|
||||||
|
|
||||||
|
log_msg("\n" );
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
52
PlugY/Progress.txt
Normal file
52
PlugY/Progress.txt
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
Parameters.h et PlugY.rc => version changing
|
||||||
|
|
||||||
|
A faire :
|
||||||
|
|
||||||
|
A tester :
|
||||||
|
|
||||||
|
UPDATED :
|
||||||
|
DONE D2funcs.h
|
||||||
|
DONE BigStash.cpp
|
||||||
|
DONE ClientSaveFile.cpp
|
||||||
|
DONE Commands.cpp
|
||||||
|
DONE Common.cpp
|
||||||
|
DONE CustomLibraries.cpp
|
||||||
|
DONE D2functions.cpp
|
||||||
|
DONE D2wrapper.cpp
|
||||||
|
DONE Error.cpp
|
||||||
|
DONE ExtendedSaveFile.cpp
|
||||||
|
DONE ExtraOptions.cpp
|
||||||
|
DONE GlobalVariable.cpp
|
||||||
|
DONE InfinityStash.cpp
|
||||||
|
DONE INIfile.cpp
|
||||||
|
DONE Interface_Skills.cpp
|
||||||
|
DONE Interface_Stash.cpp
|
||||||
|
DONE Interface_Stats.cpp
|
||||||
|
DONE Language.cpp
|
||||||
|
DONE LoadPlayerData.cpp
|
||||||
|
DONE MainScreen.cpp
|
||||||
|
DONE ModifMemory.cpp
|
||||||
|
DONE NewInterface_CubeListing.cpp
|
||||||
|
DONE NewInterface_Runewords.cpp
|
||||||
|
DONE NewInterface_Stats.cpp
|
||||||
|
DONE NewInterface_StatsPageTwo.cpp
|
||||||
|
DONE NewInterfaces.cpp
|
||||||
|
DONE OthersFeatures.cpp
|
||||||
|
DONE Parameters.cpp
|
||||||
|
DONE PlayerCustomData.cpp
|
||||||
|
DONE PlugY.cpp
|
||||||
|
DONE PlugY.rc
|
||||||
|
DONE PlugYFiles.cpp
|
||||||
|
DONE SavePath.cpp
|
||||||
|
DONE SavePlayerData.cpp
|
||||||
|
DONE SharedSaveFile.cpp
|
||||||
|
DONE SkillPerLevelUp.cpp
|
||||||
|
DONE SkillsPoints.cpp
|
||||||
|
DONE StatPerLevelUp.cpp
|
||||||
|
DONE StatsPoints.cpp
|
||||||
|
DONE UberQuest.cpp
|
||||||
|
DONE UpdateClient.cpp
|
||||||
|
DONE UpdateServer.cpp
|
||||||
|
DONE WorldEvent.cpp
|
||||||
|
|
||||||
|
|
202
PlugY/SavePath.cpp
Normal file
202
PlugY/SavePath.cpp
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Changing the current save path.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "savePath.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
char* savePath = NULL;
|
||||||
|
bool active_changingSavePath = false;
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM( changeSavePath )
|
||||||
|
PUSH EDI
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ESI
|
||||||
|
MOV EDI,DWORD PTR DS:[savePath]
|
||||||
|
XOR AL,AL
|
||||||
|
CLD
|
||||||
|
OR ECX,0xFFFFFFFF
|
||||||
|
REPNE SCAS BYTE PTR ES:[EDI]
|
||||||
|
NOT ECX
|
||||||
|
SUB EDI,ECX
|
||||||
|
XCHG EDI,ESI
|
||||||
|
CMP BYTE PTR [ESI+1],':'
|
||||||
|
JE END_CHANGESP
|
||||||
|
//RELATIVE_PATH:
|
||||||
|
MOV EDX,ECX
|
||||||
|
OR ECX,0xFFFFFFFF
|
||||||
|
REPNE SCAS BYTE PTR ES:[EDI]
|
||||||
|
DEC EDI
|
||||||
|
CMP BYTE PTR [EDI-1],'\\'
|
||||||
|
JE NEXT
|
||||||
|
MOV BYTE PTR [EDI],'\\'
|
||||||
|
INC EDI
|
||||||
|
NEXT:
|
||||||
|
MOV ECX,EDX
|
||||||
|
END_CHANGESP:
|
||||||
|
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
|
||||||
|
POP ESI
|
||||||
|
POP EDX
|
||||||
|
POP EDI
|
||||||
|
PUSH ESI
|
||||||
|
CALL EBP
|
||||||
|
CMP EAX,-1
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( changeSavePath_111 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EDI
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ESI
|
||||||
|
MOV EDI,DWORD PTR DS:[savePath]
|
||||||
|
XOR AL,AL
|
||||||
|
CLD
|
||||||
|
OR ECX,0xFFFFFFFF
|
||||||
|
REPNE SCAS BYTE PTR ES:[EDI]
|
||||||
|
NOT ECX
|
||||||
|
SUB EDI,ECX
|
||||||
|
XCHG EDI,ESI
|
||||||
|
CMP BYTE PTR [ESI+1],':'
|
||||||
|
JE END_CHANGESP
|
||||||
|
//RELATIVE_PATH:
|
||||||
|
MOV EDX,ECX
|
||||||
|
OR ECX,0xFFFFFFFF
|
||||||
|
REPNE SCAS BYTE PTR ES:[EDI]
|
||||||
|
DEC EDI
|
||||||
|
CMP BYTE PTR [EDI-1],'\\'
|
||||||
|
JE NEXT
|
||||||
|
MOV BYTE PTR [EDI],'\\'
|
||||||
|
INC EDI
|
||||||
|
NEXT:
|
||||||
|
MOV ECX,EDX
|
||||||
|
END_CHANGESP:
|
||||||
|
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
|
||||||
|
POP ESI
|
||||||
|
POP EDX
|
||||||
|
POP EDI
|
||||||
|
POP EAX
|
||||||
|
CMP EAX,-1
|
||||||
|
JE DONOT_JMP
|
||||||
|
ADD DWORD PTR SS:[ESP],5
|
||||||
|
DONOT_JMP:
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( forCreateSavePath )
|
||||||
|
PUSH EDI
|
||||||
|
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
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Install_ChangingSavePath()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch Fog for change the save path. (changingSavePath)\n");
|
||||||
|
|
||||||
|
if (version_Fog >= V111)
|
||||||
|
{
|
||||||
|
// Appel de notre fct d'ajout d'un sous-répertoire
|
||||||
|
mem_seek R7(Fog, 000, 000, 000, 185F6, 1C106, 1F086, 17F86);
|
||||||
|
memt_byte( 0x83 ,0xE8); // CALL changeSavePath
|
||||||
|
MEMT_REF4( 0x0575FFF8, changeSavePath_111);
|
||||||
|
//6FF685F6 . 83F8 FF CMP EAX,-1
|
||||||
|
//6FF685F9 . 75 05 JNZ SHORT fog.6FF68600
|
||||||
|
//6FF6C106 . 83F8 FF CMP EAX,-1
|
||||||
|
//6FF6C109 . 75 05 JNZ SHORT fog.6FF6C110
|
||||||
|
//6FF6F086 . 83F8 FF CMP EAX,-1
|
||||||
|
//6FF6F089 . 75 05 JNZ SHORT Fog.6FF6F090
|
||||||
|
//6FF67F86 . 83F8 FF CMP EAX,-1
|
||||||
|
//6FF67F89 . 75 05 JNZ SHORT Fog.6FF67F90
|
||||||
|
|
||||||
|
// Pour créer le bon chemin de sauvegarde
|
||||||
|
mem_seek R7(Fog, 000, 000, 000, 18616, 1C126, 1F0A6, 17FA6);
|
||||||
|
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>
|
||||||
|
|
||||||
|
|
||||||
|
// Remove registry update
|
||||||
|
mem_seek R7(Fog, 000, 000, 000, 1861A, 1C12A, 1F0AA, 17FAA);
|
||||||
|
memt_byte( 0x56 ,0xEB); // JMP SHORT fog.6FF6862C
|
||||||
|
memt_byte( 0x6A ,0x10); //
|
||||||
|
memt_byte( 0x00 ,0x90); // NOP
|
||||||
|
//6FF6861A . 56 PUSH ESI
|
||||||
|
//6FF6861B . 6A 00 PUSH 0
|
||||||
|
//6FF6861D . 68 7C7BF76F PUSH fog.6FF77B7C ; ASCII "Save Path"
|
||||||
|
//6FF68622 . 68 2876F76F PUSH fog.6FF77628 ; ASCII "Diablo II"
|
||||||
|
//6FF68627 . E8 1A47FFFF CALL <JMP.&Storm.#425>
|
||||||
|
//6FF6C12A . 56 PUSH ESI
|
||||||
|
//6FF6C12B . 6A 00 PUSH 0
|
||||||
|
//6FF6C12D . 68 BC73F76F PUSH fog.6FF773BC ; ASCII "Save Path"
|
||||||
|
//6FF6C132 . 68 C873F76F PUSH fog.6FF773C8 ; ASCII "Diablo II"
|
||||||
|
//6FF6C137 . E8 E60BFFFF CALL <JMP.&Storm.#425>
|
||||||
|
//6FF6F0AA . 56 PUSH ESI
|
||||||
|
//6FF6F0AB . 6A 00 PUSH 0
|
||||||
|
//6FF6F0AD . 68 D466F76F PUSH Fog.6FF766D4 ; ASCII "Save Path"
|
||||||
|
//6FF6F0B2 . 68 E066F76F PUSH Fog.6FF766E0 ; ASCII "Diablo II"
|
||||||
|
//6FF6F0B7 . E8 58DDFEFF CALL <JMP.&Storm.#425>
|
||||||
|
//6FF67FAA . 56 PUSH ESI
|
||||||
|
//6FF67FAB . 6A 00 PUSH 0
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Appel de notre fct d'ajout d'un sous-répertoire
|
||||||
|
mem_seek( (DWORD)D2FogGetSavePath + 0x28);//6FF61928-6FF50000
|
||||||
|
memt_byte( 0x56 ,0x90); // NOP
|
||||||
|
memt_byte( 0xFF ,0xE8); // CALL changeSavePath
|
||||||
|
MEMT_REF4( 0xFFF883D5, changeSavePath);
|
||||||
|
//6FF61928 56 PUSH ESI
|
||||||
|
//6FF61929 FFD5 CALL EBP
|
||||||
|
//6FF6192B 83F8 FF CMP EAX,-1
|
||||||
|
|
||||||
|
// Pour créer le bon chemin de sauvegarde
|
||||||
|
mem_seek( (DWORD)D2FogGetSavePath + 0xBD);//6FF619BC
|
||||||
|
MEMJ_REF4( D2Storm503, forCreateSavePath);
|
||||||
|
//6FF619BC . E8 5D2A0000 CALL <JMP.&Storm.#503>
|
||||||
|
|
||||||
|
// Remove registry update
|
||||||
|
mem_seek( (DWORD)D2FogGetSavePath + 0xC1);//6FF619C1-6FF50000
|
||||||
|
memt_byte( 0x56 ,0xEB); // JMP SHORT FOG.6FF619D2
|
||||||
|
memt_byte( 0x53 ,0x0F); //6FF619C3-6FF619D2
|
||||||
|
//6FF619C1 56 PUSH ESI
|
||||||
|
//6FF619C2 53 PUSH EBX
|
||||||
|
//6FF619C3 68 A877F76F PUSH Fog.6FF777A8 ; ASCII "Save Path"
|
||||||
|
//6FF619C8 68 9068F76F PUSH Fog.6FF76890 ; ASCII "Diablo II"
|
||||||
|
//6FF619CD E8 AC2A0000 CALL <JMP.&Storm.#425>
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
611
PlugY/SavePlayerData.cpp
Normal file
611
PlugY/SavePlayerData.cpp
Normal file
@ -0,0 +1,611 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Save Player Custom Data.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "extendedSaveFile.h"
|
||||||
|
#include "sharedSaveFile.h"
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL SaveSPPlayerCustomData(Unit* ptChar)
|
||||||
|
{
|
||||||
|
if (!D2isLODGame()) return;//D2Game but in SP so np
|
||||||
|
|
||||||
|
log_msg("\n--- Start SaveSPPlayerCustomData ---\n");
|
||||||
|
|
||||||
|
if (PCPY->selfStashIsOpened)
|
||||||
|
{
|
||||||
|
DWORD curSizeExt = 0;
|
||||||
|
DWORD maxSizeExt = 0x4000;
|
||||||
|
BYTE* dataExt = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeExt,__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__);
|
||||||
|
saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt);
|
||||||
|
writeExtendedSaveFile(PCPlayerData->name, dataExt, curSizeExt);
|
||||||
|
D2FreeMem(PCGame->memoryPool, dataExt,__FILE__,__LINE__,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_sharedStash && PCPY->sharedStashIsOpened)
|
||||||
|
{
|
||||||
|
DWORD curSizeShr = 0;
|
||||||
|
DWORD maxSizeShr = 0x4000;
|
||||||
|
BYTE* dataShr = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeShr,__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__);
|
||||||
|
saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr);
|
||||||
|
|
||||||
|
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_111 )
|
||||||
|
CALL D2FogGetSavePath
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x2608]
|
||||||
|
CALL SaveSPPlayerCustomData
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SaveSPPlayerCustomData )
|
||||||
|
CALL D2FogGetSavePath
|
||||||
|
PUSH EDI
|
||||||
|
CALL SaveSPPlayerCustomData
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SaveSPPlayerCustomData_9 )
|
||||||
|
CALL D2FogGetSavePath
|
||||||
|
PUSH ESI
|
||||||
|
CALL SaveSPPlayerCustomData
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define TC_SAVE_PERSONAL 0
|
||||||
|
#define TC_SAVE_SHARED 1
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
typedef struct {
|
||||||
|
BYTE packID;
|
||||||
|
BYTE packSize;
|
||||||
|
BYTE init;
|
||||||
|
DWORD finalSize:31;
|
||||||
|
DWORD isCustom:1;
|
||||||
|
BYTE type;
|
||||||
|
BYTE data[0xFF];
|
||||||
|
} t_rcvMsg;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
struct s_MPSaveFile
|
||||||
|
{
|
||||||
|
int sizeExtended;
|
||||||
|
int curExtended;
|
||||||
|
BYTE* dataExtended;
|
||||||
|
int sizeShared;
|
||||||
|
int curShared;
|
||||||
|
BYTE* dataShared;
|
||||||
|
};
|
||||||
|
static s_MPSaveFile receivedSaveFiles;
|
||||||
|
static BYTE customPackID = 0xB2;
|
||||||
|
//static s_MPSaveFile* receivedSaveFiles = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
struct s_dataToSend
|
||||||
|
{
|
||||||
|
s_dataToSend* next;
|
||||||
|
int clientID;
|
||||||
|
int sizeExtended;
|
||||||
|
int curExtended;
|
||||||
|
BYTE* dataExtended;
|
||||||
|
int sizeShared;
|
||||||
|
int curShared;
|
||||||
|
BYTE* dataShared;
|
||||||
|
bool init;
|
||||||
|
};
|
||||||
|
s_dataToSend* ptDataToSend=NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
void sendDataToSave(DWORD clientID, BYTE* data, DWORD size, bool isShared)
|
||||||
|
{
|
||||||
|
t_rcvMsg pack;
|
||||||
|
d2_assert(size >= 0x40000000, "size of file > 0x40000000", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
pack.packID = customPackID;
|
||||||
|
pack.init = !isShared;
|
||||||
|
pack.finalSize = size;
|
||||||
|
pack.type = isShared ? TC_SAVE_SHARED : TC_SAVE_PERSONAL;
|
||||||
|
pack.isCustom = true;
|
||||||
|
|
||||||
|
DWORD sended = 0;
|
||||||
|
while (sended < size)
|
||||||
|
{
|
||||||
|
pack.packSize = (BYTE) (size - sended > 0xFE ? 0xFE : size - sended);
|
||||||
|
CopyMemory(pack.data, &data[sended], pack.packSize);
|
||||||
|
log_msg("send: ID=%02X\tsize=%02X\tinit=%02X\ttotalsize=%08X\ttype=%d\n", pack.packID, pack.init, pack.packSize, pack.finalSize, pack.type);
|
||||||
|
pack.packSize++;
|
||||||
|
D2SendToClient(0, clientID, (BYTE*)&pack, pack.packSize+7);
|
||||||
|
pack.init = false;
|
||||||
|
sended += pack.packSize -1;
|
||||||
|
}
|
||||||
|
log_msg("\n");
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void STDCALL SendSaveFilesToSave( Unit* ptChar )
|
||||||
|
{
|
||||||
|
// if (!D2isLODGame()) return;
|
||||||
|
log_msg("\n--- Start SendSaveFilesToSave ---\n");
|
||||||
|
|
||||||
|
DWORD curSizeExt = 0;
|
||||||
|
BYTE* dataExt = NULL;
|
||||||
|
DWORD curSizeShr = 0;
|
||||||
|
BYTE* dataShr = NULL;
|
||||||
|
|
||||||
|
if (PCPY->selfStashIsOpened)
|
||||||
|
{
|
||||||
|
DWORD maxSizeExt = 0x4000;
|
||||||
|
dataExt = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeExt,__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!dataExt, "Error : Memory allocation Extended SaveFile", __FILE__, __LINE__);
|
||||||
|
saveExtendedSaveFile(ptChar, &dataExt, &maxSizeExt, &curSizeExt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_sharedStash && PCPY->sharedStashIsOpened)
|
||||||
|
{
|
||||||
|
DWORD maxSizeShr = 0x4000;
|
||||||
|
dataShr = (BYTE *)D2AllocMem(PCGame->memoryPool, maxSizeShr,__FILE__,__LINE__,0);
|
||||||
|
d2_assert(!dataShr, "Error : Memory allocation Shared SaveFile", __FILE__, __LINE__);
|
||||||
|
saveSharedSaveFile(ptChar, &dataShr, &maxSizeShr, &curSizeShr);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
|
||||||
|
s_dataToSend* dataToSend = ptDataToSend;
|
||||||
|
while (dataToSend && (dataToSend->clientID != ptClient->clientID))
|
||||||
|
dataToSend = dataToSend->next;
|
||||||
|
if (!dataToSend)
|
||||||
|
{
|
||||||
|
dataToSend = (s_dataToSend*) D2AllocMem(PCGame->memoryPool, sizeof(s_dataToSend), __FILE__, __LINE__, 0);
|
||||||
|
ZeroMemory(dataToSend, sizeof(s_dataToSend));
|
||||||
|
dataToSend->next = ptDataToSend;
|
||||||
|
ptDataToSend = dataToSend;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Sending savefiles
|
||||||
|
dataToSend->clientID = ptClient->clientID;
|
||||||
|
dataToSend->init = 1;
|
||||||
|
dataToSend->sizeExtended = curSizeExt;
|
||||||
|
dataToSend->curExtended = 0;
|
||||||
|
dataToSend->dataExtended = dataExt;
|
||||||
|
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",
|
||||||
|
dataToSend->clientID, dataToSend->init, dataToSend->sizeExtended, dataToSend->curExtended, dataToSend->dataExtended, dataToSend->sizeShared, dataToSend->curShared, dataToSend->dataShared);
|
||||||
|
|
||||||
|
/* NetClient* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
|
||||||
|
if (dataExt)
|
||||||
|
{
|
||||||
|
sendDataToSave(ptClient->clientID, dataExt, curSizeExt, false);
|
||||||
|
D2FreeMem(PCGame->memoryPool, dataExt,__FILE__,__LINE__,0);
|
||||||
|
}
|
||||||
|
if (dataShr)
|
||||||
|
{
|
||||||
|
sendDataToSave(ptClient->clientID, dataShr, curSizeShr, true);
|
||||||
|
D2FreeMem(PCGame->memoryPool, dataShr,__FILE__,__LINE__,0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
log_msg("End SendSaveFilesToSave.\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL ManageNextPacketToSend(NetClient* ptClient)
|
||||||
|
{
|
||||||
|
log_msg("ManageNextPacketToSend: ");
|
||||||
|
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",
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
DWORD remainingData = dataToSend->sizeExtended - dataToSend->curExtended;
|
||||||
|
t_rcvMsg* msg = (t_rcvMsg*)D2AllocMem(PClientGame->memoryPool, sizeof(t_rcvMsg),__FILE__,__LINE__,0);
|
||||||
|
msg->packID = customPackID;
|
||||||
|
msg->init = dataToSend->init;
|
||||||
|
msg->finalSize = dataToSend->sizeExtended;
|
||||||
|
msg->type = TC_SAVE_PERSONAL;
|
||||||
|
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);
|
||||||
|
D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7);
|
||||||
|
dataToSend->init = false;
|
||||||
|
dataToSend->curExtended += msg->packSize - 1;
|
||||||
|
D2FreeMem(PClientGame->memoryPool, msg,__FILE__,__LINE__,0);
|
||||||
|
if (dataToSend->curExtended == dataToSend->sizeExtended)
|
||||||
|
{
|
||||||
|
dataToSend->sizeExtended = 0;
|
||||||
|
dataToSend->curExtended = 0;
|
||||||
|
D2FreeMem(PClientGame->memoryPool, dataToSend->dataExtended,__FILE__,__LINE__,0);
|
||||||
|
dataToSend->dataExtended = NULL;
|
||||||
|
}
|
||||||
|
log_msg("End Send Packet\n");
|
||||||
|
return 0;//ManageNextPacketToSend(ptClient);//return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataToSend->sizeShared && dataToSend->dataShared && (dataToSend->curShared < dataToSend->sizeShared))
|
||||||
|
{
|
||||||
|
DWORD remainingData = dataToSend->sizeShared - dataToSend->curShared;
|
||||||
|
t_rcvMsg* msg = (t_rcvMsg*)D2AllocMem(PClientGame->memoryPool, sizeof(t_rcvMsg),__FILE__,__LINE__,0);
|
||||||
|
msg->packID = customPackID;
|
||||||
|
msg->init = dataToSend->init;
|
||||||
|
msg->finalSize = dataToSend->sizeShared;
|
||||||
|
msg->type = TC_SAVE_SHARED;
|
||||||
|
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);
|
||||||
|
D2SendToClient(0, dataToSend->clientID, msg, msg->packSize+7);
|
||||||
|
dataToSend->init = false;
|
||||||
|
dataToSend->curShared += msg->packSize - 1;
|
||||||
|
D2FreeMem(PClientGame->memoryPool, msg,__FILE__,__LINE__,0);
|
||||||
|
if (dataToSend->curShared == dataToSend->sizeShared)
|
||||||
|
{
|
||||||
|
dataToSend->sizeShared = 0;
|
||||||
|
dataToSend->curShared = 0;
|
||||||
|
D2FreeMem(PClientGame->memoryPool, dataToSend->dataShared,__FILE__,__LINE__,0);
|
||||||
|
dataToSend->dataShared = NULL;
|
||||||
|
}
|
||||||
|
log_msg("End Send Packet\n");
|
||||||
|
return 0;//ManageNextPacketToSend(ptClient);//return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("End Send Packet\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL ReceiveSaveFilesToSave(t_rcvMsg* msg)
|
||||||
|
{
|
||||||
|
if( (msg->packID != customPackID) || !msg->isCustom) return 0;
|
||||||
|
|
||||||
|
log_msg("Saving Receive Packet: type=%X\t init=%d\t finalSize=%X\t packSize=%02X\t data=%08X\n", msg->type, msg->init, msg->finalSize, msg->packSize, msg->data);
|
||||||
|
|
||||||
|
bool isShared;
|
||||||
|
|
||||||
|
if ( msg->type == TC_SAVE_PERSONAL)
|
||||||
|
isShared = false;
|
||||||
|
else if (msg->type == TC_SAVE_SHARED)
|
||||||
|
isShared = true;
|
||||||
|
else return 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (msg->init)
|
||||||
|
{
|
||||||
|
D2FogMemDeAlloc(receivedSaveFiles.dataExtended,__FILE__,__LINE__,0);
|
||||||
|
D2FogMemDeAlloc(receivedSaveFiles.dataShared,__FILE__,__LINE__,0);
|
||||||
|
ZeroMemory(&receivedSaveFiles, sizeof(receivedSaveFiles));//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
DWORD size = msg->packSize - 1;
|
||||||
|
if (isShared)
|
||||||
|
{
|
||||||
|
if (receivedSaveFiles.sizeShared == 0)
|
||||||
|
receivedSaveFiles.sizeShared = msg->finalSize;
|
||||||
|
// d2_assert(receivedSaveFiles.sizeShared != msg->finalSize, "Size of shared file has change", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
if (!receivedSaveFiles.dataShared)
|
||||||
|
receivedSaveFiles.dataShared = (BYTE *)D2FogMemAlloc(receivedSaveFiles.sizeShared,__FILE__,__LINE__,0);
|
||||||
|
|
||||||
|
CopyMemory(&receivedSaveFiles.dataShared[receivedSaveFiles.curShared], msg->data, size);
|
||||||
|
receivedSaveFiles.curShared += size;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (receivedSaveFiles.sizeExtended == 0)
|
||||||
|
receivedSaveFiles.sizeExtended = msg->finalSize;
|
||||||
|
// d2_assert(receivedSaveFiles.sizeExtended != msg->finalSize, "Size of extented file has change", __FILE__, __LINE__);
|
||||||
|
|
||||||
|
if (!receivedSaveFiles.dataExtended)
|
||||||
|
receivedSaveFiles.dataExtended = (BYTE *)D2FogMemAlloc(receivedSaveFiles.sizeExtended,__FILE__,__LINE__,0);
|
||||||
|
|
||||||
|
CopyMemory(&receivedSaveFiles.dataExtended[receivedSaveFiles.curExtended], msg->data, size);
|
||||||
|
receivedSaveFiles.curExtended += size;
|
||||||
|
}
|
||||||
|
log_msg("End Save Receive Packet\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL SaveMPPlayerCustomData(BYTE* dataD2Savefile )
|
||||||
|
{
|
||||||
|
log_msg("Start SaveMPPlayerCustomData.\n");
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
if( receivedSaveFiles.sizeExtended && (receivedSaveFiles.sizeExtended == receivedSaveFiles.curExtended) && receivedSaveFiles.sizeShared && (receivedSaveFiles.sizeShared == receivedSaveFiles.curShared) )
|
||||||
|
{
|
||||||
|
log_msg("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");
|
||||||
|
} else {
|
||||||
|
if (ptChar)
|
||||||
|
{
|
||||||
|
log_box("Connection error : back up current save file then save with client data.");
|
||||||
|
backupSharedSaveFile();
|
||||||
|
backupExtendedSaveFile(PCPlayerData->name);
|
||||||
|
SaveSPPlayerCustomData(ptChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_msg("--- End SaveMPPlayerCustomData. ---\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FCT_ASM ( caller_SendSaveFilesToSave_9 )
|
||||||
|
POP ECX
|
||||||
|
PUSH EAX
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EBX
|
||||||
|
CALL SendSaveFilesToSave
|
||||||
|
MOV EDX,EBX
|
||||||
|
MOV ECX,EDI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SendSaveFilesToSave )
|
||||||
|
POP ECX
|
||||||
|
PUSH EAX
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EBX
|
||||||
|
CALL SendSaveFilesToSave
|
||||||
|
MOV EDX,EBX
|
||||||
|
MOV ECX,EBP
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
*/
|
||||||
|
|
||||||
|
FCT_ASM( caller_ManageNextPacketToSend )
|
||||||
|
PUSH ESI
|
||||||
|
CALL ManageNextPacketToSend
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_caller_ManageNextPacketToSend
|
||||||
|
XOR ECX,ECX
|
||||||
|
RETN
|
||||||
|
end_caller_ManageNextPacketToSend:
|
||||||
|
MOV ECX,DWORD PTR DS:[ESI+0x17C]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_ManageNextPacketToSend_9 )
|
||||||
|
PUSH ESI
|
||||||
|
CALL ManageNextPacketToSend
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_caller_ManageNextPacketToSend_9
|
||||||
|
MOV DWORD PTR DS:[ESI+0x14C],5
|
||||||
|
POP ESI
|
||||||
|
POP ESI
|
||||||
|
RETN
|
||||||
|
end_caller_ManageNextPacketToSend_9:
|
||||||
|
MOV EAX,DWORD PTR DS:[ESI+0x150]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_ManageNextPacketToSend_9d )
|
||||||
|
PUSH ESI
|
||||||
|
CALL ManageNextPacketToSend
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_caller_ManageNextPacketToSend_9d
|
||||||
|
MOV DWORD PTR DS:[ESI+0x170],5
|
||||||
|
POP ESI
|
||||||
|
POP ESI
|
||||||
|
RETN
|
||||||
|
end_caller_ManageNextPacketToSend_9d:
|
||||||
|
MOV EAX,DWORD PTR DS:[ESI+0x174]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM( caller_SendSaveFilesToSave_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x2014]
|
||||||
|
CALL SendSaveFilesToSave
|
||||||
|
MOV EAX,DWORD PTR SS:[ESP+0x8]
|
||||||
|
TEST EAX,EAX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_SendSaveFilesToSave )
|
||||||
|
PUSH EDI
|
||||||
|
CALL SendSaveFilesToSave
|
||||||
|
MOV EDI,DWORD PTR SS:[ESP+0x14]
|
||||||
|
TEST EDI,EDI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_SendSaveFilesToSave_9 )
|
||||||
|
PUSH ESI
|
||||||
|
CALL SendSaveFilesToSave
|
||||||
|
MOV ESI,DWORD PTR SS:[ESP+0x14]
|
||||||
|
TEST ESI,ESI
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_ReceivedSaveFilesToSave_111 )
|
||||||
|
LEA EAX,DWORD PTR SS:[ESP+0x10]
|
||||||
|
PUSH EAX
|
||||||
|
CALL ReceiveSaveFilesToSave
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE continue_rcvFct
|
||||||
|
ADD DWORD PTR SS:[ESP],0x3D
|
||||||
|
RETN
|
||||||
|
continue_rcvFct:
|
||||||
|
MOVZX EAX,BYTE PTR SS:[ESP+0x10]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_ReceivedSaveFilesToSave )
|
||||||
|
CMP EDX,-1
|
||||||
|
JE continue_rcvFct
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
CALL ReceiveSaveFilesToSave
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
TEST EAX,EAX
|
||||||
|
JE continue_rcvFct
|
||||||
|
XOR EAX,EAX
|
||||||
|
ADD ESP,4
|
||||||
|
RETN
|
||||||
|
continue_rcvFct:
|
||||||
|
POP EAX
|
||||||
|
SUB ESP,0x5F4//5F4
|
||||||
|
JMP EAX
|
||||||
|
// JMP DWORD PTR SS:[ESP+0x5F0]
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SaveMPPlayerCustomData_111 )
|
||||||
|
PUSH EAX
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EAX
|
||||||
|
CALL SaveMPPlayerCustomData
|
||||||
|
POP ECX
|
||||||
|
POP EAX
|
||||||
|
CMP ECX,0xAA55AA55
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_SaveMPPlayerCustomData )
|
||||||
|
PUSH ECX
|
||||||
|
PUSH ECX
|
||||||
|
CALL SaveMPPlayerCustomData
|
||||||
|
POP ECX
|
||||||
|
MOV EAX,DWORD PTR DS:[ECX]
|
||||||
|
MOV EDX,DWORD PTR DS:[ECX+4]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Install_SavePlayerData()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled || !active_PlayerCustomData) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game & D2Client for save Player's custom data. (SavePlayerData)\n");
|
||||||
|
|
||||||
|
//Save single player custom data.
|
||||||
|
mem_seek R7(D2Game, 4DF04, 4E304, 5A624, B9365, 25475, 44165, 53F35);
|
||||||
|
MEMJ_REF4( D2FogGetSavePath, 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>
|
||||||
|
|
||||||
|
//Send SaveFiles
|
||||||
|
mem_seek R7(D2Game, 4DFFA, 4E3FA, 5A720, B92DB, 253EB, 440DB, 53EAB);
|
||||||
|
memt_byte( 0x8B ,0x90); // NOP
|
||||||
|
memt_byte( version_D2Game >= V111 ? 0x44 : version_D2Game != V109b ? 0x7C : 0x74 ,0xE8); // CALL
|
||||||
|
MEMT_REF4( version_D2Game >= V111 ? 0xC0850424 : version_D2Game != V109b ? 0xFF851024 : 0xF6851024, version_D2Game >= V111 ? caller_SendSaveFilesToSave_111 : version_D2Game != V109b ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9);
|
||||||
|
//6FC8A720 |. 8B7C24 10 MOV EDI,DWORD PTR SS:[ESP+10]
|
||||||
|
//6FC8A724 |. 85FF TEST EDI,EDI
|
||||||
|
//020392DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||||
|
//020392DF |. 85C0 TEST EAX,EAX
|
||||||
|
//01F953EB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||||
|
//01F953EF |. 85C0 TEST EAX,EAX
|
||||||
|
//6FC640DB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||||
|
//6FC640DF |. 85C0 TEST EAX,EAX
|
||||||
|
//6FC73EAB |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
|
||||||
|
//6FC73EAF |. 85C0 TEST EAX,EAX
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 7993, 7A13, 7BBB, E2943, E6D83, A89D3, 2D173);
|
||||||
|
memt_byte( 0x8B ,0x90); // NOP
|
||||||
|
memt_byte( version_D2Game >= V110 ? 0x8E : 0x86 ,0xE8); // CALL
|
||||||
|
MEMT_REF4( version_D2Game >= V110 ? 0x0000017C : version_D2Game == V109d ? 0x0000174 : 0x00000150, version_D2Game >= V110 ? caller_ManageNextPacketToSend : version_D2Game == V109d ? caller_ManageNextPacketToSend_9d : caller_ManageNextPacketToSend_9);
|
||||||
|
//6FC37BBB |> 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||||
|
//02062943 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||||
|
//02056D83 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||||
|
//6FCC89D3 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||||
|
//6FC4D173 |. 8B8E 7C010000 MOV ECX,DWORD PTR DS:[ESI+17C]
|
||||||
|
|
||||||
|
// mem_seek R7(D2Game, 7B82, 7C05, 7DCF, 0000, 0000, 0000, 0000);//117FC, 117EC, 11DBC
|
||||||
|
// memt_byte( 0x8B ,0xE8); // CALL
|
||||||
|
// MEMT_REF4( (version_D2Game == V110) ? 0x50CD8BD3 : 0x50CF8BD3, (version_D2Game == V110) ? caller_SendSaveFilesToSave : caller_SendSaveFilesToSave_9);
|
||||||
|
//6FC37DCF |. 8BD3 |MOV EDX,EBX
|
||||||
|
//6FC37DD1 |. 8BCD |MOV ECX,EBP
|
||||||
|
//6FC37DD3 |. 50 |PUSH EAX
|
||||||
|
|
||||||
|
if ( version_D2Game >= V111 )
|
||||||
|
{
|
||||||
|
//Received SaveFiles
|
||||||
|
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 43946);
|
||||||
|
memt_byte( 0x0F ,0xE8);
|
||||||
|
MEMT_REF4( 0x0C2444B6, caller_ReceivedSaveFilesToSave_111);
|
||||||
|
//6FB39246 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||||
|
//6FAE2076 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||||
|
//6FB2BCD6 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||||
|
//6FAF3946 |. 0FB64424 0C |MOVZX EAX,BYTE PTR SS:[ESP+C]
|
||||||
|
|
||||||
|
// Save multiplayer player custom data.
|
||||||
|
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, AC572);
|
||||||
|
memt_byte( 0x81 ,0xE8); // CALL
|
||||||
|
MEMT_REF4( 0x55AA55F9, caller_SaveMPPlayerCustomData_111);
|
||||||
|
memt_byte( 0xAA ,0x90); // CALL
|
||||||
|
//6FB49AE2 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||||
|
//6FB6D7F2 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||||
|
//6FB14A22 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||||
|
//6FB5C572 |. 81F9 55AA55AA CMP ECX,AA55AA55
|
||||||
|
} else {
|
||||||
|
//Received SaveFiles
|
||||||
|
mem_seek R7(D2Client, 116F0, 116E0, 11CB0, 89246, 32076, 7BCD6, 0000);
|
||||||
|
memt_byte( 0x81 ,0x90); // NOP
|
||||||
|
memt_byte( 0xEC ,0xE8); // CALL
|
||||||
|
MEMT_REF4( 0x000005F4, caller_ReceivedSaveFilesToSave);
|
||||||
|
//6FAB1CB0 |$ 81EC F4050000 SUB ESP,5F4
|
||||||
|
|
||||||
|
// Save multiplayer player custom data.
|
||||||
|
mem_seek R7(D2Client, 117FC, 117EC, 11DBC, 99AE2, BD7F2, 64A22, 0000);
|
||||||
|
memt_byte( 0x8B ,0xE8); // CALL
|
||||||
|
MEMT_REF4( 0x04518B01, caller_SaveMPPlayerCustomData);
|
||||||
|
//6FAB1DBC |. 8B01 MOV EAX,DWORD PTR DS:[ECX]
|
||||||
|
//6FAB1DBE |. 8B51 04 MOV EDX,DWORD PTR DS:[ECX+4]
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( version_D2Game == V109b || version_D2Game == V109d )
|
||||||
|
customPackID = 0xAB;
|
||||||
|
else if ( version_D2Game >= V111 )
|
||||||
|
customPackID++;
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
221
PlugY/SharedSaveFile.cpp
Normal file
221
PlugY/SharedSaveFile.cpp
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file shared by all own characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "sharedSaveFile.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "customLibraries.h"
|
||||||
|
|
||||||
|
#define FILE_SHAREDSTASH 0x00535353 //"SSS "
|
||||||
|
#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];
|
||||||
|
BYTE* data=NULL;
|
||||||
|
BYTE isHardCore=0;
|
||||||
|
FILE* file=NULL;
|
||||||
|
|
||||||
|
if (separateHardSoftStash)//Get hardcore flag
|
||||||
|
{
|
||||||
|
D2FogGetSavePath( filename, 512-strlen(name)-5);
|
||||||
|
strcat(filename,name);
|
||||||
|
strcat(filename,".d2s");
|
||||||
|
log_msg("Normal file to read if it's hardcore character : %s\n",filename);
|
||||||
|
file = fopen(filename, "rb");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fseek(file, 0x24, SEEK_SET);
|
||||||
|
DWORD nbRead = fread(&isHardCore, 1, 1, file);
|
||||||
|
isHardCore = (nbRead==1)? ((isHardCore & 4) == 4) : 0;
|
||||||
|
fclose(file);
|
||||||
|
file=NULL;
|
||||||
|
}
|
||||||
|
log_msg("%s is a HardCore character = %d\n",name,isHardCore);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_sharedStash)
|
||||||
|
{
|
||||||
|
D2FogGetSavePath( filename, 512-strlen("_LOD_HC_SharedStashSave")-5);
|
||||||
|
strcat(filename,isHardCore? "_LOD_HC_" : "_LOD_");
|
||||||
|
strcat(filename, sharedStashFilename);
|
||||||
|
strcat(filename,".sss");
|
||||||
|
|
||||||
|
log_msg("Shared file to read : %s\n",filename);
|
||||||
|
|
||||||
|
file = fopen(filename, "rb");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
*size = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0);
|
||||||
|
DWORD nbRead = fread(data, 1, *size, file);
|
||||||
|
fclose(file);
|
||||||
|
d2_assert(nbRead != *size , "nbRead from shared save file != size", __FILE__, __LINE__);
|
||||||
|
} else {
|
||||||
|
log_msg("Can't open shared save file in mode \"rb\" (is not an error if it's the first start of the mod)\n");
|
||||||
|
*size = 14;
|
||||||
|
DWORD maxSize = 100;
|
||||||
|
data = (BYTE*)D2FogMemAlloc(maxSize,__FILE__,__LINE__,0);
|
||||||
|
*((DWORD *)&data[0]) = FILE_SHAREDSTASH;
|
||||||
|
*((WORD *)&data[4]) = FILE_VERSION;
|
||||||
|
*((DWORD *)&data[6]) = 0;
|
||||||
|
*((DWORD *)&data[10]) = 0;// number of stash
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (currentDll)
|
||||||
|
{
|
||||||
|
currentDll->initSharedSaveFile(&data, &maxSize, size);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int loadSharedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)
|
||||||
|
{
|
||||||
|
if ( !ptChar || !data) return false;
|
||||||
|
|
||||||
|
log_msg("Load shared file\n");
|
||||||
|
|
||||||
|
DWORD curSize = 0;
|
||||||
|
|
||||||
|
if (*(DWORD*)&data[curSize] != FILE_SHAREDSTASH)
|
||||||
|
{
|
||||||
|
log_msg("loadSharedSaveFile -> bad header\n");
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
curSize += 4;
|
||||||
|
|
||||||
|
if (*(WORD *)&data[curSize] == 0x3130) {//"01"
|
||||||
|
curSize += 2;
|
||||||
|
PCPY->sharedGold = 0;
|
||||||
|
} else if (*(WORD *)&data[curSize] == FILE_VERSION) {
|
||||||
|
curSize += 2;
|
||||||
|
PCPY->sharedGold = *(DWORD*)&data[curSize];
|
||||||
|
curSize += 4;
|
||||||
|
} else {
|
||||||
|
log_msg("loadSharedSaveFile -> bad file version : %04X\n", *(WORD *)&data[curSize]);
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ret = loadStashList(ptChar, data, maxSize, &curSize, true);
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (!ret && currentDll)
|
||||||
|
{
|
||||||
|
ret = currentDll->loadSharedSaveFile(ptChar, data, maxSize, &curSize);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
|
||||||
|
PCPY->sharedStashIsOpened = true;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void writeSharedSaveFile(char* name, BYTE* data, DWORD size, bool isHardcore)
|
||||||
|
{
|
||||||
|
char szTempName[MAX_PATH];
|
||||||
|
char szSaveName[MAX_PATH];
|
||||||
|
|
||||||
|
//Get temporary savefile name.
|
||||||
|
D2FogGetSavePath( szTempName, MAX_PATH-30);
|
||||||
|
strcat(szTempName, separateHardSoftStash && isHardcore? "_LOD_HC_" : "_LOD_");
|
||||||
|
strcat(szTempName, sharedStashFilename);
|
||||||
|
strcat(szTempName,".ss~");
|
||||||
|
log_msg("Shared temporary file for saving : %s\n", szTempName);
|
||||||
|
|
||||||
|
//Write data in savefile.
|
||||||
|
FILE* customSaveFile = fopen(szTempName, "wb+");
|
||||||
|
fwrite(data, size, 1, customSaveFile);
|
||||||
|
fclose(customSaveFile);
|
||||||
|
|
||||||
|
//Get real savefile name.
|
||||||
|
D2FogGetSavePath( szSaveName, MAX_PATH-30);
|
||||||
|
strcat(szSaveName, separateHardSoftStash && isHardcore? "_LOD_HC_" : "_LOD_");
|
||||||
|
strcat(szSaveName, sharedStashFilename);
|
||||||
|
strcat(szSaveName,".sss");
|
||||||
|
log_msg("Shared file for saving : %s\n", szSaveName);
|
||||||
|
|
||||||
|
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
|
||||||
|
DeleteFile(szSaveName);
|
||||||
|
if (!MoveFile(szTempName, szSaveName))
|
||||||
|
log_box("Could not create the shared save file.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void backupSharedSaveFile()
|
||||||
|
{
|
||||||
|
char szBackupName[MAX_PATH];
|
||||||
|
char szSaveName[MAX_PATH];
|
||||||
|
|
||||||
|
D2FogGetSavePath( szSaveName, MAX_PATH-30);
|
||||||
|
strcat(szSaveName, "_LOD_");
|
||||||
|
strcat(szSaveName, sharedStashFilename);
|
||||||
|
strcat(szSaveName,".sss");
|
||||||
|
|
||||||
|
D2FogGetSavePath( szBackupName, MAX_PATH-30);
|
||||||
|
strcat(szBackupName, "_LOD_");
|
||||||
|
strcat(szBackupName, sharedStashFilename);
|
||||||
|
strcat(szBackupName,".sss.backup");
|
||||||
|
|
||||||
|
CopyFile(szSaveName, szBackupName, true);
|
||||||
|
|
||||||
|
if (separateHardSoftStash)
|
||||||
|
{
|
||||||
|
D2FogGetSavePath( szSaveName, MAX_PATH-30);
|
||||||
|
strcat(szSaveName, "_LOD_HC_");
|
||||||
|
strcat(szSaveName, sharedStashFilename);
|
||||||
|
strcat(szSaveName,".sss");
|
||||||
|
|
||||||
|
D2FogGetSavePath( szBackupName, MAX_PATH-30);
|
||||||
|
strcat(szBackupName, "_LOD_HC_");
|
||||||
|
strcat(szBackupName, sharedStashFilename);
|
||||||
|
strcat(szBackupName,".sss.backup");
|
||||||
|
|
||||||
|
CopyFile(szSaveName, szBackupName, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
|
||||||
|
{
|
||||||
|
*(DWORD *)(*data + *curSize) = FILE_SHAREDSTASH;
|
||||||
|
*curSize += 4;
|
||||||
|
if (PCPY->sharedGold)
|
||||||
|
{
|
||||||
|
*(WORD *)(*data + *curSize) = FILE_VERSION;
|
||||||
|
*curSize += 2;
|
||||||
|
|
||||||
|
*(DWORD *)(*data + *curSize) = PCPY->sharedGold;
|
||||||
|
*curSize += 4;
|
||||||
|
} else {
|
||||||
|
*(WORD *)(*data + *curSize) = 0x3130;
|
||||||
|
*curSize += 2;
|
||||||
|
}
|
||||||
|
saveStashList(ptChar, PCPY->sharedStash, data, maxSize, curSize);
|
||||||
|
|
||||||
|
TCustomDll* currentDll = customDlls;
|
||||||
|
while (currentDll)
|
||||||
|
{
|
||||||
|
currentDll->saveSharedSaveFile(ptChar, data, maxSize, curSize);
|
||||||
|
currentDll=currentDll->nextDll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
53
PlugY/SkillPerLevelUp.cpp
Normal file
53
PlugY/SkillPerLevelUp.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Change Skill win per level up.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "skillPerLevelUp.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
bool active_SkillPerLevelUpChange=0;
|
||||||
|
DWORD skillPerLevelUp=1;
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_changeSkillPerLevelUp_111 )
|
||||||
|
MOV EAX,skillPerLevelUp
|
||||||
|
IMUL EAX,EBX
|
||||||
|
MOV DWORD PTR SS:[ESP+0xC], EAX
|
||||||
|
JMP V2AddPlayerStat
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_changeSkillPerLevelUp )
|
||||||
|
MOV EAX,skillPerLevelUp
|
||||||
|
IMUL EAX,EDI
|
||||||
|
MOV DWORD PTR SS:[ESP+0xC], EAX
|
||||||
|
JMP V2AddPlayerStat
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_SkillPerLevelUp()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n");
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5);
|
||||||
|
MEMJ_REF4( V2AddPlayerStat, 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>
|
||||||
|
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
97
PlugY/SkillsPoints.cpp
Normal file
97
PlugY/SkillsPoints.cpp
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Unassign Skill Point for futher re-assignment.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include "interface_Skills.h" // Install_InterfaceSkills()
|
||||||
|
|
||||||
|
bool active_SkillsPoints=0;
|
||||||
|
bool unassignSkillsPointsOneByOne=0;
|
||||||
|
|
||||||
|
int (*getskPoint)(SkillData* ptSkill);
|
||||||
|
int (*getCharClass)(SkillData* ptSkill);
|
||||||
|
TD2GetPlayerStat getSingleSkillValue;
|
||||||
|
|
||||||
|
int getskPoint_109(SkillData* ptSkill) {return -1;}
|
||||||
|
int getskPoint_11X(SkillData* ptSkill) {return ptSkill->ptSkillBin->skpoints;}
|
||||||
|
|
||||||
|
int getCharClass_109(SkillData* ptSkill) {return *(&ptSkill->ptSkillBin->charclass+8);}
|
||||||
|
int getCharClass_11X(SkillData* ptSkill) {return ptSkill->ptSkillBin->charclass;}
|
||||||
|
|
||||||
|
int STDCALL getSingleSkillValue_109(Unit* ptChar, DWORD , DWORD skillID)
|
||||||
|
{
|
||||||
|
DWORD stat;
|
||||||
|
DWORD ret=0;
|
||||||
|
stat = D2GetPlayerStat(ptChar, STATS_ITEM_SINGLESKILL+0, skillID);
|
||||||
|
if ((stat & 255) == skillID) ret += (stat >> 8) & 255;
|
||||||
|
stat = D2GetPlayerStat(ptChar, STATS_ITEM_SINGLESKILL+1, skillID);
|
||||||
|
if ((stat & 255) == skillID) ret += (stat >> 8) & 255;
|
||||||
|
stat = D2GetPlayerStat(ptChar, STATS_ITEM_SINGLESKILL+2, skillID);
|
||||||
|
if ((stat & 255) == skillID) ret += (stat >> 8) & 255;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignAllSkillsPoints(Unit* ptChar)
|
||||||
|
{
|
||||||
|
DWORD skillID, keepBonus, maxSkillLevel;
|
||||||
|
int skpoints;
|
||||||
|
DWORD nbPoints = 0;
|
||||||
|
void* ptClient = D2GetClient(ptChar,__FILE__,__LINE__);
|
||||||
|
SkillData* ptSkill = PCSkills->ptFirstSkill;
|
||||||
|
while (ptSkill)
|
||||||
|
{
|
||||||
|
if (getCharClass(ptSkill) == ptChar->nPlayerClass)//ptSkill->ptSkillBin->charclass
|
||||||
|
if (ptSkill->state == -1)
|
||||||
|
{
|
||||||
|
skillID = ptSkill->ptSkillBin->skillID;
|
||||||
|
keepBonus = !getSingleSkillValue(ptChar, STATS_ITEM_SINGLESKILL, skillID);
|
||||||
|
maxSkillLevel = D2GetSkillLevel(ptChar, ptSkill, 0);
|
||||||
|
skpoints = getskPoint(ptSkill);
|
||||||
|
if (skpoints == -1 || unassignSkillsPointsOneByOne)
|
||||||
|
{
|
||||||
|
D2SetSkillBaseLevel(ptChar, skillID, 0, keepBonus, __FILE__, __LINE__);
|
||||||
|
nbPoints += maxSkillLevel;
|
||||||
|
} else {
|
||||||
|
while (maxSkillLevel--)
|
||||||
|
{
|
||||||
|
D2SetSkillBaseLevel(ptChar, skillID, maxSkillLevel, keepBonus, __FILE__, __LINE__);
|
||||||
|
nbPoints += D2GetSkillCost(ptChar, skpoints, skillID, maxSkillLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
D2SetSkillBaseLevelOnClient(ptClient, ptChar, skillID, 0, keepBonus);
|
||||||
|
}
|
||||||
|
ptSkill = ptSkill->ptNextSkill;
|
||||||
|
}
|
||||||
|
// Add new free skill points
|
||||||
|
D2AddPlayerStat( ptChar, STATS_NEWSKILLS, nbPoints, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Install_SkillsPoints()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_InterfaceSkills();
|
||||||
|
Install_UpdateServer();
|
||||||
|
|
||||||
|
if ( version_D2Common >= V110 )
|
||||||
|
{
|
||||||
|
getskPoint = getskPoint_11X;
|
||||||
|
getCharClass = getCharClass_11X;
|
||||||
|
getSingleSkillValue = D2GetPlayerStat;
|
||||||
|
} else {
|
||||||
|
getskPoint = getskPoint_109;
|
||||||
|
getCharClass = getCharClass_109;
|
||||||
|
getSingleSkillValue = getSingleSkillValue_109;
|
||||||
|
}
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
50
PlugY/StatPerLevelUp.cpp
Normal file
50
PlugY/StatPerLevelUp.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Change Stat win per level up.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "statPerLevelUp.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
bool active_StatPerLevelUpChange=0;
|
||||||
|
DWORD statPerLevelUp=5;
|
||||||
|
|
||||||
|
FCT_ASM ( caller_changeStatPerLevelUp_111 )
|
||||||
|
MOV EAX,statPerLevelUp
|
||||||
|
IMUL EAX,EBX
|
||||||
|
MOV DWORD PTR SS:[ESP+0xC], EAX
|
||||||
|
JMP V2AddPlayerStat
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_changeStatPerLevelUp )
|
||||||
|
MOV EAX,statPerLevelUp
|
||||||
|
IMUL EAX,EDI
|
||||||
|
MOV DWORD PTR SS:[ESP+0xC], EAX
|
||||||
|
JMP V2AddPlayerStat
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_StatPerLevelUp()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n");
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA);
|
||||||
|
MEMJ_REF4( V2AddPlayerStat, 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>
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
494
PlugY/StatsPoints.cpp
Normal file
494
PlugY/StatsPoints.cpp
Normal file
@ -0,0 +1,494 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Unassign Stats Point for futher re-assignment.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
||||||
|
#include "interface_Stats.h" // Install_InterfaceStats()
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
bool active_StatsPoints=0;
|
||||||
|
DWORD keyUsedForUnassignStatPoint=VK_CONTROL;
|
||||||
|
bool active_StatsShiftClickLimit=1;
|
||||||
|
DWORD limitValueToShiftClick=5;
|
||||||
|
|
||||||
|
void UnassignStr(Unit* ptChar, int nb)
|
||||||
|
{
|
||||||
|
log_msg("Start Unassign Strengh\n");
|
||||||
|
|
||||||
|
int currentStr, removePtsNb;
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
|
||||||
|
currentStr = D2GetPlayerBaseStat( ptChar, STATS_STRENGTH, 0 );
|
||||||
|
if (currentStr <= charStats->baseSTR) return;
|
||||||
|
removePtsNb = currentStr - charStats->baseSTR >= nb ? nb : currentStr - charStats->baseSTR;
|
||||||
|
if (currentStr - removePtsNb < 1) removePtsNb = currentStr - 1;
|
||||||
|
|
||||||
|
log_msg("Start Unassign Strengh (cur %d, base %d, rem %d)\n",currentStr,charStats->baseSTR,removePtsNb);
|
||||||
|
D2AddPlayerStat( ptChar, STATS_STRENGTH, -removePtsNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_STATPTS, removePtsNb ,0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignDex(Unit* ptChar, int nb)
|
||||||
|
{
|
||||||
|
log_msg("Start Unassign Dexterity\n");
|
||||||
|
|
||||||
|
int currentDex, removePtsNb;
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
|
||||||
|
currentDex = D2GetPlayerBaseStat( ptChar, STATS_DEXTERITY, 0 );
|
||||||
|
if (currentDex <= charStats->baseDEX) return;
|
||||||
|
removePtsNb = currentDex - charStats->baseDEX >= nb ? nb : currentDex - charStats->baseDEX;
|
||||||
|
if (currentDex - removePtsNb < 1) removePtsNb = currentDex - 1;
|
||||||
|
|
||||||
|
log_msg("Start Unassign Dexterity (cur %d, base %d, rem %d)\n",currentDex,charStats->baseDEX,removePtsNb);
|
||||||
|
D2AddPlayerStat( ptChar, STATS_DEXTERITY, -removePtsNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_STATPTS, removePtsNb ,0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignVit(Unit* ptChar, int nb)
|
||||||
|
{
|
||||||
|
log_msg("Start Unassign Vitality\n");
|
||||||
|
|
||||||
|
int currentVit, removePtsNb, removeVitNb, removeStaNb;
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
|
||||||
|
currentVit = D2GetPlayerBaseStat( ptChar, STATS_VITALITY, 0 );
|
||||||
|
if (currentVit <= charStats->baseVIT) return;
|
||||||
|
removePtsNb = currentVit - charStats->baseVIT >= nb ? nb : currentVit - charStats->baseVIT;
|
||||||
|
if (currentVit - removePtsNb < 1) removePtsNb = currentVit - 1;
|
||||||
|
removeVitNb = removePtsNb * (charStats->lifePerVitality << 6);
|
||||||
|
removeStaNb = removePtsNb * (charStats->staminaPerVitality << 6);
|
||||||
|
|
||||||
|
log_msg("Start Unassign Vitality (cur %d, base %d, rem %d)\n",currentVit,charStats->baseVIT,removePtsNb);
|
||||||
|
D2AddPlayerStat( ptChar, STATS_VITALITY, -removePtsNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_MAXHP, -removeVitNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_MAXSTAMINA, -removeStaNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_STATPTS, removePtsNb ,0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignEne(Unit* ptChar, int nb)
|
||||||
|
{
|
||||||
|
log_msg("Start Unassign Energy\n");
|
||||||
|
|
||||||
|
int currentEne, removePtsNb, removeManNb;
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
|
||||||
|
currentEne = D2GetPlayerBaseStat( ptChar, STATS_ENERGY, 0);
|
||||||
|
if (currentEne <= charStats->baseENE) return;
|
||||||
|
removePtsNb = currentEne - charStats->baseENE >= nb ? nb : currentEne - charStats->baseENE;
|
||||||
|
if (currentEne - removePtsNb < 1) removePtsNb = currentEne - 1;
|
||||||
|
removeManNb = removePtsNb * (charStats->manaPerMagic << 6);
|
||||||
|
|
||||||
|
log_msg("Start Unassign Energy (cur %d, base %d, rem %d)\n",currentEne,charStats->baseENE,removePtsNb);
|
||||||
|
D2AddPlayerStat( ptChar, STATS_ENERGY, -removePtsNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_MAXMANA, -removeManNb ,0 );
|
||||||
|
D2AddPlayerStat( ptChar, STATS_STATPTS, removePtsNb ,0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignStrPoint(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignStr(ptChar, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignStrPoints(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignStr(ptChar, active_StatsShiftClickLimit ? limitValueToShiftClick: 0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignDexPoint(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignDex(ptChar, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignDexPoints(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignDex(ptChar, active_StatsShiftClickLimit ? limitValueToShiftClick: 0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignVitPoint(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignVit(ptChar, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignVitPoints(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignVit(ptChar, active_StatsShiftClickLimit ? limitValueToShiftClick: 0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignEnePoint(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignEne(ptChar, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnassignEnePoints(Unit* ptChar)
|
||||||
|
{
|
||||||
|
UnassignEne(ptChar, active_StatsShiftClickLimit ? limitValueToShiftClick: 0x7FFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
void STDCALL printDisabledStatsBtn(WORD statID, sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6)
|
||||||
|
{
|
||||||
|
if ( onRealm || !D2isLODGame())
|
||||||
|
{
|
||||||
|
D2PrintImage(data,x,y,p4,p5,p6);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
int minValue=1;
|
||||||
|
switch (statID)
|
||||||
|
{
|
||||||
|
case STATS_STRENGTH: minValue = charStats->baseSTR; break;
|
||||||
|
case STATS_DEXTERITY: minValue = charStats->baseDEX; break;
|
||||||
|
case STATS_VITALITY: minValue = charStats->baseVIT; break;
|
||||||
|
case STATS_ENERGY: minValue = charStats->baseENE; break;
|
||||||
|
}
|
||||||
|
int statValue = D2GetPlayerBaseStat(ptChar, statID, 0);
|
||||||
|
|
||||||
|
if (isOnRect(D2GetMouseX(),D2GetMouseY(),x+5,y+5,32,32))
|
||||||
|
{
|
||||||
|
WCHAR text[100];
|
||||||
|
if (active_StatsShiftClickLimit)
|
||||||
|
swprintf(text, getTranslatedString(STR_STATS_UNASSIGN_WITH_LIMIT),limitValueToShiftClick);
|
||||||
|
else
|
||||||
|
swprintf(text, getTranslatedString(STR_STATS_UNASSIGN_WITHOUT_LIMIT));
|
||||||
|
wcscat(text,L"\n");
|
||||||
|
swprintf(text+wcslen(text), getTranslatedString(STR_STATS_BASE_MIN), statValue, minValue);
|
||||||
|
D2SetFont(1);
|
||||||
|
D2PrintPopup(text, x+18, y-32, WHITE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( GetKeyState(keyUsedForUnassignStatPoint) >= 0) {
|
||||||
|
if ( D2GetPlayerBaseStat(ptChar, 4, 0) <= 0)
|
||||||
|
setFrame(data, 2);
|
||||||
|
} else {
|
||||||
|
setImage(data, unassignStatsBtnImages);
|
||||||
|
if (minValue >= statValue)
|
||||||
|
setFrame(data, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
D2PrintImage(data,x,y,p4,p5,p6);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_printUnassignStatsBtn )
|
||||||
|
POP EAX
|
||||||
|
XOR ECX,ECX
|
||||||
|
MOV CX,WORD PTR DS:[ESI+8]
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EAX
|
||||||
|
JMP printDisabledStatsBtn
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BYTE currentMsgID=0;
|
||||||
|
|
||||||
|
WORD UnassignStats()
|
||||||
|
{
|
||||||
|
if (onRealm || !D2isLODGame()) return 0;
|
||||||
|
return GetKeyState(keyUsedForUnassignStatPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_UnassignStats_9 )
|
||||||
|
PUSH EAX
|
||||||
|
CALL UnassignStats
|
||||||
|
TEST AX,AX
|
||||||
|
POP EAX
|
||||||
|
JNL NOT_CTRL
|
||||||
|
|
||||||
|
MOV currentMsgID,0x10
|
||||||
|
TEST AX,AX
|
||||||
|
JNL NOT_SHIFT
|
||||||
|
ADD currentMsgID,4
|
||||||
|
NOT_SHIFT:
|
||||||
|
MOV EAX,1
|
||||||
|
MOV ESI,EAX
|
||||||
|
RETN
|
||||||
|
|
||||||
|
NOT_CTRL:
|
||||||
|
MOV currentMsgID,0
|
||||||
|
TEST AX,AX
|
||||||
|
MOV EAX,1
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_UnassignStats )
|
||||||
|
PUSH EAX
|
||||||
|
CALL UnassignStats
|
||||||
|
TEST AX,AX
|
||||||
|
POP EAX
|
||||||
|
JNL NOT_CTRL
|
||||||
|
|
||||||
|
MOV currentMsgID,0x10
|
||||||
|
TEST AX,AX
|
||||||
|
JNL NOT_SHIFT
|
||||||
|
ADD currentMsgID,4
|
||||||
|
NOT_SHIFT:
|
||||||
|
MOV ESI,1
|
||||||
|
ADD DWORD PTR SS:[ESP],0xB
|
||||||
|
RETN
|
||||||
|
|
||||||
|
NOT_CTRL:
|
||||||
|
MOV currentMsgID,0
|
||||||
|
TEST AX,AX
|
||||||
|
JNL END_UNASSGNSTATS
|
||||||
|
ADD DWORD PTR SS:[ESP],0x7
|
||||||
|
END_UNASSGNSTATS:
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_setValue_111 )
|
||||||
|
ADD CL,currentMsgID
|
||||||
|
MOV WORD PTR SS:[ESP+0x19],CX
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_setValue )
|
||||||
|
ADD DL,currentMsgID
|
||||||
|
JMP D2SendToServer3
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DWORD STDCALL pushDown (DWORD num)
|
||||||
|
{
|
||||||
|
Unit* ptChar = D2GetClientPlayer();
|
||||||
|
|
||||||
|
if ( !D2isLODGame() || GetKeyState(keyUsedForUnassignStatPoint) >= 0)//GetAsyncKeyState
|
||||||
|
{
|
||||||
|
if ( D2GetPlayerBaseStat(ptChar, 4, 0) > 0)
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
|
||||||
|
switch (num)
|
||||||
|
{
|
||||||
|
case 0: if ((DWORD)charStats->baseSTR < (DWORD)D2GetPlayerBaseStat(ptChar, STATS_STRENGTH, 0))
|
||||||
|
return 1; break;
|
||||||
|
case 1: if ((DWORD)charStats->baseDEX < (DWORD)D2GetPlayerBaseStat(ptChar, STATS_DEXTERITY, 0))
|
||||||
|
return 1; break;
|
||||||
|
case 2: if ((DWORD)charStats->baseVIT < (DWORD)D2GetPlayerBaseStat(ptChar, STATS_VITALITY, 0))
|
||||||
|
return 1; break;
|
||||||
|
case 3: if ((DWORD)charStats->baseENE < (DWORD)D2GetPlayerBaseStat(ptChar, STATS_ENERGY, 0))
|
||||||
|
return 1; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_pushDown_111 )
|
||||||
|
PUSH EDX
|
||||||
|
PUSH EDX
|
||||||
|
CALL pushDown
|
||||||
|
POP EDX
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_pushDown
|
||||||
|
SUB DWORD PTR SS:[ESP],0x22
|
||||||
|
RETN
|
||||||
|
end_pushDown:
|
||||||
|
MOV EDI,1
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_pushDown )
|
||||||
|
PUSH EDX
|
||||||
|
PUSH EDX
|
||||||
|
CALL pushDown
|
||||||
|
POP EDX
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ end_pushDown
|
||||||
|
SUB DWORD PTR SS:[ESP],0x22
|
||||||
|
RETN
|
||||||
|
end_pushDown:
|
||||||
|
LEA EAX,DWORD PTR DS:[EDX*8]
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_StatsPoints()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
Install_PlugYImagesFiles();
|
||||||
|
// Install_InterfaceStats();
|
||||||
|
Install_UpdateServer();
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for unassign stat points when specified key is press. (StatsPoints)\n");
|
||||||
|
//if ( version_D2Client < V113 )
|
||||||
|
{
|
||||||
|
// Always print stat button images.
|
||||||
|
mem_seek R7(D2Client, 29B12, 29B02, 30073, 82BBA, 8963A, 6B59A, BD1B5);
|
||||||
|
memt_byte( 0x8B, 0xEB ); // JMP SHORT D2Client.6FAD0088
|
||||||
|
memt_byte( 0x4C, V7(D2Client, 12, 12, 13, 13, 13, 13, 13) );
|
||||||
|
memt_byte( 0x24, 0x90 ); // NOP
|
||||||
|
memt_byte( V7(D2Client, 20, 20, 14, 1C, 1C, 1C, 1C), 0x90 ); // NOP (V109d:0x20 , V110:0x14
|
||||||
|
//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]
|
||||||
|
|
||||||
|
//print our buttons
|
||||||
|
mem_seek R7(D2Client, 29B9D, 29B8D, 300FD, 82C54, 896D4, 6B637, BD23E);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// Always manage push down.
|
||||||
|
mem_seek R7(D2Client, 2AA7B, 2AA6B, 3134D, 827D9, 89259, 6B1B9, BCDD9);
|
||||||
|
memt_byte( 0x74, 0x90 ); // NOP
|
||||||
|
memt_byte( 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
|
||||||
|
|
||||||
|
if ( version_D2Client >= V111 )
|
||||||
|
{
|
||||||
|
// On Push down.
|
||||||
|
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 6B224, BCE44);
|
||||||
|
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
|
||||||
|
//6FB392C7 . BF 01000000 MOV EDI,1
|
||||||
|
//6FB1B224 6BD2 0E IMUL EDX,EDX,0E
|
||||||
|
//6FB1B227 BF 01000000 MOV EDI,1
|
||||||
|
//6FB6CE44 > 6BD2 0E IMUL EDX,EDX,0E
|
||||||
|
//6FB6CE47 . BF 01000000 MOV EDI,1
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// On Push down.
|
||||||
|
mem_seek R7(D2Client, 2AAE6, 2AAD6, 313B8, 82844, 892C4, 0000, 0000);
|
||||||
|
memt_byte( 0x8D, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x0000D504, caller_pushDown);
|
||||||
|
memt_byte( 0x00, 0x90 ); // NOP
|
||||||
|
memt_byte( 0x00, 0x90 ); // NOP
|
||||||
|
//6FAD13B8 8D04D5 00000000 LEA EAX,DWORD PTR DS:[EDX*8]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( version_D2Client >= V110 )
|
||||||
|
{
|
||||||
|
// Always manage push up.
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 3152E, 83869, 8A2E9, 6C249, BDE49);
|
||||||
|
memt_byte( 0x74, 0x90 ); // NOP
|
||||||
|
memt_byte( version_D2Client >= V111 ? 0x65 : 0x68, 0x90 ); // NOP
|
||||||
|
//6FAD152E 74 68 JE SHORT D2Client.6FAD1598
|
||||||
|
//6FB33869 . 74 65 JE SHORT D2Client.6FB338D0
|
||||||
|
//6FB3A2E9 . 74 65 JE SHORT D2Client.6FB3A350
|
||||||
|
//6FB1C249 74 65 JE SHORT D2Client.6FB1C2B0
|
||||||
|
//6FB6DE49 . 74 65 JE SHORT D2Client.6FB6DEB0
|
||||||
|
|
||||||
|
// Unassign stats point when ctrl is push.
|
||||||
|
mem_seek R7(D2Client, 0000, 0000, 315D3, 8391B, 8A39B, 6C2FB, BDEFB);
|
||||||
|
memt_byte( 0x66, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x077CC085, caller_UnassignStats);
|
||||||
|
//6FAD15D3 . 66:85C0 TEST AX,AX
|
||||||
|
//6FAD15D6 . 7C 07 JL SHORT D2Client.6FAD15DF
|
||||||
|
//6FB3391B . 66:85C0 TEST AX,AX
|
||||||
|
//6FB3391E . 7C 07 JL SHORT D2Client.6FB33927
|
||||||
|
//6FB3A39B . 66:85C0 TEST AX,AX
|
||||||
|
//6FB3A39E . 7C 07 JL SHORT D2Client.6FB3A3A7
|
||||||
|
//6FB1C2FB . 66:85C0 TEST AX,AX
|
||||||
|
//6FB1C2FE . 7C 07 JL SHORT D2Client.6FB1C307
|
||||||
|
//6FB6DEFB . 66:85C0 TEST AX,AX
|
||||||
|
//6FB6DEFE . 7C 07 JL SHORT D2Client.6FB6DF07
|
||||||
|
} else {
|
||||||
|
// Always manage push up.
|
||||||
|
mem_seek R7(D2Client, 2AC55, 2AC45, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0x0F, 0x90 ); // NOP
|
||||||
|
memt_byte( 0x84, 0x90 ); // NOP
|
||||||
|
memt_dword( 0x000000AE, 0x90909090 ); // NOP NOP NOP NOP
|
||||||
|
//6FACAC45 . 0F84 AE000000 JE D2Client.6FACACF9
|
||||||
|
|
||||||
|
// Unassign stats point when ctrl is push.
|
||||||
|
mem_seek R7(D2Client, 2ACD9, 2ACC9, 0000, 0000, 0000, 0000, 0000);
|
||||||
|
memt_byte( 0xB8, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x00000001, caller_UnassignStats_9);
|
||||||
|
//6FACACC9 . B8 01000000 MOV EAX,1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the id for the calling function.
|
||||||
|
mem_seek R7(D2Client, 2AD02, 2ACF2, 31611, 8395E, 8A3DE, 6C33E, BDF3E);
|
||||||
|
if ( version_D2Client >= V111 ) {
|
||||||
|
memt_byte( 0x66, 0xE8 ); // CALL
|
||||||
|
MEMT_REF4( 0x15244C89, 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 ; |
|
||||||
|
} else {
|
||||||
|
MEMC_REF4( D2SendToServer3, caller_setValue);
|
||||||
|
//6FAD1610 . E8 7BC3FDFF CALL D2Client.6FAAD990
|
||||||
|
}
|
||||||
|
} log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_LimitShift_111 )
|
||||||
|
CMP EDI,limitValueToShiftClick
|
||||||
|
JL DontTruncTheValue
|
||||||
|
MOV EDI,limitValueToShiftClick
|
||||||
|
DontTruncTheValue:
|
||||||
|
JMP DWORD PTR DS:[GetKeyState]
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_LimitShift )
|
||||||
|
CMP ESI,limitValueToShiftClick
|
||||||
|
JL DontTruncTheValue
|
||||||
|
MOV ESI,limitValueToShiftClick
|
||||||
|
DontTruncTheValue:
|
||||||
|
JMP DWORD PTR DS:[GetKeyState]
|
||||||
|
}}
|
||||||
|
|
||||||
|
void Install_StatsLimitShiftClick()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for limit the assigment of stat points when shift is used. (LimitShift)\n");
|
||||||
|
|
||||||
|
// Limit the assigment of stat points.
|
||||||
|
mem_seek R7(D2Client, 2ACD0, 2ACC0, 315CD, 83915, 8A395, 6C2F5, BDEF5);
|
||||||
|
memt_byte( 0xFF, 0x90 ); // NOP
|
||||||
|
memt_byte( 0x15, 0xE8 ); // CALL
|
||||||
|
MEMD_REF4( GetKeyState, version_D2Client >= V111 ? caller_LimitShift_111 : caller_LimitShift);
|
||||||
|
//6FAD15CD . FF15 68E0B66F CALL DWORD PTR DS:[<&USER32.GetKeyState>]
|
||||||
|
//6FB33915 . FF15 CCF0B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>]
|
||||||
|
//6FB3A395 . FF15 08F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>]
|
||||||
|
//6FB1C2F5 . FF15 10F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
|
||||||
|
//6FB6DEF5 . FF15 04F1B76F CALL DWORD PTR DS:[<&USER32.GetKeyState>>; \GetKeyState
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
401
PlugY/UberQuest.cpp
Normal file
401
PlugY/UberQuest.cpp
Normal file
@ -0,0 +1,401 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Uber Quest Management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.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
|
||||||
|
#define LEVEL_ACT5_PANDEMONIUM2 134
|
||||||
|
#define LEVEL_ACT5_PANDEMONIUM3 135
|
||||||
|
#define LEVEL_ACT5_PANDEMONIUM_FINAL 136
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
DWORD all;
|
||||||
|
struct{
|
||||||
|
DWORD portal1Opened:1;
|
||||||
|
DWORD portal2Opened:1;
|
||||||
|
DWORD portal3Opened:1;
|
||||||
|
DWORD portal4Opened:1;
|
||||||
|
DWORD uber1Spawned:1;
|
||||||
|
DWORD uber2Spawned:1;
|
||||||
|
DWORD uber3Spawned:1;
|
||||||
|
DWORD uber4Spawned:1;
|
||||||
|
DWORD uber5Spawned:1;
|
||||||
|
DWORD uber6Spawned:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
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;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD openPortalOnLevel(Game* ptGame, Unit* ptChar, DWORD levelID)
|
||||||
|
{
|
||||||
|
log_msg("openning 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);
|
||||||
|
if (!D2GetDropRoom(ptRoom, &pos, &pos, 3, 0x3E01, 0xC01, 0)) return 0;
|
||||||
|
ptRoom = D2TestPositionInRoom(ptRoom, pos.x, pos.y);
|
||||||
|
if (!ptRoom) return 0;
|
||||||
|
|
||||||
|
// Create Portal
|
||||||
|
Unit* ptPortal = D2CreateUnit(UNIT_OBJECT, OBJECT_PERMANENT_PORTAL, pos.x, pos.y, ptGame, ptRoom, 1, 1, 0);
|
||||||
|
ptPortal->ptObjectData->levelID = (BYTE)levelID;
|
||||||
|
D2Common10572(ptPortal, 1);
|
||||||
|
D2LinkPortal(ptGame, ptPortal, levelID, LEVEL_ACT5TOWN);
|
||||||
|
D2SetObjectFlags(ptPortal, D2GetObjectFlags(ptPortal) | 3);
|
||||||
|
D2Common11084(ptRoom, 0);
|
||||||
|
D2Common11084(D2GetRoom(ptPortal), 0);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
int available[3];
|
||||||
|
int nbAvailable=0;
|
||||||
|
if (!questState.portal1Opened) available[nbAvailable++]=LEVEL_ACT5_PANDEMONIUM1;
|
||||||
|
if (!questState.portal2Opened) available[nbAvailable++]=LEVEL_ACT5_PANDEMONIUM2;
|
||||||
|
if (!questState.portal3Opened) available[nbAvailable++]=LEVEL_ACT5_PANDEMONIUM3;
|
||||||
|
int selectedTargetLevel;
|
||||||
|
if (nbAvailable)
|
||||||
|
selectedTargetLevel = available[RANDOM(nbAvailable)];
|
||||||
|
else selectedTargetLevel = LEVEL_ACT5_PANDEMONIUM1 + RANDOM(3);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
switch(D2GetLevelID(ptRoom))
|
||||||
|
{
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM1:
|
||||||
|
if (!questState.uber1Spawned)
|
||||||
|
{
|
||||||
|
if (questState.count1) questState.count1--;
|
||||||
|
else {
|
||||||
|
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 707, 0))
|
||||||
|
questState.uber1Spawned = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM2:
|
||||||
|
if (!questState.uber2Spawned)
|
||||||
|
{
|
||||||
|
if (questState.count2) questState.count2--;
|
||||||
|
else {
|
||||||
|
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 708, 0))
|
||||||
|
questState.uber2Spawned = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM3:
|
||||||
|
if (!questState.uber3Spawned)
|
||||||
|
{
|
||||||
|
if (questState.count3) questState.count3--;
|
||||||
|
else {
|
||||||
|
Room* ptTargetRoom = selectRoom(ptGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
if (D2SpawnMonster(ptGame, ptTargetRoom, 0, 0, 0, -1, 706, 0))
|
||||||
|
questState.uber3Spawned = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
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))
|
||||||
|
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 (!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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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))
|
||||||
|
{
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM1:
|
||||||
|
if (!questState.uber1Spawned)
|
||||||
|
{
|
||||||
|
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 707, 0);
|
||||||
|
questState.uber1Spawned = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM2:
|
||||||
|
if (!questState.uber2Spawned)
|
||||||
|
{
|
||||||
|
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 708, 0);
|
||||||
|
questState.uber2Spawned = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM3:
|
||||||
|
if (!questState.uber3Spawned)
|
||||||
|
{
|
||||||
|
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 706, 0);
|
||||||
|
questState.uber3Spawned = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LEVEL_ACT5_PANDEMONIUM_FINAL:
|
||||||
|
if (!questState.uber4Spawned)
|
||||||
|
{
|
||||||
|
Room* ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 704, 0);
|
||||||
|
ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 705, 0);
|
||||||
|
ptTargetRoom = selectRoom(PCGame, ptRoom, LEVEL_ACT5_PANDEMONIUM1);
|
||||||
|
D2SpawnMonster(PCGame, ptTargetRoom, 0, 0, 0, -1, 709, 0);
|
||||||
|
// D2SpawnMonster(PCGame, ptRoom, 0, 25113, 5138, -1, 704, 0);
|
||||||
|
// D2SpawnMonster(PCGame, ptRoom, 0, 25125, 5150, -1, 705, 0);
|
||||||
|
// D2SpawnMonster(PCGame, ptRoom, 0, 25135, 5140, -1, 709, 0);
|
||||||
|
questState.uber4Spawned = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
void FASTCALL uberMephIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
|
||||||
|
{
|
||||||
|
D2MephIA(ptGame, ptMonster, ptData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FASTCALL uberDiabloIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
|
||||||
|
{
|
||||||
|
D2DiabloIA(ptGame, ptMonster, ptData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FASTCALL uberBaalIA(Game* ptGame, Unit* ptMonster, DWORD* ptData)
|
||||||
|
{
|
||||||
|
D2BaalIA(ptGame, ptMonster, ptData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Install_UberQuest()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
if ( version_D2Game <= V110 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for active Uber Quest. (UberQuest)\n");
|
||||||
|
|
||||||
|
DWORD oldProtection;
|
||||||
|
|
||||||
|
// open Red Portal
|
||||||
|
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, FA480, FA7B8, FA228, FA5F0);
|
||||||
|
MEMT_DWORD( D2OpenPandPortal , openPandPortal);
|
||||||
|
MEMT_DWORD( D2OpenPandFinalPortal , openPandFinalPortal);
|
||||||
|
//0201E357 |. FFD0 |CALL EAX
|
||||||
|
//01FA77E7 |. FFD0 |CALL EAX
|
||||||
|
//6FCF3CC7 |. FFD0 |CALL EAX
|
||||||
|
//6FC92437 |. FFD0 |CALL EAX
|
||||||
|
VirtualProtect((LPVOID)R7(D2Game,0,0,0,FA480,FA7B8, FA228, FA5F0), 8, oldProtection, &oldProtection);
|
||||||
|
|
||||||
|
|
||||||
|
// manage uberIA (fct table at 0209E7E8)
|
||||||
|
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 145*0x10), 0x30, PAGE_EXECUTE_READWRITE, &oldProtection);
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, 10F100, 10F5E8, 10F870, 10F0A0);
|
||||||
|
MEMT_DWORD( D2UberBaalIA , uberBaalIA);
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, 10F110, 10F5F8, 10F880, 10F0B0);
|
||||||
|
MEMT_DWORD( D2UberMephIA , uberMephIA);
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, 10F120, 10F608, 10F890, 10F0C0);
|
||||||
|
MEMT_DWORD( D2UberDiabloIA , uberDiabloIA);
|
||||||
|
VirtualProtect((LPVOID)(R7(D2Game,0,0,0,10E7E8,10ECD0,10EF58,10E788) + 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
|
||||||
|
|
||||||
|
// spawn Uber
|
||||||
|
// mem_seek R7(D2Game, 0000, 0000, 0000, 98DAD, 0000, 0000, 0000);
|
||||||
|
// MEMJ_REF4( D2WarpPlayer , spawnUber);
|
||||||
|
//02028DAC |. E8 491CF7FF CALL <JMP.&D2Common.#10872>
|
||||||
|
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 0000, E26E2, E6B52, A850B, 2CCAB);
|
||||||
|
MEMC_REF4( D2Game235C0 , spawnUber);
|
||||||
|
//020726E1 |. E8 2A46FFFF ||CALL D2Game.02066D10
|
||||||
|
//02056B51 |. E8 6ACAF3FF ||CALL D2Game.01F935C0
|
||||||
|
//6FCC850A |. E8 014FF6FF ||CALL D2Game.6FC2D410
|
||||||
|
//6FC4CCAA |. E8 3134FFFF ||CALL D2Game.6FC400E0
|
||||||
|
|
||||||
|
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 =================================*/
|
90
PlugY/UpdateClient.cpp
Normal file
90
PlugY/UpdateClient.cpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating client.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "updateClient.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "commands.h"
|
||||||
|
|
||||||
|
|
||||||
|
void updateClient(Unit* ptChar, DWORD mFunc, DWORD p1, DWORD p2, DWORD p3)
|
||||||
|
{
|
||||||
|
void* ptNetClient;
|
||||||
|
DataPacket packet;
|
||||||
|
|
||||||
|
// Intialize the packet to send to client
|
||||||
|
ZeroMemory(&packet, sizeof(DataPacket));
|
||||||
|
packet.mType = 0x9D;
|
||||||
|
packet.mFunc = (BYTE)mFunc;
|
||||||
|
packet.mSize = sizeof(DataPacket);
|
||||||
|
packet.mPlayerID = ptChar->nUnitId;
|
||||||
|
packet.mParam1 = p1;
|
||||||
|
packet.mParam2 = p2;
|
||||||
|
packet.mParam3 = p3;
|
||||||
|
|
||||||
|
ptNetClient = D2GetClient( ptChar, __FILE__ , __LINE__);
|
||||||
|
|
||||||
|
// Send packet to client for remove placed skills
|
||||||
|
D2SendPacket(ptNetClient, &packet, sizeof(DataPacket));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD FASTCALL handleClientUpdate(DataPacket* packet)
|
||||||
|
{
|
||||||
|
log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3);
|
||||||
|
switch (packet->mFunc)
|
||||||
|
{
|
||||||
|
case UC_SELECT_STASH : setSelectedStashClient(packet->mParam1,packet->mParam2,packet->mParam3); return 1;
|
||||||
|
case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1;
|
||||||
|
default : return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_handleClientUpdate_111 )
|
||||||
|
LEA ECX,DWORD PTR SS:[ESP+8]
|
||||||
|
CALL handleClientUpdate
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
MOV ESP,EBP
|
||||||
|
POP EBP
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_handleClientUpdate )
|
||||||
|
LEA ECX,DWORD PTR SS:[ESP]
|
||||||
|
CALL handleClientUpdate
|
||||||
|
ADD ESP,0x104
|
||||||
|
RETN
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_UpdateClient()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Client for received Item packet. (UpdateClient)\n");
|
||||||
|
|
||||||
|
// execute if it's our packet else continue
|
||||||
|
mem_seek R7(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896);
|
||||||
|
MEMT_REF4( version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
|
||||||
|
//6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690
|
||||||
|
//6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789
|
||||||
|
//6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59
|
||||||
|
//6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9
|
||||||
|
//6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
138
PlugY/UpdateServer.cpp
Normal file
138
PlugY/UpdateServer.cpp
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating server.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "updateServer.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
#include "statsPoints.h"
|
||||||
|
#include "skillsPoints.h"
|
||||||
|
#include "infinityStash.h"
|
||||||
|
#include "commands.h"
|
||||||
|
|
||||||
|
|
||||||
|
int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
|
||||||
|
{
|
||||||
|
log_msg("Received custom message: %X\n", param);
|
||||||
|
switch(param & 0xFF)
|
||||||
|
{
|
||||||
|
case US_UNASSIGN_STR_POINT : UnassignStrPoint( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_ENE_POINT : UnassignEnePoint( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_DEX_POINT : UnassignDexPoint( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_VIT_POINT : UnassignVitPoint( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_STR_POINTS : UnassignStrPoints( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_ENE_POINTS : UnassignEnePoints( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_DEX_POINTS : UnassignDexPoints( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_VIT_POINTS : UnassignVitPoints( ptChar ); return 1;
|
||||||
|
case US_UNASSIGN_SKILLS : UnassignAllSkillsPoints( ptChar ); return 1;
|
||||||
|
case US_SELECT_PREVIOUS : selectPreviousStash( ptChar ); return 1;
|
||||||
|
case US_SELECT_NEXT : selectNextStash( ptChar ); return 1;
|
||||||
|
case US_SELECT_SELF : if (active_sharedStash) toggleToSelfStash( ptChar ); return 1;
|
||||||
|
case US_SELECT_SHARED : if (active_sharedStash) toggleToSharedStash( ptChar ); return 1;
|
||||||
|
case US_SELECT_PREVIOUS_INDEX : selectPreviousIndexStash( ptChar ); return 1;
|
||||||
|
case US_SELECT_NEXT_INDEX : selectNextIndexStash( ptChar ); return 1;
|
||||||
|
|
||||||
|
case US_SELECT_PREVIOUS2 : selectPrevious2Stash( ptChar ); return 1;
|
||||||
|
case US_SELECT_NEXT2 : selectNext2Stash( ptChar ); return 1;
|
||||||
|
case US_SELECT_PREVIOUS_INDEX2: selectPreviousIndex2Stash( ptChar ); return 1;
|
||||||
|
case US_SELECT_NEXT_INDEX2 : selectNextIndex2Stash( ptChar ); return 1;
|
||||||
|
|
||||||
|
case US_STARTSAVE : savePlayers( ptChar ); return 1;
|
||||||
|
|
||||||
|
case US_MAXGOLD : maxGold(ptChar); return 1;
|
||||||
|
case US_PUTGOLD : putGold(ptChar, 0); return 1;
|
||||||
|
case US_TAKEGOLD : takeGold(ptChar, 0); return 1;
|
||||||
|
default : return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FCT_ASM( caller_handleServerUpdate)
|
||||||
|
PUSH EAX
|
||||||
|
PUSH EBX
|
||||||
|
CALL handleServerUpdate
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ END_RCM
|
||||||
|
MOV EAX,ESI
|
||||||
|
AND EAX,0xFF
|
||||||
|
SHR ESI,8
|
||||||
|
MOV EDI,EAX
|
||||||
|
RETN
|
||||||
|
END_RCM:
|
||||||
|
ADD ESP,4
|
||||||
|
POP EDI
|
||||||
|
POP ESI
|
||||||
|
XOR EAX,EAX
|
||||||
|
POP EBX
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM( caller_handleServerUpdate_9)
|
||||||
|
XOR EDX,EDX
|
||||||
|
MOV DX,WORD PTR DS:[EAX+1]
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
CALL handleServerUpdate
|
||||||
|
POP EDX
|
||||||
|
POP ECX
|
||||||
|
TEST EAX,EAX
|
||||||
|
JNZ END_RCM
|
||||||
|
RETN
|
||||||
|
END_RCM:
|
||||||
|
POP EAX
|
||||||
|
XOR EAX,EAX
|
||||||
|
RETN 8
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_UpdateServer()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for received button click message. (UpdateServer)\n");
|
||||||
|
|
||||||
|
// manage button click message from Client.
|
||||||
|
mem_seek R7(D2Game, 4A702, 4AAC2, 56EA2, 54AE3, 2C773, 975C3, CC983);
|
||||||
|
if (version_D2Game >= V111) {
|
||||||
|
memt_byte( 0xC1, 0x57 ); // PUSH EDI
|
||||||
|
memt_byte( 0xEE, 0xE8 ); // CALL caller_handleServerUpdate
|
||||||
|
MEMT_REF4( 0xF88B5708, caller_handleServerUpdate);
|
||||||
|
//01FD4AE3 . C1EE 08 SHR ESI,8
|
||||||
|
//01FD4AE6 . 57 PUSH EDI
|
||||||
|
//01FD4AE7 . 8BF8 MOV EDI,EAX
|
||||||
|
//01F9C773 . C1EE 08 SHR ESI,8
|
||||||
|
//01F9C776 . 57 PUSH EDI
|
||||||
|
//01F9C777 . 8BF8 MOV EDI,EAX
|
||||||
|
//6FCB75C3 . C1EE 08 SHR ESI,8
|
||||||
|
//6FCB75C6 . 57 PUSH EDI
|
||||||
|
//6FCB75C7 . 8BF8 MOV EDI,EAX
|
||||||
|
//6FCEC983 . C1EE 08 SHR ESI,8
|
||||||
|
//6FCEC986 . 57 PUSH EDI
|
||||||
|
//6FCEC987 . 8BF8 MOV EDI,EAX
|
||||||
|
} else if (version_D2Game == V110) {
|
||||||
|
memt_byte( 0xC1, 0xE8 ); // CALL caller_handleServerUpdate
|
||||||
|
MEMT_REF4( 0xF88B08EE, caller_handleServerUpdate);
|
||||||
|
//6FC86EA2 . C1EE 08 SHR ESI,8
|
||||||
|
//6FC86EA5 . 8BF8 MOV EDI,EAX
|
||||||
|
} else {
|
||||||
|
memt_byte( 0x33, 0xE8 ); // CALL caller_handleServerUpdate
|
||||||
|
MEMT_REF4( 0x508B66D2, caller_handleServerUpdate_9);
|
||||||
|
memt_byte( 0x01, 0x90 ); // NOP
|
||||||
|
//6FC7A702 . 33D2 XOR EDX,EDX
|
||||||
|
//6FC7A704 . 66:8B50 01 MOV DX,WORD PTR DS:[EAX+1]
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
274
PlugY/WorldEvent.cpp
Normal file
274
PlugY/WorldEvent.cpp
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
World Event Management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "d2functions.h"
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
struct s_WEdata
|
||||||
|
{
|
||||||
|
BYTE type;
|
||||||
|
BYTE fct;
|
||||||
|
BYTE id;
|
||||||
|
DWORD param;
|
||||||
|
WORD z;
|
||||||
|
BYTE uk[31];
|
||||||
|
};
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
bool active_WorldEvent=0;
|
||||||
|
|
||||||
|
DWORD WEactive = 0;
|
||||||
|
DWORD DCloneSpawned = 0;
|
||||||
|
|
||||||
|
DWORD nbSOJSold = 0;
|
||||||
|
DWORD nbNeedSOJSold = 100;
|
||||||
|
DWORD nbManagedSOJSold = 0;
|
||||||
|
|
||||||
|
DWORD nbTicksForNextSOJSold = 0;
|
||||||
|
DWORD prevTicks = 0;
|
||||||
|
|
||||||
|
DWORD showSOJSoldCounterInAllDiff=0;
|
||||||
|
char* itemsToSell="The Stone of Jordan";
|
||||||
|
DWORD worldEventmonsterID = 333;
|
||||||
|
DWORD valueOfOwnSOJSold=100;
|
||||||
|
DWORD valueInitSOJSoldMin=200;
|
||||||
|
DWORD valueInitSOJSoldDelta=2000;
|
||||||
|
DWORD triggerAtSolJSoldMin=75;
|
||||||
|
DWORD triggerAtSolJSoldDelta=51;
|
||||||
|
bool active_AutomaticSell=1;
|
||||||
|
DWORD timeBeforeAutoSellMin=00000;
|
||||||
|
DWORD timeBeforeAutoSellDelta=120000;
|
||||||
|
CubeInput itemNeeded;
|
||||||
|
|
||||||
|
DWORD getTicksForNextSOJSold()
|
||||||
|
{
|
||||||
|
return ((DWORD)(rand()/(RAND_MAX+1.0)*timeBeforeAutoSellDelta)+timeBeforeAutoSellMin);//average of +100 in 25hours max 41h40
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FASTCALL sendDataToClient(void* ptclient, DWORD* param)
|
||||||
|
{
|
||||||
|
D2SendPacket(ptclient, (void*)param[0], (DWORD)param[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void STDCALL worldEventBroadcast(Game* ptGame, DWORD activeWE, DWORD nbSOJSold)
|
||||||
|
{
|
||||||
|
void* param[2];
|
||||||
|
s_WEdata data;
|
||||||
|
data.type = 0x5A;
|
||||||
|
data.fct = activeWE ? 0x12 : 0x11;
|
||||||
|
data.id = 4;
|
||||||
|
data.param = nbSOJSold;
|
||||||
|
data.z = 0;
|
||||||
|
|
||||||
|
param[0]=&data;
|
||||||
|
param[1]=(void*)sizeof(data);
|
||||||
|
|
||||||
|
D2BroadcastFunction(ptGame,&sendDataToClient,param);
|
||||||
|
}
|
||||||
|
|
||||||
|
Game* STDCALL WEManagement(DWORD clientID)
|
||||||
|
{
|
||||||
|
Game* ptGame = D2GetGameByClientID(clientID);
|
||||||
|
if (!ptGame) return ptGame;
|
||||||
|
|
||||||
|
if (active_AutomaticSell)
|
||||||
|
while (GetTickCount() - prevTicks >= nbTicksForNextSOJSold)
|
||||||
|
{
|
||||||
|
nbSOJSold++;
|
||||||
|
prevTicks = prevTicks + nbTicksForNextSOJSold;
|
||||||
|
nbTicksForNextSOJSold = getTicksForNextSOJSold();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nbSOJSold == nbManagedSOJSold) return ptGame;
|
||||||
|
|
||||||
|
DWORD newWE;
|
||||||
|
if (!WEactive && (ptGame->difficultyLevel == D2DM_HELL) && (nbSOJSold >= nbNeedSOJSold))
|
||||||
|
{
|
||||||
|
newWE = 1;
|
||||||
|
WEactive = 1;
|
||||||
|
} else newWE = 0;
|
||||||
|
|
||||||
|
if ( showSOJSoldCounterInAllDiff || (ptGame->difficultyLevel == D2DM_HELL))
|
||||||
|
worldEventBroadcast(ptGame, newWE, nbSOJSold);
|
||||||
|
|
||||||
|
nbManagedSOJSold = nbSOJSold;
|
||||||
|
return ptGame;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD FASTCALL spawnDClone(Game* ptGame, Room* ptRoom, DWORD p3, DWORD p4, DWORD p5, DWORD p6, DWORD monsterID, DWORD p8)
|
||||||
|
{
|
||||||
|
if (WEactive && (ptGame->difficultyLevel == D2DM_HELL) && !DCloneSpawned)
|
||||||
|
{
|
||||||
|
DCloneSpawned=1;
|
||||||
|
D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,worldEventmonsterID,p8);
|
||||||
|
return 0;//no minions
|
||||||
|
}
|
||||||
|
else return D2SpawnMonster(ptGame,ptRoom,p3,p4,p5,p6,monsterID,p8);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD STDCALL verifIfWEItem (Unit* ptItem, DWORD flags, DWORD line, const char* filename)
|
||||||
|
{
|
||||||
|
ItemsBIN* ptItemStats = D2GetItemsBIN(ptItem->nTxtFileNo);
|
||||||
|
ItemsBIN* ptWantedItemStats = D2GetItemsBIN(itemNeeded.ID);
|
||||||
|
|
||||||
|
if((itemNeeded.byItemTypeID && D2CheckItemType(ptItem,itemNeeded.ID))
|
||||||
|
|| (itemNeeded.byItemID && (itemNeeded.ID == 0xFFFF))
|
||||||
|
|| (itemNeeded.byItemID && !itemNeeded.includeUpgradedVersions && ((DWORD)itemNeeded.ID == ptItem->nTxtFileNo))
|
||||||
|
|| (itemNeeded.byItemID && itemNeeded.includeUpgradedVersions) && (
|
||||||
|
(ptItemStats->ItemCode == ptItemStats->NormCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode)
|
||||||
|
|| (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode)
|
||||||
|
|| (ptItemStats->ItemCode == ptItemStats->UberCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode)
|
||||||
|
|| (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->NormCode)
|
||||||
|
|| (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->UberCode)
|
||||||
|
|| (ptItemStats->ItemCode == ptItemStats->HellCode) && (ptItemStats->ItemCode == ptWantedItemStats->HellCode)
|
||||||
|
))
|
||||||
|
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.isBasic && (ptItemStats->ItemCode != ptWantedItemStats->NormCode))
|
||||||
|
&& !(itemNeeded.isExceptional && (ptItemStats->ItemCode != ptWantedItemStats->UberCode))
|
||||||
|
&& !(itemNeeded.isElite && (ptItemStats->ItemCode != ptWantedItemStats->HellCode))
|
||||||
|
&& !(itemNeeded.isNotRuneword && ptItem->ptItemData->isRuneword) )
|
||||||
|
{
|
||||||
|
nbSOJSold += valueOfOwnSOJSold;
|
||||||
|
return 1;// Can't re-buy the item.
|
||||||
|
}
|
||||||
|
|
||||||
|
return D2TestFlags(ptItem, flags, line, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void initWorldEventVariables()
|
||||||
|
{
|
||||||
|
char buf[50];
|
||||||
|
memset(&itemNeeded,0,sizeof(itemNeeded));
|
||||||
|
strncpy(buf,itemsToSell,50);
|
||||||
|
D2CompileCubeInput(&itemNeeded,buf,0,0);
|
||||||
|
|
||||||
|
nbManagedSOJSold = 0;
|
||||||
|
DCloneSpawned = 0;
|
||||||
|
WEactive = 0;
|
||||||
|
|
||||||
|
while (nbSOJSold >= nbNeedSOJSold)
|
||||||
|
nbNeedSOJSold += (DWORD)(rand()/(RAND_MAX+1.0)*triggerAtSolJSoldDelta+triggerAtSolJSoldMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_WEManagement_1XX )
|
||||||
|
POP EAX
|
||||||
|
PUSH ECX
|
||||||
|
PUSH EAX
|
||||||
|
JMP WEManagement
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM ( caller_spawnDClone_111 )
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x14]
|
||||||
|
PUSH EAX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x18]
|
||||||
|
PUSH ECX
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x1C]
|
||||||
|
CALL spawnDClone
|
||||||
|
RETN 0x14
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM ( caller_spawnDClone_111b )
|
||||||
|
PUSH EDX
|
||||||
|
PUSH ECX
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
PUSH DWORD PTR SS:[ESP+0x1C]
|
||||||
|
PUSH EAX
|
||||||
|
MOV EDX,DWORD PTR SS:[ESP+0x20]
|
||||||
|
MOV ECX,DWORD PTR SS:[ESP+0x1C]
|
||||||
|
CALL spawnDClone
|
||||||
|
RETN 0x14
|
||||||
|
}}
|
||||||
|
|
||||||
|
FCT_ASM( caller_addClientForWE_111 )
|
||||||
|
PUSH EAX
|
||||||
|
CALL initWorldEventVariables
|
||||||
|
POP EAX
|
||||||
|
JMP D2AddClient
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
FCT_ASM( caller_addClientForWE )
|
||||||
|
PUSH ECX
|
||||||
|
CALL initWorldEventVariables
|
||||||
|
POP ECX
|
||||||
|
JMP D2AddClient
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
void Install_WorldEvent()
|
||||||
|
{
|
||||||
|
static int isInstalled = false;
|
||||||
|
if (isInstalled) return;
|
||||||
|
|
||||||
|
if ( version_D2Game < V110 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
nbSOJSold = (DWORD)(rand()/(RAND_MAX+1.0)*valueInitSOJSoldDelta+valueInitSOJSoldMin);
|
||||||
|
if (active_AutomaticSell)
|
||||||
|
{
|
||||||
|
prevTicks = GetTickCount();
|
||||||
|
nbTicksForNextSOJSold = (DWORD)(rand()/(RAND_MAX+1.0)*(timeBeforeAutoSellDelta+timeBeforeAutoSellMin));
|
||||||
|
}
|
||||||
|
|
||||||
|
log_msg("Patch D2Game for active World Event. (WorldEvent)\n");
|
||||||
|
|
||||||
|
// spawn DClone
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 3F720, 4BCB1, ECF10, 41570, 25280);
|
||||||
|
MEMC_REF4( V2SpawnMonster , version_D2Game >= V111b ? (DWORD)caller_spawnDClone_111b : version_D2Game == V111 ? (DWORD)caller_spawnDClone_111 : (DWORD)spawnDClone);
|
||||||
|
//6FC6F71F |. E8 FCFAFFFF CALL D2Game.6FC6F220
|
||||||
|
//01FCBCB0 |. E8 2BEFFFFF CALL D2Game.01FCABE0 ; \D2Game.01FCABE0
|
||||||
|
//0205CF0F |. E8 CCF8FFFF CALL D2Game.0205C7E0 ; \D2Game.0205C7E0
|
||||||
|
//6FC6156F |. E8 1CF6FFFF CALL D2Game.6FC60B90 ; \D2Game.6FC60B90
|
||||||
|
//6FC4527F |. E8 CCF6FFFF CALL D2Game.6FC44950 ; \D2Game.6FC44950
|
||||||
|
|
||||||
|
// verify if the item sold is a trigger of WE
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 977D0, 8E799, 92859, 84499, BFB29);
|
||||||
|
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>
|
||||||
|
|
||||||
|
// management of the WorldEvent
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 3CE0, 51F01, C5681, EBF41, 4A791);
|
||||||
|
MEMC_REF4( V2GetGameByClientID , version_D2Game >= V111 ? (DWORD)WEManagement : (DWORD)caller_WEManagement_1XX);
|
||||||
|
//6FC33CDF . E8 FC570000 CALL D2Game.6FC394E0
|
||||||
|
//01FD1F00 |. E8 1BE60800 CALL D2Game.02060520
|
||||||
|
//02035680 |. E8 1BF30100 CALL D2Game.020549A0
|
||||||
|
//6FD0BF40 |. E8 1BA4FBFF CALL D2Game.6FCC6360
|
||||||
|
//6FC6A790 |. E8 4B03FEFF CALL D2Game.6FC4AAE0
|
||||||
|
|
||||||
|
// add client for the WorldEvent
|
||||||
|
mem_seek R7(D2Game, 0000, 0000, 1AEF, 3786A, 7055A, 6265F, CB0BF);
|
||||||
|
MEMC_REF4( D2AddClient , version_D2Game >= V111 ? caller_addClientForWE_111 : caller_addClientForWE);
|
||||||
|
//6FC31AEE |. E8 6D510000 CALL D2Game.6FC36C60
|
||||||
|
//01FB7869 |. E8 32C50A00 CALL D2Game.02063DA0
|
||||||
|
//01FE0559 |. E8 B27C0700 CALL D2Game.02058210
|
||||||
|
//6FC8265E |. E8 FD890800 CALL D2Game.6FD0B060
|
||||||
|
//6FCEB0BE |. E8 6DE8F7FF CALL D2Game.6FC69930
|
||||||
|
|
||||||
|
log_msg("\n");
|
||||||
|
|
||||||
|
isInstalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
19
PlugY/bigStash.h
Normal file
19
PlugY/bigStash.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Use a more big stash
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __BIGSTASH_HPP__INCLUDED
|
||||||
|
#define __BIGSTASH_HPP__INCLUDED
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern bool active_bigStash;
|
||||||
|
extern bool active_bigStash_tested;
|
||||||
|
|
||||||
|
void Install_BigStash();
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
16
PlugY/clientSaveFile.h
Normal file
16
PlugY/clientSaveFile.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file for each characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
/*
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
DWORD loadClientSaveFile();
|
||||||
|
DWORD saveClientSaveFile();
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
21
PlugY/commands.h
Normal file
21
PlugY/commands.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Commands directly in game.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __COMMANDS_H__INCLUDED
|
||||||
|
#define __COMMANDS_H__INCLUDED
|
||||||
|
|
||||||
|
extern bool active_Commands;
|
||||||
|
|
||||||
|
void savePlayers(Unit* ptChar);
|
||||||
|
void maxGold(Unit* ptChar);
|
||||||
|
void putGold(Unit* ptChar, DWORD amount);
|
||||||
|
void takeGold(Unit* ptChar, DWORD amount);
|
||||||
|
void updateSharedGold(DWORD goldAmount);
|
||||||
|
|
||||||
|
void Install_Commands();
|
||||||
|
|
||||||
|
#endif
|
149
PlugY/common.h
Normal file
149
PlugY/common.h
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*==============================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
this file implements some common and useful
|
||||||
|
function related to some Diablo II mechanisms.
|
||||||
|
|
||||||
|
/*============================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include "../Commons/d2Constants.h"
|
||||||
|
#include "../Commons/d2BinFile.h"
|
||||||
|
#include "../Commons/d2Struct.h"
|
||||||
|
#include "../Commons/d2StringTblStruct.h"
|
||||||
|
#include "../Commons/D2UnitStruct.h"
|
||||||
|
#include "../Commons/updatingConst.h"
|
||||||
|
|
||||||
|
#include "customData.h"
|
||||||
|
#include "modifMemory.h"
|
||||||
|
#include "parameters.h"
|
||||||
|
#include "globalVariable.h"
|
||||||
|
|
||||||
|
//#ifdef MSVC
|
||||||
|
#define FASTCALL __fastcall
|
||||||
|
//#else
|
||||||
|
//#define FASTCALL __msfastcall
|
||||||
|
//#endif
|
||||||
|
#define STDCALL __stdcall
|
||||||
|
#define FCT_ASM(N) __declspec(naked) void N() {__asm{
|
||||||
|
#define RANDOM(V) ((int)(rand()/(RAND_MAX+1.0)*(V)))
|
||||||
|
//#define RANDOM(V) (rand()%(V))
|
||||||
|
|
||||||
|
// Convertion to 1.09
|
||||||
|
struct s_shifting {
|
||||||
|
DWORD ptInventory;
|
||||||
|
DWORD ptSpecificData;
|
||||||
|
DWORD ptPYPlayerData;
|
||||||
|
DWORD ptGame;
|
||||||
|
DWORD ptClientGame;
|
||||||
|
DWORD ptSkills;
|
||||||
|
DWORD ptImage;
|
||||||
|
DWORD ptFrame;
|
||||||
|
};
|
||||||
|
extern s_shifting shifting;
|
||||||
|
|
||||||
|
//#define PY(C) (*(PYPlayerData**)((BYTE*)(ptChar)+shifting.ptPYPlayerData))
|
||||||
|
#define PCPlayerData (*(PlayerData**)((DWORD)(ptChar)+shifting.ptSpecificData)) //->ptPlayerData
|
||||||
|
#define PCGame (*(Game**)((DWORD)(ptChar)+shifting.ptGame)) //->ptGame
|
||||||
|
#define PClientGame (*(Game**)((DWORD)(ptClient)+shifting.ptClientGame)) //ptClient->ptGame
|
||||||
|
#define PCInventory (*(Inventory**)((DWORD)(ptChar)+shifting.ptInventory)) //->ptInventory
|
||||||
|
//#define PIItemData (*(ItemData**)((DWORD)(ptItem)+shifting.ptSpecificData)) //->ptItemData
|
||||||
|
//#define PCPY (*(PYPlayerData**)((DWORD)(ptChar)+shifting.ptPYPlayerData)) //->ptPYPlayerData
|
||||||
|
#define PCPY ((PYPlayerData*)((DWORD)PCPlayerData+shifting.ptPYPlayerData)) //->ptPYPlayerData
|
||||||
|
#define PCSkills (*(Skills**)((DWORD)(ptChar)+shifting.ptSkills)) //->ptSkills
|
||||||
|
|
||||||
|
#define R7(Z,A,B,C,D,E,F,G) (offset_##Z + (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A)))))))
|
||||||
|
#define V7(Z,A,B,C,D,E,F,G) (version_##Z == V113? 0x##G : (version_##Z == V112? 0x##F : (version_##Z == V111b? 0x##E : (version_##Z == V111? 0x##D : (version_##Z == V110? 0x##C : (version_##Z == V109d? 0x##B : 0x##A))))))
|
||||||
|
|
||||||
|
|
||||||
|
// Convert 4 char code in a DWORD code
|
||||||
|
#define BIN(A,B,C,D) ((DWORD)A) + (((DWORD)B) << 8) + (((DWORD)C) << 16) + (((DWORD)D) << 24)
|
||||||
|
|
||||||
|
|
||||||
|
#define RX(v) (WindowStartX+(v))
|
||||||
|
#define RY(v) (ResolutionY+NegWindowStartY-(v))
|
||||||
|
|
||||||
|
|
||||||
|
enum eFileVersion
|
||||||
|
{
|
||||||
|
V109b=0,
|
||||||
|
V109d,
|
||||||
|
V110,
|
||||||
|
V111,
|
||||||
|
V111b,
|
||||||
|
V112,
|
||||||
|
V113
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int version_SmackW32;
|
||||||
|
extern int version_D2Common;
|
||||||
|
extern int version_ijl11;
|
||||||
|
extern int version_D2Gdi;
|
||||||
|
extern int version_D2Win;
|
||||||
|
extern int version_D2sound;
|
||||||
|
extern int version_D2MCPCLI;
|
||||||
|
extern int version_D2Launch;
|
||||||
|
extern int version_D2gfx;
|
||||||
|
extern int version_D2Client;
|
||||||
|
extern int version_D2Net;
|
||||||
|
extern int version_D2Lang;
|
||||||
|
extern int version_D2Game;
|
||||||
|
extern int version_D2CMP;
|
||||||
|
extern int version_Bnclient;
|
||||||
|
extern int version_Fog;
|
||||||
|
extern int version_Storm;
|
||||||
|
|
||||||
|
|
||||||
|
// Address in memory of external DLL
|
||||||
|
extern DWORD offset_SmackW32;
|
||||||
|
extern DWORD offset_D2Common;
|
||||||
|
extern DWORD offset_ijl11;
|
||||||
|
extern DWORD offset_D2Gdi;
|
||||||
|
extern DWORD offset_D2Win;
|
||||||
|
extern DWORD offset_D2sound;
|
||||||
|
extern DWORD offset_D2MCPCLI;
|
||||||
|
extern DWORD offset_D2Launch;
|
||||||
|
extern DWORD offset_D2gfx;
|
||||||
|
extern DWORD offset_D2Client;
|
||||||
|
extern DWORD offset_D2Net;
|
||||||
|
extern DWORD offset_D2Lang;
|
||||||
|
extern DWORD offset_D2Game;
|
||||||
|
extern DWORD offset_D2CMP;
|
||||||
|
extern DWORD offset_Bnclient;
|
||||||
|
extern DWORD offset_Fog;
|
||||||
|
extern DWORD offset_Storm;
|
||||||
|
|
||||||
|
extern const char* S_CloneBattles;
|
||||||
|
extern const char* S_DarkAlliance;
|
||||||
|
|
||||||
|
LPWSTR getTranslatedString(int stringID);
|
||||||
|
enum eStringList
|
||||||
|
{
|
||||||
|
STR_STATS_UNASSIGN_WITH_LIMIT=0,
|
||||||
|
STR_STATS_UNASSIGN_WITHOUT_LIMIT,
|
||||||
|
STR_STATS_BASE_MIN,
|
||||||
|
STR_SKILLS_UNASSIGN,
|
||||||
|
STR_STASH_PREVIOUS_PAGE,
|
||||||
|
STR_STASH_NEXT_PAGE,
|
||||||
|
STR_TOGGLE_TO_PERSONAL,
|
||||||
|
STR_TOGGLE_TO_SHARED,
|
||||||
|
STR_STASH_PREVIOUS_INDEX,
|
||||||
|
STR_STASH_NEXT_INDEX,
|
||||||
|
STR_PERSONAL_PAGE_NUMBER,
|
||||||
|
STR_SHARED_PAGE_NUMBER,
|
||||||
|
STR_NO_SELECTED_PAGE,
|
||||||
|
STR_PUT_GOLD,
|
||||||
|
STR_TAKE_GOLD,
|
||||||
|
STR_SHARED_GOLD_QUANTITY,
|
||||||
|
STR_PREVIOUS_PAGE,
|
||||||
|
STR_NEXT_PAGE
|
||||||
|
};
|
||||||
|
|
||||||
|
bool isOnRect(DWORD x, DWORD y, DWORD x0, DWORD y0, DWORD l, DWORD h);
|
||||||
|
void freeMessage(sWinMessage* msg);
|
||||||
|
LPWSTR getTypeUString (WORD id, LPWSTR lpText, DWORD size);
|
||||||
|
char* getTypeAString (WORD id, char* lpText, DWORD size);
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
15
PlugY/customData.h
Normal file
15
PlugY/customData.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Data added to D2 base-stucture
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "playerCustomData.h"
|
||||||
|
|
||||||
|
#define CBPlayerData void
|
||||||
|
#define CBItemData void
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
46
PlugY/customLibraries.h
Normal file
46
PlugY/customLibraries.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Language management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef int (STDCALL *TsaveSaveFile) (Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
typedef int (STDCALL *TloadSaveFile) (Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize);
|
||||||
|
typedef int (STDCALL *TinitSaveFile) (BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
|
||||||
|
class TCustomDll
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
union {
|
||||||
|
HMODULE module;
|
||||||
|
DWORD offset;
|
||||||
|
};
|
||||||
|
TCustomDll* nextDll;
|
||||||
|
void initialize(DWORD offsetDll);
|
||||||
|
void init();
|
||||||
|
void release();
|
||||||
|
void saveExtendedSaveFile (Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
int loadExtendedSaveFile (Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize);
|
||||||
|
int initExtendedSaveFile (BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
void saveSharedSaveFile (Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
int loadSharedSaveFile (Unit* ptChar, BYTE* data, DWORD maxSize, DWORD* curSize);
|
||||||
|
int initSharedSaveFile (BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
// __inline TCustomDll() {ZeroMemory(this,sizeof(this));}
|
||||||
|
private:
|
||||||
|
FARPROC initFct;
|
||||||
|
FARPROC releaseFct;
|
||||||
|
TsaveSaveFile saveExtendedSaveFileFct;
|
||||||
|
TloadSaveFile loadExtendedSaveFileFct;
|
||||||
|
TinitSaveFile initExtendedSaveFileFct;
|
||||||
|
TsaveSaveFile saveSharedSaveFileFct;
|
||||||
|
TloadSaveFile loadSharedSaveFileFct;
|
||||||
|
TinitSaveFile initSharedSaveFileFct;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern TCustomDll* customDlls;
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
75
PlugY/d2functions.h
Normal file
75
PlugY/d2functions.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
This file implements some common and useful
|
||||||
|
function related to some Diablo II mechanisms.
|
||||||
|
|
||||||
|
================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define D2S(F, I, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N;//static D N = (D)(A);
|
||||||
|
#define D2F(F, I, R, N, P) typedef R (FASTCALL *T##N) P; extern T##N N;//static D N = (D)(A);
|
||||||
|
#define E2S(F, A, R, N, P) typedef R (STDCALL *T##N) P; extern T##N N;
|
||||||
|
#define E2F(F, A, R, N, P) typedef R (FASTCALL *T##N) P; extern T##N N;
|
||||||
|
#define E2C(F, A, T, N) extern T* pt##N;
|
||||||
|
#define F7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||||
|
#define A7(X, Z, A,B,C,D,E,F,G, R, N, P) typedef R (X##CALL *T##N) P; extern T##N N;
|
||||||
|
#define C7(Z, A,B,C,D,E,F,G, T, N) extern T* pt##N;
|
||||||
|
|
||||||
|
#include "../Commons/D2Funcs.h"
|
||||||
|
extern DataTables* SgptDataTables;
|
||||||
|
//ONLY UNTIL 1.10 :
|
||||||
|
//E2F(D2Client,0, DWORD, D2isLODGame, ());
|
||||||
|
//E2F(D2Client,0, BYTE, D2GetDifficultyLevel, ());
|
||||||
|
//E2S(D2Client,0, DWORD, D2GetMouseX, ());
|
||||||
|
//E2S(D2Client,0, DWORD, D2GetMouseY, ());
|
||||||
|
//E2S(D2Client,0, Unit*, D2GetClientPlayer, ());
|
||||||
|
//E2F(D2Client,0, void, D2SendToServer3, (BYTE type, WORD p));
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer7, (BYTE type, WORD p1, WORD p2, WORD p3));
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer5, (BYTE type, DWORD p));
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer9, (BYTE type, DWORD p1, DWORD p2));
|
||||||
|
////E2F(D2Client,0, void, D2SendToServer13,(BYTE type, DWORD p1, DWORD p2, DWORD p3));
|
||||||
|
//E2F(D2Game,0, NetClient*, D2GetClient, (Unit* ptUnit, char* lpszErrFile, DWORD ErrLine));
|
||||||
|
//E2F(D2Client,0, void, D2CleanStatMouseUp, ());
|
||||||
|
|
||||||
|
|
||||||
|
#undef F7
|
||||||
|
#undef A7
|
||||||
|
#undef C7
|
||||||
|
#undef D2S
|
||||||
|
#undef D2F
|
||||||
|
#undef E2S
|
||||||
|
#undef E2F
|
||||||
|
#undef E2C
|
||||||
|
|
||||||
|
extern TD2AddPlayerStat V2AddPlayerStat;
|
||||||
|
extern TD2GetGameByClientID V2GetGameByClientID;
|
||||||
|
extern TD2SpawnMonster V2SpawnMonster;
|
||||||
|
//extern TD2SetColorPopup V2SetColorPopup;
|
||||||
|
extern WORD (*getDescStrPos) (DWORD statID);
|
||||||
|
extern void* (STDCALL *compileTxtFile)(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength);
|
||||||
|
void setImage(sDrawImageInfo* data, void* image);
|
||||||
|
void setFrame(sDrawImageInfo* data, DWORD frame);
|
||||||
|
void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color, DWORD transTbl){D2FillArea(x,y,x+Width,y+Height,color,transTbl);};
|
||||||
|
|
||||||
|
//#define SgptDataTables (*ptSgptDataTables)
|
||||||
|
#define ResolutionY (*ptResolutionY)
|
||||||
|
#define ResolutionX (*ptResolutionX)
|
||||||
|
#define NegWindowStartY (*ptNegWindowStartY)
|
||||||
|
#define WindowStartX (*ptWindowStartX)
|
||||||
|
#define GameTypeMode (*ptGameTypeMode)
|
||||||
|
#define ClientTable (*ptClientTable)
|
||||||
|
|
||||||
|
#define IsLodGame (*ptIsLodGame)
|
||||||
|
#define DifficultyLevel (*ptDifficultyLevel)
|
||||||
|
#define MouseY (*ptMouseY)
|
||||||
|
#define MouseX (*ptMouseX)
|
||||||
|
#define ptClientChar (*ptptClientChar)
|
||||||
|
//#define CurrentNPCNum (*ptCurrentNPCNum)
|
||||||
|
|
||||||
|
bool initD2functions();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
24
PlugY/error.h
Normal file
24
PlugY/error.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*==============================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
@file error.hpp
|
||||||
|
@brief Error logger definition.
|
||||||
|
|
||||||
|
This file defiens various functions related to
|
||||||
|
error handling in D2External functions.
|
||||||
|
|
||||||
|
==============================================*/
|
||||||
|
|
||||||
|
#ifndef __ERROR_H__INCLUDED__
|
||||||
|
#define __ERROR_H__INCLUDED__
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern DWORD active_logFile;
|
||||||
|
|
||||||
|
void log_initfile();
|
||||||
|
void log_box( const char* pFormat, ... );
|
||||||
|
void log_msg( const char* pFormat, ... );
|
||||||
|
void d2_assert( bool pCondition, char* pLocation, char* pMessage, int pLineNbr );
|
||||||
|
|
||||||
|
#endif
|
21
PlugY/extendedSaveFile.h
Normal file
21
PlugY/extendedSaveFile.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file for each characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
BYTE* readExtendedSaveFile(char* name, DWORD* size);
|
||||||
|
void writeExtendedSaveFile(char* name, BYTE* data, DWORD size);
|
||||||
|
|
||||||
|
int loadExtendedSaveFile(Unit* ptChar, BYTE* data, DWORD maxSize);
|
||||||
|
void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
|
||||||
|
void backupExtendedSaveFile(char* name);
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
31
PlugY/extraOptions.h
Normal file
31
PlugY/extraOptions.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
More little options.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __EXTRAOPTIONS_H__INCLUDED
|
||||||
|
#define __EXTRAOPTIONS_H__INCLUDED
|
||||||
|
|
||||||
|
extern int active_RunLODs;
|
||||||
|
extern int active_alwaysRegenMapInSP;
|
||||||
|
extern DWORD nbPlayersCommandByDefault;
|
||||||
|
extern int active_DisplayItemLevel;
|
||||||
|
extern int active_AlwaysDisplayLifeMana;
|
||||||
|
extern int active_EnabledTXTFilesWithMSExcel;
|
||||||
|
extern int active_DisplayBaseStatsValue;
|
||||||
|
extern int active_LadderRunewords;
|
||||||
|
extern int active_EnabledCowPortalWhenCowKingWasKill;
|
||||||
|
|
||||||
|
void Install_RunLODs();
|
||||||
|
void Install_AlwaysRegenMapInSP();
|
||||||
|
void Install_SendPlayersCommand();
|
||||||
|
void Install_DisplayItemLevel();
|
||||||
|
void Install_AlwaysDisplayLifeMana();
|
||||||
|
void Install_EnabledTXTFilesWithMSExcel();
|
||||||
|
void Install_DisplayBaseStatsValue();
|
||||||
|
void Install_LadderRunewords();
|
||||||
|
void Install_EnabledCowPortalWhenCowKingWasKill();
|
||||||
|
|
||||||
|
#endif
|
16
PlugY/globalVariable.h
Normal file
16
PlugY/globalVariable.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Set global variable.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __GLOBAL_VARIABLE_H__INCLUDED
|
||||||
|
#define __GLOBAL_VARIABLE_H__INCLUDED
|
||||||
|
|
||||||
|
extern bool onRealm;
|
||||||
|
extern bool needToInit;
|
||||||
|
|
||||||
|
void Install_VariableOnRealm();
|
||||||
|
|
||||||
|
#endif
|
46
PlugY/infinityStash.h
Normal file
46
PlugY/infinityStash.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
infinity Stash gestion
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
extern DWORD maxSelfPages;
|
||||||
|
extern DWORD maxSharedPages;
|
||||||
|
extern DWORD nbPagesPerIndex;
|
||||||
|
extern DWORD nbPagesPerIndex2;
|
||||||
|
extern bool active_multiPageStash;
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
void toggleToSharedStash(Unit* ptChar);
|
||||||
|
void toggleToSelfStash(Unit* ptChar);
|
||||||
|
void selectPreviousStash(Unit* ptChar);
|
||||||
|
void selectNextStash(Unit* ptChar);
|
||||||
|
void selectPreviousIndexStash(Unit* ptChar);
|
||||||
|
void selectNextIndexStash(Unit* ptChar);
|
||||||
|
void selectPrevious2Stash(Unit* ptChar);
|
||||||
|
void selectNext2Stash(Unit* ptChar);
|
||||||
|
void selectPreviousIndex2Stash(Unit* ptChar);
|
||||||
|
void selectNextIndex2Stash(Unit* ptChar);
|
||||||
|
|
||||||
|
void selectStash(Unit* ptChar, Stash* newStash);
|
||||||
|
void setSelectedStashClient(DWORD stashId, DWORD stashFlags, DWORD flags);
|
||||||
|
|
||||||
|
Stash* addStash(Unit* ptChar, bool isShared);
|
||||||
|
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 Install_MultiPageStash();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
13
PlugY/interface_Skills.h
Normal file
13
PlugY/interface_Skills.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface Skills functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __INTERFACE_SKILLS_HPP__INCLUDED
|
||||||
|
#define __INTERFACE_SKILLS_HPP__INCLUDED
|
||||||
|
|
||||||
|
void Install_InterfaceSkills();
|
||||||
|
|
||||||
|
#endif
|
13
PlugY/interface_Stash.h
Normal file
13
PlugY/interface_Stash.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __INTERFACE_STASH_HPP__INCLUDED
|
||||||
|
#define __INTERFACE_STASH_HPP__INCLUDED
|
||||||
|
|
||||||
|
void Install_InterfaceStash();
|
||||||
|
|
||||||
|
#endif
|
13
PlugY/interface_Stats.h
Normal file
13
PlugY/interface_Stats.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Interface Stats functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __INTERFACE_STATS_HPP__INCLUDED
|
||||||
|
#define __INTERFACE_STATS_HPP__INCLUDED
|
||||||
|
|
||||||
|
void Install_InterfaceStats();
|
||||||
|
|
||||||
|
#endif
|
39
PlugY/language.h
Normal file
39
PlugY/language.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Language management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __LANGUAGE_H__INCLUDED
|
||||||
|
#define __LANGUAGE_H__INCLUDED
|
||||||
|
|
||||||
|
extern bool active_ChangeLanguage;
|
||||||
|
extern DWORD selectedLanguage;
|
||||||
|
|
||||||
|
extern bool active_LanguageManagement;
|
||||||
|
extern DWORD defaultLanguage;
|
||||||
|
|
||||||
|
union t_availableLanguages
|
||||||
|
{
|
||||||
|
DWORD all;
|
||||||
|
struct {
|
||||||
|
DWORD eng:1;
|
||||||
|
DWORD esp:1;
|
||||||
|
DWORD deu:1;
|
||||||
|
DWORD fra:1;
|
||||||
|
DWORD por:1;
|
||||||
|
DWORD ita:1;
|
||||||
|
DWORD jpn:1;
|
||||||
|
DWORD kor:1;
|
||||||
|
DWORD sin:1;
|
||||||
|
DWORD chi:1;
|
||||||
|
DWORD pol:1;
|
||||||
|
DWORD rus:1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extern t_availableLanguages availableLanguages;
|
||||||
|
|
||||||
|
void Install_LanguageManagement();
|
||||||
|
|
||||||
|
#endif
|
13
PlugY/loadPlayerData.h
Normal file
13
PlugY/loadPlayerData.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Load Player Custom Data.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __LOADPLAYERDATA_H__INCLUDED
|
||||||
|
#define __LOADPLAYERDATA_H__INCLUDED
|
||||||
|
|
||||||
|
void Install_LoadPlayerData();
|
||||||
|
|
||||||
|
#endif
|
22
PlugY/mainScreen.h
Normal file
22
PlugY/mainScreen.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add "plugY v1.00" on screen.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __MAINSCREEN_H__INCLUDED
|
||||||
|
#define __MAINSCREEN_H__INCLUDED
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern bool active_VersionTextChange;
|
||||||
|
extern char* versionText;
|
||||||
|
extern BYTE modVersionColor;
|
||||||
|
extern bool active_PrintPlugYVersion;
|
||||||
|
extern BYTE colorOfPlugYVersion;
|
||||||
|
|
||||||
|
void Install_PrintPlugYVersion();
|
||||||
|
void Install_VersionChange();
|
||||||
|
|
||||||
|
#endif
|
33
PlugY/modifMemory.h
Normal file
33
PlugY/modifMemory.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*==============================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Modification of code in memory functions.
|
||||||
|
|
||||||
|
/*============================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern void* currentMemoryPos;
|
||||||
|
DWORD mem_seek(DWORD newPos);
|
||||||
|
|
||||||
|
void memt_byte(BYTE old, BYTE val);
|
||||||
|
|
||||||
|
#define MEMT_DWORD(O, R) memt_dword((DWORD)(O), (DWORD)(R))
|
||||||
|
void memt_dword(DWORD old, DWORD val);
|
||||||
|
|
||||||
|
#define MEMT_REF4(O, R) memt_ref4((DWORD)(O), (DWORD)(R))
|
||||||
|
void memt_ref4(DWORD old, DWORD ref);
|
||||||
|
|
||||||
|
//CALL <JMP.&D2gfx.#10047>
|
||||||
|
#define MEMJ_REF4(O, R) memj_ref4((DWORD)(O), (DWORD)(R))
|
||||||
|
void memj_ref4(DWORD old, DWORD ref);
|
||||||
|
|
||||||
|
//CALL D2Common.6FD5F500
|
||||||
|
#define MEMC_REF4(O, R) memc_ref4((DWORD)(O), (DWORD)(R))
|
||||||
|
void memc_ref4(DWORD old, DWORD ref);
|
||||||
|
|
||||||
|
//CALL DWORD PTR DS:[<&USER32.GetKeyState>]
|
||||||
|
#define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R))
|
||||||
|
void memd_ref4(DWORD old, DWORD ref);
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
13
PlugY/newInterface_CubeListing.h
Normal file
13
PlugY/newInterface_CubeListing.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Cube Listing functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __NEWINTERFACE_CUBELISTING_H__INCLUDED
|
||||||
|
#define __NEWINTERFACE_CUBELISTING_H__INCLUDED
|
||||||
|
|
||||||
|
void listAllCubeFormula();
|
||||||
|
|
||||||
|
#endif
|
15
PlugY/newInterface_Runewords.h
Normal file
15
PlugY/newInterface_Runewords.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
New runeword Interface
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __NEWINTERFACE_RUNEWORDS_H__INCLUDED
|
||||||
|
#define __NEWINTERFACE_RUNEWORDS_H__INCLUDED
|
||||||
|
|
||||||
|
void STDCALL printRunewordsPage();
|
||||||
|
DWORD STDCALL mouseRunewordsPageLeftDown(sWinMessage* msg);
|
||||||
|
DWORD STDCALL mouseRunewordsPageLeftUp(sWinMessage* msg);
|
||||||
|
|
||||||
|
#endif
|
15
PlugY/newInterface_Stats.h
Normal file
15
PlugY/newInterface_Stats.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
New Stat Interface
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __NEWINTERFACE_STATS_H__INCLUDED
|
||||||
|
#define __NEWINTERFACE_STATS_H__INCLUDED
|
||||||
|
|
||||||
|
void STDCALL printNewStatsPage();
|
||||||
|
DWORD STDCALL mouseNewStatsPageLeftDown(sWinMessage* msg);
|
||||||
|
DWORD STDCALL mouseNewStatsPageLeftUp(sWinMessage* msg);
|
||||||
|
|
||||||
|
#endif
|
15
PlugY/newInterface_StatsPageTwo.h
Normal file
15
PlugY/newInterface_StatsPageTwo.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
New Stat Interface Page 2
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __NEWINTERFACE_STATSPAGETWO_H__INCLUDED
|
||||||
|
#define __NEWINTERFACE_STATSPAGETWO_H__INCLUDED
|
||||||
|
|
||||||
|
void STDCALL printNewStatsPageTwo(int currentPage);
|
||||||
|
DWORD STDCALL mouseNewStatsPageTwoLeftDown(sWinMessage* msg);
|
||||||
|
DWORD STDCALL mouseNewStatsPageTwoLeftUp(sWinMessage* msg);
|
||||||
|
|
||||||
|
#endif
|
27
PlugY/newInterfaces.h
Normal file
27
PlugY/newInterfaces.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
New Interfaces functions
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __NEW_INTERFACES_H__INCLUDED
|
||||||
|
#define __NEW_INTERFACES_H__INCLUDED
|
||||||
|
|
||||||
|
#define MILIEU(X,L,N) (X + ((N<L)? (L-N)/2 : 0))
|
||||||
|
#define isOnStatsPage(x,y) ((x<400) && (y<553))
|
||||||
|
|
||||||
|
extern DWORD bDontPrintBorder;
|
||||||
|
|
||||||
|
void GoNextStatPage();
|
||||||
|
void GoPreviousStatPage();
|
||||||
|
void GoStatPage(int page);
|
||||||
|
int GetCurrentPage();
|
||||||
|
|
||||||
|
extern bool active_newInterfaces;
|
||||||
|
extern bool selectMainPageOnOpenning;
|
||||||
|
extern bool printBackgroundOnMainPage;
|
||||||
|
|
||||||
|
void Install_NewInterfaces();
|
||||||
|
|
||||||
|
#endif
|
16
PlugY/othersFeatures.h
Normal file
16
PlugY/othersFeatures.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Others features.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __OTHERSFEATURES_H__INCLUDED
|
||||||
|
#define __OTHERSFEATURES_H__INCLUDED
|
||||||
|
|
||||||
|
extern bool active_othersFeatures;
|
||||||
|
|
||||||
|
void Install_OthersFeatures();
|
||||||
|
void Install_ChangeResolution();
|
||||||
|
|
||||||
|
#endif
|
30
PlugY/parameters.h
Normal file
30
PlugY/parameters.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Loading parameters from ini file.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define PLUGY_VERSION "10.00"
|
||||||
|
|
||||||
|
#define LOG_FILE "PlugY.log"
|
||||||
|
|
||||||
|
enum TargetMod
|
||||||
|
{
|
||||||
|
MOD_NO = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Global variable (user parameters)
|
||||||
|
extern char* modDataDirectory;
|
||||||
|
extern bool active_plugin;
|
||||||
|
extern bool active_DisableBattleNet;
|
||||||
|
extern bool active_CheckMemory;
|
||||||
|
extern char* dllFilenames;
|
||||||
|
extern bool active_D2Mod;
|
||||||
|
extern TargetMod selectModParam;
|
||||||
|
|
||||||
|
void loadParameters();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
53
PlugY/playerCustomData.h
Normal file
53
PlugY/playerCustomData.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Data added to Player base-stucture
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
extern bool active_PlayerCustomData;
|
||||||
|
|
||||||
|
struct Unit;
|
||||||
|
|
||||||
|
struct Stash
|
||||||
|
{
|
||||||
|
DWORD id;
|
||||||
|
union {
|
||||||
|
DWORD flags;
|
||||||
|
struct {
|
||||||
|
DWORD isShared:1; //
|
||||||
|
};
|
||||||
|
};
|
||||||
|
char* name;
|
||||||
|
Unit* ptListItem;
|
||||||
|
Stash* previousStash;
|
||||||
|
Stash* nextStash;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct PYPlayerData
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
DWORD flags;
|
||||||
|
struct {
|
||||||
|
DWORD selfStashIsOpened:1; //
|
||||||
|
DWORD sharedStashIsOpened:1;//
|
||||||
|
DWORD showSharedStash:1; //
|
||||||
|
// DWORD notOnRealm:1; //set to 1 when the player is load from client or in SP
|
||||||
|
};
|
||||||
|
};
|
||||||
|
DWORD sharedGold;
|
||||||
|
DWORD nbSelfPages;
|
||||||
|
DWORD nbSharedPages;
|
||||||
|
Stash* currentStash;
|
||||||
|
Stash* selfStash;
|
||||||
|
Stash* sharedStash;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Install_PlayerCustomData();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
108
PlugY/plugYFiles.h
Normal file
108
PlugY/plugYFiles.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Data added to D2 base-stucture
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern void* unassignSkillsBtnImages;
|
||||||
|
extern void* unassignStatsBtnImages;
|
||||||
|
extern void* stashBtnsImages;
|
||||||
|
extern void* newStatsInterfaceImages;
|
||||||
|
extern void* statsBackgroundImages;
|
||||||
|
extern void* sharedGoldBtnsImages;
|
||||||
|
|
||||||
|
|
||||||
|
#define CREATE_TABLE_DESCRIPTION( N ) \
|
||||||
|
BINField TableDesc[N]; int i=0
|
||||||
|
|
||||||
|
// 0 - null data, used by the End (Term) fields only
|
||||||
|
#define ADD_TERM_FIELD() \
|
||||||
|
TableDesc[i].fieldName = "end"; \
|
||||||
|
TableDesc[i].type = 0x00; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = 0x00; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 1 - String (needs length field)
|
||||||
|
#define ADD_STRING_FIELD( O,N,L ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x01; \
|
||||||
|
TableDesc[i].strLength = L; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 2 - DWORD field
|
||||||
|
#define ADD_DWORD_FIELD( O,N ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x02; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 3 - WORD field
|
||||||
|
#define ADD_WORD_FIELD( O,N ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x03; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 4 - BYTE field
|
||||||
|
#define ADD_BYTE_FIELD( O,N ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x04; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 6 - UBYTE field
|
||||||
|
#define ADD_UBYTE_FIELD( O,N ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x06; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// 9 - three and four letter codes
|
||||||
|
#define ADD_STRCODE_FIELD( O,N ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x09; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = 0x00000000; i++
|
||||||
|
|
||||||
|
// A,B,D,10,11 - Lookup code
|
||||||
|
#define ADD_LOOKUP_FIELD( O,N,T,L ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = T; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = L; i++
|
||||||
|
|
||||||
|
#define ADD_LOOKUP_WORD( O,N,L ) \
|
||||||
|
TableDesc[i].fieldName = N; \
|
||||||
|
TableDesc[i].type = 0x14; \
|
||||||
|
TableDesc[i].strLength = 0x00; \
|
||||||
|
TableDesc[i].offset = O; \
|
||||||
|
TableDesc[i].lookup = (void*)(L); i++
|
||||||
|
|
||||||
|
|
||||||
|
//D,F:Lookup for BYTE (F : UBYTE ?)
|
||||||
|
//17: call function
|
||||||
|
//14,16:Lookup for WORD
|
||||||
|
//11:Lookup fo DWORD
|
||||||
|
//1A: flag
|
||||||
|
|
||||||
|
#define BUILD_BIN( T,V,N,F ) V = (T*)compileTxtFile(mempool, F, TableDesc, (DWORD*)&nbStatsInterface, sizeof(T));
|
||||||
|
|
||||||
|
|
||||||
|
//extern void* lookupItemStatCost;
|
||||||
|
|
||||||
|
void Install_PlugYFiles();
|
||||||
|
void Install_PlugYImagesFiles();
|
||||||
|
void Install_PlugYTxtFiles();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
15
PlugY/resource.h
Normal file
15
PlugY/resource.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//{{NO_DEPENDENCIES}}
|
||||||
|
// Microsoft Visual C++ generated include file.
|
||||||
|
// Used by PlugY.rc
|
||||||
|
//
|
||||||
|
|
||||||
|
// Next default values for new objects
|
||||||
|
//
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
#define _APS_NEXT_RESOURCE_VALUE 106
|
||||||
|
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||||
|
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||||
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
|
#endif
|
||||||
|
#endif
|
16
PlugY/savePath.h
Normal file
16
PlugY/savePath.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Changing the current save path.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __SAVEPATH_H__INCLUDED
|
||||||
|
#define __SAVEPATH_H__INCLUDED
|
||||||
|
|
||||||
|
extern char* savePath;
|
||||||
|
extern bool active_changingSavePath;
|
||||||
|
|
||||||
|
void Install_ChangingSavePath();
|
||||||
|
|
||||||
|
#endif
|
13
PlugY/savePlayerData.h
Normal file
13
PlugY/savePlayerData.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Save Player Custom Data.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __SAVEPLAYERDATA_H__INCLUDED
|
||||||
|
#define __SAVEPLAYERDATA_H__INCLUDED
|
||||||
|
|
||||||
|
void Install_SavePlayerData();
|
||||||
|
|
||||||
|
#endif
|
21
PlugY/sharedSaveFile.h
Normal file
21
PlugY/sharedSaveFile.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Add an extra save file shared by all own characters.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
BYTE* readSharedSaveFile(char* name, DWORD* size);
|
||||||
|
void writeSharedSaveFile(char* name, BYTE* data, DWORD size, bool isHardcore);
|
||||||
|
|
||||||
|
int loadSharedSaveFile(Unit* ptChar, BYTE* data, DWORD maxSize);
|
||||||
|
void saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize);
|
||||||
|
|
||||||
|
void backupSharedSaveFile();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
17
PlugY/skillPerLevelUp.h
Normal file
17
PlugY/skillPerLevelUp.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Change Skill win per level up.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern bool active_SkillPerLevelUpChange;
|
||||||
|
extern DWORD skillPerLevelUp;
|
||||||
|
|
||||||
|
void Install_SkillPerLevelUp();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
20
PlugY/skillsPoints.h
Normal file
20
PlugY/skillsPoints.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Unassign Skill Point for futher re-assignment.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __SKILLSPOINTS_H__INCLUDED
|
||||||
|
#define __SKILLSPOINTS_H__INCLUDED
|
||||||
|
|
||||||
|
extern bool active_SkillsPoints;
|
||||||
|
extern bool unassignSkillsPointsOneByOne;
|
||||||
|
extern int posXUnassignSkillBtn, posYUnassignSkillBtn;
|
||||||
|
|
||||||
|
void UnassignAllSkillsPoints(Unit* ptChar);
|
||||||
|
void client_UnassignAllSkillsPoints();
|
||||||
|
|
||||||
|
void Install_SkillsPoints();
|
||||||
|
|
||||||
|
#endif
|
17
PlugY/statPerLevelUp.h
Normal file
17
PlugY/statPerLevelUp.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Change Stat win per level up.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern bool active_StatPerLevelUpChange;
|
||||||
|
extern DWORD statPerLevelUp;
|
||||||
|
|
||||||
|
void Install_StatPerLevelUp();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
29
PlugY/statsPoints.h
Normal file
29
PlugY/statsPoints.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Unassign Stats Point for futher re-assignment.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern bool active_StatsPoints;
|
||||||
|
extern DWORD keyUsedForUnassignStatPoint;
|
||||||
|
extern bool active_StatsShiftClickLimit;
|
||||||
|
extern DWORD limitValueToShiftClick;
|
||||||
|
|
||||||
|
void UnassignStrPoint(Unit* ptChar);
|
||||||
|
void UnassignStrPoints(Unit* ptChar);
|
||||||
|
void UnassignDexPoint(Unit* ptChar);
|
||||||
|
void UnassignDexPoints(Unit* ptChar);
|
||||||
|
void UnassignVitPoint(Unit* ptChar);
|
||||||
|
void UnassignVitPoints(Unit* ptChar);
|
||||||
|
void UnassignEnePoint(Unit* ptChar);
|
||||||
|
void UnassignEnePoints(Unit* ptChar);
|
||||||
|
|
||||||
|
void Install_StatsLimitShiftClick();
|
||||||
|
void Install_StatsPoints();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
15
PlugY/uberQuest.h
Normal file
15
PlugY/uberQuest.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Uber Quest Management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern bool active_UberQuest;
|
||||||
|
|
||||||
|
void Install_UberQuest();
|
||||||
|
void resetQuestState();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
16
PlugY/updateClient.h
Normal file
16
PlugY/updateClient.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating Client.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#ifndef __UPDATECLIENT_H__INCLUDED
|
||||||
|
#define __UPDATECLIENT_H__INCLUDED
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
void Install_UpdateClient();
|
||||||
|
void updateClient(Unit* ptChar, DWORD mFunc, DWORD p1, DWORD p2, DWORD p3);
|
||||||
|
|
||||||
|
#endif
|
16
PlugY/updateServer.h
Normal file
16
PlugY/updateServer.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Updating Server.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "D2functions.h"
|
||||||
|
|
||||||
|
__inline void updateServer(WORD p) {if (!onRealm) D2SendToServer3(0x3A, p);};
|
||||||
|
void Install_UpdateServer();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
27
PlugY/worldEvent.h
Normal file
27
PlugY/worldEvent.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
World Event Management.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern bool active_WorldEvent;
|
||||||
|
extern DWORD showSOJSoldCounterInAllDiff;
|
||||||
|
extern char* itemsToSell;
|
||||||
|
extern DWORD worldEventmonsterID;
|
||||||
|
extern DWORD valueOfOwnSOJSold;
|
||||||
|
extern DWORD valueInitSOJSoldMin;
|
||||||
|
extern DWORD valueInitSOJSoldDelta;
|
||||||
|
extern DWORD triggerAtSolJSoldMin;
|
||||||
|
extern DWORD triggerAtSolJSoldDelta;
|
||||||
|
extern bool active_AutomaticSell;
|
||||||
|
extern DWORD timeBeforeAutoSellMin;
|
||||||
|
extern DWORD timeBeforeAutoSellDelta;
|
||||||
|
|
||||||
|
void initWorldEventVariables();
|
||||||
|
|
||||||
|
void Install_WorldEvent();
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
BIN
PlugYInstall/PlugYInstall.aps
Normal file
BIN
PlugYInstall/PlugYInstall.aps
Normal file
Binary file not shown.
456
PlugYInstall/PlugYInstall.cpp
Normal file
456
PlugYInstall/PlugYInstall.cpp
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
/*=================================================================
|
||||||
|
File created by Yohann NICOLAS.
|
||||||
|
|
||||||
|
Patch D2gfx.dll to install PlugY.
|
||||||
|
|
||||||
|
=================================================================*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
const char* boxNameInstall = "Installation of PlugY, The Survival Kit Installation";
|
||||||
|
const char* boxNameUnInstall = "Uninstall PlugY, The Survival Kit ";
|
||||||
|
|
||||||
|
int CALL_LOAD[7] = {0x389B,0x389B,0x3870,0x8B23,0xB423,0x8F63,0xB423};
|
||||||
|
BYTE callNewLoad[7][6]={{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary
|
||||||
|
{0xE8,0x60,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA738A0 ;install loadlibrary
|
||||||
|
{0xE8,0x8B,0x85,0x00,0x00,0x90},// JMP 6FA7BE00-6FA73875 ;install loadlibrary
|
||||||
|
{0xE8,0xD8,0x42,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88B28 ;install loadlibrary
|
||||||
|
{0xE8,0xD8,0x19,0x00,0x00,0x90},// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
|
||||||
|
{0xE8,0x98,0x3E,0x00,0x00,0x90},// JMP 6FA8CE00-6FA88F68 ;install loadlibrary
|
||||||
|
{0xE8,0xD8,0x19,0x00,0x00,0x90}};// JMP 6FA8CE00-6FA8B428 ;install loadlibrary
|
||||||
|
BYTE callOldLoad[7][6]={{0xFF,0x15,0x3C,0xC0,0xA7,0x6F},
|
||||||
|
{0xFF,0x15,0x3C,0xC0,0xA7,0x6F},
|
||||||
|
{0xFF,0x15,0x40,0xC0,0xA7,0x6F},
|
||||||
|
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||||
|
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||||
|
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F},
|
||||||
|
{0xFF,0x15,0x1C,0xD1,0xA8,0x6F}};
|
||||||
|
|
||||||
|
int CALL_FREE[7] = {0x3A8C,0x3A8C,0x3A6D,0x8ACA,0xB3CA,0x8F0A,0xB3CA};
|
||||||
|
BYTE callNewFree[7][6]={{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary
|
||||||
|
{0xE8,0xAF,0x83,0x00,0x00,0x90}, // JMP 6FA7BE40-6FA73A91 ;install freelibrary
|
||||||
|
{0xE8,0xD2,0x83,0x00,0x00,0x90}, // JMP 6FA7BE44-6FA73A72 ;install freelibrary
|
||||||
|
{0xE8,0x75,0x43,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88ACF ;install freelibrary
|
||||||
|
{0xE8,0x75,0x1A,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA8B3CF ;install freelibrary
|
||||||
|
{0xE8,0x35,0x3F,0x00,0x00,0x90}, // JMP 6FA8CE44-6FA88F0F ;install freelibrary
|
||||||
|
{0xE8,0x75,0x1A,0x00,0x00,0x90}};// JMP 6FA8CE44-6FA8B3CF ;install freelibrary
|
||||||
|
BYTE callOldFree[7][6]={{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x44,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x48,0xC0,0xA7,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}, // CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
{0xFF,0x15,0x2C,0xD1,0xA8,0x6F}};// CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>]
|
||||||
|
|
||||||
|
int CALLER_LOADPLUGY = 0xBE00;//6FA7BE00-6FA70000
|
||||||
|
BYTE caller_LoadPlugY[]={
|
||||||
|
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
|
||||||
|
0x50, //PUSH EAX
|
||||||
|
0x68,0x80,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
|
||||||
|
0xFF,0x15,0x40,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>] ; kernel32.LoadLibraryA
|
||||||
|
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
|
||||||
|
0x85,0xC0, //TEST EAX,EAX
|
||||||
|
0x74,0x18, //JE SHORT d2gfx.6FA7BE37
|
||||||
|
0x68,0x90,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE10 ;Init ID
|
||||||
|
0x50, //PUSH EAX
|
||||||
|
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; kernel32.GetProcAddress
|
||||||
|
0x85,0xC0, //TEST EAX,EAX
|
||||||
|
0x74,0x04, //JE SHORT d2gfx.6FA7BDC1
|
||||||
|
0x6A,0x00, //PUSH 0
|
||||||
|
0xFF,0xD0, //CALL EAX
|
||||||
|
0x58, //POP EAX
|
||||||
|
0xC2,0x04,0x00, //RETN 4
|
||||||
|
0x59, //POP ECX
|
||||||
|
0xB9,0x80,0xBE,0xA7,0x6F, //MOV ECX,d2gfx.6FA7BE80 ; ASCII "PlugY.dll"
|
||||||
|
0x83,0x04,0x24,0x11, //ADD DWORD PTR SS:[ESP],11
|
||||||
|
0xC2,0x04,0x00}; //RETN 4
|
||||||
|
|
||||||
|
|
||||||
|
int CALLER_FREEPLUGY = 0xBE44;//6FA7BE44-6FA70000
|
||||||
|
BYTE caller_FreePlugY[]={
|
||||||
|
0xFF,0x74,0x24,0x04, //PUSH DWORD PTR SS:[ESP+4]
|
||||||
|
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrary>] ; kernel32.FreeLibrary
|
||||||
|
0x50, //PUSH EAX
|
||||||
|
0xA1,0xFC,0xEF,0xA8,0x6F, //MOV EAX,DWORD PTR DS:[6FA8EFFC]
|
||||||
|
0x85,0xC0, //TEST EAX,EAX
|
||||||
|
0x74,0x20, //JE SHORT d2gfx.6FA7BE74
|
||||||
|
0x50, //PUSH EAX
|
||||||
|
0x68,0xA0,0xBE,0xA7,0x6F, //PUSH d2gfx.6FA7BE20 ;release
|
||||||
|
0x50, //PUSH EAX
|
||||||
|
0x33,0xC0, //XOR EAX,EAX
|
||||||
|
0xA3,0xFC,0xEF,0xA8,0x6F, //MOV DWORD PTR DS:[6FA8EFFC],EAX
|
||||||
|
0xFF,0x15,0x3C,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
|
||||||
|
0x85,0xC0, //TEST EAX,EAX
|
||||||
|
0x74,0x02, //JE SHORT d2gfx.6FA7BDEF
|
||||||
|
0xFF,0xD0, //CALL EAX
|
||||||
|
0xFF,0x15,0x48,0xC0,0xA7,0x6F, //CALL DWORD PTR DS:[<&KERNEL32.FreeLibrar>; kernel32.FreeLibrary
|
||||||
|
0x58, //POP EAX
|
||||||
|
0xC2,0x04,0x00}; //RETN 4
|
||||||
|
|
||||||
|
|
||||||
|
int S_DLLNAME = 0xBE80;//6FA7BE30-6FA70000
|
||||||
|
BYTE sDllName[]={'P','l','u','g','Y','.','d','l','l',0};// Dll filename to load.
|
||||||
|
|
||||||
|
int S_INIT = 0xBE90;//6FA7BE10-6FA70000
|
||||||
|
BYTE sInit[]={'_','I','n','i','t','@','4',0};
|
||||||
|
|
||||||
|
int S_RELEASE = 0xBEA0;//6FA7BE20-6FA70000
|
||||||
|
BYTE sRelease[]={'_','R','e','l','e','a','s','e','@','0',0};
|
||||||
|
|
||||||
|
enum eFileVersion
|
||||||
|
{
|
||||||
|
V109b=0,
|
||||||
|
V109d,
|
||||||
|
V110,
|
||||||
|
V111,
|
||||||
|
V111b,
|
||||||
|
V112,
|
||||||
|
V113c,
|
||||||
|
UNKNOW
|
||||||
|
};
|
||||||
|
|
||||||
|
int getVersion(FILE *dll)
|
||||||
|
{
|
||||||
|
int ver;
|
||||||
|
//GET_VERSION(D2gfx, 80, 110, 0x00949FA8, 0x018866A8, 0x401526B2, 0x575C8A5E, 0x42E6C22A, 0x43028B19, 0xACBE1B9E, 0x00000000);
|
||||||
|
int addr;
|
||||||
|
fseek(dll,0x80,SEEK_SET);
|
||||||
|
fread(&addr,sizeof(addr),1,dll);
|
||||||
|
if (addr == 0x00949FA8)
|
||||||
|
ver = V109b;
|
||||||
|
else if (addr == 0x018866A8)
|
||||||
|
ver = V109d;
|
||||||
|
else if (addr == 0x401526B2)
|
||||||
|
ver = V110;
|
||||||
|
else if (addr == 0x575C8A5E)
|
||||||
|
{
|
||||||
|
fseek(dll,0x110,SEEK_SET);
|
||||||
|
fread(&addr,sizeof(addr),1,dll);
|
||||||
|
if (addr == 0x42E6C22A)
|
||||||
|
ver = V111;
|
||||||
|
else if (addr == 0x43028B19)
|
||||||
|
ver = V111b;
|
||||||
|
else
|
||||||
|
ver = UNKNOW;
|
||||||
|
}
|
||||||
|
else if (addr == 0xACBE1B9E)
|
||||||
|
ver = V112;
|
||||||
|
else if (addr == 0xACBE1BB6)
|
||||||
|
ver = V113c;
|
||||||
|
else
|
||||||
|
ver = UNKNOW;
|
||||||
|
return ver;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void updateData(int version)
|
||||||
|
{
|
||||||
|
switch(version)
|
||||||
|
{
|
||||||
|
case V109b:
|
||||||
|
case V109d:
|
||||||
|
caller_LoadPlugY[6] -= 4;
|
||||||
|
caller_LoadPlugY[18] -= 4;
|
||||||
|
caller_LoadPlugY[39] -= 4;
|
||||||
|
caller_FreePlugY[6] -= 4;
|
||||||
|
caller_FreePlugY[36] -= 4;
|
||||||
|
caller_FreePlugY[48] -= 4;
|
||||||
|
break;
|
||||||
|
case V110:
|
||||||
|
break;
|
||||||
|
case V111:
|
||||||
|
case V111b:
|
||||||
|
case V112:
|
||||||
|
case V113c:
|
||||||
|
CALLER_LOADPLUGY += 0x1000;
|
||||||
|
CALLER_FREEPLUGY += 0x1000;
|
||||||
|
S_INIT += 0x1000;
|
||||||
|
S_RELEASE += 0x1000;
|
||||||
|
S_DLLNAME += 0x1000;
|
||||||
|
*(DWORD*)(&caller_LoadPlugY[6]) = 0x6FA8D11C;
|
||||||
|
*(DWORD*)(&caller_LoadPlugY[18]) = 0x6FA8D11C;
|
||||||
|
*(DWORD*)(&caller_LoadPlugY[39]) = 0x6FA8D120;
|
||||||
|
*(DWORD*)(&caller_FreePlugY[6]) = 0x6FA8D12C;
|
||||||
|
*(DWORD*)(&caller_FreePlugY[36]) = 0x6FA8D120;
|
||||||
|
*(DWORD*)(&caller_FreePlugY[48]) = 0x6FA8D12C;
|
||||||
|
caller_LoadPlugY[13] += 0x10;
|
||||||
|
caller_LoadPlugY[14]++;
|
||||||
|
caller_LoadPlugY[25]++;
|
||||||
|
caller_LoadPlugY[33] += 0x10;
|
||||||
|
caller_LoadPlugY[34]++;
|
||||||
|
caller_LoadPlugY[58] += 0x10;
|
||||||
|
caller_LoadPlugY[59]++;
|
||||||
|
caller_FreePlugY[23] += 0x10;
|
||||||
|
caller_FreePlugY[24]++;
|
||||||
|
caller_FreePlugY[14]++;
|
||||||
|
caller_FreePlugY[32]++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////// EXPORTED FUNCTIONS //////////////////////////////
|
||||||
|
|
||||||
|
void Patch()
|
||||||
|
{
|
||||||
|
if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n"
|
||||||
|
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
|
||||||
|
"Do you want patch D2gfx.dll for the launch of PlugY ?",
|
||||||
|
boxNameInstall, MB_YESNO|MB_ICONQUESTION) == IDNO)
|
||||||
|
{
|
||||||
|
MessageBox(0,"D2gfx.dll isn't patched.\n",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *dll=fopen("d2gfx.dll","rb+");
|
||||||
|
|
||||||
|
if(!dll)
|
||||||
|
{
|
||||||
|
MessageBox(0,"Can't open D2gfx.dll in read/write mode\n"
|
||||||
|
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
|
||||||
|
"Quit Diablo II and try again.",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int version = getVersion(dll);
|
||||||
|
|
||||||
|
if (version == UNKNOW)
|
||||||
|
{
|
||||||
|
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||||
|
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||||
|
"Or re-install a clean version (between 1.09 and 1.12) of LOD.",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateData(version);
|
||||||
|
|
||||||
|
bool error = false;
|
||||||
|
int ident = 0;
|
||||||
|
BYTE buffer[100];
|
||||||
|
BYTE zeros[100];
|
||||||
|
memset(zeros,0,sizeof(zeros));
|
||||||
|
|
||||||
|
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||||
|
fread(buffer,6,1,dll);
|
||||||
|
if(memcmp(buffer, callOldLoad[version], 6) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, callNewLoad[version], 6) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||||
|
fread(buffer,6,1,dll);
|
||||||
|
if(memcmp(buffer, callOldFree[version], 6) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, callNewFree[version], 6) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(caller_LoadPlugY),1,dll);
|
||||||
|
if(memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(caller_FreePlugY),1,dll);
|
||||||
|
if(memcmp(buffer, zeros, sizeof(caller_FreePlugY)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_INIT,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sInit),1,dll);
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sInit)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, sInit, sizeof(sInit)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_RELEASE,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sRelease),1,dll);
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sRelease)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, sRelease, sizeof(sRelease)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sDllName),1,dll);
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sDllName)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, sDllName, sizeof(sDllName)) ==0 ) ident++;
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (ident==7)
|
||||||
|
{
|
||||||
|
MessageBox(0, "PlugY, The Survival Kit already installed.",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
exit(0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||||
|
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||||
|
"Or re-install a clean version (between 1.09 and 1.11b) of LOD.",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||||
|
fwrite(callNewLoad[version], 6, 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||||
|
fwrite(callNewFree[version], 6, 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||||
|
fwrite(caller_LoadPlugY, sizeof(caller_LoadPlugY), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||||
|
fwrite(caller_FreePlugY, sizeof(caller_FreePlugY), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_INIT,SEEK_SET);
|
||||||
|
fwrite(sInit, sizeof(sInit), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_RELEASE,SEEK_SET);
|
||||||
|
fwrite(sRelease, sizeof(sRelease), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||||
|
fwrite(sDllName, sizeof(sDllName), 1, dll);
|
||||||
|
|
||||||
|
fclose(dll);
|
||||||
|
|
||||||
|
MessageBox(0,"D2gfx.dll patched successfully.\n"
|
||||||
|
"PlugY, The Survival Kit installed successfully.",
|
||||||
|
boxNameInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Unpatch()
|
||||||
|
{
|
||||||
|
if (MessageBox(0,"This programm will modify the D2gfx.dll file of the current directory.\n"
|
||||||
|
"Before continue, don't forgot to backup D2gfx.dll if you want\n"
|
||||||
|
"Do you want patch D2gfx.dll for remove the launch of PlugY ?",
|
||||||
|
boxNameUnInstall, MB_YESNO|MB_ICONQUESTION) == IDNO)
|
||||||
|
{
|
||||||
|
MessageBox(0,"D2gfx.dll isn't patched.\n",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *dll=fopen("d2gfx.dll","rb+");
|
||||||
|
|
||||||
|
if(!dll)
|
||||||
|
{
|
||||||
|
MessageBox(0,"Can't open D2gfx.dll in read/write mode.\n"
|
||||||
|
"If Diablo II is running you can\'t install PlugY, The Survival Kit.\n"
|
||||||
|
"Quit Diablo and try again.",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int version = getVersion(dll);
|
||||||
|
|
||||||
|
if (version == UNKNOW)
|
||||||
|
{
|
||||||
|
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||||
|
"You can try to uninstall any previous version of PlugY, The Survival Kit then retry.\n"
|
||||||
|
"Or re-install a clean version (between 1.09 and 1.12) of LOD.",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateData(version);
|
||||||
|
|
||||||
|
bool error = false;
|
||||||
|
int ident = 0;
|
||||||
|
BYTE buffer[100];
|
||||||
|
BYTE zeros[100];
|
||||||
|
memset(zeros,0,sizeof(zeros));
|
||||||
|
|
||||||
|
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||||
|
fread(buffer,6,1,dll);
|
||||||
|
if(memcmp(buffer, callNewLoad[version], 6) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, callOldLoad[version], 6) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||||
|
fread(buffer,6,1,dll);
|
||||||
|
if(memcmp(buffer, callNewFree[version], 6) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, callOldFree[version], 6) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(caller_LoadPlugY),1,dll);
|
||||||
|
if(memcmp(buffer, caller_LoadPlugY, sizeof(caller_LoadPlugY)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, zeros, sizeof(caller_LoadPlugY)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(caller_FreePlugY),1,dll);
|
||||||
|
if(memcmp(buffer, caller_FreePlugY, sizeof(caller_FreePlugY)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, zeros, sizeof(caller_FreePlugY)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_INIT,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sInit),1,dll);
|
||||||
|
if(memcmp(buffer, sInit, sizeof(sInit)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sInit)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_RELEASE,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sRelease),1,dll);
|
||||||
|
if(memcmp(buffer, sRelease, sizeof(sRelease)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sRelease)) ==0 ) ident++;
|
||||||
|
|
||||||
|
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||||
|
fread(buffer,sizeof(sDllName),1,dll);
|
||||||
|
if(memcmp(buffer, sDllName, sizeof(sDllName)) !=0 ) error = true;
|
||||||
|
if(memcmp(buffer, zeros, sizeof(sDllName)) ==0 ) ident++;
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (ident==7)
|
||||||
|
{
|
||||||
|
MessageBox(0,"PlugY, The Survival Kit already uninstalled.",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
MessageBox(0,"Bad version of D2gfx.dll.\n"
|
||||||
|
"Unable to uninstall PlugY, The Survival Kit.",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONEXCLAMATION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(dll,CALL_LOAD[version],SEEK_SET);
|
||||||
|
fwrite(callOldLoad[version], 6, 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALL_FREE[version],SEEK_SET);
|
||||||
|
fwrite(callOldFree[version], 6, 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALLER_LOADPLUGY,SEEK_SET);
|
||||||
|
fwrite(zeros, sizeof(caller_LoadPlugY), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,CALLER_FREEPLUGY,SEEK_SET);
|
||||||
|
fwrite(zeros, sizeof(caller_FreePlugY), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_INIT,SEEK_SET);
|
||||||
|
fwrite(zeros, sizeof(sInit), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_RELEASE,SEEK_SET);
|
||||||
|
fwrite(zeros, sizeof(sRelease), 1, dll);
|
||||||
|
|
||||||
|
fseek(dll,S_DLLNAME,SEEK_SET);
|
||||||
|
fwrite(zeros, sizeof(sDllName), 1, dll);
|
||||||
|
|
||||||
|
fclose(dll);
|
||||||
|
|
||||||
|
MessageBox(0,"D2gfx.dll patched successfully.\n"
|
||||||
|
"PlugY, The Survival Kit uninstalled successfully.",
|
||||||
|
boxNameUnInstall, MB_OK|MB_ICONASTERISK);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
// if ((argc>1) && !strcmp(argv[1],"-u"))
|
||||||
|
#ifdef RESTORE
|
||||||
|
Unpatch();
|
||||||
|
#else
|
||||||
|
if ((argc>1) && !strcmp(argv[1],"-u"))
|
||||||
|
Unpatch();
|
||||||
|
else
|
||||||
|
Patch();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*================================= END OF FILE =================================*/
|
110
PlugYInstall/PlugYInstall.rc
Normal file
110
PlugYInstall/PlugYInstall.rc
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
// Microsoft Visual C++ generated resource script.
|
||||||
|
//
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
|
//
|
||||||
|
#include "afxres.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// English (U.S.) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// TEXTINCLUDE
|
||||||
|
//
|
||||||
|
|
||||||
|
1 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"resource.h\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
2 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"#include ""afxres.h""\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
3 TEXTINCLUDE
|
||||||
|
BEGIN
|
||||||
|
"\r\n"
|
||||||
|
"\0"
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#endif // English (U.S.) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// French (France) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
|
||||||
|
#ifdef _WIN32
|
||||||
|
LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
|
||||||
|
#pragma code_page(1252)
|
||||||
|
#endif //_WIN32
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Version
|
||||||
|
//
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION 1,0,4,0
|
||||||
|
PRODUCTVERSION 1,0,4,0
|
||||||
|
FILEFLAGSMASK 0x17L
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x4L
|
||||||
|
FILETYPE 0x1L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040c04b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "FileVersion", "1.04"
|
||||||
|
VALUE "OriginalFilename", "PlugY_Install.exe"
|
||||||
|
VALUE "ProductName", "PlugY Installation"
|
||||||
|
VALUE "ProductVersion", "1.04"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x40c, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
#endif // French (France) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef APSTUDIO_INVOKED
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Generated from the TEXTINCLUDE 3 resource.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user