초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -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;
}
}