test_class.declarator: timersPlugin
test_class.modifier: @Inject
  	private
test_class.original_string: @Inject
  	private TimersPlugin timersPlugin;
test_class.type: TimersPlugin
test_class.var_name: timersPlugin
test_class.declarator: timersConfig
test_class.modifier: @Mock
  	@Bind
  	private
test_class.original_string: @Mock
  	@Bind
  	private TimersConfig timersConfig;
test_class.type: TimersConfig
test_class.var_name: timersConfig
test_class.declarator: client
test_class.modifier: @Mock
  	@Bind
  	private
test_class.original_string: @Mock
  	@Bind
  	private Client client;
test_class.type: Client
test_class.var_name: client
test_class.declarator: itemManager
test_class.modifier: @Mock
  	@Bind
  	private
test_class.original_string: @Mock
  	@Bind
  	private ItemManager itemManager;
test_class.type: ItemManager
test_class.var_name: itemManager
test_class.declarator: spriteManager
test_class.modifier: @Mock
  	@Bind
  	private
test_class.original_string: @Mock
  	@Bind
  	private SpriteManager spriteManager;
test_class.type: SpriteManager
test_class.var_name: spriteManager
test_class.declarator: infoBoxManager
test_class.modifier: @Mock
  	@Bind
  	private
test_class.original_string: @Mock
  	@Bind
  	private InfoBoxManager infoBoxManager;
test_class.type: InfoBoxManager
test_class.var_name: infoBoxManager
test_class.file: runelite-client/src/test/java/net/runelite/client/plugins/timers/TimersPluginTest.java
test_class.identifier: TimersPluginTest
test_case.body: @Test
  	public void testTzhaarTimer()
  	{
  		when(timersConfig.showTzhaarTimers()).thenReturn(true);
  		when(client.getMapRegions()).thenReturn(new int[]{TimersPlugin.FIGHT_CAVES_REGION_ID});
  
  		class InstantRef
  		{
  			Instant i;
  		}
  
  		InstantRef startTime = new InstantRef();
  		when(timersConfig.tzhaarStartTime()).then(a -> startTime.i);
  		doAnswer((Answer<Void>) invocationOnMock ->
  		{
  			Object argument = invocationOnMock.getArguments()[0];
  			startTime.i = (Instant) argument;
  			return null;
  		}).when(timersConfig).tzhaarStartTime(nullable(Instant.class));
  
  		InstantRef lastTime = new InstantRef();
  		when(timersConfig.tzhaarLastTime()).then(a -> lastTime.i);
  		doAnswer((Answer<Void>) invocationOnMock ->
  		{
  			Object argument = invocationOnMock.getArguments()[0];
  			lastTime.i = (Instant) argument;
  			return null;
  		}).when(timersConfig).tzhaarLastTime(nullable(Instant.class));
  
  		// test timer creation: verify the infobox was added and that it is an ElapsedTimer
  		ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", "<col=ef1020>Wave: 1</col>", "", 0);
  		timersPlugin.onChatMessage(chatMessage);
  		ArgumentCaptor<InfoBox> captor = ArgumentCaptor.forClass(InfoBox.class);
  		verify(infoBoxManager, times(1)).addInfoBox(captor.capture());
  		assertTrue(captor.getValue() instanceof ElapsedTimer);
  
  		// test timer pause: verify the added ElapsedTimer has a non-null lastTime
  		chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "",  "<col=ef1020>The Inferno has been paused. You may now log out.", "", 0);
  		timersPlugin.onChatMessage(chatMessage);
  		verify(infoBoxManager, times(1)).removeInfoBox(captor.capture());
  		verify(infoBoxManager, times(2)).addInfoBox(captor.capture());
  		assertTrue(captor.getValue() instanceof ElapsedTimer);
  		ElapsedTimer timer = (ElapsedTimer) captor.getValue();
  		assertNotEquals(timer.getLastTime(), null);
  		Instant oldTime = ((ElapsedTimer) captor.getValue()).getStartTime();
  
  		// test timer unpause: verify the last time is null after being unpaused
  		chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "",  "<col=ef1020>Wave: 2</col>", "", 0);
  		timersPlugin.onChatMessage(chatMessage);
  		verify(infoBoxManager, times(2)).removeInfoBox(captor.capture());
  		verify(infoBoxManager, times(3)).addInfoBox(captor.capture());
  		assertTrue(captor.getValue() instanceof ElapsedTimer);
  		timer = (ElapsedTimer) captor.getValue();
  		assertNull(timer.getLastTime());
  
  		// test timer remove: verify the infobox was removed (and no more were added)
  		chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "",  "You have been defeated!", "", 0);
  		timersPlugin.onChatMessage(chatMessage);
  		verify(infoBoxManager, times(3)).removeInfoBox(captor.capture());
  		verify(infoBoxManager, times(3)).addInfoBox(captor.capture());
  	}
test_case.class_method_signature: TimersPluginTest.testTzhaarTimer()
test_case.full_signature: @Test public void testTzhaarTimer()
test_case.identifier: testTzhaarTimer
test_case.invocations: thenReturn when showTzhaarTimers thenReturn when getMapRegions then when tzhaarStartTime tzhaarStartTime when doAnswer getArguments nullable then when tzhaarLastTime tzhaarLastTime when doAnswer getArguments nullable onChatMessage forClass addInfoBox verify times capture assertTrue getValue onChatMessage removeInfoBox verify times capture addInfoBox verify times capture assertTrue getValue getValue assertNotEquals getLastTime getStartTime getValue onChatMessage removeInfoBox verify times capture addInfoBox verify times capture assertTrue getValue getValue assertNull getLastTime onChatMessage removeInfoBox verify times capture addInfoBox verify times capture
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testTzhaarTimer()
focal_class.declarator: ANTIFIRE_DRINK_MESSAGE = "You drink some of your antifire potion."
focal_class.modifier: private static final
focal_class.original_string: private static final String ANTIFIRE_DRINK_MESSAGE = "You drink some of your antifire potion.";
focal_class.type: String
focal_class.var_name: ANTIFIRE_DRINK_MESSAGE
focal_class.declarator: ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your antifire potion has expired.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your antifire potion has expired.</col>";
focal_class.type: String
focal_class.var_name: ANTIFIRE_EXPIRED_MESSAGE
focal_class.declarator: CANNON_FURNACE_MESSAGE = "You add the furnace."
focal_class.modifier: private static final
focal_class.original_string: private static final String CANNON_FURNACE_MESSAGE = "You add the furnace.";
focal_class.type: String
focal_class.var_name: CANNON_FURNACE_MESSAGE
focal_class.declarator: CANNON_PICKUP_MESSAGE = "You pick up the cannon. It's really heavy."
focal_class.modifier: private static final
focal_class.original_string: private static final String CANNON_PICKUP_MESSAGE = "You pick up the cannon. It's really heavy.";
focal_class.type: String
focal_class.var_name: CANNON_PICKUP_MESSAGE
focal_class.declarator: CANNON_REPAIR_MESSAGE = "You repair your cannon, restoring it to working order."
focal_class.modifier: private static final
focal_class.original_string: private static final String CANNON_REPAIR_MESSAGE = "You repair your cannon, restoring it to working order.";
focal_class.type: String
focal_class.var_name: CANNON_REPAIR_MESSAGE
focal_class.declarator: CHARGE_EXPIRED_MESSAGE = "<col=ef1020>Your magical charge fades away.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String CHARGE_EXPIRED_MESSAGE = "<col=ef1020>Your magical charge fades away.</col>";
focal_class.type: String
focal_class.var_name: CHARGE_EXPIRED_MESSAGE
focal_class.declarator: CHARGE_MESSAGE = "<col=ef1020>You feel charged with magic power.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String CHARGE_MESSAGE = "<col=ef1020>You feel charged with magic power.</col>";
focal_class.type: String
focal_class.var_name: CHARGE_MESSAGE
focal_class.declarator: EXTENDED_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended antifire potion."
focal_class.modifier: private static final
focal_class.original_string: private static final String EXTENDED_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended antifire potion.";
focal_class.type: String
focal_class.var_name: EXTENDED_ANTIFIRE_DRINK_MESSAGE
focal_class.declarator: EXTENDED_SUPER_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended super antifire potion."
focal_class.modifier: private static final
focal_class.original_string: private static final String EXTENDED_SUPER_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended super antifire potion.";
focal_class.type: String
focal_class.var_name: EXTENDED_SUPER_ANTIFIRE_DRINK_MESSAGE
focal_class.declarator: FROZEN_MESSAGE = "<col=ef1020>You have been frozen!</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String FROZEN_MESSAGE = "<col=ef1020>You have been frozen!</col>";
focal_class.type: String
focal_class.var_name: FROZEN_MESSAGE
focal_class.declarator: GAUNTLET_ENTER_MESSAGE = "You enter the Gauntlet."
focal_class.modifier: private static final
focal_class.original_string: private static final String GAUNTLET_ENTER_MESSAGE = "You enter the Gauntlet.";
focal_class.type: String
focal_class.var_name: GAUNTLET_ENTER_MESSAGE
focal_class.declarator: GOD_WARS_ALTAR_MESSAGE = "you recharge your prayer."
focal_class.modifier: private static final
focal_class.original_string: private static final String GOD_WARS_ALTAR_MESSAGE = "you recharge your prayer.";
focal_class.type: String
focal_class.var_name: GOD_WARS_ALTAR_MESSAGE
focal_class.declarator: IMBUED_HEART_READY_MESSAGE = "<col=ef1020>Your imbued heart has regained its magical power.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String IMBUED_HEART_READY_MESSAGE = "<col=ef1020>Your imbued heart has regained its magical power.</col>";
focal_class.type: String
focal_class.var_name: IMBUED_HEART_READY_MESSAGE
focal_class.declarator: MAGIC_IMBUE_EXPIRED_MESSAGE = "Your Magic Imbue charge has ended."
focal_class.modifier: private static final
focal_class.original_string: private static final String MAGIC_IMBUE_EXPIRED_MESSAGE = "Your Magic Imbue charge has ended.";
focal_class.type: String
focal_class.var_name: MAGIC_IMBUE_EXPIRED_MESSAGE
focal_class.declarator: MAGIC_IMBUE_MESSAGE = "You are charged to combine runes!"
focal_class.modifier: private static final
focal_class.original_string: private static final String MAGIC_IMBUE_MESSAGE = "You are charged to combine runes!";
focal_class.type: String
focal_class.var_name: MAGIC_IMBUE_MESSAGE
focal_class.declarator: STAFF_OF_THE_DEAD_SPEC_EXPIRED_MESSAGE = "Your protection fades away"
focal_class.modifier: private static final
focal_class.original_string: private static final String STAFF_OF_THE_DEAD_SPEC_EXPIRED_MESSAGE = "Your protection fades away";
focal_class.type: String
focal_class.var_name: STAFF_OF_THE_DEAD_SPEC_EXPIRED_MESSAGE
focal_class.declarator: STAFF_OF_THE_DEAD_SPEC_MESSAGE = "Spirits of deceased evildoers offer you their protection"
focal_class.modifier: private static final
focal_class.original_string: private static final String STAFF_OF_THE_DEAD_SPEC_MESSAGE = "Spirits of deceased evildoers offer you their protection";
focal_class.type: String
focal_class.var_name: STAFF_OF_THE_DEAD_SPEC_MESSAGE
focal_class.declarator: STAMINA_DRINK_MESSAGE = "You drink some of your stamina potion."
focal_class.modifier: private static final
focal_class.original_string: private static final String STAMINA_DRINK_MESSAGE = "You drink some of your stamina potion.";
focal_class.type: String
focal_class.var_name: STAMINA_DRINK_MESSAGE
focal_class.declarator: STAMINA_SHARED_DRINK_MESSAGE = "You have received a shared dose of stamina potion."
focal_class.modifier: private static final
focal_class.original_string: private static final String STAMINA_SHARED_DRINK_MESSAGE = "You have received a shared dose of stamina potion.";
focal_class.type: String
focal_class.var_name: STAMINA_SHARED_DRINK_MESSAGE
focal_class.declarator: STAMINA_EXPIRED_MESSAGE = "<col=8f4808>Your stamina potion has expired.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String STAMINA_EXPIRED_MESSAGE = "<col=8f4808>Your stamina potion has expired.</col>";
focal_class.type: String
focal_class.var_name: STAMINA_EXPIRED_MESSAGE
focal_class.declarator: SUPER_ANTIFIRE_DRINK_MESSAGE = "You drink some of your super antifire potion"
focal_class.modifier: private static final
focal_class.original_string: private static final String SUPER_ANTIFIRE_DRINK_MESSAGE = "You drink some of your super antifire potion";
focal_class.type: String
focal_class.var_name: SUPER_ANTIFIRE_DRINK_MESSAGE
focal_class.declarator: SUPER_ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your super antifire potion has expired.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String SUPER_ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your super antifire potion has expired.</col>";
focal_class.type: String
focal_class.var_name: SUPER_ANTIFIRE_EXPIRED_MESSAGE
focal_class.declarator: KILLED_TELEBLOCK_OPPONENT_TEXT = "Your Tele Block has been removed because you killed "
focal_class.modifier: private static final
focal_class.original_string: private static final String KILLED_TELEBLOCK_OPPONENT_TEXT = "Your Tele Block has been removed because you killed ";
focal_class.type: String
focal_class.var_name: KILLED_TELEBLOCK_OPPONENT_TEXT
focal_class.declarator: PRAYER_ENHANCE_EXPIRED = "<col=ff0000>Your prayer enhance effect has worn off.</col>"
focal_class.modifier: private static final
focal_class.original_string: private static final String PRAYER_ENHANCE_EXPIRED = "<col=ff0000>Your prayer enhance effect has worn off.</col>";
focal_class.type: String
focal_class.var_name: PRAYER_ENHANCE_EXPIRED
focal_class.declarator: ENDURANCE_EFFECT_MESSAGE = "Your Ring of endurance doubles the duration of your stamina potion's effect."
focal_class.modifier: private static final
focal_class.original_string: private static final String ENDURANCE_EFFECT_MESSAGE = "Your Ring of endurance doubles the duration of your stamina potion's effect.";
focal_class.type: String
focal_class.var_name: ENDURANCE_EFFECT_MESSAGE
focal_class.declarator: TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you(?: by .+)?\\. It will expire in (?<mins>\\d+) minutes?(?:, (?<secs>\\d+) seconds?)?\\.")
focal_class.modifier: private static final
focal_class.original_string: private static final Pattern TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you(?: by .+)?\\. It will expire in (?<mins>\\d+) minutes?(?:, (?<secs>\\d+) seconds?)?\\.");
focal_class.type: Pattern
focal_class.var_name: TELEBLOCK_PATTERN
focal_class.declarator: DIVINE_POTION_PATTERN = Pattern.compile("You drink some of your divine (.+) potion\\.")
focal_class.modifier: private static final
focal_class.original_string: private static final Pattern DIVINE_POTION_PATTERN = Pattern.compile("You drink some of your divine (.+) potion\\.");
focal_class.type: Pattern
focal_class.var_name: DIVINE_POTION_PATTERN
focal_class.declarator: VENOM_VALUE_CUTOFF = -40
focal_class.modifier: private static final
focal_class.original_string: private static final int VENOM_VALUE_CUTOFF = -40;
focal_class.type: int
focal_class.var_name: VENOM_VALUE_CUTOFF
focal_class.declarator: POISON_TICK_LENGTH = 30
focal_class.modifier: private static final
focal_class.original_string: private static final int POISON_TICK_LENGTH = 30;
focal_class.type: int
focal_class.var_name: POISON_TICK_LENGTH
focal_class.declarator: FIGHT_CAVES_REGION_ID = 9551
focal_class.modifier: static final
focal_class.original_string: static final int FIGHT_CAVES_REGION_ID = 9551;
focal_class.type: int
focal_class.var_name: FIGHT_CAVES_REGION_ID
focal_class.declarator: INFERNO_REGION_ID = 9043
focal_class.modifier: static final
focal_class.original_string: static final int INFERNO_REGION_ID = 9043;
focal_class.type: int
focal_class.var_name: INFERNO_REGION_ID
focal_class.declarator: TZHAAR_WAVE_MESSAGE = Pattern.compile("Wave: (\\d+)")
focal_class.modifier: private static final
focal_class.original_string: private static final Pattern TZHAAR_WAVE_MESSAGE = Pattern.compile("Wave: (\\d+)");
focal_class.type: Pattern
focal_class.var_name: TZHAAR_WAVE_MESSAGE
focal_class.declarator: TZHAAR_DEFEATED_MESSAGE = "You have been defeated!"
focal_class.modifier: private static final
focal_class.original_string: private static final String TZHAAR_DEFEATED_MESSAGE = "You have been defeated!";
focal_class.type: String
focal_class.var_name: TZHAAR_DEFEATED_MESSAGE
focal_class.declarator: TZHAAR_COMPLETE_MESSAGE = Pattern.compile("Your (TzTok-Jad|TzKal-Zuk) kill count is:")
focal_class.modifier: private static final
focal_class.original_string: private static final Pattern TZHAAR_COMPLETE_MESSAGE = Pattern.compile("Your (TzTok-Jad|TzKal-Zuk) kill count is:");
focal_class.type: Pattern
focal_class.var_name: TZHAAR_COMPLETE_MESSAGE
focal_class.declarator: TZHAAR_PAUSED_MESSAGE = Pattern.compile("The (Inferno|Fight Cave) has been paused. You may now log out.")
focal_class.modifier: private static final
focal_class.original_string: private static final Pattern TZHAAR_PAUSED_MESSAGE = Pattern.compile("The (Inferno|Fight Cave) has been paused. You may now log out.");
focal_class.type: Pattern
focal_class.var_name: TZHAAR_PAUSED_MESSAGE
focal_class.declarator: freezeTimer
focal_class.modifier: private
focal_class.original_string: private TimerTimer freezeTimer;
focal_class.type: TimerTimer
focal_class.var_name: freezeTimer
focal_class.declarator: freezeTime = -1
focal_class.modifier: private
focal_class.original_string: private int freezeTime = -1;
focal_class.type: int
focal_class.var_name: freezeTime
focal_class.declarator: staminaTimer
focal_class.modifier: private
focal_class.original_string: private TimerTimer staminaTimer;
focal_class.type: TimerTimer
focal_class.var_name: staminaTimer
focal_class.declarator: wasWearingEndurance
focal_class.modifier: private
focal_class.original_string: private boolean wasWearingEndurance;
focal_class.type: boolean
focal_class.var_name: wasWearingEndurance
focal_class.declarator: lastRaidVarb
focal_class.modifier: private
focal_class.original_string: private int lastRaidVarb;
focal_class.type: int
focal_class.var_name: lastRaidVarb
focal_class.declarator: lastWildernessVarb
focal_class.modifier: private
focal_class.original_string: private int lastWildernessVarb;
focal_class.type: int
focal_class.var_name: lastWildernessVarb
focal_class.declarator: lastVengCooldownVarb
focal_class.modifier: private
focal_class.original_string: private int lastVengCooldownVarb;
focal_class.type: int
focal_class.var_name: lastVengCooldownVarb
focal_class.declarator: lastIsVengeancedVarb
focal_class.modifier: private
focal_class.original_string: private int lastIsVengeancedVarb;
focal_class.type: int
focal_class.var_name: lastIsVengeancedVarb
focal_class.declarator: lastPoisonVarp
focal_class.modifier: private
focal_class.original_string: private int lastPoisonVarp;
focal_class.type: int
focal_class.var_name: lastPoisonVarp
focal_class.declarator: nextPoisonTick
focal_class.modifier: private
focal_class.original_string: private int nextPoisonTick;
focal_class.type: int
focal_class.var_name: nextPoisonTick
focal_class.declarator: lastPoint
focal_class.modifier: private
focal_class.original_string: private WorldPoint lastPoint;
focal_class.type: WorldPoint
focal_class.var_name: lastPoint
focal_class.declarator: lastTeleportClicked
focal_class.modifier: private
focal_class.original_string: private TeleportWidget lastTeleportClicked;
focal_class.type: TeleportWidget
focal_class.var_name: lastTeleportClicked
focal_class.declarator: lastAnimation
focal_class.modifier: private
focal_class.original_string: private int lastAnimation;
focal_class.type: int
focal_class.var_name: lastAnimation
focal_class.declarator: loggedInRace
focal_class.modifier: private
focal_class.original_string: private boolean loggedInRace;
focal_class.type: boolean
focal_class.var_name: loggedInRace
focal_class.declarator: widgetHiddenChangedOnPvpWorld
focal_class.modifier: private
focal_class.original_string: private boolean widgetHiddenChangedOnPvpWorld;
focal_class.type: boolean
focal_class.var_name: widgetHiddenChangedOnPvpWorld
focal_class.declarator: tzhaarTimer
focal_class.modifier: private
focal_class.original_string: private ElapsedTimer tzhaarTimer;
focal_class.type: ElapsedTimer
focal_class.var_name: tzhaarTimer
focal_class.declarator: itemManager
focal_class.modifier: @Inject
  	private
focal_class.original_string: @Inject
  	private ItemManager itemManager;
focal_class.type: ItemManager
focal_class.var_name: itemManager
focal_class.declarator: spriteManager
focal_class.modifier: @Inject
  	private
focal_class.original_string: @Inject
  	private SpriteManager spriteManager;
focal_class.type: SpriteManager
focal_class.var_name: spriteManager
focal_class.declarator: client
focal_class.modifier: @Inject
  	private
focal_class.original_string: @Inject
  	private Client client;
focal_class.type: Client
focal_class.var_name: client
focal_class.declarator: config
focal_class.modifier: @Inject
  	private
focal_class.original_string: @Inject
  	private TimersConfig config;
focal_class.type: TimersConfig
focal_class.var_name: config
focal_class.declarator: infoBoxManager
focal_class.modifier: @Inject
  	private
focal_class.original_string: @Inject
  	private InfoBoxManager infoBoxManager;
focal_class.type: InfoBoxManager
focal_class.var_name: infoBoxManager
focal_class.file: runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java
focal_class.identifier: TimersPlugin
focal_class.class_method_signature: TimersPlugin.getConfig(ConfigManager configManager)
focal_class.full_signature: @Provides TimersConfig getConfig(ConfigManager configManager)
focal_class.identifier: getConfig
focal_class.modifiers: @Provides
focal_class.parameters: (ConfigManager configManager)
focal_class.return: TimersConfig
focal_class.signature: TimersConfig getConfig(ConfigManager configManager)
focal_class.class_method_signature: TimersPlugin.shutDown()
focal_class.full_signature: @Override protected void shutDown()
focal_class.identifier: shutDown
focal_class.modifiers: @Override protected
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void shutDown()
focal_class.class_method_signature: TimersPlugin.onVarbitChanged(VarbitChanged event)
focal_class.full_signature: @Subscribe public void onVarbitChanged(VarbitChanged event)
focal_class.identifier: onVarbitChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (VarbitChanged event)
focal_class.return: void
focal_class.signature: void onVarbitChanged(VarbitChanged event)
focal_class.class_method_signature: TimersPlugin.onWidgetHiddenChanged(WidgetHiddenChanged event)
focal_class.full_signature: @Subscribe public void onWidgetHiddenChanged(WidgetHiddenChanged event)
focal_class.identifier: onWidgetHiddenChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (WidgetHiddenChanged event)
focal_class.return: void
focal_class.signature: void onWidgetHiddenChanged(WidgetHiddenChanged event)
focal_class.class_method_signature: TimersPlugin.onConfigChanged(ConfigChanged event)
focal_class.full_signature: @Subscribe public void onConfigChanged(ConfigChanged event)
focal_class.identifier: onConfigChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (ConfigChanged event)
focal_class.return: void
focal_class.signature: void onConfigChanged(ConfigChanged event)
focal_class.class_method_signature: TimersPlugin.onMenuOptionClicked(MenuOptionClicked event)
focal_class.full_signature: @Subscribe public void onMenuOptionClicked(MenuOptionClicked event)
focal_class.identifier: onMenuOptionClicked
focal_class.modifiers: @Subscribe public
focal_class.parameters: (MenuOptionClicked event)
focal_class.return: void
focal_class.signature: void onMenuOptionClicked(MenuOptionClicked event)
focal_class.class_method_signature: TimersPlugin.onChatMessage(ChatMessage event)
focal_class.full_signature: @Subscribe public void onChatMessage(ChatMessage event)
focal_class.identifier: onChatMessage
focal_class.modifiers: @Subscribe public
focal_class.parameters: (ChatMessage event)
focal_class.return: void
focal_class.signature: void onChatMessage(ChatMessage event)
focal_class.class_method_signature: TimersPlugin.isInFightCaves()
focal_class.full_signature: private boolean isInFightCaves()
focal_class.identifier: isInFightCaves
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.return: boolean
focal_class.signature: boolean isInFightCaves()
focal_class.class_method_signature: TimersPlugin.isInInferno()
focal_class.full_signature: private boolean isInInferno()
focal_class.identifier: isInInferno
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.return: boolean
focal_class.signature: boolean isInInferno()
focal_class.class_method_signature: TimersPlugin.createTzhaarTimer()
focal_class.full_signature: private void createTzhaarTimer()
focal_class.identifier: createTzhaarTimer
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void createTzhaarTimer()
focal_class.class_method_signature: TimersPlugin.removeTzhaarTimer()
focal_class.full_signature: private void removeTzhaarTimer()
focal_class.identifier: removeTzhaarTimer
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void removeTzhaarTimer()
focal_class.class_method_signature: TimersPlugin.onGameTick(GameTick event)
focal_class.full_signature: @Subscribe public void onGameTick(GameTick event)
focal_class.identifier: onGameTick
focal_class.modifiers: @Subscribe public
focal_class.parameters: (GameTick event)
focal_class.return: void
focal_class.signature: void onGameTick(GameTick event)
focal_class.class_method_signature: TimersPlugin.onGameStateChanged(GameStateChanged gameStateChanged)
focal_class.full_signature: @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged)
focal_class.identifier: onGameStateChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (GameStateChanged gameStateChanged)
focal_class.return: void
focal_class.signature: void onGameStateChanged(GameStateChanged gameStateChanged)
focal_class.class_method_signature: TimersPlugin.onAnimationChanged(AnimationChanged event)
focal_class.full_signature: @Subscribe public void onAnimationChanged(AnimationChanged event)
focal_class.identifier: onAnimationChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (AnimationChanged event)
focal_class.return: void
focal_class.signature: void onAnimationChanged(AnimationChanged event)
focal_class.class_method_signature: TimersPlugin.onGraphicChanged(GraphicChanged event)
focal_class.full_signature: @Subscribe public void onGraphicChanged(GraphicChanged event)
focal_class.identifier: onGraphicChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (GraphicChanged event)
focal_class.return: void
focal_class.signature: void onGraphicChanged(GraphicChanged event)
focal_class.class_method_signature: TimersPlugin.onItemContainerChanged(ItemContainerChanged itemContainerChanged)
focal_class.full_signature: @Subscribe public void onItemContainerChanged(ItemContainerChanged itemContainerChanged)
focal_class.identifier: onItemContainerChanged
focal_class.modifiers: @Subscribe public
focal_class.parameters: (ItemContainerChanged itemContainerChanged)
focal_class.return: void
focal_class.signature: void onItemContainerChanged(ItemContainerChanged itemContainerChanged)
focal_class.class_method_signature: TimersPlugin.onNpcDespawned(NpcDespawned npcDespawned)
focal_class.full_signature: @Subscribe public void onNpcDespawned(NpcDespawned npcDespawned)
focal_class.identifier: onNpcDespawned
focal_class.modifiers: @Subscribe public
focal_class.parameters: (NpcDespawned npcDespawned)
focal_class.return: void
focal_class.signature: void onNpcDespawned(NpcDespawned npcDespawned)
focal_class.class_method_signature: TimersPlugin.onActorDeath(ActorDeath actorDeath)
focal_class.full_signature: @Subscribe public void onActorDeath(ActorDeath actorDeath)
focal_class.identifier: onActorDeath
focal_class.modifiers: @Subscribe public
focal_class.parameters: (ActorDeath actorDeath)
focal_class.return: void
focal_class.signature: void onActorDeath(ActorDeath actorDeath)
focal_class.class_method_signature: TimersPlugin.createStaminaTimer()
focal_class.full_signature: private void createStaminaTimer()
focal_class.identifier: createStaminaTimer
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void createStaminaTimer()
focal_class.class_method_signature: TimersPlugin.createGameTimer(final GameTimer timer)
focal_class.full_signature: private TimerTimer createGameTimer(final GameTimer timer)
focal_class.identifier: createGameTimer
focal_class.modifiers: private
focal_class.parameters: (final GameTimer timer)
focal_class.return: TimerTimer
focal_class.signature: TimerTimer createGameTimer(final GameTimer timer)
focal_class.class_method_signature: TimersPlugin.createGameTimer(final GameTimer timer, Duration duration)
focal_class.full_signature: private TimerTimer createGameTimer(final GameTimer timer, Duration duration)
focal_class.identifier: createGameTimer
focal_class.modifiers: private
focal_class.parameters: (final GameTimer timer, Duration duration)
focal_class.return: TimerTimer
focal_class.signature: TimerTimer createGameTimer(final GameTimer timer, Duration duration)
focal_class.class_method_signature: TimersPlugin.removeGameTimer(GameTimer timer)
focal_class.full_signature: private void removeGameTimer(GameTimer timer)
focal_class.identifier: removeGameTimer
focal_class.modifiers: private
focal_class.parameters: (GameTimer timer)
focal_class.return: void
focal_class.signature: void removeGameTimer(GameTimer timer)
focal_class.class_method_signature: TimersPlugin.createGameIndicator(GameIndicator gameIndicator)
focal_class.full_signature: private IndicatorIndicator createGameIndicator(GameIndicator gameIndicator)
focal_class.identifier: createGameIndicator
focal_class.modifiers: private
focal_class.parameters: (GameIndicator gameIndicator)
focal_class.return: IndicatorIndicator
focal_class.signature: IndicatorIndicator createGameIndicator(GameIndicator gameIndicator)
focal_class.class_method_signature: TimersPlugin.removeGameIndicator(GameIndicator indicator)
focal_class.full_signature: private void removeGameIndicator(GameIndicator indicator)
focal_class.identifier: removeGameIndicator
focal_class.modifiers: private
focal_class.parameters: (GameIndicator indicator)
focal_class.return: void
focal_class.signature: void removeGameIndicator(GameIndicator indicator)
focal_class.superclass: extends Plugin
focal_method.body: @Subscribe
  	public void onChatMessage(ChatMessage event)
  	{
  		if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE)
  		{
  			return;
  		}
  
  		if (event.getMessage().equals(ENDURANCE_EFFECT_MESSAGE))
  		{
  			wasWearingEndurance = true;
  		}
  
  		if (config.showStamina() && (event.getMessage().equals(STAMINA_DRINK_MESSAGE) || event.getMessage().equals(STAMINA_SHARED_DRINK_MESSAGE)))
  		{
  			createStaminaTimer();
  		}
  
  		if (event.getMessage().equals(STAMINA_EXPIRED_MESSAGE) || event.getMessage().equals(GAUNTLET_ENTER_MESSAGE))
  		{
  			removeGameTimer(STAMINA);
  			staminaTimer = null;
  		}
  
  		if (config.showAntiFire() && event.getMessage().equals(ANTIFIRE_DRINK_MESSAGE))
  		{
  			createGameTimer(ANTIFIRE);
  		}
  
  		if (config.showAntiFire() && event.getMessage().equals(EXTENDED_ANTIFIRE_DRINK_MESSAGE))
  		{
  			createGameTimer(EXANTIFIRE);
  		}
  
  		if (config.showGodWarsAltar() && event.getMessage().equalsIgnoreCase(GOD_WARS_ALTAR_MESSAGE))//Normal altars are "You recharge your Prayer points." while gwd is "You recharge your Prayer."
  		{
  			createGameTimer(GOD_WARS_ALTAR);
  		}
  
  		if (config.showAntiFire() && event.getMessage().equals(EXTENDED_SUPER_ANTIFIRE_DRINK_MESSAGE))
  		{
  			createGameTimer(EXSUPERANTIFIRE);
  		}
  
  		if (config.showAntiFire() && event.getMessage().equals(ANTIFIRE_EXPIRED_MESSAGE))
  		{
  			//they have the same expired message
  			removeGameTimer(ANTIFIRE);
  			removeGameTimer(EXANTIFIRE);
  		}
  
  		if (config.showOverload() && event.getMessage().startsWith("You drink some of your") && event.getMessage().contains("overload"))
  		{
  			if (client.getVar(Varbits.IN_RAID) == 1)
  			{
  				createGameTimer(OVERLOAD_RAID);
  			}
  			else
  			{
  				createGameTimer(OVERLOAD);
  			}
  
  		}
  
  		if (config.showCannon() && (event.getMessage().equals(CANNON_FURNACE_MESSAGE) || event.getMessage().contains(CANNON_REPAIR_MESSAGE)))
  		{
  			TimerTimer cannonTimer = createGameTimer(CANNON);
  			cannonTimer.setTooltip(cannonTimer.getTooltip() + " - World " + client.getWorld());
  		}
  
  		if (config.showCannon() && event.getMessage().equals(CANNON_PICKUP_MESSAGE))
  		{
  			removeGameTimer(CANNON);
  		}
  
  		if (config.showMagicImbue() && event.getMessage().equals(MAGIC_IMBUE_MESSAGE))
  		{
  			createGameTimer(MAGICIMBUE);
  		}
  
  		if (event.getMessage().equals(MAGIC_IMBUE_EXPIRED_MESSAGE))
  		{
  			removeGameTimer(MAGICIMBUE);
  		}
  
  		if (config.showTeleblock())
  		{
  			Matcher m = TELEBLOCK_PATTERN.matcher(event.getMessage());
  			if (m.find())
  			{
  				String minss = m.group("mins");
  				String secss = m.group("secs");
  				int mins = Integer.parseInt(minss);
  				int secs = secss != null ? Integer.parseInt(secss) : 0;
  				createGameTimer(TELEBLOCK, Duration.ofSeconds(mins * 60 + secs));
  			}
  			else if (event.getMessage().contains(KILLED_TELEBLOCK_OPPONENT_TEXT))
  			{
  				removeGameTimer(TELEBLOCK);
  			}
  		}
  
  		if (config.showAntiFire() && event.getMessage().contains(SUPER_ANTIFIRE_DRINK_MESSAGE))
  		{
  			createGameTimer(SUPERANTIFIRE);
  		}
  
  		if (config.showAntiFire() && event.getMessage().equals(SUPER_ANTIFIRE_EXPIRED_MESSAGE))
  		{
  			removeGameTimer(SUPERANTIFIRE);
  		}
  
  		if (config.showImbuedHeart() && event.getMessage().equals(IMBUED_HEART_READY_MESSAGE))
  		{
  			removeGameTimer(IMBUEDHEART);
  		}
  
  		if (config.showPrayerEnhance() && event.getMessage().startsWith("You drink some of your") && event.getMessage().contains("prayer enhance"))
  		{
  			createGameTimer(PRAYER_ENHANCE);
  		}
  
  		if (config.showPrayerEnhance() && event.getMessage().equals(PRAYER_ENHANCE_EXPIRED))
  		{
  			removeGameTimer(PRAYER_ENHANCE);
  		}
  
  		if (config.showCharge() && event.getMessage().equals(CHARGE_MESSAGE))
  		{
  			createGameTimer(CHARGE);
  		}
  
  		if (config.showCharge() && event.getMessage().equals(CHARGE_EXPIRED_MESSAGE))
  		{
  			removeGameTimer(CHARGE);
  		}
  
  		if (config.showStaffOfTheDead() && event.getMessage().contains(STAFF_OF_THE_DEAD_SPEC_MESSAGE))
  		{
  			createGameTimer(STAFF_OF_THE_DEAD);
  		}
  
  		if (config.showStaffOfTheDead() && event.getMessage().contains(STAFF_OF_THE_DEAD_SPEC_EXPIRED_MESSAGE))
  		{
  			removeGameTimer(STAFF_OF_THE_DEAD);
  		}
  
  		if (config.showFreezes() && event.getMessage().equals(FROZEN_MESSAGE))
  		{
  			freezeTimer = createGameTimer(ICEBARRAGE);
  			freezeTime = client.getTickCount();
  		}
  
  		if (config.showDivine())
  		{
  			Matcher mDivine = DIVINE_POTION_PATTERN.matcher(event.getMessage());
  			if (mDivine.find())
  			{
  				switch (mDivine.group(1))
  				{
  					case "super attack":
  						createGameTimer(DIVINE_SUPER_ATTACK);
  						break;
  
  					case "super strength":
  						createGameTimer(DIVINE_SUPER_STRENGTH);
  						break;
  
  					case "super defence":
  						createGameTimer(DIVINE_SUPER_DEFENCE);
  						break;
  
  					case "combat":
  						createGameTimer(DIVINE_SUPER_COMBAT);
  						break;
  
  					case "ranging":
  						createGameTimer(DIVINE_RANGING);
  						break;
  
  					case "magic":
  						createGameTimer(DIVINE_MAGIC);
  						break;
  
  					case "bastion":
  						createGameTimer(DIVINE_BASTION);
  						break;
  
  					case "battlemage":
  						createGameTimer(DIVINE_BATTLEMAGE);
  						break;
  				}
  			}
  		}
  
  		if (config.showTzhaarTimers())
  		{
  			String message = event.getMessage();
  			Matcher matcher = TZHAAR_COMPLETE_MESSAGE.matcher(message);
  
  			if (message.contains(TZHAAR_DEFEATED_MESSAGE) || matcher.matches())
  			{
  				removeTzhaarTimer();
  				config.tzhaarStartTime(null);
  				config.tzhaarLastTime(null);
  				return;
  			}
  
  			Instant now = Instant.now();
  			matcher = TZHAAR_PAUSED_MESSAGE.matcher(message);
  			if (matcher.find())
  			{
  				config.tzhaarLastTime(now);
  				createTzhaarTimer();
  				return;
  			}
  
  			matcher = TZHAAR_WAVE_MESSAGE.matcher(message);
  			if (!matcher.find())
  			{
  				return;
  			}
  
  			if (config.tzhaarStartTime() == null)
  			{
  				int wave = Integer.parseInt(matcher.group(1));
  				if (wave == 1)
  				{
  					if (isInInferno())
  					{
  						// The first wave message of the inferno comes six seconds after the ingame timer starts counting
  						config.tzhaarStartTime(now.minus(Duration.ofSeconds(6)));
  					}
  					else
  					{
  						config.tzhaarStartTime(now);
  					}
  
  					createTzhaarTimer();
  				}
  			}
  			else if (config.tzhaarLastTime() != null)
  			{
  				log.debug("Unpausing tzhaar timer");
  
  				// Advance start time by how long it has been paused
  				Instant tzhaarStartTime = config.tzhaarStartTime();
  				tzhaarStartTime = tzhaarStartTime.plus(Duration.between(config.tzhaarLastTime(), now));
  				config.tzhaarStartTime(tzhaarStartTime);
  
  				config.tzhaarLastTime(null);
  				createTzhaarTimer();
  			}
  		}
  	}
focal_method.class_method_signature: TimersPlugin.onChatMessage(ChatMessage event)
focal_method.full_signature: @Subscribe public void onChatMessage(ChatMessage event)
focal_method.identifier: onChatMessage
focal_method.invocations: getType getType equals getMessage showStamina equals getMessage equals getMessage createStaminaTimer equals getMessage equals getMessage removeGameTimer showAntiFire equals getMessage createGameTimer showAntiFire equals getMessage createGameTimer showGodWarsAltar equalsIgnoreCase getMessage createGameTimer showAntiFire equals getMessage createGameTimer showAntiFire equals getMessage removeGameTimer removeGameTimer showOverload startsWith getMessage contains getMessage getVar createGameTimer createGameTimer showCannon equals getMessage contains getMessage createGameTimer setTooltip getTooltip getWorld showCannon equals getMessage removeGameTimer showMagicImbue equals getMessage createGameTimer equals getMessage removeGameTimer showTeleblock matcher getMessage find group group parseInt parseInt createGameTimer ofSeconds contains getMessage removeGameTimer showAntiFire contains getMessage createGameTimer showAntiFire equals getMessage removeGameTimer showImbuedHeart equals getMessage removeGameTimer showPrayerEnhance startsWith getMessage contains getMessage createGameTimer showPrayerEnhance equals getMessage removeGameTimer showCharge equals getMessage createGameTimer showCharge equals getMessage removeGameTimer showStaffOfTheDead contains getMessage createGameTimer showStaffOfTheDead contains getMessage removeGameTimer showFreezes equals getMessage createGameTimer getTickCount showDivine matcher getMessage find group createGameTimer createGameTimer createGameTimer createGameTimer createGameTimer createGameTimer createGameTimer createGameTimer showTzhaarTimers getMessage matcher contains matches removeTzhaarTimer tzhaarStartTime tzhaarLastTime now matcher find tzhaarLastTime createTzhaarTimer matcher find tzhaarStartTime parseInt group isInInferno tzhaarStartTime minus ofSeconds tzhaarStartTime createTzhaarTimer tzhaarLastTime debug tzhaarStartTime plus between tzhaarLastTime tzhaarStartTime tzhaarLastTime createTzhaarTimer
focal_method.modifiers: @Subscribe public
focal_method.parameters: (ChatMessage event)
focal_method.return: void
focal_method.signature: void onChatMessage(ChatMessage event)