Networking new

This commit is contained in:
Vladislav Kuznetsov 2024-04-13 20:47:51 +03:00
parent 0d02dbc463
commit 7536863a00
8 changed files with 99 additions and 36 deletions

View File

@ -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);
});
}
});
}
}

View File

@ -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();
}
}

View File

@ -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);
});
}
}
}

View File

@ -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,

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -1,5 +1,6 @@
package com.youpe.test.server;
public class PlayerData {
public int dirtBlocksBroken = 0;
}

View File

@ -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<UUID, PlayerData> 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