Files
2009scape/Server/src/main/content/region/wilderness/handlers/ChaosTunnelZone.java
T
Player Name 978d70ad0c Fixed typo in Chaos Tunnels portal
Fixed typo in gnome glider to digsite
Fixed a few typos in the random phrases uttered by the Bork minions
Added missing Bork minion phrase
2023-11-05 08:20:04 +00:00

369 lines
10 KiB
Java

package content.region.wilderness.handlers;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import core.cache.def.impl.SceneryDefinition;
import core.game.activity.ActivityManager;
import core.game.interaction.Option;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.Entity;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.game.node.scenery.Scenery;
import org.json.simple.JSONObject;
import core.ServerStore;
import core.game.world.GameWorld;
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.game.world.map.zone.ZoneRestriction;
import core.game.world.update.flag.context.Graphics;
import core.plugin.Initializable;
import core.plugin.Plugin;
import core.plugin.ClassScanner;
import core.tools.RandomFunction;
import static core.api.ContentAPIKt.hasRequirement;
/**
* Handles the chaos tunnels.
* @author Vexia
*/
@Initializable
public final class ChaosTunnelZone extends MapZone implements Plugin<Object> {
/**
* The entrance data.
*/
private static final Object[][] ENTRANCE_DATA = new Object[][] { { 28891, new Location(3182, 5471, 0), 28782, new Location(3059, 3549, 0) },// 1
{ 28893, new Location(3248, 5489, 0), 28782, new Location(3120, 3571, 0) },// 2
{ 28892, new Location(3292, 5479, 0), 28782, new Location(3166, 3561, 0) },// 3
{ 28893, new Location(3234, 5558, 0), 28782, new Location(3107, 3640, 0) },// 4
{ 28892, new Location(3290, 5538, 0), 28782, new Location(3165, 3617, 0) },// 5
};
/**
* The mapping of portals.
*/
private static final Map<Location, Location> PORTALS = new HashMap<>();
/**
* Constructs a new {@Code ChaosTunnelZone} {@Code Object}
*/
public ChaosTunnelZone() {
super("Chaos tunnel", true, ZoneRestriction.CANNON);
}
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
ZoneBuilder.configure(this);
ClassScanner.definePlugin(new OptionHandler() {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
for (int i = 0; i < ENTRANCE_DATA.length; i++) {
SceneryDefinition.forId((int) ENTRANCE_DATA[i][0]).getHandlers().put("option:enter", this);
SceneryDefinition.forId((int) ENTRANCE_DATA[i][2]).getHandlers().put("option:climb-up", this);
}
SceneryDefinition.forId(23074).getHandlers().put("option:climb", this);
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
Object[] data = null;
switch (option) {
case "enter":
case "climb-up":
switch (node.getId()) {
case 28891:
case 28893:
case 28892:
case 28782:
if (option.equals("enter") && player.inCombat()) {
player.sendMessage("You can't enter the rift when you've recently been in combat.");
return true;
}
for (int i = 0; i < ENTRANCE_DATA.length; i++) {
if ((int) ENTRANCE_DATA[i][option.equals("enter") ? 0 : 2] == node.getId() && player.getLocation().withinDistance((Location) ENTRANCE_DATA[i][option.equals("enter") ? 3 : 1])) {
data = ENTRANCE_DATA[i];
break;
}
}
if (data == null) {
player.sendMessage("Error! Data null.");
break;
}
player.teleport((Location) data[option.equals("enter") ? 1 : 3]);
break;
}
break;
case "climb":
switch (node.getId()) {
case 23074:
player.teleport(new Location(3283, 3467, 0));
break;
}
break;
}
return true;
}
});
return this;
}
@Override
public boolean interact(Entity entity, Node target, Option option) {
if (entity instanceof Player) {
switch (target.getId()) {
case 29537:
break;
case 28779:// portal
if (target.getLocation().equals(new Location(3326, 5469, 0))) {
entity.asPlayer().sendMessage("You can't go back through this portal.");
return true;
}
teleport(entity.asPlayer(), target.asScenery());
break;
}
}
return super.interact(entity, target, option);
}
@Override
public boolean enter(Entity entity) {
if (entity instanceof NPC) {
NPC n = entity.asNpc();
if (!n.isAggressive()) {
n.setAggressive(true);
}
}
return super.enter(entity);
}
@Override
public Object fireEvent(String identifier, Object... args) {
return null;
}
@Override
public void configure() {
register(new ZoneBorders(3116, 5412, 3362, 5584));
/* top left */
addLink(3158, 5561, 3162, 5557);
addLink(3162, 5545, 3166, 5553);
addLink(3147, 5541, 3143, 5535);
addLink(3148, 5533, 3153, 5537);
addLink(3152, 5520, 3156, 5523);
addLink(3165, 5515, 3173, 5530);
addLink(3169, 5510, 3159, 5501);
addLink(3181, 5517, 3185, 5518);
addLink(3182, 5530, 3187, 5531);
addLink(3190, 5519, 3190, 5515);
addLink(3196, 5512, 3202, 5515);
addLink(3197, 5529, 3201, 5531);
addLink(3190, 5549, 3190, 5554);
addLink(3180, 5557, 3174, 5558);
addLink(3171, 5542, 3168, 5541);
/* top middle */
addLink(3206, 5553, 3204, 5546);
addLink(3226, 5553, 3230, 5547);
addLink(3214, 5533, 3211, 5533);
addLink(3208, 5527, 3211, 5523);
addLink(3238, 5507, 3232, 5501);
addLink(3241, 5529, 3243, 5526);
addLink(3261, 5536, 3268, 5534);
addLink(3252, 5543, 3249, 5546);
addLink(3262, 5552, 3266, 5552);
addLink(3256, 5561, 3253, 5561);
addLink(3297, 5536, 3299, 5533);
/* top right */
addLink(3285, 5556, 3291, 5555);
addLink(3288, 5536, 3289, 5533);
addLink(3285, 5527, 3282, 5531);
addLink(3285, 5508, 3280, 5501);
addLink(3300, 5514, 3297, 5510);
addLink(3325, 5518, 3323, 5531);
addLink(3321, 5554, 3315, 5552);
/* bottom left */
addLink(3142, 5489, 3141, 5480);
addLink(3142, 5462, 3154, 5462);
addLink(3143, 5443, 3155, 5449);
addLink(3167, 5478, 3171, 5478);
addLink(3171, 5473, 3167, 5471);
addLink(3168, 5456, 3178, 5460);
addLink(3187, 5460, 3189, 5444);
addLink(3192, 5472, 3186, 5472);
addLink(3185, 5478, 3191, 5482);
addLink(3197, 5448, 3204, 5445);
addLink(3191, 5482, 3185, 5478);
addLink(3191, 5495, 3194, 5490);
/* bottom middle */
addLink(3214, 5456, 3212, 5452);
addLink(3229, 5454, 3235, 5457);
addLink(3233, 5445, 3241, 5445);
addLink(3239, 5498, 3244, 5495);
addLink(3233, 5470, 3241, 5469);
addLink(3241, 5445, 3233, 5445);
addLink(3259, 5446, 3265, 5491);
addLink(3260, 5491, 3266, 5446);
addLink(3218, 5478, 3215, 5475);
addLink(3208, 5471, 3210, 5477);
/* bottom right */
addLink(3283, 5448, 3287, 5448);
addLink(3296, 5455, 3299, 5450);
addLink(3302, 5469, 3290, 5463);
addLink(3286, 5470, 3285, 5474);
addLink(3322, 5480, 3318, 5481);
addLink(3317, 5496, 3307, 5496);
addLink(3299, 5484, 3303, 5477);
addLink(3280, 5460, 3273, 5460);
addLink(3285, 5474, 3286, 5470);
addLink(3222, 5474, 3224, 5479);
addLink(3222, 5488, 3218, 5497);
}
/**
* Teleports a player through a portal.
* @param object the object.
* @param player the player.
*/
private void teleport(Player player, Scenery object) {
if (object.getLocation().getX() == 3142 && object.getLocation().getY() == 5545) {
if (hasRequirement(player, "What Lies Below"))
commenceBorkBattle(player);
return;
}
Location loc = getLocation(object.getLocation());
if (loc == null) {
player.sendMessage("Error! Unhandled portal for - " + object + "!");
return;
}
if (!isFixed(player)) {
boolean stained = isStained(object);
if (!stained && RandomFunction.random(100) <= 3) {
stained = true;
setStainedTime(object);
}
if (stained) {
player.sendMessage("The portal is stained with dark magic.");
return;
}
if (RandomFunction.random(100) <= 3) {
loc = getRandomLocation();
player.sendMessage("The dark magic teleports you into a random location.");
}
}
player.teleport(loc);
player.graphics(Graphics.create(110));
}
/**
* Starts the instanced battle against Bork.
* @param player The player.
*/
private void commenceBorkBattle(Player player) {
if (ServerStore.getBoolean(getStoreFile(), player.getUsername().toLowerCase()) && GameWorld.getSettings().isHosted()) {
player.getPacketDispatch().sendMessage("The portal's magic is too weak to teleport you right now.");
return;
}
player.lock(10);
player.graphics(Graphics.create(110));
getStoreFile().put(player.getUsername().toLowerCase(), true);
ActivityManager.start(player, "Bork cutscene", false);
}
/**
* Gets a random location.
* @return the location.
*/
private Location getRandomLocation() {
return (Location) RandomFunction.getRandomElement(PORTALS.values().toArray());
}
/**
* Checks if the object is stained.
* @param object the object.
* @return {@code True} if so.
*/
private boolean isStained(Scenery object) {
return getStainedTime(object) > GameWorld.getTicks();
}
/**
* Sets stained time.
* @param object the object.
*/
private void setStainedTime(Scenery object) {
object.getAttributes().setAttribute("stained", (int) GameWorld.getTicks() + RandomFunction.random(50, 150));
}
/**
* Gets the stained tiem.
* @param object the object.
* @return the time.
*/
private int getStainedTime(Scenery object) {
return object.getAttributes().getAttribute("stained", 0);
}
/**
* Checks if the portals are fixed.
* @param player the player.
* @return {@code True} if so.
*/
private boolean isFixed(Player player) {
return false;
}
/**
* Gets a location from the portal.
* @param location the location.
* @return the location.
*/
public Location getLocation(Location location) {
Location l = PORTALS.get(location);
if (l != null) {
return l;
}
for (Entry<Location, Location> entry : PORTALS.entrySet()) {
if (entry.getValue().equals(location)) {
return entry.getKey();
}
}
return null;
}
/**
* Adds a portal link.
* @param x the x.
* @param y the x.
* @param x2 the second x.
* @param y2 the second y.
*/
private void addLink(int x, int y, int x2, int y2) {
addLink(new Location(x, y, 0), new Location(x2, y2, 0));
}
/**
* Adds a portal link.
* @param location the location.
* @param loc the second location.
*/
private void addLink(Location location, Location loc) {
PORTALS.put(location, loc);
}
/**
* Returns the Server Store file for Bork being killed for the day
* @return The JSONObject containing the boolean of whether Bork has been killed
*/
private JSONObject getStoreFile() {
return ServerStore.getArchive("daily-bork-killed");
}
}