From b0ab5275509f721cbc527bc5b5bdd4bed323ff1f Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 5 Oct 2015 19:36:15 -0400 Subject: [PATCH] Implemented more packets. Implemented zone grid map. --- FFXIVClassic Map Server/Server.cs | 3 + FFXIVClassic Map Server/Zone.cs | 72 +++++++++++++++++++ ...FXIVClassic Map Server.vshost.exe.manifest | 11 +++ FFXIVClassic Map Server/dataobjects/Actor.cs | 1 + .../packets/send/Actor/SetActorNamePacket.cs | 43 +++++++++++ .../Actor/inventory/ChangeEquipmentPacket.cs | 42 +++++++++++ .../inventory/InventorySetBeginPacket.cs | 3 +- 7 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 FFXIVClassic Map Server/Zone.cs create mode 100644 FFXIVClassic Map Server/bin/Debug/FFXIVClassic Map Server.vshost.exe.manifest create mode 100644 FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index c5039be4..8c268bc6 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -24,6 +24,7 @@ namespace FFXIVClassic_Lobby_Server private List mConnectionList = new List(); private PacketProcessor mProcessor; private Thread mProcessorThread; + private Thread mGameThread; #region Socket Handling public bool startServer() @@ -63,6 +64,8 @@ namespace FFXIVClassic_Lobby_Server mProcessor = new PacketProcessor(mConnectedPlayerList, mConnectionList); mProcessorThread = new Thread(new ThreadStart(mProcessor.update)); mProcessorThread.Start(); + //mGameThread = new Thread(new ThreadStart(mProcessor.update)); + //mGameThread.Start(); return true; } diff --git a/FFXIVClassic Map Server/Zone.cs b/FFXIVClassic Map Server/Zone.cs new file mode 100644 index 00000000..546a9d17 --- /dev/null +++ b/FFXIVClassic Map Server/Zone.cs @@ -0,0 +1,72 @@ +using FFXIVClassic_Map_Server.dataobjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server +{ + class Zone + { + public uint mapId; + public int boundingGridSize = 200; + + private Dictionary, List> actorBlock = new Dictionary, List>(); + + public void addActorToZone(Actor actor) + { + int gridX = (int)actor.positionX / boundingGridSize; + int gridY = (int)actor.positionY / boundingGridSize; + + lock (actorBlock) + actorBlock[Tuple.Create(gridX, gridY)].Add(actor); + } + + public void removeActorToZone(Actor actor) + { + int gridX = (int)actor.positionX / boundingGridSize; + int gridY = (int)actor.positionY / boundingGridSize; + + lock (actorBlock) + actorBlock[Tuple.Create(gridX, gridY)].Remove(actor); + } + + public void updateActorPosition(Actor actor) + { + int gridX = (int)actor.positionX / boundingGridSize; + int gridY = (int)actor.positionY / boundingGridSize; + + int gridOldX = (int)actor.oldPositionX / boundingGridSize; + int gridOldY = (int)actor.oldPositionY / boundingGridSize; + + //Still in same block + if (gridX == gridOldX && gridY == gridOldY) + return; + + lock (actorBlock) + actorBlock[Tuple.Create(gridOldX, gridOldY)].Remove(actor); + lock (actorBlock) + actorBlock[Tuple.Create(gridX, gridY)].Add(actor); + } + + public List getActorsAroundPoint(float x, float y, int checkDistance) + { + int gridX = (int)x/boundingGridSize; + int gridY = (int)y/boundingGridSize; + + List result = new List(); + + for (int gx = gridX - checkDistance; gx <= gridX + checkDistance; gx++) + { + for (int gy = gridY - checkDistance; gy <= gridY + checkDistance; gy++) + { + result.AddRange(actorBlock[Tuple.Create(gx, gy)]); + } + } + + return result; + } + + } +} diff --git a/FFXIVClassic Map Server/bin/Debug/FFXIVClassic Map Server.vshost.exe.manifest b/FFXIVClassic Map Server/bin/Debug/FFXIVClassic Map Server.vshost.exe.manifest new file mode 100644 index 00000000..061c9ca9 --- /dev/null +++ b/FFXIVClassic Map Server/bin/Debug/FFXIVClassic Map Server.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/FFXIVClassic Map Server/dataobjects/Actor.cs b/FFXIVClassic Map Server/dataobjects/Actor.cs index d545f16f..b85910aa 100644 --- a/FFXIVClassic Map Server/dataobjects/Actor.cs +++ b/FFXIVClassic Map Server/dataobjects/Actor.cs @@ -40,6 +40,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public uint[] appearanceIDs; public float positionX, positionY, positionZ; + public float oldPositionX, oldPositionY, oldPositionZ; public float rotation; public ushort moveState; diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs new file mode 100644 index 00000000..7caf46d2 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs @@ -0,0 +1,43 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.Actor +{ + class SetActorNamePacket + { + public const ushort OPCODE = 0x013D; + public const uint PACKET_SIZE = 0x48; + + public static SubPacket buildPacket(uint playerActorID, uint targetActorID, uint displayNameID, string customName) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)displayNameID); + + if (displayNameID == 0xFFFFFFFF) + { + if (customName.Length <= 0x20) + binWriter.Write(Encoding.ASCII.GetBytes(customName)); + else + binWriter.Write(Encoding.ASCII.GetBytes("ERROR: NAME TO BIG")); + } + + } + data = mem.GetBuffer(); + } + + SubPacket packet = new SubPacket(OPCODE, playerActorID, targetActorID, data); + return packet; + } + + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs new file mode 100644 index 00000000..b14cd476 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs @@ -0,0 +1,42 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +{ + class ChangeEquipmentPacket + { + public const ushort OPCODE = 0x014D; + public const uint PACKET_SIZE = 0x28; + + public const UInt16 SLOT_MAINHAND = 0x00; + public const UInt16 SLOT_OFFHAND = 0x01; + public const UInt16 SLOT_THROWINGWEAPON = 0x04; + public const UInt16 SLOT_PACK = 0x05; + public const UInt16 SLOT_POUCH = 0x06; + public const UInt16 SLOT_HEAD = 0x08; + public const UInt16 SLOT_UNDERSHIRT = 0x09; + public const UInt16 SLOT_BODY = 0x0A; + public const UInt16 SLOT_UNDERGARMENT = 0x0B; + public const UInt16 SLOT_LEGS = 0x0C; + public const UInt16 SLOT_HANDS = 0x0D; + public const UInt16 SLOT_BOOTS = 0x0E; + public const UInt16 SLOT_WAIST = 0x0F; + public const UInt16 SLOT_NECK = 0x10; + public const UInt16 SLOT_EARS = 0x11; + public const UInt16 SLOT_WRISTS = 0x13; + public const UInt16 SLOT_RIGHTFINGER = 0x15; + public const UInt16 SLOT_LEFTFINGER = 0x16; + + + public static SubPacket buildPacket(uint playerActorID, ushort equipSlot, uint inventorySlot) + { + ulong combined = equipSlot | (inventorySlot << 32); + return new SubPacket(OPCODE, 0, playerActorID, BitConverter.GetBytes(combined)); + } + + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs index eca4ebff..2887cab9 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventorySetBeginPacket.cs @@ -15,7 +15,8 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort CODE_ITEMS = 0x0000; public const ushort CODE_CURRANCYITEMS = 0x0063; - public const ushort CODE_KEYITEMS = 0x0064; + public const ushort CODE_KEYITEMS = 0x0064; + public const ushort CODE_EQUIPMENT = 0x00FE; public static SubPacket buildPacket(uint playerActorID, ushort size, ushort code) {