Пример #1
0
        public static Linkshell GetLinkshell(ulong groupIndex, ulong lsId)
        {
            using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
            {
                try
                {
                    conn.Open();
                    MySqlCommand cmd = new MySqlCommand("SELECT name, crestIcon, master FROM server_linkshells WHERE id = @lsId", conn);
                    cmd.Parameters.AddWithValue("@lsId", lsId);
                    using (MySqlDataReader Reader = cmd.ExecuteReader())
                    {
                        while (Reader.Read())
                        {
                            string name   = Reader.GetString("name");
                            ushort crest  = Reader.GetUInt16("crestIcon");
                            uint   master = Reader.GetUInt32("master");

                            Linkshell linkshell = new Linkshell(lsId, groupIndex, name, crest, master, 0xa);
                            return(linkshell);
                        }
                    }
                }
                catch (MySqlException e)
                {
                    Program.Log.Error(e.ToString());
                }
                finally
                {
                    conn.Dispose();
                }
            }
            return(null);
        }
        //Get a single linkshell group either already instantiated or make one from the db by ID
        public Linkshell GetLinkshell(ulong lsId)
        {
            if (mLSIdToIdLookup.ContainsKey(lsId))
            {
                return((Linkshell)mCurrentWorldGroupsReference[mLSIdToIdLookup[lsId].groupIndex]);
            }
            else
            {
                lock (mGroupLockReference)
                {
                    Linkshell ls = Database.GetLinkshell(mWorldManager.GetGroupIndex(), lsId);
                    ls.LoadMembers();

                    if (ls != null)
                    {
                        mLinkshellList.Add(ls.groupIndex, ls);
                        mNameToIdLookup.Add(ls.name, ls.groupIndex);
                        mLSIdToIdLookup.Add(ls.dbId, ls);
                        mCurrentWorldGroupsReference.Add(ls.groupIndex, ls);
                        mWorldManager.IncrementGroupIndex();
                        return(ls);
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
        }
Пример #3
0
        public void ProcessLinkshellSetActive(Session requestSession, string lsName)
        {
            //Deactivate all
            if (lsName.Equals(""))
            {
                requestSession.SetActiveLS(lsName);
                SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(requestSession.sessionId, 0);
                requestSession.clientConnection.QueuePacket(activeLsPacket);
                requestSession.SendGameMessage(25132, 0x20, (object)1);
            }
            else
            {
                Linkshell ls = mLinkshellManager.GetLinkshell(lsName);

                if (ls == null || !ls.HasMember(requestSession.sessionId))
                {
                    requestSession.SendGameMessage(25167, 0x20, (object)1, (object)lsName);
                }
                else
                {
                    requestSession.SetActiveLS(lsName);
                    SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(requestSession.sessionId, ls.groupIndex);
                    requestSession.clientConnection.QueuePacket(activeLsPacket);
                    requestSession.SendGameMessage(25131, 0x20, (object)1, (object)lsName);
                }
            }
        }
        //Deletes a LS
        public bool DeleteLinkshell(string name)
        {
            lock (mGroupLockReference)
            {
                ulong groupInstanceId;
                if (mNameToIdLookup.ContainsKey(name))
                {
                    groupInstanceId = mNameToIdLookup[name];
                }
                else
                {
                    return(false);
                }

                if (mCurrentWorldGroupsReference.ContainsKey(groupInstanceId))
                {
                    Linkshell ls     = (Linkshell)mCurrentWorldGroupsReference[groupInstanceId];
                    bool      result = Database.DeleteLinkshell(ls.dbId);

                    if (result)
                    {
                        mCurrentWorldGroupsReference.Remove(groupInstanceId);
                        mLinkshellList.Remove(groupInstanceId);
                        mNameToIdLookup.Remove(name);
                        return(true);
                    }
                }
            }

            return(false);
        }
        //Removes a player from the linkshell
        public bool RemoveMemberFromLinkshell(uint charaId, string LSName)
        {
            //Get the LS
            Linkshell ls = GetLinkshell(LSName);

            if (ls == null)
            {
                return(false);
            }

            //Delete the player in the db
            lock (mGroupLockReference)
            {
                bool result = Database.LinkshellRemovePlayer(ls.dbId, charaId);

                if (!result)
                {
                    return(false);
                }

                //Remove from group instance
                ls.RemoveMember(charaId);

                return(true);
            }
        }
        //Adds a player to the linkshell
        public bool AddMemberToLinkshell(uint charaId, string LSName)
        {
            //Get the LS
            Linkshell ls = GetLinkshell(LSName);

            if (ls == null)
            {
                return(false);
            }

            //Add player to ls in db
            lock (mGroupLockReference)
            {
                bool result = Database.LinkshellAddPlayer(ls.dbId, charaId);

                if (result)
                {
                    ls.AddMember(charaId);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
        //Modifies the LS crest
        public bool ChangeLinkshellCrest(string name, ushort newCrestId)
        {
            ulong groupInstanceId;

            if (mNameToIdLookup.ContainsKey(name))
            {
                groupInstanceId = mNameToIdLookup[name];
            }
            else
            {
                return(false);
            }

            if (mCurrentWorldGroupsReference.ContainsKey(groupInstanceId))
            {
                Linkshell ls = (Linkshell)mCurrentWorldGroupsReference[groupInstanceId];
                return(Database.ChangeLinkshellCrest(ls.dbId, newCrestId));
            }

            return(false);
        }
        //Modifies the LS master
        public bool ChangeLinkshellMaster(string name, uint newMaster)
        {
            ulong groupInstanceId;

            if (mNameToIdLookup.ContainsKey(name))
            {
                groupInstanceId = mNameToIdLookup[name];
            }
            else
            {
                return(false);
            }

            if (mCurrentWorldGroupsReference.ContainsKey(groupInstanceId))
            {
                Linkshell ls = (Linkshell)mCurrentWorldGroupsReference[groupInstanceId];
                return(false);
            }

            return(false);
        }
        //Creates a new linkshell and adds it to the list
        public ulong CreateLinkshell(string name, ushort crest, uint master)
        {
            lock (mGroupLockReference)
            {
                ulong resultId = Database.CreateLinkshell(name, crest, master);
                if (resultId >= 0)
                {
                    Linkshell newLs = new Linkshell(resultId, mWorldManager.GetGroupIndex(), name, crest, master, 0xa);

                    //Add founder to the LS
                    if (AddMemberToLinkshell(master, newLs.name))
                    {
                        mLinkshellList.Add(mWorldManager.GetGroupIndex(), newLs);
                        mNameToIdLookup.Add(newLs.name, newLs.groupIndex);
                        mLSIdToIdLookup.Add(newLs.dbId, newLs);
                        mCurrentWorldGroupsReference.Add(mWorldManager.GetGroupIndex(), newLs);
                        mWorldManager.IncrementGroupIndex();
                    }
                }
                return(resultId);
            }
        }
Пример #10
0
        //Login Zone In
        public void DoLogin(Session session)
        {
            SendMotD(session);

            //Send party, retainer, ls groups
            Party pt = mPartyManager.GetParty(session.sessionId);

            pt.SendGroupPackets(session);
            SendPartySync(pt);

            mRetainerGroupManager.GetRetainerGroup(session.sessionId).SendGroupPackets(session);
            List <Linkshell> linkshells = mLinkshellManager.GetPlayerLinkshellMembership(session.sessionId);

            foreach (Linkshell ls in linkshells)
            {
                ls.SendGroupPackets(session);
            }

            //Reset to blank if in unknown state
            ulong activeGroupIndex = 0;

            if (!session.activeLinkshellName.Equals(""))
            {
                Linkshell activeLs = mLinkshellManager.GetLinkshell(session.activeLinkshellName);
                if (activeLs != null && activeLs.HasMember(session.sessionId))
                {
                    activeGroupIndex = activeLs.groupIndex;
                }
                else
                {
                    session.activeLinkshellName = "";
                    Database.SetActiveLS(session, "");
                }
            }
            SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(session.sessionId, activeGroupIndex);

            session.clientConnection.QueuePacket(activeLsPacket);
        }
Пример #11
0
        public static List <LinkshellMember> GetLSMembers(Linkshell ls)
        {
            List <LinkshellMember> memberList = new List <LinkshellMember>();

            using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
            {
                try
                {
                    conn.Open();
                    MySqlCommand cmd = new MySqlCommand("SELECT characterId, linkshellId, rank FROM characters_linkshells WHERE linkshellId = @lsId", conn);
                    cmd.Parameters.AddWithValue("@lsId", ls.dbId);
                    using (MySqlDataReader Reader = cmd.ExecuteReader())
                    {
                        while (Reader.Read())
                        {
                            uint  characterId = Reader.GetUInt32("characterId");
                            ulong linkshellId = Reader.GetUInt64("linkshellId");
                            byte  rank        = Reader.GetByte("rank");

                            LinkshellMember member = new LinkshellMember(characterId, linkshellId, rank);
                            memberList.Add(member);
                        }
                    }
                }
                catch (MySqlException e)
                {
                    Program.Log.Error(e.ToString());
                }
                finally
                {
                    conn.Dispose();
                }
            }
            memberList.Sort();
            return(memberList);
        }
Пример #12
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();
            }
        }