- 10
- 0
Здравствуйте товарищи, начал писать мод для одного прибора чтобы взаимодействие с миром майнкрафта было более красочным...
Нужно сделать чтобы при поломки блока данные отправлялись к персонажу поломавшему блок. Понимаю что нужно использовать пакетную систему, так как ивент поломки блока, видимо, находится на сервере и надо чтобы сервер отправлял месседж клиенту и потом эти данные я к примеру выведу для отладки в консоль. Но к сожалению пока в тупике. Причем реализацию для однопользовательского режима сделал, но все ломается как только персонаж теряет свою уникальность
Сам ивент
Класс пакета
Класс клиента
Класс сервера
Нужно сделать чтобы при поломки блока данные отправлялись к персонажу поломавшему блок. Понимаю что нужно использовать пакетную систему, так как ивент поломки блока, видимо, находится на сервере и надо чтобы сервер отправлял месседж клиенту и потом эти данные я к примеру выведу для отладки в консоль. Но к сожалению пока в тупике. Причем реализацию для однопользовательского режима сделал, но все ломается как только персонаж теряет свою уникальность
Сам ивент
Event:
@SubscribeEvent
public static void onBlockBreak(final BlockEvent.BreakEvent event)
{
String playerName = event.getPlayer().getName().getString();
String block = event.getState().getBlock().asItem().toString();
Packet.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(()->event.getPlayer().getServer().), new ClientBoundBlock(event.getPos()));
}
Класс пакета
Packet:
public final class Packet
{
private static final String PROTOCOL_VERSION = "1";
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation(EmptyMod.MOD_ID, "main"), () -> PROTOCOL_VERSION,
PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals);
private Packet(){}
public static void init()
{
int index = 0;
INSTANCE.messageBuilder(ServerBoundBlock.class, index, NetworkDirection.PLAY_TO_SERVER)
.encoder(ServerBoundBlock::encode).decoder(ServerBoundBlock::decode)
.consumer(ServerBoundBlock::handle).add();
INSTANCE.messageBuilder(ClientBoundBlock.class, index++, NetworkDirection.PLAY_TO_CLIENT)
.encoder(ClientBoundBlock::encode).decoder(ClientBoundBlock::decode)
.consumer(ClientBoundBlock::handle).add();
}
}
Класс клиента
ClientBoundBlock:
public class ClientBoundBlock
{
public final BlockPos blockPos;
public ClientBoundBlock(BlockPos blockPos)
{
this.blockPos = blockPos;
}
public ClientBoundBlock(PacketBuffer buffer)
{
this(buffer.readBlockPos());
}
public void encode(PacketBuffer buffer)
{
buffer.writeBlockPos(this.blockPos);
}
public static ClientBoundBlock decode(PacketBuffer buffer)
{
return new ClientBoundBlock(buffer.readBlockPos());
}
public boolean handle(Supplier<NetworkEvent.Context> ctx)
{
final AtomicBoolean success = new AtomicBoolean(false);
ctx.get().enqueueWork(()->{
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> success.set(true));
System.out.println("Server watch breaking block!!!");
});
ctx.get().setPacketHandled(true);
return success.get();
}
}
Класс сервера
ServerBoundBlock:
public class ServerBoundBlock
{
public final BlockPos blockPos;
public ServerBoundBlock(BlockPos blockPos)
{
this.blockPos = blockPos;
}
public void encode(PacketBuffer buffer)
{
buffer.writeBlockPos(this.blockPos);
}
public static ServerBoundBlock decode(PacketBuffer buffer)
{
return new ServerBoundBlock(buffer.readBlockPos());
}
public boolean handle(Supplier<NetworkEvent.Context> ctx)
{
final AtomicBoolean success = new AtomicBoolean(false);
ctx.get().enqueueWork(()->{
System.out.println("Server watch breaking block!!!");
success.set(true);
});
ctx.get().setPacketHandled(true);
return success.get();
}
}
- Краш-лог
-
[18:32:31] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
at net.minecraftforge.fml.network.PacketDistributor.lambda$playerConsumer$1(PacketDistributor.java:217) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.PacketDistributor$PacketTarget.send(PacketDistributor.java:179) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.simple.SimpleChannel.send(SimpleChannel.java:124) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at com.PoNi.emptymod.core.events.AromaEvents.onBlockBreak(AromaEvents.java:30) ~[main/:?] {re:classloading}
at net.minecraftforge.eventbus.ASMEventHandler_1_AromaEvents_onBlockBreak_BreakEvent.invoke(.dynamic) ~[?:?] {}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:609) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.tryHarvestBlock(PlayerInteractionManager.java:239) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_229860_a_(PlayerInteractionManager.java:226) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_225416_a(PlayerInteractionManager.java:155) ~[forge:?] {re:classloading}
at net.minecraft.network.play.ServerPlayNetHandler.processPlayerDigging(ServerPlayNetHandler.java:957) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:50) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:12) ~[forge:?] {re:classloading}
at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge:?] {re:classloading}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:759) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:742) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:736) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:721) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:668) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) ~[forge:?] {re:classloading,pl:accesstransformer:B}
Краш-лог:
[18:32:31] [Server thread/FATAL] [minecraft/ThreadTaskExecutor]: Error executing task on Server
java.lang.NullPointerException: null
at net.minecraftforge.fml.network.PacketDistributor.lambda$playerConsumer$1(PacketDistributor.java:217) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.PacketDistributor$PacketTarget.send(PacketDistributor.java:179) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at net.minecraftforge.fml.network.simple.SimpleChannel.send(SimpleChannel.java:124) ~[forge-1.16.5-36.2.34_mapped_snapshot_20210309-1.16.5-recomp.jar:?] {re:classloading}
at com.PoNi.emptymod.core.events.AromaEvents.onBlockBreak(AromaEvents.java:30) ~[main/:?] {re:classloading}
at net.minecraftforge.eventbus.ASMEventHandler_1_AromaEvents_onBlockBreak_BreakEvent.invoke(.dynamic) ~[?:?] {}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-4.0.0.jar:?] {}
at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:609) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.tryHarvestBlock(PlayerInteractionManager.java:239) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_229860_a_(PlayerInteractionManager.java:226) ~[forge:?] {re:classloading}
at net.minecraft.server.management.PlayerInteractionManager.func_225416_a(PlayerInteractionManager.java:155) ~[forge:?] {re:classloading}
at net.minecraft.network.play.ServerPlayNetHandler.processPlayerDigging(ServerPlayNetHandler.java:957) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:50) ~[forge:?] {re:classloading}
at net.minecraft.network.play.client.CPlayerDiggingPacket.processPacket(CPlayerDiggingPacket.java:12) ~[forge:?] {re:classloading}
at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) ~[forge:?] {re:classloading}
at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) ~[forge:?] {re:classloading}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:759) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:742) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:736) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.util.concurrent.ThreadTaskExecutor.drainTasks(ThreadTaskExecutor.java:97) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:721) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:668) ~[forge:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) ~[forge:?] {re:classloading,pl:accesstransformer:B}