forked from metin2/client
213 lines
4.8 KiB
C++
213 lines
4.8 KiB
C++
#include "StdAfx.h"
|
|
|
|
/*
|
|
#include "PythonNetworkDatagram.h"
|
|
#include "PythonNetworkStream.h"
|
|
|
|
class CDatagramPacketHeaderMap : public CNetworkPacketHeaderMap
|
|
{
|
|
public:
|
|
CDatagramPacketHeaderMap()
|
|
{
|
|
Set(HEADER_CC_STATE_WALKING, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketCCState), false));
|
|
}
|
|
};
|
|
|
|
void CPythonNetworkDatagram::Destroy()
|
|
{
|
|
m_NetSenderPool.Clear();
|
|
}
|
|
|
|
BOOL CPythonNetworkDatagram::CheckPacket(TPacketHeader * piRetHeader)
|
|
{
|
|
static CDatagramPacketHeaderMap s_packetHeaderMap;
|
|
|
|
if (!m_NetReceiver.isBind())
|
|
return FALSE;
|
|
|
|
*piRetHeader = 0;
|
|
|
|
TPacketHeader header;
|
|
|
|
if (!m_NetReceiver.Peek(&header, sizeof(TPacketHeader)))
|
|
return false;
|
|
|
|
CNetworkPacketHeaderMap::TPacketType PacketType;
|
|
|
|
if (!s_packetHeaderMap.Get(header, &PacketType))
|
|
{
|
|
Tracef("Unknown UDP packet header");
|
|
assert(!"Unknown UDP packet header");
|
|
return FALSE;
|
|
}
|
|
|
|
if (!header)
|
|
return FALSE;
|
|
|
|
*piRetHeader = header;
|
|
return TRUE;
|
|
}
|
|
|
|
void CPythonNetworkDatagram::Process()
|
|
{
|
|
while (m_NetReceiver.Process())
|
|
{
|
|
TPacketHeader iHeader;
|
|
|
|
if (!CheckPacket(&iHeader))
|
|
continue;
|
|
|
|
switch(iHeader)
|
|
{
|
|
case HEADER_CC_STATE_WALKING:
|
|
RecvStateWalkingPacket();
|
|
break;
|
|
|
|
case HEADER_CC_STATE_WAITING:
|
|
case HEADER_CC_STATE_GOING:
|
|
case HEADER_CC_EVENT_NORMAL_ATTACKING:
|
|
case HEADER_CC_EVENT_COMBO_ATTACKING:
|
|
case HEADER_CC_EVENT_HIT:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CPythonNetworkDatagram::SetConnection(const char * c_szIP, WORD wPortIndex)
|
|
{
|
|
m_NetSender.SetSocket(c_szIP, wPortIndex);
|
|
}
|
|
|
|
void CPythonNetworkDatagram::SetRecvBufferSize(DWORD dwSize)
|
|
{
|
|
m_NetReceiver.SetRecvBufferSize(dwSize);
|
|
}
|
|
|
|
void CPythonNetworkDatagram::SendToServer(const void * c_pBuffer, DWORD dwSize)
|
|
{
|
|
if (!m_NetSender.isSocket())
|
|
{
|
|
assert(!"UDP Socket has not set!");
|
|
return;
|
|
}
|
|
|
|
m_NetSender.Send(c_pBuffer, dwSize);
|
|
}
|
|
|
|
void CPythonNetworkDatagram::Bind(DWORD dwAddress, WORD wPortIndex)
|
|
{
|
|
m_NetReceiver.Bind(dwAddress, wPortIndex);
|
|
}
|
|
|
|
void CPythonNetworkDatagram::RegisterSender(DWORD dwID, DWORD dwAddress, WORD wPortIndex)
|
|
{
|
|
CNetDatagramSender * pSender = m_NetSenderPool.Alloc();
|
|
|
|
pSender->SetSocket(dwAddress, wPortIndex);
|
|
|
|
m_NetSenderMap.insert(TNetSenderMap::value_type(dwID, pSender));
|
|
}
|
|
void CPythonNetworkDatagram::DeleteSender(DWORD dwID)
|
|
{
|
|
CNetDatagramSender * pSender;
|
|
if (!GetSenderPointer(dwID, &pSender))
|
|
return;
|
|
|
|
m_NetSenderPool.Free(pSender);
|
|
|
|
m_NetSenderMap.erase(dwID);
|
|
}
|
|
|
|
void CPythonNetworkDatagram::Select(DWORD dwID)
|
|
{
|
|
CNetDatagramSender * pSender;
|
|
if (!GetSenderPointer(dwID, &pSender))
|
|
return;
|
|
|
|
m_NetSenderList.push_back(pSender);
|
|
}
|
|
void CPythonNetworkDatagram::SendToSenders(const void * c_pBuffer, DWORD dwSize)
|
|
{
|
|
// NOTE : Temporary Code
|
|
// Now, Send to every around client.
|
|
for (TNetSenderMapIterator itorMap = m_NetSenderMap.begin(); itorMap != m_NetSenderMap.end(); ++itorMap)
|
|
{
|
|
CNetDatagramSender * pSender = itorMap->second;
|
|
m_NetSenderList.push_back(pSender);
|
|
}
|
|
// NOTE : Temporary Code
|
|
|
|
for (TNetSenderListIterator itor = m_NetSenderList.begin(); itor != m_NetSenderList.end(); ++itor)
|
|
{
|
|
CNetDatagramSender * pSender = *itor;
|
|
|
|
pSender->Send(c_pBuffer, dwSize);
|
|
}
|
|
|
|
m_NetSenderList.clear();
|
|
}
|
|
|
|
BOOL CPythonNetworkDatagram::GetSenderPointer(DWORD dwID, CNetDatagramSender ** ppSender)
|
|
{
|
|
TNetSenderMapIterator itor = m_NetSenderMap.find(dwID);
|
|
|
|
if (m_NetSenderMap.end() == itor)
|
|
return FALSE;
|
|
|
|
*ppSender = itor->second;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//////////////////////////////////
|
|
// Walking
|
|
|
|
void CPythonNetworkDatagram::SendCharacterStatePacket(DWORD dwVID, DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
|
|
{
|
|
fDstRot=fmod(fDstRot, 360.0f);
|
|
|
|
if (fDstRot<0)
|
|
fDstRot=360.0f-fDstRot;
|
|
|
|
TPacketCCState kStatePacket;
|
|
kStatePacket.bHeader=HEADER_CC_STATE_WALKING;
|
|
kStatePacket.dwVID=dwVID;
|
|
kStatePacket.bFunc=eFunc;
|
|
kStatePacket.bArg=uArg;
|
|
kStatePacket.bRot=fDstRot/5.0f;
|
|
kStatePacket.dwTime=dwCmdTime;
|
|
kStatePacket.kPPos=c_rkPPosDst;
|
|
//SendToSenders(&kStatePacket, sizeof(kStatePacket));
|
|
}
|
|
|
|
BOOL CPythonNetworkDatagram::RecvStateWalkingPacket()
|
|
{
|
|
TPacketCCState kStatePacket;
|
|
if (!m_NetReceiver.Recv(&kStatePacket, sizeof(kStatePacket)))
|
|
{
|
|
assert(!"CPythonNetworkDatagram::RecvStatePacket - PAKCET READ ERROR");
|
|
Tracenf("CPythonNetworkDatagram::RecvStatePacket - PAKCET READ ERROR");
|
|
return FALSE;
|
|
}
|
|
|
|
CInstanceBase * pkChrInst = CPythonCharacterManager::Instance().GetInstancePtr(kStatePacket.dwVID);
|
|
|
|
if (!pkChrInst)
|
|
{
|
|
//Tracenf("CPythonNetworkDatagram::RecvStatePacket - NOT EXIST VID(kStateWaitingPacket.vid = %d)", kStatePacket.m_dwVID);
|
|
return TRUE;
|
|
}
|
|
|
|
pkChrInst->PushUDPState(kStatePacket.dwTime, kStatePacket.kPPos, kStatePacket.bRot*5.0f, kStatePacket.bFunc, kStatePacket.bArg);
|
|
return TRUE;
|
|
}
|
|
|
|
CPythonNetworkDatagram::CPythonNetworkDatagram()
|
|
{
|
|
}
|
|
|
|
CPythonNetworkDatagram::~CPythonNetworkDatagram()
|
|
{
|
|
}
|
|
|
|
*/ |