El del trade aun se me hace complicado, solo detecta el zen del inventario de la persona, es decir: tengo 1 pj tiene 2 billones que es la maxima cantidad de zen, y otro solo tiene ponte tu 1000 de zen, entonces si el 1 pj de 2 billones le envia zen al otro, este no lo recibe, ya que dice que tu, osea el 1 pj tiene maximo de zen, lo que deberia ser de la siguiente manera, si al personaje que se le esta enviado zen tiene mas de 2 billones este no lo puede recibir, y es lo contrario solo chequea el zen del inventario del personaje que esta enviando mas no el que recibe, por lo que si el 2 pj te envia x cantidad zen del el que recibe, lo sigue recibiendo por lo que sobrepasa los 2 billones, en fin... algo complicado de hacer...
De todas maneras aqui dejare el codigo limpio, solo para la venta de items:
Hook:
Library.MakeHook((DWORD)&CGRequestRecv.CGItemSellRequest,0x00401C35);
Funcion:
BOOL CRequestRecv::gObjCheckMaxZen(int aIndex, int nAddZen)
{
LPOBJ lpObj = &gObj[aIndex];
if (!OBJMAX_RANGE(aIndex))
{
return FALSE;
}
__int64 _Money = 0;
_Money = (__int64)lpObj->Money + (__int64)nAddZen;
if ( _Money > (__int64)MAX_ZEN )
{
//GCServerMsgStringSend("Haz alcanzado el limite de zen", aIndex, 1);
GCServerMsgStringSend(lMsg.Get(MSGGET(4, 226)), aIndex, 1);
return FALSE;
}
return TRUE;
}
void CRequestRecv::CGItemSellRequest(PMSG_SELLREQUEST * lpMsg, int aIndex)
{
PMSG_SELLRESULT pResult;
LPOBJ lpObj = &gObj[aIndex];
Packets.PHeadSetB((LPBYTE)&pResult, 0x33, sizeof(pResult));
pResult.Result = false;
pResult.Money = 0;
int iAddZen = 0;
iAddZen = lpObj->pInventory[lpMsg->Pos].m_SellMoney;
if (CGRequestRecv.gObjCheckMaxZen(aIndex, iAddZen) == FALSE)
{
DataSend(aIndex, (LPBYTE)&pResult, pResult.h.size);
return;
}
// --
CGItemSellRequestRecv(lpMsg,aIndex);
}
Offset:
#define CGItemSellRequestRecv ((void(*)(PMSG_SELLREQUEST * lpMsg, int aIndex)) 0x0041C610)