From f414fb4e3912757eeeb24db1e466e908506ee450 Mon Sep 17 00:00:00 2001 From: Zidonuke Date: Tue, 20 Dec 2011 21:30:06 -0500 Subject: [PATCH] Fixed all known bugs to server side inventory, its now fully tested. Fixed pvp related stuff, its now fully working. Inventory data is per account, not per character since I can't get SQLite to do something I need it to do. Pvp throttling hardcoded because client side has a limit of 5 seconds, so double enforce it server side. --- TShockAPI/DB/InventoryManager.cs | 7 +++---- TShockAPI/GetDataHandlers.cs | 7 +++++-- TShockAPI/TSPlayer.cs | 23 ++++++++++++++++------- TShockAPI/TShock.cs | 26 ++++++++++++-------------- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/TShockAPI/DB/InventoryManager.cs b/TShockAPI/DB/InventoryManager.cs index c9ffbbf0..0ea940f2 100644 --- a/TShockAPI/DB/InventoryManager.cs +++ b/TShockAPI/DB/InventoryManager.cs @@ -34,7 +34,6 @@ namespace TShockAPI.DB var table = new SqlTable("Inventory", new SqlColumn("Account", MySqlDbType.Int32) { Primary = true }, - new SqlColumn("CharacterName", MySqlDbType.VarChar, 50), new SqlColumn("MaxHealth", MySqlDbType.Int32), new SqlColumn("MaxMana", MySqlDbType.Int32), new SqlColumn("Inventory", MySqlDbType.Text) @@ -49,7 +48,7 @@ namespace TShockAPI.DB try { - using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0 AND CharacterName=@1", acctid, player.Name)) + using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0", acctid)) { if (reader.Read()) { @@ -77,7 +76,7 @@ namespace TShockAPI.DB { try { - database.Query("INSERT INTO Inventory (Account, CharacterName, MaxHealth, MaxMana, Inventory) VALUES (@0, @1, @2, @3, @4);", acctid, player.Name, playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory)); + 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) @@ -89,7 +88,7 @@ namespace TShockAPI.DB { try { - database.Query("UPDATE Inventory SET MaxHealth = @0, MaxMana = @1, Inventory = @3 WHERE Account = @4 AND CharacterName = @5;", playerData.maxHealth, playerData.maxMana, NetItem.ToString(playerData.inventory), player.Name, acctid); + 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) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 8f513192..4135f04e 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -524,7 +524,7 @@ namespace TShockAPI if (args.TPlayer.hostile != pvp) { long seconds = (long)(DateTime.UtcNow - args.Player.LastPvpChange).TotalSeconds; - if (TShock.Config.PvpThrottle > 0 && seconds < TShock.Config.PvpThrottle) + if (seconds > 5) { TSPlayer.All.SendMessage(string.Format("{0} has {1} PvP!", args.Player.Name, pvp ? "enabled" : "disabled"), Main.teamColor[args.Player.Team]); } @@ -536,7 +536,10 @@ namespace TShockAPI if (pvp == true && TShock.Config.AlwaysPvP) args.Player.IgnoreActionsForPvP = false; else + { + args.Player.Spawn(); args.Player.IgnoreActionsForPvP = true; + } NetMessage.SendData((int)PacketTypes.TogglePvp, -1, -1, "", args.Player.Index); @@ -575,7 +578,7 @@ namespace TShockAPI { args.Player.SendMessage("PvP is forced! Enable PvP else you can't move or do anything!", Color.Red); } - else if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn) + if (TShock.Config.ServerSideInventory && !args.Player.IsLoggedIn) { args.Player.SendMessage("Server Side Inventory is enabled! Please /register or /login to play!", Color.Red); } diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index b44b8e0f..65a6d6e4 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -442,6 +442,10 @@ namespace TShockAPI public PlayerData(TSPlayer player) { + for (int i = 0; i < NetItem.maxNetInventory; i++) + { + this.inventory[i] = new NetItem(); + } this.inventory[0].netID = -15; this.inventory[0].stack = 1; if(player.TPlayer.inventory[0] != null && player.TPlayer.inventory[0].netID == -15) @@ -501,9 +505,9 @@ namespace TShockAPI } else { - if (player.TPlayer.armor[i] != null) + if (player.TPlayer.armor[i - 48] != null) { - this.inventory[i].netID = armor[i].netID; + this.inventory[i].netID = armor[i - 48].netID; } else { @@ -512,8 +516,8 @@ namespace TShockAPI if (this.inventory[i].netID != 0) { - this.inventory[i].stack = armor[i].stack; - this.inventory[i].prefix = armor[i].prefix; + this.inventory[i].stack = armor[i - 48].stack; + this.inventory[i].prefix = armor[i - 48].prefix; } else { @@ -537,6 +541,8 @@ namespace TShockAPI string inventoryString = ""; for (int i = 0; i < NetItem.maxNetInventory; i++) { + if (i != 0) + inventoryString += "~"; inventoryString += inventory[i].netID; if (inventory[i].netID != 0) { @@ -547,8 +553,6 @@ namespace TShockAPI { inventoryString += ",0,0"; } - if(i != NetItem.maxNetInventory) - inventoryString += "~"; } return inventoryString; } @@ -556,8 +560,13 @@ namespace TShockAPI public static NetItem[] Parse(string data) { NetItem[] inventory = new NetItem[NetItem.maxNetInventory]; + int i; + for (i = 0; i < NetItem.maxNetInventory; i++) + { + inventory[i] = new NetItem(); + } string[] items = data.Split('~'); - int i = 0; + i = 0; foreach (string item in items) { string[] idata = item.Split(','); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 44f5a84b..5d9d85d9 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1039,7 +1039,7 @@ namespace TShockAPI { Item item = new Item(); Item serverItem = new Item(); - if (inventory[i].netID != 0) + if (inventory[i] != null && inventory[i].netID != 0) { if (playerData.inventory[i].netID != inventory[i].netID) { @@ -1057,8 +1057,7 @@ namespace TShockAPI player.SendMessage("Error: Your item (" + item.name + ") needs to be deleted.", Color.Cyan); check = false; } - - if (inventory[i].stack > playerData.inventory[i].stack) + else if (inventory[i].stack > playerData.inventory[i].stack) { item.netDefaults(inventory[i].netID); item.Prefix(inventory[i].prefix); @@ -1072,29 +1071,28 @@ namespace TShockAPI { Item item = new Item(); Item serverItem = new Item(); - if (armor[i].netID != 0) + if (armor[i - 48] != null && armor[i - 48].netID != 0) { - if (playerData.inventory[i].netID != armor[i].netID) + if (playerData.inventory[i].netID != armor[i - 48].netID) { - item.netDefaults(armor[i].netID); - item.Prefix(armor[i].prefix); + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); item.AffixName(); player.SendMessage("Error: Your armor (" + item.name + ") needs to be deleted.", Color.Cyan); check = false; } - else if (playerData.inventory[i].prefix != armor[i].prefix) + else if (playerData.inventory[i].prefix != armor[i - 48].prefix) { - item.netDefaults(armor[i].netID); - item.Prefix(armor[i].prefix); + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); item.AffixName(); player.SendMessage("Error: Your armor (" + item.name + ") needs to be deleted.", Color.Cyan); check = false; } - - if (armor[i].stack > playerData.inventory[i].stack) + else if (armor[i - 48].stack > playerData.inventory[i].stack) { - item.netDefaults(armor[i].netID); - item.Prefix(armor[i].prefix); + item.netDefaults(armor[i - 48].netID); + item.Prefix(armor[i - 48].prefix); item.AffixName(); player.SendMessage("Error: Your armor (" + item.name + ") (" + inventory[i].stack + ") needs to have it's stack decreased to (" + playerData.inventory[i].stack + ").", Color.Cyan); check = false;