-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutoAirItem.cs
205 lines (183 loc) · 6.81 KB
/
AutoAirItem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
using Terraria;
using Terraria.ID;
using TerrariaApi.Server;
using TShockAPI;
using TShockAPI.Hooks;
namespace AutoAirItem;
[ApiVersion(2, 1)]
public class AutoAirItem : TerrariaPlugin
{
#region 插件信息
public override string Name => "自动垃圾桶";
public override string Author => "羽学";
public override Version Version => new Version(1, 2, 3);
public override string Description => "自动垃圾桶";
#endregion
#region 实例变量
public static Database DB = new();
internal static Configuration Config = new();
internal static MyData Data = new();
#endregion
#region 注册与释放
public AutoAirItem(Main game) : base(game) { }
public override void Initialize()
{
LoadConfig();
if (Config.Db)
{
LoadAllPlayerData(); // 加载所有玩家的数据
}
GeneralHooks.ReloadEvent += ReloadConfig;
GetDataHandlers.PlayerUpdate.Register(this.OnPlayerUpdate);
ServerApi.Hooks.NetGreetPlayer.Register(this, this.OnGreetPlayer);
TShockAPI.Commands.ChatCommands.Add(new Command("AutoAir.use", Commands.AirCmd, "air", "垃圾"));
TShockAPI.Commands.ChatCommands.Add(new Command("AutoAir.admin", Commands.Reset, "airreset", "重置垃圾桶"));
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
GeneralHooks.ReloadEvent -= ReloadConfig;
GetDataHandlers.PlayerUpdate.UnRegister(this.OnPlayerUpdate);
ServerApi.Hooks.NetGreetPlayer.Deregister(this, this.OnGreetPlayer);
TShockAPI.Commands.ChatCommands.RemoveAll(x => x.CommandDelegate == Commands.AirCmd);
TShockAPI.Commands.ChatCommands.RemoveAll(x => x.CommandDelegate == Commands.Reset);
}
base.Dispose(disposing);
}
#endregion
#region 配置重载读取与写入方法
private static void ReloadConfig(ReloadEventArgs args)
{
LoadConfig();
args.Player.SendInfoMessage("[自动垃圾桶]重新加载配置完毕。");
}
private static void LoadConfig()
{
Config = Configuration.Read();
Config.Write();
}
#endregion
#region 加载所有玩家数据
private void LoadAllPlayerData()
{
var All = DB.LoadData();
foreach (var data in All)
{
Data.Items.Add(data);
}
}
#endregion
#region 创建玩家数据方法
private void OnGreetPlayer(GreetPlayerEventArgs args)
{
if (args == null || !Config.Open)
{
return;
}
var plr = TShock.Players[args.Who];
if (plr == null)
{
return;
}
// 如果玩家不在数据表中,则创建新的数据条目
if (!Data.Items.Any(item => item.Name == plr.Name))
{
Data.Items.Add(new MyData.PlayerData()
{
Name = plr.Name,
Enabled = true,
Auto = true,
Mess = true,
ItemType = new List<int>(),
DelItem = new Dictionary<int, int> { { 0, 0 }, }
});
}
}
#endregion
#region 触发自动垃圾桶
private void OnPlayerUpdate(object? sender, GetDataHandlers.PlayerUpdateEventArgs e)
{
var plr = e.Player;
if (!Config.Open || e == null || plr == null || !plr.IsLoggedIn || !plr.Active || !plr.HasPermission("AutoAir.use"))
{
return;
}
var list = Data.Items.FirstOrDefault(x => x.Name == plr.Name);
if (list == null)
{
return;
}
//玩家自己的垃圾桶开关
if (list.Enabled)
{
//遍历背包58格
for (var i = 0; i < plr.TPlayer.inventory.Length; i++)
{
//物品的对应格子
var inv = plr.TPlayer.inventory[i];
var trash = plr.TPlayer.trashItem;
var selected = plr.TPlayer.inventory[plr.TPlayer.selectedItem];
//排除钱币
if (Config.Exclude.Contains(trash.type) || Config.Exclude.Contains(inv.type))
{
return;
}
if (list.Auto) //读取垃圾桶位格的物品 写入到玩家自己的垃圾桶表里
{
if (!trash.IsAir) //放进垃圾桶就视为垃圾
{
if (!list.ItemType.Contains(trash.type)) //不是垃圾桶表的物品
{
list.ItemType.Add(trash.type); //添加到垃圾桶表
}
else
{
if (list.Mess) //触发回馈信息
{
var name = Lang.GetItemName(trash.type);
plr.SendMessage($"已从垃圾桶移除:[c/EC73B9:{trash.stack}]个[c/FF5C5F:{name}]|[c/92C5EC:返还]: [c/A1D4C2:/air del {trash.type}]", 255, 246, 158);
}
//将要移除的物品更新到字典,使用/air del指令能方便返还
UpDict(list.DelItem, trash.type, trash.stack);
DB.UpdateData(list); //更新到数据库
trash.TurnToAir();
plr.SendData(PacketTypes.PlayerSlot, "", plr.Index, PlayerItemSlotID.TrashItem);
}
}
}
//是垃圾桶表的物品,不是手上的物品 进行移除
if (list.ItemType.Contains(inv.type) && inv.type != selected.type)
{
if (list.Mess)
{
var name = Lang.GetItemName(inv.type);
plr.SendMessage($"已从背包移除:[c/EC73B9:{inv.stack}]个[c/FF5C5F:{name}]|[c/92C5EC:返还]: [c/A1D4C2:/air del {inv.type}]", 255, 246, 158);
}
UpDict(list.DelItem, inv.type, inv.stack);
DB.UpdateData(list); //更新到数据库
inv.TurnToAir();
plr.SendData(PacketTypes.PlayerSlot, "", plr.Index, PlayerItemSlotID.Inventory0 + i);
}
}
}
}
#endregion
#region 更新字典:把清理掉的物品和数量记录下来
public static void UpDict(Dictionary<int, int> delItem, int type, int stack)
{
//如果ID已经在字典里
if (delItem.ContainsKey(type))
{
// 给这个ID加数量
delItem[type] += stack;
}
// ID不在字典里
else
{
// 直接添加新ID和它的数量
delItem.Add(type, stack);
}
}
#endregion
}