using Amazon.S3.Model; using ServerCore; using ServerBase; using ServerCommon; using static ClientToGameReq.Types; using META_ID = System.UInt32; using Amazon.DynamoDBv2.Model; namespace GameServer; [ChatCommandAttribute("additem", typeof(ChatCommandAddItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandAddItem : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); Log.getLogger().info($"Call additem !!! - {player.toBasicString()}"); if (args.Length < 2) return; if (int.TryParse(args[0], out int itemId) == false || int.TryParse(args[1], out int count) == false) return; var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var fn_item_add = async delegate () { var result = new Result(); var err_msg = string.Empty; ClientToGame clientToGame = new(); clientToGame.Response = new(); clientToGame.Response.AddItemRes = new(); var inventory_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !! - {player.toBasicString()}"); (result, var add_or_updated_items) = await inventory_action.tryTakalbleToBag((uint)itemId, (ushort)count); if (result.isFail()) { err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var batch = new QueryBatchEx(player, LogActionType.CheatCommandItem , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } MetaData.Instance._ItemTable.TryGetValue((int)itemId, out var itemMetaData); NullReferenceCheckHelper.throwIfNull(itemMetaData, () => $"item meta data is null !! - item id : {itemId}"); (result, _, var bag_tab_type) = inventory_action.toBagTypeAndTabType(itemMetaData); clientToGame.Response.AddItemRes.Index = (int)bag_tab_type + 1; foreach (var item in add_or_updated_items) { clientToGame.Response.AddItemRes.Item.Add(item.toItemData4Client()); } player.sendPacket(clientToGame); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemAdd", fn_item_add); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, itemId)); } } [ChatCommandAttribute("updateitem", typeof(ChatCommandUpdateItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandUpdateItem : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); Log.getLogger().info($"Call additem !!! - {player.toBasicString()}"); if (args.Length < 2) return; if ( int.TryParse(args[0], out int item_meta_id) == false || int.TryParse(args[1], out int to_change_count) == false ) { return; } var result = new Result(); var err_msg = string.Empty; if (to_change_count <= 0) { err_msg = $"Invalid Item Count : 0 < toChangeCount:{to_change_count}, itemMetaId:{item_meta_id} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var server_logic = GameServerApp.getServerLogic(); var db_client = server_logic.getDynamoDbClient(); var fn_update_item = async delegate () { var result = new Result(); var err_msg = string.Empty; var packet = new ClientToGame(); packet.Response = new ClientToGameRes(); var ack_msg = new ClientToGameRes.Types.AddItemRes(); packet.Response.AddItemRes = ack_msg; var inventory_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !! - {player.toBasicString()}"); if (!MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var found_item_meta_data)) { err_msg = $"Not found meta of Item !!! : itemMetaId:{item_meta_id} - {player.toBasicString()}"; result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var found_items = inventory_action.tryGetItemAllByItemMetaId((META_ID)item_meta_id); if(0 >= found_items.Count) { err_msg = $"Not found Item : itemMetaId:{item_meta_id} - {player.toBasicString()}"; result.setFail(ServerErrorCode.ItemNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var target_item = found_items[0]; var item_attribute = target_item.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !! - {player.toBasicString()}"); item_attribute.ItemStackCount = (UInt16)Math.Min(found_item_meta_data.StackMaxCount, to_change_count); item_attribute.modifiedEntityAttribute(); var batch = new QueryBatchEx( player, LogActionType.CheatCommandItem , server_logic.getDynamoDbClient() ); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); batch.addQuery(new QueryFinal()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } player.sendPacket(packet); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemUpdate", fn_update_item); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } } } [ChatCommandAttribute("delitem", typeof(ChatCommandDelItem), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandDelItem : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { Log.getLogger().info($"Call delitem !!! - {player.toBasicString()}"); if (args.Length < 2) return; if (int.TryParse(args[0], out int itemId) == false || int.TryParse(args[1], out int count) == false) return; var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var fn_item_delete = async delegate () { var result = new Result(); var err_msg = string.Empty; ClientToGame clientToGame = new(); clientToGame.Response = new(); clientToGame.Response.RemoveItemsRes = new(); var inventory_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"InventoryActionBase is null !!! - {player.toBasicString()}"); (result, var deleted_items) = await inventory_action.tryDeleteItemByMetaId((META_ID)itemId, (ushort)count); if (result.isFail()) { err_msg = $"Failed to tryDeleteItemByMetaId() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var batch = new QueryBatchEx(player, LogActionType.CheatCommandItem , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } MetaData.Instance._ItemTable.TryGetValue((int)itemId, out var itemMetaData); NullReferenceCheckHelper.throwIfNull(itemMetaData, () => $"itemMetaData is null !! - item id:{itemId}"); (result, _, var bag_tab_type) = inventory_action.toBagTypeAndTabType(itemMetaData); clientToGame.Response.RemoveItemsRes.Index = (int)bag_tab_type + 1; foreach (var item in deleted_items) { clientToGame.Response.RemoveItemsRes.Item.Add(item.toItemData4Client()); } player.sendPacket(clientToGame); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemDelete", fn_item_delete); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } } } [ChatCommandAttribute("megaphone", typeof(ChatCommandMegaPhone), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandMegaPhone : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { await Task.CompletedTask; Log.getLogger().info($"HandleMegaPhone"); if (args.Length < 1) { Log.getLogger().error($"Invalid Argument"); return; } var server_logic = GameServerApp.getServerLogic(); var receivers = server_logic.getPlayerManager().getUsers(); foreach (var receiver in receivers) { ChatNotifyHelper.send_S2C_NTF_CHAT(receiver.Value, ChatType.Channel, player.getUserNickname(), receiver.Value.getUserNickname(), PlayerStateType.None, args[0]); } } } [ChatCommandAttribute("leveluptattoo", typeof(ChatCommandLevelUpTattoo), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandLevelUpTattoo : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { Log.getLogger().info($"Call leveluptattoo !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; if (args.Length < 1) { err_msg = $"Not enough argument !!! : argCount:{args.Length} == 1 - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var param = args[0]; if (true == param.isNullOrWhiteSpace()) { err_msg = $"Arg 1 is Empty !!! - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } if(false == int.TryParse(param, out var slot_no)) { err_msg = $"Failed to TryParse() !!! - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var tatoo_slot_type = (TattooSlotType)slot_no; var user_inventory_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {player.toBasicString()}"); user_inventory_action.getEquipInvens().TryGetValue(InvenEquipType.Tattoo, out var found_equip_inven); NullReferenceCheckHelper.throwIfNull(found_equip_inven, () => $"found_equip_inven is null !!! - {player.toBasicString()}"); var tattoo_inven = found_equip_inven as TattooEquipInven; NullReferenceCheckHelper.throwIfNull(tattoo_inven, () => $"tattoo_inven is null !!! - {player.toBasicString()}"); var tattoo_inven_data = tattoo_inven.getData(); NullReferenceCheckHelper.throwIfNull(tattoo_inven_data, () => $"tattoo_inven_data is null !!! - {player.toBasicString()}"); var found_tattoo = tattoo_inven_data.findEntityBaseInSlotType(tatoo_slot_type); if(null == found_tattoo) { err_msg = $"Not found Tattoo !!! : tattooSlotType:{tatoo_slot_type} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var item_attribute = found_tattoo.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {player.toBasicString()}"); var tattoo_item_guid = item_attribute.ItemGuid; 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 request = new LevelUpTattooReq(); packet.Request.LevelUpTattooReq = request; request.ItemGuid = tattoo_item_guid; 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; } } }