This commit is contained in:
2025-11-22 17:38:25 +02:00
parent 138d7abe24
commit 0c5eca3636
15 changed files with 1430 additions and 0 deletions

2
.gitignore vendored
View File

@@ -8,3 +8,5 @@ nbactions.xml
nb-configuration.xml
nbproject/
bin/
examples/

View File

@@ -71,4 +71,5 @@ task runClient(type: JavaExec) {
classpath = sourceSets.test.runtimeClasspath
mainClass = 'ee.futur.K4rliPluginsTest'
jvmArgs '-ea'
args '--developer-mode', '--debug'
}

View File

@@ -0,0 +1,581 @@
Intro
0:00
what's going on guys it's jwell coming
0:01
to you with an updated 2023 Guardians of
0:04
the rift Max points guide now I'm going
0:08
to run through this as quick as I
0:10
possibly can and as clear as I possibly
0:12
can so hopefully you guys can start
0:14
utilizing this and taking advantage of
0:17
uh the method that like I said I
0:19
recently discovered I don't know if this
0:20
is common knowledge it certainly wasn't
0:22
to me so my goal is to help at least a
0:24
few of you out there that are looking to
0:27
uh maximize the amount of uh points
0:29
you're getting per game
0:31
now copy my inventory as best as you can
Inventory and Gear
0:34
if you don't have the Colossal pouch
0:35
bring the best pouches that you have
0:37
available to you bring as many fire
0:40
runes as you have as many water runes as
0:42
you have and um obviously bring as many
0:47
pieces of the remnants of the eye that
0:48
you have um if you don't just kind of
0:52
substitute that with graceful not super
0:54
important but um the verac armor if you
0:56
don't have the top will help you when
0:58
you're mining fragments it'll double the
1:00
amount of fragments you get so I
1:01
recommend that bring a full binding
1:04
necklace this is extremely important um
1:06
you can pick them up on the GE I think
1:08
they're 800 a piece I picked up like a
1:11
100 for this grind um and we're going to
1:14
use one per game uh which is going to
1:17
allow us to craft combination runes
1:18
which is kind of the secret to this
1:20
method um last thing make sure you have
1:23
your Rune pouch with air Cosmic and
1:26
Astra runes on the lunar spell book
1:29
we're going to want NPC contact to fix
1:31
our pouches in between games as well as
1:34
magic and view which you must have in
1:37
order to do this
1:38
method now go ahead and equip everything
1:41
you have your best and Slot pickaxe
1:43
binding necklace and um make sure you
RuneLite Plugins
1:47
have three crucial plugins menu menu
1:49
entry swapper make sure all your pouches
1:52
are set to
1:53
empty next thing you want to do if you
1:55
don't already have it um and this helps
1:57
out a lot which um you're going to going
1:59
to have to to follow along is going to
2:01
be the Guardians of the rift plugin you
2:03
can access that through the plug-in Hub
2:05
highly recommend you download that
2:07
because we're going to pay attention to
2:08
this countdown time sense portal um to
2:13
allow us to not make sure we don't miss
2:15
any of the portals and that'll make
2:16
sense once we get into the game and the
2:18
last thing is entity Hider you don't
2:20
have to have it but I highly recommend
2:22
it um I have hide others hide others 2D
2:25
don't have to hide your friends um I am
2:28
for this uh
2:30
setting but um and then hide other
2:32
players pets just because they're kind
2:33
of annoying a lot of people run around
2:35
with their pets in the game and um not a
2:37
huge fan of it uh the last thing and you
2:40
don't have to do this but if you have a
2:42
mouse where you can key bind the sides
2:45
of them I would highly recommend binding
2:48
the number four to uh one of your thumb
2:51
buttons and again this will make sense
2:53
once we get into the video but I I
2:56
highly recommend that you guys um bind
2:58
that because it's going to allow you to
2:59
deposit your runes quicker and like I
3:02
said just overall makes makes things
3:04
easier so um while we're waiting if you
Getting There Options
3:08
don't know how to get here already
3:10
quickest way is going to be the
3:12
Guardians of the rift miname teleport
3:15
another way is the necklace of Passage
3:17
you can use that to the Wizards Tower
3:20
run in down into the basement um and
3:23
then there should be a blue portal right
3:25
there that you can enter which will
3:26
bring you to the mini game so without
3:29
further Ado I will go ahead and jump in
3:32
as soon as we're entering the mini
Starting Off
3:35
game now that we're in the mini game go
3:37
ahead and run
3:40
north don't worry about picking up the
3:42
uh uncharged cells um you're not really
3:46
missing out on much experience and
3:47
honestly this method isn't as efficient
3:49
if you go that
3:52
route we'll wait right
3:54
here until the game
3:58
starts special attack if you want
4:05
to and go ahead and start
4:08
mining now pay attention to the time
4:11
since portal this is a good time you can
4:13
kind of hang out chill check your phone
4:15
whatever you want to do um and we're
4:17
going to leave as soon as
4:19
this gets to about 140 maybe 145 on the
4:28
portal
4:31
all right now that the portal is at 140
4:34
we're going to leave this area and run
The Minigame
4:37
towards the center over here and wait
4:41
until a portal opens
4:47
up here we are got
4:51
lucky go ahead and run over
4:54
here fill up your
4:58
pouches
5:20
and then exit the
5:22
portal now we're going to go ahead enter
5:25
the uh whatever Elemental portal you
5:28
possibly can go ahead and enter into
5:29
there run up here cast magic and bu use
5:34
the fire on there empty the pouch use
5:37
the fire and
5:39
repeat and then go ahead and run out now
5:42
you can see here we have poly
5:44
Elemental Guardian Stones instead of the
5:47
regular and that's going to go ahead and
5:49
give us way more points than we normally
5:51
would have after you deposit that you
5:54
can go ahead and start working at the
5:56
workbench now this is where that key
5:58
bind number four makes things easier and
6:00
you'll see why when I deposit my steam
6:02
runes in here all I have to do is hold
6:04
four on the side of my uh Mouse and it
6:08
instant deposits them now if you don't
6:11
want to go that method that's okay you
6:13
can always just hit four on your
6:15
keyboard but like I said I mean the goal
6:16
here is to make things as easy as
6:18
possible
6:21
so
6:23
now we are going to continue to fill up
6:26
the
6:28
pouch
6:39
once our pouch is full let's go ahead
6:41
again we'll run back to the uh Elemental
6:43
alter and rinse in
6:47
repeat cast our magic and view use our
6:50
fire runes on the altar empty the pouch
6:53
use them again use them a third time and
6:56
run back
6:58
out
7:01
we will
7:06
deposit go ahead and deposit our runes
7:09
into the deposit
7:12
pool and make sure you deposit
7:15
all now one mistake that I've made a
7:18
couple of times is do not click deposit
7:20
runes because it will deposit your fire
7:23
and water runes and um well you'll be
7:26
screwed until the next round in terms of
7:29
making a combination R so make sure to
7:32
kind of use the method that I'm using um
7:35
just to avoid
7:49
that fill up your
7:51
pouch run back in looks like we have
7:55
Earth Rune Elemental alter let's run
7:58
back in there run up to the top cast our
8:02
magic and view use the runes on the
8:05
alter empty them use them again and run
8:16
out power up the guardian run back over
8:20
here use the lava runes on the deposit
8:23
pool hold
8:25
four and go back to
8:28
crafting pretty simple method you're
8:31
just alternating in between and that's
8:34
why I like to kind of time things the
8:36
way that I have it because you're going
8:38
to maximize your points as you can see
8:39
I'm already at
8:40
564 Elemental energy points typically if
8:45
I were to be finishing up crafting this
8:47
inventory I'd be looking at the the
8:49
blood Rune um in order to at least get
8:52
one catalytic energy Point per game and
8:55
the reason being is you can only get a
8:58
Max of a th000 Elemental energy points
9:01
um we're going to hit that easily in
9:03
this
9:05
game so we're all
9:08
full we will run back over to the water
9:11
alter it just opened up run up to the
9:15
top cast our magic and view use our fire
9:19
runes empty our pouch use our fire runes
9:23
and run
9:27
out power up the
9:31
Guardian run back over deposit our steam
9:34
room steam runes into the pool click
9:37
number four and then run into the
9:58
portal
10:11
all righty I'm going to go ahead and
10:12
just hop into the death alter to go
10:15
ahead and gain myself a point here you
10:18
don't have to cast The Magic and
10:23
bu because you will not be making
10:26
combination runes let's power up the
10:28
guardian
10:31
run back over here deposit our death
10:36
runes and get back to
10:58
crafting
11:20
now that we're done crafting we'll run
11:21
over to the
11:23
elemental alter run up to the top on the
11:26
way up let's cast our magic and view use
11:29
our runes on the alter rinse and
11:33
repeat and then run
11:38
out we'll power up the
11:42
guardian run back down
11:45
here deposit our lava
11:48
runes and enter the
11:57
portal
12:05
now as you can see I'm already at 945
12:07
points I'm going to go ahead and cat um
12:10
I'm going to go ahead and do catalytic
12:13
for the rest of the time and the reason
12:15
being is I have a 45% chance of rolling
12:19
that last point I'm going to take the uh
12:23
the chance that I go ahead and roll that
12:26
looks like we're not going to get that
12:27
alter so we'll run into the
12:31
nature alter but just to max out your
12:34
points again like the closest you the
12:36
closer you can get to a th000 the better
12:40
you may not even get there if you're um
12:43
if you don't have the Colossal pouch but
12:47
nonetheless like I
12:57
said now now we're at 92% I don't think
13:00
we're going to be able to craft an
13:01
entire
13:04
inventory before uh the time goes up so
13:07
I'm just going to go ahead and see if I
13:08
can maybe get half an inventory um in
13:11
this in this game just so I can make
13:13
sure to deposit them uh and get the
13:17
points out of it that's probably good
13:20
let's run into the Earth
13:26
alter you want to try to get all those
13:28
deposit Ed within about 5 Seconds of the
13:31
game hitting
13:33
100% so we got 38 that should guarantee
13:36
us that third
13:38
point for uh catalytic energy run up
13:42
power up the
13:46
guardian deposit our runes into this
13:48
pool
13:54
here and get ready to hit the next game
13:58
now do not exit this until the game is
14:01
completed and you see an experience drop
14:03
do not do it or you will not get any
14:07
points all righty we got the experience
14:09
drop let's go ahead and quick pass
14:11
through the barrier run over to our
Reset the Minigame
14:14
bank grab a binding necklace as you can
14:18
see we only have one charge left on the
14:20
one we're wearing so go ahead and
14:22
destroy
14:25
it and you see we have a fresh one ready
14:28
to go for the next game
14:31
now the barrier becomes able to enter at
14:35
30 so go ahead and spam click at
14:38
30 and we get let
14:41
in run over
14:44
here back down into where we're going to
14:47
start our next
14:50
match cast NPC contact to the dark
14:57
mage yes I would like to repair my
15:01
pouches awesome super fun good
15:04
stuff and we're going to go ahead and
Outro
15:06
start the next game if you guys found
15:08
this helpful at all please let me know
15:10
down in the comments section um I really
15:12
appreciate you guys tuning in and I hope
15:14
this help see you next time

108
gotr-wiki-gameplay.txt Normal file
View File

@@ -0,0 +1,108 @@
Guardians of the Rift is a non-combat minigame that takes place within the Temple of the Eye. The main goal of the game is to assist The Great Guardian in closing an abyssal rift to the Scar, the most dangerous part of Abyssal Space, by supplying it with guardian stones while protecting it from the abyssal creatures that come through the rift.
Gameplay
Main article: Guardians of the Rift/Strategies
The objective of the minigame is to allow the Great Guardian to charge up enough power to close the rift where Abyssal creatures are coming through.
An overview of the Temple of the Eye, where the minigame takes place.
Players will need to do the following throughout the battle:
Imbue essence acquired during the minigame at runic altars to power up the Great Guardian
Create elemental and catalytic guardians to do battle with the incoming Abyssal creatures
Create/repair barriers to protect the Great Guardian from Abyssal creatures
To imbue essence, players must obtain guardian fragments from guardian remains of varying sizes in the Temple. There are three nodes that can be mined off of: guardian parts, guardian remains, and large guardian remains. Parts and normal remains can be found in the edges of the temple area, while the larger remains are past some rubble in the mid-east of the Temple area, requiring level 56 Agility (not boostable) to access.
The huge guardian remains, which give guardian essence when mined, are found at the mid-western area of the temple. Though normally inaccessible, portals will occasionally appear that take players there, spawning approximately every 2 minutes. Portals remain active for around 25 seconds.
The doubling effect of certain mining enhancers—such as Varrock armour (all tiers) and charged celestial rings—will apply when mining for guardian fragments and essence.
Imbuing essence
The UI showing the time remaining for the active earth and blood Portal Guardians and the portal to the huge guardian remains, among other things.
Creating guardian essence on the workbench. Crafted runes can be deposited into a bank via the Deposit Pool next to it.
Guardian fragments are converted into guardian essence, which are storable in essence pouches. They are brought to runic altars to be imbued via entering Portal Guardians surrounding the centre of the Temple. Only two portals are active at a time: one elemental and one catalytic. Imbuing guardian essence requires the same Runecraft level as crafting them regularly in the corresponding altar. Note that imbuing on runic altars during the minigame will not give players the rift guardian pet.[1]
In addition, for every guardian essence imbued, there is a 1/250 chance that players will receive a portal talisman,[2][3] which can be used on the Portal Guardians to take them back to the runic altar they previously used, even if the portal is closed for that altar. These cannot be kept after the game ends, so players should use them whenever possible. Players can right-click "Toggle-talisman" on a Portal Guardian to stop receiving portal talismans of the selected type.
Once players imbue their essence into either an elemental or catalytic guardian stone, they can return to the Temple and power up the Great Guardian. Each guardian stone will give two energy of the respective type; if crafting combination runes, players will instead receive polyelemental guardian stones, which give three elemental energy when used on the Great Guardian.
The number of guardian stones required to fully charge up the Great Guardian scales with player count: the Great Guardian must be powered up with 250 guardian stones for each player inside the temple in order to reach 100%.[4] If there are over 20 players, every player beyond the 20th grants a 20% scaling penalty on the charge required to power up the Great Guardian, meaning 200 essence is required for each player after the 20th rather than 250.
When powering up the Great Guardian, the player's run energy will be restored by 1% for each guardian stone granted to the Guardian. In addition, a small bonus amount is restored based on the player's current special attack energy, ranging from 1% extra with a totally depleted special energy bar up to 11% additional run energy when the special bar is completely full.[5]
Be aware that players need to have completed certain quests to be able to enter some Portal Guardians:
Guardian of Cosmic - Lost City
Guardian of Law - Troll Stronghold
Guardian of Death - Mourning's End Part II
Guardian of Blood - Sins of the Father
Charging cells
Charged cells are used to create rift guardians and erect barriers. Uncharged cells are obtained from a container near the entry barrier, and are charged in the same way guardian essence is. Players can hold up to ten uncharged cells and have only one charged cell at a time.
Barriers and rift guardians protecting the Great Guardian from Abyssal creatures.
Rift guardians are created with a chisel via the essence piles near the tables at the south, and can either be elemental (east) or catalytic (west). These will follow the elemental/catalytic guides in the outer ring. Only ten rift guardians can be active at any time.
Barriers are created by using charged cells on the cell tiles at the front-centre. Using increasingly higher tiers of cells in order (ex. medium to strong cells) will also strengthen them. Using lesser charged cells (ex. a strong cell on an overcharged barrier) will instead recharge the barriers by "healing" them. Should a barrier break, the cell tile will need to be repaired, which requires 12 guardian fragments.
The strength of the cell corresponds to the Runecraft level of the runic altar it is charged in:
Standard runes
Runecraft Level Type Tier Alignment
1 Air Weak Elemental
5 Water Medium Elemental
9 Earth Strong Elemental
14 Fire Overcharged Elemental
2 Mind Weak Catalytic
20 Body Weak Catalytic
27 Cosmic Medium Catalytic
35 Chaos Medium Catalytic
44 Nature Strong Catalytic
54 Law Strong Catalytic
65 Death Overcharged Catalytic
77 Blood Overcharged Catalytic
Combination runes
Since each combination rune can be made on either of two altars, the cell tier is determined by the elemental altar that's used.
Runecraft Level Type Alignment
6 Mist Polyelemental
10 Dust Polyelemental
13 Mud Polyelemental
15 Smoke Polyelemental
19 Steam Polyelemental
23 Lava Polyelemental
90 Aether Polycatalytic
Gaining energy
Players can gain energy by either using cells, by using guardian stones on the Great Guardian, or by repairing a barrier. For each stone used, players will get 5 Runecraft experience and two energy in elemental or catalytic depending on the type of essence used; if crafting combination runes, players will get a polyelemental guardian stone instead, which gives three elemental energy. If players use twelve fragments on repairing a cell tile they will gain 25 energy in both types.
Each cell can be used in one of four ways: to build a barrier, to recharge a barrier, to strengthen a barrier (one tier at a time), or to create a guardian. Higher level cells give more energy, except for when building barriers, which always gives 2 energy in both types. Using cells on barriers gives equal energy in elemental and catalytic, whereas creating a guardian gives energy only in the energy type matching the guardian they created. Creating a guardian awards 2x+1 energy, where x is the energy that would be awarded for strengthening a barrier with the same cell.
Tier Barrier Guardian
Placing Strengthening Recharging Health restored XP Creating[n 1] XP
Weak 17 N/A 2 10 Runecraft 30 6 Runecraft 30
Crafting 80
Medium 20 7 5 25 Runecraft 100 15 Runecraft 100
Crafting 80
Strong 24 13 9 50 Runecraft 180 27 Runecraft 180
Crafting 80
Overcharged 30 22 15 100 Runecraft 250 45 Runecraft 250
Crafting 80
Creating rift guardians only yields energy in either elemental or catalytic, while other uses of cells yield equal energy in both.
Phases of the battle
Charged with enough power, the Great Guardian closes the rift.
The battle is split into three phases:
The first phase is short, giving players two minutes to prepare by obtaining guardian essence and uncharged cells to create and power up guardians. Initially, there are some weak cells used in the beginning stages of the battle that should be used to erect barriers.
After the two minutes pass, abyssal creatures will begin spawning from the rift, consisting of mostly abyssal leeches and guardians. There will be a few walkers among them. The monsters will attempt to attack the Great Guardian, with their attacks draining its energy. They will also attack barriers and rift guardians, although they only retaliate back for the latter, not actively targeting them. Should the Great Guardian's energy level reach 0%, the encounter will fail.
When the guardian reaches 60% charge, the temple will rumble as the rift glows more intensely, damaging all active barriers by 50 health (in a mass) and spewing out more guardians and walkers compared to leeches. Players should heal the barriers and create more rift guardians if necessary.
When the guardian reaches 100% charge, it will seal the rift. All abyssal creatures and rift guardians will automatically die once this occurs and there is a brief period of respite for players inside to leave or reposition themselves.
At the beginning of a new game, all guardian fragments, essence, and portal talismans acquired during the game will be removed from the player's possession. This also applies when leaving the minigame area.

View File

@@ -0,0 +1,201 @@
package ee.futur.vorkath;
import ee.futur.vorkath.enums.*;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
import net.runelite.client.config.Range;
import java.awt.*;
import static ee.futur.vorkath.enums.Crossbow.DRAGON_HUNTER_CROSSBOW;
@ConfigGroup("AutoVorkath")
public interface AutoVorkathConfig extends Config {
@ConfigItem(
keyName = "crossbow",
name = "Crossbow",
description = "Choose your crossbow",
position = 0
)
default Crossbow CROSSBOW() {
return DRAGON_HUNTER_CROSSBOW;
}
@ConfigItem(
keyName = "slayersStaff",
name = "Slayers Staff",
description = "Choose your slayers staff",
position = 1
)
default Staff SLAYERSTAFF() {
return Staff.SLAYER_STAFF;
}
@ConfigItem(
keyName = "teleport",
name = "Teleport",
description = "Choose your teleport",
position = 2
)
default Teleport TELEPORT() {
return Teleport.CONSTRUCT_CAPE_T;
}
@ConfigItem(
keyName = "portal",
name = "Portal",
description = "What Portal to use to teleport to Lunar Isle.",
position = 3
)
default Portal PORTAL() {
return Portal.PORTAL_NEXUS;
}
@ConfigItem(
keyName = "rigour",
name = "Rigour",
description = "Activate Rigour?",
position = 4
)
default boolean ACTIVATERIGOUR() {
return true;
}
@ConfigItem(
keyName = "switchBolts",
name = "Switch Bolts",
description = "Change to Diamond Bolts (e) at 20% health?",
position = 5
)
default boolean SWITCHBOLTS() {
return true;
}
@ConfigItem(
keyName = "rangePotion",
name = "Ranging Potion",
description = "What Ranging potion to use?",
position = 6
)
default RangePotion RANGEPOTION() {
return RangePotion.DIVINE_RANGING_POTION;
}
@ConfigItem(
keyName = "prayerPotion",
name = "Prayer Potion",
description = "What Prayer potion to use?",
position = 7
)
default PrayerPotion PRAYERPOTION() {
return PrayerPotion.PRAYER;
}
@ConfigItem(
keyName = "antiFirePotion",
name = "Antifire Potion",
description = "What Antifire potion to use?",
position = 8
)
default Antifire ANTIFIRE() {
return Antifire.EXTENDED_SUPER_ANTIFIRE;
}
@ConfigItem(
keyName = "runePouch",
name = "Rune Pouch",
description = "What Rune Pouch to use?",
position = 9
)
default RunePouch RUNEPOUCH() {
return RunePouch.RUNE_POUCH;
}
@ConfigItem(
keyName = "foodAmount",
name = "Food Amount",
description = "MAX FOOD : MIN FOOD",
position = 10
)
default Dimension FOODAMOUNT() {
return new Dimension(16, 15);
}
@ConfigItem(
keyName = "poolDrinkat",
name = "Ornate Pool Drink",
description = "HEALTH : PRAYER",
position = 11
)
default Dimension POOLDRINK() {
return new Dimension(90, 90);
}
@Range(min = 40, max = 90)
@ConfigItem(
keyName = "eatat",
name = "Eat At?",
description = "Eat at what health?",
position = 12
)
default int EATAT() {
return 75;
}
@Range(min = 40, max = 90)
@ConfigItem(
keyName = "drinkAt",
name = "Drink Prayer At?",
description = "Drink at what prayer?",
position = 13
)
default int DRINKPRAYERAT() {
return 70;
}
@Range(
min = 1,
max = 2000
)
@ConfigItem(
keyName = "sellAt",
name = "Sell At?",
description = "Sell items at what kill?",
position = 14
)
default int SELLAT() {
return 15;
}
@ConfigItem(
keyName = "mule",
name = "Mule GP?",
description = "Trade GP after selling? (TARGET MUST BE IN GE)",
position = 15
)
default boolean MULE() {
return false;
}
@ConfigItem(
keyName = "muleName",
name = "Mule Name",
description = "Name of player in GE to trade.",
position = 16
)
default String MULENAME() {
return "";
}
@ConfigItem(
keyName = "food",
name = "Food",
description = "What food to use? (NOT MANTA RAY!)",
position = 17
)
default String FOOD() {
return "Shark";
}
}

View File

@@ -0,0 +1,59 @@
package ee.futur.vorkath;
import net.runelite.api.Client;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.LineComponent;
import net.runelite.client.ui.overlay.components.PanelComponent;
import javax.inject.Inject;
import java.awt.*;
public class AutoVorkathOverlay extends Overlay {
private final PanelComponent panelComponent = new PanelComponent();
private final PanelComponent slPanel = new PanelComponent();
private final Client client;
private final VorkathHelperPlugin plugin;
@Inject
private AutoVorkathOverlay(Client client, VorkathHelperPlugin plugin) {
this.client = client;
this.plugin = plugin;
setPosition(OverlayPosition.BOTTOM_LEFT);
setLayer(OverlayLayer.ABOVE_SCENE);
setDragTargetable(true);
}
@Override
public Dimension render(Graphics2D graphics) {
panelComponent.getChildren().clear();
slPanel.getChildren().clear();
LineComponent state = buildLine("State: ", plugin.getBotState().toString());
LineComponent tickDelay = buildLine("Tick Delay: ", String.valueOf(plugin.getTickDelay()));
LineComponent killCount = buildLine("Kill Count: ", String.valueOf(plugin.getKillCount()));
panelComponent.getChildren().add(state);
panelComponent.getChildren().add(tickDelay);
panelComponent.getChildren().add(killCount);
return panelComponent.render(graphics);
}
/**
* Builds a line component with the given left and right text
*
* @param left
* @param right
* @return Returns a built line component with White left text and Yellow right text
*/
private LineComponent buildLine(String left, String right) {
return LineComponent.builder()
.left(left)
.right(right)
.leftColor(Color.WHITE)
.rightColor(Color.YELLOW)
.build();
}
}

View File

@@ -0,0 +1,305 @@
package ee.futur.vorkath;
import com.google.inject.Provides;
import ee.futur.baseapi.collections.NPCs;
import ee.futur.baseapi.collections.TileObjects;
import lombok.Getter;
import net.runelite.api.*;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.*;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.NpcLootReceived;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.ItemStack;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.overlay.OverlayManager;
import javax.inject.Inject;
import java.util.*;
@PluginDescriptor(
name = "<html><font color=\"#9ddbff\">[JR]</font> Vorkath Helper </html>",
description = "Vorkath helper - highlights important mechanics and displays state information",
tags = {"vorkath", "helper", "boss"},
enabledByDefault = false
)
public class AutoVorkathPlugin extends Plugin {
@Inject
private Client client;
@Inject
private OverlayManager overlayManager;
@Inject
private AutoVorkathOverlay autoVorkathOverlay;
@Inject
private VorkathSceneOverlay vorkathSceneOverlay;
@Inject
private VorkathHelperConfig config;
@Inject
private ItemManager itemManager;
@Getter
private State botState = State.NONE;
@Getter
private int tickDelay = 0;
@Getter
private int killCount = 0;
@Getter
private Set<WorldPoint> acidPools = new HashSet<>();
@Getter
private WorldPoint redBallLocation = new WorldPoint(0, 0, 0);
@Getter
private WorldPoint safeTile = null;
@Getter
private NPC spawnNpc = null;
private final int rangeProjectileId = 1477;
private final int magicProjectileId = 393;
private final int purpleProjectileId = 1471;
private final int blueProjectileId = 1479;
private final int redProjectileId = 1481;
private final int acidProjectileId = 1483;
private final int acidRedProjectileId = 1482;
private final int whiteProjectileId = 395;
private final WorldArea bankArea = new WorldArea(2096, 3911, 20, 11, 0);
public enum State {
FIGHTING,
ACID,
SPAWN,
RED_BALL,
LOOTING,
NONE
}
@Provides
VorkathHelperConfig getConfig(ConfigManager configManager) {
return configManager.getConfig(VorkathHelperConfig.class);
}
@Override
protected void startUp() {
System.out.println("Vorkath Helper Plugin Activated");
botState = State.NONE;
overlayManager.add(autoVorkathOverlay);
overlayManager.add(vorkathSceneOverlay);
vorkathSceneOverlay.setPlugin(this);
}
@Override
protected void shutDown() {
System.out.println("Vorkath Helper Plugin Deactivated");
botState = State.NONE;
killCount = 0;
acidPools.clear();
redBallLocation = new WorldPoint(0, 0, 0);
safeTile = null;
spawnNpc = null;
overlayManager.remove(autoVorkathOverlay);
overlayManager.remove(vorkathSceneOverlay);
}
@Subscribe
public void onChatMessage(ChatMessage e) {
if (e.getMessage().contains("Your Vorkath kill count is:")) {
// Reset state after kill
changeStateTo(State.NONE);
}
}
@Subscribe
public void onNpcLootReceived(NpcLootReceived event) {
List<ItemStack> items = event.getItems();
for (ItemStack item : items) {
if (item != null) {
ItemComposition comp = itemManager.getItemComposition(item.getId());
// Track loot for information purposes
}
}
killCount++;
changeStateTo(State.LOOTING);
}
@Subscribe
public void onNpcDespawned(NpcDespawned e) {
if (e.getNpc().getName() != null && e.getNpc().getName().equals("Zombified Spawn")) {
spawnNpc = null;
changeStateTo(State.FIGHTING);
}
}
@Subscribe
public void onProjectileMoved(ProjectileMoved e) {
int projectileId = e.getProjectile().getId();
if (projectileId == acidProjectileId || projectileId == acidRedProjectileId) {
WorldPoint acidLocation = WorldPoint.fromLocal(client, e.getPosition());
acidPools.add(acidLocation);
changeStateTo(State.ACID);
updateSafeTiles();
} else if (projectileId == whiteProjectileId) {
changeStateTo(State.SPAWN);
updateSpawnNpc();
} else if (projectileId == redProjectileId) {
redBallLocation = WorldPoint.fromLocal(client, e.getPosition());
changeStateTo(State.RED_BALL);
} else if (projectileId == rangeProjectileId || projectileId == magicProjectileId ||
projectileId == purpleProjectileId || projectileId == blueProjectileId) {
// Regular attack - continue fighting
if (botState == State.NONE || botState == State.FIGHTING) {
changeStateTo(State.FIGHTING);
}
}
}
@Subscribe
public void onGameObjectDespawned(GameObjectDespawned e) {
if (e.getGameObject().getId() == 32000) {
// Acid pools cleared
acidPools.clear();
safeTile = null;
changeStateTo(State.FIGHTING);
}
}
@Subscribe
public void onGameTick(GameTick e) {
if (tickDelay > 0) {
tickDelay--;
return;
}
// Update spawn NPC if in spawn state
if (botState == State.SPAWN) {
updateSpawnNpc();
}
// Update safe tiles if in acid state
if (botState == State.ACID) {
updateAcidPools();
updateSafeTiles();
}
// Check if we're in Vorkath area and update state accordingly
if (inVorkathArea()) {
if (botState == State.NONE || botState == State.LOOTING) {
// Check if there are acid pools
if (!acidPools.isEmpty()) {
changeStateTo(State.ACID);
updateSafeTiles();
} else {
changeStateTo(State.FIGHTING);
}
}
} else {
// Not in Vorkath area
if (botState != State.NONE && botState != State.LOOTING) {
changeStateTo(State.NONE);
}
}
}
private void updateAcidPools() {
acidPools.clear();
// Find acid pool objects
TileObjects.search().withId(ObjectID.ACID_POOL_32000).result().forEach(tileObject -> {
acidPools.add(tileObject.getWorldLocation());
});
TileObjects.search().withId(ObjectID.ACID_POOL).result().forEach(tileObject -> {
acidPools.add(tileObject.getWorldLocation());
});
TileObjects.search().withId(ObjectID.ACID_POOL_37991).result().forEach(tileObject -> {
acidPools.add(tileObject.getWorldLocation());
});
}
private void updateSafeTiles() {
if (!inVorkathArea() || acidPools.isEmpty()) {
safeTile = null;
return;
}
List<NPC> vorkathList = NPCs.search().nameContains("Vorkath").result();
if (vorkathList.isEmpty()) {
safeTile = null;
return;
}
NPC vorkath = vorkathList.get(0);
WorldPoint vorkathLocation = vorkath.getWorldLocation();
WorldPoint swPoint = new WorldPoint(vorkathLocation.getX() + 1, vorkathLocation.getY() - 8, 0);
WorldArea wooxWalkArea = new WorldArea(swPoint, 5, 1);
WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation();
WorldPoint closestSafeTile = null;
int closestDistance = Integer.MAX_VALUE;
// Check each tile in the woox walk area
for (int x = 0; x < 5; x++) {
for (int y = 0; y < 1; y++) {
WorldPoint tile = new WorldPoint(swPoint.getX() + x, swPoint.getY() + y, swPoint.getPlane());
if (isTileSafe(tile)) {
int distance = Math.abs(tile.getX() - playerLocation.getX());
if (distance < closestDistance) {
closestDistance = distance;
closestSafeTile = tile;
}
}
}
}
safeTile = closestSafeTile;
}
private boolean isTileSafe(WorldPoint tile) {
// Check if tile and tiles above it are safe from acid
if (acidPools.contains(tile)) {
return false;
}
if (acidPools.contains(new WorldPoint(tile.getX(), tile.getY() + 1, tile.getPlane()))) {
return false;
}
if (acidPools.contains(new WorldPoint(tile.getX(), tile.getY() + 2, tile.getPlane()))) {
return false;
}
if (acidPools.contains(new WorldPoint(tile.getX(), tile.getY() + 3, tile.getPlane()))) {
return false;
}
return true;
}
private void updateSpawnNpc() {
List<NPC> spawnList = NPCs.search().nameContains("Zombified Spawn").result();
if (!spawnList.isEmpty()) {
spawnNpc = spawnList.get(0);
} else {
spawnNpc = null;
}
}
private boolean inVorkathArea() {
return !NPCs.search().nameContains("Vorkath").result().isEmpty() && client.isInInstancedRegion();
}
private void changeStateTo(State stateName) {
botState = stateName;
}
}

View File

@@ -0,0 +1,29 @@
package ee.futur.vorkath.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum Antifire {
EXTENDED_SUPER_ANTIFIRE("Extended super antifire", 6),
EXTENDED_SUPER_ANTIFIRE_MIX("Extended super antifire mix", 6),
EXTENDED_ANTIFIRE("Extended antifire", 12),
EXTENDED_ANTIFIRE_MIX("Extended antifire mix", 12),
SUPER_ANTIFIRE_POTION("Super antifire potion", 3),
SUPER_ANTIFIRE_MIX("Super antifire mix", 3),
ANTIFIRE_POTION("Antifire potion", 6),
ANTIFIRE_MIX("Antifire mix", 6);
private final String antiFireName;
private final int time;
public int time() {
return Double.valueOf((time * .3) * 60 * 1000).intValue(); // time to drink ( 30% of the antifire effect )
}
@Override
public String toString() {
return this.antiFireName;
}
}

View File

@@ -0,0 +1,19 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Crossbow {
DRAGON_HUNTER_CROSSBOW("Dragon hunter crossbow"),
RUNE_CROSSBOW("Rune crossbow"),
DRAGON_CROSSBOW("Dragon crossbow");
private final String crossbowName;
@Override
public String toString() {
return crossbowName;
}
}

View File

@@ -0,0 +1,23 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Portal {
PORTAL_NEXUS("Portal Nexus", "Lunar Isle"),
LUNAR_ISLE_PORTAL("Lunar Isle Portal", "Enter");
private final String portalName;
private final String portalAction;
@Override
public String toString() {
return portalName;
}
public String action() {
return portalAction;
}
}

View File

@@ -0,0 +1,18 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum PrayerPotion {
PRAYER("Prayer potion"),
SUPER_RESTORE("Super restore");
private final String potionName;
@Override
public String toString() {
return potionName;
}
}

View File

@@ -0,0 +1,24 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum RangePotion {
DIVINE_RANGING_POTION("Divine ranging potion", 5),
DIVINE_BASTION_POTION("Divine bastion potion", 5),
RANGING_POTION("Ranging potion", 3);
private final String potionName;
private final int time;
@Override
public String toString() {
return potionName;
}
public int time() {
return (int) ((time * 0.3) * 60 * 1000); // time to drink ( 30% of the Range effect )
}
}

View File

@@ -0,0 +1,18 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum RunePouch {
RUNE_POUCH("Rune pouch"),
DIVINE_RUNE_POUCH("Divine rune pouch");
private final String runePouchName;
@Override
public String toString() {
return runePouchName;
}
}

View File

@@ -0,0 +1,18 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Staff {
SLAYER_STAFF("Slayer's staff"),
SLAYER_STAFF_E("Slayer's staff (e)");
private final String staffName;
@Override
public String toString() {
return staffName;
}
}

View File

@@ -0,0 +1,24 @@
package ee.futur.vorkath.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Teleport {
CONSTRUCT_CAPE_T("Construct. cape(t)", "Tele to POH"),
CONSTRUCT_CAPE("Construct. cape", "Tele to POH"),
HOUSE_TAB("Teleport to house", "Break");
private final String teleportName;
private final String action;
@Override
public String toString() {
return teleportName;
}
public String action() {
return action;
}
}