マインクラフト1.21.8でPvPサーバーを作成中でその際のスクリプトのエラー
PR環境 1.21.8
現在導入されているプラグインは以下
DeluxeMenus-1.14.1-Release
Duels-Optimised-4.2
EssentialsX-2.21.2
PlaceholderAPI-2.11.6
SkBee-3.12.2
SkQuery-4.3.2
Skript-2.12.1
spark-1.10.119-bukkit
worldedit-bukkit-7.3.16
worldguard-bukkit-7.0.14-dist
以下のように今のところは考えており
※全体の流れとしては
第一段階:サーバーに参加するとロビーにスポーンし、ロビーにスポーンすると手持ちに捨てられないコンパスが付与される
第二段階:コンパスを右クリックすると職業選択とマッチング、観戦を選択できる(コンパス内のアイコンの選択は左クリックとする)
第三段階:職業を選択してマッチングをクリックすると2人揃った場合にマッチング成功してアリーナの各自のプレイヤー1スポーン位置とプレイヤー2スポーン位置に飛ばされる
第四段階:BO5で試合が終わり試合が終わると勝者の名前が画面中央に表示されて終了しロビーに強制的に戻さるこれは観戦者も同じとする、ロビーに戻ると職業アイテムは削除されコンパスのみの所有になる
第五段階:アリーナは一つしかなくマッチングできる試合も1マッチのみなので順番でマッチングをかけた順で試合が再度行われる
現在作りたいこととやりたいことが全部書いてあるテキストファイルも添付しました。
サーバーやSkriptの知識が全くなく1から手探りでやっていたのですがあまりにもエラーが出すぎてるのでかなり心が折れてきましたしまったので皆様のお力をお借りしたいです。
皆様頼りになってしまうのが本当に申し訳ないのですがお願いします。
45 Replies
とりあえず詳しいところは見てないからエラー見えたところだけ:
skriptで関数引数を使用するときは引数名と同じローカル変数が生成されるので
pではなく{_p}の形で利用する必要がある
オフハンドアイテムの構文は
%livingentities%'[s] off[ ]hand (tool|item)
なので
player's off hand tool が正しい。
player's off handでは反応しない
https://skripthub.net/docs/?id=976
Skript Hub - Documentation
Tool (Expression) - Skript
The item an entity is holding in their main or off hand.
というかほとんどが一個めによるエラーだからとりあえず一個め直してから考えるべきかな
あとlobby_control.skの91行目
多分javaみたいな文字列連結しようとしたんだろうけどskriptだとそんなものはないので
set {_match_id} to "%uuid of {_p1}%-%uuid of {_p2}%"
とするのが正しい
kotlinやってるかはわからないけど
と同じ雰囲気
んでから関数呼び出しで
call 関数名(引数)とする必要はなくて、
関数名(引数)だけでいい。
というかaiに書かせたらこんな雰囲気になるだろうな~って感じのコードしてるけどskriptに関してAIはそこまで詳しくないからある程度は自分で学習したうえで細かい面倒なところAIにやらせるのが吉だよ。
たまに別の言語と混同して変数名{}で囲ってなかったりするコード出てくる。
ある程度基本文法さえ知ってればAIが明らかに変なのだしてきた時にプロンプト書いて指摘できるからそこらへんの地力あるなら全部AIに押し付けてパワハラ職人しても良し。
SkriptHubとかで構文確認して明らかにないな~~ってなったら類似構文探してきてAIに押し付ければ適応してくれるし。
あとequipって構文あった記憶もあるけど確かnpc専用だったはずなので素直に
set slot to item使いましょう...
普通にequipあったわ
equip %living entity% with %item%
だからequip {_p} with netherite helmetとかが正しい。
とりあえず上の修正点だけ直してしばらく自分でSkriptHubとか見ながら一つづつ直してみると良し。
それでも分かんなかったらまた聞いてください。
丁寧にありがとうございます
ほんとに無知で全部AI任せていたのですがやはり知識をつけないとダメみたいですね
また試してみてわからなかったらまた聞きます!
そらまめさんに言われた通りにやり残りは自分でやり切ろうと思って調べながらやっていたんですがやはり調べても全く分からずエラー自体は少なくなったのですがここからの修正点を教えていただきたいです、よろしくお願いします。
部外者ですが
set {_offhand} to {_p}’s offhand tool
を構文の最初に挟んで
あとの構文の{_p}’s offhand toolのところを{_offhand}に変えて全部終わった後に
set {_p}’s offhand tool to {_offhand}
みたいな感じにしたら行けませんかね?
日本語下手でごめんなさい
あと{_p}にプレイヤーを突っ込みたいならset {_p} to pではなくset {_p} to playerです
👍
だけど今回の場合以下の形で宣言されているのでそもそも10行がいらないですね...

回答ありがとうございます。
ちょっと今日もう時間がなくて
試せるのが明日のお昼くらいになってしまうのですが、ぜひ試させていただきます。
自分自体がわかっていないのがあれなんですがお願いします。
自分でもset p to pがわかってなくて
enchant の構文はenchant %itemtypes% with %enchantmenttypes%
でオフハンド/メインハンドの構文が
メインハンド: %livingentities%'[s] (tool|held item|weapon)
オフハンド: %livingentities%'[s] off[ ]hand (tool|item)
であるので
ここら辺の場合enchant item in {_p}'s off hand tool with unbreaking 3
の太字部分がいらないです
~'s tool
enchant ~ with ~
多分ai君が引数pとローカル変数pをごっちゃにしたんでしょう...
Sk用のgptあおさんが作ってた気がする
duel_job_system 53行目
2 splash healing potionsは
https://github.com/SkriptLang/skript-aliases/blob/8a0403e7025e61ffe299be19d35f12e3f926a8c2/brewing.sk
と
https://github.com/SkriptLang/skript-aliases/blob/8a0403e7025e61ffe299be19d35f12e3f926a8c2/%2Bglobal-variations.sk
より
(splash potion¦s of {potion types}|{potion types} splash potion¦s)
potion typesは[instant] heal(th|ing)
が該当するので
2 splash potions of healing
が正しいです
あれ精度ちょっとしか見てないですけどかなり有用な気も。
試してみる価値はありそうです
duel_job_system 18行目
or/andによる条件式結合がなぜかskriptだとできないので
の形で書くのが早いです。
ただ今回の場合{_job}がnot setと""で同じ意味になっているのでこの方法が使えますが、別の意味で使用していた場合はフラグ立てするか
みたいな感じの関数を作って
SkQueryのcheck文を使用して
の形で書くと一応通ります。
ちょっと難しいのでフラグ立てしたほうが早いです。
check ~
duel_job_system 210行目
座標の数値指定は
[the] (location|position) [at] [(][x[ ][=[ ]]]%number%, [y[ ][=[ ]]]%number%, [and] [z[ ][=[ ]]]%number%[)] [[(in|of) [[the] world]] %world%]
なので
teleport player to location at {@arena_spawn2}
が正しいです
https://skripthub.net/docs/?id=900
Skript Hub - Documentation
Location At (Expression) - Skript
Allows to create a location from three coordinates and a world.
ん
iya
ちがうなこれ
で引数用の変数が全部グローバルになってるところはローカルに直してもらうとして
あと
send title "&a%{_winner}% が勝利!" to all players in {_match.%{match_id}%.players::*}
のall players inの部分だけいらないです
で
ああいやこれローカル変数とグローバル変数が逆転してるか...
{_in_duel.%{winner}%}
あたりは保持されるべき情報なので
冒頭の _
がいらないです
逆にwinner loser match_id
はグローバルではなく、関数内の引数の変数なので冒頭に_
を付ける必要があります
on death以外の同ファイル内変数ほとんどすべてでもグローバルであるべき変数がローカルになっていたりするので見直してください。
エラーは出てないですけど
duel_job_system 52行目の
{wind_charge}はwind charge itemが正しいです
function内でどのワールドかを特定できないから出てるエラーでした。
location {@arena_spawn2} in world "ワールド名"
の形で使用すると治ります。
lobby_controlでも同
title_test.skはhttps://discord.com/channels/545926404785569793/1404730347144351744/1405113615169617961
と同じ形で
4~9行目, 14行目がいらないですで
titleを送る構文がsend title %string% [with subtitle %string%] [to %players%] [for %timespan%] [with fade[(-| )]in %timespan%] [[and] [with] fade[(-| )]out %timespan%]
であるので
send title {_title} to {_p} for {_stay} with fadein {_fadein} fadeout {_fadeout}
https://skripthub.net/docs/?id=3159
が正しい形ですが、{_stay}, {_fadein}, {_fadeout}がinteger型であるのでtimespanに変換する必要があり、使い方的にtickだと思うので
send title {_title} to {_p} for "%{_stay}% ticks" parsed as timespan with fadein "%{_fadein}% ticks" parsed as timespan fadeout "%{_fadeout}% ticks" parsed as timespan
とする必要があります。
Skript Hub - Documentation
Title - Send (Effect) - Skript
Sends a title/subtitle to the given player(s) with optional fadein/stay/fadeout times for Minecraft versions 1.11 and above.
If you're sending only the subtitle, it will be shown only if there's a title displayed at the moment, otherwise it will be sent with the next title. To show only the subtitle, use: send title " " with subtitle "yourtext...
subtitleでも同
もしくはstay,fadein,fadeoutが同じなので{_title}とtoの間にwith subtitle {_subtitle}としてもいいかもしれません
title_test.sk 15行目
loop {_seconds} times:
がskriptの構文だと正しいです。
また18行目も
difference between seconds and {_i}ではなく
{_seconds} - {_i}
とするのが正しいです。
ただこれだと残り10秒が表示されないので
{_seconds} - {_i} + 1として
wait 1 secondをsend actionbarの後に持ってくるのもアリです。
これはお好みで。
lobby_control.sk 8行目は
1 or moreの部分が必要ないです。
if {_p} has compass named "&bPvPメニュー":
で動作します。
lobby_control.sk 22行目は
open chest inventory with 1 rows named "PvPメニュー" to player
です。
chest inventory with 1 rows named ~
open ~ to player
また23行目format guiは存在しないので削除して
その後のslot 0 diamond sword named "追跡者(剣士)"
などを
set slot 0 of current inventory of player to diamond sword named "追跡者(剣士)"
current inventory
のような形で変更してください。
lobby_control.sk 88,89行はhttps://discord.com/channels/545926404785569793/1404730347144351744/1405122497703051406
と同一です。
lobby_control.sk 98行目は多分ai君がユーザーが書き換える前提でプレイスホルダーを置いてます。
なので
location x, y, z in world "ワールド名"
に書き換えてください。
エラー系は多分これで全部だと思います。
ローカル変数/グローバル変数によるバグが多分大量にあるのでそこらへんは頑張ってください...
お二人のお力で現状ここまでエラーが減ったのですがまた足踏みしてます、あともう少しお力をお借りしたいです。
lobby_control44行以外は今までの情報とskriptの基本文法(インデントなど)の学習だけで解決可能です。
(というか書いたのに治ってないものがある)
44行目に関しては後で書きます
duel_job_system 95行は多分playerじゃなくてvictimです。
エラー日本語訳したらだいたいわかるのでそこらへんも頑張りましょう
44行
clicked itemをevent-itemにして様子見しましょう。
多分skript本来の構文ではなさそうな雰囲気がある
変更して一度試してみます!!
ありがとうございます
多分修正のほうは大分できたと思うのですが

line 7 line 121は書いてます
これはevent-item にしたらちゃんと動作しました
もしかしてそこが変更できていない場所ですかね?
はい
line 65はkeepinventoryがしたいなら削除して/gamerule keepInventory true
アイテムが削除したいならclear dropsに変更
locationはこれ参照です
loopはこちら
よく見たら元文に引きづられてるので修正。
{_i}ではなくloop-numberです
これに関してはコマンドで実行すればいいって感じですよね?
はい
ありがとうございます。
もう一度修正して試してみます
またわからないことがあったらお聞きしても大丈夫でしょうか?
ここまで手伝っていただき本当にありがとうございます。
これすごい嫌な予感がする
変数管理頑張ってください
正直ai君ほかの言語参照してskript書いてくるから skriptを何も知らない状態でaiに全任せで書く!はjavaとかpythonみたいな有名な言語と違って圧倒的に無理度が高いのがあるんだよな
有名言語ですら簡単なものならまだしも複雑になってくるとかなり精度低くなるし
とりあえずエラー自体は消えたのであとは動作確認してみます!!
実際これで動くのかものすごく心配です...
また何か質問するかもしれないので
その時はよろしくお願いします
今動作確認してみたのですが
サーバーに入ってもコンパスが付与されず、ロビー内のPVPも有効になっちゃっててどうしたらいいですかね?
付与って
on join:ですよね
on join:の後に
wait a tick
そうですねサーバー、ロビーに入った時点で付与するようになっているはずなのですが
挟んでみてください
わかりました
はさんでみると
こんな感じにエラーがでました

それ以前の問題ですねこれ
w
気がついた
多分
on join: wait a tick
~になってます
コロンの後は必ず次の行に行ってください
expected 0 spacesなので:抜けてないとおかしい
こんなかんじですかね?

赤ちゃんレベルなのですみませんがお願いします
変えてみても付与されないですね
明日また試行錯誤してみます。
けどなぜか自分だけコンパスを持っているんですよね、両クリックしてもテレポートするだけなんですけど
多分ロビー内PVP禁止は自分が書いてないだけですよね
すみませんコンパス付与する構文送ってもらえたりします?
Function