PDA

View Full Version : check player for item


Budaworm
06-05-2007, 01:45 AM
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:
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:

#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.
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

Darkonig
06-05-2007, 06:44 AM
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.


sub check_hasitem {
# code to do the checking
}

1;

Budaworm
06-05-2007, 11:44 AM
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: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 [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?

Darkonig
06-05-2007, 02:57 PM
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:


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


if(plugin::check_hasitem($client, 1001)) {
quest::say("Ah i see you have a cloth cap");
}

Budaworm
06-05-2007, 06:05 PM
Thank you very much Darkonig that what was I needed but couldn't figure out how to do, got the plugin working fine now.

mamba666
06-19-2007, 09:02 AM
Thank you both. I am now using this plugin and I love it.

Budaworm
06-19-2007, 09:42 PM
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: #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;

Teppen
06-23-2007, 10:20 AM
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.