Пример #1
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)
            {
                session.Send(ChatPacket.Send(session.Player, other.Session.Player.Name + " is already in a party.",
                                             ChatType.NoticeAlert2));
                return;
            }

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

            if (party == null)
            {
                session.Send(PartyPacket.Create(session.Player));
            }
            else if (party.Members.Count >= party.MaxMembers)
            {
                session.Send(ChatPacket.Send(session.Player, "Your party is full!", ChatType.NoticeAlert2));
                return;
            }

            other.Session.Send(PartyPacket.SendInvite(session.Player));
        }
Пример #2
0
    private static void SetEnchantStats(GameSession session, ItemEnchant itemEnchantStats, Item item)
    {
        Dictionary <StatAttribute, ItemStat> statDiff = GetEnchantStatDiff(item.Stats.Enchants, itemEnchantStats.Stats);

        foreach (ItemStat stat in itemEnchantStats.Stats.Values)
        {
            if (!item.Stats.Enchants.ContainsKey(stat.ItemAttribute))
            {
                item.Stats.Enchants[stat.ItemAttribute] = new BasicStat(stat.ItemAttribute, stat.Rate, StatAttributeType.Rate);
                continue;
            }
            item.Stats.Enchants[stat.ItemAttribute].Flat = stat.Flat;
            item.Stats.Enchants[stat.ItemAttribute].Rate = stat.Rate;
        }
        item.EnchantLevel++;
        item.EnchantExp = 0;
        item.Charges   -= itemEnchantStats.Rates.ChargesAdded;
        if (item.EnchantLevel > 11)
        {
            string message = $"3,{item.Uid},{ChatLinkType.Enchant},{session.Player.Name}"; //unk what 3 is
            MapleServer.BroadcastPacketAll(ItemLinkPacket.SendLinkItem(new()
            {
                item
            }));
            MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, ChatType.ItemEnchant));
        }

        session.Send(ItemEnchantPacket.EnchantSuccess(item, statDiff.Values.ToList()));
        //TODO: If item is equipped, update stats
    }
Пример #3
0
 public void SendChat(Player player, string message, ChatType type)
 {
     Broadcast(session =>
     {
         session.Send(ChatPacket.Send(player, message, type));
     });
 }
Пример #4
0
        private static void HandleGuildNoticeChat(GameSession session, string message, ChatType type)
        {
            Guild guild = GameServer.GuildManager.GetGuildById(session.Player.GuildId);

            if (guild == null || session.Player != guild.Leader) // TODO: change this to allow jr leaders to be able to use guild notices
            {
                return;
            }
            guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type));
        }
Пример #5
0
        private static void HandlePartyChat(GameSession session, string message, ChatType type)
        {
            Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId);

            if (party == null)
            {
                return;
            }

            party.BroadcastPacketParty(ChatPacket.Send(session.Player, message, type));
        }
Пример #6
0
        private static void HandleGuildChat(GameSession session, string message, ChatType type)
        {
            Guild guild = GameServer.GuildManager.GetGuildById(session.Player.GuildId);

            if (guild == null)
            {
                return;
            }

            guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type));
        }
Пример #7
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            ChatType type      = (ChatType)packet.ReadInt();
            string   message   = packet.ReadUnicodeString();
            string   recipient = packet.ReadUnicodeString();

            packet.ReadLong();

            GameCommandActions.Process(session, message);

            switch (type)
            {
            case ChatType.Channel:     //TODO: Send to all players on current channel
                break;

            case ChatType.Super:
            case ChatType.World:
                //Send to all players online
                MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type));
                break;

            case ChatType.GuildNotice:
            case ChatType.Guild:
                //TODO: Send to all in guild
                break;

            case ChatType.Party:
                Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId);
                if (party != null)
                {
                    party.BroadcastPacketParty(ChatPacket.Send(session.Player, message, type));
                }
                break;

            case ChatType.WhisperTo:
                Player recipientPlayer = GameServer.Storage.GetPlayerByName(recipient);

                if (recipientPlayer != null)
                {
                    recipientPlayer.Session.Send(ChatPacket.Send(session.Player, message, ChatType.WhisperFrom));
                    session.Send(ChatPacket.Send(recipientPlayer, message, ChatType.WhisperTo));
                }
                else
                {
                    session.Send(ChatPacket.Send(session.Player, "Player not found or they are not online.", ChatType.WhisperFail));
                }
                break;

            default:
                session.FieldManager.SendChat(session.Player, message, type);
                break;
            }
        }
Пример #8
0
        private static void HandleWorldChat(GameSession session, string message, ChatType type)
        {
            Item voucher = session.Player.Inventory.Items.Values.FirstOrDefault(x => x.Tag == "FreeWorldChatCoupon");

            if (voucher != null)
            {
                session.Send(NoticePacket.Notice(SystemNotice.UsedWorldChatVoucher, NoticeType.ChatAndFastText));
                InventoryController.Consume(session, voucher.Uid, 1);
            }
            else if (!session.Player.Wallet.RemoveMerets(30))
            {
                session.Send(ChatPacket.Error(session.Player, SystemNotice.InsufficientMerets, ChatType.NoticeAlert));
                return;
            }

            MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type));
        }
Пример #9
0
        private static void HandleWhisperChat(GameSession session, string recipient, string message)
        {
            Player recipientPlayer = GameServer.Storage.GetPlayerByName(recipient);

            if (recipientPlayer == null)
            {
                session.Send(ChatPacket.Error(session.Player, SystemNotice.UnableToWhisper, ChatType.WhisperFail));
                return;
            }

            if (BuddyManager.IsBlocked(session.Player, recipientPlayer))
            {
                session.Send(ChatPacket.Error(session.Player, SystemNotice.UnableToWhisper, ChatType.WhisperFail));
                return;
            }

            recipientPlayer.Session.Send(ChatPacket.Send(session.Player, message, ChatType.WhisperFrom));
            session.Send(ChatPacket.Send(recipientPlayer, message, ChatType.WhisperTo));
        }
Пример #10
0
        private void HandleVoteKick(GameSession session, PacketReader packet)
        {
            long charId = packet.ReadLong();

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

            if (party == null)
            {
                return;
            }

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

            if (kickedPlayer == null)
            {
                return;
            }

            party.BroadcastPacketParty(ChatPacket.Send(session.Player, session.Player.Name + " voted to kick " + kickedPlayer.Name, ChatType.NoticeAlert3));
            //TODO: Keep a counter of vote kicks for a player?
        }
Пример #11
0
        private static void HandleJoin(GameSession session, PacketReader packet)
        {
            Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId);

            if (party == null)
            {
                return;
            }

            long clubId = packet.ReadLong();

            Club club = GameServer.ClubManager.GetClubById(clubId);

            if (club == null)
            {
                return;
            }

            if (club.Leader.CharacterId == session.Player.CharacterId)
            {
                party.BroadcastPacketParty(ClubPacket.UpdatePlayerClubList(session.Player, club));
            }
            else
            {
                int response = packet.ReadInt(); // 0 = accept, 76 (0x4C) = reject

                if (response == 0)
                {
                    party.BroadcastPacketParty(ClubPacket.ConfirmCreate(club.Id));
                    club.Leader.Session.Send(ClubPacket.Join(session.Player, club));
                    club.Leader.Session.Send(ClubPacket.Establish(club));
                    // TODO add member to club (club.AddMember(session.Player);)
                }
                else
                {
                    // TODO update to proper rejection packet
                    party.Leader.Session.Send(ChatPacket.Send(party.Leader, session.Player.Name + " declined the invitation.", ChatType.NoticeAlert2));
                }
            }
        }
Пример #12
0
        private static void HandleSuperChat(GameSession session, string message, ChatType type)
        {
            if (session.Player.SuperChat == 0)
            {
                return;
            }

            Item superChatItem = session.Player.Inventory.Items.Values.FirstOrDefault(x => x.Function.Id == session.Player.SuperChat);

            if (superChatItem == null)
            {
                session.Player.SuperChat = 0;
                session.Send(SuperChatPacket.Deselect(session.FieldPlayer));
                session.Send(ChatPacket.Error(session.Player, SystemNotice.InsufficientSuperChatThemes, ChatType.NoticeAlert));
                return;
            }

            MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type));
            InventoryController.Consume(session, superChatItem.Uid, 1);
            session.Send(SuperChatPacket.Deselect(session.FieldPlayer));
            session.Player.SuperChat = 0;
        }
Пример #13
0
        private static void HandleGuildAlert(GameSession session, string message, ChatType type)
        {
            Guild guild = GameServer.GuildManager.GetGuildById(session.Player.Guild.Id);

            if (guild == null)
            {
                return;
            }

            GuildMember member = guild.Members.FirstOrDefault(x => x.Player == session.Player);

            if (member == null)
            {
                return;
            }

            if (!((GuildRights)guild.Ranks[member.Rank].Rights).HasFlag(GuildRights.CanGuildAlert))
            {
                return;
            }

            guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type));
        }
Пример #14
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));
            }
        }
Пример #15
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));
            }
        }
Пример #16
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));
            }
        }
Пример #17
0
 public void SendNotice(string message)
 {
     Send(ChatPacket.Send(Player, message, ChatType.NoticeAlert));
 }