Networking new
This commit is contained in:
parent
0d02dbc463
commit
7536863a00
|
@ -1,6 +1,8 @@
|
||||||
package com.youpe.test;
|
package com.youpe.test;
|
||||||
|
|
||||||
|
import com.youpe.test.event.DirtBrokenAfter;
|
||||||
import com.youpe.test.item.ModItems;
|
import com.youpe.test.item.ModItems;
|
||||||
|
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;
|
||||||
|
@ -28,28 +30,8 @@ public class Testing implements ModInitializer {
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
LOGGER.info("Hello Fabric world!");
|
LOGGER.info("Hello Fabric world!");
|
||||||
ModItems.registerModItems();
|
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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ package com.youpe.test;
|
||||||
import com.youpe.test.event.KeyInputHandler;
|
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 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;
|
||||||
|
@ -11,19 +12,10 @@ public class TestingClient implements ClientModInitializer{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeClient() {
|
public void onInitializeClient() {
|
||||||
KeyInputHandler.register();
|
|
||||||
KeyInputHandler.registerKeyInputs();
|
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();
|
TestHudRender.registerModRenders();
|
||||||
|
ModNetworkingManager.registerS2CPackets();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,8 +2,6 @@ package com.youpe.test.event;
|
||||||
|
|
||||||
import com.youpe.test.Testing;
|
import com.youpe.test.Testing;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.youpe.test.client.GUI;
|
import com.youpe.test.client.GUI;
|
||||||
|
|
||||||
|
@ -22,6 +20,7 @@ public class KeyInputHandler {
|
||||||
public static KeyBinding modkey;
|
public static KeyBinding modkey;
|
||||||
|
|
||||||
public static void registerKeyInputs() {
|
public static void registerKeyInputs() {
|
||||||
|
registerKeyBindings();
|
||||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
||||||
if (modkey.wasPressed()) {
|
if (modkey.wasPressed()) {
|
||||||
Testing.LOGGER.info("NAZHAL PIZDEC BLYA");
|
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(
|
modkey = KeyBindingHelper.registerKeyBinding(new KeyBinding(
|
||||||
KEY_TEST,
|
KEY_TEST,
|
||||||
InputUtil.Type.KEYSYM,
|
InputUtil.Type.KEYSYM,
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package com.youpe.test.server;
|
package com.youpe.test.server;
|
||||||
|
|
||||||
public class PlayerData {
|
public class PlayerData {
|
||||||
|
|
||||||
public int dirtBlocksBroken = 0;
|
public int dirtBlocksBroken = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.youpe.test.server;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.youpe.test.Testing;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
@ -13,11 +14,13 @@ import net.minecraft.world.World;
|
||||||
public class StateSaverAndLoader extends PersistentState {
|
public class StateSaverAndLoader extends PersistentState {
|
||||||
|
|
||||||
public Integer totalDirtBlocksBroken = 0;
|
public Integer totalDirtBlocksBroken = 0;
|
||||||
|
|
||||||
public HashMap<UUID, PlayerData> players = new HashMap<>();
|
public HashMap<UUID, PlayerData> players = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NbtCompound writeNbt(NbtCompound nbt) {
|
public NbtCompound writeNbt(NbtCompound nbt) {
|
||||||
nbt.putInt("totalDirtBlocksBroken", totalDirtBlocksBroken);
|
nbt.putInt("totalDirtBlocksBroken", totalDirtBlocksBroken);
|
||||||
|
|
||||||
return nbt;
|
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
|
// 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
|
// stores it inside the 'PersistentStateManager'. The subsequent calls to 'getOrCreate' pass in the saved
|
||||||
// 'StateSaverAndLoader' NBT on disk to our function 'StateSaverAndLoader::createFromNbt'.
|
// '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.
|
// 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
|
// Technically it's 'cleaner' if you only mark state as dirty when there was actually a change, but the vast majority
|
||||||
|
|
Loading…
Reference in New Issue