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

09-02-2007, 12:59 AM
|
Hill Giant
|
|
Join Date: Oct 2006
Posts: 248
|
|
Quote:
Originally Posted by sonicintuition
Hmm ..seems that using string operators makes no difference either.
Example:
According to you guys, this should work ..but it still doesn't work. I hailed this npc with a wizard and the npc said both lines. I hailed her with a rogue, and she said both lines ...I'm stumped? I'm going to try adding the other parenthises to see if that helps.. will post back here if it does.
Regards,
Sonic
|
logic failure. && has higher precedence than ||. you basically want, in this case:
Code:
if($text=~/hail/i && ( $class eq 'Rogue' || $class eq 'Warrior') )
you need to group the two class comparisons because if you dont, the logic says:
if the text contains "hail" and class eq 'Rogue'
OR
class eq 'Warrior'
whereas you want:
if the text contains 'hail'
AND
the class is either Rogue or Warrior
== sfisque
|

09-02-2007, 07:31 AM
|
Hill Giant
|
|
Join Date: Jan 2005
Posts: 124
|
|
Alright ..that makes sense. I'll give it a whirl. Thanks for your response.
Sonic
|

09-02-2007, 07:58 AM
|
Hill Giant
|
|
Join Date: Jan 2005
Posts: 124
|
|
Quote:
you need to group the two class comparisons because if you dont, the logic says:
if the text contains "hail" and class eq 'Rogue'
OR
class eq 'Warrior'
whereas you want:
if the text contains 'hail'
AND
the class is either Rogue or Warrior
|
It makes sense, yet doesn't work... the npc STILL spews out both lines regardless of class. This is what I wrote as an update to what you guys have been telling me...
Quote:
sub EVENT_SAY
{
if($text=~/hail/i && ($class eq 'Warrior' || $class eq 'Rogue'))
{
quest::say("You are not a caster!");
}
if($text=~/hail/i && ($class ne 'Warrior' || $class ne 'Rogue'))
{
quest::say("You are a caster!");
}
}
|
So ....I'll hail the NPC with a rogue, and get "You are not a caster! You are a caster!" ....
Sonic
|

09-02-2007, 08:16 AM
|
Hill Giant
|
|
Join Date: Jan 2005
Posts: 124
|
|
Angelox, I'm trying to read this like a computer would read this:
Quote:
sub EVENT_SAY{
if (($text=~/hail/i&&$race eq 'Human'&&$class eq 'Enchanter')){
quest::say("I know you!!");
}
}
|
I'm reading that as if player says hail, and the player is a human enchanter, do action. So if I did this:
Quote:
sub EVENT_SAY
{
if(($text=~/hail/i && $class eq 'Rogue' && $class eq 'Warrior'))
{
quest::say("You are NOT a caster!");
}
}
|
As a computer, I would read that as if the player says hail, and is a Rogue AND a Warrior, do action ..which obviously can't be the case. And that's what I'm trying to do - I need to set up my script so that the NPC won't talk to non-casting classes, eg, Warrior, Rogue, Monk, Berserker. Trying to use || operators isn't working ..I'm going to try one more thing before I give up altogether and just allow non casting classes to use my spell scriber...lol  Will post back if it works.
Sonic
|
 |
|
 |

09-02-2007, 08:41 AM
|
AX Classic Developer
|
|
Join Date: May 2006
Location: filler
Posts: 2,049
|
|
Don't give up! I have taken weeks to understand simple things too. Just put it to aside, and come back to it again, later.
you only need $class for what you want - make one like this:
Code:
sub EVENT_SAY{
if (($text=~/hail/i&&$class eq 'enchanter')){
quest::say("I can help you");
}
if (($text=~/hail/i&&$class eq 'wizard')){
quest::say("I can help you");
}
}
You can add all the casters to this PL and omit the non-casters. This way your npc will ignore non-casters.
You first PL might have worked, but you had typos in it.
Quote:
Originally Posted by sonicintuition
Angelox, I'm trying to read this like a computer would read this:
I'm reading that as if player says hail, and the player is a human enchanter, do action. So if I did this:
As a computer, I would read that as if the player says hail, and is a Rogue AND a Warrior, do action ..which obviously can't be the case. And that's what I'm trying to do - I need to set up my script so that the NPC won't talk to non-casting classes, eg, Warrior, Rogue, Monk, Berserker. Trying to use || operators isn't working ..I'm going to try one more thing before I give up altogether and just allow non casting classes to use my spell scriber...lol  Will post back if it works.
Sonic
|
|
 |
|
 |

09-02-2007, 08:46 AM
|
 |
Hill Giant
|
|
Join Date: May 2005
Location: Australia
Posts: 113
|
|
While im certian no noob user of perl (i do guess work... i guess this will work) lol
but being a c++/c# dev has given me an advantage. All languages follow the sample principlals when it comes down to it.
This site, is well worth a read
http://stein.cshl.org/genome_informa...tro/index.html
In perticular, check out the "Operators" and also have a quick browse. Perl hjas the great advantage of being very english based
The above link, is not EQEmu information, but rather just perl.
- froglok
|
 |
|
 |

09-02-2007, 09:56 AM
|
Hill Giant
|
|
Join Date: Jan 2005
Posts: 124
|
|
I got it to work, finally! This is what I did:
Quote:
sub EVENT_SAY
{
if(($text=~/hail/i && $class eq 'Rogue'))
{
$client->Message(5, "Persy Clutches tells you, You are a $class. I cannot help you.");
}
if(($text=~/hail/i && $class eq 'Warrior'))
{
$client->Message(5, "Persy Clutches tells you, You are a $class. I cannot help you.");
}
if(($text=~/hail/i && $class eq 'Monk'))
{
$client->Message(5, "Persy Clutches tells you, You are a $class. I cannot help you.");
}
if(($text=~/hail/i && $class eq 'Berserker'))
{
$client->Message(5, "Persy Clutches tells you, You are a $class. I cannot help you.");
}
if($text=~/hail/i && $class ne 'Rogue' && $class ne 'Warrior' && $class ne 'Monk' && $class ne 'Berserker')
{
$client->Message(5, "Persy Clutches tells you, Hello $name. I can [scribe your spells] for you, however I
can only scribe them until you are level 60. After that, you'll have to find them
yourself.");
}
if($text=~/scribe my spells/i)
{
$client->Message(5, "Persy Clutches tells you, Very well. Scribing your spells now.");
quest::scribespells();
}
}
|
Yay me
Thanks all for your help and support, I appreciate it a ton.
Sonic
|
 |
|
 |
 |
|
 |

09-02-2007, 12:44 PM
|
Hill Giant
|
|
Join Date: Oct 2006
Posts: 248
|
|
Quote:
Originally Posted by sonicintuition
So ....I'll hail the NPC with a rogue, and get "You are not a caster! You are a caster!" ....
Code:
sub EVENT_SAY
{
if($text=~/hail/i && ($class eq 'Warrior' || $class eq 'Rogue'))
{
quest::say("You are not a caster!");
}
if($text=~/hail/i && ($class ne 'Warrior' || $class ne 'Rogue'))
{
quest::say("You are a caster!");
}
}
Sonic
|
broken logic. on the "second" if, if i'im a rogue, it will fire because, you're asking a different question:
if $text contains "hail"
and
the $class is either ( not warrior ) or (not rogue)
which is true if you're a rogue ( rogue != warrior ).
converse statements (ones containing "negations" ) are usually tricky and require some care. you're easiest bet would be to construct it like follows:
if( contains "hail" )
{
if( class1 ) { do something }
elsif (class2 ) { do something else }
elsif( class3 ) { do something else }
...
else { do the other thing }
}
hope this helps.
== sfisque
|
 |
|
 |

09-02-2007, 01:24 PM
|
AX Classic Developer
|
|
Join Date: May 2006
Location: filler
Posts: 2,049
|
|
sfisque;
Are "if" and "elsif" any different? will Perl look at all the "ifs" or all the "elsifs"? or will it always stop at the first "if" or "elsif" once the it finds a match?
|

09-02-2007, 01:34 PM
|
Developer
|
|
Join Date: Apr 2003
Posts: 589
|
|
in a if...elsif..else construct, only ONE of the specificied conditions can be true.. so it will evaluate the IF first and then if that IF isn't TRUE, perl moves on to the first ELSIF.. if that is also not true then every elseif next is evaluated one at a time and in order until either one of the elsif are true OR it finally reaches an ELSE clause, if one is present.. Hope this is readable.. lol
__________________
Read my developer notes at my blog.
Quote:
If it's not on IRC, it ain't l33t!
|
|

09-02-2007, 06:10 PM
|
Hill Giant
|
|
Join Date: Oct 2006
Posts: 248
|
|
Quote:
Originally Posted by Angelox
sfisque;
Are "if" and "elsif" any different? will Perl look at all the "ifs" or all the "elsifs"? or will it always stop at the first "if" or "elsif" once the it finds a match?
|
think of if/elsif...else blocks as the perl version of a C switch statement, where each if/elsif is analogous to a case X: and else is the default: subblock.
== sfisque
|

09-02-2007, 07:25 PM
|
Hill Giant
|
|
Join Date: Jan 2005
Posts: 124
|
|
You people lost me ...  Anyway what I did works, I'll try the other one that sfisque posted after that ..see if that works, if it does ...yay, the file will be smaller
Regards,
Sonic
|
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 10:52 PM.
|
|
 |
|
 |
|
|
|
 |
|
 |
|
 |