Did you try with dataserver from season 6 files like encgames or titanstech? Because i have the same codes you have
in a dll but it disconnects me and i didn´t try with dataserver.
Did you try with dataserver from season 6 files like encgames or titanstech? Because i have the same codes you have
in a dll but it disconnects me and i didn´t try with dataserver.
yeah same here!
how to create charset for new wings?
Acces, use search
it didnt help me.
to fix dataserver:
create new call to create character on start in dataserver, and fix limit of class, thats it.
Don't really know if its correct or not..its my 1st time trying to decompile something xD.Used as base deathways gs .18 src.
JGPGetCharList from gs.90 and someother things added like miniwings and pets.
PHP Code:void JGPGetCharList(unsigned char * lpRecv)
{
SDHP_CHARLISTCOUNT * lpCount = (SDHP_CHARLISTCOUNT *)lpRecv;
SDHP_CHARLIST * lpCL;
char szId[MAX_ACCOUNT_LEN+1];
BYTE sendbuf[256];
int lOfs = 0;
int lsOfs = sizeof(SDHP_CHARLISTCOUNT);
int aIndex = lpCount->Number;
BYTE index;
PMSG_CHARLISTCOUNT pCLCount; // Packet Char List Count
PMSG_CHARLIST pCList;
WORD TempInventory[12];
pCLCount.h.c = 0xC1;
pCLCount.h.headcode = 0xF3;
pCLCount.subcode = 0x00;
pCLCount.Count = lpCount->Count;
szId[MAX_ACCOUNT_LEN] = 0;
memcpy(szId, lpCount->AccountId, MAX_ACCOUNT_LEN);
if ( ::gObjIsAccontConnect(aIndex, szId) == FALSE )
{
LogAddC(2, lMsg.Get(MSGGET(1, 165)), gObj[aIndex].AccountID, szId);
CloseClient(aIndex);
/*
Log.outNormal("Requested character list doesn't match the user. (%s)%s", gObj[aIndex].AccountID, szId);
CloseClient(aIndex);
*/
return;
}
gObj[aIndex].Magumsa = lpCount->Magumsa;
pCLCount.MaxClass = gObj[aIndex].Magumsa+3;
pCLCount.MoveCnt = lpCount->MoveCnt;
memset(sendbuf, 0, sizeof(sendbuf));
lOfs += sizeof(PMSG_CHARLISTCOUNT);
if ( pCLCount.Count > 0 )
{
for ( int i = 0; i < pCLCount.Count; ++i )
{
memset(&pCList, 0, sizeof(pCList));
lpCL = (SDHP_CHARLIST *)&lpRecv[lsOfs];
pCList.Index = lpCL->Index;
pCList.Level = lpCL->Level;
pCList.CtlCode = lpCL->CtlCode;
pCList.btGuildStatus = lpCL->btGuildStatus;
if ( gObj[aIndex].m_cAccountItemBlock != 0 )
pCList.CtlCode |= 0x10; // Set Block Item
memcpy(pCList.Name, lpCL->Name, MAX_ACCOUNT_LEN);
pCList.CharSet[CS_CLASS] = CS_GET_CLASS(lpCL->Class);
int changeup = CS_GET_CHANGEUP(lpCL->Class);
pCList.CharSet[CS_CLASS] |= CS_SET_CHANGEUP(changeup); //pCList.CharSet[CS_CLASS] |= 0x10 * v4 & 0x10;
pCList.CharSet[CS_CLASS] |= CS_GET_CLASS2(changeup); //Made up by me.
pCList.CharSet[9] = 0;
if ( lpCL->DbVersion == 0 ) //////////////////////////////DB Case 0///////////////////////////////////////////////////////////////////
{
if ( lpCL->dbInventory[0] != (BYTE)-1 )
{
WORD wItemCode = lpCL->dbInventory[0] / MAX_TYPE_ITEMS * MAX_SUBTYPE_ITEMS + lpCL->dbInventory[0] % MAX_TYPE_ITEMS;
pCList.CharSet[1] = wItemCode;
pCList.CharSet[12] |= DBI_GET_TYPE(wItemCode);
}
else
{
pCList.CharSet[1] = -1;
pCList.CharSet[12] |= 0xF0;
}
if ( lpCL->dbInventory[2] != (BYTE)-1 )
{
WORD wItemCode = lpCL->dbInventory[2] / MAX_TYPE_ITEMS * MAX_SUBTYPE_ITEMS + lpCL->dbInventory[2] % MAX_TYPE_ITEMS;
pCList.CharSet[2] = wItemCode;
pCList.CharSet[13] |= DBI_GET_TYPE(wItemCode);
}
else
{
pCList.CharSet[2] = -1;
pCList.CharSet[13] |= 0xF0;
}
if ( lpCL->dbInventory[4] == (BYTE)-1 )
{
index = 0xF0;
}
else
{
index = (lpCL->dbInventory[4] & 0x0F) * MAX_TYPE_ITEMS;
}
if ( lpCL->dbInventory[6] == (BYTE)-1 )
{
index |= 0x0F;
}
else
{
index |= (lpCL->dbInventory[6] & 0x0F);
}
pCList.CharSet[3] = index;
if ( lpCL->dbInventory[8] == (BYTE)-1 )
{
index = 0xF0;
}
else
{
index = (lpCL->dbInventory[8] & 0x0F) * MAX_TYPE_ITEMS;
}
if ( lpCL->dbInventory[10] == (BYTE)-1 )
{
index |= 0x0F;
}
else
{
index |= (lpCL->dbInventory[10] & 0x0F);
}
pCList.CharSet[4] = index;
if ( lpCL->dbInventory[12] == (BYTE)-1 )
{
index = 0xF0;
}
else
{
index = (lpCL->dbInventory[12] & 0x0F) * MAX_TYPE_ITEMS;
}
if ( lpCL->dbInventory[14] == (BYTE)-1 )
{
index |= 0x0C;
}
else
{
index |= ((lpCL->dbInventory[14] & 0x03) * 4 );
}
if ( lpCL->dbInventory[16] == (BYTE)-1 )
{
index |= 0x03;
}
else
{
index |= (lpCL->dbInventory[16] & 0x03);
}
pCList.CharSet[5] = index;
if ( lpCL->dbInventory[4] == (BYTE)-1 )
pCList.CharSet[9] = 0x80;
if ( lpCL->dbInventory[6] == (BYTE)-1 )
pCList.CharSet[9] |= 0x40;
if ( lpCL->dbInventory[8] == (BYTE)-1 )
pCList.CharSet[9] |= 0x20;
if ( lpCL->dbInventory[10] == (BYTE)-1 )
pCList.CharSet[9] |= 0x10;
if ( lpCL->dbInventory[12] == (BYTE)-1 )
pCList.CharSet[9] |= 0x08;
int levelindex = LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[1]));
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[3])) << 3;
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[5])) << 6;
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[7])) << 9;
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[9])) << 12;
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[11])) << 15;
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[13])) << 18;
pCList.CharSet[6] = levelindex >> 16 & 0xFF;
pCList.CharSet[7] = (levelindex >> 8) & 0xFF;
pCList.CharSet[8] = (levelindex ) & 0xFF;
pCList.CharSet[10] = 0;
pCList.CharSet[11] = 0;
if ( lpCL->dbInventory[4] == (BYTE)-1 )
pCList.CharSet[13] |= 0x0F;
if ( lpCL->dbInventory[8] == (BYTE)-1 )
pCList.CharSet[14] |= 0xF0;
if ( lpCL->dbInventory[10] == (BYTE)-1 )
pCList.CharSet[14] |= 0x0F;
if ( lpCL->dbInventory[12] == (BYTE)-1 )
pCList.CharSet[15] |= 0xF0;
if ( lpCL->dbInventory[14] == (BYTE)-1 )
pCList.CharSet[15] |= 0x0F;
pCList.CharSet[16] = 0;
pCList.CharSet[17] = 0;
}
else if ( lpCL->DbVersion <= 2 ) //////////////////////////////////////////////////////////DB Case less or = 2////////////////////////
{
if ( lpCL->dbInventory[0] != (BYTE)-1 )
{
TempInventory[0] = (lpCL->dbInventory[0] / 32) * MAX_SUBTYPE_ITEMS + lpCL->dbInventory[0] % 32;
}
else
{
TempInventory[0] = -1;
}
// ---------------------------------------
if ( lpCL->dbInventory[3] != (BYTE)-1 )
{
TempInventory[1] = (lpCL->dbInventory[3] / 32) * MAX_SUBTYPE_ITEMS + lpCL->dbInventory[3] % 32;
}
else
{
TempInventory[1] = -1;
}
// ---------------------------------------
if ( lpCL->dbInventory[6] == (BYTE)-1 && (lpCL->dbInventory[8] & 0x80) == 0x80)
{
TempInventory[2] = -1;
}
else
{
TempInventory[2] = (lpCL->dbInventory[6] + ((lpCL->dbInventory[8] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[9] == (BYTE)-1 && (lpCL->dbInventory[11] & 0x80) == 0x80)
{
TempInventory[3] = -1;
}
else
{
TempInventory[3] = (lpCL->dbInventory[9] + ((lpCL->dbInventory[11] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[12] == (BYTE)-1 && (lpCL->dbInventory[14] & 0x80) == 0x80)
{
TempInventory[4] = 0x1F;
}
else
{
TempInventory[4] = (lpCL->dbInventory[12] + ((lpCL->dbInventory[14] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[15] == (BYTE)-1 && (lpCL->dbInventory[17] & 0x80) == 0x80)
{
TempInventory[5] = 0x1F;
}
else
{
TempInventory[5] = (lpCL->dbInventory[15] + ((lpCL->dbInventory[17] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[18] == (BYTE)-1 && (lpCL->dbInventory[20] & 0x80) == 0x80)
{
TempInventory[6] = 0x1F;
}
else
{
TempInventory[6] = (lpCL->dbInventory[18] + ((lpCL->dbInventory[20] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[21] == (BYTE)-1 && (lpCL->dbInventory[23] & 0x80) == 0x80)
{
TempInventory[7] = 0x1F;
}
else
{
TempInventory[7] = (lpCL->dbInventory[21] + ((lpCL->dbInventory[23] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( lpCL->dbInventory[24] == (BYTE)-1 && (lpCL->dbInventory[26] & 0x80) == 0x80)
{
TempInventory[8] = 0x1F;
}
else
{
TempInventory[8] = (lpCL->dbInventory[24] + ((lpCL->dbInventory[26] >> 7) << 8) ) % 32;
}
// ---------------------------------------
if ( TempInventory[0] != (WORD)-1 )
{
pCList.CharSet[1] = TempInventory[0];
pCList.CharSet[12] |= DBI_GET_TYPE(TempInventory[0]);
}
else
{
pCList.CharSet[1] = -1;
pCList.CharSet[12] |= 0xF0;
}
if ( TempInventory[1] != (WORD)-1 )
{
pCList.CharSet[2] = TempInventory[1];
pCList.CharSet[13] |= DBI_GET_TYPE(TempInventory[1]);
}
else
{
pCList.CharSet[2] = -1;
pCList.CharSet[13] |= 0xF0;
}
pCList.CharSet[3] = TempInventory[2] % MAX_TYPE_ITEMS * MAX_TYPE_ITEMS + TempInventory[3] % MAX_TYPE_ITEMS;
pCList.CharSet[4] = TempInventory[4] % MAX_TYPE_ITEMS * MAX_TYPE_ITEMS + TempInventory[5] % MAX_TYPE_ITEMS;
index = TempInventory[6] % MAX_TYPE_ITEMS * MAX_TYPE_ITEMS;
if (TempInventory[7]== 0x1F )
{
index |= 0x0C;
}
else
{
index |= (TempInventory[7] & 0x03) * 4;
}
if ( (TempInventory[8] & 0x04) == 0 )
{
if ( TempInventory[8] == 0x1F )
{
index |= 0x03;
}
else
{
index |= TempInventory[8] & 0x03;
}
}
else
{
index |= 0x03;
}
pCList.CharSet[5] = index;
int levelindex = 0;
if ( TempInventory[0] != (WORD)-1 )
{
levelindex = LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[1]));
}
if ( TempInventory[1] != (WORD)-1 )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[4]))<<3;
}
if ( TempInventory[2] < 0x1F )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[7]))<<6;
}
if ( TempInventory[3] < 0x1F )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[10]))<<9;
}
if ( TempInventory[4] < 0x1F )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[13]))<<12;
}
if ( TempInventory[5] < 0x1F )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[16]))<<15;
}
if ( TempInventory[6] < 0x1F )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[19]))<<18;
}
pCList.CharSet[6] = ((int)levelindex>>16 ) & 0xFF;
pCList.CharSet[7] = ((int)levelindex>>8 ) & 0xFF;
pCList.CharSet[8] = levelindex & 0xFF;
if ( TempInventory[2] > 0x0F )
pCList.CharSet[9] = 0x80;
if ( TempInventory[3] > 0x0F )
pCList.CharSet[9] |= 0x40;
if ( TempInventory[4] > 0x0F )
pCList.CharSet[9] |= 0x20;
if ( TempInventory[5] > 0x0F )
pCList.CharSet[9] |= 0x10;
if ( TempInventory[6] > 0x0F )
pCList.CharSet[9] |= 0x8;
if ( (TempInventory[7] >= 3 && TempInventory[7] <= 6) || TempInventory[7] == 0x1E)
{
pCList.CharSet[5] |= 0x0C;
if ( TempInventory[7] == 0x1E )
{
pCList.CharSet[9] |= 0x05;
}
else
{
pCList.CharSet[9] |= (TempInventory[7]-2) & 0x07;
}
}
if ( TempInventory[7] >= 0x24 && TempInventory[7] <= 0x28 || TempInventory[7] == 0x2B )
{
pCList.CharSet[5] |= 0x0C;
pCList.CharSet[16] |= 4 * ((TempInventory[7] - 35) & 0x07);
if ( TempInventory[7] == 0x2B )
{
pCList.CharSet[16] |= 0x18;
}
}
pCList.CharSet[10] = 0;
if ( (TempInventory[8] & 0x03) != 0 && TempInventory[8] != 0x1F )
pCList.CharSet[10] |= 1;
pCList.CharSet[11] = 0;
if ( (TempInventory[8] & 0x04) != 0 && TempInventory[8] != 0x1F )
pCList.CharSet[12] |= 1;
if ( TempInventory[2] >= 0x1F ) pCList.CharSet[13] |= 0x0F;
if ( TempInventory[3] >= 0x1F ) pCList.CharSet[14] |= 0xF0;
if ( TempInventory[4] >= 0x1F ) pCList.CharSet[14] |= 0x0F;
if ( TempInventory[5] >= 0x1F ) pCList.CharSet[15] |= 0xF0;
if ( TempInventory[6] >= 0x1F ) pCList.CharSet[15] |= 0x0F;
pCList.CharSet[16] = 0;
pCList.CharSet[17] = 0;
}
else /////////////////////////////////////////////////////////// Case DB 3/////////////////////////////////////////////////////////
{
if ( lpCL->dbInventory[0] == (BYTE)-1 && (lpCL->dbInventory[2]& 0x80) == 0x80 && (lpCL->dbInventory[3]& 0xF0) == 0xF0 )
{
TempInventory[0] = -1;
}
else
{
TempInventory[0] = (lpCL->dbInventory[0] + (lpCL->dbInventory[2]&0x80)*2)+ (lpCL->dbInventory[3]&0xF0)*32;
}
if ( lpCL->dbInventory[4] == (BYTE)-1 && (lpCL->dbInventory[6]& 0x80) == 0x80 && (lpCL->dbInventory[7]& 0xF0) == 0xF0 )
{
TempInventory[1] = -1;
}
else
{
TempInventory[1] = (lpCL->dbInventory[4] + (lpCL->dbInventory[6]&0x80)*2)+ (lpCL->dbInventory[7]&0xF0)*32;
}
if ( lpCL->dbInventory[8] == (BYTE)-1 && (lpCL->dbInventory[10]& 0x80) == 0x80 && (lpCL->dbInventory[11]& 0xF0) == 0xF0 )
{
TempInventory[2] = 0x1FF;
}
else
{
TempInventory[2] = ((lpCL->dbInventory[8] + (lpCL->dbInventory[10]&0x80)*2)+ (lpCL->dbInventory[11]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[12] == (BYTE)-1 && (lpCL->dbInventory[14]& 0x80) == 0x80 && (lpCL->dbInventory[15]& 0xF0) == 0xF0 )
{
TempInventory[3] = 0x1FF;
}
else
{
TempInventory[3] = ((lpCL->dbInventory[12] + (lpCL->dbInventory[14]&0x80)*2)+ (lpCL->dbInventory[15]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[16] == (BYTE)-1 && (lpCL->dbInventory[18]& 0x80) == 0x80 && (lpCL->dbInventory[19]& 0xF0) == 0xF0 )
{
TempInventory[4] = 0x1FF;
}
else
{
TempInventory[4] = ((lpCL->dbInventory[16] + (lpCL->dbInventory[18]&0x80)*2)+ (lpCL->dbInventory[19]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[20] == (BYTE)-1 && (lpCL->dbInventory[22]& 0x80) == 0x80 && (lpCL->dbInventory[23]& 0xF0) == 0xF0 )
{
TempInventory[5] = 0x1FF;
}
else
{
TempInventory[5] = ((lpCL->dbInventory[20] + (lpCL->dbInventory[22]&0x80)*2)+ (lpCL->dbInventory[23]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[24] == (BYTE)-1 && (lpCL->dbInventory[26]& 0x80) == 0x80 && (lpCL->dbInventory[27]& 0xF0) == 0xF0 )
{
TempInventory[6] = 0x1FF;
}
else
{
TempInventory[6] = ((lpCL->dbInventory[24] + (lpCL->dbInventory[26]&0x80)*2)+ (lpCL->dbInventory[27]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[28] == (BYTE)-1 && (lpCL->dbInventory[30]& 0x80) == 0x80 && (lpCL->dbInventory[31]& 0xF0) == 0xF0 )
{
TempInventory[7] = 0x1FF;
}
else
{
TempInventory[7] = ((lpCL->dbInventory[28] + (lpCL->dbInventory[30]&0x80)*2)+ (lpCL->dbInventory[31]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
if ( lpCL->dbInventory[32] == (BYTE)-1 && (lpCL->dbInventory[34]& 0x80) == 0x80 && (lpCL->dbInventory[35]& 0xF0) == 0xF0 )
{
TempInventory[8] = 0x1FF;
}
else
{
TempInventory[8] = ((lpCL->dbInventory[32] + (lpCL->dbInventory[34]&0x80)*2)+ (lpCL->dbInventory[35]&0xF0)*32)%MAX_SUBTYPE_ITEMS;
}
pCList.CharSet[12] |= DBI_GET_TYPE(TempInventory[0]);
pCList.CharSet[1] = TempInventory[0] % 256;
pCList.CharSet[13] |= DBI_GET_TYPE(TempInventory[1]);
pCList.CharSet[2] = TempInventory[1] % 256;
pCList.CharSet[13] |= (int)(TempInventory[2] & 0x1E0) >> 5;
pCList.CharSet[9] |= (int)(TempInventory[2] & 0x10) << 3;
pCList.CharSet[3] |= (int)(TempInventory[2] & 0x0F) << 4;
pCList.CharSet[14] |= (int)(TempInventory[3] & 0x1E0) >> 1;
pCList.CharSet[9] |= (int)(TempInventory[3] & 0x10) << 2;
pCList.CharSet[3] |= (int)(TempInventory[3] & 0x0F);
pCList.CharSet[14] |= (int)(TempInventory[4] & 0x1E0) >> 5;
pCList.CharSet[9] |= (int)(TempInventory[4] & 0x10) << 1;
pCList.CharSet[4] |= (int)(TempInventory[4] & 0x0F) << 4;
pCList.CharSet[15] |= (int)(TempInventory[5] & 0x1E0) >> 1;
pCList.CharSet[9] |= (int)(TempInventory[5] & 0x10);
pCList.CharSet[4] |= (int)(TempInventory[5] & 0x0F);
pCList.CharSet[15] |= (int)(TempInventory[6] & 0x1E0) >> 5;
pCList.CharSet[9] |= (int)(TempInventory[6] & 0x10) >> 1;
pCList.CharSet[5] |= (int)(TempInventory[6] & 0x0F) << 4;
index = 0;
if ( TempInventory[7] == 0x1FF )
{
index |= 0x0C;
}
else
{
index |= (int)(TempInventory[7] & 0x03) << 2;
}
if ( (TempInventory[8] & 0x04) == 0 )
{
if ( TempInventory[8] == 0x1FF )
{
index |= 0x03;
}
else
{
index |= (TempInventory[8] ) & 0x03;
}
}
else
{
index |= 0x03;
}
pCList.CharSet[5] |= index;
int levelindex = 0;
if ( TempInventory[0] != (WORD)-1 )
{
levelindex = LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[1]));
}
if ( TempInventory[1] != (WORD)-1 )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[5])) << 3;
}
if ( TempInventory[2] < 0x1FF )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[9])) << 6;
}
if ( TempInventory[3] < 0x1FF )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[13])) << 9;
}
if ( TempInventory[4] < 0x1FF )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[17])) << 12;
}
if ( TempInventory[5] < 0x1FF )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[21])) << 15;
}
if ( TempInventory[6] < 0x1FF )
{
levelindex |= (int)LevelSmallConvert(DBI_GET_LEVEL(lpCL->dbInventory[25])) << 18;
}
pCList.CharSet[6] = ((int)levelindex >> 0x10) & 0xFF;
pCList.CharSet[7] = ((int)levelindex >> 0x08) & 0xFF;
pCList.CharSet[8] = ((int)levelindex) & 0xFF;
if ( TempInventory[7] >= 3 && TempInventory[7] <= 6 || TempInventory[7] == 0x1E || TempInventory[7] == 0x29 || TempInventory[7] == 0x2A )
{
pCList.CharSet[5] |= 0x0C;
switch ( TempInventory[7] )
{
case 0x1E:
pCList.CharSet[9] |= 0x05;
break;
case 0x29:
pCList.CharSet[9] |= 0x06;
break;
case 0x2A:
pCList.CharSet[9] |= 0x07;
break;
default:
pCList.CharSet[9] |= (TempInventory[7] - 2) & 7;
break;
}
}
pCList.CharSet[10] = 0;
if ( TempInventory[8] & 3 )
{
if ( TempInventory[8] != 0x1FF )
pCList.CharSet[10] |= 0x01;
}
pCList.CharSet[11] = 0;
if ( TempInventory[8] & 4 )
{
if ( TempInventory[8] != 0x1FF )
pCList.CharSet[12] |= 0x01;
}
pCList.CharSet[16] = 0;
pCList.CharSet[17] = 0;
if ( TempInventory[8] == 0x25 && TempInventory[8] != 0x1FF )
{
pCList.CharSet[10] &= 0xFE;
pCList.CharSet[12] &= 0xFE;
pCList.CharSet[12] |= 0x04;
BYTE btExcellentOption = lpCL->dbInventory[34] & 0x3F;
if ( (btExcellentOption & 1) == 1 )
{
pCList.CharSet[16] |= 0x01;
}
if ( (btExcellentOption & 2) == 2 )
{
pCList.CharSet[16] |= 0x02;
}
if ( (btExcellentOption & 4) == 4 )
{
pCList.CharSet[17] |= 0x01;
}
}
if ( TempInventory[7] >= 0x24 && TempInventory[7] <= 0x28 || TempInventory[7] == 0x2B )
{
pCList.CharSet[5] |= 0x0C;
pCList.CharSet[16] |= 4 * ((TempInventory[7] - 0x23) & 7);
if ( TempInventory[7] == 0x2B )
{
pCList.CharSet[16] |= 0x18;
}
}
if ( !(TempInventory[8] & 4) )
{
if ( TempInventory[8] != 0x1FF )
{
register unsigned char PreviewPet = 0; //Don't know if its ok.
switch ( TempInventory[8] )
{
case 0x40: //Demon v2
PreviewPet = 0x20;
break;
case 0x41: //Spirit v2
PreviewPet = 0x40;
break;
case 0x43: //Rudolph
PreviewPet = 0x80;
break;
case 0x50: //Panda
PreviewPet = 0xE0;
break;
case 0x6A: //Unicorn
PreviewPet = 0xA0;
break;
case 0x7B: //Dragon Skeleton
pCList.CharSet[5] -= 0x03;
PreviewPet = 0x96; // or 0x60.
break;
}
pCList.CharSet[16] |= PreviewPet;
}
}
//Miniwings (don't know if its ok)
if ( TempInventory[7] == 0x82 || TempInventory[7] == 0x83 || TempInventory[7] == 0x84 || TempInventory[7] == 0x85 || TempInventory[7] == 0x86 )
{
register unsigned char PreviewWing = 0;
register unsigned char PreviewMiniWing = 0;
switch ( TempInventory[7] )
{
case 0x82: //MiniCape DL
pCList.CharSet[5] += 0x04;
PreviewMiniWing = 0x20;
break;
case 0x83: //MiniWings SUM
PreviewMiniWing = 0x40;
break;
case 0x84: //MiniWings ELF
pCList.CharSet[5] += 0x0C;
PreviewMiniWing = 0x60;
break;
case 0x85: //MiniWings DW
pCList.CharSet[5] += 0x08;
PreviewMiniWing = 0x80;
break;
case 0x86: //MiniWings DK
pCList.CharSet[5] += 0x04;
PreviewMiniWing = 0xA0;
break;
}
pCList.CharSet[16] = PreviewWing;
pCList.CharSet[17] = PreviewMiniWing;
}
}
memcpy(&sendbuf[lOfs], &pCList, sizeof(pCList));
lsOfs += sizeof(SDHP_CHARLIST);
lOfs += sizeof(pCList);
}
}
pCLCount.h.size = lOfs;
memcpy(sendbuf, &pCLCount, sizeof(PMSG_CHARLISTCOUNT));
DataSend(aIndex, sendbuf, lOfs);
}
All missing identifiers can be found in deathways source.Code:#define CS_GET_CLASS2(x) ( (((x)>>1)<<3)&(0x08) ) //
I'd really appreciate if those that already decompiled this can tell me if its good and show me hints where something is wrong.
Thanks.![]()
Last edited by duracel; 17-05-11 at 09:40 AM.
Im getting massive disconnections under this error using .90 GS:
(user) (playername) Time synchronization poorness caused connection blockage -7032 (number may variate)
WSARecv() failed with error 10038
its disconnecting ppl massivly and randomly, please does anybody have a solution?
Sorry for double posting, that was caused for because W1ndows didnt take 1000 ms (thanks Zemattana for telling me), now im getting this errors and then GS crashes:
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204312122) [338558064][338558075]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
¡Ú¡Ú¡Ú¡Ú InValid DurationTime Key = 17 ( Time : 204313152) [338628016][338628027]
any ideas?, i cant find the DurationTime ASCII string in olly, im a noob, is there another way to find strings? thanks.
How to fix the party zen bug? (GS 1.00.87 1.00.90 analog)
This problem has still not been resolved.
The problem is very urgent. Lost the game balance.
Help please.
GM can kill monsters but monsters don't see GM. I used GM with code = 32.
how to fix ?
thank all
Use search
this for you:
//Fix Zen bug in party
BYTE cFixPartyZen[31] = {0x8B,0x4D,0xE4,0x8B,0x55,0x0C,0x03,0xC9,0x03,0xC9,
0x03,0xC9,0x03,0xC9,0x81,0xC1,0x00,0x24,0x00,0x00, 0x89,
0x8A,0xD8,0x00,0x00,0x00,0xE9,0x83,0xFC,0xFF,0xFF} ;
memcpy((int*)0x005174E7,cFixPartyZen,sizeof(cFixPartyZen));
BYTE cFixPartyZen2[12] = {0xE9,0x65,0x03,0x00,0x00,0x90,0x90,0x90,0x90,0x90 ,0x90,0x90};
memcpy((int*)0x0051717D,cFixPartyZen2,sizeof(cFixPartyZen2));
//GM can kill, Enter (w7 fix)
BYTE FixGMEnter[2] = { 0xEB, 0x42 };
memcpy((int*)0x0050514B,FixGMEnter,sizeof(FixGMEnter));
But Monsters can't see GM so Monsters can't kill GM.
Last edited by Van_Bom; 17-06-11 at 10:13 PM.
I see many sources use many structures for commands, i mean:
but can define one global struct, allways for commands is the same, likePHP Code:struct Post{
...
int enabled;
...
}
struct Time{
...
int enabled;
...
}
but we can use something like this:PHP Code:if(enabled = 1)
{
....
}
maybe someone will find this usefullPHP Code:class GAME_COMMANDS
{
//======================================================
// STRUCTURES
//======================================================
private:
struct GAME_CHAT_COMMANDS
{
int Enabled;
int OnlyVip;
int OnlyGM;
int Cost;
int NeedResetCount;
int MinLevel;
int MaxLevel;
char* Syntax;
};
public:
//======================================================
// VARIABLES
//======================================================
char szBuff[200];
//**************************************************
// COMMAND LIST DEFINITIONS
//**************************************************
GAME_CHAT_COMMANDS COMMAND_POST;
//**************************************************
//======================================================
// SOURCE
//======================================================
public:
void getCommandReq(GAME_CHAT_COMMANDS cmd, DWORD aIndex)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
if(cmd.Enabled == 0)
{
GCServerMsgStringSend("Command is Currently Inactive ... Try Again Later!",aIndex,1);
return;
}
if(gObj->Level < cmd.MinLevel)
{
wsprintf(szBuff, "Need Level %d To Use This Command.",cmd.MinLevel);
GCServerMsgStringSend(szBuff,aIndex,1);
ZeroMemory(szBuff,sizeof(szBuff));
return;
}
if(gObj->Level < cmd.MaxLevel)
{
wsprintf(szBuff, "You have exceeded max level %d To Use This Command.",cmd.MaxLevel);
GCServerMsgStringSend(szBuff,aIndex,1);
ZeroMemory(szBuff,sizeof(szBuff));
return;
}
if(gObj->Money < cmd.Cost)
{
wsprintf(szBuff, "You dont have needed zen to use post! Need zen %d.",cmd.Cost);
GCServerMsgStringSend(szBuff,aIndex,1);
ZeroMemory(szBuff,sizeof(szBuff));
return;
}
if(cmd.OnlyGM == 1 && gObj->Authority != AUTHORITY_JPN_GM)
{
GCServerMsgStringSend("Command is Only available For GameMasters!",aIndex,1);
return;
}
if(cmd.OnlyVip == 1 && cMuOnlineDB.CheckIsVip(aIndex) == FALSE)
{
GCServerMsgStringSend("Command is Only available For VIP!",aIndex,1);
return;
}
//if(cmd.NeedResetCount < cMuOnlineDB.getResetCount(aIndex))
//{
// wsprintf(szBuff, "You dont have requeued resets. Need Resets",cmd.NeedResetCount);
// GCServerMsgStringSend(szBuff,aIndex,1);
// ZeroMemory(szBuff,sizeof(szBuff));
// return;
//}
gObj->Money = gObj->Money - cmd.Cost;
GCMoneySend(aIndex, ObjTab[aIndex].Money);
}
void cmdPost(DWORD aIndex,char* Parametrs)
{
this->getCommandReq(COMMAND_POST,aIndex);
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(i);
wsprintf(szBuff, "[POST]%s:%s",gObj->Name,Parametrs);
for(int i = OBJECT_MIN; i < OBJECT_MAX; i++)
{
OBJECTSTRUCT *Obj = (OBJECTSTRUCT*)OBJECT_POINTER(i);
if(Obj->Connected == 3)
GCServerMsgStringSend(szBuff,i,1);
}
ZeroMemory(szBuff,sizeof(szBuff));
}
void initCommand(LPBYTE Protocol,DWORD aIndex)
{
if(!memcmp(&Protocol[13],COMMAND_POST.Syntax,strlen(COMMAND_POST.Syntax)))
{
this->cmdPost(aIndex,(char*)Protocol+13+strlen(COMMAND_POST.Syntax));
}
}
}
more info: Data Structures - C++ Documentation
To preserve Socket serial security, you can call this function whenever you want to return immediately without calling the original protocol core.
Code:void SerialCheckEx(int aIndex,unsigned char Serial) { __asm { PUSHAD MOV AL,Serial PUSH EAX MOV ECX,aIndex #ifdef GS LEA ECX,DWORD PTR DS:[ECX*0x8+0x7CC3F18] MOV EDX,0x00404417 #else if GSCS LEA ECX,DWORD PTR DS:[ECX*0x8+0x40CECC0] MOV EDX,0x004046E7 #endif CALL EDX //NSerialCheck::InCheck(unsigned char serial) POPAD } }
case 0x8E:
MoveC.Teleport(aIndex,aRecv[8]); return;
break;
This is season 5 warp fix.why this is not working?
i have run it on debuger , set breakpoints in in MoveC.Teleport but debuger did not stop at breakpoint when i use warp..This is fake ? :D sorry for bad english
Last edited by access; 29-06-11 at 04:02 PM.
Frop Apple Source
SkillTree.cpp
PHP Code:// ---------------------------------------------------------------- //
// Project: APplE - Season 4 Episode II & Season 5 Project //
// Coded by: WolF & M.E.S //
// Files: SkillTree.CPP :: SkillTree.H //
// Hint: Summoner Skill Tree System //
// ---------------------------------------------------------------- //
#include "StdAfx.H"
CSkillTree cSkillTree;
CSkillTree::CSkillTree()
{
}
CSkillTree::~CSkillTree()
{
}
void CSkillTree::AddDamage(int aIndex,int MinDmg,int MaxDmg)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
gObj->m_MagicDamageMin+=MinDmg;
gObj->m_MagicDamageMax+=MaxDmg;
gObj->m_AttackDamageMinLeft+=MinDmg;
gObj->m_AttackDamageMinRight+=MinDmg;
gObj->m_AttackDamageMaxLeft+=MaxDmg;
gObj->m_AttackDamageMaxRight+=MaxDmg;
}
// -------------------------
void CSkillTree::RemoveDamage(int aIndex,int MinDmg,int MaxDmg)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
gObj->m_MagicDamageMin-=MinDmg;
gObj->m_MagicDamageMax-=MaxDmg;
gObj->m_AttackDamageMinLeft-=MinDmg;
gObj->m_AttackDamageMinRight-=MinDmg;
gObj->m_AttackDamageMaxLeft-=MaxDmg;
gObj->m_AttackDamageMaxRight-=MaxDmg;
}
// -------------------------
void CSkillTree::Manager(BYTE protoNum,LPBYTE aRecv,DWORD aLen,short aIndex,DWORD Encrypt,int Serial)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);
int MinDmg=0;
int MaxDmg=0;
BOOL IsDmgSkillUsed = FALSE;
//======================================================================================================
//-- Sleep Strengthener
//======================================================================================================
if (aRecv[3] == 0x02 && aRecv[4] == 0x17) // Sleep Strengthener Lvl 1 {535} //100 Damage //125 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x18) // Sleep Strengthener Lvl 2 {536} //100 Damage //125 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x19) // Sleep Strengthener Lvl 3 {537} //100 Damage //125 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x1A) // Sleep Strengthener Lvl 4 {538} //100 Damage //125 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x1B) // Sleep Strengthener Lvl 5 {539} //100 Damage //125 Mana
{
goto Exit;
}
//======================================================================================================
//-- Chain Lightning Strengthener
//======================================================================================================
if (aRecv[3] == 0x02 && aRecv[4] == 0x1C) // Chain Lightning Strengthener Lvl 1 {540} //75 Damage //94 Mana
{
IsDmgSkillUsed = TRUE;
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x1D) // Chain Lightning Strengthener Lvl 2 {541} //80 Damage //103 Mana
{
IsDmgSkillUsed = TRUE;
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x1E) // Chain Lightning Strengthener Lvl 3 {542} //85 Damage //112 Mana
{
IsDmgSkillUsed = TRUE;
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x1F) // Chain Lightning Strengthener Lvl 4 {543} //90 Damage //121 Mana
{
IsDmgSkillUsed = TRUE;
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x20) // Chain Lightning Strengthener Lvl 5 {544} //95 Damage //130 Mana
{
IsDmgSkillUsed = TRUE;
goto Exit;
}
//======================================================================================================
// Lightning Shock Strengthener
//======================================================================================================
if (aRecv[3] == 0x02 && aRecv[4] == 0x21) // Lightning Shock Strengthener Lvl 1 {545} //100 Damage //125 Mana
{
aRecv[3] = 0x00;
aRecv[4] = 0xE6;
IsDmgSkillUsed = TRUE;
//Fix BP & Mana Usage
gObj->Mana -= (float)(((545 % 5) +1) * 9);
//Calculation Aditional "Defence & Attack"
MinDmg = ((545 % 5) +1) * 70;
MaxDmg = ((545 % 5) +1) * (70 + 5/2);
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x22) // Lightning Shock Strengthener Lvl 2 {546} //105 Damage //135 Mana
{
aRecv[3] = 0x00;
aRecv[4] = 0xE6;
IsDmgSkillUsed = TRUE;
//Fix BP and Mana Usage
gObj->Mana -= (float)(((546 % 5) +1) * 9);
//Calculation Aditional "Defence & Attack"
MinDmg = ((546 % 5) + 1) * 70;
MaxDmg = ((546 % 5) + 1) * (70 + 5/2);
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x23) // Lightning Shock Strengthener Lvl 3 {547} //110 Damage //145 Mana
{
aRecv[3] = 0x00;
aRecv[4] = 0xE6;
IsDmgSkillUsed = TRUE;
//Fix BP and Mana Usage
gObj->Mana -= (float)(((547 % 5) + 1) * 9);
//Calculation Aditional "Defence & Attack"
MinDmg = ((547 % 5) + 1) * 70;
MaxDmg = ((547 % 5) + 1) * (70 + 5/2);
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x24) // Lightning Shock Strengthener Lvl 4 {548} //115 Damage //155 Mana
{
aRecv[3] = 0x00;
aRecv[4] = 0xE6;
IsDmgSkillUsed = TRUE;
//Fix BP and Mana Usage
gObj->Mana -= (float)(((548 % 5) +1) * 9);
//Calculation Aditional "Defence & Attack"
MinDmg =((548 % 5) +1) * 70;
MaxDmg =((548 % 5) +1) * (70 + 5/2);
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x25) // Lightning Shock Strengthener Lvl 5 {549} //120 Damage //165 Mana
{
//Log.SkillTreeLog("-------------------------\n");
//Log.SkillTreeLog("aRecv[3]=%d -- aRecv[4]=%d\n",aRecv[3],aRecv[4]);
//Log.SkillTreeLog("New Skill: 549\n");
aRecv[3] = 0x00;
aRecv[4] = 0xE6;
//Log.SkillTreeLog("aRecv[3]=%d -- aRecv[4]=%d\n",aRecv[3],aRecv[4]);
//Log.SkillTreeLog("New Skill: Changed to 230\n");
IsDmgSkillUsed = TRUE;
//Fix BP and Mana Usage
gObj->Mana -= (float)(((549 % 5) +1) * 9);
//Log.SkillTreeLog("New Skill: Mana Reduce\n");
//Calculation Aditional "Defence & Attack"
MinDmg = ((549 % 5) +1) * 70;
MaxDmg = ((549 % 5) +1) * (70 + 5/2);
goto Exit;
}
// -----------------------------------------------------------------------------------------------
// Drain Life Strengthener
// -----------------------------------------------------------------------------------------------
if (aRecv[3] == 0x02 && aRecv[4] == 0x26) //550 Drain Life Strengthener Lvl 1 //40 Dmg //57 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x27) //551 Drain Life Strengthener Lvl 2 //45 Dmg //64 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x28) //552 Drain Life Strengthener Lvl 3 //50 Dmg //71 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x29) //553 Drain Life Strengthener Lvl 4 //55 Dmg //78 Mana
{
goto Exit;
}
else if (aRecv[3] == 0x02 && aRecv[4] == 0x2A) //554 Drain Life Strengthener Lvl 5 //60 Dmg //85 Mana
{
goto Exit;
}
Exit:
if (IsDmgSkillUsed == TRUE)
this->AddDamage(aIndex,MinDmg,MaxDmg);
GCServerMsgStringSend("Added Damage",aIndex,1);
DataRecv(protoNum,aRecv,aLen,aIndex);
if (IsDmgSkillUsed == TRUE)
this->RemoveDamage(aIndex,MinDmg,MaxDmg);
GCServerMsgStringSend("Removed Damage",aIndex,1);
return;
}
can someone explain me where need to call this function,for fixing "damage/effect" of the Summoner Skilltree?
Last edited by DesmondMiles; 03-07-11 at 11:07 AM.
Can you tell me please if there is there any offset or anything like this to bypass/increase the monsters limit for MonstersSetBase ?
Question is not there is, its THERE ARE! You have to allocate a new memory allocation for that coz current struct is set to 7399 or 7400 if im not mistaken and then you have to update all references to that new memory address.
well, this is really old and was made for test.
*to fix summoner skill tree, u need to read skills from Skills File.
*then u have to enable that skills on a funcion in gs. ( i don't remember the offset)
*and then u have to hook upgraded skills to original summoner skills.
example:
*Check Skill.bmd and add into Skill(xxx).txt
*Enable the skills in some funcion in GameServer.
*Hook New Skills Number to Not Upgraded Skill Funcion
and i think that will work
Is there anyone that can help me understanding 1.03A+ JPN CashShop Packets?
[6600] [RECEIVE] Data:C11DD20178 00 00 00 00 00 00 14 40 00000000000000000000000000000000 // 5
[6600] [RECEIVE] Data:C11DD20178 00 00 00 00 00 00 34 40 00000000000000000000000000000000 // 20
[3860] [RECEIVE] Data:C11DD20178 00 00 00 00 00 00 3E 40 00000000000000000000000000000000 // 30
[3860] [RECEIVE] Data:C11DD20178 00 00 00 00 00 00 44 40 00000000000000000000000000000000 // 40
[3860] [RECEIVE] Data:C11DD20178 00 00 00 00 00 80 41 40 00000000000000000000000000000000 // 35
Hi Ragezone,
Im beginner of C++ and I Verry need the source code of Server Side Anti SpeedHack ( TickCount check), Skill Distance Check + Normal Atack Distance Check someone can help me ?
im trying to replace the Chain Lighting skill MasterSkillTree lvl 5 (544), with normal Chain Lighting skill(215)
in my protocol:
but still not working, character "move" but don't see any dmg, and any skill effect.PHP Code:case 0x1E:
{
int Skill = (aRecv[3] * 256 + aRecv[4]);
if (Skill >= 535 && Skill <= 554)
{
if (aRecv[3] == 0x02 && aRecv[4] == 0x20) // Skill Tree Chain Lightning Strengthener Lvl 5 -- DEC: 544
{
cLog.ConsoleOutput("aRecv[3]=%d aRecv[4]=%d",aRecv[3],aRecv[4]);
cLog.ConsoleOutput("Chain Lighting Lvl 5");
aRecv[3] = 0x00;
aRecv[4] = 0xD7; // Dec: 215 <-- Skill Chain Lightning (normal Skill)
}
return true;
}
}break;
with this i call effect skill of "sleep" skill ... but, 0x48 -> 72 -> "Cancel Magic Skill"Code:CallSkillEffect(aIndex,0x48,0x01,aIndex,1)
sleep magic stil number -> 219 -> 0xDB
Last edited by BeginnerZ; 22-08-11 at 02:57 PM.
offset Excilent Item Drop Rate 0041F0E1+1 not work :( . who can share how fix or enable ?
drop rate = 1/n
if you set = 2000 -> Don't drop
if you set = 2 -> drop rate = 50% -> Ex drop
---------- Post added at 03:01 PM ---------- Previous post was at 03:00 PM ----------
drop rate = 1/n
if you set = 2000 -> Don't drop
if you set = 2 -> drop rate = 50% -> Ex drop