Merge branch 'general-devel' into validateplaceobject
This commit is contained in:
commit
3b32774a0d
7 changed files with 157 additions and 67 deletions
|
|
@ -10,6 +10,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
|
|||
* Validated tile placement on PlaceObject; clients can no longer place frames, paintings etc with dirt blocks (@bartico6, @ProfessorXZ)
|
||||
|
||||
## TShock 4.3.24
|
||||
* API: Changed `PlayerHooks` permission hook mechanisms to allow negation from hooks (@deadsurgeon42)
|
||||
* Updated OpenTerraria API to 1.3.5.3 (@DeathCradle)
|
||||
* Updated Terraria Server API to 1.3.5.3 (@WhiteXZ, @hakusaro)
|
||||
* Updated TShock core components to 1.3.5.3 (@hakusaro)
|
||||
|
|
|
|||
|
|
@ -201,8 +201,9 @@ namespace TShockAPI.DB
|
|||
if (ply.HasPermission(Permissions.usebanneditem))
|
||||
return true;
|
||||
|
||||
if (PlayerHooks.OnPlayerItembanPermission(ply, this))
|
||||
return true;
|
||||
PermissionHookResult hookResult = PlayerHooks.OnPlayerItembanPermission(ply, this);
|
||||
if (hookResult != PermissionHookResult.Unhandled)
|
||||
return hookResult == PermissionHookResult.Granted;
|
||||
|
||||
var cur = ply.Group;
|
||||
var traversed = new List<Group>();
|
||||
|
|
|
|||
|
|
@ -206,8 +206,9 @@ namespace TShockAPI.DB
|
|||
if (ply.HasPermission(Permissions.canusebannedprojectiles))
|
||||
return true;
|
||||
|
||||
if (PlayerHooks.OnPlayerProjbanPermission(ply, this))
|
||||
return true;
|
||||
PermissionHookResult hookResult = PlayerHooks.OnPlayerProjbanPermission(ply, this);
|
||||
if (hookResult != PermissionHookResult.Unhandled)
|
||||
return hookResult == PermissionHookResult.Granted;
|
||||
|
||||
var cur = ply.Group;
|
||||
var traversed = new List<Group>();
|
||||
|
|
|
|||
|
|
@ -206,8 +206,9 @@ namespace TShockAPI.DB
|
|||
if (ply.HasPermission(Permissions.canusebannedtiles))
|
||||
return true;
|
||||
|
||||
if (PlayerHooks.OnPlayerTilebanPermission(ply, this))
|
||||
return true;
|
||||
PermissionHookResult hookResult = PlayerHooks.OnPlayerTilebanPermission(ply, this);
|
||||
if (hookResult != PermissionHookResult.Unhandled)
|
||||
return hookResult == PermissionHookResult.Granted;
|
||||
|
||||
var cur = ply.Group;
|
||||
var traversed = new List<Group>();
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ namespace TShockAPI.Hooks
|
|||
/// <summary>
|
||||
/// EventArgs used for the <see cref="PlayerHooks.PlayerPermission"/> event.
|
||||
/// </summary>
|
||||
public class PlayerPermissionEventArgs : HandledEventArgs
|
||||
public class PlayerPermissionEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The player who fired the event.
|
||||
|
|
@ -155,6 +155,11 @@ namespace TShockAPI.Hooks
|
|||
/// </summary>
|
||||
public string Permission { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="PermissionHookResult"/> of the hook.
|
||||
/// </summary>
|
||||
public PermissionHookResult Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the PlayerPermissionEventArgs class.
|
||||
/// </summary>
|
||||
|
|
@ -164,13 +169,14 @@ namespace TShockAPI.Hooks
|
|||
{
|
||||
Player = player;
|
||||
Permission = permission;
|
||||
Result = PermissionHookResult.Unhandled;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// EventArgs used for the <see cref="PlayerHooks.PlayerItembanPermission"/> event.
|
||||
/// </summary>
|
||||
public class PlayerItembanPermissionEventArgs : HandledEventArgs
|
||||
public class PlayerItembanPermissionEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The player who fired the event.
|
||||
|
|
@ -182,22 +188,28 @@ namespace TShockAPI.Hooks
|
|||
/// </summary>
|
||||
public ItemBan BannedItem { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="PermissionHookResult"/> of the hook.
|
||||
/// </summary>
|
||||
public PermissionHookResult Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the PlayerItembanPermissionEventArgs class.
|
||||
/// </summary>
|
||||
/// <param name="player">The player who fired the event.</param>
|
||||
/// <param name="permission">The permission being checked.</param>
|
||||
/// <param name="bannedItem">The banned item being checked.</param>
|
||||
public PlayerItembanPermissionEventArgs(TSPlayer player, ItemBan bannedItem)
|
||||
{
|
||||
Player = player;
|
||||
BannedItem = bannedItem;
|
||||
Result = PermissionHookResult.Unhandled;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// EventArgs used for the <see cref="PlayerHooks.PlayerProjbanPermission"/> event.
|
||||
/// </summary>
|
||||
public class PlayerProjbanPermissionEventArgs : HandledEventArgs
|
||||
public class PlayerProjbanPermissionEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The player who fired the event.
|
||||
|
|
@ -209,6 +221,11 @@ namespace TShockAPI.Hooks
|
|||
/// </summary>
|
||||
public ProjectileBan BannedProjectile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="PermissionHookResult"/> of the hook.
|
||||
/// </summary>
|
||||
public PermissionHookResult Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the PlayerProjbanPermissionEventArgs class.
|
||||
/// </summary>
|
||||
|
|
@ -218,13 +235,14 @@ namespace TShockAPI.Hooks
|
|||
{
|
||||
Player = player;
|
||||
BannedProjectile = checkedProjectile;
|
||||
Result = PermissionHookResult.Unhandled;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// EventArgs used for the <see cref="PlayerHooks.PlayerTilebanPermission"/> event.
|
||||
/// </summary>
|
||||
public class PlayerTilebanPermissionEventArgs : HandledEventArgs
|
||||
public class PlayerTilebanPermissionEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The player who fired the event.
|
||||
|
|
@ -236,6 +254,11 @@ namespace TShockAPI.Hooks
|
|||
/// </summary>
|
||||
public TileBan BannedTile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="PermissionHookResult"/> of the hook.
|
||||
/// </summary>
|
||||
public PermissionHookResult Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the PlayerTilebanPermissionEventArgs class.
|
||||
/// </summary>
|
||||
|
|
@ -245,6 +268,7 @@ namespace TShockAPI.Hooks
|
|||
{
|
||||
Player = player;
|
||||
BannedTile = checkedTile;
|
||||
Result = PermissionHookResult.Unhandled;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -439,60 +463,79 @@ namespace TShockAPI.Hooks
|
|||
/// Fires the <see cref="PlayerPermission"/> event.
|
||||
/// </summary>
|
||||
/// <param name="player">The player firing the event.</param>
|
||||
/// <returns>True if the event has been handled.</returns>
|
||||
public static bool OnPlayerPermission(TSPlayer player, string permission)
|
||||
/// <returns>Event result if the event has been handled, otherwise <see cref="PermissionHookResult.Unhandled"/>.</returns>
|
||||
public static PermissionHookResult OnPlayerPermission(TSPlayer player, string permission)
|
||||
{
|
||||
if (PlayerPermission == null)
|
||||
return false;
|
||||
return PermissionHookResult.Unhandled;
|
||||
|
||||
var args = new PlayerPermissionEventArgs(player, permission);
|
||||
PlayerPermission(args);
|
||||
return args.Handled;
|
||||
|
||||
return args.Result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires the <see cref="PlayerItembanPermission"/> event.
|
||||
/// </summary>
|
||||
/// <param name="player">The player firing the event.</param>
|
||||
/// <returns>True if the event has been handled.</returns>
|
||||
public static bool OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem)
|
||||
/// <returns>Event result if the event has been handled, otherwise <see cref="PermissionHookResult.Unhandled"/>.</returns>
|
||||
public static PermissionHookResult OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem)
|
||||
{
|
||||
if (PlayerItembanPermission == null)
|
||||
return false;
|
||||
return PermissionHookResult.Unhandled;
|
||||
|
||||
var args = new PlayerItembanPermissionEventArgs(player, bannedItem);
|
||||
PlayerItembanPermission(args);
|
||||
return args.Handled;
|
||||
|
||||
return args.Result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires the <see cref="PlayerProjbanPermission"/> event.
|
||||
/// </summary>
|
||||
/// <param name="player">The player firing the event.</param>
|
||||
/// <returns>True if the event has been handled.</returns>
|
||||
public static bool OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj)
|
||||
/// <returns>Event result if the event has been handled, otherwise <see cref="PermissionHookResult.Unhandled"/>.</returns>
|
||||
public static PermissionHookResult OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj)
|
||||
{
|
||||
if (PlayerProjbanPermission == null)
|
||||
return false;
|
||||
return PermissionHookResult.Unhandled;
|
||||
|
||||
var args = new PlayerProjbanPermissionEventArgs(player, bannedProj);
|
||||
PlayerProjbanPermission(args);
|
||||
return args.Handled;
|
||||
|
||||
return args.Result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires the <see cref="PlayerTilebanPermission"/> event.
|
||||
/// </summary>
|
||||
/// <param name="player">The player firing the event.</param>
|
||||
/// <returns>True if the event has been handled.</returns>
|
||||
public static bool OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile)
|
||||
/// <returns>Event result if the event has been handled, otherwise <see cref="PermissionHookResult.Unhandled"/>.</returns>
|
||||
public static PermissionHookResult OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile)
|
||||
{
|
||||
if (PlayerTilebanPermission == null)
|
||||
return false;
|
||||
return PermissionHookResult.Unhandled;
|
||||
|
||||
var args = new PlayerTilebanPermissionEventArgs(player, bannedTile);
|
||||
PlayerTilebanPermission(args);
|
||||
return args.Handled;
|
||||
|
||||
return args.Result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines the possible outcomes of <see cref="PlayerHooks.PlayerPermission"/> handlers.
|
||||
/// </summary>
|
||||
public enum PermissionHookResult
|
||||
{
|
||||
/// <summary>Hook doesn't return a result on the permission check.</summary>
|
||||
Unhandled,
|
||||
/// <summary>Permission is explicitly denied by a hook.</summary>
|
||||
Denied,
|
||||
/// <summary>Permission is explicitly granted by a hook.</summary>
|
||||
Granted
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,11 +22,13 @@ using System.Threading;
|
|||
using System.Web;
|
||||
using TerrariaApi.Server;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using TShockAPI.Extensions;
|
||||
|
||||
|
||||
namespace TShockAPI
|
||||
{
|
||||
/// <summary>
|
||||
|
|
@ -52,10 +54,11 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public bool OptOut = false;
|
||||
|
||||
private PluginItem[] plugins;
|
||||
|
||||
private long totalMem = 0;
|
||||
private string serverId = "";
|
||||
private HttpClient _client;
|
||||
|
||||
private const string TrackerUrl = "http://stats.tshock.co/submit/{0}";
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -103,11 +106,9 @@ namespace TShockAPI
|
|||
private async Task SendUpdateAsync()
|
||||
{
|
||||
JsonData data = PrepareJsonData();
|
||||
|
||||
var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(data);
|
||||
var encoded = HttpUtility.UrlEncode(serialized);
|
||||
var uri = String.Format(TrackerUrl, encoded);
|
||||
|
||||
var uri = string.Format(TrackerUrl, encoded);
|
||||
try
|
||||
{
|
||||
HttpResponseMessage msg = await _client.GetAsync(uri);
|
||||
|
|
@ -139,49 +140,81 @@ namespace TShockAPI
|
|||
|
||||
private JsonData PrepareJsonData()
|
||||
{
|
||||
if (ServerApi.RunningMono)
|
||||
{
|
||||
if (totalMem == 0)
|
||||
{
|
||||
//Only do this if we haven't already cached the total physicaly memory
|
||||
var pc = new PerformanceCounter("Mono Memory", "Total Physical Memory");
|
||||
totalMem = (pc.RawValue / 1024 / 1024 / 1024);
|
||||
}
|
||||
|
||||
return new JsonData
|
||||
{
|
||||
port = Terraria.Netplay.ListenPort,
|
||||
currentPlayers = TShock.Utils.ActivePlayers(),
|
||||
maxPlayers = TShock.Config.MaxSlots,
|
||||
systemRam = totalMem,
|
||||
version = TShock.VersionNum.ToString(),
|
||||
terrariaVersion = Terraria.Main.versionNumber2,
|
||||
providerId = ProviderToken,
|
||||
serverId = serverId,
|
||||
mono = true
|
||||
};
|
||||
}
|
||||
|
||||
if (totalMem == 0)
|
||||
{
|
||||
//Again, only call this if it hasn't previously been cached
|
||||
GetPhysicallyInstalledSystemMemory(out totalMem);
|
||||
totalMem = (totalMem / 1024 / 1024); // Super hardcore maths to convert to Gb from Kb
|
||||
}
|
||||
|
||||
return new JsonData
|
||||
return new JsonData()
|
||||
{
|
||||
port = Terraria.Netplay.ListenPort,
|
||||
currentPlayers = TShock.Utils.ActivePlayers(),
|
||||
maxPlayers = TShock.Config.MaxSlots,
|
||||
systemRam = totalMem,
|
||||
systemRam = GetTotalSystemRam(ServerApi.RunningMono),
|
||||
version = TShock.VersionNum.ToString(),
|
||||
terrariaVersion = Terraria.Main.versionNumber2,
|
||||
providerId = ProviderToken,
|
||||
serverId = serverId,
|
||||
mono = false
|
||||
mono = ServerApi.RunningMono,
|
||||
ignorePluginVersion = ServerApi.IgnoreVersion,
|
||||
loadedPlugins = GetLoadedPlugins()
|
||||
};
|
||||
}
|
||||
|
||||
private PluginItem[] GetLoadedPlugins()
|
||||
{
|
||||
if (plugins != null)
|
||||
{
|
||||
return plugins;//Return early
|
||||
}
|
||||
|
||||
plugins = new PluginItem[ServerApi.Plugins.Count];//Initialize with enough room to store the ammount of plugins loaded.
|
||||
for (var i = 0; i < ServerApi.Plugins.Count; i++)
|
||||
{
|
||||
var pluginItem = new PluginItem();
|
||||
var apiAttribute = (ApiVersionAttribute)ServerApi.Plugins[i].Plugin.GetType().GetCustomAttributes(typeof(ApiVersionAttribute), false).FirstOrDefault();
|
||||
//The current implementation of loading plugins doesn't allow for a plugin to be loaded without an ApiVersion, the UNKNOWN is there incase a change is made to allow it
|
||||
pluginItem.apiVersion = apiAttribute?.ApiVersion.ToString() ?? "UNKNOWN";
|
||||
pluginItem.name = ServerApi.Plugins[i].Plugin.Name;
|
||||
pluginItem.version = ServerApi.Plugins[i].Plugin.Version.ToString();
|
||||
plugins[i] = pluginItem;
|
||||
}
|
||||
return plugins;
|
||||
}
|
||||
|
||||
private long GetTotalSystemRam(bool isMono)
|
||||
{
|
||||
if (totalMem != 0)
|
||||
{
|
||||
return totalMem;//Return early
|
||||
}
|
||||
|
||||
if (isMono)//Set totalMem so it can be returned later
|
||||
{
|
||||
var pc = new PerformanceCounter("Mono Memory", "Total Physical Memory");
|
||||
totalMem = (pc.RawValue / 1024 / 1024 / 1024);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetPhysicallyInstalledSystemMemory(out totalMem);
|
||||
totalMem = (totalMem / 1024 / 1024); // Super hardcore maths to convert to Gb from Kb
|
||||
}
|
||||
|
||||
return totalMem;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Holding information regarding loaded plugins
|
||||
/// </summary>
|
||||
public struct PluginItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Plugin name
|
||||
/// </summary>
|
||||
public string name;
|
||||
/// <summary>
|
||||
/// Assembly version
|
||||
/// </summary>
|
||||
public string version;
|
||||
/// <summary>
|
||||
/// Api version or UNKNOWN if attribute is missing, which is currently impossible
|
||||
/// </summary>
|
||||
public string apiVersion;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -210,6 +243,14 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public string version;
|
||||
/// <summary>
|
||||
/// Whether or not server was started with --ignoreversion
|
||||
/// </summary>
|
||||
public bool ignorePluginVersion;
|
||||
/// <summary>
|
||||
/// List of loaded plugins and version name:
|
||||
/// </summary>
|
||||
public PluginItem[] loadedPlugins;
|
||||
/// <summary>
|
||||
/// The Terraria version supported by the server
|
||||
/// </summary>
|
||||
public string terrariaVersion;
|
||||
|
|
@ -226,4 +267,4 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public bool mono;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1265,8 +1265,10 @@ namespace TShockAPI
|
|||
/// <returns>True if the player has that permission.</returns>
|
||||
public bool HasPermission(string permission)
|
||||
{
|
||||
if (PlayerHooks.OnPlayerPermission(this, permission))
|
||||
return true;
|
||||
PermissionHookResult hookResult = PlayerHooks.OnPlayerPermission(this, permission);
|
||||
|
||||
if (hookResult != PermissionHookResult.Unhandled)
|
||||
return hookResult == PermissionHookResult.Granted;
|
||||
|
||||
if (tempGroup != null)
|
||||
return tempGroup.HasPermission(permission);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue