Compare commits

..
9 Commits
Author SHA1 Message Date
Martin Robertz 95daa9b035 update deps 2023-12-20 20:21:36 +01:00
Under f249fd2973 Add Config to allow servers to re-enable support for client-side 'hacks' like Staff Of Traveling Keybind mod. (#142)
* Update Config.java

Adding config to allow not validating travel staff packets.

* Update TravelController.java

Disable validation if server config deems it so.

* spotlessApply fix

* Wrong ordering and spotlessApply
2023-12-20 20:06:38 +01:00
9f3f8243f9 Limited Item Filter (#143)
* Limited Item Filter

* simplify inverted limit

Co-authored-by: Alexander Anishin <[email protected]>

* Update src/main/java/crazypants/enderio/conduit/item/filter/ItemFilterLimited.java

Co-authored-by: Alexander Anishin <[email protected]>

* Update src/main/java/crazypants/enderio/conduit/item/filter/ItemFilterLimited.java

Co-authored-by: Alexander Anishin <[email protected]>

* Update ItemFilterLimited.java

---------

Co-authored-by: Alexander Anishin <[email protected]>
Co-authored-by: Martin Robertz <[email protected]>
2023-12-20 19:50:55 +01:00
Martin Robertz 23a5484ee8 update deps 2023-12-13 15:38:04 +01:00
Bears Dot Zone 4b5837cac2 Fix an edge case pertaining to freshly crafted tanks (#141)
* Update dependencies

* Replace faulty dummy object logic with object creation

* Remove logic that is exiting a function erroneously
2023-12-13 15:32:56 +01:00
Spacebuilder2020andMartin Robertz 1251427388 Fix NBT Match where tag is empty but exists (#138)
* Fix NBT Match where tag is empty but exists

* Apply Splotless

* update deps

* update gradle + bs

---------

Co-authored-by: Martin Robertz <[email protected]>
2023-12-13 09:40:48 +01:00
ghostflyby 3e7d69f460 Open conduit connection GUI with more wrenches (#139) 2023-11-25 16:02:12 +08:00
Martin Robertz 88725a144d update deps 2023-11-16 13:59:12 +01:00
Pelotrio 123f22f20e Add unload event handling to ClientNetworkManager (#137)
Added a new method `onWorldUnload` to `ClientNetworkManager` to destroy and clear any network instances when the world event `Unload` is triggered. The addition of this event handler was necessary to prevent the possibility of any network instances persisting on the client side beyond the World lifetime, thus potentially causing memory leaks.
2023-11-16 15:42:32 +03:00
22 changed files with 640 additions and 60 deletions

No files matched your search

+9 -22
View File
@@ -1,4 +1,4 @@
//version: 1699290261
//version: 1702141377
/*
DO NOT CHANGE THIS FILE!
Also, you may replace this file at any time if there is an update available.
@@ -28,27 +28,12 @@ import java.util.concurrent.TimeUnit
buildscript {
repositories {
mavenCentral()
maven {
name 'forge'
url 'https://maven.minecraftforge.net'
}
maven {
// GTNH RetroFuturaGradle and ASM Fork
name "GTNH Maven"
url "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
allowInsecureProtocol = true
}
maven {
name 'sonatype'
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
maven {
name 'Scala CI dependencies'
url 'https://repo1.maven.org/maven2/'
}
mavenLocal()
}
}
@@ -69,7 +54,7 @@ plugins {
id 'com.diffplug.spotless' version '6.13.0' apply false // 6.13.0 is the last jvm8 supporting version
id 'com.modrinth.minotaur' version '2.+' apply false
id 'com.matthewprenger.cursegradle' version '1.4.0' apply false
id 'com.gtnewhorizons.retrofuturagradle' version '1.3.24'
id 'com.gtnewhorizons.retrofuturagradle' version '1.3.26'
}
print("You might want to check out './gradlew :faq' if your build fails.\n")
@@ -302,7 +287,7 @@ if (apiPackage) {
}
if (accessTransformersFile) {
for (atFile in accessTransformersFile.split(",")) {
for (atFile in accessTransformersFile.split(" ")) {
String targetFile = "src/main/resources/META-INF/" + atFile.trim()
if (!getFile(targetFile).exists()) {
throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile)
@@ -628,7 +613,7 @@ repositories {
}
maven {
name = "ic2"
url = getURL("https://maven.ic2.player.to/", "https://maven2.ic2.player.to/")
url = getURL("https://maven2.ic2.player.to/", "https://maven.ic2.player.to/")
content {
includeGroup "net.industrial-craft"
}
@@ -687,6 +672,8 @@ configurations.all {
substitute module('com.github.GTNewHorizons:SpongePoweredMixin') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods")
substitute module('com.github.GTNewHorizons:SpongeMixins') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods")
substitute module('io.github.legacymoddingmc:unimixins') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Our previous unimixins upload was missing the dev classifier")
substitute module('org.scala-lang:scala-library:2.11.1') using module('org.scala-lang:scala-library:2.11.5') because('To allow mixing with Java 8 targets')
}
}
@@ -793,12 +780,12 @@ ext.java17PatchDependenciesCfg = configurations.create("java17PatchDependencies"
}
dependencies {
def lwjgl3ifyVersion = '1.5.1'
def lwjgl3ifyVersion = '1.5.7'
if (modId != 'lwjgl3ify') {
java17Dependencies("com.github.GTNewHorizons:lwjgl3ify:${lwjgl3ifyVersion}")
}
if (modId != 'hodgepodge') {
java17Dependencies('com.github.GTNewHorizons:Hodgepodge:2.3.17')
java17Dependencies('com.github.GTNewHorizons:Hodgepodge:2.3.35')
}
java17PatchDependencies("com.github.GTNewHorizons:lwjgl3ify:${lwjgl3ifyVersion}:forgePatches") {transitive = false}
@@ -1310,7 +1297,7 @@ def addCurseForgeRelation(String type, String name) {
// Updating
def buildscriptGradleVersion = "8.2.1"
def buildscriptGradleVersion = "8.5"
tasks.named('wrapper', Wrapper).configure {
gradleVersion = buildscriptGradleVersion
+12 -12
View File
@@ -1,22 +1,22 @@
// Add your dependencies here
dependencies {
api('com.github.GTNewHorizons:EnderCore:0.2.18:dev')
implementation('com.github.GTNewHorizons:ForestryMC:4.6.14:dev')
implementation('com.github.GTNewHorizons:NotEnoughItems:2.4.12-GTNH:dev')
api('com.github.GTNewHorizons:EnderCore:0.3.0:dev')
implementation('com.github.GTNewHorizons:ForestryMC:4.7.0:dev')
implementation('com.github.GTNewHorizons:NotEnoughItems:2.4.13-GTNH:dev')
implementation("com.github.GTNewHorizons:GTNHLib:0.0.13:dev")
api('com.github.GTNewHorizons:BuildCraft:7.1.36:dev')
api('com.github.GTNewHorizons:BuildCraft:7.1.38:dev')
api('curse.maven:cofh-lib-220333:2388748') // https://www.curseforge.com/minecraft/mc-mods/cofh-lib/files/2388748
shadowImplementation('cglib:cglib-nodep:3.3.0')
compileOnly('com.github.GTNewHorizons:waila:1.6.2:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-280-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Baubles:1.0.1.16:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.44.77:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:Railcraft:9.15.1:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:StorageDrawers:1.12.1-GTNH:api') {transitive = false}
implementation('com.github.GTNewHorizons:Chisel:2.12.0-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:OpenComputers:1.9.19-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:waila:1.6.5:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-304-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Baubles:1.0.3:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.45.03:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:Railcraft:9.15.3:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:StorageDrawers:1.12.2-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Chisel:2.12.3-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:OpenComputers:1.10.0-GTNH:api') {transitive = false}
compileOnly('curse.maven:minefactory-reloaded-66672:2366150') // https://www.curseforge.com/minecraft/mc-mods/minefactory-reloaded/files/2366150
compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev')
compileOnly('curse.maven:ee3-65509:2305023') // https://www.curseforge.com/minecraft/mc-mods/ee3/files/2305023
Binary file not shown.
+2 -1
View File
@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+4 -1
View File
@@ -130,10 +130,13 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
@@ -62,6 +62,7 @@ import crazypants.enderio.conduit.item.ItemItemConduit;
import crazypants.enderio.conduit.item.filter.ItemBasicItemFilter;
import crazypants.enderio.conduit.item.filter.ItemBigItemFilter;
import crazypants.enderio.conduit.item.filter.ItemExistingItemFilter;
import crazypants.enderio.conduit.item.filter.ItemLimitedItemFilter;
import crazypants.enderio.conduit.item.filter.ItemModItemFilter;
import crazypants.enderio.conduit.item.filter.ItemPowerItemFilter;
import crazypants.enderio.conduit.liquid.ItemLiquidConduit;
@@ -264,6 +265,7 @@ public class EnderIO {
public static ItemBasicItemFilter itemBasicFilterUpgrade;
public static ItemBigItemFilter itemBigFilterUpgrade;
public static ItemExistingItemFilter itemExistingItemFilter;
public static ItemLimitedItemFilter itemLimitedItemFilter;
public static ItemModItemFilter itemModItemFilter;
public static ItemPowerItemFilter itemPowerItemFilter;
public static ItemExtractSpeedUpgrade itemExtractSpeedUpgrade;
@@ -469,6 +471,7 @@ public class EnderIO {
itemBasicFilterUpgrade = ItemBasicItemFilter.create();
itemBigFilterUpgrade = ItemBigItemFilter.create();
itemExistingItemFilter = ItemExistingItemFilter.create();
itemLimitedItemFilter = ItemLimitedItemFilter.create();
itemModItemFilter = ItemModItemFilter.create();
itemPowerItemFilter = ItemPowerItemFilter.create();
itemExtractSpeedUpgrade = ItemExtractSpeedUpgrade.create();
@@ -18,6 +18,7 @@ public enum ModObject {
itemBasicFilterUpgrade,
itemBigFilterUpgrade,
itemExistingItemFilter,
itemLimitedItemFilter,
itemModItemFilter,
itemPowerItemFilter,
itemExtractSpeedUpgrade,
@@ -641,8 +641,8 @@ public class BlockConduitBundle extends BlockEio
@Override
public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
ItemStack equipped = player.getCurrentEquippedItem();
if (!player.isSneaking() || equipped == null || equipped.getItem() != EnderIO.itemYetaWench) {
ITool tool = ToolUtil.getEquippedTool(player);
if (!player.isSneaking() || tool == null || !tool.canUse(player.getCurrentEquippedItem(), player, x, y, z)) {
return;
}
ConduitUtil.openConduitGui(world, x, y, z, player);
@@ -601,6 +601,9 @@ public class ConduitRecipes {
'f',
advFilter);
ItemStack limitedFilter = new ItemStack(EnderIO.itemLimitedItemFilter, 1, 0);
addShaped(limitedFilter, " ", "cfc", " ", 'c', new ItemStack(Items.comparator, 1, 0), 'f', advFilter);
ItemStack powerFilt = new ItemStack(EnderIO.itemPowerItemFilter);
addShaped(powerFilt, " p ", "pcp", " p ", 'p', Items.paper, 'c', EnderIO.itemConduitProbe);
@@ -0,0 +1,202 @@
package crazypants.enderio.conduit.gui.item;
import net.minecraft.client.gui.GuiButton;
import org.lwjgl.opengl.GL11;
import com.enderio.core.client.gui.button.CycleButton;
import com.enderio.core.client.gui.button.IconButton;
import com.enderio.core.client.gui.button.ToggleButton;
import crazypants.enderio.EnderIO;
import crazypants.enderio.conduit.gui.GuiExternalConnection;
import crazypants.enderio.conduit.item.filter.FuzzyMode;
import crazypants.enderio.conduit.item.filter.ItemFilter;
import crazypants.enderio.gui.GuiContainerBaseEIO;
import crazypants.enderio.gui.IconEIO;
public class LimitedItemFilterGui implements IItemFilterGui {
private static final int ID_WHITELIST = GuiExternalConnection.nextButtonId();
private static final int ID_NBT = GuiExternalConnection.nextButtonId();
private static final int ID_META = GuiExternalConnection.nextButtonId();
private static final int ID_ORE_DICT = GuiExternalConnection.nextButtonId();
private static final int ID_STICKY = GuiExternalConnection.nextButtonId();
private static final int ID_FUZZY = GuiExternalConnection.nextButtonId();
private final GuiContainerBaseEIO gui;
private final ToggleButton useMetaB;
private final ToggleButton useNbtB;
private final IconButton whiteListB;
private final ToggleButton useOreDictB;
private final ToggleButton stickyB;
private final CycleButton<FuzzyMode> fuzzyB;
private final IItemFilterContainer filterContainer;
private final ItemFilter filter;
private int buttonIdOffset;
private int xOffset;
private int yOffset;
final boolean isStickyModeAvailable;
private boolean isInput;
public LimitedItemFilterGui(GuiContainerBaseEIO gui, IItemFilterContainer filterContainer,
boolean isStickyModeAvailable, boolean isInput) {
this(gui, filterContainer, isStickyModeAvailable, isInput, isInput ? 104 : 6, 96, isInput ? 0 : 256);
}
public LimitedItemFilterGui(GuiContainerBaseEIO gui, IItemFilterContainer filterContainer,
boolean isStickyModeAvailable, boolean isInput, int xOffset, int yOffset, int buttonIdOffset) {
this.gui = gui;
this.isStickyModeAvailable = isStickyModeAvailable;
this.filterContainer = filterContainer;
this.xOffset = xOffset;
this.yOffset = yOffset;
this.buttonIdOffset = buttonIdOffset;
this.isInput = isInput;
filter = filterContainer.getItemFilter();
int butLeft = xOffset;
int x = butLeft;
int y = yOffset + 40;
whiteListB = new IconButton(gui, ID_WHITELIST + buttonIdOffset, x, y, IconEIO.FILTER_WHITELIST);
whiteListB.setToolTip(getWhitelistTooltips(false));
x += 16;
useMetaB = new ToggleButton(gui, ID_META + buttonIdOffset, x, y, IconEIO.FILTER_META_OFF, IconEIO.FILTER_META);
useMetaB.setSelectedToolTip(EnderIO.lang.localize("gui.conduit.item.matchMetaData"));
useMetaB.setUnselectedToolTip(EnderIO.lang.localize("gui.conduit.item.ignoreMetaData"));
useMetaB.setPaintSelectedBorder(false);
x += 16;
stickyB = new ToggleButton(
gui,
ID_STICKY + buttonIdOffset,
x,
y,
IconEIO.FILTER_STICKY_OFF,
IconEIO.FILTER_STICKY);
stickyB.setSelectedToolTip(EnderIO.lang.localizeList("gui.conduit.item.stickyEnabled"));
stickyB.setUnselectedToolTip(EnderIO.lang.localize("gui.conduit.item.stickyDisbaled"));
stickyB.setPaintSelectedBorder(false);
if (isStickyModeAvailable) x += 16;
useOreDictB = new ToggleButton(
gui,
ID_ORE_DICT + buttonIdOffset,
x,
y,
IconEIO.FILTER_ORE_DICT_OFF,
IconEIO.FILTER_ORE_DICT);
useOreDictB.setSelectedToolTip(EnderIO.lang.localize("gui.conduit.item.oreDicEnabled"));
useOreDictB.setUnselectedToolTip(EnderIO.lang.localize("gui.conduit.item.oreDicDisabled"));
useOreDictB.setPaintSelectedBorder(false);
x += 16;
useNbtB = new ToggleButton(gui, ID_NBT + buttonIdOffset, x, y, IconEIO.FILTER_NBT_OFF, IconEIO.FILTER_NBT);
useNbtB.setSelectedToolTip(EnderIO.lang.localize("gui.conduit.item.matchNBT"));
useNbtB.setUnselectedToolTip(EnderIO.lang.localize("gui.conduit.item.ignoreNBT"));
useNbtB.setPaintSelectedBorder(false);
x += 16;
fuzzyB = new CycleButton(gui, ID_FUZZY + buttonIdOffset, x, y, FuzzyMode.class);
}
public void createFilterSlots() {
filter.createGhostSlots(gui.getGhostSlots(), xOffset + 1, yOffset + 1, new Runnable() {
@Override
public void run() {
sendFilterChange();
}
});
}
@Override
public void mouseClicked(int x, int y, int par3) {}
@Override
public void updateButtons() {
ItemFilter activeFilter = filter;
useNbtB.onGuiInit();
useNbtB.setSelected(activeFilter.isMatchNBT());
useOreDictB.onGuiInit();
useOreDictB.setSelected(activeFilter.isUseOreDict());
if (isStickyModeAvailable) {
stickyB.onGuiInit();
stickyB.setSelected(activeFilter.isSticky());
}
fuzzyB.onGuiInit();
fuzzyB.setMode(activeFilter.getFuzzyMode());
useMetaB.onGuiInit();
useMetaB.setSelected(activeFilter.isMatchMeta());
}
@Override
public void actionPerformed(GuiButton guiButton) {
if (guiButton.id == ID_META + buttonIdOffset) {
filter.setMatchMeta(useMetaB.isSelected());
sendFilterChange();
} else if (guiButton.id == ID_NBT + buttonIdOffset) {
filter.setMatchNBT(useNbtB.isSelected());
sendFilterChange();
} else if (guiButton.id == ID_STICKY + buttonIdOffset) {
filter.setSticky(stickyB.isSelected());
sendFilterChange();
} else if (guiButton.id == ID_ORE_DICT + buttonIdOffset) {
filter.setUseOreDict(useOreDictB.isSelected());
sendFilterChange();
} else if (guiButton.id == ID_FUZZY + buttonIdOffset) {
filter.setFuzzyMode(fuzzyB.getMode());
sendFilterChange();
} else if (guiButton.id == ID_WHITELIST + buttonIdOffset) {
filter.setBlacklist(!filter.isBlacklist());
sendFilterChange();
}
}
private void sendFilterChange() {
updateButtons();
filterContainer.onFilterChanged();
}
@Override
public void deactivate() {
useNbtB.detach();
useMetaB.detach();
useOreDictB.detach();
whiteListB.detach();
stickyB.detach();
fuzzyB.detach();
}
@Override
public void renderCustomOptions(int top, float par1, int par2, int par3) {
GL11.glColor3f(1, 1, 1);
gui.bindGuiTexture(1);
gui.drawTexturedModalRect(gui.getGuiLeft() + xOffset, gui.getGuiTop() + yOffset, 0, 238, 18 * 5, 18);
gui.drawTexturedModalRect(gui.getGuiLeft() + xOffset, gui.getGuiTop() + yOffset + 20, 0, 238, 18 * 5, 18);
}
private String[] getWhitelistTooltips(boolean isBlacklist) {
if (isBlacklist) {
return new String[] { EnderIO.lang.localize("gui.conduit.item.blacklist"),
EnderIO.lang.localize("gui.conduit.item.blacklist.tooltip.0"),
EnderIO.lang.localize("gui.conduit.item.blacklist.tooltip.1") };
} else {
return new String[] { EnderIO.lang.localize("gui.conduit.item.whitelist"),
EnderIO.lang.localize("gui.conduit.item.whitelist.tooltip.0"),
EnderIO.lang.localize("gui.conduit.item.whitelist.tooltip.1") };
}
}
}
@@ -22,6 +22,7 @@ import com.enderio.core.common.util.RoundRobinIterator;
import crazypants.enderio.conduit.ConnectionMode;
import crazypants.enderio.conduit.item.filter.IItemFilter;
import crazypants.enderio.conduit.item.filter.ItemFilterLimited;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.invpanel.TileInventoryPanel;
@@ -155,6 +156,7 @@ public class NetworkedInventory {
int numSlots = slotIndices.length;
ItemStack extractItem = null;
int maxExtracted = con.getMaximumExtracted(conDir);
final IItemFilter filter = con.getInputFilter(conDir);
int slot = -1;
int slotChecksPerTick = Math.min(numSlots, ItemConduitNetwork.MAX_SLOT_CHECK_PER_TICK);
@@ -162,12 +164,23 @@ public class NetworkedInventory {
int index = nextSlot(numSlots);
slot = slotIndices[index];
ItemStack item = getInventory().getStackInSlot(slot);
if (canExtractItem(item)) {
extractItem = item.copy();
if (getInventory().canExtractItem(slot, extractItem, inventorySide)) {
if (doTransfer(extractItem, slot, maxExtracted)) {
setNextStartingSlot(slot);
return true;
if (item != null) {
if (filter != null && filter.isLimited()) {
final int count = ((ItemFilterLimited) filter).getInsertLimitInv(getInventory(), item);
if (count <= 0) {
continue;
} else if (count < item.stackSize) {
item = item.copy();
item.stackSize = count;
}
}
if (canExtractItem(item)) {
extractItem = item.copy();
if (getInventory().canExtractItem(slot, extractItem, inventorySide)) {
if (doTransfer(extractItem, slot, maxExtracted)) {
setNextStartingSlot(slot);
return true;
}
}
}
}
@@ -183,7 +196,11 @@ public class NetworkedInventory {
if (filter == null) {
return true;
}
return filter.doesItemPassFilter(this, itemStack);
if (filter.isLimited()) {
return filter.isValid() && ((ItemFilterLimited) filter).doesItemPassFilterInv(this, itemStack);
} else {
return filter.doesItemPassFilter(this, itemStack);
}
}
private boolean doTransfer(ItemStack extractedItem, int slot, int maxExtract) {
@@ -278,7 +295,20 @@ public class NetworkedInventory {
}
IItemFilter filter = con.getOutputFilter(conDir);
if (filter != null) {
if (!filter.doesItemPassFilter(this, item)) {
if (filter.isLimited()) {
final int count = filter.getMaxCountThatCanPassFilter(item);
if (count <= 0) {
return 0;
} else {
final int maxInsert = ((ItemFilterLimited) filter).getInsertLimit(getInventory(), item);
if (maxInsert <= 0) {
return 0;
} else if (maxInsert < item.stackSize) {
item = item.copy();
item.stackSize = maxInsert;
}
}
} else if (!filter.doesItemPassFilter(this, item)) {
return 0;
}
}
@@ -41,10 +41,18 @@ public interface IItemFilter {
boolean isValid();
default boolean isLimited() {
return false;
}
boolean isSticky();
void createGhostSlots(List<GhostSlot> slots, int xOffset, int yOffset, Runnable cb);
default int getMaxCountThatCanPassFilter(ItemStack item) {
return 1;
}
int getSlotCount();
default String getUnlocalizedName() {
@@ -98,7 +98,7 @@ public class ItemFilter implements IInventory, IItemFilter {
return isBlacklist ? !allow : allow;
}
private boolean itemMatched(ItemStack item) {
protected boolean itemMatched(ItemStack item) {
if (item == null) {
return false;
}
@@ -145,7 +145,7 @@ public class ItemFilter implements IInventory, IItemFilter {
return matched;
}
private boolean isOreDicMatch(int filterItemIndex, ItemStack item) {
protected boolean isOreDicMatch(int filterItemIndex, ItemStack item) {
int[] ids1 = getCachedIds(filterItemIndex);
if (ids1 == null || ids1.length == 0) {
return false;
@@ -164,8 +164,9 @@ public class ItemFilter implements IInventory, IItemFilter {
return false;
}
private boolean isNBTMatch(ItemStack filter, ItemStack item) {
if (filter.stackTagCompound == null && item.stackTagCompound == null) return true;
protected boolean isNBTMatch(ItemStack filter, ItemStack item) {
if (filter.stackTagCompound == null && (item.stackTagCompound == null || item.stackTagCompound.hasNoTags()))
return true;
if (filter.stackTagCompound == null || item.stackTagCompound == null) return false;
if (!filter.getTagCompound().hasKey("GEN")) return filter.stackTagCompound.equals(item.stackTagCompound);
NBTTagCompound filterTag = (NBTTagCompound) filter.getTagCompound().copy();
@@ -202,7 +203,7 @@ public class ItemFilter implements IInventory, IItemFilter {
return !isItemListEmpty();
}
private boolean isItemListEmpty() {
protected boolean isItemListEmpty() {
for (ItemStack item : items) {
if (item != null) {
return false;
@@ -0,0 +1,242 @@
package crazypants.enderio.conduit.item.filter;
import java.util.List;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import com.enderio.core.client.gui.widget.GhostSlot;
import cofh.lib.util.helpers.MathHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.conduit.gui.GuiExternalConnection;
import crazypants.enderio.conduit.gui.item.IItemFilterGui;
import crazypants.enderio.conduit.gui.item.ItemConduitFilterContainer;
import crazypants.enderio.conduit.gui.item.LimitedItemFilterGui;
import crazypants.enderio.conduit.item.IItemConduit;
import crazypants.enderio.conduit.item.NetworkedInventory;
public class ItemFilterLimited extends ItemFilter {
public ItemFilterLimited() {
this(10, true);
}
public ItemFilterLimited(int numItems, boolean isAdvanced) {
super(numItems, isAdvanced);
}
@Override
public String getInventoryName() {
return "Limited Item Filter";
}
@Override
@SideOnly(Side.CLIENT)
public IItemFilterGui getGui(GuiExternalConnection gui, IItemConduit itemConduit, boolean isInput) {
ItemConduitFilterContainer cont = new ItemConduitFilterContainer(itemConduit, gui.getDir(), isInput);
LimitedItemFilterGui limitedItemFilterGui = new LimitedItemFilterGui(gui, cont, !isInput, isInput);
limitedItemFilterGui.createFilterSlots();
return limitedItemFilterGui;
}
@Override
public void createGhostSlots(List<GhostSlot> slots, int xOffset, int yOffset, Runnable cb) {
int index = 0;
int numRows = (int) (double) (items.length / 5);
for (int row = 0; row < numRows; ++row) {
for (int col = 0; col < 5; ++col) {
int x = xOffset + col * 18;
int y = yOffset + row * 20;
slots.add(new ItemFilterGhostSlot(index, x, y, cb));
index++;
}
}
}
@Override
public int getMaxCountThatCanPassFilter(ItemStack item) {
if (item == null || item.getItem() == null) {
return 0;
}
int count = 0;
for (int i = 0; i < items.length; i++) {
ItemStack invStack = items[i];
if (invStack != null && itemStackMatched(invStack, item, i)) {
count += invStack.stackSize;
}
}
return count;
}
@Override
public boolean isLimited() {
return true;
}
public int getInsertLimit(ISidedInventory inv, ItemStack item) {
if (item == null || item.getItem() == null) {
return 0;
}
int count = 0;
for (int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack invStack = inv.getStackInSlot(i);
if (invStack != null && itemStackMatched(invStack, item, i)) {
count += invStack.stackSize;
}
}
return getMaxCountThatCanPassFilter(item) - count;
}
public int getInsertLimitInv(ISidedInventory inv, ItemStack item) {
return -getInsertLimit(inv, item);
}
public boolean doesCountPassFilter(int maxCount) {
return maxCount > 0;
}
@Override
public boolean doesItemPassFilter(NetworkedInventory inv, ItemStack item) {
return isValid() && itemMatched(item) && doesCountPassFilter(getInsertLimit(inv.getInventory(), item));
}
// Filter in extract slot
public boolean doesItemPassFilterInv(NetworkedInventory inv, ItemStack item) {
return isValid() && itemMatched(item) && doesCountPassFilter(getInsertLimitInv(inv.getInventory(), item));
}
protected boolean itemStackMatched(ItemStack item, ItemStack filter, int slot) {
if (item == null) {
return false;
}
boolean checkDamage = fuzzyMode != FuzzyMode.DISABLED;
boolean damageMatched = false;
if (checkDamage && item.getItem().isDamageable()) {
damageMatched = fuzzyMode.compare(item);
}
if (isItemListEmpty()) {
if (checkDamage) {
return damageMatched;
} else {
return false;
}
}
boolean matched = false;
if (filter != null && item.getItem() == filter.getItem()) {
matched = true;
if (checkDamage && !damageMatched) {
matched = false;
} else if (matchMeta && item.getItemDamage() != filter.getItemDamage()) {
matched = false;
} else if (matchNBT && !isNBTMatch(item, filter)) {
matched = false;
}
}
if (!matched && useOreDict && isOreDicMatch(filter, item)) {
matched = true;
}
return matched;
}
public boolean isOreDicMatch(ItemStack filter, ItemStack item) {
int[] id_filter = OreDictionary.getOreIDs(filter);
if (id_filter.length == 0) {
return false;
}
int[] id_item = OreDictionary.getOreIDs(item);
if (id_item.length == 0) {
return false;
}
for (int id1 : id_filter) {
for (int id2 : id_item) {
if (id1 == id2) {
return true;
}
}
}
return false;
}
@Override
public ItemStack decrStackSize(int fromSlot, int amount) {
if ((fromSlot < 0) || (fromSlot >= items.length)) {
return null;
}
oreIds.set(fromSlot, null);
ItemStack item = items[fromSlot];
items[fromSlot] = null;
return item.splitStack(amount);
}
@Override
public String toString() {
return "Limited" + super.toString();
}
@Override
public String getUnlocalizedName() {
return "gui.limited_item_filter";
}
class ItemFilterGhostSlot extends GhostSlot {
private final int slot;
private final Runnable cb;
private final int adjustOnShift;
ItemFilterGhostSlot(int slot, int x, int y, Runnable cb) {
this.x = x;
this.y = y;
this.slot = slot;
this.cb = cb;
this.displayStdOverlay = true;
this.stackSizeLimit = 64;
this.adjustOnShift = 10;
}
@Override
public void putStack(ItemStack stack) {
if (stack != null) {
stack = stack.copy();
if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) {
if (Mouse.isButtonDown(0) || Mouse.getEventDWheel() > 0) {
if (stack.stackSize - 1 == 1) {
stack.stackSize += adjustOnShift - 2;
} else {
stack.stackSize = MathHelper
.clamp(stack.stackSize + adjustOnShift - 1, 1, stack.getMaxStackSize());
}
} else if (Mouse.isButtonDown(1) || Mouse.getEventDWheel() < 0) {
if (stack.stackSize + 1 == 1) {
stack.stackSize++;
} else {
stack.stackSize = MathHelper
.clamp(stack.stackSize - adjustOnShift + 1, 1, stack.getMaxStackSize());
}
}
}
}
items[slot] = stack;
cb.run();
}
@Override
public ItemStack getStack() {
return items[slot];
}
}
}
@@ -0,0 +1,73 @@
package crazypants.enderio.conduit.item.filter;
import java.util.List;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import com.enderio.core.api.client.gui.IResourceTooltipProvider;
import com.enderio.core.client.handlers.SpecialTooltipHandler;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIO;
import crazypants.enderio.EnderIOTab;
import crazypants.enderio.ModObject;
import crazypants.enderio.conduit.item.FilterRegister;
public class ItemLimitedItemFilter extends Item implements IItemFilterUpgrade, IResourceTooltipProvider {
public static ItemLimitedItemFilter create() {
ItemLimitedItemFilter result = new ItemLimitedItemFilter();
result.init();
return result;
}
protected ItemLimitedItemFilter() {
setCreativeTab(EnderIOTab.tabEnderIO);
setUnlocalizedName(ModObject.itemLimitedItemFilter.unlocalisedName);
setMaxDamage(0);
setMaxStackSize(64);
}
protected void init() {
GameRegistry.registerItem(this, ModObject.itemLimitedItemFilter.unlocalisedName);
}
@Override
public IItemFilter createFilterFromStack(ItemStack stack) {
IItemFilter filter = new ItemFilterLimited();
if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("filter")) {
filter.readFromNBT(stack.stackTagCompound.getCompoundTag("filter"));
}
return filter;
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister IIconRegister) {
itemIcon = IIconRegister.registerIcon("enderio:limitedItemFilter");
}
@Override
public String getUnlocalizedNameForTooltip(ItemStack stack) {
return getUnlocalizedName();
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
if (FilterRegister.isFilterSet(par1ItemStack)) {
if (SpecialTooltipHandler.showAdvancedTooltips()) {
par3List.add(EnumChatFormatting.ITALIC + EnderIO.lang.localize("itemConduitFilterUpgrade.configured"));
par3List.add(
EnumChatFormatting.ITALIC
+ EnderIO.lang.localize("itemConduitFilterUpgrade.clearConfigMethod"));
}
}
}
}
@@ -161,6 +161,7 @@ public final class Config {
public static String[] travelStaffBlinkBlackList = new String[] { "minecraft:bedrock", "Thaumcraft:blockWarded" };
public static float travelAnchorZoomScale = 0.2f;
public static boolean travelStaffSearchOptimize = true;
public static boolean validateTravelEventServerside = true;
/** The max distance for travelling to a Travel Anchor. */
public static int teleportStaffMaxDistance = 2048;
@@ -1214,6 +1215,13 @@ public final class Config {
+ "This config is experimental, so if you encounter any strange behavior, please report to GTNH developer.")
.getBoolean(travelStaffSearchOptimize);
validateTravelEventServerside = config.get(
sectionStaff.name,
"validateTravelEventServerside",
validateTravelEventServerside,
"If set to true: Server will validate if player actually can teleport. False will allow hacking, but also allows Staff of Traveling Keybind mod to work.")
.getBoolean(validateTravelEventServerside);
teleportStaffMaxDistance = config
.get(
sectionStaff.name,
@@ -489,11 +489,7 @@ public abstract class AbstractMachineEntity extends TileEntityEio
if (stack == null || stack.stackTagCompound == null) {
return;
}
NBTTagCompound root = stack.stackTagCompound;
if (!root.hasKey("eio.abstractMachine")) {
return;
}
readCommon(root);
readCommon(stack.stackTagCompound);
}
@Override
@@ -4,13 +4,20 @@ import java.util.HashMap;
import java.util.Map;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.WorldEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import crazypants.enderio.machine.capbank.TileCapBank;
public class ClientNetworkManager {
private static final ClientNetworkManager instance = new ClientNetworkManager();
static {
MinecraftForge.EVENT_BUS.register(instance);
}
public static ClientNetworkManager getInstance() {
return instance;
}
@@ -53,4 +60,12 @@ public class ClientNetworkManager {
CapBankClientNetwork network = getOrCreateNetwork(id);
network.addMember(tileCapBank);
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
if (event.world.isRemote) {
networks.forEach((id, network) -> network.destroyNetwork());
networks.clear();
}
}
}
@@ -71,14 +71,12 @@ public class BlockItemTank extends ItemBlockWithMetadata implements IAdvancedToo
EnderIO.blockTank.addDetailedEntries(itemstack, entityplayer, list, flag);
}
private static final FluidTank dummy = new SmartTank(FluidRegistry.WATER, 16000);
private FluidTank loadTank(ItemStack stack) {
if (stack.hasTagCompound()) {
FluidTank tank = TileTank.loadTank(stack.getTagCompound());
return tank != null ? tank : dummy;
return tank != null ? tank : new SmartTank(FluidRegistry.WATER, 16000);
}
return dummy;
return new SmartTank(FluidRegistry.WATER, 16000);
}
private void saveTank(ItemStack stack, FluidTank tank) {
@@ -124,6 +124,10 @@ public class TravelController {
*/
public String validatePacketTravelEvent(EntityPlayerMP toTp, int x, int y, int z, int powerUse,
boolean conserveMotion, TravelSource source) {
// If config indicates to allow for 'hacking' the travel packet, then don't do any validation.
if (!Config.validateTravelEventServerside) return null;
BlockCoord target = new BlockCoord(x, y, z);
double dist = getDistanceSquared(toTp, target);
// allow 15% overshoot to account for rounding
@@ -93,6 +93,11 @@ item.itemExistingItemFilter.tooltip.detailed.line5=content to the snapshot
enderio.item.itemExistingItemFilter.filterUpdated=New items have been added to the snapshot
enderio.item.itemExistingItemFilter.filterNotUpdated=The snapshot already covers all items in the inventory
item.itemLimitedItemFilter.name=Limited Item Filter
item.itemLimitedItemFilter.tooltip.basic.line1=Upgrade for item conduits
item.itemLimitedItemFilter.tooltip.detailed.line1=Filters items based on
item.itemLimitedItemFilter.tooltip.detailed.line2=their stack size
item.itemModItemFilter.name=Mod Item Filter
item.itemModItemFilter.tooltip.basic.line1=Upgrade for item conduits
item.itemModItemFilter.tooltip.detailed.line1=Selects only items for a specified
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB