diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 166a7102..e88c792d 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -67,8 +67,11 @@
+
+
+
@@ -208,16 +211,13 @@
-
+
-
-
-
-
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index 67bfc4b9..bcf92323 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -34,6 +34,8 @@ using FFXIVClassic_Map_Server.dataobjects.actors;
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
using FFXIVClassic_Map_Server.actors;
using System.Net;
+using FFXIVClassic_Map_Server.actors.debug;
+using FFXIVClassic_Map_Server.actors.world;
namespace FFXIVClassic_Lobby_Server
{
@@ -44,7 +46,10 @@ namespace FFXIVClassic_Lobby_Server
List mConnections;
StaticActors mStaticActors = new StaticActors();
- Zone inn = new Zone();
+
+ DebugProg debug = new DebugProg();
+ WorldMaster worldMaster = new WorldMaster();
+ Zone inn = new Zone(0xF4, "prv0Inn01", 0xD1, false, false, false, false);
public PacketProcessor(Dictionary playerList, List connectionList)
{
@@ -182,16 +187,14 @@ namespace FFXIVClassic_Lobby_Server
break;
//Unknown
case 0x0002:
- BasePacket reply8 = new BasePacket("./packets/login/login8_data.bin"); //Debug, World Master, Director created
- BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); //Area Master, Bed, Book created
+ BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); //Bed, Book created
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
#region replaceid
//currancy.replaceActorID(player.actorID);
//keyitems.replaceActorID(player.actorID);
-
- reply8.replaceActorID(player.actorID);
+
reply9.replaceActorID(player.actorID);
reply10.replaceActorID(player.actorID);
reply11.replaceActorID(player.actorID);
@@ -290,12 +293,20 @@ namespace FFXIVClassic_Lobby_Server
#endregion
BasePacket tpacket = player.getActor().getInitPackets(player.actorID);
- tpacket.debugPrintPacket();
+ //tpacket.debugPrintPacket();
client.queuePacket(tpacket);
inn.addActorToZone(player.getActor());
- client.queuePacket(reply8);
+ BasePacket innSpawn = inn.getSpawnPackets(player.actorID);
+ BasePacket debugSpawn = debug.getSpawnPackets(player.actorID);
+ BasePacket worldMasterSpawn = worldMaster.getSpawnPackets(player.actorID);
+ innSpawn.debugPrintPacket();
+
+ client.queuePacket(innSpawn);
+ client.queuePacket(debugSpawn);
+ client.queuePacket(worldMasterSpawn);
+
client.queuePacket(reply9);
client.queuePacket(reply10);
client.queuePacket(reply11);
diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs
index d0dc2d5f..5084622f 100644
--- a/FFXIVClassic Map Server/actors/Actor.cs
+++ b/FFXIVClassic Map Server/actors/Actor.cs
@@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
public ushort currentMainState = SetActorStatePacket.MAIN_STATE_PASSIVE;
public ushort currentSubState = SetActorStatePacket.SUB_STATE_NONE;
- public float positionX = SetActorPositionPacket.INNPOS_X, positionY = SetActorPositionPacket.INNPOS_Y, positionZ = SetActorPositionPacket.INNPOS_Z, rotation = SetActorPositionPacket.INNPOS_ROT;
+ public float positionX, positionY, positionZ, rotation;
public float oldPositionX, oldPositionY, oldPositionZ, oldRotation;
public ushort moveState, oldMoveState;
diff --git a/FFXIVClassic Map Server/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs
similarity index 73%
rename from FFXIVClassic Map Server/Zone.cs
rename to FFXIVClassic Map Server/actors/area/Zone.cs
index b305e400..94a82191 100644
--- a/FFXIVClassic Map Server/Zone.cs
+++ b/FFXIVClassic Map Server/actors/area/Zone.cs
@@ -1,5 +1,8 @@
using FFXIVClassic_Lobby_Server.common;
+using FFXIVClassic_Lobby_Server.packets;
using FFXIVClassic_Map_Server.dataobjects;
+using FFXIVClassic_Map_Server.lua;
+using FFXIVClassic_Map_Server.packets.send.actor;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -8,19 +11,36 @@ using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server
{
- class Zone
+ class Zone : Actor
{
- public uint mapId;
+ public string zoneName;
+ public ushort regionId;
+ public bool canStealth, isInn, canRideChocobo, isInstanceRaid;
public ushort weatherNormal, weatherCommon, weatherRare;
public ushort bgmDay, bgmNight, bgmBattle;
+
public int boundingGridSize = 50;
public int minX = -100, minY = -100, maxX = 100, maxY = 100;
private int numXBlocks, numYBlocks;
private int halfWidth, halfHeight;
private List[,] actorBlock;
- public Zone()
+ public Zone(uint id, string zoneName, ushort regionId, bool canStealth, bool isInn, bool canRideChocobo, bool isInstanceRaid) : base(id)
{
+
+ this.zoneName = zoneName;
+ this.regionId = regionId;
+ this.canStealth = canStealth;
+ this.isInn = isInn;
+ this.canRideChocobo = canRideChocobo;
+ this.isInstanceRaid = isInstanceRaid;
+
+ this.displayNameId = 0;
+ this.customDisplayName = "_areaMaster";
+ this.actorName = String.Format("_areaMaster@{0:X5}",id<<8);
+
+ this.className = "ZoneMasterPrvI0";
+
numXBlocks = (maxX - minX) / boundingGridSize;
numYBlocks = (maxY - minY) / boundingGridSize;
actorBlock = new List[numXBlocks, numYBlocks];
@@ -37,6 +57,26 @@ namespace FFXIVClassic_Map_Server
}
+ public override SubPacket createScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ lParams = LuaUtils.createLuaParamList("/Area/Zone/ZoneMasterPrvI0", false, true, zoneName, "", 0xFFFFFFFF, false, false, canStealth, isInn, false, false, false, false, false, false);
+ return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+
+ public override BasePacket getSpawnPackets(uint playerActorId)
+ {
+ List subpackets = new List();
+ subpackets.Add(createAddActorPacket(playerActorId));
+ subpackets.Add(createSpeedPacket(playerActorId));
+ subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
+ subpackets.Add(createNamePacket(playerActorId));
+ subpackets.Add(createStatePacket(playerActorId));
+ subpackets.Add(createIsZoneingPacket(playerActorId));
+ subpackets.Add(createScriptBindPacket(playerActorId));
+ return BasePacket.createPacket(subpackets, true, false);
+ }
+
#region Actor Management
public void addActorToZone(Actor actor)
diff --git a/FFXIVClassic Map Server/actors/debug/Debug.cs b/FFXIVClassic Map Server/actors/debug/Debug.cs
new file mode 100644
index 00000000..13192ff4
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/debug/Debug.cs
@@ -0,0 +1,47 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.dataobjects;
+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.debug
+{
+ class DebugProg : Actor
+ {
+
+ public DebugProg()
+ : base(0x5FF80002)
+ {
+ this.displayNameId = 0;
+ this.customDisplayName = "debug";
+
+ this.actorName = "debug";
+ this.className = "Debug";
+ }
+
+ public override SubPacket createScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ lParams = LuaUtils.createLuaParamList("/System/Debug.prog", false, false, false, false, true, 0xC51F, true, true);
+ return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+
+ public override BasePacket getSpawnPackets(uint playerActorId)
+ {
+ List subpackets = new List();
+ subpackets.Add(createAddActorPacket(playerActorId));
+ subpackets.Add(createSpeedPacket(playerActorId));
+ subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
+ subpackets.Add(createNamePacket(playerActorId));
+ subpackets.Add(createStatePacket(playerActorId));
+ subpackets.Add(createIsZoneingPacket(playerActorId));
+ subpackets.Add(createScriptBindPacket(playerActorId));
+ return BasePacket.createPacket(subpackets, true, false);
+ }
+
+ }
+}
diff --git a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs
new file mode 100644
index 00000000..7da80180
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs
@@ -0,0 +1,49 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.dataobjects;
+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 WeatherDirector : Actor
+ {
+ private uint weatherId;
+
+ public WeatherDirector(uint weatherId, Zone zone)
+ : base(0x5FF80002)
+ {
+ this.weatherId = weatherId;
+
+ this.displayNameId = 0;
+ this.customDisplayName = String.Format("weatherDire_{0}", zone.zoneName, zone.currentZoneId);
+
+ this.actorName = String.Format("weatherDire_{0}@{0:04x}", zone.zoneName, zone.currentZoneId);
+ this.className = "Debug";
+ }
+
+ public override SubPacket createScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ lParams = LuaUtils.createLuaParamList("/Director/Weather/WeatherDirector", false, false, false, false, weatherId);
+ return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+
+ public override BasePacket getSpawnPackets(uint playerActorId)
+ {
+ List subpackets = new List();
+ subpackets.Add(createAddActorPacket(playerActorId));
+ subpackets.Add(createSpeedPacket(playerActorId));
+ subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
+ subpackets.Add(createNamePacket(playerActorId));
+ subpackets.Add(createStatePacket(playerActorId));
+ subpackets.Add(createIsZoneingPacket(playerActorId));
+ subpackets.Add(createScriptBindPacket(playerActorId));
+ return BasePacket.createPacket(subpackets, true, false);
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/actors/world/WorldMaster.cs b/FFXIVClassic Map Server/actors/world/WorldMaster.cs
new file mode 100644
index 00000000..a5df2016
--- /dev/null
+++ b/FFXIVClassic Map Server/actors/world/WorldMaster.cs
@@ -0,0 +1,44 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.dataobjects;
+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.world
+{
+ class WorldMaster : Actor
+ {
+ public WorldMaster() : base(0x5FF80001)
+ {
+ this.displayNameId = 0;
+ this.customDisplayName = "worldMaster";
+
+ this.actorName = "worldMaster";
+ this.className = "WorldMaster";
+ }
+
+ public override SubPacket createScriptBindPacket(uint playerActorId)
+ {
+ List lParams;
+ lParams = LuaUtils.createLuaParamList("/World/WorldMaster_event", false, false, false, false, false, null);
+ return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
+ }
+
+ public override BasePacket getSpawnPackets(uint playerActorId)
+ {
+ List subpackets = new List();
+ subpackets.Add(createAddActorPacket(playerActorId));
+ subpackets.Add(createSpeedPacket(playerActorId));
+ subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
+ subpackets.Add(createNamePacket(playerActorId));
+ subpackets.Add(createStatePacket(playerActorId));
+ subpackets.Add(createIsZoneingPacket(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 4281726b..c8c8a41c 100644
--- a/FFXIVClassic Map Server/lua/LuaUtils.cs
+++ b/FFXIVClassic Map Server/lua/LuaUtils.cs
@@ -195,7 +195,7 @@ namespace FFXIVClassic_Map_Server
foreach (object o in list)
{
- if (o.GetType().IsArray)
+ if (o != null && o.GetType().IsArray)
{
Array arrayO = (Array)o;
foreach (object o2 in arrayO)
diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorNamePacket.cs
index b455d3a1..a26a4dd3 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 == 0xFFFFFFFF)
+ if (displayNameID == 0 || displayNameID == 0xFFFFFFFF)
{
binWriter.Write(Encoding.ASCII.GetBytes(customName), 0, Encoding.ASCII.GetByteCount(customName) >= 0x20 ? 0x19 : Encoding.ASCII.GetByteCount(customName));
}