Log in

View Full Version : Creating a Buff Bot


DanCanDo
09-14-2016, 02:06 AM
This is a little simple instruction to create a buff bot for those wanting to do so. It includes a quest script for the NPC you use, which is what I am using now on my own server.

You can create an NPC ingame easily with a GM toon. Just stand in the spot where you want him and type #spawn npcname (or whatever you name it).
Then target the NPC and type #npcspawn create. After that I type #repop Then, target the NPC again and type #npcedit level 65 (or higher) I use 70 myself.
The reason for this, is because if a level 1 npc buffs you it will only be a 3 minute buff. At level 65-70, (for example), Temp will be full duration.(1 hr 40 min)
#npcedit is a great GM tool ingame. I use it all the time, developing zones. I get to see instantly what I have done (chuckle)
Just remember to #repop after you're done for changes to take effect.
If you want to move your buffbot, just target it, go stand where you want it and type #spawnfix (then do a #repop for changes)

The buff script (below), contains my own preferences for buffs and dialog.
It checks for levels and whether you're grouped or not, then will cast the appropriate spells for single shot or group cast. (Excluding clarity, it's only single).
In this script, the "[SPEED]" option will dish out SoW for single or Spirit of Bih'Li if you're grouped.

This is the buffing script I use on my buff bot.

sub EVENT_SPAWN {
$x = $npc->GetX();
$y = $npc->GetY();
quest::set_proximity($x - 500, $x + 500, $y - 500, $y + 500);
}

sub EVENT_SAY {
if (($text=~/hail/i) && ($ulevel<46)) {
quest::say("Hello $name, If you or your group need [Temp] or [Speed] , please gather close. I can also give you [Clarity] to help you on your journeys as well. When you reach 46 I can give you KEI");
}
if (($text=~/hail/i) && ($ulevel>46)) {
quest::say("Hello $name, If you or your group need [Virtue] or [KEI] or [Speed] , please gather close.");
}
if (($text=~/hail/i) && ($ulevel==46)) {
quest::say("Hello $name, If you or your group need [Temp] or [KEI] or [Speed] , please gather close. Let me know when you reach 47.");
}
elsif (($text=~/temp/i) && ($ulevel<47)) {
my $Group = $client->GetGroup();
if ($Group) {
my $Valid = 1;
for ($count = 0; $count < $Group->GroupCount(); $count++) {
if ($Group->GetMember($count)->GetLevel() < 1) {
$Valid = 0;
}
}
if ($Valid == 1) {
quest::say("Incoming Group Temp for $name.");
$Group->CastGroupSpell($npc, 4053);
}
else {
quest::say("Sorry $name. Someone is not at the appropriate level for that.");
}
}
else {
quest::say("Incoming Temp for $name");
my $GetPlayerID = $client->GetID();
$npc->CastSpell(3692, $GetPlayerID );
}
}
elsif (($text=~/virtue/i) && ($ulevel>46)) {
my $Group = $client->GetGroup();
if ($Group) {
my $Valid = 1;
for ($count = 0; $count < $Group->GroupCount(); $count++) {
if ($Group->GetMember($count)->GetLevel() > 75) {
$Valid = 0;
}
}
if ($Valid == 1) {
quest::say("Incoming Group Virtue for $name.");
$Group->CastGroupSpell($npc, 3479);
}
else {
quest::say("Sorry $name. Someone not at the appropriate level for that.");
}
}
else {
quest::say("Incoming Virtue for $name");
my $GetPlayerID = $client->GetID();
$npc->CastSpell(3467, $GetPlayerID );
}
}
elsif (($text=~/clarity/i) && ($ulevel<76)) {
quest::say("Incoming Clarity for $name");
my $GetPlayerID = $client->GetID();
$npc->CastSpell(174, $GetPlayerID );
}
elsif (($text=~/kei/i) && ($ulevel>45)) {
quest::say("Incoming KEI for $name");
my $GetPlayerID = $client->GetID();
quest::selfcast(2570);
}
elsif (($text=~/speed/i) && ($ulevel<76)) {
my $Group = $client->GetGroup();
if ($Group) {
my $Valid = 1;
for ($count = 0; $count < $Group->GroupCount(); $count++) {
if ($Group->GetMember($count)->GetLevel() > 75) {
$Valid = 0;
}
}
if ($Valid == 1) {
quest::say("Incoming Spirit of Bih'Li for $name.");
$Group->CastGroupSpell($npc, 2524);
}
else {
quest::say("Sorry $name. You are not at the appropriate level for that.");
}
}
else {
quest::say("Incoming SoW for $name");
my $GetPlayerID = $client->GetID();
$npc->CastSpell(278, $GetPlayerID );
}
}
}

Maze_EQ
09-14-2016, 10:30 AM
$maxlevelbuffs = 70;
%buffshash = (
1 =>
# Warrior
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
2 =>
# Cleric
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
3 =>
# Paladin
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
4 =>
# Ranger
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
5 =>
# Shadow Knight
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
6 =>
# Druid
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
7 =>
# Monk
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
8 =>
# Bard
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
9 =>
# Rogue
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
10 =>
# Shaman
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
11 =>
# Necromancer
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
12 =>
# Wizard
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
13 =>
# Magician
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
14 =>
# Enchanter
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
15 =>
# Beastlord
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
},
16 =>
# Berserker
{
level10generic => [276,278,219,368,146,148,279,129],
level10costgeneric => 0,
level10advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level10costadvanced => 100,
level20generic => [276,278,219,368,146,148,279,129],
level20costgeneric => 0,
level20advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level20costadvanced => 100,
level30generic => [276,278,219,368,146,148,279,129],
level30costgeneric => 0,
level30advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level30costadvanced => 100,
level40generic => [276,278,219,368,146,148,279,129],
level40costgeneric => 0,
level40advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level40costadvanced => 100,
level50generic => [276,278,219,368,146,148,279,129],
level50costgeneric => 0,
level50advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level50costadvanced => 100,
level60generic => [276,278,219,368,146,148,279,129],
level60costgeneric => 0,
level60advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level60costadvanced => 100,
level70generic => [276,278,219,368,146,148,279,129],
level70costgeneric => 0,
level70advanced => [3692,2505,423,356,172,64,145,1693,15,60,61,46,2524],
level70costadvanced => 100,
}
);

################################################## ##########################################
############################### EDIT SHIT ABOVE ONLY ######################################
################################################## ##########################################


sub EVENT_SAY {
#### HAIL ####
my $groupbuffmaxcost = 0;
if ($text =~/Hail/i) {
plugin::Whisper("Greetings $name. I have been sent to aid you on your journey! Would you like: ");
plugin::Whisper("Some [".quest::saylink("lesser buffs",1)."] for ".$buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costgeneric"}."pp");
plugin::Whisper("Better [".quest::saylink("greater blessings",1)."] for ".$buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costadvanced"}."pp");
if ($client->IsGrouped()) {
$buffgroup = $entity_list->GetGroupByClient($client);
for ($count = 0; $count < $buffgroup->GroupCount(); $count++) {
my $groupmember = $buffgroup->GetMember($count);
if ($groupmember->GetZoneID() == $zoneid) {
$groupbuffmaxcost += ($buffshash{$groupmember->GetClass()}->{"level".round_up($groupmember->GetLevel())."costadvanced"});
}
}
plugin::Whisper("Best [".quest::saylink("group blessings",1)."] for ".$groupbuffmaxcost."pp");
}
plugin::Whisper("To [".quest::saylink ("cure", 1)."] you and/or your pet for free.");
plugin::Whisper("A [".quest::saylink ("bind", 1)."] to this location at no cost.");
}
#### LESSER BUFFS ####
elsif ($text=~/lesser/i) {
if ($client->GetCarriedMoney() >= (($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costgeneric"}) * 1000)) {
my @buffstocast = @{$buffshash{$client->GetClass()}->{"level".round_up($ulevel)."generic"}};
foreach my $buff (@buffstocast) {
if ($client->GetPetID()) {
my $pcpet = $entity_list->GetMobByID($client->GetPetID());
$client->SpellFinished ($buff, $pcpet);
}
quest::selfcast ($buff);
}
$client->TakeMoneyFromPP((($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costgeneric"}) * 1000), 1) unless ($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costgeneric"}) == 0;
}
else {
plugin::Whisper ("I charge ".($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costgeneric"})."pp for lesser buffs, you don't appear to have enough on you.");
}
}
#### ADVANCED BUFFS ####
elsif ($text =~/greater/i) {
if ($client->GetCarriedMoney() >= (($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costadvanced"}) * 1000)) {
my @buffstocast = @{$buffshash{$client->GetClass()}->{"level".round_up($ulevel)."advanced"}};
foreach my $buff (@buffstocast) {
if ($client->GetPetID()) {
my $pcpet = $entity_list->GetMobByID($client->GetPetID());
$client->SpellFinished ($buff, $pcpet);
}
quest::selfcast ($buff);
}
$client->TakeMoneyFromPP((($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costadvanced"}) * 1000), 1) unless ($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costadvanced"}) == 0;
}
else {
plugin::Whisper ("I charge ".($buffshash{$client->GetClass()}->{"level".round_up($ulevel)."costadvanced"})."pp for advanced blessings, you don't appear to have enough on you.");
}
}
#### GROUP BUFFS ####
elsif ($text =~ /group/i && $client->IsGrouped()) {
if ($client->GetCarriedMoney() >= (($buffshash{$client->GetClass()}->{"level".$maxlevelbuffs."costadvanced"}) * 1000 * $buffgroup->GroupCount())) {
for ($count = 0; $count < $buffgroup->GroupCount(); $count++) {
my $groupmember = $buffgroup->GetMember($count);
if ($groupmember->GetZoneID() == $zoneid) {
$client->TakeMoneyFromPP((($buffshash{$groupmember->GetClass()}->{"level".round_up($groupmember->GetLevel())."costadvanced"}) * 1000), 1) unless ($buffshash{$groupmember->GetClass()}->{"level".round_up($groupmember->GetLevel())."costadvanced"}) == 0;
my @buffstocast = @{$buffshash{$groupmember->GetClass()}->{"level".round_up($groupmember->GetLevel())."advanced"}};
foreach my $buff (@buffstocast) {
if ($groupmember->GetPetID()) {
my $groupmemberpet = $entity_list->GetMobByID($groupmember->GetPetID());
$groupmember->SpellFinished ($buff, $groupmemberpet);
}
$groupmember->SpellFinished ($buff, $groupmember);
}
$groupmember->SendMarqueeMessage(15, 510, 1, 1, 3000, "You've been buffed compliments of ".$client->GetCleanName()."!");
}
}
}
else {
plugin::Whisper("I charge a maximum of ".(($buffshash{$client->GetClass()}->{"level".$maxlevelbuffs."costadvanced"}) * $buffgroup->GroupCount())."pp to cast buffs on your entire group. You don't appear to have enough!");
}
}
#### CURE ####
elsif ($text=~/cure/i) {
if ($client->GetPetID()) {
my $pppet = $entity_list->GetMobByID($client->GetPetID());
$client->SpellFinished (6594, $pppet);
}
$client->SpellFinished(6594);
}
#### BIND ####
elsif ($text=~/bind/i) {
quest::selfcast(35);
}
}

sub round_up {
my $n = shift;
my $scale = 10**int(log($n)/log(10));
$n = 9 if $scale == 1;
if ($n > $scale) {
$n = int($n/$scale+1)*$scale;
}
$n;

Because buffs by class is important.

Let's make elf sims great again!

DanCanDo
09-14-2016, 10:57 AM
Because buffs by class is important.

Let's make elf sims great again!

Yes, buffs by class is important, but you get what you pay for.

Let's make free buffs great again! :P

N0ctrnl
09-14-2016, 10:57 AM
In the future you might wanna drop this in the custom quests section. More likely to be found when looked for thataway.

DanCanDo
09-14-2016, 12:01 PM
In the future you might wanna drop this in the custom quests section. More likely to be found when looked for thataway.

I actually thought about that, but I figured since the post was more directed at
the whole creation of a buff bot, it would be better off here, otherwise, if it was
just the script, yes, definately could of been put in a quest forum.

Kingly_Krab
09-14-2016, 04:19 PM
plugin: sub BuffsHash {
my %hash = (1 => [1, 10, [219, 279, 269, 266, 40, 39, 697, 278, 46, 129, 13], 0],
2 => [11, 20, [89, 283, 148, 2512, 147, 170, 174, 278, 46, 432, 13], 5],
3 => [21, 30, [244, 149, 148, 349, 151, 10, 1693, 4054, 356, 13], 10],
4 => [31, 40, [312, 161, 160, 152, 153, 171, 1694, 169, 1727, 13], 25],
5 => [41, 50, [4053, 158, 154, 157, 159, 172, 1695, 2517, 1560, 13], 50],
6 => [51, 60, [1447, 1580, 1579, 1596, 1581, 1729, 2570, 2517, 1561, 13], 125],
7 => [61, 65, [3467, 3397, 4883, 3234, 1710, 3350, 2519, 2517, 3448, 13], 250],
8 => [66, 70, [27032, 14284, 3472, 3479, 5415, 5355, 5352, 3178, 5513, 3444, 3185, 27032, 25230, 26317, 25443, 25470, 13, 432], 500]);
return %hash;
}

sub ListBuffPrices {
my %h = plugin::BuffsHash();
my @a;
foreach my $key (sort {$a <=> $b} keys %h) {
push @a, "$h{$key}[0] to $h{$key}[1]: $h{$key}[3] Platinum";
}
quest::popup("Buff Prices", join("<br>", @a));
}

sub GetBuffCost {
my $ulevel = plugin::val('ulevel');
my %h = plugin::BuffsHash();
foreach my $key (sort {$a <=> $b} keys %h) {
if ($ulevel >= $h{$key}[0] && $ulevel <= $h{$key}[1]) {
return $h{$key}[3];
}
}
}

sub HandleBuffBot {
my $ulevel = plugin::val('ulevel');
my $npc = plugin::val('npc');
my $client = plugin::val('client');
my %buffsHash = plugin::BuffsHash();
if (!$client->GetGroup()) {
foreach my $k (keys %buffsHash) {
if ($ulevel >= $buffsHash{$k}[0] && $ulevel <= $buffsHash{$k}[1]) {
if ($client->TakeMoneyFromPP($buffsHash{$k}[3] * 1000, 1)) {
quest::selfcast($_) for @{$buffsHash{$k}[2]};
} else {
plugin::Whisper("You cannot afford buffs, they cost $buffsHash{$k}[3] Platinum for your level!");
return;
}
}
}
} else {
foreach my $k (keys %buffsHash) {
if ($ulevel >= $buffsHash{$k}[0] && $ulevel <= $buffsHash{$k}[1]) {
if ($client->TakeMoneyFromPP($buffsHash{$k}[3] * 1000, 1)) {
for ($i = 0; $i < 6; $i++) {
if ($client->GetGroup()->GetMember($i) && $client->GetGroup()->GetMember($i)->IsClient()) {
$client->GetGroup()->GetMember($i)->SpellFinished($_, $client, 0) for @{$buffsHash{$k}[2]};
}
}
} else {
plugin::Whisper("You cannot afford buffs, they cost $buffsHash{$k}[3] Platinum for your level!");
return;
}
}
}
}
plugin::Whisper("Enjoy your buffs!");
}

NPC:
sub EVENT_SAY {
if ($text=~/Hail/i) {
plugin::Whisper("Hello $name, would you like some " . quest::saylink("buffs", 1) . "? Keep in mind, the " . quest::saylink("price", 1) . " of these buffs increases as you level.");
} elsif ($text=~/Buffs/i) {
quest::popup("Confirmation Window", "Are you sure you would like to purchase buffs?<br><font color ='#00FFFF'>Level $ulevel buffs cost " . plugin::GetBuffCost() . " Platinum.</font>", 998, 1);
} elsif ($text=~/Price/i) {
plugin::ListBuffPrices();
}
}

sub EVENT_POPUPRESPONSE {
plugin::HandleBuffBot();
}

Maze_EQ
09-14-2016, 04:32 PM
fu kingly.

DanCanDo
09-14-2016, 07:44 PM
I just tried that out, it's a nice little "plat for buffs" script. Not once on EQ Live did I ever
find 14 buffs, no matter how much coin I had (chuckle). Looks like Maze and Kingly want to
spoil players (grin)

ionhsmith
09-18-2016, 10:07 PM
Where do I add the script

DanCanDo
09-18-2016, 11:20 PM
Where do I add the script

Put it in to a text-style file (I use notepad++), and save it (as a .pl file) with
the same name as you gave the NPC buff bot in the quests/(zonename) folder
where you put the NPC. For example John_Doe_Buffbot.pl
If that John_Doe NPC is in poknowledge, then save it in quests/poknowledge
folder.
POST EDIT : Sorry forgot to add a reminder. If you make any quest file changes
while your server is running, from your GM client you can type #reloadquest
There's shorter forms of that but I'm an energetic guy with a keyboard :)

ionhsmith
09-19-2016, 08:43 PM
sweet I got that too work. so how do I add what kingly and maze added so it will charge for buffs instead of it being free

DanCanDo
09-19-2016, 08:54 PM
sweet I got that too work. so how do I add what kingly and maze added so it will charge for buffs instead of it being free

Using Kingly's for example, there is two seperate blocks of code there.
The one called "plugin", put that script into a file and save it as whisper.pl but
put that one in the quests/plugins folder.
The other part, put on NPC script, like I described with mine.

ionhsmith
09-22-2016, 06:08 PM
Dan, thanks for the info. I did what you said with Kingly's ... now I have a bot in guild lobby that whispers and ask if I want buffs and says keep in mind the price goes up as I lvl. But he does not cast buffs.... do I have to use this with yours or something?

DanCanDo
09-22-2016, 06:11 PM
No, you do not need mine. I am not sure why it's not casting for you, I tried that script out
myself and it worked fine.

ionhsmith
09-22-2016, 06:23 PM
it does work on mages either...

ionhsmith
09-22-2016, 07:21 PM
Yea I'm not sure why either... I get the whisper and the buffs and price are pink in color, but when I reply back nothing happens... when I click on buffs or price nothing happens... yours works just fine but cant get the other two to work

Willy Willers
09-25-2016, 07:54 AM
@DanCanDo I've got my NPC and the .pl file with the script you provided but when I hail her I get nothing back, what kind of things can I troubleshoot to get it to work?

DanCanDo
09-25-2016, 08:03 AM
@DanCanDo I've got my NPC and the .pl file with the script you provided but when I hail her I get nothing back, what kind of things can I troubleshoot to get it to work?

One silly mistake I made long ago, when naming the NPC script, I hadn't noticed
just once little character was wrong. The name of the script.pl has to match
the name of the NPC EXACTLY, character for character. So if you named your
npc John_Doe then the script has to be named John_Doe.pl
If it's #John_Doe , again script has to be named #John_Doe.pl
It also has to go in the appropriate zone quest folder (there is one for every zone.
And as a reminder, if server is running, and your logged in with GM toon,
type #reloadquest

Willy Willers
09-25-2016, 08:45 AM
ok, but if the npc is named "John Doe" it still gets an underscore in the file correct? "John_Doe" ?

DanCanDo
09-25-2016, 08:52 AM
ok, but if the npc is named "John Doe" it still gets an underscore in the file correct? "John_Doe" ?

The script goes by the designated FIRST name of the NPC
Look at the first name of the npc in your database. Whatever characters is
used in that first name. That's how the script gets named

Willy Willers
09-25-2016, 09:10 AM
ZOMG it worked! I've finally added something custom to my server! Thanks Dan!

Warkral
10-04-2016, 08:36 PM
DanCanDo and Uleat has been freeking AWSOME in helping those of us who have ZERO code skills but 100% motivation. Thanks guys!

Maze_EQ
10-05-2016, 03:35 PM
Much better practice to use NPCID instead of name.

As you can have multiple NPCs with the same name but use different scripts.

atrayas
10-05-2016, 04:37 PM
Much better practice to use NPCID instead of name.

As you can have multiple NPCs with the same name but use different scripts.

Agreed :D :D :D