From f5e1b79fbbd4b8fa72949a15e619fed74bb9a065 Mon Sep 17 00:00:00 2001 From: White Date: Thu, 9 Jul 2015 16:48:32 +0930 Subject: [PATCH] Fixed more of SSC. Trash, held item, piggy items, and safe items are all cleared upon first login. --- TShockAPI/NetItem.cs | 26 +++++--- TShockAPI/TSPlayer.cs | 150 ++++++++++++++++++++++++++++++++++-------- TShockAPI/TShock.cs | 99 +++++++++++++++++++++++----- 3 files changed, 220 insertions(+), 55 deletions(-) diff --git a/TShockAPI/NetItem.cs b/TShockAPI/NetItem.cs index 6ee4a70c..35fef45d 100644 --- a/TShockAPI/NetItem.cs +++ b/TShockAPI/NetItem.cs @@ -14,34 +14,44 @@ namespace TShockAPI public struct NetItem { /// - /// The size of the player's inventory (inventory, coins, ammo, trash) + /// 40 - The number of slots in a piggy bank + /// + public static readonly int PiggySlots = 40; + + /// + /// 40 - The number of slots in a safe + /// + public static readonly int SafeSlots = PiggySlots; + + /// + /// 59 - The size of the player's inventory (inventory, coins, ammo) /// public static readonly int InventorySlots = 59; /// - /// The number of armor slots. + /// 20 - The number of armor slots. /// public static readonly int ArmorSlots = 20; /// - /// The number of other equippable items + /// 5 - The number of other equippable items /// public static readonly int MiscEquipSlots = 5; /// - /// The number of dye slots. + /// 10 - The number of dye slots. /// public static readonly int DyeSlots = 10; /// - /// The number of other dye slots (for ) + /// 5 - The number of other dye slots (for ) /// - public static readonly int MiscDyeSlots = 5; + public static readonly int MiscDyeSlots = MiscEquipSlots; /// - /// The inventory size (including armour, dies, coins, ammo, and trash) + /// 179 - The inventory size (including armour, dies, coins, ammo, piggy, safe, and trash) /// - public static readonly int MaxInventory = 99; + public static readonly int MaxInventory = InventorySlots + ArmorSlots + DyeSlots + MiscEquipSlots + MiscDyeSlots + PiggySlots + SafeSlots + 1; [JsonProperty("netID")] private int _netId; diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index b106cbc5..96fba189 100755 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -1149,6 +1149,10 @@ namespace TShockAPI Item[] dye = player.TPlayer.dye; Item[] miscEqups = player.TPlayer.miscEquips; Item[] miscDyes = player.TPlayer.miscDyes; + Item[] piggy = player.TPlayer.bank.item; + Item[] safe = player.TPlayer.bank2.item; + Item trash = player.TPlayer.trashItem; + for (int i = 0; i < NetItem.MaxInventory; i++) { if (i < NetItem.InventorySlots) @@ -1156,31 +1160,53 @@ namespace TShockAPI //0-58 this.inventory[i] = (NetItem)inventory[i]; } - else if (i < NetItem.InventorySlots - + NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) { //59-78 var index = i - NetItem.InventorySlots; this.inventory[i] = (NetItem)armor[index]; } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots - NetItem.MiscDyeSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) { //79-88 - var index = i - (NetItem.MaxInventory - - (NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); this.inventory[i] = (NetItem)dye[index]; } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots) + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots) { //89-93 - var index = i - (NetItem.MaxInventory - (NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); this.inventory[i] = (NetItem)miscEqups[index]; } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots) + { + //93-98 + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots); + this.inventory[i] = (NetItem)miscDyes[index]; + } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots) + { + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots); + this.inventory[i] = (NetItem)piggy[index]; + } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots) + { + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots); + this.inventory[i] = (NetItem)safe[index]; + } else { - //93-98 - var index = i - (NetItem.MaxInventory - NetItem.MiscDyeSlots); - this.inventory[i] = (NetItem)miscDyes[index]; + this.inventory[i] = (NetItem)trash; } } } @@ -1236,8 +1262,7 @@ namespace TShockAPI player.TPlayer.inventory[i].prefix = this.inventory[i].PrefixId; } } - else if (i < NetItem.InventorySlots - + NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) { //59-78 var index = i - NetItem.InventorySlots; @@ -1249,11 +1274,10 @@ namespace TShockAPI player.TPlayer.armor[index].prefix = (byte)this.inventory[i].PrefixId; } } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots - NetItem.MiscDyeSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) { //79-88 - var index = i - (NetItem.MaxInventory - - (NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); player.TPlayer.dye[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.dye[index].netID != 0) @@ -1262,10 +1286,11 @@ namespace TShockAPI player.TPlayer.dye[index].prefix = (byte)this.inventory[i].PrefixId; } } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots) + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots) { //89-93 - var index = i - (NetItem.MaxInventory - (NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); player.TPlayer.miscEquips[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscEquips[index].netID != 0) @@ -1274,10 +1299,13 @@ namespace TShockAPI player.TPlayer.miscEquips[index].prefix = (byte)this.inventory[i].PrefixId; } } - else + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots) { //93-98 - var index = i - (NetItem.MaxInventory - NetItem.MiscDyeSlots); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots); player.TPlayer.miscDyes[index].netDefaults(this.inventory[i].NetId); if (player.TPlayer.miscDyes[index].netID != 0) @@ -1286,34 +1314,85 @@ namespace TShockAPI player.TPlayer.miscDyes[index].prefix = (byte)this.inventory[i].PrefixId; } } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots) + { + //98-138 + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots); + player.TPlayer.bank.item[index].netDefaults(this.inventory[i].NetId); + + if (player.TPlayer.bank.item[index].netID != 0) + { + player.TPlayer.bank.item[index].stack = this.inventory[i].Stack; + player.TPlayer.bank.item[index].prefix = (byte)this.inventory[i].PrefixId; + } + } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots) + { + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots); + player.TPlayer.bank2.item[index].netDefaults(this.inventory[i].NetId); + + if (player.TPlayer.bank2.item[index].netID != 0) + { + player.TPlayer.bank2.item[index].stack = this.inventory[i].Stack; + player.TPlayer.bank2.item[index].prefix = (byte)this.inventory[i].PrefixId; + } + } + else + { + player.TPlayer.trashItem.netDefaults(this.inventory[i].NetId); + + if (player.TPlayer.trashItem.netID != 0) + { + player.TPlayer.trashItem.stack = this.inventory[i].Stack; + player.TPlayer.trashItem.prefix = (byte)this.inventory[i].PrefixId; + } + } } float slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix, 0f, 0); + NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix, 0f, 0); + NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix, 0f, 0); + NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix, 0f, 0); + NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix, 0f, 0); + NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } + for (int k = 0; k < NetItem.PiggySlots; k++) + { + NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); + slot++; + } + for (int k = 0; k < NetItem.SafeSlots; k++) + { + NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); + slot++; + } + + NetMessage.SendData(5, -1, -1, Main.player[player.Index].trashItem.name, player.Index, slot, (float)Main.player[player.Index].trashItem.prefix); NetMessage.SendData(4, -1, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, -1, -1, "", player.Index, 0f, 0f, 0f, 0); @@ -1322,29 +1401,42 @@ namespace TShockAPI slot = 0f; for (int k = 0; k < NetItem.InventorySlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix, 0f, 0); + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix); slot++; } for (int k = 0; k < NetItem.ArmorSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix, 0f, 0); + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix); slot++; } for (int k = 0; k < NetItem.DyeSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix, 0f, 0); + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscEquipSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix, 0f, 0); + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix); slot++; } for (int k = 0; k < NetItem.MiscDyeSlots; k++) { - NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix, 0f, 0); + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix); slot++; } + for (int k = 0; k < NetItem.PiggySlots; k++) + { + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix); + slot++; + } + for (int k = 0; k < NetItem.SafeSlots; k++) + { + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix); + slot++; + } + + NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].trashItem.name, player.Index, slot, (float)Main.player[player.Index].trashItem.prefix); + NetMessage.SendData(4, player.Index, -1, player.Name, player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(42, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); NetMessage.SendData(16, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 9258ad60..e36eb684 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -430,12 +430,6 @@ namespace TShockAPI { if (args.Player.IsLoggedIn) args.Player.SaveServerCharacter(); - - if (args.Player.ItemInHand.type != 0) - { - args.Player.SendErrorMessage("Attempting to bypass SSC with item in hand."); - args.Handled = true; - } } /// NetHooks_NameCollision - Internal hook fired when a name collision happens. @@ -1664,6 +1658,9 @@ namespace TShockAPI Item[] dye = player.TPlayer.dye; Item[] miscEquips = player.TPlayer.miscEquips; Item[] miscDyes = player.TPlayer.miscDyes; + Item[] piggy = player.TPlayer.bank.item; + Item[] safe = player.TPlayer.bank2.item; + Item trash = player.TPlayer.trashItem; for (int i = 0; i < NetItem.MaxInventory; i++) { @@ -1685,8 +1682,7 @@ namespace TShockAPI } } } - else if (i < NetItem.InventorySlots - + NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots) { //59-78 Item item = new Item(); @@ -1700,17 +1696,16 @@ namespace TShockAPI { check = true; player.SendMessage( - String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[i - 48].stack), + String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[index].stack), Color.Cyan); } } } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots - NetItem.MiscDyeSlots) + else if (i < NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots) { //79-88 Item item = new Item(); - var index = i - (NetItem.MaxInventory - - (NetItem.DyeSlots + NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots); if (dye[index] != null && dye[index].netID != 0) { item.netDefaults(dye[index].netID); @@ -1725,11 +1720,12 @@ namespace TShockAPI } } } - else if (i < NetItem.MaxInventory - NetItem.MiscEquipSlots) + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots) { //89-93 Item item = new Item(); - var index = i - (NetItem.MaxInventory - (NetItem.MiscDyeSlots + NetItem.MiscEquipSlots)); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots); if (miscEquips[index] != null && miscEquips[index].netID != 0) { item.netDefaults(miscEquips[index].netID); @@ -1739,16 +1735,19 @@ namespace TShockAPI { check = true; player.SendMessage( - String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, dye[index].stack), + String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, miscEquips[index].stack), Color.Cyan); } } } - else + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots) { //93-98 Item item = new Item(); - var index = i - (NetItem.MaxInventory - NetItem.MiscDyeSlots); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots); if (miscDyes[index] != null && miscDyes[index].netID != 0) { item.netDefaults(miscDyes[index].netID); @@ -1758,7 +1757,71 @@ namespace TShockAPI { check = true; player.SendMessage( - String.Format("Stack cheat detected. Remove item dye {0} ({1}) and then rejoin", item.name, dye[index].stack), + String.Format("Stack cheat detected. Remove item dye {0} ({1}) and then rejoin", item.name, miscDyes[index].stack), + Color.Cyan); + } + } + } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots) + { + //98-138 + Item item = new Item(); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots); + if (piggy[index] != null && piggy[index].netID != 0) + { + item.netDefaults(piggy[index].netID); + item.Prefix(piggy[index].prefix); + item.AffixName(); + + if (piggy[index].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove Piggy-bank item {0} ({1}) and then rejoin", item.name, piggy[index].stack), + Color.Cyan); + } + } + } + else if (i < + NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + NetItem.MiscEquipSlots + + NetItem.MiscDyeSlots + NetItem.PiggySlots + NetItem.SafeSlots) + { + //138-178 + Item item = new Item(); + var index = i - (NetItem.InventorySlots + NetItem.ArmorSlots + NetItem.DyeSlots + + NetItem.MiscEquipSlots + NetItem.MiscDyeSlots + NetItem.PiggySlots); + if (safe[index] != null && safe[index].netID != 0) + { + item.netDefaults(safe[index].netID); + item.Prefix(safe[index].prefix); + item.AffixName(); + + if (safe[index].stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove Safe item {0} ({1}) and then rejoin", item.name, safe[index].stack), + Color.Cyan); + } + } + } + else + { + Item item = new Item(); + if (trash != null && trash.netID != 0) + { + item.netDefaults(trash.netID); + item.Prefix(trash.prefix); + item.AffixName(); + + if (trash.stack > item.maxStack) + { + check = true; + player.SendMessage( + String.Format("Stack cheat detected. Remove trash item {0} ({1}) and then rejoin", item.name, trash.stack), Color.Cyan); } }