using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using static ClientToGameReq.Types; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_CALIUM_CONVERTER), typeof(GetCaliumConverterInfoPacketHandler), typeof(GameLoginListener))] public class GetCaliumConverterInfoPacketHandler : PacketRecvHandler { private static void send_S2C_ACK_CALIUM_CONVERTER(Player owner, Result result, double calium, float caliumForUser, float caliumEfficiency) { var ack_packet = new ClientToGame { Response = new ClientToGameRes { ErrorCode = result.ErrorCode, AckCaliumConverter = new() } }; if (result.isSuccess()) { ack_packet.Response.AckCaliumConverter.Calium = calium; ack_packet.Response.AckCaliumConverter.CaliumEfficiency = caliumEfficiency; ack_packet.Response.AckCaliumConverter.CaliumForUser = caliumForUser; } GameServerApp.getServerLogic().onSendPacket(owner, ack_packet); } public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { var result = new Result(); string err_msg; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); // 1. 기본 정보 체크 var request = (recvMessage as ClientToGame)?.Request.ReqCaliumConverter; if (null == request) { err_msg = $"Failed to get request type !!! : {nameof(ClientToGame.Request.ReqCaliumConverter)}"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_CALIUM_CONVERTER(player, result, 0, 0, 0); return result; } result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "GetCaliumConverterInfo", getCaliumConverterInfoDelegase); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_CALIUM_CONVERTER(player, result, 0, 0, 0); return result; } // 2. 총 칼리움 잔여량 체크 var calium_converter = GameServerApp.getServerLogic().findGlobalEntity(); NullReferenceCheckHelper.throwIfNull(calium_converter, () => $"calium converter is null !!!"); var calium_storage_action = calium_converter.getEntityAction(); NullReferenceCheckHelper.throwIfNull(calium_storage_action, () => $"calium_storage_action is null !!! - {calium_converter.toBasicString()}"); var calium = calium_storage_action.getTotalCalium(CaliumStorageType.Converter); if (calium < 0) { err_msg = $"Failed to load calium !!! : {nameof(calium_storage_action.getTotalCalium)}"; result.setFail(ServerErrorCode.FailToLoadCalium, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_CALIUM_CONVERTER(player, result, 0, 0, 0); return result; } // 3. 변환 에너지 효율 체크 var calium_efficiency = await calium_storage_action.getCaliumConverterEfficiency(); // 4. 일일 제공 잔여량 체크 var user_calium_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_calium_attribute, () => $"user_calium_attribute is null !!! - {player.toBasicString()}"); send_S2C_ACK_CALIUM_CONVERTER(player, result, calium, (float)user_calium_attribute.DailyCalium, (float)calium_efficiency); return result; async Task getCaliumConverterInfoDelegase() => await getCaliumConverterInfoAsync(player); } private async Task getCaliumConverterInfoAsync(Player player) { var result = new Result(); var current_pivot_date = CaliumStorageHelper.CurrentPivotTimeDate(); var is_create = false; // 1. attribute 가져오기 var attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"CaliumAttribute is null !!! - {player.toBasicString()}"); // 2. origin doc 이 없으면 신규 생성 처리 var origin_doc = attribute.getOriginDocBase(); if (null == origin_doc) { var new_doc = new CaliumDoc(player.getUserGuid()); var attrib = new_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(attrib, () => $"CaliumAttrib is null !!! - {player.toBasicString()}"); attrib.DailyCalium = (double)MetaHelper.GameConfigMeta.CaliumConverterLimitPerPerson; attrib.ProvidedDate = current_pivot_date; attribute.copyEntityAttributeFromDoc(new_doc); attribute.newEntityAttribute(); is_create = true; } // 3. 일일 지급 갱신 주기 체크 if (null != origin_doc && attribute.ProvidedDate >= current_pivot_date) { return result; } if (false == is_create) { attribute.DailyCalium = (double)MetaHelper.GameConfigMeta.CaliumConverterLimitPerPerson; attribute.ProvidedDate = current_pivot_date; attribute.modifiedEntityAttribute(); } // 4. db 갱신 var batch = new QueryBatchEx( player, LogActionType.ChangeConvertCaliumInfo, GameServerApp.getServerLogic().getDynamoDbClient(), true); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); batch.addQuery(new QueryFinal()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); return result; } }