bueno, el código lo hice a ojo.
no garantizo que este bug free.vamos al HG SRC
vamos a client.h
busquen
- Code:
-
#define DEF_MSGBUFFERSIZE 30000
reemplacen por:
- Code:
-
#define DEF_MSGBUFFERSIZE 42*1024 //42kilobytes
las funciones
RequestInitDataHandler y
RequestTeleportHandlerusan este macro para construir un buffer de datos dinamico
con el operador "new". estas llaman a
iComposeInitMapDataesta se encarga de construir la pantalla inicial cuando logeamos al mapa.
toda la info necesaria.
buscamos
iComposeInitMapDatadeclaramos en el header
- Code:
-
DWORD *dwp;
mas abajo, casi al final buscamos:
- Code:
-
if (pTile->m_pItem[0] != NULL)
{ sp = (short *)cp;
*sp = pTile->m_pItem[0]->m_sSprite;
cp += 2;
iSize += 2;
sp = (short *)cp;
*sp = pTile->m_pItem[0]->m_sSpriteFrame;
cp += 2;
iSize += 2;
*cp = pTile->m_pItem[0]->m_cItemColor;
cp++;
iSize++;
}
antes del cierre de llaves agregamos
- Code:
-
memcpy(cp, pTile->CItem[0]->m_cName, 20);
cp += 20;
iSize += 20;
dwp = (DWORD *)cp;
*dwp = pTile->CItem[0]->m_dwAttribute;
cp += 4;
iSize += 4;
vamos al CLIENT SRC
vamos a
_ReadMapDatadeclaramos:
- Code:
-
DWORD *dwp, dwAttr;
char cItemNAme[32];
vamos mas abajo, busquen:
- Code:
-
if (ucHeader & 0x04)
{
sp = (short *)cp;
sItemSpr = *sp;
cp += 2;
sp = (short *)cp;
sItemSprFrame = *sp;
cp += 2;
cItemColor = *cp;
cp++;
m_pMapData->bSetItem(sPivotX + sX, sPivotY + sY, sItemSpr, sItemSprFrame, cItemColor, FALSE);
}
reemplazamos ese if entero por:
- Code:
-
if (ucHeader & 0x04) //item on grown
{
sp = (short *)cp;
sItemSpr = *sp;
cp += 2;
sp = (short *)cp;
sItemSprFrame = *sp;
cp += 2;
cItemColor = *cp;
cp++;
ZeroMemory(cItemName, sizeof(cItemName));
memcpy(cItemName, cp, 20);
cp += 20;
dwp = (DWORD *)cp;
dwAttr = *dwp;
cp += 4;
m_pMapData->bSetItem(sPivotX + sX, sPivotY + sY, cItemName, sItemSpr, sItemSprFrame, cItemColor, FALSE, dwAttr);
}
vamos a mapdata.cpp
BUSQUEN ESTA LINEA, Y SOLO ESTA LINEA.
- Code:
-
BOOL CMapData::bSetItem(short sX, short sY, short sItemSpr, short sItemSprFrame, char cItemColor, BOOL bDropEffect)
REEMPLACEN ESA LINEA, Y SOLO ESA LINEA, POR ESTA.
- Code:
-
BOOL CMapData::bSetItem(short sX, short sY, char *pName, short sItemSpr, short sItemSprFrame, char cItemColor, BOOL bDropEffect, DWORD dwAttr)
mas abajo en el desarrollo de la funcion, tienen esto
- Code:
-
m_pData[dX][dY].m_sItemSprite = sItemSpr;
m_pData[dX][dY].m_sItemSpriteFrame = sItemSprFrame;
m_pData[dX][dY].m_cItemColor = cItemColor;
arriba de la primera linea
(m_pData[dX][dY].m_sItemSprite = sItemSpr;)agreguen:
- Code:
-
ZeroMemory(m_pData[dX][dY].m_cItemName, sizeof(m_pData[dX][dY].m_cItemName));
if (pName != nullptr)
memcpy(m_pData[dX][dY].m_cItemName, pName, 20);
m_pData[dX][dY].m_dwAttr = dwAttr;
si les tira error en
nullptr, usen
NULL.
es casi lo mismo.
vamos a mapdata.h
busquen:
- Code:
-
BOOL bSetItem(short sX, short sY, short sItemSpr, short sItemSprFrame, char cItemColor, BOOL bDropEffect = TRUE);
reemplacen esa declaracion por:
- Code:
-
BOOL bSetItem(short sX, short sY, char *pName, short sItemSpr, short sItemSprFrame, char cItemColor, BOOL bDropEffect = TRUE, DWORD dwAttr);
vamos a tile.h
busquen estas 3, y agrupen las por el simple hecho de
que estan relacionadas, ya que corresponden al item.
- Code:
-
short m_sItemSprite;
short m_sItemSpriteFrame;
int m_cItemColor;
arriba de
m_sItemSprite, declaren:
- Code:
-
char m_cItemName[32];
DWORD m_dwAttr;
que les queden las 5 juntas, por cuestiones de prolijidad.
vamos a tile.cpp
en
CTile::CTile()agreguen:
- Code:
-
ZeroMemory(m_cItemName, sizeof(m_cItemName));
m_dwAttr = 0;
de nuevo, agrupen las 5 variables asi les quedan juntas.
en
void CTile::Clear()agreguen:
- Code:
-
ZeroMemory(m_cItemName, sizeof(m_cItemName));
m_dwAttr = 0;
agrupen las 5 variables
ahora.
vamos a buscar las llamadas a la funcion "
bSetItem"
1 llamada esta en
_ReadMapDatay las 2 restantes estan en
CommonEventHandler, en los case:
- Code:
-
case DEF_COMMONTYPE_ITEMDROP: ......
case DEF_COMMONTYPE_SETITEM: ......
aca les tengo que forzar los parametros.
por que sino el hg requiere demaciados cambios.
y van a morir en el intento mas de uno.
por el momento dejenlos asi.
reemplacen esos 2 cases entero por estos:
- Code:
-
case DEF_COMMONTYPE_ITEMDROP:
if ((sV1 == 6) && (sV2 == 0))
bAddNewEffect(4, sX, sY, NULL, NULL, 0);
m_pMapData->bSetItem(sX, sY, nullptr, sV1, sV2, sV3, TRUE, 0);
break;
case DEF_COMMONTYPE_SETITEM:
m_pMapData->bSetItem(sX, sY, nullptr, sV1, sV2, sV3, FALSE, 0);
break;
de nuevo, si les tira error con nullptr usen NULL.
volvamos al HG SRC
vamos a
iClientMotion_Move_Handlerbusquen, la declaracion de cData.
tiene que decir,
- Code:
-
char cData[3000];
reemplacen 3000, por
8*1024.
serian 8kilobytes.
vamor a
iRequestPanningMapDataRequestde nuevo, busquen algo como
- Code:
-
char cData[3000];
reemplacen por
8*1024es importante que a los buffers de datos les sobre y no les falte.
sino estaran probocando overflow.
las funciones
iClientMotion_Move_Handler y
iRequestPanningMapDataRequestllaman a
iComposeMoveMapData. esta se encarga de enviar info a medida q nos movemos.
actualisando los bordes de la pantalla.
vamos a
iComposeMoveMapData.
declaramos en el header:
- Code:
-
DWORD *dwp;
vamos bien abajo, casi al final.
busquen:
- Code:
-
if (pTile->m_pItem[0] != NULL)
{ sp = (short *)cp;
*sp = pTile->m_pItem[0]->m_sSprite;
cp += 2;
iSize += 2;
sp = (short *)cp;
*sp = pTile->m_pItem[0]->m_sSpriteFrame;
cp += 2;
iSize += 2;
*cp = pTile->m_pItem[0]->m_cItemColor;
cp++;
iSize++;
}
antes del cierre de llaves agreguen
- Code:
-
memcpy(cp, pTile->CItem[0]->m_cName, 20);
cp += 20;
iSize += 20;
dwp = (DWORD *)cp;
*dwp = pTile->CItem[0]->m_dwAttribute;
cp += 4;
iSize += 4;
de esta forma. podemos enviar mas info de un item, en el piso.
el nombre y el atributo.
solamente cuando entramos a un mapa. o cuando nos estamos moviendo por el mismo.
para solucionar el tema de mas arriba de que forzamos los parámetros
simplemente nos alejamos del pits de monstruos. bien lejos.
y volvemos para que la info se envíe con
iComposeMoveMapDatay listo. es medio tedioso si pero bueno. es lo que hay.
o sino pueden deslogear, y relogear de nuevo.
vamos de nuevo al CLIENT SRC
en game.h declaren:
- Code:
-
bool m_bIsDrawingItemName;
en game.cpp, en
CGame::CGame()agreguen:
- Code:
-
m_bIsDrawingItemName = false;
vamos a OnKeyUp
busquen el case 73.
segun vi en sources default,
aparece asi:
- Code:
-
case 73://'I'
break;
reemplasen ese case, por este:
- Code:
-
case 73://'I'
if (m_bCtrlPressed == TRUE &&
(m_cGameMode == DEF_GAMEMODE_ONMAINGAME) &&
m_bInputStatus == FALSE)
{ m_bIsDrawingItemName = !m_bIsDrawingItemName;
if (m_bIsDrawingItemName)
AddEventList("Drawing Item Name, press shift key and set the mouse coords over an item.", 10);
else AddEventList("Not Drawing Item Name.", 10);
}
break;
el comando CONTROL + i va a habilitar q podamos ver el nombre de los items.
pero tbm vamos a necesitar q presionen shift.
vamos a
DrawObjectsdeclaren en el header
- Code:
-
char cItemName[32];
DWORD dwAttr;
busquen un poquito mas abajo este IF
- Code:
-
if ((indexX < m_pMapData->m_sPivotX) ||
(indexX > m_pMapData->m_sPivotX + MAPDATASIZEX) ||
(indexY < m_pMapData->m_sPivotY) ||
(indexY > m_pMapData->m_sPivotY + MAPDATASIZEY))
adentro de ese
IF esta esto:
- Code:
-
sItemSprite = NULL;
sItemSpriteFrame = NULL;
bRet = FALSE;
cItemColor = NULL;
agreguen tambien:
- Code:
-
ZeroMemory(cItemName, sizeof(cItemName));
dwAttr = 0;
vamos mas abajo, en el
ELSE de ese if hay muchas inicialisaciones.
estas 3, estan ahi.
- Code:
-
sItemSprite = m_pMapData->m_pData[dX][dY].m_sItemSprite;
sItemSpriteFrame = m_pMapData->m_pData[dX][dY].m_sItemSpriteFrame;
cItemColor = m_pMapData->m_pData[dX][dY].m_cItemColor;
arriba de
sItemSprite agreguen:
- Code:
-
ZeroMemory(cItemName, sizeof(cItemName));
memcpy(cItemName, m_pMapData->m_pData[dX][dY].m_cItemName, 20);
dwAttr = m_pMapData->m_pData[dX][dY].m_dwAttr;
vamos un poco mas abajo.
busquen este if:
- Code:
-
if ((bRet == TRUE) && (sItemSprite != 0))
adentro de ese if, justo arriba de este if:
- Code:
-
if ((ix - 13 < msX) && (ix + 13 > msX) && (iy - 13 < msY) && (iy + 13 > msY))
agreguen:
- Code:
-
if ((strlen(cItemName) != 0) &&
m_bShiftPressed == TRUE &&
m_bIsDrawingItemName &&
((msX >= ix) && (msX <= (ix+32))) &&
((msY >= iy) && (msY <= (iy+32))))
{ char cStr[64], cStr2[64], cStr3[64];
ZeroMemory(cStr, sizeof(cStr));
ZeroMemory(cStr2, sizeof(cStr2));
ZeroMemory(cStr3, sizeof(cStr3));
GetItemName(cItemName, dwAttr, cStr, cStr2, cStr3);
PutString(ix, iy+10, cStr, RGB(10,10,10));
}
para que PutString muestre el nombre del item, tiene q tener el mouse encima del item,
y tienen que presionar shift.
vamos una cuantas lineas mas para abajo.
busquen este if:
- Code:
-
if ((bContact == TRUE) && (msY <= 431))
al cierre de ese if, mas abajo, busquen:
- Code:
-
if ((indexX < m_pMapData->m_sPivotX) ||
(indexX > m_pMapData->m_sPivotX + MAPDATASIZEX) ||
(indexY < m_pMapData->m_sPivotY) ||
(indexY > m_pMapData->m_sPivotY + MAPDATASIZEY))
adentro de ese if, esta esto:
- Code:
-
sItemSprite = NULL;
bRet = FALSE;
por cuestiones de las buenas practicas.
agreguen esto por abajo de bRet:
- Code:
-
ZeroMemory(cItemName, sizeof(cItemName));
dwAttr = 0;
sItemSpriteFrame = 0;
cItemColor = 0;
/////////
UPDATE
vamos a fixear la parte del forzamiento de los parámetros.
me puse a investigar un poco. y segun vi, en el CLIENT SRC, la funcion
bSetItem la cual tubo q ser reestructurada, es llamada por
_ReadMapDatay
CommonEventHandlervamos al CLIENT SRC
reestructuraremos a
CommonEventHandler de la siguiente forma.
en game.cpp, busquen
CommonEventHandlerdeclaren en el header:
- Code:
-
DWORD *dwp, dwAttr;
char cItemName[32];
mas abajo busquen esta linea:
- Code:
-
switch (wEventType)
POR ARRIBA DEL
SWITCHdespues de sV4 agreguen:
- Code:
-
if ((wEventType == DEF_COMMONTYPE_ITEMDROP) ||
(wEventType == DEF_COMMONTYPE_SETITEM))
{ ZeroMemory(cItemName, sizeof(cItemName));
memcpy(cItemName, cp, 20);
cp += 20;
dwp = (DWORD *)cp;
dwAttr = *dwp;
cp += 4;
}
ahora reemplacen los case de
DEF_COMMONTYPE_ITEMDROP y
DEF_COMMONTYPE_SETITEMpor estos.
- Code:
-
case DEF_COMMONTYPE_ITEMDROP:
if ((sV1 == 6) && (sV2 == 0))
bAddNewEffect(4, sX, sY, NULL, NULL, 0);
m_pMapData->bSetItem(sX, sY, cItemName, sV1, sV2, sV3, TRUE, dwAttr);
break;
case DEF_COMMONTYPE_SETITEM:
m_pMapData->bSetItem(sX, sY, cItemName, sV1, sV2, sV3, FALSE, dwAttr);
break;
de esta forma dejamos fixeado el tema de forzamiento de los parámetros.
esto, si tengo q razonarlo sin testearlo, iva a generar que cuando matemos un bicho
y nos dropee un item, si queríamos ver su nombre en el piso no íbamos a poder.
ahora vamos al HG SRC
DEF_COMMONTYPE_SETITEM y DEF_COMMONTYPE_ITEMDROP
son mensajes q manda el hg .
en game.cpp, busquen
SendEventToNearClient_TypeBesta función se usa solo para mandar 3 tipos de mensaje.
- Code:
-
DEF_COMMONTYPE_SETITEM
DEF_COMMONTYPE_ITEMDROP
DEF_COMMONTYPE_MAGIC
esos 3.
tenemos q reestructurar la definición de los parámetros.
por defecto tienen:
- Code:
-
void CGame::SendEventToNearClient_TypeB(DWORD dwMsgID, WORD wMsgType, char cMapIndex, short sX, short sY, short sV1, short sV2, short sV3, short sV4)
vamos a reemplazar esa linea, por esta:
- Code:
-
void CGame::SendEventToNearClient_TypeB(DWORD dwMsgID, WORD wMsgType, char cMapIndex, short sX, short sY, short sV1, short sV2, short sV3, short sV4, char *pName, DWORD dwAttr)
como podrán ver es la misma pero con 2 parámetros adicionales después de sV4.
uno corresponde a un parametro de entrada para el nombre del item, y otro para el atributo(RECUERDEN BIEN ESTA PARTE)
vamos al header de esa función, declaren:
- Code:
-
DWORD *dwp;
vamos mas abajo, antes del bucle while.
abajo de esto:
- Code:
-
sp = (short *)cp;
*sp = sV4;
cp += 2;
agreguen esto:
- Code:
-
short sAdd = 0;
if ((wMsgType == DEF_COMMONTYPE_ITEMDROP) ||
(wMsgType == DEF_COMMONTYPE_SETITEM))
{ memcpy(cp, pName, 20);
cp += 20;
dwp = (DWORD *)cp;
*dwp = dwAttr;
cp += 4;
sAdd = 24;
}
vamos un poquito mas abajo
y donde dice:
- Code:
-
iRet = m_pClientList[i]->m_pXSock->iSendMsg(cData, 18);
al numero
18 lo reemplazan por "18 + sAdd"
vamos a game.h
busquen la declaración de
SendEventToNearClient_TypeBes esta:
- Code:
-
void SendEventToNearClient_TypeB(DWORD dwMsgID, WORD wMsgType, char cMapIndex, short sX, short sY, short sV1, short sV2, short sV3, short sV4 = NULL);
la reemplazamos por esta:
- Code:
-
void SendEventToNearClient_TypeB(DWORD dwMsgID, WORD wMsgType, char cMapIndex, short sX, short sY, short sV1, short sV2, short sV3, short sV4, char *pName = nullptr, DWORD dwAttr = 0);
si les tira error nullptr, usen NULL.
ahora traten de compilar, si agregaron todo bien lo del hg, y antes de este paso les compilaba. ahora van a tener un medio centenar de errores.
vamos a buscar todas las llamadas a la funcion
SendEventToNearClient_TypeBvan a ver que se envia el mensaje
MSGID_EVENT_COMMONy como tipo del mensaje, aparecen los 3 citados anteriormente.
el unico tipo de mensaje q no va a tirar error es el de
DEF_COMMONTYPE_MAGIC.ahora vamos a tener q rellenar los 2 ultimos parametros a cada llamada de
SendEventToNearClient_TypeB que tiene por tipo de mensaje a
DEF_COMMONTYPE_ITEMDROP y a
DEF_COMMONTYPE_SETITEM.DEF_COMMONTYPE_SETITEM solo tiene 3 llamadas. es el mas facil.
empesemos por este.
empesemos con este ejemplo.
en
PlayerMagicHandleren el case de la magia possesion.
- Code:
-
case DEF_MAGICTYPE_POSSESSION:
vamos mas abajo, van a escontrar esta linea.
- Code:
-
_bItemLog(DEF_ITEMLOG_GET, iClientH, (int) -1, pItem);
por debajo de eso, agreguen esto:
- Code:
-
char cItemName[32];
DWORD dwAttr;
ZeroMemory(cItemName, sizeof(cItemName));
memcpy(cItemName, pItem->m_cName, 20);
dwAttr = pItem->m_dwAttribute;
ahora vamos un poco mas abajo. encontraran esto:
se los dejo expresado de esta forma para q se vea mejor.
- Code:
-
SendEventToNearClient_TypeB(
MSGID_EVENT_COMMON, DEF_COMMONTYPE_SETITEM,
m_pClientList[iClientH]->m_cMapIndex,
dX,
dY,
sRemainItemSprite,
sRemainItemSpriteFrame,
cRemainItemColor);
recordemos que los parametros de SendEventToNearClient_TypeB son:
dwMsgID, wMsgType, cMapIndex, sX, sY, sV1, sV2, sV3, sV4, pName, dwAttr
en el ejemplo citado,
cRemainItemColor corresponde a el parametro sV3.
tenemos q completar los 3 parametros restantes:
sV4,
pName,
dwAttrpara que se den una idea de como queda
les deveria qdar asi.
- Code:
-
SendEventToNearClient_TypeB(
MSGID_EVENT_COMMON, DEF_COMMONTYPE_SETITEM,
m_pClientList[iClientH]->m_cMapIndex,
dX,
dY,
sRemainItemSprite,
sRemainItemSpriteFrame,
cRemainItemColor,
0,
cItemName,
dwAttr);
las restantes 2 llamadas de
SendEventToNearClient_TypeBpara enviar el tipo
DEF_COMMONTYPE_SETITEMes hacer exactamente lo mismo.
deberan completar parametros en
iClientMotion_GetItem_Handler y
CheckFireBluringdeberan declarar
- Code:
-
char cItemName[32];
DWORD dwAttr;
deberan asignar.
- Code:
-
ZeroMemory(cItemName, sizeof(cItemName));
memcpy(cItemName, pItem->m_cName, 20);
dwAttr = pItem->m_dwAttribute;
para evitar ERRORES, ASIGNEN antes de un
- Code:
-
if (pItem != NULL) delete pItem;
o bien, antes de un
- Code:
-
if (iEraseReq == 1) delete pItem;
SIEMPRE.deberan completar los parametros.
por defecto,
sV4 para
DEF_COMMONTYPE_SETITEM y
DEF_COMMONTYPE_ITEMDROP es CERO SIEMPRE
como se especifica en el ejemplo anterior.
porque? por que si y punto. no insistan.
ahora lo mas tedioso.
busquen las llamadas de
SendEventToNearClient_TypeBcon el tipo de mensaje
DEF_COMMONTYPE_ITEMDROP como podran ver, son muchas.
en esencia es solamente completar el parametro sV4 con 0
y el pName y dwAttr de la siguiente manera.
les hago un solo ejemplo y listo.
por ejemplo, en DropItemHandler hay 2 llamadas a
SendEventToNearClient_TypeBhago una sola y el resto las hacen uds.
aca tienen al puntero "pItem", y a los propios datos de pItem
los usan para rellenar los parametros.
no hace falta nada de lo que hicimos en el ejemplo anterior.
basta con rellenar los faltantes.
- Code:
-
SendEventToNearClient_TypeB(
MSGID_EVENT_COMMON, DEF_COMMONTYPE_ITEMDROP,
m_pClientList[iClientH]->m_cMapIndex,
m_pClientList[iClientH]->m_sX,
m_pClientList[iClientH]->m_sY,
pItem->m_sSprite,
pItem->m_sSpriteFrame,
pItem->m_cItemColor);
recuerden que m_cItemColor es sV3.
completando los parametros faltantes quedaria:
- Code:
-
SendEventToNearClient_TypeB(
MSGID_EVENT_COMMON, DEF_COMMONTYPE_ITEMDROP,
m_pClientList[iClientH]->m_cMapIndex,
m_pClientList[iClientH]->m_sX,
m_pClientList[iClientH]->m_sY,
pItem->m_sSprite,
pItem->m_sSpriteFrame,
pItem->m_cItemColor,
0,
pItem->m_cName,
pItem->m_dwAttribute);
en posteriores llamadas es posible q vean algo asi:
- Code:
-
m_pClientList[iClientH]->m_pItemList[sItemIndex]->m_cItemColor
es exactamente lo mismo. agreguen sV4 como 0, y usen estos
- Code:
-
m_pClientList[iClientH]->m_pItemList[sItemIndex]->m_cName
m_pClientList[iClientH]->m_pItemList[sItemIndex]->m_dwAttribute
o bien, capas q les aparece un pItem2.
varia el nombre del puntero al item.
esto seria todo.
SIN MAS QUE AGREGAR ME DESPIDO.
si tienen problemas dejen sus facebooks y los ayudo si puedo con teamveawer.
salu2