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);
+ }
+ }
+}