Skip to content

Commit 11748e9

Browse files
authored
Merge pull request #11 from KeyouXZ/dev
2 parents e7f8f91 + 52d2348 commit 11748e9

File tree

15 files changed

+145
-104
lines changed

15 files changed

+145
-104
lines changed

Config.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,14 @@ This document details the configuration settings for the shop system.
171171
| Default | "ShopRegion" |
172172
| Example | "ShopRegion", "Shop" |
173173

174+
### List Length
175+
176+
| Field | Value |
177+
|-------|--------|
178+
| Type | Integer |
179+
| Description | Number of items to display in the shop list |
180+
| Default | 5 |
181+
174182
## Shop Items
175183

176184
### Shop Items Configuration

README.md

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -189,30 +189,26 @@ This command will show a list of all items that can be bought, along with their
189189
**Usage**:
190190
`/rank down`
191191

192-
#### `/rankutils list`
192+
#### `/rank list`
193193

194194
**Description**: List all available ranks
195195

196-
#### `/rankutils <command>`
197-
198-
**Description**: Displays rankutils commands
199-
200196
**Usage**:
201-
`/rankutils list`
197+
`/rank list`
202198

203-
### `/rankutils info`
199+
### `/rank info`
204200

205201
**Description**: Displays rank details
206202

207203
**Usage**:
208-
`/rankutils info <rank>`
204+
`/rank info <rank name>`
209205

210-
- `<rank>`: The name of the rank you want to view
206+
- `<rank name>`: The name of the rank you want to view
211207

212208
**Example:**
213209

214210
```cmd
215-
/rankutils info Master
211+
/rank info Master
216212
```
217213

218214
This command will display the details of the rank named "Master".
@@ -271,9 +267,8 @@ Set up the following permissions to control access to the plugin features:
271267
| `/rank` | `skynomi.rank` |
272268
| `/rank up` | `skynomi.rank.up` |
273269
| `/rank down` | `skynomi.rank.down` |
274-
| `/rankutils` | `skynomi.rankutils` |
275-
| `/rankutils list` | `skynomi.rankutils.list` |
276-
| `/rankutils info` | `skynomi.rankutils.info` |
270+
| `/rank list` | `skynomi.rank.list` |
271+
| `/rank info` | `skynomi.rank.info` |
277272
| `/resetrank` | `skynomi.resetrank` |
278273
| `/resethighestrank`| `skynomi.resethighestrank`|
279274

@@ -340,7 +335,7 @@ See [Config Document](./Config.md) for this
340335
- Rank System: `v1.0.0` -> `v1.1.0`
341336
- Added `Announce Rank Up` configuration
342337
- Added `Enable Rank Down` configuration
343-
- Added `rankutils info` & `rankutils list` commands
338+
- Added `rank info` & `rank list` commands
344339

345340
**Version 2.1.0**
346341

@@ -397,10 +392,23 @@ See [Config Document](./Config.md) for this
397392
- New command: `leaderboard`
398393
- Rank System: `v1.1.3` -> `v1.2.0`
399394
- New feature: Item restriction for rank system. Config: `"Restricted Items"`
400-
- Corrected rankutils permission
395+
- Corrected rank permission
401396
- New command: `resetrank` and `resethighestrank`
402397
- New Feature: Syncs player group with stored rank, caps rank at max if exceeded, updates cache, and notifies the player.
403398

399+
**Version 3.2.1**
400+
401+
- Skynomi: `v3.2.0` -> `v3.2.1`
402+
- Fix possible InvalidCastException at CacheManager
403+
- Introduce `Config` as replacement for `config` (deprecated)
404+
- Rank System: `v1.2.0` -> `v1.3.0`
405+
- Renamed `rankutils` command to `rank` for clarity and consistency
406+
- Restricted `rank up/down` commands to players in the `rank` group only
407+
- Changed config `Cost` type from `int` to `long` to support larger values
408+
- Miscellaneous logic fixes and improvements
409+
- Shop System: `v1.2.0` -> `v1.3.0`
410+
- New feature: Controls how many items appear per page in the `/shop list` command. Config: `"List Length"`
411+
404412
## License
405413

406414
This plugin is licensed under the [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.html).

Skynomi.RankSystem/Commands.cs

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,9 @@ public static void Initialize()
1717

1818
// Init Commands
1919
TShockAPI.Commands.ChatCommands.Add(new Command(Permissions.Rank, Rank, "rank", "level")
20-
{
21-
AllowServer = false,
22-
HelpText = "Rank commands:\nup - Rank up to the next level\ndown - Rank down to the previous level"
23-
});
24-
25-
TShockAPI.Commands.ChatCommands.Add(new Command(Permissions.RankUtils, RankUtils, "rankutils")
2620
{
2721
AllowServer = true,
28-
HelpText = "Rank Utils commands:\ninfo <rank> - Get information about a rank\nlist - List all available ranks"
22+
HelpText = "Rank commands:\nup - Rank up to the next level\ndown - Rank down to the previous level\ninfo <rank name> - Get information about a rank\nlist - List all available ranks"
2923
});
3024

3125
TShockAPI.Commands.ChatCommands.Add(new Command(Permissions.ResetRank, ResetRank, "resetrank")
@@ -51,14 +45,21 @@ private static void Rank(CommandArgs args)
5145
{
5246
try
5347
{
54-
string usage = "Usage: /rank <up/down>";
48+
string usage = "Usage: /rank <up/down/info/list>";
5549

5650
if (args.Parameters.Count == 0)
5751
{
5852
args.Player.SendErrorMessage(usage);
5953
return;
6054
}
6155

56+
// Check if the player is from rank group
57+
if ((args.Parameters[0] == "up" || args.Parameters[0] == "down") && !args.Player.Group.Name.StartsWith("rank_") && args.Player.Group.Name != TShock.Config.Settings.DefaultRegistrationGroupName)
58+
{
59+
args.Player.SendErrorMessage("You are not in a rank group.");
60+
return;
61+
}
62+
6263
if (args.Parameters[0] == "up")
6364
{
6465
if (!Utils.Util.CheckPermission(Permissions.RankUp, args)) return;
@@ -80,7 +81,7 @@ private static void Rank(CommandArgs args)
8081

8182
// Check user balance
8283
long balance = database.GetBalance(args.Player.Name);
83-
int rankCost = rankConfig.Ranks[nextRank].Cost;
84+
long rankCost = rankConfig.Ranks[nextRank].Cost;
8485

8586
if (balance < rankCost)
8687
{
@@ -147,7 +148,7 @@ private static void Rank(CommandArgs args)
147148
{
148149
string nextRank = GetRankByIndex(nextIndex);
149150

150-
int rankCost = rankConfig.Ranks[GetRankByIndex(nextIndex)].Cost;
151+
long rankCost = rankConfig.Ranks[GetRankByIndex(nextIndex)].Cost;
151152

152153
database.AddBalance(args.Player.Name, rankCost);
153154
Skynomi.Database.CacheManager.Cache.GetCache<Database.TRank>("Ranks").Modify(args.Player.Name, e =>
@@ -163,33 +164,10 @@ private static void Rank(CommandArgs args)
163164
args.Player.SendErrorMessage("You are already at the lowest rank.");
164165
}
165166
}
166-
else
167-
{
168-
args.Player.SendErrorMessage(usage);
169-
}
170-
}
171-
catch (Exception ex)
172-
{
173-
Utils.Log.Error(ex.ToString());
174-
}
175-
176-
}
177-
178-
private static void RankUtils(CommandArgs args)
179-
{
180-
try
181-
{
182-
string usage = "Usage: /rankutils <info/list>";
183-
if (args.Parameters.Count == 0)
184-
{
185-
args.Player.SendErrorMessage(usage);
186-
return;
187-
}
188-
189-
if (args.Parameters[0] == "info")
167+
else if (args.Parameters[0] == "info")
190168
{
191169
if (!Utils.Util.CheckPermission(Permissions.RankInfo, args)) return;
192-
string infoUsage = "Usage: /rankutils info <rank>";
170+
string infoUsage = "Usage: /rank info <rank name>";
193171

194172
if (args.Parameters.Count < 2)
195173
{
@@ -201,16 +179,42 @@ private static void RankUtils(CommandArgs args)
201179
if (rankConfig.Ranks.ContainsKey(rank))
202180
{
203181
string rankPrefix = rankConfig.Ranks[rank].Prefix;
182+
if (string.IsNullOrEmpty(rankPrefix))
183+
{
184+
rankPrefix = "-";
185+
}
186+
204187
string rankSuffix = rankConfig.Ranks[rank].Suffix;
188+
if (string.IsNullOrEmpty(rankSuffix))
189+
{
190+
rankSuffix = "-";
191+
}
192+
205193
int[] ChatColor = rankConfig.Ranks[rank].ChatColor;
194+
206195
string hex = $"{ChatColor[0]:X2}{ChatColor[1]:X2}{ChatColor[2]:X2}";
196+
207197
string formattedColor = $"[c/{hex}:Hello]";
208-
int rankCost = rankConfig.Ranks[rank].Cost;
198+
199+
long rankCost = rankConfig.Ranks[rank].Cost;
200+
209201
string rankPermission = rankConfig.Ranks[rank].Permission;
202+
if (string.IsNullOrEmpty(rankPermission))
203+
{
204+
rankPermission = "-";
205+
}
206+
210207
string rankReward = "";
211-
foreach (var item in rankConfig.Ranks[rank].Rewards)
208+
if (rankConfig.Ranks[rank].Rewards.Count == 0)
212209
{
213-
rankReward += $"[i/s{item.Value}:{item.Key}] ";
210+
rankReward = "-";
211+
}
212+
else
213+
{
214+
foreach (var item in rankConfig.Ranks[rank].Rewards)
215+
{
216+
rankReward += $"[i/s{item.Value}:{item.Key}] ";
217+
}
214218
}
215219

216220
string detail = $"[c/00FF00:=== Rank Details ===]\n" +
@@ -219,7 +223,7 @@ private static void RankUtils(CommandArgs args)
219223
$"[c/0000FF:Suffix:] {rankSuffix}\n" +
220224
$"[c/0000FF:Chat Color:] {formattedColor} ([c/{hex}:#{hex}])\n" +
221225
$"[c/0000FF:Cost:] {Utils.Util.CurrencyFormat(rankCost)}\n" +
222-
$"[c/0000FF:Permissioon:] {rankPermission}\n" +
226+
$"[c/0000FF:Permission:] {rankPermission}\n" +
223227
$"[c/0000FF:Reward:] {rankReward}";
224228

225229
args.Player.SendMessage(detail, Color.White);
@@ -232,15 +236,23 @@ private static void RankUtils(CommandArgs args)
232236
else if (args.Parameters[0] == "list")
233237
{
234238
if (!Utils.Util.CheckPermission(Permissions.RankList, args)) return;
239+
if (rankConfig.Ranks.Count == 0)
240+
{
241+
args.Player.SendErrorMessage("No ranks available.");
242+
return;
243+
}
235244

236-
string text = "Rank List:";
237-
args.Player.SendSuccessMessage(text);
238-
text = "";
245+
string text = "[c/00FF00:=== Rank List ===]";
246+
int counter = 1;
239247
foreach (var rank in rankConfig.Ranks)
240248
{
241-
text += $"\"{rank.Key}\" ";
249+
int[] ChatColor = rank.Value.ChatColor;
250+
string hex = $"{ChatColor[0]:X2}{ChatColor[1]:X2}{ChatColor[2]:X2}";
251+
252+
text += $"\n{counter}. [c/{hex}:{rank.Key}]";
253+
counter++;
242254
}
243-
args.Player.SendInfoMessage(text);
255+
args.Player.SendMessage(text, Color.White);
244256
}
245257
else
246258
{
@@ -251,6 +263,7 @@ private static void RankUtils(CommandArgs args)
251263
{
252264
Utils.Log.Error(ex.ToString());
253265
}
266+
254267
}
255268

256269
private static void ResetRank(CommandArgs args)
@@ -288,7 +301,7 @@ private static void ResetRank(CommandArgs args)
288301
args.Player.SendSuccessMessage("All players rank has been reset.");
289302
return;
290303
}
291-
304+
292305
var player = TSPlayer.FindByNameOrID(who).FirstOrDefault(x => x != null && x.Name.Equals(who, StringComparison.OrdinalIgnoreCase));
293306
if (player != null)
294307
{

Skynomi.RankSystem/Config.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public class Rank
8888
public int[] ChatColor = Array.Empty<int>();
8989

9090
[JsonProperty("Cost")]
91-
public int Cost;
91+
public long Cost;
9292

9393
[JsonProperty("Permission")]
9494
public string Permission = string.Empty;

Skynomi.RankSystem/RankSystem.cs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class Ranks : Loader.ISkynomiExtension, Loader.ISkynomiExtensionReloadabl
1515
{
1616
public string Name => "Rank System";
1717
public string Description => "Rank system extension for Skynomi";
18-
public Version Version => new(1, 2, 0);
18+
public Version Version => new(1, 3, 0);
1919
public string Author => "Keyou";
2020

2121
private static Config rankConfig;
@@ -48,22 +48,22 @@ public void Reload(ReloadEventArgs args)
4848
private void OnPlayerJoin(GreetPlayerEventArgs args)
4949
{
5050
Database.CreatePlayer(TShock.Players[args.Who].Name);
51-
var cache = CacheManager.Cache.GetCache<Database.TRank>("Ranks");
52-
var ranks = rankConfig.Ranks;
53-
var player = TShock.Players[args.Who];
51+
CacheManager.CacheEntry<Database.TRank>? cache = CacheManager.Cache.GetCache<Database.TRank>("Ranks");
52+
Dictionary<string, Config.Rank>? ranks = rankConfig.Ranks;
53+
TSPlayer? player = TShock.Players[args.Who];
5454

5555
if (player.Account == null)
5656
return;
5757

5858
if (!cache.TryGetValue(player.Name, out var plrRank)) return;
59-
var playerGroup = player.Group;
60-
var regex = new Regex(@"rank_(\d+)");
61-
var match = regex.Match(playerGroup.Name);
59+
TShockAPI.Group? playerGroup = player.Group;
60+
Regex? regex = new(@"rank_(\d+)");
61+
Match? match = regex.Match(playerGroup.Name);
6262

6363
if (match.Success)
6464
{
6565
// Set to max rank in the configuration
66-
if (ranks.Count < plrRank.Rank)
66+
if (plrRank.Rank - 1 > ranks.Count)
6767
{
6868
TShock.UserAccounts.SetUserGroup(player.Account, "rank_" + ranks.Count);
6969
cache.Modify(player.Name, e =>
@@ -94,7 +94,7 @@ private void OnPlayerJoin(GreetPlayerEventArgs args)
9494
e.Rank = defaultRank;
9595
return e;
9696
});
97-
97+
9898
message = $"Your rank has been corrected to {Commands.GetRankByIndex(plrRank.Rank - 1)}.";
9999
}
100100
else
@@ -129,12 +129,20 @@ private static void CreateGroup(int status)
129129
string name = "rank_" + counter;
130130
string prefix = key.Value.Prefix;
131131
string suffix = key.Value.Suffix;
132-
string parent = (counter == 1) ? "default" : "rank_" + (counter - 1);
132+
string parent = (counter == 1) ? TShock.Config.Settings.DefaultRegistrationGroupName : "rank_" + (counter - 1);
133133
if (!rankConfig.useParent) parent = "";
134134

135135
int[] color = key.Value.ChatColor;
136+
if (color == null || color.Length != 3)
137+
{
138+
Log.Warn($"Rank '{name}' ({key.Key}) has invalid chat color. Defaulting to white.");
139+
color = new[] { 255, 255, 255 };
140+
}
141+
136142
string chatColor = $"{color[0]},{color[1]},{color[2]}";
137-
string permission = parent == "" ? key.Value.Permission.Replace(" ", ",") : TShock.Groups.GetGroupByName(parent).Permissions + "," + key.Value.Permission.Replace(" ", ",");
143+
var parentGroup = TShock.Groups.GetGroupByName(parent);
144+
string parentPermissions = parentGroup != null ? parentGroup.Permissions : "";
145+
string permission = parent == "" ? key.Value.Permission.Replace(" ", ",") : parentPermissions + "," + key.Value.Permission.Replace(" ", ",");
138146

139147
// Create the group
140148
if (status == 1)

Skynomi.RankSystem/RankSystemConfig.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ public abstract class Permissions
55
public static readonly string Rank = "skynomi.rank";
66
public static readonly string RankUp = "skynomi.rank.up";
77
public static readonly string RankDown = "skynomi.rank.down";
8-
public static readonly string RankUtils = "skynomi.rankutils";
9-
public static readonly string RankList = "skynomi.rankutils.list";
10-
public static readonly string RankInfo = "skynomi.rankutils.info";
8+
public static readonly string RankList = "skynomi.rank.list";
9+
public static readonly string RankInfo = "skynomi.rank.info";
1110
public static readonly string ResetRank = "skynomi.rank.resetrank";
1211
public static readonly string ResetHighestRank = "skynomi.rank.resethighestrank";
1312
}

Skynomi.RankSystem/Skynomi.RankSystem.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
</PropertyGroup>
1313

1414
<PropertyGroup>
15-
<Version>1.2.0</Version>
16-
<FileVersion>1.2.0.0</FileVersion>
17-
<AssemblyVersion>1.2.0.0</AssemblyVersion>
18-
<InformationalVersion>1.2.0</InformationalVersion>
15+
<Version>1.3.0</Version>
16+
<FileVersion>1.3.0.0</FileVersion>
17+
<AssemblyVersion>1.3.0.0</AssemblyVersion>
18+
<InformationalVersion>1.3.0</InformationalVersion>
1919
</PropertyGroup>
2020

2121
<ItemGroup>

0 commit comments

Comments
 (0)