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); } } }
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; } }