diff options
Diffstat (limited to 'npc/commands/warp.txt')
-rw-r--r-- | npc/commands/warp.txt | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/npc/commands/warp.txt b/npc/commands/warp.txt new file mode 100644 index 00000000..ddd0449d --- /dev/null +++ b/npc/commands/warp.txt @@ -0,0 +1,86 @@ +// @w atcommand +// warps using anchors or map name +// +// group lv: 1 +// group char lv: 2 +// log: True +// +// usage: +// @w <map or anchor> [, x [, y]] +// #w "char" <map or anchor> [, x [, y]] +// +// example: +// @w artis +// #w "char" artis + +- script @w 32767,{ + end; + +OnCall: + .@params$ = strtoupper(strip(implode(.@atcmd_parameters$[0], " "))); + .@request$ = replacestr(.@params$, " ", ""); + + cleararray($@regexmatch$[1], "", 3); + if (.@params$ ~= "^(.+) ([0-9]+) ([0-9]+)$") + { + .@request$ = replacestr(strip($@regexmatch$[1]), " ", ""); + .@req_x = atoi(strip($@regexmatch$[2])); + .@req_y = atoi(strip($@regexmatch$[3])); + } + + .@ht = getvariableofnpc(.ht, "__anchors__"); + .@it = htiterator(.@ht); + for (.@key$ = htifirstkey(.@it); hticheck(.@it); .@key$ = htinextkey(.@it)) + { + if (.@request$ ~= .@key$) + { + sscanf(htget(.@ht, .@key$, ""), "%s %d %d", .@map$, .@x, .@y); + break; + } + } + htidelete(.@it); + + .@map$ = .@map$ ? .@map$ : .@request$; + .@x = .@req_y ? .@req_x : .@x; + .@y = .@req_y ? .@req_y : .@y; + + if (getmapinfo(MAPINFO_ID, .@map$) < 0) + { + if (getmapinfo(MAPINFO_ID, .@atcmd_parameters$[0]) >= 0) + { + .@map$ = .@atcmd_parameters$[0]; + } + else + { + dispbottom(l("Map or anchor not found: %s", .@atcmd_parameters$[0])); + end; + } + } + + while (!checkcell(.@map$, .@x, .@y, cell_chkpass)) + { + // FIXME: this whole cell finding loop is DIRTY! + // we should have a command to get a random free coordinate + // or we should make buildin_warp silently ignore 0,0 + + if (.@e == 50) break; // FIXME: triggers a console warning + .@x = rand(20, 20 + (.@e * 5)); + .@y = rand(20, 20 + (.@e * 5)); + ++.@e; + } + + warp(.@map$, .@x, .@y); + end; + +OnInit: + if (debug) { + bindatcmd("w", "@w::OnCall", 0, 20, 0); + bindatcmd("go", "@w::OnCall", 0, 20, 0); + bindatcmd("to", "@w::OnCall", 0, 20, 0); + } else { + bindatcmd("w", "@w::OnCall", 20, 60, 1); + bindatcmd("go", "@w::OnCall", 20, 60, 1); + bindatcmd("to", "@w::OnCall", 20, 60, 1); + } + end; +} |