論理と、幻想と。

FFXIVやPCが好きなITスペシャリストが作ったものや考えたことについてダラダラ書きます

スペスペ用タイムラインからPaisleyParkのREST APIを操作する

f:id:hackermind:20191110102438p:plain

PaisleyParkはHTTPサーバを通じたREST APIでの操作が可能です。

REST API · LeonBlade/PaisleyPark Wiki · GitHub

このREST APIをタイムライン定義からコールすることでフェーズ移行等に応じた任意のマーカー配置を自動化することが可能です。シンプルにタイムラインに組み込む例を紹介します。

スペスペたいむのexec機能について

トリガーにマッチした際に任意のパスのアプリケーション、またはURLへのリクエストを実行する機能です。アプリケーションであったりスクリプトであったり、Windowsの関連付けによって操作できるものであれば特に制約なく動かせます。

SpespeTime_Reference · anoyetta/ACT.Hojoring Wiki · GitHub

PaisleyParkのHTTPサーバ機能の有効化

REST APIによるコントロールのリクエストを受け付けるためのHTTPサーバ機能を有効化する必要があります。

f:id:hackermind:20191110102218p:plain

  • 任意のポートを指定してStartを押すとHTTPサーバが起動します。
    • 画像の例では1337ですが、既存アプリケーションと被らなければ何でもOK
  • 右のチェックボックスにチェックを入れるとアプリケーションの起動時に自動的にHTTPサーバ機能が有効になります。

プリセット名を指定する場合

execプロパティにURLを指定すると、指定したトリガにマッチングした時に当該URLへリクエストを送信します。preset/プリセット名/load でプリセットを読み込んで配置するリクエストになります。

  <t 
    name="初期マーカー"
    sync="00:[id4]:戦闘開始まで"
    exec="http://localhost:1337/preset/bahamut_turn4/load" />

JSONによる任意のマーカー配置定義を使用する場合

マーカー配置を記述したJSONをPOSTすることで任意の場所にマーカーを置くこともできます。既存マーカーを動かさず特定のマーカーだけを再配置する場合なんかに便利かもしれないですが、前述のプリセット指定の方が楽だと思います。

スクリプトを実行する場合、スクリプトのパスをexecに、引数となるプリセット名を args に指定します。リファレンスにも書いてありますが、exec 実行時の作業ディレクトリはtimelineとなります。

scripts\set_waymarks.ps1
# 実行時に引数として与えられたjsonファイルからペイロードを生成

Param( [parameter(mandatory=$true)][String] $file)

$uri = "http://localhost:1337/place"
$payload = ConvertFrom-Json (Get-Content (Convert-Path $file) -Encoding UTF8 -Raw) | ConvertTo-Json -Compress

Invoke-RestMethod -Uri $uri -Body $payload -Method POST -ContentType "application/json"

引数として受け取ったJSONファイルを元にPOSTリクエストで投げるワンライナーなペイロードを組み立てています。

ちなみに、全マーカーを定義した場合のJSONファイルの全体像はこんな感じになります。%APPDATA%\PaisleyPark\settings.json 内に記述された既存プリセットをベースにJSONを組み立てると楽です。

{
  "A": {
    "X": 7.056696,
    "Y": 0.0581359863,
    "Z": -7.041502,
    "ID": 0,
    "Active": true
  },
  "B": {
    "X": 7.25711632,
    "Y": 0.0581359863,
    "Z": 6.970316,
    "ID": 1,
    "Active": true
  },
  "C": {
    "X": -7.05540562,
    "Y": 0.05813694,
    "Z": 7.002947,
    "ID": 2,
    "Active": true
  },
  "D": {
    "X": -6.939519,
    "Y": 0.0581378937,
    "Z": -7.17268944,
    "ID": 3,
    "Active": true
  },
  "One": {
    "X": -0.03871727,
    "Y": -0.0500011444,
    "Z": -0.0106658936,
    "ID": 4,
    "Active": true
  },
  "Two": {
    "X": 0.0,
    "Y": 0.0,
    "Z": 0.0,
    "ID": 5,
    "Active": false
  }
}

2マーカーだけを追加で置きたい場合はこんな具合でしょうか。他のマーカーはそのままです。

{
  "Two": {
    "X": -0.03871727,
    "Y": -0.0500011444,
    "Z": -0.0106658936,
    "ID": 4,
    "Active": true
  }
}

タイムラインからの呼び出し例

スクリプトのパスをexecに、引数となるJSONファイル名を args に指定します。どちらもtimelineフォルダからの相対パスである点に注意が必要です。

  <t 
    name="初期マーカー"
    sync="00:[id4]:戦闘開始まで"
    exec="scripts\set_waymarks.ps1"
    args="scripts\bahamut_turn4.json"
    exec-hidden="true" />

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
山本 陽平
技術評論社
売り上げランキング: 2,453