Пример #1
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);
    }
Пример #2
0
        private void HandleStartReadyCheck(GameSession session, PacketReader packet)
        {
            Party party = GameServer.PartyManager.GetPartyByLeader(session.Player);

            if (party == null)
            {
                return;
            }
            party.BroadcastPacketParty(PartyPacket.StartReadyCheck(session.Player, party.Members, party.ReadyChecks++));
            party.RemainingMembers = party.Members.Count - 1;
        }
Пример #3
0
 public void CheckDisband()
 {
     if (Members.Count < 2)
     {
         BroadcastParty(session =>
         {
             session.Player.PartyId = 0;
             session.Send(PartyPacket.Disband());
         });
         GameServer.PartyManager.RemoveParty(this);
     }
 }
Пример #4
0
        public static void PartyInvite(InPacket lea, Client c)
        {
            int CharacterID = lea.ReadInt();
            Map map         = MapFactory.GetMap(c.Character.MapX, c.Character.MapY);

            Character Other = null;

            foreach (Character chr in map.Characters)
            {
                if (chr.CharacterID == CharacterID)
                {
                    Other = chr;
                    if (Other.Party.getMembers().Count == 0)
                    {
                        PartyPacket.PartyInvite(chr.Client, c.Character.CharacterID);
                    }
                    break;
                }
            }

            if (Other != null)
            {
                if (Other.Party.getMembers().Count == 0)
                {
                    // 個人 + 其他隊員
                    if (c.Character.Party.getMembers().Count == 0)
                    {
                        c.Character.Party.getMembers().Add(new Member(c.Character));           // 隊長
                    }
                    c.Character.Party.getMembers().Add(new Member(Other));                     // 對方
                    foreach (var chr in c.Character.Party.getMembers())
                    {
                        if (chr.Character.CharacterID != c.Character.CharacterID &&
                            chr.Character.CharacterID != Other.CharacterID)
                        {
                            chr.Character.Party.getMembers().Add(new Member(Other));
                        }
                    }

                    // 對方
                    Other.Party.getMembers().Add(new Member(c.Character));               // 隊長
                    Other.Party.getMembers().Add(new Member(Other));                     // 對方
                    foreach (var chr in c.Character.Party.getMembers())
                    {
                        if (chr.Character.CharacterID != c.Character.CharacterID &&
                            chr.Character.CharacterID != Other.CharacterID)
                        {
                            chr.Character.Party.getMembers().Add(chr);
                        }
                    }
                }
            }
        }
Пример #5
0
    private static void HandleLeave(GameSession session)
    {
        Party party = session.Player.Party;

        session.Send(PartyPacket.Leave(session.Player, 1)); //1 = You're the player leaving
        party?.RemoveMember(session.Player);

        if (party != null)
        {
            party.BroadcastPacketParty(PartyPacket.Leave(session.Player, 0));
        }
    }
        public void CheckDisband()
        {
            if (Members.Count >= 2)
            {
                return;
            }

            BroadcastParty(session =>
            {
                session.Player.Party = null;
                session.Send(PartyPacket.Disband());
            });
            GameServer.PartyManager.RemoveParty(this);
        }
Пример #7
0
        //PartyPacket
        private static void HandlePacket(PartyPacket packet)
        {
            if (Globals.Me == null || Globals.Me.Party == null)
            {
                return;
            }

            Globals.Me.Party.Clear();
            for (var i = 0; i < packet.MemberData.Length; i++)
            {
                var mem = packet.MemberData[i];
                Globals.Me.Party.Add(new PartyMember(mem.Id, mem.Name, mem.Vital, mem.MaxVital, mem.Level));
            }
        }
        public void CheckOffineParty(Player player)
        {
            List <GameSession> sessions = GetSessions();

            if (sessions.Count == 0)
            {
                GameServer.PartyManager.RemoveParty(this);
                return;
            }
            BroadcastPacketParty(PartyPacket.LogoutNotice(player.CharacterId));
            if (Leader == player)
            {
                FindNewLeader();
            }
        }
Пример #9
0
    public static void HandleCreateDungeon(GameSession session, PacketReader packet)
    {
        int    dungeonId  = packet.ReadInt();
        bool   groupEnter = packet.ReadBool();
        Player player     = session.Player;

        if (player.DungeonSessionId != -1)
        {
            session.SendNotice("Leave your current dungeon before opening another.");
            return;
        }

        int            dungeonLobbyId = DungeonStorage.GetDungeonByDungeonId(dungeonId).LobbyFieldId;
        MapPlayerSpawn spawn          = MapEntityStorage.GetRandomPlayerSpawn(dungeonLobbyId);

        DungeonSession dungeonSession = GameServer.DungeonManager.CreateDungeonSession(dungeonId, groupEnter ? DungeonType.Group : DungeonType.Solo);

        //TODO: Send packet that greys out enter alone / enter as party when already in a dungeon session (sendRoomDungeon packet/s).
        //the session belongs to the party leader
        if (groupEnter)
        {
            Party party = player.Party;
            if (party.DungeonSessionId != -1)
            {
                session.SendNotice("Need to reset dungeon before entering another instance");
                return;
            }
            foreach (Player member in party.Members)
            {
                if (member.DungeonSessionId != -1)
                {
                    session.SendNotice($"{member.Name} is still in a Dungeon Instance.");
                    return;
                }
            }
            party.DungeonSessionId = dungeonSession.SessionId;
            party.BroadcastPacketParty(PartyPacket.PartyHelp(dungeonId));
            //TODO: Update Party with dungeon Info via party packets (0d,0e and others are involved).
        }
        else // solo join dungeon
        {
            player.DungeonSessionId = dungeonSession.SessionId;
        }
        session.Player.Warp(dungeonLobbyId, instanceId: dungeonSession.DungeonInstanceId);
        //TODO: things after map is created here: spawn doctor npc.
        //This packet sets the banner in the dungeon that displays the dungeonname and the playersize it was created for.
        //party.BroadcastPacketParty(DungeonWaitPacket.Show(dungeonId, DungeonStorage.GetDungeonByDungeonId(dungeonId).MaxUserCount));
    }
Пример #10
0
    void AddedParty(string b)
    {
        PartyPacket partyPacket = JsonUtility.FromJson <PartyPacket>(b);
        GameObject  PartyCanvas = GameObject.Find("PartyCanvas");

        PartyCanvas.transform.FindChild("PartyPanel").gameObject.SetActive(true);
        for (int i = 1; i < partyPacket.memberList.Length; i++)
        {
            PartyCanvas.transform.FindChild("PartyPanel").transform.FindChild("User" + i.ToString()).gameObject.SetActive(true);
            Transform member = GameObject.Find("User" + i.ToString()).transform;
            member.FindChild("HPBar").GetComponent <Slider>().value = partyPacket.memberList[i - 1].hp / 100;
            member.FindChild("Text").GetComponent <Text>().text     = partyPacket.memberList[i - 1].nickname;
            PartyMembers.Add(partyPacket.memberList[i - 1]);
        }
        isInParty = true;
    }
Пример #11
0
    private static void HandleFindDungeonParty(GameSession session, PacketReader packet)
    {
        int dungeonId = packet.ReadInt();

        if (session.Player.Party == null)
        {
            Party newParty = new(session.Player);
            GameServer.PartyManager.AddParty(newParty);
            session.Send(PartyPacket.Create(newParty, true));
        }

        Party party = session.Player.Party;

        // TODO: Party pairing system

        session.Send(PartyPacket.DungeonFindParty());
    }
Пример #12
0
        private void HandleLeave(GameSession session, PacketReader packet)
        {
            Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId);

            session.Send(PartyPacket.Leave(session.Player, 1)); //1 = You're the player leaving
            session.Player.PartyId = 0;
            if (party == null)
            {
                return;
            }
            party.RemoveMember(session.Player);
            party.BroadcastPacketParty(PartyPacket.Leave(session.Player, 0));
            if (party.Leader.CharacterId == session.Player.CharacterId)
            {
                party.FindNewLeader();
            }
            party.CheckDisband();
        }
Пример #13
0
    private static void CancelFindDungeonParty(GameSession session)
    {
        Party party = GameServer.PartyManager.GetPartyByLeader(session.Player);

        if (party == null)
        {
            return;
        }

        if (party.Members.Count <= 1)
        {
            party.RemoveMember(session.Player);
        }

        // TODO: Remove party from pairing system

        session.Send(PartyPacket.DungeonFindParty());
    }
Пример #14
0
    void AddPartyMember(string b)
    {
        PartyPacket partyPacket = JsonUtility.FromJson <PartyPacket>(b);
        GameObject  PartyPanel  = GameObject.Find("PartyPanel");
        MemberList  memberList  = new MemberList();

        memberList.nickname = partyPacket.member;
        memberList.hp       = partyPacket.memberHP;
        PartyMembers.Add(memberList);

        for (int i = 1; i < PartyMembers.Count + 1; i++)
        {
            PartyPanel.transform.FindChild("User" + i.ToString()).gameObject.SetActive(true);
        }
        Transform member = GameObject.Find("User" + (PartyMembers.Count).ToString()).transform;

        member.FindChild("HPBar").GetComponent <Slider>().value = partyPacket.memberHP / 100;
        member.FindChild("Text").GetComponent <Text>().text     = partyPacket.member;
    }
Пример #15
0
    public static void HandleRemoveListing(GameSession session)
    {
        Party party = session.Player.Party;

        if (party == null)
        {
            return;
        }

        party.BroadcastPacketParty(MatchPartyPacket.RemoveListing(party));

        if (party.Members.Count == 1)
        {
            party.RemoveMember(session.Player);
            return;
        }

        party.PartyFinderId = 0;
        party.BroadcastPacketParty(PartyPacket.MatchParty(null, false));
    }
Пример #16
0
    private static void HandleGetHelp(GameSession session, PacketReader packet)
    {
        int dungeonId = packet.ReadInt();

        if (session.Player.Party == null)
        {
            Party newParty = new(session.Player);
            GameServer.PartyManager.AddParty(newParty);

            session.Send(PartyPacket.Create(newParty, false));
            session.Send(PartyPacket.PartyHelp(dungeonId));
            MapleServer.BroadcastPacketAll(DungeonHelperPacket.BroadcastAssist(newParty, dungeonId));

            return;
        }

        Party party = session.Player.Party;

        party.BroadcastPacketParty(PartyPacket.PartyHelp(dungeonId));
        MapleServer.BroadcastPacketAll(DungeonHelperPacket.BroadcastAssist(party, dungeonId));
    }
Пример #17
0
    private static void HandleReadyCheckUpdate(GameSession session, PacketReader packet)
    {
        int  checkNum = packet.ReadInt() + 1; //+ 1 is because the ReadyChecks variable is always 1 ahead
        byte response = packet.ReadByte();

        Party party = session.Player.Party;

        if (party == null)
        {
            return;
        }

        party.BroadcastPacketParty(PartyPacket.ReadyCheck(session.Player, response));

        party.ReadyCheck.Add(session.Player);
        if (party.ReadyCheck.Count == party.Members.Count)
        {
            party.BroadcastPacketParty(PartyPacket.EndReadyCheck());
            party.ReadyCheck.Clear();
        }
    }
Пример #18
0
        private void HandleKick(GameSession session, PacketReader packet)
        {
            long charId = packet.ReadLong();

            Party party = GameServer.PartyManager.GetPartyByLeader(session.Player);

            if (party == null)
            {
                return;
            }

            Player kickedPlayer = GameServer.Storage.GetPlayerById(charId);

            if (kickedPlayer == null)
            {
                return;
            }

            party.BroadcastPacketParty(PartyPacket.Kick(kickedPlayer));
            party.RemoveMember(kickedPlayer);
        }
Пример #19
0
        private void HandleReadyCheckUpdate(GameSession session, PacketReader packet)
        {
            int  checkNum = packet.ReadInt() + 1; //+ 1 is because the ReadyChecks variable is always 1 ahead
            byte accept   = packet.ReadByte();

            Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId);

            if (party == null)
            {
                return;
            }
            if (checkNum != party.ReadyChecks)
            {
                return;
            }
            party.BroadcastPacketParty(PartyPacket.ReadyCheck(session.Player, accept));
            party.RemainingMembers -= 1;
            if (party.RemainingMembers == 0)
            {
                party.BroadcastPacketParty(PartyPacket.EndReadyCheck());
            }
        }
Пример #20
0
        private void HandleSetLeader(GameSession session, PacketReader packet)
        {
            string target = packet.ReadUnicodeString();

            Player newLeader = GameServer.Storage.GetPlayerByName(target);

            if (newLeader == null)
            {
                return;
            }

            Party party = GameServer.PartyManager.GetPartyByLeader(session.Player);

            if (party == null)
            {
                return;
            }

            party.BroadcastPacketParty(PartyPacket.SetLeader(newLeader));
            party.Leader = newLeader;
            party.Members.Remove(newLeader);
            party.Members.Insert(0, newLeader);
        }
Пример #21
0
        public static void PartyInviteResponses(InPacket lea, Client c)
        {
            int Respons = lea.ReadInt();

            if (Respons == 0)
            {
                PartyPacket.PartyInviteResponses(c.Character.Party.getMembers()[0].Character.Client, Respons);

                Member find = null;
                foreach (var chr in c.Character.Party.getMembers())
                {
                    if (chr.Character.CharacterID == c.Character.CharacterID)
                    {
                        find = chr;
                        break;
                    }
                }

                foreach (var chr in c.Character.Party.getMembers())
                {
                    if (chr.Character.CharacterID != c.Character.CharacterID)
                    {
                        chr.Character.Party.getMembers().Remove(find);
                    }
                }

                c.Character.Party.getMembers().Clear();
            }
            else if (Respons == 1)
            {
                PartyPacket.PartyInviteResponses(c, Respons);
                foreach (var chr in c.Character.Party.getMembers())
                {
                    PartyPacket.PartyUpdate(chr.Character.Client);
                }
            }
        }
Пример #22
0
        private void HandleInvite(GameSession session, PacketReader packet)
        {
            string target = packet.ReadUnicodeString();

            Player other = GameServer.Storage.GetPlayerByName(target);

            if (other == null)
            {
                return;
            }
            if (other.PartyId == 0)
            {
                other.Session.Send(PartyPacket.SendInvite(session.Player));
                if (session.Player.PartyId == 0)
                {
                    session.Send(PartyPacket.Create(session.Player));
                }
                //pSession.Send(ChatPacket.Send(session.Player, "You were invited to a party by " + session.Player.Name, ChatType.NoticeAlert));
            }
            else
            {
                session.Send(ChatPacket.Send(session.Player, other.Session.Player.Name + " is already in a party.", ChatType.NoticeAlert2));
            }
        }
Пример #23
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));
        }
Пример #24
0
        private void HandleJoin(GameSession session, PacketReader packet)
        {
            string target  = packet.ReadUnicodeString(); //Who invited the player
            int    accept  = packet.ReadByte();          //If the player accepted
            int    unknown = packet.ReadInt();           //Something something I think it's dungeon not sure

            Player partyLeader = GameServer.Storage.GetPlayerByName(target);

            if (partyLeader == null)
            {
                return;
            }
            GameSession leaderSession = partyLeader.Session;

            if (accept == 1)
            {
                Party party = GameServer.PartyManager.GetPartyByLeader(partyLeader);
                if (party != null)
                {
                    //Existing party, add joining player to all other party members.
                    party.BroadcastPacketParty(PartyPacket.Join(session.Player));
                    party.BroadcastPacketParty(PartyPacket.UpdatePlayer(session.Player));
                    party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(session.Player));
                    party.AddMember(session.Player);
                }
                else
                {
                    //Create new party
                    Party newParty = new Party(GuidGenerator.Int(), 10, new List <Player> {
                        partyLeader, session.Player
                    });
                    GameServer.PartyManager.AddParty(newParty);

                    //Send the party leader all the stuff for the joining player
                    leaderSession.Send(PartyPacket.Join(session.Player));
                    leaderSession.Send(PartyPacket.UpdatePlayer(session.Player));
                    leaderSession.Send(PartyPacket.UpdateHitpoints(session.Player));

                    leaderSession.Send(PartyPacket.UpdateHitpoints(partyLeader));

                    partyLeader.PartyId = newParty.Id;

                    party = newParty;
                }

                session.Player.PartyId = party.Id;

                //Create existing party based on the list of party members
                session.Send(PartyPacket.CreateExisting(partyLeader, party.Members));
                session.Send(PartyPacket.UpdatePlayer(session.Player));
                foreach (Player partyMember in party.Members)
                {
                    //Skip first character because of the scuffed Create packet. For now this is a workaround and functions the same.
                    if (partyMember.CharacterId != party.Members.First().CharacterId)
                    {
                        //Adds the party member to the UI
                        session.Send(PartyPacket.Join(partyMember));
                    }
                    //Update the HP for each party member.
                    session.Send(PartyPacket.UpdateHitpoints(partyMember));
                }
                //Sometimes the party leader doesn't get set correctly. Not sure how to fix.
            }
            else
            {
                //Send Decline message to inviting player
                leaderSession.Send(ChatPacket.Send(partyLeader, session.Player.Name + " declined the invitation.", ChatType.NoticeAlert2));
            }
        }
Пример #25
0
    private static void HandleInvite(GameSession session, PacketReader packet)
    {
        string target = packet.ReadUnicodeString();

        Player other = GameServer.PlayerManager.GetPlayerByName(target);

        if (other == null)
        {
            return;
        }

        if (session.Player.Party != null)
        {
            Party party = session.Player.Party;

            if (party.Leader != session.Player)
            {
                session.Send(PartyPacket.Notice(session.Player, PartyNotice.NotLeader));
                return;
            }

            if (other == session.Player)
            {
                session.Send(PartyPacket.Notice(session.Player, PartyNotice.InviteSelf));
                return;
            }

            if (other.Party != null)
            {
                Party otherParty = other.Party;

                if (otherParty.Members.Count > 1)
                {
                    session.Send(PartyPacket.Notice(session.Player, PartyNotice.UnableToInvite));
                    return;
                }
            }

            other.Session.Send(PartyPacket.SendInvite(session.Player, party));
        }
        else
        {
            if (other.Party != null)
            {
                Party otherParty = other.Party;

                if (otherParty.Members.Count == 1)
                {
                    Party newParty = new(session.Player);
                    GameServer.PartyManager.AddParty(newParty);

                    session.Send(PartyPacket.Create(newParty, true));
                    other.Session.Send(PartyPacket.SendInvite(session.Player, newParty));
                    return;
                }

                session.Send(PartyPacket.Notice(other, PartyNotice.RequestToJoin));
                otherParty.Leader.Session.Send(PartyPacket.JoinRequest(session.Player));
                return;
            }

            {
                // create party
                Party newParty = new(session.Player);
                GameServer.PartyManager.AddParty(newParty);
                session.Send(PartyPacket.Create(newParty, true));
                other.Session.Send(PartyPacket.SendInvite(session.Player, newParty));
            }
        }
    }
Пример #26
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        long     accountId = packet.ReadLong();
        AuthData authData  = DatabaseManager.AuthData.GetByAccountId(accountId);

        Player dbPlayer = DatabaseManager.Characters.FindPlayerById(authData.OnlineCharacterId);

        // Backwards seeking because we read accountId here
        packet.Skip(-8);
        HandleCommon(session, packet);

        session.InitPlayer(dbPlayer);

        Player player = session.Player;

        player.Session                             = session;
        player.Wallet.Meso.Session                 = session;
        player.Wallet.ValorToken.Session           = session;
        player.Wallet.Treva.Session                = session;
        player.Wallet.Rue.Session                  = session;
        player.Wallet.HaviFruit.Session            = session;
        player.Account.Meret.Session               = session;
        player.Account.GameMeret.Session           = session;
        player.Account.EventMeret.Session          = session;
        player.Account.MesoToken.Session           = session;
        player.Account.BankInventory.Mesos.Session = session;
        player.Levels.Player                       = player;
        player.BuddyList                           = GameServer.BuddyManager.GetBuddies(player.CharacterId);
        player.Mailbox                             = GameServer.MailManager.GetMails(player.CharacterId);

        GameServer.PlayerManager.AddPlayer(player);
        GameServer.BuddyManager.SetFriendSessions(player);

        // Only send buddy login notification if player is not changing channels
        if (!player.IsMigrating)
        {
            player.UpdateBuddies();
        }

        if (player.GuildId != 0)
        {
            Guild guild = GameServer.GuildManager.GetGuildById(player.GuildId);
            player.Guild = guild;
            GuildMember guildMember = guild.Members.First(x => x.Id == player.CharacterId);
            guildMember.Player.Session = session;
            player.GuildMember         = guildMember;
            session.Send(GuildPacket.UpdateGuild(guild));
            guild.BroadcastPacketGuild(GuildPacket.MemberJoin(player));
            guild.BroadcastPacketGuild(GuildPacket.MemberLoggedIn(player), session);
        }

        player.IsMigrating = false;

        //session.Send(0x27, 0x01); // Meret market related...?
        session.Send(MushkingRoyaleSystemPacket.LoadStats(session.Player.Account.MushkingRoyaleStats));
        session.Send(MushkingRoyaleSystemPacket.LoadMedals(session.Player.Account));

        player.GetUnreadMailCount();
        session.Send(BuddyPacket.Initialize());
        session.Send(BuddyPacket.LoadList(player.BuddyList));
        session.Send(BuddyPacket.EndList(player.BuddyList.Count));

        // Meret market
        //session.Send("6E 00 0B 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
        //session.Send("6E 00 0C 00 00 00 00".ToByteArray());
        // UserConditionEvent
        //session.Send("BF 00 00 00 00 00 00".ToByteArray());
        // PCBangBonus
        //session.Send("A7 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
        TimeSyncPacket.SetInitial1();
        TimeSyncPacket.SetInitial2();
        TimeSyncPacket.Request();
        session.Send(StatPacket.SetStats(session.Player.FieldPlayer));
        session.Player.ClientTickSyncLoop();
        session.Send(DynamicChannelPacket.DynamicChannel());
        session.Send(ServerEnterPacket.Enter(session));
        // SendUgc f(0x16), SendCash f(0x09), SendContentShutdown f(0x01, 0x04), SendPvp f(0x0C)
        session.Send(SyncNumberPacket.Send());
        // 0x112, Prestige f(0x00, 0x07)
        session.Send(PrestigePacket.Prestige(player));

        // Load inventory tabs
        foreach (InventoryTab tab in Enum.GetValues(typeof(InventoryTab)))
        {
            player.Inventory.LoadInventoryTab(session, tab);
        }

        if (player.Account.HomeId != 0)
        {
            Home home = GameServer.HomeManager.GetHomeById(player.Account.HomeId);
            player.Account.Home = home;
            session.Send(WarehouseInventoryPacket.StartList());
            int counter = 0;
            foreach (KeyValuePair <long, Item> kvp in home.WarehouseInventory)
            {
                session.Send(WarehouseInventoryPacket.Load(kvp.Value, ++counter));
            }
            session.Send(WarehouseInventoryPacket.EndList());

            session.Send(FurnishingInventoryPacket.StartList());
            foreach (Cube cube in home.FurnishingInventory.Values.Where(x => x.Item != null))
            {
                session.Send(FurnishingInventoryPacket.Load(cube));
            }
            session.Send(FurnishingInventoryPacket.EndList());
        }

        session.Send(QuestPacket.StartList());
        session.Send(QuestPacket.Packet1F());
        session.Send(QuestPacket.Packet20());

        IEnumerable <List <QuestStatus> > packetCount = player.QuestData.Values.ToList().SplitList(200); // Split the quest list in 200 quests per packet

        foreach (List <QuestStatus> item in packetCount)
        {
            session.Send(QuestPacket.SendQuests(item));
        }
        session.Send(QuestPacket.EndList());

        session.Send(TrophyPacket.WriteTableStart());
        List <Trophy> trophyList = new(player.TrophyData.Values);
        IEnumerable <List <Trophy> > trophyListPackets = trophyList.SplitList(60);

        foreach (List <Trophy> trophy in trophyListPackets)
        {
            session.Send(TrophyPacket.WriteTableContent(trophy));
        }

        // SendQuest, SendAchieve, SendManufacturer, SendUserMaid
        session.Send(UserEnvPacket.SetTitles(player));
        session.Send(UserEnvPacket.Send04());
        session.Send(UserEnvPacket.Send05());
        session.Send(UserEnvPacket.UpdateLifeSkills(player.GatheringCount));
        session.Send(UserEnvPacket.Send09());
        session.Send(UserEnvPacket.Send10());
        session.Send(UserEnvPacket.Send12());

        // SendMeretMarket f(0xC9)
        session.Send(FishingPacket.LoadAlbum(player));
        // SendPvp f(0x16,0x17), ResponsePet f(0x07), 0xF6
        // CharacterAbility
        // E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

        // Key bindings and skill slots would normally be loaded from a database
        // If the character is not a new character, this is what we would send
        session.Send(KeyTablePacket.SendFullOptions(player.GameOptions));

        if (player.MapId == (int)Map.UnknownLocation)  // tutorial map
        {
            session.Send(KeyTablePacket.AskKeyboardOrMouse());
        }

        // SendKeyTable f(0x00), SendGuideRecord f(0x03), GameEvent f(0x00)
        // SendBannerList f(0x19), SendRoomDungeon f(0x05, 0x14, 0x17)
        // FieldEntrance
        session.Send("19 00 00 65 00 00 00 29 7C 7D 01 0C 4D A1 6F 01 0C D3 1A 5F 01 0C EF 03 00 00 01 A2 3C 31 01 0C 3F 0C B7 0D 01 6B 55 5F 01 0C 3A 77 31 01 0C B1 98 BA 01 0C 03 90 5F 01 0C F9 7A 40 01 0C 91 B5 40 01 0C F9 57 31 01 0C 2F C7 BB 0D 01 81 97 7D 01 0C C2 70 5F 01 0C 51 96 40 01 0C B9 38 31 01 0C 41 78 7D 01 0C 65 9D 6F 01 0C 83 51 5F 01 0C 52 73 31 01 0C FF E0 B8 0D 01 11 77 40 01 0C A9 B1 40 01 0C 11 54 31 01 0C DA 6C 5F 01 0C 69 92 40 01 0C D1 34 31 01 0C 7D 99 6F 01 0C 03 13 5F 01 0C 69 6F 31 01 0C 32 88 5F 01 0C 9B 4D 5F 01 0C FF 6F B6 0D 01 29 73 40 01 0C C1 AD 40 01 0C 29 50 31 01 0C 81 8E 40 01 0C E9 30 31 01 0C 09 CE 8C 01 0C 95 95 6F 01 0C 1B 0F 5F 01 0C 4A 84 5F 01 0C B3 49 5F 01 0C 82 6B 31 01 0C 4F 15 BC 0D 01 F9 8C BA 01 00 D9 A9 40 01 0C 41 4C 31 01 0C EF B9 B8 0D 01 99 8A 40 01 0C 21 CA 8C 01 0C 01 AD 6F 01 0C 33 0B 5F 01 0C 99 67 31 01 0C 62 80 5F 01 0C CB 45 5F 01 0C 79 08 9C 01 0C F1 A5 40 01 0C E1 87 7D 01 0C BB 9B 5F 01 0C B1 86 40 01 0C 39 C6 8C 01 0C 7A 7C 5F 01 0C B2 63 31 01 0C 29 85 BA 01 0E 91 04 9C 01 0C 09 A2 40 01 0C 71 44 31 01 0C F9 83 7D 01 0C 1D A9 6F 01 0C D3 97 5F 01 0C C9 82 40 01 0C 51 C2 8C 01 0C 61 BD 40 01 0C C9 5F 31 01 0C 51 9F 7D 01 0C 92 78 5F 01 0C 0F 08 B9 0D 01 A9 00 9C 01 0C 89 40 31 01 0C 11 80 7D 01 0C 35 A5 6F 01 0C BB 1E 5F 01 0C 53 59 5F 01 0C E9 03 00 00 01 22 7B 31 01 0C EB 93 5F 01 0C EA 03 00 00 01 E1 7E 40 01 0C 69 BE 8C 01 0C 79 B9 40 01 0C E1 5B 31 01 0C EB 03 00 00 01 69 9B 7D 01 0C AA 74 5F 01 0C EC 03 00 00 01 ED 03 00 00 01 C1 FC 9B 01 0C EE 03 00 00 01".ToByteArray());
        // 0xF0, ResponsePet P(0F 01)
        // RequestFieldEnter
        //session.Send("16 00 00 41 75 19 03 00 01 8A 42 0F 00 00 00 00 00 00 C0 28 C4 00 40 03 44 00 00 16 44 00 00 00 00 00 00 00 00 55 FF 33 42 E8 49 01 00".ToByteArray());
        session.Send(RequestFieldEnterPacket.RequestEnter(session.Player.FieldPlayer));

        Party party = GameServer.PartyManager.GetPartyByMember(player.CharacterId);

        if (party != null)
        {
            player.Party = party;
            party.BroadcastPacketParty(PartyPacket.LoginNotice(player), session);
            session.Send(PartyPacket.Create(party, false));
        }

        // SendUgc: 15 01 00 00 00 00 00 00 00 00 00 00 00 4B 00 00 00
        // SendHomeCommand: 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00

        session.Player.TimeSyncLoop();
        session.Send(TimeSyncPacket.SetSessionServerTick(0));
        //session.Send("B9 00 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00".ToByteArray());
        session.Send(ServerEnterPacket.Confirm());

        //session.Send(0xF0, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00);
        //session.Send(0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
        //session.Send(ServerEnterPacket.Confirm());
    }
Пример #27
0
        private void JoinParty(GameSession session, string leaderName, bool accept, int unknown)
        {
            Player partyLeader = GameServer.Storage.GetPlayerByName(leaderName);

            if (partyLeader == null)
            {
                return;
            }

            GameSession leaderSession = partyLeader.Session;

            if (!accept)
            {
                //Send Decline message to inviting player
                leaderSession.Send(ChatPacket.Send(partyLeader, session.Player.Name + " declined the invitation.",
                                                   ChatType.NoticeAlert2));
                return;
            }

            Party party = GameServer.PartyManager.GetPartyByLeader(partyLeader);

            if (party != null)
            {
                //Existing party, add joining player to all other party members.
                party.BroadcastPacketParty(PartyPacket.Join(session.Player));
                party.BroadcastPacketParty(PartyPacket.UpdatePlayer(session.Player));
                party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(session.Player));
                party.AddMember(session.Player);

                if (party.PartyFinderId != 0)
                {
                    if (party.Members.Count >= party.MaxMembers)
                    {
                        party.PartyFinderId = 0; //Hide from party finder if full
                        party.BroadcastPacketParty(MatchPartyPacket.RemoveListing(party));
                        party.BroadcastPacketParty(
                            MatchPartyPacket.SendListings(GameServer.PartyManager.GetPartyFinderList()));
                        party.BroadcastPacketParty(PartyPacket.MatchParty(null));
                    }
                    else
                    {
                        session.Send(
                            MatchPartyPacket.CreateListing(party)); //Add recruitment listing for newly joining player
                        session.Send(PartyPacket.MatchParty(party));
                    }
                }
            }
            else
            {
                //Create new party
                Party newParty = new(10, new List <Player> {
                    partyLeader, session.Player
                });
                GameServer.PartyManager.AddParty(newParty);

                //Send the party leader all the stuff for the joining player
                leaderSession.Send(PartyPacket.Join(session.Player));
                leaderSession.Send(PartyPacket.UpdatePlayer(session.Player));
                leaderSession.Send(PartyPacket.UpdateHitpoints(session.Player));

                leaderSession.Send(PartyPacket.UpdateHitpoints(partyLeader));

                party = newParty;
            }

            //Create existing party based on the list of party members
            session.Send(PartyPacket.CreateExisting(partyLeader, party.Members));
            session.Send(PartyPacket.UpdatePlayer(session.Player));
            foreach (Player partyMember in party.Members)
            {
                //Skip first character because of the scuffed Create packet. For now this is a workaround and functions the same.
                if (partyMember.CharacterId != party.Members.First().CharacterId)
                {
                    //Adds the party member to the UI
                    session.Send(PartyPacket.Join(partyMember));
                }

                //Update the HP for each party member.
                session.Send(PartyPacket.UpdateHitpoints(partyMember));
            }
        }
Пример #28
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();
    }
Пример #29
0
    public override void Handle(GameSession session, PacketReader packet)
    {
        long     accountId = packet.ReadLong();
        AuthData authData  = DatabaseManager.AuthData.GetByAccountId(accountId);

        Player dbPlayer = DatabaseManager.Characters.FindPlayerById(authData.OnlineCharacterId, session);

        // Backwards seeking because we read accountId here
        packet.Skip(-8);
        HandleCommon(session, packet);

        session.InitPlayer(dbPlayer);

        Player player = session.Player;

        player.BuddyList = GameServer.BuddyManager.GetBuddies(player.CharacterId);
        player.Mailbox   = GameServer.MailManager.GetMails(player.CharacterId);

        GameServer.PlayerManager.AddPlayer(player);
        GameServer.BuddyManager.SetFriendSessions(player);

        // Only send buddy login notification if player is not changing channels
        if (!player.IsMigrating)
        {
            player.UpdateBuddies();
        }

        if (player.GuildId != 0)
        {
            Guild guild = GameServer.GuildManager.GetGuildById(player.GuildId);
            player.Guild = guild;
            GuildMember guildMember = guild.Members.First(x => x.Id == player.CharacterId);
            guildMember.Player.Session = session;
            player.GuildMember         = guildMember;
            session.Send(GuildPacket.UpdateGuild(guild));
            guild.BroadcastPacketGuild(GuildPacket.MemberJoin(player));
            guild.BroadcastPacketGuild(GuildPacket.MemberLoggedIn(player), session);
        }

        player.IsMigrating = false;

        //session.Send(0x27, 0x01); // Meret market related...?
        session.Send(MushkingRoyaleSystemPacket.LoadStats(player.Account.MushkingRoyaleStats));
        session.Send(MushkingRoyaleSystemPacket.LoadMedals(player.Account));

        player.GetUnreadMailCount();
        session.Send(BuddyPacket.Initialize());
        session.Send(BuddyPacket.LoadList(player.BuddyList));
        session.Send(BuddyPacket.EndList(player.BuddyList.Count));

        // Meret market
        //session.Send("6E 00 0B 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());
        //session.Send("6E 00 0C 00 00 00 00".ToByteArray());
        // UserConditionEvent
        //session.Send("BF 00 00 00 00 00 00".ToByteArray());
        // PCBangBonus
        //session.Send("A7 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00".ToByteArray());

        session.Send(TimeSyncPacket.SetInitial1());
        session.Send(TimeSyncPacket.SetInitial2());

        session.Send(StatPacket.SetStats(session.Player.FieldPlayer));
        // session.Send(StatPacket.SetStats(session.Player.FieldPlayer)); // Second packet is meant to send the stats initialized, for now we'll just send the first one

        session.Player.ClientTickSyncLoop();
        session.Send(DynamicChannelPacket.DynamicChannel(short.Parse(ConstantsMetadataStorage.GetConstant("ChannelCount"))));

        session.Send(ServerEnterPacket.Enter(session));
        session.Send(UgcPacket.Unknown22());
        session.Send(CashPacket.Unknown09());

        // SendContentShutdown f(0x01, 0x04)
        session.Send(PvpPacket.Mode0C());
        session.Send(SyncNumberPacket.Send());
        session.Send(SyncValuePacket.SetSyncValue(120000)); // unknown what this value means

        session.Send(PrestigePacket.SetLevels(player));
        session.Send(PrestigePacket.WeeklyMissions());

        // Load inventory tabs
        foreach (InventoryTab tab in Enum.GetValues(typeof(InventoryTab)))
        {
            player.Inventory.LoadInventoryTab(session, tab);
        }

        if (player.Account.HomeId != 0)
        {
            Home home = GameServer.HomeManager.GetHomeById(player.Account.HomeId);
            player.Account.Home = home;
            session.Send(WarehouseInventoryPacket.StartList());
            int counter = 0;
            foreach (KeyValuePair <long, Item> kvp in home.WarehouseInventory)
            {
                session.Send(WarehouseInventoryPacket.Load(kvp.Value, ++counter));
            }

            session.Send(WarehouseInventoryPacket.EndList());

            session.Send(FurnishingInventoryPacket.StartList());
            foreach (Cube cube in home.FurnishingInventory.Values.Where(x => x.Item != null))
            {
                session.Send(FurnishingInventoryPacket.Load(cube));
            }

            session.Send(FurnishingInventoryPacket.EndList());
        }

        session.Send(QuestPacket.StartList());
        session.Send(QuestPacket.Packet1F());
        session.Send(QuestPacket.Packet20());

        IEnumerable <List <QuestStatus> > packetCount = player.QuestData.Values.ToList().SplitList(200); // Split the quest list in 200 quests per packet

        foreach (List <QuestStatus> item in packetCount)
        {
            session.Send(QuestPacket.SendQuests(item));
        }

        session.Send(QuestPacket.EndList());

        session.Send(TrophyPacket.WriteTableStart());
        List <Trophy> trophyList = new(player.TrophyData.Values);
        IEnumerable <List <Trophy> > trophyListPackets = trophyList.SplitList(60);

        foreach (List <Trophy> trophy in trophyListPackets)
        {
            session.Send(TrophyPacket.WriteTableContent(trophy));
        }

        // SendQuest, SendAchieve, SendManufacturer, SendUserMaid
        session.Send(UserEnvPacket.SetTitles(player));
        session.Send(UserEnvPacket.Send04());
        session.Send(UserEnvPacket.Send05());
        session.Send(UserEnvPacket.UpdateLifeSkills(player.GatheringCount));
        session.Send(UserEnvPacket.Send09());
        session.Send(UserEnvPacket.Send10());
        session.Send(UserEnvPacket.Send12());

        session.Send(MeretMarketPacket.ModeC9());

        session.Send(FishingPacket.LoadAlbum(player));

        session.Send(PvpPacket.Mode16());
        session.Send(PvpPacket.Mode17());

        session.Send(ResponsePetPacket.Mode07());
        // LegionBattle (0xF6)
        // CharacterAbility
        // E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

        // Key bindings and skill slots would normally be loaded from a database
        // If the character is not a new character, this is what we would send
        session.Send(KeyTablePacket.SendFullOptions(player.GameOptions));

        if (player.MapId == (int)Map.UnknownLocation)  // tutorial map
        {
            session.Send(KeyTablePacket.AskKeyboardOrMouse());
        }

        // SendKeyTable f(0x00), SendGuideRecord f(0x03), GameEvent f(0x00)
        // SendBannerList f(0x19), SendRoomDungeon f(0x05, 0x14, 0x17)
        session.Send(DungeonListPacket.DungeonList());
        // 0xF0, ResponsePet P(0F 01)
        // RequestFieldEnter
        //session.Send("16 00 00 41 75 19 03 00 01 8A 42 0F 00 00 00 00 00 00 C0 28 C4 00 40 03 44 00 00 16 44 00 00 00 00 00 00 00 00 55 FF 33 42 E8 49 01 00".ToByteArray());
        session.Send(RequestFieldEnterPacket.RequestEnter(player.FieldPlayer));

        Party party = GameServer.PartyManager.GetPartyByMember(player.CharacterId);

        if (party != null)
        {
            player.Party = party;
            party.BroadcastPacketParty(PartyPacket.LoginNotice(player), session);
            session.Send(PartyPacket.Create(party, false));
        }

        // SendUgc: 15 01 00 00 00 00 00 00 00 00 00 00 00 4B 00 00 00
        // SendHomeCommand: 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00

        player.TimeSyncLoop();
        session.Send(TimeSyncPacket.SetSessionServerTick(0));
        //session.Send("B9 00 00 E1 0F 26 89 7F 98 3C 26 00 00 00 00 00 00 00 00".ToByteArray());
        session.Send(ServerEnterPacket.Confirm());

        //session.Send(0xF0, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00);
        //session.Send(0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
    }