From fac9d285298a23a7b2bdc38f2049af83e7ab7adb Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Fri, 8 Jan 2016 21:37:09 -0500 Subject: [PATCH] Got warp working. BROKE ACTOR SPAWNING! --- .../FFXIVClassic Map Server.csproj | 1 + FFXIVClassic Map Server/PacketProcessor.cs | 41 +++++++++++++++---- FFXIVClassic Map Server/Program.cs | 12 ++++++ FFXIVClassic Map Server/Server.cs | 5 +++ FFXIVClassic Map Server/actors/Actor.cs | 8 +++- .../actors/chara/npc/Npc.cs | 29 +++++++++++++ .../actors/chara/player/Player.cs | 24 +++++++++++ .../dataobjects/ConnectedPlayer.cs | 2 + .../send/Actor/SetActorPositionPacket.cs | 5 ++- .../packets/send/SetMapPacket.cs | 2 +- .../packets/send/_0xE2Packet.cs | 22 ++++++++++ 11 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/send/_0xE2Packet.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index d54628cd..8e79f2d4 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -201,6 +201,7 @@ + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 31cd78b3..3a6443bc 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -184,11 +184,9 @@ namespace FFXIVClassic_Lobby_Server client.queuePacket(BasePacket.createPacket(PongPacket.buildPacket(player.actorID, pingPacket.time), true, false)); break; //Unknown - case 0x0002: - BasePacket block132 = new BasePacket("./packets/tt2/4"); + case 0x0002: BasePacket packet196 = new BasePacket("./packets/196"); - BasePacket reply6 = new BasePacket("./packets/login/login6_data.bin"); BasePacket reply7 = new BasePacket("./packets/login/login7_data.bin"); BasePacket reply8 = new BasePacket("./packets/login/login8_data.bin"); BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); @@ -203,9 +201,7 @@ namespace FFXIVClassic_Lobby_Server //currancy.replaceActorID(player.actorID); //keyitems.replaceActorID(player.actorID); - block132.replaceActorID(player.actorID); packet196.replaceActorID(player.actorID); - reply6.replaceActorID(player.actorID); reply7.replaceActorID(player.actorID); reply8.replaceActorID(player.actorID); reply9.replaceActorID(player.actorID); @@ -221,9 +217,6 @@ namespace FFXIVClassic_Lobby_Server client.queuePacket(SetMusicPacket.buildPacket(player.actorID, 0x3D, 0x01), true, false); client.queuePacket(SetWeatherPacket.buildPacket(player.actorID, SetWeatherPacket.WEATHER_CLEAR), true, false); - // client.queuePacket(reply6); - - //client.queuePacket(block132); BasePacket actorPacket = player.getActor().getInitPackets(player.actorID); actorPacket.debugPrintPacket(); client.queuePacket(actorPacket); @@ -340,7 +333,7 @@ namespace FFXIVClassic_Lobby_Server book.cutsceneFlags[i] = true; client.queuePacket(book.buildPacket(player.actorID), true, false); - client.queuePacket(SetPlayerDreamPacket.buildPacket(player.actorID, 11), true, false); + //client.queuePacket(SetPlayerDreamPacket.buildPacket(player.actorID, 11), true, false); //BasePacket packet1a5 = new BasePacket("./packets/1ax/1a5"); //packet1a5.replaceActorID(player.actorID); @@ -586,6 +579,36 @@ namespace FFXIVClassic_Lobby_Server } } + + public void doWarp(uint mapID, float x, float y, float z) + { + List pList = new List(); + + + foreach (KeyValuePair entry in mPlayers) + { + pList.Clear(); + + entry.Value.getActor().positionX = x; + entry.Value.getActor().positionY = y; + entry.Value.getActor().positionZ = z; + + pList.Add(_0xE2Packet.buildPacket(0x6c, 0xF)); + pList.Add(SetMapPacket.buildPacket(0x6c, mapID, 0)); + BasePacket packet = BasePacket.createPacket(pList, true, false); + + BasePacket actorPacket = entry.Value.getActor().getInitPackets(entry.Value.actorID); + + packet.replaceActorID(entry.Value.actorID); + actorPacket.replaceActorID(entry.Value.actorID); + + entry.Value.getConnection2().queuePacket(packet); + actorPacket.debugPrintPacket(); + entry.Value.getConnection2().queuePacket(actorPacket); + + + } + } } } diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index 1d407f11..8f5d7272 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -16,6 +16,14 @@ namespace FFXIVClassic_Lobby_Server static void Main(string[] args) { + Console.WriteLine("{0:x}", Utils.MurmurHash2("playerWork.questScenario[0]", 0)); + Console.WriteLine("{0:x}", Utils.MurmurHash2("work.dispPlayer[0]", 0)); + Console.WriteLine("{0:x}", Utils.MurmurHash2("work.dispTarget[0]", 0)); + Console.WriteLine("{0:x}", Utils.MurmurHash2("work.dispName[0]", 0)); + Console.WriteLine("{0:x}", Utils.MurmurHash2("work.dispHead[0]", 0)); + Console.WriteLine("{0:x}", Utils.MurmurHash2("work.server", 0)); + + #if DEBUG TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(myWriter); @@ -86,6 +94,10 @@ namespace FFXIVClassic_Lobby_Server Log.error("Could not load packet: " + e); } } + else if (split[0].Equals("warp")) + { + server.doWarp(split[1], split[2], split[3], split[4]); + } else if (split[0].Equals("property")) { server.testCodePacket(Utils.MurmurHash2(split[1], 0), Convert.ToUInt32(split[2], 16), split[3]); diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index bc3ff19b..9f0367f8 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -263,5 +263,10 @@ namespace FFXIVClassic_Lobby_Server } } + public void doWarp(String map, String x, String y, String z) + { + mProcessor.doWarp(Convert.ToUInt32(map), Single.Parse(x), Single.Parse(y), Single.Parse(z)); + } + } } diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index ebd979d2..a3575a87 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -26,8 +26,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public uint currentMainState = SetActorStatePacket.MAIN_STATE_PASSIVE; public uint currentSubState = SetActorStatePacket.SUB_STATE_NONE; - - public float positionX, positionY, positionZ, rotation; + public float positionX = SetActorPositionPacket.INNPOS_X, positionY = SetActorPositionPacket.INNPOS_Y, positionZ = SetActorPositionPacket.INNPOS_Z, rotation = SetActorPositionPacket.INNPOS_ROT; public float oldPositionX, oldPositionY, oldPositionZ, oldRotation; public ushort moveState, oldMoveState; @@ -35,6 +34,8 @@ namespace FFXIVClassic_Map_Server.dataobjects public bool isZoning = false; + public bool spawnedFirstTime = false; + public string className; public List classParams; @@ -62,6 +63,8 @@ namespace FFXIVClassic_Map_Server.dataobjects { return SetActorPositionPacket.buildPacket(actorId, playerActorId, SetActorPositionPacket.INNPOS_X, SetActorPositionPacket.INNPOS_Y, SetActorPositionPacket.INNPOS_Z, SetActorPositionPacket.INNPOS_ROT, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE); //return SetActorPositionPacket.buildPacket(actorId, playerActorId, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE); + //spawnedFirstTime = true; + //return spawnPacket; } public SubPacket createPositionUpdatePacket(uint playerActorId) @@ -122,3 +125,4 @@ namespace FFXIVClassic_Map_Server.dataobjects } } + diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 4c3bd2f4..3e736fbc 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -1,7 +1,9 @@ using FFXIVClassic_Lobby_Server; using FFXIVClassic_Lobby_Server.common; using FFXIVClassic_Lobby_Server.dataobjects; +using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic_Map_Server.lua; +using FFXIVClassic_Map_Server.packets.send.actor; using System; using System.Collections.Generic; using System.Linq; @@ -58,5 +60,32 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara.npc appearanceIDs[L_FINGER] = appearance.leftFinger; } + + public override SubPacket createScriptBindPacket(uint playerActorId) + { + List lParams; + + lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true); + + return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams); + } + + public override BasePacket getInitPackets(uint playerActorId) + { + List subpackets = new List(); + subpackets.Add(createAddActorPacket(playerActorId)); + subpackets.Add(createSpeedPacket(playerActorId)); + subpackets.Add(createSpawnPositonPacket(playerActorId, 0xFF)); + subpackets.Add(createAppearancePacket(playerActorId)); + subpackets.Add(createNamePacket(playerActorId)); + subpackets.Add(createStatePacket(playerActorId)); + subpackets.Add(createIdleAnimationPacket(playerActorId)); + subpackets.Add(createInitStatusPacket(playerActorId)); + subpackets.Add(createSetActorIconPacket(playerActorId)); + subpackets.Add(createIsZoneingPacket(playerActorId)); + //subpackets.Add(createScriptBindPacket(playerActorId)); + return BasePacket.createPacket(subpackets, true, false); + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index c703dde2..c3e6331a 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -15,6 +15,30 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara { class Player : Character { + + public const int TIMER_TOTORAK = 0; + public const int TIMER_DZEMAEL = 1; + public const int TIMER_BOWL_OF_EMBERS_HARD = 2; + public const int TIMER_BOWL_OF_EMBERS = 3; + public const int TIMER_THORNMARCH = 4; + public const int TIMER_AURUMVALE = 5; + public const int TIMER_CUTTERSCRY = 6; + public const int TIMER_BATTLE_ALEPORT = 7; + public const int TIMER_BATTLE_HYRSTMILL = 8; + public const int TIMER_BATTLE_GOLDENBAZAAR = 9; + public const int TIMER_HOWLING_EYE_HARD = 10; + public const int TIMER_HOWLING_EYE = 11; + public const int TIMER_CASTRUM_TOWER = 12; + public const int TIMER_BOWL_OF_EMBERS_EXTREME = 13; + public const int TIMER_RIVENROAD = 14; + public const int TIMER_RIVENROAD_HARD = 15; + public const int TIMER_BEHEST = 16; + public const int TIMER_COMPANYBEHEST = 17; + public const int TIMER_RETURN = 18; + public const int TIMER_SKIRMISH = 19; + + public uint[] timers = new uint[20]; + PlayerWork playerWork = new PlayerWork(); public Player(uint actorID) : base(actorID) diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index e70e4e1a..ccddc0e7 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -101,11 +101,13 @@ namespace FFXIVClassic_Map_Server.dataobjects public void updatePlayerActorPosition(float x, float y, float z, float rot, ushort moveState) { + /* playerActor.positionX = x; playerActor.positionY = y; playerActor.positionZ = z; playerActor.rotation = rot; playerActor.moveState = moveState; + */ } public void sendMotd() diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs index 23b3965d..98912410 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs @@ -27,7 +27,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor public const float INNPOS_Z = 165.050003f; public const float INNPOS_ROT = -1.530000f; - public static SubPacket buildPacket(uint sourceActorID, uint targetActorID, float x, float y, float z, float rotation, uint spawnType) + public static SubPacket buildPacket(uint sourceActorID, uint targetActorID,float x, float y, float z, float rotation, uint spawnType) { byte[] data = new byte[PACKET_SIZE-0x20]; @@ -44,7 +44,8 @@ namespace FFXIVClassic_Map_Server.packets.send.actor binWriter.BaseStream.Seek(0x24, SeekOrigin.Begin); - binWriter.Write((UInt32)spawnType); + binWriter.Write((UInt16)spawnType); + binWriter.Write((UInt16)(0)); } } diff --git a/FFXIVClassic Map Server/packets/send/SetMapPacket.cs b/FFXIVClassic Map Server/packets/send/SetMapPacket.cs index e42b75b7..f1302a1a 100644 --- a/FFXIVClassic Map Server/packets/send/SetMapPacket.cs +++ b/FFXIVClassic Map Server/packets/send/SetMapPacket.cs @@ -23,7 +23,7 @@ namespace FFXIVClassic_Map_Server.packets.send { binWriter.Write((uint)mapID); binWriter.Write((uint)regionID); - binWriter.Write((uint)0x28); + binWriter.Write((uint)0x0); } } diff --git a/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs b/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs new file mode 100644 index 00000000..e2149f36 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/_0xE2Packet.cs @@ -0,0 +1,22 @@ +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 +{ + class _0xE2Packet + { + public const ushort OPCODE = 0x00E2; + public const uint PACKET_SIZE = 0x28; + + public static SubPacket buildPacket(uint playerActorID, int val) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + data[0] = (Byte) (val & 0xFF); + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +}