Merge remote-tracking branch 'runelite/master'
This commit is contained in:
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022, Jordan Atwood <nightfirecat@nightfirec.at>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package net.runelite.client.game;
|
||||||
|
|
||||||
|
import net.runelite.api.NPC;
|
||||||
|
import net.runelite.api.NpcID;
|
||||||
|
|
||||||
|
public class NpcUtil
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns whether an NPC is dying and can no longer be interacted with, or if it is still alive or in some special
|
||||||
|
* state where it can be 0hp without dying. (For example, Gargoyles and other slayer monsters with item weaknesses
|
||||||
|
* are not killed by reaching 0hp, so would not be dead based on that alone.)
|
||||||
|
*
|
||||||
|
* @param npc NPC to check whether it is dying
|
||||||
|
* @return {@code true} if the NPC is dying
|
||||||
|
*/
|
||||||
|
public static boolean isDying(final NPC npc)
|
||||||
|
{
|
||||||
|
final int id = npc.getId();
|
||||||
|
switch (id)
|
||||||
|
{
|
||||||
|
// These NPCs hit 0hp but don't actually die
|
||||||
|
case NpcID.GARGOYLE:
|
||||||
|
case NpcID.GARGOYLE_413:
|
||||||
|
case NpcID.GARGOYLE_1543:
|
||||||
|
case NpcID.MARBLE_GARGOYLE:
|
||||||
|
case NpcID.MARBLE_GARGOYLE_7408:
|
||||||
|
case NpcID.DAWN:
|
||||||
|
case NpcID.DAWN_7852:
|
||||||
|
case NpcID.DAWN_7853:
|
||||||
|
case NpcID.DAWN_7884:
|
||||||
|
case NpcID.DAWN_7885:
|
||||||
|
case NpcID.DUSK:
|
||||||
|
case NpcID.DUSK_7851:
|
||||||
|
case NpcID.DUSK_7854:
|
||||||
|
case NpcID.DUSK_7855:
|
||||||
|
case NpcID.DUSK_7882:
|
||||||
|
case NpcID.DUSK_7883:
|
||||||
|
case NpcID.DUSK_7886:
|
||||||
|
case NpcID.DUSK_7887:
|
||||||
|
case NpcID.DUSK_7888:
|
||||||
|
case NpcID.DUSK_7889:
|
||||||
|
case NpcID.ZYGOMITE:
|
||||||
|
case NpcID.ZYGOMITE_1024:
|
||||||
|
case NpcID.ANCIENT_ZYGOMITE:
|
||||||
|
case NpcID.ROCKSLUG:
|
||||||
|
case NpcID.ROCKSLUG_422:
|
||||||
|
case NpcID.DESERT_LIZARD:
|
||||||
|
case NpcID.DESERT_LIZARD_460:
|
||||||
|
case NpcID.DESERT_LIZARD_461:
|
||||||
|
case NpcID.GROWTHLING:
|
||||||
|
case NpcID.KALPHITE_QUEEN_963:
|
||||||
|
case NpcID.KALPHITE_QUEEN_965:
|
||||||
|
case NpcID.VETION:
|
||||||
|
case NpcID.VETION_REBORN:
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return npc.isDead();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,7 +43,9 @@ public class HighlightedNpc
|
|||||||
Color fillColor = new Color(0, 0, 0, 50);
|
Color fillColor = new Color(0, 0, 0, 50);
|
||||||
boolean hull;
|
boolean hull;
|
||||||
boolean tile;
|
boolean tile;
|
||||||
|
boolean trueTile;
|
||||||
boolean swTile;
|
boolean swTile;
|
||||||
|
boolean swTrueTile;
|
||||||
boolean outline;
|
boolean outline;
|
||||||
boolean name;
|
boolean name;
|
||||||
boolean nameOnMinimap;
|
boolean nameOnMinimap;
|
||||||
|
|||||||
@@ -103,7 +103,33 @@ class NpcOverlay extends Overlay
|
|||||||
renderPoly(graphics, borderColor, borderWidth, fillColor, tilePoly);
|
renderPoly(graphics, borderColor, borderWidth, fillColor, tilePoly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (highlightedNpc.isTrueTile())
|
||||||
|
{
|
||||||
|
LocalPoint lp = LocalPoint.fromWorld(client, actor.getWorldLocation()); // centered on sw tile
|
||||||
|
if (lp != null)
|
||||||
|
{
|
||||||
|
final int size = npcComposition.getSize();
|
||||||
|
final LocalPoint centerLp = new LocalPoint(
|
||||||
|
lp.getX() + Perspective.LOCAL_TILE_SIZE * (size - 1) / 2,
|
||||||
|
lp.getY() + Perspective.LOCAL_TILE_SIZE * (size - 1) / 2);
|
||||||
|
Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, centerLp, size);
|
||||||
|
renderPoly(graphics, borderColor, borderWidth, fillColor, tilePoly);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (highlightedNpc.isSwTile())
|
if (highlightedNpc.isSwTile())
|
||||||
|
{
|
||||||
|
int size = npcComposition.getSize();
|
||||||
|
LocalPoint lp = actor.getLocalLocation();
|
||||||
|
|
||||||
|
int x = lp.getX() - ((size - 1) * Perspective.LOCAL_TILE_SIZE / 2);
|
||||||
|
int y = lp.getY() - ((size - 1) * Perspective.LOCAL_TILE_SIZE / 2);
|
||||||
|
|
||||||
|
Polygon southWestTilePoly = Perspective.getCanvasTilePoly(client, new LocalPoint(x, y));
|
||||||
|
renderPoly(graphics, borderColor, borderWidth, fillColor, southWestTilePoly);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (highlightedNpc.isSwTrueTile())
|
||||||
{
|
{
|
||||||
LocalPoint lp = LocalPoint.fromWorld(client, actor.getWorldLocation());
|
LocalPoint lp = LocalPoint.fromWorld(client, actor.getWorldLocation());
|
||||||
if (lp != null)
|
if (lp != null)
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ public class PartyService
|
|||||||
eventBus.register(this);
|
eventBus.register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generatePasspharse()
|
public String generatePassphrase()
|
||||||
{
|
{
|
||||||
assert client.isClientThread();
|
assert client.isClientThread();
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import net.runelite.client.callback.Hooks;
|
|||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
import net.runelite.client.events.ConfigChanged;
|
import net.runelite.client.events.ConfigChanged;
|
||||||
|
import net.runelite.client.game.NpcUtil;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
|
|
||||||
@@ -190,7 +191,7 @@ public class EntityHiderPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// dead npcs can also be interacting so prioritize it over the interacting check
|
// dead npcs can also be interacting so prioritize it over the interacting check
|
||||||
if (npc.isDead() && hideDeadNpcs)
|
if (NpcUtil.isDying(npc) && hideDeadNpcs)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ public interface MenuEntrySwapperConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = -2,
|
position = -3,
|
||||||
keyName = "npcLeftClickCustomization",
|
keyName = "npcLeftClickCustomization",
|
||||||
name = "Customizable left-click",
|
name = "Customizable left-click",
|
||||||
description = "Allows customization of left-clicks on NPCs",
|
description = "Allows customization of left-clicks on NPCs",
|
||||||
@@ -162,6 +162,18 @@ public interface MenuEntrySwapperConfig extends Config
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = -2,
|
||||||
|
keyName = "npcShiftClickWalkHere",
|
||||||
|
name = "Shift click Walk here",
|
||||||
|
description = "Swaps Walk here on shift click on all NPCs",
|
||||||
|
section = npcSection
|
||||||
|
)
|
||||||
|
default boolean npcShiftClickWalkHere()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
keyName = "swapAdmire",
|
keyName = "swapAdmire",
|
||||||
name = "Admire",
|
name = "Admire",
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ import net.runelite.api.MenuAction;
|
|||||||
import net.runelite.api.MenuEntry;
|
import net.runelite.api.MenuEntry;
|
||||||
import net.runelite.api.NPC;
|
import net.runelite.api.NPC;
|
||||||
import net.runelite.api.NPCComposition;
|
import net.runelite.api.NPCComposition;
|
||||||
import net.runelite.api.NpcID;
|
|
||||||
import net.runelite.api.ObjectComposition;
|
import net.runelite.api.ObjectComposition;
|
||||||
import net.runelite.api.ParamID;
|
import net.runelite.api.ParamID;
|
||||||
import net.runelite.api.events.ClientTick;
|
import net.runelite.api.events.ClientTick;
|
||||||
@@ -74,6 +73,7 @@ import net.runelite.client.eventbus.Subscribe;
|
|||||||
import net.runelite.client.events.ConfigChanged;
|
import net.runelite.client.events.ConfigChanged;
|
||||||
import net.runelite.client.game.ItemManager;
|
import net.runelite.client.game.ItemManager;
|
||||||
import net.runelite.client.game.ItemVariationMapping;
|
import net.runelite.client.game.ItemVariationMapping;
|
||||||
|
import net.runelite.client.game.NpcUtil;
|
||||||
import net.runelite.client.menus.MenuManager;
|
import net.runelite.client.menus.MenuManager;
|
||||||
import net.runelite.client.menus.WidgetMenuOption;
|
import net.runelite.client.menus.WidgetMenuOption;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
@@ -1184,9 +1184,18 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
final NPC npc = menuEntry.getNpc();
|
final NPC npc = menuEntry.getNpc();
|
||||||
assert npc != null;
|
assert npc != null;
|
||||||
final NPCComposition composition = npc.getTransformedComposition();
|
final NPCComposition composition = npc.getTransformedComposition();
|
||||||
|
assert composition != null;
|
||||||
|
|
||||||
Integer customOption = getNpcSwapConfig(shiftModifier(), composition.getId());
|
Integer customOption = getNpcSwapConfig(shiftModifier(), composition.getId());
|
||||||
if (customOption != null)
|
if (customOption == null)
|
||||||
|
{
|
||||||
|
if (shiftModifier() && config.npcShiftClickWalkHere())
|
||||||
|
{
|
||||||
|
// we can achieve this by just deprioritizing the normal npc menus
|
||||||
|
menuEntry.setDeprioritized(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// Walk here swap
|
// Walk here swap
|
||||||
if (customOption == -1)
|
if (customOption == -1)
|
||||||
@@ -1276,33 +1285,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
.filter(e ->
|
.filter(e ->
|
||||||
{
|
{
|
||||||
final NPC npc = e.getNpc();
|
final NPC npc = e.getNpc();
|
||||||
if (npc == null)
|
return npc == null || !NpcUtil.isDying(npc);
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int id = npc.getId();
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
// These NPCs hit 0hp but don't actually die
|
|
||||||
case NpcID.GARGOYLE:
|
|
||||||
case NpcID.GARGOYLE_413:
|
|
||||||
case NpcID.GARGOYLE_1543:
|
|
||||||
case NpcID.ZYGOMITE:
|
|
||||||
case NpcID.ZYGOMITE_1024:
|
|
||||||
case NpcID.ANCIENT_ZYGOMITE:
|
|
||||||
case NpcID.ROCKSLUG:
|
|
||||||
case NpcID.ROCKSLUG_422:
|
|
||||||
case NpcID.DESERT_LIZARD:
|
|
||||||
case NpcID.DESERT_LIZARD_460:
|
|
||||||
case NpcID.DESERT_LIZARD_461:
|
|
||||||
case NpcID.ICE_DEMON:
|
|
||||||
case NpcID.ICE_DEMON_7585:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return !npc.isDead();
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.toArray(MenuEntry[]::new);
|
.toArray(MenuEntry[]::new);
|
||||||
if (oldEntries.length != newEntries.length)
|
if (oldEntries.length != newEntries.length)
|
||||||
@@ -1401,11 +1384,11 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
// Item op4 and op5 are CC_OP_LOW_PRIORITY so they get added underneath Use,
|
// Item op4 and op5 are CC_OP_LOW_PRIORITY so they get added underneath Use,
|
||||||
// but this also causes them to get sorted after client tick. Change them to
|
// but this also causes them to get sorted after client tick. Change them to
|
||||||
// CC_OP to avoid this.
|
// CC_OP to avoid this.
|
||||||
if (entry1.isItemOp() && entry1.getType() == MenuAction.CC_OP_LOW_PRIORITY)
|
if (entry1.getType() == MenuAction.CC_OP_LOW_PRIORITY)
|
||||||
{
|
{
|
||||||
entry1.setType(MenuAction.CC_OP);
|
entry1.setType(MenuAction.CC_OP);
|
||||||
}
|
}
|
||||||
if (entry2.isItemOp() && entry2.getType() == MenuAction.CC_OP_LOW_PRIORITY)
|
if (entry2.getType() == MenuAction.CC_OP_LOW_PRIORITY)
|
||||||
{
|
{
|
||||||
entry2.setType(MenuAction.CC_OP);
|
entry2.setType(MenuAction.CC_OP);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,18 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 2,
|
position = 2,
|
||||||
|
keyName = "highlightTrueTile",
|
||||||
|
name = "Highlight true tile",
|
||||||
|
description = "Configures whether or not NPC should be highlighted by true tile",
|
||||||
|
section = renderStyleSection
|
||||||
|
)
|
||||||
|
default boolean highlightTrueTile()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 3,
|
||||||
keyName = "highlightSouthWestTile",
|
keyName = "highlightSouthWestTile",
|
||||||
name = "Highlight south west tile",
|
name = "Highlight south west tile",
|
||||||
description = "Configures whether or not NPC should be highlighted by south western tile",
|
description = "Configures whether or not NPC should be highlighted by south western tile",
|
||||||
@@ -79,7 +91,19 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 3,
|
position = 4,
|
||||||
|
keyName = "highlightSouthWestTrueTile",
|
||||||
|
name = "Highlight south west true tile",
|
||||||
|
description = "Configures whether or not NPC should be highlighted by south western true tile",
|
||||||
|
section = renderStyleSection
|
||||||
|
)
|
||||||
|
default boolean highlightSouthWestTrueTile()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 5,
|
||||||
keyName = "highlightOutline",
|
keyName = "highlightOutline",
|
||||||
name = "Highlight outline",
|
name = "Highlight outline",
|
||||||
description = "Configures whether or not the model of the NPC should be highlighted by outline",
|
description = "Configures whether or not the model of the NPC should be highlighted by outline",
|
||||||
@@ -92,7 +116,7 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
|
|
||||||
@Alpha
|
@Alpha
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 4,
|
position = 10,
|
||||||
keyName = "npcColor",
|
keyName = "npcColor",
|
||||||
name = "Highlight Color",
|
name = "Highlight Color",
|
||||||
description = "Color of the NPC highlight border, menu, and text",
|
description = "Color of the NPC highlight border, menu, and text",
|
||||||
@@ -105,7 +129,7 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
|
|
||||||
@Alpha
|
@Alpha
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 5,
|
position = 11,
|
||||||
keyName = "fillColor",
|
keyName = "fillColor",
|
||||||
name = "Fill Color",
|
name = "Fill Color",
|
||||||
description = "Color of the NPC highlight fill",
|
description = "Color of the NPC highlight fill",
|
||||||
@@ -117,7 +141,7 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 6,
|
position = 12,
|
||||||
keyName = "borderWidth",
|
keyName = "borderWidth",
|
||||||
name = "Border Width",
|
name = "Border Width",
|
||||||
description = "Width of the highlighted NPC border",
|
description = "Width of the highlighted NPC border",
|
||||||
@@ -129,7 +153,7 @@ public interface NpcIndicatorsConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 7,
|
position = 13,
|
||||||
keyName = "outlineFeather",
|
keyName = "outlineFeather",
|
||||||
name = "Outline feather",
|
name = "Outline feather",
|
||||||
description = "Specify between 0-4 how much of the model outline should be faded",
|
description = "Specify between 0-4 how much of the model outline should be faded",
|
||||||
|
|||||||
@@ -660,7 +660,9 @@ public class NpcIndicatorsPlugin extends Plugin
|
|||||||
.fillColor(config.fillColor())
|
.fillColor(config.fillColor())
|
||||||
.hull(config.highlightHull())
|
.hull(config.highlightHull())
|
||||||
.tile(config.highlightTile())
|
.tile(config.highlightTile())
|
||||||
|
.trueTile(config.highlightTrueTile())
|
||||||
.swTile(config.highlightSouthWestTile())
|
.swTile(config.highlightSouthWestTile())
|
||||||
|
.swTrueTile(config.highlightSouthWestTrueTile())
|
||||||
.outline(config.highlightOutline())
|
.outline(config.highlightOutline())
|
||||||
.name(config.drawNames())
|
.name(config.drawNames())
|
||||||
.nameOnMinimap(config.drawMinimapNames())
|
.nameOnMinimap(config.drawMinimapNames())
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ class PartyPanel extends PluginPanel
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Create party
|
// Create party
|
||||||
clientThread.invokeLater(() -> party.changeParty(party.generatePasspharse()));
|
clientThread.invokeLater(() -> party.changeParty(party.generatePassphrase()));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user