Files
a301_mmo_game_server/MMOTestServer/MMOserver/Game/Service/TransformPlayerHandler.cs
2026-04-03 01:38:36 +09:00

60 lines
1.8 KiB
C#

using LiteNetLib;
using MMOserver.Game.Channel;
using MMOserver.Game.Channel.Maps;
using MMOserver.Packet;
using ProtoBuf;
using Serilog;
using ServerLib.Packet;
using ServerLib.Service;
namespace MMOserver.Game.Service;
/*
* 플레이어 위치/방향 업데이트 핸들러
*/
public partial class GameServer : ServerBase
{
private void OnTransformPlayer(NetPeer peer, int hashKey, byte[] payload)
{
TransformPlayerPacket packet = Serializer.Deserialize<TransformPlayerPacket>(new ReadOnlyMemory<byte>(payload));
ChannelManager cm = ChannelManager.Instance;
int channelId = cm.HasUser(hashKey);
if (channelId < 0)
{
return;
}
// 채널 내 플레이어 위치/방향 상태 갱신
Player? player = cm.GetChannel(channelId).GetPlayer(hashKey);
if (player == null)
{
return;
}
AMap? map = cm.GetChannel(channelId).GetMap(player.CurrentMapId);
if (map == null)
{
return;
}
player.Position.X = packet.Position.X;
player.Position.Y = packet.Position.Y;
player.Position.Z = packet.Position.Z;
player.RotY = packet.RotY;
// 같은 맵 유저들에게 위치/방향 브로드캐스트 (나 제외)
byte[] data = PacketSerializer.Serialize((ushort)PacketCode.TRANSFORM_PLAYER, packet);
int mapId = player.CurrentMapId;
int zoneId = player.CurrentZoneId;
// 유저가 이동가는한 공간을 탈출하면 일단 리턴
if (!map.UpdatePlayerZone(hashKey, player))
{
Log.Warning("플레이어 이동이 불가는한 공간에 이동했습니다.");
return;
}
BroadcastToNear(channelId, mapId, zoneId, player.Position, data, peer, DeliveryMethod.Unreliable);
}
}