using System.Collections.Generic; using System; using Amazon.S3.Model; using ServerCore; using ServerBase; using ServerCommon; using MetaAssets; using static ClientToGameReq.Types; using META_ID = System.UInt32; using static System.Runtime.InteropServices.JavaScript.JSType; namespace GameServer; [ChatCommandAttribute("additembyrandom", typeof(ChatCommandAddItemByRandom), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandAddItemByRandom : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { Log.getLogger().info($"Call additembyrandom !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; if (args.Length < 1) { err_msg = $"Not enough argument !!! : argCount:{args.Length} == 2 - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } if (int.TryParse(args[0], out int count) == false) { err_msg = $"Invalid argument !!! - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } if(count > 1000) { err_msg = $"Invalid item random creation count limit over !!! : 1000 >= {count} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var inventory_action_base = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !! - {player.toBasicString()}"); inventory_action_base.writeLog(); var server_logic = GameServerApp.getServerLogic(); var total_items = new Dictionary>(); var fn_item_add_by_random = async delegate () { var result = new Result(); var err_msg = string.Empty; var picked_item_metas = new List(); // 1. random 으로 n개의 ItemMetaData 정보를 얻는다. var item_meta_count_random = new Random(); var random_picked_item_meta_datas = MetaData.Instance._ItemTable .OrderBy(x => item_meta_count_random.Next()) .Take(count) .ToList(); var batch_count = 100; var total_count = random_picked_item_meta_datas.Count; // 2. 추출된 ItemMetaData 정보를 참조하여 모든 아이템을 지급을 시도 한다. for (int i = 0; i < total_count; i += batch_count) { // 2.1. 현재 배치 처리할 범위 계산 및 지급할 ItemMetaData를 구성 한다. int current_batch_count = Math.Min(batch_count, total_count - i); var current_item_meta_datas = random_picked_item_meta_datas.GetRange(i, current_batch_count); err_msg = $"Start batch ItemMeta TakeIn !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}"; Log.getLogger().info(err_msg); // 2.2. 선택된 구간의 ItemMetaData의 아이텝 지급을 시도 한다. foreach (var each in current_item_meta_datas) { var item_count_random = new Random(); var item_meta_id = each.Key; var item_meta_data = each.Value; int to_add_count = item_count_random.Next(1, item_meta_data.StackMaxCount); // 1 이상 StackMaxCount이하의 숫자 -> 즉, 1부터 StackMaxCount까지 err_msg = $"Begin - tryTakalbleToBag() : ItemMetaId:{item_meta_id}, toAddCount:{to_add_count} - {player.toBasicString()}"; Log.getLogger().info(err_msg); (result, var add_or_updated_items) = await inventory_action_base.tryTakalbleToBag((META_ID)item_meta_id, (ushort)to_add_count); if (result.isFail()) { err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } err_msg = $"End - tryTakalbleToBag() : ItemMetaId:{item_meta_id}, toAddCount:{to_add_count} - {player.toBasicString()}"; Log.getLogger().info(err_msg); inventory_action_base.writeLog(); total_items[(META_ID)item_meta_id] = add_or_updated_items; } var batch = new QueryBatchEx( player, LogActionType.CheatCommandItem , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } err_msg = $"End batch ItemMeta TakeIn !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}"; Log.getLogger().info(err_msg); } foreach (var each in total_items) { var item_meta_id = each.Key; var added_or_updated_items = each.Value; ClientToGame clientToGame = new(); clientToGame.Response = new(); clientToGame.Response.AddItemRes = new(); if(false == MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var itemMetaData) || null == itemMetaData) { continue; } (result, _, var bag_tab_type) = inventory_action_base.toBagTypeAndTabType(itemMetaData); clientToGame.Response.AddItemRes.Index = (int)bag_tab_type + 1; foreach (var item in added_or_updated_items) { clientToGame.Response.AddItemRes.Item.Add(item.toItemData4Client()); } player.sendPacket(clientToGame); } return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "Cheat.ItemAddByRandom", fn_item_add_by_random); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } inventory_action_base.writeLog(); foreach (var each in total_items) { var item_meta_id = each.Key; await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, (int)item_meta_id)); } } } [ChatCommandAttribute("delitembyrandom", typeof(ChatCommandDelItemByRandom), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] internal class ChatCommandDelItemByRandom : ChatCommandBase { public override async Task invoke(Player player, string token, string[] args) { Log.getLogger().info($"Call delitembyrandom !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; if (args.Length < 1) { err_msg = $"Not enough argument !!! : argCount:{args.Length} == 2 - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } if (int.TryParse(args[0], out int count) == false) { err_msg = $"Invalid argument !!! - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } if (count > 1000) { err_msg = $"Invalid item random delete count limit over !!! : 1000 >= {count} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return; } var inventory_action_base = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !! - {player.toBasicString()}"); inventory_action_base.writeLog(); var server_logic = GameServerApp.getServerLogic(); var total_items = new Dictionary>(); var fn_item_delete_by_random = async delegate () { var result = new Result(); var err_msg = string.Empty; var picked_item_metas = new List(); // 1. random 으로 n개의 ItemMetaData 정보를 얻는다. var item_meta_count_random = new Random(); var random_picked_item_meta_datas = MetaData.Instance._ItemTable .OrderBy(x => item_meta_count_random.Next()) .Take(count) .ToList(); var batch_count = 100; var total_count = random_picked_item_meta_datas.Count; // 2. 추출된 ItemMetaData 정보를 참조하여 모든 아이템을 삭제를 시도 한다. for (int i = 0; i < total_count; i += batch_count) { // 2.1. 현재 배치 처리할 범위 계산 및 지급할 ItemMetaData를 구성 한다. int current_batch_count = Math.Min(batch_count, total_count - i); var current_item_meta_datas = random_picked_item_meta_datas.GetRange(i, current_batch_count); err_msg = $"Start batch ItemMeta TakeOut !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}"; Log.getLogger().info(err_msg); // 2.2. 선택된 ItemMetaData의 아이텝 삭제를 시도 한다. foreach (var each in current_item_meta_datas) { var item_count_random = new Random(); var item_meta_id = each.Key; var item_meta_data = each.Value; var has_count = inventory_action_base.getItemCountAllByMetaId((META_ID)item_meta_id); var max_random = has_count > item_meta_data.StackMaxCount ? has_count : item_meta_data.StackMaxCount; var to_delete_count = item_count_random.Next(1, max_random); // 1 이상 max_random 이하의 숫자 -> 즉, 1부터 max_random까지 err_msg = $"Begin - tryDeleteItemByMetaId() : ItemMetaId:{item_meta_id}, toDeleteCount:{to_delete_count} - {player.toBasicString()}"; Log.getLogger().info(err_msg); (result, var deleted_items) = await inventory_action_base.tryDeleteItemByMetaId((META_ID)item_meta_id, (ushort)to_delete_count); if (result.isFail()) { err_msg = $"Failed to tryDeleteItemByMetaId() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } err_msg = $"End - tryDeleteItemByMetaId() : ItemMetaId:{item_meta_id}, toAddCount:{to_delete_count} - {player.toBasicString()}"; Log.getLogger().info(err_msg); inventory_action_base.writeLog(); total_items[(META_ID)item_meta_id] = deleted_items; } var batch = new QueryBatchEx( player, LogActionType.CheatCommandItem , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } err_msg = $"End batch ItemMeta TakeOut !!! - at index {i} with {current_batch_count} items - {player.toBasicString()}"; Log.getLogger().info(err_msg); } foreach (var each in total_items) { var item_meta_id = each.Key; var deleted_items = each.Value; ClientToGame clientToGame = new(); clientToGame.Response = new(); clientToGame.Response.RemoveItemsRes = new(); if (false == MetaData.Instance._ItemTable.TryGetValue((int)item_meta_id, out var itemMetaData) || null == itemMetaData) continue; (result, _, var bag_tab_type) = inventory_action_base.toBagTypeAndTabType(itemMetaData); clientToGame.Response.AddItemRes.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.ItemDeleteByRandom", fn_item_delete_by_random); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } inventory_action_base.writeLog(); } }