From 8a03c40af98fcc814d63c40e0a652cb50795339a Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 8 Jun 2019 15:51:17 -0400 Subject: [PATCH] Fixed linkshell invites being stackable. Fixed founder of a LS not being set to master. --- .../DataObjects/Group/Linkshell.cs | 4 ++-- FFXIVClassic World Server/Database.cs | 7 ++++--- FFXIVClassic World Server/LinkshellManager.cs | 19 ++++++++++++++----- FFXIVClassic World Server/WorldMaster.cs | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs index 7fa11229..b5737036 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs @@ -46,9 +46,9 @@ namespace FFXIVClassic_World_Server.DataObjects.Group work._memberSave[index].rank = rank; } - public void AddMember(uint charaId) + public void AddMember(uint charaId, byte rank = LinkshellManager.RANK_MEMBER) { - members.Add(new LinkshellMember(charaId, dbId, 0x4)); + members.Add(new LinkshellMember(charaId, dbId, rank)); members.Sort(); } diff --git a/FFXIVClassic World Server/Database.cs b/FFXIVClassic World Server/Database.cs index 5f595adf..c33c760f 100644 --- a/FFXIVClassic World Server/Database.cs +++ b/FFXIVClassic World Server/Database.cs @@ -381,7 +381,7 @@ namespace FFXIVClassic_World_Server throw new NotImplementedException(); } - public static bool LinkshellAddPlayer(ulong lsId, uint charaId) + public static bool LinkshellAddPlayer(ulong lsId, uint charaId, byte rank = LinkshellManager.RANK_MEMBER) { string query; MySqlCommand cmd; @@ -394,14 +394,15 @@ namespace FFXIVClassic_World_Server query = @" INSERT INTO characters_linkshells - (characterId, linkshellId) + (characterId, linkshellId, rank) VALUES - (@charaId, @lsId) + (@charaId, @lsId, @rank) "; cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charaId", charaId); cmd.Parameters.AddWithValue("@lsId", lsId); + cmd.Parameters.AddWithValue("@rank", rank); cmd.ExecuteNonQuery(); } diff --git a/FFXIVClassic World Server/LinkshellManager.cs b/FFXIVClassic World Server/LinkshellManager.cs index 6fe08acd..258b2095 100644 --- a/FFXIVClassic World Server/LinkshellManager.cs +++ b/FFXIVClassic World Server/LinkshellManager.cs @@ -6,6 +6,11 @@ namespace FFXIVClassic_World_Server { class LinkshellManager { + public const byte RANK_GUEST = 0x1; + public const byte RANK_MEMBER = 0x4; + public const byte RANK_LEADER = 0x7; + public const byte RANK_MASTER = 0xA; + private WorldManager mWorldManager; private Object mGroupLockReference; private Dictionary mCurrentWorldGroupsReference; //GroupId, LS @@ -42,7 +47,7 @@ namespace FFXIVClassic_World_Server ulong resultId = Database.CreateLinkshell(name, crest, master); if (resultId >= 0) { - Linkshell newLs = new Linkshell(resultId, mWorldManager.GetGroupIndex(), name, crest, master, 0xa); + Linkshell newLs = new Linkshell(resultId, mWorldManager.GetGroupIndex(), name, crest, master, RANK_MASTER); mLinkshellList.Add(mWorldManager.GetGroupIndex(), newLs); mNameToIdLookup.Add(newLs.name, newLs.groupIndex); @@ -51,7 +56,7 @@ namespace FFXIVClassic_World_Server mWorldManager.IncrementGroupIndex(); //Add founder to the LS - AddMemberToLinkshell(master, newLs.name); + AddMemberToLinkshell(master, newLs.name, RANK_MASTER); return newLs; } @@ -125,7 +130,7 @@ namespace FFXIVClassic_World_Server } //Adds a player to the linkshell - public bool AddMemberToLinkshell(uint charaId, string LSName) + public bool AddMemberToLinkshell(uint charaId, string LSName, byte rank = RANK_MEMBER) { //Get the LS Linkshell ls = GetLinkshell(LSName); @@ -135,11 +140,11 @@ namespace FFXIVClassic_World_Server //Add player to ls in db lock (mGroupLockReference) { - bool result = Database.LinkshellAddPlayer(ls.dbId, charaId); + bool result = Database.LinkshellAddPlayer(ls.dbId, charaId, rank); if (result) { - ls.AddMember(charaId); + ls.AddMember(charaId, rank); return true; } else @@ -180,6 +185,10 @@ namespace FFXIVClassic_World_Server lock (mGroupLockReference) { Linkshell ls = Database.GetLinkshell(mWorldManager.GetGroupIndex(), name); + + if (ls == null) + return null; + ls.LoadMembers(); if (ls != null) diff --git a/FFXIVClassic World Server/WorldMaster.cs b/FFXIVClassic World Server/WorldMaster.cs index 4bfcc35f..36ead1b7 100644 --- a/FFXIVClassic World Server/WorldMaster.cs +++ b/FFXIVClassic World Server/WorldMaster.cs @@ -356,7 +356,7 @@ namespace FFXIVClassic_World_Server { inviterSession.SendGameMessage(30544, 0x20); } - else if (mRelationGroupManager.GetLinkshellRelationGroup(inviterSession.sessionId) != null) + else if (mRelationGroupManager.GetLinkshellRelationGroup(invitee) != null) { Session inviteeSession = mServer.GetSession(invitee); inviterSession.SendGameMessage(25196, 0x20, (object)inviteeSession); //Unable to invite X another pending