v14.00 by Yohann

This commit is contained in:
ChaosMarc
2021-01-04 08:07:29 +01:00
parent c8849ef0fa
commit 2597bc3946
106 changed files with 7790 additions and 7535 deletions

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file for each characters.
Add an extra save file for each characters.
=================================================================*/
/*
@@ -23,7 +23,7 @@ BYTE * openClientSaveFile(char* name, DWORD* size)
strcat(filename, ".clt");
log_msg("Client file to read : %s\n",filename);
FILE* file = fopen(filename, "rb");
if (file)
{
@@ -55,7 +55,7 @@ DWORD loadClientSaveFile()
if (!data) return 0;
DWORD curSize = 0;
log_msg("Load client file.\n");
if (*(DWORD*)&data[curSize] != FILE_SAVETYPE)
{
@@ -103,7 +103,7 @@ DWORD saveClientSaveFile()
D2FogGetSavePath( (char*)data, BUFFER_SIZE);
sprintf( szSaveName, "%s%s.clt", data, PCPlayerData->name );
log_msg("Client save file for saving : %s\n",szSaveName);
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
DeleteFile(szSaveName);
if (!MoveFile(szTempName, szSaveName))
log_box("Could not create the client save file.");

View File

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

View File

@@ -2,7 +2,7 @@
File created by Yohann NICOLAS.
Common functions.
=================================================================*/
#include "common.h"

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d and DoNotCloseNihlathakPortal by haxifix.
@file D2wrapper.cpp
@brief Main Diablo II extra DLL handler.
@@ -10,6 +10,7 @@
=================================================================*/
#include "plugYFiles.h" // Install_PlugYFiles()
#include "globalVariable.h" // Install_VariableOnRealm()
#include "commands.h" // Install_Commands()
#include "othersFeatures.h" // Install_ChangeResolution()
@@ -27,10 +28,10 @@
#include "extraOptions.h" // Install_AlwaysRegenMapInSP()
#include "language.h" // Install_LanguageManagement()
#include "windowed.h" // installed with Install_PrintPlugYVersion()
#include "savePlayerData.h" // Install_SavePlayerData()
#include "customLibraries.h"
#include "common.h"
#include "interface_Stash.h"
int version_Game = UNKNOWN;
//int version_binkw32 = UNKNOWN;
@@ -175,21 +176,22 @@ void hookLibraries()
{
log_msg("***** Unprotect Libraries *****\n");
if (version_Game == V114d) {
hookLibrary(S_Game, offset_Game);
} else {
hookLibrary(S_D2Client, offset_D2Client);
// hookLibrary(S_D2CMP, offset_D2CMP);
hookLibrary(S_D2Common, offset_D2Common);
hookLibrary(S_D2Game, offset_D2Game);
hookLibrary(S_D2gfx, offset_D2gfx);
hookLibrary(S_D2Lang, offset_D2Lang);
hookLibrary(S_D2Launch, offset_D2Launch);
// hookLibrary(S_D2Net, offset_D2Net);
// hookLibrary(S_D2Win, offset_D2Win);
hookLibrary(S_Fog, offset_Fog);
hookLibrary(S_Storm, offset_Storm);
}
if (version_Game >= V114a)
hookLibrary(S_Game, offset_Game);
else
{
hookLibrary(S_D2Client, offset_D2Client);
// hookLibrary(S_D2CMP, offset_D2CMP);
hookLibrary(S_D2Common, offset_D2Common);
hookLibrary(S_D2Game, offset_D2Game);
hookLibrary(S_D2gfx, offset_D2gfx);
hookLibrary(S_D2Lang, offset_D2Lang);
hookLibrary(S_D2Launch, offset_D2Launch);
// hookLibrary(S_D2Net, offset_D2Net);
// hookLibrary(S_D2Win, offset_D2Win);
hookLibrary(S_Fog, offset_Fog);
hookLibrary(S_Storm, offset_Storm);
}
log_msg("\n\n");
}
@@ -198,21 +200,22 @@ void unhookLibraries()
{
log_msg("***** Reprotect Libraries *****\n");
if (version_Game == V114d) {
unhookLibrary(S_Game, offset_Game);
} else {
unhookLibrary(S_D2Client, offset_D2Client);
// unhookLibrary(S_D2CMP, offset_D2CMP);
unhookLibrary(S_D2Common, offset_D2Common);
unhookLibrary(S_D2Game, offset_D2Game);
unhookLibrary(S_D2gfx, offset_D2gfx);
unhookLibrary(S_D2Lang, offset_D2Lang);
unhookLibrary(S_D2Launch, offset_D2Launch);
// unhookLibrary(S_D2Net, offset_D2Net);
// unhookLibrary(S_D2Win, offset_D2Win);
unhookLibrary(S_Fog, offset_Fog);
unhookLibrary(S_Storm, offset_Storm);
}
if (version_Game >= V114a)
unhookLibrary(S_Game, offset_Game);
else
{
unhookLibrary(S_D2Client, offset_D2Client);
// unhookLibrary(S_D2CMP, offset_D2CMP);
unhookLibrary(S_D2Common, offset_D2Common);
unhookLibrary(S_D2Game, offset_D2Game);
unhookLibrary(S_D2gfx, offset_D2gfx);
unhookLibrary(S_D2Lang, offset_D2Lang);
unhookLibrary(S_D2Launch, offset_D2Launch);
// unhookLibrary(S_D2Net, offset_D2Net);
// unhookLibrary(S_D2Win, offset_D2Win);
unhookLibrary(S_Fog, offset_Fog);
unhookLibrary(S_Storm, offset_Storm);
}
log_msg("\n\n");
}
@@ -231,14 +234,7 @@ void freeCustomLibraries()
dll->release();
freeLibrary(dll->offset);
nextDll = dll->nextDll;
if (version_D2Game == V114d)
{
delete dll;
}
else
{
D2FogMemDeAlloc(dll, __FILE__, __LINE__, 0);
}
delete(dll);
dll = nextDll;
}
}
@@ -270,15 +266,15 @@ void loadCustomLibraries()
log_msg("No custom libraries to load.\n");
else
{
log_msg("Load custom libraries :\n");
while (curString)
{
if (curString[0])
{
log_msg("Load custom library : %s\n", curString);
offset_currentDll = (DWORD)LoadLibrary(curString);
if (!offset_currentDll)
{
log_msg("Load library %s failed:\n", curString);
log_msg("Load library %s failed !\n", curString);
exit(0);
}
nextDll = customDlls;
@@ -289,8 +285,8 @@ void loadCustomLibraries()
curString=strtok(NULL,"|");
}
}
if (dllFilenames)
D2FogMemDeAlloc(dllFilenames, __FILE__, __LINE__, 0);
if(dllFilenames)
D2FogMemDeAlloc(dllFilenames,__FILE__,__LINE__,0);
log_msg("\n\n");
}
@@ -339,7 +335,7 @@ void initD2modules()
if (version_Game >= V114a)
{
// offset_Bnclient = offset_Game; version_Bnclient = version_Game;
// offset_Bnclient = offset_Game; version_Bnclient = version_Game;
offset_D2Client = offset_Game; version_D2Client = version_Game;
offset_D2CMP = offset_Game; version_D2CMP = version_Game;
offset_D2Common = offset_Game; version_D2Common = version_Game;
@@ -376,13 +372,13 @@ void initD2modules()
GET_VERSION(D2Launch, 109A, 81E8526F, 01E8526F, 85E8526F, 247C8B00, 00FC6583, 15FF0424, E850E045); //0x20000 0x6FA10000 Already Loaded 0x1E000
// GET_VERSION(D2MCPClient 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x6000 0x6F9F0000 Already Loaded -
// GET_VERSION(D2Multi 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x1000 0x6F9A0000 ?
GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded -
GET_VERSION(D2Net, 16E1, 78B8A73C, 68B8A73C, 10244C8B, 5349E808, 5EA9E808, 105D8B72, 53B9E808); //0x6000 0x6FC00000 Already Loaded -
// GET_VERSION(D2sound 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0xC000 0x6F980000 Already Loaded 0xD000
GET_VERSION(D2Win, 1699, 88686F8C, 84686F8C, D094686F, F0030000, 001435E8, 8B088F44, 0013F5E8); //0x19000 0x6F8A0000 Already Loaded 0x1C000
GET_VERSION(Fog, 102, D0000006, 10000001, 00000006, 000042E6, 00004302, 0000483C, 00004B95); //0x20000 0x6FF50000 Already Loaded 0x1F000
GET_VERSION(Storm, 1190, 19E85082, 59E85082, 13C103F6, 0474F685, 8B000321, 3B1074C9, 0D896404); //0x30000 0x6FFB0000 Already Loaded -
if (version_Game == UNKNOWN)
version_Game = version_D2gfx;
version_Game = version_D2gfx;
}
// GET_VERSION(binkw32 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //
// GET_VERSION(ijl11 000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000, 00000000); //0x24000 0x60000000 Already Loaded -
@@ -395,10 +391,12 @@ void initD2modules()
extern "C" __declspec(dllexport) bool __stdcall Release()
{
log_msg("\n***** ENDING DIABLO II *****\n\n" );
log_msg("\n***** FREE LIBRARIES *****\n\n" );
freeCustomLibraries();
freeD2Libraries();
log_msg("***** END DIABLO II *****\n" );
log_close();
return true;
}
@@ -412,7 +410,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
initD2modules();
if (version_Game < V109 || version_Game > V114d)
if (version_Game < V109 || version_Game > V113d && version_Game != V114d)
{
log_box("PlugY isn't compatible with this version : %s", GetVersionString(version_Game));
Release();
@@ -431,6 +429,7 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
log_msg("***** INSTALL FUNCTIONS *****\n");
Install_PlugYFiles();
Install_VariableOnRealm();
if (active_Commands)
@@ -456,6 +455,9 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
if (active_changingSavePath)
Install_ChangingSavePath();
if (active_AutoBackup)
Install_SavePlayerData();
if (active_StatsShiftClickLimit)
Install_StatsLimitShiftClick();
@@ -507,8 +509,14 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
if (active_EnabledCowPortalWhenCowKingWasKill)
Install_EnabledCowPortalWhenCowKingWasKill();
if (active_DoNotCloseNihlathakPortal)
Install_DoNotCloseNihlathakPortal();
if (active_DoNotCloseNihlathakPortal)
Install_DoNotCloseNihlathakPortal();
if (active_MoveCainNearHarrogathWaypoint)
Install_MoveCainNearHarrogathWaypoint();
if (active_RemoveExperienceDiminushingReturn)
Install_RemoveExperienceDiminushingReturn();
log_msg("\nDLL patched sucessfully.\n\n\n");
@@ -516,11 +524,13 @@ extern "C" __declspec(dllexport) void* __stdcall Init(LPSTR IniName)
initCustomLibraries();
loadLocalizedStrings(D2GetLang());
//loadLocalizedStrings(D2GetLang());
log_msg("***** ENTERING DIABLO II *****\n\n" );
active_logFile = active_logFile - 1;
active_logFile--;
if (active_logFile < 1)
log_close();
return NULL;
}

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file for each characters.
Add an extra save file for each characters.
=================================================================*/
@@ -17,7 +17,7 @@
#define FILE_EXTENDED 0x4D545343 //"CSTM"
BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
BYTE * readExtendedSaveFile(char* name, DWORD* size)
{
char filename[512];
BYTE* data;
@@ -45,7 +45,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
*size = 14;
*((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM"
*((WORD *)&data[4]) = FILE_VERSION;
*((DWORD*)&data[6]) = nbPlayersCommandByDefault - 1;
*((DWORD*)&data[6]) = (BYTE)(nbPlayersCommandByDefault == 0 ? 0 : nbPlayersCommandByDefault - 1);
*((DWORD*)&data[10]) = 0;// number of stash
TCustomDll* currentDll = customDlls;
@@ -59,7 +59,7 @@ BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS
}
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)
{
if (!ptChar || !PCPY || !data) return 0;
@@ -99,7 +99,6 @@ int loadExtendedSaveFile(Unit* ptChar, BYTE data[], DWORD maxSize)//WORKS
}
void writeExtendedSaveFile(char* name, BYTE* data, DWORD size)
{
char szTempName[MAX_PATH];
@@ -122,28 +121,12 @@ void writeExtendedSaveFile(char* name, BYTE* data, DWORD size)
strcat(szSaveName, ".d2x");
log_msg("Extended file for saving : %s\n",szSaveName);
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
DeleteFile(szSaveName);
if (!MoveFile(szTempName, szSaveName))
log_box("Could not create the extended save file.");
}
void backupExtendedSaveFile(char* name)
{
char szBackupName[MAX_PATH];
char szSaveName[MAX_PATH];
D2FogGetSavePath(szSaveName, MAX_PATH);
strcat(szSaveName, name);
strcat(szSaveName, ".d2x");
D2FogGetSavePath(szBackupName, MAX_PATH);
strcat(szBackupName, name);
strcat(szBackupName, ".d2x.backup");
CopyFile(szSaveName, szBackupName, true);
}
void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
{
@@ -151,7 +134,7 @@ void saveExtendedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curS
*curSize += 4;
*(WORD *)(*data + *curSize) = FILE_VERSION;
*curSize += 2;
*(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand - 1);
*(DWORD *)(*data + *curSize) = (BYTE)(nbPlayersCommand == 0 ? 0 : nbPlayersCommand - 1);
*curSize += 4;
saveStashList(ptChar, PCPY->selfStash, data, maxSize, curSize);

View File

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

View File

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

View File

@@ -98,7 +98,7 @@ INIFile::INIFile()
m_cache = NULL;
m_sectionStart = NULL;
m_sectionEnd = NULL;
ZeroMemory((void *)m_path, sizeof(m_path));
ZeroMemory((void *)m_currentSection, sizeof(m_currentSection));
}
@@ -165,7 +165,7 @@ BOOL INIFile::InitReadWrite(const char *path, int readWrite, DWORD writeCacheSiz
return TRUE;
}
}
// if((m_readWrite == INIFILE_MPQREAD) || (m_readWrite == INIFILE_READ))
if(m_readWrite == INIFILE_READ)
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,9 @@
/*==============================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
this file implements some common and useful
function related to some Diablo II mechanisms.
this file implements some common and useful
function related to some Diablo II mechanisms.
/*============================================*/
#pragma once
@@ -26,6 +26,7 @@ enum eStringList
STR_STASH_NEXT_PAGE,
STR_TOGGLE_TO_PERSONAL,
STR_TOGGLE_TO_SHARED,
STR_TOGGLE_MULTI_DISABLED,
STR_STASH_PREVIOUS_INDEX,
STR_STASH_NEXT_INDEX,
STR_PUT_GOLD,
@@ -37,6 +38,7 @@ enum eStringList
STR_PREVIOUS_PAGE,
STR_NEXT_PAGE,
STR_ITEM_LEVEL,
STR_PAGE_TYPE_CHANGE,
//
STR_COW_PORTAL,
STR_PANDEMONIUM_PORTAL,
@@ -74,6 +76,26 @@ enum eStringList
STR_ONLY_N_H,
STR_ONLY_HELL,
STR_ONLY_CLASS,
STR_MERCENARIES,
STR_MERC_ACT_1,
STR_MERC_ACT_2,
STR_MERC_ACT_3,
STR_MERC_ACT_5,
STR_BREAKPOINT,
STR_BREAKPOINTS,
STR_BLOCK_FRAMES,
STR_CASTING_FRAMES,
STR_HIT_RECOVERY_FRAMES,
STR_1H_SWINGING_WEAPON,
STR_OTHER_WEAPONS,
STR_HUMAN_FORM,
STR_BEAR_FORM,
STR_WOLF_FORM,
STR_VAMPIRE_FORM,
STR_SPEARS_AND_STAVES,
STR_LIGHTNING_CHAIN_LIGHTNING,
STR_OTHER_SPELLS
};
/*================================= END OF FILE =================================*/

View File

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

View File

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

View File

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

View File

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

View File

@@ -117,7 +117,7 @@ void print2Lines(WORD id, LPWSTR lpText, DWORD x, DWORD l, DWORD y)
{
wcsncpy(lpText, D2GetStringFromIndex(id), 0x63);
lpText[0x64]= L'\0';
LPWSTR lptmp = lpText;
while (*lptmp)
{
@@ -145,7 +145,7 @@ void print2Lines(WORD id, LPWSTR lpText, DWORD x, DWORD l, DWORD y)
void STDCALL printNewStatsPage()
{
if (!D2isLODGame() || !D2GetResolution()) return D2PrintStatsPage();
WCHAR text[BUFSIZE];
LPWSTR lpText;
DWORD nbPixel;
@@ -347,7 +347,7 @@ if (version_D2Client <= V110)
//print Hit Point
curValue = D2GetPlayerStat(ptChar, STATS_HP, 0) / 256;
if ((ptChar->CurrentAnim != 0x11) && !curValue) curValue=1;
if ((ptChar->mode != UNIT_MODE_DEAD) && !curValue) curValue=UNIT_MODE_NEUTRAL;
swprintf(text,L"%ld",curValue);
@@ -523,7 +523,7 @@ if (version_D2Client <= V110)
D2PrintImage(&data, getXAssVITBtn(), getYAssVITBtn(), -1, 5, 0);
D2PrintImage(&data, getXAssENEBtn(), getYAssENEBtn(), -1, 5, 0);
}
if (active_StatsPoints && !onRealm)
{
setImage(&data, D2AssignStatsPointsBoxImages);
@@ -584,9 +584,9 @@ if (version_D2Client <= V110)
if ( version_D2Client <= V110 )
{
DWORD avgChanceMonsterWillHitYou=53;//TODO
if (avgChanceMonsterWillHitYou<5) avgChanceMonsterWillHitYou = 5;
if (avgChanceMonsterWillHitYou<5) avgChanceMonsterWillHitYou = 5;
else if (avgChanceMonsterWillHitYou>95) avgChanceMonsterWillHitYou = 95;
int chanceToBlock = D2GetChanceToBlock(ptChar, D2isLODGame());
if (chanceToBlock <= 0)
{
@@ -700,8 +700,8 @@ DWORD STDCALL mouseNewStatsPageLeftDown(sWinMessage* msg)
void sendAssignStats(DWORD code, DWORD nbStatPointsRemaining)
{
DWORD nbPoints = GetKeyState(VK_SHIFT)<0? nbStatPointsRemaining : 1;
if (active_StatsShiftClickLimit && (nbPoints>limitValueToShiftClick))
nbPoints = limitValueToShiftClick;
if (active_StatsShiftClickLimit && (nbPoints>limitValueToShiftClick))
nbPoints = limitValueToShiftClick;
while ( nbPoints>0 )
{
DWORD nbTemp = nbPoints > 0x20 ? 0x20 : nbPoints;
@@ -744,7 +744,7 @@ DWORD STDCALL mouseNewStatsPageLeftUp(sWinMessage* msg)
}
}
else if (nbStatPointsRemaining)
{
{
if (isOnAssSTRBtn(msg->x,msg->y))
{
log_msg("push up left button assign strengh\n");

View File

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

View File

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

View File

@@ -9,7 +9,6 @@
bool active_othersFeatures = false;
/*
// Remove protect on the save file .d2s
mem_seek( offset_D2Game + 0x77080);//6FC8DD5E-6FAA0000
@@ -22,7 +21,7 @@ void Install_ChangeResolution()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2gfx for . (ChangeResolution)\n");
// execute if it's our packet else continue
@@ -98,7 +97,7 @@ void Install_Test2()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Game. (Test)\n");
// Test
@@ -111,8 +110,6 @@ void Install_Test2()
isInstalled = true;
}*/
///////////////////////////////////////////////////////////////////////////////////////////////
void Install_OthersFeatures()
{
static int isInstalled = false;
@@ -120,6 +117,7 @@ void Install_OthersFeatures()
log_msg("Patch. (OthersFeatures)\n");
// Install_RemoveExperienceDiminushingReturn();
// Install_ChangeResolution();
// Install_Test();

View File

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

View File

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

Binary file not shown.

View File

@@ -1,41 +1,20 @@

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

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlugY", "PlugY.vcproj", "{EB63DF4E-A019-4522-A140-9E8C7350B331}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.ActiveCfg = Debug|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Debug|Win32.Build.0 = Debug|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.ActiveCfg = Release|Win32
{EB63DF4E-A019-4522-A140-9E8C7350B331}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file shared by all own characters.
Add an extra save file shared by all own characters.
=================================================================*/
@@ -15,9 +15,7 @@
#define BUFFER_SIZE 0x4000
#define FILE_VERSION 0x3230 //"02"
//6FC8CE8A |. E8 A16BFAFF CALL D2Game.6FC33A30
//$+C0 > 1F 00 00 00 03 00 00 06 .....
// 28 0010 1000
BYTE* readSharedSaveFile(char* name, DWORD* size)
{
char filename[512];
@@ -151,46 +149,12 @@ void writeSharedSaveFile(char* name, BYTE* data, DWORD size, bool isHardcore)
strcat(szSaveName,".sss");
log_msg("Shared file for saving : %s\n", szSaveName);
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
// if (!MoveFileEx(szTempName, szSaveName, MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
DeleteFile(szSaveName);
if (!MoveFile(szTempName, szSaveName))
log_box("Could not create the shared save file.");
}
void backupSharedSaveFile()
{
char szBackupName[MAX_PATH];
char szSaveName[MAX_PATH];
D2FogGetSavePath( szSaveName, MAX_PATH-30);
strcat(szSaveName, "_LOD_");
strcat(szSaveName, sharedStashFilename);
strcat(szSaveName,".sss");
D2FogGetSavePath( szBackupName, MAX_PATH-30);
strcat(szBackupName, "_LOD_");
strcat(szBackupName, sharedStashFilename);
strcat(szBackupName,".sss.backup");
CopyFile(szSaveName, szBackupName, true);
if (separateHardSoftStash)
{
D2FogGetSavePath( szSaveName, MAX_PATH-30);
strcat(szSaveName, "_LOD_HC_");
strcat(szSaveName, sharedStashFilename);
strcat(szSaveName,".sss");
D2FogGetSavePath( szBackupName, MAX_PATH-30);
strcat(szBackupName, "_LOD_HC_");
strcat(szBackupName, sharedStashFilename);
strcat(szBackupName,".sss.backup");
CopyFile(szSaveName, szBackupName, true);
}
}
void saveSharedSaveFile(Unit* ptChar, BYTE** data, DWORD* maxSize, DWORD* curSize)
{
*(DWORD *)(*data + *curSize) = FILE_SHAREDSTASH;

View File

@@ -1,10 +1,10 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d by haxifix.
Change Skill win per level up.
=================================================================*/
#include "skillPerLevelUp.h"
@@ -13,6 +13,13 @@
bool active_SkillPerLevelUpChange=0;
DWORD skillPerLevelUp=1;
FCT_ASM ( caller_changeSkillPerLevelUp_114 )
MOV EAX,skillPerLevelUp
IMUL EAX,EDI
MOV DWORD PTR SS:[ESP+0xC], EAX
JMP V2AddPlayerStat
}}
FCT_ASM ( caller_changeSkillPerLevelUp_111 )
MOV EAX,skillPerLevelUp
@@ -33,21 +40,18 @@ void Install_SkillPerLevelUp()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Game for change Skill points win per level up. (SkillPerLevelUp)\n");
mem_seek R8(D2Game, 42261, 42651, 4ED60, D7AE5, 79695, AA455, EB1E5, EDCA5, 1709D1);
if (version_D2Game == V114d) {
MEMT_REF4(0x000B68DB, caller_changeSkillPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
//6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518>
//02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109>
//01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645>
}
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeSkillPerLevelUp_114 : version_D2Game >= V111 ? caller_changeSkillPerLevelUp_111 : caller_changeSkillPerLevelUp);
//6FC7ED5F |. E8 56CB0900 CALL <JMP.&D2Common.#10518>
//02057AE4 |. E8 9F28F3FF CALL <JMP.&D2Common.#10109>
//01FE9694 |. E8 1B0DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA454 |. E8 5F01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1E4 |. E8 E9F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DCA4 |. E8 FDC6F1FF CALL <JMP.&D2Common.#10645>
//005709D0 |. E8 DB680B00 CALL Game.006272B0 ; \Game.006272B0
log_msg("\n");

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d by haxifix.
Change Stat win per level up.
@@ -13,6 +13,13 @@
bool active_StatPerLevelUpChange=0;
DWORD statPerLevelUp=5;
FCT_ASM ( caller_changeStatPerLevelUp_114 )
MOV EAX,statPerLevelUp
IMUL EAX,EDI
MOV DWORD PTR SS:[ESP+0xC], EAX
JMP V2AddPlayerStat
}}
FCT_ASM ( caller_changeStatPerLevelUp_111 )
MOV EAX,statPerLevelUp
IMUL EAX,EBX
@@ -31,21 +38,18 @@ void Install_StatPerLevelUp()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Game for change Stat points win per level up. (StatPerLevelUp)\n");
mem_seek R8(D2Game, 42258, 42648, 4ED55, D7ADA, 7968A, AA44A, EB1DA, EDC9A, 1709C6);
if (version_D2Game == V114d) {
MEMT_REF4(0x000B68E6, caller_changeStatPerLevelUp);
} else {
MEMJ_REF4(V2AddPlayerStat, version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
//6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518>
//02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109>
//01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645>
}
MEMJ_REF4( V2AddPlayerStat, version_D2Game >= V114d ? caller_changeStatPerLevelUp_114 : version_D2Game >= V111 ? caller_changeStatPerLevelUp_111 : caller_changeStatPerLevelUp);
//6FC7ED54 |. E8 61CB0900 CALL <JMP.&D2Common.#10518>
//02057AD9 |. E8 AA28F3FF CALL <JMP.&D2Common.#10109>
//01FE9689 |. E8 260DF9FF CALL <JMP.&D2Common.#10627>
//6FCCA449 |. E8 6A01F6FF CALL <JMP.&D2Common.#10762>
//6FD0B1D9 |. E8 F4F2F1FF CALL <JMP.&D2Common.#10551>
//6FD0DC99 |. E8 08C7F1FF CALL <JMP.&D2Common.#10645>
//005709C5 |. E8 E6680B00 CALL Game.006272B0 ; \Game.006272B0
log_msg("\n");

View File

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

View File

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

View File

@@ -1,10 +1,10 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d by haxifix.
Updating client.
=================================================================*/
#include "updateClient.h"
@@ -44,10 +44,10 @@ void updateClient(Unit* ptChar, DWORD mFunc, char* msg)
packet.mFunc = (BYTE)mFunc;
packet.mSize = sizeof(DataPacket);
packet.mPlayerID = ptChar->nUnitId;
if (msg != NULL && strlen(msg) >= 20)
if (msg != NULL && strlen(msg) > 20)
return;
if (msg != NULL)
strcpy((char*)&packet.mItemID, msg);
strncpy((char*)&packet.mItemID, msg, 20);
ptNetClient = D2GetClient(ptChar, __FILE__, __LINE__);
@@ -60,21 +60,25 @@ DWORD FASTCALL handleClientUpdate(DataPacket* packet)
log_msg("[CLIENT] Received custom message: %d with param: %08X , %08X , %08X\n",packet->mFunc,packet->mParam1,packet->mParam2,packet->mParam3);
switch (packet->mFunc)
{
case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1;
case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1;
case UC_PAGE_NAME: renameCurrentStash(D2GetClientPlayer(), (char*)&packet->mItemID); return 1;
case UC_SELECT_STASH: setSelectedStashClient(packet->mParam1, packet->mParam2, packet->mParam3, (packet->mParam2 & 8) == 8); return 1;
case UC_SHARED_GOLD : updateSharedGold(packet->mParam1); return 1;
case UC_PAGE_NAME:
{
char pageName[21];
strncpy(pageName, (char*)&packet->mItemID, 20);
pageName[20] = NULL;
renameCurrentStash(D2GetClientPlayer(), pageName); return 1;
}
default : return 0;
}
}
FCT_ASM( caller_handleClientUpdate_114 )
LEA ECX, DWORD PTR SS : [ESP]
CALL handleClientUpdate
POP EDI
POP ESI
MOV ESP, EBP
POP EBP
RETN
FCT_ASM ( caller_handleClientUpdate_114 )
LEA ECX,DWORD PTR SS:[ESP]
CALL handleClientUpdate
MOV ESP,EBP
POP EBP
RETN
}}
FCT_ASM ( caller_handleClientUpdate_111 )
@@ -99,18 +103,19 @@ void Install_UpdateClient()
{
static int isInstalled = false;
if (isInstalled) return;
log_msg("Patch D2Client for received Item packet. (UpdateClient)\n");
// execute if it's our packet else continue
mem_seek R8(D2Client, 14236, 14226, 145B6, 9C6B6, BFE86, 66E06, AE896, 84D96, 5EC99);
MEMT_REF4( version_D2Client == V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client == V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
MEMT_REF4( version_D2Client >= V114d ? 0x000000CE : version_D2Client >= V111 ? 0x000000CF : 0x000000D6, version_D2Client >= V114d ? caller_handleClientUpdate_114 : version_D2Client >= V111 ? caller_handleClientUpdate_111 : caller_handleClientUpdate);
//6FAB45B4 |. 0F87 D6000000 JA D2Client.6FAB4690
//6FB4C6B4 |. 0F87 CF000000 JA D2Client.6FB4C789
//6FB6FE84 |. 0F87 CF000000 JA D2Client.6FB6FF59
//6FB16E04 |. 0F87 CF000000 JA D2Client.6FB16ED9
//6FB5E894 |. 0F87 CF000000 JA D2Client.6FB5E969
//6FB34D94 |. 0F87 CF000000 JA D2Client.6FB34E69
//0045EC97 |. 0F87 CE000000 JA Game.0045ED6B
log_msg("\n");

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d by haxifix.
Updating server.
@@ -14,8 +14,16 @@
#include "commands.h"
#include "common.h"
void updateServer(WORD p)
{
if (!onRealm)
D2SendToServer3(0x3A, p);
}
int renameIndex = 0;
char renameString[16];
char renameString[21];
DWORD PageSwap;
int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
@@ -62,25 +70,27 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
case US_SWAP0: swapStash(ptChar, PageSwap | arg, false); PageSwap = 0; return 1;
case US_SWAP0_TOGGLE : swapStash(ptChar, PageSwap | arg, true); PageSwap = 0; return 1;
case US_RENAME :
if (renameIndex == 0)
for (int i = 0; i < 16; i++)
renameString[i] = 0;
if (renameIndex == 0)
ZeroMemory(renameString, sizeof(renameString));
if (arg != NULL && renameIndex < 15)
renameString[renameIndex++] = (char)arg;
if (arg == 0)
{
renameIndex = 0;
log_msg("Rename on Server : %s -> %s\n", ptChar->ptPlayerData->name, renameString);
strcpy(ptChar->ptPlayerData->name, renameString);
strcpy(ptChar->ptPlayerData->ptNetClient->name, renameString);
}
if (arg == NULL)
{
renameString[renameIndex] = NULL;
renameIndex = 0;
log_msg("Rename on Server : %s -> %s\n", PCPlayerData->name, renameString);
strcpy(PCPlayerData->name, renameString);
strcpy(PCPlayerData->ptNetClient->name, renameString);
}
return 1;
case US_PAGENAME:
if (renameIndex == 0)
for (int i = 0; i < 16; i++)
renameString[i] = 0;
renameString[renameIndex++] = (char)arg;
if (arg == 0)
ZeroMemory(renameString, sizeof(renameString));
if (arg != NULL && renameIndex < 20)
renameString[renameIndex++] = (char)arg;
if (arg == NULL)
{
renameString[renameIndex] = NULL;
renameIndex = 0;
log_msg("Rename current page on Server : %s -> %s\n", PCPY->currentStash->name, renameString);
renameCurrentStash(ptChar, renameString);
@@ -91,24 +101,24 @@ int STDCALL handleServerUpdate(Unit* ptChar, WORD param)
}
}
FCT_ASM( caller_handleServerUpdate_114 )
PUSH ESI
PUSH EBX
CALL handleServerUpdate
TEST EAX, EAX
JNZ END_RCM
MOV EAX, ESI
AND EAX, 0xFF
SHR ESI, 8
MOV EDI, EAX
RETN
END_RCM :
ADD ESP, 8
POP EDI
POP ESI
XOR EAX, EAX
POP EBX
RETN 8
FCT_ASM( caller_handleServerUpdate_114)
PUSH ESI
PUSH EBX
CALL handleServerUpdate
TEST EAX,EAX
JNZ END_RCM
MOV EAX,ESI
AND EAX,0xFF
SHR ESI,8
MOV EDI,EAX
RETN
END_RCM:
ADD ESP,8
POP EDI
POP ESI
XOR EAX,EAX
POP EBX
RETN 8
}}
FCT_ASM( caller_handleServerUpdate)
@@ -180,6 +190,9 @@ void Install_UpdateServer()
//066A76C3 |. C1EE 08 SHR ESI,8
//066A76C6 |. 57 PUSH EDI
//066A76C7 |. 8BF8 MOV EDI,EAX
//0054BD38 |. C1EE 08 SHR ESI,8
//0054BD3B |. 57 PUSH EDI
//0054BD3C |. 8BF8 MOV EDI,EAX
} else if (version_D2Game == V110) {
memt_byte( 0xC1, 0xE8 ); // CALL caller_handleServerUpdate
MEMT_REF4( 0xF88B08EE, caller_handleServerUpdate);

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file for each characters.
Add an extra save file for each characters.
=================================================================*/
#pragma once

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Data added to D2 base-stucture
Data added to D2 base-stucture
=================================================================*/
#pragma once

View File

@@ -1,7 +1,7 @@
/*================================================
File created by Yohann NICOLAS.
Add support 1.13d by L'Autour.
Add support 1.14d by haxifix.
Add support 1.14d by haxifix.
This file implements some common and useful
function related to some Diablo II mechanisms.
@@ -23,13 +23,14 @@ struct s_shifting {
extern s_shifting shifting;
//#ifdef MSVC
#define FASTCALL __fastcall
#define FASTCALL __fastcall
//#else
//#define FASTCALL __msfastcall
//#define FASTCALL __msfastcall
//#endif
#define STDCALL __stdcall
#define FCT_ASM(N) __declspec(naked) void N() {__asm{
#define RANDOM(V) ((int)(rand()/(RAND_MAX+1.0)*(V)))
#define RANDOMF() ((double)rand() / (double)RAND_MAX)
//#define RANDOM(V) (rand()%(V))
//#define PY(C) (*(PYPlayerData**)((BYTE*)(ptChar)+shifting.ptPYPlayerData))
@@ -87,7 +88,10 @@ extern DataTables* SgptDataTables;
extern TD2AddPlayerStat V2AddPlayerStat;
extern TD2GetGameByClientID V2GetGameByClientID;
extern TD2SpawnSuperUnique V2SpawnSuperUnique;
extern TD2SpawnMonster V2SpawnMonster;
extern TD2Game235C0 V2Game235C0;
extern TD2ReadFile V2ReadFile;
//extern TD2SetColorPopup V2SetColorPopup;
extern WORD (*getDescStrPos) (DWORD statID);
extern void* (STDCALL *compileTxtFile)(DWORD unused, const char* filename, BINField* ptFields, DWORD* ptRecordCount, DWORD recordLength);
@@ -102,13 +106,14 @@ void __inline fillRect(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD color,
#define WindowStartX (*ptWindowStartX)
#define GameTypeMode (*ptGameTypeMode)
#define ClientTable (*ptClientTable)
//#define CurrentNPCNum (*ptCurrentNPCNum)
#define IsLodGame (*ptIsLodGame)
#define DifficultyLevel (*ptDifficultyLevel)
#define MouseY (*ptMouseY)
#define MouseX (*ptMouseX)
#define ptClientChar (*ptptClientChar)
//#define CurrentNPCNum (*ptCurrentNPCNum)
#define InputCommandLen (*ptInputCommandLen)
#define InputCommand (*ptInputCommand)
void initD2functions();

View File

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

View File

@@ -4,7 +4,7 @@
@file error.hpp
@brief Error logger definition.
This file defiens various functions related to
This file defiens various functions related to
error handling in D2External functions.
==============================================*/
@@ -12,9 +12,10 @@
#include <windows.h>
extern DWORD active_logFile;
extern int active_logFile;
void log_initfile();
void log_close();
void log_box( const char* pFormat, ... );
void log_msg( const char* pFormat, ... );
void d2_assert( bool pCondition, char* pLocation, char* pMessage, int pLineNbr );

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file for each characters.
Add an extra save file for each characters.
=================================================================*/
#pragma once

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Load Player Custom Data.
Load Player Custom Data.
=================================================================*/
#pragma once

View File

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

View File

@@ -2,7 +2,7 @@
File created by Yohann NICOLAS.
Modification of code in memory functions.
/*============================================*/
#pragma once
@@ -20,7 +20,7 @@ void memt_dword(DWORD old, DWORD val);
void memt_ref4(DWORD old, DWORD ref);
//CALL <JMP.&D2gfx.#10047>
#define MEMJ_REF4(O, R) memj_ref4((DWORD)(O), (DWORD)(R))
#define MEMJ_REF4(O, R) if (version_Game < V114a) memj_ref4((DWORD)(O), (DWORD)(R)); else memc_ref4((DWORD)(O), (DWORD)(R))
void memj_ref4(DWORD old, DWORD ref);
//CALL D2Common.6FD5F500
@@ -31,6 +31,4 @@ void memc_ref4(DWORD old, DWORD ref);
#define MEMD_REF4(O, R) memd_ref4((DWORD)(O), (DWORD)(R))
void memd_ref4(DWORD old, DWORD ref);
void patchMemory4(DWORD value);
/*================================= END OF FILE =================================*/

View File

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

View File

@@ -1,12 +1,12 @@
/*=================================================================
File created by Yohann NICOLAS.
Loading parameters from ini file.
Loading parameters from ini file.
=================================================================*/
#pragma once
#define PLUGY_VERSION "12.00"
#define PLUGY_VERSION "14.00"
enum TargetMod
{

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Data added to Player base-stucture
Data added to Player base-stucture
=================================================================*/
#pragma once
@@ -16,9 +16,9 @@ struct Unit;
struct Stash
{
DWORD id;
union {
DWORD flags;
struct {
union {
DWORD flags;
struct {
DWORD isShared:1; //
DWORD isIndex:1; //
DWORD isMainIndex:1; //
@@ -35,13 +35,13 @@ struct Stash
struct PYPlayerData
{
union {
DWORD flags;
struct {
DWORD flags;
struct {
DWORD selfStashIsOpened:1; //
DWORD sharedStashIsOpened:1;//
DWORD showSharedStash:1; //
// DWORD notOnRealm:1; //set to 1 when the player is load from client or in SP
};
};
};
DWORD sharedGold;
DWORD nbSelfPages;

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Data added to D2 base-stucture
Data added to D2 base-stucture
=================================================================*/
#pragma once

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Changing the current save path.
Changing the current save path.
=================================================================*/
#pragma once

View File

@@ -1,13 +1,17 @@
/*=================================================================
File created by Yohann NICOLAS.
Save Player Custom Data.
Save Player Custom Data.
=================================================================*/
#pragma once
#include "common.h"
extern bool active_AutoBackup;
extern int maxBackupPerCharacter;
void backupSaveFiles(char* name, int isHardCoreGame);
void Install_SavePlayerData();
/*================================= END OF FILE =================================*/

View File

@@ -1,7 +1,7 @@
/*=================================================================
File created by Yohann NICOLAS.
Add an extra save file shared by all own characters.
Add an extra save file shared by all own characters.
=================================================================*/
#pragma once

View File

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

View File

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

View File

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