diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 175c7e30..9215075c 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2025,7 +2025,7 @@ namespace TShockAPI try { - TShock.Groups.UpdateGroup(groupName, newParentGroupName, group.Permissions, group.ChatColor); + TShock.Groups.UpdateGroup(groupName, newParentGroupName, group.Permissions, group.ChatColor, group.Suffix, group.Prefix); if (!string.IsNullOrWhiteSpace(newParentGroupName)) args.Player.SendSuccessMessage("Parent of group \"{0}\" set to \"{1}\".", groupName, newParentGroupName); @@ -2047,6 +2047,146 @@ namespace TShockAPI } #endregion return; + case "suffix": + #region Suffix + { + if (args.Parameters.Count < 2) + { + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /group suffix [new suffix]"); + return; + } + + string groupName = args.Parameters[1]; + Group group = TShock.Groups.GetGroupByName(groupName); + if (group == null) + { + args.Player.SendErrorMessage("No such group \"{0}\".", groupName); + return; + } + + if (args.Parameters.Count > 2) + { + string newSuffix = string.Join(" ", args.Parameters.Skip(2)); + + try + { + TShock.Groups.UpdateGroup(groupName, group.ParentName, group.Permissions, group.ChatColor, newSuffix, group.Prefix); + + if (!string.IsNullOrWhiteSpace(newSuffix)) + args.Player.SendSuccessMessage("Suffix of group \"{0}\" set to \"{1}\".", groupName, newSuffix); + else + args.Player.SendSuccessMessage("Removed suffix of group \"{0}\".", groupName); + } + catch (GroupManagerException ex) + { + args.Player.SendErrorMessage(ex.Message); + } + } + else + { + if (!string.IsNullOrWhiteSpace(group.Suffix)) + args.Player.SendSuccessMessage("Suffix of \"{0}\" is \"{1}\".", group.Name, group.Suffix); + else + args.Player.SendSuccessMessage("Group \"{0}\" has no suffix.", group.Name); + } + } + #endregion + return; + case "prefix": + #region Suffix + { + if (args.Parameters.Count < 2) + { + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /group prefix [new prefix]"); + return; + } + + string groupName = args.Parameters[1]; + Group group = TShock.Groups.GetGroupByName(groupName); + if (group == null) + { + args.Player.SendErrorMessage("No such group \"{0}\".", groupName); + return; + } + + if (args.Parameters.Count > 2) + { + string newPrefix = string.Join(" ", args.Parameters.Skip(2)); + + try + { + TShock.Groups.UpdateGroup(groupName, group.ParentName, group.Permissions, group.ChatColor, group.Suffix, newPrefix); + + if (!string.IsNullOrWhiteSpace(newPrefix)) + args.Player.SendSuccessMessage("Prefix of group \"{0}\" set to \"{1}\".", groupName, newPrefix); + else + args.Player.SendSuccessMessage("Removed prefix of group \"{0}\".", groupName); + } + catch (GroupManagerException ex) + { + args.Player.SendErrorMessage(ex.Message); + } + } + else + { + if (!string.IsNullOrWhiteSpace(group.Prefix)) + args.Player.SendSuccessMessage("Prefix of \"{0}\" is \"{1}\".", group.Name, group.Prefix); + else + args.Player.SendSuccessMessage("Group \"{0}\" has no prefix.", group.Name); + } + } + #endregion + return; + case "color": + #region Suffix + { + if (args.Parameters.Count < 2 || args.Parameters.Count > 3) + { + args.Player.SendErrorMessage("Invalid syntax! Proper syntax: /group color [new color(000,000,000)]"); + return; + } + + string groupName = args.Parameters[1]; + Group group = TShock.Groups.GetGroupByName(groupName); + if (group == null) + { + args.Player.SendErrorMessage("No such group \"{0}\".", groupName); + return; + } + + if (args.Parameters.Count == 3) + { + string newColor = args.Parameters[2]; + + String[] parts = newColor.Split(','); + byte r; + byte g; + byte b; + if (parts.Length == 3 && byte.TryParse(parts[0], out r) && byte.TryParse(parts[1], out g) && byte.TryParse(parts[2], out b)) + { + try + { + TShock.Groups.UpdateGroup(groupName, group.ParentName, group.Permissions, newColor, group.Suffix, group.Prefix); + + args.Player.SendSuccessMessage("Color of group \"{0}\" set to \"{1}\".", groupName, newColor); + } + catch (GroupManagerException ex) + { + args.Player.SendErrorMessage(ex.Message); + } + } + else + { + args.Player.SendErrorMessage("Invalid syntax for color, expected \"rrr,ggg,bbb\""); + } + } + else + { + args.Player.SendSuccessMessage("Color of \"{0}\" is \"{1}\".", group.Name, group.ChatColor); + } + } + #endregion + return; case "del": #region Delete group { @@ -3695,31 +3835,27 @@ namespace TShockAPI } else { - try + if (!int.TryParse(args.Parameters[0], out radius)) { - radius = Convert.ToInt32(args.Parameters[0]); - } - catch (Exception) - { - args.Player.SendErrorMessage( - "Please either enter the keyword \"all\", or the block radius you wish to delete all items from."); + args.Player.SendErrorMessage("Invalid block radius."); return; } } } + int count = 0; - for (int i = 0; i < 200; i++) + for (int i = 0; i < 400; i++) { - if ( - (Math.Sqrt(Math.Pow(Main.item[i].position.X - args.Player.X, 2) + - Math.Pow(Main.item[i].position.Y - args.Player.Y, 2)) < radius*16) && (Main.item[i].active)) + if ((Main.item[i].position.X - args.Player.X) * (Main.item[i].position.X - args.Player.X) + + (Main.item[i].position.Y - args.Player.Y) * (Main.item[i].position.Y - args.Player.Y) <= radius * radius * 256 + && (Main.item[i].active)) { Main.item[i].active = false; - NetMessage.SendData(0x15, -1, -1, "", i, 0f, 0f, 0f, 0); + TSPlayer.All.SendData(PacketTypes.ItemDrop, "", i); count++; } } - args.Player.SendSuccessMessage("All " + count + " items within a radius of " + radius + " have been deleted."); + args.Player.SendSuccessMessage("Deleted {0} item(s) within a radius of {1}.", count, radius); } private static void Heal(CommandArgs args) @@ -3746,7 +3882,7 @@ namespace TShockAPI } else if (!args.Player.RealPlayer) { - args.Player.SendErrorMessage("You cant heal yourself!"); + args.Player.SendErrorMessage("You can't heal yourself!"); return; } else @@ -3951,7 +4087,7 @@ namespace TShockAPI } else if (!args.Player.RealPlayer) { - args.Player.SendErrorMessage("You cant god mode a non player!"); + args.Player.SendErrorMessage("You can't god mode a non player!"); return; } else diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 0a610c70..d6d03528 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -181,7 +181,7 @@ namespace TShockAPI.DB /// parent of group /// permissions /// chatcolor - public void UpdateGroup(string name, string parentname, string permissions, string chatcolor) + public void UpdateGroup(string name, string parentname, string permissions, string chatcolor, string suffix, string prefix) { Group group = GetGroupByName(name); if (group == null) @@ -210,13 +210,17 @@ namespace TShockAPI.DB // Ensure any group validation is also persisted to the DB. var newGroup = new Group(name, parent, chatcolor, permissions); - string query = "UPDATE GroupList SET Parent=@0, Commands=@1, ChatColor=@2 WHERE GroupName=@3"; - if (database.Query(query, parentname, newGroup.Permissions, string.Format("{0},{1},{2}", newGroup.R, newGroup.G, newGroup.B), name) != 1) + newGroup.Prefix = prefix; + newGroup.Suffix = suffix; + string query = "UPDATE GroupList SET Parent=@0, Commands=@1, ChatColor=@2, Suffix=@3, Prefix=@4 WHERE GroupName=@5"; + if (database.Query(query, parentname, newGroup.Permissions, newGroup.ChatColor, suffix, prefix, name) != 1) throw new GroupManagerException(string.Format("Failed to update group \"{0}\".", name)); group.ChatColor = chatcolor; group.Permissions = permissions; group.Parent = parent; + group.Prefix = prefix; + group.Suffix = suffix; } #if COMPAT_SIGS diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index e9a4e00f..16e8a325 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1774,6 +1774,30 @@ namespace TShockAPI tile.type = 1; changed = true; } + // Purify crimson grass + else if (tile.type == 199 && newtile.Type == 2) + { + tile.type = 2; + changed = true; + } + // Purify crimstone + else if (tile.type == 203 && newtile.Type == 1) + { + tile.type = 1; + changed = true; + } + // Purify crimson grass vine -- might not be needed + else if (tile.type == 205 && newtile.Type == 52) + { + tile.type = 53; + changed = true; + } + // Purify crimsand + else if (tile.type == 234 && newtile.Type == 53) + { + tile.type = 53; + changed = true; + } } } @@ -1901,9 +1925,9 @@ namespace TShockAPI return true; } - byte[] rightClickKill = new byte[] { 4, 13, 33, 49, 50, 128}; + byte[] breakableTiles = new byte[] { 4, 13, 33, 49, 50, 127, 128, 163}; Item selectedItem = args.TPlayer.inventory[args.TPlayer.selectedItem]; - if (type == 0 && Main.tile[tileX, tileY].type != 127 && !Main.tileCut[Main.tile[tileX, tileY].type] && !rightClickKill.Contains(Main.tile[tileX, tileY].type)) + if (type == 0 && !Main.tileCut[Main.tile[tileX, tileY].type] && !breakableTiles.Contains(Main.tile[tileX, tileY].type)) { // If the tile is an axe tile and they aren't selecting an axe, they're hacking. if (Main.tileAxe[Main.tile[tileX, tileY].type] && (selectedItem.axe == 0 && selectedItem.explosive == 0 && args.Player.RecentFuse == 0)) diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 7aa25b6f..32d8272d 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -70,11 +70,11 @@ namespace TShockAPI /// /// The chat color of the group. - /// Returns "255255255", sets "255,255,255" + /// Returns "255,255,255", sets "255,255,255" /// public string ChatColor { - get { return string.Format("{0}{1}{2}", R.ToString("X2"), G.ToString("X2"), B.ToString("X2")); } + get { return string.Format("{0},{1},{2}", R.ToString("D3"), G.ToString("D3"), B.ToString("D3")); } set { if (null != value) diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 7ab44715..eeea7150 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -719,7 +719,7 @@ namespace TShockAPI var permissions = (null == parameters["permissions"]) ? group.Permissions : parameters["permissions"]; try { - TShock.Groups.UpdateGroup(group.Name, parent, permissions, chatcolor); + TShock.Groups.UpdateGroup(group.Name, parent, permissions, chatcolor, group.Suffix, group.Prefix); } catch (Exception e) { diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 987936cb..73d03f4e 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -252,7 +252,8 @@ namespace TShockAPI ServerApi.Hooks.WorldSave.Register(this, SaveManager.Instance.OnSaveWorld); ServerApi.Hooks.WorldChristmasCheck.Register(this, OnXmasCheck); ServerApi.Hooks.NetNameCollision.Register(this, NetHooks_NameCollision); - TShockAPI.Hooks.PlayerHooks.PlayerPostLogin += OnPlayerLogin; + TShockAPI.Hooks.PlayerHooks.PlayerPreLogin += OnPlayerPreLogin; + TShockAPI.Hooks.PlayerHooks.PlayerPostLogin += OnPlayerLogin; GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); @@ -365,6 +366,12 @@ namespace TShockAPI Users.UpdateLogin(u); } + private void OnPlayerPreLogin(Hooks.PlayerPreLoginEventArgs args) + { + if (args.Player.IsLoggedIn) + args.Player.SaveServerCharacter(); + } + private void NetHooks_NameCollision(NameCollisionEventArgs args) { string ip = TShock.Utils.GetRealIP(Netplay.serverSock[args.Who].tcpClient.Client.RemoteEndPoint.ToString()); diff --git a/TerrariaServerBins/TerrariaServer.exe b/TerrariaServerBins/TerrariaServer.exe index 0123f449..80dc3ff4 100644 Binary files a/TerrariaServerBins/TerrariaServer.exe and b/TerrariaServerBins/TerrariaServer.exe differ