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); } } } }
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); } }
//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); }
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); }
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(); } }