mirror of
https://gitlab.com/hashborgir/plugy.git
synced 2024-11-30 12:36:02 +00:00
228 lines
6.9 KiB
C++
228 lines
6.9 KiB
C++
/*=================================================================
|
|
File created by Yohann NICOLAS.
|
|
Add support 1.13d by L'Autour.
|
|
|
|
Interface functions
|
|
|
|
=================================================================*/
|
|
|
|
#include "common.h"
|
|
#include "error.h"
|
|
#include "d2functions.h"
|
|
#include "updateServer.h" // Install_UpdateServer()
|
|
#include "plugYFiles.h" // Install_PlugYImagesFiles()
|
|
#include "skillsPoints.h"
|
|
#include <stdio.h>
|
|
|
|
int posXUnassignSkillBtn=-1;
|
|
int posYUnassignSkillBtn=-1;
|
|
|
|
DWORD btnSkillIsDown;
|
|
DWORD getXSkillBtn() {return RX(posXUnassignSkillBtn<0? 0x243 : posXUnassignSkillBtn);}
|
|
#define getLSkillBtn() 32
|
|
DWORD getYSkillBtn() {return RY(posYUnassignSkillBtn<0 ? 0x1B1 : posYUnassignSkillBtn);}
|
|
#define getHSkillBtn() 32
|
|
#define isOnButtonUnassignSkill(x,y) isOnRect(x, y, getXSkillBtn(), getYSkillBtn(), getLSkillBtn(), getHSkillBtn())
|
|
|
|
|
|
void STDCALL printSkillsPageBtns()
|
|
{
|
|
if (active_SkillsPoints && !onRealm && D2isLODGame())
|
|
{
|
|
sDrawImageInfo data;
|
|
ZeroMemory(&data,sizeof(data));
|
|
setImage(&data, unassignSkillsBtnImages);
|
|
setFrame(&data, btnSkillIsDown);
|
|
D2PrintImage(&data, getXSkillBtn(), getYSkillBtn(), -1, 5, 0);
|
|
|
|
if ( isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
|
{
|
|
LPWSTR popupText = getTranslatedString(STR_SKILLS_UNASSIGN);
|
|
D2PrintPopup(popupText, getXSkillBtn()+getLSkillBtn()/2, getYSkillBtn()-getHSkillBtn(), 0, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
Unit* STDCALL skillsPageMouseDown(sWinMessage* msg)
|
|
{
|
|
Unit* ptChar = D2GetClientPlayer();
|
|
|
|
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
|
{
|
|
log_msg("push down left button unassign skill\n");
|
|
btnSkillIsDown = 1;
|
|
D2PlaySound(4,0,0,0,0);
|
|
freeMessage(msg);
|
|
return NULL;
|
|
}
|
|
return ptChar;
|
|
}
|
|
|
|
|
|
void STDCALL skillsPageMouseUp()
|
|
{
|
|
if ( active_SkillsPoints && !onRealm && D2isLODGame() && isOnButtonUnassignSkill(D2GetMouseX(),D2GetMouseY()))
|
|
{
|
|
log_msg("push up left button unassign skill\n");
|
|
if (btnSkillIsDown)
|
|
updateServer(US_UNASSIGN_SKILLS);
|
|
}
|
|
btnSkillIsDown = 0;
|
|
}
|
|
|
|
|
|
FCT_ASM ( caller_printSkillsPageBtns_111 )
|
|
CALL printSkillsPageBtns
|
|
POP EDI
|
|
POP ESI
|
|
POP EBX
|
|
RETN
|
|
}}
|
|
|
|
|
|
FCT_ASM ( caller_printSkillsPageBtns )
|
|
CALL printSkillsPageBtns
|
|
POP EDI
|
|
POP ESI
|
|
POP EBP
|
|
POP EBX
|
|
ADD ESP,0x48
|
|
RETN
|
|
}}
|
|
|
|
FCT_ASM ( caller_DontPrintSkillPointsRemaining_111 )
|
|
MOV AL,BYTE PTR DS:[onRealm]
|
|
TEST AL,AL
|
|
JNZ dontPrint
|
|
ADD DWORD PTR SS:[ESP],0xF2
|
|
RETN
|
|
dontPrint:
|
|
MOV ECX,0x1083
|
|
RETN
|
|
}}
|
|
|
|
FCT_ASM ( caller_DontPrintSkillPointsRemaining )
|
|
MOV AL,BYTE PTR DS:[onRealm]
|
|
TEST AL,AL
|
|
JNZ dontPrint
|
|
ADD DWORD PTR SS:[ESP],0x9D
|
|
RETN
|
|
dontPrint:
|
|
MOV ECX,0x1083
|
|
RETN
|
|
}}
|
|
|
|
FCT_ASM ( caller_skillsPageMouseDown_111 )
|
|
PUSH EBP
|
|
CALL skillsPageMouseDown
|
|
RETN
|
|
}}
|
|
|
|
|
|
FCT_ASM ( caller_skillsPageMouseDown )
|
|
PUSH EBX
|
|
CALL skillsPageMouseDown
|
|
RETN
|
|
}}
|
|
|
|
FCT_ASM ( caller_skillsPageMouseUp )
|
|
CALL skillsPageMouseUp
|
|
JMP D2FreeWinMessage
|
|
}}
|
|
|
|
void Install_InterfaceSkills()
|
|
{
|
|
static int isInstalled = false;
|
|
if (isInstalled) return;
|
|
|
|
Install_UpdateServer();
|
|
Install_PlugYImagesFiles();
|
|
|
|
log_msg("Patch D2Client for skills interface. (InterfaceSkills)\n");
|
|
|
|
// Print new buttons images
|
|
mem_seek R7(D2Client, 7AC20, 7AC20, 77073, 16190, 8A9C0, 7F320, 77F20, 2F380);
|
|
memt_byte( 0x5F, 0xE9 ); // JMP caller_printBtns
|
|
if ( version_D2Client >= V111 ) {
|
|
MEMT_REF4( 0xCCC35B5E, caller_printSkillsPageBtns_111);
|
|
//6FAC6190 5F POP EDI
|
|
//6FAC6191 5E POP ESI
|
|
//6FAC6192 5B POP EBX
|
|
//6FAC6193 C3 RETN
|
|
//6FAC6194 CC INT3
|
|
//6FB3A9C0 |> 5F POP EDI
|
|
//6FB3A9C1 |. 5E POP ESI
|
|
//6FB3A9C2 |. 5B POP EBX
|
|
//6FB3A9C3 \. C3 RETN
|
|
//6FB3A9C4 CC INT3
|
|
//6FB2F320 |> 5F POP EDI
|
|
//6FB2F321 |. 5E POP ESI
|
|
//6FB2F322 |. 5B POP EBX
|
|
//6FB2F323 \. C3 RETN
|
|
//6FB2F324 CC INT3
|
|
//6FB27F20 |> 5F POP EDI
|
|
//6FB27F21 |. 5E POP ESI
|
|
//6FB27F22 |. 5B POP EBX
|
|
//6FB27F23 \. C3 RETN
|
|
//6FB27F24 CC INT3
|
|
//6FADF380 |> 5F POP EDI
|
|
//6FADF381 |. 5E POP ESI
|
|
//6FADF382 |. 5B POP EBX
|
|
//6FADF383 \. C3 RETN
|
|
//6FADF384 CC INT3
|
|
} else {
|
|
MEMT_REF4( 0x835B5D5E, caller_printSkillsPageBtns);
|
|
memt_byte( 0xC4, 0x90 ); // NOP
|
|
memt_byte( 0x48, 0x90 ); // NOP
|
|
memt_byte( 0xC3, 0x90 ); // NOP
|
|
//6FB17073 |. 5F POP EDI
|
|
//6FB17074 |. 5E POP ESI
|
|
//6FB17075 |. 5D POP EBP
|
|
//6FB17076 |. 5B POP EBX
|
|
//6FB17077 |. 83C4 48 ADD ESP,48
|
|
//6FB1707A \. C3 RETN
|
|
}
|
|
|
|
if (posXUnassignSkillBtn==-1 && posYUnassignSkillBtn==-1)
|
|
{
|
|
// Don't print "Skill Points Remaining"
|
|
mem_seek R7(D2Client, 7AC30, 7AC30, 77080, 16294, 8AC74, 7ECF4, 78334, 2F7E4);
|
|
memt_byte( 0xB9, 0xE8 );
|
|
MEMT_REF4( 0x00001083, version_D2Client >= V111 ? caller_DontPrintSkillPointsRemaining_111 : caller_DontPrintSkillPointsRemaining);
|
|
//6FB17080 /$ B9 83100000 MOV ECX,1083
|
|
//6FAC6294 |. B9 83100000 MOV ECX,1083
|
|
//6FB3AC74 |. B9 83100000 MOV ECX,1083
|
|
//6FB2ECF4 |. B9 83100000 MOV ECX,1083
|
|
//6FB28334 |. B9 83100000 MOV ECX,1083
|
|
//6FADF7E4 |. B9 83100000 MOV ECX,1083
|
|
}
|
|
|
|
// Manage mouse down (Play sound)
|
|
mem_seek R7(D2Client, 7BBD1, 7BBD1, 780E4, 17BC2, 8C6E2, 808B2, 79C62, 31112);
|
|
memt_byte( 0xC7, 0xE8 ); // CALL caller_skillsPageMouseDown
|
|
MEMT_REF4( version_D2Client >= V111 ? 0x00001845 : 0x00001843, version_D2Client >= V111 ? caller_skillsPageMouseDown_111 : caller_skillsPageMouseDown);
|
|
memt_byte( 0x00, 0x90 ); // NOP
|
|
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
|
|
|
|
// Manage mouse up
|
|
mem_seek R7(D2Client, 7BC40, 7BC40, 78466, 17558, 8C078, 80248, 795F8, 30AA8);
|
|
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>
|
|
|
|
log_msg("\n");
|
|
|
|
isInstalled = true;
|
|
}
|
|
|
|
/*================================= END OF FILE =================================*/ |