mbler 0.1.1 → 0.1.3-alpha
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.
- package/LICENSE +21 -0
- package/README.md +28 -0
- package/lib/build/base.js +297 -1
- package/lib/build/build-g-config.json +11 -11
- package/lib/build/getModule.js +182 -1
- package/lib/build/index.js +370 -1
- package/lib/build/manifest.build.js +103 -1
- package/lib/build/mcVersion.js +86 -1
- package/lib/build/utils.js +6 -1
- package/lib/code-processor/c-handler-export.js +12 -1
- package/lib/code-processor/index.js +141 -1
- package/lib/code-processor/mtreehandler.js +164 -1
- package/lib/commander/index.js +154 -1
- package/lib/data/includes.json +12 -12
- package/lib/git/clone.js +28 -1
- package/lib/git/index.js +12 -1
- package/lib/git/pull.js +100 -1
- package/lib/lang/__translate.js +93 -1
- package/lib/lang/en.js +128 -1
- package/lib/lang/index.js +78 -1
- package/lib/lang/zh.js +146 -1
- package/lib/loger/colors.js +13 -1
- package/lib/loger/index.js +136 -1
- package/lib/mcx/ast/index.js +11 -1
- package/lib/mcx/ast/prop.js +78 -1
- package/lib/mcx/ast/tag.js +246 -1
- package/lib/mcx/compile-component/lib.js +106 -1
- package/lib/mcx/compile-component/types.js +2 -1
- package/lib/mcx/compile-component/utils.js +26 -1
- package/lib/mcx/compile-mcx/_compile.js +1 -1
- package/lib/mcx/compile-mcx/compile.js +34 -1
- package/lib/mcx/compile-mcx/context.js +19 -1
- package/lib/mcx/compile-mcx/index.js +10 -1
- package/lib/mcx/compile-mcx/mcx/index.js +2 -1
- package/lib/mcx/compile-mcx/mcx/types.js +2 -1
- package/lib/mcx/compile-mcx/template/module.js +42 -1
- package/lib/mcx/compile-mcx/types.js +2 -1
- package/lib/mcx/compile-mcx/utils.node.js +207 -1
- package/lib/mcx/index.js +13 -1
- package/lib/mcx/test/index.js +7 -1
- package/lib/mcx/test.js +21 -1
- package/lib/mcx/types.js +2 -1
- package/lib/mcx/utils.js +86 -1
- package/lib/module-handler/index.js +482 -1
- package/lib/modules/create-game/src/Runner/RunnerManager.js +113 -1
- package/lib/modules/create-game/src/Runner/scriptRunner.js +70 -1
- package/lib/modules/create-game/src/config.js +27 -1
- package/lib/modules/create-game/src/constants.js +19 -1
- package/lib/modules/create-game/src/createGameModule.js +24 -1
- package/lib/modules/create-game/src/gameComponent/common/autoStop.js +38 -1
- package/lib/modules/create-game/src/gameComponent/common/lazyLoader.js +76 -1
- package/lib/modules/create-game/src/gameComponent/common/stopWatch/onTimeEvent.js +36 -1
- package/lib/modules/create-game/src/gameComponent/common/stopWatch/stopWatch.js +90 -1
- package/lib/modules/create-game/src/gameComponent/common/stopWatch/tickEvent.js +29 -1
- package/lib/modules/create-game/src/gameComponent/common/timer/onTimeEvent.js +36 -1
- package/lib/modules/create-game/src/gameComponent/common/timer/tickEvent.js +29 -1
- package/lib/modules/create-game/src/gameComponent/common/timer/timer.js +87 -1
- package/lib/modules/create-game/src/gameComponent/gameComponent.js +53 -1
- package/lib/modules/create-game/src/gameComponent/index.js +31 -1
- package/lib/modules/create-game/src/gameComponent/player/blockInteractionBlocker.js +40 -1
- package/lib/modules/create-game/src/gameComponent/player/entityInteractionBlocker.js +48 -1
- package/lib/modules/create-game/src/gameComponent/player/healthIndicator.js +48 -1
- package/lib/modules/create-game/src/gameComponent/player/regionMonitor.js +22 -1
- package/lib/modules/create-game/src/gameComponent/player/respawn.js +59 -1
- package/lib/modules/create-game/src/gameComponent/player/spawnProtector.js +69 -1
- package/lib/modules/create-game/src/gameComponent/region/regionProtecter.js +53 -1
- package/lib/modules/create-game/src/gameComponent/region/regionTeamChooser.js +71 -1
- package/lib/modules/create-game/src/gameComponent/region/regionTeamCleaner.js +20 -1
- package/lib/modules/create-game/src/gameComponent/view/infoScoreboard.js +77 -1
- package/lib/modules/create-game/src/gameComponent/view/teamScoreboard.js +83 -1
- package/lib/modules/create-game/src/gameContext.js +6 -1
- package/lib/modules/create-game/src/gameEngine.js +139 -1
- package/lib/modules/create-game/src/gameEvent/eventManager.js +108 -1
- package/lib/modules/create-game/src/gameEvent/eventSignal.js +28 -1
- package/lib/modules/create-game/src/gameEvent/events/buttonPush.js +41 -1
- package/lib/modules/create-game/src/gameEvent/events/inSlot.js +77 -1
- package/lib/modules/create-game/src/gameEvent/events/interval.js +51 -1
- package/lib/modules/create-game/src/gameEvent/events/itemUse.js +36 -1
- package/lib/modules/create-game/src/gameEvent/events/onBlock.js +106 -1
- package/lib/modules/create-game/src/gameEvent/events/regionEvents.js +105 -1
- package/lib/modules/create-game/src/gameEvent/events/signClick.js +45 -1
- package/lib/modules/create-game/src/gameEvent/gameEvent.js +54 -1
- package/lib/modules/create-game/src/gameEvent/index.js +20 -1
- package/lib/modules/create-game/src/gameEvent/mapEventSignal.js +101 -1
- package/lib/modules/create-game/src/gameEvent/subscription.js +17 -1
- package/lib/modules/create-game/src/gamePlayer/gamePlayer.js +102 -1
- package/lib/modules/create-game/src/gamePlayer/groupBuilder.js +38 -1
- package/lib/modules/create-game/src/gamePlayer/groupSet.js +96 -1
- package/lib/modules/create-game/src/gamePlayer/index.js +25 -1
- package/lib/modules/create-game/src/gamePlayer/playerGroup.js +145 -1
- package/lib/modules/create-game/src/gamePlayer/playerManager.js +57 -1
- package/lib/modules/create-game/src/gameRegion/gameRegion.js +229 -1
- package/lib/modules/create-game/src/gameRegion/index.js +43 -1
- package/lib/modules/create-game/src/gameRegion/regionHelper.js +79 -1
- package/lib/modules/create-game/src/gameState/common/autoStop.js +39 -1
- package/lib/modules/create-game/src/gameState/gameState.js +169 -1
- package/lib/modules/create-game/src/gameState/index.js +7 -1
- package/lib/modules/create-game/src/gameState/types.js +35 -1
- package/lib/modules/create-game/src/gameStructure/gameStructure.js +36 -1
- package/lib/modules/create-game/src/main.js +86 -1
- package/lib/modules/create-game/src/system/gameCommand.js +107 -1
- package/lib/modules/create-game/src/system/gameManager.js +124 -1
- package/lib/modules/create-game/src/system/globalPlayerManager.js +119 -1
- package/lib/modules/create-game/src/utils/GameError.js +31 -1
- package/lib/modules/create-game/src/utils/algorithm.js +95 -1
- package/lib/modules/create-game/src/utils/chunk.js +63 -1
- package/lib/modules/create-game/src/utils/deferredObject.js +27 -1
- package/lib/modules/create-game/src/utils/duration.js +25 -1
- package/lib/modules/create-game/src/utils/func.js +20 -1
- package/lib/modules/create-game/src/utils/index.js +52 -1
- package/lib/modules/create-game/src/utils/interfaces.js +2 -1
- package/lib/modules/create-game/src/utils/logger.js +47 -1
- package/lib/modules/create-game/src/utils/random.js +76 -1
- package/lib/modules/create-game/src/utils/vanila-data.js +123 -1
- package/lib/modules/create-game/src/utils/vector.js +96 -1
- package/lib/modules/gameLib/src/config.js +134 -1
- package/lib/modules/gameLib/src/data.js +77 -1
- package/lib/modules/gameLib/src/entity.js +256 -1
- package/lib/modules/gameLib/src/event.js +285 -1
- package/lib/modules/gameLib/src/index.js +20 -1
- package/lib/modules/gameLib/src/loger.js +21 -1
- package/lib/modules/gameLib/src/ui.js +209 -1
- package/lib/modules/gameLib/src/utils.js +122 -1
- package/lib/modules/gutils/src/index.js +22 -1
- package/lib/runTemp/File.js +54 -1
- package/lib/runTemp/index.js +137 -1
- package/lib/runTemp/securityFile.js +93 -1
- package/lib/start/addPack.js +3 -1
- package/lib/start/clean.js +84 -1
- package/lib/start/create.js +146 -1
- package/lib/start/dev.js +99 -1
- package/lib/start/getResConfig.js +3 -1
- package/lib/start/incg.js +3 -1
- package/lib/start/index.js +207 -1
- package/lib/start/init.js +125 -1
- package/lib/start/rechce.js +57 -1
- package/lib/start/unaddPack.js +3 -1
- package/lib/start/unincg.js +67 -1
- package/lib/start/version.js +73 -1
- package/lib/utils/index.js +298 -1
- package/lib/uuid/index.js +27 -1
- package/package.json +1 -1
- package/test/script-mbler/behavior/scripts/index.js +0 -5
|
@@ -1 +1,27 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SAPIGameConfig = void 0;
|
|
4
|
+
const index_js_1 = require("./utils/index.js");
|
|
5
|
+
const defaultConfig = {
|
|
6
|
+
logLevel: index_js_1.logLevel.debug,
|
|
7
|
+
onEnd: () => { },
|
|
8
|
+
onJoin: () => { },
|
|
9
|
+
hub: () => { },
|
|
10
|
+
debugMode: false,
|
|
11
|
+
};
|
|
12
|
+
class SAPIGameConfig {
|
|
13
|
+
static _config = {};
|
|
14
|
+
/** 获取当前配置(合并默认配置和用户配置) */
|
|
15
|
+
static get config() {
|
|
16
|
+
return { ...defaultConfig, ...this._config };
|
|
17
|
+
}
|
|
18
|
+
/** 更新配置(部分更新即可) */
|
|
19
|
+
static update(config) {
|
|
20
|
+
this._config = { ...this._config, ...config };
|
|
21
|
+
}
|
|
22
|
+
/** 重置为默认配置 */
|
|
23
|
+
static reset() {
|
|
24
|
+
this._config = {};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.SAPIGameConfig = SAPIGameConfig;
|
|
@@ -1 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Constants = exports.Dimensions = void 0;
|
|
4
|
+
const server_1 = require("@minecraft/server");
|
|
5
|
+
const deferredObject_js_1 = require("./utils/deferredObject.js");
|
|
6
|
+
const vanila_data_js_1 = require("./utils/vanila-data.js");
|
|
7
|
+
const { proxy: dims, setTarget } = (0, deferredObject_js_1.createDeferredObject)();
|
|
8
|
+
server_1.world.afterEvents.worldLoad.subscribe(() => {
|
|
9
|
+
setTarget({
|
|
10
|
+
Overworld: server_1.world.getDimension(vanila_data_js_1.DimensionIds.Overworld),
|
|
11
|
+
Nether: server_1.world.getDimension(vanila_data_js_1.DimensionIds.Nether),
|
|
12
|
+
End: server_1.world.getDimension(vanila_data_js_1.DimensionIds.End),
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
exports.Dimensions = dims;
|
|
16
|
+
exports.Constants = {
|
|
17
|
+
/**维度常量(游戏加载后可用) */
|
|
18
|
+
dimension: dims,
|
|
19
|
+
};
|
|
@@ -1 +1,24 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createGameModule = createGameModule;
|
|
4
|
+
const gameComponent_js_1 = require("./gameComponent/gameComponent.js");
|
|
5
|
+
const gameEngine_js_1 = require("./gameEngine.js");
|
|
6
|
+
const gamePlayer_js_1 = require("./gamePlayer/gamePlayer.js");
|
|
7
|
+
const gameState_js_1 = require("./gameState/gameState.js");
|
|
8
|
+
function createGameModule(options) {
|
|
9
|
+
const playerClass = options.playerClass ?? gamePlayer_js_1.GamePlayer;
|
|
10
|
+
class Engine extends gameEngine_js_1.GameEngine {
|
|
11
|
+
constructor(key, config) {
|
|
12
|
+
super(playerClass, key, config);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class State extends gameState_js_1.GameState {
|
|
16
|
+
}
|
|
17
|
+
class Component extends gameComponent_js_1.GameComponent {
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
Engine,
|
|
21
|
+
State,
|
|
22
|
+
Component,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -1 +1,38 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AutoStopComponent = void 0;
|
|
4
|
+
const main_js_1 = require("../../main.js");
|
|
5
|
+
const index_js_1 = require("../../utils/index.js");
|
|
6
|
+
/**在组中所有玩家寄了之后自动结束游戏 */
|
|
7
|
+
class AutoStopComponent extends main_js_1.GameComponent {
|
|
8
|
+
onAttach() {
|
|
9
|
+
if (!this.options)
|
|
10
|
+
return;
|
|
11
|
+
this.subscribe(main_js_1.Game.events.interval, this.tick.bind(this), new index_js_1.Duration(20));
|
|
12
|
+
}
|
|
13
|
+
tick() {
|
|
14
|
+
let liveSize = 0;
|
|
15
|
+
this.options.groupSet.getAllPlayers().forEach((p) => {
|
|
16
|
+
if (p.ttl > 0)
|
|
17
|
+
liveSize++;
|
|
18
|
+
if (p.isValid) {
|
|
19
|
+
p.ttl = p.initialTTL; //重置TTL
|
|
20
|
+
}
|
|
21
|
+
else if (p.ttl > 0) {
|
|
22
|
+
p.ttl--; //下线的ttl减少
|
|
23
|
+
if (this.options?.immediateDie)
|
|
24
|
+
p.ttl = 0;
|
|
25
|
+
if (p.ttl == 0) {
|
|
26
|
+
this.options.onLeave?.(p);
|
|
27
|
+
//自动释放玩家
|
|
28
|
+
if (this.options?.shouldRelease)
|
|
29
|
+
main_js_1.Game.playerManager.releasePlayerFromGame(p.id, this.state.gameKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (liveSize === 0) {
|
|
34
|
+
this.options.onStopGame();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.AutoStopComponent = AutoStopComponent;
|
|
@@ -1 +1,76 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LazyLoader = void 0;
|
|
4
|
+
const server_1 = require("@minecraft/server");
|
|
5
|
+
const main_js_1 = require("../../main.js");
|
|
6
|
+
const index_js_1 = require("../../utils/index.js");
|
|
7
|
+
const gameComponent_js_1 = require("../gameComponent.js");
|
|
8
|
+
/**用于懒加载区块 */
|
|
9
|
+
class LazyLoader extends gameComponent_js_1.GameComponent {
|
|
10
|
+
active = false;
|
|
11
|
+
logger = new index_js_1.Logger(this.constructor.name);
|
|
12
|
+
components = [];
|
|
13
|
+
get isActive() {
|
|
14
|
+
return this.active;
|
|
15
|
+
}
|
|
16
|
+
onAttach() {
|
|
17
|
+
this.subscribe(main_js_1.Game.events.interval, () => {
|
|
18
|
+
if (!this.options)
|
|
19
|
+
return;
|
|
20
|
+
const { dimensionId: dimension, pos, onLoad, onUnload, } = this.options;
|
|
21
|
+
const load = server_1.world.getDimension(dimension).getBlock(pos);
|
|
22
|
+
if (load) {
|
|
23
|
+
if (!this.active) {
|
|
24
|
+
this.logger.log("load");
|
|
25
|
+
try {
|
|
26
|
+
onLoad(this);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
this.logger.error("onLoad error:", err);
|
|
30
|
+
}
|
|
31
|
+
this.active = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (this.active) {
|
|
36
|
+
this.logger.log("unload");
|
|
37
|
+
this.clearComponents();
|
|
38
|
+
try {
|
|
39
|
+
onUnload?.();
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
this.logger.error("onUnload error", e);
|
|
43
|
+
}
|
|
44
|
+
this.active = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}, this.options.interval ?? new index_js_1.Duration(20));
|
|
48
|
+
}
|
|
49
|
+
clearComponents() {
|
|
50
|
+
//先取消所有订阅
|
|
51
|
+
this.components.forEach((c) => {
|
|
52
|
+
this.state.eventManager.unsubscribeBySubscriber(c);
|
|
53
|
+
});
|
|
54
|
+
//再删除所有组件
|
|
55
|
+
this.components.forEach((c) => this.state.deleteComponent(c));
|
|
56
|
+
this.components = [];
|
|
57
|
+
}
|
|
58
|
+
reload() {
|
|
59
|
+
if (!this.options)
|
|
60
|
+
return;
|
|
61
|
+
const { onLoad, onUnload } = this.options;
|
|
62
|
+
if (this.active) {
|
|
63
|
+
onUnload?.();
|
|
64
|
+
this.clearComponents();
|
|
65
|
+
this.active = false;
|
|
66
|
+
}
|
|
67
|
+
onLoad(this);
|
|
68
|
+
this.active = true;
|
|
69
|
+
}
|
|
70
|
+
addComponent(component, options) {
|
|
71
|
+
this.state.addComponent(component, options);
|
|
72
|
+
this.components.push(component);
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.LazyLoader = LazyLoader;
|
|
@@ -1 +1,36 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StopWatchOnTimeEventSignal = void 0;
|
|
4
|
+
const logger_js_1 = require("../../../utils/logger.js");
|
|
5
|
+
class StopWatchOnTimeEventSignal {
|
|
6
|
+
logger = new logger_js_1.Logger(this.constructor.name);
|
|
7
|
+
events = [];
|
|
8
|
+
subscribe(callback, options) {
|
|
9
|
+
const event = {
|
|
10
|
+
time: options.time,
|
|
11
|
+
callback,
|
|
12
|
+
once: options.once ?? true,
|
|
13
|
+
};
|
|
14
|
+
this.events.push(event);
|
|
15
|
+
return {
|
|
16
|
+
unsubscribe: () => {
|
|
17
|
+
this.events = this.events.filter((e) => e !== event);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**检查并触发到达时间的事件*/
|
|
22
|
+
checkAndFireTimeEvents(time) {
|
|
23
|
+
const eventsToFire = this.events.filter((event) => time === event.time);
|
|
24
|
+
eventsToFire.forEach((event) => {
|
|
25
|
+
try {
|
|
26
|
+
event.callback();
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
this.logger.error("执行stopWatch事件失败:", e);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// 如果配置为once,则在执行后移除
|
|
33
|
+
this.events = this.events.filter((event) => !event.once || !eventsToFire.includes(event));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.StopWatchOnTimeEventSignal = StopWatchOnTimeEventSignal;
|
|
@@ -1 +1,90 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StopWatch = void 0;
|
|
4
|
+
const main_js_1 = require("../../../main.js");
|
|
5
|
+
const gameComponent_js_1 = require("../../gameComponent.js");
|
|
6
|
+
const onTimeEvent_js_1 = require("./onTimeEvent.js");
|
|
7
|
+
const tickEvent_js_1 = require("./tickEvent.js");
|
|
8
|
+
class StopWatch extends gameComponent_js_1.GameComponent {
|
|
9
|
+
elapsedTime = 0;
|
|
10
|
+
_isRunning = false;
|
|
11
|
+
lastTime = 0;
|
|
12
|
+
isActive = true;
|
|
13
|
+
events = {
|
|
14
|
+
tick: new tickEvent_js_1.StopWatchTickEventSignal(),
|
|
15
|
+
onTime: new onTimeEvent_js_1.StopWatchOnTimeEventSignal(),
|
|
16
|
+
};
|
|
17
|
+
/** 获取当前已计时间(秒) */
|
|
18
|
+
get time() {
|
|
19
|
+
return this.elapsedTime;
|
|
20
|
+
}
|
|
21
|
+
/** 获取秒表是否正在运行 */
|
|
22
|
+
get isRunning() {
|
|
23
|
+
return this._isRunning;
|
|
24
|
+
}
|
|
25
|
+
/** 组件被附加到游戏对象时调用 */
|
|
26
|
+
onAttach() {
|
|
27
|
+
this.isActive = true;
|
|
28
|
+
this.elapsedTime = this.options?.initialTime ?? 0;
|
|
29
|
+
if (this.options?.autoStart) {
|
|
30
|
+
this.start();
|
|
31
|
+
}
|
|
32
|
+
// 订阅游戏的 tick 事件,驱动秒表
|
|
33
|
+
this.subscribe(main_js_1.Game.events.interval, () => {
|
|
34
|
+
if (!this._isRunning)
|
|
35
|
+
return;
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
const diff = now - this.lastTime;
|
|
38
|
+
if (diff >= 1000) {
|
|
39
|
+
if (this.options?.compensate) {
|
|
40
|
+
// 按真实时间补偿,防止掉帧少加
|
|
41
|
+
const steps = Math.floor(diff / 1000);
|
|
42
|
+
this.elapsedTime += steps;
|
|
43
|
+
this.lastTime += steps * 1000;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// 不补偿,只加 1 秒
|
|
47
|
+
this.elapsedTime += 1;
|
|
48
|
+
this.lastTime = now;
|
|
49
|
+
}
|
|
50
|
+
// 每秒触发 tick
|
|
51
|
+
this.events.tick.publish(this.elapsedTime);
|
|
52
|
+
// 检查并触发特定时间事件
|
|
53
|
+
this.events.onTime.checkAndFireTimeEvents(this.elapsedTime);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
onDetach() {
|
|
58
|
+
this._isRunning = false;
|
|
59
|
+
this.isActive = false;
|
|
60
|
+
super.onDetach();
|
|
61
|
+
this.state.eventManager.unsubscribeByEvent(this.events.onTime);
|
|
62
|
+
this.state.eventManager.unsubscribeByEvent(this.events.tick);
|
|
63
|
+
}
|
|
64
|
+
/** 重置秒表时间 */
|
|
65
|
+
reset(time = 0) {
|
|
66
|
+
this.elapsedTime = Math.max(0, time);
|
|
67
|
+
this.lastTime = Date.now();
|
|
68
|
+
if (this._isRunning) {
|
|
69
|
+
this.events.tick.publish(this.elapsedTime);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** 停止秒表 */
|
|
73
|
+
stop() {
|
|
74
|
+
this._isRunning = false;
|
|
75
|
+
}
|
|
76
|
+
/** 启动秒表 */
|
|
77
|
+
start() {
|
|
78
|
+
if (!this._isRunning && this.isActive) {
|
|
79
|
+
this._isRunning = true;
|
|
80
|
+
this.lastTime = Date.now();
|
|
81
|
+
this.events.tick.publish(this.elapsedTime);
|
|
82
|
+
this.events.onTime.checkAndFireTimeEvents(this.elapsedTime);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** 暂停或恢复 */
|
|
86
|
+
toggle() {
|
|
87
|
+
this._isRunning ? this.stop() : this.start();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.StopWatch = StopWatch;
|
|
@@ -1 +1,29 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StopWatchTickEventSignal = void 0;
|
|
4
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
5
|
+
class StopWatchTickEventSignal {
|
|
6
|
+
tickCallbacks = new Set();
|
|
7
|
+
logger = new index_js_1.Logger(this.constructor.name);
|
|
8
|
+
constructor() { }
|
|
9
|
+
/** 注册一个在每次时间增加(每秒)时执行的回调函数*/
|
|
10
|
+
subscribe(callback) {
|
|
11
|
+
this.tickCallbacks.add(callback);
|
|
12
|
+
return {
|
|
13
|
+
unsubscribe: () => {
|
|
14
|
+
this.tickCallbacks.delete(callback);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
publish(elapsedTime) {
|
|
19
|
+
this.tickCallbacks.forEach((cb) => {
|
|
20
|
+
try {
|
|
21
|
+
cb({ elapsedTime: elapsedTime });
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
this.logger.error("stopWatch Tick事件执行错误", err);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.StopWatchTickEventSignal = StopWatchTickEventSignal;
|
|
@@ -1 +1,36 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimerOnTimeEventSignal = void 0;
|
|
4
|
+
const logger_js_1 = require("../../../utils/logger.js");
|
|
5
|
+
class TimerOnTimeEventSignal {
|
|
6
|
+
logger = new logger_js_1.Logger(this.constructor.name);
|
|
7
|
+
events = [];
|
|
8
|
+
subscribe(callback, options) {
|
|
9
|
+
const event = {
|
|
10
|
+
time: options.time,
|
|
11
|
+
callback,
|
|
12
|
+
once: options.once ?? true,
|
|
13
|
+
};
|
|
14
|
+
this.events.push(event);
|
|
15
|
+
return {
|
|
16
|
+
unsubscribe: () => {
|
|
17
|
+
this.events = this.events.filter((e) => e !== event);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**检查并触发到达时间的事件*/
|
|
22
|
+
checkAndFireTimeEvents(time) {
|
|
23
|
+
const eventsToFire = this.events.filter((event) => time === event.time);
|
|
24
|
+
eventsToFire.forEach((event) => {
|
|
25
|
+
try {
|
|
26
|
+
event.callback();
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
this.logger.error("执行timer事件失败:", e);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// 如果配置为once,则在执行后移除
|
|
33
|
+
this.events = this.events.filter((event) => !event.once || !eventsToFire.includes(event));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.TimerOnTimeEventSignal = TimerOnTimeEventSignal;
|
|
@@ -1 +1,29 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimerTickEventSignal = void 0;
|
|
4
|
+
const index_js_1 = require("../../../utils/index.js");
|
|
5
|
+
class TimerTickEventSignal {
|
|
6
|
+
tickCallbacks = new Set();
|
|
7
|
+
logger = new index_js_1.Logger(this.constructor.name);
|
|
8
|
+
constructor() { }
|
|
9
|
+
/** 注册一个在每次时间减少(每秒)时执行的回调函数*/
|
|
10
|
+
subscribe(callback) {
|
|
11
|
+
this.tickCallbacks.add(callback);
|
|
12
|
+
return {
|
|
13
|
+
unsubscribe: () => {
|
|
14
|
+
this.tickCallbacks.delete(callback);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
publish(remainingTime) {
|
|
19
|
+
this.tickCallbacks.forEach((cb) => {
|
|
20
|
+
try {
|
|
21
|
+
cb({ remainingTime: remainingTime });
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
this.logger.error("timer Tick事件执行错误", err);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.TimerTickEventSignal = TimerTickEventSignal;
|
|
@@ -1 +1,87 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Timer = void 0;
|
|
4
|
+
const main_js_1 = require("../../../main.js");
|
|
5
|
+
const gameComponent_js_1 = require("../../gameComponent.js");
|
|
6
|
+
const onTimeEvent_js_1 = require("./onTimeEvent.js");
|
|
7
|
+
const tickEvent_js_1 = require("./tickEvent.js");
|
|
8
|
+
class Timer extends gameComponent_js_1.GameComponent {
|
|
9
|
+
remainingTime = 0;
|
|
10
|
+
_isRunning = false;
|
|
11
|
+
lastTime = 0;
|
|
12
|
+
events = {
|
|
13
|
+
tick: new tickEvent_js_1.TimerTickEventSignal(),
|
|
14
|
+
onTime: new onTimeEvent_js_1.TimerOnTimeEventSignal(),
|
|
15
|
+
};
|
|
16
|
+
/** 获取当前剩余时间 */
|
|
17
|
+
get time() {
|
|
18
|
+
return this.remainingTime;
|
|
19
|
+
}
|
|
20
|
+
/**获取计时器是否正在运行*/
|
|
21
|
+
get isRunning() {
|
|
22
|
+
return this._isRunning;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 组件被附加到游戏对象时调用
|
|
26
|
+
*/
|
|
27
|
+
onAttach() {
|
|
28
|
+
this.set(this.options?.initialTime ?? 0);
|
|
29
|
+
// 订阅游戏的tick事件,这是驱动计时器的核心
|
|
30
|
+
this.subscribe(main_js_1.Game.events.interval, () => {
|
|
31
|
+
if (!this._isRunning) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
const diff = now - this.lastTime;
|
|
36
|
+
if (diff >= 1000) {
|
|
37
|
+
if (this.remainingTime <= 0) {
|
|
38
|
+
this._isRunning = false;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (this.options?.compensate) {
|
|
42
|
+
// 严格按真实时间走,补偿丢失的秒数
|
|
43
|
+
const steps = Math.floor(diff / 1000);
|
|
44
|
+
this.remainingTime -= steps;
|
|
45
|
+
this.lastTime += steps * 1000;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// 不补偿,直接视为 1 秒过去
|
|
49
|
+
this.remainingTime -= 1;
|
|
50
|
+
this.lastTime = now;
|
|
51
|
+
}
|
|
52
|
+
// 执行每一秒的回调
|
|
53
|
+
this.events.tick.publish(this.remainingTime);
|
|
54
|
+
// 检查并执行特定时间点的事件
|
|
55
|
+
this.events.onTime.checkAndFireTimeEvents(this.remainingTime);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
if (this.options?.autoStart) {
|
|
59
|
+
this.start();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
onDetach() {
|
|
63
|
+
this._isRunning = false;
|
|
64
|
+
super.onDetach();
|
|
65
|
+
this.state.eventManager.unsubscribeByEvent(this.events.onTime);
|
|
66
|
+
this.state.eventManager.unsubscribeByEvent(this.events.tick);
|
|
67
|
+
}
|
|
68
|
+
/** 设置计时器的当前时间 */
|
|
69
|
+
set(time) {
|
|
70
|
+
this.remainingTime = Math.max(0, time);
|
|
71
|
+
this.lastTime = Date.now();
|
|
72
|
+
}
|
|
73
|
+
/**停止计时器 */
|
|
74
|
+
stop() {
|
|
75
|
+
this._isRunning = false;
|
|
76
|
+
}
|
|
77
|
+
/**启动计时器 */
|
|
78
|
+
start() {
|
|
79
|
+
if (this.remainingTime > 0 && !this._isRunning && this.isAttached) {
|
|
80
|
+
this._isRunning = true;
|
|
81
|
+
this.lastTime = Date.now();
|
|
82
|
+
this.events.tick.publish(this.remainingTime);
|
|
83
|
+
this.events.onTime.checkAndFireTimeEvents(this.remainingTime);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.Timer = Timer;
|
|
@@ -1 +1,53 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GameComponent = void 0;
|
|
4
|
+
class GameComponent {
|
|
5
|
+
options;
|
|
6
|
+
_isAttached = false;
|
|
7
|
+
/**是否已经attach */
|
|
8
|
+
get isAttached() {
|
|
9
|
+
return this._isAttached;
|
|
10
|
+
}
|
|
11
|
+
state;
|
|
12
|
+
/**tag */
|
|
13
|
+
tag;
|
|
14
|
+
get context() {
|
|
15
|
+
return this.state.context;
|
|
16
|
+
}
|
|
17
|
+
get runner() {
|
|
18
|
+
return this.state.runner;
|
|
19
|
+
}
|
|
20
|
+
constructor(state, options, tag) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.state = state;
|
|
23
|
+
this.tag = tag;
|
|
24
|
+
}
|
|
25
|
+
_onAttach() {
|
|
26
|
+
try {
|
|
27
|
+
this._isAttached = true;
|
|
28
|
+
this.onAttach();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
this._isAttached = false;
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
_onDetach() {
|
|
36
|
+
this.state.eventManager.unsubscribeBySubscriber(this);
|
|
37
|
+
this.onDetach();
|
|
38
|
+
this._isAttached = false;
|
|
39
|
+
}
|
|
40
|
+
/**随便重写 */
|
|
41
|
+
onDetach() { }
|
|
42
|
+
/**订阅事件 */
|
|
43
|
+
subscribe(event, ...args) {
|
|
44
|
+
if (!this.isAttached)
|
|
45
|
+
return;
|
|
46
|
+
return this.state.eventManager.subscribe(this, event, ...args);
|
|
47
|
+
}
|
|
48
|
+
/**取消订阅 */
|
|
49
|
+
unsubscribe(sub) {
|
|
50
|
+
this.state.eventManager.unsubscribe(sub);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.GameComponent = GameComponent;
|
|
@@ -1 +1,31 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.GameComponent = void 0;
|
|
18
|
+
__exportStar(require("./view/infoScoreboard.js"), exports);
|
|
19
|
+
__exportStar(require("./common/lazyLoader.js"), exports);
|
|
20
|
+
__exportStar(require("./common/timer/timer.js"), exports);
|
|
21
|
+
__exportStar(require("./common/stopWatch/stopWatch.js"), exports);
|
|
22
|
+
var gameComponent_js_1 = require("./gameComponent.js");
|
|
23
|
+
Object.defineProperty(exports, "GameComponent", { enumerable: true, get: function () { return gameComponent_js_1.GameComponent; } });
|
|
24
|
+
__exportStar(require("./player/blockInteractionBlocker.js"), exports);
|
|
25
|
+
__exportStar(require("./player/entityInteractionBlocker.js"), exports);
|
|
26
|
+
__exportStar(require("./region/regionProtecter.js"), exports);
|
|
27
|
+
__exportStar(require("./region/regionTeamChooser.js"), exports);
|
|
28
|
+
__exportStar(require("./region/regionTeamCleaner.js"), exports);
|
|
29
|
+
__exportStar(require("./view/teamScoreboard.js"), exports);
|
|
30
|
+
__exportStar(require("./player/healthIndicator.js"), exports);
|
|
31
|
+
__exportStar(require("./player/regionMonitor.js"), exports);
|
|
@@ -1 +1,40 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BlockInteractionBlocker = void 0;
|
|
4
|
+
const server_1 = require("@minecraft/server");
|
|
5
|
+
const main_js_1 = require("../../main.js");
|
|
6
|
+
/**
|
|
7
|
+
* 通用方块交互阻止组件
|
|
8
|
+
*/
|
|
9
|
+
class BlockInteractionBlocker extends main_js_1.GameComponent {
|
|
10
|
+
onAttach() {
|
|
11
|
+
if (!this.options)
|
|
12
|
+
return;
|
|
13
|
+
const { groupSet, blockIds, blockComponentType, showMessage = true, message, } = this.options;
|
|
14
|
+
this.subscribe(server_1.world.beforeEvents.playerInteractWithBlock, (t) => {
|
|
15
|
+
const { player, block } = t;
|
|
16
|
+
// 1️⃣ 不在限制组内 -> 放行
|
|
17
|
+
if (!groupSet.findById(player.id))
|
|
18
|
+
return;
|
|
19
|
+
// 2️⃣ 若设置 blockIds,则仅匹配这些方块
|
|
20
|
+
if (blockIds &&
|
|
21
|
+
blockIds.length > 0 &&
|
|
22
|
+
!blockIds.includes(block.typeId)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// 3️⃣ 若设置 blockComponentType,则仅匹配拥有该组件的方块
|
|
26
|
+
if (blockComponentType) {
|
|
27
|
+
const comp = block.getComponent(blockComponentType);
|
|
28
|
+
if (!comp)
|
|
29
|
+
return; // 若该方块没有该组件 -> 放行
|
|
30
|
+
}
|
|
31
|
+
// 4️⃣ 阻止交互
|
|
32
|
+
t.cancel = true;
|
|
33
|
+
// 5️⃣ 提示
|
|
34
|
+
if (showMessage) {
|
|
35
|
+
server_1.system.run(() => player.onScreenDisplay.setActionBar(message ?? "§c你无法与该方块交互!"));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.BlockInteractionBlocker = BlockInteractionBlocker;
|