Go Back   EQEmulator Home > EQEmulator Forums > Quests > Quests::Q&A

Quests::Q&A This is the quest support section

Reply
 
Thread Tools Display Modes
  #1  
Old 06-05-2007, 01:45 AM
Budaworm
Fire Beetle
 
Join Date: Oct 2003
Posts: 20
Default check player for item

I've been trying to figure out how to write a quest plugin that checks the player to see if they have an item and returns true if the item is found. So say I do something like this:
Code:
if(plugin::check_hasitem(1001)) {$npc->Say("$name has a Cloth Cap");}
If the person has a Cloth Cap on them the npc will say xxx has a Cloth Cap. You might be saying well why don't you use $hasitem, I tried looking around for information on that and couldn't find any. Then I tried checking the source code and couldn't figure out the proper syntax to use it and it looked like it only checked slots 0-29. So here is the code I've written for my check_hasitem.pl file in my plugins folder:

Code:
#checks to see if player has item
#useage plugin::check_hasitem(itemid);
sub check_hasitem {
    my $itmchk = shift;
    my $slot1;
    my $itemid1;
#Check main inventory and cursor
    for($slot1=0; $slot1<=30; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check main inventory's and cursor's containers
    for($slot1=251; $slot1<340; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check bank slots
    for($slot1=2000; $slot1<2015; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check bank's containers
    for($slot1=2030; $slot1<2190; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check shared bank
    for($slot1=2500; $slot1<2501; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check shared bank's containers
    for($slot1=2531; $slot1<2550; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
    return 0;
}
The problem I'm having is $client->GetItemIDAt(); doesn't work. I've already tested using this with a standard npc quest (written differently but does the same thing) and it works because I can use the $client->GetItemIDAt(); command. Can anyone tell me how to get this working?

Heres the code I've been using on a npc to test to see if it works. The reason I don't want to use something like this is because it adds alot of useless code if I can get it working as a plugin.
Code:
sub EVENT_SAY {
    if($text=~/Hail/i) {
    quest::say("Would you like me to perform an [item check] on you?");
    }
    if($text=~/item check/i) {
        my $itmchk = 1001;
        my $itmnme = "Cloth Cap";
        my $slot1;
        my $itemid1;
        my $founditem = 0;
#Check main inventory and cursor
    for($slot1=0; $slot1<=30; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in inventory at slot: $slot1");
            $founditem = 1;
        }
    }
#Check main inventory's and cursor's containers
    for($slot1=251; $slot1<=340; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in inventory container at slot: $slot1");
            $founditem = 1;
        }
    }
#Check bank slots
    for($slot1=2000; $slot1<=2015; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in bank at slot: $slot1");
            $founditem = 1;
        }
    }
#Check bank's containers
    for($slot1=2031; $slot1<=2190; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in bank container at slot: $slot1");
            $founditem = 1;
        }
    }
#Check shared bank
    for($slot1=2500; $slot1<=2501; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in shared bank at slot: $slot1");
            $founditem = 1;
        }
    }
#Check shared bank's containers
    for($slot1=2531; $slot1<=2550; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            $npc->Say("$itmnme found in shared bank container at slot: $slot1");
            $founditem = 1;
        }
    }
    if($founditem==0) {$npc->Say("$itmnme cap not found");}
    }
EDIT: Fixed some typos and added my npc quest code

Last edited by Budaworm; 06-05-2007 at 10:12 AM..
Reply With Quote
  #2  
Old 06-05-2007, 06:44 AM
Darkonig
Hill Giant
 
Join Date: Dec 2006
Posts: 102
Default

without otherwise checking your code, when you create a subroutine file for plugins you must end it with a 1; so that when it loads it indicates it loaded correctly. You do not have a 1; at the end of your file so the system will assume there was an error loading them and ignore them.

Code:
sub check_hasitem {
# code to do the checking
}

1;
Reply With Quote
  #3  
Old 06-05-2007, 11:44 AM
Budaworm
Fire Beetle
 
Join Date: Oct 2003
Posts: 20
Default

I still get the same problem even with putting a 1; at the end of the file. Here is what im doing for testing, I've made a npc with the quest script:
Code:
sub EVENT_SAY {
    if($text=~/Hail/i) {
        if(plugin::check_hasitem(1001)) {quest::say("Ah i see you have a cloth cap");}
    }
}
When I hail the npc I get this error
Code:
[Status] Script error: qst189031::EVENT_SAY - Perl runtime error: Can't call method "GetItemIDAt" on an undefined value at plugins/check_hasitem.pl line 9.
So I'm guessing I need to send the $client info into the plugin so it can run the command $client->GetItemIDAt(); but I don't know how to do that or is it not possible to do?
Reply With Quote
  #4  
Old 06-05-2007, 02:57 PM
Darkonig
Hill Giant
 
Join Date: Dec 2006
Posts: 102
Default

Well that was fun

since you are changing packages you do need to pass the $client reference to the plugin, but in order to be usable by the plugin it has to be blessed. So:

Code:
sub check_hasitem {
 my $client = shift;
 my $itmchk = shift;
 bless($client,"Client");
 
 my $slot1; 
 my $itemid1; 

 #Check main inventory and cursor 
 for($slot1=0; $slot1<=30; $slot1++) {
   $itemid1=$client->GetItemIDAt($slot1); 
   if($itemid1==$itmchk) {
     return 1;
   }
 }
...
}
and then call with

Code:
   if(plugin::check_hasitem($client, 1001)) {
      quest::say("Ah i see you have a cloth cap");
   }
Reply With Quote
  #5  
Old 06-05-2007, 06:05 PM
Budaworm
Fire Beetle
 
Join Date: Oct 2003
Posts: 20
Default

Thank you very much Darkonig that what was I needed but couldn't figure out how to do, got the plugin working fine now.
Reply With Quote
  #6  
Old 06-19-2007, 09:02 AM
mamba666
Sarnak
 
Join Date: Apr 2003
Posts: 41
Default

Thank you both. I am now using this plugin and I love it.
Reply With Quote
  #7  
Old 06-19-2007, 09:42 PM
Budaworm
Fire Beetle
 
Join Date: Oct 2003
Posts: 20
Default

I didn't think anyone would be using this so I didn't post the updated one I'm using. In my first post I forgot to change the < to <= after it checks the inventory, therefore it won't check the last slots for the bank, shared bank, and containers. So it should look like this:
Code:
#checks to see if player has item
#useage plugin::check_hasitem($client, itemid);
sub check_hasitem {
    my $client = shift;
    my $itmchk = shift;
    my $slot1;
    my $itemid1;
#Check main inventory and cursor
    for($slot1=0; $slot1<=30; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check main inventory's and cursor's containers
    for($slot1=251; $slot1<=340; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check bank slots
    for($slot1=2000; $slot1<=2015; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check bank's containers
    for($slot1=2030; $slot1<=2190; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check shared bank
    for($slot1=2500; $slot1<=2501; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
#Check shared bank's containers
    for($slot1=2531; $slot1<=2550; $slot1++) {
        $itemid1=$client->GetItemIDAt($slot1);
        if($itemid1==$itmchk) {
            return 1;
        }
    }
    return 0;
}

1;
Reply With Quote
  #8  
Old 06-23-2007, 10:20 AM
Teppen
Banned
 
Join Date: Jan 2002
Posts: 80
Default nice!

nice code! this could be very useful when PEQ implements 1.5 and 2.0 epics..

could do a check to see if epic 1.0 is in inventory, bank, etc and if so then your able to start 1.5, then once 1.5 is completed, repeat and check if 1.5 in where ever then your able to start 2.0 epic.

cool beans, cool bean.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 09:16 AM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3