173 lines
7.1 KiB
C#
173 lines
7.1 KiB
C#
using GameServer.Contents.GameMode.Manage.PlayManage;
|
|
using MetaAssets;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
using ServerCore;
|
|
|
|
namespace GameServer;
|
|
|
|
public class BattleObjectInteractAction : EntityActionBase
|
|
{
|
|
public BattleObjectInteractAction(EntityBase owner) : base(owner)
|
|
{
|
|
}
|
|
|
|
public override async Task<Result> onInit()
|
|
{
|
|
await Task.CompletedTask;
|
|
|
|
var result = new Result();
|
|
|
|
return result;
|
|
}
|
|
public override void onClear()
|
|
{
|
|
|
|
}
|
|
|
|
public async Task<Result> interactCommonBattleObject(BattleObjectInteractionLogicHandler handler, Player player)
|
|
{
|
|
await Task.CompletedTask;
|
|
var result = new Result();
|
|
updateBattleObjectActiveInfo(handler);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
public async Task<Result> 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 GameModeBase;
|
|
NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!");
|
|
var attribute = battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
|
|
|
//보상처리
|
|
var reward_action = battle_instance_room.getEntityAction<BattleObjectRewardAction>();
|
|
NullReferenceCheckHelper.throwIfNull(reward_action, () => $"handler.m_pod_combat is null !!!");
|
|
result = await reward_action.pickupPodReward(player, attribute, handler);
|
|
|
|
return result;
|
|
}
|
|
|
|
public async Task<Result> interactPodStorage(BattleObjectInteractionLogicHandler handler, Player player)
|
|
{
|
|
await Task.CompletedTask;
|
|
var result = new Result();
|
|
|
|
var battle_instance_room = getOwner() as GameModeBase;
|
|
NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!");
|
|
var attribute = battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
|
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<BattleObjectRewardAction>();
|
|
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<Result> interactPodCombat(BattleObjectInteractionLogicHandler handler, Player player)
|
|
{
|
|
await Task.CompletedTask;
|
|
|
|
var result = new Result();
|
|
|
|
var battle_instance_room = getOwner() as GameModeBase;
|
|
NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!");
|
|
|
|
string err_msg = string.Empty;
|
|
var attribute = battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
|
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;
|
|
}
|
|
|
|
} |