초기커밋
This commit is contained in:
@@ -0,0 +1,274 @@
|
||||
using Google.Protobuf;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BATTLE_OBJECT_INTERACTION), typeof(BattleObjectInteractionPacketHandler), typeof(GameLoginListener))]
|
||||
|
||||
public class BattleObjectInteractionPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var player = session 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_OBJECT_INTERACTION(player, result, "");
|
||||
return result;
|
||||
}
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqBattleObjectInteraction;
|
||||
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_OBJECT_INTERACTION(player, result, "");
|
||||
return result;
|
||||
}
|
||||
|
||||
var anchor_guid = request.AnchorGuid;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(anchor_guid, () => $"anchor_guid is null !!! - {player.toBasicString()}");
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
|
||||
var room_id = player.getCurrentInstanceRoomId();
|
||||
var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
if (battle_instance_room == null)
|
||||
{
|
||||
err_msg = $"battle_instance_room is null : room_id - {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
return result;
|
||||
}
|
||||
|
||||
var attribute = battle_instance_room.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Battle Object interaction packet received anchor_guid : {anchor_guid}, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
|
||||
BattleObjectInteractionLogicHandler handler = new(player.getUserGuid(), player.getUserNickname(), anchor_guid, attribute.m_room_id);
|
||||
CommonResult common_result = new();
|
||||
var fn_interact_battle_object = async delegate()
|
||||
{
|
||||
using (var releaser = await battle_instance_room.getAsyncLock())
|
||||
{
|
||||
result = await interactObject(handler, battle_instance_room, anchor_guid, player);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
//batch 처리
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.BattleObjectInteraction, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
BattleObjectInteractionBusinessLog business_log = new(handler.m_interaction_log_info);
|
||||
batch.appendBusinessLog(business_log);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
|
||||
if (result.isFail()) return result;
|
||||
|
||||
//보상 내용 가져올것
|
||||
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
common_result = found_transaction_runner.getCommonResult();
|
||||
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafelyWithTransGuid(player.getUserGuid(), TransactionIdType.PrivateContents, "InteractBattleObject", fn_interact_battle_object);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()}, {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//순서 바꾸지 말것(클라 요청사항)
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(battle_instance_room, player.getUserGuid(), anchor_guid);
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battle_instance_room, handler);
|
||||
|
||||
sendOtherNotifies(handler, battle_instance_room, common_result);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void sendOtherNotifies(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, CommonResult commonResult)
|
||||
{
|
||||
//pod combat이 활성화 되서 stand는 전부 비활성화
|
||||
if (handler.m_need_noti_objects.Count > 0)
|
||||
{
|
||||
System.Collections.Generic.List<BattleObjectInfo> infos = new();
|
||||
foreach (var battle_object in handler.m_need_noti_objects)
|
||||
{
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = battle_object.m_anchor_guid;
|
||||
info.IsActive = battle_object.m_is_active ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
}
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battleInstanceRoom, infos);
|
||||
}
|
||||
|
||||
//pod combat 활성화 Noti
|
||||
if (handler.m_is_need_combat_pod_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom);
|
||||
}
|
||||
|
||||
if (handler.m_is_need_combat_pod_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom);
|
||||
}
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_REWARD(battleInstanceRoom, handler.m_user_guid, commonResult);
|
||||
}
|
||||
|
||||
public async Task<Result> interactObject(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
|
||||
handler.m_is_combat_pod = BattleInstancePlayModeHelper.isPodCombat(attribute, anchorGuid);
|
||||
if (handler.m_is_combat_pod)
|
||||
{
|
||||
Log.getLogger().debug($"m is pod combat is true anchor_guid : {anchorGuid}, player : {player.toBasicString()}");
|
||||
result = await interactPodCombat(handler, battleInstanceRoom, anchorGuid, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.getLogger().debug($"m is pod combat is false anchor_guid : {anchorGuid}, player : {player.toBasicString()}");
|
||||
result = await interactBattleObject(handler, battleInstanceRoom, anchorGuid, player);
|
||||
}
|
||||
if (result.isFail()) return result;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> interactBattleObject(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
(result, handler.m_battle_object_meta) = BattleInstancePlayModeHelper.getBattleObjectMeta(handler.m_interaction_anchor_guid, battleInstanceRoom);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var interact_action = battleInstanceRoom.getEntityAction<BattleObjectInteractAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(interact_action, () => $"interact_action is null !!!");
|
||||
|
||||
|
||||
var battle_instance_object = BattleInstancePlayModeHelper.getBattleObject(handler.m_interaction_anchor_guid, attribute, handler.m_battle_object_meta.ObjectType);
|
||||
if (battle_instance_object is null)
|
||||
{
|
||||
err_msg = $"battle_object activate time not yet " +
|
||||
$"anchorGuid : {handler.m_interaction_anchor_guid}, " +
|
||||
$"objectType : {handler.m_battle_object_meta.ObjectType}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceObjectNotExist, err_msg);
|
||||
return result;
|
||||
}
|
||||
handler.m_battle_object = battle_instance_object;
|
||||
|
||||
if (handler.m_battle_object.m_is_active == false)
|
||||
{
|
||||
err_msg = $"battle_object activ is false " +
|
||||
$"anchorGuid : {handler.m_interaction_anchor_guid}, " +
|
||||
$"objectType : {handler.m_battle_object_meta.ObjectType}," +
|
||||
$" nextActivateTime : {handler.m_battle_object.m_active_time}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceObjectInteractionNotActive, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
handler.m_interaction_log_info.m_battle_object_type = handler.m_battle_object_meta.ObjectType;
|
||||
switch (handler.m_battle_object_meta.ObjectType)
|
||||
{
|
||||
case EBattleObjectType.Buff:
|
||||
case EBattleObjectType.Weapon:
|
||||
result = await interact_action.interactCommonBattleObject(handler, player);
|
||||
break;
|
||||
case EBattleObjectType.Pod_Box:
|
||||
result = await interact_action.interactPickupPod(handler, player);
|
||||
break;
|
||||
case EBattleObjectType.Pod_Combat:
|
||||
result = await interact_action.interactPodStorage(handler, player);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public async Task<Result> interactPodCombat(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var interact_action = battleInstanceRoom.getEntityAction<BattleObjectInteractAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(interact_action, () => $"interact_action is null !!!");
|
||||
|
||||
var result = await interact_action.interactPodCombat(handler, player);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public bool send_S2C_ACK_BATTLE_OBJECT_INTERACTION(Player player, Result result, string anchorGuid)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckBattleObjectInteraction = new ClientToGameRes.Types.GS2C_ACK_BATTLE_OBJECT_INTERACTION();
|
||||
ack_packet.Response.AckBattleObjectInteraction.AnchorGuid = anchorGuid;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user