マインクラフト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
soramame_256
soramame_2562w ago
とりあえず詳しいところは見てないからエラー見えたところだけ: skriptで関数引数を使用するときは引数名と同じローカル変数が生成されるので pではなく{_p}の形で利用する必要がある
soramame_256
soramame_2562w ago
オフハンドアイテムの構文は %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.
soramame_256
soramame_2562w ago
というかほとんどが一個めによるエラーだからとりあえず一個め直してから考えるべきかな あとlobby_control.skの91行目 多分javaみたいな文字列連結しようとしたんだろうけどskriptだとそんなものはないので set {_match_id} to "%uuid of {_p1}%-%uuid of {_p2}%" とするのが正しい kotlinやってるかはわからないけど
var a = "a"
var b = "b"
println("${a}-${b}")
var a = "a"
var b = "b"
println("${a}-${b}")
と同じ雰囲気 んでから関数呼び出しで 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とか見ながら一つづつ直してみると良し。 それでも分かんなかったらまた聞いてください。
Mr.BeeN
Mr.BeeNOP2w ago
丁寧にありがとうございます ほんとに無知で全部AI任せていたのですがやはり知識をつけないとダメみたいですね また試してみてわからなかったらまた聞きます!
Mr.BeeN
Mr.BeeNOP2w ago
そらまめさんに言われた通りにやり残りは自分でやり切ろうと思って調べながらやっていたんですがやはり調べても全く分からずエラー自体は少なくなったのですがここからの修正点を教えていただきたいです、よろしくお願いします。
1oc3
1oc32w ago
部外者ですが 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です
soramame_256
soramame_2562w ago
👍 だけど今回の場合以下の形で宣言されているのでそもそも10行がいらないですね...
No description
Mr.BeeN
Mr.BeeNOP2w ago
回答ありがとうございます。 ちょっと今日もう時間がなくて 試せるのが明日のお昼くらいになってしまうのですが、ぜひ試させていただきます。 自分自体がわかっていないのがあれなんですがお願いします。 自分でもset p to pがわかってなくて
soramame_256
soramame_2562w ago
enchant の構文はenchant %itemtypes% with %enchantmenttypes% でオフハンド/メインハンドの構文が メインハンド: %livingentities%'[s] (tool|held item|weapon) オフハンド: %livingentities%'[s] off[ ]hand (tool|item) であるので
if {_job} is "tracker":
give diamond sword named "&a追跡者の剣" with lore "追跡者の武器" to {_p}
enchant item in {_p}'s tool with sharpness 4
enchant item in {_p}'s tool with unbreaking 3

give shield named "&a追跡者の盾" to {_p}
enchant item in {_p}'s off hand tool with unbreaking 3
if {_job} is "tracker":
give diamond sword named "&a追跡者の剣" with lore "追跡者の武器" to {_p}
enchant item in {_p}'s tool with sharpness 4
enchant item in {_p}'s tool with unbreaking 3

give shield named "&a追跡者の盾" to {_p}
enchant item in {_p}'s off hand tool with unbreaking 3
ここら辺の場合enchant item in {_p}'s off hand tool with unbreaking 3 の太字部分がいらないです ~'s tool enchant ~ with ~
Mr.BeeN
Mr.BeeNOP2w ago
一応こういう風に作りたいとAIに丸投げしたせいでこんなことになっているのですが頼る前提になってしまい申し訳ないです。
soramame_256
soramame_2562w ago
多分ai君が引数pとローカル変数pをごっちゃにしたんでしょう...
1oc3
1oc32w ago
Sk用のgptあおさんが作ってた気がする
soramame_256
soramame_2562w ago
duel_job_system 53行目 2 splash healing potionsは https://github.com/SkriptLang/skript-aliases/blob/8a0403e7025e61ffe299be19d35f12e3f926a8c2/brewing.skhttps://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だとできないので
if {_job} is not set:
set {_job} to ""
if {_job} is "":
# jobがない場合の処理
else:
# jobがある場合の処理
if {_job} is not set:
set {_job} to ""
if {_job} is "":
# jobがない場合の処理
else:
# jobがある場合の処理
の形で書くのが早いです。 ただ今回の場合{_job}がnot setと""で同じ意味になっているのでこの方法が使えますが、別の意味で使用していた場合はフラグ立てするか
function or(b1: boolean, b2: boolean) :: boolean:
if {_b1} is true:
return true
if {_b2} is true:
return true
return false
function or(b1: boolean, b2: boolean) :: boolean:
if {_b1} is true:
return true
if {_b2} is true:
return true
return false
みたいな感じの関数を作って SkQueryのcheck文を使用して
if or(check [{_job} is not set], check [{_job} is ""]) is true:
if or(check [{_job} is not set], check [{_job} is ""]) is true:
の形で書くと一応通ります。 ちょっと難しいのでフラグ立てしたほうが早いです。 check ~
soramame_256
soramame_2562w ago
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.
soramame_256
soramame_2562w ago
ん iya ちがうなこれ
function endMatch(match_id: string, winner: player, loser: player):
send title "&a%{winner}% が勝利!" to all players in {_match.%{match_id}%.players::*}
teleport {_match.%{match_id}%.players::*} to location {@lobby_spawn}
# アイテムクリア&コンパス配布処理はlobby_control.sk側で行う
set {_in_duel.%{winner}%} to false
set {_in_duel.%{loser}%} to false
set {_player_lives.%{winner}%} to {@max_lives}
set {_player_lives.%{loser}%} to {@max_lives}
delete {_match.%{match_id}%}
function endMatch(match_id: string, winner: player, loser: player):
send title "&a%{winner}% が勝利!" to all players in {_match.%{match_id}%.players::*}
teleport {_match.%{match_id}%.players::*} to location {@lobby_spawn}
# アイテムクリア&コンパス配布処理はlobby_control.sk側で行う
set {_in_duel.%{winner}%} to false
set {_in_duel.%{loser}%} to false
set {_player_lives.%{winner}%} to {@max_lives}
set {_player_lives.%{loser}%} to {@max_lives}
delete {_match.%{match_id}%}
で引数用の変数が全部グローバルになってるところはローカルに直してもらうとして あと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行目がいらないです
soramame_256
soramame_2562w ago
で 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...
soramame_256
soramame_2562w ago
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 "ワールド名" に書き換えてください。 エラー系は多分これで全部だと思います。 ローカル変数/グローバル変数によるバグが多分大量にあるのでそこらへんは頑張ってください...
Mr.BeeN
Mr.BeeNOP2w ago
お二人のお力で現状ここまでエラーが減ったのですがまた足踏みしてます、あともう少しお力をお借りしたいです。
soramame_256
soramame_2562w ago
lobby_control44行以外は今までの情報とskriptの基本文法(インデントなど)の学習だけで解決可能です。 (というか書いたのに治ってないものがある) 44行目に関しては後で書きます duel_job_system 95行は多分playerじゃなくてvictimです。 エラー日本語訳したらだいたいわかるのでそこらへんも頑張りましょう 44行 clicked itemをevent-itemにして様子見しましょう。 多分skript本来の構文ではなさそうな雰囲気がある
Mr.BeeN
Mr.BeeNOP2w ago
変更して一度試してみます!! ありがとうございます
Mr.BeeN
Mr.BeeNOP2w ago
多分修正のほうは大分できたと思うのですが
No description
soramame_256
soramame_2562w ago
line 7 line 121は書いてます
Mr.BeeN
Mr.BeeNOP2w ago
これはevent-item にしたらちゃんと動作しました もしかしてそこが変更できていない場所ですかね?
soramame_256
soramame_2562w ago
はい line 65はkeepinventoryがしたいなら削除して/gamerule keepInventory true アイテムが削除したいならclear dropsに変更
1oc3
1oc32w ago
locationはこれ参照です loopはこちら
soramame_256
soramame_2562w ago
よく見たら元文に引きづられてるので修正。 {_i}ではなくloop-numberです
Mr.BeeN
Mr.BeeNOP2w ago
これに関してはコマンドで実行すればいいって感じですよね?
soramame_256
soramame_2562w ago
はい
Mr.BeeN
Mr.BeeNOP2w ago
ありがとうございます。 もう一度修正して試してみます またわからないことがあったらお聞きしても大丈夫でしょうか? ここまで手伝っていただき本当にありがとうございます。
1oc3
1oc32w ago
これすごい嫌な予感がする 変数管理頑張ってください
soramame_256
soramame_2562w ago
正直ai君ほかの言語参照してskript書いてくるから skriptを何も知らない状態でaiに全任せで書く!はjavaとかpythonみたいな有名な言語と違って圧倒的に無理度が高いのがあるんだよな 有名言語ですら簡単なものならまだしも複雑になってくるとかなり精度低くなるし
Mr.BeeN
Mr.BeeNOP2w ago
とりあえずエラー自体は消えたのであとは動作確認してみます!! 実際これで動くのかものすごく心配です... また何か質問するかもしれないので その時はよろしくお願いします 今動作確認してみたのですが サーバーに入ってもコンパスが付与されず、ロビー内のPVPも有効になっちゃっててどうしたらいいですかね?
1oc3
1oc32w ago
付与って on join:ですよね on join:の後に wait a tick
Mr.BeeN
Mr.BeeNOP2w ago
そうですねサーバー、ロビーに入った時点で付与するようになっているはずなのですが
1oc3
1oc32w ago
挟んでみてください
Mr.BeeN
Mr.BeeNOP2w ago
わかりました
Mr.BeeN
Mr.BeeNOP2w ago
はさんでみると こんな感じにエラーがでました
No description
soramame_256
soramame_2562w ago
それ以前の問題ですねこれ
1oc3
1oc32w ago
w 気がついた
soramame_256
soramame_2562w ago
多分 on join: wait a tick ~になってます
1oc3
1oc32w ago
コロンの後は必ず次の行に行ってください
soramame_256
soramame_2562w ago
expected 0 spacesなので:抜けてないとおかしい
Mr.BeeN
Mr.BeeNOP2w ago
こんなかんじですかね?
No description
Mr.BeeN
Mr.BeeNOP2w ago
赤ちゃんレベルなのですみませんがお願いします 変えてみても付与されないですね 明日また試行錯誤してみます。 けどなぜか自分だけコンパスを持っているんですよね、両クリックしてもテレポートするだけなんですけど 多分ロビー内PVP禁止は自分が書いてないだけですよね
1oc3
1oc32w ago
すみませんコンパス付与する構文送ってもらえたりします? Function

Did you find this page helpful?