using MetaAssets; using ServerCommon; using ServerCore; using ServerBase; namespace GameServer; public class BattleObjectInteractAction : EntityActionBase { public BattleObjectInteractAction(EntityBase owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { } public async Task interactCommonBattleObject(BattleObjectInteractionLogicHandler handler, Player player) { await Task.CompletedTask; var result = new Result(); updateBattleObjectActiveInfo(handler); return result; } public async Task interactPickupPod(BattleObjectInteractionLogicHandler handler, Player player) { await Task.CompletedTask; var result = new Result(); updateBattleObjectActiveInfo(handler); Log.getLogger().info($"interaction pickup pod player : {player.toBasicString()}, guid : {handler.m_interaction_anchor_guid}, next active time : {handler.m_battle_object.m_active_time}"); var battle_instance_room = getOwner() as BattleInstanceRoom; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); //보상처리 var reward_action = battle_instance_room.getEntityAction(); NullReferenceCheckHelper.throwIfNull(reward_action, () => $"handler.m_pod_combat is null !!!"); result = await reward_action.pickupPodReward(player, attribute, handler); return result; } public async Task interactPodStorage(BattleObjectInteractionLogicHandler handler, Player player) { await Task.CompletedTask; var result = new Result(); var battle_instance_room = getOwner() as BattleInstanceRoom; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); bool has_pod_combat = hasPodCombat(handler.m_interaction_anchor_guid, attribute, handler); handler.m_interaction_log_info.m_has_pod_combat = has_pod_combat; handler.m_interaction_log_info.m_pod_type = ECombatPodType.Storage; var now = DateTimeHelper.Current; if (has_pod_combat) { NullReferenceCheckHelper.throwIfNull(handler.m_pod_combat, () => $"handler.m_pod_combat is null !!!"); var pod_combat = handler.m_pod_combat; handler.m_is_need_combat_pod_noti = true; pod_combat.m_state = PodCombatStateType.Possesion; pod_combat.m_currenct_Pos = player.getCurrentPositionInfo().Pos; pod_combat.m_state_change_time = now; pod_combat.m_active_time = now; pod_combat.m_current_occupier_guid = player.getUserGuid(); pod_combat.m_occupied_time = now; foreach (var stand in attribute.m_combat_pod_mode.m_pod_storages.Values) { stand.m_is_active = false; handler.m_need_noti_objects.Add(stand); } handler.m_interaction_log_info.m_pod_combat_pos = pod_combat.m_currenct_Pos; handler.m_interaction_log_info.m_pod_combat_state = pod_combat.m_state; } else { //보상 줘야되면 보상 처리 var reward_action = battle_instance_room.getEntityAction(); NullReferenceCheckHelper.throwIfNull(reward_action, () => $"handler.m_pod_combat is null !!!"); result = await reward_action.podStorageReward(player, attribute, handler); } return result; } public void updateBattleObjectActiveInfo(BattleObjectInteractionLogicHandler handler) { var now = DateTimeHelper.Current; var next_active_time = now.AddSeconds(handler.m_battle_object_meta.RespawnTime); handler.m_object_active_time = handler.m_interaction_log_info.m_object_next_active_time = handler.m_battle_object.m_active_time = next_active_time; handler.m_battle_object.m_is_active = handler.m_interaction_log_info.m_is_active = false; } public async Task interactPodCombat(BattleObjectInteractionLogicHandler handler, Player player) { await Task.CompletedTask; var result = new Result(); var battle_instance_room = getOwner() as BattleInstanceRoom; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); string err_msg = string.Empty; var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"battle_instance_attribute is null !!!"); var combat_pod = handler.m_pod_combat = attribute.m_combat_pod_mode.m_pod_combat; if (false == combat_pod.m_current_occupier_guid.Equals(string.Empty) && false == combat_pod.m_state.Equals(PodCombatStateType.Dropped)) { //다른 유저가 소유중일때는 상호 작용 할수 없다. err_msg = $"Pod Combat Already accupied Player : {player.toBasicString()}, possessioned user : {combat_pod.m_current_occupier_guid}"; result.setFail(ServerErrorCode.BattleInstancePodCombatAlreadyOccupy, err_msg); Log.getLogger().error(err_msg); return result; } handler.m_is_need_combat_pod_noti = true; var now = DateTimeHelper.Current; combat_pod.m_state = PodCombatStateType.Possesion; combat_pod.m_currenct_Pos = player.getCurrentPositionInfo().Pos; combat_pod.m_state_change_time = now; combat_pod.m_current_occupier_guid = player.getUserGuid(); combat_pod.m_occupied_time = now; handler.m_interaction_log_info.m_battle_object_type = EBattleObjectType.Pod_Combat; handler.m_interaction_log_info.m_pod_type = ECombatPodType.Pod; handler.m_interaction_log_info.m_pod_combat_pos = combat_pod.m_currenct_Pos; handler.m_interaction_log_info.m_pod_combat_state = combat_pod.m_state; return result; } private bool hasPodCombat(string anchorGuid, BattleInstanceSnapshotAttribute attribute, BattleObjectInteractionLogicHandler handler) { var pod_combat = attribute.m_combat_pod_mode.m_pod_combat; if (pod_combat.m_source_storage_anchor_guid.Equals(anchorGuid) && pod_combat.m_state.Equals(PodCombatStateType.Active)) { handler.m_pod_combat = pod_combat; return true; } return false; } }