はじめに
マイクラ統合版にはAPIスクリプトと呼ばれる拡張機能が存在します。簡単に言えば、プログラミングを使ってゲームシステムをカスタマイズする機能のことですね。本サイトでは何度も取り上げています。APIScriptに関する詳細はこちらをご覧ください。
さて、APIScriptでスクリプトを書いていると、プレイヤーがワールドに入った最初の瞬間だけ何かをしたいと思うことがあります。本記事では、この問題に対する解決策を提示します。
本題
以下は、プレイヤーがワールドに入ったことを検知し、特定の関数を発火させる例です。
server.world.afterEvents.playerSpawn.subscribe(ev =>{
if (ev.initialSpawn){
server.system.runTimeout(function(){
//ここにスクリプトを記述
},40);
}
}); このスクリプトで重要な点は、意図的に遅延を起こしているところです。systemクラスのrunTimeout関数は関数(function)と整数値を引数として、マインクラフト上でその整数値のティック分、関数の実行を遅らせることができる関数です(注:1ティック=20分の1秒)。
また、ev.initialSpawnはプレイヤーのスポーンが初回であった場合にtrueを、そうでなければfalseを返します。即ち、ゲームオーバーになってリスポーンした場合、この関数は実行されないわけですね。
具体例
以下は、プレイヤーがワールドに入ったことを検知し、その場合にUIを表示する例です。
import * as server from "@minecraft/server";
server.world.afterEvents.playerSpawn.subscribe(ev =>{
if (ev.initialSpawn){
server.system.runTimeout(function(){
for (const player of server.world.getAllPlayers()){
show_form(player);
}
},40);
}
}); APIScript上でUIを表示する方法については、こちらの記事をご参照ください。本スクリプトでは、何らかの形でUIを表示するよう定義づけられた関数「show_form()」を前提とします。
この関数は、playerを引数としますが、関数の発火に至るまでのプロセスで、スポーンしたプレイヤーを取得していません。従って、for文とgetAllPlayers()関数ででplayerを取得しています。
おしまい
このようにして、APIScriptを用いてワールドに入ったことを検知して何らかの処理を行うことが可能になります。worldクラスの各種プロパティは大変便利ですので、是非ご活用ください。
こちらの記事もどうぞ:
今回解説したスクリプトを使って、友人・コミュニティー内で24時間いつでも遊べるマルチサーバーを構築したい場合は、VPS(レンタルサーバー)の導入が近道です。
私の開発・検証環境では「シンVPS」を使用しています。
以前は自宅PCでホストしていましたが、PCの電源を切り忘れるストレスや、電気代を考慮して移行しました。シンVPSを選んだ決め手は、圧倒的なコストパフォーマンスです。
- 月額の安さ 4GBプランでも月額1,200円程度(長期契約なら1,000円以下)と維持費が安く済みます。
- 高速な読み込み 全プランでNVMe SSDを採用しており、ワールドの読み込みや重いコマンド処理でもラグを感じにくいです。
以下のリンクから申し込むと初回利用料金が10%OFFになります。
(1ヶ月以上の契約対象。「安くて速い」サーバーを探している方はぜひ試してみてください)
(10%OFF適用) マルチサーバーの立て方はこちら