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(); 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(); 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(); 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(); 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(); 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(); 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; } } }