Skip to content

Commit 56d5d61

Browse files
Bishbash777Bishbash777
andauthored
Custom rank update tweaks + Added support for custom homes (#176)
* add player to reserved slot rank option * add reserved slot propery interface via command and save all rank data to JSON on server unload * Homes extention for essentials (temp disabled) * Fix default rank glitch * FIx bug where could not set rank with steamID * Start of Chat prefixing * Chat prefixing * SEDB Integration access * Override perm fixes and fix crash at fresh config startup * Extra rank validation Co-authored-by: Bishbash777 <Bishbash777@gmail.com>
1 parent 6bd473d commit 56d5d61

9 files changed

Lines changed: 616 additions & 51 deletions

File tree

‎Essentials/Commands/HomeModule.cs‎

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Timers;
7+
using Sandbox;
8+
using Sandbox.Engine.Multiplayer;
9+
using Sandbox.Game.GameSystems.BankingAndCurrency;
10+
using Sandbox.Game.World;
11+
using Torch;
12+
using VRage;
13+
using Torch.API.Managers;
14+
using VRageMath;
15+
using Torch.Commands;
16+
using Torch.Commands.Permissions;
17+
using Torch.Managers.ChatManager;
18+
using Torch.Mod;
19+
using Sandbox.Game.Entities;
20+
using Torch.Mod.Messages;
21+
using VRage.Game.ModAPI;
22+
using VRageRender.Utils;
23+
using VRage.Game;
24+
using VRage.Game.ObjectBuilders.Definitions;
25+
26+
namespace Essentials.Commands {
27+
[Category("home")]
28+
public class HomeModule : CommandModule {
29+
RanksAndPermissionsModule RanksAndPermissionsModule = new RanksAndPermissionsModule();
30+
PlayerAccountModule PlayerAccounts = new PlayerAccountModule();
31+
32+
[Command("add")]
33+
[Permission(MyPromoteLevel.None)]
34+
public void addHome(string homeName) {
35+
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
36+
Context.Respond("Homes are not enabled for this server!");
37+
return;
38+
}
39+
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
40+
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);
41+
42+
if (Rank == null || Account == null) {
43+
Context.Respond("Error loading required information. Home not set");
44+
return;
45+
}
46+
47+
if (Account.Homes.Count >= Rank.MaxHomes ) {
48+
Context.Respond("You have the maximum amount of homes!");
49+
return;
50+
}
51+
52+
Account.Homes.Add(homeName, Context.Player.GetPosition());
53+
PlayerAccounts.UpdatePlayerAccount(Account);
54+
Context.Respond("Home successfully added!");
55+
}
56+
57+
[Command("del")]
58+
[Permission(MyPromoteLevel.None)]
59+
public void delHome(string homeName) {
60+
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
61+
Context.Respond("Homes are not enabled for this server!");
62+
return;
63+
}
64+
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
65+
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);
66+
67+
if (Rank == null || Account == null) {
68+
Context.Respond("Error loading required information. Home not deleted!");
69+
return;
70+
}
71+
72+
if (Account.Homes.ContainsKey(homeName)) {
73+
Account.Homes.Remove(homeName);
74+
Context.Respond("Home successfully removed!");
75+
PlayerAccounts.UpdatePlayerAccount(Account);
76+
return;
77+
}
78+
79+
Context.Respond("The stated home does not exist!");
80+
}
81+
82+
[Command("list")]
83+
[Permission(MyPromoteLevel.None)]
84+
public void ListHomes() {
85+
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
86+
Context.Respond("Homes are not enabled for this server!");
87+
return;
88+
}
89+
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
90+
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);
91+
92+
if (Rank == null || Account == null) {
93+
Context.Respond("Error loading required information. Home not deleted!");
94+
return;
95+
}
96+
97+
if (Account.Homes.Count == 0) {
98+
Context.Respond("You do not have any homes!");
99+
return;
100+
}
101+
102+
StringBuilder sb = new StringBuilder();
103+
104+
sb.Append("List of homes: ");
105+
foreach(var homes in Account.Homes) {
106+
sb.Append($"'{homes.Key}', ");
107+
}
108+
sb.TrimEnd(2);
109+
Context.Respond(sb.ToString());
110+
}
111+
112+
[Command("goto")]
113+
[Permission(MyPromoteLevel.None)]
114+
public void GotoHome(string homeName) {
115+
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
116+
Context.Respond("Homes are not enabled for this server!");
117+
return;
118+
}
119+
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
120+
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);
121+
122+
if (Rank == null || Account == null) {
123+
Context.Respond("Error loading required information.");
124+
return;
125+
}
126+
127+
Vector3D targetPos = Account.Homes[homeName];
128+
129+
var targetEntity = Context.Player?.Controller.ControlledEntity.Entity;
130+
if (Context.Player?.Controller.ControlledEntity is MyCockpit controller) {
131+
Context.Respond("You cannot use !home while in control of a grid");
132+
return;
133+
}
134+
135+
var player = MySession.Static.Players.GetOnlinePlayers().Where(i => i.Identity.IdentityId == Context.Player.Identity.IdentityId).First();
136+
137+
targetEntity.SetPosition(targetPos);
138+
139+
for (int i = 0; i != 5000; i++) {
140+
Context.Player.Character.Physics.SetSpeeds(Vector3.Zero, Vector3.Zero);
141+
}
142+
Context.Respond($"Teleported to '{homeName}'");
143+
}
144+
}
145+
}

‎Essentials/Commands/RanksModule.cs‎

Lines changed: 101 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,35 @@ public void DeleteRank(string name) {
4949

5050
}
5151

52+
[Command("setmaxhomes")]
53+
[Permission(MyPromoteLevel.Admin)]
54+
public void SetMaxHomes(string rankName, int value) {
55+
RanksAndPermissionsModule.RankData Rank = RanksAndPermissions.GetRankData(rankName);
56+
if (Rank == null) {
57+
Context.Respond($"Rank '{rankName}' does not exist!");
58+
return;
59+
}
60+
61+
Rank.MaxHomes = value;
62+
Context.Respond($"Anyone with the rank '{Rank.RankName}' can now only set {value} homes");
63+
}
64+
65+
[Command("reservedslot")]
66+
[Permission(MyPromoteLevel.Admin)]
67+
public void SetReservedSlot(string rankName, string boolVal) {
68+
if (boolVal != "true" || boolVal != "false") {
69+
Context.Respond("Argument is not a valid bool type");
70+
}
71+
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
72+
if (rank == null) {
73+
Context.Respond($"Rank '{rankName}' does not exist!");
74+
return;
75+
}
76+
rank.ReservedSlot = bool.Parse(boolVal);
77+
RanksAndPermissions.UpdateRankObject(rank);
78+
79+
}
80+
5281
[Command("renamerank")]
5382
[Permission(MyPromoteLevel.Admin)]
5483
public void RenameRank(string oldName, string newName) {
@@ -78,38 +107,91 @@ public void SetDefaultRank(string name) {
78107

79108
[Command("setrank")]
80109
[Permission(MyPromoteLevel.Admin)]
81-
public void SetRank(string playerName, string rankName) {
110+
public void SetRank(string playerNameOrID, string rankName) {
82111
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
83-
/*IMyPlayer player = Utilities.GetPlayerByNameOrId(playerName);
84-
if (player == null) {
85-
Context.Respond("Player does not exist!");
86-
return;
87-
}*/
88112

113+
ulong.TryParse(playerNameOrID, out var id);
114+
id = Utilities.GetPlayerByNameOrId(playerNameOrID)?.SteamUserId ?? id;
115+
/*IMyPlayer player = Utilities.GetPlayerByNameOrId(playerName);*/
116+
if (id == 0) {
117+
Context.Respond($"Player '{playerNameOrID}' not found or ID is invalid.");
118+
return;
119+
}
120+
var player = Utilities.GetPlayerByNameOrId(playerNameOrID);
89121
if (rank == null) {
90122
Context.Respond("Rank does not exist!");
91123
return;
92124
}
93125

94126
PlayerAccountModule.PlayerAccountData data = new PlayerAccountModule.PlayerAccountData();
95-
var RegisteredPlayers = PlayerAccountModule.PlayersAccounts.Select(o => o.Player).ToList();
96-
if (!RegisteredPlayers.Contains(playerName)) {
97-
Log.Warn($"Player {playerName} does have registered player object... Creating one");
98-
data.Player = playerName;
99-
//data.SteamID = playerName;
100-
data.Rank = rank.RankName;
101-
AccModule.UpdatePlayerAccount(data);
102-
Context.Respond($"{playerName}'s rank set to {rank.RankName}");
103-
Log.Info($"{playerName}'s rank set to {rank.RankName}");
104-
return;
127+
var RegisteredPlayerNames = PlayerAccountModule.PlayersAccounts.Select(o => o.Player).ToList();
128+
var RegisteredPlayerSteamIDs = PlayerAccountModule.PlayersAccounts.Select(o => o.SteamID).ToList();
129+
if (!RegisteredPlayerNames.Contains(playerNameOrID) && !RegisteredPlayerSteamIDs.Contains(id)) {
130+
Log.Warn($"Player {playerNameOrID} does have registered player object... Creating one");
131+
data.Player = playerNameOrID;
132+
data.SteamID = player.SteamUserId;
133+
}
134+
135+
if(RegisteredPlayerNames.Contains(playerNameOrID)) {
136+
data = PlayerAccountModule.PlayersAccounts.Single(a => a.Player == playerNameOrID);
137+
}
138+
139+
if(RegisteredPlayerSteamIDs.Contains(id)) {
140+
data = PlayerAccountModule.PlayersAccounts.Single(a => a.SteamID == id);
105141
}
106-
data = PlayerAccountModule.PlayersAccounts.Single(a => a.Player == playerName);
142+
107143
data.Rank = rank.RankName;
144+
if (rank.ReservedSlot && !MySandboxGame.ConfigDedicated.Reserved.Contains(id)) {
145+
MySandboxGame.ConfigDedicated.Reserved.Add(id);
146+
} else if (!rank.ReservedSlot && MySandboxGame.ConfigDedicated.Reserved.Contains(id)) {
147+
MySandboxGame.ConfigDedicated.Reserved.Remove(id);
148+
}
108149
MySession.Static.SetUserPromoteLevel(data.SteamID, RanksAndPermissions.ParseMyPromoteLevel(rank.KeenLevelRank));
109-
150+
Context.Respond($"{data.Player}'s rank set to {rank.RankName}");
151+
Log.Info($"{data.Player}'s rank set to {rank.RankName}");
110152
AccModule.UpdatePlayerAccount(data);
111153
}
112154

155+
[Command("populate")]
156+
[Permission(MyPromoteLevel.Admin)]
157+
public void Populate(string rank, string level) {
158+
159+
Context.Respond("Command disabled");
160+
return;
161+
162+
var commandManager = EssentialsPlugin.Instance.CommandManager;
163+
if (commandManager == null) {
164+
Context.Respond("Must have an attached session to list commands");
165+
return;
166+
}
167+
commandManager.Commands.GetNode(Context.Args, out CommandTree.CommandNode node);
168+
169+
if (node != null) {
170+
var command = node.Command;
171+
var children = node.Subcommands.Where(e => e.Value.Command?.MinimumPromoteLevel.ToString() == level).Select(x => x.Key);
172+
173+
var sb = new StringBuilder();
174+
175+
if (command != null && (Context.Player == null || command.MinimumPromoteLevel <= Context.Player.PromoteLevel)) {
176+
sb.AppendLine($"Syntax: {command.SyntaxHelp}");
177+
sb.Append(command.HelpText);
178+
}
179+
180+
if (node.Subcommands.Count() != 0)
181+
sb.Append($"\nSubcommands: {string.Join(", ", children)}");
182+
183+
Context.Respond(sb.ToString());
184+
}
185+
else {
186+
var sb = new StringBuilder();
187+
foreach (var command in commandManager.Commands.WalkTree()) {
188+
if (command.IsCommand && (Context.Player == null || command.Command.MinimumPromoteLevel <= Context.Player.PromoteLevel))
189+
sb.AppendLine($"{command.Command.SyntaxHelp}\n {command.Command.HelpText}");
190+
}
191+
Context.Respond($"Available commands: {sb}");
192+
}
193+
}
194+
113195
[Command("addinheritance")]
114196
[Permission(MyPromoteLevel.Admin)]
115197
public void AddInheritance(string rankName, string inheritanceName) {
@@ -301,7 +383,7 @@ public void RemovePlayerPermission(string playerName, string command) {
301383

302384
[Command("listranks")]
303385
[Permission(MyPromoteLevel.None)]
304-
public void ListRanks() {
386+
public void ListRanks(string listRankName) {
305387
bool found = false;
306388
string Ranks = "Ranks: ";
307389
foreach (var rank in RanksAndPermissionsModule.Ranks) {

‎Essentials/Essentials.csproj‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
<Compile Include="AutoCommand.cs" />
141141
<Compile Include="AutoCommands.cs" />
142142
<Compile Include="Commands\EcoModule.cs" />
143+
<Compile Include="Commands\HomeModule.cs" />
143144
<Compile Include="Commands\RanksModule.cs" />
144145
<Compile Include="Commands\VotingModule.cs" />
145146
<Compile Include="Commands\AdminModule.cs" />
@@ -158,11 +159,13 @@
158159
<Compile Include="GridFinder.cs" />
159160
<Compile Include="InfoCommand.cs" />
160161
<Compile Include="Commands\InfoModule.cs" />
162+
<Compile Include="Patches\ChatMessagePatch.cs" />
161163
<Compile Include="Patches\SessionDownloadPatch.cs" />
162164
<Compile Include="PlayerAccountModule.cs" />
163165
<Compile Include="Properties\AssemblyInfo.cs" />
164166
<Compile Include="RanksAndPermissionsModule.cs" />
165167
<Compile Include="Utilities.cs" />
168+
<Compile Include="Utils\Events.cs" />
166169
<Compile Include="Utils\Ownership.cs" />
167170
<Compile Include="Utils\TypedObjectPool.cs" />
168171
</ItemGroup>
@@ -176,4 +179,4 @@
176179
<None Include="packages.config" />
177180
</ItemGroup>
178181
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
179-
</Project>
182+
</Project>

‎Essentials/EssentialsConfig.cs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public EssentialsConfig()
4848
[Display(Name = "Override vanilla Torch/Plugin Permissions", GroupName = "Custom Ranks", Order = 2, Description = "Enabling this will cause the custom rank permissions system to overide any vanilla permissions... MAKE SURE RANKS HAVE PERMS SET BEFORE ENABLING")]
4949
public bool OverrideVanillaPerms { get => _overridePerms; set => SetValue(ref _overridePerms, value); }
5050

51-
private int _maxHomes = 3;
52-
[Display(Name = "Default Max Homes", GroupName = "Custom Ranks", Order = 3, Description = "Default amount of homes a created rank will get")]
53-
public int MaxHomes { get => _maxHomes; set => SetValue(ref _maxHomes, value); }
51+
public bool _enableHomes = false;
52+
[Display(Name = "Enable homes functionality", GroupName = "Custom Ranks", Order = 3, Description = "Enable the custom homes system for this server.", Enabled = false)]
53+
public bool EnableHomes { get => _enableHomes; set => SetValue(ref _enableHomes, value); }
5454

5555
private string _newUserMotd;
5656
public string NewUserMotd { get => _newUserMotd; set => SetValue(ref _newUserMotd, value); }

‎Essentials/EssentialsPlugin.cs‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class EssentialsPlugin : TorchPluginBase, IWpfPlugin
4141
public string rankDataPath = "";
4242

4343
private TorchSessionManager _sessionManager;
44+
public CommandManager CommandManager;
4445

4546
private UserControl _control;
4647
private Persistent<EssentialsConfig> _config;
@@ -97,6 +98,8 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)
9798
{
9899
var mpMan = Torch.CurrentSession.Managers.GetManager<IMultiplayerManagerServer>();
99100
var cmdMan = Torch.CurrentSession.Managers.GetManager<CommandManager>();
101+
CommandManager = cmdMan;
102+
100103
switch (state)
101104
{
102105
case TorchSessionState.Loading:
@@ -114,11 +117,12 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)
114117

115118
case TorchSessionState.Loaded:
116119
mpMan.PlayerJoined += AccModule.GenerateAccount;
120+
mpMan.PlayerJoined += AccModule.CheckIp;
117121
mpMan.PlayerJoined += MotdOnce;
118-
if (Config.EnableRanks) {
119-
RanksAndPermissions.GenerateRank(Config.DefaultRank);
120-
mpMan.PlayerJoined += RanksAndPermissions.RegisterInheritedRanks;
121-
}
122+
RanksAndPermissions.GenerateRank(Config.DefaultRank);
123+
mpMan.PlayerJoined += RanksAndPermissions.RegisterInheritedRanks;
124+
AccModule.ValidateRanks();
125+
122126
mpMan.PlayerLeft += ResetMotdOnce;
123127
cmdMan.OnCommandExecuting +=RanksAndPermissions.HasCommandPermission;
124128
MyEntities.OnEntityAdd += EntityAdded;
@@ -133,6 +137,8 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)
133137
InfoModule.Init();
134138
break;
135139
case TorchSessionState.Unloading:
140+
Log.Info("Unloading rank data into JSON");
141+
RanksAndPermissions.SaveRankData();
136142
mpMan.PlayerLeft -= ResetMotdOnce;
137143
mpMan.PlayerJoined -= MotdOnce;
138144
MyEntities.OnEntityAdd -= EntityAdded;
@@ -169,6 +175,12 @@ private void EntityAdded(MyEntity myEntity)
169175
bags.Add(b);
170176
}
171177

178+
179+
public static void InsertDiscordID(ulong steamID, string discordID, string discordName, Dictionary<ulong,string> RoleData) {
180+
PlayerAccountModule.InsertDiscord(steamID, discordID, discordName, RoleData);
181+
182+
}
183+
172184
private void ProcessBags()
173185
{
174186
//bags don't have inventory in the Add event, so we wait until the next tick. I hate everything.

0 commit comments

Comments
 (0)