1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-20 19:57:46 +00:00

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 else
group = currentPlayerParties[syncPacket.partyGroupId]; group = currentPlayerParties[syncPacket.partyGroupId];
group.SetLeader(syncPacket.owner);
group.members = syncPacket.memberActorIds.ToList(); group.members = syncPacket.memberActorIds.ToList();
//Add group to everyone //Add group to everyone

View file

@ -1291,6 +1291,12 @@ namespace FFXIVClassic_Map_Server.Actors
return false; return false;
} }
public void PartyOustPlayer(uint actorId)
{
SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, actorId);
QueuePacket(oustPacket);
}
public void PartyOustPlayer(string name) public void PartyOustPlayer(string name)
{ {
SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, 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) public void PartyPromote(string name)
{ {
SubPacket promotePacket = PartyModifyPacket.BuildPacket(playerSession, 0, 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); 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; return -1;
} }
public virtual List<GroupMember> BuildMemberList() public virtual List<GroupMember> BuildMemberList(uint id)
{ {
return new List<GroupMember>(); return new List<GroupMember>();
} }
@ -62,7 +62,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
public void SendGroupPackets(Session session) public void SendGroupPackets(Session session)
{ {
ulong time = Utils.MilisUnixTimeStampUTC(); 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(GroupHeaderPacket.buildPacket(session.sessionId, session.currentZoneId, time, this), true, false);
session.clientConnection.QueuePacket(GroupMembersBeginPacket.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; return Group.CompanyGroup;
} }
public override List<GroupMember> BuildMemberList() public override List<GroupMember> BuildMemberList(uint id)
{ {
List<GroupMember> groupMembers = new List<GroupMember>(); List<GroupMember> groupMembers = new List<GroupMember>();
foreach (LinkshellMember member in members) foreach (LinkshellMember member in members)

View file

@ -21,6 +21,11 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
} }
public void SetLeaderPlayerRequest(Session requestSession, string name) public void SetLeaderPlayerRequest(Session requestSession, string name)
{
SetLeaderPlayerRequest(requestSession, GetIdForName(name));
}
public void SetLeaderPlayerRequest(Session requestSession, uint actorId)
{ {
if (GetLeader() != requestSession.sessionId) if (GetLeader() != requestSession.sessionId)
{ {
@ -28,16 +33,16 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
return; return;
} }
uint newLeader = GetIdForName(name); uint newLeader = actorId;
if (newLeader == 0) if (!members.Contains(actorId))
{ {
requestSession.SendGameMessage(30575, 0x20); requestSession.SendGameMessage(30567, 0x20);
return; return;
} }
else if (newLeader == GetLeader()) else if (newLeader == GetLeader())
{ {
requestSession.SendGameMessage(30563, 0x20, name); requestSession.SendGameMessage(30559, 0x20, (Object)Server.GetServer().GetNameForId(actorId));
return; return;
} }
@ -49,13 +54,18 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
Session session = Server.GetServer().GetSession(members[i]); Session session = Server.GetServer().GetSession(members[i]);
if (session == null) if (session == null)
continue; 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) public void KickPlayerRequest(Session requestSession, string name)
{
KickPlayerRequest(requestSession, GetIdForName(name));
}
public void KickPlayerRequest(Session requestSession, uint actorId)
{ {
if (GetLeader() != requestSession.sessionId) if (GetLeader() != requestSession.sessionId)
{ {
@ -63,9 +73,9 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
return; return;
} }
uint kickedMemberId = GetIdForName(name); uint kickedMemberId = actorId;
if (kickedMemberId == 0) if (!members.Contains(actorId))
{ {
requestSession.SendGameMessage(30575, 0x20); requestSession.SendGameMessage(30575, 0x20);
return; return;
@ -80,7 +90,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
if (members[i] == kickedMemberId) if (members[i] == kickedMemberId)
session.SendGameMessage(30410, 0x20); session.SendGameMessage(30410, 0x20);
else else
session.SendGameMessage(30428, 0x20, (Object)name); session.SendGameMessage(30428, 0x20, (Object)Server.GetServer().GetNameForId(actorId));
} }
//All good, remove //All good, remove
@ -106,7 +116,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
public void SetLeader(uint actorId) public void SetLeader(uint actorId)
{ {
partyGroupWork._globalTemp.owner = (ulong)((actorId << 32) | 0xB36F92); partyGroupWork._globalTemp.owner = (ulong)(((ulong)actorId << 32) | 0xB36F92);
} }
public uint GetLeader() public uint GetLeader()
@ -152,11 +162,15 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
return Group.PlayerPartyGroup; return Group.PlayerPartyGroup;
} }
public override List<GroupMember> BuildMemberList() public override List<GroupMember> BuildMemberList(uint id)
{ {
List<GroupMember> groupMembers = new List<GroupMember>(); List<GroupMember> groupMembers = new List<GroupMember>();
groupMembers.Add(new GroupMember(id, -1, 0, false, true, Server.GetServer().GetNameForId(id)));
foreach (uint charaId in members) foreach (uint charaId in members)
{
if (charaId != id)
groupMembers.Add(new GroupMember(charaId, -1, 0, false, true, Server.GetServer().GetNameForId(charaId))); groupMembers.Add(new GroupMember(charaId, -1, 0, false, true, Server.GetServer().GetNameForId(charaId)));
}
return groupMembers; return groupMembers;
} }

View file

@ -31,7 +31,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
return Group.GroupInvitationRelationGroup; return Group.GroupInvitationRelationGroup;
} }
public override List<GroupMember> BuildMemberList() public override List<GroupMember> BuildMemberList(uint id)
{ {
List<GroupMember> groupMembers = new List<GroupMember>(); List<GroupMember> groupMembers = new List<GroupMember>();

View file

@ -63,7 +63,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
return Group.RetainerGroup; return Group.RetainerGroup;
} }
public override List<GroupMember> BuildMemberList() public override List<GroupMember> BuildMemberList(uint id)
{ {
List<GroupMember> groupMembers = new List<GroupMember>(); List<GroupMember> groupMembers = new List<GroupMember>();

View file

@ -14,6 +14,7 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
public ushort command; public ushort command;
public string name; public string name;
public uint actorId;
public PartyModifyPacket(byte[] data) public PartyModifyPacket(byte[] data)
{ {
@ -24,6 +25,10 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
try try
{ {
command = binReader.ReadUInt16(); command = binReader.ReadUInt16();
if (command >= 2)
actorId = binReader.ReadUInt32();
else
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
} }
catch (Exception) catch (Exception)

View file

@ -213,6 +213,10 @@ namespace FFXIVClassic_World_Server
pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name); pt.SetLeaderPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name);
else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER) else if (partyModifyPacket.command == PartyModifyPacket.MODIFY_KICKPLAYER)
pt.KickPlayerRequest(GetSession(subpacket.header.sourceId), partyModifyPacket.name); 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; break;
//Party Resign or Disband //Party Resign or Disband

View file

@ -214,9 +214,10 @@ namespace FFXIVClassic_World_Server
Party pt = mPartyManager.GetParty(session.sessionId); 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); pt.SendGroupPackets(session);
@ -226,7 +227,7 @@ namespace FFXIVClassic_World_Server
foreach (Linkshell ls in linkshells) foreach (Linkshell ls in linkshells)
ls.SendGroupPackets(session); ls.SendGroupPackets(session);
mRelationGroupManager.CreateRelationGroup(157, session.sessionId, 40001).SendGroupPackets(session); mRelationGroupManager.CreateRelationGroup(157, session.sessionId, 10001).SendGroupPackets(session);
} }
private void SendMotD(Session session) private void SendMotD(Session session)
@ -291,7 +292,7 @@ namespace FFXIVClassic_World_Server
if (mCurrentWorldGroups.ContainsKey(groupId)) if (mCurrentWorldGroups.ContainsKey(groupId))
{ {
Group group = mCurrentWorldGroups[groupId]; Group group = mCurrentWorldGroups[groupId];
foreach (GroupMember member in group.BuildMemberList()) foreach (GroupMember member in group.BuildMemberList(0))
group.SendGroupPackets(mServer.GetSession(member.actorId)); group.SendGroupPackets(mServer.GetSession(member.actorId));
} }
} }