private static void AddRewardItemsToInventory(GameSession session, RecipeMetadata recipe) { // award items List <RecipeItem> resultItems = recipe.RewardItems; foreach (RecipeItem resultItem in resultItems) { Item rewardItem = new(resultItem.ItemId) { Rarity = resultItem.Rarity, Amount = resultItem.Amount }; session.Player.Inventory.AddItem(session, rewardItem, true); session.Send(MasteryPacket.GetCraftedItem((MasteryType)recipe.MasteryType, rewardItem)); } // add mastery exp session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, recipe.RewardMastery); // add player exp if (recipe.ExceptRewardExp) { // TODO: add metadata for common exp tables to be able to look up exp amount for masteries etc. } }
private static void AddRewardItemsToInventory(GameSession session, RecipeMetadata recipe) { // award items List <RecipeItem> result = recipe.GetResult(); for (int i = 0; i < result.Count; i++) { Item rewardItem = new(result.ElementAt(i).Id) { Rarity = result.ElementAt(i).Rarity, Amount = result.ElementAt(i).Amount }; InventoryController.Add(session, rewardItem, true); session.Send(MasteryPacket.GetCraftedItem((MasteryType)(recipe.MasteryType), rewardItem)); } // add mastery exp session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, recipe.RewardMastery); // add player exp if (recipe.ExceptRewardExp) { // TODO: add metadata for common exp tables to be able to look up exp amount for masteries etc. } }
private void HandleCraftItem(GameSession session, PacketReader packet) { int recipeId = packet.ReadInt(); // attempt to oad the recipe metadata RecipeMetadata recipe = RecipeMetadataStorage.GetRecipe(recipeId); if (recipe == null) { Logger.LogError($"Unknown recipe ID {recipeId} from user: {session.Player.Name}"); return; } if (recipe.RequireMastery > 0) { if (session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == (MasteryType)recipe.MasteryType).CurrentExp < recipe.RequireMastery) { session.Send(MasteryPacket.MasteryNotice((short)MasteryNotice.NotEnoughMastery)); return; } } if (recipe.RequireQuest.Count > 0) { foreach (int questId in recipe.RequireQuest) { QuestStatus quest = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (quest == null || !quest.Completed) { session.Send(MasteryPacket.MasteryNotice((short)MasteryNotice.RequiredQuestIsNotCompleted)); return; } } } // does the play have enough mesos for this recipe? if (!session.Player.Wallet.Meso.Modify(-recipe.RequireMeso)) { session.Send(MasteryPacket.MasteryNotice((short)MasteryNotice.NotEnoughMesos)); return; } // does the player have all the required ingredients for this recipe? if (!PlayerHasAllIngredients(session, recipe)) { session.Send(MasteryPacket.MasteryNotice((short)MasteryNotice.NotEnoughItems)); return; } // only add reward items once all required items & mesos have been removed from player if (RemoveRequiredItemsFromInventory(session, recipe)) { AddRewardItemsToInventory(session, recipe); } }
public void GainMasteryExp(MasteryType type, long amount) { MasteryExp masteryExp = MasteryExp.FirstOrDefault(x => x.Type == (byte)type); if (masteryExp == null) // add mastery to list { MasteryExp.Add(new MasteryExp(type, amount)); Player.Session.Send(MasteryPacket.SetExp(type, amount)); } else { // user already has some exp in mastery, so simply update it Player.Session.Send(MasteryPacket.SetExp(type, masteryExp.CurrentExp += amount)); } }
public override void Handle(GameSession session, PacketReader packet) { packet.ReadInt(); // ? // Liftable: 00 00 00 00 00 // SendBreakable // Self session.EnterField(session.Player.MapId); session.Send(StatPacket.SetStats(session.FieldPlayer)); session.Send(StatPointPacket.WriteTotalStatPoints(session.Player)); foreach (MasteryExp mastery in session.Player.Levels.MasteryExp) { session.Send(MasteryPacket.SetExp(mastery.Type, mastery.CurrentExp)); } if (session.Player.IsVip()) { session.Send(PremiumClubPacket.ActivatePremium(session.FieldPlayer, session.Player.VIPExpiration)); } session.Send(EmotePacket.LoadEmotes(session.Player)); session.Send(ChatStickerPacket.LoadChatSticker(session.Player)); session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer)); // Normally skill layout would be loaded from a database QuickSlot arrowStream = QuickSlot.From(10500001); QuickSlot arrowBarrage = QuickSlot.From(10500011); QuickSlot eagleGlide = QuickSlot.From(10500151); QuickSlot testSkill = QuickSlot.From(10500153); if (session.Player.GameOptions.TryGetHotbar(0, out Hotbar mainHotbar)) { /* * mainHotbar.MoveQuickSlot(4, arrowStream); * mainHotbar.MoveQuickSlot(5, arrowBarrage); * mainHotbar.MoveQuickSlot(6, eagleGlide); * mainHotbar.MoveQuickSlot(7, testSkill); */ session.Send(KeyTablePacket.SendHotbars(session.Player.GameOptions)); } session.Send(GameEventPacket.Load()); }
public override void Handle(GameSession session, PacketReader packet) { packet.ReadInt(); // ? // Liftable: 00 00 00 00 00 // SendBreakable // Self session.EnterField(session.Player.MapId); session.Send(StatPacket.SetStats(session.FieldPlayer)); session.Send(StatPointPacket.WriteTotalStatPoints(session.Player)); foreach (MasteryExp mastery in session.Player.Levels.MasteryExp) { session.Send(MasteryPacket.SetExp(mastery.Type, mastery.CurrentExp)); } session.Send(EmotePacket.LoadEmotes(session.Player)); session.Send(ChatStickerPacket.LoadChatSticker(session.Player)); session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer)); // Normally skill layout would be loaded from a database QuickSlot arrowStream = QuickSlot.From(10500001); QuickSlot arrowBarrage = QuickSlot.From(10500011); QuickSlot eagleGlide = QuickSlot.From(10500151); QuickSlot testSkill = QuickSlot.From(10500153); if (session.Player.GameOptions.TryGetHotbar(0, out Hotbar mainHotbar)) { /* * mainHotbar.MoveQuickSlot(4, arrowStream); * mainHotbar.MoveQuickSlot(5, arrowBarrage); * mainHotbar.MoveQuickSlot(6, eagleGlide); * mainHotbar.MoveQuickSlot(7, testSkill); */ session.Send(KeyTablePacket.SendHotbars(session.Player.GameOptions)); } // Add catalysts for testing Item item = new Item(40100001) { Amount = 99999 }; Item item2 = new Item(40100001) { Amount = 90000 }; InventoryController.Add(session, item, true); InventoryController.Add(session, item2, true); //Add mail for testing //System mail without any item Mail sysMail = new Mail ( 101, session.Player.CharacterId, "50000002", "", "", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), null ); // System mail with an item List <Item> items = new List <Item> { new Item(40100001) // 20302228 { CreationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Owner = session.Player, Amount = 10000 } }; Mail sysItemMail = new Mail ( 101, session.Player.CharacterId, "53000042", "", "", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), items ); // Regular mail Mail regMail = new Mail ( 1, session.Player.CharacterId, session.Player.Name, "Test Title", "Test Body", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), null ); session.Player.Mailbox.AddOrUpdate(sysItemMail); session.Player.Mailbox.AddOrUpdate(sysMail); session.Player.Mailbox.AddOrUpdate(regMail); session.Send(GameEventPacket.Load()); }