Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/net/kaupenjoe/tutorialmod/TutorialMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import net.kaupenjoe.tutorialmod.entity.custom.MantisEntity;
import net.kaupenjoe.tutorialmod.item.ModItemGroups;
import net.kaupenjoe.tutorialmod.item.ModItems;
import net.kaupenjoe.tutorialmod.networking.ModPayloads;
import net.kaupenjoe.tutorialmod.particle.ModParticles;
import net.kaupenjoe.tutorialmod.potion.ModPotions;
import net.kaupenjoe.tutorialmod.recipe.ModRecipes;
Expand Down Expand Up @@ -70,6 +71,8 @@ public void onInitialize() {
ModBlockEntities.registerBlockEntities();
ModScreenHandlers.registerScreenHandlers();

ModPayloads.registerModPayloads();

ModRecipes.registerRecipes();

FuelRegistry.INSTANCE.add(ModItems.STARLIGHT_ASHES, 600);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.kaupenjoe.tutorialmod.block.ModBlocks;
import net.kaupenjoe.tutorialmod.block.entity.ModBlockEntities;
import net.kaupenjoe.tutorialmod.block.entity.custom.PedestalBlockEntity;
import net.kaupenjoe.tutorialmod.block.entity.renderer.PedestalBlockEntityRenderer;
import net.kaupenjoe.tutorialmod.entity.ModEntities;
import net.kaupenjoe.tutorialmod.entity.client.*;
import net.kaupenjoe.tutorialmod.networking.custom.SyncPedestalBlockEntityS2CPayload;
import net.kaupenjoe.tutorialmod.particle.ModParticles;
import net.kaupenjoe.tutorialmod.particle.PinkGarnetParticle;
import net.kaupenjoe.tutorialmod.screen.ModScreenHandlers;
Expand Down Expand Up @@ -49,5 +52,7 @@ public void onInitializeClient() {
HandledScreens.register(ModScreenHandlers.PEDESTAL_SCREEN_HANDLER, PedestalScreen::new);

HandledScreens.register(ModScreenHandlers.GROWTH_CHAMBER_SCREEN_HANDLER, GrowthChamberScreen::new);

ClientPlayNetworking.registerGlobalReceiver(SyncPedestalBlockEntityS2CPayload.ID, PedestalBlockEntity::onSyncPacket);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package net.kaupenjoe.tutorialmod.block.entity.custom;

import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PlayerLookup;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
import net.kaupenjoe.tutorialmod.block.entity.ImplementedInventory;
import net.kaupenjoe.tutorialmod.block.entity.ModBlockEntities;
import net.kaupenjoe.tutorialmod.networking.custom.SyncPedestalBlockEntityS2CPayload;
import net.kaupenjoe.tutorialmod.screen.custom.PedestalScreenHandler;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventories;
Expand All @@ -17,9 +23,11 @@
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;

public class PedestalBlockEntity extends BlockEntity implements ImplementedInventory, ExtendedScreenHandlerFactory<BlockPos> {
Expand All @@ -30,6 +38,31 @@ public PedestalBlockEntity(BlockPos pos, BlockState state) {
super(ModBlockEntities.PEDESTAL_BE, pos, state);
}

public static void sendSyncPacket(World world, BlockPos blockpos, DefaultedList<ItemStack> inventory) {
if (world.isClient()) return;
SyncPedestalBlockEntityS2CPayload payload = new SyncPedestalBlockEntityS2CPayload(blockpos, inventory);

for (ServerPlayerEntity serverPlayerEntity : PlayerLookup.world((ServerWorld) world)) {
ServerPlayNetworking.send(serverPlayerEntity, payload);
}
}

public static void onSyncPacket(SyncPedestalBlockEntityS2CPayload payload, ClientPlayNetworking.Context context) {
ClientWorld world = context.client().world;

if (world == null) return; // Ensure the world is not null

// Retrieve the BlockEntity at the specified BlockPos
BlockEntity blockEntity = world.getBlockEntity(payload.blockPos());
if (blockEntity instanceof PedestalBlockEntity pedestalBlockEntity) {
// Update the BlockEntity's inventory with the payload data
pedestalBlockEntity.setStack(0, payload.inventory().getFirst());

// Mark the BlockEntity for re-rendering (optional, if needed)
world.updateListeners(payload.blockPos(), blockEntity.getCachedState(), blockEntity.getCachedState(), Block.NOTIFY_ALL);
}
}

@Override
public DefaultedList<ItemStack> getItems() {
return inventory;
Expand Down Expand Up @@ -82,4 +115,16 @@ public Packet<ClientPlayPacketListener> toUpdatePacket() {
public NbtCompound toInitialChunkDataNbt(RegistryWrapper.WrapperLookup registryLookup) {
return createNbt(registryLookup);
}

@Override
public void markDirty() {
super.markDirty();
syncInventory();
}

public void syncInventory() {
if (this.world != null && !this.world.isClient) {
sendSyncPacket(this.world, this.pos, this.inventory);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.kaupenjoe.tutorialmod.networking;

import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.networking.custom.SyncPedestalBlockEntityS2CPayload;

public class ModPayloads {
public static void registerModPayloads() {
PayloadTypeRegistry.playS2C().register(SyncPedestalBlockEntityS2CPayload.ID, SyncPedestalBlockEntityS2CPayload.CODEC);
TutorialMod.LOGGER.info("Registering Mod Payloads for " + TutorialMod.MOD_ID);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package net.kaupenjoe.tutorialmod.networking.custom;

import net.kaupenjoe.tutorialmod.TutorialMod;
import net.minecraft.item.ItemStack;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.packet.CustomPayload;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;

public record SyncPedestalBlockEntityS2CPayload(BlockPos blockPos, DefaultedList<ItemStack> inventory) implements CustomPayload {
public static final Identifier SYNC_PEDESTAL_BLOCK_ENTITY_PAYLOAD_ID = Identifier.of(TutorialMod.MOD_ID, "sync_pedestal_block_entity");
public static final CustomPayload.Id<SyncPedestalBlockEntityS2CPayload> ID = new CustomPayload.Id<>(SYNC_PEDESTAL_BLOCK_ENTITY_PAYLOAD_ID);

// Define a PacketCodec for DefaultedList<ItemStack>
public static final PacketCodec<RegistryByteBuf, DefaultedList<ItemStack>> ITEM_STACK_LIST_CODEC = new PacketCodec<>() {
@Override
public DefaultedList<ItemStack> decode(RegistryByteBuf buf) {
// Read the size of the list
int size = buf.readVarInt();
// Create a DefaultedList with the specified size
DefaultedList<ItemStack> list = DefaultedList.ofSize(size, ItemStack.EMPTY);
// Read each ItemStack from the buffer
for (int i = 0; i < size; i++) {
// Decode the ItemStack, allowing empty stacks
ItemStack stack = ItemStack.OPTIONAL_PACKET_CODEC.decode(buf);
list.set(i, stack);
}
return list;
}

@Override
public void encode(RegistryByteBuf buf, DefaultedList<ItemStack> list) {
// Write the size of the list
buf.writeVarInt(list.size());
// Write each ItemStack to the buffer
for (ItemStack stack : list) {
// Encode the ItemStack, allowing empty stacks
ItemStack.OPTIONAL_PACKET_CODEC.encode(buf, stack);
}
}
};

// Define the PacketCodec for SyncPedestalBlockEntityS2CPayload
public static final PacketCodec<RegistryByteBuf, SyncPedestalBlockEntityS2CPayload> CODEC = PacketCodec.tuple(
BlockPos.PACKET_CODEC, SyncPedestalBlockEntityS2CPayload::blockPos, // Handle BlockPos
ITEM_STACK_LIST_CODEC, SyncPedestalBlockEntityS2CPayload::inventory, // Handle DefaultedList<ItemStack>
SyncPedestalBlockEntityS2CPayload::new // Constructor
);

@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}