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