using ServerCommon; using ServerCore; using ServerBase; using META_ID = System.UInt32; using ANCHOR_GUID = System.String; using USER_GUID = System.String; using Google.Protobuf.WellKnownTypes; using GameServer.PacketHandler; namespace GameServer { public class CraftHelpAction : EntityActionBase { public CraftHelpAction(Player owner) : base(owner) { } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } public override void onClear() { return; } public async Task CraftHelpProcess(ANCHOR_GUID anchor_guid) { 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 dynamo_db_client = server_logic.getDynamoDbClient(); var game_zone_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}"); var crafting_anchor = game_zone_action.GetAnchor(anchor_guid); if (crafting_anchor == null) { err_msg = $"anchor is not placed !!! - {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftingAnchorIsNotPlaced, err_msg); Log.getLogger().error(err_msg); HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } var room_id = player.getCurrentInstanceRoomId(); result = MyhomeHelper.getMyhomeOwnerUserGuidAndMyhomeGuidFromRoomId(room_id, out var target_guid, out var myhome_guid); var fn_craft_help = async delegate () { var result = new Result(); var err_msg = string.Empty; var invokers = new List(); //대상 CraftDoc의 FinishTime값 변경 (result, var target_craft_doc) = await changeTargetCraftTime(target_guid, anchor_guid); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } NullReferenceCheckHelper.throwIfNull(target_craft_doc, () => $"target_craft_doc is null !!! - {player.toBasicString()}"); var craft_attrib = target_craft_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(craft_attrib, () => $"craft_attrib is null !!! - {player.toBasicString()}"); var finish_time = Timestamp.FromDateTime(craft_attrib.CraftFinishTime); var task_craft_log_data = CraftBusinessLogHelper.toCraftLogInfo(craft_attrib); invokers.Add(new CraftBusinessLog(task_craft_log_data)); //나의 CraftHelpDoc 변경 result = changeCraftHelp(target_guid); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } var craft_help_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(craft_help_attribute, () => $"craft_help_attribute is null !!! - {player.toBasicString()}"); var task_log_data = CraftBusinessLogHelper.toCraftHelpLogInfo(craft_help_attribute); invokers.Add(new CraftHelpBusinessLog(task_log_data)); //대상 CraftHelpDoc 변경 (result, var target_craft_help_doc) = await changeTargetCraftHelp(target_guid); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } NullReferenceCheckHelper.throwIfNull(target_craft_help_doc, () => $"target_craft_help_doc is null !!! - {player.toBasicString()}"); var target_craft_help_attrib = target_craft_help_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(target_craft_help_attrib, () => $"target_craft_help_attrib is null !!! - {player.toBasicString()}"); var task_target_log_data = CraftBusinessLogHelper.toCraftHelpLogInfo(target_craft_help_attrib); invokers.Add(new CraftHelpBusinessLog(task_target_log_data)); //도움 보상 처리 (result, var received_item_list) = await TakeHelpReward(); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } //동기화를 위한 redis작업 var request = new CraftHelpCacheRequest(player, server_logic.getRedisConnector(), target_guid); result = await request.UpsertCraftHelp(player.getUserGuid()); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } //타 서버 패킷 전송을 위한 데이터 받아오기 (result, var myhome_instance_room_infos) = await getInstanceRoomInfos(target_guid, myhome_guid); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } var batch = new QueryBatchEx(player, LogActionType.CraftHelp , dynamo_db_client, true); { batch.addQuery(new DBQEntityWrite(new List() { target_craft_help_doc, target_craft_doc })); batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } batch.appendBusinessLogs(invokers); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result); return result; } HelpCraftPacketHandler.send_S2C_ACK_HELP_CRAFT(player, result, received_item_list, craft_help_attribute.HelpUserGuids.Count); game_zone_action.broadcast(player, CraftNotifyHelper.makeNtfCraftUpdatePacket(anchor_guid, finish_time)); var player_manager = server_logic.getPlayerManager(); if (player_manager.tryGetUserByPrimaryKey(target_guid, out var found_user) == true) { var craft_action = found_user.getEntityAction(); NullReferenceCheckHelper.throwIfNull(craft_action, () => $"craft_action is null !!! - {player.toBasicString()}"); craft_action.setUpdateCraft(true); } foreach (var myhome_instance_room_info in myhome_instance_room_infos) { var server_name = ServerBase.ServerHelper.makeServerNameByNetworkAddress(ServerType.Indun, myhome_instance_room_info.InstanceAddress, (ushort)myhome_instance_room_info.InstancePort); CraftNotifyHelper.send_GS2GS_NTF_CraftUpdate(server_name, room_id, anchor_guid, finish_time, target_guid, target_craft_help_attrib.HelpedUserGuids.Count, player.getUserNickname()); } return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CraftHelp", fn_craft_help); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } return result; } private async Task<(Result, List)> getInstanceRoomInfos(string myhomeOwnerGuid, string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; var myhome_instance_room_infos = new List(); (result, myhome_instance_room_infos) = await InstanceRoomHandler.tryGetMyhomeInstanceRoomInfos(myhomeOwnerGuid, myhomeGuid); if (result.isFail()) { err_msg = $"Failed to tryGetMyhomeServers() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, myhome_instance_room_infos); } return (result, myhome_instance_room_infos); } public async Task<(Result, List)> TakeHelpReward() { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var inventory_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {player.toBasicString()}"); var received_item_list = new List(); (result, var new_item_list) = await inventory_action.tryTakalbleToBag((META_ID)MetaHelper.GameConfigMeta.CraftingHelpGetItemId, (ushort)MetaHelper.GameConfigMeta.CraftingHelpGetItemValue); if (result.isFail()) { return (result, received_item_list); } received_item_list.AddRange(new_item_list); return (result, received_item_list); } public async Task<(Result, DynamoDbDocBase?)> changeTargetCraftTime(USER_GUID target_guid, ANCHOR_GUID anchor_guid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); var doc = new CraftDoc(target_guid, anchor_guid); var query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(doc.getPK(), doc.getSK()); (result, var target_craft_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (target_craft_docs.Count == 0) { err_msg = $"Crafting Doc is empty !!! target userGuid:{target_guid} - {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftDocIsEmpty, err_msg); Log.getLogger().error(err_msg); return (result, null); } var target_craft_attrib = target_craft_docs[0].getAttrib(); NullReferenceCheckHelper.throwIfNull(target_craft_attrib, () => $"target_craft_attrib is null !!!"); if (target_craft_attrib.CraftFinishTime <= DateTimeHelper.Current) { err_msg = $"Crafting Already Finish, can't help the craft !!! : target guid :{target_guid} anchor_guid :{anchor_guid}- {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftingAlreadyFinish, err_msg); Log.getLogger().info(err_msg); return (result, null); } target_craft_attrib.CraftFinishTime = target_craft_attrib.CraftFinishTime.AddMinutes(MetaHelper.GameConfigMeta.CraftingHelpReduceTime * -1); target_craft_docs[0].setQueryType(QueryType.Update); return (result, target_craft_docs[0]); } public Result changeCraftHelp(USER_GUID target_guid) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var craft_help_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(craft_help_attribute, () => $"craft_help_attribute is null !!! - {player.toBasicString()}"); if (craft_help_attribute.CraftHelpUpdateDay < DateTime.UtcNow.Date) { craft_help_attribute.HelpUserGuids.Clear(); craft_help_attribute.HelpedUserGuids.Clear(); craft_help_attribute.CraftHelpUpdateDay = DateTime.UtcNow.Date; craft_help_attribute.modifiedEntityAttribute(); } int same_User_Count = 1; foreach (var user_guid in craft_help_attribute.HelpUserGuids) { if (user_guid == target_guid) { same_User_Count += 1; break; } } if (craft_help_attribute.HelpUserGuids.Count >= MetaHelper.GameConfigMeta.CraftingHelpLimitCount) { err_msg = $"Crafting help Count Over !!! - {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftingHelpCountOver, err_msg); Log.getLogger().info(err_msg); return result; } if (same_User_Count > MetaHelper.GameConfigMeta.CraftingHelpLimitCountSameUser) { err_msg = $"Crafting help Same User Count Over !!! : target guid :{target_guid} - {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftingHelpSameUserCountOver, err_msg); Log.getLogger().info(err_msg); return result; } craft_help_attribute.HelpUserGuids.Add(target_guid); craft_help_attribute.modifiedEntityAttribute(); return result; } public async Task<(Result, DynamoDbDocBase?)> changeTargetCraftHelp(USER_GUID target_guid) { 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 dynamo_db_client = server_logic.getDynamoDbClient(); var doc = new CraftHelpDoc(target_guid); var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK()); (result, var read_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (read_docs.Count == 0) { err_msg = $"Crafting help Doc is empty !!! target userGuid:{target_guid} - {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftHelpDocIsEmpty, err_msg); Log.getLogger().error(err_msg); return (result, null); } var target_craft_help_attrib = read_docs[0].getAttrib(); NullReferenceCheckHelper.throwIfNull(target_craft_help_attrib, () => $"pltarget_craft_help_attribayer is null !!! - {player.toBasicString()}"); if (target_craft_help_attrib.CraftHelpUpdateDay < DateTime.UtcNow.Date) { target_craft_help_attrib.HelpUserGuids.Clear(); target_craft_help_attrib.HelpedUserGuids.Clear(); } if (target_craft_help_attrib.HelpedUserGuids.Count >= MetaHelper.GameConfigMeta.CraftingHelpLimitCountReceive) { err_msg = $"Crafting help Same User Count Over !!! : target guid :{target_guid}- {getOwner().toBasicString()}"; result.setFail(ServerErrorCode.CraftingHelpReceivedCountOver, err_msg); Log.getLogger().info(err_msg); return (result, null); } target_craft_help_attrib.HelpedUserGuids.Add(player.getUserGuid()); target_craft_help_attrib.CraftHelpUpdateDay = DateTime.UtcNow.Date; read_docs[0].setQueryType(QueryType.Update); return (result, read_docs[0]); } public Result cheatChangeCraftHelpInit() { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var craft_help_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(craft_help_attribute, () => $"craft_help_attribute is null !!! - {player.toBasicString()}"); craft_help_attribute.HelpUserGuids.Clear(); craft_help_attribute.HelpedUserGuids.Clear(); craft_help_attribute.CraftHelpUpdateDay = DateTime.UtcNow.Date; craft_help_attribute.modifiedEntityAttribute(); return result; } } }