Add blacklisting

This commit is contained in:
Bruno Rybársky 2024-05-28 19:10:50 +02:00
parent 1d4b658400
commit 5473358a75
9 changed files with 203 additions and 159 deletions

@ -78,21 +78,3 @@ jar {
rename { "${it}_${project.archivesBaseName}"}
}
}
// configure the maven publication
publishing {
publications {
create("mavenJava", MavenPublication) {
artifactId = project.archives_base_name
from components.java
}
}
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories {
// Add repositories to publish to here.
// Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
}
}

@ -8,7 +8,7 @@ yarn_mappings=1.20.6+build.3
loader_version=0.15.11
# Mod Properties
mod_version=2.2
mod_version=2.3
maven_group=systems.brn
archives_base_name=Server_storage

@ -17,19 +17,17 @@ import java.util.ArrayList;
import static systems.brn.server_storage.ServerStorage.STORAGE_BLOCK_ENTITY;
public class StorageBlockEntity extends BlockEntity implements Inventory, SidedInventory, Runnable {
public class StorageBlockEntity extends BlockEntity implements Inventory, SidedInventory {
@Override
public void run() {
assert storageScreenToDelete != null;
public void removeScreen(StorageScreen storageScreenToDelete) {
openStorageScreens.remove(storageScreenToDelete);
}
public StorageScreen storageScreenToDelete;
public Boolean sortAlphabetically = false;
public Boolean allInventories = false;
public String searchString = "";
public int page = 0;
public ConnectedChests chests;
public ArrayList<StorageScreen> openStorageScreens = new ArrayList<>();
@ -37,35 +35,73 @@ public class StorageBlockEntity extends BlockEntity implements Inventory, SidedI
super(STORAGE_BLOCK_ENTITY, pos, state);
}
public void rescanChests() {
this.chests = new ConnectedChests(world, this.pos, sortAlphabetically, searchString, allInventories);
this.updateDisplays();
}
@Override
public int size() {
if (chests != null) {
this.rescanChests();
return chests.inventory.size();
}
else {
return 1;
}
}
@Override
public boolean isEmpty() {
if (chests != null) {
this.rescanChests();
return chests.inventory.isEmpty();
}
else {
return true;
}
}
@Override
public ItemStack getStack(int slot) {
if (chests != null) {
this.rescanChests();
return chests.inventory.getStack(slot);
}
else {
return ItemStack.EMPTY;
}
}
@Override
public ItemStack removeStack(int slot, int amount) {
if (chests != null) {
ItemStack stackToRemove = chests.inventory.getStack(slot);
stackToRemove.setCount(
Math.min(
Math.min(stackToRemove.getCount(), amount), stackToRemove.getMaxCount())
);
return chests.removeItemStack(stackToRemove);
}
else {
return ItemStack.EMPTY;
}
}
@Override
public ItemStack removeStack(int slot) {
if (chests != null) {
ItemStack stackToRemove = chests.inventory.getStack(slot);
stackToRemove.setCount(Math.min(stackToRemove.getCount(), stackToRemove.getMaxCount()));
return chests.removeItemStack(stackToRemove);
}
else {
return ItemStack.EMPTY;
}
}
@Override
public void setStack(int slot, ItemStack stack) {
markDirty();
ConnectedChests chests = new ConnectedChests(world, this.pos, false);
chests.tryPutItemStack(stack);
updateDisplays();
}
@ -89,18 +125,29 @@ public class StorageBlockEntity extends BlockEntity implements Inventory, SidedI
// SidedInventory methods
@Override
public int[] getAvailableSlots(Direction side) {
return new int[]{0}; // Allow access to the single slot
if(this.chests != null) {
this.rescanChests();
int[] output = new int[chests.inventory.size()];
for (int i = 0; i < chests.inventory.size() - 1; i++) {
output[i] = i;
}
return output;
}
else {
return new int[0];
}
}
@Override
public boolean canInsert(int slot, ItemStack stack, Direction dir) {
ConnectedChests chests = new ConnectedChests(world, this.pos, false);
rescanChests();
return chests.canAddItemStack(stack);
}
@Override
public boolean canExtract(int slot, ItemStack stack, Direction dir) {
return false; // Prevent extraction
rescanChests();
return chests.canRemove(stack);
}
// Serialize the BlockEntity
@ -110,6 +157,7 @@ public class StorageBlockEntity extends BlockEntity implements Inventory, SidedI
nbt.putInt("page", page);
nbt.putBoolean("sortAlphabetically", sortAlphabetically);
nbt.putString("searchString", searchString);
nbt.putBoolean("allInventories", allInventories);
super.writeNbt(nbt, wrapperLookup);
}
@ -122,5 +170,6 @@ public class StorageBlockEntity extends BlockEntity implements Inventory, SidedI
page = nbt.getInt("page");
sortAlphabetically = nbt.getBoolean("sortAlphabetically");
searchString = nbt.getString("searchString");
allInventories = nbt.getBoolean("allInventories");
}
}

@ -28,7 +28,6 @@ import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import systems.brn.server_storage.ServerStorage;
import systems.brn.server_storage.blockentities.StorageBlockEntity;
import systems.brn.server_storage.lib.ConnectedChests;
import systems.brn.server_storage.screens.StorageScreen;
import java.util.List;
@ -72,17 +71,15 @@ public class StorageBlock extends Block implements PolymerTexturedBlock, BlockEn
if (block instanceof StorageBlock) {
if (!world.isClient && !player.isSpectator()) {
if(!player.isSneaking()){
StorageBlockEntity blockEntity = (StorageBlockEntity) world.getBlockEntity(pos);
assert blockEntity != null;
StorageScreen storageScreen = new StorageScreen((ServerPlayerEntity) player, pos, blockEntity);
StorageScreen storageScreen = new StorageScreen((ServerPlayerEntity) player, pos, null);
storageScreen.open();
blockEntity.openStorageScreens.add(storageScreen);
}
else if(player.getStackInHand(hand).getItem() == Items.WRITTEN_BOOK) {
ItemStack book = player.getStackInHand(hand);
ConnectedChests chests = new ConnectedChests(world, pos, true);
List<RawFilteredPair<Text>> generatedContent = generateBookContent(chests.inventory);
StorageBlockEntity storageBlockEntity = (StorageBlockEntity) world.getBlockEntity(pos);
assert storageBlockEntity != null;
List<RawFilteredPair<Text>> generatedContent = generateBookContent(storageBlockEntity.chests.inventory);
book.set(DataComponentTypes.WRITTEN_BOOK_CONTENT, new WrittenBookContentComponent(
RawFilteredPair.of("Item Listing"),
player.getGameProfile().getName(),

@ -1,14 +1,13 @@
package systems.brn.server_storage.lib;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.HopperBlockEntity;
import net.minecraft.block.entity.*;
import net.minecraft.inventory.Inventory;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import systems.brn.server_storage.blocks.StorageBlock;
import systems.brn.server_storage.blockentities.StorageBlockEntity;
import java.util.*;
@ -23,15 +22,15 @@ public class ConnectedChests {
public final int containerUsedSlots;
public final int containerFreeSlots;
public ConnectedChests(World world, BlockPos startPos, boolean sortAlphabetically) {
public ConnectedChests(World world, BlockPos startPos, boolean sortAlphabetically, String searchString, boolean allInventories) {
List<Inventory> inventories = new ArrayList<>();
Set<BlockPos> visited = new HashSet<>();
getConnectedChestsHelper(world, startPos, inventories, visited);
getConnectedChestsHelper(world, startPos, inventories, visited, allInventories);
this.inventories = inventories;
this.containerCount = inventories.size();
this.inventory = getCombinedInventory(sortAlphabetically);
this.inventory = getCombinedInventory(sortAlphabetically, searchString);
int tempContainerSlots = 0;
int tempContainerUsedSlots = 0;
@ -52,27 +51,34 @@ public class ConnectedChests {
containerFreeSlots = tempContainerFreeSlots;
}
private static void getConnectedChestsHelper(World world, BlockPos pos, List<Inventory> inventories, Set<BlockPos> visited) {
private static boolean isEnabledContainer(BlockEntity blockEntity, boolean allContainers) {
return (allContainers && blockEntity instanceof Inventory) ||
blockEntity instanceof BarrelBlockEntity ||
blockEntity instanceof ChestBlockEntity ||
blockEntity instanceof ShulkerBoxBlockEntity;
}
private static void getConnectedChestsHelper(World world, BlockPos pos, List<Inventory> inventories, Set<BlockPos> visited, Boolean allContainers) {
if (visited.contains(pos)) {
return;
}
visited.add(pos);
BlockEntity blockEntity = world.getBlockEntity(pos);
if (blockEntity instanceof Inventory || world.getBlockState(pos).getBlock() instanceof StorageBlock) {
if (blockEntity instanceof Inventory && !(world.getBlockState(pos).getBlock() instanceof StorageBlock)) {
if (isEnabledContainer(blockEntity, allContainers) || blockEntity instanceof StorageBlockEntity) {
if (isEnabledContainer(blockEntity, allContainers) && !(blockEntity instanceof StorageBlockEntity)) {
inventories.add((Inventory) blockEntity);
}
for (Direction direction : Direction.values()) {
BlockPos nextPos = pos.offset(direction);
getConnectedChestsHelper(world, nextPos, inventories, visited);
getConnectedChestsHelper(world, nextPos, inventories, visited, allContainers);
}
}
}
// Modify getCombinedInventoryFromChests to include item metadata and combine stacks
private SimpleInventory getCombinedInventory(boolean sortAlphabetically) {
private SimpleInventory getCombinedInventory(boolean sortAlphabetically, String query) {
Map<ItemStack, Integer> itemStackMap = new HashMap<>();
for (Inventory inventory : inventories) {
for (int i = 0; i < inventory.size(); i++) {
@ -84,7 +90,7 @@ public class ConnectedChests {
ItemStack existingStack = entry.getKey();
if (ItemStack.areItemsAndComponentsEqual(stack, existingStack)) {
int count = entry.getValue() + stack.getCount();
itemStackMap.put(existingStack, count);
itemStackMap.put(existingStack.copy(), count);
found = true;
break;
}
@ -97,7 +103,26 @@ public class ConnectedChests {
}
}
}
return getSimpleInventory(itemStackMap.size(), itemStackMap, sortAlphabetically);
return filterInventory(getSimpleInventory(itemStackMap.size(), itemStackMap, sortAlphabetically), query, sortAlphabetically);
}
// Modify filterInventory to include item metadata
private SimpleInventory filterInventory(SimpleInventory inventory, String query, boolean sortAlphabetically) {
if (query == null || query.isEmpty()) {
return inventory;
}
Map<ItemStack, Integer> itemStackMap = new HashMap<>();
int itemCount = 0;
for (int slot = 0; slot < inventory.size(); slot++) {
ItemStack stack = inventory.getStack(slot);
ItemStack filteredStack = filterStack(stack, query);
if (!filteredStack.isEmpty()) {
itemCount++;
int count = itemStackMap.getOrDefault(filteredStack, 0) + filteredStack.getCount();
itemStackMap.put(filteredStack.copy(), count);
}
}
return getSimpleInventory(itemCount, itemStackMap, sortAlphabetically);
}
public boolean tryPutItemStack(ItemStack stack) {
@ -135,16 +160,38 @@ public class ConnectedChests {
return false;
}
public void removeItemStack(ItemStack stackToRemove) {
public boolean canRemove(ItemStack stackToRemove) {
int remainingToRemove = stackToRemove.getCount();
for (int i = 0; i < inventory.size(); i++) {
ItemStack slotStack = inventory.getStack(i);
if (canCombine(slotStack, stackToRemove)) {
// If the slot contains the same item type
if (slotStack.getCount() >= remainingToRemove) {
// If the count in the slot is sufficient to remove the requested amount
return true;
} else {
// If the count in the slot is not sufficient, update remainingToRemove
remainingToRemove -= slotStack.getCount();
}
}
}
// If no matching stack with sufficient count is found, return false
return false;
}
public ItemStack removeItemStack(ItemStack stackToRemove) {
int remainingToRemove = stackToRemove.getCount();
ItemStack outStack = stackToRemove.copy();
for (Inventory chest : inventories) {
remainingToRemove = removeFromInventory(chest, stackToRemove, remainingToRemove);
if (remainingToRemove <= 0) {
return;
return outStack;
}
}
outStack.setCount(outStack.getCount() - remainingToRemove);
return outStack;
}
}

@ -31,6 +31,7 @@ public abstract class PagedGui extends SimpleGui {
public static final String GUI_A = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGU0MTc0ODEyMTYyNmYyMmFlMTZhNGM2NjRjNzMwMWE5ZjhlYTU5MWJmNGQyOTg4ODk1NzY4MmE5ZmRhZiJ9fX0=";
public static final String GUI_1 = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2E1MTZmYmFlMTYwNThmMjUxYWVmOWE2OGQzMDc4NTQ5ZjQ4ZjZkNWI2ODNmMTljZjVhMTc0NTIxN2Q3MmNjIn19fQ==";
public static final String GUI_STORE_ALL = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWFkNmM4MWY4OTlhNzg1ZWNmMjZiZTFkYzQ4ZWFlMmJjZmU3NzdhODYyMzkwZjU3ODVlOTViZDgzYmQxNGQifX19";
public static final String GUI_SETTINGS = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2EzYzhjNmQzYWFhOTYzNjNkNGJlZjI1NzhmMTAyNDc4MWVhMTRlOWQ4NWE5ZGNmYzA5MzU4NDdhNmZiNWM4ZCJ9fX0=";
public static final int PAGE_SIZE = 9 * 5;
protected final Runnable closeCallback;
@ -115,7 +116,8 @@ public abstract class PagedGui extends SimpleGui {
case 3 -> this.sorting();
case 4 -> this.refresh();
case 5 -> this.storeAll();
case 6 -> DisplayElement.nextPage(this);
case 6 -> this.settings();
case 7 -> DisplayElement.nextPage(this);
case 8 -> DisplayElement.of(
new GuiElementBuilder(Items.STRUCTURE_VOID)
.setName(Text.translatable(this.closeCallback != null ? "gui.back" : "mco.selectServer.close").formatted(Formatting.RED))
@ -129,13 +131,24 @@ public abstract class PagedGui extends SimpleGui {
};
}
protected abstract DisplayElement refresh();
protected DisplayElement refresh() {
return DisplayElement.filler();
}
protected abstract DisplayElement search();
protected DisplayElement search(){
return DisplayElement.filler();
}
protected DisplayElement sorting(){
return DisplayElement.filler();
}
protected abstract DisplayElement sorting();
protected DisplayElement storeAll(){
return DisplayElement.filler();
}
protected abstract DisplayElement storeAll();
protected DisplayElement settings(){
return DisplayElement.filler();
}
public record DisplayElement(@Nullable GuiElementInterface element, @Nullable Slot slot) {

@ -8,8 +8,6 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
@ -20,23 +18,17 @@ public class StorageOperations {
if (sortAlphabetically) {
// Sort alphabetically by item name
sortedMap = new TreeMap<>(new Comparator<ItemStack>() {
@Override
public int compare(ItemStack o1, ItemStack o2) {
sortedMap = new TreeMap<>((o1, o2) -> {
String name1 = String.valueOf(o1.getItem());
String name2 = String.valueOf(o2.getItem());
return name1.compareToIgnoreCase(name2);
}
});
} else {
// Sort by count in descending order
sortedMap = new TreeMap<>(new Comparator<ItemStack>() {
@Override
public int compare(ItemStack o1, ItemStack o2) {
sortedMap = new TreeMap<>((o1, o2) -> {
int countCompare = Integer.compare(o2.getCount(), o1.getCount());
// If counts are equal, compare items alphabetically by name
return countCompare == 0 ? String.valueOf(o1.getItem()).compareToIgnoreCase(String.valueOf(o2.getItem())) : countCompare;
}
});
}
@ -54,25 +46,6 @@ public class StorageOperations {
return inv;
}
// Modify filterInventory to include item metadata
public static Inventory filterInventory(Inventory inventory, String query, boolean sortAlphabetically) {
if(query == null || query.isEmpty()) {
return inventory;
}
Map<ItemStack, Integer> itemStackMap = new HashMap<>();
int itemCount = 0;
for (int slot = 0; slot < inventory.size(); slot++) {
ItemStack stack = inventory.getStack(slot);
ItemStack filteredStack = filterStack(stack, query);
if (!filteredStack.isEmpty()) {
itemCount++;
int count = itemStackMap.getOrDefault(filteredStack, 0) + filteredStack.getCount();
itemStackMap.put(filteredStack, count);
}
}
return getSimpleInventory(itemCount, itemStackMap, sortAlphabetically);
}
// Modify filterStack to include item metadata
public static ItemStack filterStack(ItemStack stack, String query) {
Item item = stack.getItem();
@ -109,26 +82,6 @@ public class StorageOperations {
return maxInsert; // Return the maximum insertion count
}
public static boolean canRemoveFromInventory(Inventory inventory, ItemStack stackToRemove) {
int remainingToRemove = stackToRemove.getCount();
for (int i = 0; i < inventory.size(); i++) {
ItemStack slotStack = inventory.getStack(i);
if (canCombine(slotStack, stackToRemove)) {
// If the slot contains the same item type
if (slotStack.getCount() >= remainingToRemove) {
// If the count in the slot is sufficient to remove the requested amount
return true;
} else {
// If the count in the slot is not sufficient, update remainingToRemove
remainingToRemove -= slotStack.getCount();
}
}
}
// If no matching stack with sufficient count is found, return false
return false;
}
public static ItemStack insertStackIntoInventory(Inventory inventory, ItemStack stack) {
// First, try to merge with existing stacks
for (int i = 0; i < inventory.size(); i++) {

@ -3,7 +3,6 @@ package systems.brn.server_storage.screens;
import eu.pb4.sgui.api.ClickType;
import eu.pb4.sgui.api.elements.GuiElementBuilder;
import eu.pb4.sgui.api.elements.GuiElementInterface;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.screen.slot.SlotActionType;
@ -11,10 +10,8 @@ import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import systems.brn.server_storage.blockentities.StorageBlockEntity;
import systems.brn.server_storage.lib.ConnectedChests;
import systems.brn.server_storage.lib.PagedGui;
import static systems.brn.server_storage.lib.StorageOperations.*;
@ -22,19 +19,12 @@ import static systems.brn.server_storage.lib.Util.addCountToLore;
import static systems.brn.server_storage.lib.Util.removeCountFromLore;
public class StorageScreen extends PagedGui {
private final BlockPos pos;
private final ServerPlayerEntity player;
private final World world;
private ConnectedChests chests;
private final StorageBlockEntity blockEntity;
private String searchString;
private Boolean sortAlphabetically;
public StorageScreen(ServerPlayerEntity player, BlockPos pos, @Nullable Runnable closeCallback) {
super(player, closeCallback);
this.player = player;
this.pos = pos;
this.world = player.getWorld();
this.setLockPlayerInventory(false);
this.blockEntity = (StorageBlockEntity) player.getWorld().getBlockEntity(pos);
assert blockEntity != null;
@ -43,23 +33,21 @@ public class StorageScreen extends PagedGui {
@Override
public boolean open() {
page = blockEntity.page;
searchString = blockEntity.searchString;
sortAlphabetically = blockEntity.sortAlphabetically;
this.updateDisplay();
this.blockEntity.openStorageScreens.add(this);
this.blockEntity.rescanChests();
return super.open();
}
@Override
public void updateDisplay() {
this.chests = new ConnectedChests(world, pos, sortAlphabetically);
String title = chests.containerUsedSlots +
String title = blockEntity.chests.containerUsedSlots +
"u/" +
chests.containerSlots +
blockEntity.chests.containerSlots +
"t(" +
chests.containerFreeSlots +
blockEntity.chests.containerFreeSlots +
"f)" +
"[" +
chests.containerCount +
blockEntity.chests.containerCount +
"c]";
setTitle(Text.of(title));
@ -68,16 +56,13 @@ public class StorageScreen extends PagedGui {
@Override
protected int getPageAmount() {
int sizeX = 9;
int sizeY = 6;
return Math.ceilDivExact(filterInventory(chests.inventory, searchString, sortAlphabetically).size(), sizeX * sizeY);
return Math.ceilDivExact(blockEntity.chests.inventory.size(), 9 * 6);
}
@Override
protected DisplayElement getElement(int id) {
if (chests.inventory.size() > id) {
Inventory filteredInventory = filterInventory(chests.inventory, searchString, sortAlphabetically);
ItemStack itemStack = filteredInventory.getStack(id);
if (blockEntity.chests.inventory.size() > id) {
ItemStack itemStack = blockEntity.chests.inventory.getStack(id);
ItemStack newStack = addCountToLore(itemStack.getCount(), itemStack);
GuiElementBuilder guiElement = new GuiElementBuilder(newStack);
return DisplayElement.of(guiElement);
@ -112,10 +97,11 @@ public class StorageScreen extends PagedGui {
int insertCount = canInsertItemIntoPlayerInventory(player, noLoreStack);
ItemStack insertingStack = noLoreStack.copy();
insertingStack.setCount(insertCount);
if (canRemoveFromInventory(chests.inventory, noLoreStack) && insertCount > 0) {
blockEntity.rescanChests();
if (blockEntity.chests.canRemove(noLoreStack) && insertCount > 0) {
player.getInventory().insertStack(insertingStack.copy());
chests.removeItemStack(insertingStack);
blockEntity.updateDisplays();
blockEntity.chests.removeItemStack(insertingStack);
blockEntity.rescanChests();
}
}
}
@ -124,13 +110,30 @@ public class StorageScreen extends PagedGui {
@Override
public boolean insertItem(ItemStack stack, int startIndex, int endIndex, boolean fromLast) {
if (chests.tryPutItemStack(stack)) {
blockEntity.rescanChests();
if (blockEntity.chests.tryPutItemStack(stack)) {
removeFromInventory(player.getInventory(), stack, stack.getCount());
}
blockEntity.updateDisplays();
blockEntity.rescanChests();
return super.insertItem(stack, startIndex, endIndex, fromLast);
}
@Override
protected DisplayElement settings() {
return DisplayElement.of(
new GuiElementBuilder(Items.PLAYER_HEAD)
.setName(Text.translatable(this.blockEntity.allInventories ? "gui.all" : "options.fov.min").formatted(Formatting.WHITE))
.hideDefaultTooltip().noDefaults()
.setSkullOwner(GUI_SETTINGS)
.setCallback((x, y, z) -> {
this.blockEntity.allInventories ^= true;
this.blockEntity.markDirty();
this.blockEntity.rescanChests();
playClickSound(getPlayer());
})
);
}
@Override
protected DisplayElement search() {
return DisplayElement.of(
@ -150,13 +153,13 @@ public class StorageScreen extends PagedGui {
protected DisplayElement sorting() {
return DisplayElement.of(
new GuiElementBuilder(Items.PLAYER_HEAD)
.setName(Text.translatable(sortAlphabetically ? "A->Z" : "9->1").formatted(Formatting.WHITE))
.setName(Text.translatable(this.blockEntity.sortAlphabetically ? "A->Z" : "9->1").formatted(Formatting.WHITE))
.hideDefaultTooltip().noDefaults()
.setSkullOwner(sortAlphabetically ? GUI_A : GUI_1)
.setSkullOwner(this.blockEntity.sortAlphabetically ? GUI_A : GUI_1)
.setCallback((x, y, z) -> {
this.sortAlphabetically ^= true;
this.blockEntity.sortAlphabetically ^= true;
playClickSound(getPlayer());
updateDisplay();
this.blockEntity.rescanChests();
})
);
}
@ -179,9 +182,9 @@ public class StorageScreen extends PagedGui {
}
public void doSearch(String query) {
this.searchString = query;
this.blockEntity.searchString = query;
this.blockEntity.rescanChests();
this.page = 0;
updateDisplay();
}
@Override
@ -194,8 +197,8 @@ public class StorageScreen extends PagedGui {
.setCallback((x, y, z) -> {
playClickSound(player);
this.page = 0;
this.searchString = "";
updateDisplay();
this.blockEntity.searchString = "";
this.blockEntity.rescanChests();
})
);
}
@ -203,9 +206,8 @@ public class StorageScreen extends PagedGui {
@Override
public void onClose() {
this.blockEntity.page = page;
this.blockEntity.searchString = searchString;
this.blockEntity.sortAlphabetically = sortAlphabetically;
this.blockEntity.markDirty();
this.blockEntity.removeScreen(this);
super.onClose();
}
}

@ -1,3 +1,4 @@
{
"block.serverstorage.storage": "Chest storage controller"
"block.serverstorage.storage": "Chest storage controller",
"block.serverstorage.fast_hopper": "Fast hopper"
}