Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/TorchAPI/Essentials
Browse files Browse the repository at this point in the history
  • Loading branch information
Bishbash777 authored and Bishbash777 committed Mar 17, 2021
2 parents ebb0119 + 6ce222b commit 584cc80
Show file tree
Hide file tree
Showing 9 changed files with 618 additions and 51 deletions.
145 changes: 145 additions & 0 deletions Essentials/Commands/HomeModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using Sandbox;
using Sandbox.Engine.Multiplayer;
using Sandbox.Game.GameSystems.BankingAndCurrency;
using Sandbox.Game.World;
using Torch;
using VRage;
using Torch.API.Managers;
using VRageMath;
using Torch.Commands;
using Torch.Commands.Permissions;
using Torch.Managers.ChatManager;
using Torch.Mod;
using Sandbox.Game.Entities;
using Torch.Mod.Messages;
using VRage.Game.ModAPI;
using VRageRender.Utils;
using VRage.Game;
using VRage.Game.ObjectBuilders.Definitions;

namespace Essentials.Commands {
[Category("home")]
public class HomeModule : CommandModule {
RanksAndPermissionsModule RanksAndPermissionsModule = new RanksAndPermissionsModule();
PlayerAccountModule PlayerAccounts = new PlayerAccountModule();

[Command("add")]
[Permission(MyPromoteLevel.None)]
public void addHome(string homeName) {
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
Context.Respond("Homes are not enabled for this server!");
return;
}
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);

if (Rank == null || Account == null) {
Context.Respond("Error loading required information. Home not set");
return;
}

if (Account.Homes.Count >= Rank.MaxHomes ) {
Context.Respond("You have the maximum amount of homes!");
return;
}

Account.Homes.Add(homeName, Context.Player.GetPosition());
PlayerAccounts.UpdatePlayerAccount(Account);
Context.Respond("Home successfully added!");
}

[Command("del")]
[Permission(MyPromoteLevel.None)]
public void delHome(string homeName) {
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
Context.Respond("Homes are not enabled for this server!");
return;
}
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);

if (Rank == null || Account == null) {
Context.Respond("Error loading required information. Home not deleted!");
return;
}

if (Account.Homes.ContainsKey(homeName)) {
Account.Homes.Remove(homeName);
Context.Respond("Home successfully removed!");
PlayerAccounts.UpdatePlayerAccount(Account);
return;
}

Context.Respond("The stated home does not exist!");
}

[Command("list")]
[Permission(MyPromoteLevel.None)]
public void ListHomes() {
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
Context.Respond("Homes are not enabled for this server!");
return;
}
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);

if (Rank == null || Account == null) {
Context.Respond("Error loading required information. Home not deleted!");
return;
}

if (Account.Homes.Count == 0) {
Context.Respond("You do not have any homes!");
return;
}

StringBuilder sb = new StringBuilder();

sb.Append("List of homes: ");
foreach(var homes in Account.Homes) {
sb.Append($"'{homes.Key}', ");
}
sb.TrimEnd(2);
Context.Respond(sb.ToString());
}

[Command("goto")]
[Permission(MyPromoteLevel.None)]
public void GotoHome(string homeName) {
if (!EssentialsPlugin.Instance.Config.EnableHomes) {
Context.Respond("Homes are not enabled for this server!");
return;
}
var Account = PlayerAccounts.GetAccount(Context.Player.SteamUserId);
var Rank = RanksAndPermissionsModule.GetRankData(Account.Rank);

if (Rank == null || Account == null) {
Context.Respond("Error loading required information.");
return;
}

Vector3D targetPos = Account.Homes[homeName];

var targetEntity = Context.Player?.Controller.ControlledEntity.Entity;
if (Context.Player?.Controller.ControlledEntity is MyCockpit controller) {
Context.Respond("You cannot use !home while in control of a grid");
return;
}

var player = MySession.Static.Players.GetOnlinePlayers().Where(i => i.Identity.IdentityId == Context.Player.Identity.IdentityId).First();

targetEntity.SetPosition(targetPos);

for (int i = 0; i != 5000; i++) {
Context.Player.Character.Physics.SetSpeeds(Vector3.Zero, Vector3.Zero);
}
Context.Respond($"Teleported to '{homeName}'");
}
}
}
120 changes: 101 additions & 19 deletions Essentials/Commands/RanksModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,35 @@ public void DeleteRank(string name) {

}

[Command("setmaxhomes")]
[Permission(MyPromoteLevel.Admin)]
public void SetMaxHomes(string rankName, int value) {
RanksAndPermissionsModule.RankData Rank = RanksAndPermissions.GetRankData(rankName);
if (Rank == null) {
Context.Respond($"Rank '{rankName}' does not exist!");
return;
}

Rank.MaxHomes = value;
Context.Respond($"Anyone with the rank '{Rank.RankName}' can now only set {value} homes");
}

[Command("reservedslot")]
[Permission(MyPromoteLevel.Admin)]
public void SetReservedSlot(string rankName, string boolVal) {
if (boolVal != "true" || boolVal != "false") {
Context.Respond("Argument is not a valid bool type");
}
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
if (rank == null) {
Context.Respond($"Rank '{rankName}' does not exist!");
return;
}
rank.ReservedSlot = bool.Parse(boolVal);
RanksAndPermissions.UpdateRankObject(rank);

}

[Command("renamerank")]
[Permission(MyPromoteLevel.Admin)]
public void RenameRank(string oldName, string newName) {
Expand Down Expand Up @@ -78,38 +107,91 @@ public void SetDefaultRank(string name) {

[Command("setrank")]
[Permission(MyPromoteLevel.Admin)]
public void SetRank(string playerName, string rankName) {
public void SetRank(string playerNameOrID, string rankName) {
RanksAndPermissionsModule.RankData rank = RanksAndPermissions.GetRankData(rankName);
/*IMyPlayer player = Utilities.GetPlayerByNameOrId(playerName);
if (player == null) {
Context.Respond("Player does not exist!");
return;
}*/

ulong.TryParse(playerNameOrID, out var id);
id = Utilities.GetPlayerByNameOrId(playerNameOrID)?.SteamUserId ?? id;
/*IMyPlayer player = Utilities.GetPlayerByNameOrId(playerName);*/
if (id == 0) {
Context.Respond($"Player '{playerNameOrID}' not found or ID is invalid.");
return;
}
var player = Utilities.GetPlayerByNameOrId(playerNameOrID);
if (rank == null) {
Context.Respond("Rank does not exist!");
return;
}

PlayerAccountModule.PlayerAccountData data = new PlayerAccountModule.PlayerAccountData();
var RegisteredPlayers = PlayerAccountModule.PlayersAccounts.Select(o => o.Player).ToList();
if (!RegisteredPlayers.Contains(playerName)) {
Log.Warn($"Player {playerName} does have registered player object... Creating one");
data.Player = playerName;
//data.SteamID = playerName;
data.Rank = rank.RankName;
AccModule.UpdatePlayerAccount(data);
Context.Respond($"{playerName}'s rank set to {rank.RankName}");
Log.Info($"{playerName}'s rank set to {rank.RankName}");
return;
var RegisteredPlayerNames = PlayerAccountModule.PlayersAccounts.Select(o => o.Player).ToList();
var RegisteredPlayerSteamIDs = PlayerAccountModule.PlayersAccounts.Select(o => o.SteamID).ToList();
if (!RegisteredPlayerNames.Contains(playerNameOrID) && !RegisteredPlayerSteamIDs.Contains(id)) {
Log.Warn($"Player {playerNameOrID} does have registered player object... Creating one");
data.Player = playerNameOrID;
data.SteamID = player.SteamUserId;
}

if(RegisteredPlayerNames.Contains(playerNameOrID)) {
data = PlayerAccountModule.PlayersAccounts.Single(a => a.Player == playerNameOrID);
}

if(RegisteredPlayerSteamIDs.Contains(id)) {
data = PlayerAccountModule.PlayersAccounts.Single(a => a.SteamID == id);
}
data = PlayerAccountModule.PlayersAccounts.Single(a => a.Player == playerName);

data.Rank = rank.RankName;
if (rank.ReservedSlot && !MySandboxGame.ConfigDedicated.Reserved.Contains(id)) {
MySandboxGame.ConfigDedicated.Reserved.Add(id);
} else if (!rank.ReservedSlot && MySandboxGame.ConfigDedicated.Reserved.Contains(id)) {
MySandboxGame.ConfigDedicated.Reserved.Remove(id);
}
MySession.Static.SetUserPromoteLevel(data.SteamID, RanksAndPermissions.ParseMyPromoteLevel(rank.KeenLevelRank));

Context.Respond($"{data.Player}'s rank set to {rank.RankName}");
Log.Info($"{data.Player}'s rank set to {rank.RankName}");
AccModule.UpdatePlayerAccount(data);
}

[Command("populate")]
[Permission(MyPromoteLevel.Admin)]
public void Populate(string rank, string level) {

Context.Respond("Command disabled");
return;

var commandManager = EssentialsPlugin.Instance.CommandManager;
if (commandManager == null) {
Context.Respond("Must have an attached session to list commands");
return;
}
commandManager.Commands.GetNode(Context.Args, out CommandTree.CommandNode node);

if (node != null) {
var command = node.Command;
var children = node.Subcommands.Where(e => e.Value.Command?.MinimumPromoteLevel.ToString() == level).Select(x => x.Key);

var sb = new StringBuilder();

if (command != null && (Context.Player == null || command.MinimumPromoteLevel <= Context.Player.PromoteLevel)) {
sb.AppendLine($"Syntax: {command.SyntaxHelp}");
sb.Append(command.HelpText);
}

if (node.Subcommands.Count() != 0)
sb.Append($"\nSubcommands: {string.Join(", ", children)}");

Context.Respond(sb.ToString());
}
else {
var sb = new StringBuilder();
foreach (var command in commandManager.Commands.WalkTree()) {
if (command.IsCommand && (Context.Player == null || command.Command.MinimumPromoteLevel <= Context.Player.PromoteLevel))
sb.AppendLine($"{command.Command.SyntaxHelp}\n {command.Command.HelpText}");
}
Context.Respond($"Available commands: {sb}");
}
}

[Command("addinheritance")]
[Permission(MyPromoteLevel.Admin)]
public void AddInheritance(string rankName, string inheritanceName) {
Expand Down Expand Up @@ -301,7 +383,7 @@ public void RemovePlayerPermission(string playerName, string command) {

[Command("listranks")]
[Permission(MyPromoteLevel.None)]
public void ListRanks() {
public void ListRanks(string listRankName) {
bool found = false;
string Ranks = "Ranks: ";
foreach (var rank in RanksAndPermissionsModule.Ranks) {
Expand Down
5 changes: 4 additions & 1 deletion Essentials/Essentials.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
<Compile Include="AutoCommand.cs" />
<Compile Include="AutoCommands.cs" />
<Compile Include="Commands\EcoModule.cs" />
<Compile Include="Commands\HomeModule.cs" />
<Compile Include="Commands\RanksModule.cs" />
<Compile Include="Commands\VotingModule.cs" />
<Compile Include="Commands\AdminModule.cs" />
Expand All @@ -158,11 +159,13 @@
<Compile Include="GridFinder.cs" />
<Compile Include="InfoCommand.cs" />
<Compile Include="Commands\InfoModule.cs" />
<Compile Include="Patches\ChatMessagePatch.cs" />
<Compile Include="Patches\SessionDownloadPatch.cs" />
<Compile Include="PlayerAccountModule.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RanksAndPermissionsModule.cs" />
<Compile Include="Utilities.cs" />
<Compile Include="Utils\Events.cs" />
<Compile Include="Utils\Ownership.cs" />
<Compile Include="Utils\TypedObjectPool.cs" />
</ItemGroup>
Expand All @@ -176,4 +179,4 @@
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
</Project>
6 changes: 3 additions & 3 deletions Essentials/EssentialsConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ public EssentialsConfig()
[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")]
public bool OverrideVanillaPerms { get => _overridePerms; set => SetValue(ref _overridePerms, value); }

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

private string _newUserMotd;
public string NewUserMotd { get => _newUserMotd; set => SetValue(ref _newUserMotd, value); }
Expand Down
20 changes: 16 additions & 4 deletions Essentials/EssentialsPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public class EssentialsPlugin : TorchPluginBase, IWpfPlugin
public string rankDataPath = "";

private TorchSessionManager _sessionManager;
public CommandManager CommandManager;

private UserControl _control;
private Persistent<EssentialsConfig> _config;
Expand Down Expand Up @@ -97,6 +98,8 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)
{
var mpMan = Torch.CurrentSession.Managers.GetManager<IMultiplayerManagerServer>();
var cmdMan = Torch.CurrentSession.Managers.GetManager<CommandManager>();
CommandManager = cmdMan;

switch (state)
{
case TorchSessionState.Loading:
Expand All @@ -114,11 +117,12 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)

case TorchSessionState.Loaded:
mpMan.PlayerJoined += AccModule.GenerateAccount;
mpMan.PlayerJoined += AccModule.CheckIp;
mpMan.PlayerJoined += MotdOnce;
if (Config.EnableRanks) {
RanksAndPermissions.GenerateRank(Config.DefaultRank);
mpMan.PlayerJoined += RanksAndPermissions.RegisterInheritedRanks;
}
RanksAndPermissions.GenerateRank(Config.DefaultRank);
mpMan.PlayerJoined += RanksAndPermissions.RegisterInheritedRanks;
AccModule.ValidateRanks();

mpMan.PlayerLeft += ResetMotdOnce;
cmdMan.OnCommandExecuting +=RanksAndPermissions.HasCommandPermission;
MyEntities.OnEntityAdd += EntityAdded;
Expand All @@ -133,6 +137,8 @@ private void SessionChanged(ITorchSession session, TorchSessionState state)
InfoModule.Init();
break;
case TorchSessionState.Unloading:
Log.Info("Unloading rank data into JSON");
RanksAndPermissions.SaveRankData();
mpMan.PlayerLeft -= ResetMotdOnce;
mpMan.PlayerJoined -= MotdOnce;
MyEntities.OnEntityAdd -= EntityAdded;
Expand Down Expand Up @@ -169,6 +175,12 @@ private void EntityAdded(MyEntity myEntity)
bags.Add(b);
}


public static void InsertDiscordID(ulong steamID, string discordID, string discordName, Dictionary<ulong,string> RoleData) {
PlayerAccountModule.InsertDiscord(steamID, discordID, discordName, RoleData);

}

private void ProcessBags()
{
//bags don't have inventory in the Add event, so we wait until the next tick. I hate everything.
Expand Down
Loading

0 comments on commit 584cc80

Please sign in to comment.