* Updated/revised description of instance-related script commands (bugreport:4880).

- Fixed 'instance_create' would return -4 (party already instancing) when the requested party was not found.
- 'instance_create' return value -2 now means 'party not found' rather than 'missing parameter'.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14809 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ai4rei 2011-05-08 05:34:35 +00:00
parent 6f5cd0921e
commit 0c22fcf28e
4 changed files with 89 additions and 40 deletions

View File

@ -1,5 +1,9 @@
Date Added
2011/05/08
* Updated/revised description of instance-related script commands (bugreport:4880). [Ai4rei]
- Fixed 'instance_create' would return -4 (party already instancing) when the requested party was not found.
- 'instance_create' return value -2 now means 'party not found' rather than 'missing parameter'.
2011/05/01
* Removed functions 'decode_zip' (ancient) and 'encode_zip' (from r824) from grfio. These were outdated copies of zlib's 'uncompress' and 'compress' respectively (related r1530 and r5152). [Ai4rei]
* Removed auto-add feature from mapindex code, as map indexes are used for save data, thus need to be constant across server starts (since r4726). [Ai4rei]

View File

@ -4,7 +4,7 @@
//= A reference manual for the eAthena scripting language.
//= Commands are sorted depending on their functionality.
//===== Version ===========================================
//= 3.41.20110427
//= 3.42.20110508
//=========================================================
//= 1.0 - First release, filled will as much info as I could
//= remember or figure out, most likely there are errors,
@ -171,6 +171,9 @@
//= 3.41.20110427
//= Updated description of 'itemheal' primarily to remove overhead and lies
//= about client effects. [Ai4rei]
//= 3.42.20110508
//= Updated description of all instance commands to reflect actual behavior.
//= [Ai4rei]
//=========================================================
This document is a reference manual for all the scripting commands and functions
@ -5542,7 +5545,7 @@ currently ignored by the client and appears always green.
5,1.- End of time-related commands
//
*announce "<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}}};
*announce "<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}};
This command will broadcast a message to all or most players, similar to
@kami/@kamib GM commands.
@ -6766,18 +6769,17 @@ This will open a book item at the specified page
========================
---------------------------------------
*instance_create("<Instance Name>",<Party ID>,<Instance>)
*instance_create("<instance name>",<party id>);
Create an instance using the name "<Instance Name>" for the Party of <Party ID>.
Instance ID currently will only be ID_ENDLESS (5) or ID_CATACOMBS (6)
Most Instance_* commands are used in conjunction with this command and depend
Create an instance using the name "<instance name>" for the Party of <party id>.
Most instance_* commands are used in conjunction with this command and depend
on the ID this command returns.
Example:
// Store the Party ID of the invoking character.
set .@party_id, getcharid(1);
// Attempt to create an instance using that party ID.
set .@id, instance_create("Endless Tower", .@party_id, ID_ENDLESS);
set .@id, instance_create("Endless Tower", .@party_id);
if (.@id == -1) { // Party ID is in use by another instance.
...
}
@ -6786,67 +6788,111 @@ Example:
}
---------------------------------------
*instance_destroy(<Instance ID>)
*instance_destroy {<instance id>};
Destroys instance with the ID <Instance ID>.
Destroys instance with the ID <instance id>. If no ID is specified, the instance,
the script is attached to, is used. If the script is not attached to an instance,
the instance of the currently attached player's party is used. If no player is
currently attached, the command fails and causes the script to halt.
---------------------------------------
*instance_attachmap(<Instance ID>,"<Map Name>")
*instance_detachmap(<Instance ID>,"<Map Name>")
*instance_attachmap("<map name>",<instance id>{,<use base name>});
Attach or detach the map "<Map Name>" to the instance with the <Instance ID>.
Attaches the map "<map name>" to the instance specified with <instance id>. The
optional parameter specifies, whether a map requires emulation for instancing (1)
or not (0 = default).
Returns the resulting map name on success or an empty string on failure.
---------------------------------------
*instance_init(<Instance ID>);
*instance_detachmap "<map name>"{,<instance id>};
Initiate the instance of <Instance ID>.
Detach the map "<map name>" to the instance with the <instance id>. If no ID is
specified, the instance, the script is attached to, is used. If the script is not
attached to an instance, the instance of the currently attached player's party is
used. If no player is currently attached, the command fails and causes the script
to halt.
---------------------------------------
*instance_announce <Instance ID>,"<text>",<flag>{,<color>};
*instance_init <instance id>;
Works like announce, but has the <Instance ID> parameter, where 0 = active instance?
Initializes the instance given by <instance id>. This copies all NPCs from the
source maps to the instanced maps.
---------------------------------------
*instance_attach(<Instance ID>);
*instance_announce <instance id>,"<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}};
Attaches a script to the provided <Instance ID>?
Works like announce, but has the <instance id> parameter. If instance id is 0, the
instance, the script is attached to, is used. If the script is not attached to an
instance, the instance of the currently attached player's party is used. If no
player is currently attached, the command fails and causes the script to halt.
---------------------------------------
*instance_npcname("<NPC Name>",<Instance ID>)
*instance_attach <instance id>;
Retrieve the unique name given to a copy of an NPC for an instance, the given
"<NPC Name>" that belongs to instance <Instance ID>. Can be used with such commands
as enablenpc and disablenpc, donpcevent, etc.
Attaches the current script to the instance given by <instance id>.
---------------------------------------
*has_instance("<Map Name>")
*instance_npcname("<npc name>"{,<instance id>});
Check if the player has been queued for the <Map Name> instance.
Retrieves the unique name given to a copy of an NPC given by "<npc name>" in an
instance specified <instance id>. If no ID is specified, the instance, the script
is attached to, is used. If the script is not attached to an instance, the
instance of the currently attached player's party is used. If no player is
currently attached, the command fails and causes the script to halt.
---------------------------------------
*instance_id(<?>)
*has_instance("<map name>"{,<instance id>});
Apparently returns the ID the player is currently attached too.
Checks whether or not the given map belongs to specified instance. If no ID is
specified, the instance, the script is attached to, is used. If the script is not
attached to an instance, the instance of the currently attached player's party
is used. If no player is currently attached, the command fails and causes the
script to halt.
Returns the name of the instanced map on success, otherwise an empty string.
---------------------------------------
*instance_warpall "<Map Name>",<x>,<y>;
*instance_id({<type>});
Warp all players in the instance to <map name> and given coordinates.
Retrieves the instance id, depending on <type>. If type is not given, it defaults
to 0.
Type:
0 - Instance ID the script is attached to.
1 - Instance ID of the currently attached player's party.
---------------------------------------
*instance_set_timeout <Time1>,<Time2>,<Instance ID>;
*instance_warpall "<map name>",<x>,<y>{,<instance id>};
Lifetime of <Time1> for <Instance ID>, while <Time2> is how long until the
instance times out while inactive.
Warps all players in the instance <instance id> to <map name> at given
coordinates. If no ID is specified, the instance, the script is attached to,
is used. If the script is not attached to an instance, the instance of the
currently attached player's party is used. If no player is currently attached,
the command fails and causes the script to halt.
---------------------------------------
*instance_set_timeout <alive timeout>,<idle timeout>{,<instance id>};
Sets the timeout values for an instance given by <instance id>. If no ID is
specified, the instance, the script is attached to, is used. If the script is
not attached to an instance, the instance of the currently attached player's
party is used. If no player is currently attached, the command fails and causes
the script to halt.
Parameter <alive timeout> specifies the total amount of time the instance will
exist. Parameter <idle timeout> specifies how long players have, when they are
outside of the instance, until it is destroyed.
---------------------------------------

View File

@ -31,22 +31,21 @@ struct s_instance instance[MAX_INSTANCE];
/*--------------------------------------
* name : instance name
* Return value could be
* -4 = already exists | -3 = no free instances | -2 = missing parameter | -1 = invalid type
* -4 = already exists | -3 = no free instances | -2 = party not found | -1 = invalid type
* On success return instance_id
*--------------------------------------*/
int instance_create(int party_id, const char *name)
{
int i;
struct party_data *p = NULL;
struct party_data* p;
if( !party_id || !name )
if( ( p = party_search(party_id) ) == NULL )
{
ShowError("map_instance_create: missing parameter.\n");
ShowError("instance_create: party %d not found for instance '%s'.\n", party_id, name);
return -2;
}
p = party_search(party_id);
if( !p || p->instance_id )
if( p->instance_id )
return -4; // Party already instancing
// Searching a Free Instance
@ -54,7 +53,7 @@ int instance_create(int party_id, const char *name)
ARR_FIND(1, MAX_INSTANCE, i, instance[i].state == INSTANCE_FREE);
if( i == MAX_INSTANCE )
{
ShowError("map_instance_create: no free instances, consider increasing MAX_INSTANCE.\n");
ShowError("instance_create: no free instances, consider increasing MAX_INSTANCE.\n");
return -3;
}

View File

@ -14360,11 +14360,11 @@ BUILDIN_FUNC(instance_create)
}
else if( res < 0 )
{
char *err;
const char *err;
switch(res)
{
case -3: err = "No free instances"; break;
case -2: err = "Missing parameter"; break;
case -2: err = "Invalid party ID"; break;
case -1: err = "Invalid type"; break;
default: err = "Unknown"; break;
}