|
@@ -1787,6 +1787,92 @@ optimisation.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
+*while (<condition>) <statement>;
|
|
|
+
|
|
|
+This is probably the simplest and most frequently used loop structure. The 'while'
|
|
|
+statement can be interpreted as "while <condition> is true, perform <statement>".
|
|
|
+It is a pretest loop, meaning the conditional expression is tested before any of the
|
|
|
+statements in the body of the loop are performed. If the condition evaluates to
|
|
|
+false, the statement(s) in the body of the loop is/are never executed. If the
|
|
|
+condition evaluates to true, the statement(s) are executed, then control transfers
|
|
|
+back to the conditional expression, which is reevaluated and the cycle continues.
|
|
|
+
|
|
|
+Multiple statements can be grouped with { }, curly braces, just like with the 'if' statement.
|
|
|
+
|
|
|
+Example 1:
|
|
|
+ while (switch(select("Yes:No") == 2 ))
|
|
|
+ mes "You picked no.";
|
|
|
+
|
|
|
+Example 2: multiple statements
|
|
|
+ while (switch(select("Yes:No") == 2 )) {
|
|
|
+ mes "Why did you pick no?";
|
|
|
+ mes "You should pick yes instead!";
|
|
|
+ }
|
|
|
+
|
|
|
+Example 3: counter-controlled loop
|
|
|
+ set .@i, 1;
|
|
|
+ while (.@i <= 5) {
|
|
|
+ mes "This line will print 5 times.";
|
|
|
+ set .@i, .@i +1;
|
|
|
+ }
|
|
|
+
|
|
|
+Example 4: sentinel-controlled loop
|
|
|
+ mes "Input 0 to stop";
|
|
|
+ input .@num;
|
|
|
+ while (.@num != 0) {
|
|
|
+ mes "You entered " + .@num;
|
|
|
+ input .@num;
|
|
|
+ }
|
|
|
+ close;
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
+*for (<variable initialization>; <condition>; <variable update>) <statement>;
|
|
|
+
|
|
|
+Another pretest looping structure is the 'for' statement. It is considered a
|
|
|
+specialized form of the 'while' statement, and is usually associated with counter-
|
|
|
+controlled loops. Here are the steps of the 'for' statement: the initialize
|
|
|
+statement is executed first and only once. The condition test is performed.
|
|
|
+When the condition evaluates to false, the rest of the for statement is skipped.
|
|
|
+When the condition evaluates to true, the body of the loop is executed, then the
|
|
|
+update statement is executed (this usually involves incrementing a variable).
|
|
|
+Then the condition is reevaluated and the cycle continues.
|
|
|
+
|
|
|
+Example 1:
|
|
|
+ for( set .@i, 1; .@i <= 5; set .@i, .@i +1 )
|
|
|
+ mes "This line will print 5 times.";
|
|
|
+
|
|
|
+Example 2:
|
|
|
+ mes "This will print the numbers 1 - 5.";
|
|
|
+ for( set .@i, 1; .@i <= 5; set .@i, .@i +1 )
|
|
|
+ mes .@i;
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
+*do { <statement>; } while (<condition>);
|
|
|
+
|
|
|
+The 'do...while' is the only posttest loop structure available in this script
|
|
|
+language. With a posttest, the statements are executed once before the condition
|
|
|
+is tested. When the condition is true, the statement(s) are repeated. When the
|
|
|
+condition is false, control is transferred to the statement following the
|
|
|
+'do...while' loop expression.
|
|
|
+
|
|
|
+Example 1: sentinel-controlled loop
|
|
|
+ mes "This menu will keep appearing until you pick Cancel";
|
|
|
+ do {
|
|
|
+ set .@menu, select("One:Two:Three:Cancel");
|
|
|
+ } while (.@menu != 4);
|
|
|
+
|
|
|
+Example 2: counter-controlled loop
|
|
|
+ mes "This will countdown from 10 to 1.";
|
|
|
+ set .@i, 10;
|
|
|
+ do {
|
|
|
+ mes .@i;
|
|
|
+ set .@i, .@i - 1;
|
|
|
+ } while (.@i > 0);
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
*setarray <array name>[<first value>],<value>{,<value>...<value>};
|
|
|
|
|
|
This command will allow you to quickly fill up an array in one go. Check the
|
|
@@ -2012,7 +2098,7 @@ if( getcharid(2) == 0 ) mes "Only members of a guild are allowed here!";
|
|
|
*getmotherid()
|
|
|
*getfatherid()
|
|
|
|
|
|
-These functions return the characters (shild/mother/father) ID
|
|
|
+These functions return the characters (child/mother/father) ID
|
|
|
|
|
|
if (getmotherid()) mes "Oh... I know your mother's ID:"+getmotherid();
|
|
|
|
|
@@ -2234,13 +2320,13 @@ the players would normally see on screen.)
|
|
|
|
|
|
This function will search the invoking character's inventory for any broken
|
|
|
items, and will return their item ID numbers. Since the character may have
|
|
|
-several broken items, 0 given as an argument will return the first one found, 1
|
|
|
+several broken items, 1 given as an argument will return the first one found, 2
|
|
|
will return the second one, etc. Will return 0 if no such item is found.
|
|
|
|
|
|
// Let's see if they have anything broken:
|
|
|
- if (getbrokenid(0)==0) goto Skip;
|
|
|
+ if (getbrokenid(1)==0) goto Skip;
|
|
|
// They do, so let's print the name of the first broken item:
|
|
|
- mes "Oh, I see you have a broken "+getitemname(getbrokenid(0))+" here!";
|
|
|
+ mes "Oh, I see you have a broken "+getitemname(getbrokenid(1))+" here!";
|
|
|
Skip:
|
|
|
mes "You don't have anything broken, quit bothering me.";
|
|
|
|
|
@@ -2485,7 +2571,7 @@ when you want to check item cards or if it's signed. Useful for such quests as
|
|
|
"Sign this refined item with players name" etc;
|
|
|
Hat[0] +4 -> Player's Hat[0] +4
|
|
|
|
|
|
---------------------------------------
|
|
|
+---------------------------------------
|
|
|
|
|
|
*getitemslots (<item id>);
|
|
|
|
|
@@ -2496,7 +2582,7 @@ Example(s):
|
|
|
//@slots now has the amount of slots of the item with ID 1205.
|
|
|
set @slots, getItemSlots(1205);
|
|
|
|
|
|
---------------------------------------
|
|
|
+---------------------------------------
|
|
|
//
|
|
|
2,1.- End of item-related commands.
|
|
|
//
|
|
@@ -2988,7 +3074,7 @@ deal with timers as there's no guarantee the player will still be logged on
|
|
|
when the timer triggers. Note that the ID of a player is actually their
|
|
|
account ID.
|
|
|
|
|
|
--------------------------
|
|
|
+---------------------------------------
|
|
|
|
|
|
*isloggedin(<account id>{,<char id>});
|
|
|
|
|
@@ -3598,19 +3684,13 @@ do, but this will only happen in a later SVN revision.
|
|
|
|
|
|
This command will change the gender for the attached character's account. If it
|
|
|
was male, it will become female, if it was female, it will become male. The
|
|
|
-change will be written to the character server, but there is no way to send this
|
|
|
-information to the client, so the player will continue to see their character as
|
|
|
-the gender it previously was. What the other players will see before the
|
|
|
-relogin is not clear.
|
|
|
+change will be written to the character server, the player will receive the
|
|
|
+message: "Need disconnection to perform change-sex request..." and the player
|
|
|
+will be immediately kicked to the login screen. When they log back in, they will
|
|
|
+be the opposite sex.
|
|
|
|
|
|
-If the character currently connected when this command was invoked was a
|
|
|
-Dancer/Gypsy or Bard/Clown, they will become a Swordman upon 'changesex'.
|
|
|
-Whatever happens to their skills is not clear. Whatever happens if another
|
|
|
-character on the same account was a gender-specific class is not clear either,
|
|
|
-but it's likely that the client will have serious issues with that, since no
|
|
|
-other characters on the same account will get altered.
|
|
|
-
|
|
|
-There's good reasons to be very careful when using this command.
|
|
|
+If there are any Dancer/Gypsy or Bard/Clown characters on the account,
|
|
|
+they will also have their skills reset upon 'changesex'.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
@@ -3637,14 +3717,16 @@ adjusts the gained value. If you want to bypass this, use the 'set' method.
|
|
|
---------------------------------------
|
|
|
|
|
|
*setlook <look type>,<look value>;
|
|
|
+*changelook <look type>,<look value>;
|
|
|
|
|
|
-This command will alter the look data for the invoking character. It is used
|
|
|
-mainly for changing the palette used on hair and clothes, you specify which look
|
|
|
+'setlook' will alter the look data for the invoking character. It is used
|
|
|
+mainly for changing the palette used on hair and clothes: you specify which look
|
|
|
type you want to change, then the palette you want to use. Make sure you specify
|
|
|
a palette number that exists/is usable by the client you use.
|
|
|
+'changelook' works the same, but is only client side (it doesn't save the look value).
|
|
|
|
|
|
// This will change your hair(6), so that it uses palette 8, what ever your
|
|
|
- // palette 8 is your hair will use that colour
|
|
|
+ // palette 8 is, your hair will use that colour
|
|
|
|
|
|
setlook 6,8;
|
|
|
|
|
@@ -3862,6 +3944,20 @@ Example:
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
+*rentitem <item id>,<time>;
|
|
|
+*rentitem "<item name>",<time>;
|
|
|
+
|
|
|
+Creates a rental item in the attached character's inventory. The item will expire
|
|
|
+in <time> seconds and be automatically deleted. When receiving a rental item,
|
|
|
+the character will receive a message in their chat window. The character will
|
|
|
+also receive warning messages in their chat window before the item disappears.
|
|
|
+
|
|
|
+This command can not be used to rent stackable items. Rental items cannot be
|
|
|
+removed from the character's inventory. (i.e. trade mask 123 in ../db/item_trade.txt)
|
|
|
+Note: 'delitem' in an NPC script can still remove rental items.
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
*makeitem <item id>,<amount>,"<map name>",<X>,<Y>;
|
|
|
*makeitem "<item name>",<amount>,"<map name>",<X>,<Y>;
|
|
|
|
|
@@ -4129,6 +4225,30 @@ before you open storage.
|
|
|
close2;
|
|
|
openstorage;
|
|
|
end;
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
+*openmail;
|
|
|
+
|
|
|
+This will open a character's Mail window on the client connected to the
|
|
|
+invoking character.
|
|
|
+
|
|
|
+ mes "Close this window to open your mail inbox.";
|
|
|
+ close2;
|
|
|
+ openmail;
|
|
|
+ end;
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
+*openauction;
|
|
|
+
|
|
|
+This will open the Auction window on the client connected to the invoking character.
|
|
|
+
|
|
|
+ mes "Close this window to open your mail inbox.";
|
|
|
+ close2;
|
|
|
+ openmail;
|
|
|
+ end;
|
|
|
+
|
|
|
---------------------------------------
|
|
|
\\
|
|
|
4,2.- Guild-related commands
|
|
@@ -4490,7 +4610,7 @@ both of these characters. No rings will be given and no effects will be shown.
|
|
|
*wedding;
|
|
|
|
|
|
This command will call up wedding effects - the music and confetti - centered on
|
|
|
-the invoking character.
|
|
|
+the invoking character. Example can be found in the wedding script.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
@@ -5345,7 +5465,7 @@ example.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
-*waitingroomkickall {"<NPC object name>"};
|
|
|
+*kickwaitingroomall {"<NPC object name>"};
|
|
|
|
|
|
This command would kick everybody out of a specified waiting room chat. IF it
|
|
|
was properly linked into the script interpreter which it isn't, even though the
|
|
@@ -5903,7 +6023,7 @@ set @i, pow(2,3); // @i will be 8
|
|
|
|
|
|
Returns square-root of number.
|
|
|
|
|
|
-Examlpe:
|
|
|
+Example:
|
|
|
set @i, sqrt(25); // @i will be 5
|
|
|
|
|
|
---------------------------------------
|
|
@@ -5950,6 +6070,17 @@ to query the server log tables.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
+*escape_sql("<string>")
|
|
|
+
|
|
|
+Escapes special characters in the string, so that it is safe to use in query_sql(),
|
|
|
+and returns the escaped form of the given string.
|
|
|
+
|
|
|
+Example 1:
|
|
|
+ set .@str$, "John's Laptop";
|
|
|
+ set .@esc_str$, escape_sql(.@name$); // Escaped string: John\'s Laptop
|
|
|
+
|
|
|
+---------------------------------------
|
|
|
+
|
|
|
*setitemscript(<item id>,<"{ new item script }">{,<type>});
|
|
|
|
|
|
Set a new script bonus to the Item. Very useful for game events.
|
|
@@ -5996,7 +6127,7 @@ Example(s):
|
|
|
if (compare("Blood Butterfly","Bloody"))
|
|
|
dothat;
|
|
|
|
|
|
---------------------------------------
|
|
|
+---------------------------------------
|
|
|
|
|
|
*charisalpha("<string>",<position>)
|
|
|
|
|
@@ -6005,12 +6136,6 @@ is a letter, 0 if it isn't a letter but a digit or a space.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
-*wedding_effect;
|
|
|
-Starts the effect used when a wedding is done (music and everything else)
|
|
|
-Example can be found in the wedding script.
|
|
|
-
|
|
|
---------------------------------------
|
|
|
-
|
|
|
* The Pet AI commands
|
|
|
|
|
|
These commands will only work if the invoking character has a pet, and are meant
|
|
@@ -6085,7 +6210,7 @@ buffing items.
|
|
|
|
|
|
Nobody tried this before, so you're essentially on your own here.
|
|
|
|
|
|
---------------------------------------
|
|
|
+---------------------------------------
|
|
|
|
|
|
*bpet;
|
|
|
|
|
@@ -6113,18 +6238,6 @@ server and the egg will disappear when anyone tries to hatch it.
|
|
|
|
|
|
---------------------------------------
|
|
|
|
|
|
-*openmail;
|
|
|
-
|
|
|
-This will open a character's Mail window on the client connected to the
|
|
|
-invoking character.
|
|
|
-
|
|
|
- mes "Close this window to open your mail inbox.";
|
|
|
- close2;
|
|
|
- openmail;
|
|
|
- end;
|
|
|
-
|
|
|
----------------------------------------
|
|
|
-
|
|
|
*homshuffle;
|
|
|
|
|
|
This will recalculate the homunculus stats acording to its level, of the
|