Ejemplo n.º 1
0
        public void OnReceiveSubPacketFromZone(ZoneServer zoneServer, SubPacket subpacket)
        {
            uint    sessionId = subpacket.header.targetId;
            Session session   = GetSession(sessionId);

            subpacket.DebugPrintSubPacket();
            if (subpacket.gameMessage.opcode >= 0x1000)
            {
                //subpacket.DebugPrintSubPacket();

                switch (subpacket.gameMessage.opcode)
                {
                //Session Begin Confirm
                case 0x1000:
                    SessionBeginConfirmPacket beginConfirmPacket = new SessionBeginConfirmPacket(subpacket.data);

                    if (beginConfirmPacket.invalidPacket || beginConfirmPacket.errorCode == 0)
                    {
                        Program.Log.Error("Session {0} had a error beginning session.", beginConfirmPacket.sessionId);
                    }

                    break;

                //Session End Confirm
                case 0x1001:
                    SessionEndConfirmPacket endConfirmPacket = new SessionEndConfirmPacket(subpacket.data);

                    if (!endConfirmPacket.invalidPacket && endConfirmPacket.errorCode == 0)
                    {
                        //Check destination, if != 0, update route and start new session
                        if (endConfirmPacket.destinationZone != 0)
                        {
                            session.routing1 = Server.GetServer().GetWorldManager().GetZoneServer(endConfirmPacket.destinationZone);
                            session.routing1.SendSessionStart(session);
                        }
                        else
                        {
                            RemoveSession(Session.Channel.ZONE, endConfirmPacket.sessionId);
                            RemoveSession(Session.Channel.CHAT, endConfirmPacket.sessionId);
                        }
                    }
                    else
                    {
                        Program.Log.Error("Session {0} had an error ending session.", endConfirmPacket.sessionId);
                    }

                    break;

                //Zone Change Request
                case 0x1002:
                    WorldRequestZoneChangePacket zoneChangePacket = new WorldRequestZoneChangePacket(subpacket.data);

                    if (!zoneChangePacket.invalidPacket)
                    {
                        GetWorldManager().DoZoneServerChange(session, zoneChangePacket.destinationZoneId, "", zoneChangePacket.destinationSpawnType, zoneChangePacket.destinationX, zoneChangePacket.destinationY, zoneChangePacket.destinationZ, zoneChangePacket.destinationRot);
                    }

                    break;

                //Change leader or kick
                case 0x1020:
                    PartyModifyPacket partyModifyPacket = new PartyModifyPacket(subpacket.data);

                    Party pt = mWorldManager.GetPartyManager().GetParty(subpacket.header.targetId);

                    if (pt.GetMemberCount() <= 1)
                    {
                        return;
                    }

                    if (partyModifyPacket.command == PartyModifyPacket.MODIFY_LEADER)
                    {
                        pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name);
                    }
                    else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER)
                    {
                        pt.KickPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name);
                    }
                    else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_LEADER + 2)
                    {
                        pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.actorId);
                    }
                    else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER + 2)
                    {
                        pt.KickPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.actorId);
                    }

                    break;

                //Party Resign or Disband
                case 0x1021:
                    PartyLeavePacket partyLeavePacket = new PartyLeavePacket(subpacket.data);
                    Party            leavePt          = mWorldManager.GetPartyManager().GetParty(subpacket.header.sourceId);

                    if (!partyLeavePacket.isDisband)
                    {
                        leavePt.LeavePlayerRequest(GetSession(subpacket.header.sourceId));
                    }
                    else
                    {
                        leavePt.DisbandPlayerRequest(GetSession(subpacket.header.sourceId));
                    }

                    break;

                //Party Invite Request
                case 0x1022:
                    PartyInvitePacket partyInvitePacket = new PartyInvitePacket(subpacket.data);
                    if (partyInvitePacket.command == 1)
                    {
                        mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), partyInvitePacket.actorId);
                    }
                    else if (partyInvitePacket.command == 0)
                    {
                        Session inviteeByNamesSession = GetSession(partyInvitePacket.name);
                        if (inviteeByNamesSession != null)
                        {
                            mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), inviteeByNamesSession.sessionId);
                        }
                        else
                        {
                            //Show not found msg
                        }
                    }
                    break;

                //Group Invite Result
                case 0x1023:
                    GroupInviteResultPacket groupInviteResultPacket = new GroupInviteResultPacket(subpacket.data);

                    switch (groupInviteResultPacket.groupType)
                    {
                    case 0x2711:
                        mWorldManager.ProcessPartyInviteResult(GetSession(subpacket.header.sourceId), groupInviteResultPacket.result);
                        break;

                    case 0x2712:
                        mWorldManager.ProcessLinkshellInviteResult(GetSession(subpacket.header.sourceId), groupInviteResultPacket.result);
                        break;
                    }

                    break;

                //Linkshell create request
                case 0x1025:
                    CreateLinkshellPacket createLinkshellPacket = new CreateLinkshellPacket(subpacket.data);
                    mWorldManager.GetLinkshellManager().CreateLinkshell(createLinkshellPacket.name, createLinkshellPacket.crestid, createLinkshellPacket.master);
                    break;

                //Linkshell modify request
                case 0x1026:
                    ModifyLinkshellPacket modifyLinkshellPacket = new ModifyLinkshellPacket(subpacket.data);
                    switch (modifyLinkshellPacket.argCode)
                    {
                    case 0:
                        break;

                    case 1:
                        mWorldManager.GetLinkshellManager().ChangeLinkshellCrest(modifyLinkshellPacket.currentName, modifyLinkshellPacket.crestid);
                        break;

                    case 2:
                        mWorldManager.GetLinkshellManager().ChangeLinkshellMaster(modifyLinkshellPacket.currentName, modifyLinkshellPacket.master);
                        break;
                    }
                    break;

                //Linkshell delete request
                case 0x1027:
                    DeleteLinkshellPacket deleteLinkshellPacket = new DeleteLinkshellPacket(subpacket.data);
                    mWorldManager.GetLinkshellManager().DeleteLinkshell(deleteLinkshellPacket.name);
                    break;

                //Linkshell set active
                case 0x1028:
                    LinkshellChangePacket linkshellChangePacket = new LinkshellChangePacket(subpacket.data);
                    mWorldManager.ProcessLinkshellSetActive(GetSession(subpacket.header.sourceId), linkshellChangePacket.lsName);
                    break;

                //Linkshell invite member
                case 0x1029:
                    LinkshellInvitePacket linkshellInvitePacket = new LinkshellInvitePacket(subpacket.data);
                    mWorldManager.ProcessLinkshellInvite(GetSession(subpacket.header.sourceId), linkshellInvitePacket.lsName, linkshellInvitePacket.actorId);
                    break;

                //Linkshell cancel invite
                case 0x1030:
                    LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data);
                    mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId));
                    break;

                //Linkshell resign/kicked
                case 0x1031:
                    LinkshellLeavePacket linkshellLeavePacket = new LinkshellLeavePacket(subpacket.data);
                    Linkshell            lsLeave = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellLeavePacket.lsName);
                    if (linkshellLeavePacket.isKicked)
                    {
                        lsLeave.KickRequest(GetSession(subpacket.header.sourceId), linkshellLeavePacket.kickedName);
                    }
                    else
                    {
                        lsLeave.LeaveRequest(GetSession(subpacket.header.sourceId));
                    }
                    break;

                //Linkshell rank change
                case 0x1032:
                    LinkshellRankChangePacket linkshellRankChangePacket = new LinkshellRankChangePacket(subpacket.data);
                    Linkshell lsRankChange = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellRankChangePacket.lsName);
                    lsRankChange.RankChangeRequest(GetSession(subpacket.header.sourceId), linkshellRankChangePacket.name, linkshellRankChangePacket.rank);
                    break;
                }
            }
            else if (mZoneSessionList.ContainsKey(sessionId))
            {
                ClientConnection conn = mZoneSessionList[sessionId].clientConnection;
                conn.QueuePacket(subpacket);
                conn.FlushQueuedSendPackets();
            }
        }
Ejemplo n.º 2
0
        public void ProcessPacket(ClientConnection client, BasePacket packet)
        {
            if (packet.header.isCompressed == 0x01)
            {
                BasePacket.DecompressPacket(ref packet);
            }

            List <SubPacket> subPackets = packet.GetSubpackets();

            foreach (SubPacket subpacket in subPackets)
            {
                //Initial Connect Packet, Create session
                if (subpacket.header.type == 0x01)
                {
                    HelloPacket hello = new HelloPacket(packet.data);

                    if (packet.header.connectionType == BasePacket.TYPE_ZONE)
                    {
                        mServer.AddSession(client, Session.Channel.ZONE, hello.sessionId);
                        Session session = mServer.GetSession(hello.sessionId);
                        session.routing1 = mServer.GetWorldManager().GetZoneServer(session.currentZoneId);
                        session.routing1.SendSessionStart(session, true);
                    }
                    else if (packet.header.connectionType == BasePacket.TYPE_CHAT)
                    {
                        mServer.AddSession(client, Session.Channel.CHAT, hello.sessionId);
                    }

                    client.QueuePacket(_0x7Packet.BuildPacket(0x0E016EE5));
                    client.QueuePacket(_0x2Packet.BuildPacket(hello.sessionId));
                }
                //Ping from World Server
                else if (subpacket.header.type == 0x07)
                {
                    SubPacket init = _0x8PingPacket.BuildPacket(client.owner.sessionId);
                    client.QueuePacket(BasePacket.CreatePacket(init, true, false));
                }
                //Zoning Related
                else if (subpacket.header.type == 0x08)
                {
                    //Response, client's current [actorID][time]
                    //BasePacket init = Login0x7ResponsePacket.BuildPacket(BitConverter.ToUInt32(packet.data, 0x10), Utils.UnixTimeStampUTC(), 0x07);
                    //client.QueuePacket(init);
                    packet.DebugPrintPacket();
                }
                //Game Message
                else if (subpacket.header.type == 0x03)
                {
                    //Send to the correct zone server
                    uint targetSession = subpacket.header.targetId;

                    InterceptProcess(mServer.GetSession(targetSession), subpacket);

                    if (mServer.GetSession(targetSession).routing1 != null)
                    {
                        mServer.GetSession(targetSession).routing1.SendPacket(subpacket);
                    }

                    if (mServer.GetSession(targetSession).routing2 != null)
                    {
                        mServer.GetSession(targetSession).routing2.SendPacket(subpacket);
                    }
                }
                //World Server Type
                else if (subpacket.header.type >= 0x1000)
                {
                    uint    targetSession = subpacket.header.targetId;
                    Session session       = mServer.GetSession(targetSession);

                    switch (subpacket.header.type)
                    {
                    //Session Begin Confirm
                    case 0x1000:
                        SessionBeginConfirmPacket beginConfirmPacket = new SessionBeginConfirmPacket(packet.data);

                        if (beginConfirmPacket.invalidPacket || beginConfirmPacket.errorCode == 0)
                        {
                            Program.Log.Error("Session {0} had a error beginning session.", beginConfirmPacket.sessionId);
                        }

                        break;

                    //Session End Confirm
                    case 0x1001:
                        SessionEndConfirmPacket endConfirmPacket = new SessionEndConfirmPacket(packet.data);

                        if (!endConfirmPacket.invalidPacket && endConfirmPacket.errorCode != 0)
                        {
                            //Check destination, if != 0, update route and start new session
                            if (endConfirmPacket.destinationZone != 0)
                            {
                                session.currentZoneId = endConfirmPacket.destinationZone;
                                session.routing1      = Server.GetServer().GetWorldManager().GetZoneServer(endConfirmPacket.destinationZone);
                                session.routing1.SendSessionStart(session);
                            }
                            else
                            {
                                mServer.RemoveSession(Session.Channel.ZONE, endConfirmPacket.sessionId);
                                mServer.RemoveSession(Session.Channel.CHAT, endConfirmPacket.sessionId);
                            }
                        }
                        else
                        {
                            Program.Log.Error("Session {0} had an error ending session.", endConfirmPacket.sessionId);
                        }

                        break;

                    //Zone Change Request
                    case 0x1002:
                        WorldRequestZoneChangePacket zoneChangePacket = new WorldRequestZoneChangePacket(packet.data);

                        if (!zoneChangePacket.invalidPacket)
                        {
                            mServer.GetWorldManager().DoZoneServerChange(session, zoneChangePacket.destinationZoneId, "", zoneChangePacket.destinationSpawnType, zoneChangePacket.destinationX, zoneChangePacket.destinationY, zoneChangePacket.destinationZ, zoneChangePacket.destinationRot);
                        }

                        break;
                    }
                }
                else
                {
                    packet.DebugPrintPacket();
                }
            }
        }