A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

BungeeCard / TeleportSigns

BungeeCard_build#1013
TeleportSigns_v1.3.2

BungeeCardはサーバ間ゲートですね。プラグインではなく、Bukkitやspigotと同様に単体で可動するJavaサーバです。
よく、PvPサーバなどで見かけますが、ロビーサーバやゲームサーバなど一つのサーバ内で納められない場合や、全然別の他サーバとのサーバ間接続に使われますね。絵に描くと以下の様な感じ。

bungee

絵面的にはBungeeCardへログインしているように見えますが、入り口としての橋渡しになってるだけで、ログインすると直ぐにロビーサーバへ接続されます。
TeleportSignsは移動用のゲートを看板で実現するプラグインですね。BungeeCardはコマンドでサーバ間を移動するので、それをしやすくするだけのものです。

実現方法や機能制限などを纏めると以下の様な感じ。

  • BungeeCard自身が独自のポート番号を持つので、同じサーバ上のマイクラサーバが居るなら、その番号とは別にしなければならない。
  • BungeeCardを経由しなくても各マイクラサーバへのログインは可能(ただしそれは推奨できない。詳しくは次項以降)
  • 1.7の後半のバージョンから、マイクラサーバが個人情報をUUIDで管理するようになったが、BungeeCard経由だとUUIDが変わるので、運用中のサーバにこの機能を追加すると「お初さん」になってしまう。回避するには以下の設定が必要。
    ・spigotサーバを使って、設定ファイルspigot.yml内のbungeecordをtrueにする。
    ・BungeeCardのconfig.ymlのip_forwardをtrueにする。
  • 各サーバはonline-modeをfalseにしなければならない。(server.propertiesか、起動オプション-o trueを付ける)
  • どこのサーバに居ても外部から見えるサーバ全体のログインプレイヤー数はカウントされる。
  • MinecraftForgeの入ったクライアントだとログイン時のサーバ一覧にバニラ(V)かどうかの表示がでますが、バニラでは無いという表示になってしまいます。それでもロビーサーバがバニラならバニラで入れるし、そのほかのサーバがModサーバならサーバ間移動の時に遮断されます。

ちなみにspigot.ymlのbungeecordをtrueにすると、BungeeCord経由でなければログインできなくなります。何れにしろonline-modeを切ると管理者アカウントを奪われる危険性があるので、直接ログインはしない運用にするのが吉ですね。

以下、設定方法です。

  • TeleportSignsを使うなら、BungeeCordのconfig.ymlのpermissionsにあるbungeecord.command.serverはadminに移すべき。看板を使わなくても誰でもテレポートできちゃうっぽいので。
    また、以下の様な設定にすると、指定したプレイヤーだけがadmin permissionsに設定されたコマンドが使えますね。

    groups:
    プレイヤー名:
    – admin

  • config.ymlのlisteners設定の意味は以下の様な感じ。
    max_players…最大ログイン数だが、これは表示上だけ。実際には個々のサーバの上限が制限となる。
    fallback_server…ロビーサーバが死んでしまっている時に接続するサーバ名。
    host…BungeeCord自体の接続設定「0.0.0.0:25555」みたいにすると「25555」ポートで接続可能となる。
    default_server…ロビーサーバ
    motd…マイクラのクライアント側に表示させる紹介文
  • config.ymlのserversは、接続するサーバ分全て記入する。

    サーバ名:
    address: 192.168.xxx.xxx:25553  ←マイクラサーバのIPとポート
    restricted: false
    motd: ‘サーバ説明’  ←サーバの説明。ほとんど表示されることは無い。

  • ちなみに、config.ymlにもonline_modeの設定がありますね。当然、trueで運用すべき。
    ip_forwardについては上に書いた通りです。

鯖管のつぶやき

私の周りでマインクラフトのサーバを建てる人が多い気がするので、実際に公開マイクラサーバを建てるというのはどういうことかというのを経験を元に書いてみたいと思います。
まぁ、サーバを2つ立ち上げたとはいえ、まだ公開サーバ管理者歴半年の若輩者ですがご参考まで。

ちなみに実際にサーバを建てても公開しない・内輪だけって人も居ると思いますが、このコラムでは公開サーバを建てる前提で書いてます。

で、一回目のコラムは「何故サーバ管理者をかって出たのか?」というネタ。私の場合は以下の理由です。

  • サーバ管理が楽しいから(元々サーバを持ってた)
  • 好きなマイクラサーバが作れるから
  • 以前入ってたサーバが管理者のミスで巻き戻ったあげく、バックアップもろくに取って無くてせっかく作った物が戻らなくなってついカッっとなって。

元々趣味というか自分のスキルアップというかそんな感じでサーバを持ってたのですが、ゲームサーバを管理するというのがどういうことか?というのにはちょっと興味があった訳です。

あと、マイクラサーバはプラグインで結構カスタマイズができますが、実際にサーバを建てる人の楽しみってこれじゃないですかね?私もいろんなオンラインゲームをやってきましたが、いつかは自分好みのサーバを建ててみたいと夢見てた(実際にWebゲームくらいは作った事があります)訳ですが、それを実現するのにまさに好都合ですね。マイクラ鯖は。
マイクラ鯖を管理してるとよくわかりますが、ゲームとしてのマイクラは普通の人は1~2ヶ月くらいで一旦飽きます。当然それより長い人・短い人・’しばらくして戻ってくる人も居ますが、だいたい1~2ヶ月っていうのが平均みたいです。少なくとも「マイクラサーバを建てるという楽しみ」は1~2ヶ月程度では飽きないですね。っていうか公開サーバを建てるのにはそのくらいの準備期間が必要ですけどね。当然人に寄りけりですが、サーバを建てるというのはそのくらい楽しめます。

ちなみに巷のマイクラ鯖には「管理者が管理者に飽きてしまって、別の人に管理を委譲している」という例がソコソコあるようです。
当然そういうサーバはハードの管理者とマイクラの管理者が別です。どうも私が以前居たサーバもソレで、結局どっちの管理者もちゃんとバックアップの管理をしてなかったようで、結果的に大規模な巻き戻しが発生したようです。
なので、私の管理してるサーバはバックアップはかなりしっかりしてるつもりです。定期セーブは当然として、1時間毎のバックアップ(12世代)と、日次の外部バックアップ(10世代)、月次のバックアップ(消してないので残り続けてる)をしてます。
ちなみにクラウドストレージも使って本当に家の外へのバックアップも試したいなぁとも考えてます(むしろ安全よりも技術的な興味に近いw)

と、まぁいきなり長文となってしまってアレですが、次回に続きます。

VideoPad

videopad

Avalonサーバの紹介動画を作りたかったんですが、ムービーメーカは表現のしかたがそろそろ限界で、がんばっても似たような動画しか作れなくなってきたので、探してみました。

で、たどり着いたのがコレ。ちなみにどこかに無料って書いてあった気がしたけど、有料なのね。

やや使い慣れる必要はある物の、ムービーメーカに近い感覚で作れるので慣れやすいですかね。動画の画面が2つ有りますが、左が選択レイヤーのプレビューで、右がレイヤー合成後のプレビューなので、この辺の使い勝手もとても良いです。

難があるとすれば、テキスト一つ一つが画像扱い?のような位置づけで、コメントが多い動画を作るのがちょっと大変です。後はBGMが個々のシーンに合わせて希にぶった切られるのも使いづらいかな。エフェクトもシーン毎に設定するので、「纏めて全部に設定」ってのができないです。

ただ、エフェクトの設定は各レイヤー毎にかなり細かくできるので、時間を掛ければ様々な表現ができますので、ツールとしてはシンプルでいいですね。個人的に「ボタン一つで様々な事ができちゃう系」は好きじゃ無いので、そういう人にはお勧めです。

ちなみに作成した動画はこちら。

ニコニコ動画へのアップも初めてチャレンジしてみました。結構エンコードの制約とか厳しくて難しかったけど、「つんでれんこ」を使ったらあっさりアップ可能な形式が作れました。

プラグインEpicBoss_GoldEdition

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

既に公開されていないプラグインで、古いサーババージョンでしか動かないプラグインなんですが、改造して動かしてます。

ebge

既に何度も改造しているのですが、今回はワールドの中央から離れれば離れるほど強い敵が出ない仕様に改造してみました。基本的には敵の強さ毎にランク1~6までを定義し、敵の定義名に番号を振っているので、その数字を見て出現を制御してます。

ちなみに敵の出現量が100だとして、その中にランク3の敵が30%居た場合で、ランク3の敵が出ない地域に居る場合は、出現量が70となります。だから、敵の数自体もワールドの中央に近づくにつれて多くなります。

プラグインdynmap

プラグイン:dynmap-2.0.0-alpha-1.jar
サーバ:spigot-1.7.10-R0.1-SNAPSHOT_1641.jar

資源マップの生成をしてるけど、どうも地下を見せると、慣れてる人が欲しい地下生成物を片っ端から取っていってしまうということが起こります。とは言え完全に隠すのもわかりづらい。

というバランスを考えてカスタマイズしてみた結果がこれ

dynmap

先ず、worlds.txtの定義の部分にこんな感じで記載。(caveの定義だけ抜粋)

– class: org.dynmap.hdmap.HDMap
name: cave
title: “Cave”
prefix: ct
perspective: custom_cave
shader: lit-cave
lighting: default
mapzoomin: 3

shader: lit-caveというのが、どうも明かりをともした場所だけ描画するというシェーダらしい。定義済みなので、書くだけで機能します。なので、探索したところだけ見えるようにできそう。(実際にはその周辺の溶岩光がある場所も見えてる?)
「perspective: custom_cave」はカスタムパースペクティブ。custom-perspectives.txtに以下の様に追記して、それを参照してます。

perspectives:
– class: org.dynmap.hdmap.IsoHDPerspective
name: custom_cave
azimuth: 135
inclination: 15
scale: 1

azimuthが視点の方向を示す角度。135というのは南東から見てるよという数値。dynmapの他のデフォもこの角度をよく使ってるので、合わせてます。
inclinationが視点の高さ。90が真上で0が真横。15なので、かなり水平に近い視点です。
scaleが解像度みたいなもの。定義済みのパースペクティブで使われてる高解像度(hires)が16、中解像度(midres)が8、低解像度が4だそうで。上記は1なので、低解像度よりもさらに小さい数値です。

こんな感じで、「とりあえず見えるけど、探索しないと見えないし、見えても見づらい」というのを演出してみました。

プラグインTNTRun

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

前から入れて見たかったミニゲーム系。Alicornに似たようなプラグインでMinigamePartyというのが入ってるけど、あっちは重すぎるのでAvalon用の代替えプラグインとして入れられればなという感じ。

しかし、( ゚д゚)ハッ!と気がついたときには何故か翻訳作業を始めてたw

tntrun1

検証が先でしょうに・・・動かなかったらどうするのか。

・・・で、検証したらあっさり動きました。先ずこういう地形を作成。
tntrun2

WorldEditで対象エリアを全部選択し(後述のLoseAreaも含めて)、

  • /trsetup create アリーナ名
    ・・・作成
  • /trsetup setarena アリーナ名
    ・・・上記の選択範囲をエリアにする
  • /trsetup setloselevel アリーナ名
    ・・・敗北判定の区画。先に対象エリアを選択する。基本的には床の下のエリアで、そこに入ると負け判定になる。
  • /trsetup setspawn アリーナ名
    ・・・出現場所(スタート地点)の設定
  • /trsetup setspectate アリーナ名
    ・・・観客席?たぶん負けた人の保留エリア
  • /trsetup finish アリーナ名
    ・・・完了

あとは、看板を設置して1行目[TNTrun]、2行目[Join]、3行目アリーナ名とすれば、そこを叩くと参加となる。

ちなみに2名以上じゃないと開始できません。

・・・おっとBarAPIに緩衝するか?

[11:36:43 WARN]: java.lang.NoSuchMethodException: net.minecraft.server.v1_7_R4.PacketPlayOutEntityTeleport.<init>(int, int, int, int, byte, byte)
[11:36:43 WARN]: at java.lang.Class.getConstructor0(Class.java:2849)
[11:36:43 WARN]: at java.lang.Class.getConstructor(Class.java:1718)
[11:36:43 WARN]: at me.confuser.barapi.nms.v1_7.getTeleportPacket(v1_7.java:139)
[11:36:43 WARN]: at me.confuser.barapi.BarAPI.sendDragon(BarAPI.java:410)
[11:36:43 WARN]: at me.confuser.barapi.BarAPI.setMessage(BarAPI.java:230)
[11:36:43 WARN]: at tntrun.bars.Bars.setBar(Bars.java:45)
[11:36:43 WARN]: at tntrun.arena.handlers.PlayerHandler.spawnPlayer(PlayerHandler.java:109)
[11:36:43 WARN]: at tntrun.signs.type.JoinSign.handleClick(JoinSign.java:68)
[11:36:43 WARN]: at tntrun.signs.SignHandler.onSignClick(SignHandler.java:79)
[11:36:43 WARN]: at sun.reflect.GeneratedMethodAccessor451.invoke(Unknown Source)
[11:36:43 WARN]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[11:36:43 WARN]: at java.lang.reflect.Method.invoke(Method.java:606)
[11:36:43 WARN]: at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298)
[11:36:43 WARN]: at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[11:36:43 WARN]: at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514)
[11:36:43 WARN]: at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499)
[11:36:43 WARN]: at org.bukkit.craftbukkit.v1_7_R4.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:242)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.PlayerInteractManager.interact(PlayerInteractManager.java:382)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:662)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:50)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace.handle(PacketPlayInBlockPlace.java:86)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490)
[11:36:43 WARN]: at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628)

とりあえずBarAPIを外したところエラーは無くなりました。まぁ、見た目だけの機能だからいっか。LegendaryMessagesとSilkSpawnersで使ってるらしいけど、何に使ってるかわからないし。

再生成用の新資源

毎回のことですが、使い易い資源を提供できるようにいくつか生成してます。ちなみにネザーとエンドはほぼテキトーに作ってます。あ、ネザーはスポーンポイントが大きな空洞じゃないとボツかな。
候補1,2はボツでもう消しました。

res2-4 案3、今の所有力。ちょっと海が多すぎるのが難点。
res2-5案4、湿地が少ないのでボツ。
res2-6案5、う~ん、イマイチ
res2-7案6、お、これいいんじゃない?資源の種類も豊富だし。氷原とかはなさそうだけど、ジャングルがあればいいなぁ。
res2-8案7、いろいろバイオームが豊富だけど、レアバイオームは無し
res2-9案8、案7に似てるね。案7共に湿地が多いから、粘土の採取にはいいかな。
res2-10案9、あまり平地が無いw。大きなジャングルと雪原がありますね。いいんだか悪いんだか・・・?

JobArranger

jobarrenger

マインクラフトとは直接関係ないけど、定時処理用に使ってるツール。巷では「ジョブコントローラ」って呼ばれてる分類のプログラムですね。
定時処理はサーバなら普通にできるけど、こういうのを使うと例えば順列に処理しなければならないプログラムの前後関係とかを制御してくれるので、バックアップが動いている途中にサーバシャットダウンとかは絶対に起きない。あとは視覚的にフローチャートみたいでわかりやすいよね。

マイクラサーバの定期再起動やバックアップはこれを使ってやってます。

プラグインImageOnMap

ByD1uCKCIAMPtCW
プラグイン:imageonmap_v2.7.jar
サーバ:spigot-1.7.10-R0.1-SNAPSHOT_1641.jar
Web上の画像をmapに転写する。額縁に貼れば絵画代わりになる。

うまく動いている様にも見えるが、サーバごとクラッシュさせるバグもあるっぽい。

プラグインFramePicture

プラグイン:FramePicture_v1.7.3.jar
サーバ:spigot-1.7.10-R0.1-SNAPSHOT_1641.jar
ゲーム内の額縁にWeb上の画像を掲載できる超画期的なプラグイン・・・。なんですが、結局動きませんでした。
ちなみに、コマンドはFrameProtectと被ってますね。FrameProtectなんて超メジャー所と被らせないで欲しい・・・。まぁ、FramePicture:fpで行けたから良かったけど。フォールバックシステム様々。

ダウンロードまでは行けたけど、どうもそれの表示ができていない。PacketPlayOutMapがイケてないってところまではわかるけど・・・

[12:55:24] [Server thread/INFO]: Tactica issued server command: /FramePicture:fp set http://k.yimg.jp/images/top/sp2/cmn/logo-ns-131205.png
[12:55:25] [Server thread/INFO]: [FramePicture] Download http://k.yimg.jp/images/top/sp2/cmn/logo-ns-131205.png …
[12:55:25] [Thread-32/INFO]: [FramePicture] Image plugins/FramePicture/images/logo-ns-131205.png was downloaded!
[12:55:26] [Server thread/WARN]: [FramePicture] Task #61 for FramePicture v1.7.3 generated an exception
java.lang.NoSuchMethodError: net.minecraft.server.v1_7_R4.PacketPlayOutMap.<init>(I[B)V
at de.howaner.FramePicture.util.Frame.sendMapData(Frame.java:148) ~[?:?]
at de.howaner.FramePicture.util.Frame.sendTo(Frame.java:107) ~[?:?]
at de.howaner.FramePicture.FrameManager.sendFrame(FrameManager.java:180) ~[?:?]
at de.howaner.FramePicture.FrameManager.addFrame(FrameManager.java:209) ~[?:?]
at de.howaner.FramePicture.listener.FrameListener$1.downloadSuccess(FrameListener.java:101) ~[?:?]
at de.howaner.FramePicture.util.PictureDatabase$2$1.run(PictureDatabase.java:165) ~[?:?]
at de.howaner.FramePicture.util.PictureDatabase$1.run(PictureDatabase.java:33) ~[?:?]
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:641) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]
at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot-1.7.10-R0.1-SNAPSHOT_1641.jar:git-Spigot-1641]