374 lines
15 KiB
C#
374 lines
15 KiB
C#
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<InventoryActionBase>();
|
|
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<QueryRunnerWithItemRequest>(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<InventoryActionBase>();
|
|
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<UserItemAttribute>();
|
|
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<QueryRunnerWithItemRequest>( 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<InventoryActionBase>();
|
|
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<QueryRunnerWithDocument>(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<UserInventoryAction>();
|
|
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<ItemAttributeBase>();
|
|
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;
|
|
}
|
|
}
|
|
} |