diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 3a6443bc..86723aa8 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -218,7 +218,6 @@ namespace FFXIVClassic_Lobby_Server client.queuePacket(SetWeatherPacket.buildPacket(player.actorID, SetWeatherPacket.WEATHER_CLEAR), true, false); BasePacket actorPacket = player.getActor().getInitPackets(player.actorID); - actorPacket.debugPrintPacket(); client.queuePacket(actorPacket); //Retainers @@ -603,7 +602,6 @@ namespace FFXIVClassic_Lobby_Server actorPacket.replaceActorID(entry.Value.actorID); entry.Value.getConnection2().queuePacket(packet); - actorPacket.debugPrintPacket(); entry.Value.getConnection2().queuePacket(actorPacket); diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index 9f0367f8..59da20eb 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -265,7 +265,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)); + if (map.ToLower().StartsWith("0x")) + mProcessor.doWarp(Convert.ToUInt32(map, 16), Single.Parse(x), Single.Parse(y), Single.Parse(z)); + else + 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 a3575a87..40d2a0ba 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -61,10 +61,17 @@ namespace FFXIVClassic_Map_Server.dataobjects public SubPacket createSpawnPositonPacket(uint playerActorId, uint spawnType) { - return SetActorPositionPacket.buildPacket(actorId, playerActorId, SetActorPositionPacket.INNPOS_X, SetActorPositionPacket.INNPOS_Y, SetActorPositionPacket.INNPOS_Z, SetActorPositionPacket.INNPOS_ROT, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE); + SubPacket spawnPacket; + if (!spawnedFirstTime && playerActorId == actorId) + spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, 0, positionX, positionY, positionZ, rotation, spawnType, false); + else if (playerActorId == actorId) + spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, 0xFFFFFFFF, positionX, positionY, positionZ, rotation, spawnType, true); + else + spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, actorId, positionX, positionY, positionZ, rotation, spawnType, false); + //return SetActorPositionPacket.buildPacket(actorId, playerActorId, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE); - //spawnedFirstTime = true; - //return spawnPacket; + spawnedFirstTime = true; + return spawnPacket; } public SubPacket createPositionUpdatePacket(uint playerActorId) @@ -92,7 +99,7 @@ namespace FFXIVClassic_Map_Server.dataobjects List subpackets = new List(); subpackets.Add(createAddActorPacket(playerActorId)); subpackets.Add(createSpeedPacket(playerActorId)); - subpackets.Add(createSpawnPositonPacket(playerActorId, 0xFF)); + subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1)); subpackets.Add(createNamePacket(playerActorId)); subpackets.Add(createStatePacket(playerActorId)); subpackets.Add(createIsZoneingPacket(playerActorId)); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index ad8632aa..c1d6e895 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -43,8 +43,8 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara public Player(uint actorID) : base(actorID) { - actorName = String.Format("_player{0:00000000}", actorID); - + actorName = String.Format("_pc{0:00000000}", actorID); + className = "Player"; currentSubState = SetActorStatePacket.SUB_STATE_PLAYER; DBStats stats = Database.getCharacterStats(actorID); @@ -118,8 +118,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara List lParams; if (isMyPlayer(playerActorId)) { - - lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true); + lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, true, 0, false, timers, true); } else lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true); @@ -134,7 +133,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara if (isMyPlayer(playerActorId)) subpackets.AddRange(create0x132Packets(playerActorId)); subpackets.Add(createSpeedPacket(playerActorId)); - subpackets.Add(createSpawnPositonPacket(playerActorId, 0xFF)); + subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1)); subpackets.Add(createAppearancePacket(playerActorId)); subpackets.Add(createNamePacket(playerActorId)); subpackets.Add(_0xFPacket.buildPacket(playerActorId, playerActorId)); @@ -143,7 +142,8 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara subpackets.Add(createInitStatusPacket(playerActorId)); subpackets.Add(createSetActorIconPacket(playerActorId)); subpackets.Add(createIsZoneingPacket(playerActorId)); - //subpackets.Add(createScriptBindPacket(playerActorId)); + subpackets.Add(createScriptBindPacket(playerActorId)); + return BasePacket.createPacket(subpackets, true, false); } diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs index 5f182598..4281726b 100644 --- a/FFXIVClassic Map Server/lua/LuaUtils.cs +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -42,12 +42,12 @@ namespace FFXIVClassic_Map_Server } value = Encoding.ASCII.GetString(list.ToArray()); break; - case 0x3: //Boolean False - value = false; - break; - case 0x4: //Boolean True + case 0x3: //Boolean True value = true; break; + case 0x4: //Boolean False + value = false; + break; case 0x5: //Nil wasNil = true; break; @@ -85,10 +85,13 @@ namespace FFXIVClassic_Map_Server switch (l.typeID) { case 0x0: //Int32 - writer.Write((UInt32)l.value); + if (l.value is uint) + writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); + else + writer.Write((UInt32)Utils.swapEndian((UInt32)(Int32)l.value)); break; - case 0x1: //Int32 - writer.Write((UInt32)l.value); + case 0x1: //Int32 + writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); break; case 0x2: //Null Termed String string sv = (string)l.value; @@ -102,7 +105,7 @@ namespace FFXIVClassic_Map_Server case 0x5: //Nil break; case 0x6: //Actor (By Id) - writer.Write((UInt32)l.value); + writer.Write((UInt32)Utils.swapEndian((UInt32)l.value)); break; case 0x10: //Byte? break; @@ -150,12 +153,12 @@ namespace FFXIVClassic_Map_Server } value = Encoding.ASCII.GetString(list.ToArray()); break; - case 0x3: //Boolean False - value = false; - break; - case 0x4: //Boolean True + case 0x3: //Boolean True value = true; break; + case 0x4: //Boolean False + value = false; + break; case 0x5: //Nil wasNil = true; break; @@ -192,33 +195,49 @@ namespace FFXIVClassic_Map_Server foreach (object o in list) { - if (o is uint) + if (o.GetType().IsArray) { - luaParams.Add(new LuaParam(0x0, (uint)o)); - } - else if (o is string) - { - luaParams.Add(new LuaParam(0x2, (string)o)); - } - else if (o is bool) - { - if (((bool)o)) - luaParams.Add(new LuaParam(0x4, null)); - else - luaParams.Add(new LuaParam(0x3, null)); - } - else if (o == null) - { - luaParams.Add(new LuaParam(0x5, null)); - } - else if (o is Actor) - { - luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId)); + Array arrayO = (Array)o; + foreach (object o2 in arrayO) + addToList(o2, luaParams); } + else + addToList(o, luaParams); } return luaParams; - } + } + + private static void addToList(object o, List luaParams) + { + if (o is uint) + { + luaParams.Add(new LuaParam(0x0, (uint)o)); + } + else if (o is int) + { + luaParams.Add(new LuaParam(0x0, (int)o)); + } + else if (o is string) + { + luaParams.Add(new LuaParam(0x2, (string)o)); + } + else if (o is bool) + { + if (((bool)o)) + luaParams.Add(new LuaParam(0x3, null)); + else + luaParams.Add(new LuaParam(0x4, null)); + } + else if (o == null) + { + luaParams.Add(new LuaParam(0x5, null)); + } + else if (o is Actor) + { + luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId)); + } + } public static object[] createLuaParamObjectList(List luaParams) { @@ -247,12 +266,12 @@ namespace FFXIVClassic_Map_Server case 0x2: //Null Termed String dumpString += String.Format("\"{0}\"", (string)lParams[i].value); break; - case 0x3: //Boolean False - dumpString += "false"; - break; - case 0x4: //Boolean True + case 0x3: //Boolean True dumpString += "true"; break; + case 0x4: //Boolean False + dumpString += "false"; + break; case 0x5: //NULL??? dumpString += "nil"; break; diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPositionPacket.cs index 98912410..4d6718d6 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, uint actorId, float x, float y, float z, float rotation, uint spawnType, bool isZoningPlayer) { byte[] data = new byte[PACKET_SIZE-0x20]; @@ -35,8 +35,8 @@ namespace FFXIVClassic_Map_Server.packets.send.actor { using (BinaryWriter binWriter = new BinaryWriter(mem)) { - binWriter.Write((Int32)0); - binWriter.Write((Int32)0); + binWriter.Write((Int32)0); + binWriter.Write((Int32)actorId); binWriter.Write((Single)x); binWriter.Write((Single)y); binWriter.Write((Single)z); @@ -45,7 +45,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor binWriter.BaseStream.Seek(0x24, SeekOrigin.Begin); binWriter.Write((UInt16)spawnType); - binWriter.Write((UInt16)(0)); + binWriter.Write((UInt16)(isZoningPlayer ? 1 : 0)); } }