Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
更新: Economics.Shop 物品条件
  • Loading branch information
Controllerdestiny committed Jun 7, 2024
commit f1568c580da908547f02e55f4699c890f131f40f
10 changes: 10 additions & 0 deletions Economics.Shop/Model/ItemTerm.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using EconomicsAPI.Model;
using Newtonsoft.Json;

namespace Economics.Shop.Model;

public class ItemTerm : Item
{
[JsonProperty("是否消耗")]
public bool Consume { get; set; } = false;
}
3 changes: 3 additions & 0 deletions Economics.Shop/Model/Product.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,7 @@ public class Product

[JsonProperty("商品内容")]
public List<Item> Items { get; set; } = new();

[JsonProperty("物品条件")]
public List<ItemTerm> ItemTerm { get; set; } = new();
}
62 changes: 60 additions & 2 deletions Economics.Shop/Shop.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Economics.RPG.Extensions;
using Economics.Shop.Model;
using EconomicsAPI.Attributes;
using EconomicsAPI.Configured;
using EconomicsAPI.Extensions;
using Org.BouncyCastle.Bcpg;
using System.Reflection;
using Terraria;
using TerrariaApi.Server;
Expand Down Expand Up @@ -34,6 +36,47 @@ public override void Initialize()
GeneralHooks.ReloadEvent += (_) => Config = ConfigHelper.LoadConfig(PATH, Config);
}

public static bool HasItem(TSPlayer player, List<ItemTerm> itemTerms)
{
foreach (ItemTerm term in itemTerms)
{
var count = 0;
CheckBanksForItem(player, term.netID, ref count);
if (count < term.Stack)
return false;

}
foreach (ItemTerm term in itemTerms)
{
var stack = term.Stack;
for (int j = 0; j < player.TPlayer.inventory.Length; j++)
{
var item = player.TPlayer.inventory[j];
if (item.stack >= stack)
{
item.stack -= stack;
TSPlayer.All.SendData(PacketTypes.PlayerSlot, "", player.Index, j);
}
else
{
stack -= item.stack;
}
}
}
return true;
}

private static void CheckBanksForItem(TSPlayer player, int itemId, ref int itemCount)
{
for (int j = 0; j < player.TPlayer.inventory.Length; j++)
{
if (player.TPlayer.inventory[j].type == itemId)// 检查猪猪储钱罐
{
itemCount += player.TPlayer.bank.item[j].stack;
}
}
}

[CommandMap("shop", "economics.shop")]
public static void CShop(CommandArgs args)
{
Expand Down Expand Up @@ -66,13 +109,19 @@ void Show(List<string> line)
}
Show(lines);
}
else if (args.Parameters.Count == 2 && args.Parameters[0].ToLower() == "buy")
else if (args.Parameters.Count >= 2 && args.Parameters[0].ToLower() == "buy")
{
if (!int.TryParse(args.Parameters[1], out var index))
{
args.Player.SendErrorMessage("请输入正确的序号!");
return;
}
var count = 1;
if (!int.TryParse(args.Parameters[2], out count))
{
args.Player.SendErrorMessage("你输入的购买数量不正确!");
return;
}
var product = Config.GetProduct(index);
if (product == null)
{
Expand All @@ -89,12 +138,21 @@ void Show(List<string> line)
args.Player.SendErrorMessage($"购买此商品需达到以下等级之一: {string.Join(",", product.LevelLimit)}");
return;
}
if (!HasItem(args.Player, product.ItemTerm))
{
args.Player.SendErrorMessage($"请满足物品条件: {string.Join(",", product.ItemTerm.Select(x => x.ToString()))}");
return;
}
if (!EconomicsAPI.Economics.CurrencyManager.DelUserCurrency(args.Player.Name, product.Cost))
{
args.Player.SendErrorMessage($"你的{EconomicsAPI.Economics.Setting.CurrencyName}不足!");
return;
}
args.Player.GiveItems(product.Items);
for (int i = 0; i < count; i++)
{
args.Player.GiveItems(product.Items);
}

args.Player.ExecCommand(product.Commamds);
args.Player.SendSuccessMessage("购买成功!");
}
Expand Down