diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 906fd6f2..edc2042b 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -721,6 +721,7 @@ namespace FFXIVClassic_Map_Server else group = currentPlayerParties[syncPacket.partyGroupId]; + group.SetLeader(syncPacket.owner); group.members = syncPacket.memberActorIds.ToList(); //Add group to everyone diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 45ec4b5a..121e0533 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1289,6 +1289,12 @@ namespace FFXIVClassic_Map_Server.Actors } else return false; + } + + public void PartyOustPlayer(uint actorId) + { + SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, actorId); + QueuePacket(oustPacket); } public void PartyOustPlayer(string name) @@ -1305,6 +1311,12 @@ namespace FFXIVClassic_Map_Server.Actors { } + public void PartyPromote(uint actorId) + { + SubPacket promotePacket = PartyModifyPacket.BuildPacket(playerSession, 0, actorId); + QueuePacket(promotePacket); + } + public void PartyPromote(string name) { SubPacket promotePacket = PartyModifyPacket.BuildPacket(playerSession, 0, name); diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs index 6d758a61..064dff9d 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs @@ -25,6 +25,21 @@ namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group } } return new SubPacket(true, OPCODE, session.id, session.id, data); + } + + public static SubPacket BuildPacket(Session session, ushort command, uint actorId) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt16)(command + 2)); + binWriter.Write((UInt32)actorId); + } + } + return new SubPacket(true, OPCODE, session.id, session.id, data); } + } } diff --git a/FFXIVClassic World Server/DataObjects/Group/Group.cs b/FFXIVClassic World Server/DataObjects/Group/Group.cs index 5cee6529..a20b37d7 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Group.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Group.cs @@ -43,7 +43,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return -1; } - public virtual List BuildMemberList() + public virtual List BuildMemberList(uint id) { return new List(); } @@ -62,7 +62,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group public void SendGroupPackets(Session session) { ulong time = Utils.MilisUnixTimeStampUTC(); - List members = BuildMemberList(); + List members = BuildMemberList(session.sessionId); session.clientConnection.QueuePacket(GroupHeaderPacket.buildPacket(session.sessionId, session.currentZoneId, time, this), true, false); session.clientConnection.QueuePacket(GroupMembersBeginPacket.buildPacket(session.sessionId, session.currentZoneId, time, this), true, false); diff --git a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs index 70a27ecb..f66dc348 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs @@ -83,7 +83,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return Group.CompanyGroup; } - public override List BuildMemberList() + public override List BuildMemberList(uint id) { List groupMembers = new List(); foreach (LinkshellMember member in members) diff --git a/FFXIVClassic World Server/DataObjects/Group/Party.cs b/FFXIVClassic World Server/DataObjects/Group/Party.cs index f993fde2..3a5c132b 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Party.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Party.cs @@ -21,6 +21,11 @@ namespace FFXIVClassic_World_Server.DataObjects.Group } public void SetLeaderPlayerRequest(Session requestSession, string name) + { + SetLeaderPlayerRequest(requestSession, GetIdForName(name)); + } + + public void SetLeaderPlayerRequest(Session requestSession, uint actorId) { if (GetLeader() != requestSession.sessionId) { @@ -28,16 +33,16 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return; } - uint newLeader = GetIdForName(name); + uint newLeader = actorId; - if (newLeader == 0) + if (!members.Contains(actorId)) { - requestSession.SendGameMessage(30575, 0x20); + requestSession.SendGameMessage(30567, 0x20); return; } else if (newLeader == GetLeader()) { - requestSession.SendGameMessage(30563, 0x20, name); + requestSession.SendGameMessage(30559, 0x20, (Object)Server.GetServer().GetNameForId(actorId)); return; } @@ -49,13 +54,18 @@ namespace FFXIVClassic_World_Server.DataObjects.Group Session session = Server.GetServer().GetSession(members[i]); if (session == null) continue; - session.SendGameMessage(30429, 0x20, Server.GetServer().GetNameForId(members[i])); + session.SendGameMessage(30429, 0x20, (Object)Server.GetServer().GetNameForId(actorId)); } - Server.GetServer().GetWorldManager().SendPartySync(this); + Server.GetServer().GetWorldManager().SendPartySync(this); } public void KickPlayerRequest(Session requestSession, string name) + { + KickPlayerRequest(requestSession, GetIdForName(name)); + } + + public void KickPlayerRequest(Session requestSession, uint actorId) { if (GetLeader() != requestSession.sessionId) { @@ -63,9 +73,9 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return; } - uint kickedMemberId = GetIdForName(name); + uint kickedMemberId = actorId; - if (kickedMemberId == 0) + if (!members.Contains(actorId)) { requestSession.SendGameMessage(30575, 0x20); return; @@ -80,7 +90,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group if (members[i] == kickedMemberId) session.SendGameMessage(30410, 0x20); else - session.SendGameMessage(30428, 0x20, (Object)name); + session.SendGameMessage(30428, 0x20, (Object)Server.GetServer().GetNameForId(actorId)); } //All good, remove @@ -106,7 +116,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group public void SetLeader(uint actorId) { - partyGroupWork._globalTemp.owner = (ulong)((actorId << 32) | 0xB36F92); + partyGroupWork._globalTemp.owner = (ulong)(((ulong)actorId << 32) | 0xB36F92); } public uint GetLeader() @@ -152,11 +162,15 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return Group.PlayerPartyGroup; } - public override List BuildMemberList() + public override List BuildMemberList(uint id) { List groupMembers = new List(); + groupMembers.Add(new GroupMember(id, -1, 0, false, true, Server.GetServer().GetNameForId(id))); foreach (uint charaId in members) - groupMembers.Add(new GroupMember(charaId, -1, 0, false, true, Server.GetServer().GetNameForId(charaId))); + { + if (charaId != id) + groupMembers.Add(new GroupMember(charaId, -1, 0, false, true, Server.GetServer().GetNameForId(charaId))); + } return groupMembers; } diff --git a/FFXIVClassic World Server/DataObjects/Group/Relation.cs b/FFXIVClassic World Server/DataObjects/Group/Relation.cs index efccd8cd..8c308e91 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Relation.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Relation.cs @@ -31,7 +31,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return Group.GroupInvitationRelationGroup; } - public override List BuildMemberList() + public override List BuildMemberList(uint id) { List groupMembers = new List(); diff --git a/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs b/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs index 8b15fc98..bf440579 100644 --- a/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs +++ b/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs @@ -63,7 +63,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group return Group.RetainerGroup; } - public override List BuildMemberList() + public override List BuildMemberList(uint id) { List groupMembers = new List(); diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs index c410d962..58bffa54 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs @@ -14,6 +14,7 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group public ushort command; public string name; + public uint actorId; public PartyModifyPacket(byte[] data) { @@ -24,7 +25,11 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group try { command = binReader.ReadUInt16(); - name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); + + if (command >= 2) + actorId = binReader.ReadUInt32(); + else + name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); } catch (Exception) { diff --git a/FFXIVClassic World Server/Server.cs b/FFXIVClassic World Server/Server.cs index 8911eed2..12eaab7c 100644 --- a/FFXIVClassic World Server/Server.cs +++ b/FFXIVClassic World Server/Server.cs @@ -208,11 +208,15 @@ namespace FFXIVClassic_World_Server if (pt.GetMemberCount() <= 1) return; - - if (partyModifyPacket.command == PartyModifyPacket.MODIFY_LEADER) - pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name); + + 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 diff --git a/FFXIVClassic World Server/WorldMaster.cs b/FFXIVClassic World Server/WorldMaster.cs index 42e56e87..7961dfda 100644 --- a/FFXIVClassic World Server/WorldMaster.cs +++ b/FFXIVClassic World Server/WorldMaster.cs @@ -214,9 +214,10 @@ namespace FFXIVClassic_World_Server Party pt = mPartyManager.GetParty(session.sessionId); - if (session.sessionId == 0x6c) + if (session.sessionId == 156) { - mPartyManager.AddToParty(pt.groupIndex, 156); + mPartyManager.AddToParty(pt.groupIndex, 0x6c); + mPartyManager.AddToParty(pt.groupIndex, 157); } pt.SendGroupPackets(session); @@ -226,7 +227,7 @@ namespace FFXIVClassic_World_Server foreach (Linkshell ls in linkshells) ls.SendGroupPackets(session); - mRelationGroupManager.CreateRelationGroup(157, session.sessionId, 40001).SendGroupPackets(session); + mRelationGroupManager.CreateRelationGroup(157, session.sessionId, 10001).SendGroupPackets(session); } private void SendMotD(Session session) @@ -291,7 +292,7 @@ namespace FFXIVClassic_World_Server if (mCurrentWorldGroups.ContainsKey(groupId)) { Group group = mCurrentWorldGroups[groupId]; - foreach (GroupMember member in group.BuildMemberList()) + foreach (GroupMember member in group.BuildMemberList(0)) group.SendGroupPackets(mServer.GetSession(member.actorId)); } }