Files
caliverse_server/GameServer/Contents/Craft/Action/CraftHelpAction.cs
2025-05-01 07:20:41 +09:00

357 lines
16 KiB
C#

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<Result> onInit()
{
var result = new Result();
return Task.FromResult(result);
}
public override void onClear()
{
return;
}
public async Task<Result> 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<GameZoneAction>();
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<ILogInvoker>();
//대상 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<CraftAttrib>();
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<CraftHelpAttribute>();
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<CraftHelpAttrib>();
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<QueryRunnerWithDocument>(player, LogActionType.CraftHelp
, dynamo_db_client, true);
{
batch.addQuery(new DBQEntityWrite(new List<DynamoDbDocBase>() { 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<CraftAction>();
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<InstanceRoomInfo>)> getInstanceRoomInfos(string myhomeOwnerGuid, string myhomeGuid)
{
var result = new Result();
var err_msg = string.Empty;
var myhome_instance_room_infos = new List<InstanceRoomInfo>();
(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<Item>)> 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<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {player.toBasicString()}");
var received_item_list = new List<Item>();
(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<CraftDoc>(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<CraftAttrib>();
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<CraftHelpAttribute>();
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<CraftHelpDoc>(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<CraftHelpAttrib>();
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<CraftHelpAttribute>();
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;
}
}
}