Densyakunのブログ

Qiitaもやってます: https://qiita.com/Densyakun

【Spigot】Bukkitプラグインの作り方講座 - プラグインの作成(IntelliJ IDEA)

 

今回は実際に簡単なプラグインを作成します。

この作業はプラグインごとに行いますので、覚えてください。

 

プロジェクトの作成

まずプロジェクトを作成します。

この作業は、作成するBukkitプラグインごとに行います。

 

プロジェクトを開いていない画面で「新規プロジェクトの作成」をクリックします。

左のメニューから「Minecraft」を選択します。

 

この記事ではBukkit(Spigot)プラグインを作成しますので、

Spigot Plugin」にチェックを入れます。

(「Bukkit Plugin」は旧バージョンのものです)

次へを押します。

 

ビルド設定

グループ IDは一般的に、自分のサイトなどのアドレスを逆にしたもの(「densyakun.github.io」であればio.github.densyakun)が多いです。

誰が作ったものかを書くという感じです。

また、グループ IDは全て小文字にして下さい。

 

プログラミングをしているとパッケージが増えていきますので他のとかぶらないように名前を付ける必要があります。

私はプラグイン開発以外にも色々やっているので、io.github.densyakun.bukkitといった感じにしています。

 

アーティファクト IDプラグインを書きます。

頭文字が大文字になるようにしてください。

 

この記事ではGradleを使います。

右の「Maven」をクリックして、「Gradle」を選択してください。

また、「前へ」を押して前の画面に戻ると設定が戻ってしまうので注意してください。

 

次へを押します。

 

プラグインの設定

右のMinecraft Versionからマインクラフトのバージョンを選択してください。

特に古いバージョンでなければ、基本的に新しいバージョンで問題ありません。

Bukkitプラグインは対応していれば、異なるバージョンでも使用できます。

 

ここで設定する内容はplugin.ymlと同じものになります。

Plugin.ymlの設定一覧 - Minecraft Modding Wiki

 

次へを押します。

 

最後にお好みのプロジェクト名を書いて完了を押してください。

するとプロジェクトが作成されます。

 

Gradleにより作成されたソースフォルダは、

クラスなどを入れる方が、src > main > java で、

config.ymlなどをいれる方が、src > main > resources です。

 

パッケージ名は、グループ IDとアーティファクト IDを小文字にしたものを合わせたものになります。

プラグインのメインクラスはJavaPluginを継承したプラグイン名のクラスが、

このパッケージの中に作成されているので、

それを開きます

 

すでに色々書かれています。

onEnable関数はプラグインが有効になるときに実行されます。

onDisable関数はプラグインが無効になるときに実行されます。

 

Jarファイルを作成する

プロジェクトフォルダにあるbuild.gradleを開きます。

ファイルに以下のテキストを追加します。

jar {
}

IntelliJ IDEAでは、編集は自動的に保存されます。

編集したら右下に「変更をインポート」と表示されますので押します。

 

右上のトンカチのボタンをクリックしてビルドします。

次に、IDEの内蔵エディタで先程追加した jar{} の、

左にある行数の横にある三角をクリックして実行すると、Jarファイルが作成されます。

作成されたJarファイルは、プロジェクトフォルダ > build > libs にあります。

これが完成したプラグインとなります。

 

Gradleを日本語のコードに対応する

日本語を含む文字列などをコードに追加すると、

Gradleでビルドする際にエラーが発生してしまいます。

これは文字コードの関係で起きています。

 

build.gradle内に以下のコードを追加します。

compileJava.options.encoding = 'UTF-8'

(targetCompatibility = '1.8'の下辺り、8行目辺りに追加すると良い) 

 

編集したら右下に「変更をインポート」と表示されるので押してください。

これでビルドするとできます。

 

プラグインを導入する

完成したプラグインのJarファイルを、

Bukkitサーバーのpluginsフォルダに入れて、

サーバーを起動します。

/pl コマンドを実行して、作成したプラグインが緑色で表示されていれば完了です。

赤色で表示されている場合は、前提プラグインが入っていないなどプラグインが無効になっています。

 

/version (プラグイン名) コマンドでプラグインのバージョンなどの情報を見ることができます。

 

これでプラグインを作ることが出来ました。

実際に作ったプラグインが動いているのを見ると達成感を感じますね。 

次は、作成したプラグインをいじって、機能を追加していきましょう!

 

記事一覧に戻る

【Spigot】Bukkitプラグインの作り方講座 - 開発環境の構築(Intellij IDEA)

今回はIntelliJ IDEAを使った開発環境の

 

IntelliJ IDEA のダウンロード、インストール

IntelliJ IDEAをダウンロード、インストールします。

 

2つのエディションがありますが、無料のコミュニティ版で構いませんので、

こちらからダウンロード、インストールしてください。

https://www.jetbrains.com/ja-jp/idea/download/

 

Minecraft Development のインストール

BukkitプラグインやForgeModなどを簡単に作成できる

Minecraft Development」というJetbrainsプラグインがありますので、

これをインストールします。

JetbrainsプラグインとはIntelliJ IDEAなどのJetbrains製品で使えるプラグインです。

 

IntelliJ IDEAを起動し設定を開き、左のメニューから「プラグイン」を押して、

マーケットプレイス入力欄に「Minecraft Development」と入力して、

出てきた「Minecraft Development」の右にある「Install」ボタンをクリックします。

 

インストールが終わったらボタンが「Restart IDE」となりますのでクリックしてアプリを再起動します。

 

ここまでの作業は初回のみで、今後行いません。

 

Spigotサーバーを立てる

次は、Spigotサーバーを立てます。

Spigotとは、更新及び公開が停止しているBukkitの派生版で、Bukkitと同様に使用でき、さらに多くの機能が追加されているものです。

 

プラグイン開発ではBukkitとSpigotに一部違いがあるため注意が必要です。

 

Spigotサーバーをダウンロード

次に、プラグインを実行するためのサーバーであるSpigotをダウンロードします。

 

Spigotダウンロードサイト(非公式): https://getbukkit.org/download/spigot

 

非公式サイトですが、公式サイトだとビルドツールとかgitとかなんだかんだでめんどくさいので、こちらの方が簡単にサーバーが立てられます。

ダウンロードしたいバージョンの右にあるDownloadボタンを押します。(横のCreate a Serverは押さないで下さい)

すると次のページに行き、少し下にスクロールすると広告に囲まれたリンクがあるのでそれを開いてダウンロードします。


ダウンロードしたら、好きなところにサーバーのフォルダを作り、その中にダウンロードしたjarファイルを入れます。(この時、間違えて開かないで下さい)

 

.jarファイルをそのまま開いてしまうと、

バックグラウンドで見えないサーバーを開いてしまいます。

なお、間違えて開いてしまった場合は、

タスクマネージャーからjavawを停止してください。

 

サーバーをたてる準備

サーバーを実行するためには、JDKのインストール、環境変数の設定が必要です。

こちらを参考にして下さい。

https://eng-entrance.com/java-install-jdk-windows

 

batファイルを作成する

次に、サーバーのフォルダの中に.batファイルを作成して、サーバーを可視化します。(Windowsの場合)

ファイル名に拡張子が表示されない場合は、エクスプローラーの設定を変更して下さい。

フォルダを右クリックして、 新規作成>テキストドキュメント を選択して、ファイル名を「start.bat」にします。

この時警告が出るはずですが、問題ないので続行して下さい。

ファイル名のstartはお好みの文字にしても構いません。”.txt”は消して下さい。

 

作成したbatファイルを右クリックして「編集」を押して下さい。(お好みのテキストエディタがあればそれを使って開いて下さい)

するとメモ帳が出てくるので以下のを書いてください。

コピペで入力しても構いませんので、入力が完了したら保存して下さい。

@ECHO OFF
java -Xms128M -Xmx1024M -jar spigot-xxx.jar
PAUSE

(spigot-xxx.jarにはダウンロードしたjarファイルのファイル名を入力)

 

javaはjarファイルを実行します。つまりサーバーを実行する処理が書かれています。

 

-Xmsは最小メモリ使用量、-Xmxは最大メモリ使用量です。1024Mは1GBと同じです。

-Xms と -Xmx は省略しても構いませんし、-Xmxだけ書いてもいいです。

省略した場合はデフォルトで最大1GBを使用します。大したワールドデータや50個を超えるほどの大量のプラグインを使用しなければ1GBで十分です。

・注意: MBやGBなどの単位は-Xms-Xmxの単位を揃えて下さい。

 

PAUSEは処理を停止して、キーボードを押したときに処理を再開するものです。

PAUSE の上にjavaがあるのでサーバーが実行されます。

サーバーが停止すると PAUSE により処理を停止してキーボードを押すとコンソールが消えます。

PAUSE が無いとサーバーが停止したときにすぐにコンソールが消えます。

 

@ECHO OFFは特に気にしなくていいです。

(詳しく説明すると、@ECHO はbatが実行するコマンド【今回の場合はjavaPAUSEなど】をコンソールに表示するかどうかを設定するものです)

 

 

サーバーを起動する

次に、start.batを実行してサーバーを起動します。

すると黒い画面に白い文字が表示されたコンソール画面が出てきます。

f:id:Densyakun:20180211183922p:plain

すると、「Stopping server」と表示されサーバーが停止しました。

初回起動時には利用規約に同意する必要があります

 

サーバーを開くとサーバーフォルダにサーバーのファイルが生成されているので、

利用規約に同意するにはサーバーフォルダに生成されたeula.txtを編集し

eula=falseeula=trueに書き換えて下さい。

そしてもう一度start.batを起動するとサーバーが起動できます。

 

コンソールではコマンドを入力することが出来ます。

「stop」と入力するとサーバーを停止できます。

その他コマンドについてはhttps://www.spigotmc.org/wiki/spigot-commands/をご覧下さい。

・ここではポート開放のやり方などは説明しません。

 

 

 

今回はBukkitプラグイン開発環境の構築を行いました。

続いて実際にプラグインを作っていきます。

 

記事一覧に戻る

GISを活用したBve5路線データの作成方法

こんにちは、電車君です。

 

GISを活用してBve5路線データを作成する事で、GoogleMapの画像を貼り付けたり、手作業でやるよりも精密に作ることができます

 

一番良いのは、平面曲線や縦断曲線などの線形の情報があることですが、

本などの資料を購入するよりもコストがかからずにどんな路線でも出来ますので、その方法や手順について解説します。

 

手順が多いのですが、大まかに説明すると、Blenderに地理情報を入れて、Blenderで線形などのガイドとなるストラクチャを作り、それをBve5で読み込み、ガイドに合わせて路線を作成します。

 

注意

  • この記事ではBlender 2.79における操作について解説しています。2.8以降では操作が異なる場合があります。

 

 

GISOSMについて

GISとは、地理情報システムのことです。

 

今回はOpenStreetMapOSM)から地理情報をダウンロードして使用します。

OpenStreetMapとは、誰でも編集が可能なみんなで作る地図サービスです。

OpenStreetMapからダウンロードするデータは.osmファイルになります。

後述のBlenderGISを用いてダウンロードしますので、OpenStreetMapからダウンロードしなくて大丈夫です(.osmや、その他の地理情報データをインポートする事もできます)。

 

Blender

今回はBlenderと言う無料の3Dモデリングソフトを使用します。

こちらからBlenderをダウンロード、インストールして下さい。

https://www.blender.org/

 

Blenderの使い方については、ここでは解説しませんので、こちらを参考にして下さい。

https://blender-cg.net/

 

BlenderGIS

次は、Blenderで地理情報データを使用する為に、BlenderGISと言うBlenderアドオンをインストールします。

 

BlenderGISのインストール方法についてはこちらにあります。

https://github.com/domlysz/BlenderGIS/wiki/Install-and-usage

ですが少し難しいので、ここで解説をします。

 

まずBlenderGISを動作させるには、GDALと言うものが必要になります。

GDALをBlenderGISのほうで解説されている方法ではなく、Conda(Anacondaを用いた方法でインストールします(BlenderGISで解説されている方法ではインストールできない場合があります)。

 

BlenderPythonと言うプログラミング言語で出来ており、

Pythonではライブラリを入れる事で機能を増やす事ができるようになっています。

BlenderGISが必要としているGDALはPythonのライブラリです。

AnacondaはPythonのライブラリを簡単に管理する事ができます。

 

Anacondaはこちら

https://www.anaconda.com/

 

Anacondaをインストールしたら、GDALをインストールします。

コマンドを実行してインストールするのですが、

Windowsでは、スタートメニューボタンを右クリックして「コマンドプロンプト」を選択すると、コマンドプロンプトを開けます。

コマンドプロンプトでこちらの通りにコマンドを実行して下さい。

https://gdal.org/download.html#download

 

次にBlenderGISをインストールします。

先程のインストール方法に従って下さい。

 

BlenderGISの初期設定

BlenderGISを導入すると最初に初期設定が必要になります。

 

左側のメニューから GIS を開いて、

f:id:Densyakun:20200406010218p:plain

 

Preferences を押してアドオンの設定を開いてください。

f:id:Densyakun:20200406010353p:plain

 

Basemaps 内の Cache folder の右のボタンを押して、

キャッシュを保存するフォルダを指定します。

自分の好きなフォルダを指定できます。

空のフォルダを作成して、それを指定することをおすすめします。

f:id:Densyakun:20200406014024p:plain

以上の設定は初回起動時にのみ行います。

今後は不要です。

 

プロジェクトを作る時に

私の場合ですが、プロジェクトを作る時には、

デフォルトのプロジェクトにある Lamp 以外の、

Camera と Cube のオブジェクトを削除して、

Lamp を設定でポイントからヘミにします。

 

このオブジェクトはレイヤー1に置いたままで、

後で複数のレイヤーを使います

 

Basemapで作成したい場所に移動する

Basemap とはBlenderGISの機能で、

Blender上で地図を表示しながら編集する事ができます。

 

GISメニューから、 Basemap を押してください。

f:id:Densyakun:20200406081157p:plain

 

ソースGoogle 、 レイヤーMap 、 Tile matrix setWeb Mercator にして、

OK を押してください。

以前はOSMの地図が表示できたのですが、

20年2月現在ではGoogleMapしか表示できませんでした。

f:id:Densyakun:20200406083756p:plain

 

すると地図が表示されます。

f:id:Densyakun:20200406094434p:plain

3Dビューの下の方に Map view と表示されます。

この状態では地図の操作のみができます。

 

マウスドラッグ移動スクロールズームができます。

Google Mapではズームレベルが 0~22 まですべてサポートされていますが、

OSMなど、一部ズームレベルでは表示できない場合があります。

 

Gキーで検索もできますが、ぜんぜん違う場所に行ってしまう場合があり、おすすめできません。

 

ここ重要!

BlenderGISにはBlenderのプロジェクトに原点の経緯度が記録されます

Basemapを操作しようとすると、原点の経緯度が移動し、オブジェクトも移動します。

ただし、表示しているレイヤーの物体しか移動しないので、地図を移動する際は全てのレイヤーを表示して下さい

 

 

ですがBasemapの操作が反映されるのには少しクセがあるので、

小規模の移動などは、できる限りBlenderのカメラを移動するようにして下さい。

 

移動とズームで自分が作成したい場所を表示してください。

画像のように作成範囲の全体を収めるようにしてください。

f:id:Densyakun:20200406142007p:plain

ただし、一度に広範囲のデータを入れることはできません。

また、広いと環境によってはPCが重たくなってしまうため、

作成したい路線の各駅間または、3平方km程度に分割して入れることをお勧めします。

また、後でBve5上でデータを表示します。

 

Bve5では進行方向にあるものが表示されるため、

A駅からB駅に向かう区間の場合、B駅にストラクチャを設置するイメージとなります。

そのため、あまり距離があると描画距離を遠くしなければならない事にも注意して下さい。

 

範囲を表示したら、

Escキーで地図の操作を中止して、Blenderの操作に戻って下さい。

再度地図で移動したい場合は、Basemapを押してください。

 

地図に合わせてOSMデータを入れる

次に線路や道路、構造物などのOSMデータを入れます。

 

レイヤーを分けておく

ですが、OSMデータを入れると大量のオブジェクトが追加されます。

このオブジェクトを扱いやすくするため、ここでは

Lampなどの基本的なものをレイヤー1にして、

OSMデータをレイヤー2に入れるようにします。

 

Lampはすでにレイヤー1にあると思いますので、

数字の (3Dビュー上にカーソルを置いて)2キー(テンキーではありません) を押して、

レイヤー2を選択します。

この状態で追加されたオブジェクトは選択されているレイヤー2に追加されます。

ちなみにレイヤーは複数選択できます。複数選択している状態で追加されるオブジェクトは複数のレイヤーに含まれます。

 

なお、レイヤーでオブジェクトを分けない場合、Lampなどのオブジェクトを選択から省きたい、などといった場合に操作がめんどくさくなります。

 

GetOSMで地図に合わせてOSMデータを入れる

次に、GISメニューから GetOSM を押してください。

f:id:Densyakun:20200406142951p:plain

 

以下の画像のように Ways を選択します。

その下の building などは何も選択しないでください。

(複数選択ができます。選択してしまった場合は最初からやるか、 Ctrl+クリック で解除してください)

 

次に、 Separate objects にチェックを入れます。

これにチェックを入れることで一つ一つのデータが別々のオブジェクトになります。

 

OK を押してしばらくするとOSMデータがオブジェクトとして追加されます。

f:id:Densyakun:20200406143144p:plain

 

これでデータを入れることができました。

この状態で元に戻すと、Blender GISの仕様上、

データを入れる前ではなくさらにBasemapの移動も戻るので注意してください。

 

使いたい部分に絞り込む

入れたデータのうち、線路のみを使いたいので、不要な部分を消す作業をします。

 

今の状態ではすべてのオブジェクトが選択されているはずです。

なので、(3Dビュー上にカーソルを置いて)Aキーを押して選択を解除してください。

(この操作はオブジェクトが選択されていない状態では全てのオブジェクトが選択され、オブジェクトが選択されいる状態ではオブジェクトの選択が解除されます)

 

さらに手作業で線路に絞っていきます。

線路のオブジェクトを右クリックで選択して、

Ctrl+iで選択を反転して、Delキーで削除してください(確認が出るのでOKを押してください)

 

あるいはBキーで矩形選択を使う方法もあります。

この時、Blenderは範囲内に収まるオブジェクトを選択するのではなく、

範囲内に触れるオブジェクトが選択されるため、

不要なものを選択するのではなく、

必要なものを選択してから、選択を反転することで、

不要なものを選択すると良いです。

また、矩形選択は今選択されているものに追加して選択されますので、

範囲を分割して選択するほうが良いです。

 

Blender GISを使用すると、グリッドの間隔が広がり、

カメラが一定以上ズームできなくなることがあります。

これは、Nキーでメニューを開き、「表示」(または"Display")の、

グリッド」の中にある拡大縮小の値を1にすると直ります。

 

 

こんな感じになればOKです。

f:id:Densyakun:20200408101728p:plain

 

抜けている場所がある場合

範囲が広いと、画像のように抜けている場合があります。

f:id:Densyakun:20200408102331p:plain

 

Basemapで抜けている箇所にズーム(このとき、すべてのレイヤーを選択してください)し、

レイヤー3を選択して、Get OSMをします。

するとレイヤー3に抜けている箇所を含むデータが追加されます。

先ほど同様で、抜けている箇所のみに絞り込みます。

Mキーを押してから2キーを押して、レイヤー3にあるものをレイヤー2に移動します。

2キーを押してレイヤー2を表示して、抜けている箇所が直っていたら完成です。

 

線路のガイドを作成

ここで作るガイドは平面におけるガイドになります。

つまり勾配などのガイドにはなりません。

Get SRTMでスペースシャトル立体地形データを取得できるのですが、

これがだいぶ誤差があり当てにならないので、

勾配は後で、前面展望などを見ながら、合わせていくと良いと思います。

その場合は前面展望を早送りすることで勾配が分かりやすくなります。

 

線路を結合してまとめる

この状態ではオブジェクトが分かれており、編集するのに手間がかかってしまいます。

f:id:Densyakun:20200408104239p:plain

 

同じ線路(上り線や下り線など)のオブジェクトをすべて選択し、Ctrl+Jキーで結合します。

画像のように一つのオブジェクトになればOKです。

f:id:Densyakun:20200408104922p:plain

 

重複する頂点を削除

このデータは点が結合されていません。

オブジェクトを選択した状態でTabキーで編集モードに切り替え、

Aキーですべてを選択したあと、

左の「ツール」タブから削除の中にある「重複頂点を削除」をすると、

同じ場所にある複数の頂点を一つにできます。

Tabキーでオブジェクトモードに戻すと完了です。

 

不自然な箇所を修正

f:id:Densyakun:20200408105039p:plain

画像のように不自然な箇所がある場合があります。

編集モードで修正してください。

 

 

カーブに変換

オブジェクトモードでAlt+Cキーを押して、「メッシュ/テキストからカーブ」を選択して、メッシュからカーブに変換します。

f:id:Densyakun:20200408111130p:plain

 

円の作成(一回だけ)

ガイドとして表示するために、円のカーブを作成します。

左の作成タブからを選択します。

半径を0.5(m)にします。

 

この作業はストラクチャごとに一回だけ行います。

 

ベベルの設定

先程の線路のカーブのプロパティから、

先ほど作成したベベルをベベルオブジェクトに設定します。

f:id:Densyakun:20200408120213p:plain

 

ついでにマテリアルも設定します。

f:id:Densyakun:20200408120713p:plain

 

ホームのガイドを作成

f:id:Densyakun:20200408120914p:plain

 

画像のようなホームのオブジェクトがあります。

これも重複頂点の削除を行います。

 

そしたら、Fキーで面を作成します。

たまに面が反転しており、暗くなっていることがあります。

このような場合には、Ctrl+Fで面を反転を選択してください。

反転して明るくなればOKです。

 

また、こちらも線路と同様にマテリアルを適用します。

ただし、カーブにする必要はありません。

 

ホームのオブジェクトがない場合

ホームのオブジェクトがない場合があります。

この場合は、手作業で作成する必要があります。

 

Basemapのときにレイヤーを Satelite にすることで、

航空写真を表示できます。

航空写真に合わせてオブジェクトを手作業で作成します。

 

地下区間ではこの方法は使えません。

どうしても、基準が曖昧になってしまいます。

なので、終点までホームのオブジェクトがない、という場合を除いて、

例えば、A駅からB駅を作成しようする場合は、

B駅に完成したガイドのオブジェクトを設置するわけですが、

B駅のホームのオブジェクトがない場合は、

A駅からB駅を挟んだC駅の区間を作成することに変更します。

この時、C駅はホームのオブジェクトがある必要があります。

なので、A駅からホームのオブジェクトがあるC駅までの区間、ということになります。

ですが、距離が長くなってしまうといけないので、

それぞれの区間のズレを、経緯度などで位置を合わせるほうが良いです。

 

エクスポート用のピボットの設定とオフセット移動

次に、「ストラクチャを置く駅」の位置を決めます。

最終的に、駅にあるオブジェクト(無ければ作成してください)を原点するのですが、

その位置を決めます。

 

「ストラクチャを置く駅」のオブジェクトの原点が、

オブジェクトの内容とズレていると思います。

これを直す作業を行います。

 

「ストラクチャを置く駅」のオブジェクトを選択して、

編集モードですべてを選択している状態で、

Shift+Sでスナップ設定を開き、カーソル → 選択物を選択します。

次に、オブジェクトモードで選択物 → 3Dカーソルを選択します。

次に、編集モードで選択物 → 3Dカーソル(オフセット)を選択します。

これでオブジェクトの原点が内容に合わせることができました。

 

メルカトル図法の歪みを計算し記入しておく

この方法ではメルカトル図法の歪みが含まれており、

このままストラクチャとして入れてしまうと、

東京であれば1.2倍ほどの大きさになってしまいます。

なので、歪みを修正する必要があります。

地球は球体(正確には楕円体)なので、3DCGの空間に置き換えると、

どうしても歪みがありますが、

メルカトル図法における歪みをできる限り直します。

歪みについては詳しくはこちらの記事で解説しています。

densyakun.hateblo.jp

 

今回は、自作のページで歪みを自動的に計算します。

こちらのページを開いてください。

https://densyakun.github.io/MercatorScale/

メルカトル図法における歪みは 緯度 (latitude) に対して変化します。

 

f:id:Densyakun:20200408143622p:plain

Blenderの画面の左のGISタブから、GeosceneGeoを押して

左から、 経度 (longitude) 、 緯度 (Latitude) となっているので、

右の緯度の値をコピーします。

Blenderでは内部の値は細かいのですが、

小数点第二位までしか表示されませんので、

このまま設定してしまうと移動してしまいますので、

Escキャンセルしてください。

 

先程のページのlatに値を入れてEnterを押すと、

歪みの値が表示されます。

 

次に、1キーでレイヤー1にして、

Blender空のオブジェクトEmptyで構いません)を作り、

名前に先程計算した値を書いておきます。

(私の場合はlat: 35.54, scale: 1.225と書いておきます)

値は小数点第六位、そんなに気にしないのであれば小数点第三位までで大丈夫です)

 

後でこの値を使用して歪みを修正します。

 

ここで保存(ここから先は保存してはいけない)

ここで.blendファイルを保存します。

ここから先はエクスポート用の設定をするので、

ここから先は保存しないでください。

 

エクスポート用に編集

次に、オブジェクトを一つにします。

このとき、ストラクチャとして使用するためにメッシュにする必要があります。

 

2キーレイヤー2を表示して、

「ストラクチャを設置する駅」のオブジェクトを選択し、

次に2回Aキーを押してすべてのオブジェクトを選択します。

このとき、「ストラクチャを設置する駅」のオブジェクトがアクティブ(デフォルトのテーマでは、オレンジではなく黄色になっているオブジェクトです)になるようにしてください。

 

次に、Alt+Cを押して「カーブ/メタ/サーフェス/テキストからメッシュ」を選択します。

次に、Ctrl+Jオブジェクトを統合します。

すると、すべてのオブジェクトが統合され、

「ストラクチャを設置する駅」がオブジェクトの原点になっていると思います。

 

次に、オブジェクトの原点をワールドの原点に移動します。

Shift+Sカーソル → 原点を選択し、

次に、Shift+S選択物 → 3Dカーソルを選択します。

 

次に、メルカトル図法の歪みを修正します。

画像のようにピボットポイント3Dカーソルに設定します。

f:id:Densyakun:20200408150044p:plain

次に、オブジェクトを選択している状態で、

Sキーを押して、/キー(スラッシュ)を押して、

先程の歪みの値をペーストして、Enterを押します。

(値をペーストするとそのまま入力されますが、/を押すと値が逆数になります。先程の値は1より大きいですが、今回は小さくしたいので逆数の値を使います)

 

これで、エクスポートできる状態になりました。

 

.xファイルでエクスポート

Blenderでエクスポートできるようにするためには、

アドオンを有効にする必要があります。

上のメニューバーからファイル>ユーザー設定...を選択し、

アドオンタブを開いて、左上の検索に「x 」と入力します。(xのあとに半角のスペースを付けます)

Import-Export: Direct X Format」というアドオンにチェックを入れ、有効にします。

次に、下の「ユーザー設定の保存」を押します。

この作業は一回だけです。

 

次に、メニューバーからファイル>エクスポート>DirectX (.x)を選択します。

路線データのストラクチャフォルダを選択し、

お好みのファイル名を入力し、Export DirectXを押します。

これでエクスポートができました。

 

そしたら、Blenderを保存せずに閉じます。

 

次に、Blenderでエクスポートした.xファイルをBve5で使用するために、

以下の記事を参考に修正してください。

densyakun.hateblo.jp

 

ガイドに線形を合わせる

次に、Bve5で作成したストラクチャを読み込みます。

駅間の距離などを記入しておいてください。

私の場合はWikipediaなどを参考にしますが、

50mまではずれがあると思いますので、

線形を合わせたあとにガイドに合わせて駅の位置も合わせてください。

 

何回も言ってますが、A駅からB駅に向かう区間の場合、

B駅にストラクチャを設置します。

ストラクチャのY軸を回転して向きを調節してください。

すると、ガイドが表示された状態になります。

 

次にガイドに線形を合わせます。

この時、手前から線形を合わせると、ストラクチャが動いてしまいます。

なのでストラクチャを設置している駅から、

進行方向とは逆の方向に向かって線形を合わせていきます。

線形の合わせ方は、配線などを把握してから、

曲線を挿入したり、半径を調整するなどします。

 

最後に駅の位置を合わせて、完成です。

 

寸法通りに構造物も作りたい場合

ちょっと複雑ですが、

この方法で構造物(道路の幅や建物の寸法など、相対的な位置関係を必要とするもの)を寸法通りに作りたい場合は、

構造物を作った後に歪みを修正すると、逆に元々の寸法が歪んでしまいますので、

その点に注意する必要があります。

 

私であれば、

歪みを修正する前に構造物の基準となるデータ(点群など)を作り、

それを線形などのデータとは別に分け、歪みを修正して、

それから構造物を作成して、

線形などのデータ(歪みを修正する前)と、

構造物のデータ(歪みを修正したもの)の、

同じ経緯度にあるオブジェクトを作成してそれで位置を合わせるなど、

歪む前のデータと歪む後のデータを分けて作成して、

後で合わせる、という方法が良いかと思います。

 

おわりに

以上です。お疲れさまでした。

工夫することで資料のない未成線や、架空路線なども作りやすくなります。

手順が多いので大変ですが、じゃんじゃん路線を作成していきましょう!

ご覧いただきありがとうございました。

質問などあればご自由にコメントください。

 

【Spigot】Bukkitプラグインの作り方講座 - サーバーの操作とConsoleCommandSender

 

サーバー

サーバーはJavaPluginのgetServer()で取得できます。

getServer().addRecipe(Recipe)でレシピを追加したり、

getServer().banIP("192.168.1.1")などでIPBANをしたり、

getServer().broadcastMessage("こんにちは")でサーバー全体にメッセージを送信したり、

getServer().clearRecipes()でレシピを全削除したりなど、いろいろなことができます。

その他、仮想インベントリの作成、地図の作成、ワールドの作成、各種サーバーの設定、サーバーのシャットダウン、ワールドのアンロードなどができます。

ミニゲームサーバーなどで画面右にScoreboardというものを表示することができるのですが、当方で動作しなかったためここでは紹介しません。

また、バージョンにより実装方法が異なります。

 

オフラインプレイヤーとオンラインプレイヤー

getServer().getOfflinePlayers()でオフラインプレイヤー、つまり一度ログインしたプレイヤーの情報が取得できます。

ただし、オフラインプレイヤーのインベントリを操作したり確認することができません。

getServer().getOnlinePlayers()でオンラインのプレイヤーを取得できます。

プレイヤーは体力やエフェクトを設定したり、インベントリを操作することができます。

getServer().getBannedPlayers()でBANされているオフラインプレイヤーのリストを取得できます。

getServer().getMaxPlayers()で最大プレイヤー数を取得できます。

 

BANリスト

getServer().getBanList(Type.IP)あるいはgetServer().getIPBans()でIPBANのリスト、

getServer().getBanList(Type.NAME)でプレイヤー名でのBANリストを取得できます。

 

サーバーの情報

getServer().getMotd()でサーバーの説明を取得できます。

getServer().getName()で"CraftBukkit"という文字列を取得できます。

getServer().getBukkitVersion()でBukkitのバージョンを取得できます。

私の環境では"1.12.2-R0.1-SNAPSHOT"という文字列を取得しました。

getServer().getVersion()で私の環境では"git-Spigot-4bd94dc-1c40a81 (MC: 1.12.2)"という文字列を取得しました。

 

ConsoleCommandSender

getServer().getConsoleSender()でConsoleCommandSenderを取得できます。

getServer().getConsoleSender().sendMessage(ChatColor.GOLD + "(゚∀゚)アヒャ")

でサーバーのコンソールに色付きのメッセージを送ることができます。

 

記事一覧に戻る

【Spigot】Bukkitプラグインの作り方講座 - メッセージに色や装飾を付けるChatColor

メッセージに色や装飾を付けるChatColor

@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
	e.getDamager().sendMessage(ChatColor.RED + "いたいよ~");
}

以上のコードでは、エンティティがエンティティにダメージを与えたときに、ダメージを与えたエンティティに色のついた文字でメッセージを送信します。

f:id:Densyakun:20200401235036p:plain

 

ChatColorの使用方法は、ChatColorのお好みの色、装飾(太字や斜め文字、取り消し線など)を設定した場所より右側の文字に反映されます。

 

e.getDamager().sendMessage(ChatColor.RED + "" + ChatColor.BOLD + "いたいよ~");

BOLD(太字)の装飾を付ける例です。色とともに装飾を付けていますが、装飾を先につけてしまうと色を付けたときに取り消されてしまいますので、注意が必要です。

また、ChatColor同士の結合はできないので、文字列を挟む必要があります。

f:id:Densyakun:20200401235113p:plain

 

記事一覧に戻る

【Spigot】Bukkitプラグインの作り方講座 - 他のプラグインとの連携

 

外部プラグインとの連携

例えば、「経済プラグインと連携したい」と言った場合など、

プラグインなどをAPIとして利用して連携したい場合があります。

 

この場合は、

プラグインを作る」でプロジェクトを作成したときに、

サーバーのJarファイルを外部JARとして読み込んでいましたが、

全く同じ方法で、プラグインを外部JARとして読み込むことで、

作成するプラグインの中で、

読み込んだプラグインのクラスなどが扱えるようになります。

 

ただしこの方法では、作成するプラグインに、

読み込んだライブラリを含むことができません。

そのため、サーバー内で他のプラグインと連携したい場合に使うことができます。

 

IntelliJ IDEAでの設定(Gradle)

 

プロジェクトのフォルダ内にlibフォルダを作成します。

作成したlibフォルダの中に連携したいプラグインJarファイルを入れます

 

build.gradleファイルのdependencies内に、

compileOnly fileTree(dir: 'lib', include: '*jar')を追加します。

 

例:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compileOnly 'org.spigotmc:spigot-api:1.14.4-R0.1-SNAPSHOT'

    compileOnly fileTree(dir: 'lib', include: '*jar')
}

 

build.gradleを編集したら、

右下に「変更をインポート」が出てくるので押してください。

これでプラグインと連携することができますが、

IDEで編集する際にプラグインが見つからずエラーになってしまいます。

 

なので次は、プロジェクトにライブラリーを追加します。

メニューバー(ウィンドウ上部)の ファイル > プロジェクト構造... を押します。

 

左のメニューの ライブラリー を押して、一覧の上の + から Java を選択します。

libフォルダに入れたJarファイルを一つ選択します。

モジュールの選択という画面になるのでOKを押します。

複数のJarファイルがある場合は以上の作業を繰り返します。

 

これで、IDEのエディタから連携したいプラグインの、

パッケージ等を見つけることができるようになりました。

 

インポートのあたりに赤文字が出る場合は、

赤文字にカーソルを合わせ、

Add library '~' to classpath」を押してください。

 

必須プラグインの設定

作成するプラグインが連携先のプラグインを必須としている場合、

それをplugin.ymlに記載することで、

必須プラグインがない場合はプラグインを読み込まないようにできます。

plugin.ymlにdepend: [Plugin]と追加すると、

「Plugin」というプラグインを必須プラグインとすることができます。

読み込まれなかったプラグインは/plで見ると赤く表示されています。

 

プラグインを読み込む順序

プラグインを扱えても、読み込む順番などが求められる場合があります。

例えば連携先のプラグインよりも、作成するプラグインが先に読み込まれてしまうと、

その時点ではまだ連携先のプラグインが読み込まれていないので、連携ができません。

 

そういったことを回避するために、

plugin.ymlでプラグインを読み込む順序を指定できます。

softdepend: [Plugin]で「Plugin」というプラグインを先に読み込みます。

loadbefore: [Plugin]で「Plugin」というプラグインを後で読み込みます。

 

また、softdependやloadbeforeだけ記載しても、

必須プラグインとはなりません。

 

記事一覧に戻る

【Spigot】Bukkitプラグインの作り方講座 - CraftBukkitの利用と複数のバージョンに対応させる方法

CraftBukkitの利用と複数のバージョンに対応させる方法

 

ここらへんは少し難しい話になります。

 

Bukkit、Spigotではクラスではなくインターフェースが多用されていますが、

インターフェースということはそれを実装するクラスがあるということです。

実はそれらのクラスはBukkitの基本的機能であるCraftBukkitにあります。

CraftBukkitを利用することでより細かいことが出来るようになります。

 

Bukkitの「Entity」はCraftBukkitでは「CraftEntity」、「Arrow」は「CraftArrow」のように、

"Craft+xxx"と言った名前になっているので、開発環境で検索をかけてみると良いと思います。

また、それらのクラスはバージョンごとに違うパッケージの中にあります。

例えばCraftBukkitのバージョン名は「v1_12_R1」のようになります。

CraftBukkit1.12のCraftEntityは「org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity」のようになっています。

 

 

CraftBukkitはMinecraftサーバーを扱いやすくしたもので、

Minecraftサーバーの機能を継承しています。

 

Minecraftサーバーの機能に触れる事もできますが、弄るのがかなり難しいのでおすすめしません

また、CraftBukkitのバージョン名はMinecraftサーバーと同じです。

こちらはCraftArrowはEntityArrow、CraftChestはTileEntityのように、

「Entity+xxx」や「TileEntity+xxx」と言った名前になっています。

例えばMinecraftサーバーのEntityは「net.minecraft.server.v1_12_R1.Entity」です。

また、CraftBukkitでの「CraftChest」がMinecraftサーバーでは「TileEntityChest」になるように、

MinecraftサーバーとCraftBukkitでは構造が変わってくるので注意が必要です。

 

 

自分の作ったプラグインを、複数のバージョンに対応させる必要がある場合が少なからずあります。

その為には、CraftBukkitのバージョンごとにプラグインを分けるか、

一つのプラグインで複数のバージョンに対応させる方法があります。

 

私が作ったプラグインMinecraftサーバーの機能を利用して、

かまどでのアイテムの燃焼時間を取得するものがありますので参考にしてみて下さい。

https://github.com/Densyakun/BukkitPlugin_AutoMine/blob/master/src/io/github/densyakun/bukkit/automine/Main.java

これの78行目あたりにあるJavaのgetClass()などを利用して、メソッドを実行するメソッドを利用するなどします。

これを応用して複数のバージョンに対応させることが出来ます。

 

CraftBukkitやMinecraftの機能を利用するにはバージョン名を取得する必要があります。

バージョン名の部分はこの方法で簡単に取得できます。

getServer().getClass().getName().split("\\.")[3]

また、getServer()はサーバーを取得するメソッドで、プラグインのメインクラスで継承しているJavaPluginクラスで使用できます。

他にもBukkit.getServer()でもServerを取得できます。

ちなみにServerもCraftBukkitではCraftServerとなります。

 

記事一覧に戻る