diff options
Diffstat (limited to 'npc/functions/warp.txt')
-rw-r--r-- | npc/functions/warp.txt | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/npc/functions/warp.txt b/npc/functions/warp.txt new file mode 100644 index 00000000..46c390ad --- /dev/null +++ b/npc/functions/warp.txt @@ -0,0 +1,58 @@ +// Evol functions. +// Authors: +// gumi + + + +// map_exists +// self-explanatory + +function script map_exists { + return getmapinfo(MAPINFO_ID, getarg(0)) >= 0; +} + + + +// slide_or_warp +// Slides the player instead of warping, when possible. +// usage: +// slide_or_warp({<aid>}); +// slide_or_warp(<x>, <y>{, <aid>}); +// slide_or_warp("<map>", <x>, <y>{, <aid>}); + +function script slide_or_warp { + if (getargcount() <= 1) { + .@aid = getarg(1, 0); + } else { + if (getargcount() >= 3 && getdatatype(getarg(0)) & DATATYPE_STR) { + .@map$ = getarg(0); + .@x = getarg(1); + .@y = getarg(2); + .@aid = getarg(3, 0); + } else { + .@x = getarg(0); + .@y = getarg(1); + .@aid = getarg(2, 0); + } + } + + if (!isloggedin(.@aid)) { + if ((.@aid = playerattached()) == 0) { + consolemes(CONSOLEMES_DEBUG, "slide_or_warp: no player attached!"); + return false; + } + } + + getmapxy(.@pc_map$, .@pc_x, .@pc_y, UNITTYPE_PC, .@aid); // get char location + .@cid = getcharid(CHAR_ID_CHAR, strcharinfo(PC_NAME, .@aid)); // FIXME: [Hercules] make it so you can pass account id directly to getcharid + + if (getargcount() < 1) { + warpchar(.@pc_map$, .@pc_x, .@pc_y, .@cid); // no arguments, just refresh + } else if (.@map$ == .@pc_map$ && (.@pc_x != .@x || .@pc_y != .@y)) { + slide(.@x, .@y); // same map, slide instead of full warp + // FIXME: make slide take GID as optional arg + } else { + warpchar(.@map$, .@x, .@y, .@cid); // different map, warp to given location + } + return true; +} |