<PDL>
<packet name="S_BroadcastEnterGame">
<int name="playerId"/>
<float name="posX"/>
<float name="posY"/>
<float name="posZ"/>
</packet>
<packet name="C_LeaveGame">
</packet>
<packet name="S_BroadcastLeaveGame">
<int name="playerId"/>
</packet>
<packet name="S_PlayerList">
<list name="player">
<bool name="isSelf"/>
<int name="playerId"/>
<float name="posX"/>
<float name="posY"/>
<float name="posZ"/>
</list>
</packet>
<packet name="C_Move">
<float name="posX"/>
<float name="posY"/>
<float name="posZ"/>
</packet>
<packet name="S_BroadcastMove">
<int name="playerId"/>
<float name="posX"/>
<float name="posY"/>
<float name="posZ"/>
</packet>
</PDL>
서버측에서 해당 플레이어가 들어오면 주변 모든 플레이어들에게 전송할 목적인 패킷
해당 플레이어가 떠날때 클라이언트 쪽에서 떠남을 알리는 패킷
어떤 유저가 떠났는지 주변 유저들에게 뿌리는 목적인 패킷
해당 유저에게 주변에 어떤 유저들이 있는지 알려주기 위한 패킷.
해당 유저가 이동할 때 어디로 갈 것인지 좌표가 들어있는 패킷. 참고로 playerId가 없는 이유는 패킷을 전송할 때 어떤 세션에서 전송되었는지 정보가 같이 포함이 되는데 ClientSession에 자신의 playerId가 포함되어 있기 때문에 굳이 넣어주지 않아도 된다.
마찬가지로 이동할때 주변 유저들에게 알리는 용도
public void Enter(ClientSession session)
{
_sessions.Add(session);
session.Room = this;
S_PlayerList players = new S_PlayerList();
foreach(ClientSession s in _sessions)
{
players.players.Add(new S_PlayerList.Player() {
isSelf = (s == session),
playerId = s.SessionId,
posX = s.PosX,
posY = s.PosY,
posZ = s.PosZ,
});
}
session.Send(players.Write());
S_BroadcastEnterGame enter = new S_BroadcastEnterGame();
enter.playerId = session.SessionId;
enter.posX = 0;
enter.posY = 0;
enter.posZ = 0;
Broadcast(enter.Write());
}
자기 자신을 포함한 세션에 추가된 모든 유저(ClientSession에 playerId와 좌표가 존재)를 돌면서 새로 만든 S_PlayerList 패킷에 담은 다음, 자기 자신(session 변수)에 Send하는 코드이다. 입장할때 주변 유저들에게 알리기 위한 목적으로 만든 패킷에 자신의 아이디와 (0,0,0) 좌표를 담고 Broadcast해주면 JobTimer에서 설정한 0.25초마다 한번씩 브로드캐스팅 해줄 것이다.
이번시간에는 테스트만 할 것이기 때문에 플레이어 이동은 좌표를 랜덤한 값으로 넣어주고, 서버에 올리는 것까지만 한다.
다음과 같이 SessionManager에서 정의하면 DummyClient의 Program 클래스의 Main함수에서 0.25초마다 SendForEach 함수를 실행시켜주는데 그때마다 이동패킷을 만들고 서버로 보내는 것까지 구현했다.
Random _rand = new Random();
public void SendForEach()
{
lock (_lock)
{
foreach (ServerSession session in _sessions)
{
C_Move movePacket = new C_Move();
movePacket.posX = _rand.Next(-50, 50);
movePacket.posY = 0;
movePacket.posZ = _rand.Next(-50, 50);
session.Send(movePacket.Write());
}
}
}