dxincommand.cpp
if ( strCOMMAND == "/random" )
{
if(strArray.GetSize() != 5) return true;
CString strPARAM_01 = strArray.GetAt(1);
CString strPARAM_02 = strArray.GetAt(2);
CString strPARAM_03 = strArray.GetAt(3);
CString strPARAM_04 = strArray.GetAt(4);
WORD wMapMain = ( WORD ) atoi( strPARAM_01.GetString() );
WORD wMapSub = ( WORD ) atoi( strPARAM_02.GetString() );
WORD wItemMain = ( WORD ) atoi( strPARAM_03.GetString() );
WORD wItemSub = ( WORD ) atoi( strPARAM_04.GetString() );
GLMSG::SNET_REQ_GETPLAYERSINMAP_FLD NetMsgFld;
NetMsgFld.sMapID.wMainID = wMapMain;
NetMsgFld.sMapID.wSubID = wMapSub;
NetMsgFld.sItemID.wMainID = wItemMain;
NetMsgFld.sItemID.wSubID = wItemSub;
NetMsgFld.dwGaeaID = GLGaeaClient::GetInstance().GetCharacter()->GetCtrlID();
NETSEND(&NetMsgFld);
return true;
}
if ( strCOMMAND=="/event_seek" )
{
if ( strArray.GetSize() != 5 )
{
CInnerInterface::GetInstance().PrintConsoleText ( "Invalid parameter. Try again." );
return true;
}
CString strPARAM_01 = strArray.GetAt(1);
CString strPARAM_02 = strArray.GetAt(2);
CString strPARAM_03 = strArray.GetAt(3);
CString strPARAM_04 = strArray.GetAt(4);
WORD wMainID = GLCONST_CHAR::wSEEKCROW_MID;
WORD wSubID = GLCONST_CHAR::wSEEKCROW_SID;
WORD wPosX = (WORD) atoi (strPARAM_01.GetString() );
WORD wPosY = (WORD) atoi (strPARAM_02.GetString() );
WORD wItemMain = ( WORD ) atoi( strPARAM_03.GetString() );
WORD wItemSub = ( WORD ) atoi( strPARAM_04.GetString() );
PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( wMainID, wSubID );
if ( !pCrowData )
{
CInnerInterface::GetInstance().PrintConsoleText ( "Invalid Mob ID. Try again." );
return true;
}
if ( pCrowData->m_emCrow != CROW_NPC )
{
CInnerInterface::GetInstance().PrintConsoleText ( "Invalid Mob Type. Try again." );
return true;
}
GLMSG::SNET_GM_EVENT_SEEK_FLD NetMsgFld;
NetMsgFld.dwGaeaID = GLGaeaClient::GetInstance().GetCharacter()->GetCtrlID();
NetMsgFld.wMainID = wMainID;
NetMsgFld.wSubID = wSubID;
NetMsgFld.wPosX = wPosX;
NetMsgFld.wPosY = wPosY;
NetMsgFld.sItemID.wMainID = wItemMain;
NetMsgFld.sItemID.wSubID = wItemSub;
NETSEND ( &NetMsgFld );
return true;
}
GLContrlServerMsg.h
struct SNET_GM_EVENT_SEEK_GETREWARD
{
NET_MSG_GENERIC nmg;
DWORD dwGaeaID;
DWORD dwGaeaIDChar;
SNATIVEID sCrowID;
SNET_GM_EVENT_SEEK_GETREWARD () :
dwGaeaID(0),
dwGaeaIDChar(0),
sCrowID(NATIVEID_NULL())
{
nmg.dwSize = sizeof(*this);
nmg.nType = NET_MSG_GM_EVENT_SEEK_GETREWARD;
GASSERT(nmg.dwSize<=NET_DATA_BUFSIZE);
}
};
struct SNET_GM_EVENT_SEEK_GETREWARD_FLD
{
NET_MSG_GENERIC nmg;
SNATIVEID sItemID;
SNET_GM_EVENT_SEEK_GETREWARD_FLD () :
sItemID(NATIVEID_NULL())
{
nmg.dwSize = sizeof(*this);
nmg.nType = NET_MSG_GM_EVENT_SEEK_GETREWARD_FLD;
GASSERT(nmg.dwSize<=NET_DATA_BUFSIZE);
}
};
struct SNET_GM_EVENT_SEEK_FLD
{
NET_MSG_GENERIC nmg;
DWORD dwGaeaID;
WORD wMainID;
WORD wSubID;
WORD wPosX;
WORD wPosY;
SNATIVEID sItemID;
SNET_GM_EVENT_SEEK_FLD () :
dwGaeaID(0),
wMainID(0),
wSubID(0),
wPosX(0),
wPosY(0),
sItemID(NATIVEID_NULL())
{
nmg.dwSize = sizeof(*this);
nmg.nType = NET_MSG_GM_EVENT_SEEK_FLD;
GASSERT(nmg.dwSize<=NET_DATA_BUFSIZE);
}
};
struct SNET_REQ_GETPLAYERSINMAP_FLD
{
NET_MSG_GENERIC nmg;
DWORD dwGaeaID;
SNATIVEID sMapID;
SNATIVEID sItemID;
SNET_REQ_GETPLAYERSINMAP_FLD()
: dwGaeaID(0)
, sMapID(NATIVEID_NULL())
, sItemID(NATIVEID_NULL())
{
nmg.dwSize = sizeof(*this);
nmg.nType = NET_MSG_REQ_GETPLAYERSINMAP_FLD;
GASSERT(nmg.dwSize<=NET_DATA_BUFSIZE);
}
};
struct SNET_REQ_GETPLAYERSINMAP_FB
{
NET_MSG_GENERIC nmg;
SNATIVEID sItemID;
SNET_REQ_GETPLAYERSINMAP_FB()
: sItemID(NATIVEID_NULL())
{
nmg.dwSize = sizeof(*this);
nmg.nType = NET_MSG_REQ_GETPLAYERSINMAP_FB;
GASSERT(nmg.dwSize<=NET_DATA_BUFSIZE);
}
};
s_NetGlobal.h
NET_MSG_REQ_GETPLAYERSINMAP_FLD = (NET_MSG_GCTRL + 1618),
NET_MSG_REQ_GETPLAYERSINMAP_FB = (NET_MSG_GCTRL + 1619),
NET_MSG_GM_EVENT_SEEK_FLD = (NET_MSG_GCTRL + 1620),
NET_MSG_GM_EVENT_SEEK_GETREWARD = (NET_MSG_GCTRL + 1621),
NET_MSG_GM_EVENT_SEEK_GETREWARD_FLD = (NET_MSG_GCTRL + 1622),
GLogicData.cpp
WORD wSEEKCROW_MID = 65535;
WORD wSEEKCROW_SID = 65535;
GLogicData.h
extern WORD wSEEKCROW_MID;
extern WORD wSEEKCROW_SID;
GLogicDataLoad.cpp
cFILE.getflag( "SEEKCROW", 1, 2, wSEEKCROW_MID );
cFILE.getflag( "SEEKCROW", 2, 2, wSEEKCROW_SID );
s_cAgentServerMsg.cpp(MsgProcess)
case NET_MSG_REQ_ATTENDANCE:
case NET_MSG_REQ_GETPLAYERSINMAP_FLD:
case NET_MSG_GM_EVENT_SEEK_FLD:
case NET_MSG_GM_EVENT_SEEK_GETREWARD:
{
DWORD dwAgentClient = dwClient;
DWORD dwMAX_CLIENT = (DWORD) m_pClientManager->GetMaxClient();
if ( dwMAX_CLIENT <= dwAgentClient ) dwAgentClient -= dwMAX_CLIENT;
GLAgentServer::GetInstance().MsgProcess ( nmg, dwAgentClient, dwGaeaID );
}
break;
GLAgentServerMsg.cpp(MsgProcess)
case NET_MSG_GCTRL_REQ_TAXI: MsgReqTaxi( nmg, dwClientID, dwGaeaID ); break;
case NET_MSG_REQ_GETPLAYERSINMAP_FLD:
case NET_MSG_GM_EVENT_SEEK_FLD:
{
PGLCHARAG pCHAR = GetChar ( dwGaeaID );
if ( !pCHAR ) break;
if ( pCHAR->m_dwUserLvl < USER_SPECIAL ) break;
SENDTOALLCHANNEL ( nmg );
}
break;
case NET_MSG_GM_EVENT_SEEK_GETREWARD:
{
PGLCHARAG pCHAR = GetChar ( dwGaeaID );
if ( !pCHAR ) break;
SENDTOALLCHANNEL ( nmg );
}
break;
GLGaeaServerMsg.cpp
case NET_MSG_REQ_GETPLAYERSINMAP_FLD:
ReqGetPlayersInMap ( dwClientID, dwGaeaID, (GLMSG::SNET_REQ_GETPLAYERSINMAP_FLD*) nmg );
break;
case NET_MSG_GM_EVENT_SEEK_FLD:
ReqEventSeek ( dwClientID, dwGaeaID, (GLMSG::SNET_GM_EVENT_SEEK_FLD*) nmg );
break;
case NET_MSG_GM_EVENT_SEEK_GETREWARD:
ReqEventSeekReward ( dwClientID, dwGaeaID, (GLMSG::SNET_GM_EVENT_SEEK_GETREWARD*) nmg );
break;
GLGaeaServer.h
public:
BOOL ReqGetPlayersInMap ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_REQ_GETPLAYERSINMAP_FLD *pNetMsg );
BOOL ReqEventSeek ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_GM_EVENT_SEEK_FLD *pNetMsg );
BOOL ReqEventSeekReward ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_GM_EVENT_SEEK_GETREWARD *pNetMsg );
GLGaeaServer.cpp
#include "../RanClientUILib/Interface/GameTextControl.h"
BOOL GLGaeaServer::ReqGetPlayersInMap ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_REQ_GETPLAYERSINMAP_FLD *pNetMsg )
{
if ( !m_bEmulator )
{
if ( dwClientID != m_dwAgentSlot )
return FALSE;
}
PGLCHAR pChar = GetChar ( pNetMsg->dwGaeaID );
if ( !pChar )
return FALSE;
if ( pChar->m_dwUserLvl < USER_SPECIAL )
return FALSE;
GLLandMan *pLandMan = pChar->m_pLandMan;
if ( !pLandMan )
return FALSE;
DWORD dwGaeaIDList[1000]; //NOTE: value of this must be the same as m_dwMaxClient
int nGaeaIndex = 0;
for ( DWORD i=0; i<m_dwMaxClient; i++)
{
PGLCHAR pGLChar = m_PCArray[i];
if(!pGLChar)
continue;
if(pGLChar->GetCtrlID() == pNetMsg->dwGaeaID)
continue;
if(pGLChar->m_dwUserLvl >= USER_SPECIAL)
continue;
SNATIVEID sMapID = pGLChar->m_pLandMan->GetMapID();
if( sMapID.wMainID == pNetMsg->sMapID.wMainID &&
sMapID.wSubID == pNetMsg->sMapID.wSubID )
{
dwGaeaIDList[nGaeaIndex] = pGLChar->GetCtrlID();
nGaeaIndex++;
}
}
if ( nGaeaIndex == 0 )
return FALSE;
DWORD dwGaeaIDPicked = dwGaeaIDList[RandomNumber(0, nGaeaIndex-1)];
PGLCHAR pGLCharPicked = GetChar(dwGaeaIDPicked);
if( !pGLCharPicked )
return FALSE;
if( pGLCharPicked->m_dwUserLvl >= USER_SPECIAL )
return FALSE;
SITEM* pItem = GLItemMan::GetInstance().GetItem ( pNetMsg->sItemID );
if(!pItem)
return FALSE;
SITEMCUSTOM sCUSTOM;
sCUSTOM.sNativeID = pItem->sBasicOp.sNativeID;
if(!sCUSTOM.sNativeID.IsValidNativeID())
return FALSE;
SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
if(!pITEM)
return FALSE;
GLInventory cInvenTemp;
cInvenTemp.Assign ( pGLCharPicked->m_cInventory );
BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
if(!bOK)
return FALSE;
SITEMCUSTOM sITEM_NEW;
sITEM_NEW.sNativeID = pItem->sBasicOp.sNativeID;
if ( sITEM_NEW.sNativeID==SNATIVEID(false) )
return FALSE;
SITEM *pITEM_ORIG = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
if ( !pITEM_ORIG )
return FALSE;
CTime cTIME = CTime::GetCurrentTime();
sITEM_NEW.tBORNTIME = cTIME.GetTime();
sITEM_NEW.cGenType = EMGEN_SYSTEM;
sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );
sITEM_NEW.cDAMAGE = (BYTE)0;
sITEM_NEW.cDEFENSE = (BYTE)0;
sITEM_NEW.dwOwnerID = pGLCharPicked->m_dwCharID;
if( sITEM_NEW.GENERATE_RANDOM_OPT() )
{
GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
}
WORD wInsertPosX, wInsertPosY;
BOOL bOk = pGLCharPicked->m_cInventory.FindInsrtable ( pITEM_ORIG->sBasicOp.wInvenSizeX, pITEM_ORIG->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
if ( !bOk )
return FALSE;
pGLCharPicked->m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
SINVENITEM *pInsertItem = pGLCharPicked->m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, 0, ID_CHAR, pGLCharPicked->m_dwCharID, EMITEM_ROUTE_CHAR, pInsertItem->sItemCustom.wTurnNum );
GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
NetMsg_Inven.Data = *pInsertItem;
SENDTOCLIENT(pGLCharPicked->m_dwClientID,&NetMsg_Inven);
GLMSG::SNET_REQ_GETPLAYERSINMAP_FB NetMsgFB;
NetMsgFB.sItemID = pITEM_ORIG->sBasicOp.sNativeID;
SENDTOCLIENT ( pGLCharPicked->m_dwClientID, &NetMsgFB );
SITEMLINK sItemLink;
sITEM_NEW.Convert(sItemLink);
sItemLink.bUSE = true;
NET_CHAT_CTRL_FB NetChatFB;
NetChatFB.emType = CHAT_TYPE_GLOBAL;
NetChatFB.sITEMLINK = sItemLink;
CString strMessage;
strMessage.Format("Congratulations '%s'! Prize: <%s>.", pGLCharPicked->m_szName, pITEM_ORIG->GetName());
StringCchCopy ( NetChatFB.szChatMsg, GLOBAL_CHAT_MSG_SIZE+1, strMessage );
SENDTOCLIENT ( pChar->m_dwClientID, &NetChatFB );
for( int i = 0; i < nGaeaIndex; i++ )
{
PGLCHAR pGLChar = GetChar(dwGaeaIDList[i]);
if ( !pGLChar )
continue;
if ( pGLChar->m_dwUserLvl >= USER_SPECIAL )
continue;
if ( pGLChar->GetCtrlID() == pNetMsg->dwGaeaID )
continue;
SENDTOCLIENT ( pGLChar->m_dwClientID, &NetChatFB );
}
return TRUE;
}
BOOL GLGaeaServer::ReqEventSeek ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_GM_EVENT_SEEK_FLD *pNetMsg )
{
if ( !m_bEmulator )
{
if ( dwClientID != m_dwAgentSlot )
return FALSE;
}
PGLCHAR pChar = GetChar ( pNetMsg->dwGaeaID );
if ( !pChar )
return FALSE;
if ( pChar->m_dwUserLvl < USER_SPECIAL )
return FALSE;
SNATIVEID sID(pNetMsg->wMainID,pNetMsg->wSubID);
PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( sID );
if ( !pCrowData ) return FALSE;
if ( pCrowData->m_emCrow != CROW_NPC ) return FALSE;
PGLCHAR pCHAR = GetChar ( pNetMsg->dwGaeaID );
if ( !pCHAR ) return FALSE;
GLLandMan* pLandMan = GetByMapID ( pCHAR->m_sMapID );
if( !pLandMan ) return FALSE;
SITEM* pItem = GLItemMan::GetInstance().GetItem ( pNetMsg->sItemID );
if ( !pItem ) return FALSE;
pLandMan->DropCrow ( sID, pNetMsg->wPosX, pNetMsg->wPosY, pItem->sBasicOp.sNativeID );
if ( m_bEmulator )
{
NET_CHAT_CTRL_FB NetChatFB;
NetChatFB.emType = CHAT_TYPE_GLOBAL;
const char *szMAP_NAME = GetMapName ( pCHAR->m_sMapID );
CString strTEXT;
strTEXT.Format ( ID2SERVERTEXT("EMCROW_EVENT_SEEK"),
pCrowData->GetName(), szMAP_NAME, pItem->GetName() );
StringCchCopy ( NetChatFB.szChatMsg, GLOBAL_CHAT_MSG_SIZE+1, strTEXT );
SENDTOCLIENT ( pCHAR->m_dwClientID, &NetChatFB );
}
return TRUE;
}
BOOL GLGaeaServer::ReqEventSeekReward ( DWORD dwClientID, DWORD dwGaeaID, GLMSG::SNET_GM_EVENT_SEEK_GETREWARD *pNetMsg )
{
if ( !m_bEmulator )
{
if ( dwClientID != m_dwAgentSlot )
return FALSE;
}
PGLCHAR pCHAR = GetChar ( pNetMsg->dwGaeaIDChar );
if ( !pCHAR ) return FALSE;
GLLandMan* pLandMan = GetByMapID ( pCHAR->m_sMapID );
if( !pLandMan ) return FALSE;
PGLCROW pCrow = pLandMan->GetCrow( pNetMsg->dwGaeaID );
if ( !pCrow ) return FALSE;
if ( pCrow->m_sNativeID != pNetMsg->sCrowID )
return FALSE;
PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( pCrow->m_sNativeID );
if ( !pCrowData ) return FALSE;
if ( pCrowData->m_emCrow != CROW_NPC ) return FALSE;
SITEM* pItem = GLItemMan::GetInstance().GetItem ( pCrow->m_sItemID );
if ( !pItem ) return FALSE;
SITEMCUSTOM sCUSTOM;
sCUSTOM.sNativeID = pItem->sBasicOp.sNativeID;
if(!sCUSTOM.sNativeID.IsValidNativeID())
return FALSE;
SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
if(!pITEM)
return FALSE;
GLInventory cInvenTemp;
cInvenTemp.Assign ( pCHAR->m_cInventory );
BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
if(!bOK)
return FALSE;
SITEMCUSTOM sITEM_NEW;
sITEM_NEW.sNativeID = pItem->sBasicOp.sNativeID;
if ( sITEM_NEW.sNativeID==SNATIVEID(false) )
return FALSE;
SITEM *pITEM_ORIG = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
if ( !pITEM_ORIG )
return FALSE;
CTime cTIME = CTime::GetCurrentTime();
sITEM_NEW.tBORNTIME = cTIME.GetTime();
sITEM_NEW.cGenType = EMGEN_SYSTEM;
sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );
sITEM_NEW.cDAMAGE = (BYTE)0;
sITEM_NEW.cDEFENSE = (BYTE)0;
sITEM_NEW.dwOwnerID = pCHAR->m_dwCharID;
if( sITEM_NEW.GENERATE_RANDOM_OPT() )
{
GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
}
WORD wInsertPosX, wInsertPosY;
BOOL bOk = pCHAR->m_cInventory.FindInsrtable ( pITEM_ORIG->sBasicOp.wInvenSizeX, pITEM_ORIG->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
if ( !bOk )
return FALSE;
pCHAR->m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
SINVENITEM *pInsertItem = pCHAR->m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, 0, ID_CHAR, pCHAR->m_dwCharID, EMITEM_ROUTE_CHAR, pInsertItem->sItemCustom.wTurnNum );
GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
NetMsg_Inven.Data = *pInsertItem;
SENDTOCLIENT(pCHAR->m_dwClientID,&NetMsg_Inven);
GLMSG::SNET_GM_EVENT_SEEK_GETREWARD_FLD NetMsgFB;
NetMsgFB.sItemID = pITEM_ORIG->sBasicOp.sNativeID;
SENDTOCLIENT ( pCHAR->m_dwClientID, &NetMsgFB );
LISTDELCROWID_ITER iter = pLandMan->m_listDelGlobID.begin();
LISTDELCROWID_ITER iter_end = pLandMan->m_listDelGlobID.end();
for ( ;iter != iter_end; )
{
LISTDELCROWID_ITER iter_cur = iter++;
PGLCROW pCrow = pLandMan->GetCrow ( *iter_cur );
if ( !pCrow ) continue;
if ( pCrow->m_sNativeID == pNetMsg->sCrowID )
{
pLandMan->DropOutCrow ( *iter_cur );
}
}
SITEMLINK sItemLink;
sITEM_NEW.Convert(sItemLink);
sItemLink.bUSE = true;
NET_CHAT_CTRL_FB NetChatFB;
NetChatFB.emType = CHAT_TYPE_GLOBAL;
NetChatFB.sITEMLINK = sItemLink;
CString strMessage;
strMessage.Format("Congratulations '%s'! Prize: <%s>.", pCHAR->m_szName, pITEM_ORIG->GetName());
StringCchCopy ( NetChatFB.szChatMsg, GLOBAL_CHAT_MSG_SIZE+1, strMessage );
for ( DWORD i=0; i<m_dwMaxClient; i++)
{
PGLCHAR pGLChar = m_PCArray[i];
if(!pGLChar)
continue;
SNATIVEID sMapID = pGLChar->m_pLandMan->GetMapID();
if( sMapID.wMainID == pCHAR->m_pLandMan->GetMapID().wMainID &&
sMapID.wSubID == pCHAR->m_pLandMan->GetMapID().wSubID )
{
SENDTOCLIENT ( pGLChar->m_dwClientID, &NetChatFB );
}
}
return TRUE;
}
GLLandMan.cpp
Note: needs to be replaced...
DWORD GLLandMan::DropCrow ( SNATIVEID sNID, float fPosX, float fPosY, SNATIVEID sItemID )
{
HRESULT hr;
D3DXVECTOR3 vPos(fPosX,0,fPosY);
D3DXVECTOR3 vCollision;
LANDQUADNODE* pLandNode = m_LandTree.FindNode ( (int)fPosX, (int)fPosY );
if ( !pLandNode ) return UINT_MAX;
DWORD dwGlobID = -1;
if ( !m_FreeCROWGIDs.GetHead ( dwGlobID ) ) return UINT_MAX;
m_FreeCROWGIDs.DelHead ();
PGLCROW pNewCrow = GLGaeaServer::GetInstance().NEW_CROW();
hr = pNewCrow->CreateCrow ( NULL, this, sNID, m_pd3dDevice, &vPos );
if ( FAILED(hr) )
{
m_FreeCROWGIDs.AddTail ( dwGlobID );
GLGaeaServer::GetInstance().RELEASE_CROW ( pNewCrow );
return UINT_MAX;
}
pNewCrow->m_sMapID = m_sMapID;
pNewCrow->m_dwGlobID = dwGlobID;
pNewCrow->m_dwCeID = pLandNode->dwCID;
pNewCrow->m_sItemID = sItemID;
m_CROWArray[dwGlobID] = pNewCrow;
if ( pNewCrow->m_pCrowData->m_sAction.m_dwActFlag&EMCROWACT_BOSS )
{
pNewCrow->m_pGlobNode = m_GlobBOSSCROWList.ADDHEAD ( pNewCrow );
}
else
{
pNewCrow->m_pGlobNode = m_GlobCROWList.ADDHEAD ( pNewCrow );
}
pNewCrow->m_pQuadNode = pLandNode;
pNewCrow->m_pCellNode = pLandNode->pData->m_CROWList.ADDHEAD ( pNewCrow );
if ( pNewCrow->m_pCrowData->m_sAction.m_dwActFlag&EMCROWACT_KNOCK )
{
const char *szMAP_NAME = GLGaeaServer::GetInstance().GetMapName ( m_sMapID );
CString strTEXT;
strTEXT.Format ( ID2SERVERTEXT("EMCROWACT_KNOCK"),
pNewCrow->m_pCrowData->GetName(), szMAP_NAME );
GLMSG::SNET_SERVER_GENERALCHAT NetMsg;
NetMsg.SETTEXT ( strTEXT.GetString() );
GLGaeaServer::GetInstance().SENDTOAGENT ( &NetMsg );
}
if ( sItemID != NATIVEID_NULL() )
{
const char *szMAP_NAME = GLGaeaServer::GetInstance().GetMapName ( m_sMapID );
CString strTEXT;
strTEXT.Format ( ID2SERVERTEXT("EMCROW_EVENT_SEEK"),
pNewCrow->m_pCrowData->GetName(), szMAP_NAME );
GLMSG::SNET_SERVER_GENERALCHAT NetMsg;
NetMsg.SETTEXT ( strTEXT.GetString() );
GLGaeaServer::GetInstance().SENDTOAGENT ( &NetMsg );
}
m_listDelGlobID.push_back( dwGlobID );
if ( pNewCrow->IsGroupMember() )
{
ADD_GROUPMEMBER( pNewCrow->GetGroupName(), dwGlobID );
if( pNewCrow->IsGroupLeader() )
{
ADD_GROUPLEADER( pNewCrow->GetGroupName(), dwGlobID );
}
}
return dwGlobID;
}
DWORD GLLandMan::DropCrow ( SNATIVEID sNID, WORD wPosX, WORD wPosY, SNATIVEID sItemID )
{
D3DXVECTOR3 vPos(0,0,0);
m_sLevelAxisInfo.MapPos2MiniPos ( wPosX, wPosY, vPos.x, vPos.z );
return DropCrow ( sNID, vPos.x, vPos.z, sItemID );
}
GLLandMan.h
DWORD DropCrow ( SNATIVEID sNID, WORD wPosX, WORD wPosY, SNATIVEID sItemID = NATIVEID_NULL() );
DWORD DropCrow ( SNATIVEID sNID, float fPosX, float fPosY, SNATIVEID sItemID = NATIVEID_NULL() );
GLChar.cpp
Note: this must be replaced...
Keyword: m_pLandMan->DropCrow
m_pLandMan->DropCrow ( SNATIVEID(sQUESTIONITEM.wParam1,sQUESTIONITEM.wParam2), pItemDrop->vPos.x, pItemDrop->vPos.z, NATIVEID_NULL() );
GLGuidance.cpp
Note: same goes here...
Keyword: pLandMan->DropCrow
pLandMan->DropCrow( pGuid->m_vecAwardMob[n].nidGenMob,
pGuid->m_vecAwardMob[n].wGenPosX,
pGuid->m_vecAwardMob[n].wGenPosY,
NATIVEID_NULL() );
GLCrow.h
Keyword: LONGLONG m_lnCommission;
SNATIVEID m_sItemID;
DxGlobalStage.cpp(MsgProcess)
case NET_MSG_REQ_GETPLAYERSINMAP_FB:
case NET_MSG_GM_EVENT_SEEK_GETREWARD_FLD:
{
GLGaeaClient::GetInstance().MsgProcess ( nmg );
}
break;
GLGaeaClient.cpp
case NET_MSG_REQ_GETPLAYERSINMAP_FB:
case NET_MSG_GM_EVENT_SEEK_GETREWARD_FLD:
{
m_Character.MsgProcess ( nmg );
}
break;
GLCharacterMsg.cpp
case NET_MSG_REQ_GETPLAYERSINMAP_FB:
{
GLMSG::SNET_REQ_GETPLAYERSINMAP_FB *pNetMsg = (GLMSG::SNET_REQ_GETPLAYERSINMAP_FB*) nmg;
SITEM *pItem = GLItemMan::GetInstance().GetItem ( pNetMsg->sItemID );
if(!pItem)
break;
CInnerInterface::GetInstance().SetFightEnd ( CONFT_WIN_INDEX );
CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::PALEGREEN, ID2GAMEINTEXT("GETPLAYERSINMAP_TEXT_WIN"), pItem->GetName());
SetSTATE(EM_ACT_CONFT_WIN);
TurnAction ( GLAT_CONFT_END );
}
break;
case NET_MSG_GM_EVENT_SEEK_GETREWARD_FLD:
{
GLMSG::SNET_GM_EVENT_SEEK_GETREWARD_FLD *pNetMsg = (GLMSG::SNET_GM_EVENT_SEEK_GETREWARD_FLD*) nmg;
SITEM *pItem = GLItemMan::GetInstance().GetItem ( pNetMsg->sItemID );
if(!pItem)
break;
CInnerInterface::GetInstance().SetFightEnd ( CONFT_WIN_INDEX );
CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::PALEGREEN, ID2GAMEINTEXT("GETPLAYERSINMAP_TEXT_WIN"), pItem->GetName());
SetSTATE(EM_ACT_CONFT_WIN);
TurnAction ( GLAT_CONFT_END );
}
break;
GLCharacter.cpp(NpcReaction&&PlayerUpdate)
Keyword: SetDialogueWindowOpen
if ( dwML&(DXKEY_UP|DXKEY_DUP) )
{
PGLCROWCLIENT pCrow = GLGaeaClient::GetInstance().GetActiveMap()->GetCrow ( sTargetID.dwID );
if ( !pCrow ) return;
PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( pCrow->m_sNativeID );
if ( !pCrowData ) return;
m_dwNPCID = sTargetID.dwID;
if ( pCrow->m_sNativeID.wMainID == GLCONST_CHAR::wSEEKCROW_MID && pCrow->m_sNativeID.wSubID == GLCONST_CHAR::wSEEKCROW_SID )
{
ReqEventSeekReward( pCrow->GetCtrlID(), pCrow->m_sNativeID );
}
else
{
CInnerInterface::GetInstance().SetDialogueWindowOpen ( sTargetID, this );
}
}
Keyword: if ( bTALK ) CCursor::GetInstance().SetCursorType(CURSOR_TALK);
switch ( m_sACTAR.emACTAR )
{
case EMACTAR_NULL: CCursor::GetInstance().SetCursorType(CURSOR_NORMAL); break;
case EMACTAR_SUMMON_ATTACK: CCursor::GetInstance().SetCursorType(CURSOR_ATTACK); break;
case EMACTAR_PC_PVP: CCursor::GetInstance().SetCursorType(CURSOR_ATTACK); break;
case EMACTAR_MOB: CCursor::GetInstance().SetCursorType(CURSOR_ATTACK); break;
case EMACTAR_NPC:
{
bool bTALK(false);
PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap();
if ( pLAND )
{
PGLCROWCLIENT pCROW = pLAND->GetCrow(m_sACTAR.sTARID.dwID);
if ( pCROW )
{
if ( pCROW->m_sNativeID.wMainID == GLCONST_CHAR::wSEEKCROW_MID && pCROW->m_sNativeID.wSubID == GLCONST_CHAR::wSEEKCROW_SID )
{
bTALK = false;
}
else
{
if ( _tcslen(pCROW->m_pCrowData->GetTalkFile()) ) bTALK = true;
}
}
}
if ( bTALK ) CCursor::GetInstance().SetCursorType(CURSOR_TALK);
else CCursor::GetInstance().SetCursorType(CURSOR_NORMAL);
}
break;
GLCharactorReq.cpp
void GLCharacter::ReqEventSeekReward( DWORD dwID, SNATIVEID sCrowID )
{
PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( sCrowID );
if ( !pCrowData )
{
CInnerInterface::GetInstance().PrintConsoleText("Not a valid pCrowData.");
return;
}
if ( pCrowData->m_sBasic.sNativeID.wMainID != GLCONST_CHAR::wSEEKCROW_MID && pCrowData->m_sBasic.sNativeID.wSubID != GLCONST_CHAR::wSEEKCROW_SID )
{
CInnerInterface::GetInstance().PrintConsoleText("Incorrect NPC ID.");
return;
}
if ( pCrowData->m_emCrow != CROW_NPC )
{
CInnerInterface::GetInstance().PrintConsoleText("Not a valid NPC Type.");
return;
}
GLMSG::SNET_GM_EVENT_SEEK_GETREWARD NetMsg;
NetMsg.dwGaeaID = dwID;
NetMsg.sCrowID = sCrowID;
NetMsg.dwGaeaIDChar = GetCtrlID();
NETSEND(&NetMsg);
}
GLCharacter.h
void ReqEventSeekReward( DWORD dwID, SNATIVEID sCrowID );
default.charclass
SEEKCROW 65535 65535
gameintext.xml
<SENTENSE Ver="1" Id="GETPLAYERSINMAP_TEXT_WIN">
<VALUE Lang="pe">Obtained '%s' from event.</VALUE>
</SENTENSE>
Additional:
- you need to create an NPC type CROW in mobeditor and then the id of the crow that you created must be the same at the default.charclass which is the SEEKCROW
- event_seek must be one at a time, you can delete the mob by using mob_del
Credits:
#NaJDeV
#NoToResell