From 441c1a6383a051765be4ceaca54e4e3724886511 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 1 Oct 2017 12:39:46 -0400 Subject: [PATCH] Implemented countdowns. --- .../FFXIVClassic Map Server.csproj | 4 ++- FFXIVClassic Map Server/PacketProcessor.cs | 5 ++++ .../actors/chara/player/Player.cs | 4 +-- .../packets/receive/CountdownRequestPacket.cs | 30 +++++++++++++++++++ .../send/Actor/StartCountdownPacket.cs | 4 +-- 5 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/receive/CountdownRequestPacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 3c275fc0..8b0184f6 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -143,6 +143,7 @@ + @@ -188,6 +189,7 @@ + @@ -285,7 +287,7 @@ - + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index ed297041..ded25460 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -210,6 +210,11 @@ namespace FFXIVClassic_Map_Server case 0x00CE: subpacket.DebugPrintSubPacket(); break; + //Countdown requested + case 0x00CF: + CountdownRequestPacket countdownPacket = new CountdownRequestPacket(subpacket.data); + session.GetActor().BroadcastCountdown(countdownPacket.countdownLength, countdownPacket.syncTime); + break; //Event Result case 0x012E: subpacket.DebugPrintSubPacket(); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 7e865553..bb98227e 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1623,9 +1623,9 @@ namespace FFXIVClassic_Map_Server.Actors currentEventRunning = null; } - public void BroadcastCountdown(byte countdownLength, uint startTime) + public void BroadcastCountdown(byte countdownLength, ulong syncTime) { - BroadcastPacket(StartCountdownPacket.BuildPacket(actorId, countdownLength, startTime, "Go!"), true); + BroadcastPacket(StartCountdownPacket.BuildPacket(actorId, countdownLength, syncTime, "Go!"), true); } public void SendInstanceUpdate() diff --git a/FFXIVClassic Map Server/packets/receive/CountdownRequestPacket.cs b/FFXIVClassic Map Server/packets/receive/CountdownRequestPacket.cs new file mode 100644 index 00000000..23701717 --- /dev/null +++ b/FFXIVClassic Map Server/packets/receive/CountdownRequestPacket.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; + +namespace FFXIVClassic_Map_Server.packets.receive +{ + class CountdownRequestPacket + { + public bool invalidPacket = false; + public byte countdownLength; + public ulong syncTime; + + public CountdownRequestPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try{ + countdownLength = binReader.ReadByte(); + binReader.BaseStream.Seek(8, SeekOrigin.Begin); + syncTime = binReader.ReadUInt64(); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/StartCountdownPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/StartCountdownPacket.cs index 7199f863..83f83c1a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/StartCountdownPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/StartCountdownPacket.cs @@ -10,7 +10,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor public const ushort OPCODE = 0xE5; public const uint PACKET_SIZE = 0x48; - public static SubPacket BuildPacket(uint sourceActorId, byte countdownLength, uint startTime, string message) + public static SubPacket BuildPacket(uint sourceActorId, byte countdownLength, ulong syncTime, string message) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -20,7 +20,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor { binWriter.Write((Byte)countdownLength); binWriter.Seek(8, SeekOrigin.Begin); - binWriter.Write((UInt32)startTime); + binWriter.Write((UInt64)syncTime); binWriter.Seek(18, SeekOrigin.Begin); binWriter.Write(Encoding.ASCII.GetBytes(message), 0, Encoding.ASCII.GetByteCount(message) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(message)); }