diff --git a/src/main/java/com/youpe/test/Testing.java b/src/main/java/com/youpe/test/Testing.java index fe85466..4bcc12b 100644 --- a/src/main/java/com/youpe/test/Testing.java +++ b/src/main/java/com/youpe/test/Testing.java @@ -1,11 +1,13 @@ package com.youpe.test; import com.youpe.test.event.DirtBrokenAfter; +import com.youpe.test.event.JoinServerHandler; 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; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.block.Blocks; import net.minecraft.network.PacketByteBuf; @@ -24,14 +26,14 @@ public class Testing implements ModInitializer { public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - public static final Identifier DIRT_BROKEN = new Identifier("testing", "dirt_broken"); - @Override public void onInitialize() { LOGGER.info("Hello Fabric world!"); - ModItems.registerModItems(); - ModNetworkingManager.registerC2SPackets(); - PlayerBlockBreakEvents.AFTER.register(new DirtBrokenAfter()); + ModNetworkingManager.registerC2SPackets(); + ModItems.registerModItems(); + + PlayerBlockBreakEvents.AFTER.register(new DirtBrokenAfter()); + ServerPlayConnectionEvents.JOIN.register(new JoinServerHandler()); } } \ 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 31a0140..0799821 100644 --- a/src/main/java/com/youpe/test/TestingClient.java +++ b/src/main/java/com/youpe/test/TestingClient.java @@ -4,18 +4,24 @@ import com.youpe.test.event.KeyInputHandler; import com.youpe.test.event.TestHudRender; import com.youpe.test.networking.ModNetworkingManager; +import com.youpe.test.server.PlayerData; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.text.Text; public class TestingClient implements ClientModInitializer{ + public static PlayerData playerData = new PlayerData(); + @Override public void onInitializeClient() { + + ModNetworkingManager.registerS2CPackets(); + KeyInputHandler.registerKeyInputs(); TestHudRender.registerModRenders(); - ModNetworkingManager.registerS2CPackets(); + } } diff --git a/src/main/java/com/youpe/test/event/JoinServerHandler.java b/src/main/java/com/youpe/test/event/JoinServerHandler.java new file mode 100644 index 0000000..b8d19f3 --- /dev/null +++ b/src/main/java/com/youpe/test/event/JoinServerHandler.java @@ -0,0 +1,33 @@ +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.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayNetworkHandler; + +public class JoinServerHandler implements ServerPlayConnectionEvents.Join { + + + @Override + public void onPlayReady(ServerPlayNetworkHandler handler, PacketSender sender, MinecraftServer server) { + PlayerData playerState = StateSaverAndLoader.getPlayerState(handler.getPlayer()); + PacketByteBuf data = PacketByteBufs.create(); + data.writeInt(playerState.dirtBlocksBroken); + data.writeInt(playerState.level); + data.writeFloat(playerState.exp); + data.writeFloat(playerState.strength); + data.writeFloat(playerState.dexterity); + data.writeFloat(playerState.intelligence); + data.writeString(playerState.className); + server.execute(() -> { + ServerPlayNetworking.send(handler.getPlayer(), ModNetworkingManager.INIT_SYNC, data); + }); + } +} diff --git a/src/main/java/com/youpe/test/networking/ModNetworkingManager.java b/src/main/java/com/youpe/test/networking/ModNetworkingManager.java index 27c0479..84c8319 100644 --- a/src/main/java/com/youpe/test/networking/ModNetworkingManager.java +++ b/src/main/java/com/youpe/test/networking/ModNetworkingManager.java @@ -3,17 +3,20 @@ package com.youpe.test.networking; import com.youpe.test.Testing; import com.youpe.test.networking.packet.DirtBrokenS2CPacket; +import com.youpe.test.networking.packet.InitSyncS2CPacket; 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 final Identifier INIT_SYNC = new Identifier(Testing.MOD_ID, "msg_init_sync"); public static void registerC2SPackets(){ } public static void registerS2CPackets(){ ClientPlayNetworking.registerGlobalReceiver(DIRT_BROKEN, DirtBrokenS2CPacket::receive); + ClientPlayNetworking.registerGlobalReceiver(INIT_SYNC, InitSyncS2CPacket::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 index 6d85fa5..e0df11d 100644 --- a/src/main/java/com/youpe/test/networking/packet/DirtBrokenS2CPacket.java +++ b/src/main/java/com/youpe/test/networking/packet/DirtBrokenS2CPacket.java @@ -11,8 +11,10 @@ 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)); + client.execute(() -> { + 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/networking/packet/InitSyncS2CPacket.java b/src/main/java/com/youpe/test/networking/packet/InitSyncS2CPacket.java new file mode 100644 index 0000000..b64b3a6 --- /dev/null +++ b/src/main/java/com/youpe/test/networking/packet/InitSyncS2CPacket.java @@ -0,0 +1,25 @@ +package com.youpe.test.networking.packet; + +import com.youpe.test.TestingClient; +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 InitSyncS2CPacket { + public static void receive(MinecraftClient client, ClientPlayNetworkHandler handler, PacketByteBuf buf, PacketSender responseSender) { + + TestingClient.playerData.dirtBlocksBroken = buf.readInt(); + TestingClient.playerData.level = buf.readInt(); + TestingClient.playerData.exp = buf.readFloat(); + TestingClient.playerData.strength = buf.readFloat(); + TestingClient.playerData.dexterity = buf.readFloat(); + TestingClient.playerData.intelligence = buf.readFloat(); + TestingClient.playerData.className = buf.readString(); + + client.execute(() -> { + client.player.sendMessage(Text.literal("Your broken dirt on this server: " + TestingClient.playerData.dirtBlocksBroken), false); + }); + } +} diff --git a/src/main/java/com/youpe/test/server/PlayerData.java b/src/main/java/com/youpe/test/server/PlayerData.java index b6a6ff0..9857a3a 100644 --- a/src/main/java/com/youpe/test/server/PlayerData.java +++ b/src/main/java/com/youpe/test/server/PlayerData.java @@ -3,4 +3,12 @@ package com.youpe.test.server; public class PlayerData { public int dirtBlocksBroken = 0; + public int level = 0; + public float exp = 0; + public String className = "base"; + public float strength = 1; + public float dexterity = 1; + public float intelligence = 1; + + } diff --git a/src/main/java/com/youpe/test/server/StateSaverAndLoader.java b/src/main/java/com/youpe/test/server/StateSaverAndLoader.java index 1c1e6d7..6882129 100644 --- a/src/main/java/com/youpe/test/server/StateSaverAndLoader.java +++ b/src/main/java/com/youpe/test/server/StateSaverAndLoader.java @@ -21,12 +21,49 @@ public class StateSaverAndLoader extends PersistentState { public NbtCompound writeNbt(NbtCompound nbt) { nbt.putInt("totalDirtBlocksBroken", totalDirtBlocksBroken); + NbtCompound playersNbt = new NbtCompound(); + + players.forEach((uuid, playerData) -> { + NbtCompound playerNbt = new NbtCompound(); + + // Player stats + playerNbt.putInt("dirtBlocksBroken", playerData.dirtBlocksBroken); + playerNbt.putInt("level", playerData.level); + playerNbt.putFloat("exp", playerData.exp); + playerNbt.putFloat("strength", playerData.strength); + playerNbt.putFloat("dexterity", playerData.dexterity); + playerNbt.putFloat("intelligence", playerData.intelligence); + playerNbt.putString("className", playerData.className); + + + playersNbt.put(uuid.toString(), playerNbt); + }); + nbt.put("players", playersNbt); + return nbt; } public static StateSaverAndLoader createFromNbt(NbtCompound tag) { StateSaverAndLoader state = new StateSaverAndLoader(); state.totalDirtBlocksBroken = tag.getInt("totalDirtBlocksBroken"); + + NbtCompound playersNbt = tag.getCompound("players"); + playersNbt.getKeys().forEach((key) -> { + PlayerData playerData = new PlayerData(); + + playerData.dirtBlocksBroken = playersNbt.getCompound(key).getInt("dirtBlocksBroken"); + playerData.level = playersNbt.getCompound(key).getInt("level"); + playerData.exp = playersNbt.getCompound(key).getFloat("exp"); + playerData.strength = playersNbt.getCompound(key).getFloat("strength"); + playerData.dexterity = playersNbt.getCompound(key).getFloat("dexterity"); + playerData.intelligence = playersNbt.getCompound(key).getFloat("intelligence"); + playerData.className = playersNbt.getCompound(key).getString("className"); + + + UUID uuid = UUID.fromString(key); + state.players.put(uuid, playerData); + }); + return state; }