JGPGetCharList para 97d - Sincronizar Wings en character select

Publicado por Dakosmu, Feb 17, 2025, 06:49 PM

Tema anterior - Siguiente tema

Dakosmu

JGPGetCharList para 97d - Sincronizar Wings en character select

Bueno, les dejo mi primer aporte - valorenlo porque estuve 3 dias para poder hacerlo andar  :(

Sirve para sincronizar las wings o cualquier item custom en el preview del character select. (PreviewCharSet)


Los visitantes no pueden visualizar imágenes en los mensajes, por favor Regístrate o Inicia Sesión


LADO GS


h

#define gObjIsAccontConnect ((BOOL(*)(DWORD aIndex, char* AccName)) 0x00402469)

typedef struct
{
PWMSG_HEAD h;
short Number;
BYTE Count;
int DbNumber;
BYTE Magumsa;
char AccountId[11];
} SDHP_CHARLISTCOUNT, *LPSDHP_CHARLISTCOUNT;

typedef struct
{
BYTE Index;
char Name[10];
WORD Level;
BYTE Class;
BYTE CtlCode;
BYTE dbInventory[36];
BYTE DbVersion;
BYTE btGuildStatus;
}  SDHP_CHARLIST, *LPSDHP_CHARLIST;

typedef struct
{
PBMSG_HEAD h;
BYTE subcode;
BYTE Count;
} PMSG_CHARLISTCOUNT, *LPPMSG_CHARLISTCOUNT;

typedef struct
{
BYTE Index;
char Name[10];
WORD Level;
BYTE CtlCode;
BYTE CharSet[12];
} PMSG_CHARLIST, *LPPMSG_CHARLIST;


cpp

BYTE LevelSmallConvert(int level)
{
if(level >= 11) return 7;
else if(level == 10) return 6;
else if(level == 9) return 5;
else if(level == 8) return 4;
else if(level == 7) return 3;
else if(level >= 5 && level <= 6) return 2;
else if(level >= 3 && level <= 4) return 1;
return 0;
}

void JGPGetCharList(BYTE* lpRecv)
{
LPSDHP_CHARLISTCOUNT lpCount = (LPSDHP_CHARLISTCOUNT)lpRecv;

PMSG_CHARLISTCOUNT pCLCount;
PMSG_CHARLIST pCList;

int  lOfs = 0;
int  lsOfs = sizeof(SDHP_CHARLISTCOUNT);
int  aIndex = lpCount->Number;
char szId[11];

BYTE sendbuf[256];
BYTE index;
WORD TempInventory[12];

pCLCount.h.c        = 0xC1;
pCLCount.h.headcode = 0xF3;
pCLCount.subcode    = 0x00;
pCLCount.Count      = lpCount->Count;

gObj[aIndex].Magumsa = lpCount->Magumsa;

szId[10] = 0;
memcpy(szId, lpCount->AccountId, 10);

if(gObjIsAccontConnect(aIndex, szId) == FALSE)
{
CloseClient(aIndex);
return;
}

memset(sendbuf, 0, sizeof(sendbuf)); // 1
lOfs += sizeof(pCLCount); //5 byte

if(pCLCount.Count > 0)
{
for(int n = 0; n < pCLCount.Count; n++)
{
LPSDHP_CHARLIST lpCL;
lpCL = (LPSDHP_CHARLIST)(lpRecv + lsOfs);

memset(&pCList, 0, sizeof(pCList));
pCList.Index = lpCL->Index;
pCList.Level = lpCL->Level;
pCList.CtlCode = lpCL->CtlCode;

if (gObj[aIndex].m_cAccountItemBlock != 0)
pCList.CtlCode |= 0x10;

memcpy(pCList.Name, lpCL->Name, 10);
// CHARACTER CLASS SKIN (BK - SM - ELF - MG)
pCList.CharSet[0] = 32 * (lpCL->Class >> 4) & 0xE0;
pCList.CharSet[0] |= 16 * (lpCL->Class & 7) & 0x10;

pCList.CharSet[1] = lpCL->dbInventory[0]; // WEAPON
pCList.CharSet[2] = lpCL->dbInventory[3]; // SHIELD

// 22 - 24 HELM
if (lpCL->dbInventory[6] == 255 && (lpCL->dbInventory[8] & 128) == 128)
TempInventory[0] = -1;
else
TempInventory[0] = (lpCL->dbInventory[6] + ((lpCL->dbInventory[8] >> 7) << 8)) % 32;

// 25 - 27 ARMOR
if (lpCL->dbInventory[9] == 255 && (lpCL->dbInventory[11] & 128) == 128)
TempInventory[1] = -1;
else
TempInventory[1] = (lpCL->dbInventory[9] + ((lpCL->dbInventory[11] >> 7) << 8)) % 32;

// 28 - 30 PANTS
if (lpCL->dbInventory[12] == 255 && (lpCL->dbInventory[14] & 128) == 128)
TempInventory[2] = 31;
else
TempInventory[2] = (lpCL->dbInventory[12] + ((lpCL->dbInventory[14] >> 7) << 8)) % 32;

// 31 - 33 GLOVES
if (lpCL->dbInventory[15] == 255 && (lpCL->dbInventory[17] & 128) == 128)
TempInventory[3] = 31;
else
TempInventory[3] = (lpCL->dbInventory[15] + ((lpCL->dbInventory[17] >> 7) << 8)) % 32;

// 34 - 36 BOOTS
if (lpCL->dbInventory[18] == 255 && (lpCL->dbInventory[20] & 128) == 128)
TempInventory[4] = 31;
else
TempInventory[4] = (lpCL->dbInventory[18] + ((lpCL->dbInventory[20] >> 7) << 8)) % 32;

// 37 - 39 WINGS
if (lpCL->dbInventory[21] == 255 && (lpCL->dbInventory[23] & 128) == 128)
TempInventory[5] = 255;
else
TempInventory[5] = (lpCL->dbInventory[21] + ((lpCL->dbInventory[23] >> 7) << 8)) % 32;

// 40 - 42 HELPER
if (lpCL->dbInventory[24] == 255 && (lpCL->dbInventory[26] & 128) == 128)
TempInventory[6] = 31;
else
TempInventory[6] = (lpCL->dbInventory[24] + ((lpCL->dbInventory[26] >> 7) << 8)) % 32;

pCList.CharSet[3] = TempInventory[1] % 16 + 16 * (TempInventory[0] % 16);
pCList.CharSet[4] = TempInventory[3] % 16 + 16 * (TempInventory[2] % 16);
index = 16 * (TempInventory[4] % 16);

// S1 WINGS
if (TempInventory[5] == 31)
index |= 0x0C;
else
index |= (TempInventory[5] & 0x03) * 4;

// HELPER
if (TempInventory[6] == 31)
index |= 0x03;
else
index |= TempInventory[6] & 0x03;
pCList.CharSet[5] = index;

// SHINE LEVEL
int levelindex = 0;
if(lpCL->dbInventory[0] != 255)
levelindex = LevelSmallConvert((((lpCL->dbInventory[1])>>3)&15));
if(lpCL->dbInventory[3] != 255)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[4])>>3)&15))<<3;
if(TempInventory[0] < 31)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[7])>>3)&15))<<6;
if(TempInventory[1] < 31)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[10])>>3)&15))<<9;
if(TempInventory[2] < 31)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[13])>>3)&15))<<12;
if(TempInventory[3] < 31)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[16])>>3)&15))<<15;
if(TempInventory[4] < 31)
levelindex |= (int)LevelSmallConvert((((lpCL->dbInventory[19])>>3)&15))<<18;

pCList.CharSet[6] = ((int)levelindex>>16) & 0xFF;
pCList.CharSet[7] = ((int)levelindex>>8) & 0xFF;
pCList.CharSet[8] = levelindex & 0xFF;

pCList.CharSet[9] = 0;
// LAST BITS
if (TempInventory[0] > 15)
pCList.CharSet[9] = -128;
if (TempInventory[1] > 15)
pCList.CharSet[9] |= 0x40u;
if (TempInventory[2] > 15)
pCList.CharSet[9] |= 0x20u;
if (TempInventory[3] > 15)
pCList.CharSet[9] |= 0x10u;
if (TempInventory[4] > 15)
pCList.CharSet[9] |= 0x8u;

// S2 WINGS
if (TempInventory[5] >= 3 && TempInventory[5] <= 6)
{
pCList.CharSet[5] |= 0x0Cu;
pCList.CharSet[9] |= (TempInventory[5] - 2) & 0x07;
}

pCList.CharSet[10] = 0;
// DINORANT
if ((TempInventory[6] & 0x03) != 0 && TempInventory[6] != 31)
pCList.CharSet[10] |= 1u;

pCList.CharSet[11] = 0; //CHARSET 11 LISTO PARA USAR

memcpy(&sendbuf[lOfs], &pCList, sizeof(pCList)); // 2
lsOfs += sizeof(SDHP_CHARLIST); // Name, level, etc
lOfs  += sizeof(PMSG_CHARLIST); // CharSet, etc
}
}
pCLCount.h.size = lOfs;
memcpy(sendbuf, &pCLCount, sizeof(pCLCount)); // 3
DataSend(aIndex, sendbuf, lOfs); // 4
}


HookThis((DWORD)&JGPGetCharList, 0x0040E815);
*(BYTE*)0x00475FBB = 0x0C;


lado main

*(BYTE*)(0x00423979) = 0x1C;


Saludos!

Creditos: Feche
Bon Dia

🡱 🡳