├── README.md ├── fightcave ├── JadAttack.java ├── FightCavePlugin.java └── FightCaveOverlay.java ├── zulrah ├── ZulrahConfig.java ├── ZulrahOverlay.java ├── ZulrahJadOverlay.java ├── ZulrahTileOverlay.java └── ZulrahPlugin.java ├── hydra ├── HydraConfig.java ├── HydraIndicatorOverlay.java ├── HydraOverlay.java ├── HydraPlugin.java └── HydraPrayOverlay.java ├── clanmanmode ├── ClanManModeTileOverlay.java ├── ClanManModeMinimapOverlay.java ├── ClanManModeOverlay.java ├── ClanManModePlugin.java ├── ClanManModeConfig.java └── ClanManModeService.java └── freezetimers ├── FreezeTimersTileOverlay.java ├── FreezeTimersConfig.java ├── FreezeTimersService.java ├── FreezeTimersOverlay.java └── FreezeTimersPlugin.java /README.md: -------------------------------------------------------------------------------- 1 | # RuneLitePlusPlus [DEPRECATED] 2 | 3 | This project is no longer supported. Anyone is allowed to take the plugins made by this client and use / modify them. 4 | -------------------------------------------------------------------------------- /fightcave/JadAttack.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.fightcave; 2 | 3 | import net.runelite.api.AnimationID; 4 | import net.runelite.api.Prayer; 5 | 6 | public enum JadAttack 7 | { 8 | MAGIC(AnimationID.TZTOK_JAD_MAGIC_ATTACK, Prayer.PROTECT_FROM_MAGIC), 9 | RANGE(AnimationID.TZTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES); 10 | 11 | private final int animation; 12 | private final Prayer prayer; 13 | 14 | JadAttack(int animation, Prayer prayer) 15 | { 16 | this.animation = animation; 17 | this.prayer = prayer; 18 | } 19 | 20 | public int getAnimation() 21 | { 22 | return animation; 23 | } 24 | 25 | public Prayer getPrayer() 26 | { 27 | return prayer; 28 | } 29 | } -------------------------------------------------------------------------------- /zulrah/ZulrahConfig.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.zulrah; 2 | 3 | import net.runelite.client.config.Config; 4 | import net.runelite.client.config.ConfigGroup; 5 | import net.runelite.client.config.ConfigItem; 6 | 7 | @ConfigGroup("zulrah") 8 | public interface ZulrahConfig extends Config { 9 | @ConfigItem( 10 | position = 0, 11 | keyName = "zulrahenable", 12 | name = "Enable Zulrah Helper", 13 | description = "Configures whether or not to enable Zulrah Helper." 14 | ) 15 | default boolean EnableZulrah() { return true; } 16 | 17 | @ConfigItem( 18 | position = 1, 19 | keyName = "zulrahprayenable", 20 | name = "Show Prayer Helper", 21 | description = "Configures whether or not to show when to pray at Zulrah." 22 | ) 23 | default boolean EnableZulrahPrayerHelper() { return true; } 24 | 25 | @ConfigItem( 26 | position = 2, 27 | keyName = "jadphasehelper", 28 | name = "Jad Phase Helper", 29 | description = "Tells you what to pray against Zulrah jad phase" 30 | ) 31 | default boolean ZulrahJadHelper() { return true; } 32 | } 33 | -------------------------------------------------------------------------------- /hydra/HydraConfig.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.hydra; 2 | 3 | import net.runelite.client.config.Config; 4 | import net.runelite.client.config.ConfigGroup; 5 | import net.runelite.client.config.ConfigItem; 6 | 7 | @ConfigGroup("hydra") 8 | public interface HydraConfig extends Config { 9 | @ConfigItem( 10 | position = 0, 11 | keyName = "hydraenable", 12 | name = "Enable Hydra (194 cb) Helper", 13 | description = "Configures whether or not to enable Hydra Helper. (For use on regular hydra's only, will not work with Alchemical Hydra)." 14 | ) 15 | default boolean EnableHydra() { return true; } 16 | 17 | @ConfigItem( 18 | position = 1, 19 | keyName = "textindicators", 20 | name = "Text Indicator", 21 | description = "Configures if text indicator is shown above hydra's or not." 22 | ) 23 | default boolean TextIndicator() { return true; } 24 | 25 | @ConfigItem( 26 | position = 2, 27 | keyName = "countersize", 28 | name = "Bold indicator", 29 | description = "Configures if text indicator is bold or not." 30 | ) 31 | default boolean BoldText() { return false; } 32 | 33 | @ConfigItem( 34 | position = 3, 35 | keyName = "prayerhelper", 36 | name = "Prayer Helper", 37 | description = "Configures if prayer helper is shown or not." 38 | ) 39 | default boolean PrayerHelper() { return true; } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /clanmanmode/ClanManModeTileOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import java.awt.Dimension; 4 | import java.awt.Graphics2D; 5 | import java.awt.Polygon; 6 | import javax.inject.Inject; 7 | import net.runelite.client.ui.overlay.Overlay; 8 | import net.runelite.client.ui.overlay.OverlayLayer; 9 | import net.runelite.client.ui.overlay.OverlayPosition; 10 | import net.runelite.client.ui.overlay.OverlayPriority; 11 | import net.runelite.client.ui.overlay.OverlayUtil; 12 | 13 | public class ClanManModeTileOverlay extends Overlay 14 | { 15 | private final ClanManModeService ClanManModeService; 16 | private final ClanManModeConfig config; 17 | 18 | @Inject 19 | private ClanManModeTileOverlay(ClanManModeConfig config, ClanManModeService ClanManModeService) 20 | { 21 | this.config = config; 22 | this.ClanManModeService = ClanManModeService; 23 | setLayer(OverlayLayer.ABOVE_SCENE); 24 | setPosition(OverlayPosition.DYNAMIC); 25 | setPriority(OverlayPriority.MED); 26 | } 27 | 28 | @Override 29 | public Dimension render(Graphics2D graphics) 30 | { 31 | if (!config.drawTiles()) 32 | { 33 | return null; 34 | } 35 | 36 | ClanManModeService.forEachPlayer((player, color) -> 37 | { 38 | final Polygon poly = player.getCanvasTilePoly(); 39 | 40 | if (poly != null) 41 | { 42 | OverlayUtil.renderPolygon(graphics, poly, color); 43 | } 44 | }); 45 | 46 | return null; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /freezetimers/FreezeTimersTileOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.freezetimers; 2 | 3 | import java.awt.Dimension; 4 | import java.awt.Graphics2D; 5 | import java.awt.Polygon; 6 | import javax.inject.Inject; 7 | import net.runelite.client.ui.overlay.Overlay; 8 | import net.runelite.client.ui.overlay.OverlayLayer; 9 | import net.runelite.client.ui.overlay.OverlayPosition; 10 | import net.runelite.client.ui.overlay.OverlayPriority; 11 | import net.runelite.client.ui.overlay.OverlayUtil; 12 | 13 | public class FreezeTimersTileOverlay extends Overlay 14 | { 15 | private final FreezeTimersService FreezeTimersService; 16 | private final FreezeTimersConfig config; 17 | 18 | @Inject 19 | private FreezeTimersTileOverlay(FreezeTimersConfig config, FreezeTimersService FreezeTimersService) 20 | { 21 | this.config = config; 22 | this.FreezeTimersService = FreezeTimersService; 23 | setLayer(OverlayLayer.ABOVE_SCENE); 24 | setPosition(OverlayPosition.DYNAMIC); 25 | setPriority(OverlayPriority.MED); 26 | } 27 | 28 | @Override 29 | public Dimension render(Graphics2D graphics) 30 | { 31 | if (!config.drawTiles()) 32 | { 33 | return null; 34 | } 35 | 36 | FreezeTimersService.forEachPlayer((player, color) -> 37 | { 38 | final Polygon poly = player.getCanvasTilePoly(); 39 | 40 | if (poly != null) 41 | { 42 | OverlayUtil.renderPolygon(graphics, poly, color); 43 | } 44 | }); 45 | 46 | return null; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /clanmanmode/ClanManModeMinimapOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import java.awt.Graphics2D; 6 | import javax.inject.Inject; 7 | import javax.inject.Singleton; 8 | import net.runelite.api.Player; 9 | import net.runelite.client.ui.overlay.Overlay; 10 | import net.runelite.client.ui.overlay.OverlayLayer; 11 | import net.runelite.client.ui.overlay.OverlayPosition; 12 | import net.runelite.client.ui.overlay.OverlayPriority; 13 | import net.runelite.client.ui.overlay.OverlayUtil; 14 | 15 | @Singleton 16 | public class ClanManModeMinimapOverlay extends Overlay 17 | { 18 | private final ClanManModeService ClanManModeService; 19 | private final ClanManModeConfig config; 20 | 21 | @Inject 22 | private ClanManModeMinimapOverlay(ClanManModeConfig config, ClanManModeService ClanManModeService) 23 | { 24 | this.config = config; 25 | this.ClanManModeService = ClanManModeService; 26 | setLayer(OverlayLayer.ABOVE_WIDGETS); 27 | setPosition(OverlayPosition.DYNAMIC); 28 | setPriority(OverlayPriority.HIGH); 29 | } 30 | 31 | @Override 32 | public Dimension render(Graphics2D graphics) 33 | { 34 | ClanManModeService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); 35 | return null; 36 | } 37 | 38 | private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) 39 | { 40 | final String name = actor.getName().replace('\u00A0', ' '); 41 | 42 | if (config.drawMinimapNames()) 43 | { 44 | final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); 45 | 46 | if (minimapLocation != null) 47 | { 48 | OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color); 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /freezetimers/FreezeTimersConfig.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.freezetimers; 2 | 3 | import java.awt.Color; 4 | import net.runelite.client.config.Config; 5 | import net.runelite.client.config.ConfigGroup; 6 | import net.runelite.client.config.ConfigItem; 7 | 8 | @ConfigGroup("freezetimers") 9 | public interface FreezeTimersConfig extends Config { 10 | @ConfigItem( 11 | position = 0, 12 | keyName = "freezeenable", 13 | name = "Enable PvP freeze timers", 14 | description = "Configures whether or not to show freeze timers." 15 | ) 16 | default boolean EnableFreezeTimers() { return false; } 17 | 18 | @ConfigItem( 19 | position = 1, 20 | keyName = "tilehighlight", 21 | name = "Frozen opponent tile highlighting", 22 | description = "Configures whether or not to highlight tiles frozen opponents are standing on." 23 | ) 24 | default boolean drawTiles() { return false; } 25 | 26 | @ConfigItem( 27 | position = 2, 28 | keyName = "timercolor", 29 | name = "Freeze Timer Color", 30 | description = "Color of freeze timer" 31 | ) 32 | default Color FreezeTimerColor() { 33 | return new Color(0, 184, 212); 34 | } 35 | 36 | @ConfigItem( 37 | position = 3, 38 | keyName = "timerpos", 39 | name = "Freeze Timer Position", 40 | description = "Position of freeze timer" 41 | ) 42 | default int FreezeTimerPos() { return 80; } 43 | 44 | @ConfigItem( 45 | position = 4, 46 | keyName = "timerfont", 47 | name = "Bold Freeze Timer", 48 | description = "Bold font or not" 49 | ) 50 | default boolean BoldFont() { return false; } 51 | 52 | @ConfigItem( 53 | position = 5, 54 | keyName = "tbtimer", 55 | name = "Tele Block Timer", 56 | description = "Enables tele block timer" 57 | ) 58 | default boolean TBTimer() { return true; } 59 | } 60 | -------------------------------------------------------------------------------- /hydra/HydraIndicatorOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.hydra; 2 | 3 | import java.awt.*; 4 | import java.awt.image.BufferedImage; 5 | import javax.inject.Inject; 6 | 7 | import net.runelite.api.*; 8 | import net.runelite.api.Point; 9 | import net.runelite.client.game.SpriteManager; 10 | import net.runelite.client.ui.overlay.*; 11 | import net.runelite.client.ui.overlay.components.ComponentConstants; 12 | import net.runelite.client.ui.overlay.components.ImageComponent; 13 | import net.runelite.client.ui.overlay.components.LineComponent; 14 | import net.runelite.client.ui.overlay.components.PanelComponent; 15 | 16 | import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; 17 | import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; 18 | 19 | public class HydraIndicatorOverlay extends Overlay { 20 | private final HydraConfig config; 21 | private final HydraPlugin plugin; 22 | 23 | private final PanelComponent panelComponent = new PanelComponent(); 24 | 25 | @Inject 26 | private HydraIndicatorOverlay(HydraConfig config, HydraPlugin plugin) { 27 | this.config = config; 28 | this.plugin = plugin; 29 | setPosition(OverlayPosition.BOTTOM_RIGHT); 30 | setPriority(OverlayPriority.MED); 31 | panelComponent.setPreferredSize(new Dimension(14, 0)); 32 | } 33 | 34 | @Override 35 | public Dimension render(Graphics2D graphics) { 36 | if (!config.PrayerHelper()) { 37 | return null; 38 | } 39 | 40 | if (plugin.Hydra != null) { 41 | if (plugin.hydras.containsKey(plugin.Hydra.getIndex())) { 42 | int val = plugin.hydras.get(plugin.Hydra.getIndex()); 43 | if (val != 0) { 44 | panelComponent.getChildren().clear(); 45 | panelComponent.getChildren().add(LineComponent.builder().right(Integer.toString(val)).build()); 46 | return panelComponent.render(graphics); 47 | } 48 | } 49 | } 50 | return null; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /clanmanmode/ClanManModeOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import java.awt.Graphics2D; 6 | import java.awt.image.BufferedImage; 7 | import javax.inject.Inject; 8 | import javax.inject.Singleton; 9 | import net.runelite.api.ClanMemberRank; 10 | import net.runelite.api.Player; 11 | import net.runelite.api.Point; 12 | import net.runelite.client.game.ClanManager; 13 | import net.runelite.client.ui.FontManager; 14 | import net.runelite.client.ui.overlay.Overlay; 15 | import net.runelite.client.ui.overlay.OverlayPosition; 16 | import net.runelite.client.ui.overlay.OverlayPriority; 17 | import net.runelite.client.ui.overlay.OverlayUtil; 18 | 19 | @Singleton 20 | public class ClanManModeOverlay extends Overlay 21 | { 22 | private final ClanManModeService ClanManModeService; 23 | private final ClanManModeConfig config; 24 | private final ClanManager clanManager; 25 | 26 | @Inject 27 | private ClanManModeOverlay(ClanManModeConfig config, ClanManModeService ClanManModeService, 28 | ClanManager clanManager) 29 | { 30 | this.config = config; 31 | this.ClanManModeService = ClanManModeService; 32 | this.clanManager = clanManager; 33 | setPosition(OverlayPosition.DYNAMIC); 34 | setPriority(OverlayPriority.MED); 35 | } 36 | 37 | @Override 38 | public Dimension render(Graphics2D graphics) 39 | { 40 | ClanManModeService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); 41 | return null; 42 | } 43 | 44 | private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) 45 | { 46 | if (!config.drawOverheadPlayerNames()) 47 | { 48 | return; 49 | } 50 | 51 | String name = actor.getName().replace('\u00A0', ' '); 52 | int offset = actor.getLogicalHeight() + 40; 53 | Point textLocation = actor.getCanvasTextLocation(graphics, name, offset); 54 | 55 | if (textLocation != null) 56 | { 57 | if (config.getClanAttackableColor().equals(color) && config.ShowBold()) { 58 | graphics.setFont(FontManager.getRunescapeBoldFont()); 59 | } 60 | OverlayUtil.renderTextLocation(graphics, textLocation, name, color); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /fightcave/FightCavePlugin.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.fightcave; 2 | 3 | import javax.annotation.Nullable; 4 | import javax.inject.Inject; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import net.runelite.api.NPC; 8 | import net.runelite.api.NpcID; 9 | import net.runelite.api.events.AnimationChanged; 10 | import net.runelite.api.events.NpcDespawned; 11 | import net.runelite.api.events.NpcSpawned; 12 | import net.runelite.client.eventbus.Subscribe; 13 | import net.runelite.client.plugins.Plugin; 14 | import net.runelite.client.plugins.PluginDescriptor; 15 | import net.runelite.client.ui.overlay.OverlayManager; 16 | 17 | @PluginDescriptor( 18 | name = "Fight Cave", 19 | description = "Show what to pray against Jad", 20 | tags = {"bosses", "combat", "minigame", "overlay", "prayer", "pve", "pvm"} 21 | ) 22 | public class FightCavePlugin extends Plugin 23 | { 24 | @Inject 25 | private OverlayManager overlayManager; 26 | 27 | @Inject 28 | private FightCaveOverlay overlay; 29 | 30 | @Getter(AccessLevel.PACKAGE) 31 | @Nullable 32 | private JadAttack attack; 33 | 34 | private NPC jad; 35 | 36 | @Override 37 | protected void startUp() throws Exception 38 | { 39 | overlayManager.add(overlay); 40 | } 41 | 42 | @Override 43 | protected void shutDown() throws Exception 44 | { 45 | overlayManager.remove(overlay); 46 | jad = null; 47 | attack = null; 48 | } 49 | 50 | @Subscribe 51 | public void onNpcSpawned(final NpcSpawned event) 52 | { 53 | final int id = event.getNpc().getId(); 54 | 55 | if (id == NpcID.TZTOKJAD || id == NpcID.TZTOKJAD_6506) 56 | { 57 | jad = event.getNpc(); 58 | } 59 | } 60 | 61 | @Subscribe 62 | public void onNpcDespawned(final NpcDespawned event) 63 | { 64 | if (jad == event.getNpc()) 65 | { 66 | jad = null; 67 | attack = null; 68 | } 69 | } 70 | 71 | @Subscribe 72 | public void onAnimationChanged(final AnimationChanged event) 73 | { 74 | if (event.getActor() != jad) 75 | { 76 | return; 77 | } 78 | 79 | if (jad.getAnimation() == JadAttack.MAGIC.getAnimation()) 80 | { 81 | attack = JadAttack.MAGIC; 82 | } 83 | else if (jad.getAnimation() == JadAttack.RANGE.getAnimation()) 84 | { 85 | attack = JadAttack.RANGE; 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /fightcave/FightCaveOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.fightcave; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import java.awt.Graphics2D; 6 | import java.awt.image.BufferedImage; 7 | import javax.inject.Inject; 8 | import net.runelite.api.Client; 9 | import net.runelite.api.SpriteID; 10 | import net.runelite.client.game.SpriteManager; 11 | import net.runelite.client.ui.overlay.Overlay; 12 | import net.runelite.client.ui.overlay.OverlayPosition; 13 | import net.runelite.client.ui.overlay.OverlayPriority; 14 | import net.runelite.client.ui.overlay.components.ComponentConstants; 15 | import net.runelite.client.ui.overlay.components.ImageComponent; 16 | import net.runelite.client.ui.overlay.components.PanelComponent; 17 | 18 | public class FightCaveOverlay extends Overlay 19 | { 20 | private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); 21 | 22 | private final Client client; 23 | private final FightCavePlugin plugin; 24 | private final SpriteManager spriteManager; 25 | private final PanelComponent imagePanelComponent = new PanelComponent(); 26 | 27 | @Inject 28 | private FightCaveOverlay(Client client, FightCavePlugin plugin, SpriteManager spriteManager) 29 | { 30 | setPosition(OverlayPosition.BOTTOM_RIGHT); 31 | setPriority(OverlayPriority.HIGH); 32 | this.client = client; 33 | this.plugin = plugin; 34 | this.spriteManager = spriteManager; 35 | } 36 | 37 | @Override 38 | public Dimension render(Graphics2D graphics) 39 | { 40 | final JadAttack attack = plugin.getAttack(); 41 | 42 | if (attack == null) 43 | { 44 | return null; 45 | } 46 | 47 | final BufferedImage prayerImage = getPrayerImage(attack); 48 | 49 | imagePanelComponent.getChildren().clear(); 50 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 51 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(attack.getPrayer()) 52 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 53 | : NOT_ACTIVATED_BACKGROUND_COLOR); 54 | 55 | return imagePanelComponent.render(graphics); 56 | } 57 | 58 | private BufferedImage getPrayerImage(JadAttack attack) 59 | { 60 | final int prayerSpriteID = attack == JadAttack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES; 61 | return spriteManager.getSprite(prayerSpriteID, 0); 62 | } 63 | } -------------------------------------------------------------------------------- /freezetimers/FreezeTimersService.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.freezetimers; 2 | 3 | import java.awt.Color; 4 | import java.util.function.BiConsumer; 5 | import javax.inject.Inject; 6 | import javax.inject.Singleton; 7 | import net.runelite.api.Client; 8 | import net.runelite.api.Player; 9 | import net.runelite.api.coords.WorldPoint; 10 | 11 | 12 | @Singleton 13 | public class FreezeTimersService 14 | { 15 | private final Client client; 16 | private final FreezeTimersConfig config; 17 | private final FreezeTimersPlugin plugin; 18 | 19 | @Inject 20 | private FreezeTimersService(Client client, FreezeTimersConfig config, FreezeTimersPlugin plugin) 21 | { 22 | this.config = config; 23 | this.plugin = plugin; 24 | this.client = client; 25 | } 26 | 27 | public void forEachPlayer(final BiConsumer consumer) 28 | { 29 | 30 | for (Player player : client.getPlayers()) 31 | { 32 | if (player == null || player.getName() == null) 33 | { 34 | continue; 35 | } 36 | 37 | String name = player.getName(); 38 | int freezetype = plugin.freezetype(name); 39 | long dtime = plugin.opponentfreezetime(name); 40 | long tbed = plugin.istbed(name); 41 | int freezetime = 0; 42 | if (freezetype == 1 || freezetype == 4) { 43 | freezetime = 5000; 44 | } else if (freezetype == 2 || freezetype == 5) { 45 | freezetime = 10000; 46 | } else if (freezetype == 3 || freezetype == 6) { 47 | freezetime = 15000; 48 | } else if (freezetype == 7) { 49 | freezetime = 20000; 50 | } else if (freezetype == 8) { 51 | freezetime = 2500; 52 | } else if (freezetype == 9) { 53 | freezetime = 5000; 54 | } else if (freezetype == 10) { 55 | freezetime = 7500; 56 | } 57 | if (dtime > 0) { 58 | long currenttime = System.currentTimeMillis(); 59 | long timediff = currenttime - dtime; 60 | if (timediff < freezetime) { 61 | WorldPoint currentWorldPoint = player.getWorldLocation(); 62 | WorldPoint lastWorldPoint = plugin.playerpos(name); 63 | if (currentWorldPoint.equals(lastWorldPoint)) { 64 | consumer.accept(player, config.FreezeTimerColor()); 65 | return; 66 | } else { 67 | if (timediff < 605) { 68 | plugin.updatepos(name, currentWorldPoint); 69 | consumer.accept(player, config.FreezeTimerColor()); 70 | return; 71 | } else { 72 | plugin.deleteopponent(name); 73 | } 74 | } 75 | } else { 76 | if (timediff < freezetime + 3000) { 77 | consumer.accept(player, Color.YELLOW); 78 | return; 79 | } else { 80 | plugin.deleteopponent(name); 81 | } 82 | } 83 | } 84 | if (tbed > 0) { 85 | consumer.accept(player, config.FreezeTimerColor()); 86 | return; 87 | } 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /zulrah/ZulrahOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.zulrah; 2 | 3 | import java.awt.*; 4 | import javax.inject.Inject; 5 | 6 | import net.runelite.api.*; 7 | import net.runelite.client.ui.overlay.Overlay; 8 | import net.runelite.client.ui.overlay.OverlayLayer; 9 | import net.runelite.client.ui.overlay.OverlayPosition; 10 | import net.runelite.client.ui.overlay.OverlayPriority; 11 | import net.runelite.client.ui.overlay.components.PanelComponent; 12 | import net.runelite.client.ui.overlay.components.TitleComponent; 13 | 14 | public class ZulrahOverlay extends Overlay { 15 | private final ZulrahConfig config; 16 | private final ZulrahPlugin plugin; 17 | private final PanelComponent panelComponent = new PanelComponent(); 18 | 19 | 20 | @Inject 21 | private Client client; 22 | 23 | @Inject 24 | private ZulrahOverlay(ZulrahConfig config, ZulrahPlugin plugin) { 25 | this.config = config; 26 | this.plugin = plugin; 27 | setLayer(OverlayLayer.ABOVE_SCENE); 28 | setPosition(OverlayPosition.DYNAMIC); 29 | setPriority(OverlayPriority.MED); 30 | panelComponent.setPreferredSize(new Dimension(150, 0)); 31 | } 32 | 33 | @Override 34 | public Dimension render(Graphics2D graphics) { 35 | if (!config.EnableZulrahPrayerHelper()) { 36 | return null; 37 | } 38 | NPC Zulrah = plugin.Zulrah; 39 | if (Zulrah != null) { 40 | if (plugin.prayerconserve && plugin.nextprayerendticks == 0) { 41 | Player player = client.getLocalPlayer(); 42 | HeadIcon icon = player.getOverheadIcon(); 43 | if (icon != null) { 44 | final String text = "Disable Overhead Prayer"; 45 | final int textWidth = graphics.getFontMetrics().stringWidth(text); 46 | final int textHeight = graphics.getFontMetrics().getAscent() - graphics.getFontMetrics().getDescent(); 47 | final int width = (int) client.getRealDimensions().getWidth(); 48 | java.awt.Point jpoint = new java.awt.Point((width / 2) - textWidth, textHeight + 75); 49 | panelComponent.getChildren().clear(); 50 | panelComponent.getChildren().add(TitleComponent.builder().text(text).color(Color.RED).build()); 51 | panelComponent.setPreferredLocation(jpoint); 52 | panelComponent.render(graphics); 53 | } 54 | } else if (plugin.nextprayerendticks != 0) { 55 | Player player = client.getLocalPlayer(); 56 | HeadIcon icon = player.getOverheadIcon(); 57 | if (icon == null) { 58 | final String text = "Protect from MAGIC: " + (plugin.nextprayerendticks - plugin.ticks); 59 | final int textWidth = graphics.getFontMetrics().stringWidth(text); 60 | final int textHeight = graphics.getFontMetrics().getAscent() - graphics.getFontMetrics().getDescent(); 61 | final int width = (int) client.getRealDimensions().getWidth(); 62 | java.awt.Point jpoint = new java.awt.Point((width / 2) - textWidth, textHeight + 75); 63 | panelComponent.getChildren().clear(); 64 | panelComponent.getChildren().add(TitleComponent.builder().text(text).color(Color.GREEN).build()); 65 | panelComponent.setPreferredLocation(jpoint); 66 | panelComponent.render(graphics); 67 | } 68 | } 69 | } 70 | return null; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /hydra/HydraOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.hydra; 2 | 3 | import java.awt.*; 4 | import javax.inject.Inject; 5 | 6 | import net.runelite.api.*; 7 | import net.runelite.api.Point; 8 | import net.runelite.client.ui.FontManager; 9 | import net.runelite.client.ui.overlay.*; 10 | import net.runelite.client.ui.overlay.components.PanelComponent; 11 | 12 | public class HydraOverlay extends Overlay { 13 | private final HydraConfig config; 14 | private final HydraPlugin plugin; 15 | private final PanelComponent panelComponent = new PanelComponent(); 16 | 17 | 18 | @Inject 19 | private Client client; 20 | 21 | @Inject 22 | private HydraOverlay(HydraConfig config, HydraPlugin plugin) { 23 | this.config = config; 24 | this.plugin = plugin; 25 | setLayer(OverlayLayer.ABOVE_SCENE); 26 | setPosition(OverlayPosition.DYNAMIC); 27 | setPriority(OverlayPriority.MED); 28 | panelComponent.setPreferredSize(new Dimension(150, 0)); 29 | } 30 | 31 | @Override 32 | public Dimension render(Graphics2D graphics) { 33 | if (!config.TextIndicator()) { 34 | return null; 35 | } 36 | 37 | for (NPC hydra : client.getNpcs()) { 38 | if (hydra == null || hydra.getName() == null) { 39 | continue; 40 | } 41 | if (hydra.getName().equalsIgnoreCase("Hydra")) { 42 | if (plugin.hydras.containsKey(hydra.getIndex())) { 43 | int val = plugin.hydras.get(hydra.getIndex()); 44 | if (val != 0) { 45 | if (config.BoldText()) { 46 | graphics.setFont(FontManager.getRunescapeBoldFont()); 47 | } 48 | if (plugin.hydraattacks.containsKey(hydra.getIndex())) { 49 | int attack = plugin.hydraattacks.get(hydra.getIndex()); 50 | if (attack == 8261) { 51 | if (val == 3) { 52 | OverlayUtil.renderTextLocation(graphics, hydra.getCanvasTextLocation(graphics, "MAGE", hydra.getLogicalHeight() + 100), "MAGE", Color.BLUE); 53 | } else { 54 | OverlayUtil.renderTextLocation(graphics, hydra.getCanvasTextLocation(graphics, "RANGE", hydra.getLogicalHeight() + 100), "RANGE", Color.GREEN); 55 | } 56 | } else if (attack == 8262) { 57 | if (val == 3) { 58 | OverlayUtil.renderTextLocation(graphics, hydra.getCanvasTextLocation(graphics, "RANGE", hydra.getLogicalHeight() + 100), "RANGE", Color.GREEN); 59 | } else { 60 | OverlayUtil.renderTextLocation(graphics, hydra.getCanvasTextLocation(graphics, "MAGE", hydra.getLogicalHeight() + 100), "MAGE", Color.BLUE); 61 | } 62 | } 63 | } 64 | Point runelitepleaseexplainwhyineedtocheckthisfornullinsteadoftheentirehydravariablethisshitcostmelikeanhourofmylifeandiblameyouadam = hydra.getCanvasTextLocation(graphics, Integer.toString(val), hydra.getLogicalHeight() + 40); 65 | if (runelitepleaseexplainwhyineedtocheckthisfornullinsteadoftheentirehydravariablethisshitcostmelikeanhourofmylifeandiblameyouadam != null) { 66 | OverlayUtil.renderTextLocation(graphics, runelitepleaseexplainwhyineedtocheckthisfornullinsteadoftheentirehydravariablethisshitcostmelikeanhourofmylifeandiblameyouadam, Integer.toString(val), Color.WHITE); 67 | } 68 | } 69 | } 70 | } 71 | 72 | } 73 | graphics.setFont(FontManager.getRunescapeFont()); 74 | return null; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /clanmanmode/ClanManModePlugin.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import net.runelite.client.eventbus.Subscribe; 4 | import com.google.inject.Provides; 5 | import java.util.Collections; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.regex.Matcher; 9 | import java.util.regex.Pattern; 10 | import javax.inject.Inject; 11 | import net.runelite.api.*; 12 | import net.runelite.api.coords.WorldPoint; 13 | import net.runelite.api.events.GameStateChanged; 14 | import net.runelite.api.events.GameTick; 15 | import net.runelite.api.events.MenuEntryAdded; 16 | import net.runelite.client.config.ConfigManager; 17 | import net.runelite.client.game.ClanManager; 18 | import net.runelite.client.plugins.Plugin; 19 | import net.runelite.client.plugins.PluginDescriptor; 20 | import net.runelite.client.ui.overlay.OverlayManager; 21 | import net.runelite.client.util.Text; 22 | import org.apache.commons.lang3.ArrayUtils; 23 | 24 | @PluginDescriptor( 25 | name = "Clan Man Mode", 26 | description = "Assists in clan PVP scenarios", 27 | tags = {"highlight", "minimap", "overlay", "players"} 28 | ) 29 | public class ClanManModePlugin extends Plugin 30 | { 31 | @Inject 32 | private OverlayManager overlayManager; 33 | 34 | @Inject 35 | private ClanManModeConfig config; 36 | 37 | @Inject 38 | private ClanManModeOverlay ClanManModeOverlay; 39 | 40 | @Inject 41 | private ClanManModeTileOverlay ClanManModeTileOverlay; 42 | 43 | @Inject 44 | private ClanManModeMinimapOverlay ClanManModeMinimapOverlay; 45 | 46 | @Inject 47 | private Client client; 48 | 49 | @Inject 50 | private ClanManager clanManager; 51 | 52 | @Provides 53 | ClanManModeConfig provideConfig(ConfigManager configManager) 54 | { 55 | return configManager.getConfig(ClanManModeConfig.class); 56 | } 57 | 58 | int wildernessLevel; 59 | int clanmin; 60 | int clanmax; 61 | int inwildy; 62 | int ticks; 63 | Map clan = new HashMap<>(); 64 | 65 | @Override 66 | protected void startUp() throws Exception { 67 | overlayManager.add(ClanManModeOverlay); 68 | overlayManager.add(ClanManModeTileOverlay); 69 | overlayManager.add(ClanManModeMinimapOverlay); 70 | } 71 | 72 | @Override 73 | protected void shutDown() throws Exception { 74 | overlayManager.remove(ClanManModeOverlay); 75 | overlayManager.remove(ClanManModeTileOverlay); 76 | overlayManager.remove(ClanManModeMinimapOverlay); 77 | clan.clear(); 78 | ticks = 0; 79 | wildernessLevel = 0; 80 | clanmin = 0; 81 | clanmax = 0; 82 | inwildy = 0; 83 | } 84 | 85 | @Subscribe 86 | public void onGameStateChanged(GameStateChanged gameStateChanged) { 87 | if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.HOPPING) { 88 | ticks = 0; 89 | } 90 | } 91 | 92 | @Subscribe 93 | public void onGameTick(GameTick event) { 94 | ticks++; 95 | final Player localPlayer = client.getLocalPlayer(); 96 | if (!clan.containsKey(localPlayer.getName())) { 97 | clan.put(localPlayer.getName(), localPlayer.getCombatLevel()); 98 | } 99 | WorldPoint a = localPlayer.getWorldLocation(); 100 | int underLevel = ((a.getY() - 9920) / 8) + 1; 101 | int upperLevel = ((a.getY() - 3520) / 8) + 1; 102 | wildernessLevel = a.getY() > 6400 ? underLevel : upperLevel; 103 | inwildy = client.getVar(Varbits.IN_WILDERNESS); 104 | if (clan.size() > 0) { 105 | clanmin = Collections.min(clan.values()); 106 | clanmax = Collections.max(clan.values()); 107 | } 108 | } 109 | 110 | @Subscribe 111 | public void onMenuEntryAdded(MenuEntryAdded event) { 112 | if (!config.hideAtkOpt()) { 113 | return; 114 | } 115 | if (client.getGameState() != GameState.LOGGED_IN) { 116 | return; 117 | } 118 | 119 | final String option = Text.removeTags(event.getOption()).toLowerCase(); 120 | 121 | if (option.equals("attack")) { 122 | final Pattern ppattern = Pattern.compile("(.+?) 0) { 47 | if (plugin.jadphase == 1) { 48 | if (plugin.jadflip) { 49 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); 50 | imagePanelComponent.getChildren().clear(); 51 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 52 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES) 53 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 54 | : NOT_ACTIVATED_BACKGROUND_COLOR); 55 | } else { 56 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); 57 | imagePanelComponent.getChildren().clear(); 58 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 59 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC) 60 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 61 | : NOT_ACTIVATED_BACKGROUND_COLOR); 62 | } 63 | } else if (plugin.jadphase == 2) { 64 | if (plugin.jadflip) { 65 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); 66 | imagePanelComponent.getChildren().clear(); 67 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 68 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC) 69 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 70 | : NOT_ACTIVATED_BACKGROUND_COLOR); 71 | } else { 72 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); 73 | imagePanelComponent.getChildren().clear(); 74 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 75 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES) 76 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 77 | : NOT_ACTIVATED_BACKGROUND_COLOR); 78 | } 79 | } 80 | return imagePanelComponent.render(graphics); 81 | } 82 | } 83 | return null; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /hydra/HydraPlugin.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.hydra; 2 | 3 | import net.runelite.api.events.*; 4 | import net.runelite.client.eventbus.Subscribe; 5 | import com.google.inject.Provides; 6 | import javax.inject.Inject; 7 | import net.runelite.api.*; 8 | import net.runelite.client.config.ConfigManager; 9 | import net.runelite.client.game.SpriteManager; 10 | import net.runelite.client.plugins.Plugin; 11 | import net.runelite.client.plugins.PluginDescriptor; 12 | import net.runelite.client.ui.overlay.OverlayManager; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | @PluginDescriptor( 18 | name = "Hydra", 19 | description = "Hydra Helper", 20 | tags = {"Hydra", "Helper"} 21 | ) 22 | public class HydraPlugin extends Plugin 23 | { 24 | @Inject 25 | private OverlayManager overlayManager; 26 | 27 | @Inject 28 | private HydraConfig config; 29 | 30 | @Inject 31 | private HydraOverlay HydraOverlay; 32 | 33 | @Inject 34 | private HydraPrayOverlay HydraPrayOverlay; 35 | 36 | @Inject 37 | private HydraIndicatorOverlay HydraIndicatorOverlay; 38 | 39 | @Inject 40 | private Client client; 41 | 42 | @Inject 43 | private SpriteManager spriteManager; 44 | 45 | @Provides 46 | HydraConfig provideConfig(ConfigManager configManager) { 47 | return configManager.getConfig(HydraConfig.class); 48 | } 49 | 50 | Map hydras = new HashMap<>(); 51 | Map hydraattacks = new HashMap<>(); 52 | NPC Hydra; 53 | 54 | @Override 55 | protected void startUp() throws Exception { 56 | overlayManager.add(HydraOverlay); 57 | overlayManager.add(HydraPrayOverlay); 58 | overlayManager.add(HydraIndicatorOverlay); 59 | } 60 | 61 | @Override 62 | protected void shutDown() throws Exception { 63 | overlayManager.remove(HydraOverlay); 64 | overlayManager.remove(HydraPrayOverlay); 65 | overlayManager.remove(HydraIndicatorOverlay); 66 | hydras.clear(); 67 | hydraattacks.clear(); 68 | } 69 | 70 | @Subscribe 71 | public void onNpcSpawned(NpcSpawned event) { 72 | if (!config.EnableHydra()) { 73 | return; 74 | } 75 | NPC hydra = event.getNpc(); 76 | if (hydra.getCombatLevel() != 0 && hydra.getName() != null) { 77 | if (hydra.getName().equalsIgnoreCase("Hydra")) { 78 | if (!hydras.containsKey(hydra.getIndex())) { 79 | hydras.put(hydra.getIndex(), 3); 80 | } 81 | } 82 | } 83 | } 84 | 85 | @Subscribe 86 | public void onNpcDespawned(NpcDespawned event) { 87 | if (!config.EnableHydra()) { 88 | return; 89 | } 90 | NPC hydra = event.getNpc(); 91 | if (hydra.getCombatLevel() != 0 && hydra.getName() != null) { 92 | if (hydra.getName().equalsIgnoreCase("Hydra")) { 93 | if (hydras.containsKey(hydra.getIndex())) { 94 | hydras.remove(hydra.getIndex()); 95 | } 96 | if (hydraattacks.containsKey(hydra.getIndex())) { 97 | hydraattacks.remove(hydra.getIndex()); 98 | } 99 | } 100 | } 101 | } 102 | 103 | @Subscribe 104 | public void onAnimationChanged(AnimationChanged event) { 105 | Actor monster = event.getActor(); 106 | Actor local = client.getLocalPlayer(); 107 | if (monster instanceof NPC) { 108 | NPC hydra = (NPC) monster; 109 | if (hydra.getCombatLevel() != 0 && hydra.getName() != null) { 110 | if (hydra.getName().equalsIgnoreCase("Hydra")) { 111 | if (hydras.containsKey(hydra.getIndex())) { 112 | if (hydra.getAnimation() == 8261 || hydra.getAnimation() == 8262) { 113 | if (hydra.getInteracting().equals(local)) { 114 | Hydra = hydra; 115 | } 116 | if (hydraattacks.containsKey(hydra.getIndex())) { 117 | int lastattack = hydraattacks.get(hydra.getIndex()); 118 | hydraattacks.replace(hydra.getIndex(), hydra.getAnimation()); 119 | 120 | if (lastattack != hydra.getAnimation()) { 121 | hydras.replace(hydra.getIndex(), 2); 122 | } else { 123 | int currval = hydras.get(hydra.getIndex()); 124 | if (currval == 1) { 125 | hydras.replace(hydra.getIndex(), 3); 126 | } else { 127 | hydras.replace(hydra.getIndex(), currval - 1); 128 | } 129 | } 130 | } else { 131 | hydraattacks.put(hydra.getIndex(), hydra.getAnimation()); 132 | int currval = hydras.get(hydra.getIndex()); 133 | if (currval == 1) { 134 | hydras.replace(hydra.getIndex(), 3); 135 | } else { 136 | hydras.replace(hydra.getIndex(), currval - 1); 137 | } 138 | } 139 | } 140 | } 141 | } 142 | } 143 | } 144 | } 145 | } -------------------------------------------------------------------------------- /clanmanmode/ClanManModeConfig.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import java.awt.Color; 4 | import net.runelite.client.config.Config; 5 | import net.runelite.client.config.ConfigGroup; 6 | import net.runelite.client.config.ConfigItem; 7 | 8 | @ConfigGroup("clanmanmode") 9 | public interface ClanManModeConfig extends Config 10 | { 11 | @ConfigItem( 12 | position = 0, 13 | keyName = "highlightattackable", 14 | name = "Highlight attackable targets", 15 | description = "Highlights targets attackable by all clan members" 16 | ) 17 | default boolean highlightAttackable() 18 | { 19 | return false; 20 | } 21 | 22 | @ConfigItem( 23 | position = 1, 24 | keyName = "attackablecolor", 25 | name = "Attackable target c olor", 26 | description = "Color of targets all clan members can target" 27 | ) 28 | default Color getAttackableColor() 29 | { 30 | return new Color(0, 184, 212); 31 | } 32 | 33 | @ConfigItem( 34 | position = 2, 35 | keyName = "highlightattacked", 36 | name = "Highlight clan targets", 37 | description = "Highlights people being attacked by your clan" 38 | ) 39 | default boolean highlightAttacked() 40 | { 41 | return false; 42 | } 43 | 44 | @ConfigItem( 45 | position = 3, 46 | keyName = "attackedcolor", 47 | name = "Clan target color", 48 | description = "Color of players being attacked by clan" 49 | ) 50 | default Color getClanAttackableColor() 51 | { 52 | return new Color(0, 184, 212); 53 | } 54 | 55 | @ConfigItem( 56 | position = 4, 57 | keyName = "drawPlayerTiles", 58 | name = "Draw tiles under players", 59 | description = "Configures whether or not tiles under highlighted players should be drawn" 60 | ) 61 | default boolean drawTiles() 62 | { 63 | return false; 64 | } 65 | 66 | @ConfigItem( 67 | position = 5, 68 | keyName = "drawOverheadPlayerNames", 69 | name = "Draw names above players", 70 | description = "Configures whether or not player names should be drawn above players" 71 | ) 72 | default boolean drawOverheadPlayerNames() 73 | { 74 | return true; 75 | } 76 | 77 | @ConfigItem( 78 | position = 6, 79 | keyName = "drawMinimapNames", 80 | name = "Draw names on minimap", 81 | description = "Configures whether or not minimap names for players with rendered names should be drawn" 82 | ) 83 | default boolean drawMinimapNames() 84 | { 85 | return false; 86 | } 87 | 88 | @ConfigItem( 89 | position = 7, 90 | keyName = "showtargets", 91 | name = "Highlight My Attackers", 92 | description = "Shows players interacting with you" 93 | ) 94 | default boolean showAttackers() 95 | { 96 | return false; 97 | } 98 | 99 | @ConfigItem( 100 | position = 8, 101 | keyName = "attackcolor", 102 | name = "Attacker Color", 103 | description = "Color of attackers" 104 | ) 105 | default Color getAttackerColor() 106 | { 107 | return new Color(255, 0, 0); 108 | } 109 | 110 | @ConfigItem( 111 | position = 9, 112 | keyName = "showbold", 113 | name = "Bold names of clan targets", 114 | description = "Turns names of clan targets bold" 115 | ) 116 | default boolean ShowBold() { return false; } 117 | 118 | @ConfigItem( 119 | position = 10, 120 | keyName = "hideafter", 121 | name = "Hide attackable targets after login", 122 | description = "Automatically disables attackable player highlighting after login" 123 | ) 124 | default boolean hideAttackable() { return false; } 125 | 126 | @ConfigItem( 127 | position = 11, 128 | keyName = "hidetime", 129 | name = "Ticks to hide", 130 | description = "How many ticks after you are logged in that attackbles are hidden (1 tick = 0.6 seconds)" 131 | ) 132 | default int hideTime() { return 5; } 133 | 134 | @ConfigItem( 135 | position = 12, 136 | keyName = "mycblvl", 137 | name = "Calc targets on my own combat level", 138 | description = "Calculates potential targets based off your own combat lvl instead of clans" 139 | ) 140 | default boolean CalcSelfCB() { return false; } 141 | 142 | @ConfigItem( 143 | position = 13, 144 | keyName = "hideatkopt", 145 | name = "Hide attack option for clan members", 146 | description = "Disables attack option for clan members" 147 | ) 148 | default boolean hideAtkOpt() { return false; } 149 | 150 | @ConfigItem( 151 | position = 14, 152 | keyName = "showclanmembers", 153 | name = "Persistent Clan Members", 154 | description = "Will highlight clan members even when not in clan chat" 155 | ) 156 | default boolean PersistentClan() { return false; } 157 | 158 | @ConfigItem( 159 | position = 15, 160 | keyName = "clancolor", 161 | name = "Clan Member Color", 162 | description = "Color of clan members" 163 | ) 164 | default Color getClanMemberColor() 165 | { 166 | return new Color(255, 0, 0); 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /zulrah/ZulrahTileOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.zulrah; 2 | 3 | import java.awt.*; 4 | import java.awt.image.BufferedImage; 5 | import javax.inject.Inject; 6 | 7 | import net.runelite.api.*; 8 | import net.runelite.api.Point; 9 | import net.runelite.client.ui.FontManager; 10 | import net.runelite.client.ui.overlay.Overlay; 11 | import net.runelite.client.ui.overlay.OverlayLayer; 12 | import net.runelite.client.ui.overlay.OverlayPosition; 13 | import net.runelite.client.ui.overlay.OverlayPriority; 14 | import net.runelite.client.ui.overlay.OverlayUtil; 15 | 16 | public class ZulrahTileOverlay extends Overlay 17 | { 18 | private final ZulrahConfig config; 19 | private final ZulrahPlugin plugin; 20 | 21 | @Inject 22 | private Client client; 23 | 24 | @Inject 25 | private ZulrahTileOverlay(ZulrahConfig config, ZulrahPlugin plugin) 26 | { 27 | this.config = config; 28 | this.plugin = plugin; 29 | setLayer(OverlayLayer.ABOVE_SCENE); 30 | setPosition(OverlayPosition.DYNAMIC); 31 | setPriority(OverlayPriority.MED); 32 | } 33 | 34 | @Override 35 | public Dimension render(Graphics2D graphics) 36 | { 37 | 38 | NPC Zulrah = plugin.Zulrah; 39 | if (Zulrah != null) { 40 | OverlayUtil.renderTextLocation(graphics, Zulrah.getCanvasTextLocation(graphics, Integer.toString(plugin.phaseticks - plugin.ticks), Zulrah.getLogicalHeight() + 40), Integer.toString(plugin.phaseticks - plugin.ticks), Color.WHITE); 41 | Player player = client.getLocalPlayer(); 42 | if (plugin.currenttile != null) { 43 | if (plugin.currenttile.equals(plugin.nexttile)) { 44 | final Polygon poly = Perspective.getCanvasTilePoly(client, plugin.currenttile); 45 | if (poly != null) { 46 | Point textLocationtile = Perspective.getCanvasTextLocation(client, graphics, plugin.currenttile, "Current & Next", 50); 47 | OverlayUtil.renderTextLocation(graphics, textLocationtile, "Current & Next", Color.WHITE); 48 | OverlayUtil.renderPolygon(graphics, poly, Color.WHITE); 49 | } 50 | } else { 51 | if (!player.getLocalLocation().equals(plugin.currenttile)) { 52 | final Polygon poly = Perspective.getCanvasTilePoly(client, plugin.currenttile); 53 | if (poly != null) { 54 | Point textLocationtile = Perspective.getCanvasTextLocation(client, graphics, plugin.currenttile, "Current", 50); 55 | OverlayUtil.renderTextLocation(graphics, textLocationtile, "Current", Color.WHITE); 56 | OverlayUtil.renderPolygon(graphics, poly, Color.GREEN); 57 | } 58 | } 59 | if (plugin.nexttile != null) { 60 | final Polygon poly2 = Perspective.getCanvasTilePoly(client, plugin.nexttile); 61 | if (poly2 != null) { 62 | Point textLocationtile = Perspective.getCanvasTextLocation(client, graphics, plugin.nexttile, "Next", 50); 63 | OverlayUtil.renderTextLocation(graphics, textLocationtile, "Next", Color.WHITE); 64 | OverlayUtil.renderPolygon(graphics, poly2, Color.RED); 65 | } 66 | } 67 | } 68 | } 69 | if (plugin.nextzulrahtile != null) { 70 | String style = ""; 71 | if (plugin.nztcolor.equals(Color.RED)) { 72 | style = "MELEE"; 73 | } else if (plugin.nztcolor.equals(Color.BLUE)) { 74 | style = "MAGE"; 75 | } else if (plugin.nztcolor.equals(Color.GREEN)) { 76 | style = "RANGE"; 77 | } else if (plugin.nztcolor.equals(Color.YELLOW)) { 78 | style = "JAD"; 79 | } 80 | 81 | final Polygon poly = Perspective.getCanvasTilePoly(client, plugin.nextzulrahtile); 82 | Point textLocation = Perspective.getCanvasTextLocation(client, graphics, plugin.nextzulrahtile, style, 200); 83 | if (poly != null) 84 | { 85 | BufferedImage clanchatImage = null; 86 | if (style.equals("JAD")) { 87 | if (plugin.phase4 && plugin.phases.size() == 10) { 88 | clanchatImage = plugin.ProtectionIcons[2]; 89 | } else if (plugin.phase3 && plugin.phases.size() == 9) { 90 | clanchatImage = plugin.ProtectionIcons[2]; 91 | } else { 92 | clanchatImage = plugin.ProtectionIcons[0]; 93 | } 94 | } else { 95 | clanchatImage = plugin.getProtectionIcon(); 96 | } 97 | 98 | if (clanchatImage != null) { 99 | Point imageLocation = new Point(textLocation.getX(), textLocation.getY() + 15); 100 | OverlayUtil.renderImageLocation(graphics, imageLocation, clanchatImage); 101 | } 102 | 103 | graphics.setFont(FontManager.getRunescapeBoldFont()); 104 | OverlayUtil.renderTextLocation(graphics, textLocation, style, Color.WHITE); 105 | OverlayUtil.renderPolygon(graphics, poly, plugin.nztcolor); 106 | } 107 | } 108 | if (plugin.MeleeTile != null) { 109 | final Polygon poly = Perspective.getCanvasTilePoly(client, plugin.MeleeTile); 110 | if (poly != null) { 111 | Point textLocationtile = Perspective.getCanvasTextLocation(client, graphics, plugin.MeleeTile, "MOVE HERE NOW!", 50); 112 | graphics.setFont(FontManager.getRunescapeBoldFont()); 113 | OverlayUtil.renderTextLocation(graphics, textLocationtile, "MOVE HERE NOW!", Color.WHITE); 114 | OverlayUtil.renderPolygon(graphics, poly, Color.BLACK); 115 | } 116 | } 117 | } 118 | return null; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /hydra/HydraPrayOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.hydra; 2 | 3 | import java.awt.*; 4 | import java.awt.image.BufferedImage; 5 | import javax.inject.Inject; 6 | 7 | import net.runelite.api.*; 8 | import net.runelite.api.Point; 9 | import net.runelite.client.game.SpriteManager; 10 | import net.runelite.client.ui.overlay.*; 11 | import net.runelite.client.ui.overlay.components.ComponentConstants; 12 | import net.runelite.client.ui.overlay.components.ImageComponent; 13 | import net.runelite.client.ui.overlay.components.PanelComponent; 14 | 15 | public class HydraPrayOverlay extends Overlay { 16 | private final HydraConfig config; 17 | private final HydraPlugin plugin; 18 | 19 | private static final Color NOT_ACTIVATED_BACKGROUND_COLOR = new Color(150, 0, 0, 150); 20 | 21 | private final SpriteManager spriteManager; 22 | private final PanelComponent imagePanelComponent = new PanelComponent(); 23 | 24 | 25 | @Inject 26 | private Client client; 27 | 28 | @Inject 29 | private HydraPrayOverlay(HydraConfig config, HydraPlugin plugin, SpriteManager spriteManager) { 30 | this.config = config; 31 | this.plugin = plugin; 32 | setPosition(OverlayPosition.BOTTOM_RIGHT); 33 | setPriority(OverlayPriority.HIGH); 34 | this.spriteManager = spriteManager; 35 | } 36 | 37 | @Override 38 | public Dimension render(Graphics2D graphics) { 39 | if (!config.PrayerHelper()) { 40 | return null; 41 | } 42 | 43 | if (plugin.Hydra != null) { 44 | if (plugin.hydras.containsKey(plugin.Hydra.getIndex())) { 45 | int val = plugin.hydras.get(plugin.Hydra.getIndex()); 46 | if (val != 0) { 47 | if (plugin.hydraattacks.containsKey(plugin.Hydra.getIndex())) { 48 | int attack = plugin.hydraattacks.get(plugin.Hydra.getIndex()); 49 | if (attack == 8261) { 50 | if (val == 3) { 51 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); 52 | 53 | imagePanelComponent.getChildren().clear(); 54 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 55 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC) 56 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 57 | : NOT_ACTIVATED_BACKGROUND_COLOR); 58 | 59 | return imagePanelComponent.render(graphics); 60 | } else { 61 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); 62 | 63 | imagePanelComponent.getChildren().clear(); 64 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 65 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES) 66 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 67 | : NOT_ACTIVATED_BACKGROUND_COLOR); 68 | 69 | return imagePanelComponent.render(graphics); 70 | } 71 | } else if (attack == 8262) { 72 | if (val == 3) { 73 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MISSILES, 0); 74 | 75 | imagePanelComponent.getChildren().clear(); 76 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 77 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES) 78 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 79 | : NOT_ACTIVATED_BACKGROUND_COLOR); 80 | 81 | return imagePanelComponent.render(graphics); 82 | } else { 83 | final BufferedImage prayerImage = spriteManager.getSprite(SpriteID.PRAYER_PROTECT_FROM_MAGIC, 0); 84 | 85 | imagePanelComponent.getChildren().clear(); 86 | imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); 87 | imagePanelComponent.setBackgroundColor(client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC) 88 | ? ComponentConstants.STANDARD_BACKGROUND_COLOR 89 | : NOT_ACTIVATED_BACKGROUND_COLOR); 90 | 91 | return imagePanelComponent.render(graphics); 92 | } 93 | } 94 | } 95 | } 96 | } 97 | } 98 | return null; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /clanmanmode/ClanManModeService.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.clanmanmode; 2 | 3 | import java.awt.Color; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | import java.util.function.BiConsumer; 7 | import javax.inject.Inject; 8 | import javax.inject.Singleton; 9 | 10 | import net.runelite.api.Actor; 11 | import net.runelite.api.Client; 12 | import net.runelite.api.NPC; 13 | import net.runelite.api.Player; 14 | import net.runelite.api.coords.WorldPoint; 15 | 16 | @Singleton 17 | public class ClanManModeService 18 | { 19 | private final Client client; 20 | private final ClanManModeConfig config; 21 | private final ClanManModePlugin plugin; 22 | 23 | @Inject 24 | private ClanManModeService(Client client, ClanManModeConfig config, ClanManModePlugin plugin) 25 | { 26 | this.config = config; 27 | this.client = client; 28 | this.plugin = plugin; 29 | } 30 | 31 | Map interactors = new HashMap<>(); 32 | 33 | public void forEachPlayer(final BiConsumer consumer) 34 | { 35 | int minatk = plugin.clanmax - plugin.wildernessLevel; 36 | int maxatk = plugin.clanmin + plugin.wildernessLevel; 37 | final Player localPlayer = client.getLocalPlayer(); 38 | final String localName = localPlayer.getName(); 39 | int selfmin = localPlayer.getCombatLevel() - plugin.wildernessLevel; 40 | int selfmax = localPlayer.getCombatLevel() + plugin.wildernessLevel; 41 | for (Player player : client.getPlayers()) 42 | { 43 | if (player == null || player.getName() == null) { 44 | continue; 45 | } 46 | 47 | if (player == localPlayer) { 48 | continue; 49 | } 50 | 51 | boolean isClanMember = player.isClanMember(); 52 | Actor interacting = player.getInteracting(); 53 | Player interactor = null; 54 | if (interacting != null && !(interacting instanceof NPC)) { 55 | interactor = ((Player) interacting); 56 | } 57 | 58 | if (config.showAttackers()) { 59 | if (interactor != null) { 60 | if (interactor.getName().equals(localName)) { 61 | consumer.accept(player, config.getAttackerColor()); 62 | } 63 | } 64 | } 65 | 66 | if (plugin.inwildy == 1) { 67 | if (isClanMember) { 68 | if (!plugin.clan.containsKey(player.getName())) { 69 | plugin.clan.put(player.getName(), player.getCombatLevel()); 70 | } 71 | if (config.highlightAttacked()) { 72 | if (interactor != null) { 73 | if (!interactors.containsKey(interactor.getName())) { 74 | WorldPoint a = interactor.getWorldLocation(); 75 | int underLevel = ((a.getY() - 9920) / 8) + 1; 76 | int upperLevel = ((a.getY() - 3520) / 8) + 1; 77 | int wildernessLevel = a.getY() > 6400 ? underLevel : upperLevel; 78 | int wildydiff = plugin.wildernessLevel - wildernessLevel; 79 | if (wildydiff < 0) { 80 | wildydiff = 0; 81 | } 82 | if (config.CalcSelfCB()) { 83 | if (interacting.getCombatLevel() <= selfmax && interacting.getCombatLevel() - wildydiff >= selfmin && !interactor.isClanMember()) { 84 | interactors.put(interactor.getName(), player.getName()); 85 | consumer.accept(interactor, config.getClanAttackableColor()); 86 | } 87 | } else { 88 | if (interacting.getCombatLevel() <= maxatk && interacting.getCombatLevel() - wildydiff >= minatk && !interactor.isClanMember()) { 89 | interactors.put(interactor.getName(), player.getName()); 90 | consumer.accept(interactor, config.getClanAttackableColor()); 91 | } 92 | } 93 | } 94 | } 95 | } 96 | } else { 97 | if (config.PersistentClan()) { 98 | if (plugin.clan.containsKey(player.getName())) { 99 | consumer.accept(player, config.getClanMemberColor()); 100 | } 101 | } 102 | if (config.highlightAttacked()) { 103 | if (interactors.containsKey(player.getName())) { 104 | String attackername = interactors.get(player.getName()); 105 | Boolean found = false; 106 | for (Player attacker : client.getPlayers()) { 107 | if (attacker == null || attacker.getName() == null) { 108 | continue; 109 | } 110 | if (attacker.getName().equals(attackername)) { 111 | found = true; 112 | Actor ainteract = attacker.getInteracting(); 113 | if (ainteract != null) { 114 | if (ainteract.getName().equals(player.getName())) { 115 | consumer.accept(player, config.getClanAttackableColor()); 116 | } else { 117 | interactors.remove(player.getName()); 118 | } 119 | } else { 120 | interactors.remove(player.getName()); 121 | } 122 | break; 123 | } 124 | } 125 | if (!found) { 126 | interactors.remove(player.getName()); 127 | } 128 | continue; 129 | } 130 | } 131 | if (config.highlightAttackable()) { 132 | if ((config.hideAttackable() && plugin.ticks >= config.hideTime()) || plugin.clan.containsKey(player.getName())) { 133 | continue; 134 | } 135 | WorldPoint a = player.getWorldLocation(); 136 | int underLevel = ((a.getY() - 9920) / 8) + 1; 137 | int upperLevel = ((a.getY() - 3520) / 8) + 1; 138 | int wildernessLevel = a.getY() > 6400 ? underLevel : upperLevel; 139 | int wildydiff = plugin.wildernessLevel - wildernessLevel; 140 | if (wildydiff < 0) { 141 | wildydiff = 0; 142 | } 143 | if (config.CalcSelfCB()) { 144 | if (player.getCombatLevel() <= selfmax && player.getCombatLevel() - wildydiff >= selfmin) { 145 | consumer.accept(player, config.getAttackableColor()); 146 | } 147 | } else { 148 | if (player.getCombatLevel() <= maxatk && player.getCombatLevel() - wildydiff >= minatk) { 149 | consumer.accept(player, config.getAttackableColor()); 150 | } 151 | } 152 | } 153 | } 154 | } 155 | } 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /freezetimers/FreezeTimersOverlay.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.freezetimers; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import java.awt.Graphics2D; 6 | import java.awt.image.*; 7 | import javax.inject.Inject; 8 | import javax.inject.Singleton; 9 | 10 | import net.runelite.api.*; 11 | import net.runelite.client.game.SpriteManager; 12 | import net.runelite.client.ui.FontManager; 13 | import net.runelite.client.ui.overlay.Overlay; 14 | import net.runelite.client.ui.overlay.OverlayPosition; 15 | import net.runelite.client.ui.overlay.OverlayPriority; 16 | import net.runelite.client.ui.overlay.OverlayUtil; 17 | 18 | @Singleton 19 | public class FreezeTimersOverlay extends Overlay 20 | { 21 | private final FreezeTimersService FreezeTimersService; 22 | private final FreezeTimersConfig config; 23 | private final FreezeTimersPlugin plugin; 24 | private final SpriteManager spriteManager; 25 | private final Client client; 26 | 27 | @Inject 28 | private FreezeTimersOverlay(FreezeTimersConfig config, FreezeTimersService FreezeTimersService, FreezeTimersPlugin plugin, Client client, SpriteManager spriteManager) { 29 | this.config = config; 30 | this.FreezeTimersService = FreezeTimersService; 31 | this.plugin = plugin; 32 | this.client = client; 33 | this.spriteManager = spriteManager; 34 | setPosition(OverlayPosition.DYNAMIC); 35 | setPriority(OverlayPriority.MED); 36 | } 37 | 38 | @Override 39 | public Dimension render(Graphics2D graphics) 40 | { 41 | if (!config.EnableFreezeTimers()) { 42 | return null; 43 | } 44 | FreezeTimersService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); 45 | return null; 46 | } 47 | 48 | private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) 49 | { 50 | int timer = 0; 51 | String name = actor.getName(); 52 | int freezetype = plugin.freezetype(name); 53 | long dtime = plugin.opponentfreezetime(name); 54 | long tbed = plugin.istbed(name); 55 | Point textLocation = null; 56 | long currenttime = System.currentTimeMillis(); 57 | HeadIcon headIcon = actor.getOverheadIcon(); 58 | int freezetime = 0; 59 | boolean frozenoverlay = false; 60 | if (dtime > 0) { 61 | if (freezetype == 1 || freezetype == 4) { 62 | freezetime = 5000; 63 | } else if (freezetype == 2 || freezetype == 5) { 64 | freezetime = 10000; 65 | } else if (freezetype == 3 || freezetype == 6) { 66 | freezetime = 15000; 67 | } else if (freezetype == 7) { 68 | freezetime = 20000; 69 | } else if (freezetype == 8) { 70 | freezetime = 2500; 71 | } else if (freezetype == 9) { 72 | freezetime = 5000; 73 | } else if (freezetype == 10) { 74 | freezetime = 7500; 75 | } 76 | 77 | long timediff = currenttime - dtime; 78 | timer = (freezetime - (int) timediff) / 1000; 79 | 80 | if (timediff < freezetime) { 81 | textLocation = actor.getCanvasTextLocation(graphics, Integer.toString(timer), actor.getLogicalHeight() + config.FreezeTimerPos()); 82 | textLocation = new Point(textLocation.getX(), textLocation.getY() - config.FreezeTimerPos()); 83 | } else { 84 | if (timediff < freezetime + 3000) { 85 | textLocation = actor.getCanvasTextLocation(graphics, Integer.toString(timer), actor.getLogicalHeight() + config.FreezeTimerPos()); 86 | textLocation = new Point(textLocation.getX(), textLocation.getY() - config.FreezeTimerPos()); 87 | if (headIcon != null) { 88 | textLocation = new Point(textLocation.getX(), textLocation.getY() - config.FreezeTimerPos()); 89 | } 90 | if (config.BoldFont()) { 91 | graphics.setFont(FontManager.getRunescapeBoldFont()); 92 | } 93 | frozenoverlay = true; 94 | OverlayUtil.renderTextLocation(graphics, textLocation, Integer.toString(timer), color); 95 | return; 96 | } else { 97 | plugin.deleteopponent(name); 98 | } 99 | } 100 | 101 | if (textLocation != null) { 102 | BufferedImage clanchatImage = plugin.GetFreezeIcon(freezetype - 1); 103 | 104 | if (clanchatImage != null) { 105 | Point imageLocation = new Point(textLocation.getX(), textLocation.getY() - (config.FreezeTimerPos() / 2)); 106 | if (config.BoldFont()) { 107 | graphics.setFont(FontManager.getRunescapeBoldFont()); 108 | } 109 | frozenoverlay = true; 110 | OverlayUtil.renderTextLocation(graphics, textLocation, Integer.toString(timer), color); 111 | OverlayUtil.renderImageLocation(graphics, imageLocation, clanchatImage); 112 | } 113 | } 114 | } 115 | 116 | if (config.TBTimer()) { 117 | if (tbed > 0) { 118 | int type = plugin.tbtype(name); 119 | int tbexpiry; 120 | if (type > 0) { 121 | if (type == 1) { 122 | tbexpiry = 300000; 123 | } else if (type == 2) { 124 | tbexpiry = 150000; 125 | } else { 126 | return; 127 | } 128 | long tbtime = currenttime - tbed; 129 | int tbtimer = (tbexpiry - (int) tbtime) / 1000; 130 | if (tbtime < tbexpiry) { 131 | textLocation = actor.getCanvasTextLocation(graphics, Integer.toString(tbtimer), actor.getLogicalHeight() + config.FreezeTimerPos()); 132 | if (frozenoverlay) { 133 | textLocation = new Point(textLocation.getX() + 40, textLocation.getY() - config.FreezeTimerPos()); 134 | } else { 135 | textLocation = new Point(textLocation.getX(), textLocation.getY() - config.FreezeTimerPos()); 136 | } 137 | } else { 138 | plugin.deletetb(name); 139 | } 140 | 141 | if (textLocation != null) { 142 | BufferedImage clanchatImage = plugin.GetFreezeIcon(10); 143 | 144 | if (clanchatImage != null) { 145 | if (config.BoldFont()) { 146 | graphics.setFont(FontManager.getRunescapeBoldFont()); 147 | } 148 | Point imageLocation = null; 149 | if (frozenoverlay) { 150 | imageLocation = new Point(textLocation.getX() + 5, textLocation.getY() - (config.FreezeTimerPos() / 2)); 151 | } else { 152 | imageLocation = new Point(textLocation.getX(), textLocation.getY() - (config.FreezeTimerPos() / 2)); 153 | } 154 | OverlayUtil.renderTextLocation(graphics, textLocation, Integer.toString(tbtimer), color); 155 | OverlayUtil.renderImageLocation(graphics, imageLocation, clanchatImage); 156 | } 157 | } 158 | } 159 | 160 | } 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /freezetimers/FreezeTimersPlugin.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.freezetimers; 2 | 3 | import net.runelite.api.events.*; 4 | import net.runelite.client.eventbus.Subscribe; 5 | import com.google.inject.Provides; 6 | import javax.inject.Inject; 7 | import java.awt.*; 8 | import java.awt.image.*; 9 | import java.util.*; 10 | import java.util.regex.Matcher; 11 | import java.util.regex.Pattern; 12 | 13 | import net.runelite.api.*; 14 | 15 | import net.runelite.api.coords.WorldPoint; 16 | import net.runelite.client.config.ConfigManager; 17 | import net.runelite.client.game.SpriteManager; 18 | import net.runelite.client.plugins.Plugin; 19 | import net.runelite.client.plugins.PluginDescriptor; 20 | import net.runelite.client.ui.overlay.OverlayManager; 21 | import net.runelite.client.util.ImageUtil; 22 | 23 | @PluginDescriptor( 24 | name = "Freeze Timers", 25 | description = "PVP Freeze Timers", 26 | tags = {"PvP", "Freeze", "Timers"} 27 | ) 28 | public class FreezeTimersPlugin extends Plugin 29 | { 30 | @Inject 31 | private OverlayManager overlayManager; 32 | 33 | @Inject 34 | private FreezeTimersConfig config; 35 | 36 | @Inject 37 | private FreezeTimersOverlay FreezeTimersOverlay; 38 | 39 | @Inject 40 | private FreezeTimersTileOverlay FreezeTimersTileOverlay; 41 | 42 | @Inject 43 | private Client client; 44 | 45 | @Inject 46 | private SpriteManager spriteManager; 47 | 48 | @Provides 49 | FreezeTimersConfig provideConfig(ConfigManager configManager) { 50 | return configManager.getConfig(FreezeTimersConfig.class); 51 | } 52 | 53 | private static final int[] FREEZE_ICONS = { 54 | SpriteID.SPELL_BIND, 55 | SpriteID.SPELL_SNARE, 56 | SpriteID.SPELL_ENTANGLE, 57 | SpriteID.SPELL_ICE_RUSH, 58 | SpriteID.SPELL_ICE_BURST, 59 | SpriteID.SPELL_ICE_BLITZ, 60 | SpriteID.SPELL_ICE_BARRAGE, 61 | SpriteID.SPELL_BIND, 62 | SpriteID.SPELL_SNARE, 63 | SpriteID.SPELL_ENTANGLE, 64 | SpriteID.SPELL_TELE_BLOCK 65 | }; 66 | 67 | private static final Dimension FREEZE_ICON_DIMENSION = new Dimension(25, 25); 68 | private static final Color FREEZE_ICON_OUTLINE_COLOR = new Color(33, 33, 33); 69 | private final BufferedImage[] FreezeIcons = new BufferedImage[FREEZE_ICONS.length]; 70 | 71 | @Subscribe 72 | public void onGameStateChanged(GameStateChanged gameStateChanged) 73 | { 74 | if (gameStateChanged.getGameState() == GameState.LOGGED_IN) { 75 | loadFreezeIcons(); 76 | } 77 | } 78 | 79 | @Override 80 | protected void startUp() throws Exception { 81 | overlayManager.add(FreezeTimersOverlay); 82 | overlayManager.add(FreezeTimersTileOverlay); 83 | } 84 | 85 | @Override 86 | protected void shutDown() throws Exception { 87 | overlayManager.remove(FreezeTimersOverlay); 88 | overlayManager.remove(FreezeTimersTileOverlay); 89 | frozenthings.clear(); 90 | frozenthingpoints.clear(); 91 | freezetype.clear(); 92 | tbedthings.clear(); 93 | tbtypes.clear(); 94 | } 95 | 96 | Map frozenthings = new HashMap<>(); 97 | Map frozenthingpoints = new HashMap<>(); 98 | Map freezetype = new HashMap<>(); 99 | Map tbedthings = new HashMap<>(); 100 | Map tbtypes = new HashMap<>(); 101 | 102 | 103 | Map magexp = new HashMap<>(); 104 | int lastxp; 105 | int ticks; 106 | int currticks; 107 | String currtarget; 108 | String spell; 109 | 110 | @Subscribe 111 | public void onMenuOptionClicked(MenuOptionClicked event) { 112 | if (event.getMenuTarget().contains("->")) { 113 | final Pattern spattern = Pattern.compile(">(.+?)"); 114 | final Pattern ppattern = Pattern.compile("> (.+?) 0 && currtarget != null) { 149 | if (frozenthings.containsKey(currtarget)) { 150 | currtarget = null; 151 | return; 152 | } 153 | WorldPoint targetpos = null; 154 | for (Player player : client.getPlayers()) { 155 | if (player == null) { 156 | continue; 157 | } 158 | String cname = player.getName(); 159 | if (cname.equals(currtarget)) { 160 | if (player.getOverheadIcon() != null) { 161 | if (player.getOverheadIcon().equals(HeadIcon.MAGIC)) { 162 | praymage = true; 163 | } 164 | } 165 | targetpos = player.getWorldLocation(); 166 | break; 167 | } 168 | 169 | } 170 | 171 | if (targetpos != null) { 172 | if (spell.equals("Bind") && xp > 30) { 173 | frozenthings.put(currtarget, System.currentTimeMillis()); 174 | frozenthingpoints.put(currtarget, targetpos); 175 | if (praymage) { 176 | freezetype.put(currtarget, 8); 177 | } else { 178 | freezetype.put(currtarget, 1); 179 | } 180 | } else if (spell.equals("Snare") && xp > 60) { 181 | frozenthings.put(currtarget, System.currentTimeMillis()); 182 | frozenthingpoints.put(currtarget, targetpos); 183 | if (praymage) { 184 | freezetype.put(currtarget, 9); 185 | } else { 186 | freezetype.put(currtarget, 2); 187 | } 188 | } else if (spell.equals("Entangle") && xp >= 89) { 189 | frozenthings.put(currtarget, System.currentTimeMillis()); 190 | frozenthingpoints.put(currtarget, targetpos); 191 | if (praymage) { 192 | freezetype.put(currtarget, 10); 193 | } else { 194 | freezetype.put(currtarget, 3); 195 | } 196 | } else if (spell.equals("Ice Rush") && xp > 34) { 197 | frozenthings.put(currtarget, System.currentTimeMillis()); 198 | frozenthingpoints.put(currtarget, targetpos); 199 | freezetype.put(currtarget, 4); 200 | } else if (spell.equals("Ice Burst") && xp > 40) { 201 | frozenthings.put(currtarget, System.currentTimeMillis()); 202 | frozenthingpoints.put(currtarget, targetpos); 203 | freezetype.put(currtarget, 5); 204 | } else if (spell.equals("Ice Blitz") && xp > 46) { 205 | frozenthings.put(currtarget, System.currentTimeMillis()); 206 | frozenthingpoints.put(currtarget, targetpos); 207 | freezetype.put(currtarget, 6); 208 | } else if (spell.equals("Ice Barrage") && xp > 52) { 209 | frozenthings.put(currtarget, System.currentTimeMillis()); 210 | frozenthingpoints.put(currtarget, targetpos); 211 | freezetype.put(currtarget, 7); 212 | } else if (spell.equals("Tele Block") && xp == 95) { 213 | if (config.TBTimer()) { 214 | if (praymage) { 215 | tbtypes.put(currtarget, 2); 216 | } else { 217 | tbtypes.put(currtarget, 1); 218 | } 219 | tbedthings.put(currtarget, System.currentTimeMillis()); 220 | } 221 | } 222 | } 223 | } 224 | if (currtarget != null && ticks > currticks + 1) { 225 | Player local = client.getLocalPlayer(); 226 | Actor interacting = local.getInteracting(); 227 | if (interacting != null) { 228 | if (!interacting.getName().equals(currtarget)) { 229 | currtarget = null; 230 | } 231 | } else { 232 | currtarget = null; 233 | } 234 | } 235 | ticks++; 236 | } 237 | 238 | public long opponentfreezetime(String name) { 239 | if (frozenthings.containsKey(name)) { 240 | return frozenthings.get(name); 241 | } 242 | return 0; 243 | } 244 | 245 | public WorldPoint playerpos(String name) { 246 | if (frozenthingpoints.containsKey(name)) { 247 | return frozenthingpoints.get(name); 248 | } 249 | return null; 250 | } 251 | 252 | public void updatepos(String name, WorldPoint point) { 253 | if (frozenthingpoints.containsKey(name)) { 254 | frozenthingpoints.remove(name); 255 | frozenthingpoints.put(name, point); 256 | } 257 | } 258 | 259 | public int freezetype(String name) { 260 | if (freezetype.containsKey(name)) { 261 | return freezetype.get(name); 262 | } 263 | return 0; 264 | } 265 | 266 | public long istbed(String name) { 267 | if (tbedthings.containsKey(name)) { 268 | return tbedthings.get(name); 269 | } 270 | return 0; 271 | } 272 | 273 | public int tbtype(String name) { 274 | if (tbtypes.containsKey(name)) { 275 | return tbtypes.get(name); 276 | } 277 | return 0; 278 | } 279 | 280 | public void deleteopponent(String name) { 281 | if (frozenthings.containsKey(name)) { 282 | frozenthings.remove(name); 283 | } 284 | if (frozenthingpoints.containsKey(name)) { 285 | frozenthingpoints.remove(name); 286 | } 287 | if (freezetype.containsKey(name)) { 288 | freezetype.remove(name); 289 | } 290 | } 291 | 292 | public void deletetb(String name) { 293 | if (tbedthings.containsKey(name)) { 294 | tbedthings.remove(name); 295 | } 296 | if (tbtypes.containsKey(name)) { 297 | tbtypes.remove(name); 298 | } 299 | } 300 | 301 | private void loadFreezeIcons() { 302 | final IndexedSprite[] freezeIcons = {}; 303 | final IndexedSprite[] newfreezeIcons = Arrays.copyOf(freezeIcons, FREEZE_ICONS.length); 304 | int curPosition = 0; 305 | 306 | for (int i = 0; i < FREEZE_ICONS.length; i++, curPosition++) 307 | { 308 | final int resource = FREEZE_ICONS[i]; 309 | FreezeIcons[i] = rgbaToIndexedBufferedImage(FreezeIconFromSprite(spriteManager.getSprite(resource, 0))); 310 | newfreezeIcons[curPosition] = createIndexedSprite(client, FreezeIcons[i]); 311 | } 312 | } 313 | 314 | private static IndexedSprite createIndexedSprite(final Client client, final BufferedImage bufferedImage) { 315 | final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); 316 | 317 | final int width = bufferedImage.getWidth(); 318 | final int height = bufferedImage.getHeight(); 319 | final byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); 320 | final int[] palette = new int[indexedCM.getMapSize()]; 321 | indexedCM.getRGBs(palette); 322 | 323 | final IndexedSprite newIndexedSprite = client.createIndexedSprite(); 324 | newIndexedSprite.setPixels(pixels); 325 | newIndexedSprite.setPalette(palette); 326 | newIndexedSprite.setWidth(width); 327 | newIndexedSprite.setHeight(height); 328 | newIndexedSprite.setOriginalWidth(width); 329 | newIndexedSprite.setOriginalHeight(height); 330 | newIndexedSprite.setOffsetX(0); 331 | newIndexedSprite.setOffsetY(0); 332 | return newIndexedSprite; 333 | } 334 | 335 | private static BufferedImage rgbaToIndexedBufferedImage(final BufferedImage sourceBufferedImage) { 336 | final BufferedImage indexedImage = new BufferedImage( 337 | sourceBufferedImage.getWidth(), 338 | sourceBufferedImage.getHeight(), 339 | BufferedImage.TYPE_BYTE_INDEXED); 340 | 341 | final ColorModel cm = indexedImage.getColorModel(); 342 | final IndexColorModel icm = (IndexColorModel) cm; 343 | 344 | final int size = icm.getMapSize(); 345 | final byte[] reds = new byte[size]; 346 | final byte[] greens = new byte[size]; 347 | final byte[] blues = new byte[size]; 348 | icm.getReds(reds); 349 | icm.getGreens(greens); 350 | icm.getBlues(blues); 351 | 352 | final WritableRaster raster = indexedImage.getRaster(); 353 | final int pixel = raster.getSample(0, 0, 0); 354 | final IndexColorModel resultIcm = new IndexColorModel(8, size, reds, greens, blues, pixel); 355 | final BufferedImage resultIndexedImage = new BufferedImage(resultIcm, raster, sourceBufferedImage.isAlphaPremultiplied(), null); 356 | resultIndexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null); 357 | return resultIndexedImage; 358 | } 359 | 360 | private static BufferedImage FreezeIconFromSprite(final BufferedImage freezeSprite) { 361 | final BufferedImage freezeCanvas = ImageUtil.resizeCanvas(freezeSprite, FREEZE_ICON_DIMENSION.width, FREEZE_ICON_DIMENSION.height); 362 | return ImageUtil.outlineImage(freezeCanvas, FREEZE_ICON_OUTLINE_COLOR); 363 | } 364 | 365 | BufferedImage GetFreezeIcon(int id) { 366 | return FreezeIcons[id]; 367 | } 368 | } 369 | -------------------------------------------------------------------------------- /zulrah/ZulrahPlugin.java: -------------------------------------------------------------------------------- 1 | package net.runelite.client.plugins.zulrah; 2 | 3 | import net.runelite.api.events.AnimationChanged; 4 | import net.runelite.client.eventbus.Subscribe; 5 | import com.google.inject.Provides; 6 | import javax.inject.Inject; 7 | import java.awt.*; 8 | import java.awt.image.*; 9 | import java.util.*; 10 | import java.util.List; 11 | 12 | import net.runelite.api.*; 13 | 14 | import net.runelite.api.coords.LocalPoint; 15 | import net.runelite.api.events.GameStateChanged; 16 | import net.runelite.api.events.GameTick; 17 | import net.runelite.client.config.ConfigManager; 18 | import net.runelite.client.game.SpriteManager; 19 | import net.runelite.client.plugins.Plugin; 20 | import net.runelite.client.plugins.PluginDescriptor; 21 | import net.runelite.client.ui.overlay.OverlayManager; 22 | import net.runelite.client.util.ImageUtil; 23 | 24 | @PluginDescriptor( 25 | name = "Zulrah", 26 | description = "Zulrah Helper", 27 | tags = {"Zulrah", "Helper"} 28 | ) 29 | public class ZulrahPlugin extends Plugin 30 | { 31 | @Inject 32 | private OverlayManager overlayManager; 33 | 34 | @Inject 35 | private ZulrahConfig config; 36 | 37 | @Inject 38 | private ZulrahOverlay ZulrahOverlay; 39 | 40 | @Inject 41 | private ZulrahTileOverlay ZulrahTileOverlay; 42 | 43 | @Inject 44 | private ZulrahJadOverlay ZulrahJadOverlay; 45 | 46 | @Inject 47 | private Client client; 48 | 49 | @Inject 50 | private SpriteManager spriteManager; 51 | 52 | @Provides 53 | ZulrahConfig provideConfig(ConfigManager configManager) { 54 | return configManager.getConfig(ZulrahConfig.class); 55 | } 56 | 57 | private static final int[] PROTECTION_ICONS = { 58 | SpriteID.PRAYER_PROTECT_FROM_MISSILES, 59 | SpriteID.PRAYER_PROTECT_FROM_MELEE, 60 | SpriteID.PRAYER_PROTECT_FROM_MAGIC 61 | }; 62 | 63 | private static final Dimension PROTECTION_ICON_DIMENSION = new Dimension(33, 33); 64 | private static final Color PROTECTION_ICON_OUTLINE_COLOR = new Color(33, 33, 33); 65 | public final BufferedImage[] ProtectionIcons = new BufferedImage[PROTECTION_ICONS.length]; 66 | int zulrahstart = 0; 67 | NPC Zulrah; 68 | 69 | @Subscribe 70 | public void onGameStateChanged(GameStateChanged gameStateChanged) 71 | { 72 | if (gameStateChanged.getGameState() == GameState.LOGGED_IN) { 73 | loadProtectionIcons(); 74 | } 75 | } 76 | 77 | @Override 78 | protected void startUp() throws Exception { 79 | overlayManager.add(ZulrahOverlay); 80 | overlayManager.add(ZulrahTileOverlay); 81 | overlayManager.add(ZulrahJadOverlay); 82 | } 83 | 84 | @Override 85 | protected void shutDown() throws Exception { 86 | overlayManager.remove(ZulrahOverlay); 87 | overlayManager.remove(ZulrahTileOverlay); 88 | overlayManager.remove(ZulrahJadOverlay); 89 | } 90 | 91 | LocalPoint ZulrahPosCenter = new LocalPoint(6720, 7616); 92 | LocalPoint ZulrahPosWest = new LocalPoint(8000, 7360); 93 | LocalPoint ZulrahPosEast = new LocalPoint(5440, 7360); 94 | LocalPoint ZulrahPosNorth = new LocalPoint(6720, 6208); 95 | 96 | LocalPoint SWCornerTile = new LocalPoint(7488, 7872); 97 | LocalPoint SWCornerTileMelee = new LocalPoint(7232, 8000); 98 | LocalPoint WPillar = new LocalPoint(7232, 7232); 99 | LocalPoint WPillarN = new LocalPoint(7232, 7104); 100 | LocalPoint EPillar = new LocalPoint(6208, 7232); 101 | LocalPoint EPillarN = new LocalPoint(6208, 7104); 102 | LocalPoint SECornerTile = new LocalPoint(6208, 8000); 103 | LocalPoint SECornerTileMelee = new LocalPoint(5952, 7744); 104 | LocalPoint Middle = new LocalPoint(6720, 6848); 105 | 106 | int ticks; 107 | int phaseticks; 108 | int not; 109 | int lastphase; 110 | int phase; 111 | int nextprayerendticks; 112 | boolean phase1 = true; 113 | boolean phase2 = true; 114 | boolean phase3 = true; 115 | boolean phase4 = true; 116 | boolean restart = false; 117 | boolean prayerconserve = false; 118 | int jadphase; 119 | boolean jadflip = false; 120 | Color nztcolor; 121 | LocalPoint nextzulrahtile; 122 | LocalPoint nexttile; 123 | LocalPoint currenttile; 124 | LocalPoint lastloc; 125 | LocalPoint MeleeTile; 126 | List phases = new ArrayList<>(); 127 | List locations = new ArrayList<>(); 128 | 129 | ArrayList Phase1types = new ArrayList<>(Arrays.asList(2042, 2043, 2044, 2042, 2044, 2043, 2042, 2044, 2042, 2043)); 130 | ArrayList Phase1pos = new ArrayList<>(Arrays.asList(ZulrahPosCenter, ZulrahPosCenter, ZulrahPosCenter, ZulrahPosEast, ZulrahPosNorth, ZulrahPosCenter, ZulrahPosWest, ZulrahPosNorth, ZulrahPosEast, ZulrahPosCenter)); 131 | ArrayList Phase1tiles = new ArrayList<>(Arrays.asList(SWCornerTile, SWCornerTile, SWCornerTile, EPillar, EPillarN, EPillar, Middle, EPillar, EPillar, SWCornerTile)); 132 | ArrayList Phase1ticks = new ArrayList<>(Arrays.asList(28, 20, 18, 28, 39, 22, 20, 36, 48, 20)); 133 | 134 | ArrayList Phase2types = new ArrayList<>(Arrays.asList(2042, 2043, 2044, 2042, 2043, 2044, 2042, 2044, 2042, 2043)); 135 | ArrayList Phase2pos = new ArrayList<>(Arrays.asList(ZulrahPosCenter, ZulrahPosCenter, ZulrahPosCenter, ZulrahPosNorth, ZulrahPosCenter, ZulrahPosEast, ZulrahPosNorth, ZulrahPosNorth, ZulrahPosEast, ZulrahPosCenter)); 136 | ArrayList Phase2tiles = new ArrayList<>(Arrays.asList(SWCornerTile, SWCornerTile, SWCornerTile, EPillar, EPillar, EPillar, WPillar, WPillarN, EPillar, SWCornerTile)); 137 | ArrayList Phase2ticks = new ArrayList<>(Arrays.asList(28, 20, 17, 39, 22, 20, 28, 36, 48, 21)); 138 | 139 | ArrayList Phase3types = new ArrayList<>(Arrays.asList(2042, 2042, 2043, 2044, 2042, 2044, 2042, 2042, 2044, 2042, 2044)); 140 | ArrayList Phase3pos = new ArrayList<>(Arrays.asList(ZulrahPosCenter, ZulrahPosWest, ZulrahPosCenter, ZulrahPosEast, ZulrahPosNorth, ZulrahPosWest, ZulrahPosCenter, ZulrahPosEast, ZulrahPosCenter, ZulrahPosWest, ZulrahPosCenter)); 141 | ArrayList Phase3tiles = new ArrayList<>(Arrays.asList(SWCornerTile, SWCornerTile, SECornerTile, EPillar, WPillar, WPillar, EPillar, EPillar, WPillar, WPillar, SWCornerTile)); 142 | ArrayList Phase3ticks = new ArrayList<>(Arrays.asList(28, 30, 40, 20, 20, 20, 25, 20, 36, 35, 18)); 143 | 144 | ArrayList Phase4types = new ArrayList<>(Arrays.asList(2042, 2044, 2042, 2044, 2043, 2042, 2042, 2044, 2042, 2044, 2042, 2044)); 145 | ArrayList Phase4pos = new ArrayList<>(Arrays.asList(ZulrahPosCenter, ZulrahPosWest, ZulrahPosNorth, ZulrahPosEast, ZulrahPosCenter, ZulrahPosWest, ZulrahPosNorth, ZulrahPosEast, ZulrahPosCenter, ZulrahPosCenter, ZulrahPosWest, ZulrahPosCenter)); 146 | ArrayList Phase4tiles = new ArrayList<>(Arrays.asList(SWCornerTile, SWCornerTile, EPillar, EPillar, WPillar, WPillar, WPillar, EPillar, WPillar, WPillar, WPillar, SWCornerTile)); 147 | ArrayList Phase4ticks = new ArrayList<>(Arrays.asList(28, 36, 24, 30, 28, 17, 34, 33, 20, 27, 29, 18)); 148 | 149 | @Subscribe 150 | public void onGameTick(GameTick event) { 151 | if (!config.EnableZulrah()) { 152 | return; 153 | } 154 | 155 | if (phase4 && phases.size() == 11) { 156 | jadphase = 1; 157 | } else if (phase3 && phases.size() == 10) { 158 | jadphase = 1; 159 | } else if (phase2 && phases.size() == 9) { 160 | jadphase = 2; 161 | } else if (phase1 && phases.size() == 9) { 162 | jadphase = 2; 163 | } else { 164 | jadphase = 0; 165 | jadflip = false; 166 | } 167 | 168 | boolean foundzulrah = false; 169 | for (NPC monster : client.getNpcs()) 170 | { 171 | if (monster == null || monster.getName() == null) 172 | { 173 | continue; 174 | } 175 | if (monster.getName().equalsIgnoreCase("zulrah")) { 176 | foundzulrah = true; 177 | Zulrah = monster; 178 | break; 179 | } 180 | } 181 | if (!foundzulrah) { 182 | Zulrah = null; 183 | } 184 | 185 | if (Zulrah != null) { 186 | if (zulrahstart == 0) { 187 | currenttile = SWCornerTile; 188 | lastloc = Zulrah.getLocalLocation(); 189 | lastphase = Zulrah.getId(); 190 | zulrahstart = client.getTickCount(); 191 | phases.add(lastphase); 192 | locations.add(lastloc); 193 | phaseticks = 28; 194 | } else { 195 | if (!Zulrah.getLocalLocation().equals(lastloc) || Zulrah.getId() != lastphase) { 196 | if (restart) { 197 | phases.clear(); 198 | locations.clear(); 199 | zulrahstart = client.getTickCount(); 200 | lastphase = 0; 201 | lastloc = null; 202 | phase = 0; 203 | phase1 = true; 204 | phase2 = true; 205 | phase3 = true; 206 | phase4 = true; 207 | nextzulrahtile = null; 208 | nztcolor = null; 209 | nexttile = null; 210 | currenttile = SWCornerTile; 211 | restart = false; 212 | ticks = 0; 213 | prayerconserve = false; 214 | phaseticks = 34; 215 | not = 0; 216 | nextprayerendticks = 0; 217 | } 218 | lastloc = Zulrah.getLocalLocation(); 219 | lastphase = Zulrah.getId(); 220 | ticks = 0; 221 | phases.add(lastphase); 222 | locations.add(lastloc); 223 | if (phase == 0) { 224 | for (int i = 0; i < phases.size(); i++) { 225 | if (phase1) { 226 | if (!phases.get(i).equals(Phase1types.get(i)) || !locations.get(i).equals(Phase1pos.get(i))) { 227 | phase1 = false; 228 | not++; 229 | } 230 | } 231 | if (phase2) { 232 | if (!phases.get(i).equals(Phase2types.get(i)) || !locations.get(i).equals(Phase2pos.get(i))) { 233 | phase2 = false; 234 | not++; 235 | } 236 | } 237 | if (phase3) { 238 | if (!phases.get(i).equals(Phase3types.get(i)) || !locations.get(i).equals(Phase3pos.get(i))) { 239 | phase3 = false; 240 | not++; 241 | } 242 | } 243 | if (phase4) { 244 | if (!phases.get(i).equals(Phase4types.get(i)) || !locations.get(i).equals(Phase4pos.get(i))) { 245 | phase4 = false; 246 | not++; 247 | } 248 | } 249 | } 250 | 251 | if (not == 2) { 252 | if (lastphase == 2043) { 253 | nztcolor = Color.BLUE; 254 | nextzulrahtile = ZulrahPosCenter; 255 | currenttile = SWCornerTile; 256 | nexttile = SWCornerTile; 257 | phaseticks = Phase2ticks.get(phases.size() - 1); 258 | prayerconserve = true; 259 | } else if (lastphase == 2044) { 260 | nztcolor = Color.GREEN; 261 | nextzulrahtile = ZulrahPosNorth; 262 | currenttile = SWCornerTile; 263 | nexttile = EPillar; 264 | phaseticks = Phase2ticks.get(phases.size() - 1); 265 | prayerconserve = false; 266 | } 267 | } else if (not == 3) { 268 | if (phase1) { 269 | nztcolor = zulrahtype(Phase1types.get(phases.size())); 270 | nextzulrahtile = Phase1pos.get(phases.size()); 271 | currenttile = Phase1tiles.get(phases.size() - 1); 272 | nexttile = Phase1tiles.get(phases.size()); 273 | phaseticks = Phase1ticks.get(phases.size() - 1); 274 | prayerconserve = true; 275 | phase = 1; 276 | } else if (phase2) { 277 | nztcolor = zulrahtype(Phase2types.get(phases.size())); 278 | nextzulrahtile = Phase2pos.get(phases.size()); 279 | currenttile = Phase2tiles.get(phases.size() - 1); 280 | nexttile = Phase2tiles.get(phases.size()); 281 | phaseticks = Phase2ticks.get(phases.size() - 1); 282 | prayerconserve = false; 283 | phase = 2; 284 | } else if (phase3) { 285 | nztcolor = zulrahtype(Phase3types.get(phases.size())); 286 | nextzulrahtile = Phase3pos.get(phases.size()); 287 | currenttile = Phase3tiles.get(phases.size() - 1); 288 | nexttile = Phase3tiles.get(phases.size()); 289 | phaseticks = Phase3ticks.get(phases.size() - 1); 290 | prayerconserve = false; 291 | phase = 3; 292 | } else if (phase4) { 293 | nztcolor = zulrahtype(Phase4types.get(phases.size())); 294 | nextzulrahtile = Phase4pos.get(phases.size()); 295 | currenttile = Phase4tiles.get(phases.size() - 1); 296 | nexttile = Phase4tiles.get(phases.size()); 297 | phaseticks = Phase4ticks.get(phases.size() - 1); 298 | prayerconserve = true; 299 | phase = 4; 300 | } else { 301 | System.out.println("ERROR: COULD NOT IDENTIFY ZULRAH PHASE!"); 302 | } 303 | not = 0; 304 | } 305 | } else { 306 | if (phase == 1) { 307 | if (Phase1types.size() == phases.size()) { 308 | nztcolor = null; 309 | nextzulrahtile = null; 310 | nexttile = null; 311 | restart = true; 312 | } else { 313 | nextzulrahtile = Phase1pos.get(phases.size()); 314 | nexttile = Phase1tiles.get(phases.size()); 315 | if (phases.size() == 8) { 316 | nztcolor = Color.YELLOW; 317 | } else { 318 | nztcolor = zulrahtype(Phase1types.get(phases.size())); 319 | } 320 | } 321 | currenttile = Phase1tiles.get(phases.size() - 1); 322 | phaseticks = Phase1ticks.get(phases.size() - 1); 323 | } else if (phase == 2) { 324 | if (Phase2types.size() == phases.size()) { 325 | nztcolor = null; 326 | nextzulrahtile = null; 327 | nexttile = null; 328 | restart = true; 329 | } else { 330 | nextzulrahtile = Phase2pos.get(phases.size()); 331 | nexttile = Phase2tiles.get(phases.size()); 332 | if (phases.size() == 8) { 333 | nztcolor = Color.YELLOW; 334 | } else { 335 | nztcolor = zulrahtype(Phase2types.get(phases.size())); 336 | } 337 | } 338 | currenttile = Phase2tiles.get(phases.size() - 1); 339 | phaseticks = Phase2ticks.get(phases.size() - 1); 340 | } else if (phase == 3) { 341 | if (Phase3types.size() == phases.size()) { 342 | nztcolor = null; 343 | nextzulrahtile = null; 344 | nexttile = null; 345 | restart = true; 346 | } else { 347 | nextzulrahtile = Phase3pos.get(phases.size()); 348 | nexttile = Phase3tiles.get(phases.size()); 349 | if (phases.size() == 9) { 350 | nztcolor = Color.YELLOW; 351 | } else { 352 | nztcolor = zulrahtype(Phase3types.get(phases.size())); 353 | } 354 | } 355 | currenttile = Phase3tiles.get(phases.size() - 1); 356 | phaseticks = Phase3ticks.get(phases.size() - 1); 357 | } else if (phase == 4) { 358 | if (Phase4types.size() == phases.size()) { 359 | nztcolor = null; 360 | nextzulrahtile = null; 361 | nexttile = null; 362 | restart = true; 363 | } else { 364 | nextzulrahtile = Phase4pos.get(phases.size()); 365 | nexttile = Phase4tiles.get(phases.size()); 366 | if (phases.size() == 10) { 367 | nztcolor = Color.YELLOW; 368 | } else { 369 | nztcolor = zulrahtype(Phase4types.get(phases.size())); 370 | } 371 | } 372 | currenttile = Phase4tiles.get(phases.size() - 1); 373 | phaseticks = Phase4ticks.get(phases.size() - 1); 374 | } else { 375 | System.out.println("ERROR: COULD NOT IDENTIFY ZULRAH PHASE!"); 376 | } 377 | } 378 | } else { 379 | ticks++; 380 | if (phases.size() == 1 && phaseticks == 34) { 381 | if (ticks >= 18) { 382 | prayerconserve = true; 383 | } else { 384 | prayerconserve = false; 385 | } 386 | } 387 | if (not == 2) { 388 | if (lastphase == 2043) { 389 | if (ticks >= 12 && ticks <= 13) { 390 | MeleeTile = SWCornerTileMelee; 391 | } else { 392 | MeleeTile = null; 393 | } 394 | } 395 | } else if (phase == 1) { 396 | if (phases.size() == 5) { 397 | if (ticks >= 19) { 398 | prayerconserve = true; 399 | } else { 400 | prayerconserve = false; 401 | } 402 | } else if (phases.size() == 8) { 403 | if (ticks >= 19) { 404 | prayerconserve = true; 405 | } else { 406 | prayerconserve = false; 407 | } 408 | } else if (phases.size() == 9) { 409 | if (ticks >= 34) { 410 | prayerconserve = true; 411 | } else { 412 | prayerconserve = false; 413 | } 414 | } else if (phases.size() == 10) { 415 | if (ticks >= 12 && ticks <= 13) { 416 | MeleeTile = SWCornerTileMelee; 417 | } else { 418 | MeleeTile = null; 419 | } 420 | } else if (phases.size() == 4 || phases.size() == 6 || phases.size() == 10) { 421 | prayerconserve = true; 422 | } else { 423 | prayerconserve = false; 424 | } 425 | } else if (phase == 2) { 426 | if (phases.size() == 4) { 427 | if (ticks >= 20) { 428 | prayerconserve = true; 429 | } else { 430 | prayerconserve = false; 431 | } 432 | } else if (phases.size() == 8) { 433 | if (ticks >= 18) { 434 | prayerconserve = true; 435 | } else { 436 | prayerconserve = false; 437 | } 438 | } else if (phases.size() == 9) { 439 | if (ticks >= 34) { 440 | prayerconserve = true; 441 | } else { 442 | prayerconserve = false; 443 | } 444 | } else if (phases.size() == 5 || phases.size() == 7 || phases.size() == 10) { 445 | if (phases.size() == 10) { 446 | if (ticks >= 12 && ticks <= 13) { 447 | MeleeTile = SWCornerTileMelee; 448 | } else { 449 | MeleeTile = null; 450 | } 451 | } 452 | prayerconserve = true; 453 | } else { 454 | prayerconserve = false; 455 | } 456 | } else if (phase == 3) { 457 | if (phases.size() == 2) { 458 | if (ticks >= 20) { 459 | prayerconserve = true; 460 | } else { 461 | prayerconserve = false; 462 | } 463 | } else if (phases.size() == 3) { 464 | prayerconserve = true; 465 | if (ticks >= 24 && ticks <= 25) { 466 | MeleeTile = SECornerTileMelee; 467 | } else if (ticks >= 32 && ticks <= 33) { 468 | MeleeTile = SECornerTile; 469 | } else { 470 | MeleeTile = null; 471 | } 472 | } else if (phases.size() == 7 || phases.size() == 11) { 473 | prayerconserve = true; 474 | } else if (phases.size() == 9) { 475 | if (ticks >= 16) { 476 | prayerconserve = true; 477 | } else { 478 | prayerconserve = false; 479 | } 480 | } else { 481 | prayerconserve = false; 482 | } 483 | } else if (phase == 4) { 484 | if (phases.size() == 2) { 485 | if (ticks >= 10 && ticks <= 16) { 486 | nextprayerendticks = 16; 487 | } else { 488 | nextprayerendticks = 0; 489 | } 490 | 491 | if (ticks >= 16) { 492 | prayerconserve = false; 493 | } else { 494 | prayerconserve = true; 495 | } 496 | } else if (phases.size() == 3) { 497 | if (ticks >= 16) { 498 | prayerconserve = true; 499 | } else { 500 | prayerconserve = false; 501 | } 502 | } else if (phases.size() == 4) { 503 | if (ticks >= 10 && ticks <= 16) { 504 | nextprayerendticks = 16; 505 | } else { 506 | nextprayerendticks = 0; 507 | } 508 | 509 | if (ticks <= 16) { 510 | prayerconserve = true; 511 | } else { 512 | prayerconserve = false; 513 | } 514 | } else if (phases.size() == 5 || phases.size() == 7 || phases.size() == 12) { 515 | prayerconserve = true; 516 | } else if (phases.size() == 8) { 517 | if (ticks >= 18) { 518 | prayerconserve = true; 519 | } else { 520 | prayerconserve = false; 521 | } 522 | } else if (phases.size() == 10) { 523 | if (ticks >= 14) { 524 | prayerconserve = true; 525 | } else { 526 | prayerconserve = false; 527 | } 528 | } else { 529 | prayerconserve = false; 530 | } 531 | } 532 | } 533 | } 534 | } else { 535 | if (zulrahstart > 0) { 536 | phases.clear(); 537 | locations.clear(); 538 | zulrahstart = 0; 539 | lastphase= 0; 540 | lastloc = null; 541 | phase = 0; 542 | phase1 = true; 543 | phase2 = true; 544 | phase3 = true; 545 | phase4 = true; 546 | nextzulrahtile = null; 547 | nztcolor = null; 548 | nexttile = null; 549 | currenttile = null; 550 | restart = false; 551 | ticks = 0; 552 | prayerconserve = false; 553 | not = 0; 554 | nextprayerendticks = 0; 555 | jadphase = 0; 556 | jadflip = false; 557 | } 558 | } 559 | } 560 | 561 | @Subscribe 562 | public void onAnimationChanged(AnimationChanged event) { 563 | Actor Zulrhyboy = event.getActor(); 564 | if (Zulrhyboy != null && Zulrhyboy.getName() != null) { 565 | if (Zulrhyboy instanceof NPC) { 566 | if (Zulrhyboy.equals(Zulrah)) { 567 | if (jadphase > 0) { 568 | if (Zulrhyboy.getAnimation() == 5069) { 569 | if (!jadflip) { 570 | jadflip = true; 571 | } else { 572 | jadflip = false; 573 | } 574 | } 575 | } 576 | } 577 | } 578 | } 579 | } 580 | 581 | 582 | public Color zulrahtype(int type) { 583 | switch(type) { 584 | case 2042: 585 | return Color.GREEN; 586 | case 2043: 587 | return Color.RED; 588 | case 2044: 589 | return Color.BLUE; 590 | } 591 | return null; 592 | } 593 | 594 | private void loadProtectionIcons() { 595 | final IndexedSprite[] protectionIcons = {}; 596 | final IndexedSprite[] newProtectionIcons = Arrays.copyOf(protectionIcons, PROTECTION_ICONS.length); 597 | int curPosition = 0; 598 | 599 | for (int i = 0; i < PROTECTION_ICONS.length; i++, curPosition++) 600 | { 601 | final int resource = PROTECTION_ICONS[i]; 602 | ProtectionIcons[i] = rgbaToIndexedBufferedImage(ProtectionIconFromSprite(spriteManager.getSprite(resource, 0))); 603 | newProtectionIcons[curPosition] = createIndexedSprite(client, ProtectionIcons[i]); 604 | } 605 | } 606 | 607 | private static IndexedSprite createIndexedSprite(final Client client, final BufferedImage bufferedImage) { 608 | final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); 609 | 610 | final int width = bufferedImage.getWidth(); 611 | final int height = bufferedImage.getHeight(); 612 | final byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); 613 | final int[] palette = new int[indexedCM.getMapSize()]; 614 | indexedCM.getRGBs(palette); 615 | 616 | final IndexedSprite newIndexedSprite = client.createIndexedSprite(); 617 | newIndexedSprite.setPixels(pixels); 618 | newIndexedSprite.setPalette(palette); 619 | newIndexedSprite.setWidth(width); 620 | newIndexedSprite.setHeight(height); 621 | newIndexedSprite.setOriginalWidth(width); 622 | newIndexedSprite.setOriginalHeight(height); 623 | newIndexedSprite.setOffsetX(0); 624 | newIndexedSprite.setOffsetY(0); 625 | return newIndexedSprite; 626 | } 627 | 628 | private static BufferedImage rgbaToIndexedBufferedImage(final BufferedImage sourceBufferedImage) { 629 | final BufferedImage indexedImage = new BufferedImage( 630 | sourceBufferedImage.getWidth(), 631 | sourceBufferedImage.getHeight(), 632 | BufferedImage.TYPE_BYTE_INDEXED); 633 | 634 | final ColorModel cm = indexedImage.getColorModel(); 635 | final IndexColorModel icm = (IndexColorModel) cm; 636 | 637 | final int size = icm.getMapSize(); 638 | final byte[] reds = new byte[size]; 639 | final byte[] greens = new byte[size]; 640 | final byte[] blues = new byte[size]; 641 | icm.getReds(reds); 642 | icm.getGreens(greens); 643 | icm.getBlues(blues); 644 | 645 | final WritableRaster raster = indexedImage.getRaster(); 646 | final int pixel = raster.getSample(0, 0, 0); 647 | final IndexColorModel resultIcm = new IndexColorModel(8, size, reds, greens, blues, pixel); 648 | final BufferedImage resultIndexedImage = new BufferedImage(resultIcm, raster, sourceBufferedImage.isAlphaPremultiplied(), null); 649 | resultIndexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null); 650 | return resultIndexedImage; 651 | } 652 | 653 | private static BufferedImage ProtectionIconFromSprite(final BufferedImage freezeSprite) { 654 | final BufferedImage freezeCanvas = ImageUtil.resizeCanvas(freezeSprite, PROTECTION_ICON_DIMENSION.width, PROTECTION_ICON_DIMENSION.height); 655 | return ImageUtil.outlineImage(freezeCanvas, PROTECTION_ICON_OUTLINE_COLOR); 656 | } 657 | 658 | BufferedImage getProtectionIcon() { 659 | int type = 0; 660 | if (phase1) { 661 | type = Phase1types.get(phases.size()); 662 | } else if (phase2) { 663 | type = Phase2types.get(phases.size()); 664 | } else if (phase3) { 665 | type = Phase3types.get(phases.size()); 666 | } else if (phase4) { 667 | type = Phase4types.get(phases.size()); 668 | } else { 669 | System.out.println("ERROR: COULD NOT IDENTIFY ZULRAH PHASE!"); 670 | } 671 | 672 | if (type > 0) { 673 | switch (type) { 674 | case 2042: 675 | return ProtectionIcons[0]; 676 | case 2043: 677 | return ProtectionIcons[1]; 678 | case 2044: 679 | return ProtectionIcons[2]; 680 | } 681 | } 682 | return null; 683 | } 684 | } --------------------------------------------------------------------------------