Files
caliverse_server/GameServer/Contents/ItemFunction/ItemStressCheat.cs
2025-05-01 07:20:41 +09:00

325 lines
13 KiB
C#

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<InventoryActionBase>();
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<META_ID, List<Item>>();
var fn_item_add_by_random = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
var picked_item_metas = new List<ItemMetaData>();
// 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<QueryRunnerWithDocument>( 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<InventoryActionBase>();
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<META_ID, List<Item>>();
var fn_item_delete_by_random = async delegate ()
{
var result = new Result();
var err_msg = string.Empty;
var picked_item_metas = new List<ItemMetaData>();
// 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<QueryRunnerWithDocument>( 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();
}
}