From bdc0756655f9ffb7d587f1d449d20c0c70d6c1eb Mon Sep 17 00:00:00 2001 From: Charlie Unfricht Date: Fri, 26 Aug 2022 00:36:04 -0400 Subject: [PATCH 1/4] Dispose base NPC dialogue --- scripts/npc/2040003.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/npc/2040003.js b/scripts/npc/2040003.js index d2022e19f6..064502fcb0 100644 --- a/scripts/npc/2040003.js +++ b/scripts/npc/2040003.js @@ -12,6 +12,7 @@ function start() { status++; } else { cm.sendOk("Access to #bToy Factory#k is restricted to the public."); + cm.dispose(); } } From 6e578a71a1bca6f515ea7d4ea9d4a3f5c090b55d Mon Sep 17 00:00:00 2001 From: Charlie Unfricht Date: Fri, 26 Aug 2022 00:38:30 -0400 Subject: [PATCH 2/4] Add default portal handler script for exit room --- scripts/portal/ludi021.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 scripts/portal/ludi021.js diff --git a/scripts/portal/ludi021.js b/scripts/portal/ludi021.js new file mode 100644 index 0000000000..d6fca07257 --- /dev/null +++ b/scripts/portal/ludi021.js @@ -0,0 +1,13 @@ +/* + Exit Portal + Map: Hidden Street: Secret Passage (922000009) + - Remove quest items from player's inventory (Mechanical Parts - 4031092) + - Returns user to Toy Factory - 220020600 + - Reactors are reset and shuffled when event instance is created - not here +*/ + +function enter(pi) { + pi.removeAll(4031092); + pi.warp(220020600); + return true; +} \ No newline at end of file From 2ed69407de3921b767b25e1ab837b3d998e15b0a Mon Sep 17 00:00:00 2001 From: Charlie Unfricht Date: Fri, 26 Aug 2022 01:20:57 -0400 Subject: [PATCH 3/4] Add instanced event handling --- scripts/event/q3239.js | 73 +++++++++++++++++++++++++++++++++++++++ scripts/npc/2040003.js | 77 ++++++++++++++++++++---------------------- 2 files changed, 110 insertions(+), 40 deletions(-) create mode 100644 scripts/event/q3239.js diff --git a/scripts/event/q3239.js b/scripts/event/q3239.js new file mode 100644 index 0000000000..0546019093 --- /dev/null +++ b/scripts/event/q3239.js @@ -0,0 +1,73 @@ +var entryMap; +var exitMap; +var eventLength = 20; + +function init() { + em.setProperty("noEntry", "false"); + entryMap = em.getChannelServer().getMapFactory().getMap(922000000); + exitMap = em.getChannelServer().getMapFactory().getMap(922000009); +} + +function setup(level, lobbyid) { + var eim = em.newInstance("q3239_" + lobbyid); + return eim; +} + +function playerEntry(eim, player) { + var im = eim.getInstanceMap(entryMap.getId()); + + // Reset instance + im.clearDrops(); + im.resetReactors(); + im.shuffleReactors(); + + // Start timer + eim.startEventTimer(eventLength * 60 * 1000); + + // Warp player and mark event as occupied + player.changeMap(entryMap, 0); + em.setProperty("noEntry", "true"); +} + +function changedMap(eim, player, mapid) { + if (mapid != entryMap.getId()) + playerExit(eim, player); +} + +function playerExit(eim, player) { + end(eim); +} + +function playerDisconnected(eim, player) { + end(eim); +} + +function scheduledTimeout(eim) { + end(eim); +} + +function end(eim) { + var party = eim.getPlayers(); // should only ever be one player + for (var i = 0; i < party.size(); i++) { + var player = party.get(i); + eim.unregisterPlayer(player); + player.changeMap(exitMap); + } + + eim.dispose(); + em.setProperty("noEntry", "false"); +} + +// Stub/filler functions + +function disbandParty(eim, player) {} +function afterSetup(eim) {} +function playerUnregistered(eim, player) {} +function changedLeader(eim, leader) {} +function leftParty(eim, player) {} +function clearPQ(eim) {} +function dispose() {} +function cancelSchedule() {} +function allMonstersDead(eim) {} +function monsterValue(eim, mobId) {} +function monsterKilled(mob, eim) {} diff --git a/scripts/npc/2040003.js b/scripts/npc/2040003.js index 064502fcb0..8d7f1b34dc 100644 --- a/scripts/npc/2040003.js +++ b/scripts/npc/2040003.js @@ -1,51 +1,48 @@ var status = 0; -var entry; +var em; +var eim; + +function sendBaseText() { + cm.sendOk("Access is restricted to the public."); + cm.dispose(); +} function start() { - if (cm.getPlayer().getMapId() == 922000000) { - entry = 0; - cm.sendYesNo("Do you wish to quit this stage?"); - status++; - } else if (cm.isQuestStarted(3239)) { - entry = 1; - cm.sendYesNo("Do you want to enter #bToy Factory#k?"); - status++; - } else { - cm.sendOk("Access to #bToy Factory#k is restricted to the public."); - cm.dispose(); + em = cm.getEventManager("q3239"); + if (em != null) + eim = cm.getEventInstance(); + + if (em == null) { // No event handler + sendBaseText(); + return; + } + else if (eim == null && !cm.isQuestStarted(3239)) { // Not in instance, quest is not in progress + sendBaseText(); + return; + } + + if (eim == null) { // Not in instance + cm.sendYesNo("Are you ready to enter #b#m922000000##k?"); + } + else { // Inside the instance + cm.sendYesNo("Are you ready to leave this place?"); } } function action(mode, type, selection) { - if (status == 1) { - if (entry == 0) { - if (mode <= 0) { - cm.sendOk("Ok. Call me if you urge to exit, then."); - cm.dispose(); - return; - } + if (mode < 1) { + cm.dispose(); + return; + } - cm.warp(922000009, 0); - if (!(cm.isQuestStarted(3239) && cm.haveItem(4031092, 10))) { - cm.removeAll(4031092); - } - cm.dispose(); - } else { - if (mode <= 0) { - cm.dispose(); - return; - } - - if (cm.getWarpMap(922000000).countPlayers() == 0) { - cm.warp(922000000, 0); - if (!(cm.isQuestStarted(3239) && cm.haveItem(4031092, 10))) { - cm.removeAll(4031092); - } - } else { - cm.sendOk("Someone else is already attempting the parts. Wait for them to finish before you enter."); - } - - cm.dispose(); + if (eim == null) { // Not in instance, ready to enter + cm.removeAll(4031092); // This doesn't belong here - these should be removed on exit, handled by portal script + if (!em.startInstance(cm.getPlayer())) { + cm.sendOk("Someone else is already gathering some parts for me. Please wait until the area is cleared."); } } + else { // Inside the instance, ready to exit + eim.removePlayer(cm.getPlayer()); // This will end the event and warp the player out + } + cm.dispose(); } \ No newline at end of file From a67666af6204801481f18a503a5a8796229acd48 Mon Sep 17 00:00:00 2001 From: Charlie Unfricht Date: Fri, 26 Aug 2022 01:27:12 -0400 Subject: [PATCH 4/4] Set Mechanical Parts as event exclusive item for removal on exit --- scripts/event/q3239.js | 1 + scripts/npc/2040003.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/event/q3239.js b/scripts/event/q3239.js index 0546019093..dd3d4096d9 100644 --- a/scripts/event/q3239.js +++ b/scripts/event/q3239.js @@ -10,6 +10,7 @@ function init() { function setup(level, lobbyid) { var eim = em.newInstance("q3239_" + lobbyid); + eim.setExclusiveItems([4031092]); return eim; } diff --git a/scripts/npc/2040003.js b/scripts/npc/2040003.js index 8d7f1b34dc..6853be750b 100644 --- a/scripts/npc/2040003.js +++ b/scripts/npc/2040003.js @@ -36,7 +36,7 @@ function action(mode, type, selection) { } if (eim == null) { // Not in instance, ready to enter - cm.removeAll(4031092); // This doesn't belong here - these should be removed on exit, handled by portal script + cm.removeAll(4031092); // This handling is done in the portal script and in the event end, just for legacy purposes here if (!em.startInstance(cm.getPlayer())) { cm.sendOk("Someone else is already gathering some parts for me. Please wait until the area is cleared."); }