From 10b768e82e8f016e0b88f770e2fdcd5a2fd4727c Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Wed, 23 Dec 2020 02:33:14 +1300 Subject: [PATCH] Add equip / remove equp options for CompetitionGear --- DataCollection/gamedata.json | 5 +- .../Horse Isle Server/Game/Messages.cs | 22 ++++- .../Horse Isle Server/Game/Meta.cs | 20 ++++- .../Player/CompetitionGear.cs | 29 ++++++ .../Horse Isle Server/Player/User.cs | 2 +- .../Horse Isle Server/Server/Database.cs | 4 +- .../Horse Isle Server/Server/GameDataJson.cs | 7 +- .../Horse Isle Server/Server/GameServer.cs | 90 ++++++++++++++++--- .../Horse Isle Server/Server/PacketBuilder.cs | 3 +- 9 files changed, 160 insertions(+), 22 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 79e2d83..a1a9da1 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -10,6 +10,10 @@ "drawing_notice":"Drawing not sent to other players when you are not a subscriber.", "click_nothing_message":"Nothing interesting here...", "playtime_timeout":"You have run out of playtime for now. In one minute you will be disconnected. You gain one minute of playtime every 8 minutes. Please come back later!", + "competition_gear":{ + "removed_competition_gear":"You removed selected competition gear.", + "equip_competition_gear_format":"The %ITEM% are now selected as competition gear." + }, "sec_code":{ "invalid_sec_code":"Data Code Error. You did not get the bonus. You should reconnect if you get this message again.", "item_earned":"You Earned a %ITEM%!" @@ -138,7 +142,6 @@ "npc_talk_button":"^BA%ID%" }, "inventory":{ - "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%", diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index dd93537..263b1e5 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -41,6 +41,7 @@ namespace HISP.Game public static string NoJewerlyEquipped; public static string NoCompetitionGear; + public static string CompetitionGearSelected; // Announcements public static string NewUserMessage; @@ -105,9 +106,12 @@ namespace HISP.Game public static string ItemInformationFormat; + // Competition Gear + public static string EquipItemFormat; + public static string UnequipItem; + // Inventory public static string InventoryItemFormat; - public static string EquipItemFormat; public static string InventoryHeaderFormat; public static string ItemDropButton; @@ -188,6 +192,22 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + public static string FormatCompetitionGearHead(string itemName, int icon) + { + return CompetitionGearHeadFormat.Replace("%ITEM%", itemName).Replace("%ICON%",icon.ToString()); + } + public static string FormatCompetitionGearBody(string itemName, int icon) + { + return CompetitionGearBodyFormat.Replace("%ITEM%", itemName).Replace("%ICON%", icon.ToString()); + } + public static string FormatCompetitionGearLegs(string itemName, int icon) + { + return CompetitionGearLegsFormat.Replace("%ITEM%", itemName).Replace("%ICON%", icon.ToString()); + } + public static string FormatCompetitionGearFeet(string itemName, int icon) + { + return CompetitionGearFeetFormat.Replace("%ITEM%", itemName).Replace("%ICON%", icon.ToString()); + } public static string FormatStatsBar(string username) { return StatsBarFormat.Replace("%USERNAME%", username); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index 98f329f..5277593 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -221,9 +221,23 @@ namespace HISP.Game { return Messages.NoJewerlyEquipped; } - public static string BuildWornCompaionEquip(User user) + public static string BuildEquippedCompetitionGear(User user) { - return Messages.NoCompetitionGear; + string message = Messages.CompetitionGearSelected; + if (user.EquipedCompetitionGear.Head != null) + message += Messages.FormatCompetitionGearHead(user.EquipedCompetitionGear.Head.Name, user.EquipedCompetitionGear.Head.IconId); + if (user.EquipedCompetitionGear.Body != null) + message += Messages.FormatCompetitionGearBody(user.EquipedCompetitionGear.Body.Name, user.EquipedCompetitionGear.Body.IconId); + if (user.EquipedCompetitionGear.Legs != null) + message += Messages.FormatCompetitionGearLegs(user.EquipedCompetitionGear.Legs.Name, user.EquipedCompetitionGear.Legs.IconId); + if (user.EquipedCompetitionGear.Feet != null) + message += Messages.FormatCompetitionGearFeet(user.EquipedCompetitionGear.Feet.Name, user.EquipedCompetitionGear.Feet.IconId); + + if (message == Messages.CompetitionGearSelected) + message = Messages.NoCompetitionGear; + + return message; + } public static string BuildStatsMenu(User user) { @@ -242,7 +256,7 @@ namespace HISP.Game message += Messages.FormatTiredStat("Not implemented yet :3"); message += Messages.FormatGenderStat(user.Gender); message += Messages.FormatJewelryStat(BuildWornJewelery(user)); - message += Messages.FormatCompetitionGearStat(BuildWornCompaionEquip(user)); + message += Messages.FormatCompetitionGearStat(BuildEquippedCompetitionGear(user)); message += Messages.StatsPrivateNotes; message += Messages.StatsQuests; message += Messages.StatsMinigameRanking; diff --git a/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs index b9a7ccb..5665268 100644 --- a/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs +++ b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs @@ -10,6 +10,11 @@ namespace HISP.Player { class CompetitionGear { + public const int MISC_FLAG_HEAD = 1; + public const int MISC_FLAG_BODY = 2; + public const int MISC_FLAG_LEGS = 3; + public const int MISC_FLAG_FEET = 4; + private int playerId; public CompetitionGear(int PlayerId) { @@ -41,6 +46,12 @@ namespace HISP.Player } set { + if (value == null) + { + head = null; + Database.SetCompetitionGearHeadPeice(playerId, 0); + return; + } Database.SetCompetitionGearHeadPeice(playerId, value.Id); head = value; } @@ -53,6 +64,12 @@ namespace HISP.Player } set { + if (value == null) + { + body = null; + Database.SetCompetitionGearBodyPeice(playerId, 0); + return; + } Database.SetCompetitionGearBodyPeice(playerId, value.Id); body = value; } @@ -65,6 +82,12 @@ namespace HISP.Player } set { + if (value == null) + { + legs = null; + Database.SetCompetitionGearLegPeice(playerId, 0); + return; + } Database.SetCompetitionGearLegPeice(playerId, value.Id); legs = value; } @@ -77,6 +100,12 @@ namespace HISP.Player } set { + if (value == null) + { + feet = null; + Database.SetCompetitionGearFeetPeice(playerId, 0); + return; + } Database.SetCompetitionGearFeetPeice(playerId, value.Id); feet = value; } diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 62dc7d0..a3dd432 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -56,7 +56,7 @@ namespace HISP.Player return true; int Timestamp = Convert.ToInt32(new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()); - if(Timestamp > subscribedUntil) // sub expired. + if(Timestamp > subscribedUntil && subscribed) // sub expired. { Logger.InfoPrint(Username + "'s Subscription expired. (timestamp now: " + Timestamp + " exp date: " + subscribedUntil+" )"); Database.SetUserSubscriptionStatus(this.Id, false); diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs index ec4f5ed..3c71ec8 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs @@ -593,7 +593,7 @@ namespace HISP.Server sqlCommand.CommandText = "SELECT Gender FROM users WHERE Id=@playerId"; sqlCommand.Parameters.AddWithValue("@playerId", playerId); sqlCommand.Prepare(); - string gender = (string)(sqlCommand.ExecuteScalar()); + string gender = sqlCommand.ExecuteScalar().ToString(); sqlCommand.Dispose(); return gender; @@ -687,7 +687,7 @@ namespace HISP.Server sqlCommand.CommandText = "SELECT Subscriber FROM userExt WHERE Id=@playerId"; sqlCommand.Parameters.AddWithValue("@playerId", playerId); sqlCommand.Prepare(); - bool subscribed = (string)(sqlCommand.ExecuteScalar()) == "YES"; + bool subscribed = sqlCommand.ExecuteScalar().ToString() == "YES"; sqlCommand.Dispose(); return subscribed; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index 5faed57..9de8646 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -421,6 +421,7 @@ namespace HISP.Server Messages.NoJewerlyEquipped = gameData.messages.meta.stats_page.msg.no_jewelry_equipped; Messages.NoCompetitionGear = gameData.messages.meta.stats_page.msg.no_competition_gear; + Messages.CompetitionGearSelected = gameData.messages.meta.stats_page.msg.competition_gear_selected; // Transport @@ -588,7 +589,11 @@ namespace HISP.Server // Inventory Messages.DefaultInventoryMax = gameData.item.max_carryable; - Messages.EquipItemFormat = gameData.messages.meta.inventory.equip_format; + + // Competition Gear + + Messages.EquipItemFormat = gameData.messages.competition_gear.equip_competition_gear_format; + Messages.UnequipItem = gameData.messages.competition_gear.removed_competition_gear; // 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 f2e1a7f..cbd5304 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -166,9 +166,7 @@ namespace HISP.Server byte method = packet[1]; if(method == PacketBuilder.PACKET_CLIENT_TERMINATOR) { - string metaWind = Meta.BuildStatsMenu(sender.LoggedinUser); - byte[] statsPacket = PacketBuilder.CreateMetaPacket(metaWind); - sender.SendPacket(statsPacket); + UpdateStats(sender); } if (method == PacketBuilder.VIEW_PROFILE) { @@ -796,13 +794,69 @@ namespace HISP.Server return; } + break; + case PacketBuilder.ITEM_REMOVE: + char toRemove = (char)packet[2]; + switch(toRemove) + { + case '1': + if(sender.LoggedinUser.EquipedCompetitionGear.Head != null) + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Head = null; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped."); + } + break; + case '2': + if (sender.LoggedinUser.EquipedCompetitionGear.Body != null) + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Body = null; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped."); + } + break; + case '3': + if (sender.LoggedinUser.EquipedCompetitionGear.Legs != null) + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Legs = null; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped."); + } + break; + case '4': + if (sender.LoggedinUser.EquipedCompetitionGear.Feet != null) + { + ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id); + sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance); + sender.LoggedinUser.EquipedCompetitionGear.Feet = null; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped."); + } + break; + default: + Logger.InfoPrint(sender.LoggedinUser.Username + "Unimplemented \"remove worn item\" ItemInteraction packet: " + BitConverter.ToString(packet).Replace("-", " ")); + break; + } + + byte[] itemRemovedMessage = PacketBuilder.CreateChat(Messages.UnequipItem, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(itemRemovedMessage); + UpdateStats(sender); 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; @@ -829,7 +883,7 @@ namespace HISP.Server } switch(itemInf.MiscFlags[0]) { - case MISC_FLAG_HEAD: + case CompetitionGear.MISC_FLAG_HEAD: if(sender.LoggedinUser.EquipedCompetitionGear.Head == null) sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf; else @@ -839,7 +893,7 @@ namespace HISP.Server sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf; } break; - case MISC_FLAG_BODY: + case CompetitionGear.MISC_FLAG_BODY: if (sender.LoggedinUser.EquipedCompetitionGear.Body == null) sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf; else @@ -849,7 +903,7 @@ namespace HISP.Server sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf; } break; - case MISC_FLAG_LEGS: + case CompetitionGear.MISC_FLAG_LEGS: if (sender.LoggedinUser.EquipedCompetitionGear.Legs == null) sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf; else @@ -859,7 +913,7 @@ namespace HISP.Server sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf; } break; - case MISC_FLAG_FEET: + case CompetitionGear.MISC_FLAG_FEET: if (sender.LoggedinUser.EquipedCompetitionGear.Feet == null) sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf; else @@ -1428,6 +1482,7 @@ namespace HISP.Server } return count; } + public static int GetNumberOfAdminsOnline() { int count = 0; @@ -1539,6 +1594,17 @@ namespace HISP.Server forClient.SendPacket(AreaMessage); forClient.LoggedinUser.MetaPriority = false; + } + public static void UpdateStats(GameClient client) + { + if (!client.LoggedIn) + return; + + client.LoggedinUser.MetaPriority = true; + string metaWind = Meta.BuildStatsMenu(client.LoggedinUser); + byte[] statsPacket = PacketBuilder.CreateMetaPacket(metaWind); + client.SendPacket(statsPacket); + } /* diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index c4085a1..cf68eaa 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -29,7 +29,6 @@ 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; @@ -78,6 +77,8 @@ namespace HISP.Server public const byte ITEM_BUY_25 = 0x37; public const byte ITEM_SELL = 0x3C; public const byte ITEM_SELL_ALL = 0x3D; + public const byte ITEM_WEAR = 0x46; + public const byte ITEM_REMOVE = 0x47; public const byte ITEM_BINOCULARS = 0x5C; public const byte ITEM_MAGNIFYING = 0x5D; public const byte ITEM_RAKE = 0x5B;