※なぜかコードブロック内で//インラインコメントを記入すると保存できなかったので読みにくくなりましたがご容赦を。
minecraft:arrowを使う(右クリック)ことで常駐処理をONOFFするサンプルコード
DPを利用したONOFF切り替え可能な繰り返し処理
worldを再起動したりScriptをリロードしても制御状態が維持される
const LOOPFUNCTION_FLAG_DPNAME = "my_loopfunction_isActive"
world.afterEvents.itemUse.subscribe(ev=> {
if(ev.itemStack.typeId == "minecraft:arrow"){
if(!world.getDynamicProperty(LOOPFUNCTION_FLAG_DPNAME)){
world.setDynamicProperty(LOOPFUNCTION_FLAG_DPNAME,true);
world.sendMessage("active");
}else{
world.setDynamicProperty(LOOPFUNCTION_FLAG_DPNAME);
world.sendMessage("non active");
}
}
});
world.afterEvents.worldInitialize.subscribe(() => {
system.runInterval(()=>{
if(!!world.getDynamicProperty(LOOPFUNCTION_FLAG_DPNAME)){
//ここに処理を書く
world.sendMessage("これはテストメッセージです:DP形式");
}
},1);
});
変数を利用する形式
worldの再起動やScriptのリロードで制御が初期化される
let loopFlag = true;
world.afterEvents.itemUse.subscribe(ev=> {
if(ev.itemStack.typeId == "minecraft:arrow"){
loopFlag=!loopFlag;
}
});
world.afterEvents.worldInitialize.subscribe(() => {
system.runInterval(()=>{
if(loopFlag)){
//ここに処理を書く
world.sendMessage("これはテストメッセージです:変数形式");
}
},1);
});
let loopFlag = false;
// ▼ループ処理管理用のIDが入る
let loopFunctionId;
world.afterEvents.itemUse.subscribe(ev=> {
if(ev.itemStack.typeId == "minecraft:arrow"){
// ▼呼び出されるたびflagを反転
loopFlag=!loopFlag;
if(loopFlag){
// ▼ループ処理を登録する
loopFunctionId = system.runInterval(()=>{
//▼ここに処理を書く
world.sendMessage("これはテストメッセージです:変数形式");
},1);
}else{
system.clearRun(loopFunctionId); // ループ処理を解除する
}
}
});
▲こっちの方法では、ループ処理そのものを解除する&ループごとに処理実行flagの確認をしないのでいくらか軽量化されている
ただし、Script読み込み時点から常駐処理を走らせるにはもう一工夫必要
コメント