Exemple #1
0
    public void DistributeReward()
    {
        if (!Active)
        {
            return;
        }

        if (Receivers.Count == 0) // Nobody joined
        {
            Active = false;
            GameServer.HongBaoManager.RemoveHongBao(this);
            return;
        }
        short dividedAwardAmount = (short)(RewardAmount / Receivers.Count);

        foreach (Player player in Receivers)
        {
            player.Session.FieldManager.BroadcastPacket(PlayerHostPacket.HongbaoGiftNotice(player, this, dividedAwardAmount));
            player.Session.Send(MeretsPacket.UpdateMerets(player.Account, dividedAwardAmount));
            player.Account.EventMeret.Modify(dividedAwardAmount);
        }

        Active = false;
        GameServer.HongBaoManager.RemoveHongBao(this);
    }
        private static void HandleHongBao(GameSession session, Item item)
        {
            HongBao newHongBao = new(session.Player, item.Function.HongBao.TotalUsers, item.Id, item.Function.HongBao.Id, item.Function.HongBao.Count, item.Function.HongBao.Duration);

            GameServer.HongBaoManager.AddHongBao(newHongBao);

            session.FieldManager.BroadcastPacket(PlayerHostPacket.OpenHongbao(session.Player, newHongBao));
            InventoryController.Consume(session, item.Uid, 1);
        }
        private static void HandleOpenMassive(GameSession session, PacketReader packet, Item item)
        {
            // Major WIP

            string password       = packet.ReadUnicodeString();
            int    duration       = item.Function.OpenMassiveEvent.Duration + Environment.TickCount;
            CoordF portalCoord    = session.Player.Coord;
            CoordF portalRotation = session.Player.Rotation;

            session.FieldManager.BroadcastPacket(PlayerHostPacket.StartMinigame(session.Player, item.Function.OpenMassiveEvent.FieldId));
            //  session.FieldManager.BroadcastPacket(FieldPacket.AddPortal()
            InventoryController.Consume(session, item.Uid, 1);
        }
    private static void HandleClaim(GameSession session, PacketReader packet)
    {
        int hongBaoId = packet.ReadInt();

        HongBao hongBao = GameServer.HongBaoManager.GetHongBaoById(hongBaoId);

        if (hongBao == null)
        {
            return;
        }

        if (hongBao.Active == false)
        {
            session.Send(PlayerHostPacket.HongbaoGiftNotice(session.Player, hongBao, 0));
            return;
        }

        hongBao.AddReceiver(session.Player);
    }
Exemple #5
0
        public static void HandleInstallBillBoard(GameSession session, PacketReader packet, Item item)
        {
            string[] parameters  = packet.ReadUnicodeString().Split("'");
            string   title       = parameters[0];
            string   description = parameters[1];
            bool     publicHouse = parameters[2].Equals("1");

            int            balloonUid = GuidGenerator.Int();
            string         uuid       = "AdBalloon_" + balloonUid.ToString();
            InteractObject balloon    = new InteractObject(uuid, uuid, Maple2Storage.Enums.InteractObjectType.AdBalloon);

            balloon.Balloon = new AdBalloon(session.Player, item, title, description, publicHouse);
            IFieldObject <InteractObject> fieldBalloon = session.FieldManager.RequestFieldObject(balloon);

            fieldBalloon.Coord    = session.FieldPlayer.Coord;
            fieldBalloon.Rotation = session.FieldPlayer.Rotation;
            session.FieldManager.AddBalloon(fieldBalloon);

            session.Send(PlayerHostPacket.AdBalloonPlace());
            InventoryController.Consume(session, item.Uid, 1);
        }
Exemple #6
0
        private static void HandleInteract(GameSession session, PacketReader packet)
        {
            string         id             = packet.ReadMapleString();
            InteractObject interactObject = session.FieldManager.State.InteractObjects[id];

            if (interactObject == null)
            {
                return;
            }

            InteractObjectMetadata metadata = InteractObjectMetadataStorage.GetInteractObjectMetadata(interactObject.InteractId);

            switch (interactObject.Type)
            {
            case InteractObjectType.Binoculars:
                session.Send(InteractObjectPacket.Use(interactObject));
                QuestHelper.UpdateExplorationQuest(session, interactObject.InteractId.ToString(), "interact_object_rep");
                break;

            case InteractObjectType.Ui:
                session.Send(InteractObjectPacket.Use(interactObject));
                break;

            case InteractObjectType.RankBoard:
                session.Send(WebOpenPacket.Open(metadata.Web.Url));
                break;

            case InteractObjectType.AdBalloon:
                session.Send(PlayerHostPacket.AdBalloonWindow((AdBalloon)interactObject));
                break;

            case InteractObjectType.Gathering:
                GatheringHelper.HandleGathering(session, metadata.Gathering.RecipeId, out int numDrop);
                session.Send(InteractObjectPacket.Use(interactObject, (short)(numDrop > 0 ? 0 : 1), numDrop));
                break;
            }

            session.Send(InteractObjectPacket.Interact(interactObject));
        }
        private static void HandleUse(GameSession session, PacketReader packet)
        {
            string uuid = packet.ReadMapleString();
            IFieldObject <InteractObject> interactObject = session.FieldManager.State.InteractObjects[uuid];

            if (interactObject == null)
            {
                return;
            }

            MapInteractObject mapObject = MapEntityStorage.GetInteractObject(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid);
            int numDrop = 0;

            switch (interactObject.Value.Type)
            {
            case InteractObjectType.Binoculars:
                QuestHelper.UpdateExplorationQuest(session, mapObject.InteractId.ToString(), "interact_object_rep");
                break;

            case InteractObjectType.Gathering:
                RecipeMetadata recipe = RecipeMetadataStorage.GetRecipe(mapObject.RecipeId);

                session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, 0);
                long currentMastery = session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == (MasteryType)recipe.MasteryType).CurrentExp;
                if (currentMastery < recipe.RequireMastery)
                {
                    return;
                }

                session.Player.IncrementGatheringCount(mapObject.RecipeId, 0);
                int numCount = session.Player.GatheringCount[mapObject.RecipeId].Current;

                List <RecipeItem> items = RecipeMetadataStorage.GetResult(recipe);
                int masteryDiffFactor   = numCount switch
                {
                    int n when n < recipe.HighPropLimitCount => MasteryFactorMetadataStorage.GetFactor(0),
                    int n when n < recipe.NormalPropLimitCount => MasteryFactorMetadataStorage.GetFactor(1),
                    int n when n < (int)(recipe.NormalPropLimitCount * 1.3) => MasteryFactorMetadataStorage.GetFactor(2),
                    _ => MasteryFactorMetadataStorage.GetFactor(3),
                };

                foreach (RecipeItem item in items)
                {
                    int prob = RarityChance[item.Rarity] * masteryDiffFactor / 10000;
                    if (RandomProvider.Get().Next(100) >= prob)
                    {
                        continue;
                    }
                    for (int i = 0; i < item.Amount; i++)
                    {
                        session.FieldManager.AddItem(session, new Item(item.Id));
                    }
                    numDrop += item.Amount;
                }
                if (numDrop > 0)
                {
                    session.Player.IncrementGatheringCount(mapObject.RecipeId, numDrop);
                    session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, recipe.RewardMastery);
                }
                break;

            case InteractObjectType.AdBalloon:
                session.Send(PlayerHostPacket.AdBalloonWindow(interactObject));
                return;

            default:
                break;
            }
            session.Send(InteractObjectPacket.UseObject(mapObject, (short)(numDrop > 0 ? 0 : 1), numDrop));
            session.Send(InteractObjectPacket.Extra(mapObject));
        }
    private static void HandleInteract(GameSession session, PacketReader packet)
    {
        Player player = session.Player;

        string id = packet.ReadString();

        session.FieldManager.State.InteractObjects.TryGetValue(id, out IFieldObject <InteractObject> fieldInteractObject);
        if (fieldInteractObject is null)
        {
            return;
        }

        InteractObject interactObject = fieldInteractObject.Value;

        InteractObjectMetadata metadata = InteractObjectMetadataStorage.GetInteractObjectMetadata(interactObject.InteractId);

        QuestManager.OnInteractObject(player, interactObject.InteractId);

        switch (interactObject.Type)
        {
        case InteractObjectType.Binoculars:
            session.Send(InteractObjectPacket.Use(interactObject));
            break;

        case InteractObjectType.Ui:
            session.Send(InteractObjectPacket.Use(interactObject));
            break;

        case InteractObjectType.RankBoard:
            session.Send(WebOpenPacket.Open(metadata.Web.Url));
            break;

        case InteractObjectType.AdBalloon:
            session.Send(PlayerHostPacket.AdBalloonWindow((AdBalloon)interactObject));
            break;

        case InteractObjectType.Gathering:
            GatheringHelper.HandleGathering(session, metadata.Gathering.RecipeId, out int numDrop);
            session.Send(InteractObjectPacket.Use(interactObject, (short)(numDrop > 0 ? 0 : 1), numDrop));
            break;

        case InteractObjectType.Common:
            // Unsure if all interact objects need to be set as disabled.
            interactObject.State = InteractObjectState.Disable;

            session.Send(InteractObjectPacket.Update(interactObject));
            session.Send(InteractObjectPacket.Interact(interactObject));

            foreach ((int questId, QuestState state) in metadata.Quests)
            {
                if (!player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State != state)
                {
                    continue;
                }

                interactObject.State = InteractObjectState.Activated;
                session.Send(InteractObjectPacket.Update(interactObject));
            }

            DropItems();

            TrophyManager.OnObjectInteract(player, interactObject.InteractId);

            if (interactObject is MapChest)
            {
                // Unsure if setting as activated is specific of map chests
                interactObject.State = InteractObjectState.Activated;

                // Delayed removal of the chest
                Task.Run(async() =>
                {
                    await Task.Delay(TimeSpan.FromSeconds(10));
                    session.FieldManager.State.RemoveInteractObject(interactObject.Id);

                    session.FieldManager.BroadcastPacket(InteractObjectPacket.Update(interactObject));
                    session.FieldManager.BroadcastPacket(InteractObjectPacket.Remove(interactObject));
                });
            }

            return;
        }

        session.Send(InteractObjectPacket.Interact(interactObject));

        void DropItems()
        {
            foreach (int boxId in metadata.Drop.IndividualDropBoxId)
            {
                ItemDropMetadata itemDropMetadataStorage = ItemDropMetadataStorage.GetItemDropMetadata(boxId);
                if (itemDropMetadataStorage is null)
                {
                    continue;
                }

                foreach (DropGroup dropGroup in itemDropMetadataStorage.DropGroups)
                {
                    foreach (DropGroupContent dropGroupContent in dropGroup.Contents)
                    {
                        foreach (int itemId in dropGroupContent.ItemIds)
                        {
                            int  amount = Random.Shared.Next((int)dropGroupContent.MinAmount, (int)dropGroupContent.MaxAmount);
                            Item item   = new(itemId, amount, dropGroupContent.Rarity);

                            session.FieldManager.AddItem(session.Player.FieldPlayer, item);
                        }
                    }
                }
            }

            foreach (int boxId in metadata.Drop.GlobalDropBoxId)
            {
                ItemDropMetadata itemDropMetadataStorage = ItemDropMetadataStorage.GetItemDropMetadata(boxId);
                if (itemDropMetadataStorage is null)
                {
                    continue;
                }

                foreach (DropGroup dropGroup in itemDropMetadataStorage.DropGroups)
                {
                    foreach (DropGroupContent dropGroupContent in dropGroup.Contents)
                    {
                        foreach (int itemId in dropGroupContent.ItemIds)
                        {
                            int  amount = Random.Shared.Next((int)dropGroupContent.MinAmount, (int)dropGroupContent.MaxAmount);
                            Item item   = new(itemId, amount, dropGroupContent.Rarity);

                            session.FieldManager.AddItem(session.Player.FieldPlayer, item);
                        }
                    }
                }
            }
        }
    }