Files
caliverse_server/GameServer/Contents/GameMode/PacketHandler/GameObjectInteractionPacketHandler.cs
2025-05-01 07:23:28 +09:00

121 lines
5.4 KiB
C#

using GameServer.Contents.GameMode.Helper;
using GameServer.Contents.GameMode.Manage.PlayManage;
using Google.Protobuf;
using ServerBase;
using ServerCommon;
using ServerCore;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_GAME_OBJECT_INTERACTION), typeof(GameObjectInteractionPacketHandler), typeof(GameLoginListener))]
public class GameObjectInteractionPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
await Task.CompletedTask;
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var player = session as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var req_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
var request = req_msg.Request.ReqGameObjectInteraction;
if (null == request)
{
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, "");
return result;
}
var anchor_guid = request.AnchorGuid;
ArgumentNullReferenceCheckHelper.throwIfNull(anchor_guid, () => $"anchor_guid is null !!! - {player.toBasicString()}");
var paacket_create_time = request.PacketCreateTime;
ArgumentNullReferenceCheckHelper.throwIfNull(paacket_create_time, () => $"paacket_create_time is null !!! - {player.toBasicString()}");
DateTime interaction_time = paacket_create_time.ToDateTime();
var room_id = player.getCurrentInstanceRoomId();
if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
{
err_msg = $"gameMode is null : room_id - {room_id}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
var game_mode_base = gameMode as GameModeBase;
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_moce_base is null !!!");
if (false == MapDataTable.Instance.getAnchor(anchor_guid, out var anchor))
{
err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
if(false == game_mode_base.getInstanceRoom().getMap().getAnchors().TryGetValue(anchor_guid, out var anchor2))
{
err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
var anchor_info = game_mode_base.getInstanceRoom().getMap().findAnchorInfo(anchor_guid);
if(anchor_info is null)
{
err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
var interact_action = GameModeHelper.getObjectInteractAction(game_mode_base, anchor); //kihoon todo : 어떤 anchor를 가져다 쓸지 추후 확인 필요
if (interact_action is null)
{
err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}";
Log.getLogger().error(err_msg);
result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg);
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
result = await interact_action.interact(anchor_guid, interaction_time);
if (result.isFail())
{
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid);
return result;
}
public bool send_S2C_ACK_GAME_OBJECT_INTERACTION(Player player, Result result, string anchorGuid)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.AckGameObjectInteraction = new ClientToGameRes.Types.GS2C_ACK_GAME_OBJECT_INTERACTION();
ack_packet.Response.AckGameObjectInteraction.AnchorGuid = anchorGuid;
return GameServerApp.getServerLogic().onSendPacket(player, ack_packet);
}
}