From b0445b87503a656a00095e642121150eb7cc213c Mon Sep 17 00:00:00 2001 From: Player Name Date: Fri, 19 Jun 2026 19:50:05 +0200 Subject: [PATCH] Restore incorrect spaces to tabs to facilitate review --- .../item/withitem/SoftclayPlugin.java | 218 +- .../agility/brimhaven/BrimhavenArena.java | 552 +-- .../crafting/spinning/SpinningPulse.java | 160 +- .../woodcutting/WoodcuttingSkillPulse.java | 418 +-- .../quest/witchshouse/NoraTHaggNPC.java | 208 +- .../witchshouse/WitchsExperimentNPC.java | 268 +- .../thetouristrap/TouristTrapPlugin.java | 3298 ++++++++--------- .../seers/handlers/RangingGuildPlugin.java | 2326 ++++++------ Server/src/main/core/game/bots/PvMBots.java | 216 +- .../core/game/interaction/MovementPulse.java | 340 +- .../player/info/login/LoginConfiguration.java | 494 +-- 11 files changed, 4249 insertions(+), 4249 deletions(-) diff --git a/Server/src/main/content/global/handlers/item/withitem/SoftclayPlugin.java b/Server/src/main/content/global/handlers/item/withitem/SoftclayPlugin.java index fc63daa34..bf445c470 100644 --- a/Server/src/main/content/global/handlers/item/withitem/SoftclayPlugin.java +++ b/Server/src/main/content/global/handlers/item/withitem/SoftclayPlugin.java @@ -21,127 +21,127 @@ import java.util.Objects; @Initializable public final class SoftclayPlugin extends UseWithHandler { - /** - * Represents the clay item. - */ - private static final Item CLAY = new Item(Items.CLAY_434); + /** + * Represents the clay item. + */ + private static final Item CLAY = new Item(Items.CLAY_434); - /** - * Represents the soft clay item. - */ - private static final Item SOFT_CLAY = new Item(Items.SOFT_CLAY_1761); + /** + * Represents the soft clay item. + */ + private static final Item SOFT_CLAY = new Item(Items.SOFT_CLAY_1761); - /** - * Represents the bowl of water item. - */ - private static final Item BOWL_OF_WATER = new Item(Items.BOWL_OF_WATER_1921); + /** + * Represents the bowl of water item. + */ + private static final Item BOWL_OF_WATER = new Item(Items.BOWL_OF_WATER_1921); - /** - * Represents the empty bowl item. - */ - private static final Item BOWL = new Item(Items.BOWL_1923); + /** + * Represents the empty bowl item. + */ + private static final Item BOWL = new Item(Items.BOWL_1923); - /** - * Represents the empty bucket item. - */ - private static final Item BUCKET = new Item(Items.BUCKET_1925); + /** + * Represents the empty bucket item. + */ + private static final Item BUCKET = new Item(Items.BUCKET_1925); - /** - * Represents the bucket of water item. - */ - private static final Item BUCKET_OF_WATER = new Item(Items.BUCKET_OF_WATER_1929); + /** + * Represents the bucket of water item. + */ + private static final Item BUCKET_OF_WATER = new Item(Items.BUCKET_OF_WATER_1929); - /** - * Represents the jug item. - */ - private static final Item JUG = new Item(Items.JUG_1935); + /** + * Represents the jug item. + */ + private static final Item JUG = new Item(Items.JUG_1935); - /** - * Represents the jug of water item. - */ - private static final Item JUG_OF_WATER = new Item(Items.JUG_OF_WATER_1937); + /** + * Represents the jug of water item. + */ + private static final Item JUG_OF_WATER = new Item(Items.JUG_OF_WATER_1937); - /** - * Constructs a new {@code SoftclayPlugin} {@code Object}. - */ - public SoftclayPlugin() { - super(434); - } + /** + * Constructs a new {@code SoftclayPlugin} {@code Object}. + */ + public SoftclayPlugin() { + super(434); + } - @Override - public Plugin newInstance(Object arg) throws Throwable { - addHandler(1921, ITEM_TYPE, this); - addHandler(1929, ITEM_TYPE, this); - addHandler(1937, ITEM_TYPE, this); - return this; - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1921, ITEM_TYPE, this); + addHandler(1929, ITEM_TYPE, this); + addHandler(1937, ITEM_TYPE, this); + return this; + } - @Override - public boolean handle(final NodeUsageEvent event) { - final Player player = event.getPlayer(); - SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, SOFT_CLAY) { - @Override - public void create(final int amount, int index) { - player.getPulseManager().run(new Pulse(2, player) { - int count; + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, SOFT_CLAY) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new Pulse(2, player) { + int count; - @Override - public boolean pulse() { - if (!SoftclayPlugin.this.create(player, event)) { - return true; - } - return ++count >= amount; - } - }); - } + @Override + public boolean pulse() { + if (!SoftclayPlugin.this.create(player, event)) { + return true; + } + return ++count >= amount; + } + }); + } - @Override - public int getAll(int index) { - return player.getInventory().getAmount(CLAY); - } - }; - if (player.getInventory().getAmount(CLAY) == 1) { - create(player, event); - } else { - handler.open(); - } - return true; - } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(CLAY); + } + }; + if (player.getInventory().getAmount(CLAY) == 1) { + create(player, event); + } else { + handler.open(); + } + return true; + } - /** - * Creates a soft clay. - * @param player the player. - * @param event the event. - * @return {@code True} if so. - */ - private boolean create(final Player player, NodeUsageEvent event) { - Item removeItem = null; - Item returnItem = null; - if (event.getUsedItem().getId() == Items.BUCKET_OF_WATER_1929 || event.getBaseItem().getId() == Items.BUCKET_OF_WATER_1929) { - removeItem = BUCKET_OF_WATER; - returnItem = BUCKET; - } - if (event.getUsedItem().getId() == Items.BOWL_OF_WATER_1921 || event.getBaseItem().getId() == Items.BOWL_OF_WATER_1921) { - removeItem = BOWL_OF_WATER; - returnItem = BOWL; - } - if (event.getUsedItem().getId() == Items.JUG_OF_WATER_1937 || event.getBaseItem().getId() == Items.JUG_OF_WATER_1937) { - removeItem = JUG_OF_WATER; - returnItem = JUG; - } + /** + * Creates a soft clay. + * @param player the player. + * @param event the event. + * @return {@code True} if so. + */ + private boolean create(final Player player, NodeUsageEvent event) { + Item removeItem = null; + Item returnItem = null; + if (event.getUsedItem().getId() == Items.BUCKET_OF_WATER_1929 || event.getBaseItem().getId() == Items.BUCKET_OF_WATER_1929) { + removeItem = BUCKET_OF_WATER; + returnItem = BUCKET; + } + if (event.getUsedItem().getId() == Items.BOWL_OF_WATER_1921 || event.getBaseItem().getId() == Items.BOWL_OF_WATER_1921) { + removeItem = BOWL_OF_WATER; + returnItem = BOWL; + } + if (event.getUsedItem().getId() == Items.JUG_OF_WATER_1937 || event.getBaseItem().getId() == Items.JUG_OF_WATER_1937) { + removeItem = JUG_OF_WATER; + returnItem = JUG; + } - if (player.getInventory().containsItem(CLAY) && player.getInventory().containsItem(Objects.requireNonNull(removeItem))) { - player.getInventory().remove(removeItem); - player.getInventory().remove(CLAY); - player.getPacketDispatch().sendMessage("You mix the clay and water. You now have some soft, workable clay."); - player.getInventory().add(SOFT_CLAY); - player.getInventory().add(returnItem); - if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.LUMBRIDGE, 0, 6) && player.getLocation().getRegionId() == 12341) { - player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 6); - } - return true; - } else { - return false; - } - } + if (player.getInventory().containsItem(CLAY) && player.getInventory().containsItem(Objects.requireNonNull(removeItem))) { + player.getInventory().remove(removeItem); + player.getInventory().remove(CLAY); + player.getPacketDispatch().sendMessage("You mix the clay and water. You now have some soft, workable clay."); + player.getInventory().add(SOFT_CLAY); + player.getInventory().add(returnItem); + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.LUMBRIDGE, 0, 6) && player.getLocation().getRegionId() == 12341) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 6); + } + return true; + } else { + return false; + } + } } diff --git a/Server/src/main/content/global/skill/agility/brimhaven/BrimhavenArena.java b/Server/src/main/content/global/skill/agility/brimhaven/BrimhavenArena.java index c046d73f7..e70f39fa8 100644 --- a/Server/src/main/content/global/skill/agility/brimhaven/BrimhavenArena.java +++ b/Server/src/main/content/global/skill/agility/brimhaven/BrimhavenArena.java @@ -38,302 +38,302 @@ import static core.api.ContentAPIKt.*; @Initializable public final class BrimhavenArena extends MapZone implements Plugin { - /** - * The location based traps. - */ - private static final Map LOCATION_TRAPS = new HashMap<>(); + /** + * The location based traps. + */ + private static final Map LOCATION_TRAPS = new HashMap<>(); - /** - * The overlay component. - */ - private static final Component OVERLAY = new Component(5); + /** + * The overlay component. + */ + private static final Component OVERLAY = new Component(5); - /** - * The ticket dispenser locations. - */ - private static final Location[] DISPENSERS = new Location[24]; + /** + * The ticket dispenser locations. + */ + private static final Location[] DISPENSERS = new Location[24]; - /** - * The agility ticket reward item. - */ - private static final Item TICKET = new Item(2996); + /** + * The agility ticket reward item. + */ + private static final Item TICKET = new Item(2996); - /** - * If the saw blade is currently active. - */ - public static boolean sawBladeActive; + /** + * If the saw blade is currently active. + */ + public static boolean sawBladeActive; - /** - * Constructs a new {@code BrimhavenArena} {@code Object}. - */ - public BrimhavenArena() { - super("Brimhaven agility arena", true); - } + /** + * Constructs a new {@code BrimhavenArena} {@code Object}. + */ + public BrimhavenArena() { + super("Brimhaven agility arena", true); + } - /** - * Sets the current ticket dispenser target. - * - * @param player The player. - */ - private void setDispenser(Player player) { - if (!player.getAttribute("brim-tagged", false)) { - player.setAttribute("brim-tagcount", 0); - } - player.setAttribute("brim-tagged", false); - setVarp(player, 309, 0); - int index = RandomFunction.randomize(DISPENSERS.length); - if (index == player.getAttribute("brim-tag", -1)) { - index = (index + 1) % DISPENSERS.length; - } - int iconSlot = player.getAttribute("brim-icon", -1); - if (iconSlot > -1) { - HintIconManager.removeHintIcon(player, iconSlot); - } - player.setAttribute("brim-tag", index); - player.setAttribute("brim-icon", HintIconManager.registerHeightHintIcon(player, DISPENSERS[index], 50)); - } + /** + * Sets the current ticket dispenser target. + * + * @param player The player. + */ + private void setDispenser(Player player) { + if (!player.getAttribute("brim-tagged", false)) { + player.setAttribute("brim-tagcount", 0); + } + player.setAttribute("brim-tagged", false); + setVarp(player, 309, 0); + int index = RandomFunction.randomize(DISPENSERS.length); + if (index == player.getAttribute("brim-tag", -1)) { + index = (index + 1) % DISPENSERS.length; + } + int iconSlot = player.getAttribute("brim-icon", -1); + if (iconSlot > -1) { + HintIconManager.removeHintIcon(player, iconSlot); + } + player.setAttribute("brim-tag", index); + player.setAttribute("brim-icon", HintIconManager.registerHeightHintIcon(player, DISPENSERS[index], 50)); + } - @Override - public boolean enter(Entity entity) { - if (entity instanceof Player) { - Player player = (Player) entity; - player.getInterfaceManager().openOverlay(OVERLAY); - setDispenser(player); - } - return super.enter(entity); - } + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = (Player) entity; + player.getInterfaceManager().openOverlay(OVERLAY); + setDispenser(player); + } + return super.enter(entity); + } - @Override - public boolean leave(Entity entity, boolean logout) { - if (entity instanceof Player && !logout) { - Player player = (Player) entity; - player.getInterfaceManager().closeOverlay(); - player.removeAttribute("brim-tag"); - player.removeAttribute("brim-tagcount"); - int iconSlot = player.getAttribute("brim-icon", -1); - if (iconSlot > -1) { - HintIconManager.removeHintIcon(player, iconSlot); - player.removeAttribute("brim-icon"); - } - } - return super.enter(entity); - } + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player && !logout) { + Player player = (Player) entity; + player.getInterfaceManager().closeOverlay(); + player.removeAttribute("brim-tag"); + player.removeAttribute("brim-tagcount"); + int iconSlot = player.getAttribute("brim-icon", -1); + if (iconSlot > -1) { + HintIconManager.removeHintIcon(player, iconSlot); + player.removeAttribute("brim-icon"); + } + } + return super.enter(entity); + } - @Override - public boolean interact(Entity entity, Node node, Option option) { - if (node instanceof Scenery) { - Scenery object = (Scenery) node; - if (object.getId() == 3610) { - ClimbActionHandler.climb((Player) entity, Animation.create(828), object.getLocation().transform(0, 0, 3)); - return true; - } - if (object.getId() == 3608 || object.getId() == 3581) { - Player player = (Player) entity; - if (!object.getLocation().equals(DISPENSERS[player.getAttribute("brim-tag", 0)])) { - player.getPacketDispatch().sendMessage("Tag the pillar indicated by the yellow arrow to get an Agility ticket."); - return true; - } - if (player.getAttribute("brim-tagged", false)) { - player.getPacketDispatch().sendMessage("You have already tagged this pillar."); - return true; - } - player.setAttribute("brim-tagged", true); - int tags = player.getAttribute("brim-tagcount", 0) + 1; - player.setAttribute("brim-tagcount", tags); - setVarp(player, 309, 4); - if (tags > 1) { - int amount = 1; - if (!player.getInventory().add(new Item(TICKET.getId(), amount))) { - GroundItemManager.create(new GroundItem(new Item(TICKET.getId(), amount), player.getLocation(), player)); - } - player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 0); - player.getDialogueInterpreter().sendItemMessage(TICKET.getId(), "You have received an Agility Arena Ticket!"); - player.getPacketDispatch().sendMessage("You have received an Agility Arena Ticket!"); - return true; - } - player.getPacketDispatch().sendMessage("You get tickets by tagging more than one pillar in a row, tag the next pillar!"); - player.getDialogueInterpreter().sendDialogue("You get tickets by tagging more than one pillar in a row. Tag the", "next pillar for a ticket!"); - return true; - } - } - return false; - } + @Override + public boolean interact(Entity entity, Node node, Option option) { + if (node instanceof Scenery) { + Scenery object = (Scenery) node; + if (object.getId() == 3610) { + ClimbActionHandler.climb((Player) entity, Animation.create(828), object.getLocation().transform(0, 0, 3)); + return true; + } + if (object.getId() == 3608 || object.getId() == 3581) { + Player player = (Player) entity; + if (!object.getLocation().equals(DISPENSERS[player.getAttribute("brim-tag", 0)])) { + player.getPacketDispatch().sendMessage("Tag the pillar indicated by the yellow arrow to get an Agility ticket."); + return true; + } + if (player.getAttribute("brim-tagged", false)) { + player.getPacketDispatch().sendMessage("You have already tagged this pillar."); + return true; + } + player.setAttribute("brim-tagged", true); + int tags = player.getAttribute("brim-tagcount", 0) + 1; + player.setAttribute("brim-tagcount", tags); + setVarp(player, 309, 4); + if (tags > 1) { + int amount = 1; + if (!player.getInventory().add(new Item(TICKET.getId(), amount))) { + GroundItemManager.create(new GroundItem(new Item(TICKET.getId(), amount), player.getLocation(), player)); + } + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 0); + player.getDialogueInterpreter().sendItemMessage(TICKET.getId(), "You have received an Agility Arena Ticket!"); + player.getPacketDispatch().sendMessage("You have received an Agility Arena Ticket!"); + return true; + } + player.getPacketDispatch().sendMessage("You get tickets by tagging more than one pillar in a row, tag the next pillar!"); + player.getDialogueInterpreter().sendDialogue("You get tickets by tagging more than one pillar in a row. Tag the", "next pillar for a ticket!"); + return true; + } + } + return false; + } - @Override - public boolean move(Entity e, Location loc, Location dest) { - if (!e.getLocks().isMovementLocked() && e instanceof Player) { - MovementHook hook = LOCATION_TRAPS.get(loc); - if (hook != null) { - e.setDirection(Direction.getLogicalDirection(loc, dest)); - return hook.handle(e, loc); - } - } - return super.move(e, loc, dest); - } + @Override + public boolean move(Entity e, Location loc, Location dest) { + if (!e.getLocks().isMovementLocked() && e instanceof Player) { + MovementHook hook = LOCATION_TRAPS.get(loc); + if (hook != null) { + e.setDirection(Direction.getLogicalDirection(loc, dest)); + return hook.handle(e, loc); + } + } + return super.move(e, loc, dest); + } - @Override - public void locationUpdate(Entity e, Location last) { - if (!e.getLocks().isMovementLocked() && e instanceof Player) { - MovementHook hook = LOCATION_TRAPS.get(e.getLocation()); - if (hook != null) { - if (!hook.handle(e, e.getLocation())) { - if (e.getPulseManager().isMovingPulse()) { - e.getPulseManager().clear(); - } - e.getWalkingQueue().reset(); - } - } - } - } + @Override + public void locationUpdate(Entity e, Location last) { + if (!e.getLocks().isMovementLocked() && e instanceof Player) { + MovementHook hook = LOCATION_TRAPS.get(e.getLocation()); + if (hook != null) { + if (!hook.handle(e, e.getLocation())) { + if (e.getPulseManager().isMovingPulse()) { + e.getPulseManager().clear(); + } + e.getWalkingQueue().reset(); + } + } + } + } - @Override - public void configure() { - registerRegion(11157); - PressurePad pad = new PressurePad(); - LOCATION_TRAPS.put(Location.create(2800, 9579, 3), pad); - LOCATION_TRAPS.put(Location.create(2799, 9579, 3), pad); - LOCATION_TRAPS.put(Location.create(2800, 9557, 3), pad); - LOCATION_TRAPS.put(Location.create(2799, 9557, 3), pad); - LOCATION_TRAPS.put(Location.create(2772, 9585, 3), pad); - LOCATION_TRAPS.put(Location.create(2772, 9584, 3), pad); - FloorSpikes spikes = new FloorSpikes(); - LOCATION_TRAPS.put(Location.create(2800, 9568, 3), spikes); - LOCATION_TRAPS.put(Location.create(2799, 9568, 3), spikes); - LOCATION_TRAPS.put(Location.create(2772, 9552, 3), spikes); - LOCATION_TRAPS.put(Location.create(2772, 9551, 3), spikes); - LOCATION_TRAPS.put(Location.create(2761, 9573, 3), spikes); - LOCATION_TRAPS.put(Location.create(2761, 9574, 3), spikes); - DartTrap dart = new DartTrap(); - LOCATION_TRAPS.put(Location.create(2788, 9557, 3), dart); - LOCATION_TRAPS.put(Location.create(2789, 9557, 3), dart); - LOCATION_TRAPS.put(Location.create(2794, 9573, 3), dart); - LOCATION_TRAPS.put(Location.create(2794, 9574, 3), dart); - LOCATION_TRAPS.put(Location.create(2777, 9568, 3), dart); - LOCATION_TRAPS.put(Location.create(2778, 9568, 3), dart); - SpinningBlades blade = new SpinningBlades(); - LOCATION_TRAPS.put(Location.create(2778, 9579, 3), blade); - LOCATION_TRAPS.put(Location.create(2783, 9574, 3), blade); - LOCATION_TRAPS.put(Location.create(2778, 9557, 3), blade); - BladeTrap trap = new BladeTrap(); - LOCATION_TRAPS.put(Location.create(2788, 9579, 3), trap); - LOCATION_TRAPS.put(Location.create(2789, 9579, 3), trap); - LOCATION_TRAPS.put(Location.create(2783, 9551, 3), trap); - LOCATION_TRAPS.put(Location.create(2783, 9552, 3), trap); - LOCATION_TRAPS.put(Location.create(2761, 9584, 3), trap); - LOCATION_TRAPS.put(Location.create(2761, 9585, 3), trap); - int index = 0; - for (int x = 2761; x < 2815; x += 11) { - for (int y = 9546; y < 9600; y += 11) { - if (x == 2805 && y == 9590) { - continue; - } - DISPENSERS[index++] = Location.create(x, y, 3); - } - } - GameWorld.getPulser().submit(new Pulse(1) { - @Override - public boolean pulse() { - Region r = RegionManager.forId(11157); - if (!r.isActive()) { - return false; - } - if (GameWorld.getTicks() % 100 == 0) { - for (int z = 0; z < 4; z++) { - for (Player player : r.assemblePlayerList(z)) { - if (player != null) { - setDispenser(player); - } - } - } - handlePlankSwitching(); - } - int ticks = 3; - if (GameWorld.getTicks() % ticks == 0) { - sawBladeActive = !sawBladeActive; - if (sawBladeActive) { - Scenery object = RegionManager.getObject(3, 2788, 9579); - SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); - object = RegionManager.getObject(3, 2789, 9579); - SceneryBuilder.replace(object, object.transform(0), ticks); + @Override + public void configure() { + registerRegion(11157); + PressurePad pad = new PressurePad(); + LOCATION_TRAPS.put(Location.create(2800, 9579, 3), pad); + LOCATION_TRAPS.put(Location.create(2799, 9579, 3), pad); + LOCATION_TRAPS.put(Location.create(2800, 9557, 3), pad); + LOCATION_TRAPS.put(Location.create(2799, 9557, 3), pad); + LOCATION_TRAPS.put(Location.create(2772, 9585, 3), pad); + LOCATION_TRAPS.put(Location.create(2772, 9584, 3), pad); + FloorSpikes spikes = new FloorSpikes(); + LOCATION_TRAPS.put(Location.create(2800, 9568, 3), spikes); + LOCATION_TRAPS.put(Location.create(2799, 9568, 3), spikes); + LOCATION_TRAPS.put(Location.create(2772, 9552, 3), spikes); + LOCATION_TRAPS.put(Location.create(2772, 9551, 3), spikes); + LOCATION_TRAPS.put(Location.create(2761, 9573, 3), spikes); + LOCATION_TRAPS.put(Location.create(2761, 9574, 3), spikes); + DartTrap dart = new DartTrap(); + LOCATION_TRAPS.put(Location.create(2788, 9557, 3), dart); + LOCATION_TRAPS.put(Location.create(2789, 9557, 3), dart); + LOCATION_TRAPS.put(Location.create(2794, 9573, 3), dart); + LOCATION_TRAPS.put(Location.create(2794, 9574, 3), dart); + LOCATION_TRAPS.put(Location.create(2777, 9568, 3), dart); + LOCATION_TRAPS.put(Location.create(2778, 9568, 3), dart); + SpinningBlades blade = new SpinningBlades(); + LOCATION_TRAPS.put(Location.create(2778, 9579, 3), blade); + LOCATION_TRAPS.put(Location.create(2783, 9574, 3), blade); + LOCATION_TRAPS.put(Location.create(2778, 9557, 3), blade); + BladeTrap trap = new BladeTrap(); + LOCATION_TRAPS.put(Location.create(2788, 9579, 3), trap); + LOCATION_TRAPS.put(Location.create(2789, 9579, 3), trap); + LOCATION_TRAPS.put(Location.create(2783, 9551, 3), trap); + LOCATION_TRAPS.put(Location.create(2783, 9552, 3), trap); + LOCATION_TRAPS.put(Location.create(2761, 9584, 3), trap); + LOCATION_TRAPS.put(Location.create(2761, 9585, 3), trap); + int index = 0; + for (int x = 2761; x < 2815; x += 11) { + for (int y = 9546; y < 9600; y += 11) { + if (x == 2805 && y == 9590) { + continue; + } + DISPENSERS[index++] = Location.create(x, y, 3); + } + } + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + Region r = RegionManager.forId(11157); + if (!r.isActive()) { + return false; + } + if (GameWorld.getTicks() % 100 == 0) { + for (int z = 0; z < 4; z++) { + for (Player player : r.assemblePlayerList(z)) { + if (player != null) { + setDispenser(player); + } + } + } + handlePlankSwitching(); + } + int ticks = 3; + if (GameWorld.getTicks() % ticks == 0) { + sawBladeActive = !sawBladeActive; + if (sawBladeActive) { + Scenery object = RegionManager.getObject(3, 2788, 9579); + SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2789, 9579); + SceneryBuilder.replace(object, object.transform(0), ticks); - object = RegionManager.getObject(3, 2783, 9551); - SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); - object = RegionManager.getObject(3, 2783, 9552); - SceneryBuilder.replace(object, object.transform(0), ticks); + object = RegionManager.getObject(3, 2783, 9551); + SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2783, 9552); + SceneryBuilder.replace(object, object.transform(0), ticks); - object = RegionManager.getObject(3, 2761, 9584); - SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); - object = RegionManager.getObject(3, 2761, 9585); - SceneryBuilder.replace(object, object.transform(0), ticks); - } - } - return false; - } - }); - } + object = RegionManager.getObject(3, 2761, 9584); + SceneryBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2761, 9585); + SceneryBuilder.replace(object, object.transform(0), ticks); + } + } + return false; + } + }); + } - /** - * Switches the plank states. - */ - private static void handlePlankSwitching() { - boolean[] available = new boolean[3]; - for (int i = 0; i < 1 + RandomFunction.randomize(2); i++) { - available[RandomFunction.randomize(3)] = true; - } - for (int i = 0; i < 3; i++) { - boolean avail = available[i]; - for (PlankSet set : PlankSet.values()) { - Location l = set.entrance[i]; - for (int x = 1; x < set.exit[i].getX() - l.getX(); x++) { - Scenery object = RegionManager.getObject(l.transform(x, 0, 0)); - if(object != null) - SceneryBuilder.replace(object, object.transform(avail ? 3573 : 3576)); - } - RegionManager.getObject(set.entrance[i]).setCharge(avail ? 1000 : 500); - RegionManager.getObject(set.exit[i]).setCharge(avail ? 1000 : 500); - } - } - } + /** + * Switches the plank states. + */ + private static void handlePlankSwitching() { + boolean[] available = new boolean[3]; + for (int i = 0; i < 1 + RandomFunction.randomize(2); i++) { + available[RandomFunction.randomize(3)] = true; + } + for (int i = 0; i < 3; i++) { + boolean avail = available[i]; + for (PlankSet set : PlankSet.values()) { + Location l = set.entrance[i]; + for (int x = 1; x < set.exit[i].getX() - l.getX(); x++) { + Scenery object = RegionManager.getObject(l.transform(x, 0, 0)); + if(object != null) + SceneryBuilder.replace(object, object.transform(avail ? 3573 : 3576)); + } + RegionManager.getObject(set.entrance[i]).setCharge(avail ? 1000 : 500); + RegionManager.getObject(set.exit[i]).setCharge(avail ? 1000 : 500); + } + } + } - /** - * The plank obstacles. - * - * @author Emperor - */ - private static enum PlankSet { - FIRST(new Location[]{Location.create(2797, 9591, 3), Location.create(2797, 9590, 3), Location.create(2797, 9589, 3)}, new Location[]{Location.create(2802, 9591, 3), Location.create(2802, 9590, 3), Location.create(2802, 9589, 3)}), SECOND(new Location[]{Location.create(2764, 9558, 3), Location.create(2764, 9557, 3), Location.create(2764, 9556, 3)}, new Location[]{Location.create(2769, 9558, 3), Location.create(2769, 9557, 3), Location.create(2769, 9556, 3)}); + /** + * The plank obstacles. + * + * @author Emperor + */ + private static enum PlankSet { + FIRST(new Location[]{Location.create(2797, 9591, 3), Location.create(2797, 9590, 3), Location.create(2797, 9589, 3)}, new Location[]{Location.create(2802, 9591, 3), Location.create(2802, 9590, 3), Location.create(2802, 9589, 3)}), SECOND(new Location[]{Location.create(2764, 9558, 3), Location.create(2764, 9557, 3), Location.create(2764, 9556, 3)}, new Location[]{Location.create(2769, 9558, 3), Location.create(2769, 9557, 3), Location.create(2769, 9556, 3)}); - /** - * Constructs a new {@code PlankSet} {@code Object}. - * - * @param entrance The entrance locations for each plank. - * @param exit The exit locations for each plank. - */ - private PlankSet(Location[] entrance, Location[] exit) { - this.entrance = entrance; - this.exit = exit; - } + /** + * Constructs a new {@code PlankSet} {@code Object}. + * + * @param entrance The entrance locations for each plank. + * @param exit The exit locations for each plank. + */ + private PlankSet(Location[] entrance, Location[] exit) { + this.entrance = entrance; + this.exit = exit; + } - /** - * The entrance location of the plank. - */ - Location[] entrance; + /** + * The entrance location of the plank. + */ + Location[] entrance; - /** - * The exit location of the plank. - */ - Location[] exit; - } + /** + * The exit location of the plank. + */ + Location[] exit; + } - @Override - public Plugin newInstance(Object arg) throws Throwable { - ZoneBuilder.configure(this); - return this; - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } - @Override - public Object fireEvent(String identifier, Object... args) { - return null; - } + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } } diff --git a/Server/src/main/content/global/skill/crafting/spinning/SpinningPulse.java b/Server/src/main/content/global/skill/crafting/spinning/SpinningPulse.java index b7efeae3a..87e0ce531 100644 --- a/Server/src/main/content/global/skill/crafting/spinning/SpinningPulse.java +++ b/Server/src/main/content/global/skill/crafting/spinning/SpinningPulse.java @@ -20,94 +20,94 @@ import static core.api.ContentAPIKt.playAudio; */ public final class SpinningPulse extends SkillPulse { - /** - * Represents the animation to use. - */ - private static final Animation ANIMATION = new Animation(896); + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(896); - /** - * Represents the type of spinning item. - */ - private final SpinningItem type; + /** + * Represents the type of spinning item. + */ + private final SpinningItem type; - /** - * Represents the amount to spin. - */ - private int ammount; + /** + * Represents the amount to spin. + */ + private int ammount; - /** - * Represents the ticks passed. - */ - private int ticks; + /** + * Represents the ticks passed. + */ + private int ticks; - /** - * Constructs a new {@code SpinningPulse.java} {@Code Object} - * - * @param player - * @param node - */ - public SpinningPulse(Player player, Item node, int ammount, SpinningItem def) { - super(player, node); - this.type = def; - this.ammount = ammount; - } + /** + * Constructs a new {@code SpinningPulse.java} {@Code Object} + * + * @param player + * @param node + */ + public SpinningPulse(Player player, Item node, int ammount, SpinningItem def) { + super(player, node); + this.type = def; + this.ammount = ammount; + } - @Override - public boolean checkRequirements() { - player.getInterfaceManager().close(); - if (player.getSkills().getLevel(Skills.CRAFTING) < type.getLevel()) { - player.getPacketDispatch().sendMessage("You need a crafting level of " + type.getLevel() + " to make this."); - return false; - } - if (!player.getInventory().contains(type.getNeed(), 1)) { - player.getPacketDispatch().sendMessage("You need " + ItemDefinition.forId(type.getNeed()).getName() + " to do this."); - return false; - } - return true; - } + @Override + public boolean checkRequirements() { + player.getInterfaceManager().close(); + if (player.getSkills().getLevel(Skills.CRAFTING) < type.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + type.getLevel() + " to make this."); + return false; + } + if (!player.getInventory().contains(type.getNeed(), 1)) { + player.getPacketDispatch().sendMessage("You need " + ItemDefinition.forId(type.getNeed()).getName() + " to do this."); + return false; + } + return true; + } - @Override - public void animate() { - if (ticks % 5 == 0) { - player.animate(ANIMATION); - playAudio(player, Sounds.SPINNING_2590); - } - } + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + playAudio(player, Sounds.SPINNING_2590); + } + } - @Override - public boolean reward() { - int tickThreshhold = 4; - if (player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) - && player.getLocation().withinDistance(Location.create(2711,3471,1)) - && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null - && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { - tickThreshhold = 2; - } - if (++ticks % tickThreshhold != 0) { - return false; - } - if (player.getInventory().remove(new Item(type.getNeed(), 1))) { - final Item item = new Item(type.getProduct(), 1); - player.getInventory().add(item); - player.getSkills().addExperience(Skills.CRAFTING, type.getExp(), true); + @Override + public boolean reward() { + int tickThreshhold = 4; + if (player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) + && player.getLocation().withinDistance(Location.create(2711,3471,1)) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { + tickThreshhold = 2; + } + if (++ticks % tickThreshhold != 0) { + return false; + } + if (player.getInventory().remove(new Item(type.getNeed(), 1))) { + final Item item = new Item(type.getProduct(), 1); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, type.getExp(), true); - // Seers achievement diary - if (player.getLocation().getRegionId() == 10806 - && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0, 4)) { - if (player.getAttribute("diary:seers:bowstrings-spun", 0) >= 4) { - player.setAttribute("/save:diary:seers:bowstrings-spun", 5); - player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 4); - } else { - player.setAttribute("/save:diary:seers:bowstrings-spun", player.getAttribute("diary:seers:bowstrings-spun", 0) + 1); - } - } - } - ammount--; - return ammount < 1; - } + // Seers achievement diary + if (player.getLocation().getRegionId() == 10806 + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0, 4)) { + if (player.getAttribute("diary:seers:bowstrings-spun", 0) >= 4) { + player.setAttribute("/save:diary:seers:bowstrings-spun", 5); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 4); + } else { + player.setAttribute("/save:diary:seers:bowstrings-spun", player.getAttribute("diary:seers:bowstrings-spun", 0) + 1); + } + } + } + ammount--; + return ammount < 1; + } - @Override - public void message(int type) { - } + @Override + public void message(int type) { + } } diff --git a/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingSkillPulse.java b/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingSkillPulse.java index cf0a4557a..465912ee5 100644 --- a/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingSkillPulse.java +++ b/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingSkillPulse.java @@ -39,244 +39,244 @@ import static core.game.system.command.sets.StatAttributeKeysKt.STATS_LOGS; * @author ceik */ public class WoodcuttingSkillPulse extends Pulse { - private int[] woodcuttingSounds = { - Sounds.WOODCUTTING_HIT_3038, - Sounds.WOODCUTTING_HIT_3039, - Sounds.WOODCUTTING_HIT_3040, - Sounds.WOODCUTTING_HIT_3041, - Sounds.WOODCUTTING_HIT_3042 - }; + private int[] woodcuttingSounds = { + Sounds.WOODCUTTING_HIT_3038, + Sounds.WOODCUTTING_HIT_3039, + Sounds.WOODCUTTING_HIT_3040, + Sounds.WOODCUTTING_HIT_3041, + Sounds.WOODCUTTING_HIT_3042 + }; - private WoodcuttingNode resource; - private int ticks; - private Player player; - private Scenery node; - protected boolean resetAnimation = true; + private WoodcuttingNode resource; + private int ticks; + private Player player; + private Scenery node; + protected boolean resetAnimation = true; - public WoodcuttingSkillPulse(Player player, Scenery node) { - super(1, player, node); - this.player = player; - this.node = node; - super.stop(); - } + public WoodcuttingSkillPulse(Player player, Scenery node) { + super(1, player, node); + this.player = player; + this.node = node; + super.stop(); + } - public void message(int type) { - if (type == 0) { - player.getPacketDispatch().sendMessage("You swing your axe at the tree..."); - } - } + public void message(int type) { + if (type == 0) { + player.getPacketDispatch().sendMessage("You swing your axe at the tree..."); + } + } - @Override - public boolean pulse() { - if (!checkRequirements()) { - return true; - } - animate(); - return reward(); - } + @Override + public boolean pulse() { + if (!checkRequirements()) { + return true; + } + animate(); + return reward(); + } - @Override - public void stop() { - if (resetAnimation) { - player.animate(new Animation(-1, Animator.Priority.HIGH)); - } - super.stop(); - message(1); - } + @Override + public void stop() { + if (resetAnimation) { + player.animate(new Animation(-1, Animator.Priority.HIGH)); + } + super.stop(); + message(1); + } - @Override - public void start() { - resource = WoodcuttingNode.forId(node.getId()); - if (resource == null) { - return; - } - if (checkRequirements()) { - super.start(); - message(0); - } - } + @Override + public void start() { + resource = WoodcuttingNode.forId(node.getId()); + if (resource == null) { + return; + } + if (checkRequirements()) { + super.start(); + message(0); + } + } - public boolean checkRequirements() { - if (player.getSkills().getLevel(Skills.WOODCUTTING) < resource.getLevel()) { - player.getPacketDispatch().sendMessage("You need a woodcutting level of " + resource.getLevel() + " to chop this tree."); - return false; - } - if (SkillingTool.getHatchet(player) == null) { - player.getPacketDispatch().sendMessage("You do not have an axe to use."); - return false; - } - if (player.getInventory().freeSlots() < 1) { - player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource.getReward()).getName().toLowerCase() + "."); - return false; - } - return true; - } + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.WOODCUTTING) < resource.getLevel()) { + player.getPacketDispatch().sendMessage("You need a woodcutting level of " + resource.getLevel() + " to chop this tree."); + return false; + } + if (SkillingTool.getHatchet(player) == null) { + player.getPacketDispatch().sendMessage("You do not have an axe to use."); + return false; + } + if (player.getInventory().freeSlots() < 1) { + player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource.getReward()).getName().toLowerCase() + "."); + return false; + } + return true; + } - public void animate() { - if (!player.getAnimator().isAnimating()) { - player.animate(SkillingTool.getHatchet(player).getAnimation()); - for (Player p : RegionManager.getLocalPlayers(player.getLocation(), 2)) { - if (p.getName() == player.getName()) { - continue; - } - int soundIndex = RandomFunction.random(0, woodcuttingSounds.length); - playAudio(p, woodcuttingSounds[soundIndex]); - } - } - } + public void animate() { + if (!player.getAnimator().isAnimating()) { + player.animate(SkillingTool.getHatchet(player).getAnimation()); + for (Player p : RegionManager.getLocalPlayers(player.getLocation(), 2)) { + if (p.getName() == player.getName()) { + continue; + } + int soundIndex = RandomFunction.random(0, woodcuttingSounds.length); + playAudio(p, woodcuttingSounds[soundIndex]); + } + } + } - public boolean reward() { - if (++ticks % 4 != 0) { - return false; - } - if (node.getId() == 10041) { - player.getDialogueInterpreter().sendDialogues(2574, FacialExpression.FURIOUS, RandomFunction.random(2) == 1 ? "You'll blow my cover! I'm meant to be hidden!" : "Will you stop that?"); - return true; - } - if (!checkReward(SkillingTool.getHatchet(player))) { - return false; - } + public boolean reward() { + if (++ticks % 4 != 0) { + return false; + } + if (node.getId() == 10041) { + player.getDialogueInterpreter().sendDialogues(2574, FacialExpression.FURIOUS, RandomFunction.random(2) == 1 ? "You'll blow my cover! I'm meant to be hidden!" : "Will you stop that?"); + return true; + } + if (!checkReward(SkillingTool.getHatchet(player))) { + return false; + } - // 20% chance to auto burn logs when using "inferno adze" item - if (SkillingTool.getHatchet(player).getId() == 13661 && RandomFunction.random(100) < 25) { - player.sendMessage("You chop some logs. The heat of the inferno adze incinerates them."); - Projectile.create(player, null, 1776, 35, 30, 20, 25).transform(player, new Location(player.getLocation().getX() + 2, player.getLocation().getY()), true, 25, 25).send(); - player.getSkills().addExperience(Skills.WOODCUTTING, resource.getExperience()); - player.getSkills().addExperience(Skills.FIREMAKING, resource.getExperience()); - return rollDepletion(); - } + // 20% chance to auto burn logs when using "inferno adze" item + if (SkillingTool.getHatchet(player).getId() == 13661 && RandomFunction.random(100) < 25) { + player.sendMessage("You chop some logs. The heat of the inferno adze incinerates them."); + Projectile.create(player, null, 1776, 35, 30, 20, 25).transform(player, new Location(player.getLocation().getX() + 2, player.getLocation().getY()), true, 25, 25).send(); + player.getSkills().addExperience(Skills.WOODCUTTING, resource.getExperience()); + player.getSkills().addExperience(Skills.FIREMAKING, resource.getExperience()); + return rollDepletion(); + } - //actual reward calculations - int reward = resource.getReward(); - int rewardAmount = 0; - if (reward > 0) { - reward = calculateReward(reward); // calculate rewards - rewardAmount = calculateRewardAmount(reward); // calculate amount + //actual reward calculations + int reward = resource.getReward(); + int rewardAmount = 0; + if (reward > 0) { + reward = calculateReward(reward); // calculate rewards + rewardAmount = calculateRewardAmount(reward); // calculate amount - //add experience - double experience = calculateExperience(resource.reward, rewardAmount); + //add experience + double experience = calculateExperience(resource.reward, rewardAmount); - player.getSkills().addExperience(Skills.WOODCUTTING, experience, true); + player.getSkills().addExperience(Skills.WOODCUTTING, experience, true); - //send the message for the resource reward - player.getPacketDispatch().sendMessage("You get some " + ItemDefinition.forId(reward).getName().toLowerCase() + "."); - //give the reward - player.getInventory().add(new Item(reward, rewardAmount)); - player.dispatch(new ResourceProducedEvent(reward, rewardAmount, node, -1)); - int cutLogs = player.getAttribute(STATS_BASE + ":" + STATS_LOGS,0); - player.setAttribute("/save:" + STATS_BASE + ":" + STATS_LOGS,++cutLogs); + //send the message for the resource reward + player.getPacketDispatch().sendMessage("You get some " + ItemDefinition.forId(reward).getName().toLowerCase() + "."); + //give the reward + player.getInventory().add(new Item(reward, rewardAmount)); + player.dispatch(new ResourceProducedEvent(reward, rewardAmount, node, -1)); + int cutLogs = player.getAttribute(STATS_BASE + ":" + STATS_LOGS,0); + player.setAttribute("/save:" + STATS_BASE + ":" + STATS_LOGS,++cutLogs); - //calculate bonus bird nest for mining - int chance = 282; - if (RandomFunction.random(chance) == chance / 2) { - if(SkillcapePerks.isActive(SkillcapePerks.NEST_HUNTER,player)){ - if(!player.getInventory().add(BirdNest.getRandomNest(false).getNest())){ - BirdNest.drop(player); - } - } else { - BirdNest.drop(player); - } - } + //calculate bonus bird nest for mining + int chance = 282; + if (RandomFunction.random(chance) == chance / 2) { + if(SkillcapePerks.isActive(SkillcapePerks.NEST_HUNTER,player)){ + if(!player.getInventory().add(BirdNest.getRandomNest(false).getNest())){ + BirdNest.drop(player); + } + } else { + BirdNest.drop(player); + } + } - } + } - return rollDepletion(); - } + return rollDepletion(); + } - private boolean rollDepletion() { - //transform to depleted version - //OSRS and RS3 Wikis both agree: All trees present in 2009 are a 1/8 fell chance, aside from normal trees/dead trees which are 100% - //OSRS: https://oldschool.runescape.wiki/w/Woodcutting scroll down to the mechanics section - //RS3 : https://runescape.wiki/w/Woodcutting scroll down to the mechanics section, and expand the tree felling chances table - if (resource.getRespawnRate() > 0) { - if (RandomFunction.roll(8) || resource.identifier == 1 || resource.identifier == 2 || resource.identifier == 3 || resource.identifier == 6) { - if (resource.isFarming()) { - FarmingPatch fPatch = FarmingPatch.forObject(node.asScenery()); - if(fPatch != null) { - Patch patch = fPatch.getPatchFor(player, true); - patch.setCurrentState(patch.getCurrentState() + 1); - } - return true; - } - if (resource.getEmptyId() > -1) { - SceneryBuilder.replace(node, node.transform(resource.getEmptyId()), resource.getRespawnDuration()); - } else { - SceneryBuilder.replace(node, node.transform(0), resource.getRespawnDuration()); - } - node.setActive(false); + private boolean rollDepletion() { + //transform to depleted version + //OSRS and RS3 Wikis both agree: All trees present in 2009 are a 1/8 fell chance, aside from normal trees/dead trees which are 100% + //OSRS: https://oldschool.runescape.wiki/w/Woodcutting scroll down to the mechanics section + //RS3 : https://runescape.wiki/w/Woodcutting scroll down to the mechanics section, and expand the tree felling chances table + if (resource.getRespawnRate() > 0) { + if (RandomFunction.roll(8) || resource.identifier == 1 || resource.identifier == 2 || resource.identifier == 3 || resource.identifier == 6) { + if (resource.isFarming()) { + FarmingPatch fPatch = FarmingPatch.forObject(node.asScenery()); + if(fPatch != null) { + Patch patch = fPatch.getPatchFor(player, true); + patch.setCurrentState(patch.getCurrentState() + 1); + } + return true; + } + if (resource.getEmptyId() > -1) { + SceneryBuilder.replace(node, node.transform(resource.getEmptyId()), resource.getRespawnDuration()); + } else { + SceneryBuilder.replace(node, node.transform(0), resource.getRespawnDuration()); + } + node.setActive(false); - playAudio(player, Sounds.TREE_FALLING_2734); - return true; - } - } - return false; - } + playAudio(player, Sounds.TREE_FALLING_2734); + return true; + } + } + return false; + } - private int calculateRewardAmount(int reward) { - int amount = 1; + private int calculateRewardAmount(int reward) { + int amount = 1; - // 3239: Hollow tree (bark) 10% chance of obtaining - if (reward == 3239 && RandomFunction.random(100) >= 10) { - amount = 0; - } + // 3239: Hollow tree (bark) 10% chance of obtaining + if (reward == 3239 && RandomFunction.random(100) >= 10) { + amount = 0; + } - // Seers village medium reward - extra normal log while in seer's village - if (reward == 1511 - && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) - && player.getLocation().getRegionId() == 10806) { - amount = 2; - } + // Seers village medium reward - extra normal log while in seer's village + if (reward == 1511 + && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) + && player.getLocation().getRegionId() == 10806) { + amount = 2; + } - return amount; - } + return amount; + } - private double calculateExperience(int reward, int amount) { - double experience = resource.getExperience(); + private double calculateExperience(int reward, int amount) { + double experience = resource.getExperience(); - if(player.getLocation().getRegionId() == 10300){ - return 1.0; - } + if(player.getLocation().getRegionId() == 10300){ + return 1.0; + } - // Bark - if (reward == 3239) { - // If we receive the item, give the full experience points otherwise give the base amount - if (amount >= 1) { - experience = 275.2; - } else { - amount = 1; - } - } + // Bark + if (reward == 3239) { + // If we receive the item, give the full experience points otherwise give the base amount + if (amount >= 1) { + experience = 275.2; + } else { + amount = 1; + } + } - // Seers village medium reward - extra 10% xp from maples while wearing headband - if (reward == 1517 - && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) - && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null - && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { - experience *= 1.10; - } + // Seers village medium reward - extra 10% xp from maples while wearing headband + if (reward == 1517 + && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { + experience *= 1.10; + } - return experience * amount; - } + return experience * amount; + } - private int calculateReward(int reward) { - return reward; - } + private int calculateReward(int reward) { + return reward; + } - /** - * Checks if the player gets rewarded. - * - * @return {@code True} if so. - */ - private boolean checkReward(SkillingTool tool) { - int skill = Skills.WOODCUTTING; - int level = player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill); - double hostRatio = RandomFunction.randomDouble(100.0); - double lowMod = tool == SkillingTool.BLACK_AXE ? resource.tierModLow / 2 : resource.tierModLow; - double low = resource.baseLow + (tool.ordinal() * lowMod); - double highMod = tool == SkillingTool.BLACK_AXE ? resource.tierModHigh / 2 : resource.tierModHigh; - double high = resource.baseHigh + (tool.ordinal() * highMod); - double clientRatio = RandomFunction.getSkillSuccessChance(low,high,level); - return hostRatio < clientRatio; - } + /** + * Checks if the player gets rewarded. + * + * @return {@code True} if so. + */ + private boolean checkReward(SkillingTool tool) { + int skill = Skills.WOODCUTTING; + int level = player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill); + double hostRatio = RandomFunction.randomDouble(100.0); + double lowMod = tool == SkillingTool.BLACK_AXE ? resource.tierModLow / 2 : resource.tierModLow; + double low = resource.baseLow + (tool.ordinal() * lowMod); + double highMod = tool == SkillingTool.BLACK_AXE ? resource.tierModHigh / 2 : resource.tierModHigh; + double high = resource.baseHigh + (tool.ordinal() * highMod); + double clientRatio = RandomFunction.getSkillSuccessChance(low,high,level); + return hostRatio < clientRatio; + } } diff --git a/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/NoraTHaggNPC.java b/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/NoraTHaggNPC.java index 30d12d34a..7cb1070e7 100644 --- a/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/NoraTHaggNPC.java +++ b/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/NoraTHaggNPC.java @@ -30,122 +30,122 @@ import java.util.List; @Initializable public class NoraTHaggNPC extends AbstractNPC { - boolean walkdir; + boolean walkdir; - public NoraTHaggNPC() { - super(896, Location.create(2904, 3463, 0)); - } - private Location getRespawnLocation() { - return Location.create(2900, 3473, 0); - } + public NoraTHaggNPC() { + super(896, Location.create(2904, 3463, 0)); + } + private Location getRespawnLocation() { + return Location.create(2900, 3473, 0); + } - private NoraTHaggNPC(int id, Location location) { - super(id, location); - } + private NoraTHaggNPC(int id, Location location) { + super(id, location); + } - @Override - public Plugin newInstance(Object arg) throws Throwable { - this.configure(); - init(); - return super.newInstance(arg); - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + this.configure(); + init(); + return super.newInstance(arg); + } - private boolean canTeleport(Entity t) { - int playerX = t.getLocation().getX(); - int npcX = getLocation().getX(); - int[] sectors = { 2904, 2907, 2910, 2914, 2918, 2922, 2926, 2928 }; - for (int i = 0; i < sectors.length -1; i++) { - if (npcX >= sectors[i] && npcX <= sectors[i+1] && playerX >= sectors[i] && playerX <= sectors[i+1]) { - if (playerX < npcX && getDirection() == Direction.WEST || playerX > npcX && getDirection() == Direction.EAST) { - return true; - } - if (playerX == npcX) { - return true; - } - } - } - return false; - } + private boolean canTeleport(Entity t) { + int playerX = t.getLocation().getX(); + int npcX = getLocation().getX(); + int[] sectors = { 2904, 2907, 2910, 2914, 2918, 2922, 2926, 2928 }; + for (int i = 0; i < sectors.length -1; i++) { + if (npcX >= sectors[i] && npcX <= sectors[i+1] && playerX >= sectors[i] && playerX <= sectors[i+1]) { + if (playerX < npcX && getDirection() == Direction.WEST || playerX > npcX && getDirection() == Direction.EAST) { + return true; + } + if (playerX == npcX) { + return true; + } + } + } + return false; + } - @Override - public AbstractNPC construct(int id, Location location, Object... objects) { - return new NoraTHaggNPC(id, location); - } + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new NoraTHaggNPC(id, location); + } - @Override - public int[] getIds() { - return new int[] { 896 }; - } + @Override + public int[] getIds() { + return new int[] { 896 }; + } - @Override - public int getWalkRadius() { - return 50; - } + @Override + public int getWalkRadius() { + return 50; + } - public void configure() { - super.configure(); - setWalks(false); - setPathBoundMovement(true); - } + public void configure() { + super.configure(); + setWalks(false); + setPathBoundMovement(true); + } - private void sendTeleport(final Player player) { - player.lock(); - GameWorld.getPulser().submit(new Pulse(1) { - int delay = 0; + private void sendTeleport(final Player player) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int delay = 0; - @Override - public boolean pulse() { - if (delay == 0) { - face(player); - player.getInventory().remove(WitchsHousePlugin.BALL); - player.getInventory().remove(WitchsHousePlugin.KEY); - player.getInventory().remove(WitchsHousePlugin.DOOR_KEY); - sendChat("Stop! Thief!"); - player.getPacketDispatch().sendMessage("You've been spotted by the witch."); - player.graphics(new Graphics(110, 100)); - PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); - } else if (delay == 2) { - sendChat("Klarata... Seppteno... Valkan!"); - face(null); - } else if (delay == 4) { - player.getProperties().setTeleportLocation(Location.create(getRespawnLocation())); - PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); - face(null); - player.unlock(); - return true; - } - delay++; - return false; - } - }); - } + @Override + public boolean pulse() { + if (delay == 0) { + face(player); + player.getInventory().remove(WitchsHousePlugin.BALL); + player.getInventory().remove(WitchsHousePlugin.KEY); + player.getInventory().remove(WitchsHousePlugin.DOOR_KEY); + sendChat("Stop! Thief!"); + player.getPacketDispatch().sendMessage("You've been spotted by the witch."); + player.graphics(new Graphics(110, 100)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + } else if (delay == 2) { + sendChat("Klarata... Seppteno... Valkan!"); + face(null); + } else if (delay == 4) { + player.getProperties().setTeleportLocation(Location.create(getRespawnLocation())); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + face(null); + player.unlock(); + return true; + } + delay++; + return false; + } + }); + } - @Override - public void tick() { - super.tick(); - List players = RegionManager.getLocalPlayers(location); - if(getLocation().getX() == 2930){ - walkdir = false; - } else if(getLocation().getX() == 2904){ - walkdir = true; - } - for (Player player : players) { - if (player == null || !player.isActive() || player.getLocks().isInteractionLocked() || DeathTask.isDead(player) || !canTeleport(player) || !CombatSwingHandler.isProjectileClipped(this, player, false)) { - continue; - } - animate(new Animation(5803)); - sendTeleport(player); - player.getPacketDispatch().sendMessage("" + getLocation() + " matches? " + (getLocation().getX() == 2904)); - } - if (location.getX() != 2930 && walkdir) { - this.getWalkingQueue().reset(); - this.getWalkingQueue().addPath(location.getX() + 1,3463,true); - } else if (location.getX() != 2904 && !walkdir) { - this.getWalkingQueue().reset(); - this.getWalkingQueue().addPath(location.getX() - 1,3463,true); - } - } + @Override + public void tick() { + super.tick(); + List players = RegionManager.getLocalPlayers(location); + if(getLocation().getX() == 2930){ + walkdir = false; + } else if(getLocation().getX() == 2904){ + walkdir = true; + } + for (Player player : players) { + if (player == null || !player.isActive() || player.getLocks().isInteractionLocked() || DeathTask.isDead(player) || !canTeleport(player) || !CombatSwingHandler.isProjectileClipped(this, player, false)) { + continue; + } + animate(new Animation(5803)); + sendTeleport(player); + player.getPacketDispatch().sendMessage("" + getLocation() + " matches? " + (getLocation().getX() == 2904)); + } + if (location.getX() != 2930 && walkdir) { + this.getWalkingQueue().reset(); + this.getWalkingQueue().addPath(location.getX() + 1,3463,true); + } else if (location.getX() != 2904 && !walkdir) { + this.getWalkingQueue().reset(); + this.getWalkingQueue().addPath(location.getX() - 1,3463,true); + } + } } diff --git a/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/WitchsExperimentNPC.java b/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/WitchsExperimentNPC.java index 8a99ad831..08eb59dee 100644 --- a/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/WitchsExperimentNPC.java +++ b/Server/src/main/content/region/asgarnia/taverley/quest/witchshouse/WitchsExperimentNPC.java @@ -19,165 +19,165 @@ import core.plugin.Initializable; @Initializable public class WitchsExperimentNPC extends AbstractNPC { - private ExperimentType type; - private boolean commenced; - Player p; + private ExperimentType type; + private boolean commenced; + Player p; - public WitchsExperimentNPC() { - super(0, null); - } + public WitchsExperimentNPC() { + super(0, null); + } - WitchsExperimentNPC(int id, Location location, Player player) { - super(id, location); - this.setWalks(true); - this.setRespawn(false); - this.type = WitchsExperimentNPC.ExperimentType.forId(id); - p = player; - } + WitchsExperimentNPC(int id, Location location, Player player) { + super(id, location); + this.setWalks(true); + this.setRespawn(false); + this.type = WitchsExperimentNPC.ExperimentType.forId(id); + p = player; + } - @Override - public void handleTickActions() { - super.handleTickActions(); - if (!p.isActive() || !RegionManager.getLocalPlayers(location).contains(p)) { - p.removeAttribute("witchs-experiment:npc_spawned"); - clear(); - } - if (!getProperties().getCombatPulse().isAttacking()) { - getProperties().getCombatPulse().attack(p); - } - } + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!p.isActive() || !RegionManager.getLocalPlayers(location).contains(p)) { + p.removeAttribute("witchs-experiment:npc_spawned"); + clear(); + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(p); + } + } - @Override - public void startDeath(Entity killer) { - if (killer == p) { - type.transform(this, p); - return; - } - super.startDeath(killer); - } + @Override + public void startDeath(Entity killer) { + if (killer == p) { + type.transform(this, p); + return; + } + super.startDeath(killer); + } - @Override - public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { - return p == entity; - } + @Override + public boolean isAttackable(Entity entity, CombatStyle style, boolean message) { + return p == entity; + } - @Override - public boolean canSelectTarget(Entity target) { - if (target instanceof Player) { - Player p = (Player) target; - return p == this.p; - } - return true; - } + @Override + public boolean canSelectTarget(Entity target) { + if (target instanceof Player) { + Player p = (Player) target; + return p == this.p; + } + return true; + } - @Override - public AbstractNPC construct(int id, Location location, Object... objects) { - return new WitchsExperimentNPC(id, location, null); - } + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WitchsExperimentNPC(id, location, null); + } - @Override - public int[] getIds() { - return new int[] { 897, 898, 899, 900 }; - } + @Override + public int[] getIds() { + return new int[] { 897, 898, 899, 900 }; + } - public void setType(ExperimentType type) { - this.type = type; - } + public void setType(ExperimentType type) { + this.type = type; + } - public ExperimentType getType() { - return type; - } + public ExperimentType getType() { + return type; + } - public void setCommenced(boolean commenced) { - this.commenced = commenced; - } + public void setCommenced(boolean commenced) { + this.commenced = commenced; + } - public enum ExperimentType { - FIRST(897, ""), - SECOND(898, "The shapeshifter's body begins to deform!", "The shapeshifter turns into a spider!"), - THIRD(899, "The shapeshifter's body begins to twist!", "The shapeshifter turns into a bear!"), - FOURTH(900, "The shapeshifter's body pulses!", "The shapeshifter turns into a wolf!"), - END(-1, ""), + public enum ExperimentType { + FIRST(897, ""), + SECOND(898, "The shapeshifter's body begins to deform!", "The shapeshifter turns into a spider!"), + THIRD(899, "The shapeshifter's body begins to twist!", "The shapeshifter turns into a bear!"), + FOURTH(900, "The shapeshifter's body pulses!", "The shapeshifter turns into a wolf!"), + END(-1, ""), - ; + ; - private int id; - private String[] message; + private int id; + private String[] message; - ExperimentType(int id, String... message) { - this.id = id; - this.message = message; - } + ExperimentType(int id, String... message) { + this.id = id; + this.message = message; + } - /** - * Transforms the new npc. - */ - public void transform(final WitchsExperimentNPC npc, final Player player) { - final ExperimentType newType = next(); - npc.lock(); - npc.getPulseManager().clear(); - npc.getWalkingQueue().reset(); - player.setAttribute("/save:witchs_house:experiment_id",this.id); - GameWorld.getPulser().submit(new Pulse(1, npc, player) { - int counter; + /** + * Transforms the new npc. + */ + public void transform(final WitchsExperimentNPC npc, final Player player) { + final ExperimentType newType = next(); + npc.lock(); + npc.getPulseManager().clear(); + npc.getWalkingQueue().reset(); + player.setAttribute("/save:witchs_house:experiment_id",this.id); + GameWorld.getPulser().submit(new Pulse(1, npc, player) { + int counter; - @Override - public boolean pulse() { - switch (++counter) { + @Override + public boolean pulse() { + switch (++counter) { - case 1: - npc.unlock(); - npc.getAnimator().reset(); - npc.fullRestore(); - npc.setType(newType); - npc.transform(newType.getId()); - npc.getImpactHandler().setDisabledTicks(1); - if (newType != END) { - npc.getProperties().getCombatPulse().attack(player); - } - if (newType.getMessage() != null && newType != END) { - player.sendMessage(newType.getMessage()[0]); - player.sendMessage(newType.getMessage()[1]); - } - if (newType == END) { - player.setAttribute("witchs_house:experiment_killed",true); - npc.clear(); - return false; - } - player.unlock(); - return true; - } - return false; - } + case 1: + npc.unlock(); + npc.getAnimator().reset(); + npc.fullRestore(); + npc.setType(newType); + npc.transform(newType.getId()); + npc.getImpactHandler().setDisabledTicks(1); + if (newType != END) { + npc.getProperties().getCombatPulse().attack(player); + } + if (newType.getMessage() != null && newType != END) { + player.sendMessage(newType.getMessage()[0]); + player.sendMessage(newType.getMessage()[1]); + } + if (newType == END) { + player.setAttribute("witchs_house:experiment_killed",true); + npc.clear(); + return false; + } + player.unlock(); + return true; + } + return false; + } - }); - } + }); + } - public static ExperimentType forId(int id) { - for (ExperimentType type : values()) { - if (type.getId() == id) { - return type; - } - } - return null; - } + public static ExperimentType forId(int id) { + for (ExperimentType type : values()) { + if (type.getId() == id) { + return type; + } + } + return null; + } - private static ExperimentType[] experimentTypes = values(); + private static ExperimentType[] experimentTypes = values(); - public ExperimentType next() - { - return experimentTypes[this.ordinal() + 1]; - } + public ExperimentType next() + { + return experimentTypes[this.ordinal() + 1]; + } - public int getId() { - return id; - } + public int getId() { + return id; + } - public String[] getMessage() { - return message; - } + public String[] getMessage() { + return message; + } - } + } } diff --git a/Server/src/main/content/region/desert/quest/thetouristrap/TouristTrapPlugin.java b/Server/src/main/content/region/desert/quest/thetouristrap/TouristTrapPlugin.java index e486577e7..0f0f4a2af 100644 --- a/Server/src/main/content/region/desert/quest/thetouristrap/TouristTrapPlugin.java +++ b/Server/src/main/content/region/desert/quest/thetouristrap/TouristTrapPlugin.java @@ -49,1653 +49,1653 @@ import static core.api.ContentAPIKt.*; */ public final class TouristTrapPlugin extends OptionHandler { - @Override - public Plugin newInstance(Object arg) throws Throwable { - SceneryDefinition.forId(2673).getHandlers().put("option:open", this); - SceneryDefinition.forId(2674).getHandlers().put("option:open", this); - SceneryDefinition.forId(2673).getHandlers().put("option:search", this); - SceneryDefinition.forId(2674).getHandlers().put("option:search", this); - SceneryDefinition.forId(2688).getHandlers().put("option:open", this); - SceneryDefinition.forId(2688).getHandlers().put("option:search", this); - SceneryDefinition.forId(2687).getHandlers().put("option:open", this); - SceneryDefinition.forId(2687).getHandlers().put("option:search", this); - SceneryDefinition.forId(2685).getHandlers().put("option:open", this); - SceneryDefinition.forId(2685).getHandlers().put("option:open", this); - SceneryDefinition.forId(2686).getHandlers().put("option:search", this); - SceneryDefinition.forId(2686).getHandlers().put("option:search", this); - SceneryDefinition.forId(18958).getHandlers().put("option:search", this); - SceneryDefinition.forId(18958).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18959).getHandlers().put("option:search", this); - SceneryDefinition.forId(18959).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18888).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18888).getHandlers().put("option:operate", this); - SceneryDefinition.forId(36748).getHandlers().put("option:talk-to", this); - SceneryDefinition.forId(18869).getHandlers().put("option:bend", this); - SceneryDefinition.forId(18870).getHandlers().put("option:escape", this); - SceneryDefinition.forId(2689).getHandlers().put("option:open", this); - SceneryDefinition.forId(1528).getHandlers().put("option:open", this); - SceneryDefinition.forId(1529).getHandlers().put("option:close", this); - SceneryDefinition.forId(18899).getHandlers().put("option:search", this); - SceneryDefinition.forId(18899).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18878).getHandlers().put("option:search", this); - SceneryDefinition.forId(18878).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18879).getHandlers().put("option:search", this); - SceneryDefinition.forId(18879).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18898).getHandlers().put("option:search", this); - SceneryDefinition.forId(18898).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18902).getHandlers().put("option:search", this); - SceneryDefinition.forId(18871).getHandlers().put("option:climb", this); - SceneryDefinition.forId(18923).getHandlers().put("option:climb-up", this); - SceneryDefinition.forId(18924).getHandlers().put("option:climb-down", this); - SceneryDefinition.forId(2676).getHandlers().put("option:open", this); - SceneryDefinition.forId(2675).getHandlers().put("option:open", this); - SceneryDefinition.forId(2676).getHandlers().put("option:watch", this); - SceneryDefinition.forId(2675).getHandlers().put("option:watch", this); - SceneryDefinition.forId(2690).getHandlers().put("option:open", this); - SceneryDefinition.forId(2691).getHandlers().put("option:open", this); - SceneryDefinition.forId(2698).getHandlers().put("option:walk through", this); - SceneryDefinition.forId(2699).getHandlers().put("option:walk through", this); - SceneryDefinition.forId(2677).getHandlers().put("option:open", this); - SceneryDefinition.forId(2678).getHandlers().put("option:search", this); - SceneryDefinition.forId(2684).getHandlers().put("option:search", this); - SceneryDefinition.forId(2684).getHandlers().put("option:look at", this); - SceneryDefinition.forId(2680).getHandlers().put("option:search", this); - SceneryDefinition.forId(2680).getHandlers().put("option:look-in", this); - SceneryDefinition.forId(2681).getHandlers().put("option:search", this); - SceneryDefinition.forId(2681).getHandlers().put("option:look in", this); - SceneryDefinition.forId(18962).getHandlers().put("option:search", this); - SceneryDefinition.forId(18962).getHandlers().put("option:look in", this); - SceneryDefinition.forId(18963).getHandlers().put("option:search", this); - SceneryDefinition.forId(18963).getHandlers().put("option:look in", this); - SceneryDefinition.forId(18951).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18951).getHandlers().put("option:use", this); - SceneryDefinition.forId(2684).getHandlers().put("option:search", this); - SceneryDefinition.forId(2684).getHandlers().put("option:look at", this); - SceneryDefinition.forId(18875).getHandlers().put("option:inspect", this); - NPCDefinition.forId(830).getHandlers().put("option:watch", this); - NPCDefinition.forId(4975).getHandlers().put("option:talk-to", this); - NPCDefinition.forId(4976).getHandlers().put("option:talk-to", this); - NPCDefinition.forId(4977).getHandlers().put("option:talk-to", this); - NPCDefinition.forId(4978).getHandlers().put("option:talk-to", this); - NPCDefinition.forId(5002).getHandlers().put("option:talk-to", this); - TouristTrap.TECHNICAL_PLANS.getDefinition().getHandlers().put("option:read", this); - TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:look", this); - TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:drop", this); - ClassScanner.definePlugin(new BedabinKeyHandler()); - ClassScanner.definePlugin(new BedabinAnvilHandler()); - ClassScanner.definePlugin(new BarrelDialogue()); - ClassScanner.definePlugin(new WinchDialogue()); - ClassScanner.definePlugin(new MineCartDialogue()); - ClassScanner.definePlugin(new AnnaCartHandler()); - ClassScanner.definePlugin(new AnnaCartCutscene()); - ClassScanner.definePlugin(new AnnaWinchHandler()); - ClassScanner.definePlugin(new WinchCutscene()); - ClassScanner.definePlugin(new CartDialogue()); - return this; - } - - @Override - public boolean handle(final Player player, Node node, String option) { - final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); - final int id = node.getId(); - switch (option) { - case "read": - player.getDialogueInterpreter().sendDialogue("The plans look very technical! But you can see that this item will", "require a bronze bar and at least 10 feathers."); - break; - case "watch": - switch (id) { - case 2676: - case 2675: - player.getDialogueInterpreter().sendDialogue("You watch the doors for some time. You notice that only slaves seem", "to do down there. You might be able to sneak down if you pass as a", "slave."); - break; - default: - player.getDialogueInterpreter().sendDialogue("You watch the Mercenary Captain for some time. He has a large", "metal key attached to his belt. You notice that he usually gets his", "men to do his dirty work."); - break; - } - break; - case "walk through": - switch (id) { - case 2698: - case 2699: - if (quest.getStage(player) < 60) { - player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you! You're not allowed in there."); - break; - } - if (!TouristTrap.hasSlaveClothes(player)) { - player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you're not a slave!"); - break; - } - player.getProperties().setTeleportLocation(player.getLocation().transform(player.getLocation().getX() >= 3284 ? -4 : 4, 0, 0)); - player.getPacketDispatch().sendMessages("You walk into the darkness of the cavern...", "... and emerge in a different part of this huge underground complex."); - break; - } - break; - case "look": - player.getDialogueInterpreter().sendDialogues(823, null, "Let me out of here, I feel sick!"); - break; - case "drop": - player.getDialogueInterpreter().sendDialogues(823, null, "Don't let me out!"); - break; - case "open": - switch (id) { - case 2688: - case 2687: - if (!player.getInventory().containsItem(TouristTrap.WROUGHT_IRON_KEY)) { - player.getPacketDispatch().sendMessage("This gate looks like it needs a key to open it."); - break; - } - DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); - break; - case 2686: - case 2685: - player.getDialogueInterpreter().sendDialogues(4999, null, "Hey, move away from the gate. There's nothing", "interesting for you here."); - break; - case 2677: - if (!player.getInventory().containsItem(TouristTrap.BEDABIN_KEY)) { - player.getPacketDispatch().sendMessage("This chest needs a key to unlock it."); - break; - } - if (quest.getStage(player) <= 54 && quest.getStage(player) != 53) { - player.getPacketDispatch().sendMessage("The captain spots you before you manage to open the chest..."); - player.lock(3); - GameWorld.getPulser().submit(new Pulse(2, player) { - @Override - public boolean pulse() { - player.getDialogueInterpreter().open(831, RegionManager.getNpc(player.getLocation(), 831, 16)); - return true; - } - }); - } else if (quest.getStage(player) == 53) { - if (!player.hasItem(TouristTrap.TECHNICAL_PLANS)) { - player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "While the Captain's distracted, you quickly unlock the", "chest with the Bedabins' copy of the key. You take out", "the plans."); - player.getInventory().add(TouristTrap.TECHNICAL_PLANS, player); - } - } - break; - case 2690: - case 2691: - player.setAttribute("ana-delay", GameWorld.getTicks() + 2); - player.getProperties().setTeleportLocation(Location.create(3301, 3035, 0)); - break; - case 2676: - case 2675: - if (!TouristTrap.hasSlaveClothes(player)) { - player.getDialogueInterpreter().sendDialogues(4997, null, "Watch it! Only slaves can travel into the mine."); - break; - } - player.setAttribute("ana-delay", GameWorld.getTicks() + 2); - player.getProperties().setTeleportLocation(Location.create(3278, 9427, 0)); - player.getDialogueInterpreter().sendDialogue("The huge doors open into a dark, dank and smelly tunnel. The", "associated smells of a hundred sweaty miners greets your nostrils.", "And your ears ring with the 'CLANG CLANG CLANG' as metal hits", "rock."); - break; - case 2674: - case 2673: - if (quest.getStage(player) > 60 && quest.getStage(player) < 98 && player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { - player.lock(); - player.getDialogueInterpreter().sendDialogues(4999, null, true, "Would you like me to take that heavy barrel", "for you?"); - GameWorld.getPulser().submit(new Pulse(4, player) { - int counter; - - @Override - public boolean pulse() { - switch (++counter) { - case 1: - player.getDialogueInterpreter().sendDialogues(player, null, "No, please don't."); - break; - case 2: - player.getDialogueInterpreter().close(); - player.getPacketDispatch().sendMessage("The guards search you!"); - break; - case 3: - player.getPacketDispatch().sendMessage("You are roughed up by the guards and manhandled into a cell."); - break; - case 4: - player.unlock(); - player.getInventory().remove(TouristTrap.ANNA_BARREL); - TouristTrap.addConfig(player, (1 << 4)); - quest.setStage(player, 61); - player.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); - return true; - } - return false; - } - }); - return true; - } - if (node.getLocation().withinDistance(new Location(3273, 3028, 0)) && !((player.getLocation().getX() >= 3274))) { - if (!player.getInventory().containsItem(TouristTrap.METAL_KEY)) { - player.getPacketDispatch().sendMessage("The gate needs a key in order to be opened."); - return true; - } - DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); - player.getPacketDispatch().sendMessage("The guards search you thoroughly as you go through the gates."); - return true; - } - DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); - break; - case 2689: - if (!player.getInventory().containsItem(TouristTrap.CELL_DOOR_KEY)) { - player.getPacketDispatch().sendMessage("The door seems to be pretty locked."); - break; - } - DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); - break; - case 1528: - SceneryBuilder.replace((Scenery) node, ((Scenery) node).transform(1529)); - break; - } - break; - case "close": - if (id == 1529) { - SceneryBuilder.replace((Scenery) node, ((Scenery) node).transform(1528)); - } - break; - case "look-in": - case "look in": - switch (id) { - case 2681: - case 18962: - case 18963: - player.getDialogueInterpreter().sendDialogue("This looks like an empty mining barrel. Slaves use this to load up the", "rocks and stones that they're mining."); - break; - case 2680: - player.getDialogueInterpreter().sendDialogue("You search the full barrel... It's full of rocks."); - break; - } - break; - case "use": - if (id == 18951) { - player.getDialogueInterpreter().open("winch dialogue"); - } - break; - case "search": - switch (id) { - case 2688: - case 2687: - player.getDialogueInterpreter().sendDialogue("These wrought iron gates look like they're designed to keep people out.", "it looks like you'll need a key to get past these."); - break; - case 2686: - case 2685: - player.getDialogueInterpreter().sendDialogue("It looks as if this is where very difficult prisoners are sent as a", "punishment."); - break; - case 2681: - case 18962: - case 18963: - player.getDialogueInterpreter().open("barrel dialogue", node); - break; - case 2680:// barrel of rocks. - player.getDialogueInterpreter().sendDialogue("This looks like a full mining barrel. Slaves use this to load up the", "rocks and stones that they're mining. This barrel is full of rocks."); - break; - case 2684:// cart - player.getDialogueInterpreter().open("cart dialogue", node); - break; - case 2678: - if (quest.getStage(player) == 51) { - quest.setStage(player, 52); - } - player.getDialogueInterpreter().sendItemMessage(9904, "You notice several books on the subject of sailing."); - break; - case 2673: - case 2674: - player.getDialogueInterpreter().sendDialogue("You see what looks like a mining compound. There seems to be people", "mining rocks. They look as if they're chained to the rocks and they're", "being watched over by the guards. It's not a very happy place."); - break; - case 18958: - case 18959: - if (quest.getStage(player) == 90) { - player.getDialogueInterpreter().open("ana cart dialogue"); - break; - } - player.getPacketDispatch().sendMessage("This looks like a mine cart which takes barrels out of the encampment to Al Kharid."); - break; - case 18899: - case 18898: - case 18878: - case 18879: - player.getDialogueInterpreter().sendDialogue("You search the footsteps more closely. You can see that there are", "five sets of footprints. One set of footprints seem lighter than the", "others. The four other footsteps were made by heavier people", "with boots."); - break; - case 18902: - if (hasItem(player, TouristTrap.CELL_DOOR_KEY)) { - player.getInventory().add(TouristTrap.CELL_DOOR_KEY, player); - player.getDialogueInterpreter().sendItemMessage(TouristTrap.CELL_DOOR_KEY, "You find a cell door key."); - break; - } else if (hasItem(player, TouristTrap.WROUGHT_IRON_KEY) && player.getQuestRepository().isComplete(Quests.THE_TOURIST_TRAP)) { - player.getInventory().add(TouristTrap.WROUGHT_IRON_KEY, player); - player.getDialogueInterpreter().sendItemMessage(TouristTrap.WROUGHT_IRON_KEY, "You find the key to the main gate."); - break; - } - player.getPacketDispatch().sendMessage("You search the captains desk while he's not looking..."); - player.getPacketDispatch().sendMessage("...but you find nothing of interest."); - break; - } - break; - case "operate": - if (quest.getStage(player) != 71) { - player.getDialogueInterpreter().sendDialogue("There doesn't seem anything to lift."); - break; - } - ActivityManager.start(player, "winch cutscene", false); - break; - case "look at": - switch (id) { - case 18888: - player.getDialogueInterpreter().sendDialogue("This looks like a winch, it probably brings rocks up from", "underground."); - break; - case 18951: - player.getDialogueInterpreter().sendDialogue("This looks like a lift of some sort. You see barrels of rocks being", "placed on the lift and they're hauled up to the surface."); - break; - case 2684: - if (node.getLocation().getX() == 3318) { - player.getDialogueInterpreter().sendDialogue("This mine cart is being loaded up with new rocks and stone.", "It gets sent to a different section of the mine for unloading."); - break; - } - player.getDialogueInterpreter().sendDialogue("This cart is being unloaded into this section of the mine. Before being", "sent back to another section for another load."); - break; - case 18958: - case 18959: - player.getDialogueInterpreter().sendDialogue("A sturdy looking cart for carrying barrels of rocks out of ", "the mining camp."); - break; - case 18900: - case 18899: - case 18898: - case 18887: - case 18886: - case 18885: - case 18884: - case 18883: - case 18882: - case 18881: - case 18880: - case 18879: - case 18878: - case 18877: - player.getDialogueInterpreter().sendDialogue("This looks like some disturbed sand. Footsteps seem to be heading off", "towards the South."); - break; - } - break; - case "talk-to": - switch (id) { - case 5002: - ((NPC) node).sendChat("Move along please, don't want any trouble today!"); - break; - case 36748: - player.getDialogueInterpreter().sendDialogues(player, null, "Mmm... looks like that camel would make a nice kebab."); - break; - case 4975: - case 4977: - case 4978: - case 4976: - ((NPC) node).sendChat("Hey leave me alone, can't you see that i'm busy?"); - break; - } - break; - case "bend": - player.animate(Animation.create(5037)); - GameWorld.getPulser().submit(new Pulse(5, player) { - @Override - public boolean pulse() { - player.getPacketDispatch().sendMessage("You bend the bars back."); - setVarp(player, 907, getVarp(player, 907) + 1); - return true; - } - }); - break; - case "escape": - player.getPacketDispatch().sendMessage("You prepare to squeeze through the bars."); - AgilityHandler.forceWalk(player, 0, player.getLocation(), player.getLocation().transform(player.getLocation().getX() <= node.getLocation().getX() ? 1 : -1, 0, 0), Animation.create(5038), 4, 0.0, null); - break; - case "climb": - player.getPacketDispatch().sendMessage("You scrape your hands and knees as you climb up."); - AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3279, 3037, 0), Animation.create(5041), 10, 0, null); - GameWorld.getPulser().submit(new Pulse(3, player) { - @Override - public boolean pulse() { - player.getAnimator().reset(); - return true; - } - }); - break; - case "climb-up": - if (id == 18923) { - if (player.getLocation().getX() <= 3278) { - return true; - } - player.animate(Animation.create(5039)); - GameWorld.getPulser().submit(new Pulse(6, player) { - @Override - public boolean pulse() { - player.getAnimator().reset(); - player.getProperties().setTeleportLocation(Location.create(3278, 3037, 0)); - return true; - } - }); - } - break; - case "climb-down": - if (id == 18924) { - if (player.getLocation().getX() <= 3273) { - return true; - } - AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3270, 3039, 0), Animation.create(5040), 20, 0, null); - GameWorld.getPulser().submit(new Pulse(3, player) { - @Override - public boolean pulse() { - player.getAnimator().reset(); - return true; - } - }); - } - break; - case "inspect": - if (id == 18875) { - sendDialogue(player, "You remember that Irena mentioned something about Ana wearing a red scarf before she left for the desert."); - } - break; - } - return true; - } - - @Override - public boolean isWalk(final Player player, Node node) { - return !(node instanceof Item); - } - - @Override - public boolean isWalk() { - return false; - } - - @Override - public Location getDestination(Node node, Node n) { - if (n.getId() == 18923) { - return new Location(3279, 3037, 0); - } - return null; - } - - /** - * Checks if the player contains an item. - * - * @param player the player. - * @param item the item. - * @return the item. - */ - private boolean hasItem(final Player player, final Item item) { - return !player.getInventory().containsItem(item) && !player.getBank().containsItem(item); - } - - /** - * The winch dialogue plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class WinchDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code WinchDialogue} {@code Object}. - */ - public WinchDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code WinchDialogue} {@code Object}. - * - * @param player the player. - */ - public WinchDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new WinchDialogue(player); - } - - @Override - public boolean open(Object... args) { - if (args.length >= 1) { - interpreter.sendDialogue("The guard notices the barrel (with Ana in it) that you're carrying."); - stage = 500; - return true; - } - interpreter.sendDialogues(4999, null, "Hey there, what do you want?"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 500:// winch - interpreter.sendDialogues(5002, null, "Hey, that Barrel looks heavy, do you need a hand?"); - stage++; - break; - case 501: - player("Yes please."); - stage++; - break; - case 502: - interpreter.sendDialogue("The guard comes over and helps you. He takes one end of the", "barrel."); - stage++; - break; - case 503: - interpreter.sendDialogues(5002, null, "Blimey! This is heavy!"); - stage++; - break; - case 504: - interpreter.sendDialogues(823, null, "Why you cheeky....!"); - stage++; - break; - case 505: - interpreter.sendDialogues(5002, null, "- The guard looks around surprised at Ana's outburst. -", "What was that?"); - stage++; - break; - case 506: - player("Oh, it was nothing."); - stage++; - break; - case 507: - interpreter.sendDialogues(5002, null, "I could have sworn I heard something!"); - stage++; - break; - case 508: - interpreter.sendDialogues(823, null, "Yes you did you ignoramus."); - stage++; - break; - case 509: - interpreter.sendDialogues(5002, null, "What was that you said?"); - stage++; - break; - case 510: - player("I said you were very gregarious!"); - stage++; - break; - case 511: - interpreter.sendDialogues(823, null, "You creep!"); - stage++; - break; - case 512: - interpreter.sendDialogues(5002, null, "Oh, right, how very nice of you to say so.", "-- The guard seems flattered. --"); - stage++; - break; - case 513: - interpreter.sendDialogues(5002, null, "Anyway, let's get this barrel up to the surface, plenty", "more work for you to do!"); - stage++; - break; - case 514: - interpreter.sendDialogue("The guard places the barrel carefully on the lift platform."); - stage++; - break; - case 515: - interpreter.sendDialogues(5002, null, "Oh, there's no one operating the lift up top, hope this", "barrel isn't urgent? You'd better get back to work!"); - stage = 516; - break; - case 516: - player.getInventory().remove(TouristTrap.ANNA_BARREL); - player.getBank().remove(TouristTrap.ANNA_BARREL); - player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 71); - end(); - break; - case 0: - options("What is this thing?", "Can I use this?"); - stage++; - break; - case 1: - switch (buttonId) { - case 1: - player("What is this thing?"); - stage = 10; - break; - case 2: - player("Can I use this?"); - stage = 20; - break; - } - break; - case 10: - interpreter.sendDialogues(4999, null, "It is quite clearly a lift. Any fool can see that it's used to", "transport rock to the surface."); - stage++; - break; - case 11: - case 21: - end(); - break; - case 20: - interpreter.sendDialogues(4999, null, "Of course not, you'd be doing me out of a job. Anyway", "you haven't got any barrels that need to go to", "the surface."); - stage++; - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("winch dialogue")}; - } - - } - - /** - * The use with handler for anna on the cart. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class AnnaCartHandler extends UseWithHandler { - - /** - * Constructs a new {@code AnnaCartHandler} {@code Object}. - */ - public AnnaCartHandler() { - super(TouristTrap.ANNA_BARREL.getId()); - } - - @Override - public Plugin newInstance(Object arg) { - addHandler(2684, OBJECT_TYPE, this); - addHandler(18958, OBJECT_TYPE, this); - return this; - } - - @Override - public boolean handle(final NodeUsageEvent event) { - final Player player = event.getPlayer(); - final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); - if (event.getUsedWith().getId() == 18958) {// cart - if (quest.getStage(player) == 72) { - player.lock(4); - player.animate(Animation.create(5050)); - GameWorld.getPulser().submit(new Pulse(3, player) { - @Override - public boolean pulse() { - player.getInventory().remove(event.getUsedItem()); - TouristTrap.addConfig(player, 4096 + (2048 + (1 << 4))); - quest.setStage(player, 80); - player.getDialogueInterpreter().sendDialogue("You place Ana (In the barrel) carefully on the cart. This was the last", "barrel to go on the cart, but the cart driver doesn't seem to be", "any rush to get going. And the desert heat will soon get to Ana."); - return true; - } - }); - } - return true; - } - if (!event.getUsedWith().getLocation().equals(Location.create(3318, 9430, 0))) { - return false; - } - if (quest.getStage(player) != 61) { - return false; - } - player.getDialogueInterpreter().sendDialogue("You carefully place Ana in the barrel into the mine", "cart. Soon the cart moves out of sight and then it", "returns."); - player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); - ActivityManager.start(player, "ana cart", false); - return true; - } - - /** - * The ana cart cutscene plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class AnnaCartCutscene extends CutscenePlugin { - - /** - * The paths. - */ - private static final Location[][] PATHS = new Location[][]{{Location.create(3315, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9428, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3316, 9417, 0), Location.create(3314, 9417, 0), Location.create(3303, 9417, 0)}}; - - /** - * Constructs a new {@code AnnaCartCutscene} {@code Object}. - */ - public AnnaCartCutscene() { - super("ana cart"); - } - - /** - * Constructs a new {@code AnnaCartCutscene} {@code Object}. - * - * @param player the player. - */ - public AnnaCartCutscene(final Player player) { - super("ana cart"); - this.player = player; - } - - @Override - public void open() { - super.open(); - player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); - player.faceLocation(base.transform(54, 22, 0)); - GameWorld.getPulser().submit(new Pulse(1, player) { - int counter; - NPC cart; - - @Override - public boolean pulse() { - switch (++counter) { - case 1: - player.animate(Animation.create(5052)); - break; - case 3: - SceneryBuilder.remove(RegionManager.getObject(base.transform(54, 22, 0))); - cart = NPC.create(4980, base.transform(54, 22, 0)); - cart.init(); - break; - case 4: - cart.getWalkingQueue().reset(); - for (Location l : PATHS[1]) { - Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); - cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); - } - break; - case 18: - cart.clear(); - break; - case 22: - cart = NPC.create(4981, base.transform(51, 9, 0)); - cart.init(); - cart.getWalkingQueue().reset(); - for (Location l : PATHS[0]) { - Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); - cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); - } - break; - case 33: - player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 70); - player.getInventory().remove(TouristTrap.ANNA_BARREL); - player.removeAttribute("ana-delay"); - AnnaCartCutscene.this.stop(true); - return true; - } - return false; - } - }); - } - - @Override - public ActivityPlugin newInstance(Player p) { - return new AnnaCartCutscene(p); - } - - @Override - public Location getSpawnLocation() { - return null; - } - - @Override - public Location getStartLocation() { - return base.transform(54, 23, 0); - } - - @Override - public void configure() { - region = DynamicRegion.create(13203); - setRegionBase(); - registerRegion(region.getId()); - } - } - } - - /** - * The cart dialogue plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class CartDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code CartDialogue} {@code Object}. - * - * @param player the player. - */ - public CartDialogue(final Player player) { - super(player); - } - - /** - * Constructs a new {@code CartDialogue} {@code Object}. - */ - public CartDialogue() { - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new CartDialogue(player); - } - - @Override - public boolean open(Object... args) { - interpreter.sendDialogue("There is space on the cart for you get on, would you like to try?"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - options("Yes, I'll get on.", "No, I've got other plans."); - stage++; - break; - case 1: - switch (buttonId) { - case 1: - interpreter.sendDialogue("You decide to climb onto the cart."); - stage++; - break; - case 2: - end(); - break; - } - break; - case 2: - player.lock(); - player.animate(ClimbActionHandler.CLIMB_UP); - GameWorld.getPulser().submit(new Pulse(1, player) { - int counter; - - @Override - public boolean pulse() { - switch (counter++) { - case 1: - player.getInterfaceManager().openOverlay(new Component(115)); - break; - case 4: - player.getDialogueInterpreter().sendDialogue("As soon as you get on the cart, it starts to move.", "Before too long you are past the gates. You jump off", "the cart taking Ana with you."); - break; - case 6: - player.unlock(); - player.getInterfaceManager().closeOverlay(); - player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 95); - player.getInterfaceManager().close(); - player.getProperties().setTeleportLocation(Location.create(3258, 3029, 0)); - player.getInventory().add(TouristTrap.ANNA_BARREL); - return true; - } - return false; - } - }); - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("ana cart dialogue")}; - } - - } - - /** - * The minecart dialogue plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class MineCartDialogue extends DialoguePlugin { - - /** - * The failing animation of getting in the cart. - */ - private static final Animation FAIL_ANIMATION = new Animation(5048); - - /** - * The jumping animation. - */ - private static final Animation JUMP_ANIMATION = new Animation(5049); - - /** - * The cart. - */ - private Scenery cart; - - /** - * Constructs a new {@code MineCartDialogue} {@code Object}. - */ - public MineCartDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code MineCartDialogue} {@code Object}. - * - * @param player the player. - */ - public MineCartDialogue(final Player player) { - super(player); - } - - @Override - public void init() { - super.init(); - ClassScanner.definePlugin(new MiningCartCutscene()); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new MineCartDialogue(player); - } - - @Override - public boolean open(Object... args) { - cart = (Scenery) args[0]; - if (player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { - player("There's not enough room for both of us."); - stage = -1; - return true; - } - interpreter.sendDialogue("You search the mine cart..."); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case -1: - end(); - break; - case 0: - interpreter.sendDialogue("There may be just enough space to squeeze yourself into the cart.", "Would you like to try?"); - stage++; - break; - case 1: - options("Yes, of course.", "No thanks, it looks pretty dangerous."); - stage++; - break; - case 2: - switch (buttonId) { - case 1: - end(); - enterCart(player); - break; - case 2: - end(); - break; - } - break; - } - return true; - } - - /** - * Method used to enter the cart. - * - * @param player the player. - */ - public void enterCart(final Player player) { - if (RandomFunction.random(3) == 1) { - player.lock(FAIL_ANIMATION.getDelay()); - player.animate(FAIL_ANIMATION); - player.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); - player.getPacketDispatch().sendMessages("You fail to fit yourself into the cart in time before it starts its journey.", "You bang your head on the cart as you try to jump in."); - } else { - GameWorld.getPulser().submit(new Pulse(3, player) { - @Override - public boolean pulse() { - player.animate(JUMP_ANIMATION); - return true; - } - }); - ActivityManager.start(player, "mining cart", false, cart.getLocation().getX() == 3303 ? 0 : 1); - } - } - - /** - * The mining cart cutscene plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class MiningCartCutscene extends CutscenePlugin { - - /** - * The paths. - */ - private static final Location[][] PATHS = new Location[][]{{Location.create(3303, 9417, 0), Location.create(3316, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9430, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3303, 9417, 0)}}; - - /** - * The path index. - */ - private int index; - - /** - * Constructs a new {@code MiningCartCutscene} {@code Object}. - */ - public MiningCartCutscene() { - super("mining cart"); - } - - /** - * Constructs a new {@code MiningCartCutscene} {@code Object}. - * - * @param player the player. - */ - public MiningCartCutscene(final Player player) { - super("mining cart"); - this.player = player; - } - - @Override - public boolean start(final Player player, boolean login, Object... args) { - index = (int) args[0]; - return super.start(player, login, args); - } - - @Override - public void open() { - SceneryBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0))); - SceneryBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[getPath().length - 1].getLocalX(), getPath()[getPath().length - 1].getLocalY(), 0))); - player.getAppearance().setAnimations(Animation.create(211)); - player.getAppearance().setRidingMinecart(true); - player.getAppearance().sync(); - player.getWalkingQueue().reset(); - for (Location l : getPath()) { - Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); - player.getWalkingQueue().addPath(loc.getX(), loc.getY(), true); - } - GameWorld.getPulser().submit(new Pulse(22, player) { - @Override - public boolean pulse() { - player.setAttribute("real-end", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); - player.setAttribute("cutscene:original-loc", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); - MiningCartCutscene.this.stop(true); - return true; - } - }); - } - - @Override - public void end() { - super.end(); - player.getAppearance().setDefaultAnimations(); - player.getAppearance().setRidingMinecart(false); - player.getAppearance().sync(); - } - - @Override - public void fade() { - if (index == 0) { - player.getDialogueInterpreter().sendDialogue("You appear in a large open room with what looks like lots of miners", "working away. This is a very rough looking area, the miners look like", "they're on their last legs."); - } else { - player.getDialogueInterpreter().sendDialogue("You appear back in the barrel loading room. A nearby slave looks", "surprised to see you popping out of the cart."); - } - } - - @Override - public ActivityPlugin newInstance(Player p) { - return new MiningCartCutscene(p); - } - - @Override - public Location getSpawnLocation() { - return null; - } - - @Override - public Location getStartLocation() { - return base.transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0); - } - - @Override - public void configure() { - region = DynamicRegion.create(13203); - setRegionBase(); - registerRegion(region.getId()); - } - - /** - * Gets the path index. - * - * @return the location. - */ - public Location[] getPath() { - return PATHS[index]; - } - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("cart dialogue")}; - } - - } - - /** - * The winch cutscene plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class WinchCutscene extends CutscenePlugin { - - /** - * Constructs a new {@code WinchCutscene} {@code Object}. - */ - public WinchCutscene() { - super("winch cutscene"); - } - - /** - * Constructs a new {@code WinchCutscene} {@code Object}. - * - * @param player the player. - */ - public WinchCutscene(final Player player) { - super("winch cutscene"); - this.player = player; - } - - @Override - public ActivityPlugin newInstance(Player p) { - return new WinchCutscene(p); - } - - @Override - public void open() { - super.open(); - player.getPacketDispatch().sendMessage("You try to operate the winch."); - player.faceLocation(base.transform(15, 9, 0)); - player.animate(Animation.create(5054)); - GameWorld.getPulser().submit(new Pulse(AnimationDefinition.forId(5054).getDurationTicks(), player) { - @Override - public boolean pulse() { - TouristTrap.addConfig(player, 2048 + (1 << 4)); - WinchCutscene.this.stop(true); - player.getDialogueInterpreter().open(822, true, true); - return true; - } - }); - } - - @Override - public Location getSpawnLocation() { - return null; - } - - @Override - public Location getStartLocation() { - return base.transform(16, 10, 0); - } - - @Override - public void configure() { - region = DynamicRegion.create(13103); - setRegionBase(); - registerRegion(region.getId()); - } - - } - - /** - * The use with handler on the chest. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class BedabinKeyHandler extends UseWithHandler { - - /** - * Constructs a new {@code BedabinKeyHandler} {@code Object}. - */ - public BedabinKeyHandler() { - super(TouristTrap.BEDABIN_KEY.getId()); - } - - @Override - public Plugin newInstance(Object arg) { - addHandler(2677, OBJECT_TYPE, this); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - player.getDialogueInterpreter().open(831, RegionManager.getNpc(player.getLocation(), 831, 16)); - return true; - } - - } - - /** - * The barrel dialogue plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class BarrelDialogue extends DialoguePlugin { - - /** - * The scenery barrel. - */ - private Scenery barrel; - - /** - * The quest. - */ - private Quest quest; - - /** - * Constructs a new {@code BarrelDialogue} {@code Object}. - */ - public BarrelDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code BarrelDialogue} {@code Object}. - * - * @param player the player. - */ - public BarrelDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new BarrelDialogue(player); - } - - @Override - public boolean open(Object... args) { - barrel = (Scenery) args[0]; - quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); - if ((quest.getStage(player) == 70 || quest.getStage(player) == 72) && !player.hasItem(TouristTrap.ANNA_BARREL)) { - interpreter.sendDialogue("You search the barrels and find Ana."); - stage = 400; - return true; - } - if (player.getInventory().containsItem(TouristTrap.BARREL)) { - player.getPacketDispatch().sendMessage("You can only manage to have one of these at a time."); - end(); - return true; - } - interpreter.sendItemMessage(TouristTrap.BARREL, "This barrel is quite big. but you may be able to carry one. Would you like to take one?"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 400:// finding anna. - interpreter.sendDialogues(823, null, "Let me out!"); - stage++; - break; - case 401: - if (!player.getInventory().hasSpaceFor(TouristTrap.ANNA_BARREL)) { - end(); - return true; - } - player.getPacketDispatch().sendMessage("You pick up Ana in a Barrel."); - player.getInventory().add(TouristTrap.ANNA_BARREL); - end(); - break; - case 402: - end(); - break; - case 0: - options("Yeah, cool!", "No thanks."); - stage++; - break; - case 1: - switch (buttonId) { - case 1: - interpreter.sendItemMessage(TouristTrap.BARREL, "You take the barrel, it's not heavy, just awkward."); - stage = 3; - break; - case 2: - end(); - break; - } - break; - case 3: - end(); - player.getInventory().add(TouristTrap.BARREL, player); - SceneryBuilder.remove(barrel); - GameWorld.getPulser().submit(new Pulse(40) { - @Override - public boolean pulse() { - SceneryBuilder.add(barrel); - return true; - } - }); - break; - - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("barrel dialogue")}; - } - - } - - /** - * The use with handler for the bedabin anvil. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class BedabinAnvilHandler extends UseWithHandler { - - /** - * Constructs a new {@code BedabinAnvilHandler} {@code Object}. - */ - public BedabinAnvilHandler() { - super(2349); - } - - @Override - public Plugin newInstance(Object arg) { - addHandler(2672, OBJECT_TYPE, this); - ClassScanner.definePlugin(new PrototypeDartHandler()); - ClassScanner.definePlugin(new BedabinAnvilDialogue()); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); - if (quest.getStage(player) == 54 && player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { - player.getDialogueInterpreter().open("bedabin-anvil"); - return true; - } else { - player.getPacketDispatch().sendMessage("You need technical plans in order to do this."); - } - return true; - } - - /** - * The handler used to handle the anna barrel on the winch. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class AnnaWinchHandler extends UseWithHandler { - - /** - * Constructs a new {@code AnnaWinchHandler} {@code Object}. - */ - public AnnaWinchHandler() { - super(TouristTrap.ANNA_BARREL.getId()); - } - - @Override - public Plugin newInstance(Object arg) { - addHandler(18951, OBJECT_TYPE, this); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); - if (!event.getUsedWith().getLocation().equals(Location.create(3292, 9423, 0))) { - return false; - } - if (quest.getStage(player) == 70) { - player.getDialogueInterpreter().open("winch dialogue", true); - return true; - } - return false; - } - - } - - /** - * The prototype dart creation handler. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class PrototypeDartHandler extends UseWithHandler { - - /** - * Constructs a new {@code PrototypeDartHandler} {@code Object}. - */ - public PrototypeDartHandler() { - super(314); - } - - @Override - public Plugin newInstance(Object arg) { - addHandler(TouristTrap.PROTOTYPE_DART_TIP.getId(), ITEM_TYPE, this); - ClassScanner.definePlugin(new ProtoTypeDialogue()); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - player.getDialogueInterpreter().open("prototype dart"); - return true; - } - - /** - * The prototype dialogue plugin. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class ProtoTypeDialogue extends DialoguePlugin { - - /** - * The feathers item. - */ - private static final Item FEATHERS = new Item(314, 10); - - /** - * Constructs a new {@code ProtoTypeDialogue} {@code Object}. - * - * @param player the player. - */ - public ProtoTypeDialogue(final Player player) { - super(player); - } - - /** - * Constructs a new {@code ProtoTypeDialogue} {@code Object}. - */ - public ProtoTypeDialogue() { - /** - * empty. - */ - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new ProtoTypeDialogue(player); - } - - @Override - public boolean open(Object... args) { - if (!player.getInventory().containsItem(FEATHERS)) { - interpreter.sendDialogue("You need 10 feathers in order to do this."); - stage = 10; - return false; - } - interpreter.sendItemMessage(314, "You try to attach feathers to the bronze dart tip."); - stage = 1; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 1: - interpreter.sendDialogue("Following the plans is tricky, but you persevere."); - stage++; - break; - case 2: - interpreter.sendItemMessage(TouristTrap.PROTOTYPE_DART, "You successfully attach the feathers to the dart tip."); - stage++; - break; - case 3: - player.getInventory().remove(FEATHERS, TouristTrap.PROTOTYPE_DART_TIP); - player.getInventory().add(TouristTrap.PROTOTYPE_DART); - end(); - break; - case 4: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("prototype dart")}; - } - - } - } - - /** - * The bedabin dialogue plugin handler. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class BedabinAnvilDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. - */ - public BedabinAnvilDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. - * - * @param player the player. - */ - public BedabinAnvilDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new BedabinAnvilDialogue(player); - } - - @Override - public boolean open(Object... args) { - if (!player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { - player.getPacketDispatch().sendMessage("You need the plans to do this."); - return false; - } - player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "Do you want to follow the technical plans ?"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - options("Yes. I'd like to try.", "No, not just yet."); - stage++; - break; - case 1: - switch (buttonId) { - case 1: - end(); - player.getPulseManager().run(new ProtoTypePulse(player)); - break; - case 2: - end(); - break; - } - break; - } - return true; - } - - /** - * The skill pulse used to make a prototype dart. - * - * @author 'Vexia - * @version 1.0 - */ - public static final class ProtoTypePulse extends SkillPulse { - - /** - * The hammer item. - */ - private static final Item HAMMER = new Item(2347); - - /** - * The ticks passed. - */ - private int ticks; - - /** - * Constructs a new {@code ProtoTypePulse} {@code Object}. - * - * @param player the player. - */ - public ProtoTypePulse(Player player) { - super(player, null); - } - - @Override - public boolean checkRequirements() { - if (!player.getInventory().hasSpaceFor(TouristTrap.PROTOTYPE_DART_TIP)) { - player.getPacketDispatch().sendMessage("Not enough inventory space."); - return false; - } - if (!player.getInventory().containsItem(HAMMER)) { - player.getPacketDispatch().sendMessage("You need a hammer in order to work metal with."); - return false; - } - return player.getInventory().containsItem(Bar.BRONZE.getProduct()); - } - - @Override - public void animate() { - if (ticks % 4 == 0) { - player.animate(Animation.create(898)); - } - } - - @Override - public boolean reward() { - if (++ticks % 4 != 0) { - return false; - } - if (ticks == 4) { - player.getDialogueInterpreter().sendPlainMessage(true, "You begin experimenting in forging the weapon..."); - } else if (ticks == 8) { - player.getInventory().remove(Bar.BRONZE.getProduct()); - player.getInventory().add(TouristTrap.PROTOTYPE_DART_TIP); - player.getDialogueInterpreter().sendItemMessage(TouristTrap.PROTOTYPE_DART_TIP, "You follow the plans carefully, and after some careful", "work, you finally manage to forge a sharp, pointed...", "dart tip."); - return true; - } - return false; - } - - @Override - public void stop() { - super.stop(); - } - - } - - @Override - public int[] getIds() { - return new int[]{DialogueInterpreter.getDialogueKey("bedabin-anvil")}; - } - - } - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + SceneryDefinition.forId(2673).getHandlers().put("option:open", this); + SceneryDefinition.forId(2674).getHandlers().put("option:open", this); + SceneryDefinition.forId(2673).getHandlers().put("option:search", this); + SceneryDefinition.forId(2674).getHandlers().put("option:search", this); + SceneryDefinition.forId(2688).getHandlers().put("option:open", this); + SceneryDefinition.forId(2688).getHandlers().put("option:search", this); + SceneryDefinition.forId(2687).getHandlers().put("option:open", this); + SceneryDefinition.forId(2687).getHandlers().put("option:search", this); + SceneryDefinition.forId(2685).getHandlers().put("option:open", this); + SceneryDefinition.forId(2685).getHandlers().put("option:open", this); + SceneryDefinition.forId(2686).getHandlers().put("option:search", this); + SceneryDefinition.forId(2686).getHandlers().put("option:search", this); + SceneryDefinition.forId(18958).getHandlers().put("option:search", this); + SceneryDefinition.forId(18958).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18959).getHandlers().put("option:search", this); + SceneryDefinition.forId(18959).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18888).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18888).getHandlers().put("option:operate", this); + SceneryDefinition.forId(36748).getHandlers().put("option:talk-to", this); + SceneryDefinition.forId(18869).getHandlers().put("option:bend", this); + SceneryDefinition.forId(18870).getHandlers().put("option:escape", this); + SceneryDefinition.forId(2689).getHandlers().put("option:open", this); + SceneryDefinition.forId(1528).getHandlers().put("option:open", this); + SceneryDefinition.forId(1529).getHandlers().put("option:close", this); + SceneryDefinition.forId(18899).getHandlers().put("option:search", this); + SceneryDefinition.forId(18899).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18878).getHandlers().put("option:search", this); + SceneryDefinition.forId(18878).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18879).getHandlers().put("option:search", this); + SceneryDefinition.forId(18879).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18898).getHandlers().put("option:search", this); + SceneryDefinition.forId(18898).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18902).getHandlers().put("option:search", this); + SceneryDefinition.forId(18871).getHandlers().put("option:climb", this); + SceneryDefinition.forId(18923).getHandlers().put("option:climb-up", this); + SceneryDefinition.forId(18924).getHandlers().put("option:climb-down", this); + SceneryDefinition.forId(2676).getHandlers().put("option:open", this); + SceneryDefinition.forId(2675).getHandlers().put("option:open", this); + SceneryDefinition.forId(2676).getHandlers().put("option:watch", this); + SceneryDefinition.forId(2675).getHandlers().put("option:watch", this); + SceneryDefinition.forId(2690).getHandlers().put("option:open", this); + SceneryDefinition.forId(2691).getHandlers().put("option:open", this); + SceneryDefinition.forId(2698).getHandlers().put("option:walk through", this); + SceneryDefinition.forId(2699).getHandlers().put("option:walk through", this); + SceneryDefinition.forId(2677).getHandlers().put("option:open", this); + SceneryDefinition.forId(2678).getHandlers().put("option:search", this); + SceneryDefinition.forId(2684).getHandlers().put("option:search", this); + SceneryDefinition.forId(2684).getHandlers().put("option:look at", this); + SceneryDefinition.forId(2680).getHandlers().put("option:search", this); + SceneryDefinition.forId(2680).getHandlers().put("option:look-in", this); + SceneryDefinition.forId(2681).getHandlers().put("option:search", this); + SceneryDefinition.forId(2681).getHandlers().put("option:look in", this); + SceneryDefinition.forId(18962).getHandlers().put("option:search", this); + SceneryDefinition.forId(18962).getHandlers().put("option:look in", this); + SceneryDefinition.forId(18963).getHandlers().put("option:search", this); + SceneryDefinition.forId(18963).getHandlers().put("option:look in", this); + SceneryDefinition.forId(18951).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18951).getHandlers().put("option:use", this); + SceneryDefinition.forId(2684).getHandlers().put("option:search", this); + SceneryDefinition.forId(2684).getHandlers().put("option:look at", this); + SceneryDefinition.forId(18875).getHandlers().put("option:inspect", this); + NPCDefinition.forId(830).getHandlers().put("option:watch", this); + NPCDefinition.forId(4975).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4976).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4977).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4978).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(5002).getHandlers().put("option:talk-to", this); + TouristTrap.TECHNICAL_PLANS.getDefinition().getHandlers().put("option:read", this); + TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:look", this); + TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:drop", this); + ClassScanner.definePlugin(new BedabinKeyHandler()); + ClassScanner.definePlugin(new BedabinAnvilHandler()); + ClassScanner.definePlugin(new BarrelDialogue()); + ClassScanner.definePlugin(new WinchDialogue()); + ClassScanner.definePlugin(new MineCartDialogue()); + ClassScanner.definePlugin(new AnnaCartHandler()); + ClassScanner.definePlugin(new AnnaCartCutscene()); + ClassScanner.definePlugin(new AnnaWinchHandler()); + ClassScanner.definePlugin(new WinchCutscene()); + ClassScanner.definePlugin(new CartDialogue()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); + final int id = node.getId(); + switch (option) { + case "read": + player.getDialogueInterpreter().sendDialogue("The plans look very technical! But you can see that this item will", "require a bronze bar and at least 10 feathers."); + break; + case "watch": + switch (id) { + case 2676: + case 2675: + player.getDialogueInterpreter().sendDialogue("You watch the doors for some time. You notice that only slaves seem", "to do down there. You might be able to sneak down if you pass as a", "slave."); + break; + default: + player.getDialogueInterpreter().sendDialogue("You watch the Mercenary Captain for some time. He has a large", "metal key attached to his belt. You notice that he usually gets his", "men to do his dirty work."); + break; + } + break; + case "walk through": + switch (id) { + case 2698: + case 2699: + if (quest.getStage(player) < 60) { + player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you! You're not allowed in there."); + break; + } + if (!TouristTrap.hasSlaveClothes(player)) { + player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you're not a slave!"); + break; + } + player.getProperties().setTeleportLocation(player.getLocation().transform(player.getLocation().getX() >= 3284 ? -4 : 4, 0, 0)); + player.getPacketDispatch().sendMessages("You walk into the darkness of the cavern...", "... and emerge in a different part of this huge underground complex."); + break; + } + break; + case "look": + player.getDialogueInterpreter().sendDialogues(823, null, "Let me out of here, I feel sick!"); + break; + case "drop": + player.getDialogueInterpreter().sendDialogues(823, null, "Don't let me out!"); + break; + case "open": + switch (id) { + case 2688: + case 2687: + if (!player.getInventory().containsItem(TouristTrap.WROUGHT_IRON_KEY)) { + player.getPacketDispatch().sendMessage("This gate looks like it needs a key to open it."); + break; + } + DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); + break; + case 2686: + case 2685: + player.getDialogueInterpreter().sendDialogues(4999, null, "Hey, move away from the gate. There's nothing", "interesting for you here."); + break; + case 2677: + if (!player.getInventory().containsItem(TouristTrap.BEDABIN_KEY)) { + player.getPacketDispatch().sendMessage("This chest needs a key to unlock it."); + break; + } + if (quest.getStage(player) <= 54 && quest.getStage(player) != 53) { + player.getPacketDispatch().sendMessage("The captain spots you before you manage to open the chest..."); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().open(831, RegionManager.getNpc(player.getLocation(), 831, 16)); + return true; + } + }); + } else if (quest.getStage(player) == 53) { + if (!player.hasItem(TouristTrap.TECHNICAL_PLANS)) { + player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "While the Captain's distracted, you quickly unlock the", "chest with the Bedabins' copy of the key. You take out", "the plans."); + player.getInventory().add(TouristTrap.TECHNICAL_PLANS, player); + } + } + break; + case 2690: + case 2691: + player.setAttribute("ana-delay", GameWorld.getTicks() + 2); + player.getProperties().setTeleportLocation(Location.create(3301, 3035, 0)); + break; + case 2676: + case 2675: + if (!TouristTrap.hasSlaveClothes(player)) { + player.getDialogueInterpreter().sendDialogues(4997, null, "Watch it! Only slaves can travel into the mine."); + break; + } + player.setAttribute("ana-delay", GameWorld.getTicks() + 2); + player.getProperties().setTeleportLocation(Location.create(3278, 9427, 0)); + player.getDialogueInterpreter().sendDialogue("The huge doors open into a dark, dank and smelly tunnel. The", "associated smells of a hundred sweaty miners greets your nostrils.", "And your ears ring with the 'CLANG CLANG CLANG' as metal hits", "rock."); + break; + case 2674: + case 2673: + if (quest.getStage(player) > 60 && quest.getStage(player) < 98 && player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + player.lock(); + player.getDialogueInterpreter().sendDialogues(4999, null, true, "Would you like me to take that heavy barrel", "for you?"); + GameWorld.getPulser().submit(new Pulse(4, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + player.getDialogueInterpreter().sendDialogues(player, null, "No, please don't."); + break; + case 2: + player.getDialogueInterpreter().close(); + player.getPacketDispatch().sendMessage("The guards search you!"); + break; + case 3: + player.getPacketDispatch().sendMessage("You are roughed up by the guards and manhandled into a cell."); + break; + case 4: + player.unlock(); + player.getInventory().remove(TouristTrap.ANNA_BARREL); + TouristTrap.addConfig(player, (1 << 4)); + quest.setStage(player, 61); + player.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); + return true; + } + return false; + } + }); + return true; + } + if (node.getLocation().withinDistance(new Location(3273, 3028, 0)) && !((player.getLocation().getX() >= 3274))) { + if (!player.getInventory().containsItem(TouristTrap.METAL_KEY)) { + player.getPacketDispatch().sendMessage("The gate needs a key in order to be opened."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); + player.getPacketDispatch().sendMessage("The guards search you thoroughly as you go through the gates."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); + break; + case 2689: + if (!player.getInventory().containsItem(TouristTrap.CELL_DOOR_KEY)) { + player.getPacketDispatch().sendMessage("The door seems to be pretty locked."); + break; + } + DoorActionHandler.handleAutowalkDoor(player, (Scenery) node); + break; + case 1528: + SceneryBuilder.replace((Scenery) node, ((Scenery) node).transform(1529)); + break; + } + break; + case "close": + if (id == 1529) { + SceneryBuilder.replace((Scenery) node, ((Scenery) node).transform(1528)); + } + break; + case "look-in": + case "look in": + switch (id) { + case 2681: + case 18962: + case 18963: + player.getDialogueInterpreter().sendDialogue("This looks like an empty mining barrel. Slaves use this to load up the", "rocks and stones that they're mining."); + break; + case 2680: + player.getDialogueInterpreter().sendDialogue("You search the full barrel... It's full of rocks."); + break; + } + break; + case "use": + if (id == 18951) { + player.getDialogueInterpreter().open("winch dialogue"); + } + break; + case "search": + switch (id) { + case 2688: + case 2687: + player.getDialogueInterpreter().sendDialogue("These wrought iron gates look like they're designed to keep people out.", "it looks like you'll need a key to get past these."); + break; + case 2686: + case 2685: + player.getDialogueInterpreter().sendDialogue("It looks as if this is where very difficult prisoners are sent as a", "punishment."); + break; + case 2681: + case 18962: + case 18963: + player.getDialogueInterpreter().open("barrel dialogue", node); + break; + case 2680:// barrel of rocks. + player.getDialogueInterpreter().sendDialogue("This looks like a full mining barrel. Slaves use this to load up the", "rocks and stones that they're mining. This barrel is full of rocks."); + break; + case 2684:// cart + player.getDialogueInterpreter().open("cart dialogue", node); + break; + case 2678: + if (quest.getStage(player) == 51) { + quest.setStage(player, 52); + } + player.getDialogueInterpreter().sendItemMessage(9904, "You notice several books on the subject of sailing."); + break; + case 2673: + case 2674: + player.getDialogueInterpreter().sendDialogue("You see what looks like a mining compound. There seems to be people", "mining rocks. They look as if they're chained to the rocks and they're", "being watched over by the guards. It's not a very happy place."); + break; + case 18958: + case 18959: + if (quest.getStage(player) == 90) { + player.getDialogueInterpreter().open("ana cart dialogue"); + break; + } + player.getPacketDispatch().sendMessage("This looks like a mine cart which takes barrels out of the encampment to Al Kharid."); + break; + case 18899: + case 18898: + case 18878: + case 18879: + player.getDialogueInterpreter().sendDialogue("You search the footsteps more closely. You can see that there are", "five sets of footprints. One set of footprints seem lighter than the", "others. The four other footsteps were made by heavier people", "with boots."); + break; + case 18902: + if (hasItem(player, TouristTrap.CELL_DOOR_KEY)) { + player.getInventory().add(TouristTrap.CELL_DOOR_KEY, player); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.CELL_DOOR_KEY, "You find a cell door key."); + break; + } else if (hasItem(player, TouristTrap.WROUGHT_IRON_KEY) && player.getQuestRepository().isComplete(Quests.THE_TOURIST_TRAP)) { + player.getInventory().add(TouristTrap.WROUGHT_IRON_KEY, player); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.WROUGHT_IRON_KEY, "You find the key to the main gate."); + break; + } + player.getPacketDispatch().sendMessage("You search the captains desk while he's not looking..."); + player.getPacketDispatch().sendMessage("...but you find nothing of interest."); + break; + } + break; + case "operate": + if (quest.getStage(player) != 71) { + player.getDialogueInterpreter().sendDialogue("There doesn't seem anything to lift."); + break; + } + ActivityManager.start(player, "winch cutscene", false); + break; + case "look at": + switch (id) { + case 18888: + player.getDialogueInterpreter().sendDialogue("This looks like a winch, it probably brings rocks up from", "underground."); + break; + case 18951: + player.getDialogueInterpreter().sendDialogue("This looks like a lift of some sort. You see barrels of rocks being", "placed on the lift and they're hauled up to the surface."); + break; + case 2684: + if (node.getLocation().getX() == 3318) { + player.getDialogueInterpreter().sendDialogue("This mine cart is being loaded up with new rocks and stone.", "It gets sent to a different section of the mine for unloading."); + break; + } + player.getDialogueInterpreter().sendDialogue("This cart is being unloaded into this section of the mine. Before being", "sent back to another section for another load."); + break; + case 18958: + case 18959: + player.getDialogueInterpreter().sendDialogue("A sturdy looking cart for carrying barrels of rocks out of ", "the mining camp."); + break; + case 18900: + case 18899: + case 18898: + case 18887: + case 18886: + case 18885: + case 18884: + case 18883: + case 18882: + case 18881: + case 18880: + case 18879: + case 18878: + case 18877: + player.getDialogueInterpreter().sendDialogue("This looks like some disturbed sand. Footsteps seem to be heading off", "towards the South."); + break; + } + break; + case "talk-to": + switch (id) { + case 5002: + ((NPC) node).sendChat("Move along please, don't want any trouble today!"); + break; + case 36748: + player.getDialogueInterpreter().sendDialogues(player, null, "Mmm... looks like that camel would make a nice kebab."); + break; + case 4975: + case 4977: + case 4978: + case 4976: + ((NPC) node).sendChat("Hey leave me alone, can't you see that i'm busy?"); + break; + } + break; + case "bend": + player.animate(Animation.create(5037)); + GameWorld.getPulser().submit(new Pulse(5, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You bend the bars back."); + setVarp(player, 907, getVarp(player, 907) + 1); + return true; + } + }); + break; + case "escape": + player.getPacketDispatch().sendMessage("You prepare to squeeze through the bars."); + AgilityHandler.forceWalk(player, 0, player.getLocation(), player.getLocation().transform(player.getLocation().getX() <= node.getLocation().getX() ? 1 : -1, 0, 0), Animation.create(5038), 4, 0.0, null); + break; + case "climb": + player.getPacketDispatch().sendMessage("You scrape your hands and knees as you climb up."); + AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3279, 3037, 0), Animation.create(5041), 10, 0, null); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + return true; + } + }); + break; + case "climb-up": + if (id == 18923) { + if (player.getLocation().getX() <= 3278) { + return true; + } + player.animate(Animation.create(5039)); + GameWorld.getPulser().submit(new Pulse(6, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + player.getProperties().setTeleportLocation(Location.create(3278, 3037, 0)); + return true; + } + }); + } + break; + case "climb-down": + if (id == 18924) { + if (player.getLocation().getX() <= 3273) { + return true; + } + AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3270, 3039, 0), Animation.create(5040), 20, 0, null); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + return true; + } + }); + } + break; + case "inspect": + if (id == 18875) { + sendDialogue(player, "You remember that Irena mentioned something about Ana wearing a red scarf before she left for the desert."); + } + break; + } + return true; + } + + @Override + public boolean isWalk(final Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 18923) { + return new Location(3279, 3037, 0); + } + return null; + } + + /** + * Checks if the player contains an item. + * + * @param player the player. + * @param item the item. + * @return the item. + */ + private boolean hasItem(final Player player, final Item item) { + return !player.getInventory().containsItem(item) && !player.getBank().containsItem(item); + } + + /** + * The winch dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WinchDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WinchDialogue} {@code Object}. + */ + public WinchDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WinchDialogue} {@code Object}. + * + * @param player the player. + */ + public WinchDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WinchDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length >= 1) { + interpreter.sendDialogue("The guard notices the barrel (with Ana in it) that you're carrying."); + stage = 500; + return true; + } + interpreter.sendDialogues(4999, null, "Hey there, what do you want?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 500:// winch + interpreter.sendDialogues(5002, null, "Hey, that Barrel looks heavy, do you need a hand?"); + stage++; + break; + case 501: + player("Yes please."); + stage++; + break; + case 502: + interpreter.sendDialogue("The guard comes over and helps you. He takes one end of the", "barrel."); + stage++; + break; + case 503: + interpreter.sendDialogues(5002, null, "Blimey! This is heavy!"); + stage++; + break; + case 504: + interpreter.sendDialogues(823, null, "Why you cheeky....!"); + stage++; + break; + case 505: + interpreter.sendDialogues(5002, null, "- The guard looks around surprised at Ana's outburst. -", "What was that?"); + stage++; + break; + case 506: + player("Oh, it was nothing."); + stage++; + break; + case 507: + interpreter.sendDialogues(5002, null, "I could have sworn I heard something!"); + stage++; + break; + case 508: + interpreter.sendDialogues(823, null, "Yes you did you ignoramus."); + stage++; + break; + case 509: + interpreter.sendDialogues(5002, null, "What was that you said?"); + stage++; + break; + case 510: + player("I said you were very gregarious!"); + stage++; + break; + case 511: + interpreter.sendDialogues(823, null, "You creep!"); + stage++; + break; + case 512: + interpreter.sendDialogues(5002, null, "Oh, right, how very nice of you to say so.", "-- The guard seems flattered. --"); + stage++; + break; + case 513: + interpreter.sendDialogues(5002, null, "Anyway, let's get this barrel up to the surface, plenty", "more work for you to do!"); + stage++; + break; + case 514: + interpreter.sendDialogue("The guard places the barrel carefully on the lift platform."); + stage++; + break; + case 515: + interpreter.sendDialogues(5002, null, "Oh, there's no one operating the lift up top, hope this", "barrel isn't urgent? You'd better get back to work!"); + stage = 516; + break; + case 516: + player.getInventory().remove(TouristTrap.ANNA_BARREL); + player.getBank().remove(TouristTrap.ANNA_BARREL); + player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 71); + end(); + break; + case 0: + options("What is this thing?", "Can I use this?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What is this thing?"); + stage = 10; + break; + case 2: + player("Can I use this?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(4999, null, "It is quite clearly a lift. Any fool can see that it's used to", "transport rock to the surface."); + stage++; + break; + case 11: + case 21: + end(); + break; + case 20: + interpreter.sendDialogues(4999, null, "Of course not, you'd be doing me out of a job. Anyway", "you haven't got any barrels that need to go to", "the surface."); + stage++; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("winch dialogue")}; + } + + } + + /** + * The use with handler for anna on the cart. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaCartHandler extends UseWithHandler { + + /** + * Constructs a new {@code AnnaCartHandler} {@code Object}. + */ + public AnnaCartHandler() { + super(TouristTrap.ANNA_BARREL.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2684, OBJECT_TYPE, this); + addHandler(18958, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); + if (event.getUsedWith().getId() == 18958) {// cart + if (quest.getStage(player) == 72) { + player.lock(4); + player.animate(Animation.create(5050)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getInventory().remove(event.getUsedItem()); + TouristTrap.addConfig(player, 4096 + (2048 + (1 << 4))); + quest.setStage(player, 80); + player.getDialogueInterpreter().sendDialogue("You place Ana (In the barrel) carefully on the cart. This was the last", "barrel to go on the cart, but the cart driver doesn't seem to be", "any rush to get going. And the desert heat will soon get to Ana."); + return true; + } + }); + } + return true; + } + if (!event.getUsedWith().getLocation().equals(Location.create(3318, 9430, 0))) { + return false; + } + if (quest.getStage(player) != 61) { + return false; + } + player.getDialogueInterpreter().sendDialogue("You carefully place Ana in the barrel into the mine", "cart. Soon the cart moves out of sight and then it", "returns."); + player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); + ActivityManager.start(player, "ana cart", false); + return true; + } + + /** + * The ana cart cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaCartCutscene extends CutscenePlugin { + + /** + * The paths. + */ + private static final Location[][] PATHS = new Location[][]{{Location.create(3315, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9428, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3316, 9417, 0), Location.create(3314, 9417, 0), Location.create(3303, 9417, 0)}}; + + /** + * Constructs a new {@code AnnaCartCutscene} {@code Object}. + */ + public AnnaCartCutscene() { + super("ana cart"); + } + + /** + * Constructs a new {@code AnnaCartCutscene} {@code Object}. + * + * @param player the player. + */ + public AnnaCartCutscene(final Player player) { + super("ana cart"); + this.player = player; + } + + @Override + public void open() { + super.open(); + player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); + player.faceLocation(base.transform(54, 22, 0)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + NPC cart; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + player.animate(Animation.create(5052)); + break; + case 3: + SceneryBuilder.remove(RegionManager.getObject(base.transform(54, 22, 0))); + cart = NPC.create(4980, base.transform(54, 22, 0)); + cart.init(); + break; + case 4: + cart.getWalkingQueue().reset(); + for (Location l : PATHS[1]) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); + } + break; + case 18: + cart.clear(); + break; + case 22: + cart = NPC.create(4981, base.transform(51, 9, 0)); + cart.init(); + cart.getWalkingQueue().reset(); + for (Location l : PATHS[0]) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); + } + break; + case 33: + player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 70); + player.getInventory().remove(TouristTrap.ANNA_BARREL); + player.removeAttribute("ana-delay"); + AnnaCartCutscene.this.stop(true); + return true; + } + return false; + } + }); + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new AnnaCartCutscene(p); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(54, 23, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13203); + setRegionBase(); + registerRegion(region.getId()); + } + } + } + + /** + * The cart dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class CartDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CartDialogue} {@code Object}. + * + * @param player the player. + */ + public CartDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code CartDialogue} {@code Object}. + */ + public CartDialogue() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CartDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("There is space on the cart for you get on, would you like to try?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes, I'll get on.", "No, I've got other plans."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogue("You decide to climb onto the cart."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 2: + player.lock(); + player.animate(ClimbActionHandler.CLIMB_UP); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 4: + player.getDialogueInterpreter().sendDialogue("As soon as you get on the cart, it starts to move.", "Before too long you are past the gates. You jump off", "the cart taking Ana with you."); + break; + case 6: + player.unlock(); + player.getInterfaceManager().closeOverlay(); + player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP).setStage(player, 95); + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(Location.create(3258, 3029, 0)); + player.getInventory().add(TouristTrap.ANNA_BARREL); + return true; + } + return false; + } + }); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("ana cart dialogue")}; + } + + } + + /** + * The minecart dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class MineCartDialogue extends DialoguePlugin { + + /** + * The failing animation of getting in the cart. + */ + private static final Animation FAIL_ANIMATION = new Animation(5048); + + /** + * The jumping animation. + */ + private static final Animation JUMP_ANIMATION = new Animation(5049); + + /** + * The cart. + */ + private Scenery cart; + + /** + * Constructs a new {@code MineCartDialogue} {@code Object}. + */ + public MineCartDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MineCartDialogue} {@code Object}. + * + * @param player the player. + */ + public MineCartDialogue(final Player player) { + super(player); + } + + @Override + public void init() { + super.init(); + ClassScanner.definePlugin(new MiningCartCutscene()); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MineCartDialogue(player); + } + + @Override + public boolean open(Object... args) { + cart = (Scenery) args[0]; + if (player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + player("There's not enough room for both of us."); + stage = -1; + return true; + } + interpreter.sendDialogue("You search the mine cart..."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -1: + end(); + break; + case 0: + interpreter.sendDialogue("There may be just enough space to squeeze yourself into the cart.", "Would you like to try?"); + stage++; + break; + case 1: + options("Yes, of course.", "No thanks, it looks pretty dangerous."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + end(); + enterCart(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + /** + * Method used to enter the cart. + * + * @param player the player. + */ + public void enterCart(final Player player) { + if (RandomFunction.random(3) == 1) { + player.lock(FAIL_ANIMATION.getDelay()); + player.animate(FAIL_ANIMATION); + player.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); + player.getPacketDispatch().sendMessages("You fail to fit yourself into the cart in time before it starts its journey.", "You bang your head on the cart as you try to jump in."); + } else { + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.animate(JUMP_ANIMATION); + return true; + } + }); + ActivityManager.start(player, "mining cart", false, cart.getLocation().getX() == 3303 ? 0 : 1); + } + } + + /** + * The mining cart cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class MiningCartCutscene extends CutscenePlugin { + + /** + * The paths. + */ + private static final Location[][] PATHS = new Location[][]{{Location.create(3303, 9417, 0), Location.create(3316, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9430, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3303, 9417, 0)}}; + + /** + * The path index. + */ + private int index; + + /** + * Constructs a new {@code MiningCartCutscene} {@code Object}. + */ + public MiningCartCutscene() { + super("mining cart"); + } + + /** + * Constructs a new {@code MiningCartCutscene} {@code Object}. + * + * @param player the player. + */ + public MiningCartCutscene(final Player player) { + super("mining cart"); + this.player = player; + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + index = (int) args[0]; + return super.start(player, login, args); + } + + @Override + public void open() { + SceneryBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0))); + SceneryBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[getPath().length - 1].getLocalX(), getPath()[getPath().length - 1].getLocalY(), 0))); + player.getAppearance().setAnimations(Animation.create(211)); + player.getAppearance().setRidingMinecart(true); + player.getAppearance().sync(); + player.getWalkingQueue().reset(); + for (Location l : getPath()) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + player.getWalkingQueue().addPath(loc.getX(), loc.getY(), true); + } + GameWorld.getPulser().submit(new Pulse(22, player) { + @Override + public boolean pulse() { + player.setAttribute("real-end", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); + player.setAttribute("cutscene:original-loc", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); + MiningCartCutscene.this.stop(true); + return true; + } + }); + } + + @Override + public void end() { + super.end(); + player.getAppearance().setDefaultAnimations(); + player.getAppearance().setRidingMinecart(false); + player.getAppearance().sync(); + } + + @Override + public void fade() { + if (index == 0) { + player.getDialogueInterpreter().sendDialogue("You appear in a large open room with what looks like lots of miners", "working away. This is a very rough looking area, the miners look like", "they're on their last legs."); + } else { + player.getDialogueInterpreter().sendDialogue("You appear back in the barrel loading room. A nearby slave looks", "surprised to see you popping out of the cart."); + } + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new MiningCartCutscene(p); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13203); + setRegionBase(); + registerRegion(region.getId()); + } + + /** + * Gets the path index. + * + * @return the location. + */ + public Location[] getPath() { + return PATHS[index]; + } + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("cart dialogue")}; + } + + } + + /** + * The winch cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WinchCutscene extends CutscenePlugin { + + /** + * Constructs a new {@code WinchCutscene} {@code Object}. + */ + public WinchCutscene() { + super("winch cutscene"); + } + + /** + * Constructs a new {@code WinchCutscene} {@code Object}. + * + * @param player the player. + */ + public WinchCutscene(final Player player) { + super("winch cutscene"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new WinchCutscene(p); + } + + @Override + public void open() { + super.open(); + player.getPacketDispatch().sendMessage("You try to operate the winch."); + player.faceLocation(base.transform(15, 9, 0)); + player.animate(Animation.create(5054)); + GameWorld.getPulser().submit(new Pulse(AnimationDefinition.forId(5054).getDurationTicks(), player) { + @Override + public boolean pulse() { + TouristTrap.addConfig(player, 2048 + (1 << 4)); + WinchCutscene.this.stop(true); + player.getDialogueInterpreter().open(822, true, true); + return true; + } + }); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(16, 10, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13103); + setRegionBase(); + registerRegion(region.getId()); + } + + } + + /** + * The use with handler on the chest. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinKeyHandler extends UseWithHandler { + + /** + * Constructs a new {@code BedabinKeyHandler} {@code Object}. + */ + public BedabinKeyHandler() { + super(TouristTrap.BEDABIN_KEY.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2677, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open(831, RegionManager.getNpc(player.getLocation(), 831, 16)); + return true; + } + + } + + /** + * The barrel dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BarrelDialogue extends DialoguePlugin { + + /** + * The scenery barrel. + */ + private Scenery barrel; + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code BarrelDialogue} {@code Object}. + */ + public BarrelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BarrelDialogue} {@code Object}. + * + * @param player the player. + */ + public BarrelDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarrelDialogue(player); + } + + @Override + public boolean open(Object... args) { + barrel = (Scenery) args[0]; + quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); + if ((quest.getStage(player) == 70 || quest.getStage(player) == 72) && !player.hasItem(TouristTrap.ANNA_BARREL)) { + interpreter.sendDialogue("You search the barrels and find Ana."); + stage = 400; + return true; + } + if (player.getInventory().containsItem(TouristTrap.BARREL)) { + player.getPacketDispatch().sendMessage("You can only manage to have one of these at a time."); + end(); + return true; + } + interpreter.sendItemMessage(TouristTrap.BARREL, "This barrel is quite big. but you may be able to carry one. Would you like to take one?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 400:// finding anna. + interpreter.sendDialogues(823, null, "Let me out!"); + stage++; + break; + case 401: + if (!player.getInventory().hasSpaceFor(TouristTrap.ANNA_BARREL)) { + end(); + return true; + } + player.getPacketDispatch().sendMessage("You pick up Ana in a Barrel."); + player.getInventory().add(TouristTrap.ANNA_BARREL); + end(); + break; + case 402: + end(); + break; + case 0: + options("Yeah, cool!", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendItemMessage(TouristTrap.BARREL, "You take the barrel, it's not heavy, just awkward."); + stage = 3; + break; + case 2: + end(); + break; + } + break; + case 3: + end(); + player.getInventory().add(TouristTrap.BARREL, player); + SceneryBuilder.remove(barrel); + GameWorld.getPulser().submit(new Pulse(40) { + @Override + public boolean pulse() { + SceneryBuilder.add(barrel); + return true; + } + }); + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("barrel dialogue")}; + } + + } + + /** + * The use with handler for the bedabin anvil. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinAnvilHandler extends UseWithHandler { + + /** + * Constructs a new {@code BedabinAnvilHandler} {@code Object}. + */ + public BedabinAnvilHandler() { + super(2349); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2672, OBJECT_TYPE, this); + ClassScanner.definePlugin(new PrototypeDartHandler()); + ClassScanner.definePlugin(new BedabinAnvilDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); + if (quest.getStage(player) == 54 && player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + player.getDialogueInterpreter().open("bedabin-anvil"); + return true; + } else { + player.getPacketDispatch().sendMessage("You need technical plans in order to do this."); + } + return true; + } + + /** + * The handler used to handle the anna barrel on the winch. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaWinchHandler extends UseWithHandler { + + /** + * Constructs a new {@code AnnaWinchHandler} {@code Object}. + */ + public AnnaWinchHandler() { + super(TouristTrap.ANNA_BARREL.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(18951, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(Quests.THE_TOURIST_TRAP); + if (!event.getUsedWith().getLocation().equals(Location.create(3292, 9423, 0))) { + return false; + } + if (quest.getStage(player) == 70) { + player.getDialogueInterpreter().open("winch dialogue", true); + return true; + } + return false; + } + + } + + /** + * The prototype dart creation handler. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class PrototypeDartHandler extends UseWithHandler { + + /** + * Constructs a new {@code PrototypeDartHandler} {@code Object}. + */ + public PrototypeDartHandler() { + super(314); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(TouristTrap.PROTOTYPE_DART_TIP.getId(), ITEM_TYPE, this); + ClassScanner.definePlugin(new ProtoTypeDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open("prototype dart"); + return true; + } + + /** + * The prototype dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class ProtoTypeDialogue extends DialoguePlugin { + + /** + * The feathers item. + */ + private static final Item FEATHERS = new Item(314, 10); + + /** + * Constructs a new {@code ProtoTypeDialogue} {@code Object}. + * + * @param player the player. + */ + public ProtoTypeDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code ProtoTypeDialogue} {@code Object}. + */ + public ProtoTypeDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProtoTypeDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!player.getInventory().containsItem(FEATHERS)) { + interpreter.sendDialogue("You need 10 feathers in order to do this."); + stage = 10; + return false; + } + interpreter.sendItemMessage(314, "You try to attach feathers to the bronze dart tip."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendDialogue("Following the plans is tricky, but you persevere."); + stage++; + break; + case 2: + interpreter.sendItemMessage(TouristTrap.PROTOTYPE_DART, "You successfully attach the feathers to the dart tip."); + stage++; + break; + case 3: + player.getInventory().remove(FEATHERS, TouristTrap.PROTOTYPE_DART_TIP); + player.getInventory().add(TouristTrap.PROTOTYPE_DART); + end(); + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("prototype dart")}; + } + + } + } + + /** + * The bedabin dialogue plugin handler. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinAnvilDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. + */ + public BedabinAnvilDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. + * + * @param player the player. + */ + public BedabinAnvilDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BedabinAnvilDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + player.getPacketDispatch().sendMessage("You need the plans to do this."); + return false; + } + player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "Do you want to follow the technical plans ?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes. I'd like to try.", "No, not just yet."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + end(); + player.getPulseManager().run(new ProtoTypePulse(player)); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + /** + * The skill pulse used to make a prototype dart. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class ProtoTypePulse extends SkillPulse { + + /** + * The hammer item. + */ + private static final Item HAMMER = new Item(2347); + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code ProtoTypePulse} {@code Object}. + * + * @param player the player. + */ + public ProtoTypePulse(Player player) { + super(player, null); + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().hasSpaceFor(TouristTrap.PROTOTYPE_DART_TIP)) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return false; + } + if (!player.getInventory().containsItem(HAMMER)) { + player.getPacketDispatch().sendMessage("You need a hammer in order to work metal with."); + return false; + } + return player.getInventory().containsItem(Bar.BRONZE.getProduct()); + } + + @Override + public void animate() { + if (ticks % 4 == 0) { + player.animate(Animation.create(898)); + } + } + + @Override + public boolean reward() { + if (++ticks % 4 != 0) { + return false; + } + if (ticks == 4) { + player.getDialogueInterpreter().sendPlainMessage(true, "You begin experimenting in forging the weapon..."); + } else if (ticks == 8) { + player.getInventory().remove(Bar.BRONZE.getProduct()); + player.getInventory().add(TouristTrap.PROTOTYPE_DART_TIP); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.PROTOTYPE_DART_TIP, "You follow the plans carefully, and after some careful", "work, you finally manage to forge a sharp, pointed...", "dart tip."); + return true; + } + return false; + } + + @Override + public void stop() { + super.stop(); + } + + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("bedabin-anvil")}; + } + + } + } } diff --git a/Server/src/main/content/region/kandarin/seers/handlers/RangingGuildPlugin.java b/Server/src/main/content/region/kandarin/seers/handlers/RangingGuildPlugin.java index b8e504953..b11c6e164 100644 --- a/Server/src/main/content/region/kandarin/seers/handlers/RangingGuildPlugin.java +++ b/Server/src/main/content/region/kandarin/seers/handlers/RangingGuildPlugin.java @@ -45,1168 +45,1168 @@ import static core.api.ContentAPIKt.*; @Initializable public final class RangingGuildPlugin extends OptionHandler { - @Override - public Plugin newInstance(Object arg) throws Throwable { - SceneryDefinition.forId(2514).getHandlers().put("option:open", this); - SceneryDefinition.forId(2511).getHandlers().put("option:climb-up", this); - SceneryDefinition.forId(2512).getHandlers().put("option:climb-down", this); - SceneryDefinition.forId(2513).getHandlers().put("option:fire-at", this); - new RangingGuildDoorman().init(); - new GuardDialogue().init(); - new LeatherWorkerDialogue().init(); - new ArmourSalesman().init(); - new TribalWeaponSalesman().init(); - new BowArrowSalesman().init(); - new WarningInterface().newInstance(arg); - new CompetitionJudge().init(); - ClassScanner.definePlugin(new TowerArcher()); - return this; - } - - @Override - public boolean handle(Player player, Node node, String option) { - final int id = node instanceof Scenery ? ((Scenery) node).getId() : 0; - switch (option) { - case "fire-at": - if (player.getArcheryTargets() <= 0) { - player.getDialogueInterpreter().sendDialogues(693, null, "Sorry, you may only use the targets for the", "competition, not for practicing."); - return true; - } - if (!player.getEquipment().containsItem(new Item(882)) - || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null - || (!player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("shortbow") - && !player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("longbow"))) { - player.sendMessage("You must have bronze arrows and a bow equipped."); - return true; - } - player.getPulseManager().run(new ArcheryCompetitionPulse(player, (Scenery) node)); - break; - case "open": - switch (id) { - case 2514: - if (player.getLocation().getY() >= 3438) { - if (player.getSkills().getStaticLevel(Skills.RANGE) < 40) { - player.getDialogueInterpreter().sendDialogue("You need a Ranging level of 40 to enter here."); - return true; - } - } - DoorActionHandler.handleAutowalkDoor(player, (Scenery) node, player.getLocation().getY() >= 3438 ? Location.create(2659, 3437, 0) : Location.create(2657, 3439, 0)); - break; - } - break; - case "climb-up": - switch (id) { - case 2511: - player.setAttribute("ladder", node); - player.getInterfaceManager().open(new Component(564)); - break; - } - break; - case "climb-down": - switch (id) { - case 2512: - ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 0)); - break; - } - break; - } - return true; - } - - @Override - public Location getDestination(Node node, Node n) { - if (n instanceof Scenery) { - if (((Scenery) n).getDefinition().hasAction("open")) { - if (((Scenery) n).getId() == 2514) { - if (node.getLocation().getY() >= 3438) { - return Location.create(2657, 3439, 0); - } else { - return Location.create(2659, 3437, 0); - } - } - return DoorActionHandler.getDestination((Player) node, (Scenery) n); - } - if (((Scenery) n).getId() == 2513) - return Location.create(2673, 3420, 0); - } - return null; - } - - /** - * Represents the dialogue used for the ranging guild door man. - * - * @author 'Vexia - * @version 1.0 - */ - public class RangingGuildDoorman extends DialoguePlugin { - - /** - * Constructs a new {@code RangingGuildDoorman} {@code Object}. - */ - public RangingGuildDoorman() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code RangingGuildDoorman} {@code Object}. - * - * @param player the player. - */ - public RangingGuildDoorman(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new RangingGuildDoorman(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings. If you are an experienced archer, you may", "want to visit the guild here..."); - stage = 1; - break; - case 1: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{679}; - } - } - - /** - * Represents the tribal weapon salseman dialogue. - * - * @author 'Vexia - * @version 1.0 - */ - public final class TribalWeaponSalesman extends DialoguePlugin { - - /** - * Constructs a new {@code TribalWeaponSalesman} {@code Object}. - */ - public TribalWeaponSalesman() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code TribalWeaponSalesman} {@code Object}. - * - * @param player the player. - */ - public TribalWeaponSalesman(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new TribalWeaponSalesman(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - player("Hello there."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("Greetings, traveller. Are you interested in any throwing", "weapons?"); - stage = 1; - break; - case 1: - options("Yes I am.", "Not really."); - stage = 2; - break; - case 2: - switch (buttonId) { - case 1: - player("Yes I am."); - stage = 10; - break; - case 2: - player("Not really."); - stage = 20; - break; - } - break; - case 10: - npc("That is a good thing."); - stage = 11; - break; - case 11: - end(); - npc.openShop(player); - break; - case 20: - npc("No bother to me."); - stage = 21; - break; - case 21: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{692}; - } - - } - - /** - * Represents the guard dialogue. - * - * @author 'Vexia - * @version 1.0 - */ - public final class GuardDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code GuardDialogue} {@code Object}. - */ - public GuardDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code GuardDialogue} {@code Object}. - * - * @param player the player. - */ - public GuardDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new GuardDialogue(player); - } - - @Override - public boolean open(Object... args) { - player("Hello there."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("Greetings, traveller. Enjoy the time at the Ranging", "Guild."); - stage = 1; - break; - case 1: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{678}; - } - - } - - /** - * Represents the leather workers dialogue. - * - * @author 'Vexia - * @version 1.0 - */ - public final class LeatherWorkerDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. - */ - public LeatherWorkerDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. - * - * @param player the player. - */ - public LeatherWorkerDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new LeatherWorkerDialogue(player); - } - - @Override - public boolean open(Object... args) { - player("Hello."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("Can I help you?"); - stage = 1; - break; - case 1: - options("What do you do here?", "No thanks."); - stage = 2; - break; - case 2: - switch (buttonId) { - case 1: - player("What do you do here?"); - stage = 10; - break; - case 2: - player("No thanks."); - stage = 20; - break; - } - break; - case 10: - npc("Well, I can cure plain cowhides into pieces of leather", "ready for crafting."); - stage = 11; - break; - case 11: - npc("I work with ordinary, hard or dragonhide leather and", "also snakeskin."); - stage = 12; - break; - case 12: - end(); - TanningProduct.open(player, 680); - break; - case 20: - npc("Suit yourself."); - stage = 21; - break; - case 21: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{680}; - } - - } - - /** - * Represents the armour salesman dialogue. - * - * @author 'Vexia - * @version 1.0 - */ - public final class ArmourSalesman extends DialoguePlugin { - - /** - * Constructs a new {@code ArmourSalesman} {@code Object}. - */ - public ArmourSalesman() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code ArmourSalesman} {@code Object}. - * - * @param player the player. - */ - public ArmourSalesman(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new ArmourSalesman(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - player("Good day to you."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("And to you. Can I help you?"); - stage = 1; - break; - case 1: - if (Skillcape.isMaster(player, Skills.RANGE)) { - options("What do you do here?", "I'd like to see what you sell.", "Can I buy a Skillcape of Range?", "I've seen enough, thanks."); - stage = 100; - } else { - options("What do you do here?", "I'd like to see what you sell.", "I've seen enough, thanks."); - stage = 2; - } - break; - case 2: - switch (buttonId) { - case 1: - player("What do you do here?"); - stage = 10; - break; - case 2: - player("I'd like to see what you sell."); - stage = 20; - break; - case 3: - player("I've seen enough, thanks."); - stage = 30; - break; - } - break; - case 10: - npc("I am a supplier of leather armours and accessories. Ask", "and I will tell you what I know."); - stage = 11; - break; - case 11: - options("Tell me about your armours.", "Tell me about your accessories.", "I've seen enough, thanks."); - stage = 12; - break; - case 12: - switch (buttonId) { - case 1: - player("Tell me about your armours."); - stage = 13; - break; - case 2: - player("Tell me about your accessories."); - stage = 15; - break; - case 3: - player("I've seen enough, thanks."); - stage = 30; - break; - } - break; - case 13: - npc("I have normal, studded and hard types."); - stage = 14; - break; - case 14: - case 31: - case 105: - end(); - break; - case 15: - npc("Ah yes we have a new range of accessories in stock.", "Essential items for an archer like you."); - stage = 14; - break; - case 20: - npc("Indeed, cast your eyes on my wares, adventurer."); - stage = 21; - break; - case 21: - end(); - npc.openShop(player); - break; - case 30: - npc("Very good, adventurer."); - stage = 31; - break; - case 100: - switch (buttonId) { - case 1: - player("What do you do here?"); - stage = 10; - break; - case 2: - player("I'd like to see what you sell."); - stage = 20; - break; - case 3: - player("Can I buy a Skillcape of Range?"); - stage = 101; - break; - case 4: - player("I've seen enough, thanks."); - stage = 30; - break; - } - break; - case 101: - npc("Certainly! Right when you give me 99000 coins."); - stage = 102; - break; - case 102: - options("Okay, here you go.", "No, thanks."); - stage = 103; - break; - case 103: - switch (buttonId) { - case 1: - player("Okay, here you go."); - stage = 104; - break; - case 2: - end(); - break; - } - break; - case 104: - if (Skillcape.purchase(player, Skills.RANGE)) { - npc("There you go! Enjoy."); - } - stage = 105; - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{682}; - } - - } - - /** - * Represents the dialogue plugin used for the bow and arrow salesman. - * - * @author 'Vexia - * @version 1.0 - */ - public final class BowArrowSalesman extends DialoguePlugin { - - /** - * Constructs a new {@code BowArrowSalesman} {@code Object}. - */ - public BowArrowSalesman() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code BowArrowSalesman} {@code Object}. - * - * @param player the player. - */ - public BowArrowSalesman(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new BowArrowSalesman(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - player("Hello."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("A fair day, traveller. Would you like to see my wares?"); - stage = 1; - break; - case 1: - options("Yes please.", "No thanks."); - stage = 2; - break; - case 2: - switch (buttonId) { - case 1: - end(); - npc.openShop(player); - - break; - case 2: - end(); - break; - } - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{683}; - } - - } - - /** - * Represents the waring interface used in the guild. - * - * @author 'Vexia - * @version 1.0 - */ - public final class WarningInterface extends ComponentPlugin { - - @Override - public Plugin newInstance(Object arg) throws Throwable { - ComponentDefinition.forId(564).setPlugin(this); - return this; - } - - @Override - public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { - switch (button) { - case 17: - ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 2)); - player.getInterfaceManager().close(); - List npcs = RegionManager.getLocalNPCs(Location.create(2668, 3427, 2)); - String dir = ""; - for (NPC n : npcs) { - if (n.getId() >= 684 && n.getId() <= 687) { - switch (n.getId()) { - case 684: - dir = "north"; - break; - case 685: - dir = "east"; - break; - case 686: - dir = "south"; - break; - case 687: - dir = "west"; - break; - } - n.sendChat("The " + dir + " tower is occupied, get them!"); - } - } - break; - case 18: - player.getInterfaceManager().close(); - break; - } - return true; - } - - } - - /** - * Represents the competition judge. - * - * @author afaroutdude - */ - public final class CompetitionJudge extends DialoguePlugin { - - /** - * Constructs a new {@code CompetitionJudge} {@code Object}. - * - * @param player the player. - */ - public CompetitionJudge(final Player player) { - super(player); - } - - /** - * Constructs a new {@code CompetitionJudge} {@code Object}. - */ - public CompetitionJudge() { - /** - * empty. - */ - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new CompetitionJudge(player); - } - - @Override - public boolean open(Object... args) { - if (player.getInventory().getAmount(1464) >= 1000 - && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 7)) { - npc("Wow! I see that you've got yourself a whole load of ", "archery tickets. Well done!"); - player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 7); - stage = -1; - } else if (player.getArcheryTargets() > 0) { - npc("Hello again, do you need reminding of the rules?"); - stage = 20; - } else if (player.getArcheryTotal() == 0) { - npc("Hello there, would you like to take part in the", - "archery competition? It only costs 200 coins to", - "enter."); - stage = 0; - } else { - int reward = player.getArcheryTotal() / 10; - npc("Well done. Your score is: " + player.getArcheryTotal() + ".", - "For that score you will receive " + reward + " Archery tickets."); - player.setArcheryTargets(-1); - player.setArcheryTotal(0); - if (!player.getInventory().add(new Item(1464, reward))) { - player.getBank().add(new Item(1464, reward)); - player.sendMessage("Your reward was sent to your bank."); - } - stage = 999; - } - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 999: - end(); - break; - case -1: - if (player.getArcheryTargets() > 0) { - npc("Hello again, do you need reminding of the rules?"); - stage = 20; - } else if (player.getArcheryTotal() == 0) { - npc("Hello there, would you like to take part in the", - "archery competition? It only costs 200 coins to", - "enter."); - stage = 0; - } else { - int reward = player.getArcheryTotal() / 10; - npc("Well done. Your score is: " + player.getArcheryTotal() + ".", - "For that score you will receive " + reward + " Archery tickets."); - if (!player.getInventory().add(new Item(1464, reward))) { - player.getBank().add(new Item(1464, reward)); - player.sendMessage("Your reward was sent to your bank."); - } - stage = 999; - } - break; - case 0: - options("Sure, I'll give it a go.", "What are the rules?", "No thanks."); - stage++; - break; - case 1: - switch (buttonId) { - case 1: - player("Sure, I'll give it a go."); - stage = 2; - break; - case 2: - player("What are the rules?"); - stage = 5; - break; - case 3: - player("No thanks."); - stage = 999; - break; - } - break; - case 2: - npc("Great! That will be 200 coins then please."); - stage++; - break; - case 3: - if (player.getInventory().getAmount(995) < 200) { - player("Oops, I don't have enough coins on me..."); - stage++; - } else { - end(); - player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); - player.getInventory().remove(new Item(995, 200)); - player.getInventory().add(new Item(882, 10)); - player.setArcheryTargets(10); - player.setArcheryTotal(0); - } - break; - case 4: - npc("Never mind, come back when you've got enough."); - stage = 999; - break; - case 5: - case 22: - npc("The rules are very simple:"); - stage++; - break; - case 6: - case 23: - npc("You're given 10 shots at the targets, for each hit", "you will receive points. At the end you'll be", "rewarded 1 ticket for every 10 points."); - stage++; - break; - case 7: - npc("The tickets can be exchanged for goods from our stores.", "Do you want to give it a go? Only 200 coins."); - stage++; - break; - case 8: - options("Sure, I'll give it a go.", "No thanks."); - stage++; - break; - case 9: - switch (buttonId) { - case 1: - player("Sure, I'll give it a go."); - stage = 2; - break; - case 3: - player("No thanks."); - stage = 999; - break; - } - break; - case 20: - int arrows = player.getInventory().getAmount(Items.BRONZE_ARROW_882) - + player.getEquipment().getAmount(Items.BRONZE_ARROW_882); - if (arrows < 1) { - player("Well, I actually don't have any more arrows. Could I", "get some more?"); - stage = 25; - } else { - options("Yes please.", "No thanks, I've got it.", "How am I doing so far?"); - stage++; - } - break; - case 21: - switch (buttonId) { - case 1: - player("Yes please."); - stage++; - break; - case 2: - player("No thanks, I've got it."); - stage = 30; - break; - case 3: - player("How am I doing so far?"); - stage = 40; - break; - } - break; - case 24: - npc("The tickets can be exchanged for goods from our stores.", "Good Luck!"); - stage = 999; - break; - case 25: - npc("Ok, but it'll cost you 100 coins."); - stage++; - break; - case 26: - options("Sure, I'll take some.", "No thanks."); - stage++; - break; - case 27: - switch (buttonId) { - case 1: - player("Sure, I'll take some."); - stage++; - break; - case 2: - player("No thanks."); - stage = 999; - break; - } - break; - case 28: - if (player.getInventory().getAmount(995) < 100) { - player("Oops, I don't have enough coins on me..."); - stage++; - } else { - end(); - player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); - player.getInventory().remove(new Item(995, 100)); - player.getInventory().add(new Item(882, 10)); - } - break; - case 30: - npc("Glad to hear it, good luck!"); - stage = 999; - break; - case 40: - String msg; - if (player.getArcheryTotal() <= 0) { - msg = "You haven't started yet."; - } else if (player.getArcheryTotal() <= 80) { - msg = "Not bad, keep going."; - } else { - msg = "You're pretty good, keep it up."; - } - npc("So far your score is: " + player.getArcheryTotal(), msg); - stage = 999; - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{693}; - } - - } - - /** - * Represents the tower advisors. - * - * @author afaroutdude - */ - public final class TowerAdvisor extends DialoguePlugin { - - /** - * Constructs a new {@code TowerAdvisor} {@code Object}. - * - * @param player the player. - */ - public TowerAdvisor(final Player player) { - super(player); - } - - /** - * Constructs a new {@code TowerAdvisor} {@code Object}. - */ - public TowerAdvisor() { - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new TowerAdvisor(player); - } - - @Override - public boolean open(Object... args) { - player("Hello there, what do you do here?"); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 999: - end(); - case 0: - npc("Hi. We are in charge of this practice area."); - stage++; - break; - case 1: - player("This is a practice area?"); - break; - case 2: - npc("Surrounding us are four towers. Each tower contains", - "trained archers of a different level. You'll notice", - "it's quite a distance, so you'll need a longbow."); - stage++; - break; - case 3: - int rangeLevel = player.getSkills().getLevel(Skills.RANGE); - if (rangeLevel < 50) { // north - npc("As you're not very skilled, I advise you to practice", - "on the north tower. That'll provide the best", - "challenge for you."); - } else if (rangeLevel < 60) { // east - npc("You appear to be somewhat skilled with a bow, so I", - "advise you to practice on the south tower. That'll", - "provide the best challenge for you."); - } else if (rangeLevel < 70) { // south - npc("You appear to be fairly skilled with a bow, so I", - "advise you to practice on the south tower. That'll", - "provide the best challenge for you."); - } else { // west - npc("Looks like you're very skilled, so I advise you to", - "practice on the west tower. That'll provide the best", - "challenge for you."); - } - stage = 999; - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[]{684, 685, 686, 687}; - } - - } - - - /** - * Represents all the tower archers - * - * @author afaroutdude - */ - public final class TowerArcher extends AbstractNPC { - - public TowerArcher() { - super(-1, null); - } - public TowerArcher(int id, Location location) { - super(id, location); - } - - - @Override - public AbstractNPC construct(int id, Location location, Object... objects) { - return new TowerArcher(id, location); - } - - @Override - public int[] getIds() { - return new int[]{688, 689, 690, 691}; - } - } - - /** - * Represents the archery target pulse. - * - * @author Jamix77 - */ - public static final class ArcheryCompetitionPulse extends Pulse { - - /** - * Represents the player instance. - */ - private final Player player; - - /** - * Represents the scenery. - */ - private final Scenery object; - - /** - * Constructs a new {@code ArcheryCompetitionPulse} {@code Object}. - * - * @param player the player. - * @param object the object. - */ - public ArcheryCompetitionPulse(final Player player, final Scenery object) { - super(1, player, object); - this.player = player; - this.object = object; - } - - private void showInterface(int points, int arrowsLeft, int target, String msg) { - player.getInterfaceManager().openComponent(325); - setVarp(player, 156, 11 - arrowsLeft); - setVarp(player, 157, points); - setVarp(player, 158, target); - player.getPacketDispatch().sendString(msg, 325, 32); - } - - @Override - public boolean pulse() { - if (player.getArcheryTargets() <= 0) { - return true; - } - if (getDelay() == 1) { - setDelay(player.getProperties().getAttackSpeed()); - } - if (player.getEquipment().remove(new Item(Items.BRONZE_ARROW_882, 1))) { - Projectile p = Ammunition.get(Items.BRONZE_ARROW_882).getProjectile().transform(player, object.getLocation()); - p.setEndLocation(object.getLocation()); - p.setEndHeight(25); - p.send(); - player.animate(new Animation(426)); - player.lock(getDelay()); - - int level = player.getSkills().getLevel(Skills.RANGE); - int bonus = player.getProperties().getBonuses()[14]; - double prayer = 1.0; - prayer += player.getPrayer().getSkillBonus(Skills.RANGE); - double cumulativeStr = Math.floor(level * prayer); - /*if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_RANGE_ACCURATE) { - cumulativeStr += 3; - } else if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_LONG_RANGE) { - cumulativeStr += 1; - }*/ - cumulativeStr *= 1.0; - int hit = (int) ((14 + cumulativeStr + (bonus / 8) + ((cumulativeStr * bonus) * 0.016865))) / 10 + 1; - hit = hit + RandomFunction.randomSign(RandomFunction.random(3)); - - int target = Math.max(0, 13 - hit); - int points = 0; - String msg = ""; - switch (target) { - case 0: - points = 100; - msg = "Bulls-Eye!"; - break; - case 1: - points = 50; - msg = "Hit Yellow!"; - break; - case 2: - case 3: - case 4: - points = 30; - msg = "Hit Red!"; - break; - case 5: - case 6: - case 7: - case 8: - points = 20; - msg = "Hit Blue!"; - break; - case 9: - case 10: - points = 10; - msg = "Hit Black!"; - break; - case 11: - case 12: - case 13: - points = 0; - msg = "Missed!"; - break; - } - int xp = points / 2; - - player.getSkills().addExperience(Skills.RANGE, xp, true); - player.setArcheryTotal(player.getArcheryTotal() + points); - player.setArcheryTargets(player.getArcheryTargets() - 1); - player.debug("Hit: " + hit); - player.debug("You have " + player.getArcheryTargets() + " targets left."); - player.debug("You have " + player.getArcheryTotal() + " score."); - - showInterface(player.getArcheryTotal(), player.getArcheryTargets(), target, msg); - - return true; //player.getArcheryTargets() <= 0; - } else { - return true; - } - } - - } + @Override + public Plugin newInstance(Object arg) throws Throwable { + SceneryDefinition.forId(2514).getHandlers().put("option:open", this); + SceneryDefinition.forId(2511).getHandlers().put("option:climb-up", this); + SceneryDefinition.forId(2512).getHandlers().put("option:climb-down", this); + SceneryDefinition.forId(2513).getHandlers().put("option:fire-at", this); + new RangingGuildDoorman().init(); + new GuardDialogue().init(); + new LeatherWorkerDialogue().init(); + new ArmourSalesman().init(); + new TribalWeaponSalesman().init(); + new BowArrowSalesman().init(); + new WarningInterface().newInstance(arg); + new CompetitionJudge().init(); + ClassScanner.definePlugin(new TowerArcher()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof Scenery ? ((Scenery) node).getId() : 0; + switch (option) { + case "fire-at": + if (player.getArcheryTargets() <= 0) { + player.getDialogueInterpreter().sendDialogues(693, null, "Sorry, you may only use the targets for the", "competition, not for practicing."); + return true; + } + if (!player.getEquipment().containsItem(new Item(882)) + || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null + || (!player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("shortbow") + && !player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("longbow"))) { + player.sendMessage("You must have bronze arrows and a bow equipped."); + return true; + } + player.getPulseManager().run(new ArcheryCompetitionPulse(player, (Scenery) node)); + break; + case "open": + switch (id) { + case 2514: + if (player.getLocation().getY() >= 3438) { + if (player.getSkills().getStaticLevel(Skills.RANGE) < 40) { + player.getDialogueInterpreter().sendDialogue("You need a Ranging level of 40 to enter here."); + return true; + } + } + DoorActionHandler.handleAutowalkDoor(player, (Scenery) node, player.getLocation().getY() >= 3438 ? Location.create(2659, 3437, 0) : Location.create(2657, 3439, 0)); + break; + } + break; + case "climb-up": + switch (id) { + case 2511: + player.setAttribute("ladder", node); + player.getInterfaceManager().open(new Component(564)); + break; + } + break; + case "climb-down": + switch (id) { + case 2512: + ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 0)); + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof Scenery) { + if (((Scenery) n).getDefinition().hasAction("open")) { + if (((Scenery) n).getId() == 2514) { + if (node.getLocation().getY() >= 3438) { + return Location.create(2657, 3439, 0); + } else { + return Location.create(2659, 3437, 0); + } + } + return DoorActionHandler.getDestination((Player) node, (Scenery) n); + } + if (((Scenery) n).getId() == 2513) + return Location.create(2673, 3420, 0); + } + return null; + } + + /** + * Represents the dialogue used for the ranging guild door man. + * + * @author 'Vexia + * @version 1.0 + */ + public class RangingGuildDoorman extends DialoguePlugin { + + /** + * Constructs a new {@code RangingGuildDoorman} {@code Object}. + */ + public RangingGuildDoorman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RangingGuildDoorman} {@code Object}. + * + * @param player the player. + */ + public RangingGuildDoorman(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RangingGuildDoorman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings. If you are an experienced archer, you may", "want to visit the guild here..."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{679}; + } + } + + /** + * Represents the tribal weapon salseman dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class TribalWeaponSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code TribalWeaponSalesman} {@code Object}. + */ + public TribalWeaponSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TribalWeaponSalesman} {@code Object}. + * + * @param player the player. + */ + public TribalWeaponSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TribalWeaponSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings, traveller. Are you interested in any throwing", "weapons?"); + stage = 1; + break; + case 1: + options("Yes I am.", "Not really."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Yes I am."); + stage = 10; + break; + case 2: + player("Not really."); + stage = 20; + break; + } + break; + case 10: + npc("That is a good thing."); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + npc("No bother to me."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{692}; + } + + } + + /** + * Represents the guard dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class GuardDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GuardDialogue} {@code Object}. + */ + public GuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GuardDialogue} {@code Object}. + * + * @param player the player. + */ + public GuardDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings, traveller. Enjoy the time at the Ranging", "Guild."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{678}; + } + + } + + /** + * Represents the leather workers dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class LeatherWorkerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. + */ + public LeatherWorkerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. + * + * @param player the player. + */ + public LeatherWorkerDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeatherWorkerDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Can I help you?"); + stage = 1; + break; + case 1: + options("What do you do here?", "No thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("No thanks."); + stage = 20; + break; + } + break; + case 10: + npc("Well, I can cure plain cowhides into pieces of leather", "ready for crafting."); + stage = 11; + break; + case 11: + npc("I work with ordinary, hard or dragonhide leather and", "also snakeskin."); + stage = 12; + break; + case 12: + end(); + TanningProduct.open(player, 680); + break; + case 20: + npc("Suit yourself."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{680}; + } + + } + + /** + * Represents the armour salesman dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class ArmourSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code ArmourSalesman} {@code Object}. + */ + public ArmourSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ArmourSalesman} {@code Object}. + * + * @param player the player. + */ + public ArmourSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ArmourSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Good day to you."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("And to you. Can I help you?"); + stage = 1; + break; + case 1: + if (Skillcape.isMaster(player, Skills.RANGE)) { + options("What do you do here?", "I'd like to see what you sell.", "Can I buy a Skillcape of Range?", "I've seen enough, thanks."); + stage = 100; + } else { + options("What do you do here?", "I'd like to see what you sell.", "I've seen enough, thanks."); + stage = 2; + } + break; + case 2: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("I'd like to see what you sell."); + stage = 20; + break; + case 3: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 10: + npc("I am a supplier of leather armours and accessories. Ask", "and I will tell you what I know."); + stage = 11; + break; + case 11: + options("Tell me about your armours.", "Tell me about your accessories.", "I've seen enough, thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Tell me about your armours."); + stage = 13; + break; + case 2: + player("Tell me about your accessories."); + stage = 15; + break; + case 3: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 13: + npc("I have normal, studded and hard types."); + stage = 14; + break; + case 14: + case 31: + case 105: + end(); + break; + case 15: + npc("Ah yes we have a new range of accessories in stock.", "Essential items for an archer like you."); + stage = 14; + break; + case 20: + npc("Indeed, cast your eyes on my wares, adventurer."); + stage = 21; + break; + case 21: + end(); + npc.openShop(player); + break; + case 30: + npc("Very good, adventurer."); + stage = 31; + break; + case 100: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("I'd like to see what you sell."); + stage = 20; + break; + case 3: + player("Can I buy a Skillcape of Range?"); + stage = 101; + break; + case 4: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 101: + npc("Certainly! Right when you give me 99000 coins."); + stage = 102; + break; + case 102: + options("Okay, here you go.", "No, thanks."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 104; + break; + case 2: + end(); + break; + } + break; + case 104: + if (Skillcape.purchase(player, Skills.RANGE)) { + npc("There you go! Enjoy."); + } + stage = 105; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{682}; + } + + } + + /** + * Represents the dialogue plugin used for the bow and arrow salesman. + * + * @author 'Vexia + * @version 1.0 + */ + public final class BowArrowSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code BowArrowSalesman} {@code Object}. + */ + public BowArrowSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BowArrowSalesman} {@code Object}. + * + * @param player the player. + */ + public BowArrowSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BowArrowSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("A fair day, traveller. Would you like to see my wares?"); + stage = 1; + break; + case 1: + options("Yes please.", "No thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{683}; + } + + } + + /** + * Represents the waring interface used in the guild. + * + * @author 'Vexia + * @version 1.0 + */ + public final class WarningInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(564).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 17: + ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 2)); + player.getInterfaceManager().close(); + List npcs = RegionManager.getLocalNPCs(Location.create(2668, 3427, 2)); + String dir = ""; + for (NPC n : npcs) { + if (n.getId() >= 684 && n.getId() <= 687) { + switch (n.getId()) { + case 684: + dir = "north"; + break; + case 685: + dir = "east"; + break; + case 686: + dir = "south"; + break; + case 687: + dir = "west"; + break; + } + n.sendChat("The " + dir + " tower is occupied, get them!"); + } + } + break; + case 18: + player.getInterfaceManager().close(); + break; + } + return true; + } + + } + + /** + * Represents the competition judge. + * + * @author afaroutdude + */ + public final class CompetitionJudge extends DialoguePlugin { + + /** + * Constructs a new {@code CompetitionJudge} {@code Object}. + * + * @param player the player. + */ + public CompetitionJudge(final Player player) { + super(player); + } + + /** + * Constructs a new {@code CompetitionJudge} {@code Object}. + */ + public CompetitionJudge() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CompetitionJudge(player); + } + + @Override + public boolean open(Object... args) { + if (player.getInventory().getAmount(1464) >= 1000 + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 7)) { + npc("Wow! I see that you've got yourself a whole load of ", "archery tickets. Well done!"); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 7); + stage = -1; + } else if (player.getArcheryTargets() > 0) { + npc("Hello again, do you need reminding of the rules?"); + stage = 20; + } else if (player.getArcheryTotal() == 0) { + npc("Hello there, would you like to take part in the", + "archery competition? It only costs 200 coins to", + "enter."); + stage = 0; + } else { + int reward = player.getArcheryTotal() / 10; + npc("Well done. Your score is: " + player.getArcheryTotal() + ".", + "For that score you will receive " + reward + " Archery tickets."); + player.setArcheryTargets(-1); + player.setArcheryTotal(0); + if (!player.getInventory().add(new Item(1464, reward))) { + player.getBank().add(new Item(1464, reward)); + player.sendMessage("Your reward was sent to your bank."); + } + stage = 999; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case -1: + if (player.getArcheryTargets() > 0) { + npc("Hello again, do you need reminding of the rules?"); + stage = 20; + } else if (player.getArcheryTotal() == 0) { + npc("Hello there, would you like to take part in the", + "archery competition? It only costs 200 coins to", + "enter."); + stage = 0; + } else { + int reward = player.getArcheryTotal() / 10; + npc("Well done. Your score is: " + player.getArcheryTotal() + ".", + "For that score you will receive " + reward + " Archery tickets."); + if (!player.getInventory().add(new Item(1464, reward))) { + player.getBank().add(new Item(1464, reward)); + player.sendMessage("Your reward was sent to your bank."); + } + stage = 999; + } + break; + case 0: + options("Sure, I'll give it a go.", "What are the rules?", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Sure, I'll give it a go."); + stage = 2; + break; + case 2: + player("What are the rules?"); + stage = 5; + break; + case 3: + player("No thanks."); + stage = 999; + break; + } + break; + case 2: + npc("Great! That will be 200 coins then please."); + stage++; + break; + case 3: + if (player.getInventory().getAmount(995) < 200) { + player("Oops, I don't have enough coins on me..."); + stage++; + } else { + end(); + player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); + player.getInventory().remove(new Item(995, 200)); + player.getInventory().add(new Item(882, 10)); + player.setArcheryTargets(10); + player.setArcheryTotal(0); + } + break; + case 4: + npc("Never mind, come back when you've got enough."); + stage = 999; + break; + case 5: + case 22: + npc("The rules are very simple:"); + stage++; + break; + case 6: + case 23: + npc("You're given 10 shots at the targets, for each hit", "you will receive points. At the end you'll be", "rewarded 1 ticket for every 10 points."); + stage++; + break; + case 7: + npc("The tickets can be exchanged for goods from our stores.", "Do you want to give it a go? Only 200 coins."); + stage++; + break; + case 8: + options("Sure, I'll give it a go.", "No thanks."); + stage++; + break; + case 9: + switch (buttonId) { + case 1: + player("Sure, I'll give it a go."); + stage = 2; + break; + case 3: + player("No thanks."); + stage = 999; + break; + } + break; + case 20: + int arrows = player.getInventory().getAmount(Items.BRONZE_ARROW_882) + + player.getEquipment().getAmount(Items.BRONZE_ARROW_882); + if (arrows < 1) { + player("Well, I actually don't have any more arrows. Could I", "get some more?"); + stage = 25; + } else { + options("Yes please.", "No thanks, I've got it.", "How am I doing so far?"); + stage++; + } + break; + case 21: + switch (buttonId) { + case 1: + player("Yes please."); + stage++; + break; + case 2: + player("No thanks, I've got it."); + stage = 30; + break; + case 3: + player("How am I doing so far?"); + stage = 40; + break; + } + break; + case 24: + npc("The tickets can be exchanged for goods from our stores.", "Good Luck!"); + stage = 999; + break; + case 25: + npc("Ok, but it'll cost you 100 coins."); + stage++; + break; + case 26: + options("Sure, I'll take some.", "No thanks."); + stage++; + break; + case 27: + switch (buttonId) { + case 1: + player("Sure, I'll take some."); + stage++; + break; + case 2: + player("No thanks."); + stage = 999; + break; + } + break; + case 28: + if (player.getInventory().getAmount(995) < 100) { + player("Oops, I don't have enough coins on me..."); + stage++; + } else { + end(); + player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); + player.getInventory().remove(new Item(995, 100)); + player.getInventory().add(new Item(882, 10)); + } + break; + case 30: + npc("Glad to hear it, good luck!"); + stage = 999; + break; + case 40: + String msg; + if (player.getArcheryTotal() <= 0) { + msg = "You haven't started yet."; + } else if (player.getArcheryTotal() <= 80) { + msg = "Not bad, keep going."; + } else { + msg = "You're pretty good, keep it up."; + } + npc("So far your score is: " + player.getArcheryTotal(), msg); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{693}; + } + + } + + /** + * Represents the tower advisors. + * + * @author afaroutdude + */ + public final class TowerAdvisor extends DialoguePlugin { + + /** + * Constructs a new {@code TowerAdvisor} {@code Object}. + * + * @param player the player. + */ + public TowerAdvisor(final Player player) { + super(player); + } + + /** + * Constructs a new {@code TowerAdvisor} {@code Object}. + */ + public TowerAdvisor() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TowerAdvisor(player); + } + + @Override + public boolean open(Object... args) { + player("Hello there, what do you do here?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + case 0: + npc("Hi. We are in charge of this practice area."); + stage++; + break; + case 1: + player("This is a practice area?"); + break; + case 2: + npc("Surrounding us are four towers. Each tower contains", + "trained archers of a different level. You'll notice", + "it's quite a distance, so you'll need a longbow."); + stage++; + break; + case 3: + int rangeLevel = player.getSkills().getLevel(Skills.RANGE); + if (rangeLevel < 50) { // north + npc("As you're not very skilled, I advise you to practice", + "on the north tower. That'll provide the best", + "challenge for you."); + } else if (rangeLevel < 60) { // east + npc("You appear to be somewhat skilled with a bow, so I", + "advise you to practice on the south tower. That'll", + "provide the best challenge for you."); + } else if (rangeLevel < 70) { // south + npc("You appear to be fairly skilled with a bow, so I", + "advise you to practice on the south tower. That'll", + "provide the best challenge for you."); + } else { // west + npc("Looks like you're very skilled, so I advise you to", + "practice on the west tower. That'll provide the best", + "challenge for you."); + } + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{684, 685, 686, 687}; + } + + } + + + /** + * Represents all the tower archers + * + * @author afaroutdude + */ + public final class TowerArcher extends AbstractNPC { + + public TowerArcher() { + super(-1, null); + } + public TowerArcher(int id, Location location) { + super(id, location); + } + + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TowerArcher(id, location); + } + + @Override + public int[] getIds() { + return new int[]{688, 689, 690, 691}; + } + } + + /** + * Represents the archery target pulse. + * + * @author Jamix77 + */ + public static final class ArcheryCompetitionPulse extends Pulse { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the scenery. + */ + private final Scenery object; + + /** + * Constructs a new {@code ArcheryCompetitionPulse} {@code Object}. + * + * @param player the player. + * @param object the object. + */ + public ArcheryCompetitionPulse(final Player player, final Scenery object) { + super(1, player, object); + this.player = player; + this.object = object; + } + + private void showInterface(int points, int arrowsLeft, int target, String msg) { + player.getInterfaceManager().openComponent(325); + setVarp(player, 156, 11 - arrowsLeft); + setVarp(player, 157, points); + setVarp(player, 158, target); + player.getPacketDispatch().sendString(msg, 325, 32); + } + + @Override + public boolean pulse() { + if (player.getArcheryTargets() <= 0) { + return true; + } + if (getDelay() == 1) { + setDelay(player.getProperties().getAttackSpeed()); + } + if (player.getEquipment().remove(new Item(Items.BRONZE_ARROW_882, 1))) { + Projectile p = Ammunition.get(Items.BRONZE_ARROW_882).getProjectile().transform(player, object.getLocation()); + p.setEndLocation(object.getLocation()); + p.setEndHeight(25); + p.send(); + player.animate(new Animation(426)); + player.lock(getDelay()); + + int level = player.getSkills().getLevel(Skills.RANGE); + int bonus = player.getProperties().getBonuses()[14]; + double prayer = 1.0; + prayer += player.getPrayer().getSkillBonus(Skills.RANGE); + double cumulativeStr = Math.floor(level * prayer); + /*if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_RANGE_ACCURATE) { + cumulativeStr += 3; + } else if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_LONG_RANGE) { + cumulativeStr += 1; + }*/ + cumulativeStr *= 1.0; + int hit = (int) ((14 + cumulativeStr + (bonus / 8) + ((cumulativeStr * bonus) * 0.016865))) / 10 + 1; + hit = hit + RandomFunction.randomSign(RandomFunction.random(3)); + + int target = Math.max(0, 13 - hit); + int points = 0; + String msg = ""; + switch (target) { + case 0: + points = 100; + msg = "Bulls-Eye!"; + break; + case 1: + points = 50; + msg = "Hit Yellow!"; + break; + case 2: + case 3: + case 4: + points = 30; + msg = "Hit Red!"; + break; + case 5: + case 6: + case 7: + case 8: + points = 20; + msg = "Hit Blue!"; + break; + case 9: + case 10: + points = 10; + msg = "Hit Black!"; + break; + case 11: + case 12: + case 13: + points = 0; + msg = "Missed!"; + break; + } + int xp = points / 2; + + player.getSkills().addExperience(Skills.RANGE, xp, true); + player.setArcheryTotal(player.getArcheryTotal() + points); + player.setArcheryTargets(player.getArcheryTargets() - 1); + player.debug("Hit: " + hit); + player.debug("You have " + player.getArcheryTargets() + " targets left."); + player.debug("You have " + player.getArcheryTotal() + " score."); + + showInterface(player.getArcheryTotal(), player.getArcheryTargets(), target, msg); + + return true; //player.getArcheryTargets() <= 0; + } else { + return true; + } + } + + } } diff --git a/Server/src/main/core/game/bots/PvMBots.java b/Server/src/main/core/game/bots/PvMBots.java index 8aeef372c..9962d5461 100644 --- a/Server/src/main/core/game/bots/PvMBots.java +++ b/Server/src/main/core/game/bots/PvMBots.java @@ -17,131 +17,131 @@ import core.tools.RandomFunction; public class PvMBots extends AIPlayer { - //Used so the bot doesn't spam actions - private int tick = 0; + //Used so the bot doesn't spam actions + private int tick = 0; - public PvMBots(Location l) { - super(l); - } + public PvMBots(Location l) { + super(l); + } - public PvMBots(String copyFromFile, Location l) { - super(copyFromFile, l); - } + public PvMBots(String copyFromFile, Location l) { + super(copyFromFile, l); + } - public List FindTargets(Entity entity, int radius) { - List targets = new ArrayList<>(20); - Object[] localNPCs = RegionManager.getLocalNPCs(entity.getLocation(), radius).toArray(); - int length = localNPCs.length; - if(length > 5){length = 5;} - for (int i = 0; i < length; i++) { - NPC npc = (NPC) localNPCs[i]; - { - if (checkValidTargets(npc)) - targets.add(npc); - } - } - if (targets.size() == 0) - return null; - return targets; - } + public List FindTargets(Entity entity, int radius) { + List targets = new ArrayList<>(20); + Object[] localNPCs = RegionManager.getLocalNPCs(entity.getLocation(), radius).toArray(); + int length = localNPCs.length; + if(length > 5){length = 5;} + for (int i = 0; i < length; i++) { + NPC npc = (NPC) localNPCs[i]; + { + if (checkValidTargets(npc)) + targets.add(npc); + } + } + if (targets.size() == 0) + return null; + return targets; + } - public boolean checkValidTargets(NPC target) { - if (!target.isActive()) { - return false; - } - if (!target.getProperties().isMultiZone() && target.inCombat()) { - return false; - } - if (!target.getDefinition().hasAction("attack")) { - return false; - } - return true; - } + public boolean checkValidTargets(NPC target) { + if (!target.isActive()) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (!target.getDefinition().hasAction("attack")) { + return false; + } + return true; + } - public boolean AttackNpcsInRadius(int radius) - { - return AttackNpcsInRadius(this, radius); - } + public boolean AttackNpcsInRadius(int radius) + { + return AttackNpcsInRadius(this, radius); + } - /** - * Attacks NPCs in radius of bot - * @param bot - * @param radius - * @return true if bot will be fighting - */ - public boolean AttackNpcsInRadius(Player bot, int radius) { - if (bot.inCombat()) - return true; - List creatures = FindTargets(bot, radius); - if (creatures == null) { - return false; - } - bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); - if (!creatures.isEmpty()) { - return true; - } else { - creatures = FindTargets(bot, radius); - if (!creatures.isEmpty()) - { - bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); - return true; - } - return false; - } - } + /** + * Attacks NPCs in radius of bot + * @param bot + * @param radius + * @return true if bot will be fighting + */ + public boolean AttackNpcsInRadius(Player bot, int radius) { + if (bot.inCombat()) + return true; + List creatures = FindTargets(bot, radius); + if (creatures == null) { + return false; + } + bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); + if (!creatures.isEmpty()) { + return true; + } else { + creatures = FindTargets(bot, radius); + if (!creatures.isEmpty()) + { + bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); + return true; + } + return false; + } + } - @Override - public void tick() { - super.tick(); + @Override + public void tick() { + super.tick(); - this.tick++; + this.tick++; - //Despawn - if (this.getSkills().getLifepoints() <= 5){ - //TODO: Just respawn a new bot (not sure how you'd do that :L) - // Maybe make all PvMBots know what to do if they aren't in right area? I.e. pest control bots teleport to PC - //this.teleport(new Location(500, 500)); - //Despawning not being delayed causes 3 errors in the console - this.getSkills().setLifepoints(20); - } + //Despawn + if (this.getSkills().getLifepoints() <= 5){ + //TODO: Just respawn a new bot (not sure how you'd do that :L) + // Maybe make all PvMBots know what to do if they aren't in right area? I.e. pest control bots teleport to PC + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + this.getSkills().setLifepoints(20); + } - //Npc Combat - /*if (this.tick % 10 == 0) { - if (!this.inCombat()) - AttackNpcsInRadius(this, 5); - }*/ + //Npc Combat + /*if (this.tick % 10 == 0) { + if (!this.inCombat()) + AttackNpcsInRadius(this, 5); + }*/ - if (this.tick == 100) this.tick = 0; + if (this.tick == 100) this.tick = 0; - //this.eat(); - //this.getPrayer().toggle() - } + //this.eat(); + //this.getPrayer().toggle() + } - public void CheckPrayer(PrayerType type[]) { - for (int i = 0; i < type.length; i++) - this.getPrayer().toggle(type[i]); - } + public void CheckPrayer(PrayerType type[]) { + for (int i = 0; i < type.length; i++) + this.getPrayer().toggle(type[i]); + } - public void eat(int foodId) { - Item foodItem = new Item(foodId); + public void eat(int foodId) { + Item foodItem = new Item(foodId); - if ((this.getSkills().getStaticLevel(Skills.HITPOINTS) >= this.getSkills().getLifepoints() * 3) && this.getInventory().containsItem(foodItem)) { - this.lock(3); - //this.animate(new Animation(829)); - Item food = this.getInventory().getItem(foodItem); + if ((this.getSkills().getStaticLevel(Skills.HITPOINTS) >= this.getSkills().getLifepoints() * 3) && this.getInventory().containsItem(foodItem)) { + this.lock(3); + //this.animate(new Animation(829)); + Item food = this.getInventory().getItem(foodItem); - Consumable consumable = Consumables.getConsumableById(food.getId()).getConsumable(); + Consumable consumable = Consumables.getConsumableById(food.getId()).getConsumable(); - if (consumable == null) { - return; - } + if (consumable == null) { + return; + } - consumable.consume(food, this); - this.getProperties().getCombatPulse().delayNextAttack(3); - } - if (this.checkVictimIsPlayer() == false) - if (!(this.getInventory().contains(foodId, 1))) - this.getInventory().add(new Item(foodId, 5)); //Add Food to Inventory - } + consumable.consume(food, this); + this.getProperties().getCombatPulse().delayNextAttack(3); + } + if (this.checkVictimIsPlayer() == false) + if (!(this.getInventory().contains(foodId, 1))) + this.getInventory().add(new Item(foodId, 5)); //Add Food to Inventory + } } diff --git a/Server/src/main/core/game/interaction/MovementPulse.java b/Server/src/main/core/game/interaction/MovementPulse.java index b9acb88fd..9d7688306 100644 --- a/Server/src/main/core/game/interaction/MovementPulse.java +++ b/Server/src/main/core/game/interaction/MovementPulse.java @@ -202,145 +202,145 @@ public abstract class MovementPulse extends Pulse { mover.scripts.removeNormalScripts(); } - @Override - public boolean update() { - if (!mover.getLocation().getRegion().isActive()) - return false; + @Override + public boolean update() { + if (!mover.getLocation().getRegion().isActive()) + return false; - if (!isRunning()) return true; + if (!isRunning()) return true; - if (!validate()) { - stop(); - return true; - } + if (!validate()) { + stop(); + return true; + } - clearInferiorScripts(); + clearInferiorScripts(); - mover.face(null); - if (canInteractWithoutMoving()) { - if (interactImmediately()) { - stop(); - return true; - } - } - updatePath(); + mover.face(null); + if (canInteractWithoutMoving()) { + if (interactImmediately()) { + stop(); + return true; + } + } + updatePath(); - if (tryInteract()) { - stop(); - return true; - } + if (tryInteract()) { + stop(); + return true; + } - return false; - } + return false; + } - private boolean tryInteract() { - Location ml = mover.getLocation(); - if (ml == null) { - return false; - } - // Allow being within 1 square of moving entities to interact with them. - int radius = destination instanceof Entity && ((Entity) destination).getWalkingQueue().hasPath() ? 1 : 0; - if (interactLocation == null) - return false; - boolean atInteractLocation = Math.max(Math.abs(ml.getX() - interactLocation.getX()), Math.abs(ml.getY() - interactLocation.getY())) <= radius; - // Check if already in a valid interaction position for entity destinations - boolean canInteractFromCurrentPosition = false; - if (!atInteractLocation && destination instanceof Entity) { - Entity target = (Entity) destination; - Location dl = target.getLocation(); - if (dl == null) { - return false; - } - boolean onSameTile = ml.getX() == dl.getX() && ml.getY() == dl.getY() && ml.getZ() == dl.getZ(); - if (!onSameTile) { - canInteractFromCurrentPosition = Pathfinder.canInteract( - ml.getX(), ml.getY(), mover.size(), - dl.getX(), dl.getY(), target.size(), target.size(), - 0, // walkFlag - "can interact from any unblocked direction" - ml.getZ(), - RegionManager::getClippingFlag); - } - } - if (atInteractLocation || canInteractFromCurrentPosition) { - try { - if (near || pulse()) { - if (mover instanceof Player) { - if (near) { - ((Player) mover).getPacketDispatch().sendMessage("I can't reach that."); - } - PacketRepository.send(ClearMinimapFlag.class, new PlayerContext((Player) mover)); - } - stop(); - return true; - } - } catch (Exception e) { - e.printStackTrace(); - stop(); - } - } - return false; - } + private boolean tryInteract() { + Location ml = mover.getLocation(); + if (ml == null) { + return false; + } + // Allow being within 1 square of moving entities to interact with them. + int radius = destination instanceof Entity && ((Entity) destination).getWalkingQueue().hasPath() ? 1 : 0; + if (interactLocation == null) + return false; + boolean atInteractLocation = Math.max(Math.abs(ml.getX() - interactLocation.getX()), Math.abs(ml.getY() - interactLocation.getY())) <= radius; + // Check if already in a valid interaction position for entity destinations + boolean canInteractFromCurrentPosition = false; + if (!atInteractLocation && destination instanceof Entity) { + Entity target = (Entity) destination; + Location dl = target.getLocation(); + if (dl == null) { + return false; + } + boolean onSameTile = ml.getX() == dl.getX() && ml.getY() == dl.getY() && ml.getZ() == dl.getZ(); + if (!onSameTile) { + canInteractFromCurrentPosition = Pathfinder.canInteract( + ml.getX(), ml.getY(), mover.size(), + dl.getX(), dl.getY(), target.size(), target.size(), + 0, // walkFlag - "can interact from any unblocked direction" + ml.getZ(), + RegionManager::getClippingFlag); + } + } + if (atInteractLocation || canInteractFromCurrentPosition) { + try { + if (near || pulse()) { + if (mover instanceof Player) { + if (near) { + ((Player) mover).getPacketDispatch().sendMessage("I can't reach that."); + } + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext((Player) mover)); + } + stop(); + return true; + } + } catch (Exception e) { + e.printStackTrace(); + stop(); + } + } + return false; + } - /** - * Checks if the mover can interact with an entity destination from their - * current position without needing to move. - * - * @return true if the mover can interact without moving - */ - private boolean canInteractWithoutMoving() { - if (!(destination instanceof Entity)) { - return false; - } - Entity target = (Entity) destination; - Location ml = mover.getLocation(); - Location dl = target.getLocation(); - if (ml == null || dl == null) { - return false; - } - if (ml.getX() == dl.getX() && ml.getY() == dl.getY() && ml.getZ() == dl.getZ()) { - return false; - } - if (isInsideEntity(ml)) { - return false; - } - if (target.getWalkingQueue().hasPath()) { // For moving entities, allow interaction from 1 tile away - int distance = Math.max( - Math.abs(ml.getX() - dl.getX()), - Math.abs(ml.getY() - dl.getY())); - if (distance <= target.size()) { - return true; - } - } - return Pathfinder.canInteract( - ml.getX(), ml.getY(), mover.size(), - dl.getX(), dl.getY(), target.size(), target.size(), - 0, // walkFlag - "can interact from any unblocked direction" - ml.getZ(), - RegionManager::getClippingFlag); - } + /** + * Checks if the mover can interact with an entity destination from their + * current position without needing to move. + * + * @return true if the mover can interact without moving + */ + private boolean canInteractWithoutMoving() { + if (!(destination instanceof Entity)) { + return false; + } + Entity target = (Entity) destination; + Location ml = mover.getLocation(); + Location dl = target.getLocation(); + if (ml == null || dl == null) { + return false; + } + if (ml.getX() == dl.getX() && ml.getY() == dl.getY() && ml.getZ() == dl.getZ()) { + return false; + } + if (isInsideEntity(ml)) { + return false; + } + if (target.getWalkingQueue().hasPath()) { // For moving entities, allow interaction from 1 tile away + int distance = Math.max( + Math.abs(ml.getX() - dl.getX()), + Math.abs(ml.getY() - dl.getY())); + if (distance <= target.size()) { + return true; + } + } + return Pathfinder.canInteract( + ml.getX(), ml.getY(), mover.size(), + dl.getX(), dl.getY(), target.size(), target.size(), + 0, // walkFlag - "can interact from any unblocked direction" + ml.getZ(), + RegionManager::getClippingFlag); + } - /** - * Immediately performs the interaction without pathfinding. - * Called when the player is already in a valid interaction position. - * - * @return true if interaction was successful and pulse should stop - */ - private boolean interactImmediately() { - if (destination instanceof Entity) { - mover.face((Entity) destination); - } - try { - if (pulse()) { - if (mover instanceof Player) { - PacketRepository.send(ClearMinimapFlag.class, new PlayerContext((Player) mover)); - } - return true; - } - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } + /** + * Immediately performs the interaction without pathfinding. + * Called when the player is already in a valid interaction position. + * + * @return true if interaction was successful and pulse should stop + */ + private boolean interactImmediately() { + if (destination instanceof Entity) { + mover.face((Entity) destination); + } + try { + if (pulse()) { + if (mover instanceof Player) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext((Player) mover)); + } + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } private boolean validate() { if (mover == null || destination == null || mover.getLocation().getRegion() == null || hasInactiveNode()) { @@ -466,49 +466,49 @@ public abstract class MovementPulse extends Pulse { return canMove; } - private Location checkForEntityPathInterrupt(Location loc) { - Location ml = mover.getLocation(); - Location dl = destination.getLocation(); - // Lead the target if they're walking/running, unless they're already within interaction range - if (loc != null && destination instanceof Entity) { - WalkingQueue wq = ((Entity) destination).getWalkingQueue(); - if (wq.hasPath()) { - Point[] points = wq.getQueue().toArray(new Point[0]); - if (points.length > 0) { - Point p = points[0]; - Point predictiveIntersection = null; - for (int i = 0; i < points.length; i++) { - Location closestBorder = getClosestBorderToPoint(points[i], loc.getZ()); + private Location checkForEntityPathInterrupt(Location loc) { + Location ml = mover.getLocation(); + Location dl = destination.getLocation(); + // Lead the target if they're walking/running, unless they're already within interaction range + if (loc != null && destination instanceof Entity) { + WalkingQueue wq = ((Entity) destination).getWalkingQueue(); + if (wq.hasPath()) { + Point[] points = wq.getQueue().toArray(new Point[0]); + if (points.length > 0) { + Point p = points[0]; + Point predictiveIntersection = null; + for (int i = 0; i < points.length; i++) { + Location closestBorder = getClosestBorderToPoint(points[i], loc.getZ()); - if (!RegionManager.isTeleportPermitted(closestBorder)) { // A nasty hack to discard invalid intersection points - continue; - } - int moverDist = Math.max(Math.abs(ml.getX() - closestBorder.getX()), Math.abs(ml.getY() - closestBorder.getY())); - float movementRatio = moverDist / (float) ((i + 1) / (mover.getWalkingQueue().isRunning() ? 2 : 1)); - if (predictiveIntersection == null && movementRatio <= 1.0) { //try to predict an intersection point on the path if possible - predictiveIntersection = points[i]; - break; - } - // Otherwise, we target the farthest point along target's planned movement that's within 1 tick's running, - // this ensures the player will run to catch up to the target if able. - if (moverDist <= 2) { - p = points[i]; - } - } - if (predictiveIntersection != null) - p = predictiveIntersection; + if (!RegionManager.isTeleportPermitted(closestBorder)) { // A nasty hack to discard invalid intersection points + continue; + } + int moverDist = Math.max(Math.abs(ml.getX() - closestBorder.getX()), Math.abs(ml.getY() - closestBorder.getY())); + float movementRatio = moverDist / (float) ((i + 1) / (mover.getWalkingQueue().isRunning() ? 2 : 1)); + if (predictiveIntersection == null && movementRatio <= 1.0) { //try to predict an intersection point on the path if possible + predictiveIntersection = points[i]; + break; + } + // Otherwise, we target the farthest point along target's planned movement that's within 1 tick's running, + // this ensures the player will run to catch up to the target if able. + if (moverDist <= 2) { + p = points[i]; + } + } + if (predictiveIntersection != null) + p = predictiveIntersection; - Location endLoc = getClosestBorderToPoint(p, loc.getZ()); + Location endLoc = getClosestBorderToPoint(p, loc.getZ()); - if (!RegionManager.isTeleportPermitted(endLoc)) { // Basically a prayer - return loc; - } - return endLoc; - } - } - } - return loc; - } + if (!RegionManager.isTeleportPermitted(endLoc)) { // Basically a prayer + return loc; + } + return endLoc; + } + } + } + return loc; + } private Location getClosestBorderToPoint (Point p, int plane) { Vector pathDiff = Vector.betweenLocs (destination.getLocation(), Location.create(p.getX(), p.getY(), plane)); diff --git a/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java b/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java index dc3fcb107..4a7c87c91 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java +++ b/Server/src/main/core/game/node/entity/player/info/login/LoginConfiguration.java @@ -39,271 +39,271 @@ import content.data.Quests; */ public final class LoginConfiguration { - /** - * The login plugins. - */ - private static final List> LOGIN_PLUGINS = new ArrayList<>(20); + /** + * The login plugins. + */ + private static final List> LOGIN_PLUGINS = new ArrayList<>(20); - /** - * The lobby pane component. - */ - private static final Component LOBBY_PANE = new Component(549); + /** + * The lobby pane component. + */ + private static final Component LOBBY_PANE = new Component(549); - /** - * The lobby interface component. - */ - private static final Component LOBBY_INTERFACE = new Component(378); + /** + * The lobby interface component. + */ + private static final Component LOBBY_INTERFACE = new Component(378); - /** - * The lobby message of the week models & constant to be set for auto selecting the models - */ - private static final int[] MESSAGE_MODEL = {15, 16, 17, 18, 19, 20, 21, 22, 23, 405, 447, 622, 623, 679, 715, 800}; - private static int messModel; + /** + * The lobby message of the week models & constant to be set for auto selecting the models + */ + private static final int[] MESSAGE_MODEL = {15, 16, 17, 18, 19, 20, 21, 22, 23, 405, 447, 622, 623, 679, 715, 800}; + private static int messModel; - /** - * Constructs a new {@Code LoginConfiguration} {@Code Object} - */ - public LoginConfiguration() { - /* - * empty. - */ - } + /** + * Constructs a new {@Code LoginConfiguration} {@Code Object} + */ + public LoginConfiguration() { + /* + * empty. + */ + } - /** - * Configures the lobby login. - * - * @param player The player. - */ - public static void configureLobby(Player player) { - player.updateSceneGraph(true); - if (!player.isArtificial() && player.getAttribute("tutorial:complete",false) && player.getAttribute("login_type", LoginType.NORMAL_LOGIN) != LoginType.RECONNECT_TYPE) { - sendLobbyScreen(player); - } else { - configureGameWorld(player); - } - } + /** + * Configures the lobby login. + * + * @param player The player. + */ + public static void configureLobby(Player player) { + player.updateSceneGraph(true); + if (!player.isArtificial() && player.getAttribute("tutorial:complete",false) && player.getAttribute("login_type", LoginType.NORMAL_LOGIN) != LoginType.RECONNECT_TYPE) { + sendLobbyScreen(player); + } else { + configureGameWorld(player); + } + } - /** - * Sends the lobby interface-related packets. - * - * @param player The player. - */ - public static void sendLobbyScreen(Player player) { - messModel = autoSelect(); - for(Player p : Repository.getLobbyPlayers()){ - if(p.getName().equals(player.getName())){ - p.clear(); - Repository.getLobbyPlayers().remove(p); - break; - } - } - Repository.getLobbyPlayers().add(player); - setInterfaceText(player, "Welcome to " + ServerConstants.SERVER_NAME, 378, 115); - setInterfaceText(player, getLastLogin(player), 378, 116); - setInterfaceText(player, "", 378, 37); - setInterfaceText(player, "Want to stay up to date with the latest news and updates? Join our discord by using the link on our website!", 378, 38); - setInterfaceText(player, "", 378, 39); - setInterfaceText(player, "Discord Invite", 378, 14); - setInterfaceText(player, "Discord Invite", 378, 129); - setInterfaceText(player, "You can gain more credits by reporting bugs and various other methods of contribution.", 378, 93); - setInterfaceText(player, player.getDetails().getCredits() + "", 378, 96); - setInterfaceText(player, "Credits", 378, 94); - setInterfaceText(player, "", 378, 229); - setInterfaceText(player, "Want to contribute to " + ServerConstants.SERVER_NAME + "? Visit the GitLab using the link on our website!", 378, 230); - setInterfaceText(player, "", 378, 231); - setInterfaceText(player, "Github", 378, 240); - setInterfaceText(player, GameWorld.getSettings().getMessage_string(), messModel, getMessageChild(messModel)); - player.getInterfaceManager().openWindowsPane(LOBBY_PANE); - player.getInterfaceManager().setOpened(LOBBY_INTERFACE); - PacketRepository.send(Interface.class, new InterfaceContext(player, LOBBY_PANE.getId(), 2, 378, true)); - PacketRepository.send(Interface.class, new InterfaceContext(player, LOBBY_PANE.getId(), 3, messModel, true));//UPDATE `configs` SET `value`=FLOOR(RAND()*(25-10)+10) WHERE key_="messageInterface" - player.getDetails().setLastLogin(System.currentTimeMillis()); - } + /** + * Sends the lobby interface-related packets. + * + * @param player The player. + */ + public static void sendLobbyScreen(Player player) { + messModel = autoSelect(); + for(Player p : Repository.getLobbyPlayers()){ + if(p.getName().equals(player.getName())){ + p.clear(); + Repository.getLobbyPlayers().remove(p); + break; + } + } + Repository.getLobbyPlayers().add(player); + setInterfaceText(player, "Welcome to " + ServerConstants.SERVER_NAME, 378, 115); + setInterfaceText(player, getLastLogin(player), 378, 116); + setInterfaceText(player, "", 378, 37); + setInterfaceText(player, "Want to stay up to date with the latest news and updates? Join our discord by using the link on our website!", 378, 38); + setInterfaceText(player, "", 378, 39); + setInterfaceText(player, "Discord Invite", 378, 14); + setInterfaceText(player, "Discord Invite", 378, 129); + setInterfaceText(player, "You can gain more credits by reporting bugs and various other methods of contribution.", 378, 93); + setInterfaceText(player, player.getDetails().getCredits() + "", 378, 96); + setInterfaceText(player, "Credits", 378, 94); + setInterfaceText(player, "", 378, 229); + setInterfaceText(player, "Want to contribute to " + ServerConstants.SERVER_NAME + "? Visit the GitLab using the link on our website!", 378, 230); + setInterfaceText(player, "", 378, 231); + setInterfaceText(player, "Github", 378, 240); + setInterfaceText(player, GameWorld.getSettings().getMessage_string(), messModel, getMessageChild(messModel)); + player.getInterfaceManager().openWindowsPane(LOBBY_PANE); + player.getInterfaceManager().setOpened(LOBBY_INTERFACE); + PacketRepository.send(Interface.class, new InterfaceContext(player, LOBBY_PANE.getId(), 2, 378, true)); + PacketRepository.send(Interface.class, new InterfaceContext(player, LOBBY_PANE.getId(), 3, messModel, true));//UPDATE `configs` SET `value`=FLOOR(RAND()*(25-10)+10) WHERE key_="messageInterface" + player.getDetails().setLastLogin(System.currentTimeMillis()); + } - /** - * Configures the game world. - * - * @param player The player. - */ - public static void configureGameWorld(final Player player) { - sendGameConfiguration(player); - Repository.getLobbyPlayers().remove(player); - player.setPlaying(true); - UpdateSequence.getRenderablePlayers().add(player); - RegionManager.move(player, ServerConstants.START_LOCATION, player.getLocation()); - player.getMusicPlayer().init(); - player.updateAppearance(); - player.getPlayerFlags().setUpdateSceneGraph(true); - player.getPacketDispatch().sendInterfaceConfig(226, 1, true); + /** + * Configures the game world. + * + * @param player The player. + */ + public static void configureGameWorld(final Player player) { + sendGameConfiguration(player); + Repository.getLobbyPlayers().remove(player); + player.setPlaying(true); + UpdateSequence.getRenderablePlayers().add(player); + RegionManager.move(player, ServerConstants.START_LOCATION, player.getLocation()); + player.getMusicPlayer().init(); + player.updateAppearance(); + player.getPlayerFlags().setUpdateSceneGraph(true); + player.getPacketDispatch().sendInterfaceConfig(226, 1, true); - if (player.getGlobalData().getTestStage() == 3 && !player.getEmoteManager().isUnlocked(Emotes.SAFETY_FIRST)) { - //TODO: port this to save version later. when you do, please also do this for the Explore emote, which has a similar problem (e.g. player_name.json has this). - player.getEmoteManager().unlock(Emotes.SAFETY_FIRST); - } + if (player.getGlobalData().getTestStage() == 3 && !player.getEmoteManager().isUnlocked(Emotes.SAFETY_FIRST)) { + //TODO: port this to save version later. when you do, please also do this for the Explore emote, which has a similar problem (e.g. player_name.json has this). + player.getEmoteManager().unlock(Emotes.SAFETY_FIRST); + } - for (Item item : player.getEquipment().toArray()) { - //Run equip hooks for all items equipped on login. - //We should have already been doing this. - //Frankly, I don't even want to imagine the number of bugs us *not* doing this has caused. - if (item == null) continue; - player.getEquipment().remove(item); - if (!InteractionListeners.run(item.getId(), player, item, true) || !player.getEquipment().add(item, true, false)) { - player.sendMessage(colorize("%RAs you can no longer wear " + item.getName() + ", it has been unequipped.")); - addItemOrBank(player, item.getId(), item.getAmount()); - } - } + for (Item item : player.getEquipment().toArray()) { + //Run equip hooks for all items equipped on login. + //We should have already been doing this. + //Frankly, I don't even want to imagine the number of bugs us *not* doing this has caused. + if (item == null) continue; + player.getEquipment().remove(item); + if (!InteractionListeners.run(item.getId(), player, item, true) || !player.getEquipment().add(item, true, false)) { + player.sendMessage(colorize("%RAs you can no longer wear " + item.getName() + ", it has been unequipped.")); + addItemOrBank(player, item.getId(), item.getAmount()); + } + } - SpellBookManager.SpellBook currentSpellBook = SpellBookManager.SpellBook.forInterface(player.getSpellBookManager().getSpellBook()); - if (currentSpellBook == SpellBookManager.SpellBook.ANCIENT && !hasRequirement(player, Quests.DESERT_TREASURE)) { - player.sendMessage(colorize("%RAs you can no longer use Ancient Magic, you have been set back to Modern.")); - player.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.MODERN); - } else if (currentSpellBook == SpellBookManager.SpellBook.LUNAR && !hasRequirement(player, Quests.LUNAR_DIPLOMACY)) { - player.sendMessage(colorize("%RAs you can no longer use Lunar Magic, you have been set back to Modern.")); - player.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.MODERN); - } - player.getSpellBookManager().update(player); + SpellBookManager.SpellBook currentSpellBook = SpellBookManager.SpellBook.forInterface(player.getSpellBookManager().getSpellBook()); + if (currentSpellBook == SpellBookManager.SpellBook.ANCIENT && !hasRequirement(player, Quests.DESERT_TREASURE)) { + player.sendMessage(colorize("%RAs you can no longer use Ancient Magic, you have been set back to Modern.")); + player.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.MODERN); + } else if (currentSpellBook == SpellBookManager.SpellBook.LUNAR && !hasRequirement(player, Quests.LUNAR_DIPLOMACY)) { + player.sendMessage(colorize("%RAs you can no longer use Lunar Magic, you have been set back to Modern.")); + player.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.MODERN); + } + player.getSpellBookManager().update(player); - // 1050 is checked client-side for making piety/chivalry disallowed sfx, likely due to the minigame requirement. - // Set it here unconditionally until the minigame is implemented. - if (hasRequirement(player, Quests.KINGS_RANSOM, false)) { - setVarbit(player, 3909, 8, false); - } - if(ServerConstants.RULES_AND_INFO_ENABLED) - RulesAndInfo.openFor(player); - /*if (TutorialSession.getExtension(player).getStage() != 73) { - TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), true); - }*/ - } + // 1050 is checked client-side for making piety/chivalry disallowed sfx, likely due to the minigame requirement. + // Set it here unconditionally until the minigame is implemented. + if (hasRequirement(player, Quests.KINGS_RANSOM, false)) { + setVarbit(player, 3909, 8, false); + } + if(ServerConstants.RULES_AND_INFO_ENABLED) + RulesAndInfo.openFor(player); + /*if (TutorialSession.getExtension(player).getStage() != 73) { + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), true); + }*/ + } - /** - * Sends the game configuration packets. - * - * @param player The player to send to. - */ - public static void sendGameConfiguration(final Player player) { - player.getInterfaceManager().openWindowsPane(new Component(player.getInterfaceManager().isResizable() ? 746 : 548)); - player.getInterfaceManager().openChatbox(137); - player.getInterfaceManager().openDefaultTabs(); - welcome(player); - config(player); - for (Plugin plugin : LOGIN_PLUGINS) { - try { - plugin.newInstance(player); - } catch (Throwable e) { - e.printStackTrace(); - } - } - player.getAppearance().sync(); - } + /** + * Sends the game configuration packets. + * + * @param player The player to send to. + */ + public static void sendGameConfiguration(final Player player) { + player.getInterfaceManager().openWindowsPane(new Component(player.getInterfaceManager().isResizable() ? 746 : 548)); + player.getInterfaceManager().openChatbox(137); + player.getInterfaceManager().openDefaultTabs(); + welcome(player); + config(player); + for (Plugin plugin : LOGIN_PLUGINS) { + try { + plugin.newInstance(player); + } catch (Throwable e) { + e.printStackTrace(); + } + } + player.getAppearance().sync(); + } - /** - * Method used to welcome the player. - * - * @param player the player. Fullscreen mode Object id: - */ - public static final void welcome(final Player player) { - if (player.isArtificial()) { - return; - } - player.getPacketDispatch().sendMessage("Welcome to " + ServerConstants.SERVER_NAME + "."); - if (player.getDetails().isMuted()) { - player.getPacketDispatch().sendMessage("You are muted."); - player.getPacketDispatch().sendMessage("To prevent further mutes please read the rules."); - } - } + /** + * Method used to welcome the player. + * + * @param player the player. Fullscreen mode Object id: + */ + public static final void welcome(final Player player) { + if (player.isArtificial()) { + return; + } + player.getPacketDispatch().sendMessage("Welcome to " + ServerConstants.SERVER_NAME + "."); + if (player.getDetails().isMuted()) { + player.getPacketDispatch().sendMessage("You are muted."); + player.getPacketDispatch().sendMessage("To prevent further mutes please read the rules."); + } + } - /** - * Method used to configure all possible settings for the player. - * - * @param player the player. - */ - public static final void config(final Player player) { - if(!player.isArtificial()) - log(LoginConfiguration.class, Log.INFO, "configuring player " + player.getUsername()); - player.getInventory().refresh(); - player.getEquipment().refresh(); - player.getSkills().refresh(); - player.getSkills().configure(); - player.getSettings().update(); - player.getInteraction().setDefault(); - player.getPacketDispatch().sendRunEnergy(); - player.getFamiliarManager().login(); - player.getInterfaceManager().openDefaultTabs(); - setInterfaceText(player, "Friends List - " + ServerConstants.SERVER_NAME + " " + GameWorld.getSettings().getWorldId(), 550, 3); - setInterfaceText(player, "When you have finished playing " + ServerConstants.SERVER_NAME + ", always use the button below to logout safely.", 182, 0); - player.getQuestRepository().syncronizeTab(player); - player.getInterfaceManager().close(); - player.getEmoteManager().refresh(); - player.getInterfaceManager().openInfoBars(); - if(!player.isArtificial()) - log(LoginConfiguration.class, Log.INFO, "finished configuring player " + player.getUsername()); - } + /** + * Method used to configure all possible settings for the player. + * + * @param player the player. + */ + public static final void config(final Player player) { + if(!player.isArtificial()) + log(LoginConfiguration.class, Log.INFO, "configuring player " + player.getUsername()); + player.getInventory().refresh(); + player.getEquipment().refresh(); + player.getSkills().refresh(); + player.getSkills().configure(); + player.getSettings().update(); + player.getInteraction().setDefault(); + player.getPacketDispatch().sendRunEnergy(); + player.getFamiliarManager().login(); + player.getInterfaceManager().openDefaultTabs(); + setInterfaceText(player, "Friends List - " + ServerConstants.SERVER_NAME + " " + GameWorld.getSettings().getWorldId(), 550, 3); + setInterfaceText(player, "When you have finished playing " + ServerConstants.SERVER_NAME + ", always use the button below to logout safely.", 182, 0); + player.getQuestRepository().syncronizeTab(player); + player.getInterfaceManager().close(); + player.getEmoteManager().refresh(); + player.getInterfaceManager().openInfoBars(); + if(!player.isArtificial()) + log(LoginConfiguration.class, Log.INFO, "finished configuring player " + player.getUsername()); + } - /** - * Gets the message child for the inter id. - * @notice GameSettings.kt contains the list of what these are - * @param interfaceId The interface id. - * @return The child id. - */ - public static int getMessageChild(int interfaceId) { - if (interfaceId == 622) { - return 8; - } else if (interfaceId == 16) { - return 6; - } else if (interfaceId == 20 || interfaceId == 623) { - return 5; - } else if (interfaceId == 15 || interfaceId == 18 || interfaceId == 19 || interfaceId == 21 || interfaceId == 22 || interfaceId == 447 || interfaceId == 405) { - return 4; - } else if (interfaceId == 17 || interfaceId == 23 || interfaceId == 800) { - return 3; - } else if (interfaceId == 715) { - return 2; - } else if (interfaceId == 679) { - return 1; - } - return 0; - } + /** + * Gets the message child for the inter id. + * @notice GameSettings.kt contains the list of what these are + * @param interfaceId The interface id. + * @return The child id. + */ + public static int getMessageChild(int interfaceId) { + if (interfaceId == 622) { + return 8; + } else if (interfaceId == 16) { + return 6; + } else if (interfaceId == 20 || interfaceId == 623) { + return 5; + } else if (interfaceId == 15 || interfaceId == 18 || interfaceId == 19 || interfaceId == 21 || interfaceId == 22 || interfaceId == 447 || interfaceId == 405) { + return 4; + } else if (interfaceId == 17 || interfaceId == 23 || interfaceId == 800) { + return 3; + } else if (interfaceId == 715) { + return 2; + } else if (interfaceId == 679) { + return 1; + } + return 0; + } - /** - * Sets a random interface id for the "message of the week" models - */ - private final static int autoSelect() { - boolean contains = IntStream.of(MESSAGE_MODEL).anyMatch(x -> x == GameWorld.getSettings().getMessage_model()); - return contains ? GameWorld.getSettings().getMessage_model():MESSAGE_MODEL[new Random().nextInt(MESSAGE_MODEL.length)]; - } + /** + * Sets a random interface id for the "message of the week" models + */ + private final static int autoSelect() { + boolean contains = IntStream.of(MESSAGE_MODEL).anyMatch(x -> x == GameWorld.getSettings().getMessage_model()); + return contains ? GameWorld.getSettings().getMessage_model():MESSAGE_MODEL[new Random().nextInt(MESSAGE_MODEL.length)]; + } - /** - * Gets the last login string for the lobby. - * - * @param player the player. - * @return the last login. - */ - public static String getLastLogin(Player player) { - player.getPacketDispatch().sendLastLoginInfo(); - String string = "You last logged in @timeAgo from:"; - long time = player.getDetails().getLastLogin(); - Date lastLogin = new Date(time); - Date current = new Date(); - long diff = current.getTime() - lastLogin.getTime(); - int days = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); - if (days < 1) { - string = string.replace("@timeAgo", "earlier today"); - } else if (days == 1) { - string = string.replace("@timeAgo", "yesterday"); - } else { - string = string.replace("@timeAgo", days + " days ago"); - } - return string; - } + /** + * Gets the last login string for the lobby. + * + * @param player the player. + * @return the last login. + */ + public static String getLastLogin(Player player) { + player.getPacketDispatch().sendLastLoginInfo(); + String string = "You last logged in @timeAgo from:"; + long time = player.getDetails().getLastLogin(); + Date lastLogin = new Date(time); + Date current = new Date(); + long diff = current.getTime() - lastLogin.getTime(); + int days = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); + if (days < 1) { + string = string.replace("@timeAgo", "earlier today"); + } else if (days == 1) { + string = string.replace("@timeAgo", "yesterday"); + } else { + string = string.replace("@timeAgo", days + " days ago"); + } + return string; + } - /** - * Gets the loginPlugins. - * - * @return The loginPlugins. - */ - public static List> getLoginPlugins() { - return LOGIN_PLUGINS; - } + /** + * Gets the loginPlugins. + * + * @return The loginPlugins. + */ + public static List> getLoginPlugins() { + return LOGIN_PLUGINS; + } }