diff --git a/FFXIVClassic Map Server/actors/area/PrivateArea.cs b/FFXIVClassic Map Server/actors/area/PrivateArea.cs index ab788357..3c6f6726 100644 --- a/FFXIVClassic Map Server/actors/area/PrivateArea.cs +++ b/FFXIVClassic Map Server/actors/area/PrivateArea.cs @@ -35,7 +35,14 @@ namespace FFXIVClassic_Map_Server.actors.area public override SubPacket createScriptBindPacket(uint playerActorId) { List lParams; - lParams = LuaUtils.createLuaParamList("/Area/PrivateArea/" + className, false, true, zoneName, privateAreaName, 0x9E, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false); + + string path = className; + + if (className.ToLower().Contains("content")) + path = "Content/" + className; + + 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); } diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index dd5f5266..c453e82f 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -81,11 +81,9 @@ namespace FFXIVClassic_Map_Server.Actors return SetActorIdleAnimationPacket.buildPacket(actorId, playerActorId, animationId); } - public void setQuestIcon(Player player, bool hasIcon) + public void setQuestGraphic(Player player, int graphicNum) { - ActorSpecialGraphicPacket.buildPacket(player.actorId, actorId, hasIcon ? ActorSpecialGraphicPacket.QUEST : 0x0).debugPrintSubPacket(); - //player.queuePacket(ActorSpecialGraphicPacket.buildPacket(player.actorId, actorId, hasIcon ? ActorSpecialGraphicPacket.QUEST : 0x0)); - + player.queuePacket(SetActorQuestGraphicPacket.buildPacket(player.actorId, actorId, graphicNum)); } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index bcb44705..4c5849d8 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -125,7 +125,7 @@ namespace FFXIVClassic_Map_Server.Actors public Quest[] questScenario = new Quest[16]; public Quest[] questGuildleve = new Quest[8]; - public Director currentDirector;// = new OpeningDirector(0x46080012); + public Director currentDirector = new OpeningDirector(0x46080012); public PlayerWork playerWork = new PlayerWork(); @@ -590,6 +590,12 @@ namespace FFXIVClassic_Map_Server.Actors playerSession.queuePacket(packet, true, false); } + public void queuePackets(List packets) + { + foreach (SubPacket subpacket in packets) + playerSession.queuePacket(subpacket, true, false); + } + public void broadcastPacket(SubPacket packet, bool sendToSelf) { if (sendToSelf) @@ -969,7 +975,7 @@ namespace FFXIVClassic_Map_Server.Actors { for (int i = 0; i < questScenario.Length; i++) { - if (questScenario[i] != null && questScenario[i].actorName.Equals(name)) + if (questScenario[i] != null && questScenario[i].actorName.ToLower().Equals(name.ToLower())) return questScenario[i]; } @@ -991,7 +997,11 @@ namespace FFXIVClassic_Map_Server.Actors { if (directorType.Equals("openingDirector")) { - currentDirector = new OpeningDirector(0x46080012); + currentDirector = new OpeningDirector(0x46080012); + } + else if (directorType.Equals("QuestDirectorMan0l001")) + { + currentDirector = new QuestDirectorMan0l001(0x46080012); } queuePacket(RemoveActorPacket.buildPacket(actorId, 0x46080012)); @@ -1077,12 +1087,7 @@ namespace FFXIVClassic_Map_Server.Actors { //Update Instance - List instanceUpdatePackets = playerSession.updateInstance(zone.getActorsAroundActor(this, 50)); - foreach (BasePacket bp in instanceUpdatePackets) - { - // bp.debugPrintPacket(); - queuePacket(bp); - } + playerSession.updateInstance(zone.getActorsAroundActor(this, 50)); } diff --git a/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0L001..cs b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0L001..cs new file mode 100644 index 00000000..6f00a12a --- /dev/null +++ b/FFXIVClassic Map Server/actors/director/quest/QuestDirectorMan0L001..cs @@ -0,0 +1,39 @@ +using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.lua; +using FFXIVClassic_Map_Server.packets.send.actor; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.actors.director +{ + class QuestDirectorMan0l001 : Director + { + public QuestDirectorMan0l001(uint id) : base(id) + { + this.displayNameId = 0; + this.customDisplayName = "questDirect_ocn0Btl02_01"; + + this.actorName = "questDirect_ocn0Btl02_01@0C196"; + this.className = "QuestDirectorMan0l001"; + + this.eventConditions = new EventList(); + + List noticeEventList = new List(); + + noticeEventList.Add(new EventList.NoticeEventCondition("noticeEvent", 0xE, 0x0)); + noticeEventList.Add(new EventList.NoticeEventCondition("noticeRequest", 0x0, 0x1)); + + this.eventConditions.noticeEventConditions = noticeEventList; + } + + public override SubPacket createScriptBindPacket(uint playerActorId) + { + List lParams; + lParams = LuaUtils.createLuaParamList("/Director/Quest/QuestDirectorMan0l001", false, false, false, false, 0x7532); + return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams); + } + } +} diff --git a/FFXIVClassic Map Server/actors/quest/Quest.cs b/FFXIVClassic Map Server/actors/quest/Quest.cs index c125548e..707349b8 100644 --- a/FFXIVClassic Map Server/actors/quest/Quest.cs +++ b/FFXIVClassic Map Server/actors/quest/Quest.cs @@ -68,7 +68,7 @@ namespace FFXIVClassic_Map_Server.Actors return false; } else - return (questFlags & (1 << bitIndex)) == 1; + return (questFlags & (1 << bitIndex)) == (1 << bitIndex); } public int GetPhase() diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index 567aec3c..2a966f81 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -113,7 +113,7 @@ namespace FFXIVClassic_Map_Server.dataobjects } - public List updateInstance(List list) + public void updateInstance(List list) { List basePackets = new List(); List removeActorSubpackets = new List(); @@ -124,14 +124,11 @@ namespace FFXIVClassic_Map_Server.dataobjects { if (!list.Contains(actorInstanceList[i])) { - removeActorSubpackets.Add(RemoveActorPacket.buildPacket(playerActor.actorId, actorInstanceList[i].actorId)); + getActor().queuePacket(RemoveActorPacket.buildPacket(playerActor.actorId, actorInstanceList[i].actorId)); actorInstanceList.RemoveAt(i); } } - if (removeActorSubpackets.Count != 0) - basePackets.Add(BasePacket.createPacket(removeActorSubpackets, true, false)); - //Add new actors or move for (int i = 0; i < list.Count; i++) { @@ -142,21 +139,22 @@ namespace FFXIVClassic_Map_Server.dataobjects if (actorInstanceList.Contains(actor)) { - posUpdateSubpackets.Add(actor.createPositionUpdatePacket(playerActor.actorId)); + getActor().queuePacket(actor.createPositionUpdatePacket(playerActor.actorId)); } else { - basePackets.Add(actor.getSpawnPackets(playerActor.actorId, 1)); - basePackets.Add(actor.getInitPackets(playerActor.actorId)); - basePackets.Add(actor.getSetEventStatusPackets(playerActor.actorId)); + getActor().queuePacket(actor.getSpawnPackets(playerActor.actorId, 1)); + getActor().queuePacket(actor.getInitPackets(playerActor.actorId)); + getActor().queuePacket(actor.getSetEventStatusPackets(playerActor.actorId)); actorInstanceList.Add(actor); + + if (actor is Npc) + { + LuaEngine.doActorOnSpawn(getActor(), (Npc)actor); + } } } - if (posUpdateSubpackets.Count > 0) - basePackets.Add(BasePacket.createPacket(posUpdateSubpackets, true, false)); - - return basePackets; } diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 7a7603bd..8d8d92eb 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server; +using FFXIVClassic_Lobby_Server.common; using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.Actors; @@ -42,16 +43,16 @@ namespace FFXIVClassic_Map_Server.lua { Script script = loadScript(luaPath); + if (script == null) + return null; + DynValue result = script.Call(script.Globals["init"], target); List lparams = LuaUtils.createLuaParamList(result); return lparams; } else { - List sendError = new List(); - sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); - player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName())); - player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.getName())); return null; } } @@ -78,6 +79,9 @@ namespace FFXIVClassic_Map_Server.lua { Script script = loadScript(luaPath); + if (script == null) + return; + //Have to do this to combine LuaParams List objects = new List(); objects.Add(player); @@ -93,10 +97,7 @@ namespace FFXIVClassic_Map_Server.lua } else { - List sendError = new List(); - sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); - player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName())); - player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.getName())); } } @@ -108,17 +109,17 @@ namespace FFXIVClassic_Map_Server.lua if (File.Exists(luaPath)) { Script script = loadScript(luaPath); - + + if (script == null) + return; + //Run Script if (!script.Globals.Get("onSpawn").IsNil()) script.Call(script.Globals["onSpawn"], player, target); } else { - List sendError = new List(); - sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); - player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName())); - player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.getName())); } } @@ -138,11 +139,14 @@ namespace FFXIVClassic_Map_Server.lua { Script script = loadScript(luaPath); + if (script == null) + return; + //Have to do this to combine LuaParams List objects = new List(); objects.Add(player); objects.Add(target); - objects.Add(eventUpdate.step); + objects.Add(eventUpdate.val2); objects.AddRange(LuaUtils.createLuaParamObjectList(eventUpdate.luaParams)); //Run Script @@ -151,10 +155,7 @@ namespace FFXIVClassic_Map_Server.lua } else { - List sendError = new List(); - sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); - player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName())); - player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.getName())); } } @@ -165,7 +166,10 @@ namespace FFXIVClassic_Map_Server.lua if (File.Exists(luaPath)) { Script script = loadScript(luaPath); - + + if (script == null) + return; + //Run Script if (!script.Globals.Get("onZoneIn").IsNil()) script.Call(script.Globals["onZoneIn"], player); @@ -178,6 +182,9 @@ namespace FFXIVClassic_Map_Server.lua { Script script = loadScript(FILEPATH_PLAYER); + if (script == null) + return; + //Run Script if (!script.Globals.Get("onZoneIn").IsNil()) script.Call(script.Globals["onZoneIn"], player); @@ -192,9 +199,26 @@ namespace FFXIVClassic_Map_Server.lua script.Globals["getStaticActor"] = (Func)Server.getStaticActors; script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(filename); + + try + { + script.DoFile(filename); + } + catch(SyntaxErrorException e) + { + Log.error(String.Format("LUAERROR: {0}.", e.DecoratedMessage)); + return null; + } return script; } + private static void SendError(Player player, string message) + { + List sendError = new List(); + sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); + player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); + player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + } + } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs index d2604645..1efd25dd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.actor { - class ActorSpecialGraphicPacket + class SetActorQuestGraphicPacket { public const int NONE = 0x0; public const int QUEST = 0x2;