초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,476 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Numerics;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using NPC_UNIQUE_ID = System.String;
using UGC_NPC_META_GUID = System.String;
using FARMING_PROP_DOC_SK = System.String;
using ANCHOR_META_GUID = System.String;
using MASTER_GUID = System.String;
using GUARD_KEY = System.String;
namespace GameServer;
public class FarmingAction : EntityActionBase
{
private FarmingEffect? m_progress_farming_nullable = null;
public FarmingAction(EntityBase owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
public async Task<Result> resetFarmingState(bool isApplyDb = true)
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
if (owner is UgcNpc ugc_npc)
{
var ugc_npc_action = ugc_npc.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! - {ugc_npc.toBasicString()}");
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {ugc_npc.toBasicString()}");
if(EntityStateType.UsingByFarming == ugc_npc_attribute.State)
{
ugc_npc_action.resetPos(isApplyDb);
if(true == isApplyDb)
{
(result, var ugc_npc_doc) = await ugc_npc_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(ugc_npc_doc, () => $"ugc_npc_doc is null !!! - {ugc_npc.toBasicString()}");
result = await db_client.simpleUpdateDocumentWithDocType(ugc_npc_doc);
if (result.isFail())
{
err_msg = $"Failed to simpleUpdateDocumentWithDocType() !!! in resetFarmingState() : {result.toBasicString()} - {ugc_npc.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var origin_entity_attribute = ugc_npc.getOriginEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(origin_entity_attribute, () => $"origin_entity_attribute is null !!! - {ugc_npc.toBasicString()}");
origin_entity_attribute.copyEntityAttributeFromDoc(ugc_npc_doc);
Log.getLogger().debug($"UgcNpc reset of State !!! in resetFarmingState() : {ugc_npc.toStateString()} - {ugc_npc.toBasicString()}");
}
}
}
return result;
}
public async Task<(Result, FarmingEffect?)> tryStartFarming( ANCHOR_META_GUID anchorMetaGuid, Int16 farmingActionTryCount )
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var game_zone_action = owner.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
var curr_map = game_zone_action.getLinkedToMap();
if(null == curr_map)
{
// 현재 UgcNpc 타입만 해당되는 로직 이다.
// 추후 인던 관련 설계가 리펙토링되면 재정의된 Map 반환(Master가 입장한 Map 반환) 함수로 처리해야 한다. - kangms
(result, curr_map) = owner.getCurrMapOfMaster();
if(result.isFail())
{
return (result, null);
}
}
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!!");
// 파밍중인 Anchor 인가?
var found_farming_effect = curr_map.findFarmingEffect(anchorMetaGuid);
if(null != found_farming_effect)
{
err_msg = $"Already farming !!! : anchorMetaGuid:{anchorMetaGuid} - {curr_map.toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.FarmingAlready, err_msg);
return (result, null);
}
// 파밍 객체를 생성 한다.
var farming_effect = new FarmingEffect( owner, curr_map);
result = await farming_effect.onInit();
if (result.isFail())
{
return (result, null);
}
var farming_effect_action = farming_effect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(farming_effect_action, () => $"farming_effect_action is null !!! - {owner.toBasicString()}");
// 파밍을 시도해 본다 !!!
result = await farming_effect_action.tryStartEffect( anchorMetaGuid, farmingActionTryCount );
if (result.isFail())
{
return (result, null);
}
if (owner is UgcNpc ugc_npc)
{
var ugc_npc_action = ugc_npc.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! - {owner.toBasicString()}");
var curr_anchor_info = farming_effect_action.getAnchorInfo();
NullReferenceCheckHelper.throwIfNull(curr_anchor_info, () => $"curr_anchor_info is null !!! - {owner.toBasicString()}");
var farming_prop_meta_id = curr_anchor_info.AnchorProp.TableId;
if (false == MetaData.Instance._FarmingPropMetaTable.TryGetValue(farming_prop_meta_id, out var found_farming_prop_meta))
{
err_msg = $"Not found FarmingPropMeta in FarmingPropMetaTable !!! : FarmingPropMetaId:{farming_prop_meta_id} - {curr_map.toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.FarmingPropMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
if(false == MapHelper.getAnchor(curr_anchor_info.AnchorGuid, out var anchor))
{
err_msg = $"Not found FarmingAnchor in Map !!! : FarmingAnchorGuid:{curr_anchor_info.AnchorGuid} - {curr_map.toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.FarmingAnchorNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
var base_pos = new System.Numerics.Vector3(curr_anchor_info.AnchorPos.X, curr_anchor_info.AnchorPos.Y, curr_anchor_info.AnchorPos.Z);
var delta_pos = new System.Numerics.Vector3(found_farming_prop_meta.FarmingStartPosX, found_farming_prop_meta.FarmingStartPosY, found_farming_prop_meta.FarmingStartPosZ);
var target_position = ugc_npc_action.makeToLocatePosition( base_pos, anchor.Rotation.Pitch, anchor.Rotation.Yaw, anchor.Rotation.Roll
, delta_pos, found_farming_prop_meta.FarmingStartRotate );
ugc_npc_action.modifyStateInfo( EntityStateType.UsingByFarming
, target_position
, anchorMetaGuid
, (META_ID)farming_prop_meta_id
, true );
ugc_npc_action.setCountingAsConnectedUser(true);
result = await ugc_npc_action.tryLocateInGameZone(curr_map);
if (result.isFail())
{
return (result, null);
}
}
return (result, farming_effect);
}
public async Task completedFarmingStart( QueryExecutorBase queryExecutorBase
, Player player
, FarmingEffect farmingEffect
, DBQWriteToAttributeAllWithTransactionRunner transactionRunner )
{
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!!");
var result = await curr_map.tryLocateFarming(farmingEffect);
if (result.isSuccess())
{
attachFarmingEffect(farmingEffect);
await transactionRunner.onMergeAfterQueryCommit();
}
var farming_effect_action = farmingEffect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(farming_effect_action, () => $"farming_effect_action is null !!! - {player.toBasicString()}");
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {player.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {player.toBasicString()}");
queryExecutorBase.appendBusinessLog(new FarmingBusinessLog(log_action, farming_effect_action.getFarmingLogInfo()));
if(farmingEffect.onGetOwnerEntityType() == OwnerEntityType.UgcNpc)
{
var ugc_npc = farmingEffect.getRootParent() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! - {player.toBasicString()}");
var ugc_npc_action = ugc_npc.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! - {player.toBasicString()}");
UgcNpcNotifyHelper.send_GS2C_NTF_BEACON_COMPACT_UPDATE(player, ugc_npc, ugc_npc_action.toUgcNpcCompact());
}
}
public async Task<(Result, FarmingEffect?, ReceivedMailDoc?)> tryCancelFarming( ANCHOR_META_GUID anchorMetaGuid )
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var game_zone_action = owner.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!!");
// 파밍중인 Anchor 인가?
var found_farming_effect = curr_map.findFarmingEffect(anchorMetaGuid);
if (null == found_farming_effect)
{
err_msg = $"Not state farming !!! : anchorMetaGuid:{anchorMetaGuid} - {curr_map.toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.FarmingNotState, err_msg);
return (result, null, null);
}
var farming_effect_action = found_farming_effect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(farming_effect_action, () => $"farming_effect_action is null !!! - {owner.toBasicString()}");
// 파밍을 취소를 시도 한다.
(result, var farming_effect, var to_receive_mail_doc_nullable) = await farming_effect_action.tryCancelFarming( anchorMetaGuid );
if (result.isFail())
{
return (result, null, null);
}
return (result, farming_effect, to_receive_mail_doc_nullable);
}
public async Task completedFarmingCancel( QueryExecutorBase queryExecutorBase
, Player player, Map currMap
, FarmingEffect farmingEffect, ReceivedMailDoc? receivedMailDoc
, DBQWriteToAttributeAllWithTransactionRunner transactionRunner )
{
var result = await currMap.tryRemoveFarming(farmingEffect);
if (result.isSuccess())
{
var parent = farmingEffect.getRootParent();
NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!! - {player.toBasicString()}");
var farming_action = parent.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {player.toBasicString()}");
farming_action.detachFarmingEffect(farmingEffect);
await transactionRunner.onMergeAfterQueryCommit();
}
var found_user_mail_action = player.getEntityAction<MailAction>();
NullReferenceCheckHelper.throwIfNull(found_user_mail_action, () => $"found_user_mail_action is null !!! - {player.toBasicString()}");
if (null != receivedMailDoc)
{
found_user_mail_action.NewReceivedMail();
}
var farming_effect_action = farmingEffect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(farming_effect_action, () => $"farming_effect_action is null !!! - {player.toBasicString()}");
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {player.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {player.toBasicString()}");
queryExecutorBase.appendBusinessLog(new FarmingBusinessLog(log_action, farming_effect_action.getFarmingLogInfo()));
queryExecutorBase.appendBusinessLog(new FarmingRewardBusinessLog(log_action, farming_effect_action.getFarmingRewardLogInfo()));
if (farmingEffect.onGetOwnerEntityType() == OwnerEntityType.UgcNpc)
{
var ugc_npc = farmingEffect.getRootParent() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! - {player.toBasicString()}");
var ugc_npc_action = ugc_npc.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! - {player.toBasicString()}");
UgcNpcNotifyHelper.send_GS2C_NTF_BEACON_COMPACT_UPDATE(player, ugc_npc, ugc_npc_action.toUgcNpcCompact());
}
}
public void attachFarmingEffect(FarmingEffect farmingEffect)
{
var owner = getOwner();
m_progress_farming_nullable = farmingEffect;
if(owner is Player player)
{
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {owner.toBasicString()}");
var character_action = selected_character.getEntityAction<CharacterAction>();
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {owner.toBasicString()}");
var farming_effect_attribute = farmingEffect.getEntityAttribute<FarmingEffectAttribute>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attribute, () => $"farming_effect_attribute is null !!! - {owner.toBasicString()}");
character_action.setStateInfo(EntityStateType.UsingByFarming, farming_effect_attribute.AnchorMetaGuid, farming_effect_attribute.FarmingPropMetaId);
character_action.broadcastCharacterInfo();
}
}
public void detachFarmingEffect(FarmingEffect farmingEffect)
{
var owner = getOwner();
var to_detach_anchor_meta_guid = farmingEffect.getAnchorMetaGuid();
if (null == m_progress_farming_nullable)
{
var err_msg = $"m_progress_farming_nullable is null !!! : toDetachAnchorGuid:{to_detach_anchor_meta_guid} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var curr_anchor_meta_guid = m_progress_farming_nullable.getAnchorMetaGuid();
if (curr_anchor_meta_guid != to_detach_anchor_meta_guid)
{
var err_msg = $"Not match AnchorMetaGuid of Farming !!! : currAnchorGuid:{curr_anchor_meta_guid} == toDetachAnchorGuid:{to_detach_anchor_meta_guid} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (owner is Player player)
{
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {owner.toBasicString()}");
var character_action = selected_character.getEntityAction<CharacterAction>();
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {owner.toBasicString()}");
character_action.setStateInfo(EntityStateType.None, string.Empty, 0);
character_action.broadcastCharacterInfo();
}
m_progress_farming_nullable = null;
}
public void detachFarmingEffectByAnchorMetaGuid(ANCHOR_META_GUID anchorMetaGuid)
{
var owner = getOwner();
var to_detach_anchor_meta_guid = anchorMetaGuid;
if (null == m_progress_farming_nullable)
{
var err_msg = $"m_progress_farming_nullable is null !!! : toDetachAnchorGuid:{to_detach_anchor_meta_guid} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var curr_anchor_meta_guid = m_progress_farming_nullable.getAnchorMetaGuid();
if (curr_anchor_meta_guid != to_detach_anchor_meta_guid)
{
var err_msg = $"Not match AnchorMetaGuid of Farming !!! : currAnchorGuid:{curr_anchor_meta_guid} == toDetachAnchorGuid:{to_detach_anchor_meta_guid} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
m_progress_farming_nullable = null;
}
public bool isFarmingHere()
{
return m_progress_farming_nullable != null;
}
public bool isFarmingState()
{
var owner = getOwner();
if (owner is Player player)
{
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {owner.toBasicString()}");
var character_action = selected_character.getEntityAction<CharacterAction>();
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {owner.toBasicString()}");
if(true == character_action.isFarming())
{
return true;
}
}
else if (owner is UgcNpc ugc_npc)
{
var ugc_npc_action = ugc_npc.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_action, () => $"ugc_npc_action is null !!! - {owner.toBasicString()}");
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
if (EntityStateType.UsingByFarming == ugc_npc_attribute.State)
{
return true;
}
}
return false;
}
public FarmingEffect? getFarmingEffect()
{
return m_progress_farming_nullable;
}
}

View File

@@ -0,0 +1,171 @@
using ServerCommon;
using ServerCore; using ServerBase;
using static ClientToGameReq.Types;
using ENTITY_GUID = System.String;
namespace GameServer;
[ChatCommandAttribute("farmingstart", typeof(ChatCommandFarmingStart), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandFarmingStart : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call farmingstarbyuser !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 3)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 2 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var farming_entity_type = args[0];
if (true == farming_entity_type.isNullOrWhiteSpace())
{
err_msg = $"farming_entity_type is empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var target_enity_nickname = args[1];
if (true == target_enity_nickname.isNullOrWhiteSpace())
{
err_msg = $"target_enity_nickname is empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (false == int.TryParse(args[2], out var farming_try_count))
{
Log.getLogger().error($"farming_try_count param parsing Error args : {args[0]}");
return;
}
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}");
var found_farming_anchor = curr_map.getFirstAnchorInfoOfFarming();
if (null == found_farming_anchor)
{
err_msg = $"found_farming_anchor is empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var server_logic = GameServerApp.getServerLogic();
var db_connector = server_logic.getDynamoDbClient();
if (false == farming_entity_type.toInt32(out var number))
{
err_msg = $"invalid 1 arg : EntityType !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
ENTITY_GUID entity_guid = string.Empty;
if (number == FarmingSummonedEntityType.User.castTo<Int32>())
{
entity_guid = player.getUserGuid();
}
else if (number == FarmingSummonedEntityType.Beacon.castTo<Int32>())
{
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
var found_ugc_npc = player_action.findUgcNpcByNickname(target_enity_nickname);
if (null == found_ugc_npc)
{
err_msg = $"Not found UgcNpc !!! : ugcNpcName:{target_enity_nickname} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
entity_guid = found_ugc_npc.getUgcNpcMetaGuid();
}
else
{
err_msg = $"invalid 1 arg : EntityType !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var session = player as IEntityWithSession;
NullReferenceCheckHelper.throwIfNull(session, () => $"session is null !!! - {player.toBasicString()}");
//=====================================================================================
// 패킷 구성
//=====================================================================================
var packet = new ClientToGame();
packet.Request = new ClientToGameReq();
var request = new C2GS_REQ_FARMING_START();
packet.Request.ReqFarmingStart = request;
request.FarmingAnchorMetaId = found_farming_anchor.AnchorGuid;
request.FarmingActionTryCount = (Int32)farming_try_count;
request.ToUseEntityType = (FarmingSummonedEntityType)number;
request.ToUseEnityGuid = entity_guid;
result = await server_logic.onCallProtocolHandler(session, packet);
if (result.isFail())
{
err_msg = $"Failed to onCallProtocolHandler() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
}
}
[ChatCommandAttribute("farmingcancel", typeof(ChatCommandFarmingCancel), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
internal class ChatCommandFarmingCancel : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call farmingstarbyuser !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}");
var found_farming_anchor = curr_map.getFirstAnchorInfoOfFarming();
if (null == found_farming_anchor)
{
err_msg = $"found_farming_anchor is empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var server_logic = GameServerApp.getServerLogic();
var db_connector = server_logic.getDynamoDbClient();
var session = player as IEntityWithSession;
NullReferenceCheckHelper.throwIfNull(session, () => $"session is null !!! - {player.toBasicString()}");
//=====================================================================================
// 패킷 구성
//=====================================================================================
var packet = new ClientToGame();
packet.Request = new ClientToGameReq();
var request = new C2GS_REQ_FARMING_CANCEL();
packet.Request.ReqFarmingCancel = request;
request.FarmingAnchorMetaId = found_farming_anchor.AnchorGuid;
result = await server_logic.onCallProtocolHandler(session, packet);
if (result.isFail())
{
err_msg = $"Failed to onCallProtocolHandler() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
}
}

View File

@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon.S3.Model;
using ServerCore; using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using META_ID = System.UInt32;
using META_TYPE = System.String;
using USER_GUID = System.String;
namespace GameServer
{
public static class FarmingBusinessLogHelper
{
public static FarmingLogInfo toFarmingLogInfo(this FarmingEffectDoc farmingDoc, USER_GUID userGuid, UInt32 farmingReqFeePrice = 0)
{
var log_info = new FarmingLogInfo();
log_info.setLogInfo(farmingDoc, userGuid, farmingReqFeePrice);
return log_info;
}
public static void setLogInfo(this FarmingLogInfo log, FarmingEffectDoc farmingDoc, USER_GUID userGuid, UInt32 farmingReqFeePrice = 0)
{
var farming_effect_attrib = farmingDoc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!! - {farmingDoc.toBasicString()}");
log.setLogProperty(
farming_effect_attrib.AnchorMetaGuid
, farmingDoc.getPK()
, farmingDoc.getSK()
, farming_effect_attrib.LocationUniqueId
, farming_effect_attrib.FarmingPropMetaId
, userGuid
, farming_effect_attrib.FarmingSummonedEntityType
, farming_effect_attrib.FarmingEntityGuid
, farming_effect_attrib.FarmingState
, farmingReqFeePrice
, farming_effect_attrib.FarmingActionReqTryCount
, farming_effect_attrib.CompletedRewardCount
, farming_effect_attrib.FarmingStartTime
, farming_effect_attrib.FarmingEndTime
, farming_effect_attrib.FarmingRespawnTime
);
}
public static FarmingRewardLogInfo toFarmingRewardLogInfo(this FarmingEffectDoc farmingDoc, USER_GUID userGuid, META_TYPE rewardMetaType, META_ID rewardMetaId)
{
var log_info = new FarmingRewardLogInfo();
log_info.setLogInfo(farmingDoc, userGuid, rewardMetaType, rewardMetaId);
return log_info;
}
public static void setLogInfo(this FarmingRewardLogInfo log, FarmingEffectDoc farmingDoc, USER_GUID userGuid, META_TYPE rewardMetaType, META_ID rewardMetaId)
{
var farming_effect_attrib = farmingDoc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!! - {farmingDoc.toBasicString()}");
log.setLogProperty(
farming_effect_attrib.AnchorMetaGuid
, farmingDoc.getPK()
, farmingDoc.getSK()
, farming_effect_attrib.LocationUniqueId
, farming_effect_attrib.FarmingPropMetaId
, userGuid
, farming_effect_attrib.FarmingSummonedEntityType
, farming_effect_attrib.FarmingEntityGuid
, rewardMetaType
, rewardMetaId
);
}
}
}

View File

@@ -0,0 +1,623 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using Amazon.DynamoDBv2.DocumentModel;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using ANCHOR_META_GUID = System.String;
using USER_GUID = System.String;
using USER_NICKNAME = System.String;
using LOCATION_UNIQUE_ID = System.String;
using META_ID = System.UInt32;
namespace GameServer;
public static class FarmingHelper
{
public static async Task<Result> tryFinalyzeUncompletedFarmingByMap(Map currMap)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var location_unique_id = currMap.getLocationUniqueId();
var farming_location_doc = new FarmingEffectLocationInTargetDoc(location_unique_id);
var query_config = db_client.makeQueryConfigForReadByPKOnly(farming_location_doc.getPK());
(result, var read_docs) = await db_client.simpleQueryDocTypesWithQueryOperationConfig<FarmingEffectLocationInTargetDoc>(query_config);
if (result.isFail())
{
err_msg = $"Failed to simpleQueryDocTypesWithQueryOperationConfig<FarmingEffectLocationInTargetDoc>() !!! : {result.toBasicString()} - LocationUniqueId:{location_unique_id}";
Log.getLogger().error(err_msg);
return result;
}
var anchors = currMap.getAnchors();
var farming_effects = currMap.getFarmingEffects();
foreach (var doc in read_docs)
{
var sk = doc.getSK();
(result, var primary_key) = PrimaryKey.parseLinkPKSK(sk);
if (result.isFail())
{
err_msg = $"Failed to parseLinkPKSK() !!!, invalid FARMING_EFFECT_DOC_LINK_PKSK !!! : {result.toBasicString()}, LINK_PKSK:{sk} - LocationUniqueId:{location_unique_id}";
Log.getLogger().error(err_msg);
continue;
}
var read_farming_effect_location_in_target_attrib = doc.getAttrib<FarmingEffectLocationInTargetAttrib>();
NullReferenceCheckHelper.throwIfNull(read_farming_effect_location_in_target_attrib, () => $"read_farming_effect_location_in_target_attrib is null !!!");
var user_guid = read_farming_effect_location_in_target_attrib.UserGuid;
var user_nickname = read_farming_effect_location_in_target_attrib.UserNickname;
var anchor_meta_guid = read_farming_effect_location_in_target_attrib.AnchorMetaGuid;
(result, var make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey<FarmingEffectDoc>(anchor_meta_guid, location_unique_id);
if (result.isFail())
{
err_msg = $"Failed to makePrimaryKey<FarmingEffectDoc>() !!! : {result.toBasicString()}, anchorMetaGuid:{anchor_meta_guid}, locationUniqueId:{location_unique_id} - LocationUniqueId:{location_unique_id}";
Log.getLogger().error(err_msg);
Log.getLogger().error(result.toBasicString());
continue;
}
NullReferenceCheckHelper.throwIfNull(make_primary_key, () => $"make_primary_key is null !!!");
query_config = db_client.makeQueryConfigForReadByPKSK( make_primary_key.PK, make_primary_key.SK);
(result, var found_farming_effect_doc) = await db_client.simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectDoc>(query_config);
if (result.isFail())
{
err_msg = $"Failed to parse simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectDoc>() !!! : {result.toBasicString()}, PK:{make_primary_key.PK}, SK:{make_primary_key.SK} - LocationUniqueId:{location_unique_id}";
Log.getLogger().error(err_msg);
continue;
}
NullReferenceCheckHelper.throwIfNull(found_farming_effect_doc, () => $"found_farming_effect_doc is null !!!");
var farming_effect_attrib = found_farming_effect_doc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!!");
ArgumentNullException.ThrowIfNull( anchor_meta_guid == farming_effect_attrib.AnchorMetaGuid
, $"Not match Farming AnchorMetaGuid !!! : inLocation:{anchor_meta_guid} == inFarmingEffect:{farming_effect_attrib.AnchorMetaGuid}" );
anchor_meta_guid = farming_effect_attrib.AnchorMetaGuid;
if (false == anchors.TryGetValue(anchor_meta_guid, out var found_anchor_info))
{
err_msg = $"Not found Farming AnchorInfo in Meta !!! : anchorMetaGuid:{anchor_meta_guid} - LocationUniqueId:{location_unique_id}";
Log.getLogger().error(err_msg);
continue;
}
if (FarmingStateType.Progress == farming_effect_attrib.FarmingState)
{
result = await FarmingHelper.tryRewardAndPurge( found_farming_effect_doc
, farming_effect_attrib.FarmingEndTime, new TimeSpan(0, 0, 0, 0, 0)
, user_guid, user_nickname
, LogActionType.FarmingIncompletedReward );
if (result.isFail())
{
continue;
}
found_anchor_info.PropState = farming_effect_attrib.FarmingState.toPropState();
found_anchor_info.respawnTime = farming_effect_attrib.FarmingRespawnTime.ToTimestamp();
currMap.PropModifyNoti(found_anchor_info.AnchorGuid);
var player_manager = server_logic.getPlayerManager();
if (false == player_manager.tryGetUserByPrimaryKey(user_guid, out var found_user))
{
var login_cache_request = new LoginCacheOtherUserRequest(server_logic, server_logic.getRedisConnector(), user_guid);
await login_cache_request.fetchLogin();
var login_cache = login_cache_request.getLoginCache();
if (login_cache != null)
{
FarmingNotifyHelper.send_GS2MQS_NTF_FARMING_END( server_logic
, login_cache.CurrentServer
, user_guid, found_farming_effect_doc.toFarmingSummary(user_guid) );
}
}
else
{
var player_action = found_user.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {found_user.toBasicString()}");
if (FarmingSummonedEntityType.Beacon == farming_effect_attrib.FarmingSummonedEntityType)
{
var had_ugc_npcs = player_action.getHadUgcNpcs();
if (false == had_ugc_npcs.TryGetValue(farming_effect_attrib.FarmingEntityGuid, out var found_ugc_npc))
{
err_msg = $"Not found UgcNpc !!! : ugcNpcMetaGuid:{farming_effect_attrib.FarmingEntityGuid} - {found_user.toBasicString()}";
result.setFail(ServerErrorCode.UgcNpcNotFound, err_msg);
Log.getLogger().info(result.toBasicString());
continue;
}
var farming_action = found_ugc_npc.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {found_user.toBasicString()}");
result = await farming_action.resetFarmingState();
if (result.isFail())
{
err_msg = $"Failed to resetFarmingState() !!! : {result.toBasicString()} - {found_user.toBasicString()}";
Log.getLogger().error(err_msg);
continue;
}
}
}
}
}
return result;
}
public static async Task<(Result, bool)> tryFinalyzeUncompletedFarmingByOwner(EntityBase owner, UserLoader? userLoader = null)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var instance_room_storage = new InstanceRoomStorage();
instance_room_storage.Init(server_logic.getRedisDb(), "");
var user_guid = string.Empty;
var user_nickname = string.Empty;
(result, var entity_profile) = ServerCommon.EntityHelper.getMasterProfile<Player>(owner);
if(result.isFail())
{
return (result, false);
}
NullReferenceCheckHelper.throwIfNull(entity_profile, () => $"entity_profile is null !!!");
user_guid = entity_profile.MasterGuid;
user_nickname = entity_profile.MasterNickname;
var is_need_to_register_progress_farming = false;
var owner_guid = string.Empty;
if(owner is Player player)
{
owner_guid = user_guid;
}
else if( owner is UgcNpc ugc_npc )
{
owner_guid = ugc_npc.getUgcNpcMetaGuid();
is_need_to_register_progress_farming = true;
}
(result, var make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey<FarmingEffectOwnerDoc>(owner_guid);
if (result.isFail())
{
err_msg = $"Failed to makePrimaryKey<FarmingEffectOwnerDoc>() !!! : {result.toBasicString()}, OwnerGuid:{owner_guid} - UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
return (result, false);
}
NullReferenceCheckHelper.throwIfNull(make_primary_key, () => $"make_primary_key is null !!! - {owner.toBasicString()}");
var query_config = db_client.makeQueryConfigForReadByPKOnly(make_primary_key.PK);
(result, var read_doc) = await db_client.simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectOwnerDoc>(query_config, false);
if(result.isFail())
{
err_msg = $"Failed to simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectOwnerDoc>() !!! : {result.toBasicString()} - UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
return (result, false);
}
if (null == read_doc)
{
if (owner is UgcNpc ugc_npc)
{
var farming_action = ugc_npc.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {ugc_npc.toBasicString()} - {owner.toBasicString()}");
if(true == farming_action.isFarmingState())
{
err_msg = $"UgcNpc Farming State synchronization error !!! - {ugc_npc.toStateString()}, {ugc_npc.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, true);
}
}
return (result, false);
}
var pk = read_doc.getPK();
var sk = read_doc.getSK();
(result, var primary_key) = PrimaryKey.parseLinkPKSK(sk);
if (result.isFail())
{
err_msg = $"Failed to parseLinkPKSK() !!!, invalid FARMING_EFFECT_DOC_LINK_PKSK !!! : {result.toBasicString()}, LINK_PKSK:{sk} - PK:{pk}, SK:{sk} - UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
return (result, false);
}
NullReferenceCheckHelper.throwIfNull(primary_key, () => $"make_primary_key is null !!! - {owner.toBasicString()}");
var location_unique_id = primary_key.SK;
query_config = db_client.makeQueryConfigForReadByPKSK(primary_key.PK, primary_key.SK);
(result, var found_farming_effect_doc) = await db_client.simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectDoc>(query_config, false);
if (result.isFail())
{
err_msg = $"Failed to simpleQueryDocTypeWithQueryOperationConfig<FarmingEffectDoc>() !!! : {result.toBasicString()} - PK:{primary_key.PK}, SK:{primary_key.SK}, LocationUniqueId:{location_unique_id} - UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
return (result, false);
}
if(null == found_farming_effect_doc)
{
return (result, true);
}
NullReferenceCheckHelper.throwIfNull(found_farming_effect_doc, () => $"found_farming_effect_doc is null !!! - {owner.toBasicString()}");
var farming_effect_attrib = found_farming_effect_doc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib is null !!! - PK:{primary_key.PK}, SK:{primary_key.SK}, UserGuid:{user_guid}, UserNickname:{user_nickname}");
if( FarmingStateType.Progress == farming_effect_attrib.FarmingState )
{
(result, var location_unique_id_parts) = Map.parseLOCATION_UNIQUE_ID(location_unique_id);
if (result.isFail())
{
err_msg = $"Failed to parseLOCATION_UNIQUE_ID() !!! : {result.toBasicString()}, LocationUniqueId:{location_unique_id} - PK:{primary_key.PK}, SK:{primary_key.SK}, UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
return (result, false);
}
NullReferenceCheckHelper.throwIfNull(location_unique_id_parts, () => $"location_unique_id_parts is null !!! - {owner.toBasicString()}");
var anchor_meta_guid = found_farming_effect_doc.getCombinationKeyForPK();
var location_target_type = location_unique_id_parts[0];
var map_meta_id = location_unique_id_parts[1];
var instance_number = location_unique_id_parts[2];
// 인스턴스 존재하지 않는다면 즉시 해당 인스턴스의 배치된 파밍은 즉시 보상 이다 !!!
var found_instance = await instance_room_storage.GetInstanceRoomInfo(instance_number);
if (null == found_instance)
{
// 파밍 보상을 지급하고 배치된 FarmingEffect를 제거 한다.
var reward_result = await FarmingHelper.tryRewardAndPurge( found_farming_effect_doc
, farming_effect_attrib.FarmingEndTime, new TimeSpan(0, 0, 0, 0, 0)
, user_guid, user_nickname
, LogActionType.FarmingIncompletedReward );
if (reward_result.isFail())
{
err_msg = $"Failed to FarmingHelper.tryRewardAndPurge() !!! : {result.toBasicString()} - LocationUniqueId:{location_unique_id}, UserGuid:{user_guid}, UserNickname:{user_nickname}";
Log.getLogger().error(err_msg);
}
if ( owner is UgcNpc ugc_npc )
{
var farming_action = ugc_npc.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {ugc_npc.toBasicString()} - {owner.toBasicString()}");
if (true == farming_action.isFarmingState())
{
return (result, true);
}
}
}
else
{
if (true == is_need_to_register_progress_farming && userLoader != null)
{
userLoader.pushProgressFarmingSummary(found_farming_effect_doc.toFarmingSummary(user_guid));
}
}
}
return (result, false);
}
public static async Task<Result> tryRewardAndPurge( FarmingEffectDoc farmingEffectDoc
, DateTime currentTime, TimeSpan toAddTime
, USER_GUID receiverUserGuid, USER_NICKNAME receiverUserNickname
, LogActionType farmingLogActionType )
{
var result = new Result();
var err_msg = string.Empty;
var farming_effect_attrib = farmingEffectDoc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib in null !!! - userNickName:{receiverUserNickname}");
var anchor_meta_guid = farming_effect_attrib.AnchorMetaGuid;
var location_unique_id = farming_effect_attrib.LocationUniqueId;
if (false == MapDataTable.Instance.getAnchor(anchor_meta_guid, out var found_anchor))
{
err_msg = $"Not found Anchor in MapDataTable !!! : anchorMetaGuid:{anchor_meta_guid} - locationUniqueId:{location_unique_id}, userNickName:{receiverUserNickname}";
result.setFail(ServerErrorCode.NotFoundAnchorGuidInMap, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var farming_prop_meta_id = (Int32)found_anchor.TableID;
if (false == MetaData.Instance._FarmingPropMetaTable.TryGetValue(farming_prop_meta_id, out var found_farming_prop_meta))
{
err_msg = $"Not found FarmingPropMeta in FarmingPropMetaTable !!! : FarmingPropMetaId:{farming_prop_meta_id} - anchorMetaGuid:{anchor_meta_guid}, locationUniqueId:{location_unique_id}, userNickName:{receiverUserNickname}";
result.setFail(ServerErrorCode.FarmingPropMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var reward_gacha_group_id = found_farming_prop_meta.RewardGachaGroupID;
if (false == MetaData.Instance._GachaMetaTable.TryGetValue(reward_gacha_group_id, out var found_gacha_meta))
{
err_msg = $"Not found GachaMeta in GachaMetaTable !!! : RewardGachaGroupId:{reward_gacha_group_id} - anchorMetaGuid:{anchor_meta_guid}, locationUniqueId:{location_unique_id}, userNickName:{receiverUserNickname}";
result.setFail(ServerErrorCode.GachaMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
(result, ReceivedMailDoc? to_receive_mail_doc) = await tryReward( farmingEffectDoc
, currentTime, toAddTime, (UInt16)found_farming_prop_meta.InteractionCoolTime
, (META_ID)reward_gacha_group_id, found_gacha_meta
, receiverUserGuid, receiverUserNickname );
if(result.isFail())
{
err_msg = $"Failed to tryReward() !!! : {result.toBasicString()} - anchorMetaGuid:{anchor_meta_guid}, locationUniqueId:{location_unique_id}, userNickName:{receiverUserNickname}";
Log.getLogger().error(err_msg);
return result;
}
result = await tryApplyFarmingRewardAndPurge( receiverUserGuid, farmingEffectDoc
, farmingLogActionType
, (META_ID)reward_gacha_group_id, found_gacha_meta
, to_receive_mail_doc);
if (result.isFail())
{
err_msg = $"Failed to tryApplyFarmingRewardAndPurge() !!! : {result.toBasicString()} - anchorMetaGuid:{anchor_meta_guid}, locationUniqueId:{location_unique_id}, userNickName:{receiverUserNickname}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public static async Task<(Result, ReceivedMailDoc?)> tryReward( FarmingEffectDoc farmingEffectDoc
, DateTime farmingEndTime, TimeSpan toAddTime, UInt16 respawnCoolingTimeSec
, META_ID rewardGachaGroupId, SelectedGacha selectedGacha
, USER_GUID receiverUserGuid, USER_NICKNAME receiverUserNickname )
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var system_manager = server_logic.getSystemMailManager();
var farming_effect_attrib = farmingEffectDoc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib in null !!! - receiverUserNickname:{receiverUserNickname}");
var anchor_meta_guid = farming_effect_attrib.AnchorMetaGuid;
var location_unique_id = farming_effect_attrib.LocationUniqueId;
PropState prop_state = PropState.None;
DateTime respawn_time = DateTimeHelper.MinTime;
ReceivedMailDoc? received_mail_doc = null;
var reward_count = 0;
// 파밍 경과 시간을 계산하여 보상 개수를 산정 한다.
var try_count = farming_effect_attrib.FarmingActionReqTryCount;
var farming_time = farming_effect_attrib.FarmingEndTime - farming_effect_attrib.FarmingStartTime;
if(TimeSpan.Zero < farming_time)
{
var reward_segment_time = farming_time / try_count;
var farming_elapsed_time = farmingEndTime.Add(toAddTime) - farming_effect_attrib.FarmingStartTime;
if(TimeSpan.Zero < farming_elapsed_time)
{
farming_elapsed_time = farming_time < farming_elapsed_time ? farming_time : farming_elapsed_time;
reward_count = (short)(farming_elapsed_time / reward_segment_time);
farming_effect_attrib.CompletedRewardCount = (short)reward_count;
}
}
// 파밍을 보상을 우편으로 송신 하기
if (0 < reward_count)
{
var picked_gacha_rewards = new List<MetaAssets.GachaMetaData>();
for (var i = 0; i < reward_count; i++)
{
var picked_gacha_reward = selectedGacha.getRandomReward();
if(null == picked_gacha_reward)
{
err_msg = $"Empty random reward !!! - rewardGachaGroupId:{rewardGachaGroupId}, Count:{i}, rewardCount:{reward_count}, anchorMetaGuid:{anchor_meta_guid}, receiverNickname:{receiverUserNickname}";
result.setFail(ServerErrorCode.GachaRewardEmpty, err_msg);
Log.getLogger().error(result.toBasicString());
continue;
}
picked_gacha_rewards.Add(picked_gacha_reward);
}
var system_mail_meta_key = ServerCommon.Constant.FARMING_REWARD_SYSTEM_MAIL_META_KEY;
if (MetaData.Instance.SystemMailMetaData.TryGetValue(system_mail_meta_key, out var found_system_mail_meta) == false)
{
err_msg = $"Not found SystemMailMeta in SystemMailMetaTable !!! : SystemMailMetaKey:{system_mail_meta_key} - anchorMetaGuid:{anchor_meta_guid}";
result.setFail(ServerErrorCode.SystemMailMetaDataNotFound, err_msg);
return (result, null);
}
(result, received_mail_doc) = await Mail.createSystemMailWithMeta( receiverUserGuid, receiverUserNickname
, found_system_mail_meta
, MetaHelper.toMailItems(picked_gacha_rewards)
, MetaHelper.GameConfigMeta.SystemMailStoragePeriod );
if(result.isFail())
{
return (result, null);
}
}
// 보상을 받을 수 없는 경우
var respawn_cooling_sec = respawnCoolingTimeSec;
if (0 < respawn_cooling_sec)
{
prop_state = PropState.Respawning;
respawn_time = DateTimeHelper.Current.AddSeconds(respawn_cooling_sec);
}
else
{
prop_state = PropState.Deactivated;
}
// 갱신된 파밍 정보를 업데이트 한다.
farming_effect_attrib.FarmingActionReqTryCount = 0;
farming_effect_attrib.FarmingStartTime = DateTimeHelper.MinTime;
farming_effect_attrib.FarmingEndTime = DateTimeHelper.MinTime;
farming_effect_attrib.FarmingState = prop_state.toFarmingStateType();
farming_effect_attrib.FarmingRespawnTime = respawn_time;
farming_effect_attrib.CompletedRewardCount = 0;
return (result, received_mail_doc);
}
public static async Task<Result> tryApplyFarmingRewardAndPurge( USER_GUID userGuid
, FarmingEffectDoc farmingEffectDoc
, LogActionType farmingLogActionType
, META_ID rewardGachaGroupId, SelectedGacha? selectedGacha
, ReceivedMailDoc? receivedMailDoc )
{
var farming_effect_attrib = farmingEffectDoc.getAttrib<FarmingEffectAttrib>();
NullReferenceCheckHelper.throwIfNull(farming_effect_attrib, () => $"farming_effect_attrib in null !!!");
var result = new Result();
var err_msg = string.Empty;
var anchor_meta_guid = farming_effect_attrib.AnchorMetaGuid;
var location_unique_id = farming_effect_attrib.LocationUniqueId;
var farming_entity_guid = farming_effect_attrib.FarmingEntityGuid;
var server_logic = GameServerApp.getServerLogic();
var db_client = server_logic.getDynamoDbClient();
var system_manager = server_logic.getSystemMailManager();
var farming_effect_doc_link_pksk = FarmingEffectDoc.makeLINK_PKSK(anchor_meta_guid, location_unique_id);
NullReferenceCheckHelper.throwIfNull(farming_effect_doc_link_pksk, () => $"farming_effect_doc_link_pksk in null !!! - anchorMeatGuid:{farming_effect_attrib.AnchorMetaGuid}, farmingEntityGuid:{farming_entity_guid}");
var to_write_docs = new List<DynamoDbDocBase>();
// 보상 우편 지급을 등록 한다.
if(null != receivedMailDoc)
{
to_write_docs.Add(receivedMailDoc);
}
// 파밍 소유 관계 DB 정보를 제거 한다.
var farming_owner_doc = new FarmingEffectOwnerDoc(farming_entity_guid, farming_effect_doc_link_pksk);
farming_owner_doc.setQueryType(QueryType.Delete);
to_write_docs.Add(farming_owner_doc);
// 파밍 배치 DB 정보를 제거 한다.
var farming_location_doc = new FarmingEffectLocationInTargetDoc(location_unique_id, farming_effect_doc_link_pksk);
farming_location_doc.setQueryType(QueryType.Delete);
to_write_docs.Add(farming_location_doc);
// 파밍 DB 정보를 제거 한다.
var farming_doc = new FarmingEffectDoc(anchor_meta_guid, location_unique_id);
farming_doc.setQueryType(QueryType.Delete);
to_write_docs.Add(farming_doc);
var batch = new QueryBatch<QueryRunnerWithDocument>( system_manager, new LogActionEx(farmingLogActionType)
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQEntityWrite(to_write_docs));
batch.addQuery(new QueryFinal(), async (_query) =>
{
await completedFarmingRewardAndPurge( _query, userGuid, farming_doc
, rewardGachaGroupId, selectedGacha
, receivedMailDoc );
return QueryBatchBase.QueryResultType.Success;
});
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
}
public static async Task completedFarmingRewardAndPurge( QueryExecutorBase queryExecutorBase
, USER_GUID userGuid
, FarmingEffectDoc farmingDoc
, META_ID rewardGachaGroupId, SelectedGacha? selectedGacha
, ReceivedMailDoc? receivedMailDoc )
{
var server_logic = GameServerApp.getServerLogic();
var player_manager = server_logic.getPlayerManager();
if (player_manager.tryGetUserByPrimaryKey(userGuid, out var found_user) == true)
{
if (null != receivedMailDoc)
{
var found_user_mail_action = found_user.getEntityAction<MailAction>();
found_user_mail_action.NewReceivedMail();
}
}
else
{
var login_cache_request = new LoginCacheOtherUserRequest(server_logic, server_logic.getRedisConnector(), userGuid);
await login_cache_request.fetchLogin();
var login_cache = login_cache_request.getLoginCache();
if (login_cache != null)
{
var mg_server = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
NullReferenceCheckHelper.throwIfNull(mg_server, () => $"mg_server is null !!! - userGuid:{userGuid}");
var s2s_ntf_msg = new ServerMessage();
s2s_ntf_msg.ReceiveMailNoti = new ServerMessage.Types.ReceiveMailNoti() { AccountGuid = userGuid };
mg_server.SendMessage(login_cache.CurrentServer, s2s_ntf_msg);
}
}
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - userGuid:{userGuid}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - userGuid:{userGuid}");
var reward_meta_type = (selectedGacha != null ? selectedGacha.getTypeName() : string.Empty);
query_batch.appendBusinessLog(new FarmingBusinessLog(log_action, farmingDoc.toFarmingLogInfo(userGuid)));
query_batch.appendBusinessLog(new FarmingRewardBusinessLog(log_action, farmingDoc.toFarmingRewardLogInfo(userGuid, reward_meta_type, rewardGachaGroupId)));
}
}

View File

@@ -0,0 +1,242 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using NPC_UNIQUE_ID = System.String;
using UGC_NPC_META_GUID = System.String;
using ANCHOR_META_GUID = System.String;
using ENTITY_INSTANCE_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(C2GS_REQ_FARMING_CANCEL), typeof(FarmingCancelPacketHandler), typeof(GameLoginListener))]
public class FarmingCancelPacketHandler : PacketRecvHandler
{
public static bool send_GS2C_ACK_FARMING_CANCEL( Player owner, ANCHOR_META_GUID anchorMetaGuid
, Result result
, FarmingSummary? farmingSummary = null)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
var ack = new GS2C_ACK_FARMING_CANCEL();
ack.FarmingAnchorMetaId = anchorMetaGuid;
if (result.isSuccess())
{
ack.FarmingSummary = farmingSummary;
var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents);
if (null == found_transaction_runner)
{
var err_msg = $"Not found TransactionRunner !!! : {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
}
ack_packet.Response.AckFarmingCancel = ack;
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task onProcessPacketException( ISession entityWithSession, Google.Protobuf.IMessage recvMessage
, Result errorResult )
{
await Task.CompletedTask;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqFarmingCancel;
send_GS2C_ACK_FARMING_CANCEL(player, request.FarmingAnchorMetaId, errorResult);
}
public override async Task<Result> 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 recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqFarmingCancel;
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
if (null == selected_character)
{
err_msg = $"Not selected Character !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.CharacterNotSelected, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_CANCEL(player, request.FarmingAnchorMetaId, result);
return result;
}
return await tryCancelFarming(player, request.FarmingAnchorMetaId);
}
public static async Task<Result> tryCancelFarming(Player player, ANCHOR_META_GUID anchorMetaGuid)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}");
FarmingEffect? farming_effect_for_quest_check_nullable = null;
var fn_farming_cancel = async delegate ()
{
var result = new Result();
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
var curr_map = game_zone_action.getLinkedToMap();
if (null == curr_map)
{
err_msg = $"Not joined GameZone !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.GameZoneNotJoin, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_CANCEL(player, anchorMetaGuid, result);
return result;
}
var found_anchor_info = curr_map.findAnchorInfo(anchorMetaGuid);
if (null == found_anchor_info)
{
err_msg = $"Not found AnchorInfo !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.FarmingAnchorNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_CANCEL(player, anchorMetaGuid, result);
return result;
}
using (found_anchor_info.getAsyncLock().Lock())
{
var player_farming_action = player.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(player_farming_action, () => $"player_farming_action is null !!! - {player.toBasicString()}");
(result, var farming_effect, var to_receive_mail_doc_nullable) = await player_farming_action.tryCancelFarming( anchorMetaGuid );
if (result.isFail())
{
err_msg = $"Failed to tryCancelFarming() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_GS2C_ACK_FARMING_CANCEL(player, anchorMetaGuid, result);
return result;
}
NullReferenceCheckHelper.throwIfNull(farming_effect, () => $"farming_effect is null !!! - {player.toBasicString()}");
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.FarmingCancel
, server_logic.getDynamoDbClient()
, true );
{
var with_transaction_runner = new DBQWriteToAttributeAllWithTransactionRunner();
if(null != to_receive_mail_doc_nullable)
{
batch.addQuery(new DBQEntityWrite(to_receive_mail_doc_nullable));
}
batch.addQuery(with_transaction_runner);
batch.addQuery( new QueryFinal(), async (_query) =>
{
await player_farming_action.completedFarmingCancel( _query
, player, curr_map
, farming_effect, to_receive_mail_doc_nullable
, with_transaction_runner );
return QueryBatchBase.QueryResultType.Success;
});
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
send_GS2C_ACK_FARMING_CANCEL( player, anchorMetaGuid
, result);
return result;
}
send_GS2C_ACK_FARMING_CANCEL( player, anchorMetaGuid
, result
, farming_effect.toFarmingSummary());
FarmingNotifyHelper.send_GS2C_NTF_FARMING_CANCEL(player, farming_effect);
farming_effect_for_quest_check_nullable = farming_effect;
}
return result;
};
result = await player.runTransactionRunnerSafelyWithTransGuid( anchorMetaGuid
, TransactionIdType.PrivateContents, "FarmingCancel", fn_farming_cancel);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
await farmingCancleQuestCheck(player, anchorMetaGuid, farming_effect_for_quest_check_nullable);
return result;
}
private static async Task farmingCancleQuestCheck(Player player, string farmingPropId, FarmingEffect? farmingEffect)
{
if (null == farmingEffect) return;
var farming_effect_action = farmingEffect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(farming_effect_action, () => $"farming_effect_action is null !!!");
var summoned_entity_type = farming_effect_action.toFarmingSummonedEntityType();
string typeName = QuestMetaHelper.convertFarmingSummonedEntityTypeToQuestEntityType(summoned_entity_type);
await QuestManager.It.QuestCheck(player, new QuestFarming(EQuestEventTargetType.FARMING, EQuestEventNameType.STOPPED, farmingPropId, typeName));
}
}

View File

@@ -0,0 +1,141 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameMessage.Types;
using USER_GUID = System.String;
using ANCHOR_META_GUID = System.String;
namespace GameServer;
public static class FarmingNotifyHelper
{
public static void send_GS2C_NTF_FARMING_ALL_LOAD(this Player player)
{
var user_create_or_load_action = player.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {player.toBasicString()}");
var user_loader = user_create_or_load_action.getSimpleEventTriggerType<UserLoader>();
NullReferenceCheckHelper.throwIfNull(user_loader, () => $"user_loader is null !!! - {player.toBasicString()}");
var process_farming_summary_all = user_loader.getProgressFarmingSummaryAll();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"process_farming_summary_all is null !!! - {player.toBasicString()}");
var ntf = new GS2C_NTF_FARMING_ALL_LOAD();
ntf.ProgressFarmingSummaries.AddRange(process_farming_summary_all);
ClientToGame packet = new ClientToGame();
packet.Message = new ClientToGameMessage();
packet.Message.NtfFarmingAllLoad = ntf;
player.sendPacket(packet);
}
public static void send_GS2C_NTF_FARMING_START(Player player, FarmingEffect farmingEffect)
{
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}");
var faming_effect_action = farmingEffect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(faming_effect_action, () => $"faming_effect_action is null !!! - {player.toBasicString()}");
var anchor_info = faming_effect_action.getAnchorInfo();
var ntf = new GS2C_NTF_FARMING_START();
ntf.FarmingAnchorMetaId = anchor_info.AnchorGuid;
ntf.FarmingSummary = farmingEffect.toFarmingSummary();
ClientToGame packet = new ClientToGame();
packet.Message = new ClientToGameMessage();
packet.Message.NtfFarmingStart = ntf;
curr_map.Broadcast(anchor_info.AnchorPos, packet);
}
public static void send_GS2C_NTF_FARMING_CANCEL(Player player, FarmingEffect farmingEffect)
{
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {player.toBasicString()}");
var faming_effect_action = farmingEffect.getEntityAction<FarmingEffectAction>();
NullReferenceCheckHelper.throwIfNull(faming_effect_action, () => $"faming_effect_action is null !!! - {player.toBasicString()}");
var anchor_info = faming_effect_action.getAnchorInfo();
var ntf = new GS2C_NTF_FARMING_CANCEL();
ntf.FarmingAnchorMetaId = anchor_info.AnchorGuid;
ntf.FarmingSummary = farmingEffect.toFarmingSummary();
ClientToGame packet = new ClientToGame();
packet.Message = new ClientToGameMessage();
packet.Message.NtfFarmingCancel = ntf;
curr_map.Broadcast(anchor_info.AnchorPos, packet, player.getHostId());
}
public static void send_GS2C_NTF_FARMING_END(Map currMap, AnchorInfo anchorInfo, FarmingSummary farmingSummary)
{
var ntf = new GS2C_NTF_FARMING_END();
ntf.FarmingAnchorMetaId = anchorInfo.AnchorGuid;
ntf.FarmingSummary = farmingSummary;
ClientToGame packet = new ClientToGame();
packet.Message = new ClientToGameMessage();
packet.Message.NtfFarmingEnd = ntf;
currMap.Broadcast(anchorInfo.AnchorPos, packet);
}
public static void send_GS2MQS_NTF_FARMING_END( GameServerLogic serverLogic
, string targetServerName
, USER_GUID userGuid
, FarmingSummary farmingSummary
, bool isApplyDb = true )
{
var mg_server = serverLogic.getRabbitMqConnector() as RabbitMQ4Game;
NullReferenceCheckHelper.throwIfNull(mg_server, () => $"mg_server is null !!!");
var s2s_ntf_msg = new ServerMessage();
var ntf_farming_end = new ServerMessage.Types.GS2MQS_NTF_FARMING_END();
s2s_ntf_msg.NtfFarmingEnd = ntf_farming_end;
ntf_farming_end.UserGuid = userGuid;
ntf_farming_end.FarmingSummary = farmingSummary;
ntf_farming_end.IsApplyDb = isApplyDb == true ? BoolType.True : BoolType.False;
mg_server.SendMessage(targetServerName, s2s_ntf_msg);
}
public static void send_GS2C_NTF_FARMING_END(Player player, FarmingSummary farmingSummary)
{
var ntf = new GS2C_NTF_FARMING_END();
ntf.FarmingAnchorMetaId = farmingSummary.FarmingAnchorMetaId;
ntf.FarmingSummary = farmingSummary;
ClientToGame packet = new ClientToGame();
packet.Message = new ClientToGameMessage();
packet.Message.NtfFarmingEnd = ntf;
if (false == GameServerApp.getServerLogic().onSendPacket(player, packet))
{
Log.getLogger().error($"Failed to onSendPacket() !!! : {packet.toBasicString()} - {player.toBasicString()}");
}
}
}

View File

@@ -0,0 +1,200 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using static ClientToGameReq.Types;
using static ClientToGameRes.Types;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using NPC_UNIQUE_ID = System.String;
using UGC_NPC_META_GUID = System.String;
using ANCHOR_META_GUID = System.String;
using ENTITY_INSTANCE_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(C2GS_REQ_FARMING_START), typeof(FarmingStartPacketHandler), typeof(GameLoginListener))]
public class FarmingStartPacketHandler : PacketRecvHandler
{
public static bool send_GS2C_ACK_FARMING_START( Player owner, ANCHOR_META_GUID anchorMetaGuid
, Result result
, FarmingSummary? farmingSummary = null)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
var ack_msg = new GS2C_ACK_FARMING_START();
ack_packet.Response.AckFarmingStart = ack_msg;
ack_msg.FarmingAnchorMetaId = anchorMetaGuid;
if (result.isSuccess())
{
ack_msg.FarmingSummary = farmingSummary;
var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents);
if (null == found_transaction_runner)
{
var err_msg = $"Not found TransactionRunner !!! : {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
ack_msg.CommonResult = found_transaction_runner.getCommonResult();
}
}
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> 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 recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqFarmingStart;
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
if (null == selected_character)
{
err_msg = $"Not selected Character !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.CharacterNotSelected, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_START(player, request.FarmingAnchorMetaId, result);
return result;
}
var server_logic = GameServerApp.getServerLogic();
FarmingEffect? farming_effect = null;
var fn_farming_start = async delegate ()
{
var result = new Result();
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
var curr_map = game_zone_action.getLinkedToMap();
if (null == curr_map)
{
err_msg = $"Not joined GameZone !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.GameZoneNotJoin, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_START(player, request.FarmingAnchorMetaId, result);
return result;
}
var found_anchor_info = curr_map.findAnchorInfo(request.FarmingAnchorMetaId);
if(null == found_anchor_info)
{
err_msg = $"Not found AnchorInfo !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.FarmingAnchorNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_FARMING_START(player, request.FarmingAnchorMetaId, result);
return result;
}
using (found_anchor_info.getAsyncLock().Lock())
{
(result, var farming_action) = await player_action.selectFarmingAction(request.ToUseEntityType, request.ToUseEnityGuid);
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {player.toBasicString()}");
(result, farming_effect) = await farming_action.tryStartFarming( request.FarmingAnchorMetaId, (Int16)request.FarmingActionTryCount );
if (result.isFail())
{
err_msg = $"Failed to tryStartFarming() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_GS2C_ACK_FARMING_START(player, request.FarmingAnchorMetaId, result);
return result;
}
NullReferenceCheckHelper.throwIfNull(farming_effect, () => $"farming_effect is null !!! - {player.toBasicString()}");
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.FarmingStart
, server_logic.getDynamoDbClient()
, true );
{
var with_transaction_runner = new DBQWriteToAttributeAllWithTransactionRunner();
batch.addQuery(with_transaction_runner);
batch.addQuery(new QueryFinal(), async (_query) =>
{
await farming_action.completedFarmingStart( _query
, player
, farming_effect, with_transaction_runner );
return QueryBatchBase.QueryResultType.Success;
});
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
send_GS2C_ACK_FARMING_START(player, request.FarmingAnchorMetaId, result);
return result;
}
send_GS2C_ACK_FARMING_START( player, request.FarmingAnchorMetaId
, result
, farming_effect.toFarmingSummary() );
FarmingNotifyHelper.send_GS2C_NTF_FARMING_START(player, farming_effect);
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "FarmingStart", fn_farming_start);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
await farmingStartQuestCheck(player, request.ToUseEntityType, request.FarmingAnchorMetaId, farming_effect);
return result;
}
private async Task farmingStartQuestCheck(Player player, FarmingSummonedEntityType entityType, string farmingAnchorMetaId, FarmingEffect? farmingEffect)
{
if (farmingEffect is null) return;
string typeName = QuestMetaHelper.convertFarmingSummonedEntityTypeToQuestEntityType(entityType);
var found_anchor_info = farmingEffect.getCurrMap().findAnchorInfo(farmingAnchorMetaId);
if (found_anchor_info is null) return;
await QuestManager.It.QuestCheck(player, new QuestFarming(EQuestEventTargetType.FARMING, EQuestEventNameType.STARTED, found_anchor_info.AnchorProp.TableId.ToString(), typeName));
}
}