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
unnnnnnnnnnnOP2y 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
unnnnnnnnnnnOP2y 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
unnnnnnnnnnnOP2y 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なのかはわからない・・・
何か
何か2y ago
skriptにはfloatとかintはない 整数はlongだし少数はdouble って決まってる variables.csvとかみたらわかる
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
パケットで扱うときは変換したほうがいいってことですね getIntegers().write(1.intValue(), 1.intValue())が動いて getIntegers().write(1, 1.intValue())が動かないのはわかるんですけど、 getStrings().write(0, "glow")はなんで動くんでしょうか もしかして:1.17でもskript-packetは使える
何か
何か2y ago
何か
何か2y ago
このエラーはfieldに対しての書き込みが失敗したってことだから そのfieldがintなのにlongを書き込もうとして失敗してるから エラー履いてる write()は write(int index, T value)のことで indexはlongわたしても問題ない
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
てことはgetIntegers().write(1, 1.intValue())mo 動くはずなのか
何か
何か2y ago
そういうこと
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
一番上に来るはずのintのindexが0じゃなくて1から始まってるのはたまたまですか? 1.17でやってみたら0になってたんですけど
何か
何か2y ago
一番上に来る?
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
indexはフィールドごとに0から始まると思ってたんですけど、1つしかないはずのintのindexがなぜか0でなく1だったのが 不思議で
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
です 上からフィールドタイプごとに0,1,2,3,....って割り当てられてるっていう解釈です Teamnameはstringで最初なので0,ModeはByte(≒int)で最初なので0
何か
何か2y ago
その辺はprotocollibの仕様だから よくわからん
unnnnnnnnnnn
unnnnnnnnnnnOP2y ago
あんま考えなくていいところですね てことはprotocollibとprotorolのwikiにずれがある可能性があるのか
Want results from more Discord servers?
Add your server