gmcp.tin 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. #var basic_char_gmcp[META] {
  10. {NAME} {GMCP角色信息}
  11. {DESC} {解析 GMCP.Status 事件提供的角色信息}
  12. {AUTHOR} {担子炮}
  13. {NOTE} {本文件属于 PaoTin++ 的一部分}
  14. };
  15. load-lib event;
  16. load-lib speedo;
  17. event.Define {char/busy} {无参} {$MODULE} {角色被 busy 了};
  18. event.Define {char/nobusy} {无参} {$MODULE} {角色解除 busy 了};
  19. event.Define {char/fight} {无参} {$MODULE} {角色战斗开始};
  20. event.Define {char/nofight} {无参} {$MODULE} {角色脱离战斗};
  21. #func {basic_char_gmcp.Init} {
  22. event.Handle {GMCP.Status} {char/gmcp} {basic/char/gmcp} {char.gmcp.status};
  23. };
  24. #var {gmcp-name-map} {
  25. {HP主要} {
  26. {最大内力} {最大内力} {max_neili} {最大内力}
  27. {内力} {当前内力} {neili} {当前内力}
  28. {最大精力} {最大精力} {max_jingli} {最大精力}
  29. {精力} {当前精力} {jingli} {当前精力}
  30. {最大气血} {最大气血} {max_qi} {最大气血}
  31. {有效气血} {有效气血} {eff_qi} {有效气血}
  32. {气血} {当前气血} {qi} {当前气血}
  33. {最大精神} {最大精神} {max_jing} {最大精神}
  34. {有效精神} {有效精神} {eff_jing} {有效精神}
  35. {精神} {当前精神} {jing} {当前精神}
  36. {真气} {当前真气} {vigour/qi} {当前真气}
  37. {忙} {忙} {is_busy} {忙}
  38. {战斗中} {战斗中} {is_fighting} {战斗中}
  39. }
  40. {HP次要} {
  41. {经验} {经验} {combat_exp} {经验}
  42. {潜能} {潜能} {potential} {潜能}
  43. {真元} {真元} {vigour/yuan} {真元}
  44. {食物} {食物} {food} {食物}
  45. {饮水} {饮水} {water} {饮水}
  46. {战意} {战意} {fighter_spirit} {战意}
  47. }
  48. {档案} {
  49. {头衔} {头衔} {title} {头衔}
  50. {门派} {门派} {family/family_name} {门派}
  51. {级别} {人物等级} {level} {人物等级}
  52. {ID} {账号} {id} {账号}
  53. {姓名} {大名} {name} {大名}
  54. }
  55. {天赋} {
  56. {容貌} {容貌} {per} {容貌}
  57. {膂力} {膂力} {str} {膂力}
  58. {悟性} {悟性} {int} {悟性}
  59. {根骨} {根骨} {con} {根骨}
  60. {身法} {身法} {dex} {身法}
  61. }
  62. };
  63. #alias {char.gmcp.status} {
  64. #local busy {};
  65. #local fight {};
  66. #local hasHP1 {0};
  67. #local hasHP2 {0};
  68. #local hasScore {0};
  69. #local id {$gGMCP[Status][id]};
  70. #if { "$id" == "" } {
  71. #local id {$gGMCP[Status][ID]};
  72. };
  73. #nop ID 中包含 # 号的,是 NPC,没有 # 号但和自己 ID 不同的,是玩家。;
  74. #nop 没有 ID 或者 ID 和自己相同的,才是自己的数据。;
  75. #if { "$id" != "" && "$id" != "$user[id]" } {
  76. #return;
  77. };
  78. #local needUpdate {};
  79. #local key {};
  80. #foreach {*gGMCP[Status][]} {key} {
  81. #local value {$gGMCP[Status][$key]};
  82. #local name {$gmcp-name-map[HP主要][$key]};
  83. #if { "$name" != "" } {
  84. #local hasHP1 {1};
  85. #if { "$name" == "当前%*" } {
  86. speedo.Set {$name} {$value} {true} {10};
  87. #local bakName {@str.Replace{$name;当前;上次}};
  88. #local pctName {@str.Replace{$name;当前%*;&1百分比}};
  89. #var char[HP][$bakName] {0};
  90. #var char[HP][$bakName] {$char[HP][$name]};
  91. #local needUpdate[$pctName] {true};
  92. };
  93. #elseif { "$name" == "有效{气血|精神}" } {
  94. #local health {@str.Replace{$name;有效%*;&1健康度}};
  95. #local needUpdate[$health] {true};
  96. };
  97. #elseif { "$name" == "最大{气血|精神|内力|精力}" } {
  98. #local pctName {@str.Replace{$name;最大%*;&1百分比}};
  99. #local needUpdate[$pctName] {true};
  100. #local health {@str.Replace{$name;最大%*;&1健康度}};
  101. #local needUpdate[$health] {true};
  102. };
  103. #else {
  104. #if { "$name" == "忙" } {
  105. #local busy {$value};
  106. };
  107. #elseif { "$name" == "战斗中" } {
  108. #local fight {$value};
  109. };
  110. };
  111. #var char[HP][$name] {$value};
  112. #continue;
  113. };
  114. #local name {$gmcp-name-map[HP次要][$key]};
  115. #if { "$name" != "" } {
  116. #local hasHP2 {1};
  117. #var char[HP][$name] {$value};
  118. #if { "$name" == "{经验|潜能}" } {
  119. speedo.Set {$name} {$value} {true} {600};
  120. };
  121. #elseif { "$name" == "{食物|饮水}" } {
  122. speedo.Set {$name} {$value} {true} {10};
  123. };
  124. #continue;
  125. };
  126. #local name {$gmcp-name-map[档案][$key]};
  127. #if { "$name" != "" } {
  128. #local hasScore {1};
  129. #if { "$name" == "{头衔|大名}" } {
  130. #var char[档案][彩色$name] {$value};
  131. #replace value {%+1..c} {};
  132. #var char[档案][$name] {$value};
  133. };
  134. #else {
  135. #var char[档案][$name] {$value};
  136. };
  137. #continue;
  138. };
  139. #local name {$gmcp-name-map[天赋][$key]};
  140. #if { "$name" != "" } {
  141. #local hasScore {1};
  142. #var char[档案][天赋][$name] {$value};
  143. #continue;
  144. };
  145. warnLog 未能识别的 GMCP 状态信息 $key => $value;
  146. };
  147. #if { $hasHP1 + $hasHP2 > 0 } {
  148. #foreach {*needUpdate[]} {key} {
  149. #if { "$key" == "%*百分比" } {
  150. #local current {@str.Replace{$key;%*百分比;当前&1}};
  151. #local maxName {@str.Replace{$key;%*百分比;最大&1}};
  152. #local scale {@if{"$key" == "{内力|精力}百分比";2;1}};
  153. #math char[HP][$key] { $char[HP][$current] * 100 / $char[HP][$maxName] / $scale };
  154. };
  155. #elseif { "$key" == "%*健康度" } {
  156. #local effName {@str.Replace{$key;%*健康度;有效&1}};
  157. #local maxName {@str.Replace{$key;%*健康度;最大&1}};
  158. #math char[HP][$key] { $char[HP][$effName] * 100 / $char[HP][$maxName] };
  159. };
  160. };
  161. #if { "$char.HPSummarize.Echo" == "自动" && $hasHP1 } {
  162. char.HPSummarize;
  163. };
  164. #elseif { "$char.HPSummarize.Echo" == "总是" } {
  165. char.HPSummarize;
  166. };
  167. event.Emit char/hpbrief;
  168. };
  169. #if { $hasScore } {event.Emit char/score};
  170. #if { "$busy" == "true" } {event.Emit char/busy};
  171. #elseif { "$busy" == "false" } {event.Emit char/nobusy};
  172. #if { "$fight" == "true" } {event.Emit char/fight};
  173. #elseif { "$fight" == "false" } {event.Emit char/nofight};
  174. };
  175. #action {^GMCP 频道收听汇总:$E} {
  176. #class gmcp-channel-status open;
  177. #action {^%*(%*) %s {🔔|🔕}$} {
  178. #local channel {%%2};
  179. #local status {true};
  180. #if { "%%4" == "🔕" } {
  181. #local status {false};
  182. };
  183. #var {gGMCP[Channels][$channel]} {$status};
  184. };
  185. #action {^你接收GMCP信息的格式为%*,你可以用tune gmcp <channel> on/off开关GMCP频道。$} {
  186. #class gmcp-channel-status kill;
  187. };
  188. #class gmcp-channel-status close;
  189. };
  190. #action {^你打开了GMCP:%*频道。$} {#var gGMCP[Channels][%1] {true}};
  191. #action {^你关闭了GMCP:%*频道。$} {#var gGMCP[Channels][%1] {false}};
  192. #action {^你的GMCP:%*频道已经是打开的。$} {#var gGMCP[Channels][%1] {true}};
  193. #action {^你的GMCP:%*频道已经是关闭的。$} {#var gGMCP[Channels][%1] {false}};