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 @@
-
+