アクセス状況

  • 0
  • 6
  • 84
  • 21,651

カウント開始:2014年9月21日
カウンター+75,945が開設当初からの訪問者数


since 2014/9/21

マイクラ管理者に出来ること・できないこと

svaサーバの運用をする上で、他のサーバがどのような運営をしているか参考にすることは多々あるんだけど、「これってどう実現してるんだろう?」って感じる運営をしているサーバが偶にあります。
当然、プレイヤーさんのサポートを充実した方が参加者が楽しくプレイできる訳ですが、とは言えできないこともあります。特に営利目的でサーバ管理をやっている訳じゃ無いから、どこまで自分の生活を削ってやるのか?なんてのも悩むポイントになりますね。

少なくとも私の場合は「出来ないことはやらない」というのが一つのポリシーなので、そういう所でプレイヤーさんから批判を受けることもあります。
まぁ後々になってから「ごめんなさい」をするより、初めから「出来ませんごめんなさい」って言っておいた方が、私もプレイヤーさんも後々困らないので、初めから「出来ないことはやらない」というスタイルで運営してます。

特に、これからサーバ管理者になる人、サーバ管理者に対して疑問を感じてる人は参考にしては如何でしょうか?

24時間サポートはできない

仕事や学校に行ってる時間は当然できませんし、勤めて無くても寝てたり外出してたりとかありますからね。旅行とかで数日間留守にすることもあります。

サブ管理者を立ててある程度は対処は可能ですね。サブ管理者というのは聞こえはいいですが、結構難しい問題が沢山あります。

  • その人をどう信用するのか。
  • どこまで権限を付与するか。
  • 運営ポリシーをどうやって共有するか。(管理者としての対応にバラツキを出しちゃまずいので)
  • お願いする人・したくない人の線引き。断るときはどう断るのか。
  • 着任・退任の判断。
  • そもそも何をさせるのか。

個人的に、サーバ管理者はとても楽しい遊びのスタイルだと思います。だから、サブ管理者というのはある意味「軽い責任でサーバ管理者を楽しめる」手段かもしれないですね。
ただ、リアルの知り合いでは無い人に対し、ある程度の権限を与えなければならないので、選任基準は厳密にしておかないと危険だと思います。
また、後述の通り、サーバ管理者にとって負荷のかかる部分は、サブ管理者に任せるのはとても難しいです。逆にそういう所を任せないのであれば、単純に管理の負担が増えるだけで意味がありません。
また、着任・退任の方法も難しくて、あまり任せたくない人が「サブ管理者やらせて!」と言うことも多いです。また、旨く管理者が出来てない場合や、来なくなった場合にどう退任させるかというのも悩まなければなりませんね。

まぁ、そんな感じなので私の場合は「サブ管理者」はお願いすることは考えてません。将来的にサーバの運営スタイルの一つとしてお願いする可能性があるかもしれませんが、そもそも「私の出来ないことはやらない」ポリシーだから、基本的に必要では無い感じですね。

プレイヤーさんのModを知ることはできない

何を入れてるかはわかりません。Forgeサーバであれば、Forgeクライアントの情報はわかります。これはどういうことかというと、以下の事を一発で特定することはできないと言うことです。

  • チートModの検出
  • 透過テクスチャなどの検出

基本的にFly・高速移動・鉱石探知などは、その行動パターンから疑いを掛けて、後はストーキングするとかしか無いですね。不正Modの調査と言いつつも透明化してプレイヤーさんを小一時間ストーキングするなんて調査もざらにあります。

ちなみにバグ利用はログで発見できることがあります。

サーバ・プラグイン・Modを改造することは難しい

これには、以下の条件があります。

  • サーバ管理者に技術があること。
  • プラグインやModの元となるソースプログラムが配布されていること。

マイクラはJavaというプログラミング言語で作成されているので、Java言語を知ってるならある程度触れますが、Java言語はその特性上、プログラムを作成する環境作りの難易度が高いです。また、知ってたとしても、マイクラ独自の「プログラミングのルール」があるので、それを勉強しなければならないので、それもまた難しいことです。

ましてや、世の中のITのプロフェッショナルで、サーバ(機器など)の管理ができて、プログラミングができて、プレイヤーさんと旨くコミュニケーションができるスーパサイヤ人はほとんど居ません。

他のサーバでプログラムの専門家やサーバの専門家など分業で運営してるサーバもありましたね。まぁ、そういう恵まれた環境ってのも少ないです。

また、私はプラグインの改造(主に動かない場合に直すだけ)はしますが、これをやるにしても元々のプログラムソースファイルが配布されていなければできません。これ自体は配布されてなければゼロから作るしか無いので、実質無ければどうにもならないです。
ましてや、プラグインではなくサーバ本体に手をつけるのは非常に厳しいですね。

ちなみに「ゲームプログラミング」というのはプログラミング業界の中ではかなり難易度の高い分野です。ちょっとなおしたり、新しいプラグインを開発するのはものすごい時間の掛かることなので、サーバ管理者をやりながら開発するのもこれまた困難なことですね。

BANは大変

BANはとても大変です。何が大変かは後述の通りですが、できることなら「自動的にBAN」すると非常に管理の負担が減りますね。

  • 本人からの反発が多い
    「何故BANなの?」というのに答えなければなりません。
    ある意味当然のことで、悪いことをしたとは言え、数十時間というプレイ時間を一瞬で奪うので、こういう反発は多いです。適当にあしらうと炎上なんてことにもなりかねませんからね。
  • 他のプレイヤーからの反発が多い
    概して「仲の良いグループ」と「そうでないグループ」というのができますが、不満は「そうでないグループ」からきます。それでBANすれば「仲の良いグループ」から不満がでますので、そこからも説明が求められることが多いです。場合によってはグループごと他サーバに移住することもあるので、サーバを盛り上げたい場合は慎重に説明しなければなりません。
  • 希に親からの反発も・・・
    後述してますが、マイクラの年齢層は意外と低いので、BANするとその親から質問が来ることもあります。
  • 曖昧なBANルール
    MCBansというツールがありますが、これはBANルールがはっきりしてるので、これに準じるといいでしょう。ただし、運営する上ではこれでは不完全です。特に一番扱いが難しいのは「マナー違反」系の問題ですね。
    「迷惑を掛けない」とか曖昧なルールは主幹の相違が起きるので、それに伴う反発も発生しやすいです。
  • 証拠の確保
    MCBansで反発が発生した場合は証拠が必要になります。基本的に管理者はログインしていない時間が多いので、証拠が不十分になりがちです。ログはあくまで機械的な部分しか取れないので、細かい表現などをログから知るのは骨の折れる作業です。
    明らかな違反行為(破壊とか)で無い場合の証拠の確保は非常に大変で、私の場合でも、BANの確認だけで、2,3時間掛けるのはザラにあります。

その他

探せばいっぱい「出来ないこと」はありますが、書き殴ってみると以下の様な感じ

  • ワールドデータの改変は困難。
    「ワールド内のアイテムデータを一斉変換」とか「ワールド内のニワトリを全部殺す」とかは実はほとんどできません。
    そういうツールもありますが、変換作業に数時間かかる上に、データ構造を理解してちゃんと変換しないとワールドデータが壊れるので、技術的にも困難です。(例えばチェストを削除する場合は中身のデータも削除が必要だとか)
  • プレイヤーデータの改変は困難。
    ログインしてる人のデータ改変は比較的楽ですが、データ異常でログイン出来なくなった場合の修正は難しいです。
    なので、プレイヤーデータをこまめにバックアップして、簡単に巻き戻せるようにしておいた方が楽ですね。
  • 若年者の管理が大変
    マイクラの年齢層は案外?若年層が多いです。マルチプレイヤーの1/3くらいは小中学生みたいですね。
    詳しくは書きませんが、若い人ほどルールの順守率は落ちるので、そこは気にして置いた方がいいでしょう。

Forge1.8(クライアント)とBungeeCord

forge1.8bug

BungeeCordを入れてる環境にマイクラ1.8+Forgeを入れたクライアントで繋げると、こんなのが出ちゃいます。BungeeCordのバグらしい?(情報ソース)
今の所の最新版(#1021)でダメです。

BungeeCordはかなり細かくパケットを見てるようなので、ちょっとした違いでログイン不可になりますね。

12/2 訂正:Forgeのバグらしい?ちょっと微妙

Mincraft(Spigot)1.8対応状況

現在サーバに導入しているプラグインが1.8に対応しているか調べてます。タイトルに書いてなかったけど、Spigotなので追記しておきました。動作が○でも、後で不具合が見つかる場合もあるので、参考程度です。

  • 公式で対応有無の記載関わらず、実際に動かしてみた結果です。
  • 起動、動作が×でも対応版有無が○でちゃんと動いたら1.8OK欄は○にしてます。
  • 調査に使用したバージョンは表示してませんが、まぁだいたい最新か、古くても1.7.10サーバで動いている物を利用しています。
  • とりあえず、2014/11/30時点での調査状況です。
    12/02、12/06 赤字の所をちょっと更新
    12/14 一応更新しました.この記事の更新はこれで最後にしておきます。なので、記載内容はこの時点での最新情報です.

12/06追記 ChestShopやTNTRunなどの看板の文字を読み取る系のプラグインは、看板文字の内部データが変化してるようで、ソレが原因で動かないみたいです。(今まではどうだったかわからないけど)

chestshop_in

看板の文字を読み取って動くプラグインはこの辺を厳密にチェックしているので、これを不正な文字と判断してるようです。だから、ServerSignsみたいに看板系でも看板の文字を読まないプラグインはこの影響を受けないっぽい。

とりあえず、ソースをGetしてChestShopSign.javaのisValidPreparedSign関数の所、看板の内容を一行毎にチェックしているコードがあるので、その辺に以下の内容を加えてリコンパイルすれば動くようです
※改造は自己責任でw

lines[i] = Pattern.compile(“§r”).matcher(lines[i]).replaceAll(“”);
lines[i] = Pattern.compile(“§0”).matcher(lines[i]).replaceAll(“”);

12/06追記その2 :確認出来ている不具合

  • 二段の高さの花が壊れる(1.8自体の不具合)
  Alicorn Avalon 起動 動作 対応版有無 1.8OK 備考
AntiCreeper ○ ○ ○ ○ – ○  
AntiWither ○ ○ ○ ○ – ○  
BVotifier – ○ ○ ? – ? Forge+bungeeが動かないので未確認
BlockHat ○ ○ ○ ○ – ○  
BottledExp ○ ○ ○ ○ – ○  
CF ○ ○ ○ ○ – ○  
ChairsReloaded ○ ○ × × ○ ○  
ChestCommands ○ ○ ○ ○ – ○  
ChestShopLogger ○ ○ ○ ○ – ○  
ChestShop ○ ○ ○ × △ × 上記を参照
CookieMonster ○ ○ ○ ○ – ○  
CountryLoginMessage ○ ○ ○ ○ – ○  
craftconomy3 – ○ ○ ○ – ○  
CustomSkulls ○ ○ ○ ○ – ○  
dynmap ○ ○ × – ○ ○ 最新版のspigotを使わないとレンダリングでおかしくなります
Dynmap-Towny – ○ ○ – – ○ dynmapが動けば動く
Dynmap-WorldGuard ○ ○ ○ – – ○ dynmapが動けば動く
EasyJetpack – ○ ○ ○ – ○  
EchoPet ○ – × × × × クライアントが対応してない
作者<対応に1.5~2週間程度かかるかも?
EpicBossGoldEdition ○ ○ × × ○ ○ ソースを修正してリコンパイル
Essentials ○ ○ – ○ ○ ○  
FlyPayment ○ ○ ○ ○ – ○  
FoundDiamonds ○ ○ ○ ○ – ○  
FrameProtect ○ ○ ○ ○ – ○  
GeoIPTools ○ ○ ○ ○ – ○  
HawkEye ○ ○ ○ ○ – ○  
HomeSpawnPlus ○ ○ ○ ○ – ○  
Jobs ○ ○ ○ ○ – ○  
LWC ○ ○ ○ ○ – ○  
LegendaryMessages ○ ○ ○ ○ – ○  
Lottery ○ ○ ○ ○ – ○  
LunaChat ○ ○ ○ ○ – ○  
MCBans ○ ○ – – – –  
MinigamesPartyD ○ – – – – –  
MobArena ○ ○ ○ △ – △ 我慢できる程度の不具合
Modifyworld ○ ○ ○ ○ – ○  
MonetaryDeathPenalty ○ – ○ × × ×  
Monster_Apocalypse – ○ △ × × × 作者が掲示板で変な発言をしてる?ソース配布が無いので待つしか無い。
Multiverse-Core ○ ○ ○ ○ – ○  
Multiverse-Portals ○ ○ ○ ○ – ○  
MyPet ○ ○ × × ○ ○ 1.2.1-SNAPSHOTのbuild#647で可動するみたい
OpenInv ○ ○ × × ? ? 公式にソースはある
Orebfuscator ○ ○ × × × × 起動skip、2.1.7が最新、公式にソースはある
PermissionsEx ○ ○ – ○ ○ ○  
PlgLogCmd ○ ○ ○ ○ – ○  
PluginManager ○ ○ ○ ○ – ○  
ProtocolLib ○ ○ × × ○ ○ OrebfuscatorとScoreboardStatsで使用
12/2対応版出ました→こちら
Questioner – ○ ○ ○ – ○  
RecipeManager ○ ○ ○ ○ – ○  
RunAs ○ ○ ○ ○ – ○  
ScoreboardStats ○ ○ × × ○ △ 対応版はこちら、クライアントバージョン1.8ではダメ?1.8.1ならちゃんと動く
ServerSigns ○ ○ ○ ○ – ○  
ShadowAdmin ○ ○ ○ – – – もともと動作があやしいので使わないかも
SilkSpawners – ○ × × △ △ 既存のスポナーが消える。チェスト内のスポナは豚スポナに変化する。useReflectionをfalseにすると動くことは動くっぽい?ただし、設定を戻すと全て豚スポナになります.
SimpleSort ○ ○ ○ ○ – ○  
SimpleVoteListener ○ ○ ○ ? – ○  
Stats ○ ○ ○ × – ○ v2で動作確認
StopKorean ○ ○ ○ ? – ?  
TNTRun – ○ ○ × – × 看板が作れない
TeleportSigns ○ ○ ○ × – – Teleportで代替え
Teleport – ○ ○ ○ ○ ○  
Tombstone ○ ○ ○ ○ – ○  
TownyChatSupport – ○ ○ ○ – ○  
Towny – ○ ○ △ ○ ○ 町の削除に失敗する⇒修正版が出た
TreeAssist ○ ○ ○ ○ – ○  
Vault ○ ○ ○ ○ – ○  
Votifier ○ – – – – ○  
WorldBorder ○ ○ ○ ○ – ○  
WorldEdit ○ ○ ○ ○ ○ ○  
mcMMO ○ ○ ○ ○ – ○  
worldguard ○ ○ – ○ ○ ○  

SkyBlocks

SkyBlockの導入が出来ないか検証してみた。
どうしてこうマルチサーバ前提に作られていないのか・・・

  ワールド 前提 報償 他ワールドと
インベ分割
JoeSkyBlock v1.0.4 自動生成
(自作も可)
有り
(必須では無い)
無し 出来る
uSkyBlock v.0.9.6 自動生成 無し 有り 出来ない
Mini-SkyBlock v0.2 今居るワールドに作る 無し 有り 出来ない
askyblock V2.5 自動生成 無し 有り 出来ない
IslandWorld v4.5 事前に生成 有り 有り 出来ない

 

Joe's SkyBlock

非常にシンプル。報償は無いが、SkyBlockへの参加・戻り時のインベントリの棲み分けがちゃんと出来てる。
flyやEnderChestの使用禁止、土地の保護も出来てる。
死んだときにSkyBlockと非SkyBlockのインベントリが逆転してしまうバグがあるのが致命的。

uSkyBlock

SkyBlock onlyのワールドしか作れない

Mini SkyBlock

要するに今居るワールドに小さい島を作るだけ。ぶっちゃけ、プラグインが無くても作れる。
報償機能が便利な程度

A SkyBlock

GUIメニューがあるなど機能としては完成度が高い。
他のワールドとは棲み分けが不可。

IslandWorld

Dynmapとの連動など非常に高度。
Skyblockとしての出来は良いが以下の事ができない

  • SkyBlockへの移動・戻りができるが、インベントリの中身を棲み分けられない(単純に消すのは出来る)
  • ワールドは事前に作成

プラグインResidence

プラグイン:Residence_v2.6.6.6.jar
サーバ:spigot-1.7.10-R0.1-SNAPSHOT_1641.jar

ResidenceはTownyのような町作り系のプラグインですが、Townyよりシンプルかな。結局使わなかったので、簡単にご紹介だけ。

使い勝手的にはWorldGuard(region)の逆という感じ。

どういうことかというと、regionは保護されてない土地に対して範囲を指定して保護するプラグインだけど、Residenceは保護されている土地に対して自分が使いたい土地を範囲で取得する感じです。なので、regionとTownyのいいところを両方持ち合わせている感じですね。

  • regionと同じ感じで細かく範囲を指定できる(Townyはチャンクだけ。Residenceはチャンクを範囲で指定もできるし、特定の立方体範囲もできる)
    しかも、WorldEditCUIにも対応してるみたい。
  • 初期状態でワールドでの建築を拒否にしておけば、事実上荒らしの被害を受けない。(許可しない限り他者に建築を許可しないし、範囲を指定しないと自分自身も建築できないから)。この辺はTownyのメリットと同じ。

シンプルさではTownyよりも使い易いんだけど、必ず初めに範囲指定しないと建築できない煩わしさはTownyと同じで、管理者としては気にしなければならないポイントですね。デフォルトでワールド建築許可にしたらregionと何も変わらないし。

regionよりも安全に、且つTownyほど複雑にしたくないなら、間違えなくこれを選択した方がいいです。

ぬるぽ(エラーとの付き合い方)

 ∧_∧    
 ( ´∀`)< ぬるぽ 

  ( ・∀・)   | | ガッ 
 と    )    | | 
   Y /ノ    人 
    / )    <  >__Λ∩ 
  _/し’ //. V`Д´)/ 
 (_フ彡        / 

マイクラサーバを運用する上で欠かせないのがプラグインやModだと思いますが、旨く動かないことも多いので、これらとどう付き合って行くかがマイクラサーバ運用の肝の一つだと思います。
本当はプラグインのソースまで読めればベストなのですが、さすがにそこまでは厳しいという人も多いと思いますので、エラーメッセージの読み方についてつぶやいてみます。

とても難しい内容だと思ってますが、サーバの管理をするなら避けては通れない道だと思うので、がんばって理解してみて下さい。

Javaとマイクラ

まず、マイクラサーバの仕組みを紐解いてみます。マイクラサーバはJavaで動いてます。なので、Javaとマイクラサーバがどのように関連しているかを知ることが大切です。
※このイメージが出来てないと、エラーログの意味がわからないので。

JavaはSun マイクロシステムズが・・・そんなことはどうでもいいや。一言でJavaと言いますが、プログラム言語、実行環境、開発キットを示す場合があります。なので、言葉の意味について整理してみましょう。

  • Java言語・・・プログラムを開発する為のプログラム言語。
  • Java実行環境(Java Runtime Environment/JRE)
  • Java開発キット(Java Development Kit/JDK)

なにそれ?って感じですが、プログラム言語については多くを語る必要は無いと思うので割愛します。
JDKに当たる物は別にJava特有では無く、Java以外の言語にもあるので珍しい物ではありません。要するにプログラム開発者向けのパッケージです。ただ、Javaの場合、開発者だけでなく使用者へ求められる場合も希にあります。JDKには(たしか)JREも含まれてるので、JDKがあればJREは不要だったはずです。(おぼろげ)

重要なのはJREです。
マイクラを代表とするJavaプログラムは、Windowsだけでなく、Unix/LinuxやMacでも動きます。本来これはOSの仕事でありつつも非常に難しいことで、Windowsが登場する以前は、ハードウェア毎にソフトウェアが売ってたくらい難しいことです(例えばNECパソコン用のゲームとか)
OSが進化することで、このようなハードウェアの違いをOSが緩和してくれてますが、やはりWindows専用ソフト、Mac専用ソフトが登場しています。
Javaは、そういったOSの違いを緩和してくれることを主軸に作られたプログラム言語なんですが、そのOSの違いを緩和する仕組みとしてJVM(Java仮想マシン)というのが存在してます。そういうJavaプログラムを実行する環境がJREです。

だからそれが何か?と思われるので、マイクラなどを含めたJavaプログラムの実行環境を絵面にするとこんな感じになる訳です。
minecraft_env
JDKはJREなどを含めた開発者向け便利ツールで、本来的には実行そのものに影響する物では無いので、ここでは省略します。

前述で、OSはハードウェアの違いを無くし、JavaはOSの違いを無くすと書きましたが、要するに、プログラムとハードウェアの間に立ってお互いの翻訳してるだけです。これと同様に、マイクラサーバにはプラグインを導入できませんが、これはBukkitやSpigotが間に立ってやり取りをしてくれているからなんです。

JREが重要というより、この構造が後述でもとても重要な意味を持ってくるので、ざっくり理解しておいて下さい。

そもそもエラーって何?

まぁ、プログラムが旨く動いていないことなんですが、エラーについても少し深掘りが必要です。
サーバの動作がおかしいときはだいたい以下の様な「ERROR」表示がでます。出ないで落ちる時もあります。

[10:53:10] [Server thread/ERROR]: Could not pass event BlockBreakEvent to HawkEye v1.6.2 org.bukkit.event.EventException
        at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:60) ~[?:?]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:509) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:494) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.a(PlayerInteractManager.java:192) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:565) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]Caused by: java.lang.NullPointerException
        at org.bukkit.craftbukkit.v1_7_R4.block.CraftBlock.getRelative(CraftBlock.java:179) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at org.bukkit.craftbukkit.v1_7_R4.block.CraftBlock.getRelative(CraftBlock.java:175) ~[spigot-1.7.10-R0.1-SNAPSHOT_1649-20141001a.jar:git-Spigot-1.7.9-R0.2-207-g03373bb]
        at uk.co.oliwali.HawkEye.blocks.BedBlock.getCorrectBlock(BedBlock.java:48) ~[?:?]
        at uk.co.oliwali.HawkEye.listeners.MonitorBlockListener.onBlockBreak(MonitorBlockListener.java:49) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor206.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_65]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_65]
        at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:57) ~[?:?]
        ... 15 more

エラーの出方も様々で、多量に出る物や、1回出た後に何事も無く 動き続けるもの、プラグインが切り離される場合など様々です。
ログにはいろんなタイプのエラーが出ますが、実はこれはエラーでは無く、例外処理と言います。一行目の末尾に「Exception」と書かれていますが、これを直訳すると「例外」です。
BukkitやSpigotのプラグインで出るエラーはほぼこの「例外処理が発生した」と言ってます。あるいはクラッシュしてダウンすることもありますが、それは後で書きます。

例外処理って何?ってことなんですが、本来エラーとはプログラムがそれ以上動作できない様な事象のことを指します。例えばコンピュータは「10÷0」という計算をすることが出来ないんですが、それをやらせるとエラーで止まります。(パソコン付属の電卓などでも出来ないので試してみるとわかりやすいかも)
「エラーで止まる」と一言で言いますが、これは大変なことで、最近のパソコンではいくつも同時にプログラムが動いてますが、これら一つでもエラーが起きるとパソコン自体が止まることを意味します。Windowsなんでしょっちゅうエラーが出るので、その度に止まってたら話になりません。
例外処理というのは、プログラムの途中で想定外の事が発生したことを見越して、その想定外が発生したらその種類毎に問題を解消する処理をさせる処理のことを言います。
絵に描くとこんな感じです。

minecraft_exe

なので、プラグインのエラーはほとんどが「想定外のことが起きたよ」と言ってるだけで、その想定外の内容を知らせてくれてるだけです。
問題なのは、Java以外にもこの例外処理というのが使えるのですが、最近は「例外処理が発生することを見越してプログラムする」ということも少なくないので、短絡的に「エラー→ダメ」とは言い切れない実情があります。

何が起きたかを掴む(マイクラクラッシュ編)

さて、話をマイクラに戻しますが、要はエラーなどのログから、何が発生したかを掴めれば、対処がしやすいかも?ってことです。
本当は、何故例外が発生したか、それに対してどうしたかまで掴めればいいのですが、そこまで理解するのはちょっと難しいです。少なくとも後者はプログラムを読まないとわからない事が多いですしね。

先ずは上記の例外処理の例に行く前にマイクラ自体の「クラッシュ」について語ってみます。
例外処理というのは「例外処理というプログラムが動いている」ので、そもそもプログラムが止まっている訳ではありません。マイクラサーバ自体が止まる(クラッシュ)というのはつまり例外処理すらできなくなった、あるいは例外処理の中でプログラムの続行が不可能と判断された場合です。
つまり、どこで問題が起きているかというとここです。

minecraft_env2

プラグイン自体がマイクラプログラムを止める時もありますが、それはそれでログに出ますが、よほどの事が無いとそんなことはしないでしょう。
私が経験したのでは、

  • ハードウェアがぶっ壊れてた。
  • OSの動きの問題(すごく重い・メモリが足りない)。

と言うのが大勢です。ハードウェアについてはマイクラの挙動に関わるのはCPU、メモリ、マザーボードくらいなので、その辺を怪しむべきですね。ちなみに1日3,4度サーバがダウンすることがありましたが、そのときはマザーボード(メモリスロット)の故障でした。この辺はmemtest86などの検査ツールが便利ですよ。
ちなみに「Javaのバグ」や「Javaがちゃんとインストールされていない」の可能性もありますが、私はまだ当たったことがありません。

あと、ForgeやModはインストール時にマイクラのプログラムを置き換えるようなことをするので、プラグインにおけるBukkitやSpigotのような緩衝材となるプログラムが存在しません。だからこれらの致命的なエラーの場合は誰も緩衝材になってくれないのでマイクラ自体が止まることも多いです。

何が起きたかを掴む(プラグインの例外処理編)

マイクラサーバの動作は以下の様にループしてて、イベントが起こり都度処理をする仕組みになってます。

minecraft_event

イベントというのは例えばマイクラの中で場所を移動したりとか敵に攻撃したりとかそういうことです。処理は、場所の移動、ダメージの計算などです。
同じ例外処理のメッセージが多量に発生するのは、つまりこのループの中でエラーが発生し続けていて、それを解消できていないということになります。

問題はその「イベント(切っ掛け)」が何なのか?なんですが、単にプレイヤーが移動したとか、Mobが移動したなど、いろいろ考えられます。
逆に1回しか出ない例外は、コマンドの実行に起因してたり、1回の例外で復旧できた(例えばプラグインの切り離しもそう)場合です。

早速、例外処理の読み方を見ていきましょう。上の方に書いたメッセージの読み方です。

先ず、一行目にどういう例外処理が発生したかがメッセージとして出ます。

[10:53:10] [Server thread/ERROR]: Could not pass event BlockBreakEvent to HawkEye v1.6.2 org.bukkit.event.EventException

これはHawkEyeというプラグインで、BlockBreakEventが失敗したという例外処理「org.bukkit.event.EventException」が発生したという意味だと思います。
本当にプログラムに精通した人じゃ無いと正確な意味はわからないので、文言から何が起きたかを予測してみましょう。
HarkEyeというプラグインはプレイヤーの挙動をデータベースに記録していくプラグインで、当然ブロックを壊した際にもその記録がされます。だから、それが失敗したんでしょうね。

これだけでもある程度原因を調べられそうですが、二行目以降も見ておきましょう。

at uk.co.oliwali.HawkEye.listeners.HawkEyeListener$1.execute(HawkEyeListener.java:60)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
~略~
at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264)
~略~

大分省略しましたが、一番目の行がエラーの発生箇所を示してます。HawkEyeListener.javaというプログラムの60行目でエラーが出ましたよという事です。
ちなみに「uk.co.oliwali.HawkEye.listeners.HawkEyeListener」とか「org.bukkit.plugin.RegisteredListener.callEvent」とかというのは、Javaというプログラムはプログラムを部品として開発して結合して動かす仕組みを取ってますが、そのプログラム部品の名前です。プログラム部品の名前が被ると困るので、頭にURLを逆にしたような文字をひっつけることが推奨されてます。私がJavaプログラムをつくるとしたら「jp.d77.云々」って名前になるんでしょうね。

プログラム部品がプログラム部品を呼び出して処理しているので、一行目の「HawkEyeListener.java」を呼んだのは二行目の「RegisteredListener.java」の62行目だよってことを示してます。つまりこの長いメッセージはそれぞれ誰に呼び出されたかを遡って表示してます。いい加減長いので最後は「… 15 more」って省略されちゃってますが

エラーから原因を調べる際には、ログからヒントを読み出さなければなりません。だから、一行目や二行目でわからない場合はその下の方を追っていくと、何かヒントが見つかるかもしれませんね。また、以下の図の様に、

minecraft_env

プラグインのエラーを呼び出したのはBukkitやSpigot、それを呼び出したのはマイクラ自身・・・とより深い層まで追うことも出来る訳です。
さて、あとはマイクラの仕組みなどを考えながら原因を探らなければなりません。上記のHawkEyeの場合はブロックの破壊を記録出来なかった訳ですが、1回出ただけなら偶然バグに当たったなども考えられますので、様子を見て考えるのも手でしょう。繰り返し出るなら特定のブロックに起因してるかもしれません。全てで出るならそもそもプラグインとしてまともに動いていないと判断する必要もあります。
プラグインがまともに動いてないなら、切り離すなり、バージョンアップ(あるいはバージョンダウン)を検討する必要もあるかもしれませんね。

もう少し、ケース別に例を見ていきます。

例外メッセージの一行目に設定ファイル名や設定項目が出てる場合

設定ファイルの書きそんじを怪しみましょう。ミスってる場所を示してくれる場合もあります。単純な文字コードが間違ってるとかカッコを忘れたりとか様々です。

java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_7_R2/…

プラグインが動かそうとしたbukkitのバージョンに対応してない時に出ます。
マイクラで例えばサーバが1.7.4の環境で1.7.2のクライアントが繋がったりとか、逆に1.7.9は繋がらないとか経験したことがあると思います。
これは、1.7.2は1.7.R1、1.7.9は1.7.R4というような内部的なバージョンが存在している訳なんですが、プラグインがそういうバージョンに依存する作りになってる場合、アンマッチだとこれが出ます。だから、サーバが1.7.10でプラグインが1.7.9のが出てれば、表向きのバージョンは違いますが内部バージョンが同じなので動く場合があります。

あるプラグインの例外で別のプラグインの名前が出てきた

別のプラグインが前提になってるにもかかわらず前提プラグインが無い場合に出ます。

何かエラーにメッセージ的な内容が含まれてる

ちゃんと翻訳して読むとわかる場合があります。例えば、「データファイルが無いです」というのは結構ありがちです(無いので作ってくれている場合は次回以降表示されない)

Outofmemoryとか

その名の通り、メモリ不足で止まったなど。

プラグインのプログラム部品名が別のプラグインと被ってる

過去に一度あったのですが、プログラム部品の名前が被ってたというのがありました。これはエラーから直接わからなかったですね。例外メッセージとプラグイン名でググったらそういう投稿を見つけてわかった感じです。
対処もプラグインプログラムの修正でないと直らないです。

何が起きたかを掴む(Mod編)

Mod系はちょっと難しいです。何故ならやはり例外処理を出す事が多いのですが、かなり深い場所でのメッセージの場合が多く、読んだだけでは理解できなかったり、理解できても対処しようが無いことが多いです。メッセージをそのままググって他の人も同じような目に遭ってないか調べてみるのがいいかもしれませんね、、、。

ですので、Mod系を大量に導入する場合は1つ導入しては起動というのを繰り返し、どのModが原因となってるのを掴むのが手っ取り早い場合も多いです。
マイクラのプログラムを書き換えるという特性上、書き換えたのを別のModがさらに上書きしてしまうこともありがちです。(その場合は導入順序の見直しで直る場合もあります)

 

と、、、ちょっと難しい内容でしたが、マイクラのサーバ管理をする上で、プラグインのエラーと付き合わなければならないので、この辺の知識が必要になってくると思います。逆にエラーの原因が掴めなくてあえなくサーバ閉鎖、、、、なんてのも少なくありません。
エラーログは何だかわからないメッセージの羅列で読むのもおっくうかと思いますが、読めるようになるのも慣れなので、わからなくてもなるべくがんばって読み解くようにしてみましょう。

ちなみに、タイトルに書いたぬるぽとは、NullPointerExceptionという例外の一種で、データの所在を示す情報(ポインター)がNull(=0/空)のまま処理すると出る例外です。原因はプログラマのミス(バグ)が大多数で、Javaに関わらず近年の様々なプログラム言語でとても出やすい例外です。マイクラでもこれはソコソコでる事がありますが、内容の通りそのメッセージから対処するのは困難かもしれませんねぇ。

サーバを考える

滅多に書かない鯖管のつぶやき二回目です。
今回はマイクラサーバを建てる上でのハードウエアをどう考えるかについてつぶやいてみようと思います。

お金がジャブジャブにあればお金を掛けてリッチなサーバを建てればいいんですが、そうも行きません。限られたお金を使って必要最低限のリソース(CPU、メモリ、ディスク、電気、etc…)を買う必要があります。
ってことで、マイクラサーバを建てる場合の考え方を書いてみようと思います。

» サーバを考える の続きを読む

マルチサーバ化

マインクラフトをマルチサーバ運営する方法について語ってみたいと思います。

マルチサーバと言っても、マルチワールドやマルチができるサーバのことではありません。マインクラフトサーバ(bukkitやspigotなども同様)を複数起動して運営することです。単一の物理サーバに複数のマインクラフトを立ち上げる事もあるし、物理サーバを分けて運営することもできます。物理サーバを分けた場合は、データ連係をどうするかが多少面倒になりますね。

そもそもなんでマルチサーバ運営を考える必要があるのか?

  • 負荷分散。PvPサーバ運営者が気にする点かな。
  • 複数管理者連携。
  • バニラサーバとModサーバ運用←私はこれ
  • その他(ログイン人数を合算させたりなど、見た目上一つにしたいとか)

ちなみにかなり面倒なので、心して掛かった方がいいです。
以下、考えなければならないことと、実現方法です。

ベースシステム

サーバを束ねるには、親となるシステムを構築する必要があります。マインクラフトクライアントからはそこにログインし、そこから適切なサーバへ振り分けられます。

  • マインクラフトサーバ
    bukkit…プラグインが豊富なサーバ。広く使われてるので情報が多く扱いやすい。
    spigot…bukkit互換の軽量サーバ。後述のcauldron、BungeeCordとの親和性が高い。
    forge…Modサーバを作るためのフレームワーク。Modの前提となっている場合が多い。また、クライアント側にもModが必要となるので、参加者側のハードルが上がる。当然、bukkitプラグインなどは使えない。
    cauldron…spigot+forge。以前はMCPCという名称だった。
  • マルチサーバ管理
    BungeeCord…複数のマイクラサーバを連動させることができる。見た目上はバニラでは無いサーバに見えてしまいますが、ログイン先がバニラならバニラで入れます。サーバ間移動も相手がオフラインだったり、前提Modが必要だったりする場合は移動しないよう制御をしてくれます。

BungeeCordの説明は過去に書いてるのでそっちを見て下さい。
単純に入れればマルチサーバ化できる訳では無く、前提がいろいろあるので注意が必要です。

データ連動

サーバが違うとデータも別扱いです。お金、経験値、アイテムなどです。
ちなみに同じデータファイルを複数のサーバで共有した場合、競合が発生して高い確率でデータが壊れるか、書き込みができなくなります。なので、通常のデータ連係はデータベースを使わなければなりません。

幸いにもbukkit系のプラグインはデータベースに対応しているものが多いので、それを使っていきましょう。データベースの種類はSQLiteかMySQLがほとんどです。
MySQLの方がサーバを建てなければならないなど難易度が高いですが、使い方を覚えてしまえば連携のしやすさはこっちが容易です。
SQLiteはサーバが必要無い為、使用するのは容易ですが、サーバが無い分、マルチサーバからアクセスするのが難しいです。っていうかそもそもどういうやり方がいいのか想像付きません。

私の管理しているサーバでは以下の連動ができることを確認してます。それ以外もできるかもしれませんが、未検証です。

  • お金
    CraftConommyを使ってます。元々Essentialsを使ってましたが、これはDBに対応してませんね。CraftConommyはDBに対応してるし、Essentialsのお金データをインポートできるので楽です(他の経済プラグインも対応してます)。
    なお、変換の際にプレイヤー名にハイフンかアンダーバーが使われてると勝手に変換される(どちらかというとEssential側の仕様)ので、注意して下さい。
  • mcMMO、Jobs
    これらもDBに対応しており、複数サーバから同時にアクセスできます。私のサーバはJobsを連携してませんが、これはゲーム性の観点でしてないだけで、技術的にはできます。

注意しなければならないのは、例えばTownyの様なプラグインはデータ連係できますが、サーバ間データ連動ができないので問題が起きます。例えばサーバ二カ所でTownyを起動した場合、税金は二重課金されます。さらにお金が連動できていなければ片側のサーバでお金不足になる事もあります。

HarkEyeなども連動できそうですが、怖いのでやってません。

念のため補足しておきますが、DB連動できたとしてもお互いのトランザクション処理がちゃんとできているかは別問題です。上記のレベルであれば今の所問題は起きてません。

機能連携

ゲームでの機能連携ですが、だいたい以下の方法でできます。詳しくは過去のコンテンツを見て下さい。

  • Dynmap
    Dynmap-MultiServerを使う事で連動できます。
  • 投票
    BVotifierでできます。Votifierと連動もできます。
  • チャット
    CloudChatというツールでできます。私は使いたいと思ってますがまだ使ってません。ローマ字変換とか無いので。
  • サーバ間ゲート
    TeleportSignsでできます。他にもHomeコマンド連動とかできるのも有るみたい。

運用

マルチサーバを運用する上でいくつか気になることもあると思います。思いつく限り書き連ねてみようと思います。

  • ロビーとなるサーバは安定させるべき
    単体でロビーサーバがあるのがベターですが、Modサーバなど安定しないサーバがある場合、ログインできなかった場合の待避サーバが設定できますので、そこにロビーサーバなどの安定したサーバを指定すべきです。そうすることで一カ所のサーバが死んでもプレイヤーは別のサーバで遊ぶことができます。
  • BungeeCordの扱いが難しい
    これが止まるとどのサーバにも入れません。また、管理者コマンドが少ないので、何かあったときに自由がきかないでやむを得ず再起動しなければならなくなる曲面も多いです。
  • ワールド名は同一にしない。
    同じ名前のワールドがあるとおかしな動きをする物があります。特にデフォでworldという名前が使われているので、ここがネックになる場合があります(server.propertiesで変えられます)
  • サーバ同士の連動性
    例えばMySQLのDBサーバを建てた場合、マインクラフトサーバを上げたまま、DBサーバを止めてはダメです。ちゃんと、
    マインクラフトサーバ停止→DBサーバ停止→DBサーバ起動→マインクラフトサーバ起動
    という順序を踏みましょう。停止は多少前後しても影響は少ないですが、起動は前後を間違えると確実にエラーが多発&ゲームに影響がでます。
    ちなみに私はJobArrangerというジョブコントローラを使って前後を管理してます。
    jobarrenger

BVotifier

BVotifier_v1.0.7.jar

Japan Minecraft Serversなどの外部サイトで投票してもらってそのお返しにアイテムを渡したりできますが、仕組み的にはVotifierなどのプラグインで受信し、その情報をSimpleVoteListenerなどでコマンド化してます。

BungeeCordでマルチサーバ化してる場合は、何もしなければ当然どれか一つのサーバでしか投票を受信できません(サーバ分だけ投票サイトに登録すれば別だけど)

それを一回の投票情報を複数のサーバに分散できるのがこのBVotifierです。BVotifierはBungeeCordのプラグインとして動作します。
既にVotifier運用しているなら導入は比較的楽です。何故ならこのプラグインはBVotifier→Votifierという連動をするので、Votifierも必要になるからです。
導入方法も簡単で、BVotifierをBungeeCordとマインクラフトサーバのpluginsディレクトリに置くだけです。Votifier側の設定はいじらないで連動してくれます。(※マインクラフトサーバ側は、Votifier.jarを消して、BVotifier.jarを有効にするが正解かも)

ただし、ポート情報はバッティングしてはならないので、適当にずらして下さい。

設定は本当にこれだけ。なお、ログインしてないと投票してるように見えないですが、ログインすれば投票したことがわかります。

Dynmap-MultiServer

Dynmap-MultiServer_0.5.0.jar

dynmap-multiserverマルチワールドではなく、マルチサーバです。BungeeCordなどでマルチサーバ運用をする場合、Dynmapも複数に分かれてしまいます。それを束ねて一つのWebサーバにするのがこれです。

これ自体、何かのプラグインではなく、単体のJavaプログラムとして動作します。(BungeeCordと連携する訳でも無いです)
主立った動かし方は以下の通り。

  1. ダウンロードして起動する。エラーで落ちるけど、この際にconfig、log、webディレクトリが作られる。
    java -jar Dynmap-MultiServer_0.5.0.jar
  2. configをいじる。
  3. 各サーバのDynmapをJsonFileClientUpdateComponentで動作させる。
    「- class: org.dynmap.InternalClientUpdateComponent」って設定とそれ以降の段落?の設定を全てコメントアウトし、「- class: org.dynmap.JsonFileClientUpdateComponent」って設定項目とそれ以降の段落(もともとコメントアウトされてる)を有効にする。
    設定変更後にdynmapをリロードすると反映されるが、この段階でdynmapをブラウザで見れなくなります。
  4. どのサーバのでもいいので、Dynmapの設定ディレクトリ以下のwebディレクトリを、Dynmap-MultiServerのwebディレクトリにコピーする。これは、Dynmap-MultiServer経由でWebを見る際のHTMLやCSSファイルを参照する為だと思います。
    なので、webディレクトリ配下のtilesディレクトリ(マップの画像が格納されたものすごくファイルサイズの大きいディレクトリ)のコピーは不要。
  5. Dynmap-MultiServerを起動させる。UNIX系ならコマンドの最後に&を付けてバックグラウンドで起動してあげればいいです。
    java -jar Dynmap-MultiServer_0.5.0.jar &

config/main.ymlの書きっぷりは以下の様な感じ

config/main.yml

Webserver:
IP: 0.0.0.0
Port: 8123
webDir: web/
Title: Dynmap
WorkerThreads: 16
DynMap:
– Folder: /mcserver1/plugins/dynmap/web
UpdateInterval: 4
– Folder: /mcserver2/plugins/dynmap/web
UpdateInterval: 4

気にすべき点はポート番号と「DynMap」以下に各サーバのDynmapディレクトリを書き連ねるというところ。
また、運用する上で気にしなければならない点は以下のところかな。

  • 上記の通り、Dynmap-Multiserverを動かすサーバから各Dynmapのディレクトリが見えないとダメです。1台のサーバにマインクラフトサーバを複数建てるなら全然問題無いですが、サーバそのものを分ける場合は、ファイル共有なり、NFSなりでディレクトリを共有しないとダメです。
  • Webの画面設定が結構難しいです(設定ファイルが無いので)。webディレクトリをコピーする前に、ある程度設定してしまいましょう。
  • 各Dynmapのバージョンを合わせないとダメです。ちょっと苦労したのは、バニラサーバとModサーバとでバージョンが合わなかったこと。これは各Dynmapの「web/standalone/dynmap_config.json」の中の「coreversion」を見てますので、私はここの数字を変更して起動してます。
  • Dynmap-Multiserverの起動障害のうち、カレントディレクトリをjarファイルのあるディレクトリにしておかないと起動に失敗することがありました。
  • Dynmap-Multiserverを起動すると特定のサーバで存在しないワールドデータを見に行って落ちる事象が起きました。どうやって直したかわすれたけど、確かweb/standalone/dynmap_ワールド名.jsonってファイルが影響してた気がする。
  • JsonFileClientUpdateComponentを有効にした場合によくあるんですが、マップ上のプレイヤーの所在がよくわからなくなることがあります。未だに原因はよくわからないんですけどね。
    ※JsonFileClientUpdateComponentは、そもそもWebサーバ機能をapacheなどの外部サーバに委託する時に使う設定なんですが、apacheでも同様の事象が起きていたので、この問題はDynmap-Multiserver側の問題では無いと思います。

起動したらconfigに設定したポートへブラウザ経由でアクセスすると、全サーバのワールドが混ざって閲覧できるようになります。