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 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); } }