From 9c28e966f796973be014bcc9809aa2e67f491d14 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Wed, 23 Mar 2016 01:27:12 -0400 Subject: [PATCH 1/9] Added director code to player class and actor namespace. --- .../FFXIVClassic Map Server.csproj | 3 + FFXIVClassic Map Server/actors/EventList.cs | 7 +++ .../actors/chara/player/Player.cs | 57 +++++++++++++++++++ .../actors/director/Director.cs | 17 ++++++ .../actors/director/OpeningDirector.cs | 39 +++++++++++++ .../actors/director/WeatherDirector.cs | 5 +- .../packets/send/events/KickEventPacket.cs | 39 +++++++++++++ 7 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 FFXIVClassic Map Server/actors/director/Director.cs create mode 100644 FFXIVClassic Map Server/actors/director/OpeningDirector.cs create mode 100644 FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index eee44060..7e0ff280 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -70,6 +70,8 @@ + + @@ -172,6 +174,7 @@ + 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/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 7617882c..8385f922 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -3,6 +3,7 @@ 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; @@ -122,6 +123,8 @@ namespace FFXIVClassic_Map_Server.Actors public Quest[] questScenario = new Quest[16]; public Quest[] questGuildleve = new Quest[8]; + public Director currentDirector; + public PlayerWork playerWork = new PlayerWork(); public ConnectedPlayer playerSession; @@ -518,10 +521,18 @@ 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); playerSession.queuePacket(worldMasterSpawn); + // if (directorSpawn != null) + // 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 @@ -950,6 +961,44 @@ namespace FFXIVClassic_Map_Server.Actors 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(0x5FF80004); + } + + queuePacket(RemoveActorPacket.buildPacket(actorId, 0x5FF80004)); + queuePacket(currentDirector.getSpawnPackets(actorId)); + } + + public Director getDirector() + { + return currentDirector; + } + public void examinePlayer(Actor examinee) { Player toBeExamined; @@ -971,6 +1020,14 @@ namespace FFXIVClassic_Map_Server.Actors queuePacket(spacket); } + public void kickEvent(Actor actor, string conditionName, params object[] parameters) + { + List lParams = LuaUtils.createLuaParamList(parameters); + SubPacket spacket = KickEventPacket.buildPacket(actorId, actor.actorId, conditionName, lParams); + spacket.debugPrintSubPacket(); + queuePacket(spacket); + } + public void runEventFunction(string functionName, params object[] parameters) { List lParams = LuaUtils.createLuaParamList(parameters); diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs new file mode 100644 index 00000000..baf9080c --- /dev/null +++ b/FFXIVClassic Map Server/actors/director/Director.cs @@ -0,0 +1,17 @@ +using FFXIVClassic_Map_Server.Actors; +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) + { + + } + } +} diff --git a/FFXIVClassic Map Server/actors/director/OpeningDirector.cs b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs new file mode 100644 index 00000000..c1fa0592 --- /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_ocn0Btl02_0h"; + + this.actorName = "openingDire_ocn0Btl02_0h@0C100"; + 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/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs new file mode 100644 index 00000000..677a6253 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -0,0 +1,39 @@ +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((UInt32)0); + binWriter.Write((UInt32)0); + binWriter.Write(Encoding.ASCII.GetBytes(conditionName), 0, Encoding.ASCII.GetByteCount(conditionName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(conditionName)); + + LuaUtils.writeLuaParams(binWriter, luaParams); + } + } + + return new SubPacket(OPCODE, playerActorId, playerActorId, data); + } + } + +} From f8ab0cd86de6e916d6a8c4243af38dea101f728a Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 11:30:02 -0400 Subject: [PATCH 2/9] Added langauge code packet (0x6) and 0x2/0x7 temp packets to clean up the login packets sent by client. --- .../packets/receive/LangaugeCodePacket.cs | 32 ++++++++++++++++++ .../packets/receive/_0x07Packet.cs | 33 +++++++++++++++++++ .../packets/send/_0x02Packet.cs | 32 ++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 FFXIVClassic Map Server/packets/receive/LangaugeCodePacket.cs create mode 100644 FFXIVClassic Map Server/packets/receive/_0x07Packet.cs create mode 100644 FFXIVClassic Map Server/packets/send/_0x02Packet.cs 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/_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/_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); + } + } +} From a30311d12ae73ee54ff418d949308bea5398d46b Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 11:31:21 -0400 Subject: [PATCH 3/9] Added director related code to player and packet processor. Cleaned up some debug messages. Added a flag when a player is "zoning in". --- FFXIVClassic Map Server/Database.cs | 3 ++ .../FFXIVClassic Map Server.csproj | 3 ++ FFXIVClassic Map Server/PacketProcessor.cs | 26 ++++++++++++- FFXIVClassic Map Server/actors/Actor.cs | 4 +- .../actors/chara/player/Player.cs | 39 ++++++++++++++++--- .../actors/director/Director.cs | 26 ++++++++++++- .../dataobjects/ConnectedPlayer.cs | 5 ++- FFXIVClassic Map Server/lua/LuaEngine.cs | 6 +++ .../packets/send/events/KickEventPacket.cs | 9 ++++- .../send/events/RunEventFunctionPacket.cs | 2 +- 10 files changed, 106 insertions(+), 17 deletions(-) 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)); From 4d57aa72a642c7a65478c9aa4ddc7cdcd6536707 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 12:14:10 -0400 Subject: [PATCH 4/9] Cleaned up the 0x02 packet. It fires in response to the 0x2 packet sent by the client it seems. --- .../FFXIVClassic Map Server.csproj | 1 + FFXIVClassic Map Server/PacketProcessor.cs | 3 +- FFXIVClassic Map Server/WorldManager.cs | 4 +-- .../actors/chara/player/Player.cs | 1 - .../packets/receive/_0x02ReceivePacket.cs | 34 +++++++++++++++++++ 5 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/receive/_0x02ReceivePacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 90fcbbe0..27a9891d 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -130,6 +130,7 @@ + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index da8591ec..f14e048c 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -178,7 +178,8 @@ namespace FFXIVClassic_Lobby_Server 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); + client.queuePacket(_0x2Packet.buildPacket(player.actorID), true, false); + Server.GetWorldManager().DoLogin(player.getActor()); diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index d161efcf..1145f418 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -457,9 +457,7 @@ 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(); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index cc8264b0..40fd941b 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -482,7 +482,6 @@ namespace FFXIVClassic_Map_Server.Actors public void sendZoneInPackets(WorldManager world, ushort spawnType) { 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)); 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; + } + } + } + } + } +} From a615f29e63c39a95c7979d7e48408814aed35a0d Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 21:00:33 -0400 Subject: [PATCH 5/9] Added path companion data to the cutscene book packet. Now that packet will fire if zoning into the inn. Removed some debug logs. Removed a duplicate zone packet send call. --- FFXIVClassic Map Server/PacketProcessor.cs | 6 ++---- FFXIVClassic Map Server/WorldManager.cs | 2 -- FFXIVClassic Map Server/actors/area/Area.cs | 1 - .../packets/send/player/SetCutsceneBookPacket.cs | 13 ++++++++++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index f14e048c..9a8ffaf0 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) { @@ -204,9 +202,9 @@ namespace FFXIVClassic_Lobby_Server LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); player.languageCode = langCode.languageCode; break; - //Unknown + //Unknown - Happens a lot at login, then once every time player zones case 0x0007: - subpacket.debugPrintSubPacket(); + //subpacket.debugPrintSubPacket(); _0x07Packet unknown07 = new _0x07Packet(subpacket.data); break; //Update Position diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 1145f418..cbac035a 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -459,8 +459,6 @@ namespace FFXIVClassic_Map_Server //Send packets player.sendZoneInPackets(this, 0x1); - player.playerSession.clearInstance(); - player.sendInstanceUpdate(); LuaEngine.onLogin(player); LuaEngine.onZoneIn(player); 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/packets/send/player/SetCutsceneBookPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs index 7e93e1da..1ff3f3b2 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(0x108, SeekOrigin.Begin); + binWriter.Write(Encoding.ASCII.GetBytes(sNpcName), 0, Encoding.ASCII.GetByteCount(sNpcName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(sNpcName)); } } From b69e18ff3c942c5adf4f239859222e2f3f4316e0 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 21:52:02 -0400 Subject: [PATCH 6/9] Companion name was off by 1. --- .../packets/send/player/SetCutsceneBookPacket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs index 1ff3f3b2..26afad7c 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCutsceneBookPacket.cs @@ -86,7 +86,7 @@ namespace FFXIVClassic_Map_Server.packets.send.player binWriter.Write((Byte)sNpcSkin); binWriter.Write((Byte)sNpcPersonality); - binWriter.Seek(0x108, SeekOrigin.Begin); + binWriter.Seek(0x109, SeekOrigin.Begin); binWriter.Write(Encoding.ASCII.GetBytes(sNpcName), 0, Encoding.ASCII.GetByteCount(sNpcName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(sNpcName)); } } From b33b0b1bc457e0fc4af8782cac47b6b0cf799e79 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 22:00:11 -0400 Subject: [PATCH 7/9] When zoning into a inn, cutscene packet will be sent as well. --- .../actors/chara/player/Player.cs | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 40fd941b..8f137ac6 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -124,7 +124,7 @@ namespace FFXIVClassic_Map_Server.Actors public Quest[] questScenario = new Quest[16]; public Quest[] questGuildleve = new Quest[8]; - public Director currentDirector; + public Director currentDirector = new OpeningDirector(0x46080012); public PlayerWork playerWork = new PlayerWork(); @@ -531,14 +531,25 @@ namespace FFXIVClassic_Map_Server.Actors playerSession.queuePacket(areaMasterSpawn); playerSession.queuePacket(debugSpawn); - playerSession.queuePacket(worldMasterSpawn); - if (directorSpawn != null) { - //directorSpawn.debugPrintPacket(); + directorSpawn.debugPrintPacket(); queuePacket(directorSpawn); } - + 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 @@ -965,9 +976,6 @@ namespace FFXIVClassic_Map_Server.Actors public void setZoneChanging(bool flag) { isZoneChanging = flag; - - if (!isZoneChanging) - LuaEngine.onZoneIn(this); } public bool isInZoneChange() From 597a8005994d7fb8341e6ca832e1ff054bf35079 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Wed, 30 Mar 2016 20:15:21 -0400 Subject: [PATCH 8/9] More work trying to get the opening cutscene to fire right away. --- FFXIVClassic Map Server/Server.cs | 4 ++-- FFXIVClassic Map Server/actors/Actor.cs | 4 ++-- FFXIVClassic Map Server/actors/chara/player/Player.cs | 10 +++++++--- .../actors/director/OpeningDirector.cs | 4 ++-- .../packets/send/Actor/ActorInstantiatePacket.cs | 4 ++-- .../packets/send/Actor/SetActorNamePacket.cs | 2 +- .../packets/send/events/KickEventPacket.cs | 6 +----- 7 files changed, 17 insertions(+), 17 deletions(-) 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/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 4b9fea09..ac5fc8a0 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) diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 8f137ac6..611209ae 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -534,7 +534,10 @@ namespace FFXIVClassic_Map_Server.Actors if (directorSpawn != null) { directorSpawn.debugPrintPacket(); + currentDirector.getInitPackets(actorId).debugPrintPacket(); queuePacket(directorSpawn); + queuePacket(currentDirector.getInitPackets(actorId)); + //queuePacket(currentDirector.getSetEventStatusPackets(actorId)); } playerSession.queuePacket(worldMasterSpawn); @@ -555,10 +558,11 @@ namespace FFXIVClassic_Map_Server.Actors 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 - + + kickEvent(currentDirector, "noticeEvent", "noticeEvent"); } private void sendRemoveInventoryPackets(List slots) diff --git a/FFXIVClassic Map Server/actors/director/OpeningDirector.cs b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs index c1fa0592..6c45066b 100644 --- a/FFXIVClassic Map Server/actors/director/OpeningDirector.cs +++ b/FFXIVClassic Map Server/actors/director/OpeningDirector.cs @@ -14,9 +14,9 @@ namespace FFXIVClassic_Map_Server.actors.director public OpeningDirector(uint id) : base(id) { this.displayNameId = 0; - this.customDisplayName = "openingDire_ocn0Btl02_0h"; + this.customDisplayName = "openingDire"; - this.actorName = "openingDire_ocn0Btl02_0h@0C100"; + this.actorName = "openingDire"; this.className = "OpeningDirector"; this.eventConditions = new EventList(); 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/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs index 741c8e2e..3bbef23b 100644 --- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -25,13 +25,9 @@ namespace FFXIVClassic_Map_Server.packets.send.events binWriter.Write((UInt32)playerActorId); binWriter.Write((UInt32)targetActorId); 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); + binWriter.Seek(0x29, SeekOrigin.Begin); LuaUtils.writeLuaParams(binWriter, luaParams); } From 6c3918ac2f0f08465d3f64b26f953a1f1d0d308a Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Fri, 1 Apr 2016 23:24:14 -0400 Subject: [PATCH 9/9] Got the kick event packet working and implemented the director parameter in the player instantiation. The first argument of the set event status packet is an "isEnabled" flag; switched to bool rather than int. --- FFXIVClassic Map Server/PacketProcessor.cs | 6 ++- FFXIVClassic Map Server/actors/Actor.cs | 12 ++--- .../actors/chara/player/Player.cs | 47 ++++++------------- FFXIVClassic Map Server/lua/LuaEngine.cs | 10 ++-- .../send/Actor/events/SetEventStatus.cs | 4 +- .../packets/send/events/KickEventPacket.cs | 6 ++- 6 files changed, 39 insertions(+), 46 deletions(-) diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 9a8ffaf0..1c27dec5 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -63,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); @@ -289,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/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index ac5fc8a0..eab0e1fa 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -178,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); diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 611209ae..6cd22cfc 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -9,6 +9,7 @@ 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; @@ -124,7 +125,7 @@ namespace FFXIVClassic_Map_Server.Actors public Quest[] questScenario = new Quest[16]; public Quest[] questGuildleve = new Quest[8]; - public Director currentDirector = new OpeningDirector(0x46080012); + public Director currentDirector;// = new OpeningDirector(0x46080012); public PlayerWork playerWork = new PlayerWork(); @@ -254,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); @@ -480,13 +484,12 @@ namespace FFXIVClassic_Map_Server.Actors } public void sendZoneInPackets(WorldManager world, ushort spawnType) - { + { 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 @@ -561,8 +564,6 @@ namespace FFXIVClassic_Map_Server.Actors //playerSession.queuePacket(reply10); // playerSession.queuePacket(reply11); #endregion - - kickEvent(currentDirector, "noticeEvent", "noticeEvent"); } private void sendRemoveInventoryPackets(List slots) @@ -587,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; @@ -1066,6 +1041,11 @@ namespace FFXIVClassic_Map_Server.Actors 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); @@ -1077,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/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 286542da..a9d18ee5 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -93,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()); @@ -110,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/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/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs index 3bbef23b..3fbdc1af 100644 --- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -25,9 +25,13 @@ namespace FFXIVClassic_Map_Server.packets.send.events 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(0x29, SeekOrigin.Begin); + binWriter.Seek(0x30, SeekOrigin.Begin); LuaUtils.writeLuaParams(binWriter, luaParams); }