From 162cfe3d6b2d1fdf7a484174366703f8ad95f5d9 Mon Sep 17 00:00:00 2001 From: Player Name Date: Thu, 17 Aug 2023 12:55:32 +0000 Subject: [PATCH] Obelisk improvements Made the wilderness teleport obelisks roll the destination obelisk fairly Improved obelisk teleport positioning logic Made the obelisk teleport capture a 3-by-3 bounding box of players, in accordance with the teleport animation --- .../handlers/WildernessObeliskPlugin.java | 33 ++++++++++--------- .../main/core/game/world/map/RegionManager.kt | 25 ++++++++++++++ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/Server/src/main/content/region/wilderness/handlers/WildernessObeliskPlugin.java b/Server/src/main/content/region/wilderness/handlers/WildernessObeliskPlugin.java index ee3b0641f..b063e90f1 100644 --- a/Server/src/main/content/region/wilderness/handlers/WildernessObeliskPlugin.java +++ b/Server/src/main/content/region/wilderness/handlers/WildernessObeliskPlugin.java @@ -19,8 +19,8 @@ import core.tools.RandomFunction; /** * Represents the wilderness obelisk plugin. - * @author 'Vexia - * @version 1.0 + * @author 'Vexia, small changes by Player Name + * @version 1.1 */ @Initializable public final class WildernessObeliskPlugin extends OptionHandler { @@ -90,21 +90,24 @@ public final class WildernessObeliskPlugin extends OptionHandler { } return true; } - int index = RandomFunction.random(Obelisk.values().length); - Obelisk newObelisk = Obelisk.values()[index]; - if (newObelisk == stationObelisk) { - newObelisk = Obelisk.values()[index++ % Obelisk.values().length]; - } - for (Player player : RegionManager.getLocalPlayers(center, 1)) { - player.getPacketDispatch().sendMessage("Ancient magic teleports you somewhere in the wilderness."); - int xDif = stationObelisk.getLocation().getX() - player.getLocation().getX(); - int yDif = stationObelisk.getLocation().getY() - player.getLocation().getY(); - if (xDif > 0 || yDif > 0) { - player.getTeleporter().send(Location.create(newObelisk.getLocation().getX() - xDif, newObelisk.getLocation().getY() - yDif, 0), TeleportType.OBELISK, 2); - } else { - player.getTeleporter().send(Location.create(newObelisk.getLocation().getX() + xDif, newObelisk.getLocation().getY() + yDif, 0), TeleportType.OBELISK, 2); + // Determine new obelisk + Obelisk[] newObelisks = Obelisk.values(); + for (int i = 0; i < newObelisks.length; i++) { + // Find our current obelisk and remove it from the candidate set by replacing it with the last obelisk + if (newObelisks[i] == stationObelisk) { + newObelisks[i] = newObelisks[newObelisks.length - 1]; + break; } } + int index = RandomFunction.random(0, newObelisks.length - 1); //cutting out the last one that is now duplicated + Obelisk newObelisk = newObelisks[index]; + // Teleport players standing within a 3-by-3 bounding box + for (Player player : RegionManager.getLocalPlayersBoundingBox(center, 1, 1)) { + player.getPacketDispatch().sendMessage("Ancient magic teleports you somewhere in the wilderness."); + int xOffset = player.getLocation().getX() - center.getX(); + int yOffset = player.getLocation().getY() - center.getY(); + player.getTeleporter().send(Location.create(newObelisk.getLocation().getX() + xOffset, newObelisk.getLocation().getY() + yOffset, 0), TeleportType.OBELISK, 2); + } super.setDelay(1); return false; } diff --git a/Server/src/main/core/game/world/map/RegionManager.kt b/Server/src/main/core/game/world/map/RegionManager.kt index c75fd2d6d..91ccf4f25 100644 --- a/Server/src/main/core/game/world/map/RegionManager.kt +++ b/Server/src/main/core/game/world/map/RegionManager.kt @@ -756,6 +756,31 @@ object RegionManager { return players } + /** + * Gets a list of local players within a symmetric bounding box. + * @param l The location. + * @param xdist The distance from the location on the x plane that is considered within bounds. + * @param ydist The distance from the location on the y plane that is considered within bounds. + * @return The list of players. + */ + @JvmStatic + fun getLocalPlayersBoundingBox(l: Location, xdist: Int, ydist: Int): MutableList { + val players: MutableList = LinkedList() + for (regionX in ((l.regionX - 6) shr 3)..((l.regionX + 6) shr 3)) { + for (regionY in ((l.regionY - 6) shr 3)..((l.regionY + 6) shr 3)) { + for (player in forId((regionX shl 8) or regionY).planes[l.z].players) { + if (player.location.x >= l.getX() - xdist && + player.location.x <= l.getX() + xdist && + player.location.y >= l.getY() - ydist && + player.location.y <= l.getY() + ydist) { + players.add(player) + } + } + } + } + return players + } + /** * Gets a list of local players. * @param l The location.