diff --git a/TShockAPI/DB/CharacterManager.cs b/TShockAPI/DB/CharacterManager.cs index 3c772b3b..5a799f5b 100755 --- a/TShockAPI/DB/CharacterManager.cs +++ b/TShockAPI/DB/CharacterManager.cs @@ -17,7 +17,9 @@ along with this program. If not, see . */ using System; +using System.Collections.Generic; using System.Data; +using System.Linq; using System.Text; using MySql.Data.MySqlClient; using Terraria; @@ -75,7 +77,7 @@ namespace TShockAPI.DB playerData.maxHealth = reader.Get("MaxHealth"); playerData.mana = reader.Get("Mana"); playerData.maxMana = reader.Get("MaxMana"); - playerData.inventory = NetItem.Parse(reader.Get("Inventory")); + playerData.inventory = reader.Get("Inventory").Split('~').Select(NetItem.Parse).ToArray(); playerData.spawnX = reader.Get("spawnX"); playerData.spawnY = reader.Get("spawnY"); playerData.hair = reader.Get("hair"); @@ -104,23 +106,12 @@ namespace TShockAPI.DB public bool SeedInitialData(User user) { var inventory = new StringBuilder(); - for (int i = 0; i < NetItem.maxNetInventory; i++) - { - if (i > 0) - { - inventory.Append("~"); - } - if (i < TShock.ServerSideCharacterConfig.StartingInventory.Count) - { - var item = TShock.ServerSideCharacterConfig.StartingInventory[i]; - inventory.Append(item.netID).Append(',').Append(item.stack).Append(',').Append(item.prefix); - } - else - { - inventory.Append("0,0,0"); - } - } - string initialItems = inventory.ToString(); + + var items = TShock.ServerSideCharacterConfig.StartingInventory; + if (items.Count < NetItem.MaxInventory) + items.AddRange(new NetItem[NetItem.MaxInventory - items.Count]); + + string initialItems = String.Join("~", items.Take(NetItem.MaxInventory)); try { database.Query("INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8);", @@ -162,7 +153,7 @@ namespace TShockAPI.DB { 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.User.ID, 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); + player.User.ID, playerData.health, playerData.maxHealth, playerData.mana, playerData.maxMana, String.Join("~", 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) @@ -176,7 +167,7 @@ namespace TShockAPI.DB { 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.User.ID, 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); + playerData.health, playerData.maxHealth, playerData.mana, playerData.maxMana, String.Join("~", playerData.inventory), player.User.ID, 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) diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index c820294e..e0aada85 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -120,11 +120,11 @@ namespace TShockAPI TShock.ServerSideCharacterConfig = new ServerSideConfig { StartingInventory = - new List() + new List { - new NetItem() {netID = -15, stack = 1, prefix = 0}, - new NetItem() {netID = -13, stack = 1, prefix = 0}, - new NetItem() {netID = -16, stack = 1, prefix = 0} + new NetItem(-15, 1, 0), + new NetItem(-13, 1, 0), + new NetItem(-16, 1, 0) } }; } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 726165e5..a461be0b 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1278,14 +1278,14 @@ namespace TShockAPI // Players send a slot update packet for each inventory slot right after they've joined. bool bypassTrashCanCheck = false; - if (plr == args.Player.Index && !args.Player.HasSentInventory && slot == NetItem.maxNetInventory) + if (plr == args.Player.Index && !args.Player.HasSentInventory && slot == NetItem.MaxInventory) { args.Player.HasSentInventory = true; bypassTrashCanCheck = true; } if (OnPlayerSlot(plr, slot, stack, prefix, type) || plr != args.Player.Index || slot < 0 || - slot > NetItem.maxNetInventory) + slot > NetItem.MaxInventory) return true; if (args.Player.IgnoreSSCPackets) { diff --git a/TShockAPI/NetItem.cs b/TShockAPI/NetItem.cs new file mode 100644 index 00000000..b7e7ca5e --- /dev/null +++ b/TShockAPI/NetItem.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Terraria; + +namespace TShockAPI +{ + /// + /// Represents an item. + /// + public struct NetItem + { + /// + /// The number of armor slots. + /// + public static readonly int ArmorSlots = 16; + + /// + /// The number of dye slots. + /// + public static readonly int DyeSlots = 8; + + /// + /// The inventory size. + /// + public static readonly int MaxInventory = 83; + + private readonly int _netId; + private readonly byte _prefixId; + private readonly int _stack; + + /// + /// Gets the net ID. + /// + public int NetId + { + get { return _netId; } + } + + /// + /// Gets the prefix. + /// + public byte PrefixId + { + get { return _prefixId; } + } + + /// + /// Gets the stack. + /// + public int Stack + { + get { return _stack; } + } + + /// + /// Creates a new . + /// + /// The net ID. + /// The stack. + /// The prefix ID. + public NetItem(int netId, int stack, byte prefixId) + { + _netId = netId; + _stack = stack; + _prefixId = prefixId; + } + + /// + /// Converts the to a string. + /// + /// + public override string ToString() + { + return String.Format("{0},{1},{2}", _netId, _stack, _prefixId); + } + + /// + /// Converts a string into a . + /// + /// The string. + /// + /// + /// + public static NetItem Parse(string str) + { + if (str == null) + throw new ArgumentNullException("str"); + + string[] comp = str.Split(','); + if (comp.Length != 3) + throw new FormatException("String does not contain three sections."); + + int netId = Int32.Parse(comp[0]); + int stack = Int32.Parse(comp[1]); + byte prefixId = Byte.Parse(comp[2]); + + return new NetItem(netId, stack, prefixId); + } + + /// + /// Converts an into a . + /// + /// The . + /// + public static explicit operator NetItem(Item item) + { + return item == null + ? new NetItem() + : new NetItem(item.netID, item.stack, item.prefix); + } + } +} diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 08360728..1b48a5a4 100755 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -1072,7 +1072,7 @@ namespace TShockAPI public class PlayerData { - public NetItem[] inventory = new NetItem[NetItem.maxNetInventory]; + public NetItem[] inventory = new NetItem[NetItem.MaxInventory]; public int health = TShock.ServerSideCharacterConfig.StartingHealth; public int maxHealth = TShock.ServerSideCharacterConfig.StartingHealth; public int mana = TShock.ServerSideCharacterConfig.StartingMana; @@ -1094,7 +1094,7 @@ namespace TShockAPI public PlayerData(TSPlayer player) { - for (int i = 0; i < NetItem.maxNetInventory; i++) + for (int i = 0; i < NetItem.MaxInventory; i++) { this.inventory[i] = new NetItem(); } @@ -1102,28 +1102,18 @@ namespace TShockAPI for (int i = 0; i < TShock.ServerSideCharacterConfig.StartingInventory.Count; i++) { var item = TShock.ServerSideCharacterConfig.StartingInventory[i]; - StoreSlot(i, item.netID, item.prefix, item.stack); + StoreSlot(i, item.NetId, item.PrefixId, item.Stack); } } - public void StoreSlot(int slot, int netID, int prefix, int stack) + public void StoreSlot(int slot, int netID, byte prefix, int stack) { if(slot > (this.inventory.Length - 1)) //if the slot is out of range then dont save { return; - } - - this.inventory[slot].netID = netID; - if (this.inventory[slot].netID != 0) - { - this.inventory[slot].stack = stack; - this.inventory[slot].prefix = prefix; - } - else - { - this.inventory[slot].stack = 0; - this.inventory[slot].prefix = 0; } + + this.inventory[slot] = new NetItem(netID, stack, prefix); } public void CopyCharacter(TSPlayer player) @@ -1157,75 +1147,21 @@ namespace TShockAPI Item[] inventory = player.TPlayer.inventory; Item[] armor = player.TPlayer.armor; Item[] dye = player.TPlayer.dye; - for (int i = 0; i < NetItem.maxNetInventory; i++) + for (int i = 0; i < NetItem.MaxInventory; i++) { - if (i < NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)) + if (i < NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)) { - if (player.TPlayer.inventory[i] != null) - { - this.inventory[i].netID = inventory[i].netID; - } - else - { - this.inventory[i].netID = 0; - } - - if (this.inventory[i].netID != 0) - { - this.inventory[i].stack = inventory[i].stack; - this.inventory[i].prefix = inventory[i].prefix; - } - else - { - this.inventory[i].stack = 0; - this.inventory[i].prefix = 0; - } + this.inventory[i] = (NetItem)inventory[i]; } - else if (i < NetItem.maxNetInventory - NetItem.dyeSlots) + else if (i < NetItem.MaxInventory - NetItem.DyeSlots) { - var index = i - (NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)); - if (player.TPlayer.armor[index] != null) - { - this.inventory[i].netID = armor[index].netID; - } - else - { - this.inventory[i].netID = 0; - } - - if (this.inventory[i].netID != 0) - { - this.inventory[i].stack = armor[index].stack; - this.inventory[i].prefix = armor[index].prefix; - } - else - { - this.inventory[i].stack = 0; - this.inventory[i].prefix = 0; - } + var index = i - (NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)); + this.inventory[i] = (NetItem)armor[index]; } else { - var index = i - (NetItem.maxNetInventory - NetItem.dyeSlots); - if (player.TPlayer.dye[index] != null) - { - this.inventory[i].netID = dye[index].netID; - } - else - { - this.inventory[i].netID = 0; - } - - if (this.inventory[i].netID != 0) - { - this.inventory[i].stack = dye[index].stack; - this.inventory[i].prefix = dye[index].prefix; - } - else - { - this.inventory[i].stack = 0; - this.inventory[i].prefix = 0; - } + var index = i - (NetItem.MaxInventory - NetItem.DyeSlots); + this.inventory[i] = (NetItem)dye[index]; } } } @@ -1268,59 +1204,38 @@ namespace TShockAPI else player.TPlayer.hideVisual.ClearAll(); - for (int i = 0; i < NetItem.maxNetInventory; i++) + for (int i = 0; i < NetItem.MaxInventory; i++) { - if (i < NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)) + if (i < NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)) { - if (this.inventory[i] != null) - { - player.TPlayer.inventory[i].netDefaults(this.inventory[i].netID); - } - else - { - player.TPlayer.inventory[i].netDefaults(0); - } + player.TPlayer.inventory[i].netDefaults(this.inventory[i].NetId); if (player.TPlayer.inventory[i].netID != 0) { - player.TPlayer.inventory[i].stack = this.inventory[i].stack; - player.TPlayer.inventory[i].prefix = (byte)this.inventory[i].prefix; + player.TPlayer.inventory[i].stack = this.inventory[i].Stack; + player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId; } } - else if (i < NetItem.maxNetInventory - NetItem.dyeSlots) + else if (i < NetItem.MaxInventory - NetItem.DyeSlots) { - var index = i - (NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)); - if (this.inventory[i] != null) - { - player.TPlayer.armor[index].netDefaults(this.inventory[i].netID); - } - else - { - player.TPlayer.armor[index].netDefaults(0); - } + var index = i - (NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)); + player.TPlayer.armor[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.armor[index].netID != 0) { - player.TPlayer.armor[index].stack = this.inventory[i].stack; - player.TPlayer.armor[index].prefix = (byte)this.inventory[i].prefix; + player.TPlayer.armor[index].stack = this.inventory[i].Stack; + player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId; } } else { - var index = i - (NetItem.maxNetInventory - NetItem.dyeSlots); - if (this.inventory[i] != null) - { - player.TPlayer.dye[index].netDefaults(this.inventory[i].netID); - } - else - { - player.TPlayer.dye[index].netDefaults(0); - } + var index = i - (NetItem.MaxInventory - NetItem.DyeSlots); + player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.dye[index].netID != 0) { - player.TPlayer.dye[index].stack = this.inventory[i].stack; - player.TPlayer.dye[index].prefix = (byte)this.inventory[i].prefix; + player.TPlayer.dye[index].stack = this.inventory[i].Stack; + player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId; } } } @@ -1401,49 +1316,4 @@ namespace TShockAPI NetMessage.SendData(39, player.Index, -1, "", 400); } } - - public class NetItem - { - public static readonly int maxNetInventory = 83; - public static readonly int armorSlots = 16; - public static readonly int dyeSlots = 8; - public int netID; - public int stack; - public int prefix; - - public static string ToString(NetItem[] inventory) - { - StringBuilder items = new StringBuilder(); - for (int i = 0; i < maxNetInventory; i++) - { - items.Append(inventory[i].netID).Append(","); - if (inventory[i].netID != 0) - items.Append(inventory[i].stack).Append(",").Append(inventory[i].prefix).Append("~"); - else - items.Append("0,0~"); - } - return items.ToString(0, items.Length - 1); - } - - public static NetItem[] Parse(string data) - { - NetItem[] inventory = new NetItem[maxNetInventory]; - int i; - for (i = 0; i < maxNetInventory; i++) - { - inventory[i] = new NetItem(); - } - string[] items = data.Split('~'); - i = 0; - foreach (string item in items) - { - string[] idata = item.Split(','); - inventory[i].netID = int.Parse(idata[0]); - inventory[i].stack = int.Parse(idata[1]); - inventory[i].prefix = int.Parse(idata[2]); - i++; - } - return inventory; - } - } } diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index a44133be..74ad0111 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -162,9 +162,9 @@ namespace TShockAPI { Config = new ConfigFile(); ServerSideCharacterConfig = new ServerSideConfig(); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -15, prefix = 0, stack = 1 }); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -13, prefix = 0, stack = 1 }); - ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -16, prefix = 0, stack = 1 }); + ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-15, 1, 0)); + ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-13, 1, 0)); + ServerSideCharacterConfig.StartingInventory.Add(new NetItem(-16, 1, 0)); Order = 0; instance = this; } @@ -1844,9 +1844,9 @@ namespace TShockAPI Item[] inventory = player.TPlayer.inventory; Item[] armor = player.TPlayer.armor; Item[] dye = player.TPlayer.dye; - for (int i = 0; i < NetItem.maxNetInventory; i++) + for (int i = 0; i < NetItem.MaxInventory; i++) { - if (i < NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)) + if (i < NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)) { Item item = new Item(); if (inventory[i] != null && inventory[i].netID != 0) @@ -1863,10 +1863,10 @@ namespace TShockAPI } } } - else if(i < (NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots))) + else if(i < (NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots))) { Item item = new Item(); - var index = i - (NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots)); + var index = i - (NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots)); if (armor[index] != null && armor[index].netID != 0) { item.netDefaults(armor[index].netID); @@ -1881,10 +1881,10 @@ namespace TShockAPI } } } - else if (i < (NetItem.maxNetInventory - (NetItem.armorSlots + NetItem.dyeSlots))) + else if (i < (NetItem.MaxInventory - (NetItem.ArmorSlots + NetItem.DyeSlots))) { Item item = new Item(); - var index = i - (NetItem.maxNetInventory - NetItem.dyeSlots); + var index = i - (NetItem.MaxInventory - NetItem.DyeSlots); if (dye[index] != null && dye[index].netID != 0) { item.netDefaults(dye[index].netID); diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index ff3d0b9e..68584c5f 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -84,6 +84,7 @@ + @@ -188,7 +189,7 @@ - +