From 4c7a9c8ed1deccfbf478914e76a43495e3f1923a Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Sat, 2 Jan 2021 12:40:57 +1300 Subject: [PATCH] Implement password tiles & venus fly trap in jungle isle. --- DataCollection/Useful Info/bank_tests.txt | 5 +- DataCollection/gamedata.json | 2 + .../Horse Isle Server/Game/Messages.cs | 8 +- .../Horse Isle Server/Game/Meta.cs | 22 ++- .../Horse Isle Server/Game/Quest.cs | 181 ++++++++++-------- .../Horse Isle Server/Server/GameDataJson.cs | 3 + .../Horse Isle Server/Server/GameServer.cs | 49 +++++ 7 files changed, 181 insertions(+), 89 deletions(-) diff --git a/DataCollection/Useful Info/bank_tests.txt b/DataCollection/Useful Info/bank_tests.txt index 31ac17b..d0cf58f 100644 --- a/DataCollection/Useful Info/bank_tests.txt +++ b/DataCollection/Useful Info/bank_tests.txt @@ -1 +1,4 @@ -bank total @ 1/01/2021 : 14,961 \ No newline at end of file +bank total @ 1/01/2021 : 14,961 +bank total @ 1/01/2021 : 15,070 + +You made $108 in interest since your last visit. \ No newline at end of file diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 055447a..69da4b1 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -127,6 +127,8 @@ "back_to_map":"^M", "long_full_line":"^L", "fountain":"Although it's not recommended, you could drink from this fountain if you are thirsty...^T6Drink from the public fountain. ^B1D^R1^X^Z", + "venus_flytrap_format":"The Giant Venus Flytrap chomped at you!
OUCH!!
It chomped your pocket, taking $%MONEY% with it!!", + "password_input":"
^PLReply:|^PS14|ANSWER^R1", "bank":{ "made_interest":"^LYou made $%MONEY% in interest since your last visit.^R1", "carrying_message":"^L(You are carrying $%MONEY% and have $%BANKMONEY% in the bank.)^R1", diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 10582f9..2380df9 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -296,7 +296,9 @@ namespace HISP.Game public static string TileFormat; public static string Seperator; - + public static string VenusFlyTrapFormat; + public static string PasswordEntry; + public static string ExitThisPlace; public static string BackToMap; public static string LongFullLine; @@ -329,6 +331,10 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + public static string FormatVenusFlyTrapMeta(int money) + { + return VenusFlyTrapFormat.Replace("%MONEY%", money.ToString("N0")); + } public static string FormatBankIntrestMadeMeta(UInt64 intrestMade) { return BankMadeInIntrestFormat.Replace("%MONEY%", intrestMade.ToString("N0")); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index f5c2f71..a885a02 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -252,7 +252,14 @@ namespace HISP.Game } return message; } - + public static string buildVenusFlyTrap(User user) + { + int moneyLost = GameServer.RandomNumberGenerator.Next(0, 100); + if (moneyLost > user.Money) + moneyLost = user.Money; + user.Money -= moneyLost; + return Messages.FormatVenusFlyTrapMeta(moneyLost); + } public static string buildInn(Inn inn) { string message = Messages.InnBuyMeal; @@ -593,7 +600,10 @@ namespace HISP.Game { return Messages.FountainMeta; } - + private static string buildPassword() + { + return Messages.PasswordEntry + Messages.ExitThisPlace + Messages.MetaTerminator; + } private static string buildBank(User user) { double moneyMade = 0; @@ -686,6 +696,14 @@ namespace HISP.Game { message += buildWishingWell(user); } + if(TileCode == "VENUSFLYTRAP") + { + message += buildVenusFlyTrap(user); + } + if(TileCode == "PASSWORD") + { + message += buildPassword(); + } if(TileCode == "INN") { int InnID = int.Parse(TileArg); diff --git a/Horse Isle Server/Horse Isle Server/Game/Quest.cs b/Horse Isle Server/Horse Isle Server/Game/Quest.cs index 29a5348..9478a22 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Quest.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Quest.cs @@ -23,7 +23,7 @@ namespace HISP.Game { public string Type; public int ActivateX; - public int ActivateY; + public int ActivateY; } public struct QuestEntry { @@ -66,7 +66,7 @@ namespace HISP.Game { int totalQp = 0; QuestEntry[] quests = GetPublicQuestList(); - foreach(QuestEntry quest in quests) + foreach (QuestEntry quest in quests) { totalQp += quest.QuestPointsEarned; } @@ -107,8 +107,8 @@ namespace HISP.Game // Has completed other required quests? foreach (int questId in quest.RequiresQuestIdCompleted) - if (user.Quests.GetTrackedQuestAmount(quest.Id) < 1) - return false; + if (user.Quests.GetTrackedQuestAmount(quest.Id) < 1) + return false; // Has NOT competed other MUST NOT BE required quests foreach (int questId in quest.RequiresQuestIdNotCompleted) @@ -117,12 +117,12 @@ namespace HISP.Game // Has allready tracked this quest? if (user.Quests.GetTrackedQuestAmount(quest.Id) >= quest.MaxRepeats) - return false; + return false; } // Check if user has award unlocked - if(quest.AwardRequired != 0) + if (quest.AwardRequired != 0) if (!user.Awards.HasAward(Award.GetAwardById(quest.AwardRequired))) return false; @@ -151,90 +151,101 @@ namespace HISP.Game return true; } + public static bool CompleteQuest(User user, QuestEntry quest, bool npcActivation = false) + { + // Take Items + foreach (QuestItemInfo itemInfo in quest.ItemsRequired) + { + InventoryItem itm = user.Inventory.GetItemByItemId(itemInfo.ItemId); + for (int i = 0; i < itemInfo.Quantity; i++) + user.Inventory.Remove(itm.ItemInstances[0]); + + } + user.Money -= quest.MoneyCost; + // Give money + user.Money += quest.MoneyEarned; + // Give items + foreach (QuestItemInfo itemInfo in quest.ItemsEarned) + { + for (int i = 0; i < itemInfo.Quantity; i++) + { + ItemInstance itm = new ItemInstance(itemInfo.ItemId); + user.Inventory.AddIgnoringFull(itm); + } + } + if (quest.WarpX != 0 && quest.WarpY != 0) + user.Teleport(quest.WarpX, quest.WarpY); + + // Give quest points + user.QuestPoints += quest.QuestPointsEarned; + + if (quest.ChainedQuestId != 0) + ActivateQuest(user, GetQuestById(quest.ChainedQuestId)); + + if (quest.Tracked) + user.Quests.TrackQuest(quest.Id); + + + if (quest.SuccessMessage != null) + { + byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(ChatPacket); + } + + if (quest.SuccessNpcChat != null) + { + if (!npcActivation) + { + byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(ChatPacket); + } + } + + + + // Check if award unlocked + int questPointsPercent = Convert.ToInt32(Math.Floor(((decimal)user.QuestPoints / (decimal)GetTotalQuestPoints()) * (decimal)100.0)); + if (questPointsPercent >= 25) + user.Awards.AddAward(Award.GetAwardById(1)); // 25% Quest Completion Award. + if (questPointsPercent >= 50) + user.Awards.AddAward(Award.GetAwardById(2)); // 50% Quest Completion Award. + if (questPointsPercent >= 75) + user.Awards.AddAward(Award.GetAwardById(3)); // 75% Quest Completion Award. + if (questPointsPercent >= 100) + user.Awards.AddAward(Award.GetAwardById(4)); // 100% Quest Completion Award. + + // Is cloud isles quest? + if (quest.Id == 1373) + { + byte[] swfLoadPacket = PacketBuilder.CreateSwfModulePacket("ballooncutscene", PacketBuilder.PACKET_SWF_CUTSCENE); + user.LoggedinClient.SendPacket(swfLoadPacket); + } + + return true; + } + public static bool FailQuest(User user, QuestEntry quest, bool npcActivation = false) + { + if (quest.FailNpcChat != null) + { + if (!npcActivation) + { + byte[] ChatPacket = PacketBuilder.CreateChat(quest.FailNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(ChatPacket); + } + } + return false; + } public static bool ActivateQuest(User user, QuestEntry quest, bool npcActivation = false) { - if(CanComplete(user, quest)) + if (CanComplete(user, quest)) { - // Take Items - foreach (QuestItemInfo itemInfo in quest.ItemsRequired) - { - InventoryItem itm = user.Inventory.GetItemByItemId(itemInfo.ItemId); - for (int i = 0; i < itemInfo.Quantity; i++) - user.Inventory.Remove(itm.ItemInstances[0]); - - } - user.Money -= quest.MoneyCost; - // Give money - user.Money += quest.MoneyEarned; - // Give items - foreach (QuestItemInfo itemInfo in quest.ItemsEarned) - { - for (int i = 0; i < itemInfo.Quantity; i++) - { - ItemInstance itm = new ItemInstance(itemInfo.ItemId); - user.Inventory.AddIgnoringFull(itm); - } - } - if (quest.WarpX != 0 && quest.WarpY != 0) - user.Teleport(quest.WarpX, quest.WarpY); - - // Give quest points - user.QuestPoints += quest.QuestPointsEarned; - - if (quest.ChainedQuestId != 0) - ActivateQuest(user, GetQuestById(quest.ChainedQuestId)); - - if (quest.Tracked) - user.Quests.TrackQuest(quest.Id); - - if (quest.SuccessNpcChat != null) - { - if (!npcActivation) - { - byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); - user.LoggedinClient.SendPacket(ChatPacket); - } - } - - if (quest.SuccessMessage != null) - { - byte[] ChatPacket = PacketBuilder.CreateChat(quest.SuccessMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); - user.LoggedinClient.SendPacket(ChatPacket); - } - - - // Check if award unlocked - int questPointsPercent = Convert.ToInt32(Math.Floor(((decimal)user.QuestPoints / (decimal)GetTotalQuestPoints()) * (decimal)100.0)); - if (questPointsPercent >= 25) - user.Awards.AddAward(Award.GetAwardById(1)); // 25% Quest Completion Award. - if (questPointsPercent >= 50) - user.Awards.AddAward(Award.GetAwardById(2)); // 50% Quest Completion Award. - if (questPointsPercent >= 75) - user.Awards.AddAward(Award.GetAwardById(3)); // 75% Quest Completion Award. - if (questPointsPercent >= 100) - user.Awards.AddAward(Award.GetAwardById(4)); // 100% Quest Completion Award. - - // Is cloud isles quest? - if(quest.Id == 1373) - { - byte[] swfLoadPacket = PacketBuilder.CreateSwfModulePacket("ballooncutscene", PacketBuilder.PACKET_SWF_CUTSCENE); - user.LoggedinClient.SendPacket(swfLoadPacket); - } - - return true; + return CompleteQuest(user, quest, npcActivation); + } + else + { + return FailQuest(user, quest, npcActivation); } - else { - if(quest.FailNpcChat != null) - { - if(!npcActivation) - { - byte[] ChatPacket = PacketBuilder.CreateChat(quest.FailNpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT); - user.LoggedinClient.SendPacket(ChatPacket); - } - } - return false; - }; } public static bool DoesQuestExist(int id) diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index e77521b..1ee4adb 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -674,6 +674,9 @@ namespace HISP.Server Messages.NoPitchforkMeta = gameData.messages.meta.hay_pile.no_pitchfork; Messages.HasPitchforkMeta = gameData.messages.meta.hay_pile.pitchfork; + Messages.PasswordEntry = gameData.messages.meta.password_input; + Messages.VenusFlyTrapFormat = gameData.messages.meta.venus_flytrap_format; + // Inn Messages.InnBuyMeal = gameData.messages.meta.inn.buy_meal; Messages.InnBuyRest = gameData.messages.meta.inn.buy_rest; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 40d85aa..b22351f 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -193,6 +193,55 @@ namespace HISP.Server Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)"); break; } + case 14: + if(dynamicInput.Length >= 1) + { + string password = dynamicInput[1]; + // Get current tile + if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if(tile.Code.StartsWith("PASSWORD-")) + { + string[] args = tile.Code.Replace("!","-").Split('-'); + if(args.Length >= 3) + { + string expectedPassword = args[1]; + int questId = int.Parse(args[2]); + if(password.ToLower() == expectedPassword.ToLower()) + { + Quest.CompleteQuest(sender.LoggedinUser, Quest.GetQuestById(questId), false); + } + else + { + Quest.FailQuest(sender.LoggedinUser, Quest.GetQuestById(questId), false); + } + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Send invalid password input request. (Too few arguments!)"); + break; + } + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Send password input request. (Not on password tile!)"); + break; + } + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Sent a password while not in a special tile."); + break; + } + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid password request, (wrong size)"); + break; + } + + break; default: Logger.ErrorPrint("Unknown dynamic input: " + inputId.ToString() + " packet dump: " + BitConverter.ToString(packet).Replace("-", " ")); break;