초기커밋
This commit is contained in:
356
GameServer/Contents/Craft/Action/CraftHelpAction.cs
Normal file
356
GameServer/Contents/Craft/Action/CraftHelpAction.cs
Normal file
@@ -0,0 +1,356 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user