EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Quests::Q&A (https://www.eqemulator.org/forums/forumdisplay.php?f=599)
-   -   Buff Bot re-creation NPC getclass() Help (https://www.eqemulator.org/forums/showthread.php?t=36479)

Figback65 02-15-2013 12:11 AM

yes, #reloadpl and #repop and #repop force

c0ncrete 02-15-2013 01:19 AM

this works.

i think it might have had something to do with scope and assigning a value to $npcClass by way of the constant. it was an empty string until i moved the declarations of that and $buffList inside of the scopes they were used. the same does not apply to $data, however.

Code:

use 5.012;
no strict 'vars';
use warnings;

# array of playable class long names
use constant CLASS_L => qw(
  Unknown Warrior Cleric Paladin Ranger Shadowknight Druid Monk Bard Rogue
  Shaman Necromancer Wizard Magician Enchanter Beastlord Berserker
);

# hashref containing buffs offered depening on the class of the npc
my $data = {
  Enchanter => {
      greet => "I have the %s for your mind.",
      buffs => [
          [ "Bind Affinity",      35,  10 ],
          [ "Breeze",            697,  25 ],
          [ "Clarity",            174,  50 ],
          [ "Clarity II",        1693, 200 ],
          [ "Alacrity",          170,  10 ],
          [ "Augment",            1729, 30 ],
          [ "Aanya's Quickening", 1708, 100 ],
          [ "Rune I",            481,  5 ],
      ],
  },
  Necromancer => {
      greet => "Souls and %s.",
      buffs => [
          [ "Bind Affinity", 35, 10 ],
          [ "Dead Men Floating", 1391, 10 ],
      ],
  },
};

sub EVENT_SAY {

    my $npcClass = (CLASS_L)[ $npc->GetClass() ];
    my $greeting = $data->{$npcClass}->{greet} || "Got %s?";
    my $buffList = $data->{$npcClass}->{buffs};

    # saylink
    my $buffs = quest::saylink( "buffs", 1 );

    my $CanCast = sub {
        foreach my $spell ( @{ +shift } ) {
            my ( $spellName, $spellID, $spellCost ) = @{$spell};
            my $buffLink = quest::saylink( $spellName, 1 );
            $client->Message( 315,
              "I can cast $buffLink on you for ${spellCost}pp." );
        }
    };

    # matches hail
    if ( $text =~ /hail/i ) { quest::say( sprintf $greeting, $buffs); }

    # doesn't match hail, but does match something in buff list
    elsif ( my @match = grep { ${$_}[0] =~ /$text/i } @{$buffList} ) {

        # single, exact match in buff list.
        if ( @match == 1 && $text eq $match[0][0] ) {
            my ( $spellName, $spellID, $spellCost ) = @{ $match[0] };
            $client->Message( 315,
                "That will be ${spellCost}pp for $spellName." );
            quest::setglobal( "buff", $text, 0, "M5" );
        }

        # more than one match in buff list. list them.
        else { $CanCast->( \@match ); }
    }

    # defaut to listing all buffs this npc can cast.
    else { $CanCast->($buffList); }
}

sub EVENT_ITEM {

    my $npcClass = (CLASS_L)[ $npc->GetClass() ];
    my $buffList = $data->{$npcClass}->{buffs};

    my $correctMoney = 0;

    # if client has selected a buff
    if ( defined $qglobals{buff} ) {
   
        # find the buff selected
        foreach my $spell ( @{$buffList} ) {
            my ( $spellName, $spellID, $spellCost ) = @{$spell};
           
            # if client gave the correct amount of money, cast the spell
            next if $qglobals{buff} ne $spellName || $platinum != $spellCost;
            $client->Message( 315,
                "Thank you for the ${spellCost}pp. Prepare for $spellName!" );
            $npc->CastSpell( $spellID, $client->GetID() );
            $correctMoney = 1;
            quest::delglobal("buff");
            last;
        }
    }

    # incorrect amount of money given or no qglobal for buff found for client
    if ( !$correctMoney && ( $copper || $silver || $gold || $platinum ) ) {
        $client->Message( 315,
            "I don't need these coins. You may have them back." );
        quest::givecash( $copper||0, $silver||0, $gold||0, $platinum||0 );
    }
}


Figback65 02-15-2013 01:41 AM

:( 1st attempt isnt working, looking into it now though.

c0ncrete 02-15-2013 01:48 AM

i had it running on an enchanter npc. if it's not casting the buff, make sure the npc has qglobals enabled.

Figback65 02-15-2013 01:49 AM

qglobals is 1, i am checking everything tho. I will update in a few. If it works for u, i obviously missing something.

Figback65 02-15-2013 02:02 AM

I dunno.... My npc is enchanter class 14, it has a enchanter spell list assigned(even though i dont think that matters since it pulls the clientside buffs from script), qglobal is 1, i copied ur script verbatim, I deleted everything inside of mine to make sure it was empty before i pasted. I #reloadpl and #repop force and #repop.


Edit: I wish I knew more to help better, lol. Although you have shined a lot of light on this for me, I am definately going to keep learning this. much fun :)

c0ncrete 02-15-2013 02:12 AM

haven't the faintest on that one. have 160135.pl in tutoriala and popped the npc with #dbspawn 160135 and everything is working for me here.

Figback65 02-15-2013 02:21 AM

Ill get some fresh eyes on it tomorrow. Thanks for helpen me today c0ncrete.

Figback65 02-15-2013 03:26 PM

Hmmm what about maybe a version of perl issue? Commands missing maybe? My server is ran off an old winxp 32bit machine currently. Active Perl 5.10.1 and Mysql server 5.1. I dunno lol Tryen to troubleshoot every angle.

c0ncrete 02-15-2013 03:42 PM

try removing the first three lines then.

Figback65 02-15-2013 07:00 PM

Awsome, it works for Enchy, so happah!!! lol. Necro is not working tho and i added cleric and its not working either. Looking into that now, just got freed up.

Figback65 02-15-2013 07:03 PM

Ok, i was wrong, it works for all classes. The problem is, it doesnt work on a repop alone. What I mean is, if you #reloadpl while on the necro class then hail him, the necro responds and works properly. If you repop to a enchy or now added cleric, and hail him, he will not respond. If you then #reloadpl he will begin responding. But as soon as you repop to another enchy or cleric or necro, he stops responding again until you #reloadpl.

Edit: Maybe a sub EVENT_SPAWN around the hash table?

Edit: Nope didnt work., Only response was Got "Buffs?" But it did allow the npc to respond every repop without the #reloadpl

ghanja 02-15-2013 07:25 PM

Get the PM?

ghanja 02-15-2013 10:40 PM

Replied again. Use NPC ID(s) for the script names, vice clean name.

Figback65 02-15-2013 11:15 PM

Ok I did that, and it works. But by doing it this way, its linked directly to a class and i have 16 scripts with 16 spell lists in each one, when the default buffbot was 16 scripts with 1 spell list in each. Its the same, except we did way more work for an autocheck we could have manually done.

Edit : Eitherway I am VERY happy and currently finishing up the scripts.

Thank you very much guys!!!


All times are GMT -4. The time now is 02:42 PM.

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