Merge branch 'general-devel' into fix-invalid-place-style
This commit is contained in:
commit
7b4042bf77
23 changed files with 231 additions and 89 deletions
|
|
@ -263,6 +263,13 @@ namespace TShockAPI
|
|||
|
||||
try
|
||||
{
|
||||
if (!TShock.Utils.TilePlacementValid(tileX, tileY))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnTileEdit rejected from (tile placement valid) {0} {1} {2}", args.Player.Name, action, editData);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (editData < 0 ||
|
||||
((action == EditAction.PlaceTile || action == EditAction.ReplaceTile) && editData >= Main.maxTileSets) ||
|
||||
((action == EditAction.PlaceWall || action == EditAction.ReplaceWall) && editData >= Main.maxWallTypes))
|
||||
|
|
@ -273,14 +280,6 @@ namespace TShockAPI
|
|||
return;
|
||||
}
|
||||
|
||||
if (!TShock.Utils.TilePlacementValid(tileX, tileY))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnTileEdit rejected from (tile placement valid) {0} {1} {2}", args.Player.Name, action, editData);
|
||||
args.Player.SendTileSquare(tileX, tileY, 1);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (action == EditAction.KillTile && Main.tile[tileX, tileY].type == TileID.MagicalIceBlock)
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnTileEdit super accepted from (ice block) {0} {1} {2}", args.Player.Name, action, editData);
|
||||
|
|
@ -1705,6 +1704,13 @@ namespace TShockAPI
|
|||
short type = args.Type;
|
||||
short style = args.Style;
|
||||
|
||||
if (!TShock.Utils.TilePlacementValid(x, y))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected valid placements from {0}", args.Player.Name);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (type < 0 || type >= Main.maxTileSets)
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected out of bounds tile from {0}", args.Player.Name);
|
||||
|
|
@ -1753,14 +1759,6 @@ namespace TShockAPI
|
|||
return;
|
||||
}
|
||||
|
||||
if (!TShock.Utils.TilePlacementValid(x, y))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected valid placements from {0}", args.Player.Name);
|
||||
args.Player.SendTileSquare(x, y, 1);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Player.Dead && TShock.Config.Settings.PreventDeadModification)
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceObject rejected dead people don't do things from {0}", args.Player.Name);
|
||||
|
|
@ -1777,7 +1775,7 @@ namespace TShockAPI
|
|||
return;
|
||||
}
|
||||
|
||||
// This is neccessary to check in order to prevent special tiles such as
|
||||
// This is necessary to check in order to prevent special tiles such as
|
||||
// queen bee larva, paintings etc that use this packet from being placed
|
||||
// without selecting the right item.
|
||||
if (type != args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].createTile)
|
||||
|
|
@ -1852,6 +1850,13 @@ namespace TShockAPI
|
|||
/// <param name="args">The packet arguments that the event has.</param>
|
||||
internal void OnPlaceTileEntity(object sender, GetDataHandlers.PlaceTileEntityEventArgs args)
|
||||
{
|
||||
if (!TShock.Utils.TilePlacementValid(args.X, args.Y))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceTileEntity rejected tile placement valid from {0}", args.Player.Name);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Player.IsBeingDisabled())
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceTileEntity rejected disabled from {0}", args.Player.Name);
|
||||
|
|
@ -1879,6 +1884,13 @@ namespace TShockAPI
|
|||
/// <param name="args">The packet arguments that the event has.</param>
|
||||
internal void OnPlaceItemFrame(object sender, GetDataHandlers.PlaceItemFrameEventArgs args)
|
||||
{
|
||||
if (!TShock.Utils.TilePlacementValid(args.X, args.Y))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceItemFrame rejected tile placement valid from {0}", args.Player.Name);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Player.IsBeingDisabled())
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnPlaceItemFrame rejected disabled from {0}", args.Player.Name);
|
||||
|
|
@ -2180,6 +2192,13 @@ namespace TShockAPI
|
|||
/// <param name="args"></param>
|
||||
internal void OnFoodPlatterTryPlacing(object sender, GetDataHandlers.FoodPlatterTryPlacingEventArgs args)
|
||||
{
|
||||
if (!TShock.Utils.TilePlacementValid(args.TileX, args.TileY))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnFoodPlatterTryPlacing rejected tile placement valid from {0}", args.Player.Name);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((args.Player.SelectedItem.type != args.ItemID && args.Player.ItemInHand.type != args.ItemID))
|
||||
{
|
||||
TShock.Log.ConsoleDebug("Bouncer / OnFoodPlatterTryPlacing rejected item not placed by hand from {0}", args.Player.Name);
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ namespace TShockAPI
|
|||
public bool Silent { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Parameters passed to the arguement. Does not include the command name.
|
||||
/// Parameters passed to the argument. Does not include the command name.
|
||||
/// IE '/kick "jerk face"' will only have 1 argument
|
||||
/// </summary>
|
||||
public List<string> Parameters { get; private set; }
|
||||
|
|
@ -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
|
||||
|
|
@ -939,7 +948,7 @@ namespace TShockAPI
|
|||
}
|
||||
catch (UserAccountManagerException ex)
|
||||
{
|
||||
args.Player.SendErrorMessage("Sorry, an error occured: " + ex.Message + ".");
|
||||
args.Player.SendErrorMessage("Sorry, an error occurred: " + ex.Message + ".");
|
||||
TShock.Log.ConsoleError("PasswordUser returned an error: " + ex);
|
||||
}
|
||||
}
|
||||
|
|
@ -991,6 +1000,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);
|
||||
}
|
||||
|
|
@ -1003,7 +1021,7 @@ namespace TShockAPI
|
|||
}
|
||||
catch (UserAccountManagerException ex)
|
||||
{
|
||||
args.Player.SendErrorMessage("Sorry, an error occured: " + ex.Message + ".");
|
||||
args.Player.SendErrorMessage("Sorry, an error occurred: " + ex.Message + ".");
|
||||
TShock.Log.ConsoleError("RegisterUser returned an error: " + ex);
|
||||
}
|
||||
}
|
||||
|
|
@ -1116,6 +1134,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)
|
||||
{
|
||||
|
|
@ -1216,7 +1239,7 @@ namespace TShockAPI
|
|||
if (DateTime.TryParse(account.LastAccessed, out LastSeen))
|
||||
{
|
||||
LastSeen = DateTime.Parse(account.LastAccessed).ToLocalTime();
|
||||
args.Player.SendSuccessMessage("{0}'s last login occured {1} {2} UTC{3}.", account.Name, LastSeen.ToShortDateString(),
|
||||
args.Player.SendSuccessMessage("{0}'s last login occurred {1} {2} UTC{3}.", account.Name, LastSeen.ToShortDateString(),
|
||||
LastSeen.ToShortTimeString(), Timezone);
|
||||
}
|
||||
|
||||
|
|
@ -1303,7 +1326,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)
|
||||
|
|
@ -1327,7 +1350,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;
|
||||
|
||||
|
|
@ -1343,14 +1366,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;
|
||||
}
|
||||
|
||||
|
|
@ -1368,10 +1391,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5518,7 +5554,7 @@ namespace TShockAPI
|
|||
|
||||
#endregion General Commands
|
||||
|
||||
#region Cheat Commands
|
||||
#region Game Commands
|
||||
|
||||
private static void Clear(CommandArgs args)
|
||||
{
|
||||
|
|
@ -5632,6 +5668,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)
|
||||
{
|
||||
|
|
@ -6472,6 +6557,6 @@ namespace TShockAPI
|
|||
}
|
||||
}
|
||||
|
||||
#endregion Cheat Comamnds
|
||||
#endregion Game Commands
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.")]
|
||||
|
|
|
|||
|
|
@ -425,14 +425,14 @@ namespace TShockAPI.DB
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TShock.Log.Error($"An exception has occured during database transaction: {ex.Message}");
|
||||
TShock.Log.Error($"An exception has occurred during database transaction: {ex.Message}");
|
||||
try
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
catch (Exception rollbackEx)
|
||||
{
|
||||
TShock.Log.Error($"An exception has occured during database rollback: {rollbackEx.Message}");
|
||||
TShock.Log.Error($"An exception has occurred during database rollback: {rollbackEx.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ namespace TShockAPI.DB
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delets the region from this world with a given ID.
|
||||
/// Deletes the region from this world with a given ID.
|
||||
/// </summary>
|
||||
/// <param name="id">The ID of the region to delete.</param>
|
||||
/// <returns>Whether the region was successfully deleted.</returns>
|
||||
|
|
@ -584,7 +584,7 @@ namespace TShockAPI.DB
|
|||
/// </summary>
|
||||
/// <param name="regionName">Region name</param>
|
||||
/// <param name="newOwner">New owner's username</param>
|
||||
/// <returns>Whether the change was successfull</returns>
|
||||
/// <returns>Whether the change was successful</returns>
|
||||
public bool ChangeOwner(string regionName, string newOwner)
|
||||
{
|
||||
var region = GetRegionByName(regionName);
|
||||
|
|
@ -604,7 +604,7 @@ namespace TShockAPI.DB
|
|||
/// </summary>
|
||||
/// <param name="regionName">Region name</param>
|
||||
/// <param name="groupName">Group's name</param>
|
||||
/// <returns>Whether the change was successfull</returns>
|
||||
/// <returns>Whether the change was successful</returns>
|
||||
public bool AllowGroup(string regionName, string groupName)
|
||||
{
|
||||
string mergedGroups = "";
|
||||
|
|
@ -646,7 +646,7 @@ namespace TShockAPI.DB
|
|||
/// </summary>
|
||||
/// <param name="regionName">Region name</param>
|
||||
/// <param name="group">Group name</param>
|
||||
/// <returns>Whether the change was successfull</returns>
|
||||
/// <returns>Whether the change was successful</returns>
|
||||
public bool RemoveGroup(string regionName, string group)
|
||||
{
|
||||
Region r = GetRegionByName(regionName);
|
||||
|
|
@ -688,7 +688,7 @@ namespace TShockAPI.DB
|
|||
/// </summary>
|
||||
/// <param name="name">Region name</param>
|
||||
/// <param name="z">New Z index</param>
|
||||
/// <returns>Whether the change was successfull</returns>
|
||||
/// <returns>Whether the change was successful</returns>
|
||||
public bool SetZ(string name, int z)
|
||||
{
|
||||
try
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ namespace TShockAPI.DB
|
|||
{
|
||||
int checkX=reader.Get<int>("X");
|
||||
int checkY=reader.Get<int>("Y");
|
||||
//fix leftover inconsistancies
|
||||
//fix leftover inconsistencies
|
||||
if (checkX==0)
|
||||
checkX++;
|
||||
if (checkY==0)
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ namespace TShockAPI.DB
|
|||
/// <summary>The hashed password for the user account.</summary>
|
||||
public string Password { get; internal set; }
|
||||
|
||||
/// <summary>The user's saved Univerally Unique Identifier token.</summary>
|
||||
/// <summary>The user's saved Universally Unique Identifier token.</summary>
|
||||
public string UUID { get; set; }
|
||||
|
||||
/// <summary>The group object that the user account is a part of.</summary>
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ namespace TShockAPI.DB
|
|||
/// <param name="warpName">The warp name.</param>
|
||||
/// <param name="x">The X position.</param>
|
||||
/// <param name="y">The Y position.</param>
|
||||
/// <returns>Whether the operation suceeded.</returns>
|
||||
/// <returns>Whether the operation succeeded.</returns>
|
||||
public bool Position(string warpName, int x, int y)
|
||||
{
|
||||
try
|
||||
|
|
@ -163,7 +163,7 @@ namespace TShockAPI.DB
|
|||
/// </summary>
|
||||
/// <param name="warpName">The warp name.</param>
|
||||
/// <param name="state">The state.</param>
|
||||
/// <returns>Whether the operation suceeded.</returns>
|
||||
/// <returns>Whether the operation succeeded.</returns>
|
||||
public bool Hide(string warpName, bool state)
|
||||
{
|
||||
try
|
||||
|
|
@ -216,4 +216,4 @@ namespace TShockAPI.DB
|
|||
IsPrivate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public Vector2 Velocity { get; set; }
|
||||
/// <summary>
|
||||
/// Original poisition of the player when using Potion of Return.
|
||||
/// Original position of the player when using Potion of Return.
|
||||
/// </summary>
|
||||
public Vector2? OriginalPos { get; set; }
|
||||
/// <summary>
|
||||
|
|
@ -770,7 +770,7 @@ namespace TShockAPI
|
|||
{
|
||||
/// <summary>The projectile's identity...?</summary>
|
||||
public int ProjectileIdentity;
|
||||
/// <summary>The the player index of the projectile's owner (Main.players).</summary>
|
||||
/// <summary>The player index of the projectile's owner (Main.players).</summary>
|
||||
public byte ProjectileOwner;
|
||||
/// <summary>The index of the projectile in Main.projectile.</summary>
|
||||
public int ProjectileIndex;
|
||||
|
|
@ -1846,7 +1846,7 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public byte ID { get; set; }
|
||||
/// <summary>
|
||||
/// The direction the damage is occuring from
|
||||
/// The direction the damage is occurring from
|
||||
/// </summary>
|
||||
public byte Direction { get; set; }
|
||||
/// <summary>
|
||||
|
|
@ -1902,7 +1902,7 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public byte Direction { get; set; }
|
||||
/// <summary>
|
||||
/// Amount of damage delt
|
||||
/// Amount of damage dealt
|
||||
/// </summary>
|
||||
public short Damage { get; set; }
|
||||
/// <summary>
|
||||
|
|
@ -1989,7 +1989,7 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
public int Slot { get; set; }
|
||||
/// <summary>
|
||||
/// Wether or not the slot that is being modified is a Dye slot.
|
||||
/// Whether or not the slot that is being modified is a Dye slot.
|
||||
/// </summary>
|
||||
public bool IsDye { get; set; }
|
||||
/// <summary>
|
||||
|
|
@ -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");
|
||||
|
|
@ -2829,6 +2835,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -273,7 +273,7 @@ namespace TShockAPI
|
|||
|
||||
/// <summary>
|
||||
/// Clears the permission list and sets it to the list provided,
|
||||
/// will parse "!permssion" and add it to the negated permissions.
|
||||
/// will parse "!permission" and add it to the negated permissions.
|
||||
/// </summary>
|
||||
/// <param name="permission">The new list of permissions to associate with the group.</param>
|
||||
public void SetPermission(List<string> permission)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ namespace TShockAPI.Handlers.NetModules
|
|||
public class PylonHandler : INetModuleHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Event occuring
|
||||
/// Event occurring
|
||||
/// </summary>
|
||||
public SubPacketType PylonEventType { get; set; }
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ namespace TShockAPI.Handlers
|
|||
// At this point we should send our state back to the client so they remain in sync with the server
|
||||
if (args.Handled == true)
|
||||
{
|
||||
args.Player.SendTileRect(args.TileX, args.TileY, args.Width, args.Length);
|
||||
TSPlayer.All.SendTileRect(args.TileX, args.TileY, args.Width, args.Length);
|
||||
TShock.Log.ConsoleDebug("Bouncer / SendTileRect reimplemented from carbonara from {0}", args.Player.Name);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ namespace TShockAPI
|
|||
/// Writes a message to the log
|
||||
/// </summary>
|
||||
/// <param name="message">Message to write</param>
|
||||
/// <param name="level">LogLevel assosciated with the message</param>
|
||||
/// <param name="level">LogLevel associated with the message</param>
|
||||
void Write(string message, TraceLevel level);
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -152,4 +152,4 @@ namespace TShockAPI
|
|||
/// </summary>
|
||||
void Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -399,7 +399,7 @@ namespace TShockAPI
|
|||
[Description("User can use Creative UI to set world time speed.")]
|
||||
public static readonly string journey_timespeed = "tshock.journey.time.setspeed";
|
||||
|
||||
[Description("User can use Creative UI to to toggle character godmode.")]
|
||||
[Description("User can use Creative UI to toggle character godmode.")]
|
||||
public static readonly string journey_godmode = "tshock.journey.godmode";
|
||||
|
||||
[Description("User can use Creative UI to set world wind strength/seed.")]
|
||||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -53,5 +53,5 @@ using System.Runtime.InteropServices;
|
|||
// 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)
|
||||
|
||||
[assembly: AssemblyVersion("4.5.4")]
|
||||
[assembly: AssemblyFileVersion("4.5.4")]
|
||||
[assembly: AssemblyVersion("4.5.5")]
|
||||
[assembly: AssemblyFileVersion("4.5.5")]
|
||||
|
|
|
|||
|
|
@ -1117,7 +1117,7 @@ namespace TShockAPI
|
|||
[Permission(RestPermissions.restmanagegroups)]
|
||||
[Noun("group", true, "The name of the new group.", typeof(String))]
|
||||
[Noun("parent", false, "The name of the parent group.", typeof(String))]
|
||||
[Noun("permissions", false, "A comma seperated list of permissions for the new group.", typeof(String))]
|
||||
[Noun("permissions", false, "A comma separated list of permissions for the new group.", typeof(String))]
|
||||
[Noun("chatcolor", false, "A r,g,b string representing the color for this groups chat.", typeof(String))]
|
||||
[Token]
|
||||
private object GroupCreate(RestRequestArgs args)
|
||||
|
|
@ -1142,7 +1142,7 @@ namespace TShockAPI
|
|||
[Noun("group", true, "The name of the group to modify.", typeof(String))]
|
||||
[Noun("parent", false, "The name of the new parent for this group.", typeof(String))]
|
||||
[Noun("chatcolor", false, "The new chat color r,g,b.", typeof(String))]
|
||||
[Noun("permissions", false, "The new comma seperated list of permissions.", typeof(String))]
|
||||
[Noun("permissions", false, "The new comma separated list of permissions.", typeof(String))]
|
||||
[Token]
|
||||
private object GroupUpdate(RestRequestArgs args)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ namespace TShockAPI.Sockets
|
|||
this._listener.Stop();
|
||||
|
||||
// currently vanilla will stop listening when the slots are full, however it appears that this Netplay.IsListening
|
||||
// flag is still set, making the server loop beleive it's still listening when it's actually not.
|
||||
// flag is still set, making the server loop believe it's still listening when it's actually not.
|
||||
// clearing this flag when we actually have stopped will allow the ServerLoop to start listening again when
|
||||
// there are enough slots available.
|
||||
Netplay.IsListening = false;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -1018,7 +1018,7 @@ namespace TShockAPI
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Player Y cooridnate divided by 16. Supposed Y world coordinate.
|
||||
/// Player Y coordinate divided by 16. Supposed Y world coordinate.
|
||||
/// </summary>
|
||||
public int TileY
|
||||
{
|
||||
|
|
|
|||
|
|
@ -182,12 +182,12 @@ namespace TShockAPI
|
|||
|
||||
public void RevertTiles(Dictionary<Vector2, ITile> tiles)
|
||||
{
|
||||
// Update Main.Tile first so that when tile sqaure is sent it is correct
|
||||
// Update Main.Tile first so that when tile square is sent it is correct
|
||||
foreach (KeyValuePair<Vector2, ITile> entry in tiles)
|
||||
{
|
||||
Main.tile[(int)entry.Key.X, (int)entry.Key.Y] = entry.Value;
|
||||
}
|
||||
// Send all players updated tile sqaures
|
||||
// Send all players updated tile squares
|
||||
foreach (Vector2 coords in tiles.Keys)
|
||||
{
|
||||
All.SendTileSquare((int)coords.X, (int)coords.Y, 3);
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ namespace TShockAPI
|
|||
/// <summary>VersionNum - The version number the TerrariaAPI will return back to the API. We just use the Assembly info.</summary>
|
||||
public static readonly Version VersionNum = Assembly.GetExecutingAssembly().GetName().Version;
|
||||
/// <summary>VersionCodename - The version codename is displayed when the server starts. Inspired by software codenames conventions.</summary>
|
||||
public static readonly string VersionCodename = "Blood Moon edition";
|
||||
public static readonly string VersionCodename = "Olympics maybe?";
|
||||
|
||||
/// <summary>SavePath - This is the path TShock saves its data in. This path is relative to the TerrariaServer.exe (not in ServerPlugins).</summary>
|
||||
public static string SavePath = "tshock";
|
||||
|
|
@ -1614,19 +1614,22 @@ namespace TShockAPI
|
|||
}
|
||||
|
||||
/// <summary>OnProjectileSetDefaults - Called when a projectile sets the default attributes for itself.</summary>
|
||||
/// <param name="e">e - The SetDefaultsEventArgs object praameterized with Projectile and int.</param>
|
||||
/// <param name="e">e - The SetDefaultsEventArgs object parameterized with Projectile and int.</param>
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ namespace TShockAPI
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Broadcasts a message from a Terraria playerplayer, not TShock
|
||||
/// Broadcasts a message from a Terraria player, not TShock
|
||||
/// </summary>
|
||||
/// <param name="ply">ply - the Terraria player index that will send the packet</param>
|
||||
/// <param name="msg">msg - The message to send</param>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue