초기커밋
This commit is contained in:
476
GameServer/Contents/Farming/Action/FarmingAction.cs
Normal file
476
GameServer/Contents/Farming/Action/FarmingAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
171
GameServer/Contents/Farming/FarmingCheat.cs
Normal file
171
GameServer/Contents/Farming/FarmingCheat.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
623
GameServer/Contents/Farming/Helper/FarmingHelper.cs
Normal file
623
GameServer/Contents/Farming/Helper/FarmingHelper.cs
Normal 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)));
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
141
GameServer/Contents/Farming/PacketHandler/FarmingNotifyHelper.cs
Normal file
141
GameServer/Contents/Farming/PacketHandler/FarmingNotifyHelper.cs
Normal 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()}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user