초기커밋
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user