diff --git a/.gitignore b/.gitignore index 9ae68be8..6523ddf5 100755 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ crash-reports/ *.lnk *.jks secret.properties +.vscode diff --git a/gradle.properties b/gradle.properties index 37093f9e..08be8c60 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,8 @@ org.gradle.daemon=false # as needed run/server.properties : online-mode=false # implementation fg.deobf("curse.maven:simple-storage-network-268495:3163007") curse_id=268495 -mod_version=1.6.5 + +mod_version=1.7.0 # optional dependencies @@ -20,8 +21,9 @@ curios_version=5.1.1.0 patchouli_version=77 + # folder to copy the build output jar -dist_folder=c:/temp +dist_folder= # for eclipse.ini if needed #-vm diff --git a/src/main/java/com/lothrazar/storagenetwork/api/IConnectableLink.java b/src/main/java/com/lothrazar/storagenetwork/api/IConnectableLink.java index 10ce6db6..f3466640 100644 --- a/src/main/java/com/lothrazar/storagenetwork/api/IConnectableLink.java +++ b/src/main/java/com/lothrazar/storagenetwork/api/IConnectableLink.java @@ -1,6 +1,9 @@ package com.lothrazar.storagenetwork.api; import java.util.List; + +import com.lothrazar.storagenetwork.util.StackProviderBatch; + import net.minecraft.world.item.ItemStack; /** @@ -80,4 +83,8 @@ public interface IConnectableLink { void setPriority(int value); void setFilter(int value, ItemStack copy); + + public ItemStack extractFromSlot(int slot, int amount, boolean simulate); + + void addToStackProviderBatch(StackProviderBatch availableItems); } diff --git a/src/main/java/com/lothrazar/storagenetwork/api/IItemStackMatcher.java b/src/main/java/com/lothrazar/storagenetwork/api/IItemStackMatcher.java index 9ff13714..d406e05e 100644 --- a/src/main/java/com/lothrazar/storagenetwork/api/IItemStackMatcher.java +++ b/src/main/java/com/lothrazar/storagenetwork/api/IItemStackMatcher.java @@ -23,4 +23,6 @@ public interface IItemStackMatcher { * @return */ boolean match(ItemStack stack); + + boolean match(IItemStackMatcher matcher); } diff --git a/src/main/java/com/lothrazar/storagenetwork/block/inventory/ScreenNetworkInventory.java b/src/main/java/com/lothrazar/storagenetwork/block/inventory/ScreenNetworkInventory.java index 81cd80e0..cb7c8cc8 100644 --- a/src/main/java/com/lothrazar/storagenetwork/block/inventory/ScreenNetworkInventory.java +++ b/src/main/java/com/lothrazar/storagenetwork/block/inventory/ScreenNetworkInventory.java @@ -198,7 +198,7 @@ public boolean keyPressed(int keyCode, int scanCode, int b) { } return true; } - else if (network.stackUnderMouse.isEmpty()) { + else if (!network.stackUnderMouse.isEmpty()) { try { JeiHooks.testJeiKeybind(mouseKey, network.stackUnderMouse); } diff --git a/src/main/java/com/lothrazar/storagenetwork/block/main/NetworkModule.java b/src/main/java/com/lothrazar/storagenetwork/block/main/NetworkModule.java index 4a02c43b..aa43554e 100644 --- a/src/main/java/com/lothrazar/storagenetwork/block/main/NetworkModule.java +++ b/src/main/java/com/lothrazar/storagenetwork/block/main/NetworkModule.java @@ -21,10 +21,14 @@ import com.lothrazar.storagenetwork.api.IItemStackMatcher; import com.lothrazar.storagenetwork.capability.handler.ItemStackMatcher; import com.lothrazar.storagenetwork.registry.StorageNetworkCapabilities; +import com.lothrazar.storagenetwork.util.RequestBatch; +import com.lothrazar.storagenetwork.util.StackProvider; +import com.lothrazar.storagenetwork.util.StackProviderBatch; import com.lothrazar.storagenetwork.util.UtilInventory; import com.lothrazar.storagenetwork.util.UtilTileEntity; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -302,6 +306,21 @@ public ItemStack request(ItemStackMatcher matcher, int size, boolean simulate) { return ItemHandlerHelper.copyStackWithSize(usedMatcher.getStack(), alreadyTransferred); } + public void executeRequestBatch(RequestBatch batch) { + StackProviderBatch availableItems = new StackProviderBatch(); + for (IConnectableLink storage : getSortedConnectableStorage()) { + storage.addToStackProviderBatch(availableItems); + } + for (Item item : batch.keySet()) { + List availableStacks = availableItems.get(item); + if (availableStacks != null) { + for (StackProvider provider : availableStacks) { + batch.extractStacks(provider.getStorage(), provider.getSlot(), item); + } + } + } + } + /** * TODO: move or refactor? */ diff --git a/src/main/java/com/lothrazar/storagenetwork/block/main/TileMain.java b/src/main/java/com/lothrazar/storagenetwork/block/main/TileMain.java index a5d75b61..b683db9e 100644 --- a/src/main/java/com/lothrazar/storagenetwork/block/main/TileMain.java +++ b/src/main/java/com/lothrazar/storagenetwork/block/main/TileMain.java @@ -1,6 +1,7 @@ package com.lothrazar.storagenetwork.block.main; import java.util.Set; + import com.lothrazar.storagenetwork.StorageNetworkMod; import com.lothrazar.storagenetwork.api.DimPos; import com.lothrazar.storagenetwork.api.EnumStorageDirection; @@ -10,6 +11,8 @@ import com.lothrazar.storagenetwork.capability.handler.ItemStackMatcher; import com.lothrazar.storagenetwork.registry.SsnRegistry; import com.lothrazar.storagenetwork.registry.StorageNetworkCapabilities; +import com.lothrazar.storagenetwork.util.Request; +import com.lothrazar.storagenetwork.util.RequestBatch; import com.lothrazar.storagenetwork.util.UtilInventory; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -68,6 +71,11 @@ public ItemStack request(ItemStackMatcher matcher, int size, boolean simulate) { return result; } + public void executeRequestBatch(RequestBatch batch) { + batch.sort(); + nw.executeRequestBatch(batch); + } + private DimPos getDimPos() { return new DimPos(level, worldPosition); } @@ -178,12 +186,15 @@ private void updateProcess() { */ private void updateExports() { Set conSet = nw.getConnectables(); + RequestBatch requestBatch = new RequestBatch(); + for (IConnectable connectable : conSet) { if (connectable == null || connectable.getPos() == null) { - // StorageNetwork.log("null connectable or pos : updateExports() "); + // StorageNetwork.log("null connectable or pos : updateExports() "); continue; } - IConnectableItemAutoIO storage = connectable.getPos().getCapability(StorageNetworkCapabilities.CONNECTABLE_AUTO_IO, null); + IConnectableItemAutoIO storage = connectable.getPos() + .getCapability(StorageNetworkCapabilities.CONNECTABLE_AUTO_IO, null); if (storage == null) { continue; } @@ -199,7 +210,7 @@ private void updateExports() { if (storage.needsRedstone()) { boolean power = level.hasNeighborSignal(connectable.getPos().getBlockPos()); if (power == false) { - // StorageNetwork.log(power + " Export pow here ; needs yes skip me"); + // StorageNetwork.log(power + " Export pow here ; needs yes skip me"); continue; } } @@ -207,58 +218,41 @@ private void updateExports() { if (matcher.getStack().isEmpty()) { continue; } - //default amt to request. can be overriden by other upgrades - int amtToRequest = storage.getTransferRate(); - //check operations upgrade for export + + Request request = new Request(storage); + // default amt to request. can be overriden by other upgrades + // check operations upgrade for export boolean stockMode = storage.isStockMode(); if (stockMode) { StorageNetworkMod.log("stockMode == TRUE ; updateExports: attempt " + matcher.getStack()); - //STOCK upgrade means + // STOCK upgrade means try { - BlockEntity tileEntity = level.getBlockEntity(connectable.getPos().getBlockPos().relative(storage.facingInventory())); - IItemHandler targetInventory = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null); - //request with false to see how many even exist in there. - int stillNeeds = UtilInventory.containsAtLeastHowManyNeeded(targetInventory, matcher.getStack(), matcher.getStack().getCount()); + BlockEntity tileEntity = level + .getBlockEntity(connectable.getPos().getBlockPos().relative(storage.facingInventory())); + IItemHandler targetInventory = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) + .orElse(null); + // request with false to see how many even exist in there. + int stillNeeds = UtilInventory.containsAtLeastHowManyNeeded(targetInventory, matcher.getStack(), + matcher.getStack().getCount()); if (stillNeeds == 0) { - //they dont need any more, they have the stock they need + // they dont need any more, they have the stock they need StorageNetworkMod.log("stockMode continnue; canc"); continue; } - amtToRequest = Math.min(stillNeeds, amtToRequest); - StorageNetworkMod.log("updateExports stock mode edited value: amtToRequest = " + amtToRequest); - } - catch (Throwable e) { + request.setCount(Math.min(stillNeeds, request.getCount())); + StorageNetworkMod.log("updateExports stock mode edited value: amtToRequest = " + request.getCount()); + } catch (Throwable e) { StorageNetworkMod.LOGGER.error("Error thrown from a connected block" + e); } } - if (matcher.getStack().isEmpty() || amtToRequest == 0) { - //either the thing is empty or we are requesting none - continue; - } - ItemStack requestedStack = this.request((ItemStackMatcher) matcher, amtToRequest, true); - if (requestedStack.isEmpty()) { - continue; - } - // StorageNetwork.log("updateExports: found requestedStack = " + requestedStack); - // The stack is available in the network, let's simulate inserting it into the storage - ItemStack insertedSim = storage.insertStack(requestedStack, true); - // Determine the amount of items moved in the stack - if (!insertedSim.isEmpty()) { - int movedItems = requestedStack.getCount() - insertedSim.getCount(); - if (movedItems <= 0) { - continue; - } - requestedStack.setCount(movedItems); - } - // Alright, some items got moved in the simulation. Let's do it for real this time. - ItemStack realExtractedStack = request(new ItemStackMatcher(requestedStack, false, true), requestedStack.getCount(), false); - if (realExtractedStack.isEmpty()) { + if (matcher.getStack().isEmpty() || request.getCount() == 0) { + // either the thing is empty or we are requesting none continue; } - storage.insertStack(realExtractedStack, false); - break; + requestBatch.put(matcher.getStack().getItem(), request); } } + executeRequestBatch(requestBatch); } public static void clientTick(Level level, BlockPos blockPos, BlockState blockState, TileMain tile) {} diff --git a/src/main/java/com/lothrazar/storagenetwork/block/request/ScreenNetworkTable.java b/src/main/java/com/lothrazar/storagenetwork/block/request/ScreenNetworkTable.java index 33eac251..789b9f85 100644 --- a/src/main/java/com/lothrazar/storagenetwork/block/request/ScreenNetworkTable.java +++ b/src/main/java/com/lothrazar/storagenetwork/block/request/ScreenNetworkTable.java @@ -205,7 +205,7 @@ public boolean keyPressed(int keyCode, int scanCode, int b) { } return true; } - else if (network.stackUnderMouse.isEmpty()) { + else if (!network.stackUnderMouse.isEmpty()) { try { JeiHooks.testJeiKeybind(mouseKey, network.stackUnderMouse); } diff --git a/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableAutoIO.java b/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableAutoIO.java index bebf8741..1ddd2fc5 100644 --- a/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableAutoIO.java +++ b/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableAutoIO.java @@ -364,4 +364,9 @@ public Direction facingInventory() { public UpgradesItemStackHandler getUpgrades() { return upgrades; } + + public void extractFromSlot(int slot){ + + } + } diff --git a/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableLink.java b/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableLink.java index 1faec806..c1939fca 100644 --- a/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableLink.java +++ b/src/main/java/com/lothrazar/storagenetwork/capability/CapabilityConnectableLink.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; + import com.lothrazar.storagenetwork.StorageNetworkMod; import com.lothrazar.storagenetwork.api.DimPos; import com.lothrazar.storagenetwork.api.EnumStorageDirection; @@ -11,6 +12,9 @@ import com.lothrazar.storagenetwork.api.IItemStackMatcher; import com.lothrazar.storagenetwork.capability.handler.FilterItemStackHandler; import com.lothrazar.storagenetwork.registry.StorageNetworkCapabilities; +import com.lothrazar.storagenetwork.util.StackProvider; +import com.lothrazar.storagenetwork.util.StackProviderBatch; + import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -264,4 +268,52 @@ public void deserializeNBT(CompoundTag nbt) { } } } + + public ItemStack extractFromSlot(int slot, int amount, boolean simulate) { + DimPos inventoryPos = connectable.getPos().offset(inventoryFace); + // Test whether the connected block has the IItemHandler capability + IItemHandler itemHandler = inventoryPos.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, + inventoryFace.getOpposite()); + if (itemHandler == null) { + return ItemStack.EMPTY; + } + return itemHandler.extractItem(slot, amount, simulate); + } + + public void addToStackProviderBatch(StackProviderBatch availableItems) { + // If this storage is configured to only export from the network, do not + // extract from the storage, but abort immediately. + if (filterDirection == EnumStorageDirection.IN) { + return; + } + if (inventoryFace == null) { + return; + } + DimPos inventoryPos = connectable.getPos().offset(inventoryFace); + // Test whether the connected block has the IItemHandler capability + IItemHandler itemHandler = inventoryPos.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, + inventoryFace.getOpposite()); + if (itemHandler == null) { + return; + } + // if (itemHandler instanceof ExchangeItemStackHandler) { + // StorageNetwork.log("cannot loop back a network extract into + // ExchangeItemStackHandler"); + // return ItemStack.EMPTY; + // } + for (int slot = 0; slot < itemHandler.getSlots(); slot++) { + // force simulate: allow them to not let me see the stack, also dont extract + // since it might steal/dupe + ItemStack stack = itemHandler.extractItem(slot, 1, true); + if (stack == null || stack.isEmpty()) { + continue; + } + // Ignore stacks that are filtered + if (filters.isStackFiltered(stack)) { + continue; + } + StackProvider provider = new StackProvider(this, slot); + availableItems.put(stack.getItem(), provider); + } + } } diff --git a/src/main/java/com/lothrazar/storagenetwork/capability/handler/ItemStackMatcher.java b/src/main/java/com/lothrazar/storagenetwork/capability/handler/ItemStackMatcher.java index 6ca762dd..873ff7e5 100644 --- a/src/main/java/com/lothrazar/storagenetwork/capability/handler/ItemStackMatcher.java +++ b/src/main/java/com/lothrazar/storagenetwork/capability/handler/ItemStackMatcher.java @@ -20,7 +20,8 @@ public ItemStackMatcher(ItemStack stack, boolean ore, boolean nbt) { this.nbt = nbt; } - private ItemStackMatcher() {} + private ItemStackMatcher() { + } public void readFromNBT(CompoundTag compound) { CompoundTag c = (CompoundTag) compound.get("stack"); @@ -84,4 +85,9 @@ public boolean match(ItemStack stackIn) { } return stackIn.getItem() == stack.getItem(); } + + public boolean match(IItemStackMatcher matcher) { + ItemStack stack = matcher.getStack(); + return match(stack); + } } diff --git a/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkCraftingRemote.java b/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkCraftingRemote.java index ce62ed7d..61eb9245 100644 --- a/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkCraftingRemote.java +++ b/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkCraftingRemote.java @@ -201,7 +201,7 @@ public boolean keyPressed(int keyCode, int scanCode, int b) { network.searchBar.keyPressed(keyCode, scanCode, b); return true; } - else if (network.stackUnderMouse.isEmpty()) { + else if (!network.stackUnderMouse.isEmpty()) { try { JeiHooks.testJeiKeybind(mouseKey, network.stackUnderMouse); } diff --git a/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkRemote.java b/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkRemote.java index 011b633c..1d590079 100644 --- a/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkRemote.java +++ b/src/main/java/com/lothrazar/storagenetwork/item/remote/ScreenNetworkRemote.java @@ -177,7 +177,7 @@ public boolean keyPressed(int keyCode, int scanCode, int b) { network.searchBar.keyPressed(keyCode, scanCode, b); return true; } - else if (network.stackUnderMouse.isEmpty()) { + else if (!network.stackUnderMouse.isEmpty()) { try { JeiHooks.testJeiKeybind(mouseKey, network.stackUnderMouse); } diff --git a/src/main/java/com/lothrazar/storagenetwork/util/Batch.java b/src/main/java/com/lothrazar/storagenetwork/util/Batch.java new file mode 100644 index 00000000..5d8efa4f --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/util/Batch.java @@ -0,0 +1,20 @@ +package com.lothrazar.storagenetwork.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import net.minecraft.world.item.Item; + +public class Batch extends HashMap> { + public List put(Item item, K object) { + if (containsKey(item)) { + List matchingList = super.get(item); + matchingList.add(object); + return matchingList; + } + List newList = new ArrayList(); + newList.add(object); + return super.put(item, newList); + } +} diff --git a/src/main/java/com/lothrazar/storagenetwork/util/Request.java b/src/main/java/com/lothrazar/storagenetwork/util/Request.java new file mode 100644 index 00000000..6d6ffb81 --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/util/Request.java @@ -0,0 +1,57 @@ +package com.lothrazar.storagenetwork.util; + +import com.lothrazar.storagenetwork.api.IConnectableItemAutoIO; +import com.lothrazar.storagenetwork.api.IConnectableLink; + +import net.minecraft.world.item.ItemStack; + +public class Request { + private Integer count = 0; + private IConnectableItemAutoIO storage; + + public Request(IConnectableItemAutoIO storage) { + this.count = storage.getTransferRate(); + this.storage = storage; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Integer getCount() { + return count; + } + + public int getPriority() { + return storage.getPriority(); + } + + public Boolean insertStack(IConnectableLink providerStorage, int slot) { + ItemStack simulatedExtractedStack = providerStorage.extractFromSlot(slot, getCount(), true); + + if (simulatedExtractedStack.isEmpty()) { + return false; + } + + int movedItems = 0; + ItemStack simulatedInsertedStack = storage.insertStack(simulatedExtractedStack, true); + if (simulatedInsertedStack.isEmpty()) { + movedItems = getCount(); + setCount(0); + } else { + movedItems = simulatedExtractedStack.getCount() - simulatedInsertedStack.getCount(); + setCount(movedItems); + } + + // real extraction + + ItemStack realExtractedStack = providerStorage.extractFromSlot(slot, movedItems, false); + storage.insertStack(realExtractedStack, false); + + // Determine the amount of items moved in the stack + if (getCount() == 0) { + return true; + } + return false; + } +} diff --git a/src/main/java/com/lothrazar/storagenetwork/util/RequestBatch.java b/src/main/java/com/lothrazar/storagenetwork/util/RequestBatch.java new file mode 100644 index 00000000..a650b8dc --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/util/RequestBatch.java @@ -0,0 +1,63 @@ +package com.lothrazar.storagenetwork.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.lothrazar.storagenetwork.api.IConnectableLink; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public class RequestBatch extends Batch { + public void extractStacks(IConnectableLink providerStorage, Integer slot, Item item) { + List requests = get(item); + List remainingRequests = new ArrayList(); + for (Request request : requests) { + if (!request.insertStack(providerStorage, slot)) { + remainingRequests.add(request); + } + ItemStack stack = providerStorage.extractFromSlot(slot, 1, true); + if (stack.isEmpty()) { + return; + } + } + put(item, remainingRequests); + } + + public void sort() { + Collection> requests = this.values(); + for(List requestList : requests) { + quickSort(requestList, 0, requestList.size() - 1); + } + } + + private void quickSort(List requestList, int start, int end) { + if (start < end) { + int partitionInd = partition(requestList, start, end); + quickSort(requestList, start, partitionInd - 1); + quickSort(requestList, partitionInd + 1, end); + } + } + + private int partition(List requestList, int start, int end) { + int pivot = requestList.get(end).getPriority(); + int i = (start - 1); + for (int j = start; j < end; j++) { + if (requestList.get(j).getPriority() <= pivot) { + i++; + + Request highTemp = requestList.get(i); + Request lowTemp = requestList.get(j); + requestList.set(i, lowTemp); + requestList.set(j, highTemp); + } + } + Request swapTemp = requestList.get(i + 1); + Request temp = requestList.get(end); + requestList.set(i + 1, temp); + requestList.set(end, swapTemp); + + return i + 1; + } +} diff --git a/src/main/java/com/lothrazar/storagenetwork/util/StackProvider.java b/src/main/java/com/lothrazar/storagenetwork/util/StackProvider.java new file mode 100644 index 00000000..dc58734f --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/util/StackProvider.java @@ -0,0 +1,21 @@ +package com.lothrazar.storagenetwork.util; + +import com.lothrazar.storagenetwork.api.IConnectableLink; + +public class StackProvider { + IConnectableLink storage; + int slot; + + public StackProvider(IConnectableLink storage, int slot) { + this.storage = storage; + this.slot = slot; + } + + public IConnectableLink getStorage() { + return storage; + } + + public int getSlot() { + return slot; + } +} diff --git a/src/main/java/com/lothrazar/storagenetwork/util/StackProviderBatch.java b/src/main/java/com/lothrazar/storagenetwork/util/StackProviderBatch.java new file mode 100644 index 00000000..ad03cf08 --- /dev/null +++ b/src/main/java/com/lothrazar/storagenetwork/util/StackProviderBatch.java @@ -0,0 +1,4 @@ +package com.lothrazar.storagenetwork.util; + +public class StackProviderBatch extends Batch { +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 877588b7..320801f8 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -52,6 +52,12 @@ Storage Network to connect inventories to search and craft [[dependencies.storagenetwork]] modId="minecraft" mandatory=true - versionRange="[1.19,)" + versionRange="[1.19.2,)" + ordering="NONE" + side="BOTH" +[[dependencies.storagenetwork]] + modId="jei" + mandatory=false + versionRange="[11.4,)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/storagenetwork/lang/de_de.json b/src/main/resources/assets/storagenetwork/lang/de_de.json index d1e1dd34..5ab5f742 100644 --- a/src/main/resources/assets/storagenetwork/lang/de_de.json +++ b/src/main/resources/assets/storagenetwork/lang/de_de.json @@ -44,7 +44,7 @@ "gui.storagenetwork.sort": "Sortierrichtung", "gui.storagenetwork.priority.up": "Priorität herabstufen (kleiner geht vor)", - "gui.storagenetwork.priority.down": "Priorität erhöhen (größer geht vor)", + "gui.storagenetwork.priority.down": "Priorität erhöhen (kleiner geht vor)", "gui.storagenetwork.req.tooltip_name": "Nach Name sortieren", "gui.storagenetwork.req.tooltip_mod": "Nach Mod sortieren", diff --git a/src/main/resources/assets/storagenetwork/lang/uk_ua.json b/src/main/resources/assets/storagenetwork/lang/uk_ua.json new file mode 100644 index 00000000..c6bac4a6 --- /dev/null +++ b/src/main/resources/assets/storagenetwork/lang/uk_ua.json @@ -0,0 +1,146 @@ +{ + "itemGroup.storagenetwork": "Проста мережа зберігання", + "item.storagenetwork.network_book": "Керівництво по мережам", + "storagenetwork.network_book.landing_text": "Проста мережа сховищ керуватиме всіма вашими запасами. Дивіться $(l:gs_setup)Початок роботи$(/l). ", + "block.storagenetwork.kabel": "Кабель", + "block.storagenetwork.kabel.guide": "Основний мережевий кабель підключається лише до мережевих блоків.", + "block.storagenetwork.storage_kabel": "Мережевий кабель", + "block.storagenetwork.storage_kabel.guide": "Кожен мережевий кабель підключає лише один інвентар до мережі. Це основна точка з'єднання для інвентарю у вашій мережі, без керування пріоритетом або автоматизацією. Перегляньте покращення до $(l:filter_kabel)версії з фільтром$(/l), для більшої автоматизації. ", + "block.storagenetwork.export_kabel": "Експорт кабель", + "block.storagenetwork.export_kabel.guide": "Підключені до інвентарю, вони експортують предмети з мережі до цільового інвентарю. Має пріоритетні налаштування порядку сортування серед інших експортних кабелів, а також опціональний контроль редстоуну. Приймає покращення. ", + "block.storagenetwork.import_kabel": "Імпорт кабель", + "block.storagenetwork.import_kabel.guide": "Вони постійно імпортують з підключеного інвентарю в мережу. Оновіть до $(l:import_filter_kabel)версії з фільтром$(/l) для більшої автоматизації", + "block.storagenetwork.import_filter_kabel": "Імпорт кабель з фільтром", + "block.storagenetwork.import_filter_kabel.guide": "Вони постійно імпортують з підключеного інвентарю в мережу. Їх можна налаштувати за допомогою покращень, фільтра предметів, і редстоуну на екрані керування. Фільтр ''білий список'' означає, що пропускатимуться лише ті предмети, які відповідають фільтру, а режим ''чорний список'' означає, що можна витягувати все, але ігнорувати те, що є у списку. Імпорт фільтра витирає і замінює його вмістом інвентарю", + "block.storagenetwork.filter_kabel": "Мережевий кабель з фільтром", + "block.storagenetwork.filter_kabel.guide": "Кожен мережевий кабель підключає лише один інвентар до мережі. Має пріоритетні налаштування порядку сортування серед інших експортних кабелів і приймає покращення. ", + "page.storagenetwork.gs_chunks": "Чанки", + "page.storagenetwork.gs_setup": "Налаштування мережі", + "page.storagenetwork.gs_priority": "Пріоритет", + "storagenetwork.guide.getstarted": "Почнімо", + "storagenetwork.guide.upgrades": "Покращення", + "storagenetwork.guide.upgrades.desc": "Покращення використовуються у слотах $(l:export_kabel)експортного кабелю$(/l) та $(l:import_filter_kabel)Фільтрованого імпортного кабелю$(/l)", + "storagenetwork.guide.remotes": "Пульти", + "storagenetwork.guide.remotes.desc": "Використовуйте ваш новий пульт на $(l:master)корені$(/l), щоб налаштувати його прив'язку до мережі. Кожен пульт прив'язано до кореня мережі з точним (x,y,z,d) розташуванням, і він може отримати доступ до мережевого інвентарю, доки кореневий вузол не зломано і не завантажено. Вони бездротові з необмеженим радіусом дії. ", + "storagenetwork.guide.blocks": "Блоки", + "storagenetwork.guide.blocks.desc": "Всі мережеві блоки нормально підключаються до будь-якого мережевого кабелю або блоку і забезпечують різний доступ або функції мережі. ", + "storagenetwork.guide.cables": "Кабелі", + "storagenetwork.guide.cables.desc": "Кабелі з'єднують блоки та вузли у мережу. Дійсна мережа повинна мати рівно один $(l:master)корінь$(/l). Тоді вам знадобиться принаймні один інвентар зі $(l:storage_kabel)з'єднувальним кабелем$(/l)", + "storagenetwork.guide.getstarted.desc": "Різні сторінки керівництва", + "page.storagenetwork.gs_setup.left": "Короткий посібник з початку роботи з Simple Storage. Після того, як ви зберете деякі інгредієнти, кілька $(l:kabel)мережевих кабелів$(/l) і $(l:master)корінь$(/l). Ваша мережа буде запущена, як тільки ці компоненти буде розміщено у вашому світі. $(l:storage_kabel)Мережевий кабель$(/l) з'єднає скриню або інший інвентар з вашою мережею. Щоб отримати доступ, перегляньте $(l:inventory_remote)пульти$(/l) або $(l:request)столи$(/l). ", + "page.storagenetwork.gs_setup.right": "Спробуйте скористатися функцією закладок", + "page.storagenetwork.gs_priority.left": "Кабелі сортуються за пріорітетом. Якщо не передбачено інтерфейсу, наприклад, $(l:storage_kabel)мереживих кабелів$(/l), його значення дорівнює нулю. Коли користувач виконує запит на вставлення/вилучення до мережі, він намагатиметься використати вузли з найменшим пріоритетом, доки запит не буде виконано. Для автоматизації імпорту/експорту обробляються всі кабелі, а пріоритет визначає порядок кожного разу, по одній стосовій дії на тік для кожного кабелю. ", + "page.storagenetwork.gs_priority.right": "$(li)Відсортуйте кабелі за пріоритетом, щоб найнижчі номери були першими$(li)Рівні числа разом$(li)приклад: [-2, -2, 0, 0, 1, 2, 4]$(li)По черзі використовуйте вузли в такому порядку. ", + "page.storagenetwork.gs_chunks.left": "Будь-яка мережа працює у світі, лише якщо її $(l:master)корінь$(/l) знаходиться у завантаженому чанку. Кінцеві кабелі мережі, такі як $(l:storage_kabel)мережевий кабель$(/l), можуть перебувати у іншому чанку, ніж короень мережі, і можуть бути окремо від'єднані залежно від їхнього чанку. Ви можете мати декілька мереж на один чанк, світ або вимір. ", + "page.storagenetwork.gs_chunks.right": "$(li)Приклад розподілу: У мережі може бути 20 з'єднувальних кабелів, але 5 з них перебувають у нерозвантаженому блоці. Мережеві екрани/пульти все одно відкриватимуться, оскільки завантажено кореневий блок, а вміст цих вивантажених кабелів не буде видно.$(li)Віддалений приклад: Я будую свою мережу зберігання далеко від $(t:Які завжи провантажені)спавн чанків$(/t), на віддаленій океанській базі. Коли я йду в Незер, чанки в звичайному світі з блоком кореня вивантажуються, тому мої $(l:inventory_remote)пульти$(/l) не можуть під'єднатися.", + "block.storagenetwork.master": "Корінь мережі", + "block.storagenetwork.master.tooltip": "Тільки один на мережу", + "block.storagenetwork.master.guide": "Основне ядро мережі. Лише ОДИН на мережу, розміщення більшої кількості призведе до поломки одного з них і може спричинити проблеми з підключенням до мережі пультів і кабелів. Переміщення кореневого вузла на нове місце призведе до розриву мережі, переривання імпорту, експорту та роботи пультів. Кілька мереж у світі та вимірі - це нормально, якщо вони не з'єднані одна з одною", + "block.storagenetwork.request": "Стіл створення", + "block.storagenetwork.request.guide": "Перегляд інвентарю мережі з повним доступом до прокрутки, вилучення та додавання предметів. Користувацька сітка створення, яка витягує інгредієнти з мережі. Дивіться $(l:crafting_remote)віддалену версію тут$(/l) ", + "block.storagenetwork.request.tooltip": "Доступ до предметів з сіткою створення", + "block.storagenetwork.inventory": "Інвентар зберігання", + "block.storagenetwork.inventory.guide": "Переглядає мережевий інвентар з повним доступом до прокрутки, вилучення та додавання елементів. Дивіться $(l:inventory_remote)віддалену версію тут$(/l) ", + "block.storagenetwork.inventory.tooltip": "Доступ до предметів без сітки створення", + "block.storagenetwork.exchange": "Інтерфейс обміну мережі", + "block.storagenetwork.exchange.guide": "Цей блок відкриває мережу і діє як контролер для інших систем автоматизації або рішень для зберігання. Наприклад, звичайна воронка, розміщена на інтерфейсі обміну в мережі, буде вставляти предмети у відповідні мережеві слоти, як зазвичай, подібно до $(l:import_kabel)імпорт кабелю$(/l). Воронка нижче дозволить експортувати довільні предмети. Спробуйте це з іншими модами на сховища! ", + "block.storagenetwork.exchange.tooltip": "Кінцева точка мережі для інвертарних підключень", + "block.storagenetwork.collector": "Інтерфейс збору", + "block.storagenetwork.collector.guide": "Цей блок відкриває мережу і діє як контролер лише для вставки для інших систем автоматизації або рішень для зберігання. Наприклад, звичайна воронка, розміщена на інтерфейсі обміну, буде вставляти предмети у дійсні мережеві слоти, як зазвичай, подібно до $(l:import_kabel)імпорт кабелю$(/l). Не дозволяє вилучати предмети. Спробуйте це з іншими модами на сховища! ", + "block.storagenetwork.collector.tooltip": "Зібрані речі переміщуються в мережу", + "item.storagenetwork.speed_upgrade": "Покращення швидкості", + "item.storagenetwork.speed_upgrade.guide": "Це покращення може бути розміщена в кабелях. Збільшує швидкість імпорту, який зазвичай не відбувається кожен тік. Внаслідок зменшення затримки між операціями. Призведе до ігнорування будь-яких покращень повільності, якщо вони обидва присутні. ", + "item.storagenetwork.speed_upgrade.tooltip": "Збільшує швидкість імпорту/експорту", + "item.storagenetwork.operation_upgrade": "Покращення операцій", + "item.storagenetwork.operation_upgrade.tooltip": "Обробляє кількість елементів у фільтрі; може перевизначати інші покращення", + "item.storagenetwork.operation_upgrade.guide": "Якщо фільтр знаходиться у кабелі з увімкненим режимом ''Білий список'', він намагатиметься імпортувати або експортувати точну кількість елементів, задану у фільтрі, і ігноруватиме покращення стоса і запасу. Наприклад, фільтр, у якому дозволено 7 каменів і 3 ґрунту, експортуватиме саме стільки за цикл, а не 4 за замовчуванням. ", + "item.storagenetwork.stack_upgrade": "Покращення стосу", + "item.storagenetwork.stack_upgrade.tooltip": "Збільшує розмір стоса завдання", + "item.storagenetwork.stack_upgrade.guide": "Це покращення можна встановити на кабелі імпорту або експорту. Дозволяє витягувати повний стос до 64 щоразу, коли кабель працює, замість 4", + "item.storagenetwork.single_upgrade": "Покращення одиниць", + "item.storagenetwork.single_upgrade.tooltip": "Встановлює розмір стоса на 1", + "item.storagenetwork.single_upgrade.guide": "Це покращення може бути застосовано до кабелів імпорту або експорту. Зменшує його до витягування по одному кожного разу, коли працює кабель, замість 4. Замінить покращення стоса, якщо обидва присутні.", + "item.storagenetwork.slow_upgrade": "Покращення повільності", + "item.storagenetwork.slow_upgrade.tooltip": "Зменшує швидкість імпорту/експорту ", + "item.storagenetwork.slow_upgrade.guide": "Це оновлення можна розмістити в кабелях імпорту або експорту. Збільшує час між операціями, що сповільнює загальний процес. ", + "item.storagenetwork.stock_upgrade": "Покращення запасу", + "item.storagenetwork.stock_upgrade.tooltip": "Зберігає постійний запас предметів у прикріпленому інвентарі", + "item.storagenetwork.stock_upgrade.guide": "Якщо це експортний кабель, то для кожного унікального предмета у фільтрі він буде експортуватись лише доти, доки цільовий запас не стане меншим за розмір стоса фільтра, щоб заповнити його до цільового розміру з фільтра. І навпаки, кабелі імпорту з покращенням запасів будуть підтримувати постійний запас у пов'язаній скрині, зменшуючи його і зупиняючись на розмірах стоса фільтра. ", + "item.storagenetwork.builder_remote": "Пульт мережі", + "item.storagenetwork.builder_remote.tooltip": "Прив'яжіть до мережі та блоку для створення", + "item.storagenetwork.builder_remote.guide": "Цей пульт прив'язується як звичайний, але не має екрана. Замість цього він шукає блок, на який ви натиснули, і намагається створити його копію, використовуючи відповідний предмет у мережі.", + "item.storagenetwork.builder_remote.blockstate": "Блоку не вибрано", + "item.storagenetwork.inventory_remote": "Пульт зберігання", + "item.storagenetwork.inventory_remote.tooltip": "Використайте на корені мережі для бездротового зв'язку", + "item.storagenetwork.inventory_remote.guide": "Повний віддалений доступ до мережі, не обмежений діапазоном або виміром. Подібний до $(l:inventory)інвентарю зберігання$(/l). Також можна відкрити гарячою клавішою.", + "item.storagenetwork.crafting_remote": "Пульт створення", + "item.storagenetwork.crafting_remote.tooltip": "Використайте на корені мережі для бездротового зв'язку", + "item.storagenetwork.crafting_remote.guide": "Повний віддалений доступ до мережі, не обмежений діапазоном або виміром. Має в собі сітку створення. Подібний до $(l:request)столу створення$(/l). Також можна відкрити гарячою клавішою.", + "item.storagenetwork.picker_remote": "Пульт вибору", + "item.storagenetwork.picker_remote.tooltip": "Якщо натиснути на блок він витягне відповідні блоки з мережі", + "item.storagenetwork.picker_remote.guide": "Цей пульт прив'язується як звичайний, але не має екрана. Замість цього торкніться цим предметом блока. Буде запитано або 1, або повний стос цього блоку, залежно від того, чи ви присідаєте. ", + "item.storagenetwork.collector_remote": "Пульт збору", + "item.storagenetwork.collector_remote.tooltip": "Зібрані речі переміщуються в мережу", + "item.storagenetwork.collector_remote.guide": "Підключіть його до мережі, як зазвичай. Цей пульт працює будь-де у вашому інвентарі (включно з curios, але не зі скринею Енду), його не потрібно тримати в руці або на гарячій панелі. Коли ви візьмете будь-який предмет, він вставить його у мережу, якщо це можливо.", + "block.storagenetwork.recipe.invalid": "Транзакція дійсна:", + "block.storagenetwork.recipe.invalidleft": "Встановити вхід ліворуч", + "block.storagenetwork.recipe.invalidright": "Встановити вихід праворуч", + "block.storagenetwork.recipe.valid": "Транзакція дійсна", + "item.remote.found": "Предмет знайдено, видобуваю...", + "item.remote.notfound.item": "Предмет не знайдений в мережі", + "item.remote.notfound": "Мережа не знайдена, переконайтесь, що чанк завантажений", + "item.remote.notconnected": "Пульт не під'єднано, спочатку прив'яжіть його до кореня мережі", + "item.remote.connected": "Віддалене підключення до мережі", + "item.remote.outofrange": "Поза діапазоном", + "item.remote.notloaded": "Чанк не завантажено", + "gui.storagenetwork.refresh": "Оновити транзакції обробки, щоб якщо вона застрягла в очікуванні результату, це перемикне її назад у режим рецепта для збору інгредієнтів", + "gui.storagenetwork.checkbox.meta": "Мета", + "gui.storagenetwork.checkbox.ore": "OreDict", + "gui.storagenetwork.checkbox.nbt": "NBT", + "gui.storagenetwork.import": "Імпортувати вміст як фільтр", + "gui.storagenetwork.allowlist": "Білий список", + "gui.storagenetwork.ignorelist": "Чорний список", + "gui.storagenetwork.redstone.false": "Завжди увімкнено", + "gui.storagenetwork.redstone.true": "Потребує редстоун", + "gui.storagenetwork.sort": "Напрям сортування", + "gui.storagenetwork.priority.up": "Знизити пріоритет", + "gui.storagenetwork.priority.down": "Підвищити пріоритет", + "gui.storagenetwork.req.tooltip_name": "Сортувати за іменем", + "gui.storagenetwork.req.tooltip_mod": "Сортувати за модом", + "gui.storagenetwork.req.tooltip_amount": "Сортувати за кількістю", + "gui.storagenetwork.shift": "Утримуйте Shift для додаткової інформації", + "gui.storagenetwork.fil.tooltip_in": "Тільки ввід", + "gui.storagenetwork.fil.tooltip_out": "Тільки вивід", + "gui.storagenetwork.fil.tooltip_both": "Ввід та вивід", + "gui.storagenetwork.fil.tooltip_mod": "Префікс @: Пошук по моду", + "gui.storagenetwork.fil.tooltip_tooltip": "Префікс #: Пошук по підказці", + "gui.storagenetwork.fil.tooltip_tags": "Префікс $: Пошук по теґу", + "gui.storagenetwork.fil.tooltip_clear": "Очистити текст ПКМ'ом", + "gui.storagenetwork.autofocus.tooltip.true": "Автофокус панелі пошуку", + "gui.storagenetwork.autofocus.tooltip.false": "Без авто-фокусу", + "gui.storagenetwork.tooltip_clear": "Очистити пошук", + "gui.storagenetwork.fil.tooltip_jei_on": "JEI пошук ввімкнено", + "gui.storagenetwork.fil.tooltip_jei_off": "Пошук JEI вимкнено", + "block.storagenetwork.kabel.tooltip": "Основний кабель мережі", + "block.storagenetwork.storage_kabel.tooltip": "Використовується для підключення інвентарю до мережі", + "block.storagenetwork.export_kabel.tooltip": "Експортує предмети з мережі до приєднаного інвентарю", + "block.storagenetwork.import_kabel.tooltip": "Імпортує всі предмети з прикріпленого інвентарю в мережу", + "block.storagenetwork.filter_kabel.tooltip": "З'єднання інвентарів з опціями фільтрації", + "block.storagenetwork.import_filter_kabel.tooltip": "Імпортує предмети з опціями фільтрації", + "tooltip.storagenetwork.kabel_P": "Може автоматизувати прості операції з обробки", + "block.storagenetwork.controller": "Контролер", + "block.storagenetwork.controller.tooltip": "Керування всіма процесорними кабелями в мережі", + "chat.main.emptyslots": "Потенційні порожні слоти: ", + "chat.main.connectables": "З’єднання: ", + "key.storagenetwork.remote": "Пульт в Curios", + "gui.storagenetwork.operate.tooltip": "Операції вимкнено, якщо логічна перевірка не спрацювала", + "gui.storagenetwork.operate.tooltip.more": "Кількість елементів має бути більшою за значення", + "gui.storagenetwork.operate.tooltip.less": "Кількість елементів має бути меншою за значення", + "processing.buttons.toggle.true": "Завжди активний", + "processing.buttons.toggle.false": "Опрацьовувати тільки запитуваний номер", + "processing.buttons.minus": "Збільшити запит", + "processing.buttons.plus": "Зменшити запит", + "processing.empty.ingredients": "Пустий інгрідієнт", + "gui.storagenetwork.processing.recipe": "Інгредієнти для кожного циклу будуть надсилатися так, ніби вони надходять з цього блоку", + "gui.storagenetwork.processing.extract": "При витягуванні результатів обробки вони будуть взяті ніби з боку цього блоку" +} diff --git a/update.json b/update.json index 8cd8bedc..adc10d85 100644 --- a/update.json +++ b/update.json @@ -1,26 +1,13 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/simple-storage-network", "promos": { - "1.18.1-latest": "1.6.0", - "1.18.2-latest": "1.6.2", - "1.19-latest": "1.6.5" + "1.18.2-latest": "1.7.0", + "1.19.2-latest": "1.7.0" }, - "1.18.2": { - "1.4.1": "First port to 1.17.1 ", - "1.4.2": "Scaled down font size of item stack counts", - "1.5.0": " Ported to 1.18. Performance increase: ItemStacks are no longer repeatedly copied while doing sorting/imports/exports, reducing RAM use/CPU load. Cables can all be now water-loggable. Storage Request Table now correctly drops items from crafting grid when broken.", - "1.5.1": "Jei got released for 1.18 so enable that plugin", - "1.5.2": "Ported to 1.18.1. Fixed cables not saving settings such as filter and priority. Created italian translation #408 by maicol07 . Bugfixes for Network Collector Remote #411 #394 by Samsterious ", - "1.5.3": "Fix for latest forge", - "1.5.4": "Fix error when placing some network blocks. Updated minimum forge to 39.0.55. Developed on jei-1.18.1:9.2.1.69 so similar versions are probably fine too. Fix both remotes not syncing Sort/JEI and other settings on open/close #416 ", - "1.6.0": "[tested on forge=39.0.75; jei=9.2.1.69] Added new items Singleton Upgrade and Slowness Upgrade. Ported two items Stock Upgrade and Operation upgrade from mc1.12.2. Changed some of the default recipes to consume less redstone and quartz (see the upgrades). Removed config 'enableAutoSearchFocus', instead Auto-Focus toggle button added in GUI right-side. Fix #416 remotes not saving options settings. Fixed Network Collector Remote Void Items #414. Crafting remote no longer saves crafting grid data, drops 3x3 on close (Fixes #434 and other isses). This allows a new feature where the Crafting Remote can go into the ender chest or Curios slot and be opened by the key binding (i default). Fix #254 Import Cables stuck on not importable items. ", - "1.6.1": "Port to MC 1.18.2 by MrBysco, forge 40.0.15 and jei 9.5.0.132. Added safety checks and workarounds and a config to catch when the screen size and GUI Scale gets too small and crashes seem to come from JEI (illegal negative numbers exceptions guiTop >= 0 check)", - "1.6.2": "Fixed item-routing cache feature, meaning as items get inserted (by player or cable) it tries to group them together with previous items in the same container when possible (still same logic as 1.12.2 version). Refactor and clean up how cables connect on placement. Fix the visuals and the selection bounding box for cables sometimes not matching. Updated to latest dependencies: forge=40.1.54 jei=9.7.0.209 curios=5.0.7.1 Remove/fix slot overlap patch for remotes on very small resolutions. Fix java.lang.StackOverflowError connecting a Link Cable to a Network Exchange Interface #445 (these blocks now connect as blockstate=cable not =inventory). Optimize/remove redundant connection retries when blocks are placed. " - }, - "1.19": { - "1.6.2": "Ported but only works with forge versions 41.0.0 -> 41.0.63-ish, higher versions have errors (next build after this will run with 41.0.85+). Compiled on forge_version=41.0.62; jei_version=11.0.0.206; curios_version=5.1.0.1; patchouli_version=72", - "1.6.3": "Built on forge=41.0.98+ jei=11.0.0.222+ curios=5.1.0.4+ patchouli=74+" - ,"1.6.4":"Update to latest forge 41.1.0+ , Fixes for JEI 11.1.1.239+" - ,"1.6.5":" Merge pull request #475 from Mrbysco/trunk/1.19 Fix the keybind not being registered" + + "1.19.2": { + + "1.7.0":"Merged 1.18.2-1.7.0. Compatible with jei==11.4+, forge=43+. Community Pull Request Contributions: Merge pull request #492 from IIpragmaII/trunk/1.18 @IIpragmaII @VasurTrekkson Improved performance for export node. fix priority german translation @lightlike . Fixed recipes not showing when pressing the JEI recipe key @Demerso. Create uk_ua.json @SKZGx . " + } }