diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 6c6c28dd..5aed7b6c 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -141,9 +141,6 @@ namespace TShockAPI [Description("This will save the world if Terraria crashes from an unhandled exception.")] public bool SaveWorldOnCrash = true; - [Description("This is kick players who have custom items in their inventory (via a mod)")] - public bool KickCustomItems = false; - [Description("This will announce a player's location on join")] public bool EnableGeoIP = false; diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 2d7cb7c7..fea1db63 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -27,11 +27,11 @@ namespace TShockAPI.DB creator.EnsureExists(table); //Add default groups - AddGroup("default", "canwater,canlava,warp,canbuild"); + AddGroup("default", "warp,canbuild"); AddGroup("newadmin", "default", "kick,editspawn,reservedslot"); AddGroup("admin", "newadmin", "ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere"); - AddGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem,manageusers"); - AddGroup("vip", "default", "canwater,canlava,warp,canbuild,reservedslot"); + AddGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,ignorecheatdetection,usebanneditem,manageusers"); + AddGroup("vip", "default", "reservedslot"); String file = Path.Combine(TShock.SavePath, "groups.txt"); if (File.Exists(file)) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index d0c5204c..5cedfaab 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -25,6 +25,7 @@ using Terraria; using TShockAPI.Net; using System.IO.Streams; +using System.Net; namespace TShockAPI { @@ -210,7 +211,30 @@ namespace TShockAPI return true; } args.Player.Difficulty = difficulty; + args.TPlayer.name = name; args.Player.ReceivedInfo = true; + + NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); + + if (TShock.Config.EnableGeoIP && TShock.Geo != null) + { + var code = TShock.Geo.TryGetCountryCode(IPAddress.Parse(args.Player.IP)); + args.Player.Country = code == null ? "N/A" : MaxMind.GeoIPCountry.GetCountryNameByCode(code); + if (code == "A1") + if (TShock.Config.KickProxyUsers) + TShock.Utils.Kick(args.Player, "Proxies are not allowed"); + Log.Info(string.Format("{0} ({1}) from '{2}' group from '{3}' joined.", args.Player.Name, args.Player.IP, args.Player.Group.Name, args.Player.Country)); + TShock.Utils.Broadcast(args.Player.Name + " has joined from the " + args.Player.Country, Color.Yellow); + } + else + { + Log.Info(string.Format("{0} ({1}) from '{2}' group joined.", args.Player.Name, args.Player.IP, args.Player.Group.Name)); + TShock.Utils.Broadcast(args.Player.Name + " has joined", Color.Yellow); + } + + if (TShock.Config.DisplayIPToAdmins) + TShock.Utils.SendLogs(string.Format("{0} has joined. IP: {1}", args.Player.Name, args.Player.IP), Color.Blue); + return false; } @@ -230,6 +254,12 @@ namespace TShockAPI return true; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + var tiles = new NetTile[size, size]; for (int x = 0; x < size; x++) @@ -440,6 +470,12 @@ namespace TShockAPI } } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (TShock.CheckTilePermission(args.Player, tileX, tileY)) { args.Player.SendTileSquare(tileX, tileY); @@ -468,17 +504,24 @@ namespace TShockAPI int id = args.Data.ReadByte(); bool pvp = args.Data.ReadBoolean(); - long seconds = (long)(DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds; - if (TShock.Config.PvpThrottle > 0 && seconds < TShock.Config.PvpThrottle) + if (id != args.Player.Index) { - args.Player.SendMessage(string.Format("You cannot change pvp status for {0} seconds", TShock.Config.PvpThrottle - seconds), 255, 0, 0); - args.Player.SetPvP(id != args.Player.Index || TShock.Config.AlwaysPvP ? true : args.TPlayer.hostile); + return true; } - else + + if (args.TPlayer.hostile != pvp) { - args.Player.SetPvP(id != args.Player.Index || TShock.Config.AlwaysPvP ? true : pvp); + long seconds = (long)(DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds; + if (TShock.Config.PvpThrottle > 0 && seconds < TShock.Config.PvpThrottle) + { + TSPlayer.All.SendMessage(string.Format("{0} has {1} PvP!", args.Player.Name, pvp ? "enabled" : "disabled"), Main.teamColor[args.Player.Team]); + } + args.Player.LastPvpChange = DateTime.UtcNow; } + args.TPlayer.hostile = pvp; + NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", args.Player.Index); + return true; } @@ -505,14 +548,25 @@ namespace TShockAPI } } - if (TShock.CheckPlayerCollision((int)(pos.X / 16f), (int)(pos.Y / 16f))) //NoClipping or possible errors + if (!pos.Equals(args.Player.LastNetPosition)) { - args.Player.SendMessage("You got stuck in a solid object! Sent you to the spawn point.", Color.Red); - args.Player.SendTileSquare((int)(pos.X / 16f), (int)(pos.X / 16f)); - args.Player.Spawn(); - return true; + float distance = Vector2.Distance(new Vector2((pos.X / 16f), (pos.Y / 16f)), new Vector2(Main.spawnTileX, Main.spawnTileY)); + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile && distance > 6f) + { + args.Player.SendMessage("PvP is forced! Enable PvP else you can't do anything!", Color.Red); + args.Player.Spawn(); + return true; + } + if (TShock.CheckPlayerCollision((int)(pos.X / 16f), (int)(pos.Y / 16f))) //NoClipping or possible errors + { + args.Player.SendMessage("You got stuck in a solid object! Sent you to the spawn point.", Color.Red); + args.Player.SendTileSquare((int)(pos.X / 16f), (int)(pos.X / 16f)); + args.Player.Spawn(); + return true; + } } + args.Player.LastNetPosition = pos; return false; } @@ -545,6 +599,12 @@ namespace TShockAPI return true; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.ProjectileNew, "", index); + return true; + } + if (TShock.CheckProjectilePermission(args.Player, index, type)) { args.Player.LastThreat = DateTime.UtcNow; @@ -580,6 +640,12 @@ namespace TShockAPI return true; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.ProjectileNew, "", index); + return true; + } + if (TShock.CheckProjectilePermission(args.Player, index, type)) { args.Player.LastThreat = DateTime.UtcNow; @@ -630,6 +696,12 @@ namespace TShockAPI if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) return false; + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) { args.Player.SendTileSquare(tileX, tileY); @@ -679,6 +751,12 @@ namespace TShockAPI if (tileX < 0 || tileX >= Main.maxTilesX || tileY < 0 || tileY >= Main.maxTilesY) return false; + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (Main.tile[tileX, tileY].type != 0x15 && (!TShock.Utils.MaxChests() && Main.tile[tileX, tileY].type != 0)) //Chest { args.Player.SendTileSquare(tileX, tileY); @@ -730,6 +808,11 @@ namespace TShockAPI var x = args.Data.ReadInt32(); var y = args.Data.ReadInt32(); + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + return true; + } + if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - x) > 32) || (Math.Abs(args.Player.TileY - y) > 32))) { return true; @@ -750,6 +833,12 @@ namespace TShockAPI return false; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.ChestItem, "", id, slot); + return true; + } + Item item = new Item(); item.netDefaults(type); if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name)) @@ -818,6 +907,11 @@ namespace TShockAPI var type = args.Data.ReadInt8(); var time = args.Data.ReadInt16(); + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.PlayerBuff, "", id); + return true; + } if (!TShock.Players[id].TPlayer.hostile) { args.Player.SendData(PacketTypes.PlayerBuff, "", id); @@ -869,6 +963,13 @@ namespace TShockAPI args.Player.SendData(PacketTypes.ItemDrop, "", id); return true; } + + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.ItemDrop, "", id); + return true; + } + return false; } @@ -908,6 +1009,13 @@ namespace TShockAPI return true; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.PlayerHp, "", id); + args.Player.SendData(PacketTypes.PlayerUpdate, "", id); + return true; + } + if (TShock.Config.RangeChecks && ((Math.Abs(args.Player.TileX - TShock.Players[id].TileX) > 128) || (Math.Abs(args.Player.TileY - TShock.Players[id].TileY) > 128))) { args.Player.SendData(PacketTypes.PlayerHp, "", id); @@ -942,6 +1050,12 @@ namespace TShockAPI return true; } + if (TShock.Config.AlwaysPvP && !args.TPlayer.hostile) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", id); + return true; + } + if (Main.npc[id].townNPC && !args.Player.Group.HasPermission(Permissions.movenpc)) { args.Player.SendData(PacketTypes.NpcUpdate, "", id); diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 352a677e..c2994944 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -37,7 +37,7 @@ namespace TShockAPI public Group Group { get; set; } public bool ReceivedInfo { get; set; } public int Index { get; protected set; } - public DateTime LastPvpChange { get; protected set; } + public DateTime LastPvpChange; public Point[] TempPoints = new Point[2]; public int AwaitingTempPoint { get; set; } public bool AwaitingName { get; set; } @@ -49,6 +49,7 @@ namespace TShockAPI public TSPlayer LastWhisper; public int LoginAttempts { get; set; } public Vector2 TeleportCoords = new Vector2(-1, -1); + public Vector2 LastNetPosition = Vector2.Zero; public string UserAccountName { get; set; } public bool HasBeenSpammedWithBuildMessage; public bool IsLoggedIn; @@ -262,7 +263,8 @@ namespace TShockAPI { try { - SendData(PacketTypes.TileSendSquare, "", size, (x - (size / 2)), (y - (size / 2))); + int num = (size - 1) / 2; + SendData(PacketTypes.TileSendSquare, "", size, (float)(x - num), (float)(y - num)); return true; } catch (Exception ex) @@ -306,18 +308,6 @@ namespace TShockAPI NetMessage.SendData((int)PacketTypes.PlayerDamage, -1, -1, "", Index, ((new Random()).Next(-1, 1)), damage, (float)0); } - public virtual void SetPvP(bool pvp) - { - if (TPlayer.hostile != pvp) - { - LastPvpChange = DateTime.UtcNow; - TPlayer.hostile = pvp; - All.SendMessage(string.Format("{0} has {1} PvP!", Name, pvp ? "enabled" : "disabled"), Main.teamColor[Team]); - } - //Broadcast anyways to keep players synced - NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", Index); - } - public virtual void SetTeam(int team) { Main.player[Index].team = team; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 5b8dd873..ea14fba6 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -715,36 +715,17 @@ namespace TShockAPI return; } - NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); - NetMessage.syncPlayers(); - - if (Config.EnableGeoIP && Geo != null) - { - var code = Geo.TryGetCountryCode(IPAddress.Parse(player.IP)); - player.Country = code == null ? "N/A" : MaxMind.GeoIPCountry.GetCountryNameByCode(code); - if (code == "A1") - if (TShock.Config.KickProxyUsers) - TShock.Utils.Kick(player, "Proxies are not allowed"); - Log.Info(string.Format("{0} ({1}) from '{2}' group from '{3}' joined.", player.Name, player.IP, player.Group.Name, player.Country)); - TShock.Utils.Broadcast(player.Name + " has joined from the " + player.Country, Color.Yellow); - } - else - { - Log.Info(string.Format("{0} ({1}) from '{2}' group joined.", player.Name, player.IP, player.Group.Name)); - TShock.Utils.Broadcast(player.Name + " has joined", Color.Yellow); - } - TShock.Utils.ShowFileToUser(player, "motd.txt"); if (HackedHealth(player)) { TShock.Utils.HandleCheater(player, "Health/Mana cheat detected. Please use a different character."); } + + NetMessage.syncPlayers(); + if (Config.AlwaysPvP) { - player.SetPvP(true); - player.SendMessage( - "PvP is forced! Enable PvP else you can't deal damage to other people. (People can kill you)", - Color.Red); + player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); } if (player.Group.HasPermission(Permissions.causeevents) && Config.InfiniteInvasion) { @@ -756,8 +737,6 @@ namespace TShockAPI player.Teleport((int)pos.X, (int)pos.Y); player.SendTileSquare((int)pos.X, (int)pos.Y); } - if (Config.DisplayIPToAdmins) - Utils.SendLogs(string.Format("{0} has joined. IP: {1}", player.Name, player.IP), Color.Blue); e.Handled = true; } diff --git a/TerrariaServerBins/TerrariaServer.exe b/TerrariaServerBins/TerrariaServer.exe index 9b85057b..f3b65f15 100644 Binary files a/TerrariaServerBins/TerrariaServer.exe and b/TerrariaServerBins/TerrariaServer.exe differ