From 0d6031581ed2ded89200b3f5e4963445367449a3 Mon Sep 17 00:00:00 2001 From: downthecrop Date: Sat, 27 Nov 2021 08:08:54 +0000 Subject: [PATCH] Implement Isafdar Traps + Agility obstacle fixes --- CHANGELOG | 4 +- .../members/rovingelves/IsafdarZone.java | 82 +++++++ .../rovingelves/RovingElvesObstacles.java | 200 +++++++++++++++--- 3 files changed, 255 insertions(+), 31 deletions(-) create mode 100644 Server/src/main/java/core/game/content/quest/members/rovingelves/IsafdarZone.java diff --git a/CHANGELOG b/CHANGELOG index 577254fa7..60e1f61d5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -57,4 +57,6 @@ - Fix how the attack skill cape perk is calculated. It should now have a much more noticeable effect - Properly track leaf-bladed sword drops in ::stats command - Make broad bolts tradeable and fix their ranged strength -< ---- ABOVE Released NOVEMBER 22, 2021 https://gitlab.com/2009scape/2009scape/-/tags/Nov-22-2021 ---- > \ No newline at end of file +< ---- ABOVE Released NOVEMBER 22, 2021 https://gitlab.com/2009scape/2009scape/-/tags/Nov-22-2021 ---- > +- Animations for passing through Isafdar Dense Forest added +- Implement Wire Traps, Leaf Traps, and Stick Traps in Isafdar diff --git a/Server/src/main/java/core/game/content/quest/members/rovingelves/IsafdarZone.java b/Server/src/main/java/core/game/content/quest/members/rovingelves/IsafdarZone.java new file mode 100644 index 000000000..8923f07e2 --- /dev/null +++ b/Server/src/main/java/core/game/content/quest/members/rovingelves/IsafdarZone.java @@ -0,0 +1,82 @@ +package core.game.content.quest.members.rovingelves; + +import api.ContentAPI; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.Arrays; +import java.util.List; + +/** + * locationUpdate hook for Isafdar traps + * @authors downthecrop + */ + +@Initializable +public final class IsafdarZone extends MapZone implements Plugin { + + public IsafdarZone() { super("Isafdar", true); } + + Location LEAF_TRAP_PIT = new Location(2336,9656,0); + + private String STICK_FAIL_MSG = "You set off the trap as you pass."; + private String WIRE_FAIL_MSG = "You snag the trip wire as you step over it."; + private String LEAF_FAIL_MSG = "You fall through and onto some spikes."; + + List WIRE_TRAPS = Arrays.asList( + new Location(2215,3154,0), + new Location(2220,3153,0), + new Location(2285,3188,0) + ); + + List LEAF_TRAPS = Arrays.asList( + new Location(2274,3174,0) + ); + + List STICK_TRAPS = Arrays.asList( + new Location(2236,3181,0), + new Location(2201,3169,0), + new Location(2276,3163,0) + ); + + @Override + public void configure() { + register(new ZoneBorders(2178, 3150, 2304, 3196)); + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player) { + Player player = (Player) e; + if(LEAF_TRAPS.contains(player.getLocation())){ + ContentAPI.sendMessage(player,LEAF_FAIL_MSG); + ContentAPI.impact(player,1, ImpactHandler.HitsplatType.NORMAL); + player.teleport(LEAF_TRAP_PIT); + } else if(STICK_TRAPS.contains(player.getLocation())) { + ContentAPI.sendMessage(player,STICK_FAIL_MSG); + ContentAPI.impact(player,1, ImpactHandler.HitsplatType.NORMAL); + } else if (WIRE_TRAPS.contains(player.getLocation())){ + ContentAPI.sendMessage(player,WIRE_FAIL_MSG); + ContentAPI.impact(player,1, ImpactHandler.HitsplatType.NORMAL); + } + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java b/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java index 18a62246f..92d572443 100644 --- a/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java +++ b/Server/src/main/java/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java @@ -1,5 +1,6 @@ package core.game.content.quest.members.rovingelves; +import api.ContentAPI; import core.cache.def.impl.SceneryDefinition; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.interaction.OptionHandler; @@ -10,60 +11,199 @@ import core.game.world.map.Direction; import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; +import java.util.Arrays; +import java.util.List; /** * Handles all the agility obstacles for Roving Elves. - * @author Splinter + * @authors Splinter & downthecrop */ public final class RovingElvesObstacles extends OptionHandler { - // TODO: TRIPWIRE + //Messages + private String LEAF_SUCCESS_MSG = "You safely jump across."; + private String LEAF_LADDER_MSG = "You climb out of the pit."; + private String STICK_SUCCESS_MSG = "You manage to skillfully pass the trap."; + private String WIRE_SUCCESS_MSG = "You successfully step over the tripwire."; + + private final Animation OVER = new Animation(839); + private final Animation THROUGH = new Animation(1237); + private final Animation STICK_TRAP = new Animation(819); + private final Animation LEAF_TRAP = new Animation(1115); + private final Animation WIRE_TRAP = new Animation(1236); + + private final Location STICK_TRAP_NORTH = new Location(0,2,0); + private final Location STICK_TRAP_SOUTH = new Location(0,-1,0); + private final Location STICK_TRAP_EAST = new Location(2,0,0); + private final Location STICK_TRAP_WEST = new Location(-1,0,0); + + private final Location WIRE_TRAP_NORTH = new Location(0,2,0); + private final Location WIRE_TRAP_SOUTH = new Location(0,-1,0); + private final Location WIRE_TRAP_EAST = new Location(2,0,0); + private final Location WIRE_TRAP_WEST = new Location(-1,0,0); + + private final Location FOREST_NORTH = new Location(0,2,0); + private final Location FOREST_SOUTH = new Location(0,-1,0); + private final Location FOREST_EAST = new Location(2,0,0); + private final Location FOREST_WEST = new Location(-1,0,0); + + private final Location LEAF_TRAP_CLIMB = new Location(2274, 3172, 0); + + private final List illegalJumpsY = Arrays.asList(3174); + + private Location nodeCenter(Node node){ + if(node.asScenery().getRotation() % 2 == 0) + return node.getLocation().transform(1,0,0); + return node.getLocation().transform(0,1,0); + } @Override public Plugin newInstance(Object arg) throws Throwable { + SceneryDefinition.forId(3922).getHandlers().put("option:pass", this); SceneryDefinition.forId(3999).getHandlers().put("option:enter", this); SceneryDefinition.forId(3939).getHandlers().put("option:enter", this); + SceneryDefinition.forId(3921).getHandlers().put("option:step-over", this); SceneryDefinition.forId(3998).getHandlers().put("option:enter", this); SceneryDefinition.forId(3938).getHandlers().put("option:enter", this); SceneryDefinition.forId(3937).getHandlers().put("option:enter", this); SceneryDefinition.forId(3924).getHandlers().put("option:jump", this); SceneryDefinition.forId(3925).getHandlers().put("option:jump", this); SceneryDefinition.forId(8742).getHandlers().put("option:pass", this); + SceneryDefinition.forId(3927).getHandlers().put("option:climb",this); return this; } - final Animation OVER = new Animation(840); - final Animation THROUGH = new Animation(749); - final Animation JUMP = new Animation(3067); @Override public boolean handle(final Player player, Node node, String option) { - Direction NORTH_SOUTH = player.getLocation().getY() < node.getLocation().getY() ? Direction.NORTH : Direction.SOUTH; - Direction EAST_WEST = player.getLocation().getX() > node.getLocation().getX() ? Direction.WEST : Direction.EAST; - switch (node.getId()) { - case 8742: - player.teleport(player.getLocation().transform(EAST_WEST, 2)); - break; - case 3999: - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 3), OVER, 25, 0, null); - break; - case 3939: - case 3998: - case 3938: - if (node.getLocation().equals(new Location(2235, 3148)) || node.getLocation().equals(new Location(2238, 3148)) || node.getLocation().equals(new Location(2236, 3218)) || node.getLocation().equals(new Location(2230, 3218)) || node.getLocation().equals(new Location(2227, 3218))) { - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(EAST_WEST, 3), THROUGH, 25, 0, null); - } else { - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 3), THROUGH, 25, 0, null); - } - break; - case 3937: - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(EAST_WEST, 3), OVER, 25, 0, null); - break; - case 3924: - case 3925: - AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 4), JUMP, 25, 0, null); - break; + + player.lock(5); + player.faceLocation(node.asScenery().getLocation()); + Boolean isNorthOrSouth = true; + + if (node.getId() == 3922 && node.asScenery().getRotation() % 2 == 0){ + //Facing East or West Stick Trap + isNorthOrSouth = false; + } else if (node.asScenery().getRotation() % 2 != 0) { + isNorthOrSouth = false; } + + // Direction of the NODE in relation to the player + Direction NORTH_SOUTH = player.getLocation().getY() <= node.getLocation().getY() ? Direction.NORTH : Direction.SOUTH; + Direction EAST_WEST = player.getLocation().getX() <= node.getLocation().getX() ? Direction.EAST : Direction.WEST; + + switch (node.getId()) { + case 8742: + player.teleport(player.getLocation().transform(EAST_WEST, 2)); + break; + case 3999: + AgilityHandler.forceWalk(player, -1, player.getLocation(), + player.getLocation().transform(NORTH_SOUTH, 3), OVER, 25, 0, null); + break; + //Wire Trap + case 3921: + if (isNorthOrSouth) { + if (NORTH_SOUTH == Direction.NORTH) + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(WIRE_TRAP_SOUTH), + node.getLocation().transform(WIRE_TRAP_NORTH), WIRE_TRAP, 100, 0, WIRE_SUCCESS_MSG); + else + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(WIRE_TRAP_NORTH), + node.getLocation().transform(WIRE_TRAP_SOUTH), WIRE_TRAP, 100, 0, WIRE_SUCCESS_MSG); + } else { + if (EAST_WEST == Direction.EAST) + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(WIRE_TRAP_WEST), + node.getLocation().transform(WIRE_TRAP_EAST), WIRE_TRAP, 100, 0, WIRE_SUCCESS_MSG); + else + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(WIRE_TRAP_EAST), + node.getLocation().transform(WIRE_TRAP_WEST), WIRE_TRAP, 100, 0, WIRE_SUCCESS_MSG); + } + break; + //Stick Trap + case 3922: + if (isNorthOrSouth) { + if (NORTH_SOUTH == Direction.NORTH) + AgilityHandler.forceWalk(player, -1, node.getLocation(), + node.getLocation().transform(STICK_TRAP_NORTH), STICK_TRAP, 25, 0, STICK_SUCCESS_MSG); + else + AgilityHandler.forceWalk(player, -1, node.getLocation(), + node.getLocation().transform(STICK_TRAP_SOUTH), STICK_TRAP, 25, 0, STICK_SUCCESS_MSG); + } else { + if (EAST_WEST == Direction.EAST) + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(STICK_TRAP_WEST), + node.getLocation().transform(STICK_TRAP_EAST), STICK_TRAP, 25, 0, STICK_SUCCESS_MSG); + else + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(STICK_TRAP_EAST), + node.getLocation().transform(STICK_TRAP_WEST), STICK_TRAP, 25, 0, STICK_SUCCESS_MSG); + } + break; + // Dense Forest + case 3998: + case 3939: + case 3938: + if (isNorthOrSouth) { + if (NORTH_SOUTH == Direction.NORTH) + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_SOUTH), + nodeCenter(node).transform(FOREST_NORTH), THROUGH, 25, 0, null); + else + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_NORTH), + nodeCenter(node).transform(FOREST_SOUTH), THROUGH, 25, 0, null); + } else { + if (EAST_WEST == Direction.EAST) + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_WEST), + nodeCenter(node).transform(FOREST_EAST), THROUGH, 25, 0, null); + else + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_EAST), + nodeCenter(node).transform(FOREST_WEST), THROUGH, 25, 0, null); + } + break; + // Climb Over Dense Forest + case 3937: + if (isNorthOrSouth) { + if (NORTH_SOUTH == Direction.NORTH) + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_SOUTH), + nodeCenter(node).transform(FOREST_NORTH), OVER, 25, 0, null); + else + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_NORTH), + nodeCenter(node).transform(FOREST_SOUTH), OVER, 25, 0, null); + } else { + if (EAST_WEST == Direction.EAST) + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_WEST), + nodeCenter(node).transform(FOREST_EAST), OVER, 25, 0, null); + else + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(FOREST_EAST), + nodeCenter(node).transform(FOREST_WEST), OVER, 25, 0, null); + } + break; + // Leaf Trap Center + case 3924: + if(!illegalJumpsY.contains(player.getLocation().getY())){ + if (isNorthOrSouth) { + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(NORTH_SOUTH,-1), + node.getLocation().transform(NORTH_SOUTH, 2), LEAF_TRAP, 25, 0, LEAF_SUCCESS_MSG); + } else { + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(EAST_WEST,-2), + node.getLocation().transform(EAST_WEST, 2), LEAF_TRAP, 25, 0, LEAF_SUCCESS_MSG); + } + } + break; + // Leaf Trap Edges + case 3925: + if(!illegalJumpsY.contains(node.getLocation().getY())){ + if (!isNorthOrSouth) { + AgilityHandler.forceWalk(player, -1, node.getLocation().transform(NORTH_SOUTH,-1), + node.getLocation().transform(NORTH_SOUTH, 3), LEAF_TRAP, 25, 0, LEAF_SUCCESS_MSG); + } else { + AgilityHandler.forceWalk(player, -1, nodeCenter(node).transform(EAST_WEST,-1), + node.getLocation().transform(EAST_WEST, 3), LEAF_TRAP, 25, 0, LEAF_SUCCESS_MSG); + } + } + break; + case 3927: + player.teleport(LEAF_TRAP_CLIMB); + ContentAPI.sendMessage(player,LEAF_LADDER_MSG); + break; + } + return true; }