using Amazon.OpenSearchService.Model.Internal.MarshallTransformations; using Amazon.Runtime.Internal.Endpoints.StandardLibrary; using Amazon.Runtime.Internal.Transform; using GameServer.PacketHandler; using Google.Protobuf.WellKnownTypes; using Nettention.Proud; using RabbitMQ.Client; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GameServer { public class EscapeAction : EntityActionBase { public EscapeAction(EntityBase owner) : base(owner) { } public override void onClear() { return; } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } public async Task ProcessEscapePosition() { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var game_zone_action = player.getEntityAction(); if (game_zone_action == null) { err_msg = $"Fail to get Game Zone Action : {nameof(GameZoneAction)}."; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); EscapePositionPacketHandler.send_S2C_ACK_ESCAPE_POSITION(player, result, null, 0); return result; } var location_action = player.getEntityAction(); if (location_action == null) { err_msg = $"Fail to get Location Action : {nameof(LocationAction)}."; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); EscapePositionPacketHandler.send_S2C_ACK_ESCAPE_POSITION(player, result, null, 0); return result; } result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "EscapePosition", delegateEscapePosition); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; async Task delegateEscapePosition() => await escapePosition(player); } private async Task escapePosition(Player owner) { var result = new Result(); var err_msg = string.Empty; var escape_position_attribute = owner.getEntityAttribute(); if (escape_position_attribute == null) { err_msg = $"Failed to get escape position attribute : {nameof(EscapePositionAttribute)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); return result; } DateTime nowDT = DateTime.UtcNow; if (nowDT < escape_position_attribute.escape_available_time) { err_msg = $"time remain availableTime : {escape_position_attribute.escape_available_time}, now : {nowDT}"; result.setFail(ServerErrorCode.EscapePositionNotAvailableTime, err_msg); Log.getLogger().error(err_msg); long remainTime = (long)((escape_position_attribute.escape_available_time - nowDT).TotalMinutes + 1); EscapePositionPacketHandler.send_S2C_ACK_ESCAPE_POSITION(owner, result, null, remainTime); return result; } var game_zone_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!"); var location_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!!"); var current_pos = location_action.getCurrentPos(); if (game_zone_action.GetNearestStartPoint(current_pos, out var nearest_start_point) == false) { err_msg = $"Fail to get Not Exist Map."; result.setFail(ServerErrorCode.NotExistMap, err_msg); Log.getLogger().error(err_msg); return result; } escape_position_attribute.escape_available_time = nowDT.AddMinutes(MetaHelper.GameConfigMeta.EscapeCoolTime); escape_position_attribute.modifiedEntityAttribute(true); var log_invoker = new EscapePositionBusinessLog(current_pos, nearest_start_point); var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(owner, LogActionType.UpdateEscape , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } //Log 추가 batch.appendBusinessLog(log_invoker); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { EscapePositionPacketHandler.send_S2C_ACK_ESCAPE_POSITION(owner, result, null, 0); return result; } EscapePositionPacketHandler.send_S2C_ACK_ESCAPE_POSITION(owner, result, nearest_start_point, 0); return result; } public async Task cheatResetEscapePosition() { var player = getOwner() as Player; ArgumentNullException.ThrowIfNull(player); var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic); var result = new Result(); var fn_escape_position = async delegate () { var result = new Result(); var err_msg = string.Empty; var escape_position_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(escape_position_attribute, () => $"escape_position_attribute is null !!!"); escape_position_attribute.escape_available_time = escape_position_attribute.escape_available_time.AddSeconds(-86400); escape_position_attribute.modifiedEntityAttribute(true); var batch = new QueryBatchEx(player, LogActionType.CheatCommandResetEscapePosition, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } var log_invoker = new EscapePositionResetBusinessLog(); batch.appendBusinessLog(log_invoker); result = await QueryHelper.sendQueryAndBusinessLog(batch); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CheatEscapePosition", fn_escape_position); if (result.isFail()) { var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } } } }