Compare commits

...
3 Commits
Author SHA1 Message Date
Dream Master eb9845d3a0 update+bs+gradle+deps 2026-06-12 16:36:04 +02:00
7a61bb9dee Add automation to EIO Enchanter (basically a copy-paste from my other two PR's) (#227)
Co-authored-by: koolkrafter5 <[email protected]>
Co-authored-by: Martin Robertz <[email protected]>
2026-06-12 15:45:50 +02:00
DanandMartin Robertz ed24e1e1f0 divided rocket entity from overworld to dimensions specific (#222)
Co-authored-by: Martin Robertz <[email protected]>
2026-06-07 16:09:19 +02:00
12 changed files with 211 additions and 55 deletions

No files matched your search

+19 -18
View File
@@ -1,26 +1,26 @@
// Add your dependencies here
dependencies {
api('com.github.GTNewHorizons:EnderCore:0.5.7:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:ForestryMC:4.11.4:dev')
compileOnly('com.github.GTNewHorizons:NotEnoughItems:2.8.60-GTNH:dev')
api("com.github.GTNewHorizons:GTNHLib:0.9.10:dev")
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.55:dev')
api('com.github.GTNewHorizons:EnderCore:0.5.14:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:ForestryMC:4.11.26:dev')
compileOnly('com.github.GTNewHorizons:NotEnoughItems:2.8.102-GTNH:dev')
api("com.github.GTNewHorizons:GTNHLib:0.11.14:dev")
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.60: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')
api("com.github.GTNewHorizons:TinkersConstruct:1.14.27-GTNH:dev")
api("com.github.GTNewHorizons:TinkersConstruct:1.14.91-GTNH:dev")
devOnlyNonPublishable('com.github.GTNewHorizons:waila:1.19.22:dev') {transitive = false}
devOnlyNonPublishable('com.github.GTNewHorizons:waila:1.19.30:dev') {transitive = false}
runtimeOnlyNonPublishable('com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev') {transitive = false}
compileOnly("com.github.GTNewHorizons:Backhand:1.8.4:dev") { transitive = false }
compileOnly('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-812-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Baubles-Expanded:2.2.6-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.576:dev') {transitive = false}
compileOnly("com.github.GTNewHorizons:ModularUI2:2.3.37-1.7.10:dev") {transitive = false}
compileOnly('com.github.GTNewHorizons:Railcraft:9.17.17:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:StorageDrawers:2.2.9-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Chisel:2.17.14-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:OpenComputers:1.12.16-GTNH:api') {transitive = false}
compileOnly("com.github.GTNewHorizons:Backhand:1.8.10:dev") { transitive = false }
compileOnly('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-981-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.600:dev') {transitive = false}
compileOnly("com.github.GTNewHorizons:ModularUI2:2.3.74-1.7.10:dev") {transitive = false}
compileOnly('com.github.GTNewHorizons:Railcraft:9.17.26:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:StorageDrawers:2.2.25-GTNH:api') {transitive = false}
compileOnly('com.github.GTNewHorizons:Chisel:2.17.26-GTNH:dev') {transitive = false}
compileOnly('com.github.GTNewHorizons:OpenComputers:1.12.44-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
@@ -28,6 +28,7 @@ dependencies {
compileOnly(rfg.deobf('curse.maven:mekanism-268560:2475797')) // https://www.curseforge.com/minecraft/mc-mods/mekanism/files/2475797
compileOnly(rfg.deobf('maven.modrinth:immibis-microblocks:59.1.2')) // https://modrinth.com/mod/immibis-microblocks/version/59.1.2
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-beta66a:api') {transitive = false}
compileOnly("com.github.GTNewHorizons:Hodgepodge:2.7.58:dev")
compileOnlyApi('com.github.GTNewHorizons:Angelica:2.1.36:api') {transitive = false}
compileOnly("com.github.GTNewHorizons:Hodgepodge:2.7.161:dev")
compileOnly('curse.maven:automagy-222153:2285272')
}
+10 -10
View File
@@ -1,12 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/46949723aaa20c7b64d7ecfed7207034/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d6690dfd71c4c91e08577437b5b2beb0/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3cd7045fca9a72cd9bc7d14a385e594c/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/552c7bffe0370c66410a51c55985b511/redirect
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/c2dd35c9d0aaf0ba6ad0791320f99dfc/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/e5810bd7fd1f8a586644409d395a7e55/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7b3c4877c0749019e6805bb61e421497/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d76df094a9cbbabd3b08251f9e61444a/redirect
toolchainVersion=25
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+1 -1
View File
@@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.19'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.26'
}
@@ -215,6 +215,7 @@ public class EnderIO {
public static final boolean hasGT5 = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi");
public static final boolean hasHP = Loader.isModLoaded("hodgepodge");
public static final boolean hasWailaPlugins = Loader.isModLoaded("wailaplugins");
public static final boolean hasAutomagy = Loader.isModLoaded("Automagy");
// Materials
public static ItemCapacitor itemBasicCapacitor;
@@ -5,6 +5,7 @@ import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
@@ -140,4 +141,25 @@ public class BlockEnchanter extends BlockEio implements IGuiHandler, IResourceTo
public String getUnlocalizedNameForTooltip(ItemStack itemStack) {
return getUnlocalizedName();
}
@Override
public boolean hasComparatorInputOverride() {
return true;
}
// 0, 1, 2, 3, 4, 5, 8, 12, 20, 24, 32, 36, 48, 60, 64 are 0-15 respectively
// the power values are all possible values of the second slot to make automation possible
// (it has to be able to differentiate from them all)
@Override
public int getComparatorInputOverride(World worldIn, int x, int y, int z, int side) {
if (worldIn.getTileEntity(x, y, z) instanceof IInventory inv) {
ItemStack stuff = inv.getStackInSlot(1);
int size;
return stuff == null ? 0
: (size = stuff.stackSize) < 6 ? size
: size < 40 ? size / 4 + (size < 28 ? 4 : 3)
: size < 48 ? 12 : size < 60 ? 13 : size < 64 ? 14 : 15;
}
return 0;
}
}
@@ -27,11 +27,6 @@ public class ContainerEnchanter extends ContainerEnderTileEntity<TileEnchanter>
addSlotToContainer(new Slot(te, 0, 27, 35) {
@Override
public int getSlotStackLimit() {
return 1;
}
@Override
public boolean isItemValid(ItemStack itemStack) {
return te.isItemValidForSlot(0, itemStack);
@@ -58,6 +53,11 @@ public class ContainerEnchanter extends ContainerEnderTileEntity<TileEnchanter>
addSlotToContainer(new Slot(te, 2, 134, 35) {
@Override
public ItemStack decrStackSize(int amt) {
return te.decrStackSize(2, amt, false);
}
@Override
public int getSlotStackLimit() {
return 1;
@@ -81,18 +81,19 @@ public class ContainerEnchanter extends ContainerEnderTileEntity<TileEnchanter>
|| enchData.enchantmentLevel >= curStack.stackSize) {
te.setInventorySlotContents(1, (ItemStack) null);
} else {
curStack = curStack.copy();
curStack.stackSize -= recipe.getItemsPerLevel() * enchData.enchantmentLevel;
if (curStack.stackSize > 0) {
te.setInventorySlotContents(1, curStack);
} else {
if (curStack.stackSize <= 0) {
te.setInventorySlotContents(1, null);
}
te.markDirty();
}
te.setInventorySlotContents(0, (ItemStack) null);
curStack = te.getStackInSlot(0);
if (curStack == null || curStack.stackSize <= 1) te.setInventorySlotContents(0, null);
else {
curStack.stackSize -= 1;
te.setInventorySlotContents(0, curStack);
}
if (!te.getWorldObj().isRemote) {
te.getWorldObj().playAuxSFX(1021, te.xCoord, te.yCoord, te.zCoord, 0);
}
@@ -1,5 +1,9 @@
package crazypants.enderio.machine.enchanter;
import static crazypants.enderio.EnderIO.hasAutomagy;
import java.util.ArrayList;
import net.minecraft.enchantment.EnchantmentData;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
@@ -9,13 +13,20 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.ForgeDirection;
import com.gtnewhorizon.gtnhlib.geometry.CubeIterator;
import crazypants.enderio.ModObject;
import crazypants.enderio.TileEntityEio;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.obelisk.xp.TileExperienceObelisk;
import crazypants.enderio.xp.ExperienceContainer;
import crazypants.enderio.xp.XpUtil;
import tuhljin.automagy.tiles.TileEntityJarXP;
public class TileEnchanter extends TileEntityEio implements ISidedInventory {
private final ItemStack[] inv = new ItemStack[3];
private byte[] stacksizes = new byte[2];
private short facing = (short) ForgeDirection.NORTH.ordinal();
@@ -27,6 +38,19 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
return facing;
}
// The *ACTUAL* updateEntity and canUpdate are final in TileEntityEnder. Great.
@Override
protected void doUpdate() {
if (!shouldUpdate_()) return;
if (inv[0].stackSize != stacksizes[0] || inv[1].stackSize != stacksizes[1]) updateOut();
}
// @Override
public boolean shouldUpdate_() {
return inv[0] != null && inv[1] != null;
}
@Override
protected void writeCustomNBT(NBTTagCompound root) {
NBTTagList itemList = new NBTTagList();
@@ -39,6 +63,7 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
}
}
root.setTag("Items", itemList);
root.setByteArray("SizeCache", stacksizes);
root.setShort("facing", facing);
}
@@ -54,6 +79,8 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
}
}
}
stacksizes = root.getByteArray("SizeCache");
if (stacksizes == null || stacksizes.length < 2) stacksizes = new byte[2];
facing = root.getShort("facing");
}
@@ -77,6 +104,10 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
@Override
public ItemStack decrStackSize(int slot, int amount) {
return decrStackSize(slot, amount, true);
}
public ItemStack decrStackSize(int slot, int amount, boolean auto) {
if (amount <= 0 || slot < 0 || slot >= inv.length || inv[slot] == null) {
return null;
}
@@ -84,8 +115,10 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
if (fromStack == null) {
return null;
}
if (slot == 2 && auto && checkAndDrainXP(Math.min(amount, fromStack.stackSize))) return null;
if (fromStack.stackSize <= amount) {
inv[slot] = null;
updateOut();
return fromStack;
}
ItemStack result = new ItemStack(fromStack.getItem(), amount, fromStack.getItemDamage());
@@ -93,9 +126,95 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
result.stackTagCompound = (NBTTagCompound) fromStack.stackTagCompound.copy();
}
fromStack.stackSize -= amount;
updateOut();
return result;
}
// part of the next method
public boolean absorbXP(int amt) {
if (inv[2] == null || amt <= 0 || inv[2].stackSize < amt) return true;
int LV = getCurrentEnchantmentCost();
if (LV == 0) return false;
int xpCost = XpUtil.getExperienceForLevel(LV * amt);
int xp;
absorb: {
ArrayList<ExperienceContainer> obelisksToEmpty = new ArrayList<>();
if (true) {
CubeIterator iter = new CubeIterator(8);
while (iter.hasNext()) {
iter.next();
if (worldObj.getTileEntity(
iter.n + xCoord,
iter.l + yCoord,
iter.m + zCoord) instanceof TileExperienceObelisk obelisk) {
ExperienceContainer cont = obelisk.getContainer();
xp = cont.getExperienceTotal();
if (xp >= xpCost) {
if (!worldObj.isRemote) {
obelisksToEmpty.forEach(o -> o.drain(null, Integer.MAX_VALUE, true));
cont.drain(null, Integer.MAX_VALUE, true);
cont.addExperience(Math.max(0, xp - xpCost));
}
return false;
}
xpCost -= xp;
obelisksToEmpty.add(cont);
}
}
}
if (hasAutomagy) {
ArrayList<TileEntityJarXP> jarsToEmpty = new ArrayList<>();
CubeIterator iter = new CubeIterator(8);
while (iter.hasNext()) {
iter.next();
if (worldObj.getTileEntity(
iter.n + xCoord,
iter.l + yCoord,
iter.m + zCoord) instanceof TileEntityJarXP jar) {
xp = jar.getXP();
if (xp >= xpCost) {
if (!worldObj.isRemote) {
obelisksToEmpty.forEach(o -> o.drain(null, Integer.MAX_VALUE, true));
jarsToEmpty.forEach(j -> j.setXP(0));
jar.setXP(xp - xpCost);
}
return false;
}
xpCost -= xp;
jarsToEmpty.add(jar);
}
}
}
return true;
}
}
// checks AND drains XP; returns true if xp is NOT sufficient
// also removes the items from the other two slots when automation does the recipe
public boolean checkAndDrainXP(int amt) {
if (absorbXP(amt)) return true;
EnchantmentData enchData = getCurrentEnchantmentData();
EnchanterRecipe recipe = getCurrentEnchantmentRecipe();
ItemStack curStack = inv[1];
if (recipe == null || enchData == null || curStack == null || enchData.enchantmentLevel >= curStack.stackSize) {
inv[1] = null;
} else {
curStack = curStack.copy();
curStack.stackSize -= recipe.getItemsPerLevel() * enchData.enchantmentLevel;
inv[1] = curStack.stackSize > 0 ? curStack : null;
markDirty();
}
curStack = inv[0];
if (curStack == null || curStack.stackSize <= 1) inv[0] = null;
else inv[0].stackSize -= 1;
if (!worldObj.isRemote) {
worldObj.playSoundEffect(xCoord + 0.5d, yCoord + 0.5d, zCoord + 0.5d, "random.anvil_land", 0.2f, 1.0f);
}
return false;
}
@Override
public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
return null;
@@ -111,6 +230,20 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
if (contents != null && contents.stackSize > getInventoryStackLimit()) {
contents.stackSize = getInventoryStackLimit();
}
updateOut();
}
public void updateOut() {
ItemStack output = null;
EnchantmentData enchantment = getCurrentEnchantmentData();
if (enchantment != null) {
output = new ItemStack(Items.enchanted_book);
Items.enchanted_book.addEnchantment(output, enchantment);
}
setOutput(output);
if (inv[0] != null) stacksizes[0] = (byte) inv[0].stackSize;
if (inv[1] != null) stacksizes[1] = (byte) inv[1].stackSize;
}
@Override
@@ -226,7 +359,7 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
return getEnchantmentCost(getCurrentEnchantmentRecipe());
}
private int getEnchantmentCost(EnchanterRecipe currentEnchantment) {
public int getEnchantmentCost(EnchanterRecipe currentEnchantment) {
ItemStack item = inv[1];
if (item == null) {
return 0;
@@ -256,17 +389,17 @@ public class TileEnchanter extends TileEntityEio implements ISidedInventory {
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
return new int[0];
public int[] getAccessibleSlotsFromSide(int side) {
return side == 0 ? new int[] { 2 } : new int[] { 0, 1 };
}
@Override
public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
return false;
return true;
}
@Override
public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
return false;
return true;
}
}
@@ -3,10 +3,8 @@ package crazypants.enderio.machine.obelisk.weather;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFireworkSparkFX;
import net.minecraft.entity.item.EntityFireworkRocket;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import cpw.mods.fml.relauncher.ReflectionHelper;
import cpw.mods.fml.relauncher.Side;
@@ -53,12 +51,9 @@ public class EntityWeatherRocket extends EntityFireworkRocket {
public void setDead() {
super.setDead();
WeatherTask task = WeatherTask.values()[getDataWatcher().getWatchableObjectInt(DATA_ID)];
MinecraftServer server = MinecraftServer.getServer();
if (server != null && server.worldServers.length > 0) {
WorldServer worldserver = server.worldServers[0];
task.complete(worldserver);
if (!worldObj.isRemote) {
WeatherTask task = WeatherTask.values()[getDataWatcher().getWatchableObjectInt(DATA_ID)];
task.complete(worldObj);
}
}
@@ -523,6 +523,9 @@ tile.blockEnchanter.name=Enchanter
tile.blockEnchanter.tooltip.detailed.line1=Uses XP to combine items
tile.blockEnchanter.tooltip.detailed.line2=and a book and quill to
tile.blockEnchanter.tooltip.detailed.line3=created enchanted books
tile.blockEnchanter.tooltip.detailed.line4=Outputs a comparator signal
tile.blockEnchanter.tooltip.detailed.line5=based on the second slot's
tile.blockEnchanter.tooltip.detailed.line6=count, and works with hoppers
tile.blockCombustionGenerator.name=Combustion Generator
tile.blockCombustionGenerator.tooltip.detailed.line1=Burns liquid fuel to generate power