From c071b9d684ae65dd41ec72a01d3d50992ad69622 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 25 Jun 2017 15:11:35 -0400 Subject: [PATCH] Pushing new Aetheryte scripts that handle when GL is active. Finally added an error check for some lua callbacks. --- FFXIVClassic Map Server/lua/LuaEngine.cs | 30 ++++++++--- .../npc/object/aetheryte/AetheryteChild.lua | 52 ++++++++++++++++--- .../npc/object/aetheryte/AetheryteParent.lua | 39 +++++++++++--- 3 files changed, 99 insertions(+), 22 deletions(-) diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 9ffcf5e4..d8d4603f 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -112,10 +112,18 @@ namespace FFXIVClassic_Map_Server.lua { if (mSleepingOnPlayerEvent.ContainsKey(player.actorId)) { - Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId]; - mSleepingOnPlayerEvent.Remove(player.actorId); - DynValue value = coroutine.Resume(LuaUtils.CreateLuaParamObjectList(args)); - ResolveResume(null, coroutine, value); + try + { + Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId]; + mSleepingOnPlayerEvent.Remove(player.actorId); + DynValue value = coroutine.Resume(LuaUtils.CreateLuaParamObjectList(args)); + ResolveResume(null, coroutine, value); + } + catch (ScriptRuntimeException e) + { + LuaEngine.SendError(player, String.Format("OnEventUpdated: {0}", e.DecoratedMessage)); + player.EndEvent(); + } } else player.EndEvent(); @@ -364,9 +372,17 @@ namespace FFXIVClassic_Map_Server.lua if (mSleepingOnPlayerEvent.ContainsKey(player.actorId)) { Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId]; - mSleepingOnPlayerEvent.Remove(player.actorId); - DynValue value = coroutine.Resume(); - ResolveResume(null, coroutine, value); + mSleepingOnPlayerEvent.Remove(player.actorId); + + try{ + DynValue value = coroutine.Resume(); + ResolveResume(null, coroutine, value); + } + catch (ScriptRuntimeException e) + { + LuaEngine.SendError(player, String.Format("OnEventStarted: {0}", e.DecoratedMessage)); + player.EndEvent(); + } } else CallLuaFunction(player, target, "onEventStarted", false, LuaUtils.CreateLuaParamObjectList(lparams)); diff --git a/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua b/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua index ef21bf73..ff1548ec 100644 --- a/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua +++ b/data/scripts/base/chara/npc/object/aetheryte/AetheryteChild.lua @@ -22,16 +22,40 @@ eventGLJoin () - Ask to join party leader's leve require ("global") require ("aetheryte") require ("utils") +require ("guildleve") function init(npc) return false, false, 0, 0; end -function onEventStarted(player, aetheryte, triggerName) +function onEventStarted(player, aetheryte, triggerName) + + if (player:GetGuildleveDirector() ~= nil) then + doGuildleveMenu(player, aetheryte); + else + doNormalMenu(player, aetheryte); + end + + player:EndEvent(); +end - aetheryteId = aetheryte:GetActorClassId(); - parentNode = aetheryteChildLinks[aetheryteId]; - menuChoice = callClientFunction(player, "eventAetheryteChildSelect", true, parentNode, 100, 1); +function doGuildleveMenu(player, aetheryte) + + local currentGLDirector = player:GetGuildleveDirector(); + local choice = callClientFunction(player, "eventGLPlay", currentGLDirector.guildleveId, true, 1, 500, 400, guardian, 8, currentGLDirector.selectedDifficulty, 2); + + --Abandon + if (choice == 6) then + currentGLDirector:AbandonGuildleve(); + end + +end + +function doNormalMenu(player, aetheryte) + + local aetheryteId = aetheryte:GetActorClassId(); + local parentNode = aetheryteChildLinks[aetheryteId]; + local menuChoice = callClientFunction(player, "eventAetheryteChildSelect", true, parentNode, 100, 1); --Teleport if (menuChoice == 2) then @@ -57,22 +81,36 @@ function onEventStarted(player, aetheryte, triggerName) player:SendGameMessage(player, aetheryte, 29, 0x20, 2, 10); player:SendGameMessage(player, aetheryte, 30, 0x20, 3, 5); end - - player:EndEvent(); end function doLevequestInit(player, aetheryte) + local worldMaster = GetWorldMaster(); ::SELECT_LOOP:: unknown, glId = callClientFunction(player, "eventGLSelect", 0x0); if (glId ~= 0) then ::SELECT_DETAIL:: - unknown, begin = callClientFunction(player, "eventGLSelectDetail", glId, 0xa, 0xf4241, 1000, 0, 0, 0, true, false); + guildleveData = GetGuildleveGamedata(glId); + + if (guildleveData == nil) then + player:SendMessage(0x20, "", "An error has occured... aborting."); + return; + end + + unknown, begin = callClientFunction(player, "eventGLSelectDetail", glId, 0xa, 0xf4241, 1000, 0, 0, 0, true, false); if (begin) then ::SELECT_DIFFICULTY:: + player:SendGameMessage(worldMaster, 50014, 0x20); --"Please select a difficulty level. This may be lowered later." difficulty = callClientFunction(player, "eventGLDifficulty", glId); if (difficulty == nil) then goto SELECT_DETAIL; end confirmResult = callClientFunction(player, "eventGLStart", glId, difficulty, 1, 10, 20, 0, 0, 0, 0); if (confirmResult == nil) then goto SELECT_DIFFICULTY; else + + player:SendGameMessage(worldMaster, 50036, 0x20, glId, player); + player:PlayAnimation(getGLStartAnimationFromSheet(guildleveData.borderId, guildleveData.plateId, true)); + director = player:GetZone():CreateGuildleveDirector(glId, difficulty, player); + player:AddDirector(director); + director:StartDirector(true, glId) + end else goto SELECT_LOOP; diff --git a/data/scripts/base/chara/npc/object/aetheryte/AetheryteParent.lua b/data/scripts/base/chara/npc/object/aetheryte/AetheryteParent.lua index b9a4aa85..1917a37b 100644 --- a/data/scripts/base/chara/npc/object/aetheryte/AetheryteParent.lua +++ b/data/scripts/base/chara/npc/object/aetheryte/AetheryteParent.lua @@ -11,9 +11,8 @@ eventGLSelect(?) - Open GL selector eventGLSelectDetail(glid, ?, reward, rewardQuantity, subreward, subrewardQuantity, faction, ?, completed) - Show GL details eventGLDifficulty() - Open difficulty selector eventGLStart(glId, difficulty, evaluatingFaction, areaFactionStanding, factionReward, warningBoundByDuty, warningTooFar, warningYouCannotRecieve, warningChangingClass) - Confirmation dialog - eventGLBoost(currentFavor, minNeeded) - Ask player for Guardian Aspect -eventGLPlay(??) - Open Menu (GL active version) +eventGLPlay(glId, showLeveLink, leveLinkFaction, leveLinkFactionStanding, leveLinkReward, guardianFavorAmount, guardianFavorNeeded, currentDifficulty, jobNameForChange) - Open Menu (GL active version) eventGLReward (glId, clearTime, missionBonus, difficultyBonus, factionNumber, factionBonus, factionCredit, reward, rewardQuantity, subreward, subrewardQuantity, difficulty) - Open reward window eventGLJoin () - Ask to join party leader's leve @@ -33,7 +32,30 @@ function init(npc) end function onEventStarted(player, aetheryte, triggerName) - + + if (player:GetGuildleveDirector() ~= nil) then + doGuildleveMenu(player, aetheryte); + else + doNormalMenu(player, aetheryte); + end + + player:EndEvent(); + +end + +function doGuildleveMenu(player, aetheryte) + + local currentGLDirector = player:GetGuildleveDirector(); + local choice = callClientFunction(player, "eventGLPlay", currentGLDirector.guildleveId, true, 1, 500, 400, guardian, 8, currentGLDirector.selectedDifficulty, 2); + + --Abandon + if (choice == 6) then + currentGLDirector:AbandonGuildleve(); + end + +end + +function doNormalMenu(player, aetheryte) local aetheryteId = aetheryte:GetActorClassId(); local childNodes = aetheryteParentLinks[aetheryteId]; @@ -94,9 +116,6 @@ function onEventStarted(player, aetheryte, triggerName) end end end - - player:EndEvent(); - end function doLevequestInit(player, aetheryte) @@ -119,10 +138,14 @@ function doLevequestInit(player, aetheryte) difficulty = callClientFunction(player, "eventGLDifficulty", glId); if (difficulty == nil) then goto SELECT_DETAIL; end confirmResult = callClientFunction(player, "eventGLStart", glId, difficulty, 1, guildleveData.favorCount, 20, 0, 0, 0, 0); - if (confirmResult == nil) then goto SELECT_DIFFICULTY; else - director = player:GetZone():CreateGuildleveDirector("Guildleve/PrivateGLBattleTutorial", glId); + if (confirmResult == nil) then goto SELECT_DIFFICULTY; else + + player:SendGameMessage(worldMaster, 50036, 0x20, glId, player); + player:PlayAnimation(getGLStartAnimationFromSheet(guildleveData.borderId, guildleveData.plateId, true)); + director = player:GetZone():CreateGuildleveDirector(glId, difficulty, player); player:AddDirector(director); director:StartDirector(true, glId) + end else goto SELECT_LOOP;