From e009d55ab213be3e96f7344f5c49df9715cfdadd Mon Sep 17 00:00:00 2001 From: aidan Date: Tue, 7 Jul 2026 09:46:19 -0500 Subject: [PATCH] this zone somewhat works --- .../seers/quest/elementalworkshop2/EW2Zone.kt | 84 ++++++++++++------- 1 file changed, 52 insertions(+), 32 deletions(-) diff --git a/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop2/EW2Zone.kt b/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop2/EW2Zone.kt index 3980cdce9..fd3dae6cf 100644 --- a/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop2/EW2Zone.kt +++ b/Server/src/main/content/region/kandarin/seers/quest/elementalworkshop2/EW2Zone.kt @@ -4,59 +4,79 @@ import content.data.Quests import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncCart import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncCrane import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncFan +import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncSteamPress import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncTank import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.syncTankDoor +import content.region.kandarin.seers.quest.elementalworkshop2.EW2Listeners.Companion.toInstance import content.region.kandarin.seers.quest.elementalworkshop2.ElementalWorkshop2.Companion.EW2StageVarbit import core.api.* +import core.game.interaction.QueueStrength import core.game.node.entity.Entity import core.game.node.entity.player.Player -import core.game.node.scenery.SceneryBuilder import core.game.world.map.Location -import core.plugin.Initializable -import core.game.world.map.zone.MapZone +import core.game.world.map.build.DynamicRegion import core.game.world.map.zone.ZoneBorders -import core.game.world.map.zone.ZoneBuilder -import core.plugin.Plugin import org.rs09.consts.Scenery /** * This updates the Elemental Workshop II state whenever the player enters, - * keeping the equipment state synced to the saved varbits. + * keeping the equipment state synced to the saved varbits. The workshop + * area is a dynamic region, per OSRS wiki. */ -@Initializable -class EW2Zone : MapZone("Elemental Workshop II", true), Plugin { +class EW2Zone : MapArea { - override fun newInstance(arg: Any?): EW2Zone { - ZoneBuilder.configure(this) - return this + override fun defineAreaBorders(): Array { + return arrayOf(ZoneBorders(1920,5120,1983,5183)) } - override fun configure() { - super.register(ZoneBorders(1936,5128,1982,5172)) - } + override fun areaEnter(entity: Entity) { + if(entity is Player) { - // updates the workshop state based on the varbits for Elemental Workshop II - override fun enter(e: Entity?): Boolean { - if(e is Player) { + val baseRegion = 7760 - if(getQuestStage(e, Quests.ELEMENTAL_WORKSHOP_II) <= 5) { - setQuestStage(e, Quests.ELEMENTAL_WORKSHOP_II, 6) - setVarbit(e, EW2StageVarbit, 6, true) + // create the dynamic region + val dynamicRegion = DynamicRegion.create(baseRegion) + + // save the exit location back to the real world surface + setAttribute(entity, "ew2_exit_location", Location.create(2713, 3484, 0)) + + // find the player's offset from the base coordinates + val offsetX = entity.location.x - ((baseRegion shr 8) shl 6) + val offsetY = entity.location.y - ((baseRegion and 0xFF) shl 6) + + // apply offset to the dynamic region base + val destX = dynamicRegion.borders.southWestX + offsetX + val destY = dynamicRegion.borders.southWestY + offsetY + + // teleport the player into the instance + teleport(entity, Location.create(destX, destY, entity.location.z)) + + // save the dynamic region coords to the player to reference later + setAttribute(entity, ElementalWorkshop2.coordsX, dynamicRegion.borders.southWestX) + setAttribute(entity, ElementalWorkshop2.coordsY, dynamicRegion.borders.southWestY) + + // advance quest + if(getQuestStage(entity, Quests.ELEMENTAL_WORKSHOP_II) <= 5) { + setQuestStage(entity, Quests.ELEMENTAL_WORKSHOP_II, 6) + setVarbit(entity, EW2StageVarbit, 6, true) } - SceneryBuilder.add(core.game.node.scenery.Scenery(Scenery.DOOR_18651, Location.create(1953, 5162, 2), 1)) - syncCrane(e) - syncCart(e) - //syncSteamPress(e) - syncTank(e) - syncTankDoor(e) - syncFan(e) - } - return super.enter(e) - } + // sync the workshop state + queueScript(entity, 2, QueueStrength.SOFT) { _ -> - override fun fireEvent(identifier: String?, vararg args: Any?): Any { - return Unit + // add this door because I can't interact without parlour chairs todo test removing this on test + // toInstance(entity, Location.create(1953, 5162, 2)) + addScenery(core.game.node.scenery.Scenery(Scenery.DOOR_18651, location(33,42,2), 1)) + + syncCrane(entity) + syncCart(entity) + syncSteamPress(entity) + syncTank(entity) + syncTankDoor(entity) + syncFan(entity) + return@queueScript stopExecuting(entity) + } + } } } \ No newline at end of file