MAP_CHUNKのpacketを改変して、Y-61にある草ブロックを石にしたい

import:
ch.njol.skript.Skript

org.bukkit.Bukkit
org.bukkit.plugin.Plugin

com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.events.ListenerPriority
com.comphenix.protocol.events.ListenerOptions
com.comphenix.protocol.events.PacketAdapter
com.comphenix.protocol.events.PacketEvent
com.comphenix.protocol.events.PacketContainer
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.injector.GamePhase
com.comphenix.protocol.reflect.StructureModifier

java.lang.Override
java.util.ArrayList
java.lang.System

preimport:
jp.nlaocs.BlockPackets

public class BlockPackets extends PacketAdapter:

public BlockPackets():
super[Plugin, ListenerPriority, PacketType[]](Skript.getInstance(), ListenerPriority.NORMAL, [PacketType.Play.Server.MAP_CHUNK as PacketType])

@Override
public void onPacketSending(PacketEvent event):

set {_packet} to {_event}.getPacket()

broadcast "&aPacket: %{_packet}%"

on load:
set {blockpacketlistener} to new BlockPackets()
ProtocolLibrary.getProtocolManager().addPacketListener({blockpacketlistener})

on unload:
ProtocolLibrary.getProtocolManager().removePacketListener({blockpacketlistener})
clear {blockpacketlistener}
import:
ch.njol.skript.Skript

org.bukkit.Bukkit
org.bukkit.plugin.Plugin

com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.events.ListenerPriority
com.comphenix.protocol.events.ListenerOptions
com.comphenix.protocol.events.PacketAdapter
com.comphenix.protocol.events.PacketEvent
com.comphenix.protocol.events.PacketContainer
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.PacketType
com.comphenix.protocol.injector.GamePhase
com.comphenix.protocol.reflect.StructureModifier

java.lang.Override
java.util.ArrayList
java.lang.System

preimport:
jp.nlaocs.BlockPackets

public class BlockPackets extends PacketAdapter:

public BlockPackets():
super[Plugin, ListenerPriority, PacketType[]](Skript.getInstance(), ListenerPriority.NORMAL, [PacketType.Play.Server.MAP_CHUNK as PacketType])

@Override
public void onPacketSending(PacketEvent event):

set {_packet} to {_event}.getPacket()

broadcast "&aPacket: %{_packet}%"

on load:
set {blockpacketlistener} to new BlockPackets()
ProtocolLibrary.getProtocolManager().addPacketListener({blockpacketlistener})

on unload:
ProtocolLibrary.getProtocolManager().removePacketListener({blockpacketlistener})
clear {blockpacketlistener}
送信時にpacketを取得するところまでは行けてます 環境は添付してます
No description
No description
25 Replies
あお🦀
あお🦀2w ago
PacketContainerからチャンクのブロック、その座標を抽出する方法がわからないです
あお🦀
あお🦀2w ago
若干近づいたかも
No description
あお🦀
あお🦀2w ago
このlongと思われる型の数値をどうすればブロックになるのでしょうか…
何か
何か2w ago
?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
助けてください
何か
何か2w ago
もうマイクラなんて長いこと触ってないからできるかわからんけど だいたい分かったけど 手動で計算するのはめんどいから 一回SimpleBitStorageにしまいこんで 全部getで取得
何か
何か2w ago
No description
何か
何か2w ago
heightmapには256個のentryがあってそれぞれのエントリのビット長がceil(log2(height+1)) heightはワールドの最大の高さ
何か
何か2w ago
No description
何か
何か2w ago
そのままデータ入ってるわけじゃないから その意味不明なlong値から高さ取るためには
何か
何か2w ago
No description
何か
何か2w ago
これしないと無理
public SimpleBitStorage(int p_184724_, int p_184725_, @Nullable long[] p_184726_) {
Validate.inclusiveBetween(1L, 32L, (long)p_184724_);
this.size = p_184725_;
this.bits = p_184724_;
this.mask = (1L << p_184724_) - 1L;
this.valuesPerLong = (char)(64 / p_184724_);
int i = 3 * (this.valuesPerLong - 1);
this.divideMul = MAGIC[i + 0];
this.divideAdd = MAGIC[i + 1];
this.divideShift = MAGIC[i + 2];
int j = (p_184725_ + this.valuesPerLong - 1) / this.valuesPerLong;
if (p_184726_ != null) {
if (p_184726_.length != j) {
throw new SimpleBitStorage.InitializationException("Invalid length given for storage, got: " + p_184726_.length + " but expected: " + j);
}

this.data = p_184726_;
} else {
this.data = new long[j];
}

}

---> SimpleBitStorage(bitLength, sizeOfData, dataArray)
public SimpleBitStorage(int p_184724_, int p_184725_, @Nullable long[] p_184726_) {
Validate.inclusiveBetween(1L, 32L, (long)p_184724_);
this.size = p_184725_;
this.bits = p_184724_;
this.mask = (1L << p_184724_) - 1L;
this.valuesPerLong = (char)(64 / p_184724_);
int i = 3 * (this.valuesPerLong - 1);
this.divideMul = MAGIC[i + 0];
this.divideAdd = MAGIC[i + 1];
this.divideShift = MAGIC[i + 2];
int j = (p_184725_ + this.valuesPerLong - 1) / this.valuesPerLong;
if (p_184726_ != null) {
if (p_184726_.length != j) {
throw new SimpleBitStorage.InitializationException("Invalid length given for storage, got: " + p_184726_.length + " but expected: " + j);
}

this.data = p_184726_;
} else {
this.data = new long[j];
}

}

---> SimpleBitStorage(bitLength, sizeOfData, dataArray)
heightmapの次に送られるchunk formatのbyte arrayは ここに書いてある通り ワールドの高さによって
何か
何か2w ago
No description
何か
何か2w ago
したのchunk sectionの数が変わる 16^3毎にデータ送るからデフォルトの高さ384の場合384/16=24 常にchunk formatは 2bytes block count 16^3(4096)entries palette 4^3(64)entries palette のデータを持ってる データは下から上に向かって 送られてくる heightmapとこのバイト配列でもいいけど
何か
何か2w ago
No description
何か
何か2w ago
下に丁寧にブロックごとのデータをまとめたものがあるから こっち使ったほうが楽だとおもいます。 これについていうと、これはheightmapの値でブロックではない。
akon
akon2w ago
うわ 召喚されてる
何か
何か2w ago
ブロックのデータは下のbyte arrayに入ってて
何か
何か2w ago
No description
何か
何か2w ago
ブロックの数が最初にきて そのあとにブロックの idが並ぶ palette = 4bytes block length array of block ids 上のpaletteに送られてくるのがブロックで下はtile entityだったわ 結局paletteを覗いていくしかない
import:
com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.PacketType
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.utility.MinecraftReflection
com.comphenix.protocol.wrappers.BukkitConverters
ch.njol.skript.Skript
net.minecraft.network.PacketDataSerializer
io.netty.buffer.Unpooled
java.util.Arrays

function packet_sending(proxy: object, e: object):
#set {_levelChunk} to {_e}.getPacket().getSpecificModifier(MinecraftReflection.getLevelChunkPacketDataClass()).read(0)
set {_levelChunk} to {_e}.getPacket().getLevelChunkData().read(0)
set {_buf} to new PacketDataSerializer(Unpooled.wrappedBuffer({_levelChunk}.getBuffer()))
loop 30 times:
set {_bc} to {_buf}.readShort()
#if {_buf}.writerIndex() is {_buf}.readerIndex():
if {_bc} is 0:
stop loop

broadcast "%loop-number% BC %{_bc}%"

#-----BLOCK
set {_bpe} to {_buf}.readUnsignedByte()
broadcast "%loop-number% BLOCK_BPE %{_bpe}%"
if {_bpe} is 0:
set {_eid} to {_buf}.m()
broadcast "%loop-number% BLOCK_Single %{_eid}%"
else if {_bpe} <= 8:
set {_pdata} to {_buf}.c()
broadcast "%loop-number% BLOCK_Indirect %{_pdata}%"
set {_da} to {_buf}.d()
broadcast "%loop-number% BLOCK_DataArray %Arrays.asList({_da}).size()%"

#-----BIOME
set {_bpe} to {_buf}.readUnsignedByte()
broadcast "%loop-number% BIOME_BPE %{_bpe}%"
if {_bpe} is 0:
set {_eid} to {_buf}.m()
broadcast "%loop-number% BIOME_Single %{_eid}%"
else if {_bpe} <= 3:
set {_pdata} to {_buf}.c()
broadcast "%loop-number% BIOME_Indirect %{_pdata}%"
set {_da} to {_buf}.d()
broadcast "%loop-number% BIOME_DataArray %{_da}%"

broadcast "%{_buf}.readerIndex()% %{_buf}.writerIndex()%"
import:
com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.PacketType
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.utility.MinecraftReflection
com.comphenix.protocol.wrappers.BukkitConverters
ch.njol.skript.Skript
net.minecraft.network.PacketDataSerializer
io.netty.buffer.Unpooled
java.util.Arrays

function packet_sending(proxy: object, e: object):
#set {_levelChunk} to {_e}.getPacket().getSpecificModifier(MinecraftReflection.getLevelChunkPacketDataClass()).read(0)
set {_levelChunk} to {_e}.getPacket().getLevelChunkData().read(0)
set {_buf} to new PacketDataSerializer(Unpooled.wrappedBuffer({_levelChunk}.getBuffer()))
loop 30 times:
set {_bc} to {_buf}.readShort()
#if {_buf}.writerIndex() is {_buf}.readerIndex():
if {_bc} is 0:
stop loop

broadcast "%loop-number% BC %{_bc}%"

#-----BLOCK
set {_bpe} to {_buf}.readUnsignedByte()
broadcast "%loop-number% BLOCK_BPE %{_bpe}%"
if {_bpe} is 0:
set {_eid} to {_buf}.m()
broadcast "%loop-number% BLOCK_Single %{_eid}%"
else if {_bpe} <= 8:
set {_pdata} to {_buf}.c()
broadcast "%loop-number% BLOCK_Indirect %{_pdata}%"
set {_da} to {_buf}.d()
broadcast "%loop-number% BLOCK_DataArray %Arrays.asList({_da}).size()%"

#-----BIOME
set {_bpe} to {_buf}.readUnsignedByte()
broadcast "%loop-number% BIOME_BPE %{_bpe}%"
if {_bpe} is 0:
set {_eid} to {_buf}.m()
broadcast "%loop-number% BIOME_Single %{_eid}%"
else if {_bpe} <= 3:
set {_pdata} to {_buf}.c()
broadcast "%loop-number% BIOME_Indirect %{_pdata}%"
set {_da} to {_buf}.d()
broadcast "%loop-number% BIOME_DataArray %{_da}%"

broadcast "%{_buf}.readerIndex()% %{_buf}.writerIndex()%"
function packet_receiving(proxy: object, e: object):
broadcast "receive %{_e}%"

function sending_wl() :: object:
return ListeningWhitelist.newBuilder().normal().types(PacketType.Play.Server.MAP_CHUNK).build()

function receiving_wl() :: object:
return ListeningWhitelist.EMPTY_WHITELIST

function plugin() :: object:
return Skript.getInstance()

command /test:
trigger:
if {proxy} is set:
ProtocolLibrary.getProtocolManager().removePacketListener({proxy})
set {_funcs::onPacketSending} to function reference "packet_sending"
set {_funcs::onPacketReceiving} to function reference "packet_receiving"
set {_funcs::getSendingWhitelist} to function reference "sending_wl"
set {_funcs::getReceivingWhitelist} to function reference "receiving_wl"
set {_funcs::getPlugin} to function reference "plugin"
set {proxy} to proxy of PacketListener from {_funcs::*}
ProtocolLibrary.getProtocolManager().addPacketListener({proxy})
function packet_receiving(proxy: object, e: object):
broadcast "receive %{_e}%"

function sending_wl() :: object:
return ListeningWhitelist.newBuilder().normal().types(PacketType.Play.Server.MAP_CHUNK).build()

function receiving_wl() :: object:
return ListeningWhitelist.EMPTY_WHITELIST

function plugin() :: object:
return Skript.getInstance()

command /test:
trigger:
if {proxy} is set:
ProtocolLibrary.getProtocolManager().removePacketListener({proxy})
set {_funcs::onPacketSending} to function reference "packet_sending"
set {_funcs::onPacketReceiving} to function reference "packet_receiving"
set {_funcs::getSendingWhitelist} to function reference "sending_wl"
set {_funcs::getReceivingWhitelist} to function reference "receiving_wl"
set {_funcs::getPlugin} to function reference "plugin"
set {proxy} to proxy of PacketListener from {_funcs::*}
ProtocolLibrary.getProtocolManager().addPacketListener({proxy})
何か
何か2w ago
No description
何か
何か2w ago
No description
何か
何か2w ago
bpe = 4-8 indirectの場合はpalettのインデックスを示す bpe = 15の場合はData ArrayにブロックのIDが入る bpe = 0 Empty
import:
com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.PacketType
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.utility.MinecraftReflection
com.comphenix.protocol.wrappers.BukkitConverters
ch.njol.skript.Skript
net.minecraft.network.PacketDataSerializer
io.netty.buffer.Unpooled
java.util.Arrays
java.util.BitSet

function packet_sending(proxy: object, e: object):
set {_levelChunk} to {_e}.getPacket().getLevelChunkData().read(0)
set {_buf} to new PacketDataSerializer(Unpooled.wrappedBuffer({_levelChunk}.getBuffer()))
loop 1 times:
set {_bc} to {_buf}.readShort()
if {_bc} is 0:
stop loop

set {_bpe} to {_buf}.readUnsignedByte()
if {_bpe} is 0:
set {_eid} to {_buf}.m()
else if {_bpe} <= 8:
set {_pdata} to {_buf}.c()
set {_da} to {_buf}.d()
set {_bs} to BitSet.valueOf({_da})

if {_bpe} is not 0:
loop {_bs}.size() / {_bpe} times:
set {_from} to ((loop-number-2) - 1) * {_bpe}
set {_to} to loop-number-2 * {_bpe} - 1
set {_bs2} to {_bs}.get({_from}, {_to})
set {_v} to {_bs2}.toLongArray()[0]
if {_v} is none:
set {_v} to 0

if {_bpe} <= 8:
set {_bid} to {_pdata}[{_v}]
else if {_bpe} is 15
set {_bid} to {_v}

#ここから処理を書く

set {_bpe} to {_buf}.readUnsignedByte()
if {_bpe} is 0:
set {_eid} to {_buf}.m()
else if {_bpe} <= 3:
set {_pdata} to {_buf}.c()
set {_da} to {_buf}.d()
import:
com.comphenix.protocol.events.PacketListener
com.comphenix.protocol.events.ListeningWhitelist
com.comphenix.protocol.PacketType
com.comphenix.protocol.ProtocolLibrary
com.comphenix.protocol.utility.MinecraftReflection
com.comphenix.protocol.wrappers.BukkitConverters
ch.njol.skript.Skript
net.minecraft.network.PacketDataSerializer
io.netty.buffer.Unpooled
java.util.Arrays
java.util.BitSet

function packet_sending(proxy: object, e: object):
set {_levelChunk} to {_e}.getPacket().getLevelChunkData().read(0)
set {_buf} to new PacketDataSerializer(Unpooled.wrappedBuffer({_levelChunk}.getBuffer()))
loop 1 times:
set {_bc} to {_buf}.readShort()
if {_bc} is 0:
stop loop

set {_bpe} to {_buf}.readUnsignedByte()
if {_bpe} is 0:
set {_eid} to {_buf}.m()
else if {_bpe} <= 8:
set {_pdata} to {_buf}.c()
set {_da} to {_buf}.d()
set {_bs} to BitSet.valueOf({_da})

if {_bpe} is not 0:
loop {_bs}.size() / {_bpe} times:
set {_from} to ((loop-number-2) - 1) * {_bpe}
set {_to} to loop-number-2 * {_bpe} - 1
set {_bs2} to {_bs}.get({_from}, {_to})
set {_v} to {_bs2}.toLongArray()[0]
if {_v} is none:
set {_v} to 0

if {_bpe} <= 8:
set {_bid} to {_pdata}[{_v}]
else if {_bpe} is 15
set {_bid} to {_v}

#ここから処理を書く

set {_bpe} to {_buf}.readUnsignedByte()
if {_bpe} is 0:
set {_eid} to {_buf}.m()
else if {_bpe} <= 3:
set {_pdata} to {_buf}.c()
set {_da} to {_buf}.d()
function packet_receiving(proxy: object, e: object):
broadcast "receive %{_e}%"

function sending_wl() :: object:
return ListeningWhitelist.newBuilder().normal().types(PacketType.Play.Server.MAP_CHUNK).build()

function receiving_wl() :: object:
return ListeningWhitelist.EMPTY_WHITELIST

function plugin() :: object:
return Skript.getInstance()

command /test:
trigger:
if {proxy} is set:
ProtocolLibrary.getProtocolManager().removePacketListener({proxy})
set {_funcs::onPacketSending} to function reference "packet_sending"
set {_funcs::onPacketReceiving} to function reference "packet_receiving"
set {_funcs::getSendingWhitelist} to function reference "sending_wl"
set {_funcs::getReceivingWhitelist} to function reference "receiving_wl"
set {_funcs::getPlugin} to function reference "plugin"
set {proxy} to proxy of PacketListener from {_funcs::*}
ProtocolLibrary.getProtocolManager().addPacketListener({proxy})
function packet_receiving(proxy: object, e: object):
broadcast "receive %{_e}%"

function sending_wl() :: object:
return ListeningWhitelist.newBuilder().normal().types(PacketType.Play.Server.MAP_CHUNK).build()

function receiving_wl() :: object:
return ListeningWhitelist.EMPTY_WHITELIST

function plugin() :: object:
return Skript.getInstance()

command /test:
trigger:
if {proxy} is set:
ProtocolLibrary.getProtocolManager().removePacketListener({proxy})
set {_funcs::onPacketSending} to function reference "packet_sending"
set {_funcs::onPacketReceiving} to function reference "packet_receiving"
set {_funcs::getSendingWhitelist} to function reference "sending_wl"
set {_funcs::getReceivingWhitelist} to function reference "receiving_wl"
set {_funcs::getPlugin} to function reference "plugin"
set {proxy} to proxy of PacketListener from {_funcs::*}
ProtocolLibrary.getProtocolManager().addPacketListener({proxy})
{_bid} = block id ここで草ブロックか判定して いじれば完了 あとは頑張ってね
あお🦀
あお🦀2w ago
ありがとうございます いろいろ試してみます!
Want results from more Discord servers?
Add your server
More Posts
変数名の最初にハイフンをつけるのにはなにか意味があるのですか?reflectを使っているコードに多い気がしますアイテムを除外する方法を教えてくださいこう設定してもアイテムが燃えてしまいます アイテムを除外する方法を教えてください set {_a} to {_a} + 1 set {_範囲コメントアウトしたい/* aaa bbb */ みたいなやつです送信されるはずのpacketを改変して送信する方法サーバーの時間とプレイヤーに送信する時間を異なる時間にするfunctionを書きました ```function time(p: player, time: integer): set {_wo1.16.5のskript構成とりあえずこれは入れとけっていう 1.16.5におけるskriptの構成教えてください ver付だと助かりますdefensemobというtagを持ったmobから最も近いattackmobというtagを持ったmobを検知したいうまい方法が思い当たりませんでした..空中でのジャンプ(スペースキー)を検知したいだいぶ前にみらげさんがPR内でやっていたような気がしますloopの対象を動的に変更したい``` loop all blocktypes: broadcast "&a%loop-value%" ``` こうすればblockのタイプが取得できますが、 ``` command /getMC、SK共に最新バージョンで、mundoskのような非同期を扱うことは可能ですか?タイトルが全てです関数名ってcamelcaseがいいとかsnakecaseがいいとかありますか?人によってバラバラなので少し気になりました