This commit is contained in:
Bruno Rybársky 2024-06-27 08:14:58 +02:00
parent f06f07a534
commit 7f8d4b8eb3
31 changed files with 400 additions and 53 deletions

@ -5,15 +5,16 @@ import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory; import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry; import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.item.Item;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.world.GameRules; import net.minecraft.world.GameRules;
import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity; import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity;
import systems.brn.server_storage.blockentities.StorageBlockEntity; import systems.brn.server_storage.blockentities.StorageBlockEntity;
import systems.brn.server_storage.blocks.HardDriveContainerBlock; import systems.brn.server_storage.blocks.HardDriveContainerBlock;
import systems.brn.server_storage.blocks.StorageBlock; import systems.brn.server_storage.blocks.StorageBlock;
import systems.brn.server_storage.items.HardDriveItem;
import systems.brn.server_storage.items.SimpleBlockItem; import systems.brn.server_storage.items.SimpleBlockItem;
import systems.brn.server_storage.items.SimpleItem; import systems.brn.server_storage.items.SimpleItem;
import systems.brn.server_storage.items.TieredItem;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -32,6 +33,11 @@ public class ServerStorage implements ModInitializer {
public static StorageBlock STORAGE_BLOCK; public static StorageBlock STORAGE_BLOCK;
public static BlockEntityType<StorageBlockEntity> STORAGE_BLOCK_ENTITY; public static BlockEntityType<StorageBlockEntity> STORAGE_BLOCK_ENTITY;
public static Item DRIVE_CASING;
public static List<Item> PLATTERS;
public static List<Item> DRIVES;
public static List<Item> HEADS;
public static final GameRules.Key<GameRules.BooleanRule> ServerStorage_Crafting_Enable = public static final GameRules.Key<GameRules.BooleanRule> ServerStorage_Crafting_Enable =
GameRuleRegistry.register("enableserverstoragecrafting", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(false)); GameRuleRegistry.register("enableserverstoragecrafting", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(false));
@ -49,10 +55,10 @@ public class ServerStorage implements ModInitializer {
HardDriveContainerBlock.register(); HardDriveContainerBlock.register();
SimpleBlockItem.register(HARD_DRIVE_CONTAINER_BLOCK); SimpleBlockItem.register(HARD_DRIVE_CONTAINER_BLOCK);
TieredItem.register("drive"); HEADS = SimpleItem.register("head", tiers);
TieredItem.register("head"); PLATTERS = SimpleItem.register("platter", tiers);
TieredItem.register("platter"); DRIVE_CASING = SimpleItem.register("drive_casing");
SimpleItem.register("drive_casing"); DRIVES = HardDriveItem.register(tiers);
PolymerResourcePackUtils.addModAssets(MOD_ID); PolymerResourcePackUtils.addModAssets(MOD_ID);
PolymerResourcePackUtils.markAsRequired(); PolymerResourcePackUtils.markAsRequired();

@ -1,13 +1,68 @@
package systems.brn.server_storage.blockentities; package systems.brn.server_storage.blockentities;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventories;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.text.Text;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import systems.brn.server_storage.screenhandlers.DriveContainerScreenHandler;
import static systems.brn.server_storage.ServerStorage.HARD_DRIVE_CONTAINER_BLOCK_ENTITY; import static systems.brn.server_storage.ServerStorage.HARD_DRIVE_CONTAINER_BLOCK_ENTITY;
public class HardDriveContainerBlockEntity extends BlockEntity { public class HardDriveContainerBlockEntity extends LootableContainerBlockEntity {
private DefaultedList<ItemStack> inventory;
private static final int INVENTORY_SIZE = 9;
public HardDriveContainerBlockEntity(BlockPos pos, BlockState state) { public HardDriveContainerBlockEntity(BlockPos pos, BlockState state) {
super(HARD_DRIVE_CONTAINER_BLOCK_ENTITY, pos, state); super(HARD_DRIVE_CONTAINER_BLOCK_ENTITY, pos, state);
this.inventory = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY);
}
@Override
protected Text getContainerName() {
return Text.translatable("block.serverstorage.drive_container");
}
@Override
protected DefaultedList<ItemStack> getHeldStacks() {
return inventory;
}
@Override
protected void setHeldStacks(DefaultedList<ItemStack> inventory) {
this.inventory = inventory;
}
@Override
protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) {
return new DriveContainerScreenHandler(syncId, playerInventory, this);
}
@Override
public int size() {
return INVENTORY_SIZE;
}
@Override
protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
super.readNbt(nbt, registryLookup);
this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY);
if (!this.readLootTable(nbt)) {
Inventories.readNbt(nbt, this.inventory, registryLookup);
}
}
@Override
protected void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
super.writeNbt(nbt, registryLookup);
if (!this.writeLootTable(nbt)) {
Inventories.writeNbt(nbt, this.inventory, registryLookup);
}
} }
} }

@ -11,33 +11,50 @@ import net.minecraft.block.*;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.ItemScatterer;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity; import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity;
import systems.brn.server_storage.screens.DriveScreen;
import static systems.brn.server_storage.ServerStorage.*; import static systems.brn.server_storage.ServerStorage.*;
public class HardDriveContainerBlock extends SimplePolymerBlock implements PolymerTexturedBlock, BlockEntityProvider { public class HardDriveContainerBlock extends SimplePolymerBlock implements PolymerTexturedBlock, BlockEntityProvider {
final Identifier identifier; final Identifier identifier;
public static final DirectionProperty FACING = FacingBlock.FACING;
private final BlockState polymerBlockState;
public HardDriveContainerBlock(AbstractBlock.Settings settings, Identifier identifier) { public HardDriveContainerBlock(AbstractBlock.Settings settings, Identifier identifier) {
super(settings, Blocks.NOTE_BLOCK); super(settings, Blocks.NOTE_BLOCK);
this.identifier = identifier; this.identifier = identifier;
this.setDefaultState(this.stateManager.getDefaultState().with(FACING, Direction.NORTH));
this.polymerBlockState = PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(identifier.withPath("block/" + identifier.getPath())));
}
@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite());
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(FACING);
} }
@Override @Override
public BlockState getPolymerBlockState(BlockState state) { public BlockState getPolymerBlockState(BlockState state) {
return PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(identifier)); return this.polymerBlockState;
} }
public static void register() { public static void register() {
@ -62,8 +79,10 @@ public class HardDriveContainerBlock extends SimplePolymerBlock implements Polym
if (block instanceof HardDriveContainerBlock) { if (block instanceof HardDriveContainerBlock) {
if (!world.isClient && !player.isSpectator()) { if (!world.isClient && !player.isSpectator()) {
if (!player.isSneaking()) { if (!player.isSneaking()) {
DriveScreen driveScreen = new DriveScreen((ServerPlayerEntity) player, pos); BlockEntity storageBlockEntity = world.getBlockEntity(pos);
driveScreen.open(); if (storageBlockEntity instanceof HardDriveContainerBlockEntity) {
player.openHandledScreen((HardDriveContainerBlockEntity) storageBlockEntity);
}
} else { } else {
return ActionResult.PASS; return ActionResult.PASS;
@ -79,4 +98,10 @@ public class HardDriveContainerBlock extends SimplePolymerBlock implements Polym
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
return new HardDriveContainerBlockEntity(pos, state); return new HardDriveContainerBlockEntity(pos, state);
} }
@Override
protected void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) {
ItemScatterer.onStateReplaced(state, newState, world, pos);
super.onStateReplaced(state, world, pos, newState, moved);
}
} }

@ -4,18 +4,23 @@ import eu.pb4.polymer.blocks.api.BlockModelType;
import eu.pb4.polymer.blocks.api.PolymerBlockModel; import eu.pb4.polymer.blocks.api.PolymerBlockModel;
import eu.pb4.polymer.blocks.api.PolymerBlockResourceUtils; import eu.pb4.polymer.blocks.api.PolymerBlockResourceUtils;
import eu.pb4.polymer.blocks.api.PolymerTexturedBlock; import eu.pb4.polymer.blocks.api.PolymerTexturedBlock;
import eu.pb4.polymer.core.api.block.PolymerBlockUtils;
import eu.pb4.polymer.core.api.block.SimplePolymerBlock; import eu.pb4.polymer.core.api.block.SimplePolymerBlock;
import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.fabricmc.fabric.api.event.player.UseBlockCallback;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.WrittenBookContentComponent; import net.minecraft.component.type.WrittenBookContentComponent;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.text.RawFilteredPair; import net.minecraft.text.RawFilteredPair;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
@ -23,6 +28,7 @@ import net.minecraft.util.Hand;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import systems.brn.server_storage.blockentities.StorageBlockEntity; import systems.brn.server_storage.blockentities.StorageBlockEntity;
@ -35,15 +41,29 @@ import static systems.brn.server_storage.lib.Util.generateBookContent;
public class StorageBlock extends SimplePolymerBlock implements PolymerTexturedBlock, BlockEntityProvider { public class StorageBlock extends SimplePolymerBlock implements PolymerTexturedBlock, BlockEntityProvider {
final Identifier identifier; final Identifier identifier;
public static final DirectionProperty FACING = FacingBlock.FACING;
private final BlockState polymerBlockState;
public StorageBlock(Settings settings, Identifier identifier) { public StorageBlock(Settings settings, Identifier identifier) {
super(settings, Blocks.NOTE_BLOCK); super(settings, Blocks.NOTE_BLOCK);
this.identifier = identifier; this.identifier = identifier;
this.setDefaultState(this.stateManager.getDefaultState().with(FACING, Direction.NORTH));
this.polymerBlockState = PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(identifier.withPath("block/" + identifier.getPath())));
}
@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite());
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(FACING);
} }
@Override @Override
public BlockState getPolymerBlockState(BlockState state) { public BlockState getPolymerBlockState(BlockState state) {
return PolymerBlockResourceUtils.requestBlock(BlockModelType.FULL_BLOCK, PolymerBlockModel.of(identifier)); return this.polymerBlockState;
} }
public static void register() { public static void register() {
@ -51,6 +71,13 @@ public class StorageBlock extends SimplePolymerBlock implements PolymerTexturedB
STORAGE_BLOCK = Registry.register(Registries.BLOCK, modId, STORAGE_BLOCK = Registry.register(Registries.BLOCK, modId,
new StorageBlock(AbstractBlock.Settings.copy(Blocks.WHITE_WOOL), modId)); new StorageBlock(AbstractBlock.Settings.copy(Blocks.WHITE_WOOL), modId));
UseBlockCallback.EVENT.register(StorageBlock::onUse); UseBlockCallback.EVENT.register(StorageBlock::onUse);
STORAGE_BLOCK_ENTITY = Registry.register(
Registries.BLOCK_ENTITY_TYPE,
modId,
BlockEntityType.Builder.create(StorageBlockEntity::new, STORAGE_BLOCK).build(null)
);
PolymerBlockUtils.registerBlockEntity(STORAGE_BLOCK_ENTITY);
} }
private static ActionResult onUse(PlayerEntity player, World world, Hand hand, BlockHitResult hitResult) { private static ActionResult onUse(PlayerEntity player, World world, Hand hand, BlockHitResult hitResult) {

@ -0,0 +1,39 @@
package systems.brn.server_storage.items;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import systems.brn.server_storage.lib.DriveComponents;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static systems.brn.server_storage.ServerStorage.id;
public class HardDriveItem extends SimpleItem {
public HardDriveItem(Settings settings, Identifier identifier) {
super(settings, identifier);
}
public static List<Item> register(List<String> tiers){
ArrayList<Item> items = new ArrayList<>();
int numberItems = 128;
for (String tier : tiers) {
Identifier identifier = id(tier + "_drive");
Item item = Registry.register(Registries.ITEM, identifier, new SimpleItem(new Settings()
.maxCount(1)
.component(DriveComponents.MAX_ITEMS, numberItems)
.component(DriveComponents.USED_ITEMS, 0)
.component(DriveComponents.ITEMSTACK_MAP, new HashMap<>())
, identifier));
ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item));
items.add(item);
numberItems *= 2;
}
return items;
}
}

@ -23,7 +23,7 @@ public class SimpleBlockItem extends PolymerBlockItem implements PolymerItem {
public SimpleBlockItem(Item.Settings settings, Block block, Identifier identifier) { public SimpleBlockItem(Item.Settings settings, Block block, Identifier identifier) {
super(block, settings, Items.BARRIER); super(block, settings, Items.BARRIER);
this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier); this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier.withPath("item/" + identifier.getPath()));
} }
@Override @Override

@ -15,6 +15,9 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import static systems.brn.server_storage.ServerStorage.id; import static systems.brn.server_storage.ServerStorage.id;
public class SimpleItem extends SimplePolymerItem implements PolymerItem { public class SimpleItem extends SimplePolymerItem implements PolymerItem {
@ -22,7 +25,7 @@ public class SimpleItem extends SimplePolymerItem implements PolymerItem {
public SimpleItem(Settings settings, Identifier identifier) { public SimpleItem(Settings settings, Identifier identifier) {
super(settings, Items.BARRIER); super(settings, Items.BARRIER);
this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier); this.polymerModel = PolymerResourcePackUtils.requestModel(Items.BARRIER, identifier.withPath("item/" + identifier.getPath()));
} }
@Override @Override
@ -35,9 +38,26 @@ public class SimpleItem extends SimplePolymerItem implements PolymerItem {
return this.polymerModel.value(); return this.polymerModel.value();
} }
public static void register(String name) { public static Item register(String name){
return register(name, 64);
}
public static Item register(String name, int maxCount) {
Identifier identifier = id(name); Identifier identifier = id(name);
Item item = Registry.register(Registries.ITEM, identifier, new SimpleItem(new Settings(), identifier)); Item item = Registry.register(Registries.ITEM, identifier, new SimpleItem(new Settings().maxCount(maxCount), identifier));
ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item)); ItemGroupEvents.modifyEntriesEvent(ItemGroups.FUNCTIONAL).register(content -> content.add(item));
return item;
}
public static List<Item> register(String name, List<String> tiers) {
return register(name, tiers, 64);
}
public static List<Item> register(String name, List<String> tiers, int maxCount) {
ArrayList<Item> items = new ArrayList<>();
for (String tier : tiers) {
items.add(SimpleItem.register(tier + "_" + name, maxCount));
}
return items;
} }
} }

@ -1,31 +0,0 @@
package systems.brn.server_storage.items;
import eu.pb4.polymer.core.api.item.PolymerItem;
import eu.pb4.polymer.resourcepack.api.PolymerModelData;
import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;
import static systems.brn.server_storage.ServerStorage.id;
import static systems.brn.server_storage.ServerStorage.tiers;
public class TieredItem extends SimpleItem implements PolymerItem {
public TieredItem(Item.Settings settings, Identifier identifier) {
super(settings, identifier);
}
public static void register(String name) {
for (String tier : tiers) {
SimpleItem.register(tier + "_" + name);
}
}
}

@ -7,7 +7,9 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import systems.brn.server_storage.blockentities.HardDriveContainerBlockEntity;
import systems.brn.server_storage.blockentities.StorageBlockEntity; import systems.brn.server_storage.blockentities.StorageBlockEntity;
import systems.brn.server_storage.items.HardDriveItem;
import java.util.*; import java.util.*;
@ -16,6 +18,8 @@ import static systems.brn.server_storage.lib.StorageOperations.*;
public class ConnectedChests { public class ConnectedChests {
public final List<Inventory> inventories; public final List<Inventory> inventories;
public final List<Inventory> hoppers; public final List<Inventory> hoppers;
public final List<Inventory> driveContainers;
public final List<HardDriveItem> drives;
public final Inventory inventory; public final Inventory inventory;
public final int containerCount; public final int containerCount;
@ -26,12 +30,16 @@ public class ConnectedChests {
public ConnectedChests(World world, BlockPos startPos, boolean sortAlphabetically, String searchString, boolean allInventories) { public ConnectedChests(World world, BlockPos startPos, boolean sortAlphabetically, String searchString, boolean allInventories) {
List<Inventory> inventories = new ArrayList<>(); List<Inventory> inventories = new ArrayList<>();
List<Inventory> hoppers = new ArrayList<>(); List<Inventory> hoppers = new ArrayList<>();
List<Inventory> driveContainers = new ArrayList<>();
List<HardDriveItem> drives = new ArrayList<>();
Set<BlockPos> visited = new HashSet<>(); Set<BlockPos> visited = new HashSet<>();
getConnectedChestsHelper(world, startPos, inventories, hoppers, visited, allInventories); getConnectedChestsHelper(world, startPos, inventories, hoppers, driveContainers, drives, visited, allInventories);
this.inventories = inventories; this.inventories = inventories;
this.hoppers = hoppers; this.hoppers = hoppers;
this.driveContainers = driveContainers;
this.drives = drives;
this.containerCount = inventories.size(); this.containerCount = inventories.size();
this.inventory = getCombinedInventory(sortAlphabetically, searchString); this.inventory = getCombinedInventory(sortAlphabetically, searchString);
@ -61,7 +69,7 @@ public class ConnectedChests {
blockEntity instanceof ShulkerBoxBlockEntity; blockEntity instanceof ShulkerBoxBlockEntity;
} }
private static void getConnectedChestsHelper(World world, BlockPos pos, List<Inventory> inventories, List<Inventory> hoppers, Set<BlockPos> visited, Boolean allContainers) { private static void getConnectedChestsHelper(World world, BlockPos pos, List<Inventory> inventories, List<Inventory> hoppers, List<Inventory> driveContainers, List<HardDriveItem> drives, Set<BlockPos> visited, Boolean allContainers) {
if (visited.contains(pos)) { if (visited.contains(pos)) {
return; return;
} }
@ -69,6 +77,15 @@ public class ConnectedChests {
BlockEntity blockEntity = world.getBlockEntity(pos); BlockEntity blockEntity = world.getBlockEntity(pos);
if (blockEntity instanceof HardDriveContainerBlockEntity) {
driveContainers.add((Inventory) blockEntity);
//loop over all items in inventory
for (int slot = 0; slot < inventories.size(); slot++) {
ItemStack slotStack = ((Inventory) blockEntity).getStack(slot);
//drives.add(new HardDriveItem(slotStack, (HardDriveContainerBlockEntity) blockEntity));
}
}
if (isEnabledHopper(blockEntity)) { if (isEnabledHopper(blockEntity)) {
hoppers.add((Inventory) blockEntity); hoppers.add((Inventory) blockEntity);
} }
@ -80,7 +97,7 @@ public class ConnectedChests {
for (Direction direction : Direction.values()) { for (Direction direction : Direction.values()) {
BlockPos nextPos = pos.offset(direction); BlockPos nextPos = pos.offset(direction);
getConnectedChestsHelper(world, nextPos, inventories, hoppers, visited, allContainers); getConnectedChestsHelper(world, nextPos, inventories, hoppers, driveContainers, drives, visited, allContainers);
} }
} }
} }

@ -0,0 +1,42 @@
package systems.brn.server_storage.lib;
import com.mojang.serialization.Codec;
import eu.pb4.polymer.core.api.other.PolymerComponent;
import net.minecraft.component.ComponentType;
import net.minecraft.item.ItemStack;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.dynamic.Codecs;
import java.util.Map;
import java.util.function.UnaryOperator;
public class DriveComponents {
public static final Codec<Map<ItemStack, Integer>> ITEMSTACK_MAP_CODEC = Codec.unboundedMap(ItemStack.CODEC, Codec.INT);
public static final ComponentType<Integer> MAX_ITEMS = register(
"max_items", builder -> builder.codec(Codecs.POSITIVE_INT).packetCodec(PacketCodecs.VAR_INT)
);
public static final ComponentType<Integer> USED_ITEMS = register(
"used_items", builder -> builder.codec(Codecs.NONNEGATIVE_INT).packetCodec(PacketCodecs.VAR_INT)
);
public static final ComponentType<Map<ItemStack, Integer>> ITEMSTACK_MAP = register(
"itemstack_map",
builder -> builder.codec(ITEMSTACK_MAP_CODEC) // No packetCodec needed for this example
);
private static <T> ComponentType<T> register(String id, UnaryOperator<ComponentType.Builder<T>> builderOperator) {
ComponentType<T> componentType = Registry.register(
Registries.DATA_COMPONENT_TYPE,
id,
builderOperator.apply(ComponentType.builder()).build()
);
PolymerComponent.registerDataComponent(componentType);
return componentType;
}
}

@ -0,0 +1,24 @@
package systems.brn.server_storage.lib;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import static systems.brn.server_storage.ServerStorage.DRIVES;
public class HardDriveSlot extends Slot {
public HardDriveSlot(Inventory inventory, int index, int x, int y) {
super(inventory, index, x, y);
}
public static boolean isHardDrive(Item item){
return DRIVES.contains(item);
}
@Override
public boolean canInsert(ItemStack stack) {
return isHardDrive(stack.getItem());
}
}

@ -0,0 +1,84 @@
package systems.brn.server_storage.screenhandlers;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;
import systems.brn.server_storage.lib.HardDriveSlot;
public class DriveContainerScreenHandler extends ScreenHandler {
private static final int CONTAINER_SIZE = 9;
private static final int INVENTORY_START = 9;
private static final int INVENTORY_END = 36;
private static final int HOTBAR_START = 36;
private static final int HOTBAR_END = 45;
private final Inventory inventory;
public DriveContainerScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory) {
super(ScreenHandlerType.GENERIC_3X3, syncId);
checkSize(inventory, 9);
this.inventory = inventory;
inventory.onOpen(playerInventory.player);
for(int i = 0; i < 3; ++i) {
for(int j = 0; j < 3; ++j) {
this.addSlot(new HardDriveSlot(inventory, j + i * 3, 62 + j * 18, 17 + i * 18));
}
}
for(int i = 0; i < 3; ++i) {
for(int j = 0; j < 9; ++j) {
this.addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int i = 0; i < 9; ++i) {
this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142));
}
}
@Override
public boolean canUse(PlayerEntity player) {
return this.inventory.canPlayerUse(player);
}
@Override
public ItemStack quickMove(PlayerEntity player, int slot) {
ItemStack itemStack = ItemStack.EMPTY;
Slot slot2 = this.slots.get(slot);
if (slot2.hasStack()) {
ItemStack itemStack2 = slot2.getStack();
itemStack = itemStack2.copy();
if (slot < 9) {
if (!this.insertItem(itemStack2, 9, 45, true)) {
return ItemStack.EMPTY;
}
} else if (!this.insertItem(itemStack2, 0, 9, false)) {
return ItemStack.EMPTY;
}
if (itemStack2.isEmpty()) {
slot2.setStack(ItemStack.EMPTY);
} else {
slot2.markDirty();
}
if (itemStack2.getCount() == itemStack.getCount()) {
return ItemStack.EMPTY;
}
slot2.onTakeItem(player, itemStack2);
}
return itemStack;
}
@Override
public void onClosed(PlayerEntity player) {
super.onClosed(player);
this.inventory.onClose(player);
}
}

@ -1,7 +1,27 @@
{ {
"variants": { "variants": {
"": { "facing=down": {
"model": "serverstorage:block/drive_container",
"x": 180
},
"facing=east": {
"model": "serverstorage:block/drive_container",
"y": 90
},
"facing=north": {
"model": "serverstorage:block/drive_container" "model": "serverstorage:block/drive_container"
},
"facing=south": {
"model": "serverstorage:block/drive_container",
"y": 180
},
"facing=up": {
"model": "serverstorage:block/drive_container",
"x": 90
},
"facing=west": {
"model": "serverstorage:block/drive_container",
"y": 270
} }
} }
} }

@ -1,7 +1,26 @@
{ {
"variants": { "variants": {
"": { "facing=down": {
"model": "serverstorage:block/storage",
"x": 180
},
"facing=east": {
"model": "serverstorage:block/storage",
"y": 90
},
"facing=north": {
"model": "serverstorage:block/storage" "model": "serverstorage:block/storage"
},
"facing=south": {
"model": "serverstorage:block/storage",
"y": 180
},
"facing=up": {
"model": "serverstorage:block/storage"
},
"facing=west": {
"model": "serverstorage:block/storage",
"y": 270
} }
} }
} }