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 eee44060..27a9891d 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -70,6 +70,8 @@
+
+
@@ -115,6 +117,7 @@
+
@@ -127,6 +130,8 @@
+
+
@@ -172,6 +177,7 @@
+
@@ -236,6 +242,7 @@
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index 9e63b549..1c27dec5 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -54,8 +54,6 @@ namespace FFXIVClassic_Lobby_Server
if (packet.header.isCompressed == 0x01)
BasePacket.decryptPacket(client.blowfish, ref packet);
- // packet.debugPrintPacket();
-
List subPackets = packet.getSubpackets();
foreach (SubPacket subpacket in subPackets)
{
@@ -65,7 +63,7 @@ namespace FFXIVClassic_Lobby_Server
byte[] reply1Data = {
0x01, 0x00, 0x00, 0x00, 0x28, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x07, 0x00, 0x00, 0x0, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7F, 0xFD, 0xFF, 0xFF,
- 0x43, 0xEC, 0x00, 0xE0, 0x00, 0x0, 0x00, 0x0
+ 0xE5, 0x6E, 0x01, 0xE0, 0x00, 0x0, 0x00, 0x0
};
BasePacket reply1 = new BasePacket(reply1Data);
@@ -177,7 +175,9 @@ namespace FFXIVClassic_Lobby_Server
//Unknown
case 0x0002:
- client.queuePacket(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "-------- Login Message --------\nWelcome to the 1.0 Dev Server"), true, false);
+ subpacket.debugPrintSubPacket();
+ client.queuePacket(_0x2Packet.buildPacket(player.actorID), true, false);
+
Server.GetWorldManager().DoLogin(player.getActor());
@@ -197,8 +197,15 @@ namespace FFXIVClassic_Lobby_Server
player.getActor().broadcastPacket(SendMessagePacket.buildPacket(player.actorID, player.actorID, chatMessage.logType, player.getActor().customDisplayName, chatMessage.message), false);
break;
- //Unknown
+ //Langauge Code
+ case 0x0006:
+ LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data);
+ player.languageCode = langCode.languageCode;
+ break;
+ //Unknown - Happens a lot at login, then once every time player zones
case 0x0007:
+ //subpacket.debugPrintSubPacket();
+ _0x07Packet unknown07 = new _0x07Packet(subpacket.data);
break;
//Update Position
case 0x00CA:
@@ -207,6 +214,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 +256,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 +275,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();
@@ -268,6 +289,10 @@ namespace FFXIVClassic_Lobby_Server
if (updateOwnerActor == null)
{
updateOwnerActor = Server.GetWorldManager().GetActorInWorld(player.getActor().eventCurrentOwner);
+
+ if (player.getActor().currentDirector != null && player.getActor().eventCurrentOwner == player.getActor().currentDirector.actorId)
+ updateOwnerActor = player.getActor().currentDirector;
+
if (updateOwnerActor == null)
break;
}
diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs
index edcee854..c87f47a1 100644
--- a/FFXIVClassic Map Server/Server.cs
+++ b/FFXIVClassic Map Server/Server.cs
@@ -658,10 +658,10 @@ namespace FFXIVClassic_Lobby_Server
}
}
else if (split[0].Equals("resetzone"))
- {
- Log.info(String.Format("Got request to reset zone: {0}", client.getActor().zoneId));
+ {
if (client != null)
{
+ Log.info(String.Format("Got request to reset zone: {0}", client.getActor().zoneId));
client.getActor().zone.clear();
client.getActor().zone.addActorToZone(client.getActor());
client.getActor().sendInstanceUpdate();
diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs
index d161efcf..cbac035a 100644
--- a/FFXIVClassic Map Server/WorldManager.cs
+++ b/FFXIVClassic Map Server/WorldManager.cs
@@ -457,12 +457,8 @@ namespace FFXIVClassic_Map_Server
player.zone = zone;
zone.addActorToZone(player);
- //Send packets
- player.playerSession.queuePacket(DeleteAllActorsPacket.buildPacket(player.actorId), true, false);
- player.playerSession.queuePacket(_0x2Packet.buildPacket(player.actorId), true, false);
+ //Send packets
player.sendZoneInPackets(this, 0x1);
- player.playerSession.clearInstance();
- player.sendInstanceUpdate();
LuaEngine.onLogin(player);
LuaEngine.onZoneIn(player);
diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs
index e66c34df..eab0e1fa 100644
--- a/FFXIVClassic Map Server/actors/Actor.cs
+++ b/FFXIVClassic Map Server/actors/Actor.cs
@@ -67,8 +67,8 @@ namespace FFXIVClassic_Map_Server.Actors
}
public SubPacket createNamePacket(uint playerActorId)
- {
- return SetActorNamePacket.buildPacket(actorId, playerActorId, displayNameId, displayNameId == 0xFFFFFFFF ? customDisplayName : "");
+ {
+ return SetActorNamePacket.buildPacket(actorId, playerActorId, displayNameId, displayNameId == 0xFFFFFFFF | displayNameId == 0x0 ? customDisplayName : "");
}
public SubPacket createSpeedPacket(uint playerActorId)
@@ -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;
}
@@ -180,37 +178,37 @@ namespace FFXIVClassic_Map_Server.Actors
if (eventConditions.talkEventConditions != null)
{
foreach (EventList.TalkEventCondition condition in eventConditions.talkEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 1, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 1, condition.conditionName));
}
if (eventConditions.noticeEventConditions != null)
{
foreach (EventList.NoticeEventCondition condition in eventConditions.noticeEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 1, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 1, condition.conditionName));
}
if (eventConditions.emoteEventConditions != null)
{
foreach (EventList.EmoteEventCondition condition in eventConditions.emoteEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 3, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 3, condition.conditionName));
}
if (eventConditions.pushWithCircleEventConditions != null)
{
foreach (EventList.PushCircleEventCondition condition in eventConditions.pushWithCircleEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 2, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 2, condition.conditionName));
}
if (eventConditions.pushWithFanEventConditions != null)
{
foreach (EventList.PushFanEventCondition condition in eventConditions.pushWithFanEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 2, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 2, condition.conditionName));
}
if (eventConditions.pushWithBoxEventConditions != null)
{
foreach (EventList.PushBoxEventCondition condition in eventConditions.pushWithBoxEventConditions)
- subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, 1, 2, condition.conditionName));
+ subpackets.Add(SetEventStatus.buildPacket(playerActorId, actorId, true, 2, condition.conditionName));
}
return BasePacket.createPacket(subpackets, true, false);
@@ -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/EventList.cs b/FFXIVClassic Map Server/actors/EventList.cs
index b1559522..7b7630c1 100644
--- a/FFXIVClassic Map Server/actors/EventList.cs
+++ b/FFXIVClassic Map Server/actors/EventList.cs
@@ -27,6 +27,13 @@ namespace FFXIVClassic_Map_Server.actors
public byte unknown1;
public byte unknown2;
public string conditionName;
+
+ public NoticeEventCondition(string name, byte unk1, byte unk2)
+ {
+ conditionName = name;
+ unknown1 = unk1;
+ unknown2 = unk2;
+ }
}
public class EmoteEventCondition
diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs
index 15102ac5..f43ff170 100644
--- a/FFXIVClassic Map Server/actors/area/Area.cs
+++ b/FFXIVClassic Map Server/actors/area/Area.cs
@@ -88,7 +88,6 @@ namespace FFXIVClassic_Map_Server.Actors
subpackets.Add(createStatePacket(playerActorId));
subpackets.Add(createIsZoneingPacket(playerActorId));
subpackets.Add(createScriptBindPacket(playerActorId));
- subpackets[6].debugPrintSubPacket();
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 7617882c..6cd22cfc 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -3,11 +3,13 @@ using FFXIVClassic_Lobby_Server.common;
using FFXIVClassic_Lobby_Server.packets;
using FFXIVClassic_Map_Server.actors.area;
using FFXIVClassic_Map_Server.actors.chara.player;
+using FFXIVClassic_Map_Server.actors.director;
using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.dataobjects.chara;
using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.packets.send;
using FFXIVClassic_Map_Server.packets.send.actor;
+using FFXIVClassic_Map_Server.packets.send.actor.events;
using FFXIVClassic_Map_Server.packets.send.actor.inventory;
using FFXIVClassic_Map_Server.packets.send.Actor.inventory;
using FFXIVClassic_Map_Server.packets.send.events;
@@ -89,6 +91,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();
@@ -122,6 +125,8 @@ namespace FFXIVClassic_Map_Server.Actors
public Quest[] questScenario = new Quest[16];
public Quest[] questGuildleve = new Quest[8];
+ public Director currentDirector;// = new OpeningDirector(0x46080012);
+
public PlayerWork playerWork = new PlayerWork();
public ConnectedPlayer playerSession;
@@ -250,7 +255,10 @@ namespace FFXIVClassic_Map_Server.Actors
List lParams;
if (isMyPlayer(playerActorId))
{
- lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, true, 0, false, timers, true);
+ if (currentDirector != null)
+ lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, true, currentDirector, 0, false, timers, true);
+ else
+ 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);
@@ -476,12 +484,13 @@ 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(SetMusicPacket.buildPacket(actorId, zone.bgmDay, 0x01));
queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR));
- queuePacket(getSpawnPackets(actorId, spawnType));
+ queuePacket(getSpawnPackets(actorId, spawnType));
+ //getSpawnPackets(actorId, spawnType).debugPrintPacket();
#region grouptest
//Retainers
@@ -518,19 +527,43 @@ namespace FFXIVClassic_Map_Server.Actors
BasePacket areaMasterSpawn = zone.getSpawnPackets(actorId);
BasePacket debugSpawn = world.GetDebugActor().getSpawnPackets(actorId);
BasePacket worldMasterSpawn = world.GetActor().getSpawnPackets(actorId);
+ BasePacket directorSpawn = null;
+
+ if (currentDirector != null)
+ directorSpawn = currentDirector.getSpawnPackets(actorId);
+
playerSession.queuePacket(areaMasterSpawn);
playerSession.queuePacket(debugSpawn);
+ if (directorSpawn != null)
+ {
+ directorSpawn.debugPrintPacket();
+ currentDirector.getInitPackets(actorId).debugPrintPacket();
+ queuePacket(directorSpawn);
+ queuePacket(currentDirector.getInitPackets(actorId));
+ //queuePacket(currentDirector.getSetEventStatusPackets(actorId));
+ }
playerSession.queuePacket(worldMasterSpawn);
+ if (zone.isInn)
+ {
+ SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket();
+ for (int i = 64; i < 1200; i++)
+ cutsceneBookPacket.cutsceneFlags[i] = true;
+
+ SubPacket packet = cutsceneBookPacket.buildPacket(actorId, "Test PathCompanion", 11, 1, 1);
+
+ packet.debugPrintSubPacket();
+ queuePacket(packet);
+ }
+
#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
reply10.replaceActorID(actorId);
reply11.replaceActorID(actorId);
- playerSession.queuePacket(reply10);
- playerSession.queuePacket(reply11);
+ //playerSession.queuePacket(reply10);
+ // playerSession.queuePacket(reply11);
#endregion
-
}
private void sendRemoveInventoryPackets(List slots)
@@ -555,32 +588,6 @@ namespace FFXIVClassic_Map_Server.Actors
}
- /*
- private void sendEquipmentPackets(List indexes)
- {
- int currentIndex = 0;
-
- InventorySetBeginPacket.buildPacket(actorId, MAXSIZE_INVENTORY_EQUIPMENT, InventorySetBeginPacket.CODE_EQUIPMENT);
-
- while (true)
- {
- if (indexes.Count - currentIndex >= 64)
- queuePacket(EquipmentListX64Packet.buildPacket(actorId, indexes, ref currentIndex));
- else if (indexes.Count - currentIndex >= 32)
- queuePacket(EquipmentListX32Packet.buildPacket(actorId, indexes, ref currentIndex));
- else if (indexes.Count - currentIndex >= 16)
- queuePacket(EquipmentListX16Packet.buildPacket(actorId, indexes, ref currentIndex));
- else if (indexes.Count - currentIndex >= 8)
- queuePacket(EquipmentListX08Packet.buildPacket(actorId, indexes, ref currentIndex));
- else if (indexes.Count - currentIndex == 1)
- queuePacket(EquipmentListX01Packet.buildPacket(actorId, indexes[currentIndex]));
- else
- break;
- }
-
- InventorySetEndPacket.buildPacket(actorId);
- }
- */
public bool isMyPlayer(uint otherActorId)
{
return actorId == otherActorId;
@@ -945,11 +952,63 @@ namespace FFXIVClassic_Map_Server.Actors
return null;
}
+ public void setZoneChanging(bool flag)
+ {
+ isZoneChanging = flag;
+ }
+
+ public bool isInZoneChange()
+ {
+ return isZoneChanging;
+ }
+
public Equipment getEquipment()
{
return equipment;
}
+ public Quest getQuest(uint id)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
+ return questScenario[i];
+ }
+
+ return null;
+ }
+
+ public bool hasQuest(uint id)
+ {
+ for (int i = 0; i < questScenario.Length; i++)
+ {
+ if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id))
+ return true;
+ }
+
+ return false;
+ }
+
+ public void setDirector(string directorType)
+ {
+ if (directorType.Equals("openingDirector"))
+ {
+ currentDirector = new OpeningDirector(0x46080012);
+ }
+
+ 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()
+ {
+ return currentDirector;
+ }
+
public void examinePlayer(Actor examinee)
{
Player toBeExamined;
@@ -971,6 +1030,22 @@ namespace FFXIVClassic_Map_Server.Actors
queuePacket(spacket);
}
+ 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();
+ queuePacket(spacket);
+ }
+
+ public void setEventStatus(Actor actor, string conditionName, bool enabled, byte unknown)
+ {
+ queuePacket(SetEventStatus.buildPacket(actorId, actor.actorId, enabled, unknown, conditionName));
+ }
+
public void runEventFunction(string functionName, params object[] parameters)
{
List lParams = LuaUtils.createLuaParamList(parameters);
@@ -982,6 +1057,7 @@ namespace FFXIVClassic_Map_Server.Actors
public void endEvent()
{
SubPacket p = EndEventPacket.buildPacket(actorId, eventCurrentOwner, eventCurrentStarter);
+ p.debugPrintSubPacket();
queuePacket(p);
eventCurrentOwner = 0;
diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs
new file mode 100644
index 00000000..bc63ec27
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/director/Director.cs
@@ -0,0 +1,41 @@
+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;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.actors.director
+{
+ class Director : Actor
+ {
+ public Director(uint id) : base(id)
+ {
+
+ }
+
+ 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/actors/director/OpeningDirector.cs b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs
new file mode 100644
index 00000000..6c45066b
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs
@@ -0,0 +1,39 @@
+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;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.actors.director
+{
+ class OpeningDirector : Director
+ {
+ public OpeningDirector(uint id) : base(id)
+ {
+ this.displayNameId = 0;
+ this.customDisplayName = "openingDire";
+
+ this.actorName = "openingDire";
+ this.className = "OpeningDirector";
+
+ this.eventConditions = new EventList();
+
+ List noticeEventList = new List();
+
+ noticeEventList.Add(new EventList.NoticeEventCondition("noticeEvent", 0xE, 0x0));
+ noticeEventList.Add(new EventList.NoticeEventCondition("noticeRequest", 0x0, 0x1));
+
+ this.eventConditions.noticeEventConditions = noticeEventList;
+ }
+
+ public override SubPacket createScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ lParams = LuaUtils.createLuaParamList("/Director/OpeningDirector", false, false, false, false, 0x13881);
+ return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs
index 060a3c24..658776de 100644
--- a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs
+++ b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs
@@ -1,4 +1,5 @@
using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.actors.director;
using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.packets.send.actor;
@@ -10,12 +11,12 @@ using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.Actors
{
- class WeatherDirector : Actor
+ class WeatherDirector : Director
{
private uint weatherId;
public WeatherDirector(uint weatherId)
- : base(0x5FF80002)
+ : base(0x5FF80003)
{
this.weatherId = weatherId;
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..a9d18ee5 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());
@@ -87,7 +93,9 @@ namespace FFXIVClassic_Map_Server.lua
objects.Add(player);
objects.Add(target);
objects.Add(eventStart.triggerName);
- objects.AddRange(LuaUtils.createLuaParamObjectList(eventStart.luaParams));
+
+ if (eventStart.luaParams != null)
+ objects.AddRange(LuaUtils.createLuaParamObjectList(eventStart.luaParams));
//Run Script
DynValue result = script.Call(script.Globals["onEventStarted"], objects.ToArray());
@@ -104,12 +112,14 @@ namespace FFXIVClassic_Map_Server.lua
public static void doActorOnEventUpdated(Player player, Actor target, EventUpdatePacket eventUpdate)
{
- string luaPath;
+ string luaPath;
if (target is Command)
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());
+ luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName());
if (File.Exists(luaPath))
{
diff --git a/FFXIVClassic Map Server/packets/receive/LangaugeCodePacket.cs b/FFXIVClassic Map Server/packets/receive/LangaugeCodePacket.cs
new file mode 100644
index 00000000..021c2ca3
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/receive/LangaugeCodePacket.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.packets.receive
+{
+ class LangaugeCodePacket
+ {
+ public bool invalidPacket = false;
+ public uint languageCode;
+
+ public LangaugeCodePacket(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try{
+ binReader.ReadUInt32();
+ languageCode = binReader.ReadUInt32();
+ }
+ catch (Exception){
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/receive/_0x02ReceivePacket.cs b/FFXIVClassic Map Server/packets/receive/_0x02ReceivePacket.cs
new file mode 100644
index 00000000..b1c7cdc7
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/receive/_0x02ReceivePacket.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.packets.receive
+{
+ class _0x02ReceivePacket
+ {
+ bool invalidPacket = false;
+ uint unknown;
+
+ public _0x02ReceivePacket(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try
+ {
+ binReader.BaseStream.Seek(0x14, SeekOrigin.Begin);
+ unknown = binReader.ReadUInt32();
+ }
+ catch (Exception)
+ {
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/receive/_0x07Packet.cs b/FFXIVClassic Map Server/packets/receive/_0x07Packet.cs
new file mode 100644
index 00000000..f4091f25
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/receive/_0x07Packet.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.packets.receive
+{
+ class _0x07Packet
+ {
+ public bool invalidPacket = false;
+ public uint timestamp;
+ public uint unknown;
+
+ public _0x07Packet(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try{
+ timestamp = binReader.ReadUInt32();
+ unknown = binReader.ReadUInt32();
+ }
+ catch (Exception){
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs
index 4b0a0d29..f79e5f70 100644
--- a/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs
+++ b/FFXIVClassic Map Server/packets/send/Actor/ActorInstantiatePacket.cs
@@ -22,8 +22,8 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
- int value1 = 0x02; //Instance ID?
- int value2 = 0x2bc0;
+ int value1 = 0x00; //Instance ID?
+ int value2 = 0x3040;
binWriter.Write((Int16)value1);
binWriter.Write((Int16)value2);
binWriter.Write(Encoding.ASCII.GetBytes(objectName), 0, Encoding.ASCII.GetByteCount(objectName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(objectName));
diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs
index a26a4dd3..c41005ef 100644
--- a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs
+++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs
@@ -23,7 +23,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
{
binWriter.Write((UInt32)displayNameID);
- if (displayNameID == 0 || displayNameID == 0xFFFFFFFF)
+ if (customName != null && (displayNameID == 0 || displayNameID == 0xFFFFFFFF))
{
binWriter.Write(Encoding.ASCII.GetBytes(customName), 0, Encoding.ASCII.GetByteCount(customName) >= 0x20 ? 0x19 : Encoding.ASCII.GetByteCount(customName));
}
diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs
index 1c566fca..0f854ea8 100644
--- a/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs
+++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetEventStatus.cs
@@ -13,7 +13,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.events
public const ushort OPCODE = 0x0136;
public const uint PACKET_SIZE = 0x48;
- public static SubPacket buildPacket(uint playerActorID, uint sourceActorID, uint unknown1, byte unknown2, string conditionName)
+ public static SubPacket buildPacket(uint playerActorID, uint sourceActorID, bool enabled, byte unknown2, string conditionName)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@@ -21,7 +21,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.events
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
- binWriter.Write((UInt32)unknown1);
+ binWriter.Write((UInt32)(enabled ? 1 : 0));
binWriter.Write((Byte)unknown2);
binWriter.Write(Encoding.ASCII.GetBytes(conditionName), 0, Encoding.ASCII.GetByteCount(conditionName) >= 0x24 ? 0x24 : Encoding.ASCII.GetByteCount(conditionName));
}
diff --git a/FFXIVClassic Map Server/packets/send/_0x02Packet.cs b/FFXIVClassic Map Server/packets/send/_0x02Packet.cs
new file mode 100644
index 00000000..64621176
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/send/_0x02Packet.cs
@@ -0,0 +1,32 @@
+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
+{
+ class _0x02Packet
+ {
+ public const ushort OPCODE = 0x0002;
+ public const uint PACKET_SIZE = 0x30;
+
+ public static SubPacket buildPacket(uint playerActorId, int val)
+ {
+ byte[] data = new byte[PACKET_SIZE - 0x20];
+
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryWriter binWriter = new BinaryWriter(mem))
+ {
+ binWriter.Seek(8, SeekOrigin.Begin);
+ binWriter.Write((UInt32)playerActorId);
+ }
+ }
+
+ return new SubPacket(OPCODE, playerActorId, playerActorId, data);
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs
new file mode 100644
index 00000000..3fbdc1af
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs
@@ -0,0 +1,44 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.lua;
+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.events
+{
+ class KickEventPacket
+ {
+ public const ushort OPCODE = 0x012F;
+ public const uint PACKET_SIZE = 0x90;
+
+ public static SubPacket buildPacket(uint playerActorId, uint targetActorId, string conditionName, List luaParams)
+ {
+ byte[] data = new byte[PACKET_SIZE - 0x20];
+
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryWriter binWriter = new BinaryWriter(mem))
+ {
+ binWriter.Write((UInt32)playerActorId);
+ binWriter.Write((UInt32)targetActorId);
+ binWriter.Write((Byte)0x5);
+ binWriter.Write((Byte)0x87);
+ binWriter.Write((Byte)0xDC);
+ binWriter.Write((Byte)0x75);
+ binWriter.Write((UInt32)0x30400000);
+ 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);
+ }
+ }
+
+ return new SubPacket(OPCODE, playerActorId, playerActorId, data);
+ }
+ }
+
+}
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));
diff --git a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs
index 7e93e1da..26afad7c 100644
--- a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs
+++ b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs
@@ -64,7 +64,7 @@ namespace FFXIVClassic_Map_Server.packets.send.player
public bool[] cutsceneFlags = new bool[2432];
- public SubPacket buildPacket(uint playerActorID)
+ public SubPacket buildPacket(uint playerActorID, string sNpcName, short sNpcActorIdOffset, byte sNpcSkin, byte sNpcPersonality)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@@ -77,6 +77,17 @@ namespace FFXIVClassic_Map_Server.packets.send.player
binWriter.Write(binStream);
else
Log.error("Failed making SetCutsceneBook packet. Bin Stream was too big!");
+
+ //Temp Path Companion SNPC Stuff
+ binWriter.Seek(0x01 ,SeekOrigin.Begin);
+ binWriter.Write((Int16)2);
+ binWriter.Write((Byte)0);
+ binWriter.Write((Int16)sNpcActorIdOffset);
+ binWriter.Write((Byte)sNpcSkin);
+ binWriter.Write((Byte)sNpcPersonality);
+
+ binWriter.Seek(0x109, SeekOrigin.Begin);
+ binWriter.Write(Encoding.ASCII.GetBytes(sNpcName), 0, Encoding.ASCII.GetByteCount(sNpcName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(sNpcName));
}
}