-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHints.cs
More file actions
242 lines (199 loc) · 7.84 KB
/
Copy pathHints.cs
File metadata and controls
242 lines (199 loc) · 7.84 KB
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
using HintServiceMeow.Core.Utilities;
using LabApi.Features.Console;
using LabApi.Features.Wrappers;
using LevelUp.PlayerData;
using MEC;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hint = HintServiceMeow.Core.Models.Hints.Hint;
namespace LevelUp;
public static class Hints
{
private static readonly Dictionary<string, Hint> levelHints = new();
private static readonly Dictionary<string, Queue<string>> playerKillMessages = new();
// 缓存上次显示的数据,避免不必要的更新
private static readonly Dictionary<string, (int level, int exp, int reqExp)> lastDisplayedData = new();
// 生成玩家名称的等级前缀(用于非击杀广播场景)
public static string GetPlayerLevelPrefix(Player player)
{
if (!LevelUp.Instance.PlayerDataCache.TryGetValue(player.UserId, out DataTemplates playerData))
{
playerData = new DataTemplates { UserId = player.UserId };
LevelUp.Instance.PlayerDataCache[player.UserId] = playerData;
}
// 替换模板中的等级占位符
return LevelUp.Instance.Translation.hintTrans.PlayerNamePrefix
.Replace("{level}", playerData.Level.ToString());
}
public static Hint GetLevelHints(Player player)
{
if (player == null)
{
return null;
}
string userId = player.UserId;
// 获取玩家数据
if (!LevelUp.Instance.PlayerDataCache.TryGetValue(userId, out DataTemplates playerData))
{
playerData = new DataTemplates { UserId = userId };
LevelUp.Instance.PlayerDataCache[userId] = playerData;
if (LevelUp.Instance.Config.Debug)
Logger.Debug($"为玩家 {player.Nickname} ({userId}) 创建新的数据模板。");
}
// 计算所需经验(使用新的计算方法)
int reqExp = LevelUp.Instance.CalculateRequiredExp(playerData.Level);
// 检查数据是否变化
bool needsUpdate = false;
if (lastDisplayedData.TryGetValue(userId, out var lastData))
{
needsUpdate = lastData.level != playerData.Level ||
lastData.exp != playerData.Experience ||
lastData.reqExp != reqExp;
}
else
{
needsUpdate = true;
}
// 如果数据没变化且Hint已存在,直接返回缓存的Hint
if (!needsUpdate && levelHints.TryGetValue(userId, out var cachedHint))
{
return cachedHint;
}
// 数据变化了,更新Hint
string roleColor = player.RoleBase.RoleColor.ToHex();
string text = LevelUp.Instance.Translation.hintTrans.lvTranslations
.Replace("{roleColor}", roleColor)
.Replace("{level}", playerData.Level.ToString())
.Replace("{exp}", playerData.Experience.ToString())
.Replace("{ReqExp}", reqExp.ToString());
Hint hint;
if (levelHints.TryGetValue(userId, out var existingHint))
{
// 重用现有Hint对象,只更新Text
existingHint.Text = text;
hint = existingHint;
}
else
{
// 创建新的Hint对象
hint = new Hint
{
Text = text,
FontSize = LevelUp.Instance.Config.statesettings.FontSize,
YCoordinate = LevelUp.Instance.Config.statesettings.YCoordinate,
XCoordinate = LevelUp.Instance.Config.statesettings.XCoordinate
};
levelHints[userId] = hint;
}
// 更新缓存的数据
lastDisplayedData[userId] = (playerData.Level, playerData.Experience, reqExp);
return hint;
}
public static void AddLevelHint(Player player)
{
PlayerDisplay pd = PlayerDisplay.Get(player);
if (pd == null) return;
if (LevelUp.Instance.Config.statesettings.IsEnabled)
pd.AddHint(GetLevelHints(player));
}
public static void RemoveLevelHint(Player player)
{
PlayerDisplay pd = PlayerDisplay.Get(player);
if (pd == null) return;
if (levelHints.TryGetValue(player.UserId, out var hint))
{
pd.RemoveHint(hint);
levelHints.Remove(player.UserId);
lastDisplayedData.Remove(player.UserId); // 清理缓存数据
}
}
public static void RemoveAllHints()
{
foreach (var player in Player.List.ToList())
RemoveLevelHint(player);
playerKillMessages.Clear();
levelHints.Clear();
lastDisplayedData.Clear(); // 清理缓存数据
}
public static Queue<string> GetKillMessage(Player player)
{
Queue<string> q = new Queue<string>();
if (!playerKillMessages.ContainsKey(player.UserId))
{
playerKillMessages[player.UserId] = q;
}
q = playerKillMessages[player.UserId];
return q;
}
public static void UpdateKillMessageHint(Player viewer, Queue<string> q)
{
if (!LevelUp.Instance.Config.killsettings.IsEnabled)
return;
// 启动协程处理击杀消息显示
Timing.RunCoroutine(UpdateKillMessageHintCoroutine(viewer, q));
}
private static IEnumerator<float> UpdateKillMessageHintCoroutine(Player viewer, Queue<string> q)
{
PlayerDisplay pd = PlayerDisplay.Get(viewer);
if (pd == null)
yield break;
string allmessages = string.Join("\n", q);
var killHint = new Hint
{
Text = allmessages,
FontSize = LevelUp.Instance.Config.killsettings.FontSize,
YCoordinate = LevelUp.Instance.Config.killsettings.YCoordinate,
XCoordinate = LevelUp.Instance.Config.killsettings.XCoordinate
};
pd.AddHint(killHint);
// 逐条移除消息,每条显示指定时间
while(q.Count > 0)
{
yield return Timing.WaitForSeconds(LevelUp.Instance.Config.showTime.killmessage);
q.Dequeue();
killHint.Text = string.Join("\n", q);
}
pd.RemoveHint(killHint);
}
// 击杀广播保持原样,不添加等级前缀
public static void BroadcastKillMessage(Player killer, Player target)
{
if (!LevelUp.Instance.Config.killsettings.IsEnabled)
return;
// 直接使用原始昵称,不添加前缀
string atkRoleColor = killer.RoleBase.RoleColor.ToHex();
string tgtRoleColor = target.RoleBase.RoleColor.ToHex();
string message = LevelUp.Instance.Translation.hintTrans.GlobalKillMessage
.Replace("{atkroleColor}", atkRoleColor)
.Replace("{tgtroleColor}", tgtRoleColor)
.Replace("{killer}", killer.Nickname)
.Replace("{target}", target.Nickname); // 不添加前缀
int maxMessages = LevelUp.Instance.Config.killsettings.MaxDisplayMessages;
foreach (var player in Player.List)
{
if(player == null || player.IsNpc) continue;
var q = GetKillMessage(player);
q.Enqueue(message);
// 限制消息数量,超过限制时移除最旧的消息
while (q.Count > maxMessages)
{
q.Dequeue();
}
UpdateKillMessageHint(player, q);
}
}
// 添加玩家名称更新方法
public static void UpdatePlayerNameWithLevelPrefix(Player player)
{
if (player == null || player.IsNpc) return;
// 检查配置是否启用名称前缀
if (!LevelUp.Instance.Config.EnableNamePrefix)
return;
string originalName = player.Nickname;
string prefix = GetPlayerLevelPrefix(player);
// 设置新名称(前缀+原始名称)
string newName = $"{prefix}{originalName}";
player.DisplayName = newName;
}
}