From a30311d12ae73ee54ff418d949308bea5398d46b Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Mon, 28 Mar 2016 11:31:21 -0400 Subject: [PATCH] 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));