Ver Fonte

feat(busy): busy 检查和回调

dzp há 2 anos atrás
pai
commit
3ae0e4b6ef
2 ficheiros alterados com 93 adições e 0 exclusões
  1. 69 0
      mud/pkuxkx/plugins/basic/busy.tin
  2. 24 0
      mud/pkuxkx/plugins/basic/char/gmcp.tin

+ 69 - 0
mud/pkuxkx/plugins/basic/busy.tin

@@ -0,0 +1,69 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分。
+PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+*/
+
+///=== {
+///// busy 模块向其它模块提供 busy 检查机制。
+///// };
+
+#var basic_busy[META] {
+    {NAME}      {busy检查}
+    {DESC}      {检查角色是否处于 busy 状态,并在 busy 结束时回调代码}
+    {AUTHOR}    {担子炮}
+};
+
+#func {basic_busy.Init} {
+    event.Handle {char/nobusy} {busy.on-idle} {basic/busy} {busy.on-idle};
+    #return {true};
+};
+
+VAR {正在等待的回调列表}    busy.wait-list {};
+
+///=== {
+// ## busy.Wait <回调代码>
+//    检查角色当前是否处于 busy 状态,当不在 busy 状态,或 busy 状态解除时,执行回调代码。
+// };
+#alias {busy.Wait} {
+    #local code {%1};
+
+    #local len {&busy.wait-list[]};
+    #list busy.wait-list add {{$code}};
+
+    #if { $len == 0 } {
+        #if { @isTrue{$char[HP][忙]} } {
+            #delay busy.checkbusy {checkbusy} 10;
+        };
+        #else {
+            #delay busy.checkbusy {checkbusy} 0;
+        };
+    };
+};
+
+#alias {busy.on-idle} {
+    #while { &busy.wait-list[] > 0 } {
+        #local code {$busy.wait-list[1]};
+        #list busy.wait-list delete 1;
+        $code
+    };
+
+    #undelay busy.checkbusy;
+};
+
+#action {^你正忙{|ID=basic/busy}$} {
+    #if { &busy.wait-list[] == 0 } {
+        #return;
+    };
+
+    #if { @isTrue{$gGMCP[Channels][Status]} } {
+        #delay busy.checkbusy {checkbusy} 10;
+    };
+    #else {
+        #delay busy.checkbusy {checkbusy} 1;
+    };
+};
+
+#action {^你不忙{|ID=basic/busy}$} {#delay {busy.on-idle} {busy.on-idle} 0};

+ 24 - 0
mud/pkuxkx/plugins/basic/char/gmcp.tin

@@ -171,3 +171,27 @@ event.Define {char/nofight} {无参} {$MODULE} {角色脱离战斗};
     #if     { "$fight" == "true" }  {event.Emit char/fight};
     #elseif { "$fight" == "false" } {event.Emit char/nofight};
 };
+
+#action {^GMCP 频道收听汇总:$E} {
+    #class gmcp-channel-status open;
+
+    #action {^%*(%*) %s {🔔|🔕}$} {
+        #local channel {%%2};
+        #local status  {true};
+        #if { "%%4" == "🔕" } {
+            #local status  {false};
+        };
+        #var {gGMCP[Channels][$channel]} {$status};
+    };
+
+    #action {^你接收GMCP信息的格式为%*,你可以用tune gmcp <channel> on/off开关GMCP频道。$} {
+        #class gmcp-channel-status kill;
+    };
+
+    #class gmcp-channel-status close;
+};
+
+#action {^你打开了GMCP:%*频道。$}           {#var gGMCP[Channels][%1] {true}};
+#action {^你关闭了GMCP:%*频道。$}           {#var gGMCP[Channels][%1] {false}};
+#action {^你的GMCP:%*频道已经是打开的。$}   {#var gGMCP[Channels][%1] {true}};
+#action {^你的GMCP:%*频道已经是关闭的。$}   {#var gGMCP[Channels][%1] {false}};