mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Party sync is done. Finished kick/promote code. Client is now always at the top of pt list.
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
        }      
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual List<GroupMember> BuildMemberList()
 | 
			
		||||
        public virtual List<GroupMember> BuildMemberList(uint id)
 | 
			
		||||
        {
 | 
			
		||||
            return new List<GroupMember>();
 | 
			
		||||
        }
 | 
			
		||||
@@ -62,7 +62,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
 | 
			
		||||
        public void SendGroupPackets(Session session)
 | 
			
		||||
        {
 | 
			
		||||
            ulong time = Utils.MilisUnixTimeStampUTC();
 | 
			
		||||
            List<GroupMember> members = BuildMemberList();
 | 
			
		||||
            List<GroupMember> 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
 | 
			
		||||
            return Group.CompanyGroup;
 | 
			
		||||
        }        
 | 
			
		||||
 | 
			
		||||
        public override List<GroupMember> BuildMemberList()
 | 
			
		||||
        public override List<GroupMember> BuildMemberList(uint id)
 | 
			
		||||
        {
 | 
			
		||||
            List<GroupMember> groupMembers = new List<GroupMember>();
 | 
			
		||||
            foreach (LinkshellMember member in members)            
 | 
			
		||||
 
 | 
			
		||||
@@ -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<GroupMember> BuildMemberList()
 | 
			
		||||
        public override List<GroupMember> BuildMemberList(uint id)
 | 
			
		||||
        {
 | 
			
		||||
            List<GroupMember> groupMembers = new List<GroupMember>();
 | 
			
		||||
            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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
 | 
			
		||||
            return Group.GroupInvitationRelationGroup;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override List<GroupMember> BuildMemberList()
 | 
			
		||||
        public override List<GroupMember> BuildMemberList(uint id)
 | 
			
		||||
        {
 | 
			
		||||
            List<GroupMember> groupMembers = new List<GroupMember>();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
 | 
			
		||||
            return Group.RetainerGroup;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override List<GroupMember> BuildMemberList()
 | 
			
		||||
        public override List<GroupMember> BuildMemberList(uint id)
 | 
			
		||||
        {
 | 
			
		||||
            List<GroupMember> groupMembers = new List<GroupMember>();                   
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
                    {
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
            }
 | 
			
		||||
        }        
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user