Merge branch 'general-devel' into fix-invalid-groups
This commit is contained in:
commit
09a2947cf4
7 changed files with 146 additions and 16 deletions
13
CHANGELOG.md
13
CHANGELOG.md
|
|
@ -14,7 +14,15 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
|
|||
|
||||
## Upcoming changes
|
||||
* Fixed SendTileRectHandler not sending tile rect updates like Pylons/Mannequins to other clients. (@Stealownz)
|
||||
* Fix some typos that have been in the repository for over a lustrum. (@Killia0)
|
||||
* Introduced `SoftcoreOnly` config option to allow only softcore characters to connect. (@drunderscore)
|
||||
* Fixed some typos that have been in the repository for over a lustrum. (@Killia0)
|
||||
* Added a `tshock.npc.summonboss` permission check for Lunatic Cultist, players who do not have this permission will not be able to kill Cultist Archers/Devotees to summon the Lunatic Cultist. (@moisterrific)
|
||||
* Added more usage examples for the `ban` command under `ban help examples` to explain how users can ban: offline players by account, offline players by IP, and online players by player index - useful for banning hard to type character names. (@moisterrific)
|
||||
* Changed `/login` and `/register` to provide login help depending on if UUID login is enabled or disabled, and whether or not a player can login via any username or not. In addition, the message parameters will now be differentiated by colour instead of `<>` (@moisterrific, @hakusaro)
|
||||
* Added a new `DisablePrimeBombs` config option (`false` by default). Highly recommended to set this to `true` in order to prevent griefing on servers doing a `for the worthy` play-through, since the prime bombs on this seed can destroy most tiles and bypass region protection. (@moisterrific)
|
||||
* Added a new `/respawn` command that lets you respawn yourself or another player. Respawning yourself requires the `tshock.respawn` permission and respawning others requires the `tshock.respawn.other` permission. The full command syntax is `/respawn [player]`. (@moisterrific)
|
||||
* Added a notification message and silent command support for permanently changing a target player's user group. Now players who received a group change will be notified of their new group if they are currently online. (@moisterrific, @QuiCM)
|
||||
* Changed the TSPlayer IP method to return the loopback IP if RealPlayer is false. (@Rozen4334)
|
||||
|
||||
## TShock 4.5.5
|
||||
* Changed the world autosave message so that it no longer warns of a "potential lag spike." (@hakusaro)
|
||||
|
|
@ -33,7 +41,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
|
|||
* Correct rejection message in LandGolfBallInCupHandler to output the proper expected player id. (@drunderscore)
|
||||
* Clarified the error mesage that the console is presented if a rate-limit is reached over REST to indicate that "tokens" actually refers to rate-limit tokens, and not auth tokens, and added a hint as to what config setting determines this. (@hakusaro, @patsore)
|
||||
* Fixed an issue where, when the console was redirected, input was disabled and commands didn't work, in TSAPI. You can now pass `-disable-commands` to disable the input thread, but by default, it will be enabled. Fixes [#1450](https://github.com/Pryaxis/TShock/issues/1450). (@DeathCradle, @QuiCM)
|
||||
* Added `summonboss` permission check for Prismatic Lacewing. Players who do not have said permission will be unable to kill this critter, as it will summon the Empress of Light. Also added support for the `AnonymousBossInvasions` config option, if this is set to `false` it will now broadcast the name of the player who summoned her. (@moisterrific)
|
||||
* Added `summonboss` permission check for Empress of Light. Players who do not have this permission will be unable to kill Prismatic Lacewings. Also added support for the `AnonymousBossInvasions` config option, if this is set to `false` it will now broadcast the name of the player who summoned her. (@moisterrific)
|
||||
* Added `ForceTime` config setting check for Enchanted Sundial usage. If `ForceTime` is set to anything other than `normal`, Sundial use will be rejected as this would lead to very janky game behavior. Additionally, players with `cfgreload` permission will be advised to change it back to `normal` in order to use sundial. (@moisterrific, @bartico6)
|
||||
* Added `%onlineplayers%` and `%serverslots%` placeholders for MOTD. The default MOTD message was also updated to use this. (@moisterrific, @bartico6)
|
||||
* Fixed Bouncer inconsistently using `TilePlacementValid` when validating tile coordinates, which could cause a DoS attack due to unexpectedly large world framing. The list below shows the corrected methods within Bouncer. This was assigned [GHSA-jq4j-v8pr-jv7j](https://github.com/Pryaxis/TShock/security/advisories/GHSA-jq4j-v8pr-jv7j). (@drunderscore)
|
||||
|
|
@ -73,6 +81,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
|
|||
* TShock defaults to saving backups every 10 minutes, and defaults to keeping backups for 4 hours. (@hakusaro)
|
||||
* Updated SSC bypass messaging. Now, when you connect, you're told if you're bypassing SSC. Console logging has been improved to warn when players are not being saved due to the bypass SSC permission. To turn this warning off, change `WarnPlayersAboutBypassPermission` to `false` in the `sscconfig.json` file. (@hakusaro)
|
||||
* Fix oversight & exploit allowing specially crafted SendTileRectangle packets to perform large-scale world griefing. In addition, `NetTile.Slope` is now the native value (byte), and accessor methods `Slope1`, `Slope2`, and `Slope3` can be used to get the old style of values out. `HalfBrick` and `Actuator` were removed from `NetTile` because these were initialized to zero and never changed or used. (@bartico6)
|
||||
* Warning: a bug introduced in a prior TShock release may cause your SSC config file to be reset after applying this update. Please backup your config file prior to installing TShock 4.5.3+ if you use SSC. (@cardinal-system)
|
||||
|
||||
## TShock 4.5.2
|
||||
* Added preliminary support for Terraria 1.4.2.2. (@hakusaro)
|
||||
|
|
|
|||
|
|
@ -599,6 +599,10 @@ namespace TShockAPI
|
|||
{
|
||||
HelpText = "Sends all tiles from the server to the player to resync the client with the actual world state."
|
||||
});
|
||||
add(new Command(Permissions.respawn, Respawn, "respawn")
|
||||
{
|
||||
HelpText = "Respawn yourself or another player."
|
||||
});
|
||||
#endregion
|
||||
|
||||
add(new Command(Aliases, "aliases")
|
||||
|
|
@ -807,10 +811,15 @@ namespace TShockAPI
|
|||
}
|
||||
else
|
||||
{
|
||||
args.Player.SendErrorMessage("Syntax: {0}login - Logs in using your UUID and character name", Specifier);
|
||||
args.Player.SendErrorMessage(" {0}login <password> - Logs in using your password and character name", Specifier);
|
||||
args.Player.SendErrorMessage(" {0}login <username> <password> - Logs in using your username and password", Specifier);
|
||||
args.Player.SendErrorMessage("If you forgot your password, there is no way to recover it.");
|
||||
if (!TShock.Config.Settings.DisableUUIDLogin)
|
||||
args.Player.SendMessage($"{Specifier}login - Logs in using your UUID and character name.", Color.White);
|
||||
|
||||
if (TShock.Config.Settings.AllowLoginAnyUsername)
|
||||
args.Player.SendMessage($"{Specifier}login {"username".Color(Utils.GreenHighlight)} {"password".Color(Utils.BoldHighlight)} - Logs in using your username and password.", Color.White);
|
||||
else
|
||||
args.Player.SendMessage($"{Specifier}login {"password".Color(Utils.BoldHighlight)} - Logs in using your password and character name.", Color.White);
|
||||
|
||||
args.Player.SendWarningMessage("If you forgot your password, there is no way to recover it.");
|
||||
return;
|
||||
}
|
||||
try
|
||||
|
|
@ -997,6 +1006,15 @@ namespace TShockAPI
|
|||
{
|
||||
args.Player.SendSuccessMessage("Account \"{0}\" has been registered.", account.Name);
|
||||
args.Player.SendSuccessMessage("Your password is {0}.", echoPassword);
|
||||
|
||||
if (!TShock.Config.Settings.DisableUUIDLogin)
|
||||
args.Player.SendMessage($"Type {Specifier}login to sign in to your account using your UUID.", Color.White);
|
||||
|
||||
if (TShock.Config.Settings.AllowLoginAnyUsername)
|
||||
args.Player.SendMessage($"Type {Specifier}login \"{account.Name.Color(Utils.GreenHighlight)}\" {echoPassword.Color(Utils.BoldHighlight)} to sign in to your account.", Color.White);
|
||||
else
|
||||
args.Player.SendMessage($"Type {Specifier}login {echoPassword.Color(Utils.BoldHighlight)} to sign in to your account.", Color.White);
|
||||
|
||||
TShock.UserAccounts.AddUserAccount(account);
|
||||
TShock.Log.ConsoleInfo("{0} registered an account: \"{1}\".", args.Player.Name, account.Name);
|
||||
}
|
||||
|
|
@ -1122,6 +1140,11 @@ namespace TShockAPI
|
|||
TShock.UserAccounts.SetUserGroup(account, args.Parameters[2]);
|
||||
TShock.Log.ConsoleInfo(args.Player.Name + " changed account " + account.Name + " to group " + args.Parameters[2] + ".");
|
||||
args.Player.SendSuccessMessage("Account " + account.Name + " has been changed to group " + args.Parameters[2] + "!");
|
||||
|
||||
//send message to player with matching account name
|
||||
var player = TShock.Players.FirstOrDefault(p => p != null && p.Account?.Name == account.Name);
|
||||
if (player != null && !args.Silent)
|
||||
player.SendSuccessMessage($"{args.Player.Name} has changed your group to {args.Parameters[2]}");
|
||||
}
|
||||
catch (GroupNotExistsException)
|
||||
{
|
||||
|
|
@ -1309,7 +1332,7 @@ namespace TShockAPI
|
|||
args.Player.SendMessage($"ban {"list".Color(Utils.RedHighlight)}", Color.White);
|
||||
args.Player.SendMessage($"ban {"details".Color(Utils.RedHighlight)} <Ban ID>", Color.White);
|
||||
args.Player.SendMessage($"Quick usage: {"ban add".Color(Utils.BoldHighlight)} {args.Player.Name.Color(Utils.RedHighlight)} \"Griefing\"", Color.White);
|
||||
args.Player.SendMessage($"For more info, use {"ban help".Color(Utils.BoldHighlight)} {"command".Color(Utils.RedHighlight)}", Color.White);
|
||||
args.Player.SendMessage($"For more info, use {"ban help".Color(Utils.BoldHighlight)} {"command".Color(Utils.RedHighlight)} or {"ban help".Color(Utils.BoldHighlight)} {"examples".Color(Utils.RedHighlight)}", Color.White);
|
||||
}
|
||||
|
||||
void MoreHelp(string cmd)
|
||||
|
|
@ -1333,7 +1356,7 @@ namespace TShockAPI
|
|||
args.Player.SendMessage("", Color.White);
|
||||
args.Player.SendMessage("Ban Del Syntax", Color.White);
|
||||
args.Player.SendMessage($"{"ban del".Color(Utils.BoldHighlight)} <{"Ticket Number".Color(Utils.RedHighlight)}>", Color.White);
|
||||
args.Player.SendMessage($"- {"Ticket Number".Color(Utils.RedHighlight)}s are provided when you add a ban, and can also be viewed with the {"ban list".Color(Utils.BoldHighlight)} command.", Color.White);
|
||||
args.Player.SendMessage($"- {"Ticket Numbers".Color(Utils.RedHighlight)} are provided when you add a ban, and can also be viewed with the {"ban list".Color(Utils.BoldHighlight)} command.", Color.White);
|
||||
args.Player.SendMessage($"Example usage: {"ban del".Color(Utils.BoldHighlight)} {"12345".Color(Utils.RedHighlight)}", Color.White);
|
||||
break;
|
||||
|
||||
|
|
@ -1349,14 +1372,14 @@ namespace TShockAPI
|
|||
args.Player.SendMessage("", Color.White);
|
||||
args.Player.SendMessage("Ban Details Syntax", Color.White);
|
||||
args.Player.SendMessage($"{"ban details".Color(Utils.BoldHighlight)} <{"Ticket Number".Color(Utils.RedHighlight)}>", Color.White);
|
||||
args.Player.SendMessage($"- {"Ticket Number".Color(Utils.RedHighlight)}s are provided when you add a ban, and can be found with the {"ban list".Color(Utils.BoldHighlight)} command.", Color.White);
|
||||
args.Player.SendMessage($"- {"Ticket Numbers".Color(Utils.RedHighlight)} are provided when you add a ban, and can be found with the {"ban list".Color(Utils.BoldHighlight)} command.", Color.White);
|
||||
args.Player.SendMessage($"Example usage: {"ban details".Color(Utils.BoldHighlight)} {"12345".Color(Utils.RedHighlight)}", Color.White);
|
||||
break;
|
||||
|
||||
case "identifiers":
|
||||
if (!PaginationTools.TryParsePageNumber(args.Parameters, 2, args.Player, out int pageNumber))
|
||||
{
|
||||
args.Player.SendMessage($"Invalid page number. Page number should be numeric.", Color.White);
|
||||
args.Player.SendMessage($"Invalid page number. Page number must be numeric.", Color.White);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1374,10 +1397,23 @@ namespace TShockAPI
|
|||
LineTextColor = Color.White
|
||||
});
|
||||
break;
|
||||
|
||||
case "examples":
|
||||
args.Player.SendMessage("", Color.White);
|
||||
args.Player.SendMessage("Ban Usage Examples", Color.White);
|
||||
args.Player.SendMessage("- Ban an offline player by account name", Color.White);
|
||||
args.Player.SendMessage($" {Specifier}{"ban add".Color(Utils.BoldHighlight)} \"{"acc:".Color(Utils.RedHighlight)}{args.Player.Account.Color(Utils.RedHighlight)}\" {"\"Multiple accounts are not allowed\"".Color(Utils.BoldHighlight)} {"-e".Color(Utils.GreenHighlight)} (Permanently bans this account name)", Color.White);
|
||||
args.Player.SendMessage("- Ban an offline player by IP address", Color.White);
|
||||
args.Player.SendMessage($" {Specifier}{"ai".Color(Utils.BoldHighlight)} \"{args.Player.Account.Color(Utils.RedHighlight)}\" (Find the IP associated with the offline target's account)", Color.White);
|
||||
args.Player.SendMessage($" {Specifier}{"ban add".Color(Utils.BoldHighlight)} {"ip:".Color(Utils.RedHighlight)}{args.Player.IP.Color(Utils.RedHighlight)} {"\"Griefing\"".Color(Utils.BoldHighlight)} {"-e".Color(Utils.GreenHighlight)} (Permanently bans this IP address)", Color.White);
|
||||
args.Player.SendMessage($"- Ban an online player by index (Useful for hard to type names)", Color.White);
|
||||
args.Player.SendMessage($" {Specifier}{"who".Color(Utils.BoldHighlight)} {"-i".Color(Utils.GreenHighlight)} (Find the player index for the target)", Color.White);
|
||||
args.Player.SendMessage($" {Specifier}{"ban add".Color(Utils.BoldHighlight)} {"tsi:".Color(Utils.RedHighlight)}{args.Player.Index.Color(Utils.RedHighlight)} {"\"Trolling\"".Color(Utils.BoldHighlight)} {"-a -u -ip".Color(Utils.GreenHighlight)} (Permanently bans the online player by Account, UUID, and IP)", Color.White);
|
||||
// Ban by account ID when?
|
||||
break;
|
||||
|
||||
default:
|
||||
args.Player.SendMessage($"Unknown ban command. Try {"add".Color(Utils.RedHighlight)}, {"del".Color(Utils.RedHighlight)}, {"list".Color(Utils.RedHighlight)}, or {"details".Color(Utils.RedHighlight)}.", Color.White);
|
||||
break;
|
||||
args.Player.SendMessage($"Unknown ban command. Try {"ban help".Color(Utils.BoldHighlight)} {"add".Color(Utils.RedHighlight)}, {"del".Color(Utils.RedHighlight)}, {"list".Color(Utils.RedHighlight)}, {"details".Color(Utils.RedHighlight)}, {"identifiers".Color(Utils.RedHighlight)}, or {"examples".Color(Utils.RedHighlight)}.", Color.White); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5638,6 +5674,55 @@ namespace TShockAPI
|
|||
plr.SendErrorMessage("{0} just killed you!", args.Player.Name);
|
||||
}
|
||||
}
|
||||
|
||||
private static void Respawn(CommandArgs args)
|
||||
{
|
||||
if (!args.Player.RealPlayer)
|
||||
{
|
||||
args.Player.SendErrorMessage("You can't respawn the server console!");
|
||||
return;
|
||||
}
|
||||
TSPlayer playerToRespawn;
|
||||
if (args.Parameters.Count > 0)
|
||||
{
|
||||
if (!args.Player.HasPermission(Permissions.respawnother))
|
||||
{
|
||||
args.Player.SendErrorMessage("You do not have permission to respawn another player.");
|
||||
return;
|
||||
}
|
||||
string plStr = String.Join(" ", args.Parameters);
|
||||
var players = TSPlayer.FindByNameOrID(plStr);
|
||||
if (players.Count == 0)
|
||||
{
|
||||
args.Player.SendErrorMessage($"Could not find any player named \"{plStr}\"");
|
||||
return;
|
||||
}
|
||||
if (players.Count > 1)
|
||||
{
|
||||
args.Player.SendMultipleMatchError(players.Select(p => p.Name));
|
||||
return;
|
||||
}
|
||||
playerToRespawn = players[0];
|
||||
}
|
||||
else
|
||||
playerToRespawn = args.Player;
|
||||
|
||||
if (!playerToRespawn.Dead)
|
||||
{
|
||||
args.Player.SendErrorMessage($"{(playerToRespawn == args.Player ? "You" : playerToRespawn.Name)} {(playerToRespawn == args.Player ? "are" : "is")} not dead.");
|
||||
return;
|
||||
}
|
||||
playerToRespawn.Spawn(PlayerSpawnContext.ReviveFromDeath);
|
||||
|
||||
if (playerToRespawn != args.Player)
|
||||
{
|
||||
args.Player.SendSuccessMessage($"You have respawned {playerToRespawn.Name}");
|
||||
if (!args.Silent)
|
||||
playerToRespawn.SendSuccessMessage($"{args.Player.Name} has respawned you.");
|
||||
}
|
||||
else
|
||||
playerToRespawn.SendSuccessMessage("You have respawned yourself.");
|
||||
}
|
||||
|
||||
private static void Butcher(CommandArgs args)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -133,6 +133,10 @@ namespace TShockAPI.Configuration
|
|||
[Description("Prevents softcore players from connecting.")]
|
||||
public bool MediumcoreOnly;
|
||||
|
||||
/// <summary>Prevents non-softcore players from connecting.</summary>
|
||||
[Description("Prevents non-softcore players from connecting.")]
|
||||
public bool SoftcoreOnly;
|
||||
|
||||
/// <summary>Disables any placing, or removal of blocks.</summary>
|
||||
[Description("Disables any placing, or removal of blocks.")]
|
||||
public bool DisableBuild;
|
||||
|
|
@ -156,6 +160,12 @@ namespace TShockAPI.Configuration
|
|||
/// <summary>Disables tombstone dropping during death for all players.</summary>
|
||||
[Description("Disables tombstone dropping during death for all players.")]
|
||||
public bool DisableTombstones = true;
|
||||
|
||||
/// <summary>
|
||||
/// Disables Skeletron Prime Bombs from spawning, useful for preventing unwanted world destruction on for the worthy seed world.
|
||||
/// </summary>
|
||||
[Description("Disables Skeletron Prime Bombs from spawning, useful for preventing unwanted world destruction on for the worthy seed world.")]
|
||||
public bool DisablePrimeBombs;
|
||||
|
||||
/// <summary>Forces the world time to be normal, day, or night.</summary>
|
||||
[Description("Forces the world time to be normal, day, or night.")]
|
||||
|
|
|
|||
|
|
@ -2364,6 +2364,12 @@ namespace TShockAPI
|
|||
NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, args.Player.Index, NetworkText.FromLiteral(args.Player.Name), args.Player.Index);
|
||||
return true;
|
||||
}
|
||||
if (TShock.Config.Settings.SoftcoreOnly && difficulty != 0)
|
||||
{
|
||||
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected softcore required");
|
||||
args.Player.Kick("You need to join with a softcore player.", true, true);
|
||||
return true;
|
||||
}
|
||||
if (TShock.Config.Settings.MediumcoreOnly && difficulty < 1)
|
||||
{
|
||||
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected mediumcore required");
|
||||
|
|
@ -2832,6 +2838,17 @@ namespace TShockAPI
|
|||
else
|
||||
TShock.Utils.SendLogs(string.Format($"{args.Player.Name} summoned the Empress of Light!"), Color.PaleVioletRed, args.Player);
|
||||
}
|
||||
|
||||
if (Main.npc[id].netID == NPCID.CultistDevote || Main.npc[id].netID == NPCID.CultistArcherBlue)
|
||||
{
|
||||
if (!args.Player.HasPermission(Permissions.summonboss))
|
||||
{
|
||||
args.Player.SendErrorMessage("You do not have permission to summon the Lunatic Cultist!");
|
||||
args.Player.SendData(PacketTypes.NpcUpdate, "", id);
|
||||
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleNpcStrike rejected Cultist summon from {args.Player.Name}");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -436,6 +436,12 @@ namespace TShockAPI
|
|||
|
||||
[Description("User can kill others.")]
|
||||
public static readonly string kill = "tshock.kill";
|
||||
|
||||
[Description("Player can respawn themselves.")]
|
||||
public static readonly string respawn = "tshock.respawn";
|
||||
|
||||
[Description("Player can respawn others.")]
|
||||
public static readonly string respawnother = "tshock.respawn.other";
|
||||
|
||||
[Description("Allows you to bypass the max slots for up to 5 slots above your max.")]
|
||||
public static readonly string reservedslot = "tshock.reservedslot";
|
||||
|
|
|
|||
|
|
@ -892,7 +892,7 @@ namespace TShockAPI
|
|||
CacheIP = RealPlayer ? (Netplay.Clients[Index].Socket.IsConnected()
|
||||
? TShock.Utils.GetRealIP(Netplay.Clients[Index].Socket.GetRemoteAddress().ToString())
|
||||
: "")
|
||||
: "";
|
||||
: "127.0.0.1";
|
||||
else
|
||||
return CacheIP;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1618,15 +1618,18 @@ namespace TShockAPI
|
|||
private void OnProjectileSetDefaults(SetDefaultsEventArgs<Projectile, int> e)
|
||||
{
|
||||
//tombstone fix.
|
||||
if (e.Info == 43 || (e.Info >= 201 && e.Info <= 205) || (e.Info >= 527 && e.Info <= 531))
|
||||
if (e.Info == ProjectileID.Tombstone || (e.Info >= ProjectileID.GraveMarker && e.Info <= ProjectileID.Obelisk) || (e.Info >= ProjectileID.RichGravestone1 && e.Info <= ProjectileID.RichGravestone5))
|
||||
if (Config.Settings.DisableTombstones)
|
||||
e.Object.SetDefaults(0);
|
||||
if (e.Info == 75)
|
||||
if (e.Info == ProjectileID.HappyBomb)
|
||||
if (Config.Settings.DisableClownBombs)
|
||||
e.Object.SetDefaults(0);
|
||||
if (e.Info == 109)
|
||||
if (e.Info == ProjectileID.SnowBallHostile)
|
||||
if (Config.Settings.DisableSnowBalls)
|
||||
e.Object.SetDefaults(0);
|
||||
if (e.Info == ProjectileID.BombSkeletronPrime)
|
||||
if (Config.Settings.DisablePrimeBombs)
|
||||
e.Object.SetDefaults(0);
|
||||
}
|
||||
|
||||
/// <summary>NetHooks_SendData - Fired when the server sends data.</summary>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue