admin 发表于 2020-10-2 00:53:53

1.13C动态血球法力

转载:https://tieba.baidu.com/p/6671458742


动态血球法力:












需要的结构体




struct GfxCell
{
DWORD flags;//0x00
DWORD width;//0x04
DWORD height;//0x08
DWORD xoffs;//0x0C
DWORD yoffs;//0x10
DWORD _2;//0x14
DWORD lpParent;//0x18
DWORD length;//0x1C
BYTE cols;//0x20
};




struct CellFile
{
DWORD dwVersion;//0x00
struct
{
WORD dwFlags;
BYTE mylastcol;
BYTE mytabno : 1;
};//0x04
DWORD eFormat;//0x08
DWORD termination;//0x0C
DWORD numdirs;//0x10
DWORD numcells;//0x14
GfxCell *cells;//0x18
};




struct GFXData
{
int nFrame;//0x00
DWORD __04;//0x04
char* szName;//0x2C
int nMaxFrames;//0x30
CellFile* pCellFile;//0x34
DWORD __38;//0x38
GfxCell* pCurrentCell;//0x3C
int nDirection;//0x40
DWORD __44;//0x44
};












函数存根




__declspec (naked) CellFile* __fastcall D2CLIENT_LoadCellFile_Stub(const char* szFilename, int nCellFileType)
{
__asm
{
push edx
mov eax, ecx
call D2CLIENT_LoadCellFile_I
retn
}
}












函数地址




#define D2CLIENT_LoadCellFile(szFilename, nCellFileType)D2CLIENT_LoadCellFile_Stub(szFilename, nCellFileType)




ASMPTR(D2CLIENT, LoadCellFile_I, 0x2B420)




FUNCPTR(D2GFX, DrawVerticalCropImage, void, __stdcall, (GFXData *pGfxData, int xPos, int yPos, DWORD Unknown1, int nSize, int nDrawMode), 0xB020)
FUNCPTR(D2GFX, DrawImage, void, __stdcall, (GFXData* pGfxData, int nPosX, int nPosY, DWORD dwGamma, int nDrawMode, BYTE* pPalette), 0xB080)












Patch位置




{D2DLL_D2CLIENT, 0x29299, (DWORD)BOTTOMPANEL_DrawLifeOrb, TRUE, 0x00},
{D2DLL_D2CLIENT, 0x2929E, (DWORD)BOTTOMPANEL_DrawManaOrb, TRUE, 0x00},






函数整体




CellFile* sgptLifeOrbDc6;
CellFile* sgptManaOrbDc6;
CellFile* sgptOrbOverlapDc6;




int __stdcall GFX_GetStatBarLength(DWORD dwStat1, DWORD dwStat2, int nBarWidth)
{
if (dwStat2 == 0)
return 0;




return ((dwStat1 * nBarWidth) / dwStat2);
}




void __fastcall BOTTOMPANEL_DrawManaOrb()
{
UnitAny* pPlayer = *D2CLIENT_PlayerUnit;
int nEnergy = D2COMMON_GetUnitStat(pPlayer, STATS_MANA, 0);
int nMaxEnergy = D2COMMON_GetUnitStat(pPlayer, STATS_MAXMANA, 0);
int nOrbSize = GFX_GetStatBarLength(nEnergy, nMaxEnergy, 100);




if (!sgptManaOrbDc6)
{
char szBuffer1 = {};
sprintf(szBuffer1, "Data\\Global\\Ui\\Panel\\ManaOrb");
sgptManaOrbDc6 = D2CLIENT_LoadCellFile(szBuffer1, CELLFILETYPE_DC6);
}




if (!sgptOrbOverlapDc6)
{
char szBuffer2 = {};
sprintf(szBuffer2, "Data\\Global\\Ui\\Panel\\BottomPanelOverlap");
sgptOrbOverlapDc6 = D2CLIENT_LoadCellFile(szBuffer2, CELLFILETYPE_DC6);
}




int nFrames = 68;




GFXData EnergyGfx = {};
GFXData OverlapGfx = {};




EnergyGfx.pCellFile = sgptManaOrbDc6;
EnergyGfx.nFrame = (GetTickCount() >> 6) % nFrames;




OverlapGfx.pCellFile = sgptOrbOverlapDc6;




D2GFX_DrawVerticalCropImage(&EnergyGfx, 689, 586, -1, nOrbSize, DRAWMODE_NORMAL);




OverlapGfx.nFrame = 0x00;
D2GFX_DrawImage(&OverlapGfx, 25, 596, -1, DRAWMODE_NORMAL, NULL);




OverlapGfx.nFrame = 0x01;
D2GFX_DrawImage(&OverlapGfx, 689, 590, -1, DRAWMODE_NORMAL, NULL);
}




void __fastcall BOTTOMPANEL_DrawLifeOrb()
{
UnitAny* pPlayer = *D2CLIENT_PlayerUnit;
int nLife = D2COMMON_GetUnitStat(pPlayer, STATS_HP, 0);
int nMaxnLife = D2COMMON_GetUnitStat(pPlayer, STATS_MAXHP, 0);
int nOrbSize = GFX_GetStatBarLength(nLife, nMaxnLife, 90);




if (!sgptLifeOrbDc6)
{
char szBuffer1 = {};




sprintf(szBuffer1, "Data\\Global\\Ui\\Panel\\LifeOrb");
sgptLifeOrbDc6 = D2CLIENT_LoadCellFile(szBuffer1, CELLFILETYPE_DC6);
}




int nFrames = 68;




GFXData LifeGfx = {};




LifeGfx.pCellFile = sgptLifeOrbDc6;
LifeGfx.nFrame = (GetTickCount() >> 6) % nFrames;




D2GFX_DrawVerticalCropImage(&LifeGfx, 25, 588, 12, nOrbSize, DRAWMODE_NORMAL);
}

页: [1]
查看完整版本: 1.13C动态血球法力