-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlayerBadgeEvent.cs
More file actions
116 lines (96 loc) · 4 KB
/
PlayerBadgeEvent.cs
File metadata and controls
116 lines (96 loc) · 4 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
using LabApi.Events.Arguments.PlayerEvents;
using LabApi.Events.CustomHandlers;
using LabApi.Features.Console;
using LabApi.Features.Wrappers;
using MEC;
using System;
using System.Collections.Generic;
namespace LabAPI_PlayerBadge;
public class PlayerBadgeEvent : CustomEventsHandler {
private const string DefaultColor = "white";
private const string RainbowColor = "rainbow";
// 可用的颜色列表!
private static readonly HashSet<string> Color = new(StringComparer.OrdinalIgnoreCase) {
"pink", "red", "brown", "silver", "light_green", "crimson",
"cyan", "aqua", "deep_pink", "tomato", "yellow", "magenta",
"blue_green", "orange", "lime", "green", "emerald", "carmine",
"nickel", "mint", "army_green", "pumpkin", "white",
RainbowColor
};
// 彩虹颜色列表
private static readonly string[] RainbowColors = [
"red", "orange", "yellow", "lime", "green",
"cyan", "aqua", "blue_green", "magenta", "pink"
];
private readonly Dictionary<string, CoroutineHandle> _rainbowCoroutines = new();
public override void OnPlayerJoined(PlayerJoinedEventArgs ev)
{
if (!PlayerBadgeMain.Singleton.BadgeCache.TryGetValue(ev.Player.UserId, out var badgeConfig))
return;
ev.Player.GroupName = badgeConfig.BadgeName;
if (string.IsNullOrEmpty(badgeConfig.BadgeColor))
{
Logger.Warn($"No color specified for player '{ev.Player.Nickname}'. Using default color '{DefaultColor}'.");
ev.Player.GroupColor = DefaultColor;
}
else if (badgeConfig.BadgeColor.Equals(RainbowColor, StringComparison.OrdinalIgnoreCase))
StartRainbowEffect(ev.Player);
else if (Color.Contains(badgeConfig.BadgeColor))
ev.Player.GroupColor = badgeConfig.BadgeColor;
else
{
Logger.Warn($"Invalid color '{badgeConfig.BadgeColor}' for player '{ev.Player.Nickname}'. Using default color '{DefaultColor}'.");
ev.Player.GroupColor = DefaultColor;
}
}
public override void OnPlayerLeft(PlayerLeftEventArgs ev) {
// 玩家离开时停止彩虹效果,释放资源
StopRainbowEffect(ev.Player.UserId);
}
private void StartRainbowEffect(Player player) {
// 如果该玩家已有彩虹效果在运行,先停止
StopRainbowEffect(player.UserId);
// 启动新的彩虹协程
var handle = Timing.RunCoroutine(RainbowCoroutine(player), Segment.Update);
_rainbowCoroutines[player.UserId] = handle;
}
private void StopRainbowEffect(string userId) {
// 停止并移除彩虹协程
if (!_rainbowCoroutines.TryGetValue(userId, out var handle)) return;
Timing.KillCoroutines(handle);
_rainbowCoroutines.Remove(userId);
}
private IEnumerator<float> RainbowCoroutine(Player player)
{
var colorIndex = 0;
var userId = player.UserId;
while (true)
{
if (player.IsDestroyed)
{
_rainbowCoroutines.Remove(userId);
yield break;
}
if (!PlayerBadgeMain.Singleton.BadgeCache.TryGetValue(userId, out var config) ||
!config.BadgeColor.Equals(RainbowColor, StringComparison.OrdinalIgnoreCase))
{
_rainbowCoroutines.Remove(userId);
yield break;
}
// 设置当前颜色
player.GroupColor = RainbowColors[colorIndex];
// 循环颜色索引
colorIndex = (colorIndex + 1) % RainbowColors.Length;
// 等待指定时间后切换下一个颜色
yield return Timing.WaitForSeconds(PlayerBadgeMain.Singleton.RainbowInterval);
}
}
/// <summary>
/// 清理所有彩虹效果协程。
/// </summary>
public void CleanupAllRainbowEffects() {
foreach (var handle in _rainbowCoroutines.Values)
Timing.KillCoroutines(handle);
_rainbowCoroutines.Clear();
}
}