초기커밋
This commit is contained in:
541
GameServer/Contents/Cart/Action/CartAction.cs
Normal file
541
GameServer/Contents/Cart/Action/CartAction.cs
Normal file
@@ -0,0 +1,541 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using GameServer.PacketHandler;
|
||||
|
||||
|
||||
using META_ID = System.UInt32;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class CartAction : EntityActionBase
|
||||
{
|
||||
private Cart? m_Cart = null;
|
||||
|
||||
public CartAction(Player owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
m_Cart = new(player);
|
||||
await m_Cart.onInit();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(m_Cart, () => $"m_Cart is null !!!");
|
||||
m_Cart.onCearAll();
|
||||
}
|
||||
|
||||
public Result AddCartFromDoc(CartDoc? cartDoc)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if (cartDoc == null) return result;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(m_Cart, () => $"m_Cart is null !!!");
|
||||
var cart_attribute = m_Cart.getEntityAttribute<CartAttribute>();
|
||||
if (cart_attribute == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart attribute : {nameof(CartAttribute)}";
|
||||
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
if(cart_attribute.copyEntityAttributeFromDoc(cartDoc) == false)
|
||||
{
|
||||
err_msg = $"Failed copyEntityAttributeFromDoc !!! - {typeof(CartAction).Name}";
|
||||
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public Result GetCart4Client()
|
||||
{
|
||||
var result = new Result();
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
GetCartPacketHandler.send_S2C_ACK_GET_CART(player, result, m_Cart);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> AddCartProcess(META_ID item_meta_id, int count, CurrencyType currency_type)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
|
||||
|
||||
var fn_add_cart = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var invokers = new List<ILogInvoker>();
|
||||
|
||||
(result, int item_sum_count) = AddCart(item_meta_id, count, currency_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
PacketHandler.AddCartPacketHandler.send_S2C_ACK_ADD_CART(player, result, 0, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
List<(META_ID, int)> deltaCartList = new List<(META_ID, int)>() { (item_meta_id, count) };
|
||||
var task_log_data = CartBusinessLogHelper.toLogInfo(deltaCartList);
|
||||
invokers.Add(new CartBusinessLog(task_log_data));
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.CartAdd
|
||||
, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(invokers);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
AddCartPacketHandler.send_S2C_ACK_ADD_CART(player, result, 0, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
AddCartPacketHandler.send_S2C_ACK_ADD_CART(player, result, item_meta_id, item_sum_count);
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "AddCart", fn_add_cart);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> DeleteCartProcess(List<CartItemInfo> req_del_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
|
||||
|
||||
var fn_delete_cart = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var invokers = new List<ILogInvoker>();
|
||||
|
||||
(result, var isRemoveItem) = DeleteCart(req_del_cart_items);
|
||||
if (result.isFail())
|
||||
{
|
||||
DelCartPacketHandler.send_S2C_ACK_DEL_CART(player, result, false);
|
||||
return result;
|
||||
}
|
||||
|
||||
List<(META_ID, int)> deltaCartList = req_del_cart_items.Select(x => ((META_ID)x.ItemId, x.Count)).ToList();
|
||||
var task_log_data = CartBusinessLogHelper.toLogInfo(deltaCartList);
|
||||
invokers.Add(new CartBusinessLog(task_log_data));
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.CartDelete
|
||||
, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(invokers);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
DelCartPacketHandler.send_S2C_ACK_DEL_CART(player, result, false);
|
||||
return result;
|
||||
}
|
||||
|
||||
DelCartPacketHandler.send_S2C_ACK_DEL_CART(player, result, isRemoveItem);
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "DeleteCart", fn_delete_cart);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> BuyCartProcess(List<CartItemInfo> req_buy_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
if (req_buy_cart_items.Count == 0)
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var fn_buy_cart = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var invokers = new List<ILogInvoker>();
|
||||
|
||||
// 카트에서 제거
|
||||
var deleteResult = DeleteCart(req_buy_cart_items);
|
||||
if (deleteResult.result.isFail())
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
List<(META_ID, int)> deltaCartList = req_buy_cart_items.Select(x => ((META_ID)x.ItemId, x.Count)).ToList();
|
||||
var task_log_data = CartBusinessLogHelper.toLogInfo(deltaCartList);
|
||||
invokers.Add(new CartBusinessLog(task_log_data));
|
||||
|
||||
// 재화 차감
|
||||
result = await PayCurrencyForItem(req_buy_cart_items);
|
||||
if (result.isFail())
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 아이템 지급
|
||||
var takeItemResult = await TakeCartItem(req_buy_cart_items);
|
||||
if (takeItemResult.result.isFail())
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await updateItemFirstPurchaseHistory(req_buy_cart_items);
|
||||
if (result.isFail())
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.CartPurchase
|
||||
, server_logic.getDynamoDbClient(), true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(invokers);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
BuyCartPacketHandler.send_S2C_ACK_BUY_CART(player, result, takeItemResult.changed_Items);
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "BuyCart", fn_buy_cart);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private (Result result, Int32 item_sum_count) AddCart(META_ID item_meta_id, int count, CurrencyType currency_type)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
NullReferenceCheckHelper.throwIfNull(m_Cart, () => $"m_Cart is null !!!");
|
||||
var cart_attribute = m_Cart.getEntityAttribute<CartAttribute>();
|
||||
if (cart_attribute == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart attribute : {nameof(CartAttribute)}";
|
||||
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, 0);
|
||||
}
|
||||
|
||||
cart_attribute.CartItems.TryGetValue(currency_type, out var category_cart_items);
|
||||
NullReferenceCheckHelper.throwIfNull(category_cart_items, () => $"category_cart_items is null !!!");
|
||||
|
||||
if (category_cart_items.Count >= 20)
|
||||
{
|
||||
err_msg = $"cart is Full. currency_type : {currency_type}";
|
||||
result.setFail(ServerErrorCode.CartMaxCountExceed, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, 0);
|
||||
}
|
||||
|
||||
int sum_count = count;
|
||||
if (category_cart_items.TryGetValue(item_meta_id, out var cur_count) == false)
|
||||
{
|
||||
category_cart_items.TryAdd(item_meta_id, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
sum_count += cur_count;
|
||||
category_cart_items[item_meta_id] = sum_count;
|
||||
}
|
||||
|
||||
var player = m_Cart.getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
result = player.checkItemFirstPurchaseItemCount((int)item_meta_id, sum_count);
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, 0);
|
||||
}
|
||||
|
||||
if (sum_count > 99)
|
||||
{
|
||||
err_msg = $"FullStack of this item in cart. itemId : {item_meta_id}";
|
||||
result.setFail(ServerErrorCode.CartStackCountInvalid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, 0);
|
||||
}
|
||||
|
||||
cart_attribute.modifiedEntityAttribute();
|
||||
|
||||
return (result, sum_count);
|
||||
}
|
||||
|
||||
private (Result result, bool isRemovedItem) DeleteCart(List<CartItemInfo> del_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
bool isRemovedItem = false;
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(m_Cart, () => $"m_Cart is null !!!");
|
||||
var cart_attribute = m_Cart.getEntityAttribute<CartAttribute>();
|
||||
if (cart_attribute == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart attribute : {nameof(CartAttribute)}";
|
||||
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
|
||||
foreach (var del_cart_item in del_cart_items)
|
||||
{
|
||||
if (EnumHelper.tryParse<CurrencyType>(del_cart_item.BuyType, out var currencyType) == false)
|
||||
{
|
||||
err_msg = $"Enum Pase Failed. BuyType : {del_cart_item.BuyType}";
|
||||
result.setFail(ServerErrorCode.CartInvalidCurrencyType, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
|
||||
if(MetaData.Instance._ItemTable.TryGetValue(del_cart_item.ItemId, out var itemData) == false)
|
||||
{
|
||||
err_msg = $"Not found meta of Item !!! : ItemMetaId:{del_cart_item.ItemId} - {getOwner().toBasicString()}";
|
||||
result.setFail(ServerErrorCode.CartMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
|
||||
int cur_count = 0;
|
||||
foreach(var category_cart_items in cart_attribute.CartItems.Values)
|
||||
{
|
||||
if (category_cart_items.TryGetValue((META_ID)del_cart_item.ItemId, out cur_count) == false)
|
||||
continue;
|
||||
|
||||
if (del_cart_item.Count > cur_count)
|
||||
{
|
||||
err_msg = $"Argument count is bigger then cart Item count. cur_count : {cur_count}, req_buy_count : {del_cart_item.Count}";
|
||||
result.setFail(ServerErrorCode.CartStackCountNotEnough, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
|
||||
category_cart_items[(META_ID)del_cart_item.ItemId] = cur_count - del_cart_item.Count;
|
||||
if (cur_count - del_cart_item.Count == 0)
|
||||
{
|
||||
category_cart_items.Remove((META_ID)del_cart_item.ItemId);
|
||||
isRemovedItem = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(cur_count == 0)
|
||||
{
|
||||
err_msg = $"Not found itemid from category_cart_items. itemId : {del_cart_item.ItemId}";
|
||||
result.setFail(ServerErrorCode.CartItemNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
}
|
||||
|
||||
cart_attribute.modifiedEntityAttribute();
|
||||
|
||||
return (result, isRemovedItem);
|
||||
}
|
||||
|
||||
private async Task<Result> PayCurrencyForItem(List<CartItemInfo> buy_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var my_shop_product = getOwner();
|
||||
var player = my_shop_product.getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var money_action = player.getEntityAction<MoneyAction>();
|
||||
if (null == money_action)
|
||||
{
|
||||
var err_msg = $"Fail to get Money Action : {nameof(MoneyAction)}.";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
Dictionary<CurrencyType, double> changeMoneys = new Dictionary<CurrencyType, double>();
|
||||
|
||||
foreach(var buy_item in buy_cart_items)
|
||||
{
|
||||
if(MetaData.Instance._ItemTable.TryGetValue(buy_item.ItemId, out var item_data) == false)
|
||||
{
|
||||
var err_msg = $"Not Found ItemDataTable Item Id : {buy_item.ItemId}";
|
||||
result.setFail(ServerErrorCode.CartMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = player.checkItemFirstPurchaseItemCount(buy_item.ItemId, buy_item.Count);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var check_currency_type = ShopHelper.checkCurrencyTypeFromCurrencyId(item_data.Buy_id);
|
||||
if (check_currency_type.result.isFail()) return check_currency_type.result;
|
||||
|
||||
if (changeMoneys.TryGetValue(check_currency_type.currencyType, out var price) == false)
|
||||
{
|
||||
changeMoneys.Add(check_currency_type.currencyType, 0);
|
||||
}
|
||||
|
||||
var item_first_purchase_history_agent_action = player.getEntityAction<ItemFirstPurchaseHistoryAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_first_purchase_history_agent_action, () => $"item_first_purchase_history_agent_action is null !!!");
|
||||
|
||||
var item_price = item_data.BuyPrice;
|
||||
if (item_first_purchase_history_agent_action.isItemFirstPurchase(buy_item.ItemId))
|
||||
{
|
||||
item_price = ((item_data.BuyPrice * 100) - (item_data.BuyPrice * item_data.Buy_Discount_Rate)) / 100;
|
||||
}
|
||||
|
||||
changeMoneys[check_currency_type.currencyType] += (-1 * item_price * buy_item.Count);
|
||||
}
|
||||
|
||||
foreach(var changeMoney in changeMoneys)
|
||||
{
|
||||
result = await money_action.changeMoney(changeMoney.Key, changeMoney.Value);
|
||||
if (result.isFail()) return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<(Result result, List<Item>? changed_Items)> TakeCartItem(List<CartItemInfo> buy_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var inventory_action = player.getEntityAction<InventoryActionBase>();
|
||||
if (null == inventory_action)
|
||||
{
|
||||
var err_msg = $"Fail to get Inventory Action : {nameof(InventoryActionBase)}.";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
List<Item> buy_changed_items = new List<Item>();
|
||||
foreach(var buy_item in buy_cart_items)
|
||||
{
|
||||
(result, var changed_items) = await inventory_action.tryTakalbleToBag((META_ID)buy_item.ItemId, (ushort)buy_item.Count);
|
||||
if (result.isFail()) return (result, null);
|
||||
|
||||
buy_changed_items.AddRange(changed_items);
|
||||
}
|
||||
|
||||
return (result, buy_changed_items);
|
||||
}
|
||||
|
||||
public Cart getCart()
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(m_Cart, () => $"m_Cart is null !!!");
|
||||
return m_Cart;
|
||||
}
|
||||
|
||||
async Task<Result> updateItemFirstPurchaseHistory(List<CartItemInfo> buy_cart_items)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var item_first_purchase_history_agent_action = player.getEntityAction<ItemFirstPurchaseHistoryAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_first_purchase_history_agent_action, () => $"item_first_purchase_history_agent_action is null !!!");
|
||||
|
||||
foreach (var buy_item in buy_cart_items)
|
||||
{
|
||||
if (!item_first_purchase_history_agent_action.isItemFirstPurchase(buy_item.ItemId))
|
||||
continue;
|
||||
|
||||
result = await item_first_purchase_history_agent_action.tryAddItemFirstPurchaseHistoryFromMetaId(buy_item.ItemId);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
58
GameServer/Contents/Cart/Cart.cs
Normal file
58
GameServer/Contents/Cart/Cart.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class Cart : EntityBase
|
||||
{
|
||||
public Cart(Player parent)
|
||||
: base(EntityType.Cart, parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
var direct_parent = getDirectParent();
|
||||
NullReferenceCheckHelper.throwIfNull(direct_parent, () => $"direct_parent is null !!!");
|
||||
addEntityAttribute(new CartAttribute(this, direct_parent));
|
||||
|
||||
return await base.onInit();
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
|
||||
public List<CartItemInfo> toCartItemData4Client()
|
||||
{
|
||||
var cart_item_list_4_client = new List<CartItemInfo>();
|
||||
var cart_attribute = getEntityAttribute<CartAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(cart_attribute, () => $"cart_attribute is null !!!");
|
||||
|
||||
foreach (var cart_category_item in cart_attribute.CartItems)
|
||||
{
|
||||
foreach(var cartitem in cart_category_item.Value)
|
||||
{
|
||||
CartItemInfo cart_item = new CartItemInfo();
|
||||
cart_item.BuyType = cart_category_item.Key.ToString();
|
||||
cart_item.ItemId = (Int32)cartitem.Key;
|
||||
cart_item.Count = cartitem.Value;
|
||||
cart_item_list_4_client.Add(cart_item);
|
||||
}
|
||||
}
|
||||
|
||||
return cart_item_list_4_client;
|
||||
}
|
||||
}
|
||||
}
|
||||
117
GameServer/Contents/Cart/DBQuery/DBQCartReadAll.cs
Normal file
117
GameServer/Contents/Cart/DBQuery/DBQCartReadAll.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
using Amazon.DynamoDBv2.DocumentModel;
|
||||
using GameServer;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class DBQCartReadAll : QueryExecutorBase
|
||||
{
|
||||
private string m_combination_key_for_pk = string.Empty;
|
||||
|
||||
private string m_pk = string.Empty;
|
||||
|
||||
private CartDoc m_to_read_cart_docs = new();
|
||||
|
||||
public DBQCartReadAll(string combinationKeyForPK)
|
||||
: base(typeof(DBQCartReadAll).Name)
|
||||
{
|
||||
m_combination_key_for_pk = combinationKeyForPK;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
|
||||
//=====================================================================================
|
||||
public override Task<Result> onPrepareQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
|
||||
|
||||
var doc = new CartDoc();
|
||||
doc.setCombinationKeyForPK(m_combination_key_for_pk);
|
||||
|
||||
var error_code = doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
m_pk = doc.getPK();
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// onPrepareQuery()를 성공할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!");
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => "query_batch is null !!!");
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
var query_config = db_connector.makeQueryConfigForReadByPKOnly(m_pk);
|
||||
|
||||
(result, var read_docs) = await db_connector.simpleQueryDocTypesWithQueryOperationConfig<CartDoc>(query_config, eventTid: query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (read_docs.Count == 1)
|
||||
{
|
||||
var cart_action = owner.getEntityAction<CartAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(cart_action, () => "cart_action is null !!!");
|
||||
|
||||
result = cart_action.AddCartFromDoc(read_docs[0]);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
m_to_read_cart_docs = read_docs[0];
|
||||
}
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
public CartDoc getToReadItemDocs() => m_to_read_cart_docs;
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseCommit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseRollback(Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
public new Player? getOwner() => getQueryBatch()?.getLogActor() as Player;
|
||||
}
|
||||
}
|
||||
32
GameServer/Contents/Cart/Log/CartBusinessLog.cs
Normal file
32
GameServer/Contents/Cart/Log/CartBusinessLog.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class CartBusinessLog : ILogInvokerEx
|
||||
{
|
||||
private CartLogData m_data_to_log;
|
||||
public CartBusinessLog(CartLogData log_data_param)
|
||||
: base(LogDomainType.Cart)
|
||||
{
|
||||
m_data_to_log = log_data_param;
|
||||
}
|
||||
|
||||
public override bool hasLog()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void fillup(ref BusinessLog.LogBody body)
|
||||
{
|
||||
body.append(new CartLogData(this, m_data_to_log));
|
||||
}
|
||||
}
|
||||
21
GameServer/Contents/Cart/Log/CartBusinessLogHelper.cs
Normal file
21
GameServer/Contents/Cart/Log/CartBusinessLogHelper.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using ServerCommon;
|
||||
using META_ID = System.UInt32;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
static public class CartBusinessLogHelper
|
||||
{
|
||||
static public CartLogData toLogInfo(List<(META_ID, int)> deltaCartData)
|
||||
{
|
||||
var logData = new CartLogData();
|
||||
logData.setInfo(deltaCartData);
|
||||
return logData;
|
||||
}
|
||||
|
||||
static public void setInfo(this CartLogData logData, List<(META_ID, int)> deltaCartData)
|
||||
{
|
||||
logData.deltaItemDataList = deltaCartData;
|
||||
}
|
||||
}
|
||||
}
|
||||
108
GameServer/Contents/Cart/PacketHandler/AddCartPacketHandler.cs
Normal file
108
GameServer/Contents/Cart/PacketHandler/AddCartPacketHandler.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
using META_ID = System.UInt32;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.AddCartReq), typeof(AddCartPacketHandler), typeof(GameLoginListener))]
|
||||
public class AddCartPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_ADD_CART(Player player, Result result, META_ID item_meta_id = 0, Int32 count = 0)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AddCartRes = new AddCartRes();
|
||||
|
||||
if(count != 0 && item_meta_id != 0)
|
||||
{
|
||||
ack_packet.Response.AddCartRes.ChangeItem = new();
|
||||
ack_packet.Response.AddCartRes.ChangeItem.ItemId = (Int32)item_meta_id;
|
||||
ack_packet.Response.AddCartRes.ChangeItem.Count = count;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var cart_action = entity_player.getEntityAction<CartAction>();
|
||||
if (cart_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart action : {nameof(CartAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_ADD_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.AddCartReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_ADD_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.AddCartReq;
|
||||
|
||||
if(EnumHelper.tryParse<CurrencyType>(request.ItemInfo.BuyType, out var currency_type) == false)
|
||||
{
|
||||
err_msg = $"is Not Defined currencyType !!! currencyType : {request.ItemInfo.BuyType} - {entity_player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.CartInvalidCurrencyType, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_ADD_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = await cart_action.AddCartProcess((META_ID)request.ItemInfo.ItemId, request.ItemInfo.Count, currency_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to AddCartProcess() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_ADD_CART(player, errorResult);
|
||||
}
|
||||
}
|
||||
120
GameServer/Contents/Cart/PacketHandler/BuyCartPacketHandler.cs
Normal file
120
GameServer/Contents/Cart/PacketHandler/BuyCartPacketHandler.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.BuyCartReq), typeof(BuyCartPacketHandler), typeof(GameLoginListener))]
|
||||
public class BuyCartPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_BUY_CART(Player player, Result result, List<Item>? items = null)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.BuyCartRes = new BuyCartRes();
|
||||
|
||||
if (result.isSuccess() && items != null)
|
||||
{
|
||||
var account_attribute = player.getEntityAttribute<AccountAttribute>();
|
||||
var level_attribute = player.getEntityAttribute<LevelAttribute>();
|
||||
var money_attribute = player.getEntityAttribute<MoneyAttribute>();
|
||||
var nickname_attribute = player.getEntityAttribute<NicknameAttribute>();
|
||||
|
||||
var char_info = new CharInfo
|
||||
{
|
||||
Level = (int)level_attribute!.Level,
|
||||
Exp = (int)level_attribute.Exp,
|
||||
|
||||
Gold = money_attribute!.Gold,
|
||||
Sapphire = money_attribute.Sapphire,
|
||||
Calium = money_attribute.Calium,
|
||||
Ruby = money_attribute.Ruby,
|
||||
|
||||
Usergroup = account_attribute!.AuthAdminLevelType.ToString(),
|
||||
Operator = (int)account_attribute.AuthAdminLevelType,
|
||||
|
||||
DisplayName = nickname_attribute!.Nickname,
|
||||
LanguageInfo = (int)account_attribute.LanguageType,
|
||||
|
||||
IsIntroComplete = 1
|
||||
};
|
||||
ack_packet.Response.BuyCartRes.CurrencyInfo = char_info;
|
||||
ack_packet.Response.BuyCartRes.Items.AddRange(items.Select(info => info.toItemData4Client()));
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var cart_action = entity_player.getEntityAction<CartAction>();
|
||||
if (cart_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart action : {nameof(CartAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_BUY_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.BuyCartReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_BUY_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.BuyCartReq;
|
||||
result = await cart_action.BuyCartProcess(request.ItemInfos.ToList());
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to BuyCartProcess() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
foreach (var cart_item_info in request.ItemInfos.ToList())
|
||||
{
|
||||
await QuestManager.It.QuestCheck(entity_player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, cart_item_info.ItemId));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_BUY_CART(player, errorResult);
|
||||
}
|
||||
}
|
||||
36
GameServer/Contents/Cart/PacketHandler/CartNotifyHelper.cs
Normal file
36
GameServer/Contents/Cart/PacketHandler/CartNotifyHelper.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public static class CartNotifyHelper
|
||||
{
|
||||
public static bool send_S2C_NTF_CART(this Player player)
|
||||
{
|
||||
var cart_action = player.getEntityAction<CartAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(cart_action, () => $"cart_action is null !!!");
|
||||
|
||||
var noti_packet = new ClientToGame();
|
||||
noti_packet.Message = new();
|
||||
noti_packet.Message.CartNoti = new();
|
||||
|
||||
var cart = cart_action.getCart();
|
||||
|
||||
if (cart != null)
|
||||
{
|
||||
noti_packet.Message.CartNoti.ItemList.AddRange(cart.toCartItemData4Client());
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, noti_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.DelCartReq), typeof(DelCartPacketHandler), typeof(GameLoginListener))]
|
||||
public class DelCartPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_DEL_CART(Player player, Result result, bool isRemoveItem = false)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.DelCartRes = new DelCartRes();
|
||||
|
||||
ack_packet.Response.DelCartRes.IsRemoveItem = isRemoveItem ? 1 : 0;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!");
|
||||
|
||||
var cart_action = entity_player.getEntityAction<CartAction>();
|
||||
if (cart_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart action : {nameof(CartAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_DEL_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var game_msg = recvMessage as ClientToGame;
|
||||
if (game_msg == null)
|
||||
{
|
||||
err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.DelCartReq)}";
|
||||
result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_DEL_CART(entity_player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var request = game_msg.Request.DelCartReq;
|
||||
|
||||
result = await cart_action.DeleteCartProcess(request.ItemInfos.ToList());
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to DelCartProcess() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_DEL_CART(player, errorResult);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.GetCartReq), typeof(GetCartPacketHandler), typeof(GameLoginListener))]
|
||||
public class GetCartPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_GET_CART(Player player, Result result, Cart? cart = null)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.GetCartRes = new GetCartRes();
|
||||
|
||||
if(cart != null)
|
||||
{
|
||||
ack_packet.Response.GetCartRes.ItemList.AddRange(cart.toCartItemData4Client());
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var entity_player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(entity_player, () => "player is null !!!");
|
||||
|
||||
var cart_action = entity_player.getEntityAction<CartAction>();
|
||||
if (cart_action == null)
|
||||
{
|
||||
err_msg = $"Failed to get cart action : {nameof(CartAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_GET_CART(entity_player, result);
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
result = cart_action.GetCart4Client();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to GetCart4Client() !!! : {result.toBasicString()} - {entity_player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_GET_CART(entity_player, result);
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage
|
||||
, Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_GET_CART(player, errorResult);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user