Beispiel #1
0
    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.
        }
    }
Beispiel #2
0
        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.
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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());
        }