From abb90f5865e9420f1be9c4e817b225ed547f6625 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Tue, 22 Dec 2020 15:01:34 +1300 Subject: [PATCH] Add basic stats menu support --- DataCollection/gamedata.json | 27 +++++- .../Horse Isle Server/Game/Messages.cs | 85 +++++++++++++++++++ .../Horse Isle Server/Game/Meta.cs | 46 +++++++++- .../Horse Isle Server/Player/User.cs | 33 ++++++- .../Horse Isle Server/Server/Database.cs | 78 +++++++++++++++++ .../Horse Isle Server/Server/GameClient.cs | 2 +- .../Horse Isle Server/Server/GameDataJson.cs | 30 +++++++ .../Horse Isle Server/Server/GameServer.cs | 21 +++++ .../Horse Isle Server/Server/PacketBuilder.cs | 4 +- 9 files changed, 315 insertions(+), 11 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 94ea8b5..f6aaf77 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -82,18 +82,39 @@ "stats_money_format":"
Money: $%MONEY%", "stats_freetime_format":"
Today's Free Time Remaining: %FREEMINUTES% minutes.", "stats_description_format":"
Description: %PLAYERDESC%", - "stats_experience":"
^HExperience: %EXPERIENCE%", + "stats_experience":"
^HExperience: %EXPPOINTS%", "stats_questpoints":"
Quest Points: %QUESTPOINTS%", "stats_hunger":"
Hunger: %HUNGER%", "stats_thisrt":"
Thirst: %THIRST%", "stats_tiredness":"
Tiredness: %TIRED%", "stats_gender":"
Gender: %GENDER%", "stats_equipped":"
%JEWELFORMAT%", - "stats_competion_gear":"
%GEARFORMAT%" + "stats_competion_gear":"
%GEARFORMAT%", + + "stats_private_notes":"^R1^R1^T5Horse Isle Private Notes:^D21|VIEW NOTES^R1", + "stats_quests":"^T5Horse Isle Adventures and Quests:^D3|VIEW LOG^R1", + "stats_minigame_ranking":"^T5Horse Isle Mini-Game Rankings:^D20|VIEW LIST^R1", + "stats_awards":"^T5Your Horse Isle Awards:^D24|VIEW AWARDS^R1", + "stats_misc":"^T5Your Horse Isle Misc Tracked Stats:^D53|VIEW STATS^R1", + "competition_gear":{ + "head_format":"^R1^I%ICON%^T7%ITEM% on your head.^B4X1", + "body_format":"^R1^I%ICON%^T7%ITEM% on your body.^B4X2", + "legs_format":"^R1^I%ICON%^T7%ITEM% on your legs.^B4X3", + "feet_format":"^R1^I%ICON%^T7%ITEM% on your feet.^B4X4" + }, "msg":{ "no_jewelry_equipped":"You have no Jewelry on.", "no_competition_gear":"^LYou have nothing interesting for special competition gear.", - } + "competition_gear_selected":"^LYou have the following selected for competition gear:", + + "really_hungry":"really hungry", + "hungry":"hungry", + "tiny_bit_thirsty":"a tiny bit thirsty", + "little_bit_thirsty":"a little bit thirsty", + "kind_of_thirsty":"kind of thirsty", + "tiny_bit_tired":"a tiny bit tired", + "not_at_all_tired":"not at all tired" + }, }, "shop":{ "selling":"^LThings I am selling:", diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 4a97a6f..5cc3735 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -13,6 +13,35 @@ namespace HISP.Game public static string RakeNothing; public static string ShovelNothing; + // Stats Page + public static string StatsBarFormat; + public static string StatsAreaFormat; + public static string StatsMoneyFormat; + public static string StatsFreeTimeFormat; + public static string StatsDescriptionFormat; + public static string StatsExpFormat; + public static string StatsQuestpointsFormat; + public static string StatsHungerFormat; + public static string StatsThirstFormat; + public static string StatsTiredFormat; + public static string StatsGenderFormat; + public static string StatsJewelFormat; + public static string StatsCompetitionGearFormat; + + public static string CompetitionGearHeadFormat; + public static string CompetitionGearBodyFormat; + public static string CompetitionGearLegsFormat; + public static string CompetitionGearFeetFormat; + + public static string StatsPrivateNotes; + public static string StatsQuests; + public static string StatsMinigameRanking; + public static string StatsAwards; + public static string StatsMisc; + + public static string NoJewerlyEquipped; + public static string NoCompetitionGear; + // Announcements public static string NewUserMessage; public static string WelcomeFormat; @@ -156,6 +185,62 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + public static string FormatStatsBar(string username) + { + return StatsBarFormat.Replace("%USERNAME%", username); + } + public static string FormatStatsArea(string area) + { + return StatsAreaFormat.Replace("%AREA%", area); + } + public static string FormatMoneyStat(int money) + { + return StatsMoneyFormat.Replace("%MONEY%", money.ToString("N0")); + } + public static string FormatFreeTime(int freeMinutes) + { + return StatsFreeTimeFormat.Replace("%FREEMINUTES%", freeMinutes.ToString("N0")); + } + public static string FormatPlayerDescriptionForStatsMenu(string description) + { + return StatsDescriptionFormat.Replace("%PLAYERDESC%", description); + } + + public static string FormatExperience(int expPoints) + { + return StatsExpFormat.Replace("%EXPPOINTS%", expPoints.ToString("N0")); + } + public static string FormatQuestPoints(int questPoints) + { + return StatsQuestpointsFormat.Replace("%QUESTPOINTS%", questPoints.ToString("N0")); + } + public static string FormatHungryStat(string status) + { + return StatsHungerFormat.Replace("%HUNGER%", status); + } + public static string FormatThirstStat(string status) + { + return StatsThirstFormat.Replace("%THIRST%", status); + } + public static string FormatTiredStat(string status) + { + return StatsTiredFormat.Replace("%TIRED%", status); + } + public static string FormatGenderStat(string gender) + { + return StatsGenderFormat.Replace("%GENDER%", gender); + } + public static string FormatJewelryStat(string jewelformat) + { + return StatsJewelFormat.Replace("%JEWELFORMAT%", jewelformat); + } + public static string FormatCompetitionGearStat(string competitonGearFormat) + { + return StatsCompetitionGearFormat.Replace("%GEARFORMAT%", competitonGearFormat); + } + + + public static string FormatYouEarnedAnItemMessage(string itemName) { return YouEarnedAnItemFormat.Replace("%ITEM%", itemName); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index ed2372b..8b0718f 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -8,6 +8,13 @@ namespace HISP.Game // Meta private static string buildLocationString(int x, int y) + { + string areaString = buildAreaString(x, y); + if (areaString != "") + areaString = Messages.LocationFormat.Replace("%META%", areaString); + return areaString; + } + private static string buildAreaString(int x, int y) { string locationString = ""; @@ -17,8 +24,6 @@ namespace HISP.Game locationString += Messages.TownFormat.Replace("%TOWN%", World.GetTown(x, y).Name); if (World.InIsle(x, y)) locationString += Messages.IsleFormat.Replace("%ISLE%", World.GetIsle(x, y).Name); - if (locationString != "") - locationString = Messages.LocationFormat.Replace("%META%", locationString); return locationString; } @@ -212,6 +217,43 @@ namespace HISP.Game } return message; } + public static string BuildWornJewelery(User user) + { + return Messages.NoJewerlyEquipped; + } + public static string BuildWornCompaionEquip(User user) + { + return Messages.NoCompetitionGear; + } + public static string BuildStatsMenu(User user) + { + string message = Messages.FormatStatsBar(user.Username); + + string areaString = buildAreaString(user.X, user.Y); + if (areaString != "") + message += Messages.FormatStatsArea(areaString); + message += Messages.FormatMoneyStat(user.Money); + if(!user.Subscribed) + message += Messages.FormatFreeTime(user.FreeMinutes); + message += Messages.FormatPlayerDescriptionForStatsMenu(user.ProfilePage); + message += Messages.FormatExperience(user.Experience); + message += Messages.FormatHungryStat("Not implemented yet :3"); + message += Messages.FormatThirstStat("Not implemented yet :3"); + message += Messages.FormatTiredStat("Not implemented yet :3"); + message += Messages.FormatGenderStat(user.Gender); + message += Messages.FormatJewelryStat(BuildWornJewelery(user)); + message += Messages.FormatCompetitionGearStat(BuildWornCompaionEquip(user)); + message += Messages.StatsPrivateNotes; + message += Messages.StatsQuests; + message += Messages.StatsMinigameRanking; + message += Messages.StatsAwards; + message += Messages.StatsMisc; + + message += Messages.BackToMap; + message += Messages.MetaTerminator; + + return message; + } public static string BuildSpecialTileInfo(User user, World.SpecialTile specialTile) { string message = ""; diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 6acdcc7..a2ac884 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -23,10 +23,9 @@ namespace HISP.Player public bool MuteBuddyRequests = false; public bool MuteSocials = false; public bool MuteLogins = false; - + public string Gender; public bool MetaPriority = false; - public int Facing; public Mailbox MailBox; public Friends Friends; @@ -35,6 +34,18 @@ namespace HISP.Player public Npc.NpcEntry LastTalkedToNpc; public Shop LastShoppedAt; public PlayerQuests Quests; + public int FreeMinutes + { + get + { + return freeMinutes; + } + set + { + Database.SetFreeTime(Id, value); + freeMinutes = value; + } + } public bool Subscribed { get @@ -108,6 +119,18 @@ namespace HISP.Player } } + public int Experience + { + get + { + return experience; + } + set + { + Database.SetExperience(Id, value); + experience = value; + } + } public int QuestPoints { get @@ -182,8 +205,10 @@ namespace HISP.Player private bool stealth = false; private int y; private int money; + private int freeMinutes; private int questPoints; private int bankMoney; + private int experience; public byte[] SecCodeSeeds = new byte[3]; public int SecCodeInc = 0; @@ -242,7 +267,8 @@ namespace HISP.Player charId = Database.GetPlayerCharId(UserId); Facing = PacketBuilder.DIRECTION_DOWN; - + freeMinutes = Database.GetFreeTime(UserId); + experience = Database.GetExperience(UserId); money = Database.GetPlayerMoney(UserId); bankMoney = Database.GetPlayerBankMoney(UserId); questPoints = Database.GetPlayerQuestPoints(UserId); @@ -250,6 +276,7 @@ namespace HISP.Player subscribedUntil = Database.GetUserSubscriptionExpireDate(UserId); profilePage = Database.GetPlayerProfile(UserId); + Gender = Database.GetGender(UserId); MailBox = new Mailbox(this); // Generate SecCodes diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs index f65e3e4..fb9e86a 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs @@ -407,6 +407,84 @@ namespace HISP.Server return subscribed; } } + public static string GetGender(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT Gender FROM users WHERE Id=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + string gender = (string)(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + + return gender; + } + } + public static int GetExperience(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT Experience FROM userExt WHERE Id=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int xp = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + + return xp; + } + } + public static void SetExperience(int playerId, int exp) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE userExt SET Experience=@xp WHERE Id=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@xp", exp); + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static void SetFreeTime(int playerId, int minutes) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "UPDATE userExt SET FreeMinutes=@minutes WHERE Id=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@minutes", minutes); + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static int GetFreeTime(int playerId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + + sqlCommand.CommandText = "SELECT FreeMinutes FROM userExt WHERE Id=@playerId"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Prepare(); + int freeMinutes = Convert.ToInt32(sqlCommand.ExecuteScalar()); + sqlCommand.Dispose(); + + return freeMinutes; + } + } public static int GetUserSubscriptionExpireDate(int playerId) { using (MySqlConnection db = new MySqlConnection(ConnectionString)) diff --git a/Horse Isle Server/Horse Isle Server/Server/GameClient.cs b/Horse Isle Server/Horse Isle Server/Server/GameClient.cs index 56da355..7866800 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameClient.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameClient.cs @@ -162,7 +162,7 @@ namespace HISP.Server case PacketBuilder.PACKET_MOVE: GameServer.OnMovementPacket(this, Packet); break; - case PacketBuilder.PACKET_PROFILE: + case PacketBuilder.PACKET_PLAYER: GameServer.OnProfilePacket(this, Packet); break; case PacketBuilder.PACKET_CHAT: diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index 3e418b9..af0b683 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -391,6 +391,36 @@ namespace HISP.Server Messages.LoginMessageForamt = gameData.messages.login_format; Messages.LogoutMessageFormat = gameData.messages.logout_format; + // Stats + Messages.StatsBarFormat = gameData.messages.meta.stats_page.stats_bar_format; + Messages.StatsAreaFormat = gameData.messages.meta.stats_page.stats_area_format; + Messages.StatsMoneyFormat = gameData.messages.meta.stats_page.stats_money_format; + Messages.StatsFreeTimeFormat = gameData.messages.meta.stats_page.stats_freetime_format; + Messages.StatsDescriptionFormat = gameData.messages.meta.stats_page.stats_description_format; + Messages.StatsExpFormat = gameData.messages.meta.stats_page.stats_experience; + Messages.StatsQuestpointsFormat = gameData.messages.meta.stats_page.stats_questpoints; + Messages.StatsHungerFormat = gameData.messages.meta.stats_page.stats_hunger; + Messages.StatsThirstFormat = gameData.messages.meta.stats_page.stats_thisrt; + Messages.StatsTiredFormat = gameData.messages.meta.stats_page.stats_tiredness; + Messages.StatsGenderFormat = gameData.messages.meta.stats_page.stats_gender; + Messages.StatsJewelFormat = gameData.messages.meta.stats_page.stats_equipped; + Messages.StatsCompetitionGearFormat = gameData.messages.meta.stats_page.stats_competion_gear; + + Messages.CompetitionGearHeadFormat = gameData.messages.meta.stats_page.competition_gear.head_format; + Messages.CompetitionGearBodyFormat = gameData.messages.meta.stats_page.competition_gear.body_format; + Messages.CompetitionGearLegsFormat = gameData.messages.meta.stats_page.competition_gear.legs_format; + Messages.CompetitionGearFeetFormat = gameData.messages.meta.stats_page.competition_gear.feet_format; + + Messages.StatsPrivateNotes = gameData.messages.meta.stats_page.stats_private_notes; + Messages.StatsQuests = gameData.messages.meta.stats_page.stats_quests; + Messages.StatsMinigameRanking = gameData.messages.meta.stats_page.stats_minigame_ranking; + Messages.StatsAwards = gameData.messages.meta.stats_page.stats_awards; + Messages.StatsMisc = gameData.messages.meta.stats_page.stats_misc; + + + Messages.NoJewerlyEquipped = gameData.messages.meta.stats_page.msg.no_jewelry_equipped; + Messages.NoCompetitionGear = gameData.messages.meta.stats_page.msg.no_competition_gear; + // Transport Messages.CantAffordTransport = gameData.messages.transport.not_enough_money; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 767f439..043abac 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -133,6 +133,21 @@ namespace HISP.Server Logger.DebugPrint("Sending " + sender.LoggedinUser.Username + " updated info..."); UpdatePlayer(sender); } + } + public static void OnStatsPacket(GameClient sender, byte[] packet) + { + if(!sender.LoggedIn) + { + Logger.ErrorPrint(sender.RemoteIp + " Requested stats when not logged in."); + return; + } + if(packet.Length < 3) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent an invalid Stats Packet"); + return; + } + + } public static void OnProfilePacket(GameClient sender, byte[] packet) { @@ -148,6 +163,12 @@ 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); + } if (method == PacketBuilder.VIEW_PROFILE) { sender.LoggedinUser.MetaPriority = true; diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index 5452a73..848493d 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -27,7 +27,7 @@ namespace HISP.Server public const byte PACKET_TILE_FLAGS = 0x75; public const byte PACKET_PLAYSOUND = 0x23; public const byte PACKET_KEEP_ALIVE = 0x7C; - public const byte PACKET_PROFILE = 0x18; + public const byte PACKET_PLAYER = 0x18; public const byte PACKET_INVENTORY = 0x17; public const byte PACKET_TRANSPORT = 0x29; public const byte PACKET_KICK = 0x80; @@ -179,7 +179,7 @@ namespace HISP.Server { MemoryStream ms = new MemoryStream(); - ms.WriteByte(PACKET_PROFILE); + ms.WriteByte(PACKET_PLAYER); byte[] strBytes = Encoding.UTF8.GetBytes(userProfile); ms.Write(strBytes, 0x00, strBytes.Length);