From b1b6cf133de515b04ab71823ac207cb9bf3c8cc2 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Wed, 23 Dec 2020 01:09:45 +1300 Subject: [PATCH] Add CompetitionItem support --- DataCollection/gamedata.json | 5 +- .../Horse Isle Server/Game/Item.cs | 3 +- .../Horse Isle Server/Game/Messages.cs | 13 +- .../Horse Isle Server/Game/Meta.cs | 3 + .../Horse Isle Server.csproj | 1 + .../Player/CompetitionGear.cs | 92 +++++++++ .../Horse Isle Server/Player/User.cs | 11 +- .../Horse Isle Server/Server/Database.cs | 178 +++++++++++++++++- .../Horse Isle Server/Server/GameDataJson.cs | 2 + .../Horse Isle Server/Server/GameServer.cs | 84 +++++++++ .../Horse Isle Server/Server/PacketBuilder.cs | 1 + 11 files changed, 381 insertions(+), 12 deletions(-) create mode 100644 Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index e2edd54..6a0075e 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -138,15 +138,14 @@ "npc_talk_button":"^BA%ID%" }, "inventory":{ - "full_inventory_grab":"Your inventory is full! Cannot grab items.", - "full_inventory_buy":"Your inventory is full! Cannot grab items.", - + "equip_format":"The %ITEM% are now selected as competition gear.", "header_format":"^ATYour Inventory^HYou are carrying the following %ITEMCOUNT% different items: (%MAXITEMS% max)", "item_entry":"^I%ICONID%^T4(%COUNT%) %TITLE%", "shop_entry":"^I%ICONID%^T4(%COUNT%) %TITLE% $%PRICE%", "item_drop_button":"^B4D%RANDOMID%", "item_info_button":"^B4LE%RANDOMID%", "item_info_itemid_button":"^B4LN%ITEMID%", + "item_wear_button":"^B4W%RANDOMID%", "item_consume_button":"^B4E%RANDOMID%", "item_throw_button":"^B4T%RANDOMID%", "item_use_button":"^B4UD%RANDOMID%", diff --git a/Horse Isle Server/Horse Isle Server/Game/Item.cs b/Horse Isle Server/Horse Isle Server/Game/Item.cs index 1563b2a..184a2e0 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Item.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Item.cs @@ -18,7 +18,7 @@ namespace HISP.Game public string SpawnOnSpecialTile; public string SpawnNearSpecialTile; } - public struct ItemInformation + public class ItemInformation { public int Id; public string Name; @@ -55,7 +55,6 @@ namespace HISP.Game public static int Telescope; public static int Pitchfork; - public static bool IsThrowable(int id) { foreach(ThrowableItem itm in ThrowableItems) diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 5cc3735..16d5726 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -105,7 +105,7 @@ namespace HISP.Game // Inventory public static string InventoryItemFormat; - + public static string EquipItemFormat; public static string InventoryHeaderFormat; public static string ItemDropButton; @@ -114,6 +114,7 @@ namespace HISP.Game public static string ItemConsumeButton; public static string ItemThrowButton; public static string ItemUseButton; + public static string ItemWearButton; public static string ItemReadButton; public static string ShopEntryFormat; @@ -240,7 +241,10 @@ namespace HISP.Game } - + public static string FormatEquipItemMessage(string name) + { + return EquipItemFormat.Replace("%ITEM%", name); + } public static string FormatYouEarnedAnItemMessage(string itemName) { return YouEarnedAnItemFormat.Replace("%ITEM%", itemName); @@ -269,7 +273,10 @@ namespace HISP.Game { return ShopEntryFormat.Replace("%ICONID%", iconid.ToString()).Replace("%COUNT%", count).Replace("%TITLE%", name).Replace("%PRICE%", price.ToString()); } - + public static string FormatWearButton(int randomId) + { + return ItemWearButton.Replace("%RANDOMID%", randomId.ToString()); + } public static string FormatItemInformationByIdButton(int itemId) { return ItemInformationByIdButton.Replace("%ITEMID%", itemId.ToString()); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index 8b0718f..98f329f 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -336,6 +336,9 @@ namespace HISP.Game if (itemInfo.Id == Item.Present || itemInfo.Id == Item.DorothyShoes || itemInfo.Id == Item.Telescope) message += Messages.FormatItemUseButton(randomId); + if (itemInfo.Type == "CLOTHES") + message += Messages.FormatWearButton(randomId); + if (itemInfo.Type == "TEXT") message += Messages.FormatItemReadButton(randomId); diff --git a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj index b59d322..13faa9b 100644 --- a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj +++ b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj @@ -77,6 +77,7 @@ + True True diff --git a/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs new file mode 100644 index 0000000..b9a7ccb --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs @@ -0,0 +1,92 @@ +using HISP.Game; +using HISP.Server; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HISP.Player +{ + class CompetitionGear + { + private int playerId; + public CompetitionGear(int PlayerId) + { + playerId = PlayerId; + if (!Database.HasCompetitionGear(PlayerId)) + Database.InitCompetitionGear(PlayerId); + int itemId = Database.GetCompetitionGearHeadPeice(PlayerId); + if (itemId != 0) + head = Item.GetItemById(itemId); + + itemId = Database.GetCompetitionGearBodyPeice(PlayerId); + if (itemId != 0) + body = Item.GetItemById(itemId); + + itemId = Database.GetCompetitionGearLegPeice(PlayerId); + if (itemId != 0) + legs = Item.GetItemById(itemId); + + itemId = Database.GetCompetitionGearFeetPeice(PlayerId); + if (itemId != 0) + feet = Item.GetItemById(itemId); + + } + public Item.ItemInformation Head + { + get + { + return head; + } + set + { + Database.SetCompetitionGearHeadPeice(playerId, value.Id); + head = value; + } + } + public Item.ItemInformation Body + { + get + { + return body; + } + set + { + Database.SetCompetitionGearBodyPeice(playerId, value.Id); + body = value; + } + } + public Item.ItemInformation Legs + { + get + { + return legs; + } + set + { + Database.SetCompetitionGearLegPeice(playerId, value.Id); + legs = value; + } + } + public Item.ItemInformation Feet + { + get + { + return feet; + } + set + { + Database.SetCompetitionGearFeetPeice(playerId, value.Id); + feet = value; + } + } + + + private Item.ItemInformation head; + private Item.ItemInformation body; + private Item.ItemInformation legs; + private Item.ItemInformation feet; + + } +} diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 8f22299..1be9750 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -6,13 +6,14 @@ namespace HISP.Player { class User { + public int Id; public string Username; public bool Administrator; public bool Moderator; public bool NewPlayer = false; public GameClient LoggedinClient; - + public CompetitionGear EquipedCompetitionGear; public bool MuteAds = false; public bool MuteGlobal = false; public bool MuteIsland = false; @@ -258,6 +259,9 @@ namespace HISP.Player NewPlayer = true; } + + EquipedCompetitionGear = new CompetitionGear(UserId); + Id = UserId; Username = Database.GetUsername(UserId); @@ -278,13 +282,14 @@ namespace HISP.Player subscribed = Database.IsUserSubscribed(UserId); subscribedUntil = Database.GetUserSubscriptionExpireDate(UserId); profilePage = Database.GetPlayerProfile(UserId); - Gender = Database.GetGender(UserId); MailBox = new Mailbox(this); + + // Generate SecCodes - + SecCodeSeeds[0] = (byte)GameServer.RandomNumberGenerator.Next(40, 60); SecCodeSeeds[1] = (byte)GameServer.RandomNumberGenerator.Next(40, 60); SecCodeSeeds[2] = (byte)GameServer.RandomNumberGenerator.Next(40, 60); diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs index fb9e86a..ec4f5ed 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs @@ -25,9 +25,11 @@ namespace HISP.Server string DroppedItems = "CREATE TABLE DroppedItems(X INT, Y INT, RandomID INT, ItemID INT, DespawnTimer INT)"; string TrackedQuest = "CREATE TABLE TrackedQuest(playerId INT, questId INT, timesCompleted INT)"; string OnlineUsers = "CREATE TABLE OnlineUsers(playerId INT, Admin TEXT(3), Moderator TEXT(3), Subscribed TEXT(3))"; + string CompetitionGear = "CREATE TABLE CompetitionGear(playerId INT, headItem INT, bodyItem INT, legItem INT, feetItem INT)"; string DeleteOnlineUsers = "DELETE FROM OnlineUsers"; + try { @@ -79,7 +81,6 @@ namespace HISP.Server Logger.WarnPrint(e.Message); }; - try { @@ -130,6 +131,20 @@ namespace HISP.Server { Logger.WarnPrint(e.Message); }; + + try + { + + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = CompetitionGear; + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + catch (Exception e) + { + Logger.WarnPrint(e.Message); + }; + try { @@ -297,6 +312,167 @@ namespace HISP.Server } } + public static bool HasCompetitionGear(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT COUNT(1) FROM competitionGear WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + + sqlCommand.Prepare(); + int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + return timesComplete > 0; + } + } + + public static void InitCompetitionGear(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "INSERT INTO competitionGear VALUES(@playerId,0,0,0,0)"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + + public static void SetCompetitionGearHeadPeice(int playerId, int itemId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE competitionGear SET headItem=@itemId WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@itemId", itemId); + + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static int GetCompetitionGearHeadPeice(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT headItem FROM competitionGear WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + return timesComplete; + } + } + + public static void SetCompetitionGearBodyPeice(int playerId, int itemId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE competitionGear SET bodyItem=@itemId WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@itemId", itemId); + + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static int GetCompetitionGearBodyPeice(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT bodyItem FROM competitionGear WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + return timesComplete; + } + } + + public static void SetCompetitionGearLegPeice(int playerId, int itemId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE competitionGear SET legItem=@itemId WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@itemId", itemId); + + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static int GetCompetitionGearLegPeice(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT legItem FROM competitionGear WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + return timesComplete; + } + } + + public static void SetCompetitionGearFeetPeice(int playerId, int itemId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE competitionGear SET feetItem=@itemId WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@itemId", itemId); + + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static int GetCompetitionGearFeetPeice(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT feetItem FROM competitionGear WHERE playerId=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + return timesComplete; + } + } + public static int GetTrackedQuestCompletedCount(int playerId, int questId) { if(CheckTrackeQuestExists(playerId,questId)) diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index af0b683..6de8764 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -537,6 +537,7 @@ namespace HISP.Server Messages.ItemThrowButton = gameData.messages.meta.inventory.item_throw_button; Messages.ItemConsumeButton = gameData.messages.meta.inventory.item_consume_button; Messages.ItemUseButton = gameData.messages.meta.inventory.item_use_button; + Messages.ItemWearButton = gameData.messages.meta.inventory.item_wear_button; Messages.ItemReadButton = gameData.messages.meta.inventory.item_read_button; Messages.ShopBuyButton = gameData.messages.meta.inventory.buy_button; @@ -585,6 +586,7 @@ namespace HISP.Server // Inventory Messages.DefaultInventoryMax = gameData.item.max_carryable; + Messages.EquipItemFormat = gameData.messages.meta.inventory.equip_format; // Click Messages.NothingInterestingHere = gameData.messages.click_nothing_message; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 043abac..e9ce69c 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -790,6 +790,90 @@ namespace HISP.Server } break; + case PacketBuilder.ITEM_WEAR: + const int MISC_FLAG_HEAD = 1; + const int MISC_FLAG_BODY = 2; + const int MISC_FLAG_LEGS = 3; + const int MISC_FLAG_FEET = 4; + + packetStr = Encoding.UTF8.GetString(packet); + randomIdStr = packetStr.Substring(2, packet.Length - 2); + randomId = 0; + + try + { + randomId = Int32.Parse(randomIdStr); + } + catch (InvalidOperationException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet."); + return; + } + if (sender.LoggedinUser.Inventory.HasItem(randomId)) + { + InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId); + ItemInstance instance = itm.ItemInstances[0]; + sender.LoggedinUser.Inventory.Remove(instance); + + Item.ItemInformation itemInf = instance.GetItemInfo(); + switch(itemInf.MiscFlags[0]) + { + case MISC_FLAG_HEAD: + if(sender.LoggedinUser.EquipedCompetitionGear.Head == null) + sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf; + else + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf; + } + break; + case MISC_FLAG_BODY: + if (sender.LoggedinUser.EquipedCompetitionGear.Body == null) + sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf; + else + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf; + } + break; + case MISC_FLAG_LEGS: + if (sender.LoggedinUser.EquipedCompetitionGear.Legs == null) + sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf; + else + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf; + } + break; + case MISC_FLAG_FEET: + if (sender.LoggedinUser.EquipedCompetitionGear.Feet == null) + sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf; + else + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf; + } + break; + } + + + + + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatEquipItemMessage(itemInf.Name), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(chatPacket); + UpdateInventory(sender); + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to wear an item they did not have."); + } + break; + + case PacketBuilder.ITEM_DROP: packetStr = Encoding.UTF8.GetString(packet); randomIdStr = packetStr.Substring(2, packet.Length - 2); diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index 848493d..c4085a1 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -29,6 +29,7 @@ namespace HISP.Server public const byte PACKET_KEEP_ALIVE = 0x7C; public const byte PACKET_PLAYER = 0x18; public const byte PACKET_INVENTORY = 0x17; + public const byte ITEM_WEAR = 0x46; public const byte PACKET_TRANSPORT = 0x29; public const byte PACKET_KICK = 0x80; public const byte PACKET_LEAVE = 0x7D;