diff --git a/src/main/java/com/youpe/test/Testing.java b/src/main/java/com/youpe/test/Testing.java index 8840904..fe85466 100644 --- a/src/main/java/com/youpe/test/Testing.java +++ b/src/main/java/com/youpe/test/Testing.java @@ -1,6 +1,8 @@ package com.youpe.test; +import com.youpe.test.event.DirtBrokenAfter; import com.youpe.test.item.ModItems; +import com.youpe.test.networking.ModNetworkingManager; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; @@ -28,28 +30,8 @@ public class Testing implements ModInitializer { public void onInitialize() { LOGGER.info("Hello Fabric world!"); ModItems.registerModItems(); + ModNetworkingManager.registerC2SPackets(); + PlayerBlockBreakEvents.AFTER.register(new DirtBrokenAfter()); - PlayerBlockBreakEvents.AFTER.register((world, player, pos, state, entity) -> { - if (state.getBlock() == Blocks.GRASS_BLOCK || state.getBlock() == Blocks.DIRT) { - StateSaverAndLoader serverState = StateSaverAndLoader.getServerState(world.getServer()); - // Increment the amount of dirt blocks that have been broken - serverState.totalDirtBlocksBroken += 1; - - PlayerData playerState = StateSaverAndLoader.getPlayerState(player); - playerState.dirtBlocksBroken += 1; - - // Send a packet to the client - MinecraftServer server = world.getServer(); - - PacketByteBuf data = PacketByteBufs.create(); - data.writeInt(serverState.totalDirtBlocksBroken); - data.writeInt(playerState.dirtBlocksBroken); - - ServerPlayerEntity playerEntity = server.getPlayerManager().getPlayer(player.getUuid()); - server.execute(() -> { - ServerPlayNetworking.send(playerEntity, DIRT_BROKEN, data); - }); - } - }); } } \ No newline at end of file diff --git a/src/main/java/com/youpe/test/TestingClient.java b/src/main/java/com/youpe/test/TestingClient.java index 5c4a023..31a0140 100644 --- a/src/main/java/com/youpe/test/TestingClient.java +++ b/src/main/java/com/youpe/test/TestingClient.java @@ -3,6 +3,7 @@ package com.youpe.test; import com.youpe.test.event.KeyInputHandler; import com.youpe.test.event.TestHudRender; +import com.youpe.test.networking.ModNetworkingManager; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.text.Text; @@ -11,19 +12,10 @@ public class TestingClient implements ClientModInitializer{ @Override public void onInitializeClient() { - KeyInputHandler.register(); KeyInputHandler.registerKeyInputs(); - ClientPlayNetworking.registerGlobalReceiver(Testing.DIRT_BROKEN, (client, handler, buf, responseSender) -> { - int totalDirtBlocksBroken = buf.readInt(); - int playerSpecificDirtBlocksBroken = buf.readInt(); - - client.execute(() -> { - client.player.sendMessage(Text.literal("Total dirt blocks broken: " + totalDirtBlocksBroken)); - client.player.sendMessage(Text.literal("Player specific dirt blocks broken: " + playerSpecificDirtBlocksBroken)); - }); - }); TestHudRender.registerModRenders(); + ModNetworkingManager.registerS2CPackets(); } } diff --git a/src/main/java/com/youpe/test/event/DirtBrokenAfter.java b/src/main/java/com/youpe/test/event/DirtBrokenAfter.java new file mode 100644 index 0000000..c1c26e5 --- /dev/null +++ b/src/main/java/com/youpe/test/event/DirtBrokenAfter.java @@ -0,0 +1,49 @@ +package com.youpe.test.event; + +import com.youpe.test.networking.ModNetworkingManager; +import com.youpe.test.server.PlayerData; +import com.youpe.test.server.StateSaverAndLoader; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +public class DirtBrokenAfter implements PlayerBlockBreakEvents.After { + + @Override + public void afterBlockBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity) { + if (state.getBlock() == Blocks.GRASS_BLOCK || state.getBlock() == Blocks.DIRT) { + + MinecraftServer server = world.getServer(); + StateSaverAndLoader serverState = StateSaverAndLoader.getServerState(server); + // Increment the amount of dirt blocks that have been broken + serverState.totalDirtBlocksBroken += 1; + + PlayerData playerState = StateSaverAndLoader.getPlayerState(player); + playerState.dirtBlocksBroken += 1; + + // Send a packet to the client + + + PacketByteBuf data = PacketByteBufs.create(); + data.writeInt(serverState.totalDirtBlocksBroken); + data.writeInt(playerState.dirtBlocksBroken); + + ServerPlayerEntity playerEntity = server.getPlayerManager().getPlayer(player.getUuid()); + + server.execute(() -> { + ServerPlayNetworking.send(playerEntity, ModNetworkingManager.DIRT_BROKEN, data); + }); + } + } +} diff --git a/src/main/java/com/youpe/test/event/KeyInputHandler.java b/src/main/java/com/youpe/test/event/KeyInputHandler.java index a1651b5..9326900 100644 --- a/src/main/java/com/youpe/test/event/KeyInputHandler.java +++ b/src/main/java/com/youpe/test/event/KeyInputHandler.java @@ -2,8 +2,6 @@ package com.youpe.test.event; import com.youpe.test.Testing; import org.lwjgl.glfw.GLFW; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.youpe.test.client.GUI; @@ -22,6 +20,7 @@ public class KeyInputHandler { public static KeyBinding modkey; public static void registerKeyInputs() { + registerKeyBindings(); ClientTickEvents.END_CLIENT_TICK.register(client -> { if (modkey.wasPressed()) { Testing.LOGGER.info("NAZHAL PIZDEC BLYA"); @@ -31,7 +30,7 @@ public class KeyInputHandler { }); } - public static void register() { + public static void registerKeyBindings() { modkey = KeyBindingHelper.registerKeyBinding(new KeyBinding( KEY_TEST, InputUtil.Type.KEYSYM, diff --git a/src/main/java/com/youpe/test/networking/ModNetworkingManager.java b/src/main/java/com/youpe/test/networking/ModNetworkingManager.java new file mode 100644 index 0000000..27c0479 --- /dev/null +++ b/src/main/java/com/youpe/test/networking/ModNetworkingManager.java @@ -0,0 +1,19 @@ +package com.youpe.test.networking; + +import com.youpe.test.Testing; + +import com.youpe.test.networking.packet.DirtBrokenS2CPacket; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.util.Identifier; + +public class ModNetworkingManager { + public static final Identifier DIRT_BROKEN = new Identifier(Testing.MOD_ID, "msg_dirt_broken"); + + public static void registerC2SPackets(){ + + } + public static void registerS2CPackets(){ + ClientPlayNetworking.registerGlobalReceiver(DIRT_BROKEN, DirtBrokenS2CPacket::receive); + } +} diff --git a/src/main/java/com/youpe/test/networking/packet/DirtBrokenS2CPacket.java b/src/main/java/com/youpe/test/networking/packet/DirtBrokenS2CPacket.java new file mode 100644 index 0000000..6d85fa5 --- /dev/null +++ b/src/main/java/com/youpe/test/networking/packet/DirtBrokenS2CPacket.java @@ -0,0 +1,18 @@ +package com.youpe.test.networking.packet; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; + + +public class DirtBrokenS2CPacket { + public static void receive(MinecraftClient client, ClientPlayNetworkHandler handler, PacketByteBuf buf, PacketSender responseSender) { + int totalDirtBlocksBroken = buf.readInt(); + int playerSpecificDirtBlocksBroken = buf.readInt(); + client.player.sendMessage(Text.literal("Total dirt blocks broken: " + totalDirtBlocksBroken)); + client.player.sendMessage(Text.literal("Player specific dirt blocks broken: " + playerSpecificDirtBlocksBroken)); + + } +} diff --git a/src/main/java/com/youpe/test/server/PlayerData.java b/src/main/java/com/youpe/test/server/PlayerData.java index fd05989..b6a6ff0 100644 --- a/src/main/java/com/youpe/test/server/PlayerData.java +++ b/src/main/java/com/youpe/test/server/PlayerData.java @@ -1,5 +1,6 @@ package com.youpe.test.server; public class PlayerData { + public int dirtBlocksBroken = 0; } diff --git a/src/main/java/com/youpe/test/server/StateSaverAndLoader.java b/src/main/java/com/youpe/test/server/StateSaverAndLoader.java index 8c9e67b..1c1e6d7 100644 --- a/src/main/java/com/youpe/test/server/StateSaverAndLoader.java +++ b/src/main/java/com/youpe/test/server/StateSaverAndLoader.java @@ -3,6 +3,7 @@ package com.youpe.test.server; import java.util.HashMap; import java.util.UUID; +import com.youpe.test.Testing; import net.minecraft.entity.LivingEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.server.MinecraftServer; @@ -13,11 +14,13 @@ import net.minecraft.world.World; public class StateSaverAndLoader extends PersistentState { public Integer totalDirtBlocksBroken = 0; + public HashMap players = new HashMap<>(); @Override public NbtCompound writeNbt(NbtCompound nbt) { nbt.putInt("totalDirtBlocksBroken", totalDirtBlocksBroken); + return nbt; } @@ -34,7 +37,7 @@ public class StateSaverAndLoader extends PersistentState { // The first time the following 'getOrCreate' function is called, it creates a brand new 'StateSaverAndLoader' and // stores it inside the 'PersistentStateManager'. The subsequent calls to 'getOrCreate' pass in the saved // 'StateSaverAndLoader' NBT on disk to our function 'StateSaverAndLoader::createFromNbt'. - StateSaverAndLoader state = persistentStateManager.getOrCreate(StateSaverAndLoader::createFromNbt, StateSaverAndLoader::new, "testing"); + StateSaverAndLoader state = persistentStateManager.getOrCreate(StateSaverAndLoader::createFromNbt, StateSaverAndLoader::new, Testing.MOD_ID); // If state is not marked dirty, when Minecraft closes, 'writeNbt' won't be called and therefore nothing will be saved. // Technically it's 'cleaner' if you only mark state as dirty when there was actually a change, but the vast majority