コード例 #1
0
ファイル: Extensions.cs プロジェクト: ivanbiljan/NoCheat
        /// <summary>
        ///     Sets the chest item at the specified index.
        /// </summary>
        /// <param name="player">The player, which must not be <c>null</c>.</param>
        /// <param name="index">The index, which must be valid.</param>
        /// <param name="item">The item.</param>
        public static void SetChestItem([NotNull] this TSPlayer player, int index, NetItem item)
        {
            Debug.Assert(player != null, "Player must not be null.");
            Debug.Assert(0 <= index && index < Chest.maxItems, "Index must be valid.");

            player.SetData(ChestItemKey + index, item);
        }
コード例 #2
0
ファイル: Utils.cs プロジェクト: jng2398/ServerSideCharacter
        public static NetItem ToNetItem(Item item)
        {
            NetItem toRet = new NetItem();

            if (item.modItem != null)
            {
                string nameSpace = item.modItem.GetType().Namespace;
                string itemName  = item.modItem.GetType().Name;
                toRet.ItemID     = -1;
                toRet.IsModItem  = true;
                toRet.Prefix     = item.prefix;
                toRet.ModName    = nameSpace;
                toRet.ItemName   = itemName;
                toRet.IsFavorite = item.favorited;
                return(toRet);
            }
            else
            {
                toRet.ItemID     = item.netID;
                toRet.IsModItem  = false;
                toRet.Prefix     = item.prefix;
                toRet.ModName    = "";
                toRet.ItemName   = "";
                toRet.IsFavorite = item.favorited;
                return(toRet);
            }
        }
コード例 #3
0
        public PlayerData GetPlayerData(TSPlayer player, int acctid)
        {
            PlayerData playerData = new PlayerData(player);

            try
            {
                using (var reader = database.QueryReader("SELECT * FROM tsCharacter WHERE Account=@0", acctid))
                {
                    if (reader.Read())
                    {
                        playerData.exists    = true;
                        playerData.health    = reader.Get <int>("Health");
                        playerData.maxHealth = reader.Get <int>("MaxHealth");
                        playerData.mana      = reader.Get <int>("Mana");
                        playerData.maxMana   = reader.Get <int>("MaxMana");
                        playerData.inventory = NetItem.Parse(reader.Get <string>("Inventory"));
                        playerData.spawnX    = reader.Get <int>("spawnX");
                        playerData.spawnY    = reader.Get <int>("spawnY");
                        return(playerData);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }

            return(playerData);
        }
コード例 #4
0
    public override void Initialize(NetItem item)
    {
        base.Initialize(item);
        NetHoldable hold = item as NetHoldable;

        Damage = hold.Damage;
        Type   = hold.Type;
    }
コード例 #5
0
    public override void Initialize(NetItem item)
    {
        base.Initialize(item);
        Netwearable wear = item as Netwearable;

        Space = wear.Space;
        Type  = wear.Type;
    }
コード例 #6
0
ファイル: PlayerExport.cs プロジェクト: Megghy/PlayerExport
        public static Item NetItem2Item(NetItem item)
        {
            var i = new Item();

            i.SetDefaults(item.NetId);
            i.stack  = item.Stack;
            i.prefix = item.PrefixId;
            return(i);
        }
コード例 #7
0
 public virtual void Initialize(NetItem item)
 {
     Name          = item.Name;
     ID            = item.ID;
     Health        = item.Health;
     PrefabAddress = item.PrefabAddress;
     IconAddress   = item.IconAddress;
     Slot          = item.Slot;
 }
コード例 #8
0
    public static void JsonObject(Packet packet)
    {
        int id = packet.ReadInt();

        if (!GameManager.players.ContainsKey(id))
        {
            return;
        }

        string json = packet.ReadString();
        JsonSerializerSettings settings = new JsonSerializerSettings {
            TypeNameHandling = TypeNameHandling.All
        };
        NetEntity jsonObj = JsonConvert.DeserializeObject <NetEntity>(json, settings);

        if (jsonObj is NetAnimator)
        {
            GameManager.players[id].Animator.Set(jsonObj as NetAnimator);
            return;
        }
        if (jsonObj is BuildingData)
        {
            GameManager.instance.SpawnStructure(jsonObj as BuildingData);
            return;
        }
        if (jsonObj is NetItem)
        {
            NetItem netItem = jsonObj as NetItem;
            if (netItem is Netwearable)
            {
                Netwearable netWear = netItem as Netwearable;
                Wearable    wear    = new Wearable();
                wear.Initialize(netWear);
                GameManager.instance.ChangeInventory(id, wear);
            }
            if (netItem is NetHoldable)
            {
                NetHoldable netHold = netItem as NetHoldable;
                Holdable    hold    = new Holdable();
                hold.Initialize(netHold);
                GameManager.instance.ChangeInventory(id, hold);
            }
            return;
        }
        if (jsonObj is NetLoot)
        {
            NetLoot netLoot = jsonObj as NetLoot;
            GameManager.instance.CheckLoot(netLoot);
        }
        if (jsonObj is NetInventory)
        {
            Debug.Log("update inventory");
        }
    }
コード例 #9
0
        public int IndexOf(ItemData item)
        {
            for (int i = 0; i < this.itemArray.Length; i++)
            {
                NetItem tItem = this.itemArray[0];
                if (tItem.NetId == (int)item.Type && tItem.Stack == item.StackSize && tItem.PrefixId == (int)item.Prefix)
                {
                    return(i);
                }
            }

            return(-1);
        }
コード例 #10
0
 public CTFClass()
 {
     ID          = -1;
     Name        = null;
     Description = null;
     HP          = 100;
     Mana        = 20;
     Inventory   = new NetItem[NetItem.MaxInventory];
     for (int i = 0; i < NetItem.MaxInventory; ++i)
     {
         Inventory[i] = new NetItem(0, 0, 0);
     }
     Price  = 0;
     Hidden = true;
     Sell   = false;
 }
コード例 #11
0
        public void CreateInventory(string name)
        {
            int index;

            NetItem[] PlayerInventory = new NetItem[MaxInventory];

            TSPlayer player = FindTSPlayerByUserID(UserID);

            if (player != null)
            {
                Item[] inventory  = player.TPlayer.inventory;
                Item[] armor      = player.TPlayer.armor;
                Item[] dye        = player.TPlayer.dye;
                Item[] miscEquips = player.TPlayer.miscEquips;
                Item[] miscDyes   = player.TPlayer.miscDyes;

                for (int i = 0; i < MaxInventory; i++)
                {
                    if (i < InventorySlots)
                    {
                        PlayerInventory[i] = (NetItem)inventory[i];
                    }
                    else if (i < InventorySlots + ArmorSlots)
                    {
                        index = i - InventorySlots;
                        PlayerInventory[i] = (NetItem)armor[index];
                    }
                    else if (i < InventorySlots + ArmorSlots + DyeSlots)
                    {
                        index = i - (InventorySlots + ArmorSlots);
                        PlayerInventory[i] = (NetItem)dye[index];
                    }
                    else if (i < InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots)
                    {
                        index = i - (InventorySlots + ArmorSlots + DyeSlots);
                        PlayerInventory[i] = (NetItem)miscEquips[index];
                    }
                    else if (i < InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots + MiscDyeSlots)
                    {
                        index = i - (InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots);
                        PlayerInventory[i] = (NetItem)miscDyes[index];
                    }
                }

                Instance.Database.SaveInventory(UserID, name, PlayerInventory, HasInventory(name));
            }
        }
コード例 #12
0
ファイル: Module.cs プロジェクト: ivanbiljan/NoCheat
        private void OnUpdateItem(TSPlayer player, BinaryReader reader)
        {
            var itemIndex = reader.ReadInt16();

            reader.ReadVector2();
            reader.ReadVector2();
            var stackSize = reader.ReadInt16();
            var prefixId  = reader.ReadByte();

            reader.ReadByte();
            var itemId = reader.ReadInt16();

            if (itemIndex == Main.maxItems)
            {
                // Ignore hay created by the sickle, up to a certain stack size.
                if (player.SelectedItem.type == ItemID.Sickle && itemId == ItemID.Hay && stackSize <= 4)
                {
                    return;
                }

                var balanceSheet = player.GetOrCreateBalanceSheet();
                balanceSheet.AddTransaction(Transaction.WorldSlot, itemId, -stackSize, prefixId);
            }
            else
            {
                var item         = Main.item[itemIndex];
                var balanceSheet = player.GetOrCreateBalanceSheet();
                var netItem      = new NetItem(item.type, item.stack - stackSize, item.prefix);
                var lastNetItem  = player.GetLastUpdatedItem();
                // We need to specially detect if the client is stacking items, and adjust appropriately.
                if (netItem.NetId == lastNetItem.NetId && netItem.Stack == -lastNetItem.Stack && netItem.Stack > 0 &&
                    netItem.PrefixId == lastNetItem.PrefixId)
                {
                    Debug.WriteLine($"DEBUG: Stack update at {itemIndex}");
                    balanceSheet.AddTransaction(Transaction.StackUpdateSlot, item.type, item.stack - stackSize,
                                                item.prefix);
                }
                else
                {
                    balanceSheet.AddTransaction(Transaction.WorldSlot, item.type, item.stack - stackSize, item.prefix);
                }
                player.SetLastUpdatedItem(netItem);
            }
        }
コード例 #13
0
    public static void JsonPackate(int fromPlayer, Packet packet)
    {
        int    id   = packet.ReadInt();
        string json = packet.ReadString();
        JsonSerializerSettings settings = new JsonSerializerSettings {
            TypeNameHandling = TypeNameHandling.All
        };
        NetEntity netPackage = JsonConvert.DeserializeObject <NetEntity>(json, settings);

        if (netPackage is BuildingData)
        {
            NetworkManager.instance.ConstructionControl.BuildBuilding(id, (BuildingData)netPackage);
        }
        if (netPackage is NetItem)
        {
            NetItem netItem = netPackage as NetItem;

            if (netItem is Netwearable)
            {
                Netwearable netWear = netItem as Netwearable;
                NetworkManager.instance.InventoryControl.ChangeWear(netWear, id);
            }
            if (netItem is NetHoldable)
            {
                NetHoldable netHold = netItem as NetHoldable;
                Debug.Log($"got holdable: {netHold.Name}");
            }
        }
        if (netPackage is NetLoot)
        {
            NetLoot netLoot = netPackage as NetLoot;

            if (netLoot.ownerID == -1)
            {
                NetworkManager.instance.LootControl.UpdateLoot(netLoot);
            }
            else
            {
                NetworkManager.instance.InventoryControl.TakeLoot(netLoot);
            }
        }
    }
コード例 #14
0
ファイル: Item.cs プロジェクト: serg-bloim/UnityAllods
    public Item(NetItem netitem)
    {
        UID        = netitem.UID;
        ParentUIDs = netitem.ParentUIDs;

        Class = ItemClassLoader.GetItemClassById(netitem.ClassID);
        if (Class == null)
        {
            Debug.LogFormat("Invalid item created (id={0})", netitem.ClassID);
            return;
        }

        Count = netitem.Count;

        InitItem();

        MagicEffects = netitem.MagicEffects;

        UpdateItem();
    }
コード例 #15
0
        private static WorldSectionData.ChestData ReadChest(this BinaryReader reader)
        {
            var x = reader.ReadInt32();
            var y = reader.ReadInt32();

            var count = reader.ReadInt32();
            var items = new NetItem[count];

            for (var i = 0; i < count; i++)
            {
                items[i] = new NetItem(reader.ReadInt32(), reader.ReadInt32(), reader.ReadByte());
            }

            return(new WorldSectionData.ChestData
            {
                Items = items,
                X = x,
                Y = y
            });
        }
コード例 #16
0
ファイル: CharacterManager.cs プロジェクト: snsk802/TShock
        public PlayerData GetPlayerData(TSPlayer player, int acctid)
        {
            PlayerData playerData = new PlayerData(player);

            try
            {
                using (var reader = database.QueryReader("SELECT * FROM tsCharacter WHERE Account=@0", acctid))
                {
                    if (reader.Read())
                    {
                        playerData.exists          = true;
                        playerData.health          = reader.Get <int>("Health");
                        playerData.maxHealth       = reader.Get <int>("MaxHealth");
                        playerData.mana            = reader.Get <int>("Mana");
                        playerData.maxMana         = reader.Get <int>("MaxMana");
                        playerData.inventory       = NetItem.Parse(reader.Get <string>("Inventory"));
                        playerData.spawnX          = reader.Get <int>("spawnX");
                        playerData.spawnY          = reader.Get <int>("spawnY");
                        playerData.hair            = reader.Get <int?>("hair");
                        playerData.hairDye         = (byte)reader.Get <int>("hairDye");
                        playerData.hairColor       = TShock.Utils.DecodeColor(reader.Get <int?>("hairColor"));
                        playerData.pantsColor      = TShock.Utils.DecodeColor(reader.Get <int?>("pantsColor"));
                        playerData.shirtColor      = TShock.Utils.DecodeColor(reader.Get <int?>("shirtColor"));
                        playerData.underShirtColor = TShock.Utils.DecodeColor(reader.Get <int?>("underShirtColor"));
                        playerData.shoeColor       = TShock.Utils.DecodeColor(reader.Get <int?>("shoeColor"));
                        playerData.hideVisuals     = TShock.Utils.DecodeBitsByte(reader.Get <int?>("hideVisuals"));
                        playerData.skinColor       = TShock.Utils.DecodeColor(reader.Get <int?>("skinColor"));
                        playerData.eyeColor        = TShock.Utils.DecodeColor(reader.Get <int?>("eyeColor"));
                        playerData.questsCompleted = reader.Get <int>("questsCompleted");
                        return(playerData);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }

            return(playerData);
        }
コード例 #17
0
        public bool InsertPlayerData(TSPlayer player)
        {
            PlayerData playerData = player.PlayerData;

            if (!player.IsLoggedIn)
            {
                return(false);
            }


            if (!GetPlayerData(player, player.UserID).exists)
            {
                try
                {
                    database.Query("INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY) VALUES (@0, @1, @2, @3, @4, @5, @6, @7);", player.UserID,
                                   playerData.health, playerData.maxHealth, playerData.mana, playerData.maxMana, NetItem.ToString(playerData.inventory), player.TPlayer.SpawnX, player.TPlayer.SpawnY);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            else
            {
                try
                {
                    database.Query("UPDATE tsCharacter SET Health = @0, MaxHealth = @1, Mana = @2, MaxMana = @3, Inventory = @4, spawnX = @6, spawnY = @7 WHERE Account = @5;", playerData.health, playerData.maxHealth,
                                   playerData.mana, playerData.maxMana, NetItem.ToString(playerData.inventory), player.UserID, player.TPlayer.SpawnX, player.TPlayer.SpawnY);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            return(false);
        }
コード例 #18
0
ファイル: InventoryManager.cs プロジェクト: mau981/TShock
        public bool InsertPlayerData(TSPlayer player)
        {
            PlayerData playerData = player.PlayerData;

            if (!player.IsLoggedIn)
            {
                return(false);
            }

            if (!GetPlayerData(player, player.UserID).exists)
            {
                try
                {
                    database.Query("INSERT INTO Inventory (Account, MaxHealth, Inventory) VALUES (@0, @1, @2);", player.UserID,
                                   playerData.maxHealth, NetItem.ToString(playerData.inventory));
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            else
            {
                try
                {
                    database.Query("UPDATE Inventory SET MaxHealth = @0, Inventory = @1 WHERE Account = @2;", playerData.maxHealth,
                                   NetItem.ToString(playerData.inventory), player.UserID);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            return(false);
        }
コード例 #19
0
ファイル: Utils.cs プロジェクト: jng2398/ServerSideCharacter
 public static Item GetItemFromNet(NetItem netItem)
 {
     if (netItem.IsModItem)
     {
         var target_mod = ModLoader.LoadedMods.Where(mod => mod.Name == netItem.ModName);
         if (target_mod.Count() == 0)
         {
             return(new Item());
         }
         Item item = new Item();
         item.netDefaults(target_mod.First().ItemType(netItem.ItemName));
         item.prefix    = (byte)netItem.Prefix;
         item.favorited = netItem.IsFavorite;
         return(item);
     }
     else
     {
         Item item = new Item();
         item.netDefaults(netItem.ItemID);
         item.prefix    = (byte)netItem.Prefix;
         item.favorited = netItem.IsFavorite;
         return(item);
     }
 }
コード例 #20
0
ファイル: Extensions.cs プロジェクト: ivanbiljan/NoCheat
        /// <summary>
        ///     Sets the last updated item sent by the specified player.
        /// </summary>
        /// <param name="player">The player, which must not be <c>null</c>.</param>
        /// <param name="item">The lst updated item.</param>
        public static void SetLastUpdatedItem([NotNull] this TSPlayer player, NetItem item)
        {
            Debug.Assert(player != null, "Player must not be null.");

            player.SetData(LastUpdatedItemKey, item);
        }
コード例 #21
0
        private static NetItem[] CreateInventory(TSPlayer player)
        {
            int index;
            var playerInventory = new NetItem[NetItem.MaxInventory];

            var inventory  = player.TPlayer.inventory;
            var armor      = player.TPlayer.armor;
            var dye        = player.TPlayer.dye;
            var miscEquips = player.TPlayer.miscEquips;
            var miscDyes   = player.TPlayer.miscDyes;
            var piggy      = player.TPlayer.bank.item;
            var safe       = player.TPlayer.bank2.item;
            var trash      = player.TPlayer.trashItem;
            var forge      = player.TPlayer.bank3.item;

            for (var i = 0; i < NetItem.MaxInventory; i++)
            {
                if (i < NetItem.InventoryIndex.Item2)
                {
                    playerInventory[i] = (NetItem)inventory[i];
                }
                else if (i < NetItem.ArmorIndex.Item2)
                {
                    index = i - NetItem.ArmorIndex.Item1;
                    playerInventory[i] = (NetItem)armor[index];
                }
                else if (i < NetItem.DyeIndex.Item2)
                {
                    index = i - NetItem.DyeIndex.Item1;
                    playerInventory[i] = (NetItem)dye[index];
                }
                else if (i < NetItem.MiscEquipIndex.Item2)
                {
                    index = i - NetItem.MiscEquipIndex.Item1;
                    playerInventory[i] = (NetItem)miscEquips[index];
                }
                else if (i < NetItem.MiscDyeIndex.Item2)
                {
                    index = i - NetItem.MiscDyeIndex.Item1;
                    playerInventory[i] = (NetItem)miscDyes[index];
                }
                else if (i < NetItem.PiggyIndex.Item2)
                {
                    index = i - NetItem.PiggyIndex.Item1;
                    playerInventory[i] = (NetItem)piggy[index];
                }
                else if (i < NetItem.SafeIndex.Item2)
                {
                    index = i - NetItem.SafeIndex.Item1;
                    playerInventory[i] = (NetItem)safe[index];
                }
                else if (i < NetItem.TrashIndex.Item2)
                {
                    playerInventory[i] = (NetItem)trash;
                }
                else if (i < NetItem.ForgeIndex.Item2)
                {
                    index = i - NetItem.ForgeIndex.Item1;
                    playerInventory[i] = (NetItem)forge[index];
                }
            }

            return(playerInventory);
        }
コード例 #22
0
ファイル: CharacterManager.cs プロジェクト: snsk802/TShock
        public bool InsertPlayerData(TSPlayer player)
        {
            PlayerData playerData = player.PlayerData;

            if (!player.IsLoggedIn)
            {
                return(false);
            }


            if (!GetPlayerData(player, player.UserID).exists)
            {
                try
                {
                    database.Query(
                        "INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY, hair, hairDye, hairColor, pantsColor, shirtColor, underShirtColor, shoeColor, hideVisuals, skinColor, eyeColor, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18);",
                        player.UserID, playerData.health, playerData.maxHealth, playerData.mana, playerData.maxMana, NetItem.ToString(playerData.inventory), player.TPlayer.SpawnX, player.TPlayer.SpawnY, player.TPlayer.hair, player.TPlayer.hairDye, TShock.Utils.EncodeColor(player.TPlayer.hairColor), TShock.Utils.EncodeColor(player.TPlayer.pantsColor), TShock.Utils.EncodeColor(player.TPlayer.shirtColor), TShock.Utils.EncodeColor(player.TPlayer.underShirtColor), TShock.Utils.EncodeColor(player.TPlayer.shoeColor), TShock.Utils.EncodeBitsByte(player.TPlayer.hideVisual), TShock.Utils.EncodeColor(player.TPlayer.skinColor), TShock.Utils.EncodeColor(player.TPlayer.eyeColor), player.TPlayer.anglerQuestsFinished);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            else
            {
                try
                {
                    database.Query(
                        "UPDATE tsCharacter SET Health = @0, MaxHealth = @1, Mana = @2, MaxMana = @3, Inventory = @4, spawnX = @6, spawnY = @7, hair = @8, hairDye = @9, hairColor = @10, pantsColor = @11, shirtColor = @12, underShirtColor = @13, shoeColor = @14, hideVisuals = @15, skinColor = @16, eyeColor = @17, questsCompleted = @18 WHERE Account = @5;",
                        playerData.health, playerData.maxHealth, playerData.mana, playerData.maxMana, NetItem.ToString(playerData.inventory), player.UserID, player.TPlayer.SpawnX, player.TPlayer.SpawnY, player.TPlayer.hair, player.TPlayer.hairDye, TShock.Utils.EncodeColor(player.TPlayer.hairColor), TShock.Utils.EncodeColor(player.TPlayer.pantsColor), TShock.Utils.EncodeColor(player.TPlayer.shirtColor), TShock.Utils.EncodeColor(player.TPlayer.underShirtColor), TShock.Utils.EncodeColor(player.TPlayer.shoeColor), TShock.Utils.EncodeBitsByte(player.TPlayer.hideVisual), TShock.Utils.EncodeColor(player.TPlayer.skinColor), TShock.Utils.EncodeColor(player.TPlayer.eyeColor), player.TPlayer.anglerQuestsFinished);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            return(false);
        }
コード例 #23
0
 public static ItemData FromNetItem(NetItem netItem)
 {
     return(new ItemData(netItem.PrefixId, netItem.NetId, netItem.Stack));
 }
コード例 #24
0
        public bool InsertPlayerData(TSPlayer player, int acctid)
        {
            PlayerData playerData = player.PlayerData;

            if (!GetPlayerData(player, acctid).exists)
            {
                try
                {
                    database.Query("INSERT INTO Inventory (Account, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3);", acctid, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory));
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            else
            {
                try
                {
                    database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @2 WHERE Account = @3;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), acctid);
                    return(true);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }
            return(false);
        }
コード例 #25
0
 public static ItemData FromNetItem(NetItem netItem)
 {
     return(new ItemData((ItemPrefix)netItem.prefix, (ItemType)netItem.netID, netItem.stack));
 }
コード例 #26
0
        public static RelevantInfo GetRelevance(QueryResult reader)
        {
            bool[]       hiddens         = new bool[20];
            RelevantInfo relevantPlr     = new RelevantInfo();
            Color        eyeColor        = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("eyecolor"));
            Color        hairColor       = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("haircolor"));
            Color        pantsColor      = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("pantscolor"));
            Color        shirtColor      = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("shirtcolor"));
            Color        shoeColor       = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("shoecolor"));
            Color        skinColor       = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("skincolor"));
            Color        underShirtColor = (Color)TShock.Utils.DecodeColor(reader.Get <Int32>("undershirtcolor"));

            relevantPlr.EyeColor        = new int[] { eyeColor.R, eyeColor.G, eyeColor.B };
            relevantPlr.HairColor       = new int[] { hairColor.R, hairColor.G, hairColor.B };
            relevantPlr.PantsColor      = new int[] { pantsColor.R, pantsColor.G, pantsColor.B };
            relevantPlr.ShirtColor      = new int[] { shirtColor.R, shirtColor.G, shirtColor.B };
            relevantPlr.ShoeColor       = new int[] { shoeColor.R, shoeColor.G, shoeColor.B };
            relevantPlr.SkinColor       = new int[] { skinColor.R, skinColor.G, skinColor.B };
            relevantPlr.UnderShirtColor = new int[] { underShirtColor.R, underShirtColor.G, underShirtColor.B };
            relevantPlr.SkinVariant     = reader.Get <Int32>("skinvariant");
            relevantPlr.Hair            = reader.Get <Int32>("hair");

            bool extraSlot = reader.Get <Boolean>("extraSlot");

            for (int i = 0; i < 20; i++)
            {
                if (i < 10)
                {
                    hiddens[i] = (reader.Get <Int32>("hideVisuals") & 1 << i) != 0;
                }
                else
                {
                    hiddens[i] = false;
                }
            }

            string[] inventory_entries = reader.Get <String>("inventory").Split('~');
            NetItem  parsed;
            Item     item;
            // Because vanity items are stored after regular, if one is wearing vanity it will replace the former
            int not_weird = 0;

            for (int i = 59; i < 79; i++)
            {
                not_weird = i - 59;
                parsed    = NetItem.Parse(inventory_entries[i]);
                if (parsed.NetId < 1)
                {
                    continue;
                }
                if (extraSlot && (not_weird == 8 || not_weird == 18)) // lets skip the extra slots
                {
                    continue;
                }

                item = new Item();
                item.SetDefaults(parsed.NetId);
                // Head
                if ((i == 59 || i == 69) && item.headSlot >= 0)
                {
                    relevantPlr.HeadSlot = (item.headSlot == 0) ? (int?)null : item.headSlot;
                }
                // Body
                else if ((i == 60 || i == 70) && item.bodySlot >= 0)
                {
                    relevantPlr.BodySlot = (item.bodySlot == 0) ? (int?)null : item.bodySlot;
                }
                // Legs
                else if ((i == 61 || i == 71) && item.legSlot >= 0)
                {
                    relevantPlr.LegsSlot = (item.legSlot == 0) ? (int?)null : item.legSlot;
                }
                // Accessories
                else if (((i >= 62 && i <= 67) && !hiddens[not_weird]) || i >= 72 && i <= 77)
                {
                    if (item.handOnSlot >= 0)
                    {
                        relevantPlr.HandsOnSlot = item.handOnSlot;
                    }
                    if (item.handOffSlot >= 0)
                    {
                        relevantPlr.HandsOffSlot = item.handOffSlot;
                    }


                    if (item.backSlot >= 0)
                    {
                        relevantPlr.BackSlot  = item.backSlot;
                        relevantPlr.FrontSlot = null;
                    }
                    if (item.frontSlot > 0)
                    {
                        relevantPlr.FrontSlot = item.frontSlot;
                    }
                    if (item.shoeSlot > 0)
                    {
                        relevantPlr.ShoeSlot = item.shoeSlot;
                    }
                    if (item.waistSlot > 0)
                    {
                        relevantPlr.WaistSlot = item.waistSlot;
                    }
                    if (item.wingSlot > 0)
                    {
                        relevantPlr.WingSlot = item.wingSlot;
                    }
                    if (item.shieldSlot > 0)
                    {
                        relevantPlr.ShieldSlot = item.shieldSlot;
                    }
                    if (item.neckSlot > 0)
                    {
                        relevantPlr.NeckSlot = item.neckSlot;
                    }
                    if (item.faceSlot > 0)
                    {
                        relevantPlr.FaceSlot = item.faceSlot;
                    }
                    if (item.balloonSlot > 0)
                    {
                        relevantPlr.BalloonSlot = item.balloonSlot;
                    }
                }
            }


            // Robes and set pieces that stretch
            bool wearsRobe = false;
            int  news      = Player.SetMatch(1, relevantPlr.BodySlot.HasValue ? relevantPlr.BodySlot.Value : 0, Terraria.ID.PlayerVariantID.Sets.Male[relevantPlr.SkinVariant], ref wearsRobe);

            if (news != -1)
            {
                relevantPlr.LegsSlot = news;
            }
            news = Player.SetMatch(2, relevantPlr.LegsSlot.HasValue ? relevantPlr.LegsSlot.Value : 0, Terraria.ID.PlayerVariantID.Sets.Male[relevantPlr.SkinVariant], ref wearsRobe);
            if (news != -1)
            {
                relevantPlr.LegsSlot = news;
            }
            news = Player.SetMatch(0, relevantPlr.HeadSlot.HasValue ? relevantPlr.HeadSlot.Value : 0, Terraria.ID.PlayerVariantID.Sets.Male[relevantPlr.SkinVariant], ref wearsRobe);
            if (news != -1)
            {
                relevantPlr.HeadSlot = news;
            }

            // Conditionals
            if (relevantPlr.WingSlot.HasValue)
            {
                relevantPlr.BackSlot  = null;
                relevantPlr.FrontSlot = null;
            }

            if (relevantPlr.HeadSlot.HasValue && relevantPlr.HeadSlot != 0)
            {
                relevantPlr.FaceSlot = relevantPlr.FaceSlot.HasValue ? ((relevantPlr.FaceSlot == 7) ? 7 : (int?)null) : (int?)null;
            }

            return(relevantPlr);
        }