team packetのmode fieldをskript-reflectで記述したときにうまく動かない

Minecraft 1.12.2 (非PR) skript 2.5.3 skript-refrect 2.2.3 ProtocolLib 4.8.0 その他: SkQuery 3.6.4 SkBee 1.10.2(scoreboardはオフ) Mundosk 1.8.6
16 Replies
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
Mundoskを用いてteam packetのremove fieldを実行し、その後skript-reflectに書き換えたところ、Mode fieldの書き換えがうまくいきませんでした。
import:
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.events.PacketContainer

command /test:
trigger:

set {_p} to new play_server_scoreboard_team packet
# set {_p} to ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_TEAM)

set string pinfo 0 of {_p} to "glow"
# {_p}.getStrings().write(0, "glow")

set int pnum 1 of {_p} to 1
# {_p}.getIntegers().write(1, 1)

send packet {_p} to player
# ProtocolLibrary.getProtocolManager().sendServerPacket(player, {_p})
import:
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.events.PacketContainer

command /test:
trigger:

set {_p} to new play_server_scoreboard_team packet
# set {_p} to ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_TEAM)

set string pinfo 0 of {_p} to "glow"
# {_p}.getStrings().write(0, "glow")

set int pnum 1 of {_p} to 1
# {_p}.getIntegers().write(1, 1)

send packet {_p} to player
# ProtocolLibrary.getProtocolManager().sendServerPacket(player, {_p})
1つ目、2つ目、4つ目の"#"で置き換えても問題なく動きましたが、3つ目を置き換えると
[WARN]: [Skript] method StructureModifier#write called with (1 (Long), 1 (Long)) threw a RuntimeException: Cannot set field private int net.minecraft.server.v1_12_R1.PacketPlayOutScoreboardTeam.i to value 1
[WARN]: [Skript] method StructureModifier#write called with (1 (Long), 1 (Long)) threw a RuntimeException: Cannot set field private int net.minecraft.server.v1_12_R1.PacketPlayOutScoreboardTeam.i to value 1
がコンソールに出力され、うまく動作しませんでした。 試したこと: - write(0, 1)にする → 同じ出力 - #の置き換えの組み合わせをすべて試す → 同じ出力 getIntegers()が含まれていないときは正常に動く - getBytes().write(0, 1)およびgetBytes().write(0, 1.byteValue()) → エラー - getIntegers().write(0.intValue(), 1.intValue()) → コンソールへの出力はないが、何も起こらない 疑問: - wikiだとfield typeがByteになっているのに、Mundoskではintで指定してうまく動作するのはなぜか - intがいきなり1から始まるのはなぜか int pnum 0 ではないのか
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
やりたいことと背景: 1.17.1で視点主によって違う色の発光を見せたい glowのタイミングも視点主によって変えたい 1.17.1ではThat packet Addon(ロード時のエラー),skirt(ロード時のエラー),mundosk(ver非対応),morkazsk(中身空)が動かなかった metadata packetを用いた発光はskUnityで見つけ、skript-reflectで正常に動作することを確認 team packetを用いたものがthat packet addon環境のものしか見つからなかったため、skript-reflectで書くことにした 1.12.2のmundoskと比べながらsk-reflectでteam packetが動くようにする(見たところpacketの構造は1.12.2と1.17.1で変わっていない) とりあえずteam createの前に、実験しやすいremoveで試す 参考: skirtの同機能(ここではgetIntegers().write(0, 1)で動いている? https://github.com/MrsDarth/Skirt/blob/master/src/main/java/io/github/mrsdarth/skirt/protocolLib/elements/EffGlowColor.java Protocol 1.12.2時点でのwiki https://web.archive.org/web/20170920155527/https://wiki.vg/Protocol#Player_Position_And_Look_.28clientbound.29:~:text=of%20entity%27s%20passengers-,Teams,-Creates%20and%20updates
GitHub
Skirt/EffGlowColor.java at master · MrsDarth/Skirt
Contribute to MrsDarth/Skirt development by creating an account on GitHub.
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
結構頑張ったんですけど自分じゃどうにもならなさそうだったので助けてほしいです。 お願いします。 うまく動作しないというのは、何も起こらなかったということです。 バニラコマンドで色付きのチームを作って、それを消すパケットを送ることで色の変化を見て検証してます。 あ できました
import:
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.events.PacketContainer

command /test:
trigger:

set {_p} to ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_TEAM)

{_p}.getStrings().write(0, "glow")

{_p}.getIntegers().write(1.intValue(), 1.intValue())

ProtocolLibrary.getProtocolManager().sendServerPacket(player, {_p})
import:
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.events.PacketContainer

command /test:
trigger:

set {_p} to ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SCOREBOARD_TEAM)

{_p}.getStrings().write(0, "glow")

{_p}.getIntegers().write(1.intValue(), 1.intValue())

ProtocolLibrary.getProtocolManager().sendServerPacket(player, {_p})
結局なんでIntの1なのかはわからない・・・
何か
何か17mo ago
skriptにはfloatとかintはない 整数はlongだし少数はdouble って決まってる variables.csvとかみたらわかる
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
パケットで扱うときは変換したほうがいいってことですね getIntegers().write(1.intValue(), 1.intValue())が動いて getIntegers().write(1, 1.intValue())が動かないのはわかるんですけど、 getStrings().write(0, "glow")はなんで動くんでしょうか もしかして:1.17でもskript-packetは使える
何か
何か17mo ago
何か
何か17mo ago
このエラーはfieldに対しての書き込みが失敗したってことだから そのfieldがintなのにlongを書き込もうとして失敗してるから エラー履いてる write()は write(int index, T value)のことで indexはlongわたしても問題ない
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
てことはgetIntegers().write(1, 1.intValue())mo 動くはずなのか
何か
何か17mo ago
そういうこと
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
一番上に来るはずのintのindexが0じゃなくて1から始まってるのはたまたまですか? 1.17でやってみたら0になってたんですけど
何か
何か17mo ago
一番上に来る?
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
indexはフィールドごとに0から始まると思ってたんですけど、1つしかないはずのintのindexがなぜか0でなく1だったのが 不思議で
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
です 上からフィールドタイプごとに0,1,2,3,....って割り当てられてるっていう解釈です Teamnameはstringで最初なので0,ModeはByte(≒int)で最初なので0
何か
何か17mo ago
その辺はprotocollibの仕様だから よくわからん
unnnnnnnnnnn
unnnnnnnnnnn17mo ago
あんま考えなくていいところですね てことはprotocollibとprotorolのwikiにずれがある可能性があるのか
Want results from more Discord servers?
Add your server
More Posts
リロードしたときのメッセージを変更する方法[Skript] Reloading all scripts... Line 11: ~~~~~~ (○○.sk) みたいなメッセージを変えるのって出来ますか?sneak toggleの着火ラグ``` on sneak toggle: player is not sneaking``` これでしゃがんだ時ってのを感知するはずなんですけど 着火するのがしゃがんでから1tickあとなんで2チームに分かれ、片方のチームメンバーの全滅を待つskすいません、どんなタイトルにすればいいかわかりませんでした.. こんな感じのものを書きました(on death、on respawnのところはredのバージョンもありますが、変数名しか変わっていなかon damage: cancel eventの時もkillはできるようにする方法``` on damage: cancel event ``` があると、/killも無効化してしまいます cancel eventを残したまま/killできるようにする方法はありますか?Loopについて1.12.2 PlayerRealms ``` addのやつ add 1 to {kills::%player%} Rankingのやつ command /ranking: triggerfunctionを待つ何度もすみません! ``` command /test: trigger: send "a" wait3s(player) send "c" function wait3s花瓶を保護したい花が入っている花瓶から花がひっこぬかれるのを阻止するために、 ``` on rightclick on a flower pot: cancel event ``` というのを書いたのですが、花はcommandをつくるときargを入力しないときでも動かす方法``` command /test <text>: trigger: if arg is "1": send "a" else ifプレイヤーのインベ内のアイテムの量が出ない``` command /shop1-register [<integer>] [<integer>]: aliases: /sr permission: admin trigset rndom element ofがうまく動かないentryリストの中からひとつ取り出してboss変数に入れたいのですが、 ``` set random element of {entry::*} to {_boss} send "ボスは%{_bos