From e4f698abdaab11edf1d967c9fd4320a85b1f9b2c Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:20:00 -0500 Subject: [PATCH 1/9] deathindicator: Fixes #1951 --- .../java/net/runelite/client/plugins/deathindicator/Bones.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java index 0b5e234fc9..40e44c1073 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/Bones.java @@ -128,7 +128,7 @@ void save(ConfigManager configManager, int region) public boolean add(Bone bone) { - if (this.map == null) + if (this.map == null || bone == null) { return false; } From 7be9eab972c51f0f7a6c85a2b68290d1195c6627 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:23:28 -0500 Subject: [PATCH 2/9] worldpoint: if chunkX|Y >= 13, null. Fixes #1667 Fixes #1949 Fixes #1981 --- .../net/runelite/api/coords/WorldPoint.java | 27 +++++--- .../client/plugins/discord/DiscordPlugin.java | 3 +- .../entityhider/EntityHiderPlugin.java | 10 +-- .../groundmarkers/GroundMarkerPlugin.java | 13 +++- .../client/plugins/hideunder/HideUnder.java | 10 ++- .../loottracker/LootTrackerPlugin.java | 59 ++++++++++++++--- .../ObjectIndicatorsPlugin.java | 12 +++- .../client/plugins/slayer/SlayerPlugin.java | 13 ++-- .../plugins/theatre/rooms/MaidenHandler.java | 9 ++- .../tobdamagecount/DamageCounterPlugin.java | 65 +++++++++++++------ 10 files changed, 168 insertions(+), 53 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 2882367c36..c4a64301a0 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -25,13 +25,14 @@ */ package net.runelite.api.coords; -import static net.runelite.api.Constants.CHUNK_SIZE; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import javax.annotation.Nullable; import lombok.Value; import net.runelite.api.Client; +import static net.runelite.api.Constants.CHUNK_SIZE; import net.runelite.api.Perspective; /** @@ -97,8 +98,8 @@ public WorldPoint dz(int dz) * Checks whether a tile is located in the current scene. * * @param client the client - * @param x the tiles x coordinate - * @param y the tiles y coordinate + * @param x the tiles x coordinate + * @param y the tiles y coordinate * @return true if the tile is in the scene, false otherwise */ public static boolean isInScene(Client client, int x, int y) @@ -127,7 +128,7 @@ public boolean isInScene(Client client) * Gets the coordinate of the tile that contains the passed local point. * * @param client the client - * @param local the local coordinate + * @param local the local coordinate * @return the tile coordinate containing the local point */ public static WorldPoint fromLocal(Client client, LocalPoint local) @@ -139,9 +140,9 @@ public static WorldPoint fromLocal(Client client, LocalPoint local) * Gets the coordinate of the tile that contains the passed local point. * * @param client the client - * @param x the local x-axis coordinate - * @param y the local x-axis coordinate - * @param plane the plane + * @param x the local x-axis coordinate + * @param y the local x-axis coordinate + * @param plane the plane * @return the tile coordinate containing the local point */ public static WorldPoint fromLocal(Client client, int x, int y, int plane) @@ -157,10 +158,11 @@ public static WorldPoint fromLocal(Client client, int x, int y, int plane) * Gets the coordinate of the tile that contains the passed local point, * accounting for instances. * - * @param client the client + * @param client the client * @param localPoint the local coordinate * @return the tile coordinate containing the local point */ + @Nullable public static WorldPoint fromLocalInstance(Client client, LocalPoint localPoint) { if (client.isInInstancedRegion()) @@ -173,6 +175,11 @@ public static WorldPoint fromLocalInstance(Client client, LocalPoint localPoint) int chunkX = sceneX / CHUNK_SIZE; int chunkY = sceneY / CHUNK_SIZE; + if (chunkX >= 13 || chunkY >= 13) + { + return null; + } + // get the template chunk for the chunk int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); int templateChunk = instanceTemplateChunks[client.getPlane()][chunkX][chunkY]; @@ -198,6 +205,7 @@ public static WorldPoint fromLocalInstance(Client client, LocalPoint localPoint) /** * Get occurrences of a tile on the scene, accounting for instances. There may be * more than one if the same template chunk occurs more than once on the scene. + * * @param client * @param worldPoint * @return @@ -238,7 +246,7 @@ public static Collection toLocalInstance(Client client, WorldPoint w /** * Rotate the coordinates in the chunk according to chunk rotation * - * @param point point + * @param point point * @param rotation rotation * @return world point */ @@ -363,6 +371,7 @@ public int getRegionID() /** * Checks if user in within certain zone specified by upper and lower bound + * * @param lowerBound * @param upperBound * @param userLocation diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 0a6a97daf4..62fa47b252 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -399,7 +399,8 @@ private void checkForAreaUpdate() return; } - final int playerRegionID = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID(); + final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + final int playerRegionID = worldPoint == null ? 0 : worldPoint.getRegionID(); if (playerRegionID == 0) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java index ef97f51e82..e3c4910283 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java @@ -27,6 +27,9 @@ package net.runelite.client.plugins.entityhider; import com.google.inject.Provides; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.Client; @@ -41,10 +44,6 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - @PluginDescriptor( name = "Entity Hider", description = "Hide players, NPCs, and/or projectiles", @@ -189,7 +188,8 @@ private boolean isPlayerRegionAllowed() return true; } - final int playerRegionID = WorldPoint.fromLocalInstance(client, localPlayer.getLocalLocation()).getRegionID(); + final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + final int playerRegionID = worldPoint == null ? 0 : worldPoint.getRegionID(); // 9520 = Castle Wars return playerRegionID != 9520; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java index 0fa3afcf4e..8331af44c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java @@ -47,8 +47,8 @@ import net.runelite.api.Client; import static net.runelite.api.Constants.CHUNK_SIZE; import net.runelite.api.GameState; -import net.runelite.api.MenuOpcode; import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; import net.runelite.api.Tile; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; @@ -57,6 +57,7 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.util.Text; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.input.KeyManager; @@ -64,7 +65,6 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.ColorUtil; -import net.runelite.api.util.Text; @Slf4j @PluginDescriptor( @@ -336,6 +336,10 @@ private void onMenuEntryAdded(MenuEntryAdded event) return; } final WorldPoint loc = WorldPoint.fromLocalInstance(client, tile.getLocalLocation()); + if (loc == null) + { + return; + } final int regionId = loc.getRegionID(); for (int i = this.amount.toInt(); i > 0; i--) @@ -419,6 +423,11 @@ private void markTile(LocalPoint localPoint, int group) WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, localPoint); + if (worldPoint == null) + { + return; + } + int regionId = worldPoint.getRegionID(); GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), group); log.debug("Updating point: {} - {}", point, worldPoint); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hideunder/HideUnder.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideunder/HideUnder.java index 56e2207ad1..15ffef6f90 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hideunder/HideUnder.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hideunder/HideUnder.java @@ -175,6 +175,11 @@ private void onGameTick(GameTick event) client.setLocalPlayerHidden(false); + if (localPlayerWp == null) + { + return; + } + for (PlayerContainer player : playerContainer) { if (player.getTimer() > 0) @@ -194,7 +199,7 @@ private void onGameTick(GameTick event) if (client.getVar(Varbits.LMS_IN_GAME) == 1) { final WorldPoint playerWp = WorldPoint.fromLocalInstance(client, player.getPlayer().getLocalLocation()); - if (localPlayerWp.distanceTo(playerWp) == 0) + if (playerWp != null && localPlayerWp.distanceTo(playerWp) == 0) { client.setLocalPlayerHidden(true); } @@ -217,7 +222,8 @@ private boolean isPlayerRegionAllowed() return true; } - final int playerRegionID = WorldPoint.fromLocalInstance(client, localPlayer.getLocalLocation()).getRegionID(); + final WorldPoint playerWp = WorldPoint.fromLocalInstance(client, localPlayer.getLocalLocation()); + final int playerRegionID = playerWp == null ? 0 : playerWp.getRegionID(); // 9520 = Castle Wars return playerRegionID != 9520; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index f34f1bcbdd..203fbe1b9b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -86,6 +86,7 @@ import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.PlayerSpawned; import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.util.Text; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.RuneLite; @@ -119,7 +120,6 @@ import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.ImageUtil; -import net.runelite.api.util.Text; import net.runelite.client.util.QuantityFormatter; import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.loottracker.GameItem; @@ -508,6 +508,11 @@ private void addSubscriptions() private void onGameStateChanged(final GameStateChanged event) { + if (client.getLocalPlayer() == null) + { + return; + } + if (event.getGameState() == GameState.LOADING) { chestLooted = false; @@ -547,6 +552,11 @@ private void onGameStateChanged(final GameStateChanged event) private void onNpcLootReceived(final NpcLootReceived npcLootReceived) { + if (client.getLocalPlayer() == null) + { + return; + } + final NPC npc = npcLootReceived.getNpc(); final Collection items = npcLootReceived.getItems(); final String name = npc.getName(); @@ -618,11 +628,17 @@ private void onPlayerSpawned(PlayerSpawned event) private void onPlayerLootReceived(final PlayerLootReceived playerLootReceived) { + if (client.getLocalPlayer() == null) + { + return; + } + // Ignore Last Man Standing player loots if (isAtLMS()) { return; } + if (this.sendLootValueMessages) { if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) || @@ -636,6 +652,7 @@ private void onPlayerLootReceived(final PlayerLootReceived playerLootReceived) .build()).build()); } } + final Player player = playerLootReceived.getPlayer(); final Collection items = playerLootReceived.getItems(); final String name = player.getName(); @@ -663,6 +680,11 @@ private void onPlayerLootReceived(final PlayerLootReceived playerLootReceived) private void onWidgetLoaded(WidgetLoaded event) { + if (client.getLocalPlayer() == null) + { + return; + } + final ItemContainer container; switch (event.getGroupId()) { @@ -685,8 +707,9 @@ private void onWidgetLoaded(WidgetLoaded event) return; } - if (WorldPoint.fromLocalInstance(client, client.getLocalPlayer() - .getLocalLocation()).getRegionID() != THEATRE_OF_BLOOD_REGION) + WorldPoint p = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + + if (p != null && p.getRegionID() != THEATRE_OF_BLOOD_REGION) { return; } @@ -758,7 +781,7 @@ private void onWidgetLoaded(WidgetLoaded event) } final LootTrackerItem[] entries = buildEntries(stack(items)); - + SwingUtilities.invokeLater(() -> panel.add(eventType, client.getLocalPlayer().getName(), -1, entries)); LootRecord lootRecord = new LootRecord(eventType, client.getLocalPlayer().getName(), LootRecordType.EVENT, toGameItems(items), Instant.now()); @@ -781,6 +804,11 @@ private void onWidgetLoaded(WidgetLoaded event) private void onChatMessage(ChatMessage event) { + if (client.getLocalPlayer() == null) + { + return; + } + if (event.getType() != ChatMessageType.GAMEMESSAGE && event.getType() != ChatMessageType.SPAM) { return; @@ -916,6 +944,11 @@ private void onChatMessage(ChatMessage event) @SuppressWarnings("unchecked") public void onItemContainerChanged(ItemContainerChanged event) { + if (client.getLocalPlayer() == null) + { + return; + } + if (pvpDeath && RESPAWN_REGIONS.contains(client.getLocalPlayer().getWorldLocation().getRegionID())) { Multiset snapshot; @@ -1088,6 +1121,11 @@ private void takeInventorySnapshot() private void processChestLoot(String chestType, ItemContainer inventoryContainer) { + if (client.getLocalPlayer() == null) + { + return; + } + if (inventorySnapshot != null) { Multiset currentInventory = HashMultiset.create(); @@ -1212,17 +1250,17 @@ private LootTrackerItem buildLootTrackerItem(int itemId, int quantity) { final ItemDefinition itemDefinition = itemManager.getItemDefinition(itemId); final int realItemId = itemDefinition.getNote() != -1 ? itemDefinition.getLinkedNoteId() : itemId; - final long gePrice ; - final long haPrice ; + final long gePrice; + final long haPrice; // If it's a death we want to get a coin value for untradeables lost if (!itemDefinition.isTradeable() && quantity < 0) { - gePrice = (long) itemDefinition.getPrice() * (long) quantity; + gePrice = (long) itemDefinition.getPrice() * (long) quantity; haPrice = (long) Math.round(itemDefinition.getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER) * (long) quantity; } else { - gePrice = (long) itemManager.getItemPrice(realItemId) * (long) quantity; + gePrice = (long) itemManager.getItemPrice(realItemId) * (long) quantity; haPrice = (long) Math.round(itemManager.getItemPrice(realItemId) * Constants.HIGH_ALCHEMY_MULTIPLIER) * (long) quantity; } final boolean ignored = ignoredItems.contains(itemDefinition.getName()); @@ -1290,6 +1328,11 @@ private boolean isAtLMS() // Pet Handling private ItemStack handlePet(String name) { + if (client.getLocalPlayer() == null) + { + return null; + } + gotPet = false; int petID = getPetId(name); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java index 56aafdf018..9043162f04 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsPlugin.java @@ -50,8 +50,8 @@ import net.runelite.api.GameObject; import net.runelite.api.GameState; import net.runelite.api.GroundObject; -import net.runelite.api.MenuOpcode; import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; import net.runelite.api.ObjectDefinition; import net.runelite.api.Scene; import net.runelite.api.Tile; @@ -346,6 +346,12 @@ private void onMenuOptionClicked(MenuOptionClicked event) private void checkObjectPoints(TileObject object) { final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, object.getLocalLocation()); + + if (worldPoint == null) + { + return; + } + final Set objectPoints = points.get(worldPoint.getRegionID()); if (objectPoints == null) @@ -445,6 +451,10 @@ private void markObject(String name, final TileObject object) } final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, object.getLocalLocation()); + if (worldPoint == null) + { + return; + } final int regionId = worldPoint.getRegionID(); final ObjectPoint point = new ObjectPoint( name, diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index e8e03b6569..bff122edf1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -72,8 +72,9 @@ import net.runelite.api.events.NpcDefinitionChanged; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; -import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.StatChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.util.Text; import net.runelite.api.vars.SlayerUnlock; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -100,7 +101,6 @@ import net.runelite.client.util.AsyncBufferedImage; import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ImageUtil; -import net.runelite.api.util.Text; import net.runelite.http.api.chat.ChatClient; @PluginDescriptor( @@ -877,8 +877,13 @@ private void killedOne(int delta) private boolean doubleTroubleExtraKill() { - return WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID() == GROTESQUE_GUARDIANS_REGION && - SlayerUnlock.GROTESQUE_GUARDIAN_DOUBLE_COUNT.isEnabled(client); + if (client.getLocalPlayer() == null) + { + return false; + } + final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + final int playerRegionID = worldPoint == null ? 0 : worldPoint.getRegionID(); + return playerRegionID == GROTESQUE_GUARDIANS_REGION && SlayerUnlock.GROTESQUE_GUARDIAN_DOUBLE_COUNT.isEnabled(client); } // checks if any contiguous subsequence of seq0 exactly matches the String toMatch diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java index 952087c3c1..ea6a201463 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/MaidenHandler.java @@ -18,12 +18,12 @@ import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.SpotAnimationChanged; +import net.runelite.api.util.Text; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.plugins.theatre.RoomHandler; import net.runelite.client.plugins.theatre.TheatreConstant; import net.runelite.client.plugins.theatre.TheatrePlugin; import net.runelite.client.plugins.theatre.TheatreRoom; -import net.runelite.api.util.Text; @Slf4j public class MaidenHandler extends RoomHandler @@ -205,6 +205,11 @@ public void onNpcSpawned(NpcSpawned event) WorldPoint wp = WorldPoint.fromLocalInstance(client, npc.getLocalLocation()); + if (wp == null) + { + return; + } + if (N1.contains(wp)) { addNylo(npc, Nylos.SpawnLocation.N1); @@ -248,7 +253,7 @@ public void onNpcDefinitionChanged(NpcDefinitionChanged event) public void onChatMessage(ChatMessage event) { - if (event.getSender() != null && !event.getSender().equals(client.getLocalPlayer().getName())) + if (client.getLocalPlayer() == null || (event.getSender() != null && !event.getSender().equals(client.getLocalPlayer().getName()))) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java index 9600d6e996..3e499c816c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tobdamagecount/DamageCounterPlugin.java @@ -196,8 +196,19 @@ private int XPtoDamage() //adding up the damage for the print message checks every tick(aka attack tick) private void DamageCounting() { + if (client.getLocalPlayer() == null) + { + return; + } + Player localPlayer = client.getLocalPlayer(); Actor interacting = localPlayer.getInteracting(); + + if (interacting.getName() == null) + { + return; + } + if (client.getGameState() == GameState.LOGGED_IN && interacting instanceof NPC) { String interactingName = interacting.getName(); @@ -229,8 +240,20 @@ private void onHitsplatApplied(HitsplatApplied Hit) private void onNpcDespawned(NpcDespawned npc) { NPC actor = npc.getNpc(); - double Percent = calculatePercent(WorldPoint.fromLocalInstance(client, - client.getLocalPlayer().getLocalLocation()).getRegionID()); + if (client.getLocalPlayer() == null || actor.getName() == null) + { + return; + } + + final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + final int playerRegionID = worldPoint == null ? 0 : worldPoint.getRegionID(); + + if (playerRegionID == 0) + { + return; + } + + double Percent = calculatePercent(playerRegionID); if (actor.isDead() && actor.getId() == NpcID.VERZIK_VITUR_8375 && status) { DamagePrint(actor, Percent); @@ -298,28 +321,28 @@ private void DamagePrint(NPC actor, double percent) { int playerCount = getPlayers(); String MessageDamage; - if (playerCount >= 2 && playerCount <= 5) + if (playerCount >= 2 && playerCount <= 5) { - if (percent >= (2.0 / playerCount) * 100) + if (percent >= (2.0 / playerCount) * 100) { MessageDamage = "[Exceptional performance] Damage dealt to " + actor.getName() + ": " - + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; - } - else if (percent >= (1.0 / playerCount) * 100) + + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; + } + else if (percent >= (1.0 / playerCount) * 100) { MessageDamage = "[Above-average performance] Damage dealt to " + actor.getName() + ": " - + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; - } - else + + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; + } + else { MessageDamage = "[Under performance] Damage dealt to " + actor.getName() + ": " - + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; + + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; } } - else + else { MessageDamage = "Damage dealt to " + actor.getName() + ": " - + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; + + DAMAGEFORMAT.format(DamageCount) + " (" + String.format("%.2f", percent) + "%)"; } sendChatMessage(MessageDamage); @@ -330,22 +353,26 @@ else if (percent >= (1.0 / playerCount) * 100) public int getPlayers() { List players = client.getPlayers(); - int numPlayers = players.size(); - return numPlayers; + return players.size(); } //whenever you have died in tob you will get a death message with damage // made sure the message works at ToB area or else it will message every where private void onLocalPlayerDeath(LocalPlayerDeath death) { - String DeathMessage = "You have died! You did " + DAMAGEFORMAT.format(DamageCount) + " damage to " + - BossName + "!"; + if (client.getLocalPlayer() == null) + { + return; + } + + String DeathMessage = "You have died! You did " + DAMAGEFORMAT.format(DamageCount) + " damage to " + BossName + "!"; String MessageTaken = "You have taken " + DAMAGEFORMAT.format(DamageTaken) + " damage from this fight!"; for (int value : ToB_Region) { - if (WorldPoint.fromLocalInstance(client, - client.getLocalPlayer().getLocalLocation()).getRegionID() == value) + final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()); + final int playerRegionID = worldPoint == null ? 0 : worldPoint.getRegionID(); + if (playerRegionID == value) { sendChatMessage(DeathMessage); sendChatMessage(MessageTaken); From 63a93e3560298011b1bb8a4e030bd5f51f354074 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:24:35 -0500 Subject: [PATCH 3/9] maxhit: null check autocast. Fixes #1977 --- .../plugins/maxhit/calculators/MagicMaxHitCalculator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java index 8b14e3d988..c4b04eb4c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/maxhit/calculators/MagicMaxHitCalculator.java @@ -78,6 +78,10 @@ public double calculate() } SpellBaseDamageConfig autoCastSpell = SpellBaseDamageConfig.findSpellById(autoCastSpellId); + if (autoCastSpell == null) + { + return 0.0; + } spellBaseDamage = autoCastSpell.getBaseDamage(); } From 7902ce0fd96ead8ed7b3c4f6cf647a9bbb12a022 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:25:12 -0500 Subject: [PATCH 4/9] metronome: ensure tock is > 0 Fixes: #1973 --- .../client/plugins/metronome/MetronomePlugin.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java index bd19159ca6..1d3937ccfc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java @@ -26,20 +26,20 @@ package net.runelite.client.plugins.metronome; import com.google.inject.Provides; +import java.io.File; import java.io.IOException; import javax.inject.Inject; import javax.inject.Singleton; -import javax.sound.sampled.LineUnavailableException; -import javax.sound.sampled.UnsupportedAudioFileException; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.SoundEffectVolume; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.FloatControl; -import java.io.File; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.SoundEffectID; +import net.runelite.api.SoundEffectVolume; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; @@ -186,7 +186,7 @@ private void onGameTick(GameTick tick) if ((++tickCounter + this.tickOffset) % this.tickCount == 0) { - if (++tockCounter % this.tockNumber == 0 & this.enableTock) + if ((this.enableTock && this.tockNumber > 0) && ++tockCounter % this.tockNumber == 0) { if (tockClip == null) { From 82ac86944c7c03dd3abd59c10c6e2fd0bdd55e34 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:40:12 -0500 Subject: [PATCH 5/9] clanchat: check if clan is null Fixes #1959 --- .../net/runelite/client/plugins/clanchat/ClanChatPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index 88a0fcd871..50f7b2c5ec 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -64,6 +64,7 @@ import net.runelite.api.events.PlayerSpawned; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientStrChanged; +import net.runelite.api.util.Text; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetType; @@ -80,7 +81,6 @@ import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import net.runelite.api.util.Text; @PluginDescriptor( name = "Clan Chat", @@ -411,7 +411,8 @@ private void addActivityMessage(ClanMember member, ClanActivityType activityType ChatMessageBuilder message = new ChatMessageBuilder() .append("[") - .append(channelColor, client.getClanChatName()); + .append(channelColor, client.getClanChatName() == null ? "" : client.getClanChatName()); + if (rankIcon > -1) { message From 4114add235295354986b741dd40faffb7361e5ba Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:44:43 -0500 Subject: [PATCH 6/9] entityhider: null check values. Fixes #1966 --- .../client/plugins/entityhider/EntityHiderPlugin.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java index e3c4910283..7bf5cfc0b5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java @@ -90,13 +90,18 @@ public void onConfigChanged(ConfigChanged event) { updateConfig(); + if (event.getOldValue() == null || event.getNewValue() == null) + { + return; + } + if (event.getKey().equals("hideNPCsNames")) { List oldList = Text.fromCSV(event.getOldValue()); List newList = Text.fromCSV(event.getNewValue()); - ArrayList removed = oldList.stream().filter(s -> !newList.contains(s)).collect(Collectors.toCollection(ArrayList::new)); - ArrayList added = newList.stream().filter(s -> !oldList.contains(s)).collect(Collectors.toCollection(ArrayList::new)); + List removed = oldList.stream().filter(s -> !newList.contains(s)).collect(Collectors.toCollection(ArrayList::new)); + List added = newList.stream().filter(s -> !oldList.contains(s)).collect(Collectors.toCollection(ArrayList::new)); removed.forEach(client::removeHiddenNpcName); added.forEach(client::addHiddenNpcName); From c33f41e81aaec518ce6844cafabbbb25f48ac988 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:50:00 -0500 Subject: [PATCH 7/9] slayer: null check task Fixes #1974 --- .../java/net/runelite/client/plugins/slayer/SlayerPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index bff122edf1..3e3f57044f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -843,7 +843,7 @@ private void onConfigChanged(ConfigChanged event) @VisibleForTesting private void killedOne(int delta) { - if (currentTask.getAmount() == 0) + if (currentTask == null || currentTask.getAmount() == 0) { return; } From 653f9fe749f0cdfb9e0d03604a99f15cb4ff8966 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:53:38 -0500 Subject: [PATCH 8/9] chatfilter: Use concurrent list. Fixes #1982 --- .../client/plugins/chatfilter/ChatFilterPlugin.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java index 95adb9c4c6..1138e284a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterPlugin.java @@ -28,9 +28,9 @@ import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import com.google.inject.Provides; -import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -45,11 +45,11 @@ import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.OverheadTextChanged; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.util.Text; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.api.util.Text; import org.apache.commons.lang3.StringUtils; @PluginDescriptor( @@ -68,7 +68,7 @@ public class ChatFilterPlugin extends Plugin private static final String CENSOR_MESSAGE = "Hey, everyone, I just tried to say something very silly!"; private final CharMatcher jagexPrintableCharMatcher = Text.JAGEX_PRINTABLE_CHAR_MATCHER; - private final List filteredPatterns = new ArrayList<>(); + private final List filteredPatterns = new CopyOnWriteArrayList<>(); @Inject private Client client; From 805a4144c9fcb559c0757adce895f6ae23a8c939 Mon Sep 17 00:00:00 2001 From: Ganom Date: Sat, 9 Nov 2019 14:55:16 -0500 Subject: [PATCH 9/9] vorkath: null check vorkath Fixes #1983 --- .../net/runelite/client/plugins/vorkath/VorkathPlugin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java index de9324464f..f5565d7a96 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/vorkath/VorkathPlugin.java @@ -519,8 +519,14 @@ private void calculateWooxWalkPath() updateWooxWalkBar(); + if (client.getLocalPlayer() == null || vorkath.getVorkath() == null) + { + return; + } + final WorldPoint playerLoc = client.getLocalPlayer().getWorldLocation(); final WorldPoint vorkLoc = vorkath.getVorkath().getWorldLocation(); + final int maxX = vorkLoc.getX() + 14; final int minX = vorkLoc.getX() - 8; final int baseX = playerLoc.getX();