From 0c99624f639976a2be0c3b6a02fad0ca1916b2e5 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Sun, 27 Dec 2020 12:36:57 +1300 Subject: [PATCH] add highscore recording. and money sec code. --- DataCollection/gamedata.json | 5 +- .../Horse Isle Server/Game/Messages.cs | 16 ++ .../Horse Isle Server.csproj | 1 + .../Horse Isle Server/Player/Highscore.cs | 31 ++++ .../Horse Isle Server/Player/User.cs | 1 - .../Horse Isle Server/Server/Database.cs | 103 ++++++++++- .../Horse Isle Server/Server/GameDataJson.cs | 5 +- .../Horse Isle Server/Server/GameServer.cs | 169 ++++++++++++++++-- .../Horse Isle Server/Server/PacketBuilder.cs | 4 + 9 files changed, 314 insertions(+), 21 deletions(-) create mode 100644 Horse Isle Server/Horse Isle Server/Player/Highscore.cs diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 8b53545..dee5886 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -21,7 +21,10 @@ }, "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%!" + "item_earned":"You Earned a %ITEM%!", + "money_earned":"You Earned $%MONEY%!", + "highscore_beaten":"You just beat your best score! New high score: %SCORE%.", + "best_time_beaten":"Your new best time: %TIME%." }, "dropped_items":{ "grab_message":"You grabbed an object off the ground.", diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 0790f85..e2c8bb0 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -190,6 +190,10 @@ namespace HISP.Game // Sec Codes public static string InvalidSecCodeError; public static string YouEarnedAnItemFormat; + public static string YouEarnedMoneyFormat; + public static string BeatHighscoreFormat; + public static string BeatBestTimeFormat; + // Meta public static string IsleFormat; @@ -225,6 +229,18 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + public static string FormatMoneyEarnedMessage(int money) + { + return YouEarnedMoneyFormat.Replace("%MONEY%", money.ToString("N0")); + } + public static string FormatTimeBeatenMessage(int time) + { + return BeatBestTimeFormat.Replace("%TIME%", time.ToString()); + } + public static string FormatHighscoreBeatenMessage(int score) + { + return BeatHighscoreFormat.Replace("%SCORE%", score.ToString()); + } public static string FormatQuestFooter(int totalQuestsComplete, int totalQuests, int questPoints, int totalQuestPoints) { return QuestFooterFormat.Replace("%TOTALCOMPLETED%", totalQuestsComplete.ToString("N0")).Replace("%TOTALQUESTS%", totalQuests.ToString("N0")).Replace("%TOTALPERCENT%", ((totalQuestsComplete / totalQuests) * 100).ToString()).Replace("%YOURQP%", questPoints.ToString("N0")).Replace("%YOURQP%", totalQuestPoints.ToString("N0")).Replace("%QPERCENT%", ((totalQuestsComplete / totalQuests) * 100).ToString()).Replace("%MAXQP%", totalQuestPoints.ToString("N0")); 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 0bf263e..4e97b61 100644 --- a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj +++ b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj @@ -83,6 +83,7 @@ + True True diff --git a/Horse Isle Server/Horse Isle Server/Player/Highscore.cs b/Horse Isle Server/Horse Isle Server/Player/Highscore.cs new file mode 100644 index 0000000..50caf9b --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Player/Highscore.cs @@ -0,0 +1,31 @@ +using HISP.Server; + + +namespace HISP.Player +{ + class Highscore + { + public static bool RegisterHighscore(int playerId, string gameTitle, int score, bool time) + { + bool isNewScore = true; + + if (!Database.PlayerHasHighscore(playerId, gameTitle)) + { + Database.AddNewHighscore(playerId, gameTitle, score, time ? "TIME" : "SCORE"); + return isNewScore; + } + else + { + int currentScore = Database.GetHighscore(playerId, gameTitle); + if (score < currentScore) + { + score = currentScore; + isNewScore = false; + } + + Database.UpdateHighscore(playerId, gameTitle, score); + return isNewScore; + } + } + } +} diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 6a2d093..d15b4d3 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -383,7 +383,6 @@ namespace HISP.Player SecCodeSeeds[2] = (byte)GameServer.RandomNumberGenerator.Next(40, 60); SecCodeInc = (byte)GameServer.RandomNumberGenerator.Next(40, 60); - // Make some friends! (Get a life!) Friends = new Friends(this); diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs index a49ef48..296014d 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs @@ -27,6 +27,7 @@ namespace HISP.Server 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 Jewelry = "CREATE TABLE Jewelry(playerId INT, slot1 INT, slot2 INT, slot3 INT, slot4 INT)"; + string Leaderboards = "CREATE TABLE Leaderboards(playerId INT, minigame TEXT(128), wins INT, looses INT, timesplayed INT, score INT, type TEXT(128))"; string DeleteOnlineUsers = "DELETE FROM OnlineUsers"; @@ -191,6 +192,20 @@ namespace HISP.Server { Logger.WarnPrint(e.Message); }; + + try + { + + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = Leaderboards; + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + catch (Exception e) + { + Logger.WarnPrint(e.Message); + }; + try { @@ -816,7 +831,7 @@ namespace HISP.Server db.Open(); MySqlCommand sqlCommand = db.CreateCommand(); - sqlCommand.CommandText = "UPDATE userExt SET FreeMinutes=FreeMinutes+@minutes"; + sqlCommand.CommandText = "UPDATE userExt SET FreeMinutes=FreeMinutes+@minutes WHERE NOT FreeMinutes+@minutes > 360"; sqlCommand.Parameters.AddWithValue("@minutes", minutes); sqlCommand.Prepare(); sqlCommand.ExecuteNonQuery(); @@ -1673,6 +1688,92 @@ namespace HISP.Server } } + public static bool PlayerHasHighscore(int playerId, string gameTitle) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "SELECT COUNT(1) FROM Leaderboards WHERE playerId=@playerId AND minigame=@gameTitle"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@gameTitle", gameTitle); + sqlCommand.Prepare(); + int count = Convert.ToInt32(sqlCommand.ExecuteScalar()); + + sqlCommand.Dispose(); + return count >= 1; + } + } + public static void AddNewHighscore(int playerId, string gameTitle, int score, string type) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "INSERT INTO Leaderboards VALUES(@playerId,@gameTitle,0,0,1,@score,@type)"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@gameTitle", gameTitle); + sqlCommand.Parameters.AddWithValue("@score", score); + sqlCommand.Parameters.AddWithValue("@type", type); + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + + sqlCommand.Dispose(); + return; + } + } + + public static int GetHighscore(int playerId, string gameTitle) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "SELECT score FROM Leaderboards WHERE playerId=@playerId AND minigame=@gameTitle"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@gameTitle", gameTitle); + sqlCommand.Prepare(); + int score = Convert.ToInt32(sqlCommand.ExecuteScalar()); + + sqlCommand.Dispose(); + return score; + } + } + public static void UpdateHighscore(int playerId, string gameTitle, int score) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "UPDATE Leaderboards SET score=@score, timesplayed=timesplayed+1 WHERE playerId=@playerId AND minigame=@gameTitle"; + sqlCommand.Parameters.AddWithValue("@playerId", playerId); + sqlCommand.Parameters.AddWithValue("@gameTitle", gameTitle); + sqlCommand.Parameters.AddWithValue("@score", score); + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + + sqlCommand.Dispose(); + return; + } + } + + + public static void IncPlayerTirednessForOfflineUsers() + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "UPDATE userext SET tiredness = tiredness + 1 WHERE id NOT IN (SELECT playerId FROM onlineusers) AND NOT tiredness +1 > 1000"; + sqlCommand.Prepare(); + sqlCommand.ExecuteNonQuery(); + + sqlCommand.Dispose(); + return; + } + } public static int GetPlayerTiredness(int userId) { diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index 13d564e..c63b615 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -356,7 +356,7 @@ namespace HISP.Server if (gameData.quest_list[i].chained_questid != null) quest.ChainedQuestId = gameData.quest_list[i].chained_questid; quest.Minigame = gameData.quest_list[i].minigame; - Logger.DebugPrint("Registered Quest: " + quest.Id); + Logger.DebugPrint("Registered Quest: " + quest.Id +" - "+ quest.Title); Quest.QuestList.Add(quest); } @@ -555,6 +555,9 @@ namespace HISP.Server Messages.InvalidSecCodeError = gameData.messages.sec_code.invalid_sec_code; Messages.YouEarnedAnItemFormat = gameData.messages.sec_code.item_earned; + Messages.YouEarnedMoneyFormat = gameData.messages.sec_code.money_earned; + Messages.BeatHighscoreFormat = gameData.messages.sec_code.highscore_beaten; + Messages.BeatBestTimeFormat = gameData.messages.sec_code.best_time_beaten; // Inventory diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 0f0ce05..4df020d 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -53,6 +53,7 @@ namespace HISP.Server { Database.IncAllUsersFreeTime(1); } + Database.IncPlayerTirednessForOfflineUsers(); DroppedItems.Update(); minuteTimer.Change(oneMinute, oneMinute); @@ -267,7 +268,7 @@ namespace HISP.Server } byte method = packet[1]; - if(method == PacketBuilder.PACKET_CLIENT_TERMINATOR) + if (method == PacketBuilder.PACKET_CLIENT_TERMINATOR) { UpdateStats(sender); } @@ -307,6 +308,130 @@ namespace HISP.Server UpdateArea(sender); UpdateUserInfo(sender.LoggedinUser); } + else if (method == PacketBuilder.SECCODE_SCORE || method == PacketBuilder.SECCODE_TIME) + { + bool time = (method == PacketBuilder.SECCODE_TIME); + + byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode(); + byte[] GotSecCode = new byte[4]; + Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length); + Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " ")); + if (ExpectedSecCode.SequenceEqual(GotSecCode)) + { + if (packet.Length < 6) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode score request with invalid size"); + return; + } + + string packetStr = Encoding.UTF8.GetString(packet); + string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2); + if(gameInfoStr.Contains("|")) + { + string[] gameInfo = gameInfoStr.Split('|'); + if(gameInfo.Length < 2) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid seccode score request"); + return; + } + + string gameTitle = gameInfo[0]; + string gameScoreStr = gameInfo[1]; + + int value = -1; + try + { + value = int.Parse(gameScoreStr); + } + catch (FormatException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid score value"); + return; + } + + bool newHighscore = Highscore.RegisterHighscore(sender.LoggedinUser.Id, gameTitle, value, time); + if (newHighscore && !time) + { + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatHighscoreBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(chatPacket); + } + else + { + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatTimeBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(chatPacket); + } + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score."); + return; + } + + } + else + { + byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(errorMessage); + Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code"); + return; + } + } + else if (method == PacketBuilder.SECCODE_MONEY) + { + + byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode(); + byte[] GotSecCode = new byte[4]; + Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length); + Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " ")); + if (ExpectedSecCode.SequenceEqual(GotSecCode)) + { + if (packet.Length < 6) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode money request with invalid size"); + return; + } + + string packetStr = Encoding.UTF8.GetString(packet); + string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2); + if (gameInfoStr.Contains("|")) + { + string[] moneyInfo = gameInfoStr.Split('|'); + if (moneyInfo.Length < 2) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid money score request"); + return; + } + + string id = moneyInfo[0]; // not sure what this is for? + + string moneyStr = moneyInfo[1]; + int value = -1; + try + { + value = int.Parse(moneyStr); + } + catch (FormatException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid money value"); + return; + } + + int moneyEarned = value * 10; + Logger.InfoPrint(sender.LoggedinUser.Username + " Earned $" + moneyEarned + " In: " + id); + + sender.LoggedinUser.Money += moneyEarned; + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatMoneyEarnedMessage(moneyEarned), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(chatPacket); + + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score."); + return; + } + + } + } else if (method == PacketBuilder.SECCODE_ITEM) { byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode(); @@ -315,6 +440,11 @@ namespace HISP.Server Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " ")); if (ExpectedSecCode.SequenceEqual(GotSecCode)) { + if (packet.Length < 6) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode item request with invalid size"); + return; + } string packetStr = Encoding.UTF8.GetString(packet); string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2); int value = -1; @@ -322,9 +452,9 @@ namespace HISP.Server { value = int.Parse(intStr); } - catch (InvalidOperationException) + catch (FormatException) { - Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value"); + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value"); return; } @@ -360,6 +490,11 @@ namespace HISP.Server Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " ")); if (ExpectedSecCode.SequenceEqual(GotSecCode)) { + if (packet.Length < 6) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode quest request with invalid size"); + return; + } string packetStr = Encoding.UTF8.GetString(packet); string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2); int value = -1; @@ -367,7 +502,7 @@ namespace HISP.Server { value = int.Parse(intStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value"); return; @@ -389,7 +524,7 @@ namespace HISP.Server } else { - byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError,PacketBuilder.CHAT_BOTTOM_RIGHT); + byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(errorMessage); Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code"); return; @@ -409,9 +544,9 @@ namespace HISP.Server User loggedInUser = sender.LoggedinUser; byte movementDirection = packet[1]; - if (loggedInUser.Thirst <= 25 || loggedInUser.Hunger == 25 || loggedInUser.Tiredness == 25) + if (loggedInUser.Thirst <= 25 || loggedInUser.Hunger <= 25 || loggedInUser.Tiredness <= 25) { - if (RandomNumberGenerator.Next(0, 15) == 10) + if (RandomNumberGenerator.Next(0, 10) == 7) { byte[] possibleDirections = new byte[] { PacketBuilder.MOVE_UP, PacketBuilder.MOVE_DOWN, PacketBuilder.MOVE_RIGHT, PacketBuilder.MOVE_LEFT }; @@ -600,7 +735,7 @@ namespace HISP.Server { chatId = int.Parse(number); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC with id that is NaN."); return; @@ -622,7 +757,7 @@ namespace HISP.Server { replyId = int.Parse(number); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to reply to an NPC with replyid that is NaN."); return; @@ -674,7 +809,7 @@ namespace HISP.Server { transportid = Int32.Parse(number); } - catch(InvalidOperationException) + catch(FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to use a transport with id that is NaN."); return; @@ -900,7 +1035,7 @@ namespace HISP.Server { randomId = Int32.Parse(randomIdStr); } - catch(InvalidOperationException) + catch(FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet."); return; @@ -1062,7 +1197,7 @@ namespace HISP.Server { randomId = Int32.Parse(randomIdStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet."); return; @@ -1183,7 +1318,7 @@ namespace HISP.Server { randomId = Int32.Parse(randomIdStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet."); return; @@ -1252,7 +1387,7 @@ namespace HISP.Server { randomId = Int32.Parse(randomIdStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet."); return; @@ -1276,7 +1411,7 @@ namespace HISP.Server { itemId = Int32.Parse(itemIdStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet."); return; @@ -1355,7 +1490,7 @@ namespace HISP.Server { itemId = Int32.Parse(itemIdStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy packet."); return; @@ -1473,7 +1608,7 @@ namespace HISP.Server { value = Int32.Parse(valueStr); } - catch (InvalidOperationException) + catch (FormatException) { Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet."); return; diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index ca3f2df..089a1fa 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_DYNAMIC_BUTTON = 0x45; public const byte PACKET_DYNAMIC_INPUT = 0x46; + public const byte PACKET_PLAYER = 0x18; public const byte PACKET_INVENTORY = 0x17; public const byte PACKET_TRANSPORT = 0x29; @@ -41,6 +42,9 @@ namespace HISP.Server public const byte SECCODE_QUEST = 0x32; public const byte SECCODE_ITEM = 0x28; + public const byte SECCODE_SCORE = 0x3D; + public const byte SECCODE_TIME = 0x3E; + public const byte SECCODE_MONEY = 0x1E; public const byte NPC_START_CHAT = 0x14; public const byte NPC_CONTINUE_CHAT = 0x15;