wildernesslocations: Add support for PvP world locations, add location names to world map (#1126)

* Locations will now work in Pvp worlds. Started mapping some of the main ones, still need to map some more

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Add the locations provided by the beast Kyle!!

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Add more locations

Signed-off-by: PKLite <stonewall@pklite.xyz>

* remove stupid extra comma

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Refactor WildernessLocation to WorldLocation and move it to the game package
also removed duplicate entry

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Adds an overlay that draws wilderness location names on the World Map

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Removes area outline because the areas need to be fixed

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Fixes outlines

Signed-off-by: PKLite <stonewall@pklite.xyz>

* merge conflicts

Signed-off-by: PKLite <stonewall@pklite.xyz>

* Sort world locs a-z, and fix whitespace
This commit is contained in:
ST0NEWALL
2019-07-27 20:08:55 -04:00
committed by Ganom
parent 75ef43cc0e
commit 4df5bdcd0a
6 changed files with 652 additions and 188 deletions

View File

@@ -0,0 +1,325 @@
/*******************************************************************************
* Copyright (c) 2019 RuneLitePlus
* Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file.
* If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors:
* ST0NEWALL#9112
* RuneLitePlus Discord: https://discord.gg/Q7wFtCe
* RuneLitePlus website: https://runelitepl.us
******************************************************************************/
package net.runelite.client.game;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.Getter;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.util.PvPUtil;
public enum WorldLocation
{
// Non-Wilderness Locations
AGILITY_PYRAMID("Agility Pyramid", new Location(3386, 2864, 3334, 2819), 0),
AL_KHARID_BANK("Al Kharid Bank", new Location(3265, 3173, 3272, 3161), 0),
AL_KHARID_GLIDER("Al Kharid_Glider", new Location(3276, 3214, 3283, 3209), 0),
AL_KHARID_PALACE("Al Kharid Palace", new Location(3281, 3177, 3304, 3158), 0),
ANDRA("Zul-Andra", new Location(2214, 3070, 2182, 3042), 0),
APE_ATOLL_TEMPLE("Ape Atoll Temple", new Location(2784, 2802, 2810, 2770), 0),
ARDY_CASTLE("Ardy Castle", new Location(2567, 3311, 2591, 3283), 0),
ARDY_DOCKS("Ardy Docks", new Location(2660, 3284, 2689, 3264), 0),
ARDY_NORTH_BANK("Ardy North Bank", new Location(2611, 3336, 2622, 3329), 0),
ARDY_SOUTH_BANK("Ardy South Bank", new Location(2645, 3288, 2659, 3279), 0),
ARDY_STALLS("Ardy Stalls", new Location(2651, 3318, 2673, 3293), 0),
ARDY_ZOO("Ardy Zoo", new Location(2598, 3288, 2640, 3261), 0),
BARB_VILLAGE("Barb Village", new Location(3071, 3448, 3092, 3405), 0),
BARROWS("Barrows", new Location(3583, 3268, 3546, 3314), 0),
BEDABIN_CAMP("Bedabin Camp", new Location(3188, 3052, 3157, 3019), 0),
CAMELOT_CASTLE("Camelot Castle", new Location(2775, 3481, 2743, 3468), 0),
CASTLE_WARS("Castle Wars", new Location(2435, 3074, 2474, 3127), 0),
CATHERBY("Catherby", new Location(2833, 3436, 2791, 3457), 0),
CATHERBY_DOCKS("Catherby Docks", new Location(2808, 3432, 2790, 3409), 0),
CATHERBY_EAST("Catherby East", new Location(2862, 3441, 2834, 3425), 0),
CATHERBY_NORTH("Catherby North", new Location(2791, 3458, 2833, 3472), 0),
CLAN_WARS("Clan Wars", new Location(3391, 3142, 3344, 3176), 0),
COOKS_GUILD("Cooks Guild", new Location(3135, 3455, 3155, 3427), 0),
COX("CoX", new Location(1226, 3574, 1270, 3559), 0),
CRAB_CLAW_ISLE("Crab Claw Isle", new Location(1795, 3449, 1745, 3399), 0),
DESERT_BANDIT_CAMP("Desert Bandit Camp", new Location(3189, 2993, 3154, 2963), 0),
DIGSITE_NORTHEAST("Digsite NorthWest", new Location(3325, 3445, 3353, 3420), 0),
DIGSITE_NORTHWEST("Digsite NorthEast", new Location(3354, 3420, 3382, 3445), 0),
DIGSITE_SOUTHEAST("Digsite SouthEast", new Location(3354, 3419, 3382, 3393), 0),
DIGSITE_SOUTHWEST("Digsite SouthWest", new Location(3353, 3419, 3325, 3393), 0),
DRYANOR_VILLAGE("Dryanor Village", new Location(3074, 3283, 3112, 3241), 0),
DUEL_ARENA_ENTRANCE("Duel Arena Entrance", new Location(3311, 3247, 3328, 3223), 0),
DUEL_ARENA_NORTH("Duel Arena North", new Location(3329, 3266, 3388, 3264), 0),
DUEL_ARENA_NW("Duel Arena North West", new Location(3328, 3266, 3322, 3248), 0),
EDGE_BANK("Edge Bank", new Location(3090, 3499, 3099, 3487), 0),
FALADOR_PARTYROOM("Falador Partyroom", new Location(3035, 3386, 3056, 3370), 0),
FALLY_BANK("Fally Bank", new Location(2943, 3372, 2949, 3358), 0),
FALLY_CENTER("Fally Center", new Location(2959, 3385, 2972, 3374), 0),
FALLY_EAST_BANK("Fally East Bank", new Location(3008, 3358, 3021, 3353), 0),
FALLY_PARK("Fally Park", new Location(2982, 3390, 3025, 3368), 0),
FALLY_RESPAWN("Fally Respawn", new Location(2957, 3355, 2998, 3325), 0),
GNOME_AGILITY("Gnome Agility", new Location(2469, 3441, 2489, 3412), 0),
GNOME_BALL("Gnome Ball", new Location(2384, 3495, 2408, 3479), 0),
GRAND_EXCHANGE_NORTHEAST("Grand Exchange NorthEast", new Location(3165, 3490, 3197, 3516), 0),
GRAND_EXCHANGE_NORTHWEST("Grand Exchange NorthWest", new Location(3164, 3490, 3139, 3516), 0),
GRAND_EXCHANGE_SOUTHEAST("Grand Exchange SouthEast", new Location(3165, 3489, 3189, 3468), 0),
GRAND_EXCHANGE_SOUTHWEST("Grand Exchange SouthWest", new Location(3164, 3489, 3139, 3467), 0),
GRAND_TREE("Grand Tree", new Location(2442, 3515, 2490, 3478), 0),
ICE_MOUNTAIN("Ice Mountain", new Location(3001, 3508, 3024, 3463), 0),
KING_LANTHAS_TRAINING_GROUND("Training Ground", new Location(2534, 3387, 2501, 3358), 0),
LUMBRIDGE_CASTLE("Lumbridge Castle", new Location(3201, 3235, 3225, 3201), 0),
LUMBY_SWAMP("Lumby Swamp", new Location(3135, 3203, 3245, 3140), 0),
LUNAR_ISLE_CENTRAL("Lunar Isle Central", new Location(2112, 3888, 2055, 3933), 0),
LUNAR_ISLE_EAST("Lunar Isle East", new Location(2185, 3921, 2113, 3888), 0),
LUNAR_ISLE_NORTH("Lunar Isle North", new Location(2112, 3934, 2063, 3958), 0),
LUNAR_ISLE_NORTH_EAST("Lunar Isle North East", new Location(2113, 3922, 2185, 3958), 0),
LUNAR_ISLE_SOUTH("Lunar Isle South", new Location(2112, 3887, 2057, 3843), 0),
LUNAR_ISLE_SOUTHEAST("Lunar Isle SouthEast", new Location(2113, 3887, 2185, 3843), 0),
MONASTERY("Monastery", new Location(3044, 3507, 3060, 3471), 0),
NARDAH_NORTH("Nardah North", new Location(3397, 2915, 3453, 2942), 0),
NARDAH_SOUTH("Nardah South", new Location(3453, 2882, 3397, 2914), 0),
NIEVE("Nieve", new Location(2430, 3425, 2435, 3419), 0),
NIGHTMARE_ZONE("Nightmare Zone", new Location(2599, 3119, 2614, 3111), 0),
NORTH_APE_ATOLL_MARIM("North Marim", new Location(2783, 2786, 2731, 2804), 0),
PEST_CONTROL("Pest Control", new Location(2682, 2627, 2630, 2679), 0),
POLLNIVNEACH_NORTH("Pollnivneach North", new Location(3379, 2974, 3331, 3004), 0),
POLLNIVNEACH_SOUTH("Pollnivneach South", new Location(3379, 2973, 3331, 2941), 0),
PORT_KHAZARD("Port Khazard", new Location(2624, 3182, 2680, 3143), 0),
PORT_SARIM("Port Sarim", new Location(3009, 3261, 3060, 3194), 0),
RELLEKA_SOUTHWEST("Relleka South West", new Location(2649, 3678, 2609, 3644), 0),
RELLEKKA_NORTHEAST("Rellekka North East", new Location(2690, 3712, 2650, 3679), 0),
RELLEKKA_NORTHWEST("Rellekka North West", new Location(2649, 3679, 2609, 3712), 0),
RELLEKKA_SOUTHEAST("Rellekka South East", new Location(2650, 3678, 2690, 3644), 0),
RIMMINGTON_PORTAL("Rimmington Portal", new Location(2946, 3228, 2960, 3218), 0),
ROCK_CRABS_EAST("Rock Crabs East", new Location(2691, 3713, 2730, 3738), 0),
ROCK_CRABS_WEST("Rock Crabs West", new Location(2690, 3738, 2650, 3713), 0),
SANDCRABS_CENTRAL("SandCrabs Central", new Location(1850, 3529, 1884, 3465), 0),
SANDCRABS_NORTH("SandCrabs North", new Location(1848, 3572, 1884, 3532), 0),
SANDCRABS_SOUTH("SandCrabs South", new Location(1849, 3468, 1796, 3436), 0),
SEERS_VILLAGE("Seers Village", new Location(2742, 3468, 2688, 3498), 0),
SHANTAY_PASS("Shantay Pass", new Location(3293, 3137, 3312, 3116), 0),
SHILO_VILLAGE_NORTH("Shilo Village North", new Location(2878, 3006, 2817, 2973), 0),
SHILO_VILLAGE_SOUTH("Shilo Village South", new Location(2879, 2972, 2816, 2944), 0),
SOUTH_APE_ATOLL_MARIM("South Marim", new Location(2783, 2785, 2731, 2762), 0),
SOUTH_OF_GRAND_EXCHANGE("South of Grand Exchange", new Location(3156, 3466, 3190, 3448), 0),
TREEGOME_VILLAGE("TreeGome Village", new Location(2514, 3175, 2547, 3158), 0),
VARROCK_CENTRE("Varrock Centre", new Location(3201, 3444, 3229, 3412), 0),
VARROCK_EAST("Varrock East", new Location(3241, 3438, 3228, 3450), 0),
VARROCK_WEST("Varrock West", new Location(3172, 3447, 3200, 3427), 0),
WATERBIRTH_ISLAND("Waterbirth Island", new Location(2562, 3774, 2494, 3710), 0),
WEST_ARDY("West Ardy", new Location(2452, 3336, 2557, 3265), 0),
WINDERTODT_SOUTH_EAST("Windertodt South East", new Location(1630, 4007, 1651, 3987), 0),
WINTERTODT_CAMP("Wintertodt Camp", new Location(1645, 3932, 1616, 3963), 0),
WINTERTODT_ENTRANCE("Wintertodt Entrance", new Location(1641, 3964, 1617, 3986), 0),
WINTERTODT_NORTHEAST("Wintertodt NorthEast", new Location(1630, 4008, 1651, 4027), 0),
WINTERTODT_NORTHWEST("Wintertodt NorthWest", new Location(1629, 4008, 1608, 4028), 0),
WINTERTODT_SOUTHWEST("Wintertodt SouthWest", new Location(1629, 4007, 1608, 3987), 0),
WIZARDS_GUILD("Wizards Guild", new Location(2585, 3092, 2596, 3082), 0),
WIZARDS_TOWER("Wizards Tower", new Location(3093, 3171, 3121, 3146), 0),
YANILE_BANK("Yanile Bank", new Location(2608, 3097, 2616, 3087), 0),
YANILLE_EAST("Yanille East", new Location(2576, 3110, 2621, 3071), 0),
YANILLE_PORTAL("Yanille Portal", new Location(2537, 3108, 2551, 3091), 0),
YANILLE_WEST("Yanille West", new Location(2575, 3110, 2532, 3071), 0),
//Wilderness Locations
AXE_HUT("Axe Hut", new Location(3187, 3962, 3194, 3957), 0),
BANDIT_CAMP("Bandit Camp", new Location(3017, 3712, 3059, 3681), 0),
CALLISTO("Callisto", new Location(3266, 3863, 3315, 3827), 0),
CEMETERY("Cemetery", new Location(2956, 3767, 2996, 3736), 0),
CHAOS_FANATIC("Chaos Fanatic", new Location(2971, 3854, 2992, 3834), 0),
CHAOS_TEMPLE("Chaos Temple", new Location(3220, 3632, 3255, 3593), 0),
CHINS("Chins", new Location(3128, 3792, 3160, 3754), 0),
CORP_CAVE("Corp Cave", new Location(3201, 3684, 3219, 3672), 0),
CRAZY_ARCHAEOLOGIST("Crazy Archaeologist", new Location(2952, 3709, 2985, 3678), 0),
DARK_WARRIOR_FORTRESS("Dark Warriors", new Location(3014, 3648, 3046, 3616), 0),
DWARVES("Dwarves", new Location(3230, 3805, 3264, 3779), 0),
EAST_DRAGONS("East Drags", new Location(3326, 3704, 3365, 3671), 0),
ENTS("Ents", new Location(3300, 3627, 3320, 3584), 0),
FIFTY_PORTS("50 ports", new Location(3301, 3923, 3315, 3909), 0),
FIRE_GIANT_ENTRANCE("Fire Giant Entrance", new Location(3042, 3929, 3051, 3920), 0),
GAP("Gap", new Location(3238, 3855, 3258, 3841), 0),
GDZ("Gdz", new Location(3279, 3895, 3296, 3875), 0),
GHORROCK("44s", new Location(2973, 3870, 2987, 3859), 0),
GLORY_HILL("Glory Hill", new Location(3331, 3890, 3348, 3866), 0),
GLORY_HOLE("Glory Hole", new Location(3352, 3897, 3386, 3869), 0),
GRAVES("Graves", new Location(3128, 3686, 3181, 3658), 0),
GRAVEYARD_DRAGS("Graveyard Drags", new Location(3129, 3717, 3172, 3691), 0),
GWD("God Wars Dungeon", new Location(3010, 3745, 3027, 3727), 0),
HIGH_ALTAR("High Altar", new Location(2945, 3826, 2970, 3813), 0),
HILL_GIANTS("Hill Giants", new Location(3282, 3687, 3300, 3674), 0),
HOB_OBELISK("35 Obelisk", new Location(3097, 3804, 3115, 3785), 0),
HOBGOBLINS("Hobgoblins", new Location(3073, 3775, 3104, 3745), 0),
ICE_GATE("Ice Gate", new Location(2945, 3913, 2978, 3878), 0),
ICE_ROCK("Ice Rock", new Location(2957, 3942, 2984, 3929), 0),
KBD_CAGE("KBD CAGE", new Location(3007, 3855, 3021, 3839), 0),
LAVA_DRAGS("Lava Drags", new Location(3175, 3857, 3221, 3805), 0),
LAVA_MAZE_TELE("Lava Maze Tele", new Location(3019, 3842, 3044, 3812), 0),
LEVER("Lever", new Location(3149, 3933, 3162, 3917), 0),
MAGE_ARENA("Mage Arena", new Location(3088, 3949, 3123, 3919), 0),
MAGE_BANK("Mage Bank", new Location(3082, 3960, 3103, 3952), 0),
NEW_GATE("New Gate", new Location(3345, 3957, 3390, 3916), 0),
NINETEEN_OBELISK("19s", new Location(3220, 3672, 3234, 3660), 0),
OLD_GATE("Old Gate", new Location(3211, 3906, 3238, 3882), 0),
PIRATE_HUT("Pirate Hut", new Location(3037, 3959, 3045, 3948), 0),
RESOURCE_ARENA("Resource Arena", new Location(3174, 3946, 3195, 3923), 0),
REV_BLACK_DRAGS("Rev Black Drags", new Location(3223, 10216, 3254, 10190), 0),
REV_CAVE_OTHER("Rev Cave", new Location(3128, 10232, 3225, 10059), 0),
REV_DARK_BEAST("Rev Dark Beast", new Location(3243, 10154, 3264, 10136), 0),
REV_ENTRANCE("Rev Entrance", new Location(3118, 3837, 3142, 3818), 0),
REV_ENTRANCE_INSIDE("Inside Rev Ent.", new Location(3238, 10236, 3243, 10231), 0),
REV_MAIN_CHAMBER("Main Rev Chamber", new Location(3227, 10187, 3261, 10157), 0),
ROGUE_CASTLE("Rogue Castle", new Location(3275, 3947, 3299, 3920), 0),
RUNE_ROCKS("Rune Rocks", new Location(3055, 3890, 3072, 3876), 0),
SCORPIA("Scorpia", new Location(3216, 3949, 3248, 3935), 0),
SINGLE_STRIP("Single Strip", new Location(3333, 3842, 3348, 3774), 0),
SOUTH_REV_ENTRANCE("Lvl 18 Rev Ent", new Location(3071, 3660, 3092, 3645), 0),
SPIDER_HILL("Spider Hill", new Location(3156, 3896, 3182, 3871), 0),
THIRTEEN_OBELISK("13s", new Location(3145, 3628, 3168, 3609), 0),
VENENATIS("Venenatis", new Location(3298, 3759, 3353, 3722), 0),
VETTION("Vet'tion", new Location(3183, 3796, 3227, 3765), 0),
VOLCANO("Volcano", new Location(3345, 3957, 3390, 3916), 0),
WEB("Web", new Location(3153, 3961, 3163, 3948), 0),
WEST_DRAGONS("West Drags", new Location(2960, 3627, 2992, 3598), 0),
WILDY_AGILITY_COURSE("Wildy Agility Course", new Location(2988, 3967, 3008, 3906), 0);
@Getter
private final String name;
@Getter
private final WorldArea worldArea;
/**
* Creates a location used to get the name of a location by a WorldPoint
*
* @param name - The name that is used to represent the area in overlays etc
* @param location - A Location made out of 4 points on the world map
* @param plane - The plane of the World Area
*/
WorldLocation(String name, Location location, int plane)
{
this.name = name;
this.worldArea = new WorldArea(location.x, location.y, location.width, location.height, plane);
}
/**
* Returns all locations that aren't in the wild
* @return - A Collection of non-wilderness WorldLocations
*/
public static Collection<WorldLocation> getNonWildernessLocations()
{
return Arrays.stream(WorldLocation.values()).filter(loc ->
PvPUtil.getWildernessLevelFrom(loc.worldArea.toWorldPoint()) < 0).collect(Collectors.toList());
}
/**
* Returns only the WorldLocations that are in the wilderness
* @return - A Collection of WorldLocations in the wilderness
*/
public static Collection<WorldLocation> getWildernessLocations()
{
return Arrays.stream(WorldLocation.values()).filter(loc ->
PvPUtil.getWildernessLevelFrom(loc.worldArea.toWorldPoint()) > 0).collect(Collectors.toList());
}
public static Map<WorldArea, String> getLocationMap()
{
Map<WorldArea, String> hashMap = new HashMap<>();
Arrays.stream(values()).forEach(worldLocation ->
hashMap.put(worldLocation.getWorldArea(), worldLocation.getName()));
return hashMap;
}
/**
* Returns the WorldLocation that a WorldPoint is in, or the closest WorldLocation to the point
* @param worldPoint - the WorldPoint to find the WorldLocation of
* @return - Containing location or closest location if it isn't in any
*/
public static String location(WorldPoint worldPoint)
{
final Map<WorldArea, String> locationMap = getLocationMap();
int dist = 10000;
String s = "";
WorldArea closestArea = null;
for (Map.Entry<WorldArea, String> entry : locationMap.entrySet())
{
WorldArea worldArea = entry.getKey();
if (worldArea.toWorldPointList().contains(worldPoint))
{
s = entry.getValue();
return s;
}
int distTo = worldArea.distanceTo(worldArea);
if (distTo < dist)
{
dist = distTo;
closestArea = worldArea;
}
}
if (worldPoint.getY() > (Objects.requireNonNull(closestArea).toWorldPoint().getY() + closestArea.getHeight()))
{
s = s + "N";
}
if (worldPoint.getY() < closestArea.toWorldPoint().getY())
{
s = s + "S";
}
if (worldPoint.getX() < closestArea.toWorldPoint().getX())
{
s = s + "W";
}
if (worldPoint.getX() > (closestArea.toWorldPoint().getX() + closestArea.getWidth()))
{
s = s + "E";
}
s = s + " of ";
s = s + locationMap.get(closestArea);
if (s.startsWith(" of "))
{
s = s.substring(3);
}
return s;
}
public static class Location
{
final int x;
final int y;
final int width;
final int height;
Location(int x, int y, int x1, int y1)
{
this.x = x;
this.y = y;
this.width = x1 - x;
this.height = y1 - y;
}
@Override
public String toString()
{
return "Location{" +
"x=" + x +
", y=" + y +
", width=" + width +
", height=" + height +
'}';
}
}
@Override
public String toString()
{
return "WorldLocation{" +
"name='" + name + '\'' +
", worldArea=" + worldArea +
'}';
}
}

View File

@@ -63,12 +63,12 @@ import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.PvPValueBrokenItem;
import net.runelite.client.game.WorldLocation;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType;
import net.runelite.client.util.PvPUtil;
import net.runelite.client.util.StackFormatter;
import net.runelite.client.util.WildernessLocation;
import net.runelite.http.api.discord.DiscordClient;
import net.runelite.http.api.discord.DiscordEmbed;
import net.runelite.http.api.discord.DiscordMessage;
@@ -92,7 +92,7 @@ public class PlayerScouter extends Plugin
{
private static final HiscoreClient HISCORE_CLIENT = new HiscoreClient();
private static final DiscordClient DISCORD_CLIENT = new DiscordClient();
private static final Map<WorldArea, String> WILD_LOCS = getLocationMap();
private static final Map<WorldArea, String> WILD_LOCS = WorldLocation.getLocationMap();
private static final SimpleDateFormat SDF = new SimpleDateFormat("MMM dd h:mm a z");
private static final String ICONBASEURL = "https://www.osrsbox.com/osrsbox-db/items-icons/"; // Add item id + ".png"
@Inject
@@ -114,13 +114,6 @@ public class PlayerScouter extends Plugin
private boolean onlyWildy;
private boolean outputItems;
private static Map<WorldArea, String> getLocationMap()
{
Map<WorldArea, String> hashMap = new HashMap<>();
Arrays.stream(WildernessLocation.values()).forEach(wildernessLocation ->
hashMap.put(wildernessLocation.getWorldArea(), wildernessLocation.getName()));
return hashMap;
}
@Provides
PlayerScouterConfig provideConfig(ConfigManager configManager)

View File

@@ -1,14 +1,15 @@
/*
* Copyright (c) 2019. PKLite - All Rights Reserved
* Unauthorized modification, distribution, or possession of this source file, via any medium is strictly prohibited.
* Proprietary and confidential. Refer to PKLite License file for more information on
* full terms of this copyright and to determine what constitutes authorized use.
* Written by PKLite(ST0NEWALL, others) <stonewall@thots.cc.usa>, 2019
*
*/
/*******************************************************************************
* Copyright (c) 2019 RuneLitePlus
* Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file.
* If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors:
* ST0NEWALL#9112
* RuneLitePlus Discord: https://discord.gg/Q7wFtCe
* RuneLitePlus website: https://runelitepl.us
******************************************************************************/
package net.runelite.client.plugins.wildernesslocations;
import java.awt.Color;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@@ -29,15 +30,60 @@ public interface WildernessLocationsConfig extends Config
return true;
}
@ConfigItem(
keyName = "pvpWorld",
name = "PvP World",
description = "When enabled, shows location when anywhere in a PvP World",
position = 2
)
default boolean pvpWorld()
{
return true;
}
@ConfigItem(
keyName = "keybind",
name = "Send to CC",
description = "Configure button to send current location to CC",
position = 2
position = 3
)
default Keybind keybind()
{
return Keybind.NOT_SET;
}
@ConfigItem(
keyName = "worldMapNames",
name = "Show Loc Names World Map",
description = "Toggles whether or not Wilderness Location names are shown on the World Map",
position = 4
)
default boolean worldMapOverlay()
{
return true;
}
@ConfigItem(
keyName = "outlineLocations",
name = "Outline Locatoins",
description = "Draws an outline for the area of each location in the wilderness",
position = 5
)
default boolean outlineLocations()
{
return false;
}
@ConfigItem(
keyName = "mapOverlayColor",
name = "World Map Color",
description = "The color for the names and outlines of the locations on the World Map",
position = 6
)
default Color mapOverlayColor()
{
return Color.cyan;
}
}

View File

@@ -0,0 +1,227 @@
/*******************************************************************************
* Copyright (c) 2019 RuneLitePlus
* Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file.
* If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors:
* ST0NEWALL#9112
* RuneLitePlus Discord: https://discord.gg/Q7wFtCe
* RuneLitePlus website: https://runelitepl.us
******************************************************************************/
package net.runelite.client.plugins.wildernesslocations;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Area;
import javax.inject.Inject;
import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.RenderOverview;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.game.WorldLocation;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
public class WildernessLocationsMapOverlay extends Overlay
{
private final Client client;
private final WildernessLocationsPlugin plugin;
@Inject
private WildernessLocationsMapOverlay(Client client, WildernessLocationsPlugin plugin)
{
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
setLayer(OverlayLayer.ALWAYS_ON_TOP);
this.client = client;
this.plugin = plugin;
}
@Override
public Dimension render(Graphics2D graphics)
{
if (!plugin.isWorldMapOverlay())
{
return null;
}
drawWildLocations(graphics);
return null;
}
/**
* Draws the names of the wilderness WorldLocations on the World Map
* @param graphics - Overlay graphics
*/
private void drawWildLocations(Graphics2D graphics)
{
final Widget widget = client.getWidget(WidgetInfo.WORLD_MAP_VIEW);
if (widget == null)
{
return;
}
final Rectangle worldMapRectangle = widget.getBounds();
final Rectangle canvasBounds = client.getCanvas().getBounds();
canvasBounds.setLocation(0, 0);
graphics.setClip(worldMapRectangle);
for (WorldLocation worldLocation : WorldLocation.getWildernessLocations())
{
final int x1 = worldLocation.getWorldArea().getX();
final int x2 = worldLocation.getWorldArea().getX() + worldLocation.getWorldArea().getWidth();
final int y1 = worldLocation.getWorldArea().getY();
final int y2 = worldLocation.getWorldArea().getY() + worldLocation.getWorldArea().getHeight();
final int plane = worldLocation.getWorldArea().getPlane();
final Point point = mapWorldPointToGraphicsPoint(new WorldPoint(x1, y2, plane));
final Point point1 = mapWorldPointToGraphicsPoint(new WorldPoint(x2, y1, plane));
if (point == null || point1 == null)
{
continue;
}
int width = point1.getX() - point.getX();
int height = point.getY() - point1.getY();
Rectangle rectangle = new Rectangle(point.getX(), point1.getY(), width, height);
// These would be unreadable unless font color is black
if (worldLocation.equals(WorldLocation.ICE_GATE) || worldLocation.equals(WorldLocation.ICE_ROCK))
{
graphics.setColor(Color.BLACK);
if (plugin.isWorldMapNames())
{
graphics.drawString(worldLocation.getName(), point.getX(), point.getY());
}
if (plugin.isOutlineLocations())
{
graphics.draw(rectangle);
}
}
else
{
graphics.setColor(plugin.getMapOverlayColor());
if (plugin.isWorldMapNames())
{
graphics.drawString(worldLocation.getName(), point.getX(), point.getY());
}
if (plugin.isOutlineLocations())
{
graphics.draw(rectangle);
}
}
}
}
/**
* Get the screen coordinates for a WorldPoint on the world map
*
* @param worldPoint WorldPoint to get screen coordinates of
* @return Point of screen coordinates of the center of the world point
*/
public Point mapWorldPointToGraphicsPoint(WorldPoint worldPoint)
{
RenderOverview ro = client.getRenderOverview();
if (!ro.getWorldMapData().surfaceContainsPosition(worldPoint.getX(), worldPoint.getY()))
{
return null;
}
Float pixelsPerTile = ro.getWorldMapZoom();
Widget map = client.getWidget(WidgetInfo.WORLD_MAP_VIEW);
if (map != null)
{
Rectangle worldMapRect = map.getBounds();
int widthInTiles = (int) Math.ceil(worldMapRect.getWidth() / pixelsPerTile);
int heightInTiles = (int) Math.ceil(worldMapRect.getHeight() / pixelsPerTile);
Point worldMapPosition = ro.getWorldMapPosition();
//Offset in tiles from anchor sides
int yTileMax = worldMapPosition.getY() - heightInTiles / 2;
int yTileOffset = (yTileMax - worldPoint.getY() - 1) * -1;
int xTileOffset = worldPoint.getX() + widthInTiles / 2 - worldMapPosition.getX();
int xGraphDiff = ((int) (xTileOffset * pixelsPerTile));
int yGraphDiff = (int) (yTileOffset * pixelsPerTile);
//Center on tile.
yGraphDiff -= pixelsPerTile - Math.ceil(pixelsPerTile / 2);
xGraphDiff += pixelsPerTile - Math.ceil(pixelsPerTile / 2);
yGraphDiff = worldMapRect.height - yGraphDiff;
yGraphDiff += (int) worldMapRect.getY();
xGraphDiff += (int) worldMapRect.getX();
return new Point(xGraphDiff, yGraphDiff);
}
return null;
}
/**
* Gets a clip area which excludes the area of widgets which overlay the world map.
*
* @param baseRectangle The base area to clip from
* @return An {@link Area} representing <code>baseRectangle</code>, with the area
* of visible widgets overlaying the world map clipped from it.
*/
public Area getWorldMapClipArea(Rectangle baseRectangle)
{
final Widget overview = client.getWidget(WidgetInfo.WORLD_MAP_OVERVIEW_MAP);
final Widget surfaceSelector = client.getWidget(WidgetInfo.WORLD_MAP_SURFACE_SELECTOR);
Area clipArea = new Area(baseRectangle);
if (overview != null && !overview.isHidden())
{
clipArea.subtract(new Area(overview.getBounds()));
}
if (surfaceSelector != null && !surfaceSelector.isHidden())
{
clipArea.subtract(new Area(surfaceSelector.getBounds()));
}
return clipArea;
}
private Point clipToRectangle(Point drawPoint, Rectangle mapDisplayRectangle)
{
int clippedX = drawPoint.getX();
if (drawPoint.getX() < mapDisplayRectangle.getX())
{
clippedX = (int) mapDisplayRectangle.getX();
}
if (drawPoint.getX() > mapDisplayRectangle.getX() + mapDisplayRectangle.getWidth())
{
clippedX = (int) (mapDisplayRectangle.getX() + mapDisplayRectangle.getWidth());
}
int clippedY = drawPoint.getY();
if (drawPoint.getY() < mapDisplayRectangle.getY())
{
clippedY = (int) mapDisplayRectangle.getY();
}
if (drawPoint.getY() > mapDisplayRectangle.getY() + mapDisplayRectangle.getHeight())
{
clippedY = (int) (mapDisplayRectangle.getY() + mapDisplayRectangle.getHeight());
}
return new Point(clippedX, clippedY);
}
}

View File

@@ -1,20 +1,18 @@
/*
* Copyright (c) 2019. PKLite - All Rights Reserved
* Unauthorized modification, distribution, or possession of this source file, via any medium is strictly prohibited.
* Proprietary and confidential. Refer to PKLite License file for more information on
* full terms of this copyright and to determine what constitutes authorized use.
* Written by PKLite(ST0NEWALL, others) <stonewall@thots.cc.usa>, 2019
*
*/
/*******************************************************************************
* Copyright (c) 2019 RuneLitePlus
* Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file.
* If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors:
* ST0NEWALL#9112
* RuneLitePlus Discord: https://discord.gg/Q7wFtCe
* RuneLitePlus website: https://runelitepl.us
******************************************************************************/
package net.runelite.client.plugins.wildernesslocations;
import com.google.inject.Provides;
import java.util.Arrays;
import java.util.HashMap;
import java.awt.Color;
import java.util.Map;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.AccessLevel;
@@ -24,6 +22,7 @@ import net.runelite.api.Client;
import net.runelite.api.ScriptID;
import net.runelite.api.VarClientStr;
import net.runelite.api.Varbits;
import net.runelite.api.WorldType;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ConfigChanged;
@@ -40,7 +39,7 @@ import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType;
import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.util.HotkeyListener;
import net.runelite.client.util.WildernessLocation;
import net.runelite.client.game.WorldLocation;
@Slf4j
@PluginDescriptor(
@@ -81,10 +80,13 @@ public class WildernessLocationsPlugin extends Plugin
@Inject
private EventBus eventBus;
@Inject
private WildernessLocationsMapOverlay wildernessLocationsMapOverlay;
private String oldChat = "";
private int currentCooldown = 0;
private WorldPoint worldPoint = null;
private final Map<WorldArea, String> wildLocs = getLocationMap();
private static final Map<WorldArea, String> wildLocs = WorldLocation.getLocationMap();
private final HotkeyListener hotkeyListener = new HotkeyListener(() -> this.keybind)
{
@@ -97,7 +99,17 @@ public class WildernessLocationsPlugin extends Plugin
@Getter(AccessLevel.PACKAGE)
private boolean drawOverlay;
private boolean pvpWorld;
private Keybind keybind;
@Getter
private boolean worldMapNames;
@Getter
private Color mapOverlayColor;
@Getter
private boolean outlineLocations;
@Getter
private boolean worldMapOverlay;
@Provides
WildernessLocationsConfig getConfig(ConfigManager configManager)
@@ -110,13 +122,24 @@ public class WildernessLocationsPlugin extends Plugin
{
addSubscriptions();
this.drawOverlay = wildyConfig.drawOverlay();
this.keybind = wildyConfig.keybind();
updateConfig();
overlayManager.add(overlay);
overlayManager.add(wildernessLocationsMapOverlay);
keyManager.registerKeyListener(hotkeyListener);
}
private void updateConfig()
{
this.drawOverlay = wildyConfig.drawOverlay();
this.pvpWorld = wildyConfig.pvpWorld();
this.keybind = wildyConfig.keybind();
this.worldMapNames = wildyConfig.worldMapOverlay();
this.mapOverlayColor = wildyConfig.mapOverlayColor();
this.outlineLocations = wildyConfig.outlineLocations();
this.worldMapOverlay = this.worldMapNames || this.outlineLocations;
}
private void addSubscriptions()
{
eventBus.subscribe(ConfigChanged.class, this, this::onConfigChanged);
@@ -131,8 +154,7 @@ public class WildernessLocationsPlugin extends Plugin
return;
}
this.drawOverlay = wildyConfig.drawOverlay();
this.keybind = wildyConfig.keybind();
updateConfig();
}
@Override
@@ -141,6 +163,7 @@ public class WildernessLocationsPlugin extends Plugin
eventBus.unregister(this);
overlayManager.remove(overlay);
overlayManager.remove(wildernessLocationsMapOverlay);
keyManager.unregisterKeyListener(hotkeyListener);
}
@@ -150,12 +173,13 @@ public class WildernessLocationsPlugin extends Plugin
{
currentCooldown--;
}
renderLocation = client.getVar(Varbits.IN_WILDERNESS) == 1;
renderLocation = (client.getVar(Varbits.IN_WILDERNESS) == 1
|| (this.pvpWorld && WorldType.isAllPvpWorld(client.getWorldType())));
if (renderLocation)
{
if (client.getLocalPlayer().getWorldLocation() != worldPoint)
{
locationString = location();
locationString = WorldLocation.location(client.getLocalPlayer().getWorldLocation());
worldPoint = client.getLocalPlayer().getWorldLocation();
}
}
@@ -166,62 +190,6 @@ public class WildernessLocationsPlugin extends Plugin
}
}
private String location()
{
int dist = 10000;
String s = "";
WorldArea closestArea = null;
for (Map.Entry<WorldArea, String> entry : wildLocs.entrySet())
{
WorldArea worldArea = entry.getKey();
if (worldArea.toWorldPointList().contains(client.getLocalPlayer().getWorldLocation()))
{
s = entry.getValue();
return s;
}
int distTo = worldArea.distanceTo(client.getLocalPlayer().getWorldLocation());
if (distTo < dist)
{
dist = distTo;
closestArea = worldArea;
}
}
if (client.getLocalPlayer().getWorldLocation().getY() >
(Objects.requireNonNull(closestArea).toWorldPoint().getY() + closestArea.getHeight()))
{
s = s + "N";
}
if (client.getLocalPlayer().getWorldLocation().getY() < closestArea.toWorldPoint().getY())
{
s = s + "S";
}
if (client.getLocalPlayer().getWorldLocation().getX() < closestArea.toWorldPoint().getX())
{
s = s + "W";
}
if (client.getLocalPlayer().getWorldLocation().getX() >
(closestArea.toWorldPoint().getX() + closestArea.getWidth()))
{
s = s + "E";
}
s = s + " of ";
s = s + wildLocs.get(closestArea);
if (s.startsWith(" of "))
{
s = s.substring(3);
}
return s;
}
private static Map<WorldArea, String> getLocationMap()
{
Map<WorldArea, String> hashMap = new HashMap<>();
Arrays.stream(WildernessLocation.values()).forEach(wildernessLocation ->
hashMap.put(wildernessLocation.getWorldArea(), wildernessLocation.getName()));
return hashMap;
}
private void onVarClientStrChanged(VarClientStrChanged varClient)
{
String newChat = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT);

View File

@@ -1,95 +0,0 @@
package net.runelite.client.util;
import lombok.Getter;
import net.runelite.api.coords.WorldArea;
public enum WildernessLocation
{
REV_CAVE_OTHER("Rev Cave", new Location(3128, 10232, 3225, 10059), 0),
REV_BLACK_DRAGS("Rev Black Drags", new Location(3223, 10216, 3254, 10190), 0),
REV_DARK_BEAST("Rev Dark Beast", new Location(3243, 10154, 3264, 10136), 0),
REV_MAIN_CHAMBER("Main Rev Chamber", new Location(3227, 10187, 3261, 10157), 0),
REV_ENTRANCE_INSIDE("Inside Rev Ent.", new Location(3238, 10236, 3243, 10231), 0),
ICE_ROCK("Ice Rock", new Location(2957, 3942, 2984, 3929), 0),
WILDY_AGILITY_COURSE("Wildy Agility Course", new Location(2988, 3967, 3008, 3906), 0),
FIRE_GIANT_ENTRANCE("Fire Giant Entrance", new Location(3042, 3929, 3051, 3920), 0),
PIRATE_HUT("Pirate Hut", new Location(3037, 3959, 3045, 3948), 0),
MAGE_BANK("Mage Bank", new Location(3082, 3960, 3103, 3952), 0),
MAGE_ARENA("Mage Arena", new Location(3088, 3949, 3123, 3919), 0),
LEVER("Lever", new Location(3149, 3933, 3162, 3917), 0),
WEB("Web", new Location(3153, 3961, 3163, 3948), 0),
RESOURCE_ARENA("Resource Arena", new Location(3174, 3946, 3195, 3923), 0),
AXE_HUT("Axe Hut", new Location(3187, 3962, 3194, 3957), 0),
SCORPIA("Scorpia", new Location(3216, 3949, 3248, 3935), 0),
ROGUE_CASTLE("Rogue Castle", new Location(3275, 3947, 3299, 3920), 0),
FIFTY_PORTS("50 ports", new Location(3301, 3923, 3315, 3909), 0),
VOLCANO("Volcano", new Location(3345, 3957, 3390, 3916), 0),
NEW_GATE("New Gate", new Location(3345, 3957, 3390, 3916), 0),
GLORY_HOLE("Glory Hole", new Location(3352, 3897, 3386, 3869), 0),
GLORY_HILL("Glory Hill", new Location(3331, 3890, 3348, 3866), 0),
GDZ("Gdz", new Location(3279, 3895, 3296, 3875), 0),
GAP("Gap", new Location(3238, 3855, 3258, 3841), 0),
OLD_GATE("Old Gate", new Location(3211, 3906, 3238, 3882), 0),
LAVA_DRAGS("Lava Drags", new Location(3175, 3857, 3221, 3805), 0),
SPIDER_HILL("Spider Hill", new Location(3156, 3896, 3182, 3871), 0),
RUNE_ROCKS("Rune Rocks", new Location(3055, 3890, 3072, 3876), 0),
ICE_GATE("Ice Gate", new Location(2945, 3913, 2978, 3878), 0),
VENENATIS("Venenatis", new Location(3298, 3759, 3353, 3722), 0),
SINGLE_STRIP("Single Strip", new Location(3333, 3842, 3348, 3774), 0),
CALLISTO("Callisto", new Location(3266, 3863, 3315, 3827), 0),
DWARVES("Dwarves", new Location(3230, 3805, 3264, 3779), 0),
VETTION("Vet'tion", new Location(3183, 3796, 3227, 3765), 0),
EAST_DRAGONS("East Drags", new Location(3326, 3704, 3365, 3671), 0),
HILL_GIANTS("Hill Giants", new Location(3282, 3687, 3300, 3674), 0),
ENTS("Ents", new Location(3300, 3627, 3320, 3584), 0),
CHAOS_TEMPLE("Chaos Temple", new Location(3220, 3632, 3255, 3593), 0),
NINETEEN_OBELISK("19s", new Location(3220, 3672, 3234, 3660), 0),
CORP_CAVE("Corp Cave", new Location(3201, 3684, 3219, 3672), 0),
THIRTEEN_OBELISK("13s", new Location(3145, 3628, 3168, 3609), 0),
SOUTH_REV_ENTRANCE("Lvl 18 Rev Ent", new Location(3071, 3660, 3092, 3645), 0),
GRAVES("Graves", new Location(3128, 3686, 3181, 3658), 0),
GRAVEYARD_DRAGS("Graveyard Drags", new Location(3129, 3717, 3172, 3691), 0),
CHINS("Chins", new Location(3128, 3792, 3160, 3754), 0),
REV_ENTRANCE("Rev Entrance", new Location(3118, 3837, 3142, 3818), 0),
HOB_OBELISK("35 Obelisk", new Location(3097, 3804, 3115, 3785), 0),
HOBGOBLINS("Hobgoblins", new Location(3073, 3775, 3104, 3745), 0),
GWD("God Wars Dungeon", new Location(3010, 3745, 3027, 3727), 0),
LAVA_MAZE_TELE("Lava Maze Tele", new Location(3019, 3842, 3044, 3812), 0),
KBD_CAGE("KBD CAGE", new Location(3007, 3855, 3021, 3839), 0),
GHORROCK("44s", new Location(2973, 3870, 2987, 3859), 0),
CHAOS_FANATIC("Chaos Fanatic", new Location(2971, 3854, 2992, 3834), 0),
HIGH_ALTAR("High Altar", new Location(2945, 3826, 2970, 3813), 0),
CEMETERY("Cemetery", new Location(2956, 3767, 2996, 3736), 0),
CRAZY_ARCHAEOLOGIST("Crazy Archaeologist", new Location(2952, 3709, 2985, 3678), 0),
DARK_WARRIOR_FORTRESS("Dark Warriors", new Location(3014, 3648, 3046, 3616), 0),
WEST_DRAGONS("West Drags", new Location(2960, 3627, 2992, 3598), 0),
BANDIT_CAMP("Bandit Camp", new Location(3017, 3712, 3059, 3681), 0);
@Getter
private final String name;
@Getter
private final WorldArea worldArea;
WildernessLocation(String name, Location location, int plane)
{
this.name = name;
this.worldArea = new WorldArea(location.x, location.y, location.width, location.height, plane);
}
static class Location
{
final int x;
final int y;
final int width;
final int height;
Location(int x, int y, int x1, int y1)
{
this.x = x;
this.y = y1;
this.width = x1 - x;
this.height = y - y1;
}
}
}