using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_SAVE_MYHOME_UGC), typeof(SaveMyhomeUgcPacketHandler), typeof(GameLoginListener))] internal class SaveMyhomeUgcPacketHandler : PacketRecvHandler { public static bool send_S2C_ACK_SAVE_MYHOME_UGC(Player owner, Result result, GS2C_ACK_SAVE_MYHOME_UGC res) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.AckSaveMyhomeUgc = res; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; } return true; } public override async Task onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage) { var result = new Result(); var err_msg = string.Empty; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var req_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}"); var request = req_msg.Request.ReqSaveMyhomeUgc; NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var res = new GS2C_ACK_SAVE_MYHOME_UGC(); var myhome_agent_action = player.getEntityAction(); var fn_transaction_runner = async delegate () { var result = new Result(); Myhome? myhome; if (request.MyhomeGuid == string.Empty) { result = myhome_agent_action.checkMyhomeSlot(); if (result.isFail()) { err_msg = $"Failed to checkMyhomeSlot() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } myhome = new Myhome(player.getUserGuid()); result = await myhome.onInit(); if (result.isFail()) { err_msg = $"Failed to onInit() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } var new_myhome_attribute = myhome.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(new_myhome_attribute, () => $"new_myhome_attribute is null !!! - {player.toBasicString()}"); new_myhome_attribute.newEntityAttribute(); } else { if (!myhome_agent_action.tryGetMyHome(request.MyhomeGuid, out myhome)) { err_msg = $"Failed to tryGetMyHome() !!! : myhomeGuid:{request.MyhomeGuid} - {player.toBasicString()}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } } var myhome_origin_attribute = myhome.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(myhome_origin_attribute, () => $"myhome_origin_attribute is null !!! - {player.toBasicString()}"); var old_myhome_ugc_info_s3_file_name = myhome_origin_attribute.MyhomeUgcInfoS3FileName; var myhome_action = myhome.getEntityAction(); (result, res, var business_logs) = await myhome_action.trySaveMyhomeUgcInfo(request.MyhomeName, request.MyhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to trySaveMyhomeUgcInfo() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } NullReferenceCheckHelper.throwIfNull(business_logs, () => $"business_logs is null !!! - {player.toBasicString()}"); // Mantis#3451 로 주석 처리 //var myhome_instance_room_infos = new List(); //var myhome_info = new MyHomeInfo(); var myhome_attribute = myhome.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!! - {player.toBasicString()}"); var new_myhome_ugc_info_s3_file_name = myhome_attribute.MyhomeUgcInfoS3FileName; // Mantis#3451 로 주석 처리 //if (myhome_attribute.SelectedFlag == 1) //{ // (result, myhome_instance_room_infos) = await InstanceRoomHandler.tryGetMyhomeInstanceRoomInfos(entity_player.getUserGuid()); // if (result.isFail()) // { // err_msg = $"Failed to tryGetMyhomeServers() !!! : {result.toBasicString()}"; // Log.getLogger().error(err_msg); // send_S2C_ACK_SAVE_MYHOME_UGC(entity_player, result, res); // return result; // } // myhome_info = myhome_action.toMyHomeInfo(); //} result = await myhome_action.tryUploadMyhomeUgcInfoToS3(); if (result.isFail()) { err_msg = $"Failed to tryUploadMyhomeUgcInfoToS3() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } var rental_agent_action = player.getEntityAction(); var batch = new QueryBatchEx(player, LogActionType.SaveMyhome, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); batch.addQuery(new QueryFinal(), onCommit); } batch.appendBusinessLogs(business_logs); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { await MyhomeHelper.deleteMyhomeUgcInfo(request.MyhomeGuid, new_myhome_ugc_info_s3_file_name); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); return result; } await MyhomeHelper.deleteMyhomeUgcInfo(request.MyhomeGuid, old_myhome_ugc_info_s3_file_name); var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents); NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}"); res.CommonResult = found_transaction_runner.getCommonResult(); send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); if (rental_agent_action.isRentalMyhome(request.MyhomeGuid)) { if (res.ModigyUgcNpcStateInfos.Count > 0) { var add_ugc_npc_guids = new List(); var delete_ugc_npc_guids = new List(); foreach (var (ugc_npc_guid, ugc_npc_state_info) in res.ModigyUgcNpcStateInfos) { switch (ugc_npc_state_info.StateType) { case EntityStateType.None: { delete_ugc_npc_guids.Add(ugc_npc_guid); } break; case EntityStateType.UsingByMyHome: { add_ugc_npc_guids.Add(ugc_npc_guid); } break; } } var (land_meta_id, buidling_meta_id, floor) = rental_agent_action.getAddrressFromMyhome(request.MyhomeGuid); var modify_floor_linked_infos = new List(); if (add_ugc_npc_guids.Count > 0) { var add_modify_floor_linked_info = MapHelper.makeModifyFloorLinkedInfo(ModifyType.Add, land_meta_id, buidling_meta_id, floor, add_ugc_npc_guids); modify_floor_linked_infos.Add(add_modify_floor_linked_info); } if (delete_ugc_npc_guids.Count > 0) { var delete_modify_floor_linked_info = MapHelper.makeModifyFloorLinkedInfo(ModifyType.Delete, land_meta_id, buidling_meta_id, floor, delete_ugc_npc_guids); modify_floor_linked_infos.Add(delete_modify_floor_linked_info); } MapNotifyHelper.sendNtfModifyFloorLinkedInfos(modify_floor_linked_infos); } } // Mantis#3451 로 주석 처리 //foreach (var myhome_instance_room_info in myhome_instance_room_infos) //{ // var server_name = ServerHelper.makeServerNameByNetworkAddress(ServerType.Indun, myhome_instance_room_info.InstanceAddress, (ushort)myhome_instance_room_info.InstancePort); // MyhomeNotifyHelper.send_GS2GS_NTF_EXCHANGE_MYHOME(server_name, myhome_instance_room_info.roomId, request.MyhomeGuid, myhome_info); //} if (request.MyhomeGuid == string.Empty) { myhome_agent_action.addMyhome(myhome_attribute.MyhomeGuid, myhome); } return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "SaveMyhomeUgc", fn_transaction_runner); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } int npc_prop_count = request.MyhomeUgcInfo.AnchorInfos.Count(ugc_anchor_info => ugc_anchor_info.isNpcProp()); //지금 beacon만 들어간다는데 나중에 다른거 들어갈경우, 문자열 enum처리 await QuestManager.It.QuestCheck(player, new QuestInteriroMode(EQuestEventTargetType.INTERIORMODE, EQuestEventNameType.COMPLETED, "BEACON", npc_prop_count)); return result; } async Task onCommit(QueryExecutorBase query) { await Task.CompletedTask; return QueryBatchBase.QueryResultType.Success; } }