Ejemplo n.º 1
0
        private void HandleShopPacket(ISClientMessages opcode, Packet packet)
        {
            switch (opcode)
            {
            case ISClientMessages.PlayerQuitCashShop:     // CC back to channel from cashserver
            {
                string    hash   = packet.ReadString();
                int       charid = packet.ReadInt();
                byte      world  = packet.ReadByte();
                Character chr    = CenterServer.Instance.FindCharacter(charid);
                if (chr == null)
                {
                    return;
                }

                Packet pw = new Packet(ISServerMessages.PlayerChangeServerResult);
                pw.WriteString(hash);
                pw.WriteInt(charid);

                if (World.ID == world &&
                    World.GameServers.TryGetValue(chr.LastChannel, out LocalServer ls))
                {
                    pw.WriteBytes(ls.PublicIP.GetAddressBytes());
                    pw.WriteUShort(ls.Port);

                    RedisBackend.Instance.SetMigratingPlayer(charid);

                    chr.InCashShop  = false;
                    chr.isCCing     = true;
                    chr.LastChannel = 0;

                    // Give the channel server some info from this server
                    var channelPacket = new Packet(ISServerMessages.PlayerChangeServerData);
                    channelPacket.WriteInt(charid);
                    channelPacket.WriteBytes(packet.ReadLeftoverBytes());

                    if (Server.InMaintenance)
                    {
                        // Server in maintenance...
                        ls.TransferConnection?.SendPacket(channelPacket);
                    }
                    else
                    {
                        // Changing channels, meh
                        ls.Connection?.SendPacket(channelPacket);
                    }
                }
                else
                {
                    pw.WriteInt(0);
                    pw.WriteShort(0);
                }
                SendPacket(pw);

                break;
            }
            }
        }
Ejemplo n.º 2
0
        private void HandleGamePacket(ISClientMessages opcode, Packet packet)
        {
            switch (opcode)
            {
                #region Messenger


            case ISClientMessages.MessengerJoin:
                Messenger.JoinMessenger(packet);
                break;

            case ISClientMessages.MessengerLeave:
                Messenger.LeaveMessenger(packet.ReadInt());
                break;

            case ISClientMessages.MessengerInvite:
                Messenger.SendInvite(packet.ReadInt(), packet.ReadString());
                break;

            case ISClientMessages.MessengerBlocked:
                Messenger.Block(packet);
                break;

            case ISClientMessages.MessengerAvatar:
                Messenger.OnAvatar(packet);
                break;

            case ISClientMessages.MessengerChat:
                Messenger.Chat(packet.ReadInt(), packet.ReadString());
                break;

                #endregion

                #region Party

            case ISClientMessages.PartyCreate:
            {
                int       fuker  = packet.ReadInt();
                Character f****r = CenterServer.Instance.FindCharacter(fuker);
                Party.CreateParty(f****r);
                break;
            }

            case ISClientMessages.PartyInvite:
            {
                int       fuker1  = packet.ReadInt();
                int       fuker2  = packet.ReadInt();
                Character fucker1 = CenterServer.Instance.FindCharacter(fuker1);
                if (fucker1 != null && Party.Parties.TryGetValue(fucker1.PartyID, out Party party))
                {
                    party.Invite(fuker1, fuker2);
                }
                break;
            }

            case ISClientMessages.PartyAccept:
            {
                int       AcceptorID = packet.ReadInt();
                Character fucker1    = CenterServer.Instance.FindCharacter(AcceptorID);

                if (fucker1 != null && Party.Invites.TryGetValue(AcceptorID, out Party party))
                {
                    party.TryJoin(fucker1);
                }

                break;
            }

            case ISClientMessages.PartyLeave:
            {
                int       LeaverID = packet.ReadInt();
                Character f****r   = CenterServer.Instance.FindCharacter(LeaverID);

                if (f****r != null && Party.Parties.TryGetValue(f****r.PartyID, out Party party))
                {
                    party.Leave(f****r);
                }

                break;
            }

            case ISClientMessages.PartyExpel:
            {
                int       leader            = packet.ReadInt();
                int       expelledCharacter = packet.ReadInt();
                Character f****r            = CenterServer.Instance.FindCharacter(leader);
                if (f****r != null && Party.Parties.TryGetValue(f****r.PartyID, out Party party))
                {
                    party.Expel(leader, expelledCharacter);
                }

                break;
            }

            case ISClientMessages.PartyDecline:
            {
                int       decliner     = packet.ReadInt();
                String    declinerName = packet.ReadString();
                Character chr          = CenterServer.Instance.FindCharacter(decliner);
                if (chr != null && Party.Invites.TryGetValue(decliner, out Party party))
                {
                    party.DeclineInvite(chr);
                }
                break;
            }

            case ISClientMessages.PartyChat:
            {
                int       chatter = packet.ReadInt();
                string    msg     = packet.ReadString();
                Character chr     = CenterServer.Instance.FindCharacter(chatter);
                if (chr != null && Party.Parties.TryGetValue(chr.PartyID, out Party party))
                {
                    party.Chat(chatter, msg);
                }
                break;
            }

            case ISClientMessages.PlayerUpdateMap:
            {
                int       id     = packet.ReadInt();
                int       map    = packet.ReadInt();
                Character f****r = CenterServer.Instance.FindCharacter(id);

                if (f****r != null)
                {
                    f****r.MapID = map;
                    if (Party.Parties.TryGetValue(f****r.PartyID, out Party party))
                    {
                        party.SilentUpdate(id);
                    }
                }

                break;
            }

            case ISClientMessages.PartyDoorChanged:
            {
                int chrid = packet.ReadInt();
                var door  = new DoorInformation(packet.ReadInt(), packet.ReadInt(), packet.ReadShort(), packet.ReadShort(), chrid);

                var chr = CenterServer.Instance.FindCharacter(chrid);
                if (chr != null && Party.Parties.TryGetValue(chr.PartyID, out var party))
                {
                    party.UpdateDoor(door, chrid);
                }

                break;
            }
                #endregion

                #region Buddy

            case ISClientMessages.BuddyInvite:
            {
                int    inviterId    = packet.ReadInt();
                String inviterName  = packet.ReadString();
                String toInviteName = packet.ReadString();

                Character inviter  = CenterServer.Instance.FindCharacter(inviterName);
                Character toInvite = CenterServer.Instance.FindCharacter(toInviteName, false);
                if (inviter == null)
                {
                    return;
                }

                if (inviter.FriendsList.IsFull())
                {
                    inviter.FriendsList.SendRequestError(12);
                    return;
                }

                if (toInvite == null)
                {
                    //How to get id from name? O.o
                    try
                    {
                        var namedata = CenterServer.Instance.CharacterDatabase.RunQuery("SELECT c.`ID`, u.admin, c.buddylist_size, (SELECT COUNT(*) FROM buddylist WHERE charid = c.ID) AS `current_buddylist_size` FROM characters c JOIN users u ON u.id = c.userid WHERE c.name = @name", "@name", toInviteName) as MySqlDataReader;
                        if (namedata.Read())
                        {
                            int  invitedid        = namedata.GetInt32("ID");
                            int  maxBuddyListSize = namedata.GetInt32("buddylist_size");
                            int  buddyListSize    = namedata.GetInt32("current_buddylist_size");
                            bool isGM             = namedata.GetByte("admin") > 0;
                            namedata.Close();

                            if (isGM && inviter.IsGM == false)
                            {
                                inviter.FriendsList.SendRequestError(14);
                                return;
                            }

                            if (maxBuddyListSize <= buddyListSize)
                            {
                                // buddylist is full
                                inviter.FriendsList.SendRequestError(12);
                                return;
                            }

                            inviter.FriendsList.Add(new BuddyData(invitedid, toInviteName));
                            // No update?

                            CenterServer.Instance.CharacterDatabase.RunQuery(
                                "DELETE FROM buddylist_pending WHERE charid = @toinviteid AND inviter_charid = @inviterid",
                                "@toinviteid", invitedid,
                                "@inviterid", inviterId
                                );

                            CenterServer.Instance.CharacterDatabase.RunQuery(
                                "INSERT INTO buddylist_pending (charid, inviter_charid, inviter_charname) VALUES (@toinviteid, @inviterid, @invitername)",
                                "@toinviteid", invitedid,
                                "@inviterid", inviterId,
                                "@invitername", inviterName
                                );
                        }
                        else
                        {
                            namedata.Close();
                            inviter.FriendsList.SendRequestError(15);
                        }
                    }
                    catch (Exception e)
                    {
                        BuddyList.log.Error($"Offline buddy request failed for {inviterId} {inviterName} {toInviteName}", e);
                    }
                }
                else
                {
                    toInvite.FriendsList.Request(inviter.FriendsList.Owner);
                }
                break;
            }

            case ISClientMessages.BuddyUpdate:
            {
                int       id       = packet.ReadInt();
                string    name     = packet.ReadString();
                Character toUpdate = CenterServer.Instance.FindCharacter(id);
                toUpdate.FriendsList.OnOnlineCC(true, false);
                break;
            }

            case ISClientMessages.BuddyInviteAnswer:
            {
                int       id       = packet.ReadInt();
                String    name     = packet.ReadString();
                Character toAccept = CenterServer.Instance.FindCharacter(id);
                toAccept.FriendsList.AcceptRequest();
                break;
            }

            case ISClientMessages.BuddyListExpand:
            {
                CenterServer.Instance.FindCharacter(packet.ReadInt()).FriendsList.IncreaseCapacity();
                break;
            }

            case ISClientMessages.BuddyChat:
            {
                int    fWho           = packet.ReadInt();
                string Who            = packet.ReadString();
                string what           = packet.ReadString();
                int    recipientCount = packet.ReadByte();
                int[]  recipients     = new int[recipientCount];
                for (var i = 0; i < recipientCount; i++)
                {
                    recipients[i] = packet.ReadInt();
                }

                Character pWho = CenterServer.Instance.FindCharacter(fWho);

                pWho?.FriendsList.BuddyChat(what, recipients);
                break;
            }

            case ISClientMessages.BuddyDecline:
            {
                Character Who      = CenterServer.Instance.FindCharacter(packet.ReadInt());
                int       victimId = packet.ReadInt();
                Character Victim   = CenterServer.Instance.FindCharacter(victimId);
                Who.FriendsList.RemoveBuddyOrRequest(Victim, victimId);
                break;
            }
                #endregion

            case ISClientMessages.PlayerUsingSuperMegaphone:
            {
                Packet pw = new Packet(ISServerMessages.PlayerSuperMegaphone);
                pw.WriteString(packet.ReadString());
                pw.WriteBool(packet.ReadBool());
                pw.WriteByte(packet.ReadByte());
                World.SendPacketToEveryGameserver(pw);
                break;
            }

            case ISClientMessages.PlayerWhisperOrFindOperation:     // WhisperOrFind
            {
                int       sender     = packet.ReadInt();
                Character senderChar = CenterServer.Instance.FindCharacter(sender);
                if (senderChar == null)
                {
                    return;
                }

                bool      whisper      = packet.ReadBool();
                string    receiver     = packet.ReadString();
                Character receiverChar = CenterServer.Instance.FindCharacter(receiver);

                if (whisper)
                {
                    string message = packet.ReadString();
                    if ((receiverChar == null ||
                         !World.GameServers.ContainsKey(receiverChar.ChannelID)) ||
                        (receiverChar.IsGM && !senderChar.IsGM))
                    {
                        Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult);
                        pw.WriteBool(true);         // Whisper
                        pw.WriteBool(false);        // Not found.
                        pw.WriteInt(sender);
                        pw.WriteString(receiver);
                        SendPacket(pw);
                    }
                    else
                    {
                        Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult);
                        pw.WriteBool(false);        // Find
                        pw.WriteBool(true);         // Found.
                        pw.WriteInt(sender);
                        pw.WriteString(receiver);
                        pw.WriteSByte(-1);
                        pw.WriteSByte(-1);
                        SendPacket(pw);

                        pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult);
                        pw.WriteBool(true);         // Whisper
                        pw.WriteBool(true);         // Found.
                        pw.WriteInt(receiverChar.ID);
                        pw.WriteString(senderChar.Name);
                        pw.WriteByte(senderChar.ChannelID);
                        pw.WriteString(message);
                        pw.WriteBool(false);         // false is '>>'
                        LocalServer victimChannel = World.GameServers[receiverChar.ChannelID];
                        victimChannel.Connection.SendPacket(pw);
                    }
                }
                else
                {
                    if (receiverChar == null ||
                        !World.GameServers.ContainsKey(receiverChar.ChannelID) ||
                        (receiverChar.IsGM && !senderChar.IsGM))
                    {
                        Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult);
                        pw.WriteBool(false);         // Find
                        pw.WriteBool(false);         // Not found.
                        pw.WriteInt(sender);
                        pw.WriteString(receiver);
                        SendPacket(pw);
                    }
                    else
                    {
                        Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult);
                        pw.WriteBool(false);        // Find
                        pw.WriteBool(true);         // Found.
                        pw.WriteInt(senderChar.ID);
                        pw.WriteString(receiverChar.Name);
                        // Cashshop
                        if (receiverChar.InCashShop)
                        {
                            pw.WriteSByte(-2);
                        }
                        else
                        {
                            pw.WriteByte(receiverChar.ChannelID);
                        }
                        pw.WriteSByte(0);
                        SendPacket(pw);
                    }
                }
                break;
            }

            case ISClientMessages.UpdatePlayerJobLevel:
            {
                int charId    = packet.ReadInt();
                var character = CenterServer.Instance.FindCharacter(charId);
                if (character == null)
                {
                    return;
                }

                character.Job   = packet.ReadShort();
                character.Level = packet.ReadByte();
                break;
            }


            case ISClientMessages.AdminMessage:
            {
                Packet pw = new Packet(ISServerMessages.AdminMessage);
                pw.WriteString(packet.ReadString());
                pw.WriteByte(packet.ReadByte());
                World.SendPacketToEveryGameserver(pw);
                break;
            }

            case ISClientMessages.KickPlayer:
            {
                int userId = packet.ReadInt();
                Program.MainForm.LogAppend("Globally kicking user " + userId);
                Packet pw = new Packet(ISServerMessages.KickPlayerResult);
                pw.WriteInt(userId);
                World.SendPacketToEveryGameserver(pw);
                break;
            }

            case ISClientMessages.ReloadEvents:
                CenterServer.Instance.ReloadEvents();
                break;
            }
        }
Ejemplo n.º 3
0
        private void HandleLoginPacket(ISClientMessages opcode, Packet packet)
        {
            switch (opcode)
            {
            case ISClientMessages.PlayerRequestWorldLoad:
            {
                string hash  = packet.ReadString();
                byte   world = packet.ReadByte();

                Packet pw = new Packet(ISServerMessages.PlayerRequestWorldLoadResult);
                pw.WriteString(hash);

                if (World.ID == world)
                {
                    World.AddWarning(pw);
                }
                else
                {
                    pw.WriteByte(2);         // full load
                }

                SendPacket(pw);
                break;
            }

            case ISClientMessages.PlayerRequestChannelStatus:     // channel online check
            {
                string hash      = packet.ReadString();
                byte   world     = packet.ReadByte();
                byte   channel   = packet.ReadByte();
                int    accountId = packet.ReadInt();

                Packet pw = new Packet(ISServerMessages.PlayerRequestChannelStatusResult);
                pw.WriteString(hash);

                if (World.ID != world ||
                    World.GameServers.TryGetValue(channel, out LocalServer ls) == false ||
                    ls.InMaintenance ||
                    !ls.Connected)
                {
                    pw.WriteByte(0x09);         // Channel Offline
                }
                else
                {
                    pw.WriteByte(0);
                    pw.WriteByte(channel);

                    try
                    {
                        var ids = CharacterDBAccessor.GetCharacterIdList(accountId).ToList();
                        pw.WriteByte((byte)ids.Count);

                        foreach (var id in ids)
                        {
                            var ad      = CharacterDBAccessor.LoadAvatar(id);
                            var ranking = CharacterDBAccessor.LoadRank(id);

                            ad.Encode(pw);
                            pw.WriteBool(ranking != null);
                            if (ranking != null)
                            {
                                var(worldRank, worldRankMove, jobRank, jobRankMove) = ranking.Value;
                                pw.WriteInt(worldRank);
                                pw.WriteInt(worldRankMove);
                                pw.WriteInt(jobRank);
                                pw.WriteInt(jobRankMove);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Program.MainForm.LogAppend("Error while building packet for characterselect! {0}", ex);
                        _log.Error(ex);
                        pw = new Packet(ISServerMessages.PlayerRequestChannelStatusResult);
                        pw.WriteString(hash);
                        pw.WriteByte(1);
                    }
                }

                SendPacket(pw);
                break;
            }

            case ISClientMessages.PlayerDeleteCharacter:
            {
                string hash      = packet.ReadString();
                int    accountId = packet.ReadInt();
                int    charId    = packet.ReadInt();

                var p = new Packet(ISServerMessages.PlayerDeleteCharacterResult);
                p.WriteString(hash);
                p.WriteInt(charId);
                try
                {
                    var deleteCharacterResult = CharacterDBAccessor.DeleteCharacter(accountId, charId);
                    p.WriteByte(deleteCharacterResult);

                    if (deleteCharacterResult == 0)
                    {
                        var foundChar = CenterServer.Instance.FindCharacter(charId, false);
                        if (foundChar != null)
                        {
                            if (foundChar.PartyID != 0 &&
                                Party.Parties.TryGetValue(foundChar.PartyID, out Party party))
                            {
                                party.Leave(foundChar);
                            }

                            // Registered, so get rid of it
                            CenterServer.Instance.CharacterStore.Remove(foundChar);
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.Error(ex);
                    Program.MainForm.LogAppend("Error while deleting character! {0}", ex);
                    p.WriteByte(10);
                }
                SendPacket(p);
                break;
            }

            case ISClientMessages.PlayerCreateCharacterNamecheck:
            {
                string hash     = packet.ReadString();
                string charname = packet.ReadString();

                var p = new Packet(ISServerMessages.PlayerCreateCharacterNamecheckResult);
                p.WriteString(hash);
                p.WriteString(charname);
                try
                {
                    p.WriteBool(CharacterDBAccessor.CheckDuplicateID(charname));
                }
                catch (Exception ex)
                {
                    _log.Error(ex);
                    Program.MainForm.LogAppend("Error while checking for duplicate ID! {0}", ex);
                    p.WriteBool(true);
                }

                SendPacket(p);
                break;
            }

            case ISClientMessages.PlayerCreateCharacter:
            {
                string hash      = packet.ReadString();
                int    accountId = packet.ReadInt();
                byte   gender    = packet.ReadByte();

                string charname = packet.ReadString();

                int face      = packet.ReadInt();
                int hair      = packet.ReadInt();
                int haircolor = packet.ReadInt();
                int skin      = packet.ReadInt();

                int top    = packet.ReadInt();
                int bottom = packet.ReadInt();
                int shoes  = packet.ReadInt();
                int weapon = packet.ReadInt();

                byte str  = packet.ReadByte();
                byte dex  = packet.ReadByte();
                byte intt = packet.ReadByte();
                byte luk  = packet.ReadByte();

                var p = new Packet(ISServerMessages.PlayerCreateCharacterResult);
                p.WriteString(hash);

                try
                {
                    if (CharacterDBAccessor.CheckDuplicateID(charname))
                    {
                        p.WriteBool(false);
                    }
                    else
                    {
                        int id = CharacterDBAccessor.CreateNewCharacter(
                            accountId,
                            charname,
                            gender,

                            face, hair, haircolor, skin,
                            str, dex, intt, luk,
                            top, bottom, shoes, weapon
                            );

                        var ad = CharacterDBAccessor.LoadAvatar(id);

                        p.WriteBool(true);

                        ad.Encode(p);
                    }
                }
                catch (Exception ex)
                {
                    _log.Error(ex);
                    Program.MainForm.LogAppend("Error while creating character! {0}", ex);

                    p = new Packet(ISServerMessages.PlayerCreateCharacterResult);
                    p.WriteString(hash);
                    p.WriteBool(false);
                }

                SendPacket(p);

                break;
            }
            }
        }
Ejemplo n.º 4
0
 public Packet(ISClientMessages pMessage) : this((byte)pMessage)
 {
 }