diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs
index 3affd78f..06a03b1e 100644
--- a/FFXIVClassic Map Server/Database.cs
+++ b/FFXIVClassic Map Server/Database.cs
@@ -638,6 +638,9 @@ namespace FFXIVClassic_Lobby_Server
{
int index = reader.GetUInt16(0);
player.playerWork.questScenario[index] = 0xA0F00000 | reader.GetUInt32(1);
+
+ string questName = Server.getStaticActors(player.playerWork.questScenario[index]).actorName;
+ player.questScenario[index] = new Quest(player.playerWork.questScenario[index], questName);
}
}
diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 7e0ff280..90fcbbe0 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -117,6 +117,7 @@
+
@@ -129,6 +130,7 @@
+
@@ -239,6 +241,7 @@
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index 9e63b549..da8591ec 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -177,6 +177,7 @@ namespace FFXIVClassic_Lobby_Server
//Unknown
case 0x0002:
+ subpacket.debugPrintSubPacket();
client.queuePacket(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "-------- Login Message --------\nWelcome to the 1.0 Dev Server"), true, false);
Server.GetWorldManager().DoLogin(player.getActor());
@@ -196,9 +197,16 @@ namespace FFXIVClassic_Lobby_Server
player.getActor().broadcastPacket(SendMessagePacket.buildPacket(player.actorID, player.actorID, chatMessage.logType, player.getActor().customDisplayName, chatMessage.message), false);
+ break;
+ //Langauge Code
+ case 0x0006:
+ LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data);
+ player.languageCode = langCode.languageCode;
break;
//Unknown
case 0x0007:
+ subpacket.debugPrintSubPacket();
+ _0x07Packet unknown07 = new _0x07Packet(subpacket.data);
break;
//Update Position
case 0x00CA:
@@ -207,6 +215,10 @@ namespace FFXIVClassic_Lobby_Server
UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data);
player.updatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState);
player.getActor().sendInstanceUpdate();
+
+ if (player.getActor().isInZoneChange())
+ player.getActor().setZoneChanging(false);
+
break;
//Set Target
case 0x00CD:
@@ -245,11 +257,18 @@ namespace FFXIVClassic_Lobby_Server
Actor ownerActor = Server.getStaticActors(player.getActor().eventCurrentOwner);
if (ownerActor == null)
{
+ //Is it a instance actor?
ownerActor = Server.GetWorldManager().GetActorInWorld(player.getActor().eventCurrentOwner);
if (ownerActor == null)
{
- Log.debug(String.Format("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams)));
- break;
+ //Is it a Director?
+ if (player.getActor().currentDirector != null && player.getActor().eventCurrentOwner == player.getActor().currentDirector.actorId)
+ ownerActor = player.getActor().currentDirector;
+ else
+ {
+ Log.debug(String.Format("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams)));
+ break;
+ }
}
}
@@ -257,6 +276,9 @@ namespace FFXIVClassic_Lobby_Server
Log.debug(String.Format("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.triggerName, LuaUtils.dumpParams(eventStart.luaParams)));
break;
+ //Unknown, happens at npc spawn and cutscene play????
+ case 0x00CE:
+ break;
//Event Result
case 0x012E:
subpacket.debugPrintSubPacket();
diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs
index e66c34df..4b9fea09 100644
--- a/FFXIVClassic Map Server/actors/Actor.cs
+++ b/FFXIVClassic Map Server/actors/Actor.cs
@@ -94,8 +94,6 @@ namespace FFXIVClassic_Map_Server.Actors
//return SetActorPositionPacket.buildPacket(actorId, playerActorId, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE);
spawnedFirstTime = true;
- spawnPacket.debugPrintSubPacket();
-
return spawnPacket;
}
@@ -227,7 +225,7 @@ namespace FFXIVClassic_Map_Server.Actors
}
public virtual BasePacket getSpawnPackets(uint playerActorId)
- {
+ {
return getSpawnPackets(playerActorId, 0x1);
}
diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs
index 8385f922..cc8264b0 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -90,6 +90,7 @@ namespace FFXIVClassic_Map_Server.Actors
public uint playTime;
public uint lastPlayTimeUpdate;
public bool isGM = false;
+ public bool isZoneChanging = true;
//Inventory
private Dictionary inventories = new Dictionary();
@@ -480,12 +481,15 @@ namespace FFXIVClassic_Map_Server.Actors
public void sendZoneInPackets(WorldManager world, ushort spawnType)
{
- queuePacket(SetMapPacket.buildPacket(actorId, zone.regionId, zone.actorId));
+ queuePacket(SetMapPacket.buildPacket(actorId, zone.regionId, zone.actorId));
+ // queuePacket(_0x2Packet.buildPacket(actorId));
queuePacket(SetMusicPacket.buildPacket(actorId, zone.bgmDay, 0x01));
queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR));
queuePacket(getSpawnPackets(actorId, spawnType));
+ //getSpawnPackets(actorId, spawnType).debugPrintPacket();
+
#region grouptest
//Retainers
List retainerListEntries = new List();
@@ -530,9 +534,12 @@ namespace FFXIVClassic_Map_Server.Actors
playerSession.queuePacket(debugSpawn);
playerSession.queuePacket(worldMasterSpawn);
- // if (directorSpawn != null)
- // queuePacket(directorSpawn);
-
+ if (directorSpawn != null)
+ {
+ //directorSpawn.debugPrintPacket();
+ queuePacket(directorSpawn);
+ }
+
#region hardcode
BasePacket reply10 = new BasePacket("./packets/login/login10.bin"); //Item Storage, Inn Door created
BasePacket reply11 = new BasePacket("./packets/login/login11.bin"); //NPC Create ??? Final init
@@ -956,6 +963,19 @@ namespace FFXIVClassic_Map_Server.Actors
return null;
}
+ public void setZoneChanging(bool flag)
+ {
+ isZoneChanging = flag;
+
+ if (!isZoneChanging)
+ LuaEngine.onZoneIn(this);
+ }
+
+ public bool isInZoneChange()
+ {
+ return isZoneChanging;
+ }
+
public Equipment getEquipment()
{
return equipment;
@@ -987,11 +1007,15 @@ namespace FFXIVClassic_Map_Server.Actors
{
if (directorType.Equals("openingDirector"))
{
- currentDirector = new OpeningDirector(0x5FF80004);
+ currentDirector = new OpeningDirector(0x46080012);
}
- queuePacket(RemoveActorPacket.buildPacket(actorId, 0x5FF80004));
+ queuePacket(RemoveActorPacket.buildPacket(actorId, 0x46080012));
queuePacket(currentDirector.getSpawnPackets(actorId));
+ queuePacket(currentDirector.getInitPackets(actorId));
+ // queuePacket(currentDirector.getSetEventStatusPackets(actorId));
+ // currentDirector.getSpawnPackets(actorId).debugPrintPacket();
+ // currentDirector.getInitPackets(actorId).debugPrintPacket();
}
public Director getDirector()
@@ -1022,6 +1046,9 @@ namespace FFXIVClassic_Map_Server.Actors
public void kickEvent(Actor actor, string conditionName, params object[] parameters)
{
+ if (actor == null)
+ return;
+
List lParams = LuaUtils.createLuaParamList(parameters);
SubPacket spacket = KickEventPacket.buildPacket(actorId, actor.actorId, conditionName, lParams);
spacket.debugPrintSubPacket();
diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs
index baf9080c..bc63ec27 100644
--- a/FFXIVClassic Map Server/actors/director/Director.cs
+++ b/FFXIVClassic Map Server/actors/director/Director.cs
@@ -1,4 +1,6 @@
-using FFXIVClassic_Map_Server.Actors;
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.Actors;
+using FFXIVClassic_Map_Server.packets.send.actor;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,5 +15,27 @@ namespace FFXIVClassic_Map_Server.actors.director
{
}
+
+ public virtual BasePacket getSpawnPackets(uint playerActorId, uint spawnType)
+ {
+ List subpackets = new List();
+ subpackets.Add(createAddActorPacket(playerActorId, 0));
+ subpackets.AddRange(getEventConditionPackets(playerActorId));
+ subpackets.Add(createSpeedPacket(playerActorId));
+ subpackets.Add(createSpawnPositonPacket(playerActorId, 0));
+ subpackets.Add(createNamePacket(playerActorId));
+ subpackets.Add(createStatePacket(playerActorId));
+ subpackets.Add(createIsZoneingPacket(playerActorId));
+ subpackets.Add(createScriptBindPacket(playerActorId));
+ return BasePacket.createPacket(subpackets, true, false);
+ }
+
+ public override BasePacket getInitPackets(uint playerActorId)
+ {
+ SetActorPropetyPacket initProperties = new SetActorPropetyPacket("/_init");
+ initProperties.addTarget();
+ return BasePacket.createPacket(initProperties.buildPacket(playerActorId, actorId), true, false);
+ }
+
}
}
diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
index c77123c7..455448dc 100644
--- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
+++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
@@ -16,7 +16,9 @@ namespace FFXIVClassic_Map_Server.dataobjects
public uint actorID = 0;
Player playerActor;
public List actorInstanceList = new List();
-
+
+ public uint languageCode = 1;
+
private ClientConnection zoneConnection;
private ClientConnection chatConnection;
@@ -95,7 +97,6 @@ namespace FFXIVClassic_Map_Server.dataobjects
public void updatePlayerActorPosition(float x, float y, float z, float rot, ushort moveState)
{
-
playerActor.oldPositionX = playerActor.positionX;
playerActor.oldPositionY = playerActor.positionY;
playerActor.oldPositionZ = playerActor.positionZ;
diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs
index 2801a6fb..286542da 100644
--- a/FFXIVClassic Map Server/lua/LuaEngine.cs
+++ b/FFXIVClassic Map Server/lua/LuaEngine.cs
@@ -1,5 +1,6 @@
using FFXIVClassic_Lobby_Server;
using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.actors.director;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.packets.receive.events;
@@ -22,6 +23,7 @@ namespace FFXIVClassic_Map_Server.lua
const string FILEPATH_PLAYER = "./scripts/player.lua";
const string FILEPATH_ZONE = "./scripts/zones/{0}/zone.lua";
const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua";
+ const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua";
const string FILEPATH_NPCS = "./scripts/zones/{0}/npcs/{1}.lua";
public LuaEngine()
@@ -69,6 +71,10 @@ namespace FFXIVClassic_Map_Server.lua
{
luaPath = String.Format(FILEPATH_COMMANDS, target.getName());
}
+ else if (target is Director)
+ {
+ luaPath = String.Format(FILEPATH_DIRECTORS, target.getName());
+ }
else
luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
diff --git a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs
index 677a6253..741c8e2e 100644
--- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs
+++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs
@@ -24,10 +24,15 @@ namespace FFXIVClassic_Map_Server.packets.send.events
{
binWriter.Write((UInt32)playerActorId);
binWriter.Write((UInt32)targetActorId);
- binWriter.Write((UInt32)0);
- binWriter.Write((UInt32)0);
+ binWriter.Write((Byte)0x5);
+ binWriter.Write((UInt32)0x0175DC87);
+ binWriter.Write((Byte)0x0);
+ binWriter.Write((Byte)0x0);
+ binWriter.Write((Byte)0x3c);
binWriter.Write(Encoding.ASCII.GetBytes(conditionName), 0, Encoding.ASCII.GetByteCount(conditionName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(conditionName));
+ binWriter.Seek(0x30, SeekOrigin.Begin);
+
LuaUtils.writeLuaParams(binWriter, luaParams);
}
}
diff --git a/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs
index 5a9878b3..20330d3e 100644
--- a/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs
+++ b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs
@@ -26,7 +26,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events
{
binWriter.Write((UInt32)playerActorID);
binWriter.Write((UInt32)eventOwnerActorID);
- binWriter.Write((Byte)1);
+ binWriter.Write((Byte)5);
binWriter.Write(Encoding.ASCII.GetBytes(eventStarter), 0, Encoding.ASCII.GetByteCount(eventStarter) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(eventStarter));
binWriter.Seek(0x29, SeekOrigin.Begin);
binWriter.Write(Encoding.ASCII.GetBytes(callFunction), 0, Encoding.ASCII.GetByteCount(callFunction) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(callFunction));