見出し画像

Dynmap で遊ぶ

注意: 公開されているソースコードを基に自分で行った解析から得た情報なので内容の正確性は保証できません。間違えているかも。

Dynmap とは?

Dynmap は Minecraft サーバー用のプラグインで、使用するとブラウザからワールドの地図を見たり、チャットをしたりすることができます。

この記事では自分で Dynmap を導入したサーバーを建て、その機能を試してみます。

サーバーの建て方・Dynmap の導入方法は記事の趣旨から外れるため割愛します。導入方法はこちらのガイドを参照してください。

環境
・ paper-1.19.3-367
・ Dynmap-3.5-beta-1-spigot
コンフィグはデフォルトからいじっていません。

Dynmap の機能

Dynmap はデフォルトで 8123番のポートを使用しています。自分でサーバーを建てればポートを開放せずとも localhost:8123 から Dynmap にアクセスできます。できるはずです。

プレイヤー一覧(など)を取得する

http://{マップのURL}/up/world/{ワールドの名前}/{タイムスタンプ(前回アクセスした時間)} にアクセスすると下のような Json が返されます。

"updates" を見ないのであればタイムスタンプは 1 を指定すれば良いです。

{
  "currentcount": 1,
  "hasStorm": false,
  "players": [
    {
      "world": "world",
      "armor": 0,
      "name": "_yuita_",
      "x": -32.0,
      "y": 71.0,
      "health": 20.0,
      "z": -1.0,
      "sort": 0,
      "type": "player",
      "account": "_yuita_"
    },
    ...
  ],
  "isThundering": false,
  "confighash": 2004760208,
  "servertime": 1148,
  "updates": [
    {
      "type": "tile",
      "name": "flat/-1_-1/-2_-2.jpg",
      "timestamp": 1672748520533
    },
    {
      "type": "chat",
      "source": "player",
      "playerName": "_yuita_",
      "message": "test",
      "account": "_yuita_",
      "channel": "",
      "timestamp": 1672748617689
    },
    ...
  ],
  "timestamp": 1672748523237
}

"currentcount" マップに表示されているプレイヤーの数
"hasStorm" 雨/雪ならば true
"isThundering" 雷雨ならば true
"servertime" ワールド内の時間 (6:00=0、5:59=23999)
"players" マップに表示されるプレイヤー一覧
"confighash" 設定が変更されているか確認するために生成された乱数
 - "world" プレイヤーのいるワールド名
 - "armor" 防御力
 - "name" 表示される名前
 - "x", "y", "z" x y z それぞれの座標
 - "health" 体力
 - "sort", "type" 調べたところ、何に使われているのかよく分かりませんでした!今後の活躍に期待です!()ごめんなさい
 - "account" プレイヤーのmcid

これを使用し、ある Minecraftサーバーに接続しているプレイヤー一覧・天気・時間を表示するWebサイトを作りました。

また、"update"からチャットの内容やログイン・ログアウトの情報を取得できるので discord のウェブフック等と組み合わせて自分が管理者権限を持たないサーバーのチャット内容を外部に転送するといったこともできます。

モザイク処理をしています

ワールドの一覧を取得する

http://{マップのURL}/up/configuration をGETするとマップの表示に必要な設定やワールドの一覧を Jsonで取得できます。ワールド一覧を調べたい場合は "worlds" を見ると以下のようなオブジェクトの配列があります。"name" の一覧をfor文などで取得すれば、それを元に先ほどのような各ワールドの天気を取得するものを作ることができます。

{
  "sealevel": 63,
  "protected": false,
  "maps": [
    {
      "nightandday": false,
      "shader": "stdtexture",
      "compassview": "S",
      "prefix": "flat",
      "tilescale": 0,
      "icon": null,
      "scale": 4,
      "azimuth": 270.0,
      "type": "HDMapType",
      "title": "Flat",
      "backgroundday": null,
      "protected": false,
      "mapzoomout": 5,
      "perspective": "iso_S_90_lowres",
      "worldtomap": [...],
      "inclination": 90.0,
      "image-format": "jpg",
      "lighting": "shadows",
      "bigmap": true,
      "maptoworld": [...],
      "background": null,
      "boostzoom": 0,
      "name": "flat",
      "backgroundnight": null,
      "mapzoomin": 1
    },
    {...},
    {...},
  "name": "world",
  "title": "world",
  "worldheight": 320
}

Dynmap を通してチャットをする

curl -XPOST -H "Content-type: application/json" -d "{\"message\":\"hogehoge\",\"name\":\"fugafuga\"}" "http://localhost:8123/up/sendmessage"

コマンドプロントで上のような curl コマンドを叩きます。

{
  "message": "メッセージの内容 (必須)",
  "name": "表示する名前 (必須でない)"
}

http://{マップのURL}/up/sendchat に上のような Json を POST すればチャットが送信されます。

チャットは5秒間の間隔を取らないと {"error":"not-allowed"} が返されチャットは送られませんがステータスコードは 200 を返されるので注意が必要です。

Zapier や IFTTTGAS 等で自動化できるので何かに使えるかも。


2022/01/14 追記: Dynmap は Leaflet.js を使っているのでクライアント側でマーカーを追加できそう。これは実験中

LeafetのAPIで路線図を描画した図