コード例 #1
0
        private Task StartHealingSpot()
        {
            return(Task.Run(async() =>
            {
                while (!State.Players.IsEmpty)
                {
                    foreach (IFieldObject <HealingSpot> healingSpot in State.HealingSpots.Values)
                    {
                        CoordS healingCoord = healingSpot.Value.Coord;
                        foreach (IFieldObject <Player> player in State.Players.Values)
                        {
                            if ((healingCoord - player.Coord.ToShort()).Length() < Block.BLOCK_SIZE * 2 && healingCoord.Z == player.Coord.ToShort().Z - 1) // 3x3x1 area
                            {
                                int healAmount = (int)(player.Value.Stats[PlayerStatId.Hp].Max * 0.03);
                                Status status = new Status(new SkillCast(70000018, 1, 0, 1), owner: player.ObjectId, source: healingSpot.ObjectId, duration: 100, stacks: 1);

                                player.Value.Session.Send(BuffPacket.SendBuff(0, status));
                                BroadcastPacket(SkillDamagePacket.ApplyHeal(status, healAmount));

                                player.Value.Session.Player.Stats.Increase(PlayerStatId.Hp, healAmount);
                                player.Value.Session.Send(StatPacket.UpdateStats(player, PlayerStatId.Hp));
                            }
                        }
                    }

                    await Task.Delay(1000);
                }
            }));
        }
コード例 #2
0
 private static Task Remove(GameSession session, Status status)
 {
     return(Task.Run(async() =>
     {
         await Task.Delay(status.Duration);
         session.FieldManager.BroadcastPacket(BuffPacket.SendBuff(1, status));
     }));
 }
コード例 #3
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        packet.ReadInt(); // ?

        // Liftable: 00 00 00 00 00
        // SendBreakable
        // Self
        Player  player  = session.Player;
        Account account = player.Account;

        session.EnterField(player);
        session.Send(StatPacket.SetStats(player.FieldPlayer));
        session.Send(StatPointPacket.WriteTotalStatPoints(player));
        session.Send(StatPointPacket.WriteTotalStatPoints(player)); // This packet is sent twice on GMS, not sure why
        session.Send(StatPointPacket.WriteStatPointDistribution(player));

        if (account.IsVip())
        {
            session.Send(BuffPacket.SendBuff(0,
                                             new(100000014, player.FieldPlayer.ObjectId, player.FieldPlayer.ObjectId, 1, (int)account.VIPExpiration, 1)));
            session.Send(PremiumClubPacket.ActivatePremium(player.FieldPlayer, account.VIPExpiration));
        }

        session.Send(EmotePacket.LoadEmotes(player));
        session.Send(ChatStickerPacket.LoadChatSticker(player));

        session.Send(HomeCommandPacket.LoadHome(player));
        session.Send(ResponseCubePacket.DecorationScore(account.Home));
        session.Send(ResponseCubePacket.LoadHome(player.FieldPlayer.ObjectId, player.Account.Home));
        session.Send(ResponseCubePacket.ReturnMap(player.ReturnMapId));
        session.Send(LapenshardPacket.Load(player.Inventory.LapenshardStorage));

        IEnumerable <Cube> cubes = session.FieldManager.State.Cubes.Values
                                   .Where(x => x.Value.PlotNumber == 1 && x.Value.Item.HousingCategory is ItemHousingCategory.Farming or ItemHousingCategory.Ranching)
                                   .Select(x => x.Value);

        foreach (Cube cube in cubes)
        {
            session.Send(FunctionCubePacket.UpdateFunctionCube(cube.CoordF.ToByte(), 2, 1));
        }

        if (player.Party is not null)
        {
            session.Send(PartyPacket.UpdatePlayer(player));
        }

        session.Send(KeyTablePacket.SendHotbars(player.GameOptions));

        List <GameEvent> gameEvents = DatabaseManager.Events.FindAll();

        session.Send(GameEventPacket.Load(gameEvents));

        TrophyManager.OnMapEntered(player, player.MapId);
    }
コード例 #4
0
        // Example: "status id:10400081"
        private static void ProcessStatusCommand(GameSession session, string command)
        {
            Dictionary <string, string> config = command.ToMap();

            if (!int.TryParse(config.GetValueOrDefault("id", "10400081"), out int statusId))
            {
                return;
            }
            Status status = new Status(statusId, session.FieldPlayer.ObjectId, session.FieldPlayer.ObjectId, 1, 1, 1);

            session.Send(BuffPacket.SendBuff(0, status));
        }
コード例 #5
0
    public static void ActivatePremium(GameSession session, long vipTime)
    {
        long expiration = TimeInfo.Now() + vipTime;

        Account account = session.Player.Account;

        if (!account.IsVip())
        {
            account.VIPExpiration = expiration;
            session.Send(NoticePacket.Notice(SystemNotice.PremiumActivated, NoticeType.Chat | NoticeType.FastText));
        }
        else
        {
            account.VIPExpiration += vipTime;
            session.Send(NoticePacket.Notice(SystemNotice.PremiumExtended, NoticeType.Chat | NoticeType.FastText));
        }
        session.Send(BuffPacket.SendBuff(0, new(100000014, session.Player.FieldPlayer.ObjectId, session.Player.FieldPlayer.ObjectId, 1, (int)vipTime, 1)));
        session.Send(PremiumClubPacket.ActivatePremium(session.Player.FieldPlayer, account.VIPExpiration));
    }
コード例 #6
0
        private void HealingSpot()
        {
            foreach (IFieldObject <HealingSpot> healingSpot in State.HealingSpots.Values)
            {
                CoordS healingCoord = healingSpot.Value.Coord;
                foreach (IFieldObject <Player> player in State.Players.Values)
                {
                    if ((healingCoord - player.Coord.ToShort()).Length() < Block.BLOCK_SIZE * 2 && healingCoord.Z == player.Coord.ToShort().Z - 1) // 3x3x1 area
                    {
                        int    healAmount = (int)(player.Value.Stats[PlayerStatId.Hp].Max * 0.03);
                        Status status     = new Status(new SkillCast(70000018, 1, 0, 1), target: player.ObjectId, source: healingSpot.ObjectId, stacks: 1);

                        player.Value.Session.Send(BuffPacket.SendBuff(0, status));
                        BroadcastPacket(SkillDamagePacket.Heal(status, healAmount));

                        player.Value.Session.Player.Stats.Increase(PlayerStatId.Hp, healAmount);
                        player.Value.Session.Send(StatPacket.UpdateStats(player, PlayerStatId.Hp));
                    }
                }
            }
        }
コード例 #7
0
ファイル: FieldManager.cs プロジェクト: gugarosa/MapleServer2
        private Task StartHealingSpot(GameSession session, IFieldObject <Player> player)
        {
            int    healAmount = 30;
            Status status     = new Status(new SkillCast(70000018, 1, 0, 1), player.ObjectId, player.ObjectId, 1, healAmount);

            return(Task.Run(async() =>
            {
                while (!State.Players.IsEmpty)
                {
                    CoordS healingCoord = MapEntityStorage.GetHealingSpot(MapId);

                    if ((healingCoord - player.Coord.ToShort()).Length() < Block.BLOCK_SIZE * 2 && healingCoord.Z == player.Coord.ToShort().Z - 1) // 3x3x1 area
                    {
                        session.Send(BuffPacket.SendBuff(0, status));
                        session.Send(SkillDamagePacket.ApplyHeal(player, status));
                        session.Player.Stats.Increase(PlayerStatId.Hp, healAmount);
                        session.Send(StatPacket.UpdateStats(player, PlayerStatId.Hp));
                    }

                    await Task.Delay(1000);
                }
            }));
        }
コード例 #8
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            packet.ReadInt(); // ?

            // Liftable: 00 00 00 00 00
            // SendBreakable
            // Self
            Player  player  = session.Player;
            Account account = player.Account;

            session.EnterField(player);
            session.Send(StatPacket.SetStats(session.FieldPlayer));
            session.Send(StatPointPacket.WriteTotalStatPoints(player));
            if (account.IsVip())
            {
                session.Send(BuffPacket.SendBuff(0, new Status(100000014, session.FieldPlayer.ObjectId, session.FieldPlayer.ObjectId, 1, (int)account.VIPExpiration, 1)));
                session.Send(PremiumClubPacket.ActivatePremium(session.FieldPlayer, account.VIPExpiration));
            }
            session.Send(EmotePacket.LoadEmotes(player));
            session.Send(ChatStickerPacket.LoadChatSticker(player));

            session.Send(HomeCommandPacket.LoadHome(player));
            session.Send(ResponseCubePacket.DecorationScore(account.Home));
            session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer));
            session.Send(ResponseCubePacket.ReturnMap(player.ReturnMapId));
            if (player.Party != null)
            {
                session.Send(PartyPacket.UpdatePlayer(player));
            }

            session.Send(KeyTablePacket.SendHotbars(player.GameOptions));

            List <GameEvent> gameEvents = DatabaseManager.Events.FindAll();

            session.Send(GameEventPacket.Load(gameEvents));
        }
コード例 #9
0
 // Public caller to handle status on Player
 // TODO: Handle Add Stacks to status.
 public static void Handle(GameSession session, Status status)
 {
     session.FieldManager.BroadcastPacket(BuffPacket.SendBuff(0, status));
     Remove(session, status);
 }
コード例 #10
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        packet.ReadInt(); // ?

        // Liftable: 00 00 00 00 00
        // SendBreakable
        // Self
        Player  player  = session.Player;
        Account account = player.Account;

        session.EnterField(player);
        session.Send(StatPacket.SetStats(player.FieldPlayer));
        session.Send(StatPointPacket.WriteTotalStatPoints(player));
        session.Send(StatPointPacket.WriteTotalStatPoints(player)); // This packet is sent twice on GMS, not sure why
        session.Send(StatPointPacket.WriteStatPointDistribution(player));
        session.Send(SkillPointPacket.ExtraSkillPoints(player));

        if (player.ActivePet is not null)
        {
            player.ActivePet.SetMetadataValues();
            Pet pet = session.FieldManager.RequestPet(player.ActivePet, player.FieldPlayer);
            if (pet is not null)
            {
                player.FieldPlayer.ActivePet = pet;

                session.Send(ResponsePetPacket.LoadPetSettings(pet));
                session.Send(NoticePacket.Notice(SystemNotice.PetSummonOn, NoticeType.Chat | NoticeType.FastText));
            }
        }

        if (account.IsVip())
        {
            session.Send(BuffPacket.SendBuff(0,
                                             new(100000014, player.FieldPlayer.ObjectId, player.FieldPlayer.ObjectId, 1, (int)account.VIPExpiration, 1)));
            session.Send(PremiumClubPacket.ActivatePremium(player.FieldPlayer, account.VIPExpiration));
        }

        session.Send(EmotePacket.LoadEmotes(player));
        session.Send(MacroPacket.LoadControls(player.Macros));
        session.Send(ChatStickerPacket.LoadChatSticker(player));

        session.Send(ResponseCubePacket.DecorationScore(account.Home));
        session.Send(ResponseCubePacket.LoadHome(player.FieldPlayer.ObjectId, player.Account.Home));
        session.Send(ResponseCubePacket.ReturnMap(player.ReturnMapId));
        session.Send(LapenshardPacket.Load(player.Inventory.LapenshardStorage));

        IEnumerable <Cube> cubes = session.FieldManager.State.Cubes.Values
                                   .Where(x => x.Value.PlotNumber == 1 && x.Value.Item.HousingCategory is ItemHousingCategory.Farming or ItemHousingCategory.Ranching)
                                   .Select(x => x.Value);

        foreach (Cube cube in cubes)
        {
            session.Send(FunctionCubePacket.UpdateFunctionCube(cube.CoordF.ToByte(), 2, 1));
        }

        if (player.Party is not null)
        {
            session.Send(PartyPacket.UpdatePlayer(player));
        }

        GlobalEvent globalEvent = GameServer.GlobalEventManager.GetCurrentEvent();

        if (globalEvent is not null && !MapMetadataStorage.MapIsInstancedOnly(player.MapId))
        {
            session.Send(GlobalPortalPacket.Notice(globalEvent));
        }

        FieldWar fieldWar = GameServer.FieldWarManager.CurrentFieldWar;

        if (fieldWar is not null && !MapMetadataStorage.MapIsInstancedOnly(player.MapId) && fieldWar.MapId != player.MapId)
        {
            session.Send(FieldWarPacket.LegionPopup(fieldWar.Id, fieldWar.EntryClosureTime.ToUnixTimeSeconds()));
        }

        session.Send(KeyTablePacket.SendHotbars(player.GameOptions));

        TrophyManager.OnMapEntered(player, player.MapId);

        QuestManager.OnMapEnter(player, player.MapId);

        player.InitializeEffects();
    }