diff --git a/mud/pkuxkx/plugins/basic/map/__init__.tin b/mud/pkuxkx/plugins/basic/map/__init__.tin index 6816d87e..394b1d77 100644 --- a/mud/pkuxkx/plugins/basic/map/__init__.tin +++ b/mud/pkuxkx/plugins/basic/map/__init__.tin @@ -32,6 +32,8 @@ load-file mud/pkuxkx/plugins/basic/map/xiaoyao.tin; load-file mud/pkuxkx/plugins/basic/map/helper.tin; load-file mud/pkuxkx/plugins/basic/map/tab.tin; +load-file mud/pkuxkx/plugins/basic/map/utils.tin; + #func {basic_map.Init} { event.Emit map/init; set localmap; diff --git a/mud/pkuxkx/plugins/basic/map/utils.tin b/mud/pkuxkx/plugins/basic/map/utils.tin new file mode 100644 index 00000000..a59f0bad --- /dev/null +++ b/mud/pkuxkx/plugins/basic/map/utils.tin @@ -0,0 +1,93 @@ +#nop vim: set filetype=tt:; + +/* +本文件属于 PaoTin++ 的一部分 +=========== +PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp ) 享有并保留一切法律权利 +你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。 +=========== +*/ + +VAR {要寻找的 NPC 的特征,表格} {gFocusNPC} {}; + +///=== { +// ## map.FocusNPC <行为类型> <行为> +// 关注指定特征的 NPC,并当发现它时,呼叫相应的行为。 +// 特征由一系列字段来描述,目前支持的字段有: +// - id: ID +// - name: 名字 +// - title: 称号 +// - nick: 昵称 +// 行为有两种类型: +// - command: 指明行为是一个命令,例如 follow 或者 kill 之类,那么将以 NPC ID 为参数调用它。 +// - alias: 指明行为是一个别名,表明要做的事情比较复杂,那么将以 NPC 对象为参数调用它。 +// +// 如果省略所有参数,则不再关注任何 NPC。 +// }; +#alias {map.FocusNPC} { + #local npc {%1}; + #local cbType {%2}; + #local callback {%3}; + + #if { "%0" == "" } { + #var gFocusNPC {}; + #return; + }; + + #if { "$npc" == "" } { + xtt.Usage %90; + #return; + }; + + #if { "$cbType" != "{command|alias}" } { + xtt.Usage %90; + #return; + }; + + #if { "$callback" == "" } { + xtt.Usage %90; + #return; + }; + + #local bad {1}; + #local new {}; + #local key {}; + #foreach {id;name;title;nick;desc} {key} { + #if { "$npc[$key]" != "" } { + #local bad {0}; + #local {new[$key]} {$npc[$key]}; + }; + }; + + #if { $bad } { + xtt.Usage %90; + #return; + }; + + okLog 好的,已经为你关注 NPC: {$new},如果遇到它,将会调用 {$callback}。; + + #var gFocusNPC {$new}; + #var gFocusNPC[cbType] {$cbType}; + #var gFocusNPC[callback] {$callback}; + + event.Handle {map/GotRoomInfo} {map/utils} {map} {map.check-npc}; +}; + +#alias {map.check-npc} { + #local idx {}; + #foreach {*gMapRoom[objs][]} {idx} { + #local obj {$gMapRoom[objs][$idx]}; + #if { ( "$gFocusNPC[id]" == "" || "$obj[id]" == "$gFocusNPC[id]" ) + && ( "$gFocusNPC[name]" == "" || "$obj[name]" == "$gFocusNPC[name]" ) + && ( "$gFocusNPC[title]" == "" || "$obj[title]" == "$gFocusNPC[title]" ) + && ( "$gFocusNPC[nick]" == "" || "$obj[nick]" == "$gFocusNPC[nick]" ) } { + okLog 发现目标 $obj[name] / $obj[id]; + #if { "$gFocusNPC[cbType]" == "command" } { + #line sub var #delay 0 {$gFocusNPC[callback] $obj[id]}; + }; + #else { + #line sub var #delay 0 {$gFocusNPC[callback] {$obj}}; + }; + }; + }; +};