Merge branch 'general-devel' into group-changes
This commit is contained in:
commit
fe3644ca80
33 changed files with 1875 additions and 1062 deletions
|
|
@ -424,7 +424,7 @@ namespace TShockAPI
|
|||
};
|
||||
PlayerAddBuffWhitelist[BuffID.BrainOfConfusionBuff] = new BuffLimit
|
||||
{
|
||||
MaxTicks = 240,
|
||||
MaxTicks = 60 * 4,
|
||||
CanBeAddedWithoutHostile = true,
|
||||
CanOnlyBeAppliedToSender = true
|
||||
};
|
||||
|
|
@ -434,6 +434,12 @@ namespace TShockAPI
|
|||
CanBeAddedWithoutHostile = true,
|
||||
CanOnlyBeAppliedToSender = true
|
||||
};
|
||||
PlayerAddBuffWhitelist[BuffID.ParryDamageBuff] = new BuffLimit
|
||||
{
|
||||
MaxTicks = 60 * 5,
|
||||
CanBeAddedWithoutHostile = true,
|
||||
CanOnlyBeAppliedToSender = true
|
||||
};
|
||||
|
||||
#endregion Whitelist
|
||||
}
|
||||
|
|
@ -1878,7 +1884,7 @@ namespace TShockAPI
|
|||
return;
|
||||
}
|
||||
|
||||
if (TShock.Players[id] == null)
|
||||
if (TShock.Players[id] == null || !TShock.Players[id].Active)
|
||||
{
|
||||
TShock.Log.ConsoleDebug(GetString(
|
||||
"Bouncer / OnPlayerBuff rejected {0} ({1}) applying buff {2} to {3} for {4} ticks: target is null", args.Player.Name,
|
||||
|
|
@ -2081,7 +2087,7 @@ namespace TShockAPI
|
|||
short amount = args.Amount;
|
||||
byte plr = args.TargetPlayerIndex;
|
||||
|
||||
if (amount <= 0 || Main.player[plr] == null || !Main.player[plr].active)
|
||||
if (amount <= 0 || TShock.Players[plr] == null || !TShock.Players[plr].Active)
|
||||
{
|
||||
TShock.Log.ConsoleDebug(GetString("Bouncer / OnHealOtherPlayer rejected null checks"));
|
||||
args.Handled = true;
|
||||
|
|
@ -2589,7 +2595,7 @@ namespace TShockAPI
|
|||
byte direction = args.Direction;
|
||||
PlayerDeathReason reason = args.PlayerDeathReason;
|
||||
|
||||
if (id >= Main.maxPlayers || TShock.Players[id] == null)
|
||||
if (id >= Main.maxPlayers || TShock.Players[id] == null || !TShock.Players[id].Active)
|
||||
{
|
||||
TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlayerDamage rejected null check"));
|
||||
args.Handled = true;
|
||||
|
|
@ -2854,7 +2860,7 @@ namespace TShockAPI
|
|||
{ BuffID.Poisoned, 3600 }, // BuffID: 20
|
||||
{ BuffID.OnFire, 1200 }, // BuffID: 24
|
||||
{ BuffID.Confused, short.MaxValue }, // BuffID: 31 Brain of Confusion Internal Item ID: 3223
|
||||
{ BuffID.CursedInferno, 420 }, // BuffID: 39
|
||||
{ BuffID.CursedInferno, 600 }, // BuffID: 39
|
||||
{ BuffID.Frostburn, 900 }, // BuffID: 44
|
||||
{ BuffID.Ichor, 1200 }, // BuffID: 69
|
||||
{ BuffID.Venom, 1800 }, // BuffID: 70
|
||||
|
|
|
|||
|
|
@ -1176,7 +1176,7 @@ namespace TShockAPI
|
|||
|
||||
try
|
||||
{
|
||||
TShock.UserAccounts.SetUserGroup(account, args.Parameters[2]);
|
||||
TShock.UserAccounts.SetUserGroup(args.Player, account, args.Parameters[2]);
|
||||
TShock.Log.ConsoleInfo(GetString("{0} changed account {1} to group {2}.", args.Player.Name, account.Name, args.Parameters[2]));
|
||||
args.Player.SendSuccessMessage(GetString("Account {0} has been changed to group {1}.", account.Name, args.Parameters[2]));
|
||||
|
||||
|
|
@ -1193,6 +1193,10 @@ namespace TShockAPI
|
|||
{
|
||||
args.Player.SendErrorMessage(GetString($"User {account.Name} does not exist."));
|
||||
}
|
||||
catch (UserGroupUpdateLockedException)
|
||||
{
|
||||
args.Player.SendErrorMessage(GetString("Hook blocked the attempt to change the user group."));
|
||||
}
|
||||
catch (UserAccountManagerException e)
|
||||
{
|
||||
args.Player.SendErrorMessage(GetString($"User {account.Name} could not be added. Check console for details."));
|
||||
|
|
@ -2044,6 +2048,7 @@ namespace TShockAPI
|
|||
private static void OffNoSave(CommandArgs args)
|
||||
{
|
||||
string reason = ((args.Parameters.Count > 0) ? GetString("Server shutting down: ") + String.Join(" ", args.Parameters) : GetString("Server shutting down."));
|
||||
Netplay.SaveOnServerExit = false;
|
||||
TShock.Utils.StopServer(false, reason);
|
||||
}
|
||||
|
||||
|
|
@ -3070,12 +3075,12 @@ namespace TShockAPI
|
|||
args.Player.SendErrorMessage(GetString("You do not have permission to teleport all other players."));
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < Main.maxPlayers; i++)
|
||||
foreach (var player in TShock.Players)
|
||||
{
|
||||
if (Main.player[i].active && (Main.player[i] != args.TPlayer))
|
||||
if (player != null && player.Active && player.Index != args.Player.Index)
|
||||
{
|
||||
if (TShock.Players[i].Teleport(args.TPlayer.position.X, args.TPlayer.position.Y))
|
||||
TShock.Players[i].SendSuccessMessage(GetString("You were teleported to {0}.", args.Player.Name));
|
||||
if (player.Teleport(args.TPlayer.position.X, args.TPlayer.position.Y))
|
||||
player.SendSuccessMessage(GetString("You were teleported to {0}.", args.Player.Name));
|
||||
}
|
||||
}
|
||||
args.Player.SendSuccessMessage(GetString("Teleported everyone to yourself."));
|
||||
|
|
@ -4622,21 +4627,22 @@ namespace TShockAPI
|
|||
{
|
||||
if (args.Parameters.Count != 1)
|
||||
{
|
||||
args.Player.SendErrorMessage(GetString("Invalid syntax. Proper syntax: {0}wind <speed>.", Specifier));
|
||||
args.Player.SendErrorMessage(GetString("Invalid syntax. Proper syntax: {0}wind <speed in mph>.", Specifier));
|
||||
return;
|
||||
}
|
||||
|
||||
int speed;
|
||||
if (!int.TryParse(args.Parameters[0], out speed) || speed * 100 < 0)
|
||||
float mph;
|
||||
if (!float.TryParse(args.Parameters[0], out mph) || mph is < -40f or > 40f)
|
||||
{
|
||||
args.Player.SendErrorMessage(GetString("Invalid wind speed."));
|
||||
args.Player.SendErrorMessage(GetString("Invalid wind speed (must be between -40 and 40)."));
|
||||
return;
|
||||
}
|
||||
|
||||
float speed = mph / 50f; // -40 to 40 mph -> -0.8 to 0.8
|
||||
Main.windSpeedCurrent = speed;
|
||||
Main.windSpeedTarget = speed;
|
||||
TSPlayer.All.SendData(PacketTypes.WorldInfo);
|
||||
TSPlayer.All.SendInfoMessage(GetString("{0} changed the wind speed to {1}.", args.Player.Name, speed));
|
||||
TSPlayer.All.SendInfoMessage(GetString("{0} changed the wind speed to {1}mph.", args.Player.Name, mph));
|
||||
}
|
||||
|
||||
#endregion Time/PvpFun Commands
|
||||
|
|
|
|||
|
|
@ -320,8 +320,8 @@ namespace TShockAPI.Configuration
|
|||
[Description("The reason given if banning a mediumcore player on death.")]
|
||||
public string MediumcoreBanReason = GetString("Death results in a ban");
|
||||
|
||||
/// <summary>Disbales IP bans by default, if no arguments are passed to the ban command.</summary>
|
||||
[Description("Disbales IP bans by default, if no arguments are passed to the ban command.")]
|
||||
/// <summary>Disables IP bans by default, if no arguments are passed to the ban command.</summary>
|
||||
[Description("Disables IP bans by default, if no arguments are passed to the ban command.")]
|
||||
public bool DisableDefaultIPBan;
|
||||
|
||||
/// <summary>Enable or disable the whitelist based on IP addresses in the whitelist.txt file.</summary>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ using MySql.Data.MySqlClient;
|
|||
using System.Text.RegularExpressions;
|
||||
using BCrypt.Net;
|
||||
using System.Security.Cryptography;
|
||||
using TShockAPI.Hooks;
|
||||
|
||||
namespace TShockAPI.DB
|
||||
{
|
||||
|
|
@ -166,7 +167,41 @@ namespace TShockAPI.DB
|
|||
if (null == grp)
|
||||
throw new GroupNotExistsException(group);
|
||||
|
||||
if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, account.Name) == 0)
|
||||
if (AccountHooks.OnAccountGroupUpdate(account, ref grp))
|
||||
throw new UserGroupUpdateLockedException(account.Name);
|
||||
|
||||
if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", grp.Name, account.Name) == 0)
|
||||
throw new UserAccountNotExistException(account.Name);
|
||||
|
||||
try
|
||||
{
|
||||
// Update player group reference for any logged in player
|
||||
foreach (var player in TShock.Players.Where(p => p != null && p.Account != null && p.Account.Name == account.Name))
|
||||
{
|
||||
player.Group = grp;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new UserAccountManagerException(GetString("SetUserGroup SQL returned an error"), ex);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the group for a given username
|
||||
/// </summary>
|
||||
/// <param name="author">Who changes the group</param>
|
||||
/// <param name="account">The user account</param>
|
||||
/// <param name="group">The user account group to be set</param>
|
||||
public void SetUserGroup(TSPlayer author, UserAccount account, string group)
|
||||
{
|
||||
Group grp = TShock.Groups.GetGroupByName(group);
|
||||
if (null == grp)
|
||||
throw new GroupNotExistsException(group);
|
||||
|
||||
if (AccountHooks.OnAccountGroupUpdate(account, author, ref grp))
|
||||
throw new UserGroupUpdateLockedException(account.Name);
|
||||
|
||||
if (_database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", grp.Name, account.Name) == 0)
|
||||
throw new UserAccountNotExistException(account.Name);
|
||||
|
||||
try
|
||||
|
|
@ -619,7 +654,7 @@ namespace TShockAPI.DB
|
|||
public class UserAccountNotExistException : UserAccountManagerException
|
||||
{
|
||||
/// <summary>Creates a new UserAccountNotExistException object, with the user account name in the message.</summary>
|
||||
/// <param name="name">The user account name to be pasesd in the message.</param>
|
||||
/// <param name="name">The user account name to be passed in the message.</param>
|
||||
/// <returns>A new UserAccountNotExistException object with a message containing the user account name that does not exist.</returns>
|
||||
public UserAccountNotExistException(string name)
|
||||
: base(GetString($"User account {name} does not exist"))
|
||||
|
|
@ -627,6 +662,20 @@ namespace TShockAPI.DB
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>The UserGroupUpdateLockedException used when the user group update failed and the request failed as a result.</summary>.
|
||||
[Serializable]
|
||||
public class UserGroupUpdateLockedException : UserAccountManagerException
|
||||
{
|
||||
/// <summary>Creates a new UserGroupUpdateLockedException object.</summary>
|
||||
/// <param name="name">The name of the user who failed to change the group.</param>
|
||||
/// <returns>New UserGroupUpdateLockedException object with a message containing the name of the user account that failed to change the group.</returns>
|
||||
public UserGroupUpdateLockedException(string name) :
|
||||
base(GetString($"Unable to update group of user {name}."))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>A GroupNotExistsException, used when a group does not exist.</summary>
|
||||
[Serializable]
|
||||
public class GroupNotExistsException : UserAccountManagerException
|
||||
|
|
|
|||
|
|
@ -4445,6 +4445,11 @@ namespace TShockAPI
|
|||
return true;
|
||||
}
|
||||
|
||||
// Don't modify the player data if it isn't there.
|
||||
// This is the case whilst the player is connecting, as we receive the SyncLoadout packet before the ContinueConnecting2 packet.
|
||||
if (args.Player.PlayerData == null)
|
||||
return false;
|
||||
|
||||
// The client does not sync slot changes when changing loadouts, it only tells the server the loadout index changed,
|
||||
// and the server will replicate the changes the client did. This means that PlayerData.StoreSlot is never called, so we need to
|
||||
// swap around the PlayerData items ourself.
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System.ComponentModel;
|
||||
using TShockAPI.DB;
|
||||
namespace TShockAPI.Hooks
|
||||
{
|
||||
|
|
@ -39,6 +40,31 @@ namespace TShockAPI.Hooks
|
|||
}
|
||||
}
|
||||
|
||||
public class AccountGroupUpdateEventArgs : HandledEventArgs
|
||||
{
|
||||
public string AccountName { get; private set; }
|
||||
public Group Group { get; set; }
|
||||
|
||||
public AccountGroupUpdateEventArgs(string accountName, Group group)
|
||||
{
|
||||
this.AccountName = accountName;
|
||||
this.Group = group;
|
||||
}
|
||||
}
|
||||
|
||||
public class AccountGroupUpdateByPlayerEventArgs : AccountGroupUpdateEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The player who updated the user's group
|
||||
/// </summary>
|
||||
public TSPlayer Player { get; private set; }
|
||||
|
||||
public AccountGroupUpdateByPlayerEventArgs(TSPlayer player, string accountName, Group group) : base(accountName, group)
|
||||
{
|
||||
this.Player = player;
|
||||
}
|
||||
}
|
||||
|
||||
public class AccountHooks
|
||||
{
|
||||
public delegate void AccountCreateD(AccountCreateEventArgs e);
|
||||
|
|
@ -62,5 +88,25 @@ namespace TShockAPI.Hooks
|
|||
|
||||
AccountDelete(new AccountDeleteEventArgs(u));
|
||||
}
|
||||
|
||||
public delegate void AccountGroupUpdateD(AccountGroupUpdateEventArgs e);
|
||||
public static event AccountGroupUpdateD AccountGroupUpdate;
|
||||
|
||||
public static bool OnAccountGroupUpdate(UserAccount account, TSPlayer author, ref Group group)
|
||||
{
|
||||
AccountGroupUpdateEventArgs args = new AccountGroupUpdateByPlayerEventArgs(author, account.Name, group);
|
||||
AccountGroupUpdate?.Invoke(args);
|
||||
group = args.Group;
|
||||
|
||||
return args.Handled;
|
||||
}
|
||||
public static bool OnAccountGroupUpdate(UserAccount account, ref Group group)
|
||||
{
|
||||
AccountGroupUpdateEventArgs args = new AccountGroupUpdateEventArgs(account.Name, group);
|
||||
AccountGroupUpdate?.Invoke(args);
|
||||
group = args.Group;
|
||||
|
||||
return args.Handled;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,12 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
if (LanguageManager.Instance.ActiveCulture == GameCulture.DefaultCulture)
|
||||
{
|
||||
var bf = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static;
|
||||
// LanguageManager.SetLanguage will change this so we need to reset it back to null
|
||||
typeof(CultureInfo).GetField("s_currentThreadUICulture", bf)?.SetValue(null, null);
|
||||
}
|
||||
return CultureInfo.CurrentUICulture;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,9 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Terraria;
|
||||
using Terraria.Initializers;
|
||||
using Terraria.Localization;
|
||||
using Terraria.UI.Chat;
|
||||
|
||||
namespace TShockAPI.Localization
|
||||
{
|
||||
|
|
@ -37,6 +39,8 @@ namespace TShockAPI.Localization
|
|||
|
||||
private static readonly Dictionary<int, string> Buffs = new Dictionary<int, string>();
|
||||
|
||||
private static readonly Dictionary<string,string> VanillaCommandsPrefixs = new Dictionary<string, string>();
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
var culture = Language.ActiveCulture;
|
||||
|
|
@ -71,6 +75,15 @@ namespace TShockAPI.Localization
|
|||
var i = (int)field.GetValue(null);
|
||||
Prefixs.Add(i, Lang.prefix[i].Value);
|
||||
}
|
||||
|
||||
ChatInitializer.Load();
|
||||
foreach (var command in ChatManager.Commands._localizedCommands)
|
||||
{
|
||||
if (VanillaCommandsPrefixs.ContainsKey(command.Value._name))
|
||||
continue;
|
||||
VanillaCommandsPrefixs.Add(command.Value._name,command.Key.Value);
|
||||
}
|
||||
ChatManager.Commands._localizedCommands.Clear();
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
|
@ -136,5 +149,18 @@ namespace TShockAPI.Localization
|
|||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get vanilla command prefix in English
|
||||
/// </summary>
|
||||
/// <param name="name">vanilla command name</param>
|
||||
/// <returns>vanilla command prefix in English</returns>
|
||||
public static string GetCommandPrefixByName(string name)
|
||||
{
|
||||
string commandText;
|
||||
if (VanillaCommandsPrefixs.TryGetValue(name, out commandText))
|
||||
return commandText;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
|
@ -155,13 +155,39 @@ namespace TShockAPI
|
|||
/// <param name="netId">The net ID.</param>
|
||||
/// <param name="stack">The stack.</param>
|
||||
/// <param name="prefixId">The prefix ID.</param>
|
||||
public NetItem(int netId, int stack, byte prefixId)
|
||||
public NetItem(int netId, int stack = 1, byte prefixId = 0)
|
||||
{
|
||||
_netId = netId;
|
||||
_stack = stack;
|
||||
_prefixId = prefixId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="NetItem"/>.
|
||||
/// </summary>
|
||||
/// <param name="item">Item in the game.</param>
|
||||
public NetItem(Item item)
|
||||
{
|
||||
_netId = item.netID;
|
||||
_stack = item.stack;
|
||||
_prefixId = item.prefix;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates <see cref="Terraria.Item"/> based on data from this structure.
|
||||
/// </summary>
|
||||
/// <returns>A copy of the item.</returns>
|
||||
public Item ToItem()
|
||||
{
|
||||
Item item = new Item();
|
||||
|
||||
item.netDefaults(_netId);
|
||||
item.stack = _stack;
|
||||
item.prefix = _prefixId;
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the <see cref="NetItem"/> to a string.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -529,18 +529,9 @@ namespace TShockAPI
|
|||
field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute;
|
||||
var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : GetString("No description available.");
|
||||
|
||||
var commands = GetCommands(name);
|
||||
foreach (var c in commands)
|
||||
{
|
||||
for (var i = 0; i < c.Names.Count; i++)
|
||||
{
|
||||
c.Names[i] = "/" + c.Names[i];
|
||||
}
|
||||
}
|
||||
var strs =
|
||||
commands.Select(
|
||||
c =>
|
||||
c.Name + (c.Names.Count > 1 ? " ({0})".SFormat(string.Join(" ", c.Names.ToArray(), 1, c.Names.Count - 1)) : ""));
|
||||
var strs = GetCommands(name).Select(c => c.Names.Count > 1
|
||||
? $"/{c.Name} (/{string.Join(" /", c.Names.Skip(1))})"
|
||||
: $"/{c.Name}");
|
||||
|
||||
sb.AppendLine($"## {name}");
|
||||
sb.AppendLine($"{desc}");
|
||||
|
|
|
|||
|
|
@ -351,7 +351,6 @@ namespace Rests
|
|||
{
|
||||
str = string.Format("{0}({1});", jsonp, str);
|
||||
}
|
||||
e.Response.Connection.Type = ConnectionType.Close;
|
||||
e.Response.ContentType = new ContentTypeHeader("application/json; charset=utf-8");
|
||||
e.Response.Add(serverHeader);
|
||||
var bytes = Encoding.UTF8.GetBytes(str);
|
||||
|
|
|
|||
|
|
@ -402,7 +402,7 @@ namespace TShockAPI
|
|||
{"serverversion", Main.versionNumber},
|
||||
{"tshockversion", TShock.VersionNum},
|
||||
{"port", TShock.Config.Settings.ServerPort},
|
||||
{"playercount", Main.player.Where(p => null != p && p.active).Count()},
|
||||
{"playercount", TShock.Utils.GetActivePlayerCount()},
|
||||
{"maxplayers", TShock.Config.Settings.MaxSlots},
|
||||
{"world", (TShock.Config.Settings.UseServerName ? TShock.Config.Settings.ServerName : Main.worldName)},
|
||||
{"uptime", (DateTime.Now - System.Diagnostics.Process.GetCurrentProcess().StartTime).ToString(@"d'.'hh':'mm':'ss")},
|
||||
|
|
@ -555,7 +555,8 @@ namespace TShockAPI
|
|||
{
|
||||
try
|
||||
{
|
||||
TShock.UserAccounts.SetUserGroup(account, group);
|
||||
TShock.UserAccounts.SetUserGroup(new TSRestPlayer(args.TokenData.Username, TShock.Groups.GetGroupByName(args.TokenData.UserGroupName)),
|
||||
account, group);
|
||||
response.Add("group-response", "Group updated successfully");
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
@ -944,8 +945,8 @@ namespace TShockAPI
|
|||
[Token]
|
||||
private object PlayerList(RestRequestArgs args)
|
||||
{
|
||||
var activeplayers = Main.player.Where(p => null != p && p.active).ToList();
|
||||
return new RestObject() { { "players", string.Join(", ", activeplayers.Select(p => p.name)) } };
|
||||
var activeplayers = TShock.Players.Where(p => null != p && p.Active).Select(p => p.Name);
|
||||
return new RestObject() { { "players", string.Join(", ", activeplayers) } };
|
||||
}
|
||||
|
||||
[Description("Fetches detailed user information on all connected users, and can be filtered by specifying a key value pair filter users where the key is a field and the value is a users field value.")]
|
||||
|
|
|
|||
|
|
@ -428,6 +428,8 @@ namespace TShockAPI
|
|||
Hooks.AccountHooks.AccountDelete += OnAccountDelete;
|
||||
Hooks.AccountHooks.AccountCreate += OnAccountCreate;
|
||||
|
||||
On.Terraria.RemoteClient.Reset += RemoteClient_Reset;
|
||||
|
||||
GetDataHandlers.InitGetDataHandler();
|
||||
Commands.InitCommands();
|
||||
|
||||
|
|
@ -496,6 +498,12 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
private static void RemoteClient_Reset(On.Terraria.RemoteClient.orig_Reset orig, RemoteClient client)
|
||||
{
|
||||
client.ClientUUID = null;
|
||||
orig(client);
|
||||
}
|
||||
|
||||
private static void OnAchievementInitializerLoad(ILContext il)
|
||||
{
|
||||
// Modify AchievementInitializer.Load to remove the Main.netMode == 2 check (occupies the first 4 IL instructions)
|
||||
|
|
@ -1497,11 +1505,11 @@ namespace TShockAPI
|
|||
{
|
||||
if (!String.IsNullOrEmpty(text))
|
||||
{
|
||||
text = item.Key.Value + ' ' + text;
|
||||
text = EnglishLanguage.GetCommandPrefixByName(item.Value._name) + ' ' + text;
|
||||
}
|
||||
else
|
||||
{
|
||||
text = item.Key.Value;
|
||||
text = EnglishLanguage.GetCommandPrefixByName(item.Value._name);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
Also, be sure to release on github with the exact assembly version tag as below
|
||||
so that the update manager works correctly (via the Github releases api and mimic)
|
||||
-->
|
||||
<Version>5.2.0</Version>
|
||||
<Version>5.2.1</Version>
|
||||
<AssemblyTitle>TShock for Terraria</AssemblyTitle>
|
||||
<Company>Pryaxis & TShock Contributors</Company>
|
||||
<Product>TShockAPI</Product>
|
||||
|
|
@ -34,7 +34,7 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
|
||||
<PackageReference Include="GetText.NET" Version="1.7.14" />
|
||||
<PackageReference Include="MySql.Data" Version="8.0.31" />
|
||||
<PackageReference Include="MySql.Data" Version="8.4.0" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="6.0.11" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public class TextLog : ILog, IDisposable
|
||||
{
|
||||
private readonly StreamWriter _logWriter;
|
||||
private readonly bool ClearFile;
|
||||
private StreamWriter _logWriter;
|
||||
|
||||
/// <summary>
|
||||
/// File name of the Text log
|
||||
|
|
@ -44,7 +45,7 @@ namespace TShockAPI
|
|||
public TextLog(string filename, bool clear)
|
||||
{
|
||||
FileName = filename;
|
||||
_logWriter = new StreamWriter(filename, !clear);
|
||||
ClearFile = clear;
|
||||
}
|
||||
|
||||
public bool MayWriteType(TraceLevel type)
|
||||
|
|
@ -247,6 +248,10 @@ namespace TShockAPI
|
|||
{
|
||||
if (!MayWriteType(level))
|
||||
return;
|
||||
if (_logWriter is null)
|
||||
{
|
||||
_logWriter = new StreamWriter(FileName, !ClearFile);
|
||||
}
|
||||
|
||||
var caller = "TShock";
|
||||
|
||||
|
|
@ -278,7 +283,10 @@ namespace TShockAPI
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
_logWriter.Dispose();
|
||||
if (_logWriter != null)
|
||||
{
|
||||
_logWriter.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ namespace TShockAPI
|
|||
foreach (TSPlayer player in TShock.Players)
|
||||
{
|
||||
if (player != null && player != excludedPlayer && player.Active && player.HasPermission(Permissions.logs) &&
|
||||
player.DisplayLogs && TShock.Config.Settings.DisableSpewLogs == false)
|
||||
player.DisplayLogs && !TShock.Config.Settings.DisableSpewLogs)
|
||||
player.SendMessage(log, color);
|
||||
}
|
||||
}
|
||||
|
|
@ -183,7 +183,7 @@ namespace TShockAPI
|
|||
/// <returns>The number of active players on the server.</returns>
|
||||
public int GetActivePlayerCount()
|
||||
{
|
||||
return Main.player.Where(p => null != p && p.active).Count();
|
||||
return TShock.Players.Count(p => null != p && p.Active);
|
||||
}
|
||||
|
||||
//Random should not be generated in a method
|
||||
|
|
@ -1149,11 +1149,15 @@ namespace TShockAPI
|
|||
/// <param name="empty">If the server is empty; determines if we should use Utils.GetActivePlayerCount() for player count or 0.</param>
|
||||
internal void SetConsoleTitle(bool empty)
|
||||
{
|
||||
if (ShouldSkipTitle)
|
||||
return;
|
||||
Console.Title = GetString("{0}{1}/{2} on {3} @ {4}:{5} (TShock for Terraria v{6})",
|
||||
!string.IsNullOrWhiteSpace(TShock.Config.Settings.ServerName) ? TShock.Config.Settings.ServerName + " - " : "",
|
||||
empty ? 0 : GetActivePlayerCount(),
|
||||
TShock.Config.Settings.MaxSlots, Main.worldName, Netplay.ServerIP.ToString(), Netplay.ListenPort, TShock.VersionNum);
|
||||
}
|
||||
// Some terminals doesn't supports XTerm escape sequences for setting the title
|
||||
private static bool ShouldSkipTitle = !System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows) && !(Environment.GetEnvironmentVariable("TERM")?.Contains("xterm") ?? false);
|
||||
|
||||
/// <summary>Determines the distance between two vectors.</summary>
|
||||
/// <param name="value1">The first vector location.</param>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue