private bool TileChange(ref BinaryReader reader, int playerNumber)
 {
     if (Main.netMode == 2)
     {
         try
         {
             Player       p      = Main.player[playerNumber];
             ServerPlayer player = p.GetServerPlayer();
             int          action = reader.ReadByte();
             short        X      = reader.ReadInt16();
             short        Y      = reader.ReadInt16();
             short        type   = reader.ReadInt16();
             int          style  = reader.ReadByte();
             if (ServerSideCharacter.CheckSpawn(X, Y) && player.PermissionGroup.GroupName != "spadmin")
             {
                 player.SendErrorInfo("Warning: Spawn is protected from change");
                 NetMessage.SendTileSquare(-1, X, Y, 4);
                 return(true);
             }
             else if (ServerSideCharacter.RegionManager.CheckRegion(X, Y, player))
             {
                 player.SendErrorInfo("Warning: You don't have permission to change this tile");
                 NetMessage.SendTileSquare(-1, X, Y, 4);
                 return(true);
             }
             else if (player.PermissionGroup.GroupName == "criminal")
             {
                 player.SendErrorInfo("Warning: Criminals cannot change tiles");
                 NetMessage.SendTileSquare(-1, X, Y, 4);
                 return(true);
             }
         }
         catch (Exception ex)
         {
             CommandBoardcast.ConsoleError(ex);
         }
     }
     return(false);
 }
 private bool PlayerControls(ref BinaryReader reader, int playerNumber)
 {
     if (Main.netMode == 2)
     {
         byte         plr     = reader.ReadByte();
         BitsByte     control = reader.ReadByte();
         BitsByte     pulley  = reader.ReadByte();
         byte         item    = reader.ReadByte();
         var          pos     = reader.ReadVector2();
         Player       player  = Main.player[playerNumber];
         ServerPlayer sPlayer = player.GetServerPlayer();
         if (pulley[2])
         {
             var vel = reader.ReadVector2();
         }
         if (ServerSideCharacter.Config.IsItemBanned(sPlayer.PrototypePlayer.inventory[item], sPlayer))
         {
             sPlayer.ApplyLockBuffs();
             sPlayer.SendErrorInfo("You used a banned item: " + player.inventory[item].Name);
         }
     }
     return(false);
 }
 private bool RequestChestOpen(ref BinaryReader reader, int playerNumber)
 {
     if (Main.netMode == 2)
     {
         int          x       = reader.ReadInt16();
         int          y       = reader.ReadInt16();
         int          id      = Chest.FindChest(x, y);
         Player       player  = Main.player[playerNumber];
         ServerPlayer sPlayer = player.GetServerPlayer();
         if (ServerSideCharacter.ChestManager.IsNull(id))
         {
             ServerSideCharacter.ChestManager.SetOwner(id, playerNumber);
         }
         else if (ServerSideCharacter.ChestManager.CanOpen(id, sPlayer))
         {
             return(false);
         }
         else
         {
             sPlayer.SendErrorInfo("You cannot open this chest");
         }
     }
     return(true);
 }
        public void Write(ServerPlayer player)
        {
            XmlNode    playerNode = XMLDoc.CreateNode(XmlNodeType.Element, "Player", null);
            XmlElement element    = playerNode as XmlElement;

            element.SetAttribute("name", player.Name);
            element.SetAttribute("uuid", player.UUID.ToString());
            element.SetAttribute("group", player.PermissionGroup.GroupName);
            foreach (var pair in ModDataHooks.PlayerExtraInfoTable)
            {
                element.SetAttribute(pair.Key, pair.Value(player));
            }
            NodeHelper.CreateNode(XMLDoc, playerNode, "haspwd", player.HasPassword.ToString());
            NodeHelper.CreateNode(XMLDoc, playerNode, "password", player.Password);
            NodeHelper.CreateNode(XMLDoc, playerNode, "lifeMax", player.LifeMax.ToString());
            NodeHelper.CreateNode(XMLDoc, playerNode, "statlife", player.StatLife.ToString());
            NodeHelper.CreateNode(XMLDoc, playerNode, "manaMax", player.ManaMax.ToString());
            NodeHelper.CreateNode(XMLDoc, playerNode, "statmana", player.StatMana.ToString());
            for (int i = 0; i < player.inventroy.Length; i++)
            {
                //TODO: Mod Item check
                var node1 = CreateItemInfo(playerNode, i, ref player.inventroy, "slot");
                //TODO: Additional mod item info
            }
            for (int i = 0; i < player.armor.Length; i++)
            {
                //TODO: Mod Item check
                var node1 = CreateItemInfo(playerNode, i, ref player.armor, "armor");
            }
            for (int i = 0; i < player.dye.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.dye, "dye");
            }
            for (int i = 0; i < player.miscEquips.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.miscEquips, "miscEquips");
            }
            for (int i = 0; i < player.miscDye.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.miscDye, "miscDye");
            }
            for (int i = 0; i < player.bank.item.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.bank.item, "bank");
            }
            for (int i = 0; i < player.bank2.item.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.bank2.item, "bank2");
            }
            for (int i = 0; i < player.bank3.item.Length; i++)
            {
                var node1 = CreateItemInfo(playerNode, i, ref player.bank3.item, "bank3");
            }
            PlayerRoot.AppendChild(playerNode);


            using (XmlTextWriter xtw = new XmlTextWriter(FilePath, Encoding.UTF8))
            {
                xtw.Formatting = Formatting.Indented;
                XMLDoc.Save(xtw);
            }
        }
        public void SavePlayer(ServerPlayer player)
        {
            XmlElement targetNode = null;

            foreach (var node in PlayerRoot.ChildNodes)
            {
                XmlElement element = node as XmlElement;
                if (element.GetAttribute("name").Equals(player.Name))
                {
                    targetNode = element;
                    element.SetAttribute("group", player.PermissionGroup.GroupName);
                    foreach (var pair in ModDataHooks.PlayerExtraInfoTable)
                    {
                        element.SetAttribute(pair.Key, pair.Value(player));
                    }
                    break;
                }
            }
            if (targetNode == null)
            {
                Console.WriteLine("Creating new Account");
                Write(player);
            }
            else
            {
                var list = targetNode.ChildNodes;
                int j    = 0;
                WriteNext(list, ref j, player.HasPassword.ToString());
                WriteNext(list, ref j, player.Password);
                WriteNext(list, ref j, player.LifeMax.ToString());
                WriteNext(list, ref j, player.StatLife.ToString());
                WriteNext(list, ref j, player.ManaMax.ToString());
                WriteNext(list, ref j, player.StatMana.ToString());
                for (int i = 0; i < player.inventroy.Length; i++)
                {
                    //TODO: Mod Item check
                    var node1 = WriteItemInfo(list, i, ref j, ref player.inventroy);
                    //TODO: Additional mod item info
                }
                for (int i = 0; i < player.armor.Length; i++)
                {
                    //TODO: Mod Item check
                    var node1 = WriteItemInfo(list, i, ref j, ref player.armor);
                }
                for (int i = 0; i < player.dye.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.dye);
                }
                for (int i = 0; i < player.miscEquips.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.miscEquips);
                }
                for (int i = 0; i < player.miscDye.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.miscDye);
                }
                for (int i = 0; i < player.bank.item.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.bank.item);
                }
                for (int i = 0; i < player.bank2.item.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.bank2.item);
                }
                for (int i = 0; i < player.bank3.item.Length; i++)
                {
                    var node1 = WriteItemInfo(list, i, ref j, ref player.bank3.item);
                }
                using (XmlTextWriter xtw = new XmlTextWriter(FilePath, Encoding.UTF8))
                {
                    xtw.Formatting = Formatting.Indented;
                    XMLDoc.Save(xtw);
                }
            }
        }
Beispiel #6
0
 public override void PostUpdate()
 {
     if (Main.netMode == 2)
     {
         try
         {
             ServerStarted = true;
             for (int i = 0; i < 255; i++)
             {
                 if (Main.player[i].active)
                 {
                     ServerPlayer player = ServerSideCharacter.XmlData.Data[Main.player[i].name];
                     player.CopyFrom(Main.player[i]);
                 }
             }
             if (Main.time % 180 < 1)
             {
                 lock (ServerSideCharacter.XmlData)
                 {
                     foreach (var player in ServerSideCharacter.XmlData.Data)
                     {
                         if (player.Value.PrototypePlayer != null)
                         {
                             int playerID = player.Value.PrototypePlayer.whoAmI;
                             if (!player.Value.HasPassword)
                             {
                                 player.Value.ApplyLockBuffs();
                                 NetMessage.SendChatMessageToClient(NetworkText.FromLiteral("Welcome! You are new to here. Please use /register <password> to register an account!"), new Color(255, 255, 30, 30), playerID);
                             }
                             if (player.Value.HasPassword && !player.Value.IsLogin)
                             {
                                 player.Value.ApplyLockBuffs();
                                 NetMessage.SendChatMessageToClient(NetworkText.FromLiteral("Welcome! You have already created an account. Please type /login <password> to login!"), new Color(255, 255, 30, 30), playerID);
                             }
                         }
                     }
                 }
             }
             if (Main.time % 3600 < 1)
             {
                 ThreadPool.QueueUserWorkItem(Do_Save);
             }
             foreach (var player in Main.player.Where(p => p.active))
             {
                 if (player.GetServerPlayer().EnteredRegion == null)
                 {
                     var        serverPlayer = player.GetServerPlayer();
                     RegionInfo region;
                     if (serverPlayer.InAnyRegion(out region))
                     {
                         serverPlayer.EnteredRegion = region;
                         serverPlayer.SendInfo(region.WelcomeInfo());
                     }
                 }
                 else if (player.GetServerPlayer().EnteredRegion != null)
                 {
                     var        serverPlayer = player.GetServerPlayer();
                     RegionInfo region;
                     if (!serverPlayer.InAnyRegion(out region))
                     {
                         serverPlayer.SendInfo(serverPlayer.EnteredRegion.LeaveInfo());
                         serverPlayer.EnteredRegion = null;
                     }
                 }
             }
         }
         catch (Exception ex)
         {
             CommandBoardcast.ConsoleError(ex);
             WorldFile.saveWorld();
             Netplay.disconnect = true;
             Terraria.Social.SocialAPI.Shutdown();
         }
     }
 }
        private bool RequestChestOpen(ref BinaryReader reader, int playerNumber)
        {
            if (!ServerSideCharacter.Config.EnableChestProtection)
            {
                return(false);
            }
            if (Main.netMode == 2)
            {
                int                  x       = reader.ReadInt16();
                int                  y       = reader.ReadInt16();
                int                  id      = Chest.FindChest(x, y);
                Player               player  = Main.player[playerNumber];
                ServerPlayer         sPlayer = player.GetServerPlayer();
                ChestManager.Pending pending = ServerSideCharacter.ChestManager.GetPendings(sPlayer);
                switch (pending)
                {
                case ChestManager.Pending.AddFriend:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        ServerPlayer friend = ServerSideCharacter.ChestManager.GetFriendP(sPlayer);
                        ServerSideCharacter.ChestManager.AddFriend(id, friend);
                        sPlayer.SendSuccessInfo($"{friend.Name} can open this chest now");
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                case ChestManager.Pending.RemoveFriend:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        ServerPlayer friend = ServerSideCharacter.ChestManager.GetFriendP(sPlayer);
                        ServerSideCharacter.ChestManager.RemoveFriend(id, friend);
                        sPlayer.SendSuccessInfo($"{friend.Name} can't open this chest now");
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                case ChestManager.Pending.Public:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        if (!ServerSideCharacter.ChestManager.IsPublic(id))
                        {
                            ServerSideCharacter.ChestManager.SetOwner(id, sPlayer.UUID, true);
                            sPlayer.SendSuccessInfo("This chest is now Public");
                        }
                        else
                        {
                            sPlayer.SendErrorInfo("This chest is already public");
                        }
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                case ChestManager.Pending.UnPublic:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        if (ServerSideCharacter.ChestManager.IsPublic(id))
                        {
                            ServerSideCharacter.ChestManager.SetOwner(id, sPlayer.UUID, false);
                            sPlayer.SendSuccessInfo("This chest is not Public anymore");
                        }
                        else
                        {
                            sPlayer.SendErrorInfo("This chest is not public");
                        }
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                case ChestManager.Pending.Protect:
                    if (ServerSideCharacter.ChestManager.IsNull(id))
                    {
                        ServerSideCharacter.ChestManager.SetOwner(id, sPlayer.UUID, false);
                        sPlayer.SendSuccessInfo("You now own this chest");
                    }
                    else if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        sPlayer.SendErrorInfo("You already protected this chest");
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("This chest as already been protected by other player");
                    }
                    break;

                case ChestManager.Pending.DeProtect:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        ServerSideCharacter.ChestManager.SetOwner(id, -1, false);
                        sPlayer.SendSuccessInfo("This chest is no longer yours");
                    }
                    else if (ServerSideCharacter.ChestManager.IsNull(id))
                    {
                        sPlayer.SendErrorInfo("This chest don't have a owner");
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                case ChestManager.Pending.Info:
                    if (ServerSideCharacter.ChestManager.IsOwner(id, sPlayer))
                    {
                        ChestInfo     chest = ServerSideCharacter.ChestManager.ChestInfo[id];
                        StringBuilder info  = new StringBuilder();
                        if (sPlayer.PermissionGroup.HasPermission("chest"))
                        {
                            info.AppendLine($"Owner: {ServerPlayer.FindPlayer(chest.OwnerID).Name}");                                     //For Admins
                        }
                        info.AppendLine($"Public Chest: {chest.IsPublic.ToString().ToUpper()}");
                        info.AppendLine($"Friends ({chest.Friends.Count.ToString()}): {string.Join(", ", chest.Friends.ToArray().Take(10).Select(uuid => ServerPlayer.FindPlayer(uuid).Name))}");
                        sPlayer.SendInfo(info.ToString());
                    }
                    else if (ServerSideCharacter.ChestManager.IsNull(id))
                    {
                        sPlayer.SendErrorInfo("This chest don't have a owner");
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You are not the owner of this chest");
                    }
                    break;

                default:
                    if (ServerSideCharacter.ChestManager.IsNull(id))
                    {
                        if (ServerSideCharacter.Config.AutoProtectChests)
                        {
                            ServerSideCharacter.ChestManager.SetOwner(id, sPlayer.UUID, false);
                            sPlayer.SendSuccessInfo("You now own this chest");
                        }
                        else
                        {
                            sPlayer.SendErrorInfo("Use '/chest protect' to become the owner of this chest");
                        }
                        return(false);
                    }
                    else if (ServerSideCharacter.ChestManager.CanOpen(id, sPlayer))
                    {
                        return(false);
                    }
                    else
                    {
                        sPlayer.SendErrorInfo("You cannot open this chest");
                    }
                    break;
                }
                ServerSideCharacter.ChestManager.RemovePending(sPlayer, pending);
            }
            return(true);
        }
        public PlayerData(string path)
        {
            ServerPlayer.ResetUUID();
            if (File.Exists(path))
            {
                XmlReaderSettings settings = new XmlReaderSettings {
                    IgnoreComments = true
                };
                //忽略文档里面的注释
                XmlDocument xmlDoc = new XmlDocument();
                XmlReader   reader = XmlReader.Create(path, settings);
                xmlDoc.Load(reader);
                XmlNode xn   = xmlDoc.SelectSingleNode("Players");
                var     list = xn.ChildNodes;
                Dictionary <string, Mod> modTable = new Dictionary <string, Mod>();
                foreach (var mod in ModLoader.LoadedMods)
                {
                    modTable.Add(mod.Name, mod);
                }
                foreach (var node in list)
                {
                    XmlElement   pData  = (XmlElement)node;
                    ServerPlayer player = new ServerPlayer();
                    var          info   = pData.ChildNodes;
                    int          i      = 0;
                    player.Name = pData.GetAttribute("name");
                    player.UUID = int.Parse(pData.GetAttribute("uuid"));
                    try
                    {
                        player.PermissionGroup = ServerSideCharacter.GroupManager.Groups[pData.GetAttribute("group")];
                    }
                    catch
                    {
                        player.PermissionGroup = ServerSideCharacter.GroupManager.Groups["default"];
                    }
                    foreach (var pair in ModDataHooks.InterpretPlayerStringTable)
                    {
                        pair.Value(pData.GetAttribute(pair.Key), player);
                    }
                    player.HasPassword = Convert.ToBoolean(ReadNext(info, ref i));
                    player.Password    = ReadNext(info, ref i);
                    player.LifeMax     = Convert.ToInt32(ReadNext(info, ref i));
                    player.StatLife    = Convert.ToInt32(ReadNext(info, ref i));
                    player.ManaMax     = Convert.ToInt32(ReadNext(info, ref i));
                    player.StatMana    = Convert.ToInt32(ReadNext(info, ref i));
                    for (int id = 0; id < player.inventory.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.inventory);
                        //player.inventory[id].Prefix(Convert.ToByte((info.Item(i - 1) as XmlElement).GetAttribute("prefix")));
                        //player.inventory[id].stack =
                        //	Convert.ToInt32((info.Item(i - 1) as XmlElement).GetAttribute("stack"));
                    }
                    for (int id = 0; id < player.armor.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.armor);
                    }
                    for (int id = 0; id < player.dye.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.dye);
                    }
                    for (int id = 0; id < player.miscEquips.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.miscEquips);
                    }
                    for (int id = 0; id < player.miscDye.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.miscDye);
                    }
                    for (int id = 0; id < player.bank.item.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.bank.item);
                    }
                    for (int id = 0; id < player.bank2.item.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.bank2.item);
                    }
                    for (int id = 0; id < player.bank3.item.Length; id++)
                    {
                        TryReadItemInfo(modTable, info, player, ref i, id, ref player.bank3.item);
                    }

                    Data.Add(player.Name, player);
                    ServerPlayer.IncreaseUUID();
                }
                ServerSideCharacter.MainWriter = new XMLWriter(path);
                reader.Close();
            }
            else
            {
                XMLWriter writer = new XMLWriter(path);
                writer.Create();
                ServerSideCharacter.MainWriter = writer;
            }
        }