Log in

View Full Version : Custom buff bot with saved spell sets


eyenseq
02-13-2025, 05:44 AM
Thought this was pretty cool and wanted to share it. NPC will provide a list of spells available to you at X level. If you are grouped it will use the lowest level group member preventing a high level and low level grouping to get buffs. you can "add spell #" to your buff list and it will be saved until you manually clear it with "remove spell #" or "clear buffs".

use JSON;
use Data::Dumper;

sub EVENT_SAY {
my $client_level = $client->GetLevel();
my $lowest_group_level = GetLowestGroupLevel($client);
my $buff_level = $lowest_group_level ? $lowest_group_level : $client_level;

if ($text=~/hail/i) {
plugin::Whisper("Greetings, $name. I can provide buffs based on your level. Say 'list buffs' to see your available buffs or 'yes' to receive them. You can also 'add spell <id>' or 'remove spell <id>' from your buff list. Say 'clear buffs' to remove all buffs from your list.");
}
elsif ($text=~/list buffs/i) {
ListAvailableBuffs($client, $buff_level);
}
elsif ($text=~/yes/i) {
CastBuffs($client, $buff_level);
}
elsif ($text=~/add spell (\d+)/i) {
AddBuff($client, $1, $buff_level);
}
elsif ($text=~/remove spell (\d+)/i) {
RemoveBuff($client, $1);
}
elsif ($text=~/clear buffs/i) {
ClearBuffList($client);
}
}


sub GetLowestGroupLevel {
my $client = shift;
if ($client->IsGrouped()) {
my $group = $client->GetGroup();
if ($group) {
my $lowest_level = 100;
my $member_count = $group->GroupCount();
for (my $i = 0; $i < $member_count; $i++) {
my $member = $group->GetMember($i);
next if (!$member);
my $level = $member->GetLevel();
$lowest_level = $level if ($level < $lowest_level);
}
return $lowest_level;
}
}
return 0;
}


sub GetBuffList {
my ($client) = @_;
my $buff_list = $client->GetBucket("buff_list");

if (!$buff_list) {
return {};
}
elsif (ref($buff_list) eq 'HASH') {
return $buff_list;
}
elsif ($buff_list =~ /^\{/) {
return decode_json($buff_list);
}
return {};
}

sub SetBuffList {
my ($client, $buff_list) = @_;
$client->SetBucket("buff_list", encode_json($buff_list));
}


sub ListAvailableBuffs {
my ($client, $level) = @_;
my %buffs = GetBuffsByLevel($level);

plugin::Whisper("Available buffs for level $level:");
foreach my $spell_name (keys %buffs) {
my $spell_id = $buffs{$spell_name};
plugin::Whisper("$spell_name (ID: $spell_id)");
}
}

sub AddBuff {
my ($client, $spell_id, $level) = @_;
my %buffs = GetBuffsByLevel($level);
my $buff_list = GetBuffList($client);



if (grep { $_ == $spell_id } values %buffs) {
$buff_list->{$spell_id} = 1;
SetBuffList($client, $buff_list);
plugin::Whisper("Spell ID $spell_id added to your buff list.");
} else {
plugin::Whisper("That spell is not available at your level.");
}


}

sub RemoveBuff {
my ($client, $spell_id) = @_;
my $buff_list = GetBuffList($client);



if (exists $buff_list->{$spell_id}) {
delete $buff_list->{$spell_id};
SetBuffList($client, $buff_list);
plugin::Whisper("Spell ID $spell_id removed from your buff list.");
} else {
plugin::Whisper("That spell is not in your buff list.");
}


}

sub CastBuffs {
my ($client, $level) = @_;
my $lowest_group_level = GetLowestGroupLevel($client); # Get lowest-level group member
my $buff_list = GetBuffList($client);
my %buffs = GetBuffsByLevel($lowest_group_level); # Get spells for lowest group member level

plugin::Whisper("Debug: Retrieved buff list - " . Dumper($buff_list));

if (!%$buff_list) {
plugin::Whisper("Your buff list is empty! Use 'add spell <id>' to add buffs.");
return;
}

# Ensure the lowest-level player in the group is eligible for buffs
if ($lowest_group_level < 1) {
plugin::Whisper("Error: Could not determine lowest-level group member.");
return;
}

plugin::Whisper("Checking group level... Lowest-level member is level $lowest_group_level.");

foreach my $spell_id (keys %$buff_list) {
# Only cast the spell if it is allowed at the lowest group level
my $spell_name = GetSpellNameById($spell_id, \%buffs);

if ($spell_name ne "Unknown Spell") {
plugin::Whisper("Casting $spell_name (ID: $spell_id) on " . $client->GetCleanName());
$npc->SpellFinished($spell_id, $client);
} else {
plugin::Whisper("Skipping spell ID $spell_id - Level too low.");
}
}

plugin::Whisper("Buffs applied where possible!");
}


sub ClearBuffList {
my ($client) = @_;

SetBuffList($client, {});

plugin::Whisper("All buffs have been removed from your buff list.");
}

sub GetSpellNameById {
my ($spell_id, $buffs_ref) = @_;

foreach my $name (keys %$buffs_ref) {
if ($buffs_ref->{$name} == $spell_id) {
return $name; # Return spell name if ID matches
}
}

return "Unknown Spell"; # Default if not found
}


sub GetBuffsByLevel {
my ($level) = @_;

if ($level >= 1 && $level <= 44) {
return (
"Blessing of Temperance" => 4053,
"Infusion of Spirit" => 3454,
"Stamina" => 158,
"Spirit of Bih'Li" => 2524,
"Swift Like the Wind" => 172,
"Boon of the Clear Mind" => 1694,
"Brell's Steadfast Aegis" => 3578,
);
}
elsif ($level >= 45 && $level <= 54) {
return (
"Ancient: Gift of Aegolism" => 2122,
"Spirit of Bih'Li" => 2524,
"Riotous Health" => 1595,
"Deliriously Nimble" => 1594,
"Talisman of Kragg" => 1585,
"Gift of Insight" => 1409,
"Aanya's Quickening" => 1708,
"Clarity II" => 1693,
"Brell's Steadfast Aegis" => 3578,
"Strength of Nature" => 1397,
);
}
elsif ($level >= 55 && $level <= 64) {
return (
"Hand of Virtue" => 3479,
"Aura of Reverence" => 4108,
"Kazad's Mark" => 3047,
"Ward of Gallantry" => 3470,
"Focus of the Seventh" => 3397,
"Talisman of the Boar" => 3389,
"Talisman of the Wrulan" => 3383,
"Spirit of Bih'Li" => 2524,
"Voice of Quellious" => 3360,
"Vallon's Quickening" => 3178,
"Brell's Stalwart Shield" => 3432,
"Spirit of the Predator" => 3417,
"Strength of Tunare" => 3487,
"Ferocity" => 3463,
"Spiritual Dominion" => 3460,
"Spiritual Vigor" => 3456,
"Blessing of the Nine" => 3451,
"Blessing of Replenishment" => 3441,
);
}

elsif ($level >= 65 && $level <= 74) {
return (
"Hand of Tenacity Rk. III" => 9811,
"Elushar's Mark Rk. III" => 9808,
"Aura of Purpose Rk. III" => 9781,
"Ward of the Dauntless Rk. III" => 9714,
"Specter of Renewal Rk. III" => 11781,
"Talisman of the Dire Rk. III" => 10058,
"Talisman of the Stoic One Rk. III" => 10031,
"Talisman of Foresight Rk. III" => 10013,
"Voice of Intuition Rk. III" => 10664,
"Hastening of Ellowind Rk. III" => 10661,
"Brell's Stony Guard Rk. III" => 10211,
"Snarl of the Predator Rk. III" => 10115,
"Strength of the Forest Stalker Rk. III" => 10100,
);
}
elsif ($level >= 75) {
return (
"Unified Hand of Gezat Rk. III" => 34228,
"Unified Hand of Certitude Rk. III" => 34246,
"Talisman of the Courageous Rk. III" => 35459,
"Talisman of the Steadfast Rk. III" => 34849,
"Voice of Foresight Rk. III" => 36267,
"Hastening of Sviir Rk. III" => 36223,
"Brell's Steadfast Bulwark Rk. III" => 34415,
"Granitebark Blessing Rk. III" => 34988,
"Shout of the Predator Rk. III" => 34568,
"Strength of the Bosquestalker Rk. III" => 34541,
"Shared Merciless Ferocity Rk. III" => 36424,
"Spiritual Unity Rk. III" => 40524,

);
}
return ();
}

eyenseq
02-13-2025, 03:42 PM
Did some editing was not allowing buffs to be cast on ungrouped player. Added a new command to list saved buffs. Added say links to add/remove spells. Will post it if anyone is interested.

eyenseq
02-16-2025, 01:22 AM
Supports 3 saved buff sets
Buffs can be added / removed from sets with clickable links
Add all buffs and block traditional way for the lazy
Easy way to add utility buffs and let players build their own ideal buff sets


use JSON;
use Data::Dumper;
use DBI;

sub EVENT_SAY {
my $client_level = $client->GetLevel();
my $lowest_group_level = GetLowestGroupLevel($client);
my $buff_level = $lowest_group_level ? $lowest_group_level : $client_level;

if ($text=~/hail/i) {
plugin::Whisper("Yo, $name! Need a power-up? I致e got buffs hotter than dragon breath and stronger than goblin coffee!");
plugin::Whisper("Check the menu with " . quest::saylink("list buffs", 1, "[List Buffs]") . " or go all-in with " . quest::saylink("all buffs", 1, "[All Buffs]") . ".");
plugin::Whisper("Ready to get juiced? Say " . quest::saylink("yes", 1, "[Yes]") . " and I'll make you OP.");
plugin::Whisper("Wanna see your stash? Peek at " . quest::saylink("saved buffs", 1, "[Saved Buffs]") . ".");
plugin::Whisper("Messed up? Say 'add spell <id>', 'remove spell <id>', or nuke 'em all with " . quest::saylink("clear buffs", 1, "[Clear Buffs]") . "!");
plugin::Whisper("Buff sets? I got 'em! Choose your loadout: " . quest::saylink("set 1", 1, "[Set 1]") . ", " . quest::saylink("set 2", 1, "[Set 2]") . ", or " . quest::saylink("set 3", 1, "[Set 3]") . ". Pick your poison!");

}
elsif ($text=~/list buffs/i) {
my $active_set = GetActiveBuffSet($client); # Ensure we get the correct active set
ListAvailableBuffs($client, $buff_level, $active_set);
}

elsif ($text=~/yes/i) {
CastBuffs($client, $buff_level);
}
elsif ($text=~/add spell (\d+)/i) {
AddBuff($client, $1, $buff_level);
}
elsif ($text=~/remove spell (\d+)/i) {
RemoveBuff($client, $1);
}
elsif ($text=~/clear buffs/i) {
ClearBuffList($client);
}
elsif ($text=~/saved buffs/i) {
ListSavedBuffs($client);
}
elsif ($text=~/all buffs/i) {
AddAllBuffs($client);
}
elsif ($text=~/set (\d)/i && $1 >= 1 && $1 <= 3) {
UseBuffSet($client, $1);
}
}


sub GetSpellType {
my ($spell_id) = @_;

# Database connection settings (UPDATE AS NEEDED)
my $db_host = "127.0.0.1"; # Change if needed
my $db_name = "yourdatabase"; # Change to your actual database name
my $db_user = "youuser"; # Change to your actual user name
my $db_pass = 'yourpassword'; # Change to your actual password

# Connect to MySQL
my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=$db_host",
$db_user, $db_pass, { RaiseError => 1, AutoCommit => 1 });

# Run the query
my $query = "SELECT targettype FROM spells_new WHERE id = ?";
my $sth = $dbh->prepare($query);
$sth->execute($spell_id);

# Fetch result
my ($target_type) = $sth->fetchrow_array();

# Close DB connection
$sth->finish();
$dbh->disconnect();

# Debug output
if (!defined $target_type) {
return "Unknown";
}

return ($target_type == 41 || $target_type == 14) ? "Group" : "Single";
}


sub SetBuffSet {
my ($client, $set_number, $buff_list) = @_;
my $bucket_name = "buff_set_" . $set_number;
$client->SetBucket($bucket_name, encode_json($buff_list));
}

sub SetActiveBuffSet {
my ($client, $set_number) = @_;
$client->SetBucket("current_buff_set", $set_number);
}

sub GetActiveBuffSet {
my ($client) = @_;
my $set_number = $client->GetBucket("current_buff_set");

# Ensure we return a valid set number (1, 2, or 3), default to 1 if not set
return ($set_number && $set_number =~ /^[1-3]$/) ? $set_number : 1;
}


sub AddAllBuffs {
my ($client) = @_;
my $client_level = $client->GetLevel();
my %buffs = GetBuffsByLevel($client_level);
my $buff_list = GetBuffList($client);

if (!%buffs) {
plugin::Whisper("No buffs available for your level.");
return;
}

foreach my $spell_name (keys %buffs) {
my $spell_id = $buffs{$spell_name};
$buff_list->{$spell_id} = 1;
}

SetBuffList($client, $buff_list);
plugin::Whisper("All available buffs for level $client_level have been added to your buff list.");
}

sub GetLowestGroupLevel {
my $client = shift;

# If the player is not grouped, return their own level
return $client->GetLevel() unless $client->IsGrouped();

my $group = $client->GetGroup();
if ($group) {
my $lowest_level = 100; # Assume max level is 100, adjust as needed
my $member_count = $group->GroupCount();

for (my $i = 0; $i < $member_count; $i++) {
my $member = $group->GetMember($i);
next unless ($member);
my $level = $member->GetLevel();
$lowest_level = $level if ($level < $lowest_level);
}
return $lowest_level;
}

return $client->GetLevel(); # Default to player's level if something goes wrong
}


sub UseBuffSet {
my ($client, $set_number) = @_;

# Set the active buff set
SetActiveBuffSet($client, $set_number);

my $buff_list = GetBuffSet($client, $set_number);
if (!%$buff_list) {
plugin::Whisper("Buff set $set_number is empty or does not exist.");
return;
}

# Apply the selected buff set
SetBuffList($client, $buff_list);
plugin::Whisper("Buff set $set_number has been loaded and is now active.");
}



sub GetBuffSet {
my ($client, $set_number) = @_;
my $bucket_name = "buff_set_" . $set_number;
my $buff_set = $client->GetBucket($bucket_name);

if (!$buff_set || $buff_set eq "null") { # Ensures valid JSON data
return {};
}

return decode_json($buff_set);
}

sub SaveBuffSet {
my ($client, $set_number) = @_;
my $buff_list = GetBuffList($client);

if (!%$buff_list) {
plugin::Whisper("Your buff list is empty! Add buffs before saving.");
return;
}

my $bucket_name = "buff_set_" . $set_number;
$client->SetBucket($bucket_name, encode_json($buff_list));
plugin::Whisper("Buff set $set_number has been saved.");
}

sub ListSavedBuffs {
my ($client) = @_;

my %all_buffs;
foreach my $level (1..100) {
my %level_buffs = GetBuffsByLevel($level);
%all_buffs = (%all_buffs, %level_buffs);
}

plugin::Whisper(" ");
plugin::Whisper("===== 🎒 Your Saved Buff Sets 🎒 =====");
plugin::Whisper(" ");

# Define simulated colors and spacing using prefixes
my %set_prefixes = (
1 => "★★ Buff Set 1 ★★ ", # Simulated Yellow
2 => "◆◆ Buff Set 2 ◆◆ ", # Simulated Cyan
3 => "▲▲ Buff Set 3 ▲▲ ", # Simulated Green
);

for my $set_number (1..3) {
my $buff_list = GetBuffSet($client, $set_number);
my $prefix = $set_prefixes{$set_number};

plugin::Whisper(" ");
plugin::Whisper("末末末末末末末末末末末末末末末末末");
plugin::Whisper("$prefix");

if (!%$buff_list) {
plugin::Whisper(" (empty)");
next;
}

my @sorted_spells = sort { lc($a) cmp lc($b) } keys %$buff_list;

foreach my $spell_id (@sorted_spells) {
my $spell_name = GetSpellNameById($spell_id, \%all_buffs);
my $remove_command = quest::saylink("remove spell $spell_id $set_number", 1, "[Remove from Set $set_number]");
plugin::Whisper(" - $spell_name (ID: $spell_id) $remove_command");
}
}

plugin::Whisper(" ");
plugin::Whisper("=====================================");
plugin::Whisper(" ");
}


sub ListAvailableBuffs {
my ($client, $level, $active_set) = @_;

# Ensure we are using the correct active buff set
$active_set ||= GetActiveBuffSet($client);

# Get all available buffs for the player's level
my %available_buffs = GetBuffsByLevel($level);

# Get the buffs saved in the active set
my $saved_buffs = GetBuffSet($client, $active_set);

plugin::Whisper("Available buffs for level $level (Active Buff Set: $active_set):");

if (!%available_buffs) {
plugin::Whisper("No buffs available at this level.");
return;
}

my @sorted_spells = sort { lc($a) cmp lc($b) } keys %available_buffs;

foreach my $spell_name (@sorted_spells) {
my $spell_id = $available_buffs{$spell_name};

if (exists $saved_buffs->{$spell_id}) {
# If the spell is already in the saved set, show [Remove] button
my $remove_command = quest::saylink("remove spell $spell_id $active_set", 1, "[Remove from Set $active_set]");
plugin::Whisper("$spell_name (ID: $spell_id) $remove_command");
} else {
# If the spell is not in the saved set, show [Add] button
my $add_command = quest::saylink("add spell $spell_id $active_set", 1, "[Add to Set $active_set]");
plugin::Whisper("$spell_name (ID: $spell_id) $add_command");
}
}
}


sub AddBuff {
my ($client, $spell_id, $set_number) = @_;

# Ensure the correct buff set number
if (!$set_number || $set_number !~ /^[1-3]$/) {
$set_number = GetActiveBuffSet($client);
}

# Get the current active buff list
my $buff_list = GetBuffSet($client, $set_number);

# Allow any spell to be added, even if it's not in GetBuffsByLevel
$buff_list->{$spell_id} = 1;
SetBuffSet($client, $set_number, $buff_list);

plugin::Whisper("Spell ID $spell_id added to Buff Set $set_number.");
}

sub RemoveBuff {
my ($client, $spell_id, $set_number) = @_;

# Ensure the correct buff set number is used
if (!$set_number || $set_number !~ /^[1-3]$/) {
$set_number = GetActiveBuffSet($client);
}

my $buff_list = GetBuffSet($client, $set_number); # Load the correct buff set

if (exists $buff_list->{$spell_id}) {
delete $buff_list->{$spell_id}; # Remove the spell from the set
SetBuffSet($client, $set_number, $buff_list); # Save the updated set
plugin::Whisper("Spell ID $spell_id removed from Buff Set $set_number.");
} else {
plugin::Whisper("That spell is not in Buff Set $set_number.");
}
}


sub CastBuffs {
my ($client, $level) = @_;

my $active_set = GetActiveBuffSet($client);
my $buff_list = GetBuffSet($client, $active_set);

if (!%$buff_list) {
plugin::Whisper("Uh-oh, Buff Set $active_set is empty! Add some spells first.");
return;
}

plugin::Whisper("Buffing you up with Buff Set $active_set!");

my $group = $client->GetGroup();
my %unique_targets;

# Always add the initiator (player who requested buffs)
$unique_targets{$client->GetID()} = $client;

# Check if the player is in a group
if ($group) {
plugin::Whisper("You're in a group! Buffing all group members, including bots!");

for (my $i = 0; $i < $group->GroupCount(); $i++) {
my $member = $group->GetMember($i);

# Ensure member is valid
next unless defined $member;

# Include both players (IsClient) and bots (IsBot)
if ($member->IsClient() || $member->IsBot()) {
my $member_id = $member->GetID();
$unique_targets{$member_id} = $member;
}
}
}

# Convert the hash back into an array of unique targets
my @targets = values %unique_targets;

# Prevent duplicate group buffs
my %cast_group_buffs;

foreach my $spell_id (sort { $a <=> $b } keys %$buff_list) {
my $spell_name = GetSpellNameById($spell_id);
my $spell_type = GetSpellType($spell_id);

if ($spell_type eq "Group") {
if (!$cast_group_buffs{$spell_id}) {


# Now casting on all members including bots
foreach my $member (@targets) {
$client->SpellFinished($spell_id, $member);
}

$cast_group_buffs{$spell_id} = 1;
}
} else {
foreach my $member (@targets) {

$client->SpellFinished($spell_id, $member);
}
}
}

plugin::Whisper("Buffs applied successfully!");
}


sub GetBuffList {
my ($client) = @_;
my $buff_list = $client->GetBucket("buff_list");
return {} unless $buff_list;
return decode_json($buff_list);
}

sub SetBuffList {
my ($client, $buff_list) = @_;
my $active_set = GetActiveBuffSet($client);
SetBuffSet($client, $active_set, $buff_list);
}


sub ClearBuffList {
my ($client) = @_;
SetBuffList($client, {});
plugin::Whisper("All buffs successfully removed.");
}


sub GetSpellNameById {
my ($spell_id) = @_;

# Database connection settings (UPDATE AS NEEDED)
my $db_host = "127.0.0.1"; # Change if needed
my $db_name = "yourdatabase"; # Change to your actual database name
my $db_user = "youuser"; # Change to your actual user name
my $db_pass = 'yourpassword'; # Change to your actual password

# Connect to MySQL
my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=$db_host",
$db_user, $db_pass, { RaiseError => 1, PrintError => 1, AutoCommit => 1 });

if (!$dbh) {
return "Unknown Spell";
}

# Run the query
my $query = "SELECT name FROM spells_new WHERE id = ?";
my $sth = $dbh->prepare($query);
$sth->execute($spell_id);

# Fetch result
my ($spell_name) = $sth->fetchrow_array();

# Close DB connection
$sth->finish();
$dbh->disconnect();

# Debug output
if (!defined $spell_name) {
return "Unknown Spell";
}

return $spell_name;
}


sub GetBuffsByLevel {
my ($level) = @_;

if ($level >= 1 && $level <= 44) {
return (
"Blessing of Temperance" => 4053,
"Infusion of Spirit" => 3454,
"Stamina" => 158,
"Spirit of Bih'Li" => 2524,
"Swift Like the Wind" => 172,
"Boon of the Clear Mind" => 1694,
"Brell's Steadfast Aegis" => 3578,
);
}
elsif ($level >= 45 && $level <= 54) {
return (
"Ancient: Gift of Aegolism" => 2122,
"Spirit of Bih'Li" => 2524,
"Riotous Health" => 1595,
"Deliriously Nimble" => 1594,
"Talisman of Kragg" => 1585,
"Gift of Insight" => 1409,
"Aanya's Quickening" => 1708,
"Clarity II" => 1693,
"Brell's Steadfast Aegis" => 3578,
"Strength of Nature" => 1397,
);
}
elsif ($level >= 55 && $level <= 64) {
return (
"Hand of Virtue" => 3479,
"Aura of Reverence" => 4108,
"Kazad's Mark" => 3047,
"Ward of Gallantry" => 3470,
"Focus of the Seventh" => 3397,
"Talisman of the Boar" => 3389,
"Talisman of the Wrulan" => 3383,
"Spirit of Bih'Li" => 2524,
"Voice of Quellious" => 3360,
"Vallon's Quickening" => 3178,
"Brell's Stalwart Shield" => 3432,
"Spirit of the Predator" => 3417,
"Strength of Tunare" => 3487,
"Ferocity" => 3463,
"Spiritual Dominion" => 3460,
"Spiritual Vigor" => 3456,
"Blessing of the Nine" => 3451,
"Blessing of Replenishment" => 3441,
);
}

elsif ($level >= 65 && $level <= 74) {
return (
"Hand of Tenacity Rk. III" => 9811,
"Elushar's Mark Rk. III" => 9808,
"Aura of Purpose Rk. III" => 9781,
"Ward of the Dauntless Rk. III" => 9714,
"Specter of Renewal Rk. III" => 11781,
"Talisman of the Dire Rk. III" => 10058,
"Talisman of the Stoic One Rk. III" => 10031,
"Talisman of Foresight Rk. III" => 10013,
"Voice of Intuition Rk. III" => 10664,
"Hastening of Ellowind Rk. III" => 10661,
"Brell's Stony Guard Rk. III" => 10211,
"Snarl of the Predator Rk. III" => 10115,
"Strength of the Forest Stalker Rk. III" => 10100,
);
}
elsif ($level >= 75) {
return (
"Unified Hand of Gezat Rk. III" => 34228,
"Unified Hand of Certitude Rk. III" => 34246,
"Talisman of the Courageous Rk. III" => 35459,
"Talisman of the Steadfast Rk. III" => 34849,
"Spirit of Dauntlessness Rk. III" => 35365,
"Voice of Foresight Rk. III" => 36267,
"Hastening of Sviir Rk. III" => 36223,
"Brell's Steadfast Bulwark Rk. III" => 34415,
"Granitebark Blessing Rk. III" => 34988,
"Shout of the Predator Rk. III" => 34568,
"Strength of the Bosquestalker Rk. III" => 34541,
"Shared Merciless Ferocity Rk. III" => 36424,
"Spiritual Unity Rk. III" => 40524,

);
}
return ();
}