초기커밋

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,141 @@

using ServerCore;
using ServerBase;
using ServerCommon;
namespace GameServer;
public class BeaconAppearanceCustomizeAction : EntityActionBase
{
public BeaconAppearanceCustomizeAction(UgcNpc owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
public async Task<Result> tryLoadAppearanceCustomizeFromDoc(AppearanceCustomizeDoc appearanceCustomizeDoc)
{
var beacon = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(beacon, () => $"beacon is null !!!");
NullReferenceCheckHelper.throwIfNull(appearanceCustomizeDoc, () => $"appearanceCustomizeDoc is null !!! - {beacon.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
var appearance_customize_attrib = appearanceCustomizeDoc.getAttrib<AppearanceCustomizeAttrib>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_attrib, () => $"appearance_customize_attrib is null !!! - {beacon.toBasicString()}");
var appearance_customize_attribute = beacon.getEntityAttribute<AppearanceCustomizeAttribute>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_attribute, () => $"appearance_customize_attribute is null !!!");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(appearance_customize_attribute, new List<DynamoDbDocBase>() { appearanceCustomizeDoc });
if (result.isFail())
{
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{appearance_customize_attribute.getTypeName()}, from:{appearanceCustomizeDoc.getTypeName()} : {result.toBasicString()} - {beacon.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<Result> tryCustomizeAppearance(AppearanceCustomization appearCustomize)
{
var beacon = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(beacon, () => $"beacon is null !!!");
var player = beacon.onGetMasterEntity();
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
var result = new Result();
var err_msg = string.Empty;
var ugcn_npc_action = beacon.getEntityAction<UgcNpcAction>();
NullReferenceCheckHelper.throwIfNull(ugcn_npc_action, () => $"ugcn_npc_action is null !!! - {player.toBasicString()}");
//=====================================================================================
// 1. 비컨의 배치 상태를 체크 한다.
//=====================================================================================
if (true == ugcn_npc_action.isLocatedUgcNpc())
{
err_msg = $"UgcNpc located state !!! : {beacon.toSummaryString()} - {player.toBasicString()}";
result.setFail(ServerErrorCode.UgcNpcLocatedState, err_msg);
return result;
}
//=====================================================================================
// 2. 금전을 소모 한다.
//=====================================================================================
var money_action = player.getEntityAction<MoneyAction>();
NullReferenceCheckHelper.throwIfNull(money_action, () => $"money_action is null !!! - {player.toBasicString()}");
var req_currency_type = (CurrencyType)ServerCommon.MetaHelper.GameConfigMeta.NpcCustomizeCostType;
result = await money_action.spendMoney(req_currency_type, ServerCommon.MetaHelper.GameConfigMeta.NpcCustomizeCost);
if (result.isFail())
{
return result;
}
//=====================================================================================
// 3. 비컨 외형 커스마이징 정보를 갱신 한다.
//=====================================================================================
updateAppearanceCustomize(appearCustomize);
return result;
}
private void updateAppearanceCustomize(AppearanceCustomization appearCustomize)
{
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
var beacon = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(beacon, () => $"beacon is null !!!");
var player = beacon.onGetMasterEntity();
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var appearance_customize_attribute = beacon.getEntityAttribute<AppearanceCustomizeAttribute>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_attribute, () => $"appearance_customize_attribute is null !!!");
appearance_customize_attribute.BasicStyle = appearCustomize.BasicStyle;
appearance_customize_attribute.BodyShape = appearCustomize.BodyShape;
appearance_customize_attribute.HairStyle = appearCustomize.HairStyle;
appearance_customize_attribute.CustomValues = appearCustomize.CustomValues.ToList();
appearance_customize_attribute.modifiedEntityAttribute(true);
}
public AppearanceCustomization toAppearanceCustomization()
{
var beacon = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(beacon, () => $"beacon is null !!!");
var appearance_customize_attribute = beacon.getEntityAttribute<AppearanceCustomizeAttribute>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_attribute, () => $"appearance_customize_attribute is null !!!");
var appearance_customize = new AppearanceCustomization();
appearance_customize.BasicStyle = appearance_customize_attribute.BasicStyle;
appearance_customize.BodyShape = appearance_customize_attribute.BodyShape;
appearance_customize.HairStyle = appearance_customize_attribute.HairStyle;
appearance_customize.CustomValues.AddRange(appearance_customize_attribute.CustomValues.ToList());
return appearance_customize;
}
}

View File

@@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static StackExchange.Redis.Role;
using ServerCore; using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using static ServerCommon.MetaHelper;
using GameServer;
namespace GameServer
{
public class CharacterAppearanceCustomizeAction : EntityActionBase
{
public CharacterAppearanceCustomizeAction(Character owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
public async Task<(Result, CharacterAttribute.AppearanceProfile?)> tryCustomizeAppearance(AppearanceCustomization appearCustomize)
{
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
var character = getOwner() as Character;
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
var player = character.getRootParent() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var result = new Result();
var err_msg = string.Empty;
//=====================================================================================
// 1. 금전을 소모 한다.
//=====================================================================================
var money_action = player.getEntityAction<MoneyAction>();
NullReferenceCheckHelper.throwIfNull(money_action, () => $"money_action is null !!! - {player.toBasicString()}");
var req_currency_type = (CurrencyType)ServerCommon.MetaHelper.GameConfigMeta.CharacterCustomizeCostType;
result = await money_action.spendMoney(req_currency_type, GameConfigMeta.CharacterCustomizeCost);
if (result.isFail())
{
return (result, null);
}
//=====================================================================================
// 2. 캐릭터 외형 커스마이징 정보를 갱신 한다.
//=====================================================================================
var appearance_profile = updateAppearanceCustomize(appearCustomize);
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!! - {player.toBasicString()}");
return (result, appearance_profile);
}
private CharacterAttribute.AppearanceProfile updateAppearanceCustomize(AppearanceCustomization appearCustomize)
{
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
var character = getOwner() as Character;
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
var appearance_profile = character_attribute.AppearanceProfileValue;
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!!");
appearance_profile.BasicStyle = (UInt32)appearCustomize.BasicStyle;
appearance_profile.BodyShape = (UInt32)appearCustomize.BodyShape;
appearance_profile.HairStyle = (UInt32)appearCustomize.HairStyle;
appearance_profile.CustomValues = appearCustomize.CustomValues.ToList();
character_attribute.modifiedEntityAttribute();
return appearance_profile;
}
}
}

View File

@@ -0,0 +1,189 @@
using System.Collections.Concurrent;
using Amazon.S3.Model;
using ServerCore; using ServerBase;
using ServerCommon;
using static ClientToGameReq.Types;
namespace GameServer;
[ChatCommandAttribute("charappearcustom", typeof(ChatCharacterCustomize), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
public class ChatCharacterCustomize : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call charappearcustom !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 3)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 1 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var read_params = new List<int>();
for (var i = 0; i < 3; i++)
{
var param = args[i];
if (true == param.isNullOrWhiteSpace())
{
err_msg = $"Arg {i} is Empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (false == int.TryParse(param, out var value))
{
err_msg = $"Failed to TryParse() !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
read_params.Add(value);
}
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!!");
var selected_character = player_action.getSelectedCharacter();
NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!!");
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
var to_change_character_guid = character_attribute.CharacterGuid;
var appearance_customize = new AppearanceCustomization();
appearance_customize.BasicStyle = read_params[0];
appearance_customize.BodyShape = read_params[1];
appearance_customize.HairStyle = read_params[2];
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
var session = player as IEntityWithSession;
NullReferenceCheckHelper.throwIfNull(session, () => $"session is null !!! - {player.toBasicString()}");
//=====================================================================================
// 패킷 구성
//=====================================================================================
var packet = new ClientToGame();
packet.Request = new ClientToGameReq();
var req_msg = new C2GS_REQ_CHARACTER_APPEARANCE_CUSTOMIZE();
packet.Request.ReqCharacterAppearanceCustomize = req_msg;
req_msg.ToChangeCharacterGuid = to_change_character_guid;
req_msg.ToApplyAppearCustomize = appearance_customize;
result = await server_logic.onCallProtocolHandler(session, packet);
if (result.isFail())
{
err_msg = $"Failed to onCallProtocolHandler() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
}
}
[ChatCommandAttribute("beaconappearcustom", typeof(BeaconCharacterCustomize), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
public class BeaconCharacterCustomize : ChatCommandBase
{
public override async Task invoke(Player player, string token, string[] args)
{
Log.getLogger().info($"Call beaconappearcustom !!! - {player.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (args.Length < 3)
{
err_msg = $"Not enough argument !!! : argCount:{args.Length} == 1 - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var read_params = new List<int>();
for (var i = 0; i < 3; i++)
{
var param = args[i];
if (true == param.isNullOrWhiteSpace())
{
err_msg = $"Arg {i} is Empty !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
if (false == int.TryParse(param, out var value))
{
err_msg = $"Failed to TryParse() !!! - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
read_params.Add(value);
}
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!!");
var had_ugc_npcs = player_action.getHadUgcNpcs().Values.ToList();
NullReferenceCheckHelper.throwIfNull(had_ugc_npcs, () => $"had_ugc_npcs is null !!!");
if(0 >= had_ugc_npcs.Count)
{
err_msg = $"Had not Beacon !!! : 0 < hadCount:{had_ugc_npcs.Count} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
var selected_seq = RandomHelper.next(0, had_ugc_npcs.Count() - 1);
var selected_ugc_npc = had_ugc_npcs[selected_seq];
var beacon_attribute = selected_ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(beacon_attribute, () => $"beacon_attribute is null !!!");
var to_change_beacon_meta_guid = beacon_attribute.UgcNpcMetaGuid;
var appearance_customize = new AppearanceCustomization();
appearance_customize.BasicStyle = read_params[0];
appearance_customize.BodyShape = read_params[1];
appearance_customize.HairStyle = read_params[2];
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
var session = player as IEntityWithSession;
NullReferenceCheckHelper.throwIfNull(session, () => $"session is null !!! - {player.toBasicString()}");
//=====================================================================================
// 패킷 구성
//=====================================================================================
var packet = new ClientToGame();
packet.Request = new ClientToGameReq();
var req_msg = new C2GS_REQ_BEACON_APPEARANCE_CUSTOMIZE();
packet.Request.ReqBeaconAppearanceCustomize = req_msg;
req_msg.ToChangeUgcNpcMetaGuid = to_change_beacon_meta_guid;
req_msg.ToApplyAppearCustomize = appearance_customize;
result = await server_logic.onCallProtocolHandler(session, packet);
if (result.isFail())
{
err_msg = $"Failed to onCallProtocolHandler() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return;
}
}
}

View File

@@ -0,0 +1,177 @@
using Google.Protobuf;
using ServerCore;
using ServerBase;
using ServerCommon;
using static ClientToGameRes.Types;
using BEACON_META_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BEACON_APPEARANCE_CUSTOMIZE), typeof(BeaconAppearanceCustomizePacketHandler), typeof(GameLoginListener))]
public class BeaconAppearanceCustomizePacketHandler : PacketRecvHandler
{
public override async Task onProcessPacketException( ISession entityWithSession, Google.Protobuf.IMessage recvMessage
, Result errorResult )
{
await Task.CompletedTask;
ArgumentNullReferenceCheckHelper.throwIfNull(entityWithSession);
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqBeaconAppearanceCustomize;
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE(player, errorResult, request.ToChangeUgcNpcMetaGuid);
}
private static bool send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE( Player owner, Result result
, BEACON_META_GUID beaconMetaGuid
, AppearanceCustomization? appearCustomize = null )
{
ArgumentNullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!");
var server_logic = GameServerApp.getServerLogic();
var err_msg = string.Empty;
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
var ack_msg = new GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE();
ack_packet.Response.AckBeaconAppearanceCustomize = ack_msg;
ack_msg.ToChangeUgcNpcMetaGuid = beaconMetaGuid;
if (result.isSuccess())
{
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
ack_msg.AppearCustomize = appearCustomize;
var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents);
if (null == found_transaction_runner)
{
err_msg = $"Not found TransactionRunner !!! : {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
ack_msg.CommonResult = found_transaction_runner.getCommonResult();
}
}
if (false == server_logic.onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
{
var result = new Result();
var err_msg = string.Empty;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqBeaconAppearanceCustomize;
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var to_change_beacon_meta_guid = request.ToChangeUgcNpcMetaGuid;
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
if (null == selected_character)
{
err_msg = $"Not selected Character !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.CharacterNotSelected, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE(player, result, to_change_beacon_meta_guid);
return result;
}
var server_logic = GameServerApp.getServerLogic();
var fn_beacon_appearance_customize = async delegate ()
{
var result = new Result();
var found_beacon = player_action.findUgcNpc(to_change_beacon_meta_guid);
if(null == found_beacon)
{
err_msg = $"Not found Beacon !!! : BeaconMetaGuid:{to_change_beacon_meta_guid} - {player.toBasicString()}";
result.setFail(ServerErrorCode.UgcNpcNotFound, err_msg);
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE(player, result, to_change_beacon_meta_guid);
return result;
}
var appearance_customize_action = found_beacon.getEntityAction<BeaconAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {player.toBasicString()}");
result = await appearance_customize_action.tryCustomizeAppearance(request.ToApplyAppearCustomize);
if (result.isFail())
{
err_msg = $"Failed to tryCustomizeAppearance() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE(player, result, to_change_beacon_meta_guid);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.BeaconAppearanceCustomize
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE(player, result, to_change_beacon_meta_guid);
return result;
}
send_GS2C_ACK_BEACON_APPEARANCE_CUSTOMIZE( player, result
, to_change_beacon_meta_guid
, appearance_customize_action.toAppearanceCustomization());
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "BeaconAppearanceCostomize", fn_beacon_appearance_customize);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
}

View File

@@ -0,0 +1,174 @@
using Google.Protobuf;
using ServerCore;
using ServerBase;
using ServerCommon;
using static ClientToGameRes.Types;
using CHARACTER_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_CHARACTER_APPEARANCE_CUSTOMIZE), typeof(CharacterAppearanceCustomizePacketHandler), typeof(GameLoginListener))]
public class CharacterAppearanceCustomizePacketHandler : PacketRecvHandler
{
public override async Task onProcessPacketException( ISession entityWithSession, Google.Protobuf.IMessage recvMessage
, Result errorResult )
{
await Task.CompletedTask;
ArgumentNullReferenceCheckHelper.throwIfNull(entityWithSession);
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqCharacterAppearanceCustomize;
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE(player, errorResult, request.ToChangeCharacterGuid);
}
private static bool send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE( Player owner, Result result
, CHARACTER_GUID characterGuid
, AppearanceCustomization? appearCustomize = null)
{
ArgumentNullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"owner is null !!!");
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
var err_msg = string.Empty;
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
var ack_msg = new GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE();
ack_packet.Response.AckCharacterAppearanceCustomize = ack_msg;
ack_msg.ToChangeCharacterGuid = characterGuid;
if (result.isSuccess())
{
ArgumentNullReferenceCheckHelper.throwIfNull(appearCustomize, () => $"appearCustomize is null !!!");
ack_msg.AppearCustomize = appearCustomize;
var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents);
if (null == found_transaction_runner)
{
err_msg = $"Not found TransactionRunner !!! : {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
ack_msg.CommonResult = found_transaction_runner.getCommonResult();
}
}
if (false == server_logic.onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
{
var result = new Result();
var err_msg = string.Empty;
var player = entityWithSession as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}");
var request = recv_msg.Request.ReqCharacterAppearanceCustomize;
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var to_change_character_guid = request.ToChangeCharacterGuid; // 클라이언트는 USER_GUID를 사용 한다.
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
if (null == selected_character)
{
err_msg = $"Not selected Character !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.CharacterNotSelected, err_msg);
Log.getLogger().error(result.toBasicString());
send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE(player, result, to_change_character_guid);
return result;
}
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
var fn_character_appearance_customize = async delegate ()
{
var result = new Result();
var character_action = selected_character.getEntityAction<CharacterAction>();
NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {player.toBasicString()}");
var appearance_customize_action = selected_character.getEntityAction<CharacterAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {player.toBasicString()}");
(result, var aprearance_profile) = await appearance_customize_action.tryCustomizeAppearance(request.ToApplyAppearCustomize);
NullReferenceCheckHelper.throwIfNull(aprearance_profile, () => $"aprearance_profile is null !!!");
if (result.isFail())
{
err_msg = $"Failed to tryCustomizeAppearance() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE(player, result, to_change_character_guid);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.CharacterAppearanceCustomize
, server_logic.getDynamoDbClient()
, true);
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE(player, result, to_change_character_guid);
return result;
}
send_GS2C_ACK_CHARACTER_APPEARANCE_CUSTOMIZE( player, result
, to_change_character_guid
, aprearance_profile.toCharacterAppearanceCustomize4Client() );
// 주변 엔티티들에게 통지 한다.
character_action.broadcastCharacterInfo();
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CharacterAppearanceCostomize", fn_character_appearance_customize);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
}