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 11-30-2010, 04:48 AM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

I didn't mention anything about using an if or elsif or else, I just mentioned the syntax I have used in the past for comparing $class. I think you would just use the following syntax in your script in place of what you have been trying so far:

Code:
$class == 'Warrior'
Though, if you are having 2 classes turn in the same item ID (219592), your script is actually flawed in your logic flow there as well now that I think about it. The problem is that as soon as plugin::check_handin() verifies that the item 219592 matches the turn in, it eats the item, so any ifs or elsifs after that will never work. You must keep in mind that if checks happen from left to right. So, if you want to make sure a certain class is turning in a certain item, then you want to check $class first, not the handin. Generally, the handin is the last thing you ever want to check.

So, your line:
Code:
elsif (plugin::check_handin(\%itemcount, 219592 => 1) && $class == 1) {
Should actually be

Code:
elsif ($class eq "Warrior" && plugin::check_handin(\%itemcount, 219592 => 1)) {
To explain that a bit, if a Monk turned in 219592 with your code, the script that checks for warrior first would result in this:

Code:
elsif (true && false) {
So, obviously it would move on to the next check, but at that point, the handin plugin already ate the item, so the next one for the Monk check would result in this:

Code:
elsif (false) {
It would be false, because the item is already gone, and as soon as it gets a false, it stops any further checks, so the class check doesn't even get made (not like it would matter).

By switching the checks around as suggested, your first result would be this:

Code:
elsif (false) {
This is because it checked of $class was a Warrior and it was not, since we are using a Monk in this example.

Then, the next check would result in this:

Code:
elsif (true && true) {
Because the $class is Monk and the correct item was turned in, so it then results in the correct reward.

I should probably add something like this explanation to the Wiki sometime, as I think it would clear up the understanding of why certain scripts don't seem to be working as intended when they actually are. I didn't know this when I first started out, and learning it has helped quite a bit in my script writing over the years.
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!

Last edited by trevius; 11-30-2010 at 05:03 AM..
Reply With Quote
  #2  
Old 11-30-2010, 05:43 AM
blackdragonsdg
Dragon
 
Join Date: Dec 2008
Location: Tennessee
Posts: 658
Default

Good news is using this worked:
Code:
elsif ($class eq "Warrior" && plugin::check_handin(\%itemcount, 219592 => 1)) {
While I understand your use of logic flow in this instance it does contradict logic in a way. The point of using && is so that two conditions must check true before the entire statement is declared true. If that were the case then the first elsif should have failed causing the script to move onto the next elsif.
This functioned more like an || where if either condition checks true then the entire statement is true. If that were the case then it should have done as you suggested where the first check was true so the entire statement was declared true causing the entire script to stop.
Using logic like that means you could put two 1’s into a NAND gate and get a 1 out which would defy mechanical logic. Guess this is why mechanical logic and programming logic are very, very different.
Reply With Quote
  #3  
Old 11-30-2010, 06:38 AM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

Well, the reason it works as I explained is because if it finds a false in the first check, there is no need to go past that unless there was an || (OR) statement after the first check.

If your check resulted in the following:

Code:
elsif (false && true) {
Then, perl already knew it wasn't going to pass the check by the time it reached the &&, so there wasn't a reason to even bother checking the second one. This logic is good in multiple ways. One bonus is that it saves processing time, as it doesn't need to even bother checking after it reaches a false. Another nice thing about it working like that is that you can check for things that require other things without risking a null pointer zone crash. Here is an example:

Code:
if ($npc->GetTarget() && $npc->GetTarget()->IsClient())
So, this will only check if the NPC's target is a client IF the NPC actually has a target in the first place. If you tried to do this:

Code:
if ($npc->GetTarget()->IsClient())
without first making sure the NPC has a target, you would be opening up a possible zone crash.

Since the example I gave checks for a target first, and then checks if that target is a client, it is safe from crashes. If Perl worked like you thought it did, that example would still be open to crash issues, as it would check both no matter what.
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!
Reply With Quote
  #4  
Old 11-30-2010, 09:20 PM
neiv2
Hill Giant
 
Join Date: Mar 2009
Location: CO
Posts: 183
Default

I always had trouble getting the script to work when stating it positively (e.g., if($class eq 'Shaman')), so I ended up stating it negatively (e.g., if($class ne 'Shaman')) in questions like this one.
Reply With Quote
Reply

Thread Tools
Display Modes

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 10:32 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 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3