EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Quests::Custom (https://www.eqemulator.org/forums/forumdisplay.php?f=671)
-   -   Trade and Item to NPC (https://www.eqemulator.org/forums/showthread.php?t=41147)

Dharrk 02-10-2017 01:34 PM

Trade and Item to NPC
 
Here is my script I have worked a few hours one and cannot seem to get it to work. The NPC will not respond to 'Refuse' nor will he give an item when selected. The potions; however, work fine. Any help would be much appreciated.

Code:

sub EVENT_SAY
{
        if ($text =~/hail/i)
                {
                        plugin::DiaWind("How are ya friend? I can tell by yer backbone several have been fell at yer feet. Well what I be missing in size I make up for wit dese here swords. Ya see me is looking for [planar essence] to combine wit mah swords to become the most famous dwarf in all Kaladim.");
                }
        elsif(plugin::check_hasitem($client,132540) && $text=~/planar essence/i)
                {
                        plugin::DiaWind("It appears you have ventured into the terrible planes and killed a few of those creatures. Would you be willing to [trade] for a few items I have collected from all over the place? +grovel+");
                }
                elsif($text=~/planar essence/i)
                        {
                                plugin::DiaWind("I am sorry $name but I cannot sense any essence coming from your bags. Please come back to me when you have collected some.");
                        }
                       
        elsif(plugin::check_hasitem($client,132540) && $text=~/trade/i)
                {
                        plugin::DiaWind("Wonderful. Here is a list of items that I have and would be willing to trade. [Frosty Marble] [Firey Marble] [Norrath Soldier] [Undead Potions] [ Dulsehound Potions] [ Grave Dust Potions] [Soldier of Norrath Dust]. =1= +point+");
                }
                elsif($text=~/Frosty Marble/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}frosty marble sphere~. Click [Frosty Marble Sphere] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif (plugin::check_hasitem($client,132541) && $text =~/Frosty Marble Sphere/i)
                                {
                                        plugin::Whisper("Sorry but it appears you alrady possess this item $name.");
                                }
                        elsif ($text =~/Frosty Marble Sphere/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(132541);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }
                elsif($text=~/Firey Marble/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}firey marble sphere~. Click [Firey Marble Sphere] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif (plugin::check_hasitem($client,132542) && $text =~/Firey Marble Sphere/i)
                                {
                                        plugin::Whisper("Sorry but it appears you alrady possess this item $name.");
                                }
                        elsif ($text =~/Firey Marble Sphere/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(132542);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }       
                elsif($text=~/Norrath Soldier/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}forgotten Norrath soldier~. Click [Forgotten Norrath Soldier] to trade or [Refuse] to refuse the deal. ");
                        }       
                        elsif (plugin::check_hasitem($client,132543) && $text =~/Forgotten Norrath Soldier/i)
                                {
                                        plugin::Whisper("Sorry but it appears you alrady possess this item $name.");
                                }
                        elsif ($text =~/Forgotton Norrath Soldier/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(132543);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }
                elsif($text=~/Undead Potions/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}Undead Recourse Potion~. Click [Undead Potion] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif ($text =~/Undead Potion/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(14180);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }               
                elsif($text=~/Dulsehound Potions/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}Duslehound Potion~. Click [Dulsehound Potion] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif ($text =~/Dulsehound Potion/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(14188);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }       
                elsif($text=~/Grave Dust Potions/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}Grave Dust Potion~. Click [Grave Dust Potion] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif ($text =~/Grave Dust Potion/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(14194);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }       
                elsif($text=~/Soldier of Norrath Dust/i)
                        {
                                plugin::DiaWind("So you would like to trade your {gold} essence of the planes~  for my {lb}Soldier of Norrath Dust~. Click [Soldier of Norrath] to trade or [Refuse] to refuse the deal.");
                        }
                        elsif ($text =~/Soldier of Norrath/i)
                                {
                                        $client->NukeItem(132540);
                                        quest::summonitem(132544);
                                        plugin::DiaWind("Thank you $name. I knew that we both benefit from this trade.");
                                }
        elsif ($text =~/Refuse/i)
                                {
                                        plugin::Diawind("Sorry we could not reach a [trade]. Would you like to see my items again?");
                                }
}


ghanja 02-11-2017 12:07 AM

This post really did a number on my phone (ever since width was changed on the site). Anyway.

Your formatting is tricking you I believe. All those elsif's belong to the original if.

That said.

Let's assume that:
Code:

$text = "Your format looks a little off"
and if we were to say:

Code:

if ($text =~ /look/i) {
  quest::say ("Yep!  I found look!");
}

The =~ is a equals match operator, thus the opposite is !~ or does NOT match operator.

/look/ is the pattern (NOT string) that it's looking for. So even though our text variable was "looks" the pattern "look" is still there. The lowercase i after the match operator tells us to "i"gnore case.

Interesting test for you:

Assuming $text equals potions.

Code:

sub EVENT_SAY {
if ($text =~ /potion/i) {
  quest::say ("I found potion!");
}
elsif ($text =~ /potions/i) {
  quest::say ("I found potions!");
}
}

Now test:

Code:

sub EVENT_SAY {
if ($text =~ /\potion\b/i) {
  quest::say ("I found potion!");
}
elsif ($text =~ /\potions\b/i) {
  quest::say ("I found potions!");
}
}

Read up on Perl RegEx (Regular Expressions). There is also index, but, stick with regex.

I had a hell of time knowing where I was in my post above. And I dont suspect reviewing it will be any easier. I'm sure someone will come along and correct me if I'm off somewhere, I hope they do anyway.

Dharrk 02-11-2017 01:08 PM

Thank you for the response Ghanja. I was told elsif would help to prevent memory leaks which is why I use them constantly; I have been scripting for may be 2 months. I will look into the perl regular expressions and see if I cannot clean the script up somewhat.

Kingly_Krab 02-11-2017 04:04 PM

Untested, but should do what you want it to:
Code:

sub EVENT_SAY {
    my %trade = (0 => ["Undead Potions", "undead", 14180],
    1 => ["Dulsehound Potions", "dulsehound", 14188],
    2 => ["Grave Dust Potions", "grave dust", 14194],
    3 => ["Frosty Marble", "frosty", 132541],
    4 => ["Firey Marble", "firey", 132542],
    5 => ["Norrath Soldier", "norrath", 132543],
    6 => ["Soldier of Norrath Dust", "soldier dust", 132544]);
    if ($text =~/Hail/i) {
        plugin::Whisper("How are ya friend? I can tell by yer backbone several have been fell at yer feet. Well what I be missing in size I make up for wit dese here swords. Ya see me is looking for " . quest::saylink("Planar Essence", 1) . " to combine wit mah swords to become the most famous dwarf in all Kaladim.");
    } elsif($text=~/Planar Essence/i && plugin::check_hasitem($client, 132540)) {
        plugin::Whisper("It appears you have ventured into the terrible planes and killed a few of those creatures. Would you be willing to " . quest::saylink("bargain", 1) . " for a few items I have collected from all over the place?");
    } elsif($text=~/Bargain/i && plugin::check_hasitem($client, 132540)) {
        plugin::Whisper("Wonderful. Here is a list of items that I have and would be willing to trade.");
        foreach my $item (keys %trade) {
            plugin::Whisper(quest::saylink("link $trade{$item}[1]", 1, $trade{$item}[0]));
        }
    } elsif ($text=~/^Link/i) {
        if (length(substr($text, 5)) > 0) {
            foreach my $key (sort {$trade{$a}[0] cmp $trade{$b}[0]} keys %trade) {
                if (substr($text, 5) eq $trade{$key}[1]) {
                    if (plugin::check_hasitem($client, $trade{$key}[2])) {
                        plugin::Whisper("Sorry, but it appears you already possess a " . quest::varlink($trade{$key}[2]) . ", $name.");
                    } else {
                        plugin::Whisper("So you would like to " . quest::saylink("trade $trade{$key}[1]", 1, "trade") . " your " . quest::varlink(132540) . " for my " . quest::varlink($trade{$key}[2]) . "?");
                    }
                }
            }
        }
    } elsif ($text =~/^Trade/i && plugin::check_hasitem($client, 132540)) {
        if (length(substr($text, 6)) > 0) {
            foreach my $key (keys %trade) {
                if (substr($text, 6) eq $trade{$key}[1]) {
                    if (!plugin::check_hasitem($client, $trade{$key}[2])) {
                        $client->NukeItem(132540);
                        quest::summonitem($trade{$key}[2]);
                        plugin::Whisper("Enjoy your " . quest::varlink($trade{$key}[2]) . ", $name!");
                    }
                }
            }
        }
    }
}


ghanja 02-11-2017 11:33 PM

Quote:

Originally Posted by Dharrk (Post 252945)
Thank you for the response Ghanja. I was told elsif would help to prevent memory leaks which is why I use them constantly; I have been scripting for may be 2 months. I will look into the perl regular expressions and see if I cannot clean the script up somewhat.

It was nothing against your efforts, rather, the expanding or widening of the site forums itself (something Akka did a year or so ago). I really must ask what browser he uses, so that I no longer have to scroll horizontally.

"if" is a conditional, and as such will be checked each time

"elsif" is also a conditional that if the originating if was not true, will be checked/considered, stopping upon the first met condition of that if/elsif nesting.

The use of them is a bit much, yes, though the problem was in your regex, not the large number of elsif's. Krab has provided a hash / iteration method, also using length, substr, new regex operator, etc. Plenty to digest, but, beneficial as you'll hopefully learn from it.

GRUMPY 02-11-2017 11:44 PM

Quote:

Originally Posted by ghanja (Post 252953)
I really must ask what browser he uses, so that I no longer have to scroll horizontally.

I use "view" > zoom out :P

Dharrk 02-12-2017 10:23 AM

That works beautifully Kingly thank you for the rework. Thank you Ghanja for pointing me to regular expressions. I had meant not ill will towards you by saying I had only been scripting 2 months just letting you know the extent of my ability. With your mention of expressions and Kinglys example I do have a lot to digest. Thank you both.


All times are GMT -4. The time now is 12:19 PM.

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