From e898c045f799eba72514ed8e74e17b62504c23e0 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Tue, 7 Mar 2017 00:09:37 -0500 Subject: [PATCH] Overhaul of the director system and opening quests. Private Areas further implemented as well. --- FFXIVClassic Map Server/Database.cs | 23 +- .../FFXIVClassic Map Server.csproj | 2 +- FFXIVClassic Map Server/PacketProcessor.cs | 568 ++-- FFXIVClassic Map Server/WorldManager.cs | 47 +- FFXIVClassic Map Server/actors/Actor.cs | 4 +- FFXIVClassic Map Server/actors/area/Area.cs | 24 +- .../actors/area/PrivateArea.cs | 19 +- FFXIVClassic Map Server/actors/area/Zone.cs | 5 +- .../actors/chara/npc/Npc.cs | 53 +- .../actors/chara/player/Player.cs | 2426 +++++++++-------- .../actors/director/Director.cs | 43 +- FFXIVClassic Map Server/actors/quest/Quest.cs | 18 +- FFXIVClassic Map Server/lua/LuaEngine.cs | 61 +- ..._0x07Packet.cs => ZoneInCompletePacket.cs} | 8 +- .../packets/send/events/KickEventPacket.cs | 2 +- .../Fighter/FighterAllyOpeningAttacker.lua | 5 + .../Fighter/FighterAllyOpeningHealer.lua | 5 + .../monster/Goobbue/GoobbueLesserStandard.lua | 5 + .../npc/object/aetheryte/AetheryteChild.lua | 40 + .../npc/populace/PopulaceChocoboLender.lua | 8 +- .../npc/populace/PopulaceLinkshellManager.lua | 2 +- data/scripts/chocobo.lua | 68 + data/scripts/commands/ActivateCommand.lua | 5 +- .../scripts/commands/LinkshellKickCommand.lua | 12 + data/scripts/commands/gm/endevent.lua | 35 + data/scripts/commands/gm/givegil.lua | 42 + data/scripts/commands/gm/nudge.lua | 57 + data/scripts/commands/gm/test.lua | 28 + data/scripts/commands/gm/workvalue.lua | 49 + data/scripts/directors/OpeningDirector.lua | 66 + .../directors/Quest/QuestDirectorMan0g001.lua | 66 + .../directors/Quest/QuestDirectorMan0l001.lua | 66 + .../directors/Quest/QuestDirectorMan0u001.lua | 66 + .../questDirect_fst0Btl03_01@0A615.lua | 21 - .../questDirect_ocn0Btl02_01@0C196.lua | 25 - data/scripts/player.lua | 30 +- data/scripts/quests/man/man0l0.lua | 6 +- data/scripts/quests/man/man0u0.lua | 1 + .../Director/opening_director.lua | 33 - .../openingstoper_gridania.lua} | 0 .../papalymo.lua} | 3 +- .../yda.lua} | 37 +- data/scripts/unique/fst0Battle03/zone.lua | 20 - .../InstanceRaidGuide/louisoix.lua | 7 + .../PopulacePassiveGLPublisher/anaidjaa.lua | 7 + .../PopulaceStandard/dyrstbrod.lua | 7 + .../ocn0Battle02/Director/openingdirector.lua | 26 - .../baby-faced_adventurer.lua | 2 +- .../PopulaceStandard/exit_door.lua | 9 +- .../fighterAlly_ocn0Btl02_02@0C196.lua | 3 - .../fighterAlly_ocn0Btl02_03@0C196.lua | 3 - .../PopulaceStandard/rostnsthal.lua | 4 +- .../PopulaceStandard/voluptuous_vixen.lua | 5 +- .../unique/ocn0Cruise01/ship_route_1.lua | 5 + .../unique/ocn0Cruise01/ship_route_2.lua | 5 + .../sea0Town01/PopulaceStandard/merewina.lua | 7 + .../PopulaceStandard/sweetnix_rosycheeks.lua | 7 + .../MapObjShipPort/limsa_shipport.lua | 5 + .../MapObjShipPort/limsa_shipport2.lua | 5 + .../sea0Town01a/PopulaceStandard/joellaut.lua | 7 + .../Director/opening_director.lua | 22 - .../opening_stoper_uldah.lua | 13 + .../opening_stoper_uldah_battle.lua | 13 + .../rururaji.lua} | 4 +- .../wil0Battle01/PopulaceStandard/ascilia.lua | 33 +- .../PopulaceStandard/exit_trigger.lua | 48 + .../PopulaceStandard/fretful_farmhand.lua | 33 +- .../PopulaceStandard/gil-digging_mistress.lua | 32 +- .../PopulaceStandard/warburton.lua | 2 + 69 files changed, 2602 insertions(+), 1816 deletions(-) rename FFXIVClassic Map Server/packets/receive/{_0x07Packet.cs => ZoneInCompletePacket.cs} (78%) create mode 100644 data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningAttacker.lua create mode 100644 data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningHealer.lua create mode 100644 data/scripts/base/chara/npc/monster/Goobbue/GoobbueLesserStandard.lua create mode 100644 data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua create mode 100644 data/scripts/chocobo.lua create mode 100644 data/scripts/commands/LinkshellKickCommand.lua create mode 100644 data/scripts/commands/gm/endevent.lua create mode 100644 data/scripts/commands/gm/givegil.lua create mode 100644 data/scripts/commands/gm/nudge.lua create mode 100644 data/scripts/commands/gm/test.lua create mode 100644 data/scripts/commands/gm/workvalue.lua create mode 100644 data/scripts/directors/OpeningDirector.lua create mode 100644 data/scripts/directors/Quest/QuestDirectorMan0g001.lua create mode 100644 data/scripts/directors/Quest/QuestDirectorMan0l001.lua create mode 100644 data/scripts/directors/Quest/QuestDirectorMan0u001.lua delete mode 100644 data/scripts/directors/questDirect_fst0Btl03_01@0A615.lua delete mode 100644 data/scripts/directors/questDirect_ocn0Btl02_01@0C196.lua delete mode 100644 data/scripts/unique/fst0Battle03/Director/opening_director.lua rename data/scripts/unique/fst0Battle03/{openingStop_fstBtl03_03@0A600.lua => OpeningStoperF0B1/openingstoper_gridania.lua} (100%) rename data/scripts/unique/fst0Battle03/{OpeningStoperF0B1/pplStd_fst0Btl03_02@0A600.lua => PopulaceStandard/papalymo.lua} (88%) rename data/scripts/unique/fst0Battle03/{OpeningStoperF0B1/pplStd_fst0Btl03_01@0A600.lua => PopulaceStandard/yda.lua} (59%) delete mode 100644 data/scripts/unique/fst0Battle03/zone.lua create mode 100644 data/scripts/unique/fst0Town01a/InstanceRaidGuide/louisoix.lua create mode 100644 data/scripts/unique/fst0Town01a/PopulacePassiveGLPublisher/anaidjaa.lua create mode 100644 data/scripts/unique/fst0Town01a/PopulaceStandard/dyrstbrod.lua delete mode 100644 data/scripts/unique/ocn0Battle02/Director/openingdirector.lua delete mode 100644 data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_02@0C196.lua delete mode 100644 data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_03@0C196.lua create mode 100644 data/scripts/unique/ocn0Cruise01/ship_route_1.lua create mode 100644 data/scripts/unique/ocn0Cruise01/ship_route_2.lua create mode 100644 data/scripts/unique/sea0Town01/PopulaceStandard/merewina.lua create mode 100644 data/scripts/unique/sea0Town01/PopulaceStandard/sweetnix_rosycheeks.lua create mode 100644 data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport.lua create mode 100644 data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport2.lua create mode 100644 data/scripts/unique/sea0Town01a/PopulaceStandard/joellaut.lua delete mode 100644 data/scripts/unique/wil0Battle01/Director/opening_director.lua create mode 100644 data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah.lua create mode 100644 data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah_battle.lua rename data/scripts/unique/wil0Battle01/{PopulaceStandard/pplStd_wil0Btl01_01@0B800.lua => PopulaceChocoboLender/rururaji.lua} (67%) create mode 100644 data/scripts/unique/wil0Battle01/PopulaceStandard/exit_trigger.lua diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 3c11d4d6..78f859a8 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -237,7 +237,9 @@ namespace FFXIVClassic_Map_Server rotation = @rot, destinationZoneId = @destZone, destinationSpawnType = @destSpawn, - currentZoneId = @zoneId + currentZoneId = @zoneId, + currentPrivateArea = @privateArea, + currentPrivateAreaType = @privateAreaType WHERE id = @charaId "; @@ -248,6 +250,8 @@ namespace FFXIVClassic_Map_Server cmd.Parameters.AddWithValue("@z", player.positionZ); cmd.Parameters.AddWithValue("@rot", player.rotation); cmd.Parameters.AddWithValue("@zoneId", player.zoneId); + cmd.Parameters.AddWithValue("@privateArea", player.privateArea); + cmd.Parameters.AddWithValue("@privateAreaType", player.privateAreaType); cmd.Parameters.AddWithValue("@destZone", player.destinationZone); cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType); @@ -327,7 +331,7 @@ namespace FFXIVClassic_Map_Server VALUES (@charaId, @slot, @questId, @questData, @questFlags) ON DUPLICATE KEY UPDATE - questData = @questData, questFlags = @questFlags + questId = @questId, questData = @questData, questFlags = @questFlags "; cmd = new MySqlCommand(query, conn); @@ -385,7 +389,9 @@ namespace FFXIVClassic_Map_Server achievementPoints, playTime, destinationZoneId, - destinationSpawnType + destinationSpawnType, + currentPrivateArea, + currentPrivateAreaType FROM characters WHERE id = @charId"; cmd = new MySqlCommand(query, conn); @@ -419,10 +425,17 @@ namespace FFXIVClassic_Map_Server player.destinationZone = reader.GetUInt32("destinationZoneId"); player.destinationSpawnType = reader.GetByte("destinationSpawnType"); + if (!reader.IsDBNull(reader.GetOrdinal("currentPrivateArea"))) + player.privateArea = reader.GetString("currentPrivateArea"); + player.privateAreaType = reader.GetUInt32("currentPrivateAreaType"); + if (player.destinationZone != 0) player.zoneId = player.destinationZone; - - player.zone = Server.GetWorldManager().GetZone(player.zoneId); + + if (player.privateArea != null && !player.privateArea.Equals("")) + player.zone = Server.GetWorldManager().GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType); + else + player.zone = Server.GetWorldManager().GetZone(player.zoneId); } } diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 48bd244f..230679e2 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -152,7 +152,7 @@ - + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index e752b95b..90330659 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -1,48 +1,48 @@ -using FFXIVClassic.Common; - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.packets.receive; -using FFXIVClassic_Map_Server.packets.send; -using FFXIVClassic_Map_Server.packets.send.login; -using FFXIVClassic_Map_Server.packets.send.actor; -using FFXIVClassic_Map_Server.packets.send.supportdesk; -using FFXIVClassic_Map_Server.packets.receive.social; -using FFXIVClassic_Map_Server.packets.send.social; -using FFXIVClassic_Map_Server.packets.receive.supportdesk; -using FFXIVClassic_Map_Server.packets.receive.recruitment; -using FFXIVClassic_Map_Server.packets.send.recruitment; -using FFXIVClassic_Map_Server.packets.receive.events; -using FFXIVClassic_Map_Server.lua; +using FFXIVClassic.Common; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.packets.receive; +using FFXIVClassic_Map_Server.packets.send; +using FFXIVClassic_Map_Server.packets.send.login; +using FFXIVClassic_Map_Server.packets.send.actor; +using FFXIVClassic_Map_Server.packets.send.supportdesk; +using FFXIVClassic_Map_Server.packets.receive.social; +using FFXIVClassic_Map_Server.packets.send.social; +using FFXIVClassic_Map_Server.packets.receive.supportdesk; +using FFXIVClassic_Map_Server.packets.receive.recruitment; +using FFXIVClassic_Map_Server.packets.send.recruitment; +using FFXIVClassic_Map_Server.packets.receive.events; +using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.packets.WorldPackets.Send; using FFXIVClassic_Map_Server.packets.WorldPackets.Receive; -using FFXIVClassic_Map_Server.actors.director; - -namespace FFXIVClassic_Map_Server -{ - class PacketProcessor - { - Server mServer; - - public PacketProcessor(Server server) - { - mServer = server; - } - - public void ProcessPacket(ZoneConnection client, SubPacket subpacket) - { +using FFXIVClassic_Map_Server.actors.director; + +namespace FFXIVClassic_Map_Server +{ + class PacketProcessor + { + Server mServer; + + public PacketProcessor(Server server) + { + mServer = server; + } + + public void ProcessPacket(ZoneConnection client, SubPacket subpacket) + { Session session = mServer.GetSession(subpacket.header.targetId); if (session == null && subpacket.gameMessage.opcode != 0x1000) - return; - - //Normal Game Opcode - switch (subpacket.gameMessage.opcode) - { + return; + + //Normal Game Opcode + switch (subpacket.gameMessage.opcode) + { //World Server - Error case 0x100A: ErrorPacket worldError = new ErrorPacket(subpacket.data); @@ -52,8 +52,8 @@ namespace FFXIVClassic_Map_Server session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20); break; } - break; - //World Server - Session Begin + break; + //World Server - Session Begin case 0x1000: subpacket.DebugPrintSubPacket(); session = mServer.AddSession(subpacket.header.targetId); @@ -83,264 +83,266 @@ namespace FFXIVClassic_Map_Server //World Server - Party Synch case 0x1020: PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data); - Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket); - break; - //Ping - case 0x0001: - //subpacket.DebugPrintSubPacket(); - PingPacket pingPacket = new PingPacket(subpacket.data); + Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket); + break; + //Ping + case 0x0001: + //subpacket.DebugPrintSubPacket(); + PingPacket pingPacket = new PingPacket(subpacket.data); client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(session.id, pingPacket.time), true, false)); - session.Ping(); - break; - //Unknown - case 0x0002: - + session.Ping(); + break; + //Unknown + case 0x0002: + subpacket.DebugPrintSubPacket(); client.QueuePacket(_0x2Packet.BuildPacket(session.id), true, false); - client.FlushQueuedSendPackets(); - - break; - //Chat Received - case 0x0003: - ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); - //Program.Log.Info("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType); - - if (chatMessage.message.StartsWith("!")) - { + client.FlushQueuedSendPackets(); + + break; + //Chat Received + case 0x0003: + ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); + //Program.Log.Info("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType); + + if (chatMessage.message.StartsWith("!")) + { if (Server.GetCommandProcessor().DoCommand(chatMessage.message, session)) - return; ; + return; ; } if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT) - session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false); - - break; - //Langauge Code (Client safe to send packets to now) - case 0x0006: + session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false); + + break; + //Langauge Code (Client safe to send packets to now) + case 0x0006: LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); session = mServer.AddSession(subpacket.header.targetId); - LuaEngine.OnBeginLogin(session.GetActor()); + LuaEngine.OnBeginLogin(session.GetActor()); Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1); LuaEngine.OnLogin(session.GetActor()); - session.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: - //Update Position - UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); - session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); - session.GetActor().SendInstanceUpdate(); - - if (session.GetActor().IsInZoneChange()) - session.GetActor().SetZoneChanging(false); - - break; - //Set Target - case 0x00CD: - //subpacket.DebugPrintSubPacket(); - - SetTargetPacket setTarget = new SetTargetPacket(subpacket.data); - session.GetActor().currentTarget = setTarget.actorID; - session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, session.id, setTarget.actorID), true); - break; - //Lock Target - case 0x00CC: - LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); - session.GetActor().currentLockedTarget = lockTarget.actorID; - break; - //Start Event - case 0x012D: - subpacket.DebugPrintSubPacket(); - EventStartPacket eventStart = new EventStartPacket(subpacket.data); - - /* - if (eventStart.error != null) - { - player.errorMessage += eventStart.error; - - if (eventStart.errorIndex == eventStart.errorNum - 1) - Program.Log.Error("\n"+player.errorMessage); - - - break; - } - */ - - Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); - - - session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; - session.GetActor().currentEventName = eventStart.triggerName; - - - if (ownerActor == null) - { - //Is it a instance actor? - ownerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); - if (ownerActor == null) - { + session.languageCode = langCode.languageCode; + break; + //Unknown - Happens a lot at login, then once every time player zones + case 0x0007: + subpacket.DebugPrintSubPacket(); + ZoneInCompletePacket zoneInCompletePacket = new ZoneInCompletePacket(subpacket.data); + LuaEngine.OnZoneInDone(session.GetActor()); + break; + //Update Position + case 0x00CA: + //Update Position + UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); + session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); + session.GetActor().SendInstanceUpdate(); + + if (session.GetActor().IsInZoneChange()) + session.GetActor().SetZoneChanging(false); + + break; + //Set Target + case 0x00CD: + //subpacket.DebugPrintSubPacket(); + + SetTargetPacket setTarget = new SetTargetPacket(subpacket.data); + session.GetActor().currentTarget = setTarget.actorID; + session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, session.id, setTarget.actorID), true); + break; + //Lock Target + case 0x00CC: + LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); + session.GetActor().currentLockedTarget = lockTarget.actorID; + break; + //Start Event + case 0x012D: + subpacket.DebugPrintSubPacket(); + EventStartPacket eventStart = new EventStartPacket(subpacket.data); + + /* + if (eventStart.error != null) + { + player.errorMessage += eventStart.error; + + if (eventStart.errorIndex == eventStart.errorNum - 1) + Program.Log.Error("\n"+player.errorMessage); + + + break; + } + */ + + Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); + + + session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; + session.GetActor().currentEventName = eventStart.triggerName; + + + if (ownerActor == null) + { + //Is it a instance actor? + ownerActor = session.GetActor().zone.FindActorInZone(session.GetActor().currentEventOwner); + if (ownerActor == null) + { //Is it a Director? Director director = session.GetActor().GetDirector(eventStart.scriptOwnerActorID); if (director != null) - ownerActor = director; - else - { - Program.Log.Debug("\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; - } - } - } - - session.GetActor().StartEvent(ownerActor, eventStart); - - Program.Log.Debug("\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(); - EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); - Program.Log.Debug("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.DumpParams(eventUpdate.luaParams)); - /* - //Is it a static actor? If not look in the player's instance - Actor updateOwnerActor = Server.GetStaticActors(session.GetActor().currentEventOwner); - if (updateOwnerActor == null) - { - updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); - - if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId) - updateOwnerActor = session.GetActor().currentDirector; - - if (updateOwnerActor == null) - break; - } - */ - session.GetActor().UpdateEvent(eventUpdate); - - //LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate); - - break; - case 0x012F: - subpacket.DebugPrintSubPacket(); - ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); - if (paramRequest.paramName.Equals("charaWork/exp")) - session.GetActor().SendCharaExpInfo(); + ownerActor = director; + else + { + Program.Log.Debug("\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; + } + } + } + + session.GetActor().StartEvent(ownerActor, eventStart); + + Program.Log.Debug("\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: + subpacket.DebugPrintSubPacket(); + break; + //Event Result + case 0x012E: + subpacket.DebugPrintSubPacket(); + EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); + Program.Log.Debug("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.DumpParams(eventUpdate.luaParams)); + /* + //Is it a static actor? If not look in the player's instance + Actor updateOwnerActor = Server.GetStaticActors(session.GetActor().currentEventOwner); + if (updateOwnerActor == null) + { + updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); + + if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId) + updateOwnerActor = session.GetActor().currentDirector; + + if (updateOwnerActor == null) + break; + } + */ + session.GetActor().UpdateEvent(eventUpdate); + + //LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate); + + break; + case 0x012F: + subpacket.DebugPrintSubPacket(); + ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); + if (paramRequest.paramName.Equals("charaWork/exp")) + session.GetActor().SendCharaExpInfo(); break; //Group Created Confirm case 0x0133: GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data); - break; - /* RECRUITMENT */ - //Start Recruiting - case 0x01C3: - StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false)); - break; - //End Recruiting - case 0x01C4: - client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false)); - break; - //Party Window Opened, Request State - case 0x01C5: - client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false)); - break; - //Search Recruiting - case 0x01C7: - RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); - break; - //Get Recruitment Details - case 0x01C8: - RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); - RecruitmentDetails details = new RecruitmentDetails(); - details.recruiterName = "Localhost Character"; - details.purposeId = 2; - details.locationId = 1; - details.subTaskId = 1; - details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; - details.num[0] = 1; - client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false)); - break; - //Accepted Recruiting - case 0x01C6: - subpacket.DebugPrintSubPacket(); - break; - /* SOCIAL STUFF */ - case 0x01C9: - AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false)); - break; - case 0x01CA: - AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false)); - break; - case 0x01CB: - int offset1 = 0; - client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false)); - break; - case 0x01CC: - AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false)); - break; - case 0x01CD: - AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false)); - break; - case 0x01CE: - int offset2 = 0; - client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false)); - break; - case 0x01CF: - client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false)); - break; - /* SUPPORT DESK STUFF */ - //Request for FAQ/Info List - case 0x01D0: - FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false)); - break; - //Request for body of a faq/info selection - case 0x01D1: - FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false)); - break; - //Request issue list - case 0x01D2: - GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); - client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false)); - break; - //Request if GM ticket exists - case 0x01D3: - client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false)); - break; - //Request for GM response message - case 0x01D4: - client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false)); - break; - //GM Ticket Sent - case 0x01D5: - GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); - Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); - client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false)); - break; - //Request to end ticket - case 0x01D6: - client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false)); - break; - default: - Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); - subpacket.DebugPrintSubPacket(); - break; - } - - } - - } -} + break; + /* RECRUITMENT */ + //Start Recruiting + case 0x01C3: + StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false)); + break; + //End Recruiting + case 0x01C4: + client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false)); + break; + //Party Window Opened, Request State + case 0x01C5: + client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false)); + break; + //Search Recruiting + case 0x01C7: + RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); + break; + //Get Recruitment Details + case 0x01C8: + RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); + RecruitmentDetails details = new RecruitmentDetails(); + details.recruiterName = "Localhost Character"; + details.purposeId = 2; + details.locationId = 1; + details.subTaskId = 1; + details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; + details.num[0] = 1; + client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false)); + break; + //Accepted Recruiting + case 0x01C6: + subpacket.DebugPrintSubPacket(); + break; + /* SOCIAL STUFF */ + case 0x01C9: + AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false)); + break; + case 0x01CA: + AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false)); + break; + case 0x01CB: + int offset1 = 0; + client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false)); + break; + case 0x01CC: + AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false)); + break; + case 0x01CD: + AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false)); + break; + case 0x01CE: + int offset2 = 0; + client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple[] { new Tuple(01, "Test2") }, ref offset2), true, false)); + break; + case 0x01CF: + client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false)); + break; + /* SUPPORT DESK STUFF */ + //Request for FAQ/Info List + case 0x01D0: + FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false)); + break; + //Request for body of a faq/info selection + case 0x01D1: + FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false)); + break; + //Request issue list + case 0x01D2: + GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); + client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false)); + break; + //Request if GM ticket exists + case 0x01D3: + client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false)); + break; + //Request for GM response message + case 0x01D4: + client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false)); + break; + //GM Ticket Sent + case 0x01D5: + GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); + Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); + client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false)); + break; + //Request to end ticket + case 0x01D6: + client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false)); + break; + default: + Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); + subpacket.DebugPrintSubPacket(); + break; + } + + } + + } +} diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 2e309df7..06272490 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -111,6 +111,7 @@ namespace FFXIVClassic_Map_Server id, parentZoneId, privateAreaName, + privateAreaType, className, dayMusic, nightMusic, @@ -129,7 +130,7 @@ namespace FFXIVClassic_Map_Server if (zoneList.ContainsKey(parentZoneId)) { Zone parent = zoneList[parentZoneId]; - PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), 1, reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic")); + PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), reader.GetUInt32("privateAreaType"), reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic")); parent.AddPrivateArea(privArea); } else @@ -184,7 +185,7 @@ namespace FFXIVClassic_Map_Server if (!reader.IsDBNull(7)) privArea = reader.GetString(7); - ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6)); + ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, 1, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6)); zoneEntranceList[id] = entance; count++; } @@ -548,19 +549,19 @@ namespace FFXIVClassic_Map_Server } ZoneEntrance ze = zoneEntranceList[zoneEntrance]; - DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation); + DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.privateAreaType, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation); } //Moves actor to new zone, and sends packets to spawn at the given coords. - public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) + public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, int destinationPrivateAreaType, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) { //Add player to new zone and update Area newArea; if (destinationPrivateArea == null) newArea = GetZone(destinationZoneId); - else - newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, 0); + else //Add check for -1 if it is a instance + newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType); //This server does not contain that zoneId if (newArea == null) @@ -581,6 +582,9 @@ namespace FFXIVClassic_Map_Server //Update player actor's properties player.zoneId = newArea.actorId; + + player.privateArea = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaName() : null; + player.privateAreaType = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaType() : 0; player.zone = newArea; player.positionX = spawnX; player.positionY = spawnY; @@ -589,11 +593,15 @@ namespace FFXIVClassic_Map_Server //Send packets player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId), true, false); - player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false); + player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false); player.SendZoneInPackets(this, spawnType); player.playerSession.ClearInstance(); player.SendInstanceUpdate(); + //Send "You have entered an instance" if it's a Private Area + if (newArea is PrivateArea) + player.SendGameMessage(GetActor(), 34108, 0x20); + LuaEngine.OnZoneIn(player); } @@ -630,7 +638,7 @@ namespace FFXIVClassic_Map_Server player.rotation = spawnRotation; //Send packets - player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false); + player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false); player.playerSession.QueuePacket(player.CreateSpawnTeleportPacket(player.actorId, spawnType), true, false); player.SendInstanceUpdate(); @@ -845,6 +853,17 @@ namespace FFXIVClassic_Map_Server return null; } + public Actor GetActorInWorldByUniqueId(string uid) + { + foreach (Zone zone in zoneList.Values) + { + Actor a = zone.FindActorInZoneByUniqueID(uid); + if (a != null) + return a; + } + return null; + } + public Player GetPCInWorld(uint charId) { foreach (Zone zone in zoneList.Values) @@ -863,6 +882,14 @@ namespace FFXIVClassic_Map_Server return zoneList[zoneId]; } + public PrivateArea GetPrivateArea(uint zoneId, string privateArea, uint privateAreaType) + { + if (!zoneList.ContainsKey(zoneId)) + return null; + + return zoneList[zoneId].GetPrivateArea(privateArea, privateAreaType); + } + public WorldMaster GetActor() { return worldMaster; @@ -877,16 +904,18 @@ namespace FFXIVClassic_Map_Server { public uint zoneId; public string privateAreaName; + public int privateAreaType; public byte spawnType; public float spawnX; public float spawnY; public float spawnZ; public float spawnRotation; - public ZoneEntrance(uint zoneId, string privateAreaName, byte spawnType, float x, float y, float z, float rot) + public ZoneEntrance(uint zoneId, string privateAreaName, int privateAreaType, byte spawnType, float x, float y, float z, float rot) { this.zoneId = zoneId; this.privateAreaName = privateAreaName; + this.privateAreaType = privateAreaType; this.spawnType = spawnType; this.spawnX = x; this.spawnY = y; diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 914dc1ad..085fdc65 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -28,6 +28,8 @@ namespace FFXIVClassic_Map_Server.Actors public float[] moveSpeeds = new float[4]; public uint zoneId, zoneId2; + public string privateArea; + public uint privateAreaType; public Area zone = null; public Area zone2 = null; public bool isZoning = false; @@ -351,7 +353,7 @@ namespace FFXIVClassic_Map_Server.Actors uint zoneId = zone.actorId; uint privLevel = 0; if (zone is PrivateArea) - privLevel = ((PrivateArea)zone).GetPrivateAreaLevel(); + privLevel = ((PrivateArea)zone).GetPrivateAreaType(); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); } diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 33d5ef4c..94c72444 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -298,6 +298,19 @@ namespace FFXIVClassic_Map_Server.Actors if (!mActorList.ContainsKey(id)) return null; return mActorList[id]; + } + + public Actor FindActorInZoneByUniqueID(string uniqueId) + { + foreach (Actor a in mActorList.Values) + { + if (a is Npc) + { + if (((Npc)a).GetUniqueId().ToLower().Equals(uniqueId)) + return a; + } + } + return null; } public Player FindPCInZone(string name) @@ -360,7 +373,16 @@ namespace FFXIVClassic_Map_Server.Actors if (actorClass == null) return; - Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, actorId, location.x, location.y, location.z, location.rot, location.state, location.animId, null); + uint zoneId; + + if (this is PrivateArea) + zoneId = ((PrivateArea)this).GetParentZone().actorId; + else + zoneId = actorId; + + Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, this, location.x, location.y, location.z, location.rot, location.state, location.animId, null); + + npc.LoadEventConditions(actorClass.eventConditions); AddActorToZone(npc); diff --git a/FFXIVClassic Map Server/actors/area/PrivateArea.cs b/FFXIVClassic Map Server/actors/area/PrivateArea.cs index 340648e5..87080fa6 100644 --- a/FFXIVClassic Map Server/actors/area/PrivateArea.cs +++ b/FFXIVClassic Map Server/actors/area/PrivateArea.cs @@ -15,14 +15,14 @@ namespace FFXIVClassic_Map_Server.actors.area { private Zone parentZone; private string privateAreaName; - private uint privateAreaLevel; + private uint privateAreaType; - public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaLevel, ushort bgmDay, ushort bgmNight, ushort bgmBattle) + public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaType, ushort bgmDay, ushort bgmNight, ushort bgmBattle) : base(id, parent.zoneName, parent.regionId, className, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true) { this.parentZone = parent; this.privateAreaName = privateAreaName; - this.privateAreaLevel = privateAreaLevel; + this.privateAreaType = privateAreaType; } public string GetPrivateAreaName() @@ -30,9 +30,9 @@ namespace FFXIVClassic_Map_Server.actors.area return privateAreaName; } - public uint GetPrivateAreaLevel() + public uint GetPrivateAreaType() { - return privateAreaLevel; + return privateAreaType; } public Zone GetParentZone() @@ -46,12 +46,11 @@ namespace FFXIVClassic_Map_Server.actors.area string path = className; - if (className.ToLower().Contains("content")) - path = "Content/" + className; + string realClassName = className.Substring(className.LastIndexOf("/") + 1); - lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea/" + path, false, true, zoneName, privateAreaName, 0x9E, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false); - ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams).DebugPrintSubPacket(); - return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams); + lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea" + path, false, true, zoneName, privateAreaName, privateAreaType, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false); + ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams).DebugPrintSubPacket(); + return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams); } diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index e0c41e44..c3509458 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -16,6 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.area class Zone : Area { Dictionary> privateAreas = new Dictionary>(); + Dictionary> instancedPrivateAreas = new Dictionary>(); public Zone(uint id, string zoneName, ushort regionId, string className, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid) : base(id, zoneName, regionId, className, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid) @@ -26,11 +27,11 @@ namespace FFXIVClassic_Map_Server.actors.area public void AddPrivateArea(PrivateArea pa) { if (privateAreas.ContainsKey(pa.GetPrivateAreaName())) - privateAreas[pa.GetPrivateAreaName()][0] = pa; + privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa; else { privateAreas[pa.GetPrivateAreaName()] = new Dictionary(); - privateAreas[pa.GetPrivateAreaName()][0] = pa; + privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa; } } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 1fc8389f..fac897d6 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -1,10 +1,10 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors; +using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.Actors.Chara; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.lua; - using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.utils; @@ -27,8 +27,8 @@ namespace FFXIVClassic_Map_Server.Actors public NpcWork npcWork = new NpcWork(); - public Npc(int actorNumber, ActorClass actorClass, string uniqueId, uint zoneId, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName) - : base((4 << 28 | zoneId << 19 | (uint)actorNumber)) + public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName) + : base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber)) { this.positionX = posX; this.positionY = posY; @@ -41,8 +41,8 @@ namespace FFXIVClassic_Map_Server.Actors this.uniqueIdentifier = uniqueId; - this.zoneId = zoneId; - this.zone = Server.GetWorldManager().GetZone(zoneId); + this.zoneId = spawnedArea.actorId; + this.zone = spawnedArea; this.actorClassId = actorClass.actorClassId; @@ -131,8 +131,12 @@ namespace FFXIVClassic_Map_Server.Actors subpackets.AddRange(GetEventConditionPackets(playerActorId)); subpackets.Add(CreateSpeedPacket(playerActorId)); subpackets.Add(CreateSpawnPositonPacket(playerActorId, 0x0)); - - if (uniqueIdentifier.Equals("door2")) + + if (uniqueIdentifier.Equals("door1")) + { + subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB0D, 0x1af)); + } + else if (uniqueIdentifier.Equals("door2")) { subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB09, 0x1af)); } @@ -167,16 +171,16 @@ namespace FFXIVClassic_Map_Server.Actors } else if (actorClassId == 5900013) { - uint id = 2; - uint id2 = 5144; - string val = "fdot"; + uint id = 201; + uint id2 = 0x1415; + string val = "fdin"; subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2)); subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val)); } else if (actorClassId == 5900014) { - uint id = 2; - uint id2 = 5145; + uint id = 201; + uint id2 = 0x1415; string val = "fdot"; subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2)); subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val)); @@ -374,8 +378,17 @@ namespace FFXIVClassic_Map_Server.Actors if (File.Exists("./scripts/base/" + classPath + ".lua")) parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua"); - if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) - child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); + + if (zone is PrivateArea) + { + if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier))) + child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)); + } + else + { + if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) + child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); + } if (parent == null && child == null) { @@ -402,8 +415,16 @@ namespace FFXIVClassic_Map_Server.Actors if (File.Exists("./scripts/base/" + classPath + ".lua")) parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua"); - if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) - child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); + if (zone is PrivateArea) + { + if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier))) + child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)); + } + else + { + if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) + child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); + } if (parent == null && child == null) { diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index dbe495ea..26b17698 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1,524 +1,538 @@ -using FFXIVClassic.Common; - -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.events; -using FFXIVClassic_Map_Server.packets.send.player; -using FFXIVClassic_Map_Server.utils; -using System; -using System.Collections.Generic; -using MoonSharp.Interpreter; -using FFXIVClassic_Map_Server.packets.receive.events; +using FFXIVClassic.Common; + +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.events; +using FFXIVClassic_Map_Server.packets.send.player; +using FFXIVClassic_Map_Server.utils; +using System; +using System.Collections.Generic; +using MoonSharp.Interpreter; +using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.send.actor.inventory; using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group; -namespace FFXIVClassic_Map_Server.Actors -{ - class Player : Character - { - public const int CLASSID_PUG = 2; - public const int CLASSID_GLA = 3; - public const int CLASSID_MRD = 4; - public const int CLASSID_ARC = 7; - public const int CLASSID_LNC = 8; - public const int CLASSID_THM = 22; - public const int CLASSID_CNJ = 23; - - public const int CLASSID_CRP = 29; - public const int CLASSID_BSM = 30; - public const int CLASSID_ARM = 31; - public const int CLASSID_GSM = 32; - public const int CLASSID_LTW = 33; - public const int CLASSID_WVR = 34; - public const int CLASSID_ALC = 35; - public const int CLASSID_CUL = 36; - - public const int CLASSID_MIN = 39; - public const int CLASSID_BTN = 40; - public const int CLASSID_FSH = 41; - - public const int MAXSIZE_INVENTORY_NORMAL = 200; - public const int MAXSIZE_INVENTORY_CURRANCY = 320; - public const int MAXSIZE_INVENTORY_KEYITEMS = 500; - public const int MAXSIZE_INVENTORY_LOOT = 10; - public const int MAXSIZE_INVENTORY_MELDREQUEST = 4; - public const int MAXSIZE_INVENTORY_BAZAAR = 10; - public const int MAXSIZE_INVENTORY_EQUIPMENT = 35; - - public const int TIMER_TOTORAK = 0; - public const int TIMER_DZEMAEL = 1; - public const int TIMER_BOWL_OF_EMBERS_HARD = 2; - public const int TIMER_BOWL_OF_EMBERS = 3; - public const int TIMER_THORNMARCH = 4; - public const int TIMER_AURUMVALE = 5; - public const int TIMER_CUTTERSCRY = 6; - public const int TIMER_BATTLE_ALEPORT = 7; - public const int TIMER_BATTLE_HYRSTMILL = 8; - public const int TIMER_BATTLE_GOLDENBAZAAR = 9; - public const int TIMER_HOWLING_EYE_HARD = 10; - public const int TIMER_HOWLING_EYE = 11; - public const int TIMER_CASTRUM_TOWER = 12; - public const int TIMER_BOWL_OF_EMBERS_EXTREME = 13; - public const int TIMER_RIVENROAD = 14; - public const int TIMER_RIVENROAD_HARD = 15; - public const int TIMER_BEHEST = 16; - public const int TIMER_COMPANYBEHEST = 17; - public const int TIMER_RETURN = 18; - public const int TIMER_SKIRMISH = 19; - - public static int[] MAXEXP = {570, 700, 880, 1100, 1500, 1800, 2300, 3200, 4300, 5000, //Level <= 10 - 5900, 6800, 7700, 8700, 9700, 11000, 12000, 13000, 15000, 16000, //Level <= 20 - 20000, 22000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 38000, //Level <= 30 - 45000, 47000, 50000, 53000, 56000, 59000, 62000, 65000, 68000, 71000, //Level <= 40 - 74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50 - - //Event Related - public uint currentEventOwner = 0; - public string currentEventName = ""; - - public Coroutine currentEventRunning; - +namespace FFXIVClassic_Map_Server.Actors +{ + class Player : Character + { + public const int CLASSID_PUG = 2; + public const int CLASSID_GLA = 3; + public const int CLASSID_MRD = 4; + public const int CLASSID_ARC = 7; + public const int CLASSID_LNC = 8; + public const int CLASSID_THM = 22; + public const int CLASSID_CNJ = 23; + + public const int CLASSID_CRP = 29; + public const int CLASSID_BSM = 30; + public const int CLASSID_ARM = 31; + public const int CLASSID_GSM = 32; + public const int CLASSID_LTW = 33; + public const int CLASSID_WVR = 34; + public const int CLASSID_ALC = 35; + public const int CLASSID_CUL = 36; + + public const int CLASSID_MIN = 39; + public const int CLASSID_BTN = 40; + public const int CLASSID_FSH = 41; + + public const int MAXSIZE_INVENTORY_NORMAL = 200; + public const int MAXSIZE_INVENTORY_CURRANCY = 320; + public const int MAXSIZE_INVENTORY_KEYITEMS = 500; + public const int MAXSIZE_INVENTORY_LOOT = 10; + public const int MAXSIZE_INVENTORY_MELDREQUEST = 4; + public const int MAXSIZE_INVENTORY_BAZAAR = 10; + public const int MAXSIZE_INVENTORY_EQUIPMENT = 35; + + public const int TIMER_TOTORAK = 0; + public const int TIMER_DZEMAEL = 1; + public const int TIMER_BOWL_OF_EMBERS_HARD = 2; + public const int TIMER_BOWL_OF_EMBERS = 3; + public const int TIMER_THORNMARCH = 4; + public const int TIMER_AURUMVALE = 5; + public const int TIMER_CUTTERSCRY = 6; + public const int TIMER_BATTLE_ALEPORT = 7; + public const int TIMER_BATTLE_HYRSTMILL = 8; + public const int TIMER_BATTLE_GOLDENBAZAAR = 9; + public const int TIMER_HOWLING_EYE_HARD = 10; + public const int TIMER_HOWLING_EYE = 11; + public const int TIMER_CASTRUM_TOWER = 12; + public const int TIMER_BOWL_OF_EMBERS_EXTREME = 13; + public const int TIMER_RIVENROAD = 14; + public const int TIMER_RIVENROAD_HARD = 15; + public const int TIMER_BEHEST = 16; + public const int TIMER_COMPANYBEHEST = 17; + public const int TIMER_RETURN = 18; + public const int TIMER_SKIRMISH = 19; + + public static int[] MAXEXP = {570, 700, 880, 1100, 1500, 1800, 2300, 3200, 4300, 5000, //Level <= 10 + 5900, 6800, 7700, 8700, 9700, 11000, 12000, 13000, 15000, 16000, //Level <= 20 + 20000, 22000, 23000, 25000, 27000, 29000, 31000, 33000, 35000, 38000, //Level <= 30 + 45000, 47000, 50000, 53000, 56000, 59000, 62000, 65000, 68000, 71000, //Level <= 40 + 74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50 + + //Event Related + public uint currentEventOwner = 0; + public string currentEventName = ""; + + public Coroutine currentEventRunning; + //Player Info public uint destinationZone; - public ushort destinationSpawnType; - public uint[] timers = new uint[20]; - public ushort currentJob; - public uint currentTitle; - public uint playTime; - public uint lastPlayTimeUpdate; - public bool isGM = false; - public bool isZoneChanging = true; - - //Inventory - private Dictionary inventories = new Dictionary(); - private Equipment equipment; - - //GC Related - public byte gcCurrent; - public byte gcRankLimsa; - public byte gcRankGridania; - public byte gcRankUldah; - - //Mount Related - public bool hasChocobo; - public bool hasGoobbue; - public byte chocoboAppearance; - public string chocoboName; - public byte mountState = 0; - - public uint achievementPoints; - - //Property Array Request Stuff - private int lastPosition = 0; - private int lastStep = 0; - - //Quest Actors (MUST MATCH playerWork.questScenario/questGuildleve) - public Quest[] questScenario = new Quest[16]; + public ushort destinationSpawnType; + public uint[] timers = new uint[20]; + public ushort currentJob; + public uint currentTitle; + public uint playTime; + public uint lastPlayTimeUpdate; + public bool isGM = false; + public bool isZoneChanging = true; + + //Inventory + private Dictionary inventories = new Dictionary(); + private Equipment equipment; + + //GC Related + public byte gcCurrent; + public byte gcRankLimsa; + public byte gcRankGridania; + public byte gcRankUldah; + + //Mount Related + public bool hasChocobo; + public bool hasGoobbue; + public byte chocoboAppearance; + public string chocoboName; + public byte mountState = 0; + + public uint achievementPoints; + + //Property Array Request Stuff + private int lastPosition = 0; + private int lastStep = 0; + + //Quest Actors (MUST MATCH playerWork.questScenario/questGuildleve) + public Quest[] questScenario = new Quest[16]; public Quest[] questGuildleve = new Quest[8]; - private List ownedDirectors = new List(); - private Director loginInitDirector = null; - - public PlayerWork playerWork = new PlayerWork(); - - public Session playerSession; - - public Player(Session cp, uint actorID) : base(actorID) - { - playerSession = cp; - actorName = String.Format("_pc{0:00000000}", actorID); - className = "Player"; - currentSubState = SetActorStatePacket.SUB_STATE_PLAYER; - - inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL); - inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS); - inventories[Inventory.CURRENCY] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY); - inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST); - inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR); - inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT); - - equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT); - - //Set the Skill level caps of all FFXIV (classes)skills to 50 - for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++) - { - if (i != CLASSID_PUG && - i != CLASSID_MRD && - i != CLASSID_GLA && - i != CLASSID_MRD && - i != CLASSID_ARC && - i != CLASSID_LNC && - i != CLASSID_THM && - i != CLASSID_CNJ && - i != CLASSID_CRP && - i != CLASSID_BSM && - i != CLASSID_ARM && - i != CLASSID_GSM && - i != CLASSID_LTW && - i != CLASSID_WVR && - i != CLASSID_ALC && - i != CLASSID_CUL && - i != CLASSID_MIN && - i != CLASSID_BTN && - i != CLASSID_FSH) - charaWork.battleSave.skillLevelCap[i] = 0xFF; - else - charaWork.battleSave.skillLevelCap[i] = 50; - - } - - charaWork.property[0] = 1; - charaWork.property[1] = 1; - charaWork.property[2] = 1; - charaWork.property[4] = 1; - - charaWork.command[0] = 0xA0F00000 | 21001; - charaWork.command[1] = 0xA0F00000 | 21001; - - charaWork.command[2] = 0xA0F00000 | 21002; - charaWork.command[3] = 0xA0F00000 | 12004; - charaWork.command[4] = 0xA0F00000 | 21005; - charaWork.command[5] = 0xA0F00000 | 21006; - charaWork.command[6] = 0xA0F00000 | 21007; - charaWork.command[7] = 0xA0F00000 | 12009; - charaWork.command[8] = 0xA0F00000 | 12010; - charaWork.command[9] = 0xA0F00000 | 12005; - charaWork.command[10] = 0xA0F00000 | 12007; - charaWork.command[11] = 0xA0F00000 | 12011; - charaWork.command[12] = 0xA0F00000 | 22012; - charaWork.command[13] = 0xA0F00000 | 22013; - charaWork.command[14] = 0xA0F00000 | 29497; - charaWork.command[15] = 0xA0F00000 | 22015; - - charaWork.command[32] = 0xA0F00000 | 27191; - charaWork.command[33] = 0xA0F00000 | 22302; - charaWork.command[34] = 0xA0F00000 | 28466; - - charaWork.commandAcquired[27150 - 26000] = true; - - playerWork.questScenarioComplete[110001 - 110001] = true; - playerWork.questGuildleveComplete[120050 - 120001] = true; - - for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++ ) - charaWork.additionalCommandAcquired[i] = true; - - for (int i = 0; i < charaWork.commandCategory.Length; i++) - charaWork.commandCategory[i] = 1; - - charaWork.battleTemp.generalParameter[3] = 1; - - charaWork.eventSave.bazaarTax = 5; - charaWork.battleSave.potencial = 6.6f; - - charaWork.commandCategory[0] = 1; - charaWork.commandCategory[1] = 1; - charaWork.commandCategory[32] = 1; - charaWork.commandCategory[33] = 1; - charaWork.commandCategory[34] = 1; - - charaWork.parameterSave.commandSlot_compatibility[0] = true; - charaWork.parameterSave.commandSlot_compatibility[1] = true; - charaWork.parameterSave.commandSlot_compatibility[32] = true; - - charaWork.commandBorder = 0x20; - - charaWork.parameterTemp.tp = 3000; - - Database.LoadPlayerCharacter(this); - lastPlayTimeUpdate = Utils.UnixTimeStampUTC(); - } - - public List Create0x132Packets(uint playerActorId) - { - List packets = new List(); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xB, "commandForced")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xA, "commandDefault")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandWeak")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x4, "commandContent")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandJudgeMode")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "commandRequest")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "widgetCreate")); - packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "macroRequest")); - return packets; - } - - public override SubPacket CreateScriptBindPacket(uint playerActorId) - { - List lParams; - if (IsMyPlayer(playerActorId)) - { - if (loginInitDirector != null) - lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, true, loginInitDirector, true, 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); - return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams); + private List ownedDirectors = new List(); + private Director loginInitDirector = null; + + public PlayerWork playerWork = new PlayerWork(); + + public Session playerSession; + + public Player(Session cp, uint actorID) : base(actorID) + { + playerSession = cp; + actorName = String.Format("_pc{0:00000000}", actorID); + className = "Player"; + currentSubState = SetActorStatePacket.SUB_STATE_PLAYER; + + inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL); + inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS); + inventories[Inventory.CURRENCY] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY); + inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST); + inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR); + inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT); + + equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT); + + //Set the Skill level caps of all FFXIV (classes)skills to 50 + for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++) + { + if (i != CLASSID_PUG && + i != CLASSID_MRD && + i != CLASSID_GLA && + i != CLASSID_MRD && + i != CLASSID_ARC && + i != CLASSID_LNC && + i != CLASSID_THM && + i != CLASSID_CNJ && + i != CLASSID_CRP && + i != CLASSID_BSM && + i != CLASSID_ARM && + i != CLASSID_GSM && + i != CLASSID_LTW && + i != CLASSID_WVR && + i != CLASSID_ALC && + i != CLASSID_CUL && + i != CLASSID_MIN && + i != CLASSID_BTN && + i != CLASSID_FSH) + charaWork.battleSave.skillLevelCap[i] = 0xFF; + else + charaWork.battleSave.skillLevelCap[i] = 50; + + } + + charaWork.property[0] = 1; + charaWork.property[1] = 1; + charaWork.property[2] = 1; + charaWork.property[4] = 1; + + charaWork.command[0] = 0xA0F00000 | 21001; + charaWork.command[1] = 0xA0F00000 | 21001; + + charaWork.command[2] = 0xA0F00000 | 21002; + charaWork.command[3] = 0xA0F00000 | 12004; + charaWork.command[4] = 0xA0F00000 | 21005; + charaWork.command[5] = 0xA0F00000 | 21006; + charaWork.command[6] = 0xA0F00000 | 21007; + charaWork.command[7] = 0xA0F00000 | 12009; + charaWork.command[8] = 0xA0F00000 | 12010; + charaWork.command[9] = 0xA0F00000 | 12005; + charaWork.command[10] = 0xA0F00000 | 12007; + charaWork.command[11] = 0xA0F00000 | 12011; + charaWork.command[12] = 0xA0F00000 | 22012; + charaWork.command[13] = 0xA0F00000 | 22013; + charaWork.command[14] = 0xA0F00000 | 29497; + charaWork.command[15] = 0xA0F00000 | 22015; + + charaWork.command[32] = 0xA0F00000 | 27191; + charaWork.command[33] = 0xA0F00000 | 22302; + charaWork.command[34] = 0xA0F00000 | 28466; + + charaWork.commandAcquired[27150 - 26000] = true; + + playerWork.questScenarioComplete[110001 - 110001] = true; + playerWork.questGuildleveComplete[120050 - 120001] = true; + + for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++ ) + charaWork.additionalCommandAcquired[i] = true; + + for (int i = 0; i < charaWork.commandCategory.Length; i++) + charaWork.commandCategory[i] = 1; + + charaWork.battleTemp.generalParameter[3] = 1; + + charaWork.eventSave.bazaarTax = 5; + charaWork.battleSave.potencial = 6.6f; + + charaWork.commandCategory[0] = 1; + charaWork.commandCategory[1] = 1; + charaWork.commandCategory[32] = 1; + charaWork.commandCategory[33] = 1; + charaWork.commandCategory[34] = 1; + + charaWork.parameterSave.commandSlot_compatibility[0] = true; + charaWork.parameterSave.commandSlot_compatibility[1] = true; + charaWork.parameterSave.commandSlot_compatibility[32] = true; + + charaWork.commandBorder = 0x20; + + charaWork.parameterTemp.tp = 3000; + + Database.LoadPlayerCharacter(this); + lastPlayTimeUpdate = Utils.UnixTimeStampUTC(); + } + + public List Create0x132Packets(uint playerActorId) + { + List packets = new List(); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xB, "commandForced")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0xA, "commandDefault")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandWeak")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x4, "commandContent")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x6, "commandJudgeMode")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "commandRequest")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "widgetCreate")); + packets.Add(_0x132Packet.BuildPacket(playerActorId, 0x100, "macroRequest")); + return packets; + } + + /* + * PLAYER ARGS: + * Unknown - Bool + * Unknown - Bool + * Is Init Director - Bool + * Unknown - Bool + * Unknown - Number + * Unknown - Bool + * Timer Array - 20 Number + */ + + public override SubPacket CreateScriptBindPacket(uint playerActorId) + { + List lParams; + if (IsMyPlayer(playerActorId)) + { + if (loginInitDirector != null) + lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, true, loginInitDirector, true, 0, false, timers, true); + else + lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", true, false, false, true, 0, false, timers, true); + } + else + lParams = LuaUtils.CreateLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true); + + ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams).DebugPrintSubPacket(); + + return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams); + } + + public override BasePacket GetSpawnPackets(uint playerActorId, ushort spawnType) + { + List subpackets = new List(); + subpackets.Add(CreateAddActorPacket(playerActorId, 8)); + if (IsMyPlayer(playerActorId)) + subpackets.AddRange(Create0x132Packets(playerActorId)); + subpackets.Add(CreateSpeedPacket(playerActorId)); + subpackets.Add(CreateSpawnPositonPacket(playerActorId, spawnType)); + subpackets.Add(CreateAppearancePacket(playerActorId)); + subpackets.Add(CreateNamePacket(playerActorId)); + subpackets.Add(_0xFPacket.BuildPacket(playerActorId, playerActorId)); + subpackets.Add(CreateStatePacket(playerActorId)); + subpackets.Add(CreateIdleAnimationPacket(playerActorId)); + subpackets.Add(CreateInitStatusPacket(playerActorId)); + subpackets.Add(CreateSetActorIconPacket(playerActorId)); + subpackets.Add(CreateIsZoneingPacket(playerActorId)); + subpackets.AddRange(CreatePlayerRelatedPackets(playerActorId)); + subpackets.Add(CreateScriptBindPacket(playerActorId)); + return BasePacket.CreatePacket(subpackets, true, false); + } + + public List CreatePlayerRelatedPackets(uint playerActorId) + { + List subpackets = new List(); + + if (gcCurrent != 0) + subpackets.Add(SetGrandCompanyPacket.BuildPacket(actorId, playerActorId, gcCurrent, gcRankLimsa, gcRankGridania, gcRankUldah)); + + if (currentTitle != 0) + subpackets.Add(SetPlayerTitlePacket.BuildPacket(actorId, playerActorId, currentTitle)); + + if (currentJob != 0) + subpackets.Add(SetCurrentJobPacket.BuildPacket(actorId, playerActorId, currentJob)); + + if (IsMyPlayer(playerActorId)) + { + subpackets.Add(_0x196Packet.BuildPacket(playerActorId, playerActorId)); + + if (hasChocobo && chocoboName != null && !chocoboName.Equals("")) + { + subpackets.Add(SetChocoboNamePacket.BuildPacket(actorId, playerActorId, chocoboName)); + subpackets.Add(SetHasChocoboPacket.BuildPacket(playerActorId, hasChocobo)); + } + + if (hasGoobbue) + subpackets.Add(SetHasGoobbuePacket.BuildPacket(playerActorId, hasGoobbue)); + + subpackets.Add(SetAchievementPointsPacket.BuildPacket(playerActorId, achievementPoints)); + subpackets.Add(Database.GetLatestAchievements(this)); + subpackets.Add(Database.GetAchievementsPacket(this)); + } + + return subpackets; + } + + public override BasePacket GetInitPackets(uint playerActorId) + { + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("/_init", this, playerActorId); + + propPacketUtil.AddProperty("charaWork.eventSave.bazaarTax"); + propPacketUtil.AddProperty("charaWork.battleSave.potencial"); + + //Properties + for (int i = 0; i < charaWork.property.Length; i++) + { + if (charaWork.property[i] != 0) + propPacketUtil.AddProperty(String.Format("charaWork.property[{0}]", i)); + } + + //Parameters + propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]"); + propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]"); + propPacketUtil.AddProperty("charaWork.parameterSave.mp"); + propPacketUtil.AddProperty("charaWork.parameterSave.mpMax"); + propPacketUtil.AddProperty("charaWork.parameterTemp.tp"); + propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); + propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); + + //Status Times + for (int i = 0; i < charaWork.statusShownTime.Length; i++) + { + if (charaWork.statusShownTime[i] != 0xFFFFFFFF) + propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i)); + } + + //General Parameters + for (int i = 3; i < charaWork.battleTemp.generalParameter.Length; i++) + { + if (charaWork.battleTemp.generalParameter[i] != 0) + propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.generalParameter[{0}]", i)); + } + + propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[0]"); + propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[1]"); + + //Battle Save Skillpoint + + //Commands + propPacketUtil.AddProperty("charaWork.commandBorder"); + + + for (int i = 0; i < charaWork.command.Length; i++) + { + if (charaWork.command[i] != 0) + propPacketUtil.AddProperty(String.Format("charaWork.command[{0}]", i)); + } + + + for (int i = 0; i < charaWork.commandCategory.Length; i++) + { + charaWork.commandCategory[i] = 1; + if (charaWork.commandCategory[i] != 0) + propPacketUtil.AddProperty(String.Format("charaWork.commandCategory[{0}]", i)); + } + + for (int i = 0; i < charaWork.commandAcquired.Length; i++) + { + if (charaWork.commandAcquired[i] != false) + propPacketUtil.AddProperty(String.Format("charaWork.commandAcquired[{0}]", i)); + } + + + for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++) + { + if (charaWork.additionalCommandAcquired[i] != false) + propPacketUtil.AddProperty(String.Format("charaWork.additionalCommandAcquired[{0}]", i)); + } + + for (int i = 0; i < charaWork.parameterSave.commandSlot_compatibility.Length; i++) + { + charaWork.parameterSave.commandSlot_compatibility[i] = true; + if (charaWork.parameterSave.commandSlot_compatibility[i]) + propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_compatibility[{0}]", i)); + } + + /* + for (int i = 0; i < charaWork.parameterSave.commandSlot_recastTime.Length; i++) + { + if (charaWork.parameterSave.commandSlot_recastTime[i] != 0) + propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_recastTime[{0}]", i)); + } + */ + + //System + propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[0]"); + propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[1]"); + propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[0]"); + propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[1]"); + + charaWork.parameterTemp.otherClassAbilityCount[0] = 4; + charaWork.parameterTemp.otherClassAbilityCount[1] = 5; + charaWork.parameterTemp.giftCount[1] = 5; + + propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[0]"); + propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[1]"); + propPacketUtil.AddProperty("charaWork.parameterTemp.giftCount[1]"); + + propPacketUtil.AddProperty("charaWork.depictionJudge"); + + //Scenario + for (int i = 0; i < playerWork.questScenario.Length; i++) + { + if (playerWork.questScenario[i] != 0) + propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", i)); + } + + //Guildleve - Local + for (int i = 0; i < playerWork.questGuildleve.Length; i++) + { + if (playerWork.questGuildleve[i] != 0) + propPacketUtil.AddProperty(String.Format("playerWork.questGuildleve[{0}]", i)); + } + + //Guildleve - Regional + for (int i = 0; i < work.guildleveId.Length; i++) + { + if (work.guildleveId[i] != 0) + propPacketUtil.AddProperty(String.Format("work.guildleveId[{0}]", i)); + if (work.guildleveDone[i] != false) + propPacketUtil.AddProperty(String.Format("work.guildleveDone[{0}]", i)); + if (work.guildleveChecked[i] != false) + propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i)); + } + + //NPC Linkshell + for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++) + { + if (playerWork.npcLinkshellChatCalling[i] != false) + propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatCalling[{0}]", i)); + if (playerWork.npcLinkshellChatExtra[i] != false) + propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatExtra[{0}]", i)); + } + + propPacketUtil.AddProperty("playerWork.restBonusExpRate"); + + //Profile + propPacketUtil.AddProperty("playerWork.tribe"); + propPacketUtil.AddProperty("playerWork.guardian"); + propPacketUtil.AddProperty("playerWork.birthdayMonth"); + propPacketUtil.AddProperty("playerWork.birthdayDay"); + propPacketUtil.AddProperty("playerWork.initialTown"); + + return BasePacket.CreatePacket(propPacketUtil.Done(), true, false); } - public override BasePacket GetSpawnPackets(uint playerActorId, ushort spawnType) - { - List subpackets = new List(); - subpackets.Add(CreateAddActorPacket(playerActorId, 8)); - if (IsMyPlayer(playerActorId)) - subpackets.AddRange(Create0x132Packets(playerActorId)); - subpackets.Add(CreateSpeedPacket(playerActorId)); - subpackets.Add(CreateSpawnPositonPacket(playerActorId, spawnType)); - subpackets.Add(CreateAppearancePacket(playerActorId)); - subpackets.Add(CreateNamePacket(playerActorId)); - subpackets.Add(_0xFPacket.BuildPacket(playerActorId, playerActorId)); - subpackets.Add(CreateStatePacket(playerActorId)); - subpackets.Add(CreateIdleAnimationPacket(playerActorId)); - subpackets.Add(CreateInitStatusPacket(playerActorId)); - subpackets.Add(CreateSetActorIconPacket(playerActorId)); - subpackets.Add(CreateIsZoneingPacket(playerActorId)); - subpackets.AddRange(CreatePlayerRelatedPackets(playerActorId)); - subpackets.Add(CreateScriptBindPacket(playerActorId)); - return BasePacket.CreatePacket(subpackets, true, false); - } - - public List CreatePlayerRelatedPackets(uint playerActorId) - { - List subpackets = new List(); - - if (gcCurrent != 0) - subpackets.Add(SetGrandCompanyPacket.BuildPacket(actorId, playerActorId, gcCurrent, gcRankLimsa, gcRankGridania, gcRankUldah)); - - if (currentTitle != 0) - subpackets.Add(SetPlayerTitlePacket.BuildPacket(actorId, playerActorId, currentTitle)); - - if (currentJob != 0) - subpackets.Add(SetCurrentJobPacket.BuildPacket(actorId, playerActorId, currentJob)); - - if (IsMyPlayer(playerActorId)) - { - subpackets.Add(_0x196Packet.BuildPacket(playerActorId, playerActorId)); - - if (hasChocobo && chocoboName != null && !chocoboName.Equals("")) - { - subpackets.Add(SetChocoboNamePacket.BuildPacket(actorId, playerActorId, chocoboName)); - subpackets.Add(SetHasChocoboPacket.BuildPacket(playerActorId, hasChocobo)); - } - - if (hasGoobbue) - subpackets.Add(SetHasGoobbuePacket.BuildPacket(playerActorId, hasGoobbue)); - - subpackets.Add(SetAchievementPointsPacket.BuildPacket(playerActorId, achievementPoints)); - subpackets.Add(Database.GetLatestAchievements(this)); - subpackets.Add(Database.GetAchievementsPacket(this)); - } - - return subpackets; - } - - public override BasePacket GetInitPackets(uint playerActorId) - { - ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("/_init", this, playerActorId); - - propPacketUtil.AddProperty("charaWork.eventSave.bazaarTax"); - propPacketUtil.AddProperty("charaWork.battleSave.potencial"); - - //Properties - for (int i = 0; i < charaWork.property.Length; i++) - { - if (charaWork.property[i] != 0) - propPacketUtil.AddProperty(String.Format("charaWork.property[{0}]", i)); - } - - //Parameters - propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]"); - propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]"); - propPacketUtil.AddProperty("charaWork.parameterSave.mp"); - propPacketUtil.AddProperty("charaWork.parameterSave.mpMax"); - propPacketUtil.AddProperty("charaWork.parameterTemp.tp"); - propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); - propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); - - //Status Times - for (int i = 0; i < charaWork.statusShownTime.Length; i++) - { - if (charaWork.statusShownTime[i] != 0xFFFFFFFF) - propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i)); - } - - //General Parameters - for (int i = 3; i < charaWork.battleTemp.generalParameter.Length; i++) - { - if (charaWork.battleTemp.generalParameter[i] != 0) - propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.generalParameter[{0}]", i)); - } - - propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[0]"); - propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[1]"); - - //Battle Save Skillpoint - - //Commands - propPacketUtil.AddProperty("charaWork.commandBorder"); - - - for (int i = 0; i < charaWork.command.Length; i++) - { - if (charaWork.command[i] != 0) - propPacketUtil.AddProperty(String.Format("charaWork.command[{0}]", i)); - } - - - for (int i = 0; i < charaWork.commandCategory.Length; i++) - { - charaWork.commandCategory[i] = 1; - if (charaWork.commandCategory[i] != 0) - propPacketUtil.AddProperty(String.Format("charaWork.commandCategory[{0}]", i)); - } - - for (int i = 0; i < charaWork.commandAcquired.Length; i++) - { - if (charaWork.commandAcquired[i] != false) - propPacketUtil.AddProperty(String.Format("charaWork.commandAcquired[{0}]", i)); - } - - - for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++) - { - if (charaWork.additionalCommandAcquired[i] != false) - propPacketUtil.AddProperty(String.Format("charaWork.additionalCommandAcquired[{0}]", i)); - } - - for (int i = 0; i < charaWork.parameterSave.commandSlot_compatibility.Length; i++) - { - charaWork.parameterSave.commandSlot_compatibility[i] = true; - if (charaWork.parameterSave.commandSlot_compatibility[i]) - propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_compatibility[{0}]", i)); - } - - /* - for (int i = 0; i < charaWork.parameterSave.commandSlot_recastTime.Length; i++) - { - if (charaWork.parameterSave.commandSlot_recastTime[i] != 0) - propPacketUtil.AddProperty(String.Format("charaWork.parameterSave.commandSlot_recastTime[{0}]", i)); - } - */ - - //System - propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[0]"); - propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_float_forClientSelf[1]"); - propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[0]"); - propPacketUtil.AddProperty("charaWork.parameterTemp.forceControl_int16_forClientSelf[1]"); - - charaWork.parameterTemp.otherClassAbilityCount[0] = 4; - charaWork.parameterTemp.otherClassAbilityCount[1] = 5; - charaWork.parameterTemp.giftCount[1] = 5; - - propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[0]"); - propPacketUtil.AddProperty("charaWork.parameterTemp.otherClassAbilityCount[1]"); - propPacketUtil.AddProperty("charaWork.parameterTemp.giftCount[1]"); - - propPacketUtil.AddProperty("charaWork.depictionJudge"); - - //Scenario - for (int i = 0; i < playerWork.questScenario.Length; i++) - { - if (playerWork.questScenario[i] != 0) - propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", i)); - } - - //Guildleve - Local - for (int i = 0; i < playerWork.questGuildleve.Length; i++) - { - if (playerWork.questGuildleve[i] != 0) - propPacketUtil.AddProperty(String.Format("playerWork.questGuildleve[{0}]", i)); - } - - //Guildleve - Regional - for (int i = 0; i < work.guildleveId.Length; i++) - { - if (work.guildleveId[i] != 0) - propPacketUtil.AddProperty(String.Format("work.guildleveId[{0}]", i)); - if (work.guildleveDone[i] != false) - propPacketUtil.AddProperty(String.Format("work.guildleveDone[{0}]", i)); - if (work.guildleveChecked[i] != false) - propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i)); - } - - //NPC Linkshell - for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++) - { - if (playerWork.npcLinkshellChatCalling[i] != false) - propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatCalling[{0}]", i)); - if (playerWork.npcLinkshellChatExtra[i] != false) - propPacketUtil.AddProperty(String.Format("playerWork.npcLinkshellChatExtra[{0}]", i)); - } - - propPacketUtil.AddProperty("playerWork.restBonusExpRate"); - - //Profile - propPacketUtil.AddProperty("playerWork.tribe"); - propPacketUtil.AddProperty("playerWork.guardian"); - propPacketUtil.AddProperty("playerWork.birthdayMonth"); - propPacketUtil.AddProperty("playerWork.birthdayDay"); - propPacketUtil.AddProperty("playerWork.initialTown"); - - return BasePacket.CreatePacket(propPacketUtil.Done(), true, false); - } - public void SendSeamlessZoneInPackets() { QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, SetMusicPacket.EFFECT_FADEIN)); QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1)); - } - - public void SendZoneInPackets(WorldManager world, ushort spawnType) - { - QueuePacket(SetActorIsZoningPacket.BuildPacket(actorId, actorId, false)); - QueuePacket(_0x10Packet.BuildPacket(actorId, 0xFF)); - QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, 0x01)); - QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1)); - - QueuePacket(SetMapPacket.BuildPacket(actorId, zone.regionId, zone.actorId)); - - QueuePacket(GetSpawnPackets(actorId, spawnType)); - //GetSpawnPackets(actorId, spawnType).DebugPrintPacket(); - - #region Inventory & Equipment - QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); - inventories[Inventory.NORMAL].SendFullInventory(); - inventories[Inventory.CURRENCY].SendFullInventory(); - inventories[Inventory.KEYITEMS].SendFullInventory(); - inventories[Inventory.BAZAAR].SendFullInventory(); - inventories[Inventory.MELDREQUEST].SendFullInventory(); - inventories[Inventory.LOOT].SendFullInventory(); - equipment.SendFullEquipment(false); - playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId), true, false); - #endregion - - playerSession.QueuePacket(GetInitPackets(actorId)); - - BasePacket areaMasterSpawn = zone.GetSpawnPackets(actorId); - BasePacket debugSpawn = world.GetDebugActor().GetSpawnPackets(actorId); + } + + public void SendZoneInPackets(WorldManager world, ushort spawnType) + { + QueuePacket(SetActorIsZoningPacket.BuildPacket(actorId, actorId, false)); + QueuePacket(_0x10Packet.BuildPacket(actorId, 0xFF)); + QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, 0x01)); + QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1)); + + QueuePacket(SetMapPacket.BuildPacket(actorId, zone.regionId, zone.actorId)); + + QueuePacket(GetSpawnPackets(actorId, spawnType)); + //GetSpawnPackets(actorId, spawnType).DebugPrintPacket(); + + #region Inventory & Equipment + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + inventories[Inventory.NORMAL].SendFullInventory(); + inventories[Inventory.CURRENCY].SendFullInventory(); + inventories[Inventory.KEYITEMS].SendFullInventory(); + inventories[Inventory.BAZAAR].SendFullInventory(); + inventories[Inventory.MELDREQUEST].SendFullInventory(); + inventories[Inventory.LOOT].SendFullInventory(); + equipment.SendFullEquipment(false); + playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId), true, false); + #endregion + + playerSession.QueuePacket(GetInitPackets(actorId)); + + BasePacket areaMasterSpawn = zone.GetSpawnPackets(actorId); + BasePacket debugSpawn = world.GetDebugActor().GetSpawnPackets(actorId); BasePacket worldMasterSpawn = world.GetActor().GetSpawnPackets(actorId); - - playerSession.QueuePacket(areaMasterSpawn); - playerSession.QueuePacket(debugSpawn); - playerSession.QueuePacket(worldMasterSpawn); - - if (zone.isInn) - { - SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket(); - for (int i = 0; i < 2048; i++) - cutsceneBookPacket.cutsceneFlags[i] = true; - - SubPacket packet = cutsceneBookPacket.BuildPacket(actorId, "", 11, 1, 1); - - packet.DebugPrintSubPacket(); - QueuePacket(packet); + + playerSession.QueuePacket(areaMasterSpawn); + playerSession.QueuePacket(debugSpawn); + playerSession.QueuePacket(worldMasterSpawn); + + if (zone.isInn) + { + SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket(); + for (int i = 0; i < 2048; i++) + cutsceneBookPacket.cutsceneFlags[i] = true; + + SubPacket packet = cutsceneBookPacket.BuildPacket(actorId, "", 11, 1, 1); + + packet.DebugPrintSubPacket(); + QueuePacket(packet); } if (zone.GetWeatherDirector() != null) @@ -527,59 +541,60 @@ namespace FFXIVClassic_Map_Server.Actors playerSession.QueuePacket(weatherDirectorSpawn); } + foreach (Director director in ownedDirectors) { director.GetSpawnPackets(actorId).DebugPrintPacket(); QueuePacket(director.GetSpawnPackets(actorId)); QueuePacket(director.GetInitPackets(actorId)); //QueuePacket(director.GetSetEventStatusPackets(actorId)); - } - - } - - private void SendRemoveInventoryPackets(List slots) - { - int currentIndex = 0; - - while (true) - { - if (slots.Count - currentIndex >= 64) - QueuePacket(InventoryRemoveX64Packet.BuildPacket(actorId, slots, ref currentIndex)); - else if (slots.Count - currentIndex >= 32) - QueuePacket(InventoryRemoveX32Packet.BuildPacket(actorId, slots, ref currentIndex)); - else if (slots.Count - currentIndex >= 16) - QueuePacket(InventoryRemoveX16Packet.BuildPacket(actorId, slots, ref currentIndex)); - else if (slots.Count - currentIndex >= 8) - QueuePacket(InventoryRemoveX08Packet.BuildPacket(actorId, slots, ref currentIndex)); - else if (slots.Count - currentIndex == 1) - QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, slots[currentIndex])); - else - break; - } - - } - - public bool IsMyPlayer(uint otherActorId) - { - return actorId == otherActorId; - } - - public void QueuePacket(BasePacket packet) - { - playerSession.QueuePacket(packet); - } - - public void QueuePacket(SubPacket packet) - { - playerSession.QueuePacket(packet, true, false); - } - - public void QueuePackets(List packets) - { - foreach (SubPacket subpacket in packets) - playerSession.QueuePacket(subpacket, true, false); - } - + } + + } + + private void SendRemoveInventoryPackets(List slots) + { + int currentIndex = 0; + + while (true) + { + if (slots.Count - currentIndex >= 64) + QueuePacket(InventoryRemoveX64Packet.BuildPacket(actorId, slots, ref currentIndex)); + else if (slots.Count - currentIndex >= 32) + QueuePacket(InventoryRemoveX32Packet.BuildPacket(actorId, slots, ref currentIndex)); + else if (slots.Count - currentIndex >= 16) + QueuePacket(InventoryRemoveX16Packet.BuildPacket(actorId, slots, ref currentIndex)); + else if (slots.Count - currentIndex >= 8) + QueuePacket(InventoryRemoveX08Packet.BuildPacket(actorId, slots, ref currentIndex)); + else if (slots.Count - currentIndex == 1) + QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, slots[currentIndex])); + else + break; + } + + } + + public bool IsMyPlayer(uint otherActorId) + { + return actorId == otherActorId; + } + + public void QueuePacket(BasePacket packet) + { + playerSession.QueuePacket(packet); + } + + public void QueuePacket(SubPacket packet) + { + playerSession.QueuePacket(packet, true, false); + } + + public void QueuePackets(List packets) + { + foreach (SubPacket subpacket in packets) + playerSession.QueuePacket(subpacket, true, false); + } + public void SendPacket(string path) { try @@ -593,57 +608,57 @@ namespace FFXIVClassic_Map_Server.Actors { this.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "[SendPacket]", "Unable to send packet."); } - } - - public void BroadcastPacket(SubPacket packet, bool sendToSelf) - { - foreach (Actor a in playerSession.actorInstanceList) - { - if (a is Player) - { + } + + public void BroadcastPacket(SubPacket packet, bool sendToSelf) + { + foreach (Actor a in playerSession.actorInstanceList) + { + if (a is Player) + { Player p = (Player)a; if (p.Equals(this) && !sendToSelf) - continue; - - SubPacket clonedPacket = new SubPacket(packet, a.actorId); - p.QueuePacket(clonedPacket); - } - } - } - - public void SetDCFlag(bool flag) - { - if (flag) - { - BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.DISCONNECTING), true); - } - else - { - if (isGM) - BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.ISGM), true); - else - BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, 0), true); - } - } - - public void CleanupAndSave() + continue; + + SubPacket clonedPacket = new SubPacket(packet, a.actorId); + p.QueuePacket(clonedPacket); + } + } + } + + public void SetDCFlag(bool flag) { - playerSession.LockUpdates(true); - - //Remove actor from zone and main server list - zone.RemoveActorFromZone(this); - + if (flag) + { + BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.DISCONNECTING), true); + } + else + { + if (isGM) + BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, SetActorIconPacket.ISGM), true); + else + BroadcastPacket(SetActorIconPacket.BuildPacket(actorId, actorId, 0), true); + } + } + + public void CleanupAndSave() + { + playerSession.LockUpdates(true); + + //Remove actor from zone and main server list + zone.RemoveActorFromZone(this); + //Set Destination to 0 this.destinationZone = 0; - this.destinationSpawnType = 0; - - //Clean up parties - RemoveFromCurrentPartyAndCleanup(); - - //Save Player - Database.SavePlayerPlayTime(this); - Database.SavePlayerPosition(this); + this.destinationSpawnType = 0; + + //Clean up parties + RemoveFromCurrentPartyAndCleanup(); + + //Save Player + Database.SavePlayerPlayTime(this); + Database.SavePlayerPosition(this); } public void CleanupAndSave(uint destinationZone, ushort spawnType, float destinationX, float destinationY, float destinationZ, float destinationRot) @@ -667,450 +682,489 @@ namespace FFXIVClassic_Map_Server.Actors //Save Player Database.SavePlayerPlayTime(this); Database.SavePlayerPosition(this); - } - - public Area GetZone() - { - return zone; - } - - public void SendMessage(uint logType, string sender, string message) - { - QueuePacket(SendMessagePacket.BuildPacket(actorId, actorId, logType, sender, message)); - } - - public void Logout() - { - QueuePacket(LogoutPacket.BuildPacket(actorId)); - CleanupAndSave(); - } - - public void QuitGame() - { - QueuePacket(QuitPacket.BuildPacket(actorId)); - CleanupAndSave(); - } - - public uint GetPlayTime(bool doUpdate) - { - if (doUpdate) - { - uint curTime = Utils.UnixTimeStampUTC(); - playTime += curTime - lastPlayTimeUpdate; - lastPlayTimeUpdate = curTime; - } - - return playTime; - } - + } + + public Area GetZone() + { + return zone; + } + + public void SendMessage(uint logType, string sender, string message) + { + QueuePacket(SendMessagePacket.BuildPacket(actorId, actorId, logType, sender, message)); + } + + public void Logout() + { + QueuePacket(LogoutPacket.BuildPacket(actorId)); + CleanupAndSave(); + } + + public void QuitGame() + { + QueuePacket(QuitPacket.BuildPacket(actorId)); + CleanupAndSave(); + } + + public uint GetPlayTime(bool doUpdate) + { + if (doUpdate) + { + uint curTime = Utils.UnixTimeStampUTC(); + playTime += curTime - lastPlayTimeUpdate; + lastPlayTimeUpdate = curTime; + } + + return playTime; + } + public void SavePlayTime() { Database.SavePlayerPlayTime(this); - } - - public void ChangeMusic(ushort musicId) - { - QueuePacket(SetMusicPacket.BuildPacket(actorId, musicId, 1)); - } - - public void SendChocoboAppearance() - { - BroadcastPacket(SetCurrentMountChocoboPacket.BuildPacket(actorId, chocoboAppearance), true); - } - - public void SendGoobbueAppearance() - { - BroadcastPacket(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1), true); - } - - public void SetMountState(byte mountState) - { - this.mountState = mountState; - } - - public byte GetMountState() - { - return mountState; - } - - public void DoEmote(uint emoteId) - { - BroadcastPacket(ActorDoEmotePacket.BuildPacket(actorId, actorId, currentTarget, emoteId), true); - } - - public void SendGameMessage(Actor sourceActor, Actor textIdOwner, ushort textId, byte log, params object[] msgParams) + } + + public void ChangeMusic(ushort musicId) { - if (msgParams == null || msgParams.Length == 0) - { - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log)); - } - else - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams))); - } - - public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, params object[] msgParams) + QueuePacket(SetMusicPacket.BuildPacket(actorId, musicId, 1)); + } + + public void SendChocoboAppearance() { - if (msgParams == null || msgParams.Length == 0) - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log)); - else - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams))); - } - - public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, string customSender, params object[] msgParams) + BroadcastPacket(SetCurrentMountChocoboPacket.BuildPacket(actorId, chocoboAppearance), true); + } + + public void SendGoobbueAppearance() { - if (msgParams == null || msgParams.Length == 0) - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log)); - else - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log, LuaUtils.CreateLuaParamList(msgParams))); - } - - public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, uint displayId, params object[] msgParams) + BroadcastPacket(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1), true); + } + + public void SetMountState(byte mountState) { - if (msgParams == null || msgParams.Length == 0) - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log)); - else - QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams))); - } - - public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams) - { - //SubPacket worldMasterMessage = - //zone.BroadcastPacketAroundActor(this, worldMasterMessage); - } - - public void GraphicChange(uint slot, uint graphicId) - { - appearanceIds[slot] = graphicId; - } - - public void GraphicChange(uint slot, uint weapId, uint equipId, uint variantId, uint colorId) - { - - uint mixedVariantId; - - if (weapId == 0) - mixedVariantId = ((variantId & 0x1F) << 5) | colorId; - else - mixedVariantId = variantId; - - uint graphicId = - (weapId & 0x3FF) << 20 | - (equipId & 0x3FF) << 10 | - (mixedVariantId & 0x3FF); - - appearanceIds[slot] = graphicId; - - } - - public void SendAppearance() - { - BroadcastPacket(CreateAppearancePacket(actorId), true); - } - - public void SendCharaExpInfo() - { - if (lastStep == 0) - { - int maxLength; - if ((sizeof(short) * charaWork.battleSave.skillLevel.Length)-lastPosition < 0x5E) - maxLength = (sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition; - else - maxLength = 0x5E; - - byte[] skillLevelBuffer = new byte[maxLength]; - Buffer.BlockCopy(charaWork.battleSave.skillLevel, 0, skillLevelBuffer, 0, skillLevelBuffer.Length); - SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); - - charaInfo1.SetIsArrayMode(true); - if (maxLength == 0x5E) - { - charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x0); - lastPosition += maxLength; - } - else - { - charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x3); - lastPosition = 0; - lastStep++; - } - - charaInfo1.AddTarget(); - - QueuePacket(charaInfo1.BuildPacket(actorId, actorId)); - } - else if (lastStep == 1) - { - int maxLength; - if ((sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition < 0x5E) - maxLength = (sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition; - else - maxLength = 0x5E; - - byte[] skillCapBuffer = new byte[maxLength]; - Buffer.BlockCopy(charaWork.battleSave.skillLevelCap, lastPosition, skillCapBuffer, 0, skillCapBuffer.Length); - SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); - - - if (maxLength == 0x5E) - { - charaInfo1.SetIsArrayMode(true); - charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x1); - lastPosition += maxLength; - } - else - { - charaInfo1.SetIsArrayMode(false); - charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x3); - lastStep = 0; - lastPosition = 0; - } - - charaInfo1.AddTarget(); - - QueuePacket(charaInfo1.BuildPacket(actorId, actorId)); - } - - } - - public InventoryItem[] GetGearset(ushort classId) - { - return Database.GetEquipment(this, classId); - } - - public void PrepareClassChange(byte classId) - { - //If new class, init abilties and level - - SendCharaExpInfo(); - } - - public void DoClassChange(byte classId) - { - //load hotbars - //Calculate stats - //Calculate hp/mp - - //Get Potenciel ?????? - - //Set HP/MP/TP PARAMS - - //Set mainskill and level - - //Set Parameters - - //Set current EXP - - //Set Hotbar Commands 1 - //Set Hotbar Commands 2 - //Set Hotbar Commands 3 - - //Check if bonus point available... set - - //Set rested EXP - - charaWork.parameterSave.state_mainSkill[0] = classId; - charaWork.parameterSave.state_mainSkillLevel = charaWork.battleSave.skillLevel[classId-1]; - - playerWork.restBonusExpRate = 0.0f; - - ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/stateForAll", this, actorId); - - propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); - propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); - propertyBuilder.NewTarget("playerWork/expBonus"); - propertyBuilder.AddProperty("playerWork.restBonusExpRate"); - - List packets = propertyBuilder.Done(); - - foreach (SubPacket packet in packets) - BroadcastPacket(packet, true); - - Database.SavePlayerCurrentClass(this); - } - - public void GraphicChange(int slot, InventoryItem invItem) - { - if (invItem == null) - appearanceIds[slot] = 0; - else - { - Item item = Server.GetItemGamedata(invItem.itemId); - if (item is EquipmentItem) - { - EquipmentItem eqItem = (EquipmentItem)item; - - uint mixedVariantId; - - if (eqItem.graphicsWeaponId == 0) - mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId; - else - mixedVariantId = eqItem.graphicsVariantId; - - uint graphicId = - (eqItem.graphicsWeaponId & 0x3FF) << 20 | - (eqItem.graphicsEquipmentId & 0x3FF) << 10 | - (mixedVariantId & 0x3FF); - - appearanceIds[slot] = graphicId; - } - } - - Database.SavePlayerAppearance(this); - - BroadcastPacket(CreateAppearancePacket(actorId), true); - } - - public Inventory GetInventory(ushort type) - { - if (inventories.ContainsKey(type)) - return inventories[type]; - else - return null; - } - - public Actor GetActorInInstance(uint actorId) - { - foreach (Actor a in playerSession.actorInstanceList) - { - if (a.actorId == actorId) - return a; - } - - return null; - } - - public void SetZoneChanging(bool flag) - { - isZoneChanging = flag; - } - - public bool IsInZoneChange() - { - return isZoneChanging; - } - - public Equipment GetEquipment() - { - return equipment; - } - - public byte GetInitialTown() - { - return playerWork.initialTown; - } - - public int GetFreeQuestSlot() - { - for (int i = 0; i < questScenario.Length; i++) - { - if (questScenario[i] == null) - return i; - } - - return -1; - } - - public void AddQuest(uint id) - { - Actor actor = Server.GetStaticActors((0xA0F00000 | id)); - AddQuest(actor.actorName); - } - - public void AddQuest(string name) - { - Actor actor = Server.GetStaticActors(name); - - if (actor == null) - return; - - uint id = actor.actorId; - - int freeSlot = GetFreeQuestSlot(); - - if (freeSlot == -1) - return; - - playerWork.questScenario[freeSlot] = id; - questScenario[freeSlot] = new Quest(this, playerWork.questScenario[freeSlot], name, null, 0); - Database.SaveQuest(this, questScenario[freeSlot]); - } - - 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 Quest GetQuest(string name) - { - for (int i = 0; i < questScenario.Length; i++) - { - if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower())) - return questScenario[i]; - } - - return null; - } - - public bool HasQuest(string name) - { - for (int i = 0; i < questScenario.Length; i++) - { - if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower())) - return true; - } - - return false; - } - - 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 int GetQuestSlot(uint id) - { - for (int i = 0; i < questScenario.Length; i++) - { - if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id)) - return i; - } - - return -1; - } - + this.mountState = mountState; + } + + public byte GetMountState() + { + return mountState; + } + + public void DoEmote(uint emoteId) + { + BroadcastPacket(ActorDoEmotePacket.BuildPacket(actorId, actorId, currentTarget, emoteId), true); + } + + public void SendGameMessage(Actor sourceActor, Actor textIdOwner, ushort textId, byte log, params object[] msgParams) + { + if (msgParams == null || msgParams.Length == 0) + { + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log)); + } + else + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, sourceActor.actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams))); + } + + public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, params object[] msgParams) + { + if (msgParams == null || msgParams.Length == 0) + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log)); + else + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, log, LuaUtils.CreateLuaParamList(msgParams))); + } + + public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, string customSender, params object[] msgParams) + { + if (msgParams == null || msgParams.Length == 0) + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log)); + else + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, customSender, log, LuaUtils.CreateLuaParamList(msgParams))); + } + + public void SendGameMessage(Actor textIdOwner, ushort textId, byte log, uint displayId, params object[] msgParams) + { + if (msgParams == null || msgParams.Length == 0) + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log)); + else + QueuePacket(GameMessagePacket.BuildPacket(Server.GetWorldManager().GetActor().actorId, actorId, textIdOwner.actorId, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams))); + } + + public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams) + { + //SubPacket worldMasterMessage = + //zone.BroadcastPacketAroundActor(this, worldMasterMessage); + } + + public void GraphicChange(uint slot, uint graphicId) + { + appearanceIds[slot] = graphicId; + } + + public void GraphicChange(uint slot, uint weapId, uint equipId, uint variantId, uint colorId) + { + + uint mixedVariantId; + + if (weapId == 0) + mixedVariantId = ((variantId & 0x1F) << 5) | colorId; + else + mixedVariantId = variantId; + + uint graphicId = + (weapId & 0x3FF) << 20 | + (equipId & 0x3FF) << 10 | + (mixedVariantId & 0x3FF); + + appearanceIds[slot] = graphicId; + + } + + public void SendAppearance() + { + BroadcastPacket(CreateAppearancePacket(actorId), true); + } + + public void SendCharaExpInfo() + { + if (lastStep == 0) + { + int maxLength; + if ((sizeof(short) * charaWork.battleSave.skillLevel.Length)-lastPosition < 0x5E) + maxLength = (sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition; + else + maxLength = 0x5E; + + byte[] skillLevelBuffer = new byte[maxLength]; + Buffer.BlockCopy(charaWork.battleSave.skillLevel, 0, skillLevelBuffer, 0, skillLevelBuffer.Length); + SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); + + charaInfo1.SetIsArrayMode(true); + if (maxLength == 0x5E) + { + charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x0); + lastPosition += maxLength; + } + else + { + charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x3); + lastPosition = 0; + lastStep++; + } + + charaInfo1.AddTarget(); + + QueuePacket(charaInfo1.BuildPacket(actorId, actorId)); + } + else if (lastStep == 1) + { + int maxLength; + if ((sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition < 0x5E) + maxLength = (sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition; + else + maxLength = 0x5E; + + byte[] skillCapBuffer = new byte[maxLength]; + Buffer.BlockCopy(charaWork.battleSave.skillLevelCap, lastPosition, skillCapBuffer, 0, skillCapBuffer.Length); + SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); + + + if (maxLength == 0x5E) + { + charaInfo1.SetIsArrayMode(true); + charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x1); + lastPosition += maxLength; + } + else + { + charaInfo1.SetIsArrayMode(false); + charaInfo1.AddBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x3); + lastStep = 0; + lastPosition = 0; + } + + charaInfo1.AddTarget(); + + QueuePacket(charaInfo1.BuildPacket(actorId, actorId)); + } + + } + + public InventoryItem[] GetGearset(ushort classId) + { + return Database.GetEquipment(this, classId); + } + + public void PrepareClassChange(byte classId) + { + //If new class, init abilties and level + + SendCharaExpInfo(); + } + + public void DoClassChange(byte classId) + { + //load hotbars + //Calculate stats + //Calculate hp/mp + + //Get Potenciel ?????? + + //Set HP/MP/TP PARAMS + + //Set mainskill and level + + //Set Parameters + + //Set current EXP + + //Set Hotbar Commands 1 + //Set Hotbar Commands 2 + //Set Hotbar Commands 3 + + //Check if bonus point available... set + + //Set rested EXP + + charaWork.parameterSave.state_mainSkill[0] = classId; + charaWork.parameterSave.state_mainSkillLevel = charaWork.battleSave.skillLevel[classId-1]; + + playerWork.restBonusExpRate = 0.0f; + + ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/stateForAll", this, actorId); + + propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); + propertyBuilder.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); + propertyBuilder.NewTarget("playerWork/expBonus"); + propertyBuilder.AddProperty("playerWork.restBonusExpRate"); + + List packets = propertyBuilder.Done(); + + foreach (SubPacket packet in packets) + BroadcastPacket(packet, true); + + Database.SavePlayerCurrentClass(this); + } + + public void GraphicChange(int slot, InventoryItem invItem) + { + if (invItem == null) + appearanceIds[slot] = 0; + else + { + Item item = Server.GetItemGamedata(invItem.itemId); + if (item is EquipmentItem) + { + EquipmentItem eqItem = (EquipmentItem)item; + + uint mixedVariantId; + + if (eqItem.graphicsWeaponId == 0) + mixedVariantId = ((eqItem.graphicsVariantId & 0x1F) << 5) | eqItem.graphicsColorId; + else + mixedVariantId = eqItem.graphicsVariantId; + + uint graphicId = + (eqItem.graphicsWeaponId & 0x3FF) << 20 | + (eqItem.graphicsEquipmentId & 0x3FF) << 10 | + (mixedVariantId & 0x3FF); + + appearanceIds[slot] = graphicId; + } + } + + Database.SavePlayerAppearance(this); + + BroadcastPacket(CreateAppearancePacket(actorId), true); + } + + public Inventory GetInventory(ushort type) + { + if (inventories.ContainsKey(type)) + return inventories[type]; + else + return null; + } + + public Actor GetActorInInstance(uint actorId) + { + foreach (Actor a in playerSession.actorInstanceList) + { + if (a.actorId == actorId) + return a; + } + + return null; + } + + public void SetZoneChanging(bool flag) + { + isZoneChanging = flag; + } + + public bool IsInZoneChange() + { + return isZoneChanging; + } + + public Equipment GetEquipment() + { + return equipment; + } + + public byte GetInitialTown() + { + return playerWork.initialTown; + } + + public int GetFreeQuestSlot() + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] == null) + return i; + } + + return -1; + } + + public void AddQuest(uint id) + { + Actor actor = Server.GetStaticActors((0xA0F00000 | id)); + AddQuest(actor.actorName); + } + + public void AddQuest(string name) + { + Actor actor = Server.GetStaticActors(name); + + if (actor == null) + return; + + uint id = actor.actorId; + + int freeSlot = GetFreeQuestSlot(); + + if (freeSlot == -1) + return; + + playerWork.questScenario[freeSlot] = id; + questScenario[freeSlot] = new Quest(this, playerWork.questScenario[freeSlot], name, null, 0); + Database.SaveQuest(this, questScenario[freeSlot]); + SendQuestClientUpdate(freeSlot); + } + + public void RemoveQuest(uint id) + { + if (HasQuest(id)) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorId == id) + { + questScenario[i] = null; + Database.SaveQuest(this, questScenario[i]); + SendQuestClientUpdate(i); + break; + } + } + } + } + + public void ReplaceQuest(uint oldId, uint newId) + { + if (HasQuest(oldId)) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].GetQuestId() == oldId) + { + Actor actor = Server.GetStaticActors((0xA0F00000 | newId)); + playerWork.questScenario[i] = (0xA0F00000 | newId); + questScenario[i] = new Quest(this, playerWork.questScenario[i], actor.actorName, null, 0); + Database.SaveQuest(this, questScenario[i]); + SendQuestClientUpdate(i); + break; + } + } + } + } + + 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 Quest GetQuest(string name) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower())) + return questScenario[i]; + } + + return null; + } + + public bool HasQuest(string name) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower())) + return true; + } + + return false; + } + + 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 int GetQuestSlot(uint id) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id)) + return i; + } + + return -1; + } + + private void SendQuestClientUpdate(int slot) + { + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("playerWork/journal", this, actorId); + propPacketUtil.AddProperty(String.Format("playerWork.questScenario[{0}]", slot)); + QueuePackets(propPacketUtil.Done()); + } + public void SetLoginDirector(Director director) { if (ownedDirectors.Contains(director)) loginInitDirector = director; - } - - public void AddDirector(Director director) + } + + public void AddDirector(Director director) { if (!ownedDirectors.Contains(director)) { ownedDirectors.Add(director); director.AddChild(this); - - //director.GetSpawnPackets(actorId).DebugPrintPacket(); - - //QueuePacket(director.GetSpawnPackets(actorId)); - //QueuePacket(director.GetInitPackets(actorId)); //QueuePacket(director.GetSetEventStatusPackets(actorId)); - } - } - + } + } + public void RemoveDirector(Director director) { if (!ownedDirectors.Contains(director)) @@ -1118,17 +1172,17 @@ namespace FFXIVClassic_Map_Server.Actors ownedDirectors.Remove(director); director.RemoveChild(this); } - } - - public Director GetDirector(string directorName) - { + } + + public Director GetDirector(string directorName) + { foreach (Director d in ownedDirectors) { - if (d.className.Equals(directorName)) + if (d.GetScriptPath().Equals(directorName)) return d; } - return null; + return null; } public Director GetDirector(uint id) @@ -1140,61 +1194,61 @@ namespace FFXIVClassic_Map_Server.Actors } return null; - } - - public void ExaminePlayer(Actor examinee) - { - Player toBeExamined; - if (examinee is Player) - toBeExamined = (Player)examinee; - else - return; - - QueuePacket(InventoryBeginChangePacket.BuildPacket(toBeExamined.actorId, actorId)); - toBeExamined.GetEquipment().SendCheckEquipmentToPlayer(this); - QueuePacket(InventoryEndChangePacket.BuildPacket(toBeExamined.actorId, actorId)); - } - - public void SendRequestedInfo(params object[] parameters) - { - List lParams = LuaUtils.CreateLuaParamList(parameters); - SubPacket spacket = InfoRequestResponsePacket.BuildPacket(actorId, actorId, lParams); - spacket.DebugPrintSubPacket(); - QueuePacket(spacket); - } - - public void StartEvent(Actor owner, EventStartPacket start) - { - //Have to do this to combine LuaParams - List objects = new List(); - objects.Add(this); - objects.Add(owner); - objects.Add(start.triggerName); - - if (start.luaParams != null) - objects.AddRange(LuaUtils.CreateLuaParamObjectList(start.luaParams)); - - if (owner is Npc) - { - currentEventRunning = ((Npc)owner).GetEventStartCoroutine(this); - - if (currentEventRunning != null) - { - try - { - currentEventRunning.Resume(objects.ToArray()); - } - catch (ScriptRuntimeException e) - { - Program.Log.Error("[LUA] {0}", e.DecoratedMessage); - EndEvent(); - } - } - else - { - EndEvent(); - } - } + } + + public void ExaminePlayer(Actor examinee) + { + Player toBeExamined; + if (examinee is Player) + toBeExamined = (Player)examinee; + else + return; + + QueuePacket(InventoryBeginChangePacket.BuildPacket(toBeExamined.actorId, actorId)); + toBeExamined.GetEquipment().SendCheckEquipmentToPlayer(this); + QueuePacket(InventoryEndChangePacket.BuildPacket(toBeExamined.actorId, actorId)); + } + + public void SendRequestedInfo(params object[] parameters) + { + List lParams = LuaUtils.CreateLuaParamList(parameters); + SubPacket spacket = InfoRequestResponsePacket.BuildPacket(actorId, actorId, lParams); + spacket.DebugPrintSubPacket(); + QueuePacket(spacket); + } + + public void StartEvent(Actor owner, EventStartPacket start) + { + //Have to do this to combine LuaParams + List objects = new List(); + objects.Add(this); + objects.Add(owner); + objects.Add(start.triggerName); + + if (start.luaParams != null) + objects.AddRange(LuaUtils.CreateLuaParamObjectList(start.luaParams)); + + if (owner is Npc) + { + currentEventRunning = ((Npc)owner).GetEventStartCoroutine(this); + + if (currentEventRunning != null) + { + try + { + currentEventRunning.Resume(objects.ToArray()); + } + catch (ScriptRuntimeException e) + { + Program.Log.Error("[LUA] {0}", e.DecoratedMessage); + EndEvent(); + } + } + else + { + EndEvent(); + } + } else if (owner is Director) { currentEventRunning = ((Director)owner).GetEventStartCoroutine(this); @@ -1215,103 +1269,103 @@ namespace FFXIVClassic_Map_Server.Actors { EndEvent(); } - } - else - { - currentEventRunning = LuaEngine.DoActorOnEventStarted(this, owner, start); - - if (currentEventRunning != null) - { - try - { - currentEventRunning.Resume(objects.ToArray()); - } - catch (ScriptRuntimeException e) - { - Program.Log.Error("[LUA] {0}", e.DecoratedMessage); - EndEvent(); - } - } - else - { - EndEvent(); - } - } - - } - - public void UpdateEvent(EventUpdatePacket update) - { - if (currentEventRunning == null) - return; - - if (currentEventRunning.State == CoroutineState.Suspended) - { - try - { - currentEventRunning.Resume(LuaUtils.CreateLuaParamObjectList(update.luaParams)); - } - catch (ScriptRuntimeException e) - { - Program.Log.Error("[LUA] {0}", e.DecoratedMessage); - EndEvent(); - } - } - } - - 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(packets.send.actor.events.SetEventStatus.BuildPacket(actorId, actor.actorId, enabled, unknown, conditionName)); - } - - public void RunEventFunction(string functionName, params object[] parameters) - { - List lParams = LuaUtils.CreateLuaParamList(parameters); - SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, currentEventOwner, currentEventName, functionName, lParams); - spacket.DebugPrintSubPacket(); - QueuePacket(spacket); - } - - public void EndEvent() - { - SubPacket p = EndEventPacket.BuildPacket(actorId, currentEventOwner, currentEventName); - p.DebugPrintSubPacket(); - QueuePacket(p); - - currentEventOwner = 0; - currentEventName = ""; - currentEventRunning = null; - } - - public void SendInstanceUpdate() + } + else + { + currentEventRunning = LuaEngine.DoActorOnEventStarted(this, owner, start); + + if (currentEventRunning != null) + { + try + { + currentEventRunning.Resume(objects.ToArray()); + } + catch (ScriptRuntimeException e) + { + Program.Log.Error("[LUA] {0}", e.DecoratedMessage); + EndEvent(); + } + } + else + { + EndEvent(); + } + } + + } + + public void UpdateEvent(EventUpdatePacket update) { - Server.GetWorldManager().SeamlessCheck(this); - + if (currentEventRunning == null) + return; + + if (currentEventRunning.State == CoroutineState.Suspended) + { + try + { + currentEventRunning.Resume(LuaUtils.CreateLuaParamObjectList(update.luaParams)); + } + catch (ScriptRuntimeException e) + { + Program.Log.Error("[LUA] {0}", e.DecoratedMessage); + EndEvent(); + } + } + } + + 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(packets.send.actor.events.SetEventStatus.BuildPacket(actorId, actor.actorId, enabled, unknown, conditionName)); + } + + public void RunEventFunction(string functionName, params object[] parameters) + { + List lParams = LuaUtils.CreateLuaParamList(parameters); + SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, currentEventOwner, currentEventName, functionName, lParams); + spacket.DebugPrintSubPacket(); + QueuePacket(spacket); + } + + public void EndEvent() + { + SubPacket p = EndEventPacket.BuildPacket(actorId, currentEventOwner, currentEventName); + p.DebugPrintSubPacket(); + QueuePacket(p); + + currentEventOwner = 0; + currentEventName = ""; + currentEventRunning = null; + } + + public void SendInstanceUpdate() + { + Server.GetWorldManager().SeamlessCheck(this); + //Update Instance List aroundMe = new List(); aroundMe.AddRange(zone.GetActorsAroundActor(this, 50)); if (zone2 != null) aroundMe.AddRange(zone2.GetActorsAroundActor(this, 50)); - playerSession.UpdateInstance(aroundMe); - } - + playerSession.UpdateInstance(aroundMe); + } + public bool IsInParty() { return currentParty != null; - } - + } + public bool IsPartyLeader() { if (IsInParty()) @@ -1327,8 +1381,8 @@ namespace FFXIVClassic_Map_Server.Actors { SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, actorId); QueuePacket(oustPacket); - } - + } + public void PartyOustPlayer(string name) { SubPacket oustPacket = PartyModifyPacket.BuildPacket(playerSession, 1, name); @@ -1357,9 +1411,9 @@ namespace FFXIVClassic_Map_Server.Actors { SubPacket promotePacket = PartyModifyPacket.BuildPacket(playerSession, 0, name); QueuePacket(promotePacket); - } - - //A party member list packet came, set the party + } + + //A party member list packet came, set the party public void SetParty(Party group) { if (group is Party) @@ -1367,9 +1421,9 @@ namespace FFXIVClassic_Map_Server.Actors RemoveFromCurrentPartyAndCleanup(); currentParty = group; } - } - - //Removes the player from the party and cleans it up if needed + } + + //Removes the player from the party and cleans it up if needed public void RemoveFromCurrentPartyAndCleanup() { if (currentParty == null) @@ -1390,12 +1444,12 @@ namespace FFXIVClassic_Map_Server.Actors if (partyGroup.members.Count == 0) Server.GetWorldManager().NoMembersInParty((Party)currentParty); currentParty = null; - } - + } + public void Update(double delta) { LuaEngine.OnPlayerUpdate(this, delta); - } - - } -} + } + + } +} diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs index 45dbd954..e120a284 100644 --- a/FFXIVClassic Map Server/actors/director/Director.cs +++ b/FFXIVClassic Map Server/actors/director/Director.cs @@ -68,14 +68,42 @@ namespace FFXIVClassic_Map_Server.actors.director return BasePacket.CreatePacket(initProperties.BuildPacket(playerActorId, actorId), true, false); } - public void OnTalked(Player player, Npc npc) + public void OnTalkEvent(Player player, Npc npc) { - LuaEngine.DoDirectorOnTalked(this, player, npc); + if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua")) + { + LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua"); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onTalkEvent").IsNil()) + script.Call(script.Globals["onTalkEvent"], player, npc); + } + else + { + LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName())); + } } - public void OnCommand(Player player, Command command) + public void OnCommandEvent(Player player, Command command) { - LuaEngine.DoDirectorOnCommand(this, player, command); + if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua")) + { + LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua"); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onCommandEvent").IsNil()) + script.Call(script.Globals["onCommandEvent"], player, command); + } + else + { + LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName())); + } } public void AddChild(Actor actor) @@ -186,10 +214,15 @@ namespace FFXIVClassic_Map_Server.actors.director uint zoneId = zone.actorId; uint privLevel = 0; if (zone is PrivateArea) - privLevel = ((PrivateArea)zone).GetPrivateAreaLevel(); + privLevel = ((PrivateArea)zone).GetPrivateAreaType(); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); } + public string GetScriptPath() + { + return directorScriptPath; + } + } } diff --git a/FFXIVClassic Map Server/actors/quest/Quest.cs b/FFXIVClassic Map Server/actors/quest/Quest.cs index 4baa6899..6a6e6542 100644 --- a/FFXIVClassic Map Server/actors/quest/Quest.cs +++ b/FFXIVClassic Map Server/actors/quest/Quest.cs @@ -41,6 +41,11 @@ namespace FFXIVClassic_Map_Server.Actors //Inform update } + public uint GetQuestId() + { + return actorId & 0xFFFFF; + } + public object GetQuestData(string dataName) { if (questData.ContainsKey(dataName)) @@ -52,12 +57,7 @@ namespace FFXIVClassic_Map_Server.Actors public void ClearQuestData() { questData.Clear(); - } - - public uint GetQuestId() - { - return actorId; - } + } public void ClearQuestFlags() { @@ -98,9 +98,11 @@ namespace FFXIVClassic_Map_Server.Actors return currentPhase; } - public void NextPhase() + public void NextPhase(int phaseNumber) { - currentPhase++; + currentPhase = phaseNumber; + owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25116, 0x20, (object)GetQuestId()); + SaveData(); } public uint GetQuestFlags() diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 79d780b9..331af8cc 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -173,6 +173,23 @@ namespace FFXIVClassic_Map_Server.lua } } + public static void OnZoneInDone(Player player) + { + string luaPath = String.Format(FILEPATH_ZONE, player.GetZone().zoneName); + + if (File.Exists(luaPath)) + { + LuaScript script = LoadScript(luaPath); + + if (script == null) + return; + + //Run Script + if (!script.Globals.Get("onZoneInDone").IsNil()) + script.Call(script.Globals["onZoneInDone"], player.GetZone(), player); + } + } + public static void OnBeginLogin(Player player) { if (File.Exists(FILEPATH_PLAYER)) @@ -393,48 +410,6 @@ namespace FFXIVClassic_Map_Server.lua player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false)); } - - - internal static void DoDirectorOnTalked(Director director, Player player, Npc npc) - { - string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onTalked").IsNil()) - script.Call(script.Globals["onTalked"], player, npc); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); - } - } - - internal static void DoDirectorOnCommand(Director director, Player player, Command command) - { - string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName()); - - if (File.Exists(luaPath)) - { - LuaScript script = LoadScript(luaPath); - - if (script == null) - return; - - //Run Script - if (!script.Globals.Get("onCommand").IsNil()) - script.Call(script.Globals["onCommand"], player, command); - } - else - { - SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName())); - } - } + } } diff --git a/FFXIVClassic Map Server/packets/receive/_0x07Packet.cs b/FFXIVClassic Map Server/packets/receive/ZoneInCompletePacket.cs similarity index 78% rename from FFXIVClassic Map Server/packets/receive/_0x07Packet.cs rename to FFXIVClassic Map Server/packets/receive/ZoneInCompletePacket.cs index a8a503b6..ec717e62 100644 --- a/FFXIVClassic Map Server/packets/receive/_0x07Packet.cs +++ b/FFXIVClassic Map Server/packets/receive/ZoneInCompletePacket.cs @@ -3,13 +3,13 @@ using System.IO; namespace FFXIVClassic_Map_Server.packets.receive { - class _0x07Packet + class ZoneInCompletePacket { public bool invalidPacket = false; public uint timestamp; - public uint unknown; + public int unknown; - public _0x07Packet(byte[] data) + public ZoneInCompletePacket(byte[] data) { using (MemoryStream mem = new MemoryStream(data)) { @@ -17,7 +17,7 @@ namespace FFXIVClassic_Map_Server.packets.receive { try{ timestamp = binReader.ReadUInt32(); - unknown = binReader.ReadUInt32(); + unknown = binReader.ReadInt32(); } catch (Exception){ invalidPacket = true; diff --git a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs index 245114dd..972c5540 100644 --- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events binWriter.Write((UInt32)playerActorId); binWriter.Write((UInt32)targetActorId); - int test = 0x75dc8705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0???? + int test = 0x75dc1705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0???? binWriter.Write((UInt32)test); binWriter.Write((UInt32)0x30400000); diff --git a/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningAttacker.lua b/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningAttacker.lua new file mode 100644 index 00000000..525bb8fc --- /dev/null +++ b/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningAttacker.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0; +end \ No newline at end of file diff --git a/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningHealer.lua b/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningHealer.lua new file mode 100644 index 00000000..525bb8fc --- /dev/null +++ b/data/scripts/base/chara/npc/monster/Fighter/FighterAllyOpeningHealer.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0; +end \ No newline at end of file diff --git a/data/scripts/base/chara/npc/monster/Goobbue/GoobbueLesserStandard.lua b/data/scripts/base/chara/npc/monster/Goobbue/GoobbueLesserStandard.lua new file mode 100644 index 00000000..525bb8fc --- /dev/null +++ b/data/scripts/base/chara/npc/monster/Goobbue/GoobbueLesserStandard.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0; +end \ No newline at end of file diff --git a/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua b/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua new file mode 100644 index 00000000..c192e78b --- /dev/null +++ b/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua @@ -0,0 +1,40 @@ +--[[ + +AetheryteChild Script + +Functions: + +eventAetheryteChildSelect(showTeleport, parentAetheryteID, animaAmount, animaCost(always 1)): Opens menu +eventAetheryteChildDesion(aetheryteId): "Your homepoint is now X" +processGuildleveBoost(favourCost, currentFavour): Ask: "Invoke the aspect of your Guardian deity to gain a temporary boon for the duration of a levequest." +processGuildlevePlaying(??) +processGuildleveJoin() - Ask: "Do you wish to join your party leader's levequest?" + +--]] + +require ("global") + +function init(npc) + return false, false, 0, 0; +end + +function onEventStarted(player, npc, triggerName) + menuChoice = callClientFunction(player, "eventAetheryteChildSelect", true, 1280062, 4, 1); + + --Teleport + if (menuChoice == 2) then + + --Init Levequest + elseif (menuChoice == -1) then + callClientFunction(player, "eventGLSelect", 0); + --Set Homepoint + elseif (menuChoice == -2) then + + --View Faction Standing + elseif (menuChoice == -3) then + + end + + player:EndEvent(); +end + diff --git a/data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua b/data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua index 0440d6da..e2cb475a 100644 --- a/data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua +++ b/data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua @@ -21,11 +21,11 @@ end function onEventStarted(player, npc, triggerName) - --callClientFunction(player, "eventTalkWelcome", player); + callClientFunction(player, "eventTalkWelcome", player); callClientFunction(player, "eventAskMainMenu", player, 20, true, true, true, true, 4); - callClientFunction(player, "eventTalkMyChocobo", player); - callClientFunction(player, "eventSetChocoboName", false); - callClientFunction(player, "eventAfterChocoboName", player); + --callClientFunction(player, "eventTalkMyChocobo", player); + --callClientFunction(player, "eventSetChocoboName", false); + --callClientFunction(player, "eventAfterChocoboName", player); player:EndEvent(); end \ No newline at end of file diff --git a/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua b/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua index 53157eb2..f0702f9c 100644 --- a/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua +++ b/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua @@ -42,7 +42,7 @@ function onEventStarted(player, npc, triggerName) createLinkshell(lsName, crestId); callClientFunction(player, "eventTalkStepMakeupDone"); --Modify - elseif (result == 1) then + elseif (result == 4) then modifyLinkshell(lsName, crestId); callClientFunction(player, "eventTalkStepModifyDone"); --Disband diff --git a/data/scripts/chocobo.lua b/data/scripts/chocobo.lua new file mode 100644 index 00000000..7f9c8211 --- /dev/null +++ b/data/scripts/chocobo.lua @@ -0,0 +1,68 @@ +--[[ + +Globals referenced in all of the lua scripts + +--]] + +-- ACTOR STATES + +ACTORSTATE_PASSIVE = 0; +ACTORSTATE_DEAD1 = 1; +ACTORSTATE_ACTIVE = 2; +ACTORSTATE_DEAD2 = 3; +ACTORSTATE_SITTING_ONOBJ = 11; +ACTORSTATE_SITTING_ONFLOOR = 13; +ACTORSTATE_MOUNTED = 15; + + +-- MESSAGE +MESSAGE_TYPE_NONE = 0; +MESSAGE_TYPE_SAY = 1; +MESSAGE_TYPE_SHOUT = 2; +MESSAGE_TYPE_TELL = 3; +MESSAGE_TYPE_PARTY = 4; +MESSAGE_TYPE_LINKSHELL1 = 5; +MESSAGE_TYPE_LINKSHELL2 = 6; +MESSAGE_TYPE_LINKSHELL3 = 7; +MESSAGE_TYPE_LINKSHELL4 = 8; +MESSAGE_TYPE_LINKSHELL5 = 9; +MESSAGE_TYPE_LINKSHELL6 = 10; +MESSAGE_TYPE_LINKSHELL7 = 11; +MESSAGE_TYPE_LINKSHELL8 = 12; + +MESSAGE_TYPE_SAY_SPAM = 22; +MESSAGE_TYPE_SHOUT_SPAM = 23; +MESSAGE_TYPE_TELL_SPAM = 24; +MESSAGE_TYPE_CUSTOM_EMOTE = 25; +MESSAGE_TYPE_EMOTE_SPAM = 26; +MESSAGE_TYPE_STANDARD_EMOTE = 27; +MESSAGE_TYPE_URGENT_MESSAGE = 28; +MESSAGE_TYPE_GENERAL_INFO = 29; +MESSAGE_TYPE_SYSTEM = 32; +MESSAGE_TYPE_SYSTEM_ERROR = 33; + +-- INVENTORY +INVENTORY_NORMAL = 0x0000; --Max 0xC8 +INVENTORY_LOOT = 0x0004; --Max 0xA +INVENTORY_MELDREQUEST = 0x0005; --Max 0x04 +INVENTORY_BAZAAR = 0x0007; --Max 0x0A +INVENTORY_CURRENCY = 0x0063; --Max 0x140 +INVENTORY_KEYITEMS = 0x0064; --Max 0x500 +INVENTORY_EQUIPMENT = 0x00FE; --Max 0x23 +INVENTORY_EQUIPMENT_OTHERPLAYER = 0x00F9; --Max 0x23 + +--UTILS + +function callClientFunction(player, functionName, ...) + player:RunEventFunction(functionName, ...); + result = coroutine.yield(); + return result; +end + +function printf(s, ...) + if ... then + print(s:format(...)); + else + print(s); + end; +end; \ No newline at end of file diff --git a/data/scripts/commands/ActivateCommand.lua b/data/scripts/commands/ActivateCommand.lua index c15247e5..89dc9647 100644 --- a/data/scripts/commands/ActivateCommand.lua +++ b/data/scripts/commands/ActivateCommand.lua @@ -14,12 +14,11 @@ function onEventStarted(player, command, triggerName) player:ChangeState(0); end - player:endEvent(); + --player:endEvent(); --For Opening Tutorial if (player:HasQuest("Man0l0") or player:HasQuest("Man0g0") or player:HasQuest("Man0u0")) then - player:GetDirector():OnCommand(command); - + player:GetDirector("Quest/QuestDirectorMan0l001"):OnCommandEvent(player, command); end end \ No newline at end of file diff --git a/data/scripts/commands/LinkshellKickCommand.lua b/data/scripts/commands/LinkshellKickCommand.lua new file mode 100644 index 00000000..55c7da7e --- /dev/null +++ b/data/scripts/commands/LinkshellKickCommand.lua @@ -0,0 +1,12 @@ +--[[ + +LinkshellKickCommand Script + +--]] + +function onEventStarted(player, actor, triggerName, linkshellName, kickedName) + + GetWorldManager():RequestWorldLinkshellKick(player, linkshellName, kickedName); + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/gm/endevent.lua b/data/scripts/commands/gm/endevent.lua new file mode 100644 index 00000000..a1306639 --- /dev/null +++ b/data/scripts/commands/gm/endevent.lua @@ -0,0 +1,35 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "ss", + description = +[[ +Passes endEvent() to player or to close a script. +!endevent | +!endevent | +]], +} + +function onTrigger(player, argc, name, lastName) + local sender = "[endevent] "; + + if name then + if lastName then + player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil; + else + player = GetWorldManager():GetPCInWorld(name) or nil; + end; + end; + + local messageID = MESSAGE_TYPE_SYSTEM_ERROR; + local message = "Sending endEvent()"; + + if player then + player:endEvent(); + player:SendMessage(messageID, sender, message); + print(message); + else + print(sender.."Sending Event."); + end; +end; \ No newline at end of file diff --git a/data/scripts/commands/gm/givegil.lua b/data/scripts/commands/gm/givegil.lua new file mode 100644 index 00000000..b4d3a9c1 --- /dev/null +++ b/data/scripts/commands/gm/givegil.lua @@ -0,0 +1,42 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "sss", + description = +[[ +Adds gil to player or . +!givegil | +!givegil | +]], +} + +function onTrigger(player, argc, qty, name, lastName) + local sender = "[givegil] "; + + if name then + if lastName then + player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil; + else + player = GetWorldManager():GetPCInWorld(name) or nil; + end; + end; + + if player then + currency = 1000001; + qty = tonumber(qty) or 1; + location = INVENTORY_CURRENCY; + + local added = player:GetInventory(location):AddItem(currency, qty, 1); + local messageID = MESSAGE_TYPE_SYSTEM_ERROR; + local message = "unable to add gil"; + + if currency and added then + message = string.format("added %u gil to %s", qty, player:GetName()); + end + player:SendMessage(messageID, sender, message); + print(message); + else + print(sender.."unable to add gil, ensure player name is valid."); + end; +end; \ No newline at end of file diff --git a/data/scripts/commands/gm/nudge.lua b/data/scripts/commands/gm/nudge.lua new file mode 100644 index 00000000..932ed372 --- /dev/null +++ b/data/scripts/commands/gm/nudge.lua @@ -0,0 +1,57 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "ss", + description = +[[ +Positions your character forward a set , defaults to 5 yalms. +!nudge | +!nudge | +!nudge | +]], + +} + +function onTrigger(player, argc, distance, vertical) + local pos = player:GetPos(); + local x = pos[0]; + local y = pos[1]; + local z = pos[2]; + local rot = pos[3]; + local zone = pos[4]; + local angle = rot + (math.pi/2); + local messageID = MESSAGE_TYPE_SYSTEM_ERROR; + local sender = "[nudge] "; + + if distance == nil then + distance = 5 + end; + + local px = x - distance * math.cos(angle); + local pz = z + distance * math.sin(angle); + local message = string.format("Positioning forward %u yalms.", distance); + local worldManager = GetWorldManager(); + + if argc == 1 then + worldManager:DoPlayerMoveInZone(player, px, y, pz, rot, 0x0); + player:SendMessage(messageID, sender, message); + elseif argc == 2 then + if vertical == "up" or vertical == "u" or vertical == "+" then + y = y + distance; + message = string.format("Positioning up %u yalms.", distance); + worldManager:DoPlayerMoveInZone(player, x, y, z, rot, 0x0); + player:SendMessage(messageID, sender, message); + elseif vertical == "down" or vertical == "d" or vertical == "-" then + y = y - distance; + message = string.format("Positioning down %u yalms.", distance); + worldManager:DoPlayerMoveInZone(player, x, y, z, rot, 0x0); + player:SendMessage(messageID, sender, message); + else + player:SendMessage(messageID, sender, "Unknown parameters! Usage: \n"..properties.description); + end; + else + worldManager:DoPlayerMoveInZone(player, px, y, pz, rot, 0x0); + player:SendMessage(messageID, sender, message); + end; +end; diff --git a/data/scripts/commands/gm/test.lua b/data/scripts/commands/gm/test.lua new file mode 100644 index 00000000..8416f432 --- /dev/null +++ b/data/scripts/commands/gm/test.lua @@ -0,0 +1,28 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "ss", + description = +[[ +Positions your character forward a set , defaults to 5 yalms. +!nudge | +!nudge | +!nudge | +]], + +} + +function onTrigger(player, argc) + worldMaster = GetWorldMaster(); + player:SendGameMessage(player, worldMaster, 34108, 0x20); + player:SendGameMessage(player, worldMaster, 50011, 0x20); + + director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0l001"); + player:AddDirector(director); + player:SetLoginDirector(director); + + player:KickEvent(director, "noticeEvent", true); + + GetWorldManager():DoZoneChange(player, 9); +end; diff --git a/data/scripts/commands/gm/workvalue.lua b/data/scripts/commands/gm/workvalue.lua new file mode 100644 index 00000000..17b46fa6 --- /dev/null +++ b/data/scripts/commands/gm/workvalue.lua @@ -0,0 +1,49 @@ +require("global"); + +properties = { + permissions = 0, + parameters = "ssss", + description = +[[ + +]], +} + +function onTrigger(player, argc, target, workName, uiFunc, value) + + local messageID = MESSAGE_TYPE_SYSTEM_ERROR; + local sender = "[workvalue] "; + + if (argc != 4) then + player:SendMessage(messageID, sender, "Invalid args"); + return; + end + + if (target == "@t") then + targetActor = GetWorldManager():GetActorInWorld(player.currentTarget) or nil; + else + targetActor = GetWorldManager():GetActorInWorld(target) or nil; + end + + if not targetActor then + player:SendMessage(messageID, sender, "Error finding target..."); + return + end + + if (tonumber(value) ~= nil) then + result = targetActor:SetWorkValue(player, workName, uiFunc, tonumber(value)); + elseif (value == "true") then + result = targetActor:SetWorkValue(player, workName, uiFunc, true); + elseif (value == "false") then + result = targetActor:SetWorkValue(player, workName, uiFunc, false); + else + result = targetActor:SetWorkValue(player, workName, uiFunc, value); + end + + if (result) then + player:SendMessage(messageID, sender, workName .. " changed to " .. value); + else + player:SendMessage(messageID, sender, "Could not changed workvalue. Is the name and datatype correct?"); + end + +end \ No newline at end of file diff --git a/data/scripts/directors/OpeningDirector.lua b/data/scripts/directors/OpeningDirector.lua new file mode 100644 index 00000000..351bd88d --- /dev/null +++ b/data/scripts/directors/OpeningDirector.lua @@ -0,0 +1,66 @@ +require ("global") +require ("quests/man/man0l0") +require ("quests/man/man0g0") +require ("quests/man/man0u0") + +function init() + return "/Director/OpeningDirector"; +end + +function onEventStarted(player, actor, triggerName) + + if (player:HasQuest(110001) == true) then + quest = player:GetQuest("Man0l0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil); + elseif (player:HasQuest(110005) == true) then + quest = player:GetQuest("Man0g0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil); + elseif (player:HasQuest(110009) == true) then + quest = player:GetQuest("Man0u0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil); + end + + player:EndEvent(); + +end + +function onUpdate() +end + +function onTalkEvent(player, npc) +; + if (player:HasQuest(110001) == true) then + man0l0Quest = player:GetQuest("man0l0"); + if (man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3) == true) then + doorNpc = GetWorldManager():GetActorInWorldByUniqueId("exit_door"); + player:SetEventStatus(doorNpc, "pushDefault", true, 0x2); + doorNpc:SetQuestGraphic(player, 0x3); + end + elseif (player:HasQuest(110005) == true) then + man0g0Quest = player:GetQuest("man0g0"); + if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then + yda = GetWorldManager():GetActorInWorldByUniqueId("yda"); + yda:SetQuestGraphic(player, 0x2); + end + elseif (player:HasQuest(110009) == true) then + man0u0Quest = player:GetQuest("man0u0"); + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then + exitTriggerNpc = GetWorldManager():GetActorInWorldByUniqueId("exit_trigger"); + player:SetEventStatus(exitTriggerNpc, "pushDefault", true, 0x2); + exitTriggerNpc:SetQuestGraphic(player, 0x3); + end + end + +end + +function onPushEvent(player, npc) +end + +function onCommandEvent(player, command) +end + +function onEventUpdate(player, npc) +end + +function onCommand(player, command) +end \ No newline at end of file diff --git a/data/scripts/directors/Quest/QuestDirectorMan0g001.lua b/data/scripts/directors/Quest/QuestDirectorMan0g001.lua new file mode 100644 index 00000000..b1336fd1 --- /dev/null +++ b/data/scripts/directors/Quest/QuestDirectorMan0g001.lua @@ -0,0 +1,66 @@ +require ("global") +require ("quests/man/man0g0") + +--processTtrBtl001: Active Mode Tutorial +--processTtrBtl002: Targetting Tutorial (After active mode done) +--processTtrBtl003: Auto Attack Done +--processTtrBtl004: Tutorial Complete + +--[[ +12: TP +13: WeaponSkills + +]]-- + +function init() + return "/Director/Quest/QuestDirectorMan0g001"; +end + +function onEventStarted(player, actor, triggerName) + + quest = GetStaticActor("Man0g0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --IF DoW: + --sendDataPacket: OpenWidget (TP) + --IF TP REACHED: + --sendDataPacket: CloseWidget + --sendDataPacket: OpenWidget (WS) + --IF WS USED: + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --ELSE MAGIC: + --sendDataPacket: OpenWidget (DEFEAT ENEMY) + + --IF DEAD + --sendDataPacket: Attention + + player:EndEvent(); + +end + +function onUpdate() +end + +function onTalkEvent(player, npc) + +end + +function onPushEvent(player, npc) +end + +function onCommandEvent(player, command) + + quest = GetStaticActor("Man0g0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + +end + +function onEventUpdate(player, npc) +end + +function onCommand(player, command) +end \ No newline at end of file diff --git a/data/scripts/directors/Quest/QuestDirectorMan0l001.lua b/data/scripts/directors/Quest/QuestDirectorMan0l001.lua new file mode 100644 index 00000000..4bb41eaa --- /dev/null +++ b/data/scripts/directors/Quest/QuestDirectorMan0l001.lua @@ -0,0 +1,66 @@ +require ("global") +require ("quests/man/man0l0") + +--processTtrBtl001: Active Mode Tutorial +--processTtrBtl002: Targetting Tutorial (After active mode done) +--processTtrBtl003: Auto Attack Done +--processTtrBtl004: Tutorial Complete + +--[[ +12: TP +13: WeaponSkills + +]]-- + +function init() + return "/Director/Quest/QuestDirectorMan0l001"; +end + +function onEventStarted(player, actor, triggerName) + + quest = GetStaticActor("Man0l0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --IF DoW: + --sendDataPacket: OpenWidget (TP) + --IF TP REACHED: + --sendDataPacket: CloseWidget + --sendDataPacket: OpenWidget (WS) + --IF WS USED: + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --ELSE MAGIC: + --sendDataPacket: OpenWidget (DEFEAT ENEMY) + + --IF DEAD + --sendDataPacket: Attention + + player:EndEvent(); + +end + +function onUpdate() +end + +function onTalkEvent(player, npc) + +end + +function onPushEvent(player, npc) +end + +function onCommandEvent(player, command) + + quest = GetStaticActor("Man0l0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + +end + +function onEventUpdate(player, npc) +end + +function onCommand(player, command) +end \ No newline at end of file diff --git a/data/scripts/directors/Quest/QuestDirectorMan0u001.lua b/data/scripts/directors/Quest/QuestDirectorMan0u001.lua new file mode 100644 index 00000000..195e33e3 --- /dev/null +++ b/data/scripts/directors/Quest/QuestDirectorMan0u001.lua @@ -0,0 +1,66 @@ +require ("global") +require ("quests/man/man0u0") + +--processTtrBtl001: Active Mode Tutorial +--processTtrBtl002: Targetting Tutorial (After active mode done) +--processTtrBtl003: Auto Attack Done +--processTtrBtl004: Tutorial Complete + +--[[ +12: TP +13: WeaponSkills + +]]-- + +function init() + return "/Director/Quest/QuestDirectorMan0u001"; +end + +function onEventStarted(player, actor, triggerName) + + quest = GetStaticActor("Man0u0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --IF DoW: + --sendDataPacket: OpenWidget (TP) + --IF TP REACHED: + --sendDataPacket: CloseWidget + --sendDataPacket: OpenWidget (WS) + --IF WS USED: + --sendDataPacket: Success + --sendDataPacket: CloseWidget + --ELSE MAGIC: + --sendDataPacket: OpenWidget (DEFEAT ENEMY) + + --IF DEAD + --sendDataPacket: Attention + + player:EndEvent(); + +end + +function onUpdate() +end + +function onTalkEvent(player, npc) + +end + +function onPushEvent(player, npc) +end + +function onCommandEvent(player, command) + + quest = GetStaticActor("Man0l0"); + callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil); + +end + +function onEventUpdate(player, npc) +end + +function onCommand(player, command) +end \ No newline at end of file diff --git a/data/scripts/directors/questDirect_fst0Btl03_01@0A615.lua b/data/scripts/directors/questDirect_fst0Btl03_01@0A615.lua deleted file mode 100644 index d0e05e82..00000000 --- a/data/scripts/directors/questDirect_fst0Btl03_01@0A615.lua +++ /dev/null @@ -1,21 +0,0 @@ - -function onEventStarted(player, actor, triggerName) - - man0g0Quest = GetStaticActor("Man0g0"); - --player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl001"); - player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl002"); - -end - -function onEventUpdate(player, npc, resultId) - --man0g0Quest = GetStaticActor("Man0g0"); - --player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl002"); - player:EndEvent(); -end - -function onCommand(player, command) - --Check command if ActivateCommand - player:EndCommand(); - player:EndEvent(); - player:KickEvent(player:GetDirector(), "noticeEvent", true); -end \ No newline at end of file diff --git a/data/scripts/directors/questDirect_ocn0Btl02_01@0C196.lua b/data/scripts/directors/questDirect_ocn0Btl02_01@0C196.lua deleted file mode 100644 index 16c94682..00000000 --- a/data/scripts/directors/questDirect_ocn0Btl02_01@0C196.lua +++ /dev/null @@ -1,25 +0,0 @@ - -function onEventStarted(player, actor, triggerName) - - man0u0Quest = GetStaticActor("Man0u0"); - man0l0Quest = GetStaticActor("Man0l0"); - player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl001"); - --player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtlMagic001"); - --player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl002"); - --player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl003"); - - --player:RunEventFunction("delegateEvent", player, man0u0Quest, "processTtrBtl004"); - -end - -function onEventUpdate(player, npc, resultId) - --man0l0Quest = GetStaticActor("Man0l0"); - --player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl002"); - player:EndEvent(); -end - -function onCommand(player, command) - --Check command if ActivateCommand - --player:KickEvent(player:GetDirector(), "noticeEvent"); - --player:EndCommand(); -end \ No newline at end of file diff --git a/data/scripts/player.lua b/data/scripts/player.lua index 9fce66e5..80902230 100644 --- a/data/scripts/player.lua +++ b/data/scripts/player.lua @@ -12,22 +12,29 @@ function onBeginLogin(player) player:AddQuest(110005); elseif (initialTown == 3 and player:HasQuest(110009) == false) then player:AddQuest(110009); - end + end end --For Opening. Set Director and reset position incase d/c if (player:HasQuest(110001) == true) then - --player:SetDirector("openingDirector", false); + director = player:GetZone():CreateDirector("OpeningDirector"); + player:AddDirector(director); + player:SetLoginDirector(director); + player:KickEvent(director, "noticeEvent", "noticeEvent"); + player.positionX = 0.016; player.positionY = 10.35; - --player.positionZ = -36.91; - player.positionZ = -20.91; + player.positionZ = -36.91; player.rotation = 0.025; player:GetQuest(110001):ClearQuestData(); player:GetQuest(110001):ClearQuestFlags(); elseif (player:HasQuest(110005) == true) then - player:SetDirector("openingDirector", false); + director = player:GetZone():CreateDirector("OpeningDirector"); + player:AddDirector(director); + player:SetLoginDirector(director); + player:KickEvent(director, "noticeEvent", "noticeEvent"); + player.positionX = 369.5434; player.positionY = 4.21; player.positionZ = -706.1074; @@ -35,15 +42,18 @@ function onBeginLogin(player) player:GetQuest(110005):ClearQuestData(); player:GetQuest(110005):ClearQuestFlags(); elseif (player:HasQuest(110009) == true) then - player:SetDirector("openingDirector", false); + director = player:GetZone():CreateDirector("OpeningDirector"); + player:AddDirector(director); + player:SetLoginDirector(director); + player:KickEvent(director, "noticeEvent", "noticeEvent"); + player.positionX = 5.364327; player.positionY = 196.0; player.positionZ = 133.6561; player.rotation = -2.849384; player:GetQuest(110009):ClearQuestData(); player:GetQuest(110009):ClearQuestFlags(); - end - + end end @@ -54,7 +64,9 @@ function onLogin(player) player:SendMessage(0x1D,"",">PlayTime == 0, new player!"); initClassItems(player); - initRaceItems(player); + initRaceItems(player); + + player:SavePlayTime(); end end diff --git a/data/scripts/quests/man/man0l0.lua b/data/scripts/quests/man/man0l0.lua index e99d8b48..a5d78b75 100644 --- a/data/scripts/quests/man/man0l0.lua +++ b/data/scripts/quests/man/man0l0.lua @@ -6,8 +6,4 @@ MAN0L0_FLAG_TUTORIAL3_DONE = 2; MAN0L0_FLAG_MINITUT_DONE1 = 4; MAN0L0_FLAG_MINITUT_DONE2 = 8; -MAN0L0_FLAG_MINITUT_DONE3 = 16; - ---Result Unique Ids -RESULT_Event000_1 = 0x2B9EBC42; -RESULT_TtrNomal001 = 0x8649D125; \ No newline at end of file +MAN0L0_FLAG_MINITUT_DONE3 = 16; \ No newline at end of file diff --git a/data/scripts/quests/man/man0u0.lua b/data/scripts/quests/man/man0u0.lua index 98d01bdd..db6829d3 100644 --- a/data/scripts/quests/man/man0u0.lua +++ b/data/scripts/quests/man/man0u0.lua @@ -1,6 +1,7 @@ --Quest Flags MAN0U0_FLAG_TUTORIAL1_DONE = 0; MAN0U0_FLAG_TUTORIAL2_DONE = 1; +MAN0U0_FLAG_TUTORIAL3_DONE = 2; MAN0U0_FLAG_MINITUT_DONE1 = 4; MAN0U0_FLAG_MINITUT_DONE2 = 8; diff --git a/data/scripts/unique/fst0Battle03/Director/opening_director.lua b/data/scripts/unique/fst0Battle03/Director/opening_director.lua deleted file mode 100644 index cc50d59a..00000000 --- a/data/scripts/unique/fst0Battle03/Director/opening_director.lua +++ /dev/null @@ -1,33 +0,0 @@ -require ("global") -require("/quests/man/man0g0") - -function onEventStarted(player, actor, triggerName) - - man0g0Quest = GetStaticActor("Man0g0"); - callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil); - player:EndEvent(); - -end - -function onTalked(player, npc) - - man0g0Quest = player:GetQuest("Man0g0"); - - if (man0g0Quest ~= nil) then - - yda = GetWorldManager():GetActorInWorld(1000009); - papalymo = GetWorldManager():GetActorInWorld(1000010); - - if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then - yda:SetQuestGraphic(player, 0x0); - papalymo:SetQuestGraphic(player, 0x2); - else - if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then - yda:SetQuestGraphic(player, 0x2); - papalymo:SetQuestGraphic(player, 0x0); - end - end - - end - -end \ No newline at end of file diff --git a/data/scripts/unique/fst0Battle03/openingStop_fstBtl03_03@0A600.lua b/data/scripts/unique/fst0Battle03/OpeningStoperF0B1/openingstoper_gridania.lua similarity index 100% rename from data/scripts/unique/fst0Battle03/openingStop_fstBtl03_03@0A600.lua rename to data/scripts/unique/fst0Battle03/OpeningStoperF0B1/openingstoper_gridania.lua diff --git a/data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_02@0A600.lua b/data/scripts/unique/fst0Battle03/PopulaceStandard/papalymo.lua similarity index 88% rename from data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_02@0A600.lua rename to data/scripts/unique/fst0Battle03/PopulaceStandard/papalymo.lua index 3a6f62f0..160624b3 100644 --- a/data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_02@0A600.lua +++ b/data/scripts/unique/fst0Battle03/PopulaceStandard/papalymo.lua @@ -6,9 +6,10 @@ function onEventStarted(player, npc, triggerName) if (triggerName == "talkDefault") then if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == false) then - callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_2", nil, nil, nil); + callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_3", nil, nil, nil); man0g0Quest:SetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1, true); man0g0Quest:SaveData(); + npc:SetQuestGraphic(player, 0x0); player:GetDirector():OnTalked(npc); else callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_2", nil, nil, nil); diff --git a/data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_01@0A600.lua b/data/scripts/unique/fst0Battle03/PopulaceStandard/yda.lua similarity index 59% rename from data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_01@0A600.lua rename to data/scripts/unique/fst0Battle03/PopulaceStandard/yda.lua index b40d4247..9625a222 100644 --- a/data/scripts/unique/fst0Battle03/OpeningStoperF0B1/pplStd_fst0Btl03_01@0A600.lua +++ b/data/scripts/unique/fst0Battle03/PopulaceStandard/yda.lua @@ -13,16 +13,27 @@ function onEventStarted(player, npc, triggerName) if (triggerName == "pushDefault") then callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal002", nil, nil, nil); elseif (triggerName == "talkDefault") then + --Is doing talk tutorial? if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal003", nil, nil, nil); player:SetEventStatus(npc, "pushDefault", false, 0x2); + npc:SetQuestGraphic(player, 0x2); player:GetDirector():OnTalked(npc); man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE, true); man0g0Quest:SaveData(); + --Was she talked to after papalymo? else - if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then - man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL2_DONE, true); - callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent010_1", nil, nil, nil); + if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then + player:EndEvent(); + player:SetDirector("QuestDirectorMan0g001", true); + + worldMaster = GetWorldMaster(); + player:SendGameMessage(player, worldMaster, 34108, 0x20); + player:SendGameMessage(player, worldMaster, 50011, 0x20); + + GetWorldManager():DoPlayerMoveInZone(player, 10); + player:KickEvent(player:GetDirector(), "noticeEvent", true); + return; else callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_1", nil, nil, nil); end @@ -31,24 +42,4 @@ function onEventStarted(player, npc, triggerName) end player:EndEvent(); -end - -function onEventUpdate(player, npc) - - man0g0Quest = player:GetQuest("Man0g0"); - - if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL2_DONE) == true) then - player:EndEvent(); - player:SetDirector("QuestDirectorMan0g001", true); - - worldMaster = GetWorldMaster(); - player:SendGameMessage(player, worldMaster, 34108, 0x20); - player:SendGameMessage(player, worldMaster, 50011, 0x20); - - GetWorldManager():DoPlayerMoveInZone(player, 10); - player:KickEvent(player:GetDirector(), "noticeEvent", true); - else - player:EndEvent(); - end - end \ No newline at end of file diff --git a/data/scripts/unique/fst0Battle03/zone.lua b/data/scripts/unique/fst0Battle03/zone.lua deleted file mode 100644 index 11ed913d..00000000 --- a/data/scripts/unique/fst0Battle03/zone.lua +++ /dev/null @@ -1,20 +0,0 @@ -require ("global") - -function onZoneInit(zone) -end - -function onZoneIn(player) - - openingQuest = player:getQuest(110005); - - --Opening Quest - if (openingQuest ~= nil) then - if (openingQuest:GetQuestFlag(0) == false) then - player:kickEvent(player:getDirector(), "noticeEvent"); - end - end - -end - -function onZoneOut(zone, player) -end \ No newline at end of file diff --git a/data/scripts/unique/fst0Town01a/InstanceRaidGuide/louisoix.lua b/data/scripts/unique/fst0Town01a/InstanceRaidGuide/louisoix.lua new file mode 100644 index 00000000..7c903a8b --- /dev/null +++ b/data/scripts/unique/fst0Town01a/InstanceRaidGuide/louisoix.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultFst = GetStaticActor("DftFst"); + callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkLouisoix_001", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/fst0Town01a/PopulacePassiveGLPublisher/anaidjaa.lua b/data/scripts/unique/fst0Town01a/PopulacePassiveGLPublisher/anaidjaa.lua new file mode 100644 index 00000000..988ebb7e --- /dev/null +++ b/data/scripts/unique/fst0Town01a/PopulacePassiveGLPublisher/anaidjaa.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultFst = GetStaticActor("DftFst"); + callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkWithAnaidjaa_001", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/fst0Town01a/PopulaceStandard/dyrstbrod.lua b/data/scripts/unique/fst0Town01a/PopulaceStandard/dyrstbrod.lua new file mode 100644 index 00000000..1ea2fcd3 --- /dev/null +++ b/data/scripts/unique/fst0Town01a/PopulaceStandard/dyrstbrod.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultFst = GetStaticActor("DftFst"); + callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkWithDyrstbrod_001", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/ocn0Battle02/Director/openingdirector.lua b/data/scripts/unique/ocn0Battle02/Director/openingdirector.lua deleted file mode 100644 index 9b11c28a..00000000 --- a/data/scripts/unique/ocn0Battle02/Director/openingdirector.lua +++ /dev/null @@ -1,26 +0,0 @@ -require ("global") -require("/quests/man/man0l0") - -function onEventStarted(player, actor, triggerName) - - man0l0Quest = GetStaticActor("Man0l0"); - callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil); - player:EndEvent(); - -end - -function onTalked(player, npc) - - man0l0Quest = player:GetQuest("Man0l0"); - - if (man0l0Quest ~= nil) then - if (man0l0Quest ~= nil and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3) == true) then - - doorNpc = GetWorldManager():GetActorInWorld(1090025); - player:SetEventStatus(doorNpc, "pushDefault", true, 0x2); - doorNpc:SetQuestGraphic(player, 0x3); - - end - end - -end \ No newline at end of file diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/baby-faced_adventurer.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/baby-faced_adventurer.lua index 108e6e95..7398b0c5 100644 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/baby-faced_adventurer.lua +++ b/data/scripts/unique/ocn0Battle02/PopulaceStandard/baby-faced_adventurer.lua @@ -22,7 +22,7 @@ function onEventStarted(player, npc, triggerName) npc:SetQuestGraphic(player, 0x0); man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3, true); man0l0Quest:SaveData(); - player:GetDirector():OnTalked(npc); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); else callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_8", nil, nil, nil); end diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/exit_door.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/exit_door.lua index 54f0513a..8526ae23 100644 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/exit_door.lua +++ b/data/scripts/unique/ocn0Battle02/PopulaceStandard/exit_door.lua @@ -24,14 +24,17 @@ function onEventStarted(player, npc, triggerName) if (choice == 1) then callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_2", nil, nil, nil, nil); player:EndEvent(); - player:SetDirector("QuestDirectorMan0l001", true); worldMaster = GetWorldMaster(); player:SendGameMessage(player, worldMaster, 34108, 0x20); player:SendGameMessage(player, worldMaster, 50011, 0x20); - GetWorldManager():DoPlayerMoveInZone(player, 9); - player:KickEvent(player:GetDirector(), "noticeEvent", true); + director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0l001"); + player:KickEvent(director, "noticeEvent", true); + player:AddDirector(director); + player:SetLoginDirector(director); + + GetWorldManager():DoZoneChange(player, 9); else player:EndEvent(); end diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_02@0C196.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_02@0C196.lua deleted file mode 100644 index c1e8d1d6..00000000 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_02@0C196.lua +++ /dev/null @@ -1,3 +0,0 @@ -function init(npc) - return "/Chara/Npc/Monster/Fighter/FighterAllyOpeningHealer", false, false, false, false, false, npc:GetActorClassId(), false, false, 10, 1, 4, false, false, false, false, false, false, false, false, 2; -end \ No newline at end of file diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_03@0C196.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_03@0C196.lua deleted file mode 100644 index 886bdaca..00000000 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/fighterAlly_ocn0Btl02_03@0C196.lua +++ /dev/null @@ -1,3 +0,0 @@ -function init(npc) - return "/Chara/Npc/Monster/Fighter/FighterAllyOpeningAttacker", false, false, false, false, false, npc:GetActorClassId(), false, false, 10, 1, 4, false, false, false, false, false, false, false, false, 2; -end \ No newline at end of file diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/rostnsthal.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/rostnsthal.lua index dca14849..bba6fd27 100644 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/rostnsthal.lua +++ b/data/scripts/unique/ocn0Battle02/PopulaceStandard/rostnsthal.lua @@ -31,7 +31,7 @@ function onEventStarted(player, npc, triggerName) npc:SetQuestGraphic(player, 0x2); man0l0Quest:SaveData(); - player:GetDirector():OnTalked(npc); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); --Was he talked to for the mini tutorial? else callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini001", nil, nil, nil); @@ -41,7 +41,7 @@ function onEventStarted(player, npc, triggerName) man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1, true); man0l0Quest:SaveData(); - player:GetDirector():OnTalked(npc); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); end end end diff --git a/data/scripts/unique/ocn0Battle02/PopulaceStandard/voluptuous_vixen.lua b/data/scripts/unique/ocn0Battle02/PopulaceStandard/voluptuous_vixen.lua index ef145806..3fad6bab 100644 --- a/data/scripts/unique/ocn0Battle02/PopulaceStandard/voluptuous_vixen.lua +++ b/data/scripts/unique/ocn0Battle02/PopulaceStandard/voluptuous_vixen.lua @@ -20,9 +20,8 @@ function onEventStarted(player, npc, triggerName) callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini002", nil, nil, nil); npc:SetQuestGraphic(player, 0x0); man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2, true); - man0l0Quest:SaveData(); - - player:GetDirector():OnTalked(npc); + man0l0Quest:SaveData(); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); else callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_13", nil, nil, nil); end diff --git a/data/scripts/unique/ocn0Cruise01/ship_route_1.lua b/data/scripts/unique/ocn0Cruise01/ship_route_1.lua new file mode 100644 index 00000000..7feb8f7c --- /dev/null +++ b/data/scripts/unique/ocn0Cruise01/ship_route_1.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return false, false, 0, 0, 0x1415, 201; +end \ No newline at end of file diff --git a/data/scripts/unique/ocn0Cruise01/ship_route_2.lua b/data/scripts/unique/ocn0Cruise01/ship_route_2.lua new file mode 100644 index 00000000..7feb8f7c --- /dev/null +++ b/data/scripts/unique/ocn0Cruise01/ship_route_2.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return false, false, 0, 0, 0x1415, 201; +end \ No newline at end of file diff --git a/data/scripts/unique/sea0Town01/PopulaceStandard/merewina.lua b/data/scripts/unique/sea0Town01/PopulaceStandard/merewina.lua new file mode 100644 index 00000000..5259cbf1 --- /dev/null +++ b/data/scripts/unique/sea0Town01/PopulaceStandard/merewina.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultSea = GetStaticActor("DftSea"); + callClientFunction(player, "delegateEvent", player, defaultSea, "tribeTalk", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/sea0Town01/PopulaceStandard/sweetnix_rosycheeks.lua b/data/scripts/unique/sea0Town01/PopulaceStandard/sweetnix_rosycheeks.lua new file mode 100644 index 00000000..e1af982c --- /dev/null +++ b/data/scripts/unique/sea0Town01/PopulaceStandard/sweetnix_rosycheeks.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultSea = GetStaticActor("DftSea"); + callClientFunction(player, "delegateEvent", player, defaultSea, "defaultTalkWithSweetnix_001", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport.lua b/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport.lua new file mode 100644 index 00000000..839a2f7e --- /dev/null +++ b/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return false, false, 0, 0, 0xC4, 0x1C8; +end \ No newline at end of file diff --git a/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport2.lua b/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport2.lua new file mode 100644 index 00000000..3b372965 --- /dev/null +++ b/data/scripts/unique/sea0Town01a/MapObjShipPort/limsa_shipport2.lua @@ -0,0 +1,5 @@ +require ("global") + +function init(npc) + return false, false, 0, 0, 0x187, 0x2; +end \ No newline at end of file diff --git a/data/scripts/unique/sea0Town01a/PopulaceStandard/joellaut.lua b/data/scripts/unique/sea0Town01a/PopulaceStandard/joellaut.lua new file mode 100644 index 00000000..e3dac822 --- /dev/null +++ b/data/scripts/unique/sea0Town01a/PopulaceStandard/joellaut.lua @@ -0,0 +1,7 @@ +require ("global") + +function onEventStarted(player, npc) + defaultSea = GetStaticActor("DftSea"); + callClientFunction(player, "delegateEvent", player, defaultSea, "defaultTalkWithJoellaut_001", nil, nil, nil); + player:endEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/Director/opening_director.lua b/data/scripts/unique/wil0Battle01/Director/opening_director.lua deleted file mode 100644 index 5cd6ce52..00000000 --- a/data/scripts/unique/wil0Battle01/Director/opening_director.lua +++ /dev/null @@ -1,22 +0,0 @@ -require ("global") -require("/quests/man/man0u0") - -function onEventStarted(player, actor, triggerName) - - man0u0Quest = GetStaticActor("Man0u0"); - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil); - player:EndEvent(); - -end - -function onTalked(player, npc) - - man0u0Quest = player:GetQuest("Man0u0"); - - if (man0u0Quest ~= nil) then - - - - end - -end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah.lua b/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah.lua new file mode 100644 index 00000000..cb7b27e6 --- /dev/null +++ b/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah.lua @@ -0,0 +1,13 @@ +function init(npc) + return false, false, 0, 0; +end + +function onEventStarted(player, npc, triggerName) + if (triggerName == "caution") then + worldMaster = GetWorldMaster(); + player:SendGameMessage(player, worldMaster, 34109, 0x20); + elseif (triggerName == "exit") then + GetWorldManager():DoPlayerMoveInZone(player, 6); + end + player:EndEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah_battle.lua b/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah_battle.lua new file mode 100644 index 00000000..34601794 --- /dev/null +++ b/data/scripts/unique/wil0Battle01/OpeningStoperW0B1/opening_stoper_uldah_battle.lua @@ -0,0 +1,13 @@ +function init(npc) + return false, false, 0, 0; +end + +function onEventStarted(player, npc, triggerName) + if (triggerName == "caution") then + worldMaster = GetWorldMaster(); + player:SendGameMessage(player, worldMaster, 34109, 0x20); + elseif (triggerName == "exit") then + GetWorldManager():DoPlayerMoveInZone(player, 18); + end + player:EndEvent(); +end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/pplStd_wil0Btl01_01@0B800.lua b/data/scripts/unique/wil0Battle01/PopulaceChocoboLender/rururaji.lua similarity index 67% rename from data/scripts/unique/wil0Battle01/PopulaceStandard/pplStd_wil0Btl01_01@0B800.lua rename to data/scripts/unique/wil0Battle01/PopulaceChocoboLender/rururaji.lua index 4c9c8304..903ca699 100644 --- a/data/scripts/unique/wil0Battle01/PopulaceStandard/pplStd_wil0Btl01_01@0B800.lua +++ b/data/scripts/unique/wil0Battle01/PopulaceChocoboLender/rururaji.lua @@ -2,7 +2,7 @@ require ("global") require ("quests/man/man0u0") function onEventStarted(player, npc, triggerName) - man0u0Quest = GetStaticActor("Man0u0"); - callClientFunction(player, "delegateEvent", player, man0u0Quest, "defaultTalkWithLady001_001", nil, nil, nil); + man0u0Quest = GetStaticActor("Man0u0"); + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent000_13", nil, nil, nil); player:EndEvent(); end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/ascilia.lua b/data/scripts/unique/wil0Battle01/PopulaceStandard/ascilia.lua index 9ad27c11..4491c814 100644 --- a/data/scripts/unique/wil0Battle01/PopulaceStandard/ascilia.lua +++ b/data/scripts/unique/wil0Battle01/PopulaceStandard/ascilia.lua @@ -9,25 +9,40 @@ function onEventStarted(player, npc, triggerName) man0u0Quest = player:GetQuest("Man0u0"); if (man0u0Quest ~= nil) then - if (triggerName == "pushDefault") then + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then + npc:SetQuestGraphic(player, 0x2); + end + + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE) == true) then + player:SetEventStatus(npc, "pushDefault", false, 0x2); + end + end + + if (man0u0Quest ~= nil) then + if (triggerName == "pushDefault") then callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal002", nil, nil, nil); elseif (triggerName == "talkDefault") then - if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE) == false) then - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil); + --Is doing talk tutorial? + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE) == false) then player:SetEventStatus(npc, "pushDefault", false, 0x2); - player:GetDirector():OnTalked(npc); - man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE, true); + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil); + man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE, true); + npc:SetQuestGraphic(player, 0x2); man0u0Quest:SaveData(); - else - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini001", nil, nil, nil); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); + --Was he talked to for the mini tutorial? + else + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini001", nil, nil, nil); if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then npc:SetQuestGraphic(player, 0x0); man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1, true); - man0u0Quest:SaveData(); + man0u0Quest:SaveData(); end - + end + + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); else player:EndEvent(); end diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/exit_trigger.lua b/data/scripts/unique/wil0Battle01/PopulaceStandard/exit_trigger.lua new file mode 100644 index 00000000..ece0a7a9 --- /dev/null +++ b/data/scripts/unique/wil0Battle01/PopulaceStandard/exit_trigger.lua @@ -0,0 +1,48 @@ +require ("global") +require ("quests/man/man0u0") + +function onSpawn(player, npc) + + man0u0Quest = player:GetQuest("Man0u0"); + + if (man0u0Quest ~= nil) then + player:SetEventStatus(npc, "pushDefault", true, 0x2); + if (man0u0Quest ~= nil and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0U0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then + npc:SetQuestGraphic(player, 0x3); + else + npc:SetQuestGraphic(player, 0x0); + end + end + +end + +function onEventStarted(player, npc, triggerName) + man0u0Quest = GetStaticActor("Man0u0"); + + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) ~= true) then + print "AAAA" + end + + --if (man0u0Quest ~= nil and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then + + player:EndEvent(); + + worldMaster = GetWorldMaster(); + player:SendGameMessage(player, worldMaster, 34108, 0x20); + player:SendGameMessage(player, worldMaster, 50011, 0x20); + + director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0u001"); + player:KickEvent(director, "noticeEvent", true); + player:AddDirector(director); + player:SetLoginDirector(director); + + GetWorldManager():DoZoneChange(player, 17); + + + +end + +--[[AFTER GOOBBUE +22.81, 196, 87.82 +]] +--0x45c00005 \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/fretful_farmhand.lua b/data/scripts/unique/wil0Battle01/PopulaceStandard/fretful_farmhand.lua index 395d9d76..30ce2c1b 100644 --- a/data/scripts/unique/wil0Battle01/PopulaceStandard/fretful_farmhand.lua +++ b/data/scripts/unique/wil0Battle01/PopulaceStandard/fretful_farmhand.lua @@ -1,20 +1,31 @@ require ("global") require ("quests/man/man0u0") +function onSpawn(player, npc) + man0u0Quest = player:GetQuest("Man0u0"); + + if (man0u0Quest ~= nil) then + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then + npc:SetQuestGraphic(player, 0x2); + end + end +end + function onEventStarted(player, npc, triggerName) man0u0Quest = player:GetQuest("Man0u0"); - - if (man0u0Quest != nil) - if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil); - npc:SetQuestGraphic(player, 0x0); - man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true); - man0u0Quest:SaveData(); - player:GetDirector():OnTalked(npc); - else - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil); + + if (man0u0Quest ~= nil) then + if (triggerName == "talkDefault") then + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil); + npc:SetQuestGraphic(player, 0x0); + man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true); + man0u0Quest:SaveData(); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); + else + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil); + end end end - player:EndEvent(); end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/gil-digging_mistress.lua b/data/scripts/unique/wil0Battle01/PopulaceStandard/gil-digging_mistress.lua index 687f9c09..1f0afb17 100644 --- a/data/scripts/unique/wil0Battle01/PopulaceStandard/gil-digging_mistress.lua +++ b/data/scripts/unique/wil0Battle01/PopulaceStandard/gil-digging_mistress.lua @@ -1,21 +1,31 @@ require ("global") require ("quests/man/man0u0") +function onSpawn(player, npc) + man0u0Quest = player:GetQuest("Man0u0"); + + if (man0u0Quest ~= nil) then + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then + npc:SetQuestGraphic(player, 0x2); + end + end +end + function onEventStarted(player, npc, triggerName) man0u0Quest = player:GetQuest("Man0u0"); - + if (man0u0Quest ~= nil) then - - if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil); - npc:SetQuestGraphic(player, 0x0); - man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true); - man0u0Quest:SaveData(); - player:GetDirector():OnTalked(npc); - else - callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil); + if (triggerName == "talkDefault") then + if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil); + npc:SetQuestGraphic(player, 0x0); + man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true); + man0u0Quest:SaveData(); + player:GetDirector("OpeningDirector"):onTalkEvent(player, npc); + else + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil); + end end - end player:EndEvent(); end \ No newline at end of file diff --git a/data/scripts/unique/wil0Battle01/PopulaceStandard/warburton.lua b/data/scripts/unique/wil0Battle01/PopulaceStandard/warburton.lua index 8f6c62a1..4dfcc5a4 100644 --- a/data/scripts/unique/wil0Battle01/PopulaceStandard/warburton.lua +++ b/data/scripts/unique/wil0Battle01/PopulaceStandard/warburton.lua @@ -2,5 +2,7 @@ require ("global") require ("quests/man/man0u0") function onEventStarted(player, npc, triggerName) + man0u0Quest = GetStaticActor("Man0u0"); + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent000_3", nil, nil, nil); player:EndEvent(); end \ No newline at end of file