|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Quests::Q&A This is the quest support section |
|
|
|
09-30-2018, 09:34 PM
|
Sarnak
|
|
Join Date: Jul 2018
Location: Tennessee
Posts: 33
|
|
Trying to understand.
I can not figure out why this first script works as it should, and the second one does not.
Code:
sub EVENT_SAY {
if ($text=~/armorset/i) {
# head armor ids 147587 = leather, 147580 = plate, 147573 = chain, 147566 = cloth
# chest armor ids 147588 = leather, 147581 = plate, 147574 = chain, 147567 = cloth
# leg armor ids 147591 = leather, 147584 = plate, 147577 = chain, 147570 = cloth
my $headid = $client->GetItemIDAt(2);
my $chestid = $client->GetItemIDAt(17);
my $legid = $client->GetItemIDAt(18);
if($headid == 147587 && $chestid == 147588 && $legid == 147591){ #leather
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif($headid == 147587 && $legid == 147591){ #leather
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
if($headid == 147580 && $chestid == 147581 && $legid == 147584){ #plate
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif($headid == 147580 && $legid == 147584){ #plate
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
if($headid == 147573 && $chestid == 147574 && $legid == 147577){ #chain
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif($headid == 147573 && $legid == 147577){ #chain
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
if($headid == 147566 && $chestid == 147567 && $legid == 147570){ #cloth
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif($headid == 147566 && $legid == 147570){ #cloth
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
}
}
Code:
sub EVENT_SAY {
if ($text=~/armorset/i) {
# head armor ids 147587 = leather, 147580 = plate, 147573 = chain, 147566 = cloth
# chest armor ids 147588 = leather, 147581 = plate, 147574 = chain, 147567 = cloth
# leg armor ids 147591 = leather, 147584 = plate, 147577 = chain, 147570 = cloth
my $headid = $client->GetItemIDAt(2);
my $chestid = $client->GetItemIDAt(17);
my $legid = $client->GetItemIDAt(18);
if ($headid == 147587||147580||147573||147566 && $chestid == 147588||147581||147574||147567 && $legid == 147591||147584||147577||147570){
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif ($headid == 147587||147580||147573||147566 && $legid == 147591||147584||147577||147570){
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
}
}
The second script will always output the 3 piece message regardless if you have all 3 pieces of gear on, 2 pieces, 1 piece, or no pieces.
If the item is not equipped the client->Message will just list -1 for the itemid for that slot.
The elsif statement is never reached.
Any help would be greatly appreciated.
|
|
|
|
10-01-2018, 12:07 AM
|
Fire Beetle
|
|
Join Date: Sep 2012
Posts: 25
|
|
Code:
sub EVENT_SAY {
if ($text=~/armorset/i) {
# head armor ids 147587 = leather, 147580 = plate, 147573 = chain, 147566 = cloth
# chest armor ids 147588 = leather, 147581 = plate, 147574 = chain, 147567 = cloth
# leg armor ids 147591 = leather, 147584 = plate, 147577 = chain, 147570 = cloth
my $headid = $client->GetItemIDAt(2);
my $chestid = $client->GetItemIDAt(17);
my $legid = $client->GetItemIDAt(18);
if ($headid ~~ [147587,147580,147573,147566] and $chestid ~~ [147588,147581,147574,147567 and $legid ~~ [147591,147584,147577,147570])
{
$client->Message(15,"3 pieces of armor equipped, $headid, $chestid, $legid.");
}
elsif ($headid ~~ [147587,147580,147573,147566] and $legid ~~ [147591,147584,147577,147570])
{
$client->Message(15,"2 pieces of armor equipped, $headid, $legid.");
}
}
}
Use smart matching against an array, much easier to do and look at. Would also consider a hash if you go with any more items fwiw.
|
10-01-2018, 07:34 AM
|
Administrator
|
|
Join Date: May 2013
Location: United States
Posts: 1,595
|
|
“and” is not a valid bareword in Perl. Use && instead. Also, smart-matching is better if you predefine the arrays so it's much easier to understand what the random numbers are.
|
|
|
|
10-02-2018, 02:12 AM
|
Fire Beetle
|
|
Join Date: Sep 2012
Posts: 25
|
|
Indeed, "and" is instead a valid logical operator. You had me scratchin' my head trying to figure out what you meant, but I assume perl -c barfed on it because I placed the scalar values meant to be an array within brackets rather than parentheses. Serves me right for not bouncing it against Perl.
Code:
($headid ~~ (147587,147580,147573,147566) and ...
I left the comments in so the numbers didn't appear so random. Though, they may still appear random even if:
Code:
my @headpieces = (147587,147580,147573,147566);
if ($headid ~~ @headpieces) {
As aforementioned, I would consider doing a Hash of Hashes.
Maybe something along the lines of:
Code:
%HoH = (
'leather' => {
'head' => 147587,
'chest' => 147588,
'legs' => 147591,
},
'plate' => {
'head' => 147580,
'chest' => 147581,
'legs' => 147584,
},
'chain' => {
'head' => 147573,
'chest' => 147547,
'legs' => 147577,
},
'cloth' => {
'head' => 147566,
'chest' => 147567,
'legs' => 147570,
},
);
Though the nice thing about Perl and Eqemu in general, there are so many ways one can approach a problem to reach a solution. Sure, there are "better" ways, or perhaps even correct. For instance, placing the
Code:
my %elementshash = map { $_ => 1 } @headpieces;
if(exists($elementhash{$headid})) {
I am looking forward to see what you have cooking up superpally1. Assuming it's going to be a public server.
|
|
|
|
10-02-2018, 01:45 PM
|
Sarnak
|
|
Join Date: Jul 2018
Location: Tennessee
Posts: 33
|
|
Thank you very much for the help! I understand now. I will post what im making soon as i finish it later today. And my server is always public if you want to stop by. Omen I
|
|
|
|
10-03-2018, 08:35 PM
|
Fire Beetle
|
|
Join Date: Sep 2012
Posts: 25
|
|
I wrote this late at night, pretty sure it will work out, though my comments -may- be off a little, maybe someone can correct me on any wrong points. We're all here to learn.
Code:
%HoH = (
'leather' => {
'head' => 147587,
'chest' => 147588,
'legs' => 147591,
},
'plate' => {
'head' => 147580,
'chest' => 147581,
'legs' => 147584,
},
'chain' => {
'head' => 147573,
'chest' => 147547,
'legs' => 147577,
},
'cloth' => {
'head' => 147566,
'chest' => 147567,
'legs' => 147570,
},
);
sub EVENT_SAY
{
if ($text=~/hasharmorset/i)
{
# doing the following assuming the player is wearing a plate head (ID 147580)
foreach $firstlevelkey (keys %HoH)
{
# iterate the parent keys of hash %HoH one by one and put the current key being read into $parentkey
# we will assume 'plate' was read first
$childhashref = $HoH{$firstlevelkey};
# make reference of first level hash based on current parent key (i.e. $parentkey)
# $childhashref now equals $HoH{plate}
foreach $secondlevelkey (keys %$childhashref)
{
# iterate the second level (child) keys of the dereferenced hash and put that key into $secondlevelkey
# could also be written %{$childhashref} - lets assume it pulls out the key 'head' from $HoH{plate}
if ($client->GetItemIDAt(2) == $HoH{$firstlevelkey}->{$secondlevelkey})
{
# $HoH{plate}->{head} is equal to its key value which is 147580 - a match, we know they have plate this iteration
quest::say("You are wearing a ".$firstlevelkey." ".$secondlevelkey." found within my Hash of Hashes");
}
}
}
}
}
|
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 05:40 PM.
|
|
|
|
|
|
|
|
|
|
|
|
|