EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Support::Windows Servers (https://www.eqemulator.org/forums/forumdisplay.php?f=587)
-   -   Creating a Buff Bot (https://www.eqemulator.org/forums/showthread.php?t=40898)

DanCanDo 09-14-2016 02:06 AM

Creating a Buff Bot
 
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.
Code:

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

Code:

$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

Quote:

Originally Posted by Maze_EQ (Post 251125)

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

Quote:

Originally Posted by N0ctrnl (Post 251127)
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:
Code:

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:
Code:

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

Quote:

Originally Posted by ionhsmith (Post 251223)
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

Quote:

Originally Posted by ionhsmith (Post 251236)
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

Quote:

Originally Posted by Willy Willers (Post 251357)
@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

Quote:

Originally Posted by Willy Willers (Post 251360)
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

Quote:

Originally Posted by Maze_EQ (Post 251560)
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


All times are GMT -4. The time now is 07:37 AM.

Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.