mm_os 3.3.1 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +498 -99
  3. package/README_EN.md +505 -0
  4. package/adapter/adapter.js +431 -0
  5. package/adapter/custom_persistence.js +660 -0
  6. package/adapter/mqtt.js +273 -0
  7. package/adapter/socket.js +113 -0
  8. package/adapter/web.js +67 -0
  9. package/adapter/websocket.js +146 -0
  10. package/com/api/com.json +5 -0
  11. package/{core/com → com}/api/config.tpl.json +8 -8
  12. package/com/api/drive.js +708 -0
  13. package/com/api/index.js +198 -0
  14. package/com/api/oauth.js +200 -0
  15. package/com/api/script.tpl.js +32 -0
  16. package/com/cmd/README.md +11 -0
  17. package/com/cmd/com.json +5 -0
  18. package/com/cmd/config.tpl.json +122 -0
  19. package/com/cmd/drive.js +1548 -0
  20. package/com/cmd/index.js +1066 -0
  21. package/com/cmd/msg.json +48 -0
  22. package/com/cmd/nlp.js +525 -0
  23. package/com/cmd/script.tpl.js +32 -0
  24. package/com/db/com.json +5 -0
  25. package/com/db/drive.js +1999 -0
  26. package/com/db/index.js +242 -0
  27. package/{core/com → com}/event/README.md +4 -4
  28. package/com/event/com.json +5 -0
  29. package/{core/com → com}/event/config.tpl.json +18 -18
  30. package/com/event/drive.js +59 -0
  31. package/com/event/index.js +409 -0
  32. package/com/event/script.tpl.js +23 -0
  33. package/com/mqtt/com.json +5 -0
  34. package/{core/com → com}/mqtt/config.tpl.json +3 -5
  35. package/com/mqtt/drive.js +676 -0
  36. package/com/mqtt/index.js +822 -0
  37. package/com/mqtt/mm_mqtt.js +425 -0
  38. package/com/mqtt/script.tpl.js +723 -0
  39. package/com/nav/com.json +5 -0
  40. package/com/nav/config.tpl.json +84 -0
  41. package/com/nav/drive.js +702 -0
  42. package/com/nav/index.js +231 -0
  43. package/{core/com → com}/nav/tpl/admin_pc/page_config.vue +280 -280
  44. package/{core/com → com}/nav/tpl/admin_pc/page_config_form.vue +194 -194
  45. package/com/nav/tpl/admin_pc/page_form.vue +180 -0
  46. package/com/nav/tpl/admin_pc/page_view.vue +124 -0
  47. package/com/nav/tpl/dev_pc/page_default.vue +247 -0
  48. package/com/nav/tpl/dev_pc/page_type.vue +313 -0
  49. package/com/nav/tpl/home_pc/page_default.vue +234 -0
  50. package/com/nav/tpl/home_pc/page_form.vue +137 -0
  51. package/com/nav/tpl/home_pc/page_list.vue +234 -0
  52. package/com/nav/tpl/home_pc/page_nav.vue +221 -0
  53. package/com/nav/tpl/home_pc/page_type.vue +234 -0
  54. package/com/nav/tpl/home_pc/page_view.vue +125 -0
  55. package/com/nav/tpl/home_phone/page_channel.vue +234 -0
  56. package/com/nav/tpl/home_phone/page_default.vue +234 -0
  57. package/com/nav/tpl/home_phone/page_form.vue +137 -0
  58. package/com/nav/tpl/home_phone/page_nav.vue +237 -0
  59. package/com/nav/tpl/home_phone/page_type.vue +234 -0
  60. package/com/nav/tpl/home_phone/page_view.vue +125 -0
  61. package/com/nav/viewmodel.js +446 -0
  62. package/com/param/com.json +5 -0
  63. package/{core/com → com}/param/config.tpl.json +7 -1
  64. package/com/param/drive.js +502 -0
  65. package/com/param/index.js +155 -0
  66. package/com/param/script.tpl.js +12 -0
  67. package/com/pendant/com.json +5 -0
  68. package/{core/com/component → com/pendant}/config.tpl.json +15 -13
  69. package/com/pendant/drive.js +204 -0
  70. package/com/pendant/index.js +441 -0
  71. package/com/pendant/pendant.html +16 -0
  72. package/com/pendant/script.tpl.js +18 -0
  73. package/com/socket/com.json +5 -0
  74. package/com/socket/config.tpl.json +12 -0
  75. package/com/socket/drive.js +651 -0
  76. package/com/socket/index.js +351 -0
  77. package/com/socket/script.tpl.js +41 -0
  78. package/com/sql/com.json +5 -0
  79. package/{core/com → com}/sql/config.tpl.json +13 -9
  80. package/com/sql/drive.js +1259 -0
  81. package/com/sql/index.js +150 -0
  82. package/com/sql/script.tpl.js +47 -0
  83. package/com/static/com.json +5 -0
  84. package/{core/com → com}/static/config.tpl.json +10 -6
  85. package/com/static/drive.js +194 -0
  86. package/com/static/index.js +226 -0
  87. package/com/static/script.tpl.js +28 -0
  88. package/com/task/com.json +5 -0
  89. package/{core/com → com}/task/config.tpl.json +4 -6
  90. package/com/task/drive.js +405 -0
  91. package/com/task/index.js +148 -0
  92. package/com/task/script.tpl.js +37 -0
  93. package/com/template/com.json +5 -0
  94. package/com/template/config.tpl.json +16 -0
  95. package/com/template/drive.js +80 -0
  96. package/com/template/index.js +141 -0
  97. package/com.js +156 -0
  98. package/common/README.md +2 -0
  99. package/common/handler/msg/handler.json +22 -0
  100. package/common/handler/msg/index.js +23 -0
  101. package/common/handler/player/handler.json +22 -0
  102. package/common/handler/player/index.js +287 -0
  103. package/common/handler/user/handler.json +22 -0
  104. package/common/handler/user/index.js +23 -0
  105. package/common/middleware/web_after/index.js +29 -0
  106. package/common/middleware/web_after/middleware.json +9 -0
  107. package/common/middleware/web_base/index.js +113 -0
  108. package/common/middleware/web_base/middleware.json +19 -0
  109. package/common/middleware/web_before/index.js +33 -0
  110. package/common/middleware/web_before/middleware.json +9 -0
  111. package/common/middleware/web_cors/index.js +87 -0
  112. package/common/middleware/web_cors/middleware.json +24 -0
  113. package/common/middleware/web_error/index.js +119 -0
  114. package/common/middleware/web_error/middleware.json +18 -0
  115. package/common/middleware/web_ip/index.js +15 -0
  116. package/common/middleware/web_ip/middleware.json +14 -0
  117. package/common/middleware/web_logger/index.js +156 -0
  118. package/common/middleware/web_logger/middleware.json +14 -0
  119. package/common/middleware/web_main/index.js +24 -0
  120. package/common/middleware/web_main/middleware.json +9 -0
  121. package/common/middleware/web_static/index.js +73 -0
  122. package/common/middleware/web_static/middleware.json +54 -0
  123. package/common/middleware/web_waf/index.js +385 -0
  124. package/common/middleware/web_waf/middleware.json +13 -0
  125. package/common/model/msg/index.js +88 -0
  126. package/common/model/msg/model.json +401 -0
  127. package/common/model/player/index.js +63 -0
  128. package/common/model/player/model.json +185 -0
  129. package/common/model/user/index.js +11 -0
  130. package/common/model/user/model.json +219 -0
  131. package/core/app/config.tpl.json +67 -0
  132. package/core/app/index.js +632 -0
  133. package/core/app/script.tpl.js +52 -0
  134. package/core/channel/index.js +899 -0
  135. package/core/channel/matcher.js +585 -0
  136. package/core/com/config.tpl.json +16 -0
  137. package/core/com/index.js +74 -0
  138. package/core/com/script.tpl.js +5 -0
  139. package/core/component/component.js +42 -0
  140. package/core/component/config.tpl.json +63 -0
  141. package/core/component/index.js +273 -0
  142. package/core/component/script.tpl.js +19 -0
  143. package/core/controller/config.tpl.json +14 -0
  144. package/core/controller/index.js +373 -0
  145. package/core/controller/script.tpl.js +27 -0
  146. package/core/factory/config.tpl.json +14 -0
  147. package/core/factory/entity.js +275 -0
  148. package/core/factory/index.js +241 -0
  149. package/core/factory/script.tpl.js +16 -0
  150. package/core/game/bat/index.js +137 -0
  151. package/core/game/bat/world.js +622 -0
  152. package/core/game/config.tpl.json +16 -0
  153. package/core/game/entity_admin.js +230 -0
  154. package/core/game/index.js +186 -0
  155. package/core/handler/config.tpl.json +22 -0
  156. package/core/handler/index.js +181 -0
  157. package/core/handler/script.tpl.js +23 -0
  158. package/core/logic/config.tpl.json +14 -0
  159. package/core/logic/index.js +59 -0
  160. package/core/logic/script.tpl.js +19 -0
  161. package/core/middleware/config.tpl.json +16 -0
  162. package/core/middleware/index.js +125 -0
  163. package/core/middleware/script.tpl.js +37 -0
  164. package/core/mod/config.tpl.json +22 -0
  165. package/core/mod/index.js +130 -0
  166. package/core/mod/script.tpl.js +34 -0
  167. package/core/model/config.tpl.json +219 -0
  168. package/core/model/index.js +272 -0
  169. package/core/model/model.js +27 -0
  170. package/core/model/script.tpl.js +20 -0
  171. package/core/notifier/config.tpl.json +14 -0
  172. package/core/notifier/index.js +77 -0
  173. package/core/notifier/script.tpl.js +20 -0
  174. package/core/plugin/config.tpl.json +24 -0
  175. package/core/plugin/index.js +232 -0
  176. package/core/plugin/script.tpl.js +51 -0
  177. package/core/pusher/config.tpl.json +14 -0
  178. package/core/pusher/index.js +161 -0
  179. package/core/pusher/script.tpl.js +20 -0
  180. package/core/room/bat/index.js +170 -0
  181. package/core/room/bat/room.js +524 -0
  182. package/core/room/config.tpl.json +20 -0
  183. package/core/room/index.js +249 -0
  184. package/core/room/room.js +61 -0
  185. package/core/scene/config.tpl.json +14 -0
  186. package/core/scene/index.js +466 -0
  187. package/core/scene/loop.js +1255 -0
  188. package/core/scene/map.js +28 -0
  189. package/core/scene/script.tpl.js +22 -0
  190. package/core/sender/config.tpl.json +14 -0
  191. package/core/sender/index.js +79 -0
  192. package/core/sender/script.tpl.js +20 -0
  193. package/core/service/config.tpl.json +14 -0
  194. package/core/service/index.js +100 -0
  195. package/core/service/script.tpl.js +25 -0
  196. package/core/store/config.tpl.json +26 -0
  197. package/core/store/index.js +1755 -0
  198. package/core/store/script.tpl.js +22 -0
  199. package/core/store/sql.js +1464 -0
  200. package/core/system/config.tpl.json +18 -0
  201. package/core/system/index.js +312 -0
  202. package/core/system/script.tpl.js +77 -0
  203. package/core/view/config.tpl.json +14 -0
  204. package/core/view/index.js +91 -0
  205. package/core/view/script.tpl.js +20 -0
  206. package/core/zone/bat/index.js +725 -0
  207. package/core/zone/config.tpl.json +54 -0
  208. package/core/zone/index.js +614 -0
  209. package/core/zone/script.tpl.js +10 -0
  210. package/core/zone/zone_bat.js +136 -0
  211. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +24 -0
  212. package/index.js +17 -333
  213. package/os.js +57 -0
  214. package/package.json +65 -55
  215. package/server.js +598 -0
  216. package/README.en.md +0 -36
  217. package/conf.json +0 -3
  218. package/core/base/mqtt/index.js +0 -1110
  219. package/core/base/mqtt/lib.js +0 -40
  220. package/core/base/web/index.js +0 -245
  221. package/core/com/api/com.json +0 -4
  222. package/core/com/api/drive.js +0 -668
  223. package/core/com/api/index.js +0 -108
  224. package/core/com/api/oauth.js +0 -158
  225. package/core/com/api/script.js +0 -32
  226. package/core/com/app/README.md +0 -3
  227. package/core/com/app/com.json +0 -4
  228. package/core/com/app/config.tpl.json +0 -16
  229. package/core/com/app/drive.js +0 -309
  230. package/core/com/app/index.js +0 -211
  231. package/core/com/app/script.js +0 -155
  232. package/core/com/cmd/com.json +0 -4
  233. package/core/com/cmd/config.tpl.json +0 -66
  234. package/core/com/cmd/drive.js +0 -513
  235. package/core/com/cmd/index.js +0 -354
  236. package/core/com/cmd/old/5w2h.js +0 -54
  237. package/core/com/cmd/old/drive.js +0 -423
  238. package/core/com/cmd/script.js +0 -11
  239. package/core/com/component/README.md +0 -3
  240. package/core/com/component/com.json +0 -4
  241. package/core/com/component/component.html +0 -16
  242. package/core/com/component/drive.js +0 -197
  243. package/core/com/component/index.js +0 -312
  244. package/core/com/component/script.js +0 -18
  245. package/core/com/db/com.json +0 -4
  246. package/core/com/db/drive.js +0 -1160
  247. package/core/com/db/index.js +0 -176
  248. package/core/com/event/com.json +0 -4
  249. package/core/com/event/drive.js +0 -133
  250. package/core/com/event/index.js +0 -345
  251. package/core/com/event/script.js +0 -26
  252. package/core/com/eventer/com.js +0 -477
  253. package/core/com/eventer/com.json +0 -4
  254. package/core/com/middleware/com.js +0 -154
  255. package/core/com/middleware/com.json +0 -4
  256. package/core/com/middleware/config.tpl.json +0 -8
  257. package/core/com/middleware/script.js +0 -9
  258. package/core/com/mqtt/com.json +0 -4
  259. package/core/com/mqtt/drive.js +0 -600
  260. package/core/com/mqtt/index.js +0 -572
  261. package/core/com/mqtt/mm_mqtt.js +0 -330
  262. package/core/com/mqtt/script.js +0 -604
  263. package/core/com/msg/com.js +0 -296
  264. package/core/com/msg/com.json +0 -4
  265. package/core/com/nav/com.json +0 -4
  266. package/core/com/nav/config.tpl.json +0 -75
  267. package/core/com/nav/drive.js +0 -549
  268. package/core/com/nav/index.js +0 -182
  269. package/core/com/nav/tpl/admin_pc/page_form.vue +0 -180
  270. package/core/com/nav/tpl/admin_pc/page_view.vue +0 -124
  271. package/core/com/nav/tpl/dev_pc/page_default.vue +0 -247
  272. package/core/com/nav/tpl/dev_pc/page_type.vue +0 -313
  273. package/core/com/nav/tpl/home_pc/page_default.vue +0 -234
  274. package/core/com/nav/tpl/home_pc/page_form.vue +0 -137
  275. package/core/com/nav/tpl/home_pc/page_list.vue +0 -234
  276. package/core/com/nav/tpl/home_pc/page_nav.vue +0 -221
  277. package/core/com/nav/tpl/home_pc/page_type.vue +0 -234
  278. package/core/com/nav/tpl/home_pc/page_view.vue +0 -125
  279. package/core/com/nav/tpl/home_phone/page_channel.vue +0 -234
  280. package/core/com/nav/tpl/home_phone/page_default.vue +0 -234
  281. package/core/com/nav/tpl/home_phone/page_form.vue +0 -137
  282. package/core/com/nav/tpl/home_phone/page_nav.vue +0 -237
  283. package/core/com/nav/tpl/home_phone/page_type.vue +0 -234
  284. package/core/com/nav/tpl/home_phone/page_view.vue +0 -125
  285. package/core/com/nav/viewmodel.js +0 -296
  286. package/core/com/param/drive.js +0 -366
  287. package/core/com/param/index.js +0 -80
  288. package/core/com/param/script.js +0 -12
  289. package/core/com/param/test.js +0 -98
  290. package/core/com/plugin/README.md +0 -3
  291. package/core/com/plugin/com.json +0 -4
  292. package/core/com/plugin/config.tpl.json +0 -26
  293. package/core/com/plugin/drive.js +0 -536
  294. package/core/com/plugin/index.js +0 -259
  295. package/core/com/plugin/script.js +0 -213
  296. package/core/com/rpc/com.json +0 -4
  297. package/core/com/rpc/drive.js +0 -160
  298. package/core/com/rpc/index.js +0 -87
  299. package/core/com/rpc/rpc.js +0 -118
  300. package/core/com/socket/com.json +0 -4
  301. package/core/com/socket/config.tpl.json +0 -14
  302. package/core/com/socket/drive.js +0 -403
  303. package/core/com/socket/index.js +0 -62
  304. package/core/com/socket/script.js +0 -42
  305. package/core/com/sql/drive.js +0 -1087
  306. package/core/com/sql/index.js +0 -83
  307. package/core/com/sql/script.js +0 -48
  308. package/core/com/static/com.json +0 -4
  309. package/core/com/static/drive.js +0 -220
  310. package/core/com/static/index.js +0 -149
  311. package/core/com/static/script.js +0 -28
  312. package/core/com/task/com.json +0 -4
  313. package/core/com/task/drive.js +0 -403
  314. package/core/com/task/index.js +0 -110
  315. package/core/com/task/script.js +0 -37
  316. package/core/com/timer/com.js +0 -217
  317. package/core/com/timer/com.json +0 -4
  318. package/core/com/tpl/com.js +0 -19
  319. package/core/com/tpl/com.json +0 -4
  320. package/lib/actions.js +0 -50
  321. package/lib/base.js +0 -361
  322. package/lib/com.js +0 -29
  323. package/lib/ref.js +0 -121
  324. package/middleware/cors/index.js +0 -119
  325. package/middleware/cors/middleware.json +0 -20
  326. package/middleware/csrf/index.js +0 -202
  327. package/middleware/csrf/middleware.json +0 -24
  328. package/middleware/ip_firewall/index.js +0 -476
  329. package/middleware/ip_firewall/middleware.json +0 -109
  330. package/middleware/mqtt_base/index.js +0 -10
  331. package/middleware/mqtt_base/middleware.json +0 -11
  332. package/middleware/security_audit/index.js +0 -543
  333. package/middleware/security_audit/middleware.json +0 -48
  334. package/middleware/waf/index.js +0 -343
  335. package/middleware/waf/middleware.json +0 -10
  336. package/middleware/waf_ddos/index.js +0 -520
  337. package/middleware/waf_ddos/middleware.json +0 -38
  338. package/middleware/waf_xss/index.js +0 -269
  339. package/middleware/waf_xss/middleware.json +0 -18
  340. package/middleware/web_after/index.js +0 -33
  341. package/middleware/web_after/middleware.json +0 -10
  342. package/middleware/web_base/index.js +0 -90
  343. package/middleware/web_base/middleware.json +0 -10
  344. package/middleware/web_before/index.js +0 -27
  345. package/middleware/web_before/middleware.json +0 -10
  346. package/middleware/web_check/index.js +0 -28
  347. package/middleware/web_check/middleware.json +0 -10
  348. package/middleware/web_main/index.js +0 -28
  349. package/middleware/web_main/middleware.json +0 -10
  350. package/middleware/web_proxy/index.js +0 -37
  351. package/middleware/web_proxy/middleware.json +0 -10
  352. package/middleware/web_render/index.js +0 -87
  353. package/middleware/web_render/middleware.json +0 -10
  354. package/middleware/web_socket/index.js +0 -34
  355. package/middleware/web_socket/middleware.json +0 -10
  356. package/middleware/web_static/index.js +0 -115
  357. package/middleware/web_static/middleware.json +0 -10
  358. /package/{core/com → com}/api/README.md +0 -0
  359. /package/{core/com → com}/db/README.md +0 -0
  360. /package/{core/com → com}/mqtt/README.md +0 -0
  361. /package/{core/com → com}/nav/README.md +0 -0
  362. /package/{core/com → com}/nav/tpl/admin_pc/page_channel.vue +0 -0
  363. /package/{core/com → com}/nav/tpl/admin_pc/page_default.vue +0 -0
  364. /package/{core/com → com}/nav/tpl/admin_pc/page_lang.vue +0 -0
  365. /package/{core/com → com}/nav/tpl/admin_pc/page_nav.vue +0 -0
  366. /package/{core/com → com}/nav/tpl/admin_pc/page_table.vue +0 -0
  367. /package/{core/com → com}/nav/tpl/admin_pc/page_type.vue +0 -0
  368. /package/{core/com → com}/nav/tpl/dev_pc/page_channel.vue +0 -0
  369. /package/{core/com → com}/nav/tpl/dev_pc/page_config.vue +0 -0
  370. /package/{core/com → com}/nav/tpl/dev_pc/page_form.vue +0 -0
  371. /package/{core/com → com}/nav/tpl/dev_pc/page_nav.vue +0 -0
  372. /package/{core/com → com}/nav/tpl/dev_pc/page_table.vue +0 -0
  373. /package/{core/com → com}/nav/tpl/home_pc/page_channel.vue +0 -0
  374. /package/{core/com → com}/nav/tpl/home_phone/page_list.vue +0 -0
  375. /package/{core/com → com}/param/README.md +0 -0
  376. /package/{core/com/cmd → com/pendant}/README.md +0 -0
  377. /package/{core/com → com}/socket/README.md +0 -0
  378. /package/{core/com → com}/sql/README.md +0 -0
  379. /package/{core/com → com}/static/README.md +0 -0
  380. /package/{core/com → com}/task/README.md +0 -0
@@ -0,0 +1,54 @@
1
+ {
2
+ // 区域名称
3
+ "name": "${name || 'zone'}",
4
+ // 区域标题
5
+ "title": "${title || '枫叶区'}",
6
+ // 区域描述
7
+ "description": "${description || '枫叶区是一个区域'}",
8
+ // 区域主脚本 - 可自定义区域初始化,一般情况不需要定义
9
+ "main": "${main || ''}",
10
+ // 区域状态 - 1 正常 0 禁用
11
+ "state": 1,
12
+ // 区域排序 - 数字越小越靠前
13
+ "sort": 100,
14
+ // 区域等级要求 - 0 表示无等级要求
15
+ "level": 0,
16
+ // 频道数
17
+ "channels": 20,
18
+ // 自定义数据库 - 1 开启 0 关闭
19
+ "diy_db": 0,
20
+ // 自定义缓存 - 1 开启 0 关闭
21
+ "diy_cache": 0,
22
+ // sql 配置 - 可以没有,没有则使用默认数据库
23
+ "db": {
24
+ // 数据库方式
25
+ "way": "mysql",
26
+ "mysql": {
27
+ // 数据库主机
28
+ "host": "127.0.0.1",
29
+ // 数据库端口
30
+ "port": 3306,
31
+ // 数据库用户名
32
+ "username": "root",
33
+ // 数据库密码
34
+ "password": "Asd159357",
35
+ // 数据库名称
36
+ "database": "mos"
37
+ }
38
+ },
39
+ // 缓存配置 - 可以没有,没有则使用默认缓存
40
+ "cache": {
41
+ // 缓存方式方式
42
+ "way": "redis",
43
+ "redis": {
44
+ // 缓存主机
45
+ "host": "127.0.0.1",
46
+ // 缓存端口
47
+ "port": 6379,
48
+ // 缓存密码
49
+ "password": "asd159357",
50
+ // 缓存数据库
51
+ "database": 0
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,614 @@
1
+ const {
2
+ cacheAdmin
3
+ } = require('mm_cache');
4
+ const {
5
+ sqlAdmin
6
+ } = require('mm_sql');
7
+ const {
8
+ Drive,
9
+ Manager
10
+ } = require('mm_machine');
11
+ const {
12
+ Channel
13
+ } = require('../channel/index.js');
14
+ const {
15
+ Room
16
+ } = require('../room/index.js');
17
+ const {
18
+ World
19
+ } = require('../world/index.js');
20
+
21
+ /**
22
+ * 游戏分区
23
+ */
24
+ class Zone extends Drive {
25
+ static config = {
26
+ // 区域名称
27
+ 'name': 'default',
28
+ // 区域标题
29
+ 'title': '枫叶区',
30
+ // 区域描述
31
+ 'description': '枫叶区是一个区域',
32
+ // 区域主脚本 - 可自定义区域初始化,一般情况不需要定义
33
+ 'main': '',
34
+ // 应用域
35
+ 'scope': '',
36
+ // 区域状态 - 1 正常 0 禁用
37
+ 'state': 1,
38
+ // 区域排序 - 数字越小越靠前
39
+ 'sort': 100,
40
+ // 相关数据表
41
+ 'table': {
42
+ // 玩家表名
43
+ 'player': 'game_player'
44
+ },
45
+ // 频道数
46
+ 'channels': 20,
47
+ // 自定义数据库 - 1 开启 0 关闭
48
+ 'diy_sql': 0,
49
+ // 自定义缓存 - 1 开启 0 关闭
50
+ 'diy_cache': 0,
51
+ // sql 配置 - 可以没有,没有则使用默认数据库
52
+ 'sql': {
53
+ // 数据库方式
54
+ 'way': 'mysql',
55
+ // 数据库主机
56
+ 'host': '127.0.0.1',
57
+ // 数据库端口
58
+ 'port': 3306,
59
+ // 数据库用户名
60
+ 'username': 'root',
61
+ // 数据库密码
62
+ 'password': 'Asd159357',
63
+ // 数据库名称
64
+ 'database': 'mos'
65
+ },
66
+ // 缓存配置 - 可以没有,没有则使用默认缓存
67
+ 'cache': {
68
+ // 缓存方式方式
69
+ 'way': 'redis',
70
+ // 缓存主机
71
+ 'host': '127.0.0.1',
72
+ // 缓存端口
73
+ 'port': 6379,
74
+ // 缓存密码
75
+ 'password': 'asd159357',
76
+ // 缓存数据库
77
+ 'database': 0
78
+ }
79
+ };
80
+
81
+ /**
82
+ * 构造函数
83
+ * @param {object} config 配置参数
84
+ * @param {string} config.name 区域名称
85
+ * @param {string} config.title 区域标题
86
+ * @param {string} config.description 区域描述
87
+ * @param {string} config.main 区域主脚本
88
+ * @param {string} config.scope 应用域
89
+ * @param {number} config.state 区域状态
90
+ * @param {number} config.sort 区域排序
91
+ * @param {object} config.table 相关数据表
92
+ * @param {number} config.channels 频道数
93
+ * @param {number} config.diy_sql 自定义数据库
94
+ * @param {number} config.diy_cache 自定义缓存
95
+ * @param {object} config.sql sql 配置
96
+ * @param {object} config.cache 缓存配置
97
+ */
98
+ constructor(config, parent) {
99
+ super({ ...Zone.config, ...config }, parent);
100
+
101
+ this.manager = {};
102
+ // 游戏频道集合
103
+ this.channel = {};
104
+ // 游戏房间集合
105
+ this.room = {};
106
+ // 游戏世界集合
107
+ this.world = {};
108
+
109
+ // 玩家对象集合 - 分区统一管理所有玩家
110
+ this.players = new Map();
111
+ }
112
+ }
113
+
114
+ /**
115
+ * 预设
116
+ */
117
+ Zone.prototype._preset = function () {
118
+ // 分区专用数据库
119
+ this.sql = null;
120
+ // 分区专用缓存
121
+ this.cache = null;
122
+ };
123
+
124
+ /**
125
+ * 获取模板目录
126
+ * @returns {string} 模板目录
127
+ */
128
+ Zone.prototype.getTplDir = function () {
129
+ return __dirname;
130
+ };
131
+
132
+ /**
133
+ * 初始化核心
134
+ * @param {object} server 服务器实例
135
+ * @param {object} eventer 事件总线
136
+ * @param {object} logger 日志管理器
137
+ * @private
138
+ */
139
+ Zone.prototype._initCore = async function (server, eventer, logger) {
140
+ // 初始化依赖项
141
+ if (logger) {
142
+ this.setLogger(logger);
143
+ }
144
+ if (eventer) {
145
+ this.getEventer = function () {
146
+ return eventer;
147
+ };
148
+ }
149
+ if (server) {
150
+ this.getServer = function () {
151
+ return server;
152
+ };
153
+ }
154
+ // 初始化基础组件
155
+ await this._initBase();
156
+ // 初始化管理器
157
+ await this._initManager();
158
+ // 加载资源
159
+ await this._loadSources();
160
+ // 初始化资源
161
+ await this._initSources();
162
+ };
163
+
164
+ /**
165
+ * 初始化基础组件
166
+ * @private
167
+ */
168
+ Zone.prototype._initBase = async function () {
169
+ // 初始化数据库
170
+ if (this.config.diy_sql) {
171
+ this.sql = sqlAdmin(this.config.name, this.config.sql);
172
+ await this.sql.open();
173
+ }
174
+ else {
175
+ this.sql = this.getServer().sql;
176
+ }
177
+
178
+ // 初始化缓存
179
+ if (this.config.diy_cache) {
180
+ this.cache = cacheAdmin(this.config.name, this.config.cache);
181
+ await this.cache.connect();
182
+ }
183
+ else {
184
+ this.cache = this.getServer().cache;
185
+ }
186
+ };
187
+
188
+ /**
189
+ * 创建管理器实例
190
+ * @param {string} name 管理器名称
191
+ * @param {string} title 管理器标题
192
+ * @param {Function} cls 管理器类
193
+ * @returns {object} 管理器实例
194
+ */
195
+ Zone.prototype._createManager = function (name, title, cls) {
196
+ let dir = this._getDir();
197
+ var manager = new Manager({
198
+ name: name,
199
+ title: title,
200
+ filename: name + '.json',
201
+ tpl_dir: `../${name}/`.fullname(__dirname),
202
+ base_dir: '',
203
+ dir: `./${name}`.fullname(dir)
204
+ }, this, this[name], cls);
205
+ this.manager[name] = manager;
206
+ return manager;
207
+ };
208
+
209
+ /**
210
+ * 初始化管理器集合
211
+ * @returns {Promise<void>} 初始化完成
212
+ */
213
+ Zone.prototype._initManager = async function () {
214
+ // 管理器配置列表
215
+ var mgr_configs = [
216
+ { name: 'channel', title: '频道', Module: Channel },
217
+ { name: 'room', title: '房间', Module: Room },
218
+ { name: 'world', title: '世界', Module: World }
219
+ ];
220
+
221
+ // 管理器实例集合
222
+ var managers = [];
223
+
224
+ // 使用for循环初始化所有管理器
225
+ for (var i = 0; i < mgr_configs.length; i++) {
226
+ var config = mgr_configs[i];
227
+ var manager = this._createManager(config.name, config.title, config.Module);
228
+ managers.push(manager);
229
+ }
230
+
231
+ // 并行执行所有管理器的初始化操作
232
+ var promises = [];
233
+ for (var j = 0; j < managers.length; j++) {
234
+ promises.push(managers[j].do('init'));
235
+ }
236
+
237
+ await Promise.all(promises);
238
+ };
239
+
240
+ /**
241
+ * 加载资源
242
+ * @returns {Promise<void>} 加载完成
243
+ */
244
+ Zone.prototype._loadSources = async function () {
245
+ // 加载无需依赖关系,所以可以同时加载,内部并行执行
246
+ let loadPromises = [
247
+ this.manager.channel.runAll('load'),
248
+ this.manager.room.runAll('load'),
249
+ this.manager.world.runAll('load')
250
+ ];
251
+ await Promise.all(loadPromises);
252
+ };
253
+
254
+ /**
255
+ * 初始化资源
256
+ * @returns {Promise<void>} 初始化完成
257
+ */
258
+ Zone.prototype._initSources = async function () {
259
+ // 初始化顺序 world -> channel -> room,需要依赖,所以根据依赖关系自下而上初始化,内部并行执行
260
+ await this.manager.world.runAll('init', this, this.getEventer(), this.getLogger());
261
+ await this.manager.channel.runAll('init', this, this.getEventer(), this.getLogger());
262
+ await this.manager.room.runAll('init', this, this.getEventer(), this.getLogger());
263
+ };
264
+
265
+ /**
266
+ * 启动资源
267
+ */
268
+ App.prototype._startSources = async function () {
269
+ // 启动无顺序的管理器(保持并行执行)
270
+ let promises = [
271
+ this.manager.channel.runAll('start'),
272
+ this.manager.room.runAll('start'),
273
+ this.manager.world.runAll('start')
274
+ ];
275
+
276
+ // 等待其他管理器启动完成
277
+ await Promise.all(promises);
278
+ };
279
+
280
+ /**
281
+ * 启动核心
282
+ * @private
283
+ */
284
+ Zone.prototype._startCore = async function () {
285
+ // 加载所有登录玩家
286
+ await this._loadPlayers();
287
+
288
+ // 启动资源
289
+ await this._startSources();
290
+ };
291
+
292
+ /**
293
+ * 获取玩家对象
294
+ * @param {string} player_id 玩家ID
295
+ * @returns {object} 玩家对象
296
+ */
297
+ Zone.prototype.getPlayer = function (player_id) {
298
+ // 参数校验
299
+ if (!player_id || typeof player_id !== 'string') {
300
+ throw new TypeError('玩家ID必须是有效字符串');
301
+ }
302
+
303
+ var player = this.players.get(player_id);
304
+ if (!player) {
305
+ throw new Error(`玩家 ${player_id} 不存在`);
306
+ }
307
+
308
+ return player;
309
+ };
310
+
311
+ /**
312
+ * 从分区移除玩家
313
+ * @param {string} player_id 玩家ID
314
+ * @returns {boolean} 是否移除成功
315
+ */
316
+ Zone.prototype.delPlayer = function (player_id) {
317
+ // 参数校验
318
+ if (!player_id || typeof player_id !== 'string') {
319
+ throw new TypeError('玩家ID必须是有效字符串');
320
+ }
321
+
322
+ var player = this.players.get(player_id);
323
+ if (!player) {
324
+ throw new Error('玩家不在分区中');
325
+ }
326
+
327
+ // 如果玩家在某个频道中,先退出频道
328
+ if (player.channel_id && this.channel.get(player.channel_id)) {
329
+ this.channel.get(player.channel_id).leave(player_id);
330
+ }
331
+
332
+ // 从分区移除玩家
333
+ this.players.delete(player_id);
334
+
335
+ // 触发玩家离开分区事件
336
+ this.emitEvent('player_leave_zone', {
337
+ player_id: player_id,
338
+ zone_name: this.config.name,
339
+ timestamp: Date.now()
340
+ });
341
+
342
+ return true;
343
+ };
344
+
345
+ /**
346
+ * 加载所有登录玩家
347
+ */
348
+ Zone.prototype._loadPlayers = async function () {
349
+ var players = await this.emitWait('load_players', {
350
+ zone_name: this.config.name,
351
+ zone: this
352
+ });
353
+ if (players && players.length > 0) {
354
+ for (var i = 0; i < players.length; i++) {
355
+ var info = players[i];
356
+ var player = this._model.player.create(info);
357
+ this.players.set(player.player_id, player);
358
+ }
359
+ }
360
+ };
361
+
362
+ /**
363
+ * 保存所有玩家数据
364
+ * @returns {Promise<object>} 保存结果
365
+ */
366
+ Zone.prototype._savePlayers = async function () {
367
+ var all_players = Array.from(this.players.values());
368
+ if (all_players.length === 0) {
369
+ return { count: 0, success: true };
370
+ }
371
+ await this.emitWait('save_players', {
372
+ zone_name: this.config.name,
373
+ zone: this,
374
+ players: all_players
375
+ });
376
+ this.log('info', `保存所有玩家数据 ${all_players.length} 个`);
377
+ return { count: all_players.length, success: true };
378
+ };
379
+
380
+ /**
381
+ * 保存脏数据玩家
382
+ * @returns {Promise<object>} 保存结果
383
+ */
384
+ Zone.prototype._saveDirtyPlayers = async function () {
385
+ var dirty_players = [];
386
+ for (var player of this.players.values()) {
387
+ if (player.isDirty && player.isDirty()) {
388
+ dirty_players.push(player);
389
+ }
390
+ }
391
+ if (dirty_players.length === 0) {
392
+ return { count: 0, success: true };
393
+ }
394
+ await this.emitWait('save_players', {
395
+ zone_name: this.config.name,
396
+ zone: this,
397
+ players: dirty_players
398
+ });
399
+ for (var i = 0; i < dirty_players.length; i++) {
400
+ dirty_players[i].isDirty(false);
401
+ }
402
+ this.log('debug', `保存脏数据玩家 ${dirty_players.length} 个`);
403
+ return { count: dirty_players.length, success: true };
404
+ };
405
+
406
+ /**
407
+ * 全分区数据发送
408
+ * @param {object} data 发送数据
409
+ * @param {string} msg_type 消息类型
410
+ * @param {string} msg_group 消息范围
411
+ * @param {string} sender_id 发送者ID
412
+ * @returns {object} 发送结果
413
+ */
414
+ Zone.prototype.sendData = async function (data, msg_type = 'system', msg_group = 'world', sender_id = 'system') {
415
+ // 参数校验
416
+ if (!data || typeof data !== 'object') {
417
+ throw new TypeError('发送数据必须是有效对象');
418
+ }
419
+
420
+ // 创建发送对象
421
+ var msg = {
422
+ data: data,
423
+ msg_type: msg_type,
424
+ msg_group: msg_group,
425
+ sender_id: sender_id,
426
+ timestamp: Date.now(),
427
+ zone_name: this.config.name,
428
+ msg_id: this._generateMsgId()
429
+ };
430
+
431
+ // 触发全分区数据发送事件,由业务层处理具体的发送逻辑
432
+ this.emitEvent('zone_data_send', {
433
+ ...msg,
434
+ players: this.players.size
435
+ });
436
+
437
+ this.log('debug', `全分区数据发送事件已触发: 玩家数 ${this.players.size}`);
438
+
439
+ // 返回默认结果
440
+ return {
441
+ players: this.players.size,
442
+ success_count: 0,
443
+ fail_count: 0,
444
+ failed_players: []
445
+ };
446
+ };
447
+
448
+ /**
449
+ * 向指定玩家发送数据
450
+ * @param {string} player_id 玩家ID
451
+ * @param {object} data 发送数据
452
+ * @param {string} msg_type 消息类型
453
+ * @param {string} msg_group 消息范围
454
+ * @param {string} sender_id 发送者ID
455
+ * @returns {boolean} 是否发送成功
456
+ */
457
+ Zone.prototype.sendToPlayer = async function (player_id, data, msg_type = 'text', msg_group = 'private', sender_id = 'system') {
458
+ // 参数校验
459
+ if (!player_id || typeof player_id !== 'string') {
460
+ throw new TypeError('玩家ID必须是有效字符串');
461
+ }
462
+
463
+ if (!data || typeof data !== 'object') {
464
+ throw new TypeError('发送数据必须是有效对象');
465
+ }
466
+
467
+ try {
468
+ // 获取玩家对象
469
+ var player = this.getPlayer(player_id);
470
+ if (!player) {
471
+ throw new Error(`玩家 ${player_id} 不存在`);
472
+ }
473
+
474
+ // 触发私聊数据发送事件,由业务层处理具体的发送逻辑
475
+ this.emitEvent('private_send', {
476
+ data: data,
477
+ msg_type: msg_type,
478
+ msg_group: msg_group,
479
+ sender_id: sender_id,
480
+ timestamp: Date.now(),
481
+ player_id: player_id,
482
+ zone_name: this.config.name,
483
+ msg_id: this._generateMsgId()
484
+ });
485
+
486
+ return true;
487
+ } catch (error) {
488
+ this.log('error', `向玩家 ${player_id} 发送数据失败: `, error);
489
+ throw error;
490
+ }
491
+ };
492
+
493
+ /**
494
+ * 条件数据发送
495
+ * @param {Function} func 筛选函数
496
+ * @param {object} data 发送数据
497
+ * @param {string} msg_type 消息类型
498
+ * @param {string} msg_group 消息范围
499
+ * @param {string} sender_id 发送者ID
500
+ * @returns {object} 发送结果
501
+ */
502
+ Zone.prototype.sendWithCondition = async function (func, data, msg_type = 'system', msg_group = 'world', sender_id = 'system') {
503
+ // 参数校验
504
+ if (typeof func !== 'function') {
505
+ throw new TypeError('筛选函数必须是有效函数');
506
+ }
507
+
508
+ if (!data || typeof data !== 'object') {
509
+ throw new TypeError('发送数据必须是有效对象');
510
+ }
511
+
512
+ try {
513
+ // 触发条件数据发送事件,由业务层处理具体的发送逻辑
514
+ this.emitEvent('conditional_send', {
515
+ data: data,
516
+ msg_type: msg_type,
517
+ msg_group: msg_group,
518
+ sender_id: sender_id,
519
+ timestamp: Date.now(),
520
+ zone_name: this.config.name,
521
+ msg_id: this._generateMsgId(),
522
+ condition: func.toString(),
523
+ players: this.players.size
524
+ });
525
+
526
+ // 返回默认结果
527
+ return {
528
+ players: this.players.size,
529
+ filtered_players: 0,
530
+ success_count: 0,
531
+ fail_count: 0,
532
+ failed_players: []
533
+ };
534
+ } catch (error) {
535
+ this.log('error', `条件数据发送失败: `, error);
536
+ throw error;
537
+ }
538
+ };
539
+
540
+ /**
541
+ * 获取分区统计信息
542
+ * @returns {object} 分区统计信息
543
+ */
544
+ Zone.prototype.getStats = function () {
545
+ var channel_stats = {};
546
+ var players = 0;
547
+
548
+ // 统计各频道玩家数量
549
+ for (var channel_id in this.channel) {
550
+ if (this.channel[channel_id] && this.channel[channel_id].getStats) {
551
+ var stats = this.channel[channel_id].getStats();
552
+ channel_stats[channel_id] = stats;
553
+ players += stats.player || 0;
554
+ }
555
+ }
556
+
557
+ return {
558
+ zone_name: this.config.name,
559
+ players: this.players.size,
560
+ online: players,
561
+ channels: this.channel.size,
562
+ channel_stats: channel_stats,
563
+ current_time: Date.now()
564
+ };
565
+ };
566
+
567
+ /**
568
+ * 添加玩家到分区
569
+ * @param {object} player 玩家对象
570
+ * @returns {object} 玩家对象
571
+ */
572
+ Zone.prototype.addPlayer = function (player) {
573
+ this.players.set(player.player_id, player);
574
+ // 触发玩家加入分区事件
575
+ this.emitEvent('player_enter_zone', {
576
+ player_id: player.player_id,
577
+ zone_name: this.config.name,
578
+ timestamp: Date.now()
579
+ });
580
+ return player;
581
+ };
582
+
583
+ /**
584
+ * 获取频道对象
585
+ * @param {string} channel_id 频道ID
586
+ * @returns {object} 频道对象
587
+ */
588
+ Zone.prototype.getChannel = function (channel_id) {
589
+ return this.channel.get(channel_id);
590
+ };
591
+
592
+ /**
593
+ * 获取玩家所在频道
594
+ * @param {string} player_id 玩家ID
595
+ * @returns {object} 频道对象
596
+ */
597
+ Zone.prototype.getChannelByPlayerId = function (player_id) {
598
+ var player = this.players.get(player_id);
599
+ if (player) {
600
+ return this.channel.get(player.channel_id);
601
+ }
602
+ return null;
603
+ };
604
+
605
+ /**
606
+ * 销毁分区
607
+ * @returns {Promise<void>}
608
+ */
609
+ Zone.prototype._destroy = async function () {
610
+ await this._savePlayers();
611
+ this.players.clear();
612
+ };
613
+
614
+ exports.Zone = Zone;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Zone 区域脚本 - 可自定义区域初始化
3
+ */
4
+ module.exports = {
5
+ /**
6
+ * 区域初始化
7
+ */
8
+ async _init() {
9
+ }
10
+ };