154 lines
6.5 KiB
C#
154 lines
6.5 KiB
C#
using GameServer.Contents.Battle.Log;
|
|
using GameServer.Contents.GameMode.Manage.PlayManage;
|
|
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
using ServerCore;
|
|
|
|
namespace GameServer.PacketHandler;
|
|
|
|
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BATTLE_PLAYER_RESPAWN), typeof(BattlePlayerRespawnPacketHandler), typeof(GameLoginListener))]
|
|
public class BattlePlayerRespawnPacketHandler : PacketRecvHandler
|
|
{
|
|
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
|
{
|
|
await Task.CompletedTask;
|
|
|
|
var result = new Result();
|
|
var err_msg = string.Empty;
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var player = entityWithSession as Player;
|
|
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
|
|
var server_config = server_logic.getServerConfig();
|
|
bool is_battle_system_active = server_config.BattleSystemEnable;
|
|
|
|
if (false == is_battle_system_active)
|
|
{
|
|
err_msg = $"is_battle_system_active is false!!!";
|
|
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
|
Log.getLogger().error(err_msg);
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
var room_id = player.getCurrentInstanceRoomId();
|
|
//var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
|
|
|
if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
|
{
|
|
err_msg = $"gameMode is null : room_id - {room_id}";
|
|
Log.getLogger().error(err_msg);
|
|
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
var req_msg = recvMessage as ClientToGame;
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
|
|
|
var request = req_msg.Request.ReqBattlePlayerRespawn;
|
|
if (null == request)
|
|
{
|
|
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
|
Log.getLogger().error(err_msg);
|
|
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
var packet_create_time = request.PacketCreateTime;
|
|
if (packet_create_time is not null)
|
|
{
|
|
Log.getLogger().info($"Battle Player respawn packet received packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
|
}
|
|
|
|
var game_mode_base = gameMode as GameModeBase;
|
|
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!");
|
|
AnchorInfo? anchor_info = null;
|
|
var attribute = game_mode_base.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
|
var next_respawn_time = DateTimeHelper.Current;
|
|
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
|
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
|
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!");
|
|
|
|
using (var releaser = await game_mode_base.getAsyncLock())
|
|
{
|
|
|
|
|
|
(result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(attribute, ffa);
|
|
if (result.isFail())
|
|
{
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
if (false == ffa.m_respawn_pos_anchors_meta.Contains(pos_meta_guid))
|
|
{
|
|
err_msg = $"respawn pos meta not exist pos_meta_guid : {pos_meta_guid}";
|
|
result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg);
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
var now = DateTimeHelper.Current;
|
|
next_respawn_time = now.AddSeconds(ffa.m_ffa_config_meta.PlayerRespawnTime);
|
|
|
|
attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time);
|
|
attribute.modifiedEntityAttribute(true);
|
|
|
|
if (false == game_mode_base.getInstanceRoom().getMap().m_anchors.TryGetValue(pos_meta_guid, out var anchorInfo))
|
|
{
|
|
err_msg = $"anchorInfo not exist pos_meta_guid : {pos_meta_guid}";
|
|
result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg);
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
|
return result;
|
|
}
|
|
|
|
anchor_info = anchorInfo;
|
|
|
|
}
|
|
var cloned_anchor_pos = anchor_info.AnchorPos.Clone();
|
|
cloned_anchor_pos.Z += 100;
|
|
|
|
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, cloned_anchor_pos, result);
|
|
BattleRoomNotifyHelper.send_GS2C_NTF_PLAYER_RESPAWN(ffa, cloned_anchor_pos, player);
|
|
|
|
//로그 남긴다.
|
|
var invokers = new List<ILogInvoker>();
|
|
var log_action = new LogAction(LogActionType.BattleUserRespawn.ToString());
|
|
|
|
var round = attribute.m_combat_pod_mode.m_current_round;
|
|
var round_state = attribute.m_combat_pod_mode.m_round_state_type;
|
|
var users = ffa.getInstanceRoom().tryGetInstanceExistUserForLog();
|
|
BattleRespawnBusinessLog business_log = new(room_id, round, round_state, player.getUserGuid(), player.getUserNickname(), anchor_info.AnchorGuid, next_respawn_time);
|
|
invokers.Add(business_log);
|
|
BusinessLogger.collectLogs(log_action, player, invokers);
|
|
|
|
|
|
return result;
|
|
}
|
|
|
|
public bool send_S2C_ACK_BATTLE_PLAYER_RESPAWN(Player player, Pos? pos, Result result)
|
|
{
|
|
var ack_packet = new ClientToGame();
|
|
ack_packet.Response = new ClientToGameRes();
|
|
|
|
ack_packet.Response.ErrorCode = result.ErrorCode;
|
|
ack_packet.Response.AckBattlePlayerRespawn = new ClientToGameRes.Types.GS2C_ACK_BATTLE_PLAYER_RESPAWN();
|
|
|
|
if (result.isSuccess() && pos is not null)
|
|
{
|
|
ack_packet.Response.AckBattlePlayerRespawn.Pos = pos;
|
|
}
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
} |