초기커밋
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ChangeStateReq), typeof(ChangeStatePacketHandler), typeof(GameLoginListener))]
|
||||
public class ChangeStatePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_CHANGE_STATE(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.ChangeStateRes = new();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var state_action = entity_player.getEntityAction<StateAction>();
|
||||
if (state_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get state action : {nameof(StateAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_CHANGE_STATE(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.ChangeStateReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_CHANGE_STATE(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.ChangeStateReq;
|
||||
|
||||
if (EnumHelper.isDefined<PlayerStateType>(request.State) == false)
|
||||
{
|
||||
err_msg = $"is Not Defined PlayerStateType !!! PlayerStateType : {request.State} - {entity_player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.ServerTypeInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_CHANGE_STATE(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var player_state_type = (PlayerStateType)request.State;
|
||||
|
||||
result = await state_action.ChangeState(player_state_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to ChangeState() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_CHANGE_STATE(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
send_S2C_ACK_CHANGE_STATE(entity_player, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_ENTITY_STATE_DANCE_END), typeof(EntityStateDanceEndPacketHandler), typeof(GameLoginListener))]
|
||||
public class EntityStateDanceEndPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(game_msg, () => $"game_msg is null !!! - {player.toBasicString()}");
|
||||
var request = game_msg.Request.ReqEntityStateDanceEnd;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
|
||||
|
||||
|
||||
var player_action = player.getEntityAction<PlayerAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var selected_character = player_action.getSelectedCharacter();
|
||||
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {player.toBasicString()}");
|
||||
|
||||
var character_action = selected_character.getEntityAction<CharacterAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var game_zone_action = player.getEntityAction<GameZoneAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
|
||||
|
||||
//var server_logic = GameServerApp.getServerLogic();
|
||||
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
var change_type = EntityStateType.None;
|
||||
character_action.setStateInfo(change_type, "", 0);
|
||||
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result);
|
||||
|
||||
/*
|
||||
댄스 상태는 휘발성 상태로 판단하여 트랜잭션 처리하지 않고 메모리에서만 판단
|
||||
추후 사이드 이펙트 있을경우를 대비해 당분간 코드는 주석으로 남겨놓음 25년 2월 이후 삭제 예정 24-12-03
|
||||
var fn_change_entity_state_type = async delegate()
|
||||
{
|
||||
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
//현재 상태가 DANCE가 아닌데 패킷이 오면 예외 처리를 해줘야 되나? 말아야 되나? 일단 해주자.
|
||||
if (character_attribute.StateInfo.StateType != EntityStateType.Dancing)
|
||||
{
|
||||
err_msg = $"Current state is not dancing !!! current State : {character_attribute.StateInfo.StateType}, player : {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.EntityStateNotDancing, err_msg);
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result);
|
||||
}
|
||||
|
||||
var change_type = EntityStateType.None;
|
||||
|
||||
character_action.setStateInfo(change_type, "", 0);
|
||||
character_attribute.modifiedEntityAttribute();
|
||||
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.DanceEntityStateEnd
|
||||
, server_logic.getDynamoDbClient()
|
||||
, true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
//log 추가
|
||||
batch.appendBusinessLog(new ChangeDanceEntityStateBusinessLog(EntityStateType.Dancing, change_type, "", 0));
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_END(player, result);
|
||||
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ChangeEntityStateType", fn_change_entity_state_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
ServerCore.Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}*/
|
||||
character_action.broadcastCharacterInfo();
|
||||
|
||||
var invokers = new List<ILogInvoker>();
|
||||
var log_action = new LogActionEx(LogActionType.DanceEntityStateEnd);
|
||||
invokers.Add(new ChangeDanceEntityStateBusinessLog(EntityStateType.Dancing, change_type, "", 0));
|
||||
BusinessLogger.collectLogs(log_action, player, invokers);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static bool send_C2GS_ACK_ENTITY_STATE_DANCE_END(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckEntityStateDanceEnd = new();
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_ENTITY_STATE_DANCE_START), typeof(EntityStateDanceStartPacketHandler), typeof(GameLoginListener))]
|
||||
public class EntityStateDanceStartPacketHandler : PacketRecvHandler
|
||||
{
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(game_msg, () => $"game_msg is null !!! - {player.toBasicString()}");
|
||||
var request = game_msg.Request.ReqEntityStateDanceStart;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
|
||||
|
||||
var meta_guid = request.MetaGuid;
|
||||
if (meta_guid == null) meta_guid = string.Empty;
|
||||
|
||||
var meta_id = request.MetaId;
|
||||
|
||||
var player_action = player.getEntityAction<PlayerAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var selected_character = player_action.getSelectedCharacter();
|
||||
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {player.toBasicString()}");
|
||||
|
||||
var character_action = selected_character.getEntityAction<CharacterAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var game_zone_action = player.getEntityAction<GameZoneAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
|
||||
|
||||
//var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
|
||||
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var origin_state = character_attribute.StateInfo.StateType;
|
||||
|
||||
character_action.setStateInfo(EntityStateType.Dancing, meta_guid, meta_id);
|
||||
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_START(player, result, meta_id);
|
||||
|
||||
/*
|
||||
댄스 상태는 휘발성 상태로 판단하여 트랜잭션 처리하지 않고 메모리에서만 판단
|
||||
추후 사이드 이펙트 있을경우를 대비해 당분간 코드는 주석으로 남겨놓음 25년 2월 이후 삭제 예정 24-12-03
|
||||
var fn_change_entity_state_type = async delegate()
|
||||
{
|
||||
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var origin_state = character_attribute.StateInfo.StateType;
|
||||
|
||||
character_action.setStateInfo(EntityStateType.Dancing, meta_guid, meta_id);
|
||||
character_attribute.modifiedEntityAttribute();
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.DanceEntityStateStart
|
||||
, server_logic.getDynamoDbClient()
|
||||
, true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
//log 추가
|
||||
batch.appendBusinessLog(new ChangeDanceEntityStateBusinessLog(origin_state, EntityStateType.Dancing, meta_guid, meta_id));
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_START(player, result, meta_id);
|
||||
return result;
|
||||
}
|
||||
send_C2GS_ACK_ENTITY_STATE_DANCE_START(player, result, meta_id);
|
||||
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ChangeEntityStateType", fn_change_entity_state_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
ServerCore.Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}*/
|
||||
character_action.broadcastCharacterInfo();
|
||||
|
||||
var invokers = new List<ILogInvoker>();
|
||||
var log_action = new LogActionEx(LogActionType.DanceEntityStateStart);
|
||||
invokers.Add(new ChangeDanceEntityStateBusinessLog(origin_state, EntityStateType.Dancing, meta_guid, meta_id));
|
||||
BusinessLogger.collectLogs(log_action, player, invokers);
|
||||
|
||||
await Task.CompletedTask;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static bool send_C2GS_ACK_ENTITY_STATE_DANCE_START(Player player, Result result, UInt32 metaId)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckEntityStateDanceStart = new();
|
||||
ack_packet.Response.AckEntityStateDanceStart.MetaId = metaId;
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
66
GameServer/Contents/State/PacketHandler/PickPacketHandler.cs
Normal file
66
GameServer/Contents/State/PacketHandler/PickPacketHandler.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_PING), typeof(PickPacketHandler), typeof(GameLoginListener))]
|
||||
public class PickPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.ChangeStateReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_PING(entity_player, result, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.ReqPing;
|
||||
|
||||
var idx = request.Idx;
|
||||
|
||||
send_S2C_ACK_PING(entity_player, result, idx);
|
||||
|
||||
await Task.CompletedTask;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static bool send_S2C_ACK_PING(Player player, Result result, int idx)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckPing = new();
|
||||
ack_packet.Response.AckPing.Idx = idx;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
34
GameServer/Contents/State/PacketHandler/StateNotifyHelper.cs
Normal file
34
GameServer/Contents/State/PacketHandler/StateNotifyHelper.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class StateNotifyHelper
|
||||
{
|
||||
public static bool send_S2C_NTF_CHANGE_STATE(Player player, PlayerStateType playerStateType)
|
||||
{
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var noti_packet = new ClientToGame();
|
||||
noti_packet.Message = new();
|
||||
noti_packet.Message.ChangeStateNoti = new();
|
||||
|
||||
noti_packet.Message.ChangeStateNoti.ActorGuid = player.getUserGuid();
|
||||
noti_packet.Message.ChangeStateNoti.State = (int)playerStateType;
|
||||
|
||||
var game_zone_action = player.getEntityAction<GameZoneAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
game_zone_action.broadcast(player, noti_packet);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user