PlayerData persistent state + added new stats

This commit is contained in:
Vladislav Kuznetsov 2024-04-14 16:14:15 +03:00
parent 7536863a00
commit cc09ee124b
8 changed files with 124 additions and 8 deletions

View File

@ -1,11 +1,13 @@
package com.youpe.test; package com.youpe.test;
import com.youpe.test.event.DirtBrokenAfter; import com.youpe.test.event.DirtBrokenAfter;
import com.youpe.test.event.JoinServerHandler;
import com.youpe.test.item.ModItems; import com.youpe.test.item.ModItems;
import com.youpe.test.networking.ModNetworkingManager; import com.youpe.test.networking.ModNetworkingManager;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; 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.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.network.PacketByteBuf; 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 Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
public static final Identifier DIRT_BROKEN = new Identifier("testing", "dirt_broken");
@Override @Override
public void onInitialize() { public void onInitialize() {
LOGGER.info("Hello Fabric world!"); LOGGER.info("Hello Fabric world!");
ModItems.registerModItems(); ModNetworkingManager.registerC2SPackets();
ModNetworkingManager.registerC2SPackets();
PlayerBlockBreakEvents.AFTER.register(new DirtBrokenAfter());
ModItems.registerModItems();
PlayerBlockBreakEvents.AFTER.register(new DirtBrokenAfter());
ServerPlayConnectionEvents.JOIN.register(new JoinServerHandler());
} }
} }

View File

@ -4,18 +4,24 @@ import com.youpe.test.event.KeyInputHandler;
import com.youpe.test.event.TestHudRender; import com.youpe.test.event.TestHudRender;
import com.youpe.test.networking.ModNetworkingManager; import com.youpe.test.networking.ModNetworkingManager;
import com.youpe.test.server.PlayerData;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.text.Text; import net.minecraft.text.Text;
public class TestingClient implements ClientModInitializer{ public class TestingClient implements ClientModInitializer{
public static PlayerData playerData = new PlayerData();
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
ModNetworkingManager.registerS2CPackets();
KeyInputHandler.registerKeyInputs(); KeyInputHandler.registerKeyInputs();
TestHudRender.registerModRenders(); TestHudRender.registerModRenders();
ModNetworkingManager.registerS2CPackets();
} }
} }

View File

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

View File

@ -3,17 +3,20 @@ package com.youpe.test.networking;
import com.youpe.test.Testing; import com.youpe.test.Testing;
import com.youpe.test.networking.packet.DirtBrokenS2CPacket; 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.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class ModNetworkingManager { public class ModNetworkingManager {
public static final Identifier DIRT_BROKEN = new Identifier(Testing.MOD_ID, "msg_dirt_broken"); 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 registerC2SPackets(){
} }
public static void registerS2CPackets(){ public static void registerS2CPackets(){
ClientPlayNetworking.registerGlobalReceiver(DIRT_BROKEN, DirtBrokenS2CPacket::receive); ClientPlayNetworking.registerGlobalReceiver(DIRT_BROKEN, DirtBrokenS2CPacket::receive);
ClientPlayNetworking.registerGlobalReceiver(INIT_SYNC, InitSyncS2CPacket::receive);
} }
} }

View File

@ -11,8 +11,10 @@ public class DirtBrokenS2CPacket {
public static void receive(MinecraftClient client, ClientPlayNetworkHandler handler, PacketByteBuf buf, PacketSender responseSender) { public static void receive(MinecraftClient client, ClientPlayNetworkHandler handler, PacketByteBuf buf, PacketSender responseSender) {
int totalDirtBlocksBroken = buf.readInt(); int totalDirtBlocksBroken = buf.readInt();
int playerSpecificDirtBlocksBroken = buf.readInt(); int playerSpecificDirtBlocksBroken = buf.readInt();
client.player.sendMessage(Text.literal("Total dirt blocks broken: " + totalDirtBlocksBroken)); client.execute(() -> {
client.player.sendMessage(Text.literal("Player specific dirt blocks broken: " + playerSpecificDirtBlocksBroken)); client.player.sendMessage(Text.literal("Total dirt blocks broken: " + totalDirtBlocksBroken));
client.player.sendMessage(Text.literal("Player specific dirt blocks broken: " + playerSpecificDirtBlocksBroken));
});
} }
} }

View File

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

View File

@ -3,4 +3,12 @@ package com.youpe.test.server;
public class PlayerData { public class PlayerData {
public int dirtBlocksBroken = 0; 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;
} }

View File

@ -21,12 +21,49 @@ public class StateSaverAndLoader extends PersistentState {
public NbtCompound writeNbt(NbtCompound nbt) { public NbtCompound writeNbt(NbtCompound nbt) {
nbt.putInt("totalDirtBlocksBroken", totalDirtBlocksBroken); 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; return nbt;
} }
public static StateSaverAndLoader createFromNbt(NbtCompound tag) { public static StateSaverAndLoader createFromNbt(NbtCompound tag) {
StateSaverAndLoader state = new StateSaverAndLoader(); StateSaverAndLoader state = new StateSaverAndLoader();
state.totalDirtBlocksBroken = tag.getInt("totalDirtBlocksBroken"); 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; return state;
} }