Started implementing LS management. Rank change works.

This commit is contained in:
Filip Maj 2017-01-08 23:13:15 -05:00
parent 68772a2011
commit 61e4effd74
10 changed files with 258 additions and 7 deletions

View File

@ -286,10 +286,12 @@
<Compile Include="packets\WorldPackets\Send\Group\CreateLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\CreateLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\DeleteLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\DeleteLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellInviteCancelPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\LinkshellInviteCancelPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellRankChangePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\ModifyLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\ModifyLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\GroupInviteResultPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\GroupInviteResultPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellInvitePacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\LinkshellInvitePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\PartyInvitePacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\PartyInvitePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellLeavePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\PartyLeavePacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\PartyLeavePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\PartyModifyPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\PartyModifyPacket.cs" />
<Compile Include="packets\WorldPackets\Send\SessionBeginConfirmPacket.cs" /> <Compile Include="packets\WorldPackets\Send\SessionBeginConfirmPacket.cs" />

View File

@ -680,7 +680,8 @@ namespace FFXIVClassic_Map_Server
public void RequestWorldLinkshellRankChange(Player player, string lsname, string memberName, byte newRank) public void RequestWorldLinkshellRankChange(Player player, string lsname, string memberName, byte newRank)
{ {
SubPacket packet = LinkshellRankChangePacket.BuildPacket(player.playerSession, memberName, lsname, newRank);
Server.GetWorldConnection().QueuePacket(packet, true, false);
} }
public void RequestWorldLinkshellInviteMember(Player player, string lsname, uint invitedActorId) public void RequestWorldLinkshellInviteMember(Player player, string lsname, uint invitedActorId)
@ -695,9 +696,10 @@ namespace FFXIVClassic_Map_Server
Server.GetWorldConnection().QueuePacket(packet, true, false); Server.GetWorldConnection().QueuePacket(packet, true, false);
} }
public bool RequestWorldLinkshellRemoveMember(Player player, bool wasKicked, string lsname, string memberName) public void RequestWorldLinkshellLeave(Player player, string lsname)
{ {
return false; SubPacket packet = LinkshellLeavePacket.BuildPacket(player.playerSession, lsname, false);
Server.GetWorldConnection().QueuePacket(packet, true, false);
} }
private void RequestWorldServerZoneChange(Player player, uint destinationZoneId, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) private void RequestWorldServerZoneChange(Player player, uint destinationZoneId, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)

View File

@ -0,0 +1,31 @@
using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.dataobjects;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group
{
class LinkshellLeavePacket
{
public const ushort OPCODE = 0x1031;
public const uint PACKET_SIZE = 0x48;
public static SubPacket BuildPacket(Session session, string lsName, bool isDisband)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
binWriter.Write((UInt16)(isDisband ? 1 : 0));
binWriter.Write(Encoding.ASCII.GetBytes(lsName), 0, Encoding.ASCII.GetByteCount(lsName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(lsName));
}
}
return new SubPacket(true, OPCODE, session.id, session.id, data);
}
}
}

View File

@ -0,0 +1,34 @@
using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.dataobjects;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group
{
class LinkshellRankChangePacket
{
public const ushort OPCODE = 0x1032;
public const uint PACKET_SIZE = 0x68;
public static SubPacket BuildPacket(Session session, string name, string lsName, byte rank)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
binWriter.Write(Encoding.ASCII.GetBytes(name), 0, Encoding.ASCII.GetByteCount(name) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(name));
binWriter.Seek(0x20, SeekOrigin.Begin);
binWriter.Write(Encoding.ASCII.GetBytes(lsName), 0, Encoding.ASCII.GetByteCount(lsName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(lsName));
binWriter.Seek(0x40, SeekOrigin.Begin);
binWriter.Write((Byte)rank);
}
}
return new SubPacket(true, OPCODE, session.id, session.id, data);
}
}
}

View File

@ -51,7 +51,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
public void AddMember(uint charaId) public void AddMember(uint charaId)
{ {
members.Add(new LinkshellMember(charaId, dbId, 0x0)); members.Add(new LinkshellMember(charaId, dbId, 0x4));
members.Sort(); members.Sort();
} }
@ -125,6 +125,37 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
session.clientConnection.QueuePacket(test, true, false); session.clientConnection.QueuePacket(test, true, false);
} }
public void ResendWorkValues()
{
SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex);
groupWork.addProperty(this, "work._globalSave.master");
groupWork.addProperty(this, "work._globalSave.crestIcon[0]");
groupWork.addProperty(this, "work._globalSave.rank");
for (int i = 0; i < members.Count; i++)
{
work._memberSave[i].rank = members[i].rank;
groupWork.addProperty(this, String.Format("work._memberSave[{0}].rank", i));
}
groupWork.setTarget("memberRank");
lock (members)
{
for (int i = 0; i < members.Count; i++)
{
Session session = Server.GetServer().GetSession(members[i].charaId);
if (session != null)
{
SubPacket test = groupWork.buildPacket(session.sessionId, session.sessionId);
session.clientConnection.QueuePacket(test, true, false);
}
}
}
}
public void LoadMembers() public void LoadMembers()
{ {
members = Database.GetLSMembers(this); members = Database.GetLSMembers(this);
@ -158,5 +189,48 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
} }
} }
public void DisbandRequest(Session session)
{
throw new NotImplementedException();
}
public void LeaveRequest(Session requestSession)
{
uint leaver = requestSession.sessionId;
//Check if ls contains this person
if (!HasMember(leaver))
{
return;
}
//Send you are leaving message
requestSession.SendGameMessage(25162, 0x20, (Object)1, (Object)Server.GetServer().GetNameForId(leaver));
//All good, remove
Server.GetServer().GetWorldManager().GetLinkshellManager().RemoveMemberFromLinkshell(requestSession.sessionId, name);
SendGroupPacketsAll(GetMemberIds());
ResendWorkValues();
}
public void RankChangeRequest(Session requestSession, string name, byte rank)
{
lock (members)
{
for (int i = 0; i < members.Count; i++)
{
if (Server.GetServer().GetNameForId(members[i].charaId).Equals(name))
{
members[i].rank = rank;
ResendWorkValues();
requestSession.SendGameMessage(25277, 0x20, (object)(100000 + rank), (object)name);
return;
}
}
}
}
} }
} }

View File

@ -10,7 +10,7 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
{ {
public readonly uint charaId; public readonly uint charaId;
public readonly ulong lsId; public readonly ulong lsId;
public readonly byte rank; public byte rank;
public LinkshellMember(uint charaId, ulong lsId, byte rank) public LinkshellMember(uint charaId, ulong lsId, byte rank)
{ {

View File

@ -113,6 +113,8 @@
<Compile Include="Packets\WorldPackets\Receive\Group\GroupInviteResultPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\GroupInviteResultPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInviteCancelPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInviteCancelPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInvitePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInvitePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellRankChangePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellLeavePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyLeavePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyLeavePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyInvitePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyInvitePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyModifyPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyModifyPacket.cs" />

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class LinkshellLeavePacket
{
public bool invalidPacket = false;
public bool isDisband;
public string lsName;
public LinkshellLeavePacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
isDisband = binReader.ReadUInt16() == 1;
lsName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class LinkshellRankChangePacket
{
public bool invalidPacket = false;
public string name;
public string lsName;
public byte rank;
public LinkshellRankChangePacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
lsName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
rank = binReader.ReadByte();
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -149,6 +149,20 @@ namespace FFXIVClassic_World_Server
return null; return null;
} }
public Session GetSession(string targetSessionName)
{
lock (mZoneSessionList)
{
foreach (Session s in mZoneSessionList.Values)
{
if (s.characterName != null && s.characterName.Equals(targetSessionName))
return s;
}
}
return null;
}
public void OnReceiveSubPacketFromZone(ZoneServer zoneServer, SubPacket subpacket) public void OnReceiveSubPacketFromZone(ZoneServer zoneServer, SubPacket subpacket)
{ {
uint sessionId = subpacket.header.targetId; uint sessionId = subpacket.header.targetId;
@ -235,9 +249,15 @@ namespace FFXIVClassic_World_Server
PartyInvitePacket partyInvitePacket = new PartyInvitePacket(subpacket.data); PartyInvitePacket partyInvitePacket = new PartyInvitePacket(subpacket.data);
if (partyInvitePacket.command == 1) if (partyInvitePacket.command == 1)
mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), partyInvitePacket.actorId); mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), partyInvitePacket.actorId);
else if (partyInvitePacket.command == 0) else if (partyInvitePacket.command == 0)
{ {
Session inviteeByNamesSession = GetSession(partyInvitePacket.name);
if (inviteeByNamesSession != null)
mWorldManager.ProcessPartyInvite(GetSession(subpacket.header.sourceId), inviteeByNamesSession.sessionId);
else
{
//Show not found msg
}
} }
break; break;
//Group Invite Result //Group Invite Result
@ -295,6 +315,21 @@ namespace FFXIVClassic_World_Server
LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data); LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data);
mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId)); mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId));
break; break;
//Linkshell resign/disband
case 0x1031:
LinkshellLeavePacket linkshellLeavePacket = new LinkshellLeavePacket(subpacket.data);
Linkshell lsLeave = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellLeavePacket.lsName);
if (linkshellLeavePacket.isDisband)
lsLeave.DisbandRequest(GetSession(subpacket.header.sourceId));
else
lsLeave.LeaveRequest(GetSession(subpacket.header.sourceId));
break;
//Linkshell rank change
case 0x1032:
LinkshellRankChangePacket linkshellRankChangePacket = new LinkshellRankChangePacket(subpacket.data);
Linkshell lsRankChange = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellRankChangePacket.lsName);
lsRankChange.RankChangeRequest(GetSession(subpacket.header.sourceId), linkshellRankChangePacket.name, linkshellRankChangePacket.rank);
break;
} }
} }
else if (mZoneSessionList.ContainsKey(sessionId)) else if (mZoneSessionList.ContainsKey(sessionId))
@ -460,5 +495,6 @@ namespace FFXIVClassic_World_Server
return null; return null;
} }
} }
} }