Repository navigation
Conversation
tatuharu
left a comment
There was a problem hiding this comment.
このレビューはハルがAI自動レビューの動作テストのためにOpus5.5 Extra Highを使用してレビューを行なったものです。鵜呑みにせず、指摘を採用するかはお任せします。
指摘が 1 件あります。詳細は行コメントに書いています。
- 〔不具合〕看板に
"や\を書くと、\が付いた文字列が書き写される
| # Line : (0 | 1 | 2 | 3) | ||
| # @within function debug:read_sign/.m | ||
|
|
||
| $data modify storage debug:read_sign Data.$(Path) set string block ~ ~ ~ front_text.messages[$(Line)] 1 -1 |
There was a problem hiding this comment.
看板の各行は front_text.messages に JSON の文字列として保存されるため、前後の1文字を除くだけでは JSON のエスケープが残ります。看板に " や \ を書くと、Data には \ が付いた文字列が入り、{A:"b"} は {A:\"b\"}、a\b は a\\b になります。
マクロ関数はこの値をそのまま展開します。" を含む値(ダブルクォートで囲んだ文字列や、それを含む compound)を、set value $(...) のように SNBT として展開する関数へ渡すと、展開後のコマンドを解釈できず、その関数は実行されません。debug:read_sign/.m の説明の「実行座標の看板に書かれた文字列を storage debug:read_sign Data 内に書き写します」とも合いません。
検証用サーバー(Minecraft 1.20.4、このPRの head 042d962)で確かめました。テスト用クライアントから看板の編集パケットを送って書いた行は、3 が "3"、{A:"b"} が "{A:\"b\"}" という JSON の文字列で保存されていました。debug:read_sign/.m で書き写すと、3、abc、あいう、{A:'b'} は書いたとおりでしたが、{A:"b"} は {A:\"b\"}、a\b は a\\b になりました。この値を debug:entity_storage/set.m に with storage debug:read_sign Data で渡すと、{A:'b'} は {A:"b"} として設定されましたが、{A:\"b\"} は Failed to instantiate function debug:entity_storage/set.m: ... Expected value at position 82 となり、何も設定されませんでした。関数は RCON から execute positioned で実行しており、コマンドブロックからは実行していません。
直すなら、messages[$(Line)] を切り出さずにマクロ引数へ移し、set value $(...) で展開する方法があります。JSON の文字列が SNBT の引用符付き文字列として読まれ、\" と \\ が元の文字に戻ります。検証用サーバーでも、set value $(Data) で展開する debug:entity_storage/set.m に messages の値をそのまま Data として渡すと、{A:"b"}、a\b、3、あいう の文字列が設定されることを確かめました。この形にしない場合は、" と \ を使えないことを IMP Doc に書いておくと、使う人が原因を探さずに済みます。
No description provided.