Party sync is done. Finished kick/promote code. Client is now always at the top of pt list.

This commit is contained in:
Filip Maj 2016-12-21 21:49:50 -05:00
parent 506bcbaf87
commit 2b10221a75
11 changed files with 77 additions and 25 deletions

View File

@ -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

View File

@ -1291,6 +1291,12 @@ namespace FFXIVClassic_Map_Server.Actors
return false;
}
public void PartyOustPlayer(uint actorId)
{
SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, actorId);
QueuePacket(oustPacket);
}
public void PartyOustPlayer(string name)
{
SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, 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);

View File

@ -26,5 +26,20 @@ 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);
}
}
}

View File

@ -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);

View File

@ -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)

View File

@ -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);
}
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)
{
if (charaId != id)
groupMembers.Add(new GroupMember(charaId, -1, 0, false, true, Server.GetServer().GetNameForId(charaId)));
}
return groupMembers;
}

View File

@ -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>();

View File

@ -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>();

View File

@ -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,6 +25,10 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
try
{
command = binReader.ReadUInt16();
if (command >= 2)
actorId = binReader.ReadUInt32();
else
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
}
catch (Exception)

View File

@ -213,6 +213,10 @@ namespace FFXIVClassic_World_Server
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

View File

@ -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));
}
}