Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

更新:自动存储 v1.2.2 #276

Merged
merged 1 commit into from
Jul 6, 2024
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
232 changes: 38 additions & 194 deletions AutoStoreItems/AutoStoreItems.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class AutoStoreItems : TerrariaPlugin
#region 插件信息
public override string Name => "自动存储";
public override string Author => "羽学";
public override Version Version => new Version(1, 2, 1);
public override Version Version => new Version(1, 2, 2);
public override string Description => "涡轮增压不蒸鸭";
#endregion

Expand Down Expand Up @@ -67,229 +67,73 @@ private static void WriteName()
}
#endregion

#region 判断持有物品方法
#region 检测持有物品方法
public static long Timer = 0L;
private void OnGameUpdate(EventArgs args)
{
Timer++;
TShock.Players.Where(plr => plr != null && plr.Active).ToList().ForEach(plr =>

foreach (var plr in TShock.Players.Where(plr => plr != null && plr.Active && plr.IsLoggedIn && Config.Enable))
{
if (!plr.IsLoggedIn || !Config.Enable) return;
else if (Timer % Config.time == 0)
if (!plr.HasPermission("tshock.ignore.itemstack") && Timer % 300 == 0)
TShock.Utils.Broadcast($"\n【自动储存】请通知管理给予免检堆栈权限:\n" +
$"/group addpern defualt [c/92C5EC:tshock.ignore.itemstack]\n", 255, 246, 158);

if (Timer % Config.time == 0)
{
foreach (var item in Config.HoldItems)
{
bool Stored = false;
for (int i = 0; i < plr.TPlayer.inventory.Length; i++)
{
var inv = plr.TPlayer.inventory[i];
bool HandSwitch = Config.Hand ? plr.TPlayer.inventory[plr.TPlayer.selectedItem].type == item : inv.type == item ;

if (HandSwitch)
{
bool Stored = false; //用来防止4个储存空间有同样物品刷堆叠用
if (Config.bank1 && !Stored)
Stored = AutoStoredItem(plr);
if (Config.bank2 && !Stored)
Stored = AutoStoredItem2(plr);
if (Config.bank3 && !Stored)
Stored = AutoStoredItem3(plr);
if (Config.bank4 && !Stored)
Stored = AutoStoredItem4(plr);
if (Stored) break;
}
}
}
}
});
}
#endregion

#region 自动存储方法(存钱罐)
public static bool AutoStoredItem(TSPlayer args)
{
if (!args.IsLoggedIn || !Config.Enable || !Config.bank1) return false;

Player plr = args.TPlayer;
foreach (var item in Config.Items)
{
for (int b = 0; b < plr.bank.item.Length; b++)
{
var bank = plr.bank.item[b];

for (int i = 0; i < plr.inventory.Length; i++)
{
var inv = plr.inventory[i];
if (inv.stack >= item.Stack
&& Array.Exists(item.ID, id => id == inv.type)
&& inv.type == bank.type
&& Array.Exists(item.ID, id => id == bank.type)
&& Array.Exists(item.ID, id => id != plr.inventory[plr.selectedItem].type))
{

bank.stack += inv.stack;
inv.TurnToAir();
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Inventory0 + i);
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank1_0 + b);

if (Config.Mess)
args.SendMessage($"【自动储存】已将'[c/92C5EC:{bank.Name}]'存入您的存钱罐 当前数量: {bank.stack}", 255, 246, 158);
return true;
if ((Config.Hand ? inv.type == plr.TPlayer.inventory[plr.TPlayer.selectedItem].type : inv.type == item) &&
(Config.bank1 && !Stored && (Stored = AutoStoredItem(plr, plr.TPlayer.bank.item, PlayerItemSlotID.Bank1_0, "存钱罐")) ||
Config.bank2 && !Stored && (Stored = AutoStoredItem(plr, plr.TPlayer.bank2.item, PlayerItemSlotID.Bank2_0, "保险箱")) ||
Config.bank3 && !Stored && (Stored = AutoStoredItem(plr, plr.TPlayer.bank3.item, PlayerItemSlotID.Bank3_0, "护卫熔炉")) ||
Config.bank4 && !Stored && (Stored = AutoStoredItem(plr, plr.TPlayer.bank4.item, PlayerItemSlotID.Bank4_0, "虚空袋"))))
break;
}

else if (Config.clear && bank.stack >= 9999)
{
bank.stack = 9999 - 1;
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank1_0 + b);
if (Config.Mess)
args.SendMessage($"【自动储存】检测到'[c/92C5EC:{bank.Name}]'已达到 [c/F7575C:{bank.stack}] 请整理你的存钱罐", 255, 246, 158);
}

}
}
}
return false;
}
#endregion

#region 自动存储方法(保险箱)
public static bool AutoStoredItem2(TSPlayer args)
#region 自动储存物品方法
public static bool AutoStoredItem(TSPlayer player, Item[] bankItems, int bankSlot, string bankName)
{
if (!args.IsLoggedIn || !Config.Enable || !Config.bank2) return false;

Player plr = args.TPlayer;
foreach (var item in Config.Items)
{
for (int b = 0; b < plr.bank2.item.Length; b++)
{
var bank = plr.bank2.item[b];

for (int i = 0; i < plr.inventory.Length; i++)
{
var inv = plr.inventory[i];
if (inv.stack >= item.Stack
&& Array.Exists(item.ID, id => id == inv.type)
&& inv.type == bank.type
&& Array.Exists(item.ID, id => id == bank.type)
&& Array.Exists(item.ID, id => id != plr.inventory[plr.selectedItem].type))
{

bank.stack += inv.stack;
inv.TurnToAir();
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Inventory0 + i);
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank2_0 + b);

if (Config.Mess)
args.SendMessage($"【自动储存】已将'[c/92C5EC:{bank.Name}]'存入您的保险箱 当前数量: {bank.stack}", 255, 246, 158);
return true;
}

else if (Config.clear && bank.stack >= 9999)
{
bank.stack = 9999 - 1;
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank2_0 + b);
if (Config.Mess)
args.SendMessage($"【自动储存】检测到'[c/92C5EC:{bank.Name}]'已达到 [c/F7575C:{bank.stack}] 请整理你的保险箱", 255, 246, 158);
}

}
}
}
return false;
}
#endregion
if (!player.IsLoggedIn || !Config.Enable) return false;

#region 自动存储方法(护卫熔炉)
public static bool AutoStoredItem3(TSPlayer args)
{
if (!args.IsLoggedIn || !Config.Enable || !Config.bank3) return false;
Player plr = player.TPlayer;
HashSet<int> itemID = new HashSet<int>(Config.Items.SelectMany(x => x.ID));

Player plr = args.TPlayer;
foreach (var item in Config.Items)
foreach (var bank in bankItems)
{
for (int b = 0; b < plr.bank3.item.Length; b++)
for (int i = 0; i < plr.inventory.Length; i++)
{
var bank = plr.bank3.item[b];

for (int i = 0; i < plr.inventory.Length; i++)
var inv = plr.inventory[i];
var items = Config.Items.FirstOrDefault(x => x.ID.Contains(inv.type));
if (items != null
&& inv.stack >= items.Stack
&& itemID.Contains(inv.type)
&& inv.type == bank.type
&& inv.type != plr.inventory[plr.selectedItem].type)
{
var inv = plr.inventory[i];
if (inv.stack >= item.Stack
&& Array.Exists(item.ID, id => id == inv.type)
&& inv.type == bank.type
&& Array.Exists(item.ID, id => id == bank.type)
&& Array.Exists(item.ID, id => id != plr.inventory[plr.selectedItem].type))
{

bank.stack += inv.stack;
inv.TurnToAir();
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Inventory0 + i);
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank3_0 + b);

if (Config.Mess)
args.SendMessage($"【自动储存】已将'[c/92C5EC:{bank.Name}]'存入您的护卫熔炉 当前数量: {bank.stack}", 255, 246, 158);
return true;
}

else if (Config.clear && bank.stack >= 9999)
{
bank.stack = 9999 - 1;
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank3_0 + b);
if (Config.Mess)
args.SendMessage($"【自动储存】检测到'[c/92C5EC:{bank.Name}]'已达到 [c/F7575C:{bank.stack}] 请整理你的护卫熔炉", 255, 246, 158);
}

bank.stack += inv.stack;
inv.TurnToAir();
player.SendData(PacketTypes.PlayerSlot, null, player.Index, PlayerItemSlotID.Inventory0 + i);
player.SendData(PacketTypes.PlayerSlot, null, player.Index, bankSlot + Array.IndexOf(bankItems, bank));

if (Config.Mess)
player.SendMessage($"【自动储存】已将'[c/92C5EC:{bank.Name}]'存入您的{bankName} 当前数量: {bank.stack}", 255, 246, 158);
return true;
}
}
}
return false;
}
#endregion

#region 自动存储方法(虚空袋)
public static bool AutoStoredItem4(TSPlayer args)
{
if (!args.IsLoggedIn || !Config.Enable || !Config.bank4) return false;

Player plr = args.TPlayer;
foreach (var item in Config.Items)
{
for (int b = 0; b < plr.bank4.item.Length; b++)
{
var bank = plr.bank4.item[b];

for (int i = 0; i < plr.inventory.Length; i++)
{
var inv = plr.inventory[i];
if (inv.stack >= item.Stack
&& Array.Exists(item.ID, id => id == inv.type)
&& inv.type == bank.type
&& Array.Exists(item.ID, id => id == bank.type)
&& Array.Exists(item.ID, id => id != plr.inventory[plr.selectedItem].type))
{

bank.stack += inv.stack;
inv.TurnToAir();
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Inventory0 + i);
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank4_0 + b);

if (Config.Mess)
args.SendMessage($"【自动储存】已将'[c/92C5EC:{bank.Name}]'存入您的虚空袋 当前数量: {bank.stack}", 255, 246, 158);
return true;
}

else if (Config.clear && bank.stack >= 9999)
{
bank.stack = 9999 - 1;
args.SendData(PacketTypes.PlayerSlot, "", args.Index, PlayerItemSlotID.Bank4_0 + b);
if (Config.Mess)
args.SendMessage($"【自动储存】检测到'[c/92C5EC:{bank.Name}]'已达到 [c/F7575C:{bank.stack}] 请整理你的虚空袋", 255, 246, 158);
}

}
}
}
return false;
}
#endregion
}
}
27 changes: 12 additions & 15 deletions AutoStoreItems/Configuration.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using TShockAPI;

Expand All @@ -8,41 +7,39 @@ namespace Plugin
internal class Configuration
{
[JsonProperty("插件开关", Order = -12)]
public bool Enable = true;
public bool Enable { get; set; } = true;
[JsonProperty("储存速度", Order = -11)]
public float time { get; set; } = 120f;

[JsonProperty("使用说明1", Order = -10)]
public static string Text = "[是否手持] 需要选中 [持有物品] 其中1个才会启动存储功能,关闭则背包含有 其中1个就会启动";
public static string Text { get; set; } = "[是否手持] 需要选中 [持有物品] 其中1个才会启动存储功能,关闭则背包含有 其中1个就会启动";

[JsonProperty("使用说明2", Order = -10)]
public static string Text2 = "[储存速度] 不要低于60帧(推荐120),否则手动 [连续] 快速放入 [同样物品到存储空间格子] 会导致物品数量翻倍";
public static string Text2 { get; set; } = "[储存速度] 不要低于60帧(推荐120),否则手动 [连续] 快速放入 [同样物品到存储空间格子] 会导致物品数量翻倍";

[JsonProperty("使用说明3", Order = -10)]
public static string Text3 = "[控超堆叠] 会在物品超过9999的时候 对该物品减-1处理 然后通知玩家整理空间";
public static string Text3 { get; set; } = "使用此插件需要给玩家免检堆栈权限:/group addpern defualt tshock.ignore.itemstack ";

[JsonProperty("使用说明4", Order = -10)]
public static string Text4 = "[物品名] 会在使用 [/Reload] 指令时根据 [物品ID] 自动写入,[物品数量] 为储存最低数量要求 ";
public static string Text4 { get; set; } = "[物品名] 会在使用 [/Reload] 指令时根据 [物品ID] 自动写入,[物品数量] 为储存最低数量要求 ";

[JsonProperty("使用说明5", Order = -10)]
public static string Text5 = "[存在BUG] 收藏的物品会被取消收藏(指虚空袋药水有堆叠进箱子的风险) ";
public static string Text5 { get; set; } = "[存在BUG] 收藏的物品会被取消收藏,物品堆栈会超过9999触发Tshock的堆叠检测 ";

[JsonProperty("存钱罐", Order = -9)]
public bool bank1 = true;
public bool bank1 { get; set; } = true;
[JsonProperty("保险箱", Order = -8)]
public bool bank2 = true;
public bool bank2 { get; set; } = true;
[JsonProperty("护卫熔炉", Order = -6)]
public bool bank3 = true;
public bool bank3 { get; set; } = true;
[JsonProperty("虚空袋", Order = -7)]
public bool bank4 = true;
public bool bank4 { get; set; } = true;

[JsonProperty("控超堆叠", Order = -5)]
public bool clear = true;
[JsonProperty("存储提示", Order = -4)]
public bool Mess = true;
public bool Mess { get; set; } = true;

[JsonProperty("是否手持(↓)", Order = -1)]
public bool Hand = false;
public bool Hand { get; set; } = false;

[JsonProperty("持有物品", Order = 1)]
public int[] HoldItems { get; set; } = new int[7] { 87, 346 , 3213, 3813, 4076, 4131, 5325 };
Expand Down
14 changes: 10 additions & 4 deletions AutoStoreItems/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@
- 作者: 羽学
- 出处: 无
- 持有指定物品根据配置自动存入存储空间
- 使用此插件需要给default用户组免检堆叠权限:tshock.ignore.itemstack

## 更新日志
```
v1.2.2
优化代码,添加使用说明
移除了【控超堆叠】配置项
使用本插件会使堆叠超上限
需给玩家免检堆叠权限:tshock.ignore.itemstack

v1.2.1
将物品ID改为数组

Expand Down Expand Up @@ -38,7 +45,7 @@ v1.0.0

2.`储存速度` 不要低于`60帧`(推荐`120`),否则手动`连续`快速放入`同样物品到存储空间格子`会导致物品`数量翻倍`

3.`控超堆叠`会在物品超过`9999`的时候 对该物品减-1处理 然后通知玩家整理空间
3.使用此插件需要给玩家`免检堆栈`权限:`/group addpern defualt tshock.ignore.itemstack`

4.`物品名`会在使用`/Reload`指令时根据`物品ID`自动写入, `物品数量` 为储存最低数量要求

Expand All @@ -52,14 +59,13 @@ v1.0.0
"储存速度": 120.0,
"使用说明1": "[是否手持] 需要选中 [持有物品] 其中1个才会启动存储功能,关闭则背包含有 其中1个就会启动",
"使用说明2": "[储存速度] 不要低于60帧(推荐120),否则手动 [连续] 快速放入 [同样物品到存储空间格子] 会导致物品数量翻倍",
"使用说明3": "[控超堆叠] 会在物品超过9999的时候 对该物品减-1处理 然后通知玩家整理空间",
"使用说明3": "使用此插件需要给玩家免检堆栈权限:/group addpern defualt tshock.ignore.itemstack ",
"使用说明4": "[物品名] 会在使用 [/Reload] 指令时根据 [物品ID] 自动写入,[物品数量] 为储存最低数量要求 ",
"使用说明5": "[存在BUG] 收藏的物品会被取消收藏(指虚空袋药水有堆叠进箱子的风险) ",
"使用说明5": "[存在BUG] 收藏的物品会被取消收藏,物品堆栈会超过9999触发Tshock的堆叠检测 ",
"存钱罐": true,
"保险箱": true,
"虚空袋": true,
"护卫熔炉": true,
"控超堆叠": true,
"存储提示": true,
"是否手持(↓)": false,
"持有物品": [
Expand Down
Loading