PDA

View Full Version : Buffing PERL Script (Formatting)


Deimos
09-06-2004, 07:05 AM
Hey all, it's me again =D. I wondered if anyone could help me with some formatting on a buffing NPC I am working on. See, if it doesn't work, I will end up redoing around 4000-5000 lines of code, so, I dont really want to continue with it until I know it works, hehe. I already did the first 5000 lines of code for categories and pricing and stuff, this is the part where u give him money.


sub EVENT_ITEM
{
{
if($ulevel < 10)
{
if($platinum == "100")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
elsif($ulevel > 9)
{
if($ulevel < 20)
{
if($platinum == "200")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 19)
{
if($ulevel < 30)
{
if($platinum == "300")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 29)
{
if($ulevel < 40)
{
if($platinum == "400")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 39)
{
if($ulevel < 50)
{
if($platinum == "500")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 49)
{
if($ulevel < 60)
{
if($platinum == "600")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 59)
{
if($ulevel < 70)
{
if($platinum == "700")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 69)
{
if($ulevel < 80)
{
if($platinum == "800")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 79)
{
if($ulevel < 90)
{
if($platinum == "900")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
elsif($ulevel > 89)
{
if($ulevel < 100)
{
if($platinum == "1000")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
}
}
}
}


as you can see, you pay more for buffs as you gain levesl, so, I just wanted to know if this format would work, that way if it wont, I only have to redo about 90 lines instead of 4000-5000 lines =D. If you want to look at the entire code file, send me an email at
xteam_leader@yahoo.com it is probably about 100 kb now and is in a notepad, lol. Soooo much code, been working for hours on it so far.

smogo
09-06-2004, 08:06 AM
Hmm, all these nested if / elsif / else ... not too easy to work on.

Why not try a different scheme : store values for your quest in an array, and test them. Much easier to read and modify imho :



sub EVENT_ITEM{
my @data=(
{ "minlevel" => 1,
"maxlevel" =>9,
"plat" => 100,
"copper" => 1,
"spellid" => 1200,
"saying" => "Good luck on your journey, $name"
},
{ "minlevel" => 10,
"maxlevel" =>19,
"plat" => 200,
"copper" => 1,
"spellid" => 1200,
"saying" => "Good luck on your journey, $name"
},
{ "minlevel" => 20,
"maxlevel" => 30,
"plat" => 300,
"copper" => 1,
"spellid" => 1200,
"saying" => "Good luck on your journey, $name"
}
);

foreach $entry (@data){
if($ulevel >= $entry->{'minlevel'}
&& $ulevel <= $entry->{'maxlevel'}
&& $copper == $entry->{'copper'}
&& $platinum == $entry->{'plat'}
){
quest::castspell($userid, $entry->{'spellid'});
quest::say($entry->{'saying'});
last;
}
}

}

#the following is for testing only, remove or comment out if you want to include this in a real quest
sub wannatry{
$userid=1234;
$name="MyCharName";
$platinum=100; $copper=1;
$ulevel=7;

EVENT_ITEM();
}

package quest;
sub say{
print shift, "\n";
}

sub castspell{
print "NPC now casting spell ", shift, "\n";
}

package main;
wannatry();


i ddn't test it fully, but should work for a start. i hope this helps.

Deimos
09-06-2004, 08:18 AM
hehe, well, I already wrote about 200 lines with nesting =\ and not quite sure if I want to redo all of it, hehe, just wanted to know if it was possible that it would work =D. Ty though for the help. And you are right, it is very hard programming in the way I set it up, lol, very very very hard. I am counting it by patterns now, only way I recognize syntax and stuffs, lol

{
{
{
elsif
}
}
}
like that, if it doesn't look like that, or whatever pattern I am on, hehe, then I didn't do it yet, lol. It looks more like 2 horns, here:


elsif($ulevel > 89)
{
if($ulevel < 100)
{
if($platinum == "1000")
{
if($copper == "1")
{
quest::castspell($userid,1200);

quest::say("Good luck on your journies $name .");
}
}
elsif($platinum == "1100")
{
if($copper == "2")
{
quest::castspell($userid,1201);

quest::say("Good luck on your journies $name .");
}
}
}
}


ya, like that, and the pattern changes and gets longer every time I add on, at one point though, I wont be able to use the patterns becuz it will be too long, and I have 54 things, up there are only 2. Well, I am going to continue on then with pattersn, and then at one point, just searching through the stuff to see if I put the write values in, hehe.

Cisyouc
09-06-2004, 08:39 AM
try selfcast(spellid);, ive never gotten cast() to work.

animepimp
09-06-2004, 11:47 AM
The way you wrote it, it will always cost either 100 or 200 plat, higher levels won't be able to buy anything. Because if level is 99 $ulevel < 10 will be false and the next check $ulevel > 9 will be true, so it will skip all the other elsifs even though it fails the $ulevel < 20. You need to either combine these into one line as elsif($ulevel > 9 && $ ulevel < 20) or just get rid of the ($ulevel > 9) because if it ever gets to that else their level must be over 9 regardless.

Deimos
09-06-2004, 12:17 PM
How it is set-up is that it first checks to see if you meet the first req, then it throws another at you and if you fail that one, it skips all of that and goes through the rest of the code. This is how code works, if you meet a requirement, then you go to that, but if you don't, you skip it. So, you meet that req, but the second one you dont meet, so then you go back and into another elsif.

But, if you are right, would this be able to fix it?


elsif($ulevel < 100)
{
if($ulevel > 89)
{

for the last one. I still think my way is going to work, but if it doesn't, then what you are saying is that should fix it.

animepimp
09-06-2004, 02:00 PM
Yeah that way should work the way you want. And you also don't need the double {'s at the beginning and end, but again they shouldn't hurt.

Deimos
09-06-2004, 02:05 PM
You were right, lol, I am redoing all 5079 lines, lol, been working about 1 1/2 hours now and a bit more than halfway done, hehe. Tx alot, I was being stupid =P

Deimos
09-06-2004, 03:05 PM
It doesn't work, lol.
Anyone Wanna help, I have lots and lots of errors, I think 5:

Bareword found where operator expected at Untitled line 120, near "if($text=~/ShapeChange30"

Lines 110-125:

{
if($ulevel > 89)
{
quest::say("ShapeChange25 is 1000 Platinum Pieces and 1 Copper Piece.");
}
}
}
################################################## ###################################
#ShapeChange30#ShapeChange30#ShapeChange30#ShapeCh ange30#ShapeChange30#ShapeChange30#
################################################## ###################################
if($text=~/ShapeChange30)
{
if($ulevel < 10)
{
quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
}


(Might be a runaway multi-line // string starting on line 47)
Lines 47-101:

if($text=~/ShapeChange25)
{
if($ulevel < 10)
{
quest::say("ShapeChange25 is 100 Platinum Pieces and 1 Copper Piece.");
}
elsif($ulevel < 20)
{
if($ulevel > 9)
{
quest::say("ShapeChange25 is 200 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 30)
{
if($ulevel > 19)
{
quest::say("ShapeChange25 is 300 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 40)
{
if($ulevel > 29)
{
quest::say("ShapeChange25 is 400 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 50)
{
if($ulevel > 39)
{
quest::say("ShapeChange25 is 500 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 60)
{
if($ulevel > 49)
{
quest::say("ShapeChange25 is 600 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 70)
{
if($ulevel > 59)
{
quest::say("ShapeChange25 is 700 Platinum Pieces and 1 Copper Piece.");
}
}
elsif($ulevel < 80)
{
if($ulevel > 69)
{
quest::say("ShapeChange25 is 800 Platinum Pieces and 1 Copper Piece.");
}
}


syntax error at Untitled line 120, near "if($text=~/ShapeChange30"
Lines 115-125:

}
}
################################################## ###################################
#ShapeChange30#ShapeChange30#ShapeChange30#ShapeCh ange30#ShapeChange30#ShapeChange30#
################################################## ###################################
if($text=~/ShapeChange30)
{
if($ulevel < 10)
{
quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
}


syntax error at Untitled line 126, near "elsif"
Lines 120-130:

if($text=~/ShapeChange30)
{
if($ulevel < 10)
{
quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
}
elsif($ulevel < 20)
{
if($ulevel > 9)
{
quest::say("ShapeChange30 is 300 Platinum Pieces and 2 Copper Pieces.");


If you want to see all of the code, please go to this site:

http://www.rafb.net/paste/results/25KPWL91.html

Or

http://www.rafb.net/paste/results/twzcry78.html

smogo
09-06-2004, 03:21 PM
you didn't close the match pattern in the if clause :if($text=~/ShapeChange30)
should be
if($text=~/ShapeChange30/)

on all such lines.

This might not solve all your pbs, but it's a start imho. i hope this helps.

Deimos
09-06-2004, 04:15 PM
Lol, tx, I didn't see that at all, =P, lol. I feel blind now, lol, and it would actually be something like if($text=~/ShapeChange/i), that way doesn't have to match the caps. once again thx, I can't believe I didn't see that I forgot to do that. When you are typing a 10,000 line code file, you sometimes forget some of the small things, ehhe.

Deimos
09-09-2004, 04:22 PM
THE BUFFER NPC IS NOW DONE!

m0oni9
09-10-2004, 03:36 AM
Glancing at the script, just a couple of insights. Take it for what you will:

For your level range checking, you do not need as many checks. Consider the following:
if ($x >= 10 && $x <= 20)
{
print "x is between 10 and 20 inclusive\n";
}
elsif ($x >= 21 && $x <= 30)
{
print "x is between 21 and 30 inclusive\n";
}
Instead, try:
if ($x > 30)
{
print "x is larger than 30!\n";
}
elsif ($x >= 20)
{
print "x is between 30 and 20 inclusive\n";
}

As for all of these "if ($text =~ ...)" lines, after the first if statement, you may as well use elsif from then on.
if($text=~/hail/i)
...
elsif($text=~/categorys/i)
...

Also, the whole structure of the NPC telling what buffs he casts, etc., could probably be done with an array/hash more elegantly, and would take less code. I'm not going to draw that up, though :D.

Good effort on your script. I would suggest practicing with perl a bit more, and then attempt to redesign it. People have a habit of not wanting to redo or throw out their code, but in the end it will give you a better result, and likely increase your skills.

Deimos
09-10-2004, 09:56 AM
Hey all, for some reason, this script isn't really working. The NPC is buffing itself instead of the players =/. Any ideas?


quest::castspell($userid,spell)


That is the correct usage, right? Or am I doing something wrong? Please tell me the correct usage, hehe.

Also, thx moonie. The code is already done though and works perfectly except for the above =/. I could have sworn it was $userid...

Cisyouc
09-10-2004, 10:18 AM
Hey all, for some reason, this script isn't really working. The NPC is buffing itself instead of the players =/. Any ideas?


quest::castspell($userid,spell)


That is the correct usage, right? Or am I doing something wrong? Please tell me the correct usage, hehe.

Also, thx moonie. The code is already done though and works perfectly except for the above =/. I could have sworn it was $userid...Read my reply above where I mentioned this ahead of time.

Deimos
09-10-2004, 10:54 AM
Doh, hehe. Tx

Deimos
09-10-2004, 12:01 PM
He is still casting it on himself, using:


quest::selfcast(Buff Number);


It should work according to everyone...

Cisyouc
09-10-2004, 01:33 PM
He is still casting it on himself, using:


quest::selfcast(Buff Number);


It should work according to everyone...thats like...impossible?

Deimos
09-10-2004, 03:00 PM
Well, I am trying this now, hopefully it will work:


quest::settarget(entity,$userid);
quest::selfcast(Spell Number);


I am hoping that will fix all my troubles.

killspree
09-10-2004, 03:47 PM
castspell worked back when I was working on Evertorn and had "mysticals"(basically NPCs that give out various buffs)...interesting to see it's broken now. Wonder how that happened.