Updated sleep2: (#2208)
* Updated sleep2: Currently sleep2 is supposed to return 0 or 1 if the unit is still attached. Actually mapserv throws a warning and the script end if the timer is still running and unit offline. With this update the script ends if there is no unit attached for sleep2. * Corrected comments / docs Thanks @secretdataz, @Lemongrass3110
This commit is contained in:
parent
f0aed89aad
commit
a8e4c83ef1
@ -6395,7 +6395,7 @@ sleep and sleep2 will pause the script for the given amount of milliseconds.
|
|||||||
Awake is used to cancel a sleep. When awake is called on a NPC it will run as
|
Awake is used to cancel a sleep. When awake is called on a NPC it will run as
|
||||||
if the sleep timer ran out, and thus making the script continue. Sleep and sleep2
|
if the sleep timer ran out, and thus making the script continue. Sleep and sleep2
|
||||||
basically do the same, but the main difference is that sleep will not keep the rid,
|
basically do the same, but the main difference is that sleep will not keep the rid,
|
||||||
while sleep2 does.
|
while sleep2 does. Also sleep2 will stop the script if there is no unit attached.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
sleep 10000; //pause the script for 10 seconds and ditch the RID (so no player is attached anymore)
|
sleep 10000; //pause the script for 10 seconds and ditch the RID (so no player is attached anymore)
|
||||||
|
@ -4087,10 +4087,8 @@ int run_script_timer(int tid, unsigned int tick, int id, intptr_t data)
|
|||||||
if( id != 0 && st->rid ){
|
if( id != 0 && st->rid ){
|
||||||
struct map_session_data *sd = map_id2sd(st->rid);
|
struct map_session_data *sd = map_id2sd(st->rid);
|
||||||
|
|
||||||
// Attached player is offline or another unit type - should not happen
|
// Attached player is offline(logout) or another unit type(should not happen)
|
||||||
if( !sd ){
|
if( !sd ){
|
||||||
ShowWarning( "Script sleep timer called by an offline character or non player unit.\n" );
|
|
||||||
script_reportsrc(st);
|
|
||||||
st->rid = 0;
|
st->rid = 0;
|
||||||
st->state = END;
|
st->state = END;
|
||||||
// Character mismatch. Cancel execution.
|
// Character mismatch. Cancel execution.
|
||||||
@ -18451,54 +18449,73 @@ BUILDIN_FUNC(unitskillusepos)
|
|||||||
/// sleep <mili seconds>;
|
/// sleep <mili seconds>;
|
||||||
BUILDIN_FUNC(sleep)
|
BUILDIN_FUNC(sleep)
|
||||||
{
|
{
|
||||||
|
// First call(by function call)
|
||||||
|
if (st->sleep.tick == 0) {
|
||||||
int ticks;
|
int ticks;
|
||||||
|
|
||||||
ticks = script_getnum(st, 2);
|
ticks = script_getnum(st, 2);
|
||||||
|
|
||||||
|
if (ticks <= 0) {
|
||||||
|
ShowError("buildin_sleep2: negative amount('%d') of milli seconds is not supported\n", ticks);
|
||||||
|
return SCRIPT_CMD_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
// detach the player
|
// detach the player
|
||||||
script_detach_rid(st);
|
script_detach_rid(st);
|
||||||
|
|
||||||
if( ticks <= 0 )
|
// sleep for the target amount of time
|
||||||
{// do nothing
|
|
||||||
}
|
|
||||||
else if( st->sleep.tick == 0 )
|
|
||||||
{// sleep for the target amount of time
|
|
||||||
st->state = RERUNLINE;
|
st->state = RERUNLINE;
|
||||||
st->sleep.tick = ticks;
|
st->sleep.tick = ticks;
|
||||||
}
|
// Second call(by timer after sleeping time is over)
|
||||||
else
|
} else {
|
||||||
{// sleep time is over
|
// Continue the script
|
||||||
st->state = RUN;
|
st->state = RUN;
|
||||||
st->sleep.tick = 0;
|
st->sleep.tick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SCRIPT_CMD_SUCCESS;
|
return SCRIPT_CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pauses the execution of the script, keeping the unit attached
|
/// Pauses the execution of the script, keeping the unit attached
|
||||||
/// Returns if the unit is still attached
|
/// Stops the script if no unit is attached
|
||||||
///
|
///
|
||||||
/// sleep2(<mili secconds>) -> <bool>
|
/// sleep2(<milli seconds>)
|
||||||
BUILDIN_FUNC(sleep2)
|
BUILDIN_FUNC(sleep2)
|
||||||
{
|
{
|
||||||
|
// First call(by function call)
|
||||||
|
if (st->sleep.tick == 0) {
|
||||||
int ticks;
|
int ticks;
|
||||||
|
|
||||||
ticks = script_getnum(st, 2);
|
ticks = script_getnum(st, 2);
|
||||||
|
|
||||||
if( ticks <= 0 )
|
if (ticks <= 0) {
|
||||||
{// do nothing
|
ShowError( "buildin_sleep2: negative amount('%d') of milli seconds is not supported\n", ticks );
|
||||||
script_pushint(st, (map_id2bl(st->rid)!=NULL));
|
return SCRIPT_CMD_FAILURE;
|
||||||
}
|
}
|
||||||
else if( !st->sleep.tick )
|
|
||||||
{// sleep for the target amount of time
|
if (map_id2bl(st->rid) == NULL) {
|
||||||
|
ShowError( "buildin_sleep2: no unit is attached\n" );
|
||||||
|
return SCRIPT_CMD_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sleep for the target amount of time
|
||||||
st->state = RERUNLINE;
|
st->state = RERUNLINE;
|
||||||
st->sleep.tick = ticks;
|
st->sleep.tick = ticks;
|
||||||
}
|
// Second call(by timer after sleeping time is over)
|
||||||
else
|
} else {
|
||||||
{// sleep time is over
|
// Check if the unit is still attached
|
||||||
|
// NOTE: This should never happen, since run_script_timer already checks this
|
||||||
|
if (map_id2bl(st->rid) == NULL) {
|
||||||
|
// The unit is not attached anymore - terminate the script
|
||||||
|
st->rid = 0;
|
||||||
|
st->state = END;
|
||||||
|
} else {
|
||||||
|
// The unit is still attached - continue the script
|
||||||
st->state = RUN;
|
st->state = RUN;
|
||||||
st->sleep.tick = 0;
|
st->sleep.tick = 0;
|
||||||
script_pushint(st, (map_id2bl(st->rid)!=NULL));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return SCRIPT_CMD_SUCCESS;
|
return SCRIPT_CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user