357 lines
16 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|