mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Started implementing LS management. Rank change works.
This commit is contained in:
		| @@ -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" /> | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
| @@ -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); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -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); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -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; | ||||||
|  |                     } | ||||||
|  |                 }                 | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -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" /> | ||||||
|   | |||||||
| @@ -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; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -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; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -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; | ||||||
| @@ -237,7 +251,13 @@ namespace FFXIVClassic_World_Server | |||||||
|                             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;   | ||||||
|         }         |         }         | ||||||
|  |  | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user