From 55b3dc08234054752a4fb6ee8f0147c5df6982e0 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 2 Jul 2020 23:22:40 +0200 Subject: [PATCH 01/29] Removed unused class. --- .../java/appeng/container/slot/NullSlot.java | 84 ------------------- 1 file changed, 84 deletions(-) delete mode 100644 src/main/java/appeng/container/slot/NullSlot.java diff --git a/src/main/java/appeng/container/slot/NullSlot.java b/src/main/java/appeng/container/slot/NullSlot.java deleted file mode 100644 index 40a492af8..000000000 --- a/src/main/java/appeng/container/slot/NullSlot.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.container.slot; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -// FIXME seems unused -public class NullSlot extends Slot { - - public NullSlot() { - super(null, 0, 0, 0); - } - - @Override - public void onSlotChange(final ItemStack par1ItemStack, final ItemStack par2ItemStack) { - - } - - @Override - public ItemStack onTake(final PlayerEntity par1PlayerEntity, final ItemStack par2ItemStack) { - return par2ItemStack; - } - - @Override - public boolean isItemValid(final ItemStack par1ItemStack) { - return false; - } - - @Override - @Nonnull - public ItemStack getStack() { - return ItemStack.EMPTY; - } - - @Override - public void putStack(final ItemStack par1ItemStack) { - - } - - @Override - public void onSlotChanged() { - - } - - @Override - public int getSlotStackLimit() { - return 0; - } - - @Override - public ItemStack decrStackSize(final int par1) { - return ItemStack.EMPTY; - } - - @Override - public boolean canTakeStack(final PlayerEntity par1PlayerEntity) { - return false; - } - - @Override - public int getSlotIndex() { - return 0; - } -} From ef3cc8a0a00188a892f9685c4912370352413551 Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 3 Jul 2020 13:04:12 +0200 Subject: [PATCH 02/29] Enables replicator card to place multiple instances at once. (#4447) --- .../java/appeng/debug/ReplicatorCardItem.java | 108 +++++++++++++----- 1 file changed, 79 insertions(+), 29 deletions(-) diff --git a/src/main/java/appeng/debug/ReplicatorCardItem.java b/src/main/java/appeng/debug/ReplicatorCardItem.java index b3ca0a0b5..80bf41ef7 100644 --- a/src/main/java/appeng/debug/ReplicatorCardItem.java +++ b/src/main/java/appeng/debug/ReplicatorCardItem.java @@ -26,10 +26,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import net.minecraft.world.dimension.DimensionType; @@ -48,10 +50,31 @@ public class ReplicatorCardItem extends AEBaseItem { super(properties); } + @Override + public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { + if (!worldIn.isRemote()) { + final CompoundNBT tag = playerIn.getHeldItem(handIn).getOrCreateTag(); + final int replications; + + if (tag.contains("r")) { + replications = (tag.getInt("r") + 1) % 4; + } else { + replications = 0; + } + + tag.putInt("r", replications); + + playerIn.sendMessage(new StringTextComponent((replications + 1) + "³ Replications")); + } + + return super.onItemRightClick(worldIn, playerIn, handIn); + } + @Override public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { if (context.getWorld().isRemote()) { - return ActionResultType.PASS; + // Needed, otherwise client will trigger onItemRightClick also on server... + return ActionResultType.SUCCESS; } PlayerEntity player = context.getPlayer(); @@ -70,13 +93,15 @@ public class ReplicatorCardItem extends AEBaseItem { if (player.isCrouching()) { if (world.getTileEntity(pos) instanceof IGridHost) { - final CompoundNBT tag = new CompoundNBT(); + final CompoundNBT tag = player.getHeldItem(hand).getOrCreateTag(); tag.putInt("x", x); tag.putInt("y", y); tag.putInt("z", z); tag.putInt("side", side.ordinal()); tag.putInt("dimid", world.getDimension().getType().getId()); - player.getHeldItem(hand).setTag(tag); + tag.putInt("r", 0); + + this.outputMsg(player, "Set replicator source"); } else { this.outputMsg(player, "This is not a Grid Tile."); } @@ -89,56 +114,81 @@ public class ReplicatorCardItem extends AEBaseItem { final int src_side = ish.getInt("side"); final int dimid = ish.getInt("dimid"); final World src_w = world.getServer().getWorld(DimensionType.getById(dimid)); + final int replications = ish.getInt("r") + 1; final TileEntity te = src_w.getTileEntity(new BlockPos(src_x, src_y, src_z)); + if (te instanceof IGridHost) { final IGridHost gh = (IGridHost) te; final Direction sideOff = Direction.values()[src_side]; final Direction currentSideOff = side; final IGridNode n = gh.getGridNode(AEPartLocation.fromFacing(sideOff)); + if (n != null) { final IGrid g = n.getGrid(); + if (g != null) { final ISpatialCache sc = g.getCache(ISpatialCache.class); + if (sc.isValidRegion()) { final DimensionalCoord min = sc.getMin(); final DimensionalCoord max = sc.getMax(); - x += currentSideOff.getXOffset(); - y += currentSideOff.getYOffset(); - z += currentSideOff.getZOffset(); + // TODO: Why??? Places it one block up each time... + // x += currentSideOff.getXOffset(); + // y += currentSideOff.getYOffset(); + // z += currentSideOff.getZOffset(); + + final int sc_size_x = max.x - min.x; + final int sc_size_y = max.y - min.y; + final int sc_size_z = max.z - min.z; final int min_x = min.x; final int min_y = min.y; final int min_z = min.z; - final int rel_x = min.x - src_x + x; - final int rel_y = min.y - src_y + y; - final int rel_z = min.z - src_z + z; + // Invert to maintain correct sign for west/east + final int x_rot = (int) -Math.signum(MathHelper.wrapDegrees(player.rotationYaw)); + // Rotate by 90 degree, so north/south are negative/positive + final int z_rot = (int) Math.signum(MathHelper.wrapDegrees(player.rotationYaw + 90)); - final int scale_x = max.x - min.x; - final int scale_y = max.y - min.y; - final int scale_z = max.z - min.z; + // Loops for replication in each direction + for (int r_x = 0; r_x < replications; r_x++) { + for (int r_y = 0; r_y < replications; r_y++) { + for (int r_z = 0; r_z < replications; r_z++) { - for (int i = 1; i < scale_x; i++) { - for (int j = 1; j < scale_y; j++) { - for (int k = 1; k < scale_z; k++) { - final BlockPos p = new BlockPos(min_x + i, min_y + j, min_z + k); - final BlockPos d = new BlockPos(i + rel_x, j + rel_y, k + rel_z); - final BlockState state = src_w.getBlockState(p); - final Block blk = state.getBlock(); - final BlockState prev = world.getBlockState(d); + // Offset x/z by the rotation index. + // For sake of simplicity always grow upwards. + final int rel_x = min.x - src_x + x + (r_x * sc_size_x * x_rot); + final int rel_y = min.y - src_y + y + (r_y * sc_size_y); + final int rel_z = min.z - src_z + z + (r_z * sc_size_z * z_rot); - world.setBlockState(d, state); - if (blk != null && blk.hasTileEntity(state)) { - final TileEntity ote = src_w.getTileEntity(p); - final TileEntity nte = blk.createTileEntity(state, world); - final CompoundNBT data = new CompoundNBT(); - ote.write(data); - nte.read(data.copy()); - world.setTileEntity(d, nte); + // Copy a single SC instance completely + for (int i = 1; i < sc_size_x; i++) { + for (int j = 1; j < sc_size_y; j++) { + for (int k = 1; k < sc_size_z; k++) { + final BlockPos p = new BlockPos(min_x + i, min_y + j, + min_z + k); + final BlockPos d = new BlockPos(i + rel_x, j + rel_y, + k + rel_z); + + final BlockState state = src_w.getBlockState(p); + final Block blk = state.getBlock(); + final BlockState prev = world.getBlockState(d); + + world.setBlockState(d, state); + if (blk != null && blk.hasTileEntity(state)) { + final TileEntity ote = src_w.getTileEntity(p); + final TileEntity nte = blk.createTileEntity(state, world); + final CompoundNBT data = new CompoundNBT(); + ote.write(data); + nte.read(data.copy()); + world.setTileEntity(d, nte); + } + world.notifyBlockUpdate(d, prev, state, 3); + } + } } - world.notifyBlockUpdate(d, prev, state, 3); } } } From 22facb974833c1c916437fa216f15c31d491ffc7 Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 3 Jul 2020 13:56:22 +0200 Subject: [PATCH 03/29] Don't tick debug energy tileentity clientside --- src/main/java/appeng/debug/EnergyGeneratorTileEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java b/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java index 145682ea0..199afcb3a 100644 --- a/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java +++ b/src/main/java/appeng/debug/EnergyGeneratorTileEntity.java @@ -48,7 +48,7 @@ public class EnergyGeneratorTileEntity extends AEBaseTileEntity implements ITick @Override public void tick() { World world = this.getWorld(); - if (world == null) { + if (world == null || world.isRemote) { return; } From b8aa810a5f4e843815410a76f2c782ce3c7b5a25 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 3 Jul 2020 14:32:34 +0200 Subject: [PATCH 04/29] Add equals(ItemStack) to IAEItemStack contract. --- src/api/java/appeng/api/storage/data/IAEItemStack.java | 9 +++++++++ src/main/java/appeng/util/item/AEItemStack.java | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/api/java/appeng/api/storage/data/IAEItemStack.java b/src/api/java/appeng/api/storage/data/IAEItemStack.java index 0f5f9b298..0a8cf594b 100644 --- a/src/api/java/appeng/api/storage/data/IAEItemStack.java +++ b/src/api/java/appeng/api/storage/data/IAEItemStack.java @@ -106,4 +106,13 @@ public interface IAEItemStack extends IAEStack { * @return definition stack */ ItemStack getDefinition(); + + /** + * Compare this AE item stack to another item stack, but ignores + * the amount. It checks the item type, NBT and damage values. + * + * @param is An item stack + */ + boolean equals(ItemStack is); + } \ No newline at end of file diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index 1e2cfcbb5..3bcd1d7e1 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -216,11 +216,16 @@ public final class AEItemStack extends AEStack implements IAEItemS if (ia instanceof AEItemStack) { return this.isSameType((AEItemStack) ia); } else if (ia instanceof ItemStack) { - return this.isSameType((ItemStack) ia); + // this actually breaks the equals contract (being equals to unrelated classes) + return equals((ItemStack) ia); } return false; } + public boolean equals(final ItemStack is) { + return this.isSameType(is); + } + @Override public String toString() { return this.getStackSize() + "x" + this.getDefinition().getItem().getRegistryName(); From 4b3a232addb0a92bcbbf45ae28db34a3e6779d49 Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 3 Jul 2020 20:07:51 +0200 Subject: [PATCH 05/29] Fix formatting --- src/api/java/appeng/api/storage/data/IAEItemStack.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/java/appeng/api/storage/data/IAEItemStack.java b/src/api/java/appeng/api/storage/data/IAEItemStack.java index 0a8cf594b..eb676e413 100644 --- a/src/api/java/appeng/api/storage/data/IAEItemStack.java +++ b/src/api/java/appeng/api/storage/data/IAEItemStack.java @@ -108,8 +108,8 @@ public interface IAEItemStack extends IAEStack { ItemStack getDefinition(); /** - * Compare this AE item stack to another item stack, but ignores - * the amount. It checks the item type, NBT and damage values. + * Compare this AE item stack to another item stack, but ignores the amount. It + * checks the item type, NBT and damage values. * * @param is An item stack */ From bd1d9701a94f93bb09646ab01bfec812d0dff3ba Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 3 Jul 2020 20:31:41 +0200 Subject: [PATCH 06/29] Try to fail with missing assets (#4449) --- .github/workflows/branches.yml | 5 ++++- .github/workflows/master.yml | 4 ++++ .github/workflows/pull_requests.yml | 4 ++++ .github/workflows/release.yml | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/branches.yml b/.github/workflows/branches.yml index ec8a64c04..1f9cc0224 100644 --- a/.github/workflows/branches.yml +++ b/.github/workflows/branches.yml @@ -21,10 +21,13 @@ jobs: with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + - name: Validate no assets + run: test ! -d ./src/generated - name: Generate assets uses: GabrielBB/xvfb-action@v1.2 with: run: ./gradlew runData --no-daemon + - name: Validate assets + run: test -d ./src/generated - name: Build with Gradle run: ./gradlew build --no-daemon - \ No newline at end of file diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 6943a0e35..f53b0b928 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -21,9 +21,13 @@ jobs: with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + - name: Validate no assets + run: test ! -d ./src/generated - name: Generate assets uses: GabrielBB/xvfb-action@v1.2 with: run: ./gradlew runData --no-daemon + - name: Validate assets + run: test -d ./src/generated - name: Build with Gradle run: ./gradlew build --no-daemon diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml index 6eb200a4f..16847d1fc 100644 --- a/.github/workflows/pull_requests.yml +++ b/.github/workflows/pull_requests.yml @@ -21,10 +21,14 @@ jobs: with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + - name: Validate no assets + run: test ! -d ./src/generated - name: Generate assets uses: GabrielBB/xvfb-action@v1.2 with: run: ./gradlew runData --no-daemon + - name: Validate assets + run: test -d ./src/generated - name: Build with Gradle env: PR_NUMBER: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdcab17fb..4e62308a7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,10 +28,14 @@ jobs: java-version: 1.8 - name: Grant execute permission for gradlew run: chmod +x gradlew + - name: Validate no assets + run: test ! -d ./src/generated - name: Generate assets uses: GabrielBB/xvfb-action@v1.2 with: run: ./gradlew runData --no-daemon + - name: Validate assets + run: test -d ./src/generated - name: Build, sign, and publish with Gradle env: KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} From d4a1590b51f777fb84645d2e6a0d82dc26ab927c Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 3 Jul 2020 20:34:53 +0200 Subject: [PATCH 07/29] Added a blocktag for movable tile entities with spatial IO. (#4448) `#spatial/whitelist` needs to be explicitly enabled through a config value. `#spatial/blacklist` will always be consider on top of the normal blacklist. --- src/main/java/appeng/core/AEConfig.java | 10 ++++ .../registries/MovableTileRegistry.java | 51 ++++++++++++++----- .../tags/blocks/spatial/blacklist.json | 3 ++ .../tags/blocks/spatial/whitelist.json | 3 ++ 4 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/data/appliedenergistics2/tags/blocks/spatial/blacklist.json create mode 100644 src/main/resources/data/appliedenergistics2/tags/blocks/spatial/whitelist.json diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 22288bf67..444f7410e 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -106,6 +106,7 @@ public final class AEConfig { // Spatial IO/Dimension private double spatialPowerExponent; private double spatialPowerMultiplier; + private boolean spatialBlockTags; // Grindstone private float oreDoublePercentage; @@ -208,6 +209,7 @@ public final class AEConfig { this.spatialPowerMultiplier = COMMON.spatialPowerMultiplier.get(); this.spatialPowerExponent = COMMON.spatialPowerExponent.get(); + this.spatialBlockTags = COMMON.spatialBlockTags.get(); this.craftingCalculationTimePerTick = COMMON.craftingCalculationTimePerTick.get(); @@ -335,6 +337,10 @@ public final class AEConfig { return this.spatialPowerMultiplier; } + public boolean getSpatialBlockTags() { + return this.spatialBlockTags; + } + public float getOreDoublePercentage() { return this.oreDoublePercentage; } @@ -457,6 +463,7 @@ public final class AEConfig { // Spatial IO/Dimension public final ConfigValue spatialPowerExponent; public final ConfigValue spatialPowerMultiplier; + public final ConfigValue spatialBlockTags; // Grindstone public final DoubleValue oreDoublePercentage; @@ -544,6 +551,9 @@ public final class AEConfig { builder.push("spatialio"); this.spatialPowerMultiplier = builder.define("spatialPowerMultiplier", 1250.0); this.spatialPowerExponent = builder.define("spatialPowerExponent", 1.35); + this.spatialBlockTags = builder + .comment("BE CAREFUL, CAN CORRUPT YOUR WORLD! Will use #spatial/whitelist as whitelist.") + .define("spatialBlockTags", false); builder.pop(); builder.push("GrindStone"); diff --git a/src/main/java/appeng/core/features/registries/MovableTileRegistry.java b/src/main/java/appeng/core/features/registries/MovableTileRegistry.java index 579ace8c8..cce747112 100644 --- a/src/main/java/appeng/core/features/registries/MovableTileRegistry.java +++ b/src/main/java/appeng/core/features/registries/MovableTileRegistry.java @@ -19,29 +19,45 @@ package appeng.core.features.registries; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; +import java.util.IdentityHashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import net.minecraft.block.Block; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.Tag; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import appeng.api.exceptions.AppEngException; import appeng.api.movable.IMovableHandler; import appeng.api.movable.IMovableRegistry; import appeng.api.movable.IMovableTile; +import appeng.core.AEConfig; +import appeng.core.AppEng; import appeng.spatial.DefaultSpatialHandler; public class MovableTileRegistry implements IMovableRegistry { - private final HashSet blacklisted = new HashSet<>(); + private static final ResourceLocation TAG_WHITELIST = new ResourceLocation(AppEng.MOD_ID, "spatial/whitelist"); + private static final ResourceLocation TAG_BLACKLIST = new ResourceLocation(AppEng.MOD_ID, "spatial/blacklist"); - private final HashMap, IMovableHandler> Valid = new HashMap<>(); + private final Set blacklisted = new HashSet<>(); + + private final Map, IMovableHandler> valid = new IdentityHashMap<>(); private final List> test = new ArrayList<>(); private final List handlers = new ArrayList<>(); private final DefaultSpatialHandler dsh = new DefaultSpatialHandler(); - private final IMovableHandler nullHandler = new DefaultSpatialHandler(); + private final Tag blockTagWhiteList; + private final Tag blockTagBlackList; + + public MovableTileRegistry() { + this.blockTagWhiteList = BlockTags.getCollection().getOrCreate(TAG_WHITELIST); + this.blockTagBlackList = BlockTags.getCollection().getOrCreate(TAG_BLACKLIST); + } @Override public void blacklistBlock(final Block blk) { @@ -60,8 +76,8 @@ public class MovableTileRegistry implements IMovableRegistry { @Override public boolean askToMove(final TileEntity te) { - final Class myClass = te.getClass(); - IMovableHandler canMove = this.Valid.get(myClass); + final Class myClass = te.getClass(); + IMovableHandler canMove = this.valid.get(myClass); if (canMove == null) { canMove = this.testClass(myClass, te); @@ -79,7 +95,7 @@ public class MovableTileRegistry implements IMovableRegistry { return false; } - private IMovableHandler testClass(final Class myClass, final TileEntity te) { + private IMovableHandler testClass(final Class myClass, final TileEntity te) { IMovableHandler handler = null; // ask handlers... @@ -92,25 +108,32 @@ public class MovableTileRegistry implements IMovableRegistry { // if you have a handler your opted in if (handler != null) { - this.Valid.put(myClass, handler); + this.valid.put(myClass, handler); return handler; } // if your movable our opted in if (te instanceof IMovableTile) { - this.Valid.put(myClass, this.dsh); + this.valid.put(myClass, this.dsh); + return this.dsh; + } + + // if the block itself is via block tags + if (AEConfig.instance().getSpatialBlockTags() + && this.blockTagWhiteList.contains(te.getBlockState().getBlock())) { + this.valid.put(myClass, this.dsh); return this.dsh; } // if you are on the white list your opted in. for (final Class testClass : this.test) { if (testClass.isAssignableFrom(myClass)) { - this.Valid.put(myClass, this.dsh); + this.valid.put(myClass, this.dsh); return this.dsh; } } - this.Valid.put(myClass, this.nullHandler); + this.valid.put(myClass, this.nullHandler); return this.nullHandler; } @@ -129,8 +152,8 @@ public class MovableTileRegistry implements IMovableRegistry { @Override public IMovableHandler getHandler(final TileEntity te) { - final Class myClass = te.getClass(); - final IMovableHandler h = this.Valid.get(myClass); + final Class myClass = te.getClass(); + final IMovableHandler h = this.valid.get(myClass); return h == null ? this.dsh : h; } @@ -141,6 +164,6 @@ public class MovableTileRegistry implements IMovableRegistry { @Override public boolean isBlacklisted(final Block blk) { - return this.blacklisted.contains(blk); + return this.blacklisted.contains(blk) || this.blockTagBlackList.contains(blk); } } diff --git a/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/blacklist.json b/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/blacklist.json new file mode 100644 index 000000000..86dde3df2 --- /dev/null +++ b/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/blacklist.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/whitelist.json b/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/whitelist.json new file mode 100644 index 000000000..86dde3df2 --- /dev/null +++ b/src/main/resources/data/appliedenergistics2/tags/blocks/spatial/whitelist.json @@ -0,0 +1,3 @@ +{ + "values": [] +} From ebbb5b1059bb99d21e8019846343814b70b02a4b Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 5 Jul 2020 12:21:44 +0200 Subject: [PATCH 08/29] Removed unused storage dimension cap. --- .../appeng/capabilities/Capabilities.java | 9 --- .../capabilities/NullSpatialDimension.java | 63 ------------------- 2 files changed, 72 deletions(-) delete mode 100644 src/main/java/appeng/capabilities/NullSpatialDimension.java diff --git a/src/main/java/appeng/capabilities/Capabilities.java b/src/main/java/appeng/capabilities/Capabilities.java index 58a9b477b..e10b913e4 100644 --- a/src/main/java/appeng/capabilities/Capabilities.java +++ b/src/main/java/appeng/capabilities/Capabilities.java @@ -25,7 +25,6 @@ import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.energy.IEnergyStorage; -import appeng.api.storage.ISpatialDimension; import appeng.api.storage.IStorageMonitorableAccessor; /** @@ -38,8 +37,6 @@ public final class Capabilities { public static Capability STORAGE_MONITORABLE_ACCESSOR; - public static Capability SPATIAL_DIMENSION; - public static Capability FORGE_ENERGY; /** @@ -48,7 +45,6 @@ public final class Capabilities { public static void register() { CapabilityManager.INSTANCE.register(IStorageMonitorableAccessor.class, createNullStorage(), NullMENetworkAccessor::new); - CapabilityManager.INSTANCE.register(ISpatialDimension.class, createNullStorage(), NullSpatialDimension::new); } @CapabilityInject(IStorageMonitorableAccessor.class) @@ -56,11 +52,6 @@ public final class Capabilities { STORAGE_MONITORABLE_ACCESSOR = cap; } - @CapabilityInject(ISpatialDimension.class) - private static void capISpatialDimensionRegistered(Capability cap) { - SPATIAL_DIMENSION = cap; - } - @CapabilityInject(IEnergyStorage.class) private static void capIEnergyStorageRegistered(Capability cap) { FORGE_ENERGY = cap; diff --git a/src/main/java/appeng/capabilities/NullSpatialDimension.java b/src/main/java/appeng/capabilities/NullSpatialDimension.java deleted file mode 100644 index 9c5b157a4..000000000 --- a/src/main/java/appeng/capabilities/NullSpatialDimension.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.capabilities; - -import java.util.List; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.server.ServerWorld; - -import appeng.api.storage.ISpatialDimension; - -class NullSpatialDimension implements ISpatialDimension { - @Override - public DimensionType createNewCellDimension(BlockPos size) { - return null; - } - - @Override - public void deleteCellDimension(DimensionType cellStorageId) { - } - - @Override - public BlockPos getCellDimensionOrigin(DimensionType cellStorageId) { - return null; - } - - @Override - public BlockPos getCellDimensionSize(DimensionType cellDim) { - return BlockPos.ZERO; - } - - @Override - public void addCellDimensionTooltip(DimensionType cellDim, List tooltip) { - } - - @Override - public ServerWorld getWorld(DimensionType cellStorageId) { - return null; - } - - @Override - public boolean isCellDimension(DimensionType cellDimID) { - return false; - } -} From eb0e4289b35c25de39906bcab5f669912e13e900 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 5 Jul 2020 12:23:16 +0200 Subject: [PATCH 09/29] Unify the client/server-side shared itemstack registry to avoid over-dependence on the current thread when this class is used. Otherwise if a thread is not correctly detected to be part of the server or client thread groups, a shared item stack from the wrong domain is returned. --- .../appeng/util/item/AEItemStackRegistry.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/util/item/AEItemStackRegistry.java b/src/main/java/appeng/util/item/AEItemStackRegistry.java index 011aaa23e..929962da1 100644 --- a/src/main/java/appeng/util/item/AEItemStackRegistry.java +++ b/src/main/java/appeng/util/item/AEItemStackRegistry.java @@ -33,20 +33,11 @@ import net.minecraft.item.ItemStack; import appeng.util.Platform; public final class AEItemStackRegistry { - private static final WeakHashMap> SERVER_REGISTRY = new WeakHashMap<>(); - private static final WeakHashMap> CLIENT_REGISTRY = new WeakHashMap<>(); + private static final WeakHashMap> REGISTRY = new WeakHashMap<>(); private AEItemStackRegistry() { } - private static WeakHashMap> registry() { - if (Platform.isClient()) { - return CLIENT_REGISTRY; - } else { - return SERVER_REGISTRY; - } - } - static synchronized AESharedItemStack getRegisteredStack(final @Nonnull ItemStack itemStack) { if (itemStack.isEmpty()) { throw new IllegalArgumentException("stack cannot be empty"); @@ -56,7 +47,7 @@ public final class AEItemStackRegistry { itemStack.setCount(1); AESharedItemStack search = new AESharedItemStack(itemStack); - WeakReference weak = registry().get(search); + WeakReference weak = REGISTRY.get(search); AESharedItemStack ret = null; if (weak != null) { @@ -65,7 +56,7 @@ public final class AEItemStackRegistry { if (ret == null) { ret = new AESharedItemStack(itemStack.copy()); - registry().put(ret, new WeakReference<>(ret)); + REGISTRY.put(ret, new WeakReference<>(ret)); } itemStack.setCount(oldStackSize); From 92fb39d53ab1ca79429ef9587d2d940b9e72ab52 Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 7 Jul 2020 09:25:24 +0200 Subject: [PATCH 10/29] Added curseforge task --- .github/workflows/release.yml | 21 ++++++++++++++--- build.gradle | 2 ++ gradle.properties | 1 + gradle/scripts/curseforge.gradle | 39 ++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 gradle/scripts/curseforge.gradle diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4e62308a7..b787cd4ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: 'Release' on: release: - types: [created] + types: [published] jobs: build: @@ -36,13 +36,28 @@ jobs: run: ./gradlew runData --no-daemon - name: Validate assets run: test -d ./src/generated - - name: Build, sign, and publish with Gradle + - name: Build with Gradle env: KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew build publish --no-daemon + run: ./gradlew build --no-daemon + - name: Upload to curseforge + env: + KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} + KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} + KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} + CHANGELOG: ${{ github.event.release.body }} + CURSEFORGE: ${{ secrets.CURSEFORGE }} + run: ./gradlew curseforge --no-daemon + - name: Publish to github packages + env: + KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }} + KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }} + KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: ./gradlew publish --no-daemon - name: Prepare artifact metadata id: prepare_artifact_metadata run: | diff --git a/build.gradle b/build.gradle index 36ac4474c..159a8772c 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,7 @@ buildscript { plugins { id "maven-publish" id "com.diffplug.gradle.spotless" version "4.3.0" + id "com.matthewprenger.cursegradle" version "1.4.0" id "org.sonarqube" version "2.8" id "jacoco" } @@ -165,6 +166,7 @@ task signJar(type: net.minecraftforge.gradle.common.task.SignJar, dependsOn: 're } apply from: 'gradle/scripts/artifacts.gradle' +apply from: 'gradle/scripts/curseforge.gradle' publishing { publications { diff --git a/gradle.properties b/gradle.properties index 0edae7d09..37d06fd65 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,7 @@ ctm_version=MC1.15.2-1.1.0.9 ######################################################### website_version=1.15.2 curse_versions=1.15.2 +curseforge_project=223794 ######################################################### # Gradle # diff --git a/gradle/scripts/curseforge.gradle b/gradle/scripts/curseforge.gradle new file mode 100644 index 000000000..a925a4506 --- /dev/null +++ b/gradle/scripts/curseforge.gradle @@ -0,0 +1,39 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2020, TeamAppliedEnergistics, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + *g GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +def isAlpha = project.version.contains("alpha") +def isBeta = project.version.contains("beta") + +def cfReleaseType = "release" +if (isAlpha) { + cfReleaseType = "alpha" +} else if (isBeta) { + cfReleaseType = "beta" +} + +if (System.getenv("CURSEFORGE")) { + curseforge { + apiKey = System.getenv("CURSEFORGE") + project { + id = project.curseforge_project + changelogType = "markdown" + changelog = System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) for a changelog" + releaseType = cfReleaseType + } + } +} \ No newline at end of file From 235fc2e81fc6c69150326f57d072eeb1e9fb50fb Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 7 Jul 2020 12:12:48 +0200 Subject: [PATCH 11/29] Removed superfluous IAEStack methods --- src/api/java/appeng/api/storage/data/IAEStack.java | 12 +----------- src/main/java/appeng/fluids/util/AEFluidStack.java | 10 ---------- src/main/java/appeng/util/item/AEItemStack.java | 10 ---------- 3 files changed, 1 insertion(+), 31 deletions(-) diff --git a/src/api/java/appeng/api/storage/data/IAEStack.java b/src/api/java/appeng/api/storage/data/IAEStack.java index 345405e2a..476a3d8b0 100644 --- a/src/api/java/appeng/api/storage/data/IAEStack.java +++ b/src/api/java/appeng/api/storage/data/IAEStack.java @@ -179,17 +179,7 @@ public interface IAEStack> { T empty(); /** - * @return true if the stack is a {@link IAEItemStack} - */ - boolean isItem(); - - /** - * @return true if the stack is a {@link IAEFluidStack} - */ - boolean isFluid(); - - /** - * @return ITEM or FLUID + * @return The {@link IStorageChannel} backing this stack. */ IStorageChannel getChannel(); diff --git a/src/main/java/appeng/fluids/util/AEFluidStack.java b/src/main/java/appeng/fluids/util/AEFluidStack.java index 9569c550d..00433bd84 100644 --- a/src/main/java/appeng/fluids/util/AEFluidStack.java +++ b/src/main/java/appeng/fluids/util/AEFluidStack.java @@ -152,16 +152,6 @@ public final class AEFluidStack extends AEStack implements IAEFlu return dup; } - @Override - public boolean isItem() { - return false; - } - - @Override - public boolean isFluid() { - return true; - } - @Override public IStorageChannel getChannel() { return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index 3bcd1d7e1..369c66248 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -152,16 +152,6 @@ public final class AEItemStack extends AEStack implements IAEItemS return new AEItemStack(this); } - @Override - public boolean isItem() { - return true; - } - - @Override - public boolean isFluid() { - return false; - } - @Override public IStorageChannel getChannel() { return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); From 450299cb672116791fde6984bf46f0570a21b8ee Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 7 Jul 2020 12:37:36 +0200 Subject: [PATCH 12/29] Updated README.md Removed crafttweaker info. Will be moved to a wiki page when necessary again. Updated API part with the info about github packages and also moved it higher. --- README.md | 95 +++++++++++++++++++------------------------------------ 1 file changed, 33 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 8d824f65d..270e9e5c8 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,9 @@ * [Downloads](#downloads) * [Installation](#installation) * [Issues](#issues) +* [API](#applied-energistics-2-api) * [Building](#building) * [Contribution](#contribution) -* [API](#applied-energistics-2-api) -* [CraftTweaker](#applied-energistics-2-crafttweaker) * [Localization](#applied-energistics-2-localization) * [Credits](#credits) @@ -67,6 +66,38 @@ Providing as many details as possible does help us to find and resolve the issue Please note that we might close any issue not matching these requirements. +## Applied Energistics 2 API + +The API for Applied Energistics 2. It is open source to discuss changes, improve documentation, and provide better add-on support in general. + +### Maven + +We use Github Packages as maven repository now. You can use the following snippet as example on how to add a repository to your gradle build file. + + repositories { + maven { + name "AE2" + url "https://maven.pkg.github.com/AppliedEnergistics/Applied-Energistics-2" + } + } + +When compiling against the AE2 API you can use gradle dependencies, just add + + dependencies { + compileOnly "appeng:appliedenergistics2:VERSION:api" + } + +or add the `compileOnly` line to your existing dependencies task to your build.gradle. + +Replace `VERSION` with the desired one. With 1.15+ we switched to using [semver](https://semver.org/). +It is highly recommended following its specification and further considering an upper bound for the dependency version. +A change of the `MAJOR` version will be an API break and can lead to various crashes. Better to inform a player about the addon not supporting the new version until it could be tested or updated. + +An example string would be `appeng:appliedenergistics2:7.0.0-alpha.6:api` for the API only or `appeng:appliedenergistics2:7.0.0-alpha.6` for the whole mod. + +Builds obtained [here](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) or via [maven](https://github.com/AppliedEnergistics/Applied-Energistics-2/packages) should work in a development environment. +However the dependency might need to be wrapped in `fg.deobf()` like `runtimeOnly fg.deobf("appeng:appliedenergistics2:VERSION:api")` + ## Building 1. Clone this repository via @@ -110,66 +141,6 @@ Here are a few things to keep in mind that will help get your PR approved. If you are only doing single file pull requests, GitHub supports using a quick way without the need of cloning your fork. Also read up about [synching](https://help.github.com/articles/syncing-a-fork) if you plan to contribute on regular basis. -## Applied Energistics 2 API - -The API for Applied Energistics 2. It is open source to discuss changes, improve documentation, and provide better add-on support in general. - -Universal builds obtained [Here](http://ae2.ae-mod.info/Downloads/) should work in a development environment. - -### Maven - -When compiling against the AE2 API you can use gradle dependencies, just add - - dependencies { - compile "appeng:appliedenergistics2:rv_-_____-__:api" - } - -or add the compile line to your existing dependencies task to your build.gradle - -Where the __ are filled in with the correct version criteria; AE2 is available from the default forge maven so no additional repositories are necessary. - -An example string would be `appeng:appliedenergistics2:rv5-stable-1:api` for the API only or `appeng:appliedenergistics2:rv5-stable-1` for the whole mod. - -## Applied Energistics 2 CraftTweaker - -### Inscriber - -The inscriber uses the vanilla recipe system with a custom `type` of `appliedenergistics2:inscriber`. -See the [inscriber recipe folder](src/main/resources/data/appliedenergistics2/recipes/inscriber) for some examples. - -### Grindstone - -The grindstone uses the vanilla recipe system with a custom `type` of `appliedenergistics2:grinder`. -See the [grinder recipe folder](src/main/resources/data/appliedenergistics2/recipes/grinder) for some examples. - -### Spatial -Whitelist a TileEntity class for Spatial IO. - - mods.appliedenergistics2.Spatial.whitelistEntity( String fullEntityClassName ); - -### Attunement -Attune a ItemStack or ModID to a specific P2P-Tunnel type. ModID's are used as fallback when no ItemStack was found. - - mods.appliedenergistics2.Attunement.attuneME( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneME( String modID ); - mods.appliedenergistics2.Attunement.attuneItem( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneItem( String modID ); - mods.appliedenergistics2.Attunement.attuneFluid( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneFluid( String modID ); - mods.appliedenergistics2.Attunement.attuneRedstone( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneRedstone( String modID ); - mods.appliedenergistics2.Attunement.attuneRF( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneRF( String modID ); - mods.appliedenergistics2.Attunement.attuneIC2( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneIC2( String modID ); - mods.appliedenergistics2.Attunement.attuneLight( ItemStack itemStack ); - mods.appliedenergistics2.Attunement.attuneLight( String modID ); - -### Cannon -Add ammo types for the matter cannon. - - mods.appliedenergistics2.Cannon.registerAmmo( ItemStack itemStack, double weight ); - ## Applied Energistics 2 Localization ### English Text From 1eaddef694efbe22c3df7d998d12f94620fbc33b Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 7 Jul 2020 18:13:32 +0200 Subject: [PATCH 13/29] Fixes #4453: Avoid using clientside methods serverside. --- src/api/java/appeng/api/config/Upgrades.java | 27 +++++++++++++------- src/main/java/appeng/core/Registration.java | 8 +++--- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/api/java/appeng/api/config/Upgrades.java b/src/api/java/appeng/api/config/Upgrades.java index 8f4eb8b13..8a24de168 100644 --- a/src/api/java/appeng/api/config/Upgrades.java +++ b/src/api/java/appeng/api/config/Upgrades.java @@ -23,7 +23,11 @@ package appeng.api.config; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import javax.annotation.Nullable; @@ -34,6 +38,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.util.IItemProvider; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; public enum Upgrades { /** @@ -76,7 +81,7 @@ public enum Upgrades { * items have different maxSupported values, the highest * will be shown. */ - public void registerItem(final IItemProvider item, final int maxSupported, @Nullable ITextComponent tooltipGroup) { + public void registerItem(final IItemProvider item, final int maxSupported, @Nullable String tooltipGroup) { Preconditions.checkNotNull(item); this.supported.add(new Supported(item.asItem(), maxSupported, tooltipGroup)); supportedTooltipLines = null; // Reset tooltip @@ -95,17 +100,17 @@ public enum Upgrades { ITextComponent name = supported.item.getName(); // If the group was already added by a previous item, skip this - if (supported.tooltipGroup != null && namesAdded.contains(supported.tooltipGroup)) { + if (supported.getTooltipGroup() != null && namesAdded.contains(supported.getTooltipGroup())) { continue; } // If any of the following items would be of the same group, use the group name // instead - if (supported.tooltipGroup != null) { + if (supported.getTooltipGroup() != null) { for (int j = i + 1; j < this.supported.size(); j++) { - ITextComponent otherGroup = this.supported.get(j).tooltipGroup; - if (supported.tooltipGroup.equals(otherGroup)) { - name = supported.tooltipGroup; + ITextComponent otherGroup = this.supported.get(j).getTooltipGroup(); + if (supported.getTooltipGroup().equals(otherGroup)) { + name = supported.getTooltipGroup(); break; } } @@ -133,9 +138,9 @@ public enum Upgrades { private final Block block; private final int maxCount; @Nullable - private final ITextComponent tooltipGroup; + private final String tooltipGroup; - public Supported(Item item, int maxCount, @Nullable ITextComponent tooltipGroup) { + public Supported(Item item, int maxCount, @Nullable String tooltipGroup) { this.item = item; if (item.getItem() instanceof BlockItem) { this.block = ((BlockItem) item.getItem()).getBlock(); @@ -158,6 +163,10 @@ public enum Upgrades { return item != null && this.item == item; } + public ITextComponent getTooltipGroup() { + return this.tooltipGroup != null ? new TranslationTextComponent(this.tooltipGroup) : null; + } + } } diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 34e8c66bd..3e3568085 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -383,10 +383,10 @@ final class Registration { // Block and part interface have different translation keys, but support the // same upgrades - ITextComponent interfaceGroup = parts.iface().asItem().getName(); - ITextComponent itemIoBusGroup = GuiText.IOBuses.textComponent(); - ITextComponent fluidIoBusGroup = GuiText.IOBusesFluids.textComponent(); - ITextComponent storageCellGroup = GuiText.IOBusesFluids.textComponent(); + String interfaceGroup = parts.iface().asItem().getTranslationKey(); + String itemIoBusGroup = GuiText.IOBuses.getTranslationKey(); + String fluidIoBusGroup = GuiText.IOBusesFluids.getTranslationKey(); + String storageCellGroup = GuiText.IOBusesFluids.getTranslationKey(); // default settings.. ((P2PTunnelRegistry) registries.p2pTunnel()).configure(); From 30cc8c8abce64f79991d1da97594f563c1c76fd4 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Tue, 7 Jul 2020 20:42:17 +0200 Subject: [PATCH 14/29] Changed Javadoc for Upgrade tooltip group --- src/api/java/appeng/api/config/Upgrades.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/api/java/appeng/api/config/Upgrades.java b/src/api/java/appeng/api/config/Upgrades.java index 8a24de168..5f1239a43 100644 --- a/src/api/java/appeng/api/config/Upgrades.java +++ b/src/api/java/appeng/api/config/Upgrades.java @@ -77,8 +77,8 @@ public enum Upgrades { * @param item machine in which this upgrade can be installed * @param maxSupported amount how many upgrades can be installed * @param tooltipGroup If more than one item of the same group are supported, - * the tooltip will show this group name instead. If the - * items have different maxSupported values, the highest + * the tooltip will show this translation key instead. If + * the items have different maxSupported values, the highest * will be shown. */ public void registerItem(final IItemProvider item, final int maxSupported, @Nullable String tooltipGroup) { @@ -137,6 +137,7 @@ public enum Upgrades { private final Item item; private final Block block; private final int maxCount; + // Translation key of the tooltip group @Nullable private final String tooltipGroup; From 9a5bd114a4c53ae7f194e6766e1daff1f6eb55af Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 10 Jul 2020 16:04:30 +0200 Subject: [PATCH 15/29] Updated IStorageCell docs to mention int limitations. --- .../api/implementations/items/IStorageCell.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/api/java/appeng/api/implementations/items/IStorageCell.java b/src/api/java/appeng/api/implementations/items/IStorageCell.java index ce8c1d3b6..560d032fa 100644 --- a/src/api/java/appeng/api/implementations/items/IStorageCell.java +++ b/src/api/java/appeng/api/implementations/items/IStorageCell.java @@ -28,18 +28,25 @@ import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; import appeng.api.storage.IStorageChannel; +import appeng.api.storage.cells.ICellHandler; +import appeng.api.storage.cells.ICellInventory; import appeng.api.storage.cells.ICellWorkbenchItem; import appeng.api.storage.data.IAEStack; /** * Any item which implements this can be treated as an IMEInventory via - * Util.getCell / Util.isCell It automatically handles the internals and NBT - * data, which is both nice, and bad for you! + * {@link ICellHandler#getCellInventory(ItemStack, appeng.api.storage.cells.ISaveProvider, IStorageChannel)} + * or {@link ICellHandler#isCell(ItemStack)}. It automatically handles the + * internals and NBT data, which is both nice, and bad for you! * * Good cause it means you don't have to do anything, bad because you have * little to no control over it. - * - * The standard AE implementation only provides 1-63 Types + * + * Limited to {@link Integer} internally for most calculations. E.g. if the used + * or remaining bytes would overflow {@link Integer#MAX_VALUE} the behaviour is + * no longer specified. Even if {@link ICellInventory} is using {@link Long}. + * + * The standard AE implementation also only provides 1-63 Types. */ public interface IStorageCell> extends ICellWorkbenchItem { From d9d491d51cc6c4a156f0a50178402a96bf24065f Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 10 Jul 2020 19:35:29 +0200 Subject: [PATCH 16/29] Removed deprecated API parts (#4457) --- .../appeng/api/networking/IGridBlock.java | 10 -- .../api/networking/security/IActionHost.java | 1 - .../api/parts/ICustomCableConnection.java | 2 +- .../java/appeng/api/parts/IFacadePart.java | 1 - src/api/java/appeng/api/parts/IPart.java | 4 +- .../appeng/api/recipes/ICraftHandler.java | 54 ----------- .../java/appeng/api/recipes/IIngredient.java | 92 ------------------- .../appeng/api/recipes/IRecipeHandler.java | 44 --------- .../appeng/api/recipes/IRecipeLoader.java | 40 -------- .../appeng/api/recipes/ResolverResult.java | 45 --------- .../appeng/api/recipes/ResolverResultSet.java | 40 -------- .../appeng/me/helpers/AENetworkProxy.java | 5 - 12 files changed, 3 insertions(+), 335 deletions(-) delete mode 100644 src/api/java/appeng/api/recipes/ICraftHandler.java delete mode 100644 src/api/java/appeng/api/recipes/IIngredient.java delete mode 100644 src/api/java/appeng/api/recipes/IRecipeHandler.java delete mode 100644 src/api/java/appeng/api/recipes/IRecipeLoader.java delete mode 100644 src/api/java/appeng/api/recipes/ResolverResult.java delete mode 100644 src/api/java/appeng/api/recipes/ResolverResultSet.java diff --git a/src/api/java/appeng/api/networking/IGridBlock.java b/src/api/java/appeng/api/networking/IGridBlock.java index 28b5ae88f..93fd3f37e 100644 --- a/src/api/java/appeng/api/networking/IGridBlock.java +++ b/src/api/java/appeng/api/networking/IGridBlock.java @@ -91,16 +91,6 @@ public interface IGridBlock { */ void onGridNotification(@Nonnull GridNotification notification); - /** - * Update Blocks network/connection/booting status. grid, - * - * @param grid grid - * @param channelsInUse used channels - * @deprecated to be removed in rv7 - */ - @Deprecated - void setNetworkStatus(IGrid grid, int channelsInUse); - /** * Determine which sides of the block can be connected too, only used when * isWorldAccessible returns true, not used for {@link IPart} implementations. diff --git a/src/api/java/appeng/api/networking/security/IActionHost.java b/src/api/java/appeng/api/networking/security/IActionHost.java index 425e46bff..7e29b463c 100644 --- a/src/api/java/appeng/api/networking/security/IActionHost.java +++ b/src/api/java/appeng/api/networking/security/IActionHost.java @@ -23,7 +23,6 @@ package appeng.api.networking.security; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import appeng.api.networking.IGridNode; diff --git a/src/api/java/appeng/api/parts/ICustomCableConnection.java b/src/api/java/appeng/api/parts/ICustomCableConnection.java index 3c1eb2efa..b9d01a659 100644 --- a/src/api/java/appeng/api/parts/ICustomCableConnection.java +++ b/src/api/java/appeng/api/parts/ICustomCableConnection.java @@ -31,6 +31,6 @@ public interface ICustomCableConnection { * @return This controls the cable connection to the node. -1 to render * connection yourself. */ - public float getCableConnectionLength(AECableType cable); + float getCableConnectionLength(AECableType cable); } diff --git a/src/api/java/appeng/api/parts/IFacadePart.java b/src/api/java/appeng/api/parts/IFacadePart.java index 752606fb6..a3c60c113 100644 --- a/src/api/java/appeng/api/parts/IFacadePart.java +++ b/src/api/java/appeng/api/parts/IFacadePart.java @@ -24,7 +24,6 @@ package appeng.api.parts; import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/api/java/appeng/api/parts/IPart.java b/src/api/java/appeng/api/parts/IPart.java index 89c945f95..b0ce31f81 100644 --- a/src/api/java/appeng/api/parts/IPart.java +++ b/src/api/java/appeng/api/parts/IPart.java @@ -279,7 +279,7 @@ public interface IPart extends ICustomCableConnection { * the node. -1 to render connection yourself. */ @Override - public float getCableConnectionLength(AECableType cable); + float getCableConnectionLength(AECableType cable); /** * same as Block.animateTick, for but parts. @@ -376,7 +376,7 @@ public interface IPart extends ICustomCableConnection { * This will be used by the core to add information about this part to a crash * report if it is attached to a host that caused a crash during tick * processing. - * + * * @param section The crash report section the information will be added to. */ default void addEntityCrashInfo(final CrashReportCategory section) { diff --git a/src/api/java/appeng/api/recipes/ICraftHandler.java b/src/api/java/appeng/api/recipes/ICraftHandler.java deleted file mode 100644 index c8eaf8bbc..000000000 --- a/src/api/java/appeng/api/recipes/ICraftHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -import java.util.List; - -import appeng.api.exceptions.MissingIngredientException; -import appeng.api.exceptions.RecipeException; -import appeng.api.exceptions.RegistrationException; - -@Deprecated -public interface ICraftHandler { - - /** - * Called when your recipe handler receives a newly parsed list of - * inputs/outputs. - * - * @param input parsed inputs - * @param output parsed outputs - * - * @throws RecipeException - */ - void setup(List> input, List> output) throws RecipeException; - - /** - * called when all recipes are parsed, and your required to register your - * recipe. - * - * @throws RegistrationException - * @throws MissingIngredientException - */ - void register() throws RegistrationException, MissingIngredientException; -} diff --git a/src/api/java/appeng/api/recipes/IIngredient.java b/src/api/java/appeng/api/recipes/IIngredient.java deleted file mode 100644 index cddf05b26..000000000 --- a/src/api/java/appeng/api/recipes/IIngredient.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -import net.minecraft.item.ItemStack; - -import appeng.api.exceptions.MissingIngredientException; -import appeng.api.exceptions.RegistrationException; - -@Deprecated -public interface IIngredient { - - /** - * Acquire a single input stack for the current recipe, if more then one - * ItemStack is possible a RegistrationError exception will be thrown, ignore - * these and let the system handle the error. - * - * @return a single ItemStack for the recipe handler. - * - * @throws RegistrationException - * @throws MissingIngredientException - */ - ItemStack getItemStack() throws RegistrationException, MissingIngredientException; - - /** - * Acquire a list of all the input stacks for the current recipe, this is for - * handlers that support multiple inputs per slot. - * - * @return an array of ItemStacks for the recipe handler. - * - * @throws RegistrationException - * @throws MissingIngredientException - */ - ItemStack[] getItemStackSet() throws RegistrationException, MissingIngredientException; - - /** - * If you wish to support air, you must test before getting the ItemStack, or - * ItemStackSet - * - * @return true if this slot contains no ItemStack, this is passed as "_" - */ - boolean isAir(); - - /** - * @return The Name Space of the item. Prefer getItemStack or getItemStackSet - */ - String getNameSpace(); - - /** - * @return The Name of the item. Prefer getItemStack or getItemStackSet - */ - String getItemName(); - - /** - * @return The Damage Value of the item. Prefer getItemStack or getItemStackSet - */ - int getDamageValue(); - - /** - * @return The Damage Value of the item. Prefer getItemStack or getItemStackSet - */ - int getQty(); - - /** - * Bakes the lists in for faster runtime look-ups. - * - * @throws MissingIngredientException - * @throws RegistrationException - */ - void bake() throws RegistrationException, MissingIngredientException; -} diff --git a/src/api/java/appeng/api/recipes/IRecipeHandler.java b/src/api/java/appeng/api/recipes/IRecipeHandler.java deleted file mode 100644 index 6cc66a7dc..000000000 --- a/src/api/java/appeng/api/recipes/IRecipeHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -/** - * Represents the AE2 Recipe Loading/Reading Class - */ -@Deprecated -public interface IRecipeHandler { - - /** - * Call when you want to read recipes in from a file based on a loader - * - * @param loader recipe loader - * @param path path of file - */ - void parseRecipes(IRecipeLoader loader, String path); - - /** - * this loads the read recipes into minecraft, should be called in Init. - */ - void injectRecipes(); -} diff --git a/src/api/java/appeng/api/recipes/IRecipeLoader.java b/src/api/java/appeng/api/recipes/IRecipeLoader.java deleted file mode 100644 index 96f1ef578..000000000 --- a/src/api/java/appeng/api/recipes/IRecipeLoader.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 - 2015 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -import java.io.BufferedReader; - -import javax.annotation.Nonnull; - -@Deprecated -public interface IRecipeLoader { - /** - * @param filePath the path to the to be loaded file - * - * @return reader handler of the file - * - * @throws Exception if reading goes wrong - */ - BufferedReader getFile(@Nonnull String filePath) throws Exception; -} diff --git a/src/api/java/appeng/api/recipes/ResolverResult.java b/src/api/java/appeng/api/recipes/ResolverResult.java deleted file mode 100644 index e02c33ed7..000000000 --- a/src/api/java/appeng/api/recipes/ResolverResult.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -import net.minecraft.nbt.CompoundNBT; - -public class ResolverResult { - - public final String itemName; - public final int damageValue; - public final CompoundNBT compound; - - public ResolverResult(final String name, final int damage) { - this.itemName = name; - this.damageValue = damage; - this.compound = null; - } - - public ResolverResult(final String name, final int damage, final CompoundNBT data) { - this.itemName = name; - this.damageValue = damage; - this.compound = data; - } -} diff --git a/src/api/java/appeng/api/recipes/ResolverResultSet.java b/src/api/java/appeng/api/recipes/ResolverResultSet.java deleted file mode 100644 index 8750b2c55..000000000 --- a/src/api/java/appeng/api/recipes/ResolverResultSet.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.recipes; - -import java.util.Arrays; -import java.util.List; - -import net.minecraft.item.ItemStack; - -public class ResolverResultSet { - - public final String name; - public final List results; - - public ResolverResultSet(final String myName, final ItemStack... set) { - this.results = Arrays.asList(set); - this.name = myName; - } -} diff --git a/src/main/java/appeng/me/helpers/AENetworkProxy.java b/src/main/java/appeng/me/helpers/AENetworkProxy.java index 252418c2a..1545bb1f9 100644 --- a/src/main/java/appeng/me/helpers/AENetworkProxy.java +++ b/src/main/java/appeng/me/helpers/AENetworkProxy.java @@ -285,11 +285,6 @@ public class AENetworkProxy implements IGridBlock { } } - @Override - public void setNetworkStatus(final IGrid grid, final int channelsInUse) { - - } - @Override public EnumSet getConnectableSides() { return this.validSides; From d18eabe1fc2658dd5490a421336ec75680c04224 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 11 Jul 2020 18:40:51 +0200 Subject: [PATCH 17/29] Restored the old PluginLoader as AddonLoader Introduce a new `IAEAddon` interface, which has to be implemented and annotated wit `@AEAddon` to obtain access to our public API. --- .../api/{AEPlugin.java => AEAddon.java} | 14 +- src/api/java/appeng/api/AEInjectable.java | 2 +- src/api/java/appeng/api/IAEAddon.java | 50 ++++++ src/main/java/appeng/core/AddonLoader.java | 61 ++++++++ src/main/java/appeng/core/AppEng.java | 19 ++- src/main/java/appeng/core/PluginLoader.java | 148 ------------------ 6 files changed, 134 insertions(+), 160 deletions(-) rename src/api/java/appeng/api/{AEPlugin.java => AEAddon.java} (77%) create mode 100644 src/api/java/appeng/api/IAEAddon.java create mode 100644 src/main/java/appeng/core/AddonLoader.java delete mode 100644 src/main/java/appeng/core/PluginLoader.java diff --git a/src/api/java/appeng/api/AEPlugin.java b/src/api/java/appeng/api/AEAddon.java similarity index 77% rename from src/api/java/appeng/api/AEPlugin.java rename to src/api/java/appeng/api/AEAddon.java index 96186fff7..6722e75ac 100644 --- a/src/api/java/appeng/api/AEPlugin.java +++ b/src/api/java/appeng/api/AEAddon.java @@ -26,12 +26,16 @@ import java.lang.annotation.Target; /** * Use this annotation on a class in your Mod to have it instantiated during the - * initialization phase of Applied Energistics. AE expects your class to have a - * single constructor and can supply certain arguments to your constructor using - * dependency injection. + * initialization phase of Applied Energistics. + * + * The class also needs to implement {@link IAEAddon}. + * + * AE expects your class to have a single constructor without any parameters. + * + * This is the only way to get access to the public {@link IAppEngApi} instance. */ @Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) +@Retention(RetentionPolicy.CLASS) @Documented -public @interface AEPlugin { +public @interface AEAddon { } diff --git a/src/api/java/appeng/api/AEInjectable.java b/src/api/java/appeng/api/AEInjectable.java index 7dded1cbe..014ab148e 100644 --- a/src/api/java/appeng/api/AEInjectable.java +++ b/src/api/java/appeng/api/AEInjectable.java @@ -25,7 +25,7 @@ import java.lang.annotation.Target; /** * Marks interfaces that can be used as injectable constructor arguments for an - * {@link AEPlugin}. + * {@link AEAddon}. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/api/java/appeng/api/IAEAddon.java b/src/api/java/appeng/api/IAEAddon.java new file mode 100644 index 000000000..4a7759370 --- /dev/null +++ b/src/api/java/appeng/api/IAEAddon.java @@ -0,0 +1,50 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2020 TeamAppliedEnergistics + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package appeng.api; + +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; + +/** + * Every AE2 addon requiring access to {@link IAppEngApi}, needs to provide at + * least one class implementing this interface. + * + * Further it requires the class to be annotated with {@link AEAddon}. + * + */ +public interface IAEAddon { + + /** + * This gets called once the API is successfully constructed and ready to be + * used. + * + * For now this happens during {@link FMLCommonSetupEvent}. + * + * Each addon is responsible to maintain a reference to {@link IAppEngApi} for + * future use. Otherwise there is no alternative to access it later. + * + * @param api The API instance when ready. + */ + void onAPIAvailable(IAppEngApi api); + +} diff --git a/src/main/java/appeng/core/AddonLoader.java b/src/main/java/appeng/core/AddonLoader.java new file mode 100644 index 000000000..5b1bdd662 --- /dev/null +++ b/src/main/java/appeng/core/AddonLoader.java @@ -0,0 +1,61 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2020, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core; + +import java.util.Collection; +import java.util.Objects; +import java.util.Set; + +import org.objectweb.asm.Type; + +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.ModFileScanData; +import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; + +import appeng.api.AEAddon; +import appeng.api.IAEAddon; +import appeng.api.IAppEngApi; + +/** + * Loads AE addons on startup and provides them with an {@link IAppEngApi} + * instance. + */ +class AddonLoader { + + public static void loadAddons(IAppEngApi api) { + final Type annotationType = Type.getType(AEAddon.class); + final Collection allScanData = ModList.get().getAllScanData(); + + allScanData.stream().map(ModFileScanData::getAnnotations).flatMap(Set::stream) + .filter(a -> Objects.equals(a.getAnnotationType(), annotationType)).map(AnnotationData::getMemberName) + .forEach(className -> { + try { + final Class clazz = Class.forName(className); + final Class instanceClass = clazz.asSubclass(IAEAddon.class); + final IAEAddon instance = instanceClass.newInstance(); + + instance.onAPIAvailable(api); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | LinkageError e) { + AELog.error("Failed to load: %s", className, e); + throw new RuntimeException(e); + } + }); + } +} diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index be2469a96..1c5945134 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -71,14 +71,24 @@ import appeng.client.render.cablebus.CableBusModelLoader; import appeng.client.render.cablebus.P2PTunnelFrequencyModel; import appeng.client.render.crafting.CraftingCubeModelLoader; import appeng.client.render.crafting.EncodedPatternModelLoader; -import appeng.client.render.model.*; +import appeng.client.render.model.BiometricCardModel; +import appeng.client.render.model.ColorApplicatorModel; +import appeng.client.render.model.DriveModel; +import appeng.client.render.model.GlassModel; +import appeng.client.render.model.MemoryCardModel; +import appeng.client.render.model.SkyCompassModel; +import appeng.client.render.model.UVLModelLoader; import appeng.client.render.spatial.SpatialPylonModel; import appeng.core.crash.ModCrashEnhancement; import appeng.core.features.registries.PartModels; import appeng.core.stats.AdvancementTriggers; import appeng.core.sync.network.NetworkHandler; import appeng.core.worlddata.WorldData; -import appeng.entity.*; +import appeng.entity.ChargedQuartzEntity; +import appeng.entity.GrowingCrystalEntity; +import appeng.entity.SingularityEntity; +import appeng.entity.TinyTNTPrimedEntity; +import appeng.entity.TinyTNTPrimedRenderer; import appeng.hooks.TickHandler; import appeng.integration.Integrations; import appeng.parts.PartPlacement; @@ -157,6 +167,7 @@ public final class AppEng { registerNetworkHandler(); + AddonLoader.loadAddons(Api.INSTANCE); } @OnlyIn(Dist.CLIENT) @@ -253,10 +264,6 @@ public final class AppEng { // // AELog.info( "Pre Initialization ( ended after " + watch.elapsed( TimeUnit.MILLISECONDS ) + "ms )" ); // -// // Instantiate all Plugins -// List injectables = Lists.newArrayList( -// AEApi.instance() ); -// new PluginLoader().loadPlugins( injectables, event.getAsmData() ); // } private void startService(final String serviceName, final Thread thread) { diff --git a/src/main/java/appeng/core/PluginLoader.java b/src/main/java/appeng/core/PluginLoader.java deleted file mode 100644 index c894266a2..000000000 --- a/src/main/java/appeng/core/PluginLoader.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core; - -import java.lang.annotation.ElementType; -import java.lang.reflect.Constructor; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import com.google.common.collect.ImmutableMap; - -import org.objectweb.asm.Type; - -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.ModFileScanData; - -import appeng.api.AEInjectable; -import appeng.api.AEPlugin; - -/** - * Loads AE plugins on startup and provides them with access to various - * components of the AE API. - */ -class PluginLoader { - - public void loadPlugins(Collection injectables) { - Map, Object> injectableMap = mapInjectables(injectables); - findAndInstantiatePlugins(injectableMap); - } - - private static void findAndInstantiatePlugins(Map, Object> injectableMap) { - Type aType = Type.getType(AEPlugin.class); - Set allAnnotated = ModList.get().getAllScanData().stream() - .map(ModFileScanData::getAnnotations).flatMap(Collection::stream) - .filter(a -> a.getAnnotationType().equals(aType)).filter(a -> a.getTargetType() == ElementType.TYPE) - .collect(Collectors.toSet()); - - for (ModFileScanData.AnnotationData candidate : allAnnotated) { - - String cName = candidate.getMemberName(); - Class aClass; - try { - aClass = Class.forName(cName); - } catch (ClassNotFoundException e) { - AELog.error(e, "Couldn't find annotated AE plugin class " + cName); - throw new RuntimeException("Couldn't find annotated AE plugin class " + cName, e); - } - - // Try instantiating the plugin - try { - Object plugin = instantiatePlugin(aClass, injectableMap); - AELog.info("Loaded AE2 Plugin {}", plugin.getClass()); - } catch (Exception e) { - AELog.error(e, "Unable to instantiate AE plugin " + cName); - throw new RuntimeException("Unable to instantiate AE plugin " + cName, e); - } - } - } - - private static Object instantiatePlugin(Class aClass, Map, Object> injectableMap) throws Exception { - - Constructor[] constructors = aClass.getDeclaredConstructors(); - - if (constructors.length == 0) { - // This is the default no-arg constructor, although it seems pointless to - // instantiate anything but not take - // any AE dependencies as parameters - return aClass.newInstance(); - } else if (constructors.length != 1) { - throw new IllegalArgumentException("Expected a single constructor, but found: " + constructors.length); - } - - Constructor constructor = constructors[0]; - constructor.setAccessible(true); - - Object[] args = findInjectables(constructor, injectableMap); - - return constructor.newInstance(args); - } - - private static Object[] findInjectables(Constructor constructor, Map, Object> injectableMap) { - - Class[] types = constructor.getParameterTypes(); - Object[] args = new Object[types.length]; - - for (int i = 0; i < types.length; i++) { - args[i] = injectableMap.get(types[i]); - if (args[i] == null) { - throw new IllegalArgumentException("Constructor has parameter of type " + types[i] - + " which is not an injectable type." + " Please see the documentation for @AEPlugin."); - } - } - - return args; - } - - private static Map, Object> mapInjectables(Collection injectables) { - ImmutableMap.Builder, Object> builder = ImmutableMap.builder(); - - for (Object injectable : injectables) { - // Get all super-interfaces that were annotated with @AEInjectable - Set> injectableIfs = getInjectableInterfaces(injectable.getClass()); - for (Class injectableIf : injectableIfs) { - builder.put(injectableIf, injectable); - } - } - - return builder.build(); - } - - private static Set> getInjectableInterfaces(Class aClass) { - Set> hierarchy = new HashSet<>(); - getFullHierarchy(aClass, hierarchy); - - return hierarchy.stream().filter(c -> c.getAnnotation(AEInjectable.class) != null).collect(Collectors.toSet()); - } - - // Recursively gather all superclasses and superinterfaces of the given class - // and put them into the given collection - private static void getFullHierarchy(Class aClass, Set> classes) { - classes.add(aClass); - for (Class anIf : aClass.getInterfaces()) { - getFullHierarchy(anIf, classes); - } - if (aClass.getSuperclass() != null) { - getFullHierarchy(aClass.getSuperclass(), classes); - } - } -} From 0d43ca15be2f5b29344551c9f1d6413d946ff677 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 11 Jul 2020 19:40:34 +0200 Subject: [PATCH 18/29] Removed AEApi Moved all internal access to the internal `Api` class using a new static getter. --- src/api/java/appeng/api/AEApi.java | 67 ---------- src/api/java/appeng/api/AEInjectable.java | 33 ----- src/api/java/appeng/api/IAppEngApi.java | 1 - .../api/features/IRegistryContainer.java | 2 - .../java/appeng/api/parts/IPartModels.java | 3 - .../block/AEBaseBlockItemChargeable.java | 4 +- .../block/crafting/CraftingStorageItem.java | 4 +- .../java/appeng/block/misc/ChargerBlock.java | 4 +- .../block/networking/CableBusBlock.java | 6 +- .../appeng/block/qnb/QnbFormedBakedModel.java | 4 +- src/main/java/appeng/client/ClientHelper.java | 5 +- .../gui/implementations/AESubScreen.java | 4 +- .../implementations/CraftConfirmScreen.java | 8 +- .../implementations/CraftingCPUScreen.java | 14 +- .../gui/implementations/IOPortScreen.java | 4 +- .../InterfaceTerminalScreen.java | 4 +- .../implementations/MEMonitorableScreen.java | 13 +- src/main/java/appeng/client/me/FluidRepo.java | 7 +- src/main/java/appeng/client/me/ItemRepo.java | 4 +- .../appeng/client/render/FacadeItemModel.java | 7 +- .../client/render/cablebus/FacadeBuilder.java | 4 +- .../client/render/effects/ChargedOreFX.java | 2 - .../client/render/effects/CraftingFx.java | 2 - .../client/render/effects/EnergyFx.java | 8 +- .../client/render/effects/LightningArcFX.java | 2 - .../client/render/effects/LightningFX.java | 2 - .../client/render/effects/MatterCannonFX.java | 7 +- .../client/render/effects/VibrantFX.java | 2 - .../render/spatial/SpatialPylonRendering.java | 2 - .../appeng/container/AEBaseContainer.java | 10 +- .../CellWorkbenchContainer.java | 6 +- .../implementations/ContainerHelper.java | 4 +- .../CraftConfirmContainer.java | 6 +- .../implementations/CraftingCPUContainer.java | 4 +- .../implementations/InscriberContainer.java | 6 +- .../MEMonitorableContainer.java | 10 +- .../NetworkStatusContainer.java | 4 +- .../implementations/PatternTermContainer.java | 8 +- .../implementations/QuartzKnifeContainer.java | 4 +- .../SecurityStationContainer.java | 4 +- .../implementations/StorageBusContainer.java | 4 +- .../container/slot/CraftingTermSlot.java | 4 +- .../container/slot/PatternTermSlot.java | 4 +- .../container/slot/RestrictedInputSlot.java | 10 +- src/main/java/appeng/core/AEItemGroup.java | 3 +- src/main/java/appeng/core/Api.java | 19 +++ src/main/java/appeng/core/Registration.java | 121 ++++++++++++++++-- .../appeng/core/api/definitions/ApiParts.java | 46 ++++++- .../registries/GridCacheRegistry.java | 1 - .../registries/P2PTunnelRegistry.java | 4 +- .../features/registries/WirelessRegistry.java | 4 +- .../features/registries/WorldGenRegistry.java | 1 - .../cell/BasicItemCellGuiHandler.java | 4 +- .../registries/cell/CreativeCellHandler.java | 4 +- .../appeng/core/sync/BasePacketHandler.java | 27 +++- .../appeng/core/sync/packets/ClickPacket.java | 4 +- .../core/sync/packets/JEIRecipePacket.java | 4 +- .../core/sync/packets/PatternSlotPacket.java | 4 +- .../java/appeng/crafting/CraftingJob.java | 8 +- .../appeng/crafting/CraftingTreeNode.java | 4 +- .../appeng/crafting/CraftingTreeProcess.java | 6 +- .../appeng/crafting/MECraftingInventory.java | 36 +++--- .../appeng/entity/ChargedQuartzEntity.java | 4 +- .../java/appeng/entity/SingularityEntity.java | 4 +- .../appeng/entity/TinyTNTPrimedEntity.java | 4 +- .../java/appeng/facade/FacadeContainer.java | 4 +- .../container/FluidStorageBusContainer.java | 4 +- .../container/FluidTerminalContainer.java | 8 +- .../fluids/helper/DualityFluidInterface.java | 17 ++- .../appeng/fluids/helper/FluidCellConfig.java | 17 +-- .../fluids/items/BasicFluidStorageCell.java | 6 +- .../parts/FluidAnnihilationPlanePart.java | 4 +- .../fluids/parts/FluidFormationPlanePart.java | 12 +- .../fluids/parts/FluidHandlerAdapter.java | 4 +- .../fluids/parts/FluidInterfacePart.java | 4 +- .../fluids/parts/FluidLevelEmitterPart.java | 8 +- .../fluids/parts/FluidStorageBusPart.java | 18 +-- .../fluids/parts/SharedFluidBusPart.java | 4 +- .../registries/BasicFluidCellGuiHandler.java | 4 +- .../fluids/tile/FluidInterfaceTileEntity.java | 4 +- .../java/appeng/fluids/util/AEFluidStack.java | 6 +- .../data/providers/IAE2DataProvider.java | 8 +- .../providers/recipes/SlabStairRecipes.java | 1 - .../java/appeng/helpers/DualityInterface.java | 25 ++-- .../appeng/helpers/MultiCraftingTracker.java | 4 +- .../java/appeng/helpers/PatternHelper.java | 8 +- .../helpers/WirelessTerminalGuiObject.java | 8 +- src/main/java/appeng/hooks/AETrading.java | 2 +- src/main/java/appeng/hooks/IBlockTool.java | 6 - src/main/java/appeng/hooks/TickHandler.java | 4 +- .../modules/jei/CondenserCategory.java | 3 +- .../integration/modules/jei/JEIPlugin.java | 9 +- .../items/contents/PortableCellViewer.java | 8 +- .../appeng/items/misc/EncodedPatternItem.java | 4 +- .../java/appeng/items/parts/FacadeItem.java | 13 +- .../java/appeng/items/parts/PartItem.java | 4 +- .../items/storage/AbstractStorageCell.java | 12 +- .../items/storage/BasicStorageCellItem.java | 6 +- .../storage/CreativeStorageCellItem.java | 6 +- .../appeng/items/storage/ViewCellItem.java | 4 +- .../tools/powered/ColorApplicatorItem.java | 25 ++-- .../tools/powered/EntropyManipulatorItem.java | 20 ++- .../items/tools/powered/MatterCannonItem.java | 22 ++-- .../items/tools/powered/PortableCellItem.java | 12 +- .../tools/powered/WirelessTerminalItem.java | 6 +- src/main/java/appeng/me/Grid.java | 4 +- .../appeng/me/cache/CraftingGridCache.java | 10 +- .../appeng/me/cache/GridStorageCache.java | 4 +- .../java/appeng/me/cache/PathGridCache.java | 4 +- .../implementations/CraftingCPUCluster.java | 16 +-- .../implementations/QuantumCalculator.java | 4 +- .../implementations/QuantumCluster.java | 8 +- .../appeng/me/helpers/AENetworkProxy.java | 4 +- .../me/storage/CreativeCellInventory.java | 8 +- .../me/storage/MEMonitorIFluidHandler.java | 15 ++- .../me/storage/MEMonitorIInventory.java | 10 +- .../java/appeng/me/storage/NullInventory.java | 4 +- .../me/storage/SecurityStationInventory.java | 10 +- src/main/java/appeng/parts/AEBasePart.java | 4 +- .../java/appeng/parts/CableBusContainer.java | 24 +++- src/main/java/appeng/parts/PartPlacement.java | 7 +- .../automation/AnnihilationPlanePart.java | 6 +- .../automation/BlockUpgradeInventory.java | 3 - .../DefinitionUpgradeInventory.java | 2 - .../parts/automation/ExportBusPart.java | 4 +- .../parts/automation/FormationPlanePart.java | 12 +- .../parts/automation/ImportBusPart.java | 10 +- .../parts/automation/LevelEmitterPart.java | 14 +- .../java/appeng/parts/misc/InterfacePart.java | 4 +- .../appeng/parts/misc/ItemHandlerAdapter.java | 4 +- .../parts/misc/SharedStorageBusPart.java | 4 +- .../appeng/parts/misc/StorageBusPart.java | 18 +-- .../java/appeng/parts/misc/ToggleBusPart.java | 4 +- .../appeng/parts/networking/CablePart.java | 4 +- .../appeng/parts/p2p/MEP2PTunnelPart.java | 4 +- .../java/appeng/parts/p2p/P2PTunnelPart.java | 8 +- .../parts/reporting/AbstractMonitorPart.java | 4 +- .../reporting/ConversionMonitorPart.java | 6 +- .../recipes/game/DisassembleRecipe.java | 10 +- .../appeng/recipes/game/FacadeRecipe.java | 4 +- .../java/appeng/services/CompassService.java | 4 +- src/main/java/appeng/spatial/CachedPlane.java | 13 +- .../appeng/spatial/StorageChunkGenerator.java | 4 +- .../java/appeng/spatial/StorageHelper.java | 5 +- .../crafting/CraftingMonitorTileEntity.java | 4 +- .../crafting/CraftingStorageTileEntity.java | 4 +- .../tile/crafting/CraftingTileEntity.java | 8 +- .../MolecularAssemblerTileEntity.java | 4 +- .../inventory/AppEngInternalAEInventory.java | 6 +- .../appeng/tile/misc/ChargerTileEntity.java | 14 +- .../tile/misc/CondenserItemInventory.java | 4 +- .../appeng/tile/misc/CondenserTileEntity.java | 8 +- .../appeng/tile/misc/InscriberRecipes.java | 4 +- .../appeng/tile/misc/InscriberTileEntity.java | 6 +- .../appeng/tile/misc/InterfaceTileEntity.java | 4 +- .../tile/misc/SecurityStationTileEntity.java | 6 +- .../tile/networking/WirelessTileEntity.java | 4 +- .../tile/qnb/QuantumBridgeTileEntity.java | 6 +- .../appeng/tile/storage/ChestTileEntity.java | 30 ++--- .../appeng/tile/storage/DriveTileEntity.java | 10 +- .../appeng/tile/storage/IOPortTileEntity.java | 10 +- src/main/java/appeng/util/Platform.java | 14 +- src/main/java/appeng/util/inv/IMEAdaptor.java | 6 +- .../java/appeng/util/item/AEItemStack.java | 4 +- .../appeng/util/item/AEItemStackRegistry.java | 2 - .../java/appeng/util/item/ItemModList.java | 4 +- .../worldgen/meteorite/MeteoritePlacer.java | 6 +- .../java/team/chisel/ctm/api/IFacade.java | 6 +- 168 files changed, 757 insertions(+), 677 deletions(-) delete mode 100644 src/api/java/appeng/api/AEApi.java delete mode 100644 src/api/java/appeng/api/AEInjectable.java diff --git a/src/api/java/appeng/api/AEApi.java b/src/api/java/appeng/api/AEApi.java deleted file mode 100644 index 1ee908340..000000000 --- a/src/api/java/appeng/api/AEApi.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api; - -import java.lang.reflect.Field; - -import appeng.api.exceptions.CoreInaccessibleException; - -/** - * Entry point for api. - */ -public enum AEApi { - ; - - private static final String CORE_API_FQN = "appeng.core.Api"; - private static final String CORE_API_FIELD = "INSTANCE"; - private static final IAppEngApi HELD_API; - - static { - try { - final Class apiClass = Class.forName(CORE_API_FQN); - final Field apiField = apiClass.getField(CORE_API_FIELD); - - HELD_API = (IAppEngApi) apiField.get(apiClass); - } catch (final ClassNotFoundException e) { - throw new CoreInaccessibleException( - "AE2 API tried to access the " + CORE_API_FQN + " class, without it being declared."); - } catch (final NoSuchFieldException e) { - throw new CoreInaccessibleException("AE2 API tried to access the " + CORE_API_FIELD + " field in " - + CORE_API_FQN + " without it being declared."); - } catch (final IllegalAccessException e) { - throw new CoreInaccessibleException("AE2 API tried to access the " + CORE_API_FIELD + " field in " - + CORE_API_FQN + " without enough access permissions."); - } - } - - /** - * API Entry Point. - * - * @return the {@link IAppEngApi} - */ - public static IAppEngApi instance() { - return HELD_API; - } - -} diff --git a/src/api/java/appeng/api/AEInjectable.java b/src/api/java/appeng/api/AEInjectable.java deleted file mode 100644 index 014ab148e..000000000 --- a/src/api/java/appeng/api/AEInjectable.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.api; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Marks interfaces that can be used as injectable constructor arguments for an - * {@link AEAddon}. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface AEInjectable { -} diff --git a/src/api/java/appeng/api/IAppEngApi.java b/src/api/java/appeng/api/IAppEngApi.java index e09400db3..357ac1204 100644 --- a/src/api/java/appeng/api/IAppEngApi.java +++ b/src/api/java/appeng/api/IAppEngApi.java @@ -31,7 +31,6 @@ import appeng.api.parts.IPartHelper; import appeng.api.storage.IStorageHelper; import appeng.api.util.IClientHelper; -@AEInjectable public interface IAppEngApi { /** * @return Registry Container for the numerous registries in AE2. diff --git a/src/api/java/appeng/api/features/IRegistryContainer.java b/src/api/java/appeng/api/features/IRegistryContainer.java index a64494a30..0819f8123 100644 --- a/src/api/java/appeng/api/features/IRegistryContainer.java +++ b/src/api/java/appeng/api/features/IRegistryContainer.java @@ -23,7 +23,6 @@ package appeng.api.features; -import appeng.api.AEInjectable; import appeng.api.movable.IMovableRegistry; import appeng.api.networking.IGridCacheRegistry; import appeng.api.parts.IPartModels; @@ -36,7 +35,6 @@ import appeng.api.storage.ICellRegistry; * @version 7 * @since rv0 */ -@AEInjectable public interface IRegistryContainer { /** diff --git a/src/api/java/appeng/api/parts/IPartModels.java b/src/api/java/appeng/api/parts/IPartModels.java index f7dffd397..acef8443a 100644 --- a/src/api/java/appeng/api/parts/IPartModels.java +++ b/src/api/java/appeng/api/parts/IPartModels.java @@ -23,13 +23,10 @@ import java.util.Collection; import net.minecraft.util.ResourceLocation; -import appeng.api.AEInjectable; - /** * Allows registration of part models that can then be used in * {@link IPart#getStaticModels()}. */ -@AEInjectable public interface IPartModels { /** diff --git a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java index 010fca5cb..988f201c1 100644 --- a/src/main/java/appeng/block/AEBaseBlockItemChargeable.java +++ b/src/main/java/appeng/block/AEBaseBlockItemChargeable.java @@ -32,12 +32,12 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.PowerUnits; import appeng.api.definitions.IBlockDefinition; import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.core.Api; import appeng.core.localization.GuiText; public class AEBaseBlockItemChargeable extends AEBaseBlockItem implements IAEItemPowerStorage { @@ -123,7 +123,7 @@ public class AEBaseBlockItemChargeable extends AEBaseBlockItem implements IAEIte private double getMaxEnergyCapacity() { final Block blockID = Block.getBlockFromItem(this); - final IBlockDefinition energyCell = AEApi.instance().definitions().blocks().energyCell(); + final IBlockDefinition energyCell = Api.instance().definitions().blocks().energyCell(); return energyCell.maybeBlock().map(block -> { if (blockID == block) { diff --git a/src/main/java/appeng/block/crafting/CraftingStorageItem.java b/src/main/java/appeng/block/crafting/CraftingStorageItem.java index b16cb538a..a984a45f7 100644 --- a/src/main/java/appeng/block/crafting/CraftingStorageItem.java +++ b/src/main/java/appeng/block/crafting/CraftingStorageItem.java @@ -21,10 +21,10 @@ package appeng.block.crafting; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.features.AEFeature; import appeng.block.AEBaseBlockItem; import appeng.core.AEConfig; +import appeng.core.Api; public class CraftingStorageItem extends AEBaseBlockItem { @@ -34,7 +34,7 @@ public class CraftingStorageItem extends AEBaseBlockItem { @Override public ItemStack getContainerItem(final ItemStack itemStack) { - return AEApi.instance().definitions().blocks().craftingUnit().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().blocks().craftingUnit().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/block/misc/ChargerBlock.java b/src/main/java/appeng/block/misc/ChargerBlock.java index 1a1edcccc..913ea3b9f 100644 --- a/src/main/java/appeng/block/misc/ChargerBlock.java +++ b/src/main/java/appeng/block/misc/ChargerBlock.java @@ -49,13 +49,13 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.AEApi; import appeng.api.util.AEAxisAlignedBB; import appeng.block.AEBaseTileBlock; import appeng.client.render.effects.ParticleTypes; import appeng.client.render.renderable.ItemRenderable; import appeng.client.render.tesr.ModularTESR; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.tile.misc.ChargerTileEntity; import appeng.util.Platform; @@ -101,7 +101,7 @@ public class ChargerBlock extends AEBaseTileBlock { final ChargerTileEntity tile = this.getTileEntity(w, pos); if (tile != null) { - if (AEApi.instance().definitions().materials().certusQuartzCrystalCharged() + if (Api.instance().definitions().materials().certusQuartzCrystalCharged() .isSameAs(tile.getInternalInventory().getStackInSlot(0))) { final double xOff = 0.0; final double yOff = 0.0; diff --git a/src/main/java/appeng/block/networking/CableBusBlock.java b/src/main/java/appeng/block/networking/CableBusBlock.java index 5621d605d..edb101ef9 100644 --- a/src/main/java/appeng/block/networking/CableBusBlock.java +++ b/src/main/java/appeng/block/networking/CableBusBlock.java @@ -18,7 +18,6 @@ package appeng.block.networking; -import java.util.EnumSet; import java.util.List; import java.util.Random; @@ -44,8 +43,11 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.NonNullList; -import net.minecraft.util.math.*; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShapes; diff --git a/src/main/java/appeng/block/qnb/QnbFormedBakedModel.java b/src/main/java/appeng/block/qnb/QnbFormedBakedModel.java index 36ac3479f..e594dd10e 100644 --- a/src/main/java/appeng/block/qnb/QnbFormedBakedModel.java +++ b/src/main/java/appeng/block/qnb/QnbFormedBakedModel.java @@ -25,8 +25,8 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.data.IDynamicBakedModel; import net.minecraftforge.client.model.data.IModelData; -import appeng.api.AEApi; import appeng.client.render.cablebus.CubeBuilder; +import appeng.core.Api; import appeng.core.AppEng; import appeng.tile.qnb.QuantumBridgeTileEntity; @@ -73,7 +73,7 @@ class QnbFormedBakedModel implements IDynamicBakedModel { this.coveredCableTexture = bakedTextureGetter.apply(TEXTURE_COVERED_CABLE); this.lightTexture = bakedTextureGetter.apply(TEXTURE_RING_LIGHT); this.lightCornerTexture = bakedTextureGetter.apply(TEXTURE_RING_LIGHT_CORNER); - this.linkBlock = AEApi.instance().definitions().blocks().quantumLink().maybeBlock().orElse(null); + this.linkBlock = Api.instance().definitions().blocks().quantumLink().maybeBlock().orElse(null); } @Override diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 5d7700ccb..94175608e 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -39,7 +39,10 @@ import net.minecraftforge.fml.client.registry.ClientRegistry; import appeng.api.parts.CableRenderMode; import appeng.block.AEBaseBlock; -import appeng.client.render.effects.*; +import appeng.client.render.effects.EnergyParticleData; +import appeng.client.render.effects.LightningArcFX; +import appeng.client.render.effects.LightningFX; +import appeng.client.render.effects.ParticleTypes; import appeng.core.AEConfig; import appeng.core.AppEng; import appeng.core.sync.network.NetworkHandler; diff --git a/src/main/java/appeng/client/gui/implementations/AESubScreen.java b/src/main/java/appeng/client/gui/implementations/AESubScreen.java index d14d1e9d9..f3fa77406 100644 --- a/src/main/java/appeng/client/gui/implementations/AESubScreen.java +++ b/src/main/java/appeng/client/gui/implementations/AESubScreen.java @@ -8,7 +8,6 @@ import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IParts; import appeng.client.gui.AEBaseScreen; @@ -18,6 +17,7 @@ import appeng.container.implementations.CraftingTermContainer; import appeng.container.implementations.MEMonitorableContainer; import appeng.container.implementations.PatternTermContainer; import appeng.container.implementations.WirelessTermContainer; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.SwitchGuisPacket; import appeng.helpers.IPriorityHost; @@ -44,7 +44,7 @@ final class AESubScreen { public AESubScreen(AEBaseScreen gui, Object containerTarget) { this.gui = gui; - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IParts parts = definitions.parts(); if (containerTarget instanceof ChestTileEntity) { diff --git a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java index 5c631e4e6..1057fd822 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java @@ -33,13 +33,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.client.gui.GuiUtils; -import appeng.api.AEApi; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.client.gui.AEBaseScreen; import appeng.client.gui.widgets.Scrollbar; import appeng.container.implementations.CraftConfirmContainer; +import appeng.core.Api; import appeng.core.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; @@ -51,11 +51,11 @@ public class CraftConfirmScreen extends AEBaseScreen { private final int rows = 5; - private final IItemList storage = AEApi.instance().storage() + private final IItemList storage = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); - private final IItemList pending = AEApi.instance().storage() + private final IItemList pending = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); - private final IItemList missing = AEApi.instance().storage() + private final IItemList missing = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); private final List visual = new ArrayList<>(); diff --git a/src/main/java/appeng/client/gui/implementations/CraftingCPUScreen.java b/src/main/java/appeng/client/gui/implementations/CraftingCPUScreen.java index 341c6cd25..111db1b03 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftingCPUScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftingCPUScreen.java @@ -34,7 +34,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.client.gui.GuiUtils; -import appeng.api.AEApi; import appeng.api.config.SortDir; import appeng.api.config.SortOrder; import appeng.api.config.ViewItems; @@ -47,6 +46,7 @@ import appeng.client.gui.widgets.ISortSource; import appeng.client.gui.widgets.Scrollbar; import appeng.container.implementations.CraftingCPUContainer; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; @@ -79,11 +79,11 @@ public class CraftingCPUScreen extends AEBaseScr private static final int ITEMSTACK_LEFT_OFFSET = 9; private static final int ITEMSTACK_TOP_OFFSET = 22; - private IItemList storage = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private IItemList storage = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); - private IItemList active = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private IItemList active = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); - private IItemList pending = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private IItemList pending = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); private List visual = new ArrayList<>(); @@ -100,9 +100,9 @@ public class CraftingCPUScreen extends AEBaseScr } public void clearItems() { - this.storage = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); - this.active = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); - this.pending = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.storage = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.active = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.pending = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); this.visual = new ArrayList<>(); } diff --git a/src/main/java/appeng/client/gui/implementations/IOPortScreen.java b/src/main/java/appeng/client/gui/implementations/IOPortScreen.java index 5760e4f52..5a51c0351 100644 --- a/src/main/java/appeng/client/gui/implementations/IOPortScreen.java +++ b/src/main/java/appeng/client/gui/implementations/IOPortScreen.java @@ -21,7 +21,6 @@ package appeng.client.gui.implementations; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; -import appeng.api.AEApi; import appeng.api.config.FullnessMode; import appeng.api.config.OperationMode; import appeng.api.config.RedstoneMode; @@ -30,6 +29,7 @@ import appeng.api.definitions.IDefinitions; import appeng.client.gui.widgets.ServerSettingToggleButton; import appeng.client.gui.widgets.SettingToggleButton; import appeng.container.implementations.IOPortContainer; +import appeng.core.Api; import appeng.core.localization.GuiText; public class IOPortScreen extends UpgradeableScreen { @@ -78,7 +78,7 @@ public class IOPortScreen extends UpgradeableScreen { public void drawBG(final int offsetX, final int offsetY, final int mouseX, final int mouseY, float partialTicks) { super.drawBG(offsetX, offsetY, mouseX, mouseY, partialTicks); - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); definitions.items().cell1k().maybeStack(1) .ifPresent(cell1kStack -> this.drawItem(offsetX + 66 - 8, offsetY + 17, cell1kStack)); diff --git a/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java b/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java index b3112f7d3..4cd84c83b 100644 --- a/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java +++ b/src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java @@ -40,7 +40,6 @@ import net.minecraft.nbt.ListNBT; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.client.gui.GuiUtils; -import appeng.api.AEApi; import appeng.api.storage.channels.IItemStorageChannel; import appeng.client.ActionKey; import appeng.client.gui.AEBaseScreen; @@ -49,6 +48,7 @@ import appeng.client.gui.widgets.Scrollbar; import appeng.client.me.ClientDCInternalInv; import appeng.client.me.SlotDisconnected; import appeng.container.implementations.InterfaceTerminalContainer; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.localization.GuiText; import appeng.util.Platform; @@ -321,7 +321,7 @@ public class InterfaceTerminalScreen extends AEBaseScreen list = AEApi.instance().storage() - .getStorageChannel(IFluidStorageChannel.class).createList(); + private final IItemList list = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) + .createList(); private final ArrayList view = new ArrayList<>(); private final IScrollSource src; private final ISortSource sortSrc; diff --git a/src/main/java/appeng/client/me/ItemRepo.java b/src/main/java/appeng/client/me/ItemRepo.java index 964f45a48..e9fab811f 100644 --- a/src/main/java/appeng/client/me/ItemRepo.java +++ b/src/main/java/appeng/client/me/ItemRepo.java @@ -28,7 +28,6 @@ import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; -import appeng.api.AEApi; import appeng.api.config.SearchBoxMode; import appeng.api.config.SortOrder; import appeng.api.config.ViewItems; @@ -39,6 +38,7 @@ import appeng.api.storage.data.IItemList; import appeng.client.gui.widgets.IScrollSource; import appeng.client.gui.widgets.ISortSource; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.integration.abstraction.JEIFacade; import appeng.items.storage.ViewCellItem; import appeng.util.ItemSorters; @@ -47,7 +47,7 @@ import appeng.util.prioritylist.IPartitionList; public class ItemRepo { - private final IItemList list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private final IItemList list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); private final ArrayList view = new ArrayList<>(); private final IScrollSource src; diff --git a/src/main/java/appeng/client/render/FacadeItemModel.java b/src/main/java/appeng/client/render/FacadeItemModel.java index 0102a3550..bad498a8e 100644 --- a/src/main/java/appeng/client/render/FacadeItemModel.java +++ b/src/main/java/appeng/client/render/FacadeItemModel.java @@ -24,7 +24,12 @@ import java.util.function.Function; import com.mojang.datafixers.util.Pair; -import net.minecraft.client.renderer.model.*; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.IModelTransform; +import net.minecraft.client.renderer.model.IUnbakedModel; +import net.minecraft.client.renderer.model.ItemOverrideList; +import net.minecraft.client.renderer.model.Material; +import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; diff --git a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java index 34f21e827..c99dcb6d8 100644 --- a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java +++ b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java @@ -49,8 +49,8 @@ import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; -import appeng.api.AEApi; import appeng.api.util.AEAxisAlignedBB; +import appeng.core.Api; import appeng.parts.misc.CableAnchorPart; import appeng.thirdparty.codechicken.lib.model.CachedFormat; import appeng.thirdparty.codechicken.lib.model.Quad; @@ -108,7 +108,7 @@ public class FacadeBuilder { Function modelLookup) { BakedPipeline pipeline = this.pipelines.get(); Quad collectorQuad = this.collectors.get(); - boolean transparent = AEApi.instance().partHelper().getCableRenderMode().transparentFacades; + boolean transparent = Api.instance().partHelper().getCableRenderMode().transparentFacades; Map facadeStates = renderState.getFacades(); List partBoxes = renderState.getBoundingBoxes(); Set sidesWithParts = renderState.getAttachments().keySet(); diff --git a/src/main/java/appeng/client/render/effects/ChargedOreFX.java b/src/main/java/appeng/client/render/effects/ChargedOreFX.java index ee8ca8008..106aba23d 100644 --- a/src/main/java/appeng/client/render/effects/ChargedOreFX.java +++ b/src/main/java/appeng/client/render/effects/ChargedOreFX.java @@ -28,8 +28,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class ChargedOreFX extends RedstoneParticle { diff --git a/src/main/java/appeng/client/render/effects/CraftingFx.java b/src/main/java/appeng/client/render/effects/CraftingFx.java index 569070ade..f514c2066 100644 --- a/src/main/java/appeng/client/render/effects/CraftingFx.java +++ b/src/main/java/appeng/client/render/effects/CraftingFx.java @@ -34,8 +34,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class CraftingFx extends SpriteTexturedParticle { diff --git a/src/main/java/appeng/client/render/effects/EnergyFx.java b/src/main/java/appeng/client/render/effects/EnergyFx.java index 7a9dd4e3d..d3e8dbd45 100644 --- a/src/main/java/appeng/client/render/effects/EnergyFx.java +++ b/src/main/java/appeng/client/render/effects/EnergyFx.java @@ -20,15 +20,17 @@ package appeng.client.render.effects; import com.mojang.blaze3d.vertex.IVertexBuilder; -import net.minecraft.client.particle.*; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.SpriteTexturedParticle; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class EnergyFx extends SpriteTexturedParticle { diff --git a/src/main/java/appeng/client/render/effects/LightningArcFX.java b/src/main/java/appeng/client/render/effects/LightningArcFX.java index 969beb04b..115225a33 100644 --- a/src/main/java/appeng/client/render/effects/LightningArcFX.java +++ b/src/main/java/appeng/client/render/effects/LightningArcFX.java @@ -28,8 +28,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class LightningArcFX extends LightningFX { diff --git a/src/main/java/appeng/client/render/effects/LightningFX.java b/src/main/java/appeng/client/render/effects/LightningFX.java index 072e4def3..d7dc7748b 100644 --- a/src/main/java/appeng/client/render/effects/LightningFX.java +++ b/src/main/java/appeng/client/render/effects/LightningFX.java @@ -37,8 +37,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class LightningFX extends SpriteTexturedParticle { diff --git a/src/main/java/appeng/client/render/effects/MatterCannonFX.java b/src/main/java/appeng/client/render/effects/MatterCannonFX.java index aaef5fbb3..9c1160c1a 100644 --- a/src/main/java/appeng/client/render/effects/MatterCannonFX.java +++ b/src/main/java/appeng/client/render/effects/MatterCannonFX.java @@ -18,14 +18,17 @@ package appeng.client.render.effects; -import net.minecraft.client.particle.*; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.SpriteTexturedParticle; import net.minecraft.particles.BasicParticleType; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import appeng.api.util.AEPartLocation; -import appeng.core.AppEng; public class MatterCannonFX extends SpriteTexturedParticle { diff --git a/src/main/java/appeng/client/render/effects/VibrantFX.java b/src/main/java/appeng/client/render/effects/VibrantFX.java index 39f34bcc0..4132d4b21 100644 --- a/src/main/java/appeng/client/render/effects/VibrantFX.java +++ b/src/main/java/appeng/client/render/effects/VibrantFX.java @@ -28,8 +28,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.core.AppEng; - @OnlyIn(Dist.CLIENT) public class VibrantFX extends SpriteTexturedParticle { diff --git a/src/main/java/appeng/client/render/spatial/SpatialPylonRendering.java b/src/main/java/appeng/client/render/spatial/SpatialPylonRendering.java index 8ad1e3f40..997e3b2b7 100644 --- a/src/main/java/appeng/client/render/spatial/SpatialPylonRendering.java +++ b/src/main/java/appeng/client/render/spatial/SpatialPylonRendering.java @@ -19,14 +19,12 @@ package appeng.client.render.spatial; import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IItemRendering; -import appeng.core.AppEng; public class SpatialPylonRendering extends BlockRenderingCustomizer { diff --git a/src/main/java/appeng/container/AEBaseContainer.java b/src/main/java/appeng/container/AEBaseContainer.java index f1cef6287..b8c1f32cb 100644 --- a/src/main/java/appeng/container/AEBaseContainer.java +++ b/src/main/java/appeng/container/AEBaseContainer.java @@ -37,7 +37,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.PlayerInvWrapper; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; import appeng.api.implementations.guiobjects.IGuiItemObject; @@ -64,6 +63,7 @@ import appeng.container.slot.InaccessibleSlot; import appeng.container.slot.PlayerHotBarSlot; import appeng.container.slot.PlayerInvSlot; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.InventoryActionPacket; @@ -658,7 +658,7 @@ public abstract class AEBaseContainer extends Container { final ItemStack isg = player.inventory.getItemStack(); if (!isg.isEmpty() && releaseQty > 0) { - IAEItemStack ais = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + IAEItemStack ais = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(isg); ais.setStackSize(1); final IAEItemStack extracted = ais.copy(); @@ -737,7 +737,7 @@ public abstract class AEBaseContainer extends Container { this.updateHeld(player); } } else { - IAEItemStack ais = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + IAEItemStack ais = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(player.inventory.getItemStack()); ais = Platform.poweredInsert(this.getPowerSource(), this.getCellInventory(), ais, this.getActionSource()); @@ -777,7 +777,7 @@ public abstract class AEBaseContainer extends Container { this.updateHeld(player); } } else { - IAEItemStack ais = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + IAEItemStack ais = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(player.inventory.getItemStack()); ais.setStackSize(1); ais = Platform.poweredInsert(this.getPowerSource(), this.getCellInventory(), ais, @@ -855,7 +855,7 @@ public abstract class AEBaseContainer extends Container { return input; } final IAEItemStack ais = Platform.poweredInsert(this.getPowerSource(), this.getCellInventory(), - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(input), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(input), this.getActionSource()); if (ais == null) { return ItemStack.EMPTY; diff --git a/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java b/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java index da81328ed..ce14510db 100644 --- a/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java +++ b/src/main/java/appeng/container/implementations/CellWorkbenchContainer.java @@ -31,7 +31,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.EmptyHandler; -import appeng.api.AEApi; import appeng.api.config.CopyMode; import appeng.api.config.FuzzyMode; import appeng.api.config.Settings; @@ -47,6 +46,7 @@ import appeng.container.guisync.GuiSync; import appeng.container.slot.FakeTypeOnlySlot; import appeng.container.slot.OptionalRestrictedInputSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.tile.misc.CellWorkbenchTileEntity; import appeng.util.EnumCycler; import appeng.util.Platform; @@ -208,9 +208,9 @@ public class CellWorkbenchContainer extends UpgradeableContainer { final ItemStack is = this.getUpgradeable().getInventoryByName("cell").getStackInSlot(0); final IStorageChannel channel = is.getItem() instanceof IStorageCell ? ((IStorageCell) is.getItem()).getChannel() - : AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + : Api.instance().storage().getStorageChannel(IItemStorageChannel.class); - final IMEInventory cellInv = AEApi.instance().registries().cell().getCellInventory(is, null, channel); + final IMEInventory cellInv = Api.instance().registries().cell().getCellInventory(is, null, channel); Iterator i = new NullIterator<>(); if (cellInv != null) { diff --git a/src/main/java/appeng/container/implementations/ContainerHelper.java b/src/main/java/appeng/container/implementations/ContainerHelper.java index ba1f3f5a7..3afd4ec38 100644 --- a/src/main/java/appeng/container/implementations/ContainerHelper.java +++ b/src/main/java/appeng/container/implementations/ContainerHelper.java @@ -15,7 +15,6 @@ import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; -import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.features.IWirelessTermHandler; import appeng.api.implementations.guiobjects.IGuiItem; @@ -25,6 +24,7 @@ import appeng.api.parts.IPartHost; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.core.AELog; +import appeng.core.Api; import appeng.helpers.ICustomNameObject; import appeng.helpers.WirelessTerminalGuiObject; import appeng.util.Platform; @@ -182,7 +182,7 @@ public final class ContainerHelper { } if (interfaceClass.isAssignableFrom(WirelessTerminalGuiObject.class)) { - final IWirelessTermHandler wh = AEApi.instance().registries().wireless().getWirelessTerminalHandler(it); + final IWirelessTermHandler wh = Api.instance().registries().wireless().getWirelessTerminalHandler(it); if (wh != null) { return interfaceClass.cast(new WirelessTerminalGuiObject(wh, it, player, locator.getItemIndex())); } diff --git a/src/main/java/appeng/container/implementations/CraftConfirmContainer.java b/src/main/java/appeng/container/implementations/CraftConfirmContainer.java index 27ecceada..513b7da01 100644 --- a/src/main/java/appeng/container/implementations/CraftConfirmContainer.java +++ b/src/main/java/appeng/container/implementations/CraftConfirmContainer.java @@ -37,7 +37,6 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; @@ -58,6 +57,7 @@ import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.guisync.GuiSync; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.MEInventoryUpdatePacket; import appeng.helpers.WirelessTerminalGuiObject; @@ -197,7 +197,7 @@ public class CraftConfirmContainer extends AEBaseContainer { final MEInventoryUpdatePacket c = this.result.isSimulation() ? new MEInventoryUpdatePacket((byte) 2) : null; - final IItemList plan = AEApi.instance().storage() + final IItemList plan = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); this.result.populatePlan(plan); @@ -215,7 +215,7 @@ public class CraftConfirmContainer extends AEBaseContainer { final IStorageGrid sg = this.getGrid().getCache(IStorageGrid.class); final IMEInventory items = sg - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); IAEItemStack m = null; if (c != null && this.result.isSimulation()) { diff --git a/src/main/java/appeng/container/implementations/CraftingCPUContainer.java b/src/main/java/appeng/container/implementations/CraftingCPUContainer.java index 026ee194c..4e481237f 100644 --- a/src/main/java/appeng/container/implementations/CraftingCPUContainer.java +++ b/src/main/java/appeng/container/implementations/CraftingCPUContainer.java @@ -28,7 +28,6 @@ import net.minecraft.inventory.container.IContainerListener; import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.ITextComponent; -import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; import appeng.api.networking.crafting.CraftingItemList; @@ -43,6 +42,7 @@ import appeng.api.storage.data.IItemList; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.MEInventoryUpdatePacket; @@ -60,7 +60,7 @@ public class CraftingCPUContainer extends AEBaseContainer private static final ContainerHelper helper = new ContainerHelper<>( CraftingCPUContainer::new, CraftingTileEntity.class, SecurityPermissions.CRAFT); - private final IItemList list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private final IItemList list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); private IGrid network; private CraftingCPUCluster monitor = null; diff --git a/src/main/java/appeng/container/implementations/InscriberContainer.java b/src/main/java/appeng/container/implementations/InscriberContainer.java index 9c238092b..a768ebca3 100644 --- a/src/main/java/appeng/container/implementations/InscriberContainer.java +++ b/src/main/java/appeng/container/implementations/InscriberContainer.java @@ -26,13 +26,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.definitions.IItemDefinition; import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; import appeng.container.interfaces.IProgressProvider; import appeng.container.slot.OutputSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.tile.misc.InscriberRecipes; import appeng.tile.misc.InscriberTileEntity; import appeng.util.Platform; @@ -131,7 +131,7 @@ public class InscriberContainer extends UpgradeableContainer implements IProgres final ItemStack bot = this.ti.getInternalInventory().getStackInSlot(1); if (s == this.middle) { - IItemDefinition press = AEApi.instance().definitions().materials().namePress(); + IItemDefinition press = Api.instance().definitions().materials().namePress(); if (press.isSameAs(top) || press.isSameAs(bot)) { return !press.isSameAs(is); } @@ -146,7 +146,7 @@ public class InscriberContainer extends UpgradeableContainer implements IProgres } // name presses - final IItemDefinition namePress = AEApi.instance().definitions().materials().namePress(); + final IItemDefinition namePress = Api.instance().definitions().materials().namePress(); if (namePress.isSameAs(otherSlot)) { return namePress.isSameAs(is); } diff --git a/src/main/java/appeng/container/implementations/MEMonitorableContainer.java b/src/main/java/appeng/container/implementations/MEMonitorableContainer.java index ed8438156..d9316db9b 100644 --- a/src/main/java/appeng/container/implementations/MEMonitorableContainer.java +++ b/src/main/java/appeng/container/implementations/MEMonitorableContainer.java @@ -32,7 +32,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.SecurityPermissions; @@ -67,6 +66,7 @@ import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; import appeng.container.slot.RestrictedInputSlot; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.MEInventoryUpdatePacket; @@ -93,8 +93,8 @@ public class MEMonitorableContainer extends AEBaseContainer private final RestrictedInputSlot[] cellView = new RestrictedInputSlot[5]; private final IMEMonitor monitor; - private final IItemList items = AEApi.instance().storage() - .getStorageChannel(IItemStorageChannel.class).createList(); + private final IItemList items = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) + .createList(); private final IConfigManager clientCM; private final ITerminalHost host; @GuiSync(99) @@ -126,7 +126,7 @@ public class MEMonitorableContainer extends AEBaseContainer this.serverCM = monitorable.getConfigManager(); this.monitor = monitorable - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (this.monitor != null) { this.monitor.addListener(this, null); @@ -185,7 +185,7 @@ public class MEMonitorableContainer extends AEBaseContainer public void detectAndSendChanges() { if (Platform.isServer()) { if (this.monitor != this.host - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))) { + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))) { this.setValidContainer(false); } diff --git a/src/main/java/appeng/container/implementations/NetworkStatusContainer.java b/src/main/java/appeng/container/implementations/NetworkStatusContainer.java index a1d6b778f..b34b169ff 100644 --- a/src/main/java/appeng/container/implementations/NetworkStatusContainer.java +++ b/src/main/java/appeng/container/implementations/NetworkStatusContainer.java @@ -27,7 +27,6 @@ import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; -import appeng.api.AEApi; import appeng.api.implementations.guiobjects.INetworkTool; import appeng.api.networking.IGrid; import appeng.api.networking.IGridBlock; @@ -41,6 +40,7 @@ import appeng.api.util.AEPartLocation; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.MEInventoryUpdatePacket; import appeng.util.Platform; @@ -115,7 +115,7 @@ public class NetworkStatusContainer extends AEBaseContainer { final MEInventoryUpdatePacket piu = new MEInventoryUpdatePacket(); for (final Class machineClass : this.network.getMachinesClasses()) { - final IItemList list = AEApi.instance().storage() + final IItemList list = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); for (final IGridNode machine : this.network.getMachines(machineClass)) { final IGridBlock blk = machine.getGridBlock(); diff --git a/src/main/java/appeng/container/implementations/PatternTermContainer.java b/src/main/java/appeng/container/implementations/PatternTermContainer.java index 2205c9243..7ca82cc5a 100644 --- a/src/main/java/appeng/container/implementations/PatternTermContainer.java +++ b/src/main/java/appeng/container/implementations/PatternTermContainer.java @@ -42,7 +42,6 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.PlayerInvWrapper; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; import appeng.api.definitions.IDefinitions; @@ -60,6 +59,7 @@ import appeng.container.slot.OptionalFakeSlot; import appeng.container.slot.PatternOutputsSlot; import appeng.container.slot.PatternTermSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.core.sync.packets.PatternSlotPacket; import appeng.helpers.IContainerCraftingPacket; import appeng.items.storage.ViewCellItem; @@ -227,7 +227,7 @@ public class PatternTermContainer extends MEMonitorableContainer } // add a new encoded pattern. - Optional maybePattern = AEApi.instance().definitions().items().encodedPattern().maybeStack(1); + Optional maybePattern = Api.instance().definitions().items().encodedPattern().maybeStack(1); if (maybePattern.isPresent()) { output = maybePattern.get(); this.patternSlotOUT.putStack(output); @@ -307,7 +307,7 @@ public class PatternTermContainer extends MEMonitorableContainer return false; } - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); boolean isPattern = definitions.items().encodedPattern().isSameAs(output); isPattern |= definitions.materials().blankPattern().isSameAs(output); @@ -380,7 +380,7 @@ public class PatternTermContainer extends MEMonitorableContainer } final IMEMonitor storage = this.getPatternTerminal() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IItemList all = storage.getStorageList(); final ItemStack is = r.getCraftingResult(ic); diff --git a/src/main/java/appeng/container/implementations/QuartzKnifeContainer.java b/src/main/java/appeng/container/implementations/QuartzKnifeContainer.java index 077205b5e..4c2518dda 100644 --- a/src/main/java/appeng/container/implementations/QuartzKnifeContainer.java +++ b/src/main/java/appeng/container/implementations/QuartzKnifeContainer.java @@ -30,11 +30,11 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.container.slot.OutputSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.items.contents.QuartzKnifeObj; import appeng.items.materials.MaterialItem; import appeng.tile.inventory.AppEngInternalInventory; @@ -119,7 +119,7 @@ public class QuartzKnifeContainer extends AEBaseContainer { if (RestrictedInputSlot.isMetalIngot(input)) { if (QuartzKnifeContainer.this.myName.length() > 0) { - return AEApi.instance().definitions().materials().namePress().maybeStack(1).map(namePressStack -> { + return Api.instance().definitions().materials().namePress().maybeStack(1).map(namePressStack -> { final CompoundNBT compound = namePressStack.getOrCreateTag(); compound.putString(MaterialItem.TAG_INSCRIBE_NAME, QuartzKnifeContainer.this.myName); diff --git a/src/main/java/appeng/container/implementations/SecurityStationContainer.java b/src/main/java/appeng/container/implementations/SecurityStationContainer.java index bfdf27c06..b9fd17438 100644 --- a/src/main/java/appeng/container/implementations/SecurityStationContainer.java +++ b/src/main/java/appeng/container/implementations/SecurityStationContainer.java @@ -26,7 +26,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.features.INetworkEncodable; import appeng.api.features.IWirelessTermHandler; @@ -36,6 +35,7 @@ import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; import appeng.container.slot.OutputSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.misc.SecurityStationTileEntity; import appeng.util.inv.IAEAppEngInventory; @@ -150,7 +150,7 @@ public class SecurityStationContainer extends MEMonitorableContainer implements networkEncodable = (INetworkEncodable) term.getItem(); } - final IWirelessTermHandler wTermHandler = AEApi.instance().registries().wireless() + final IWirelessTermHandler wTermHandler = Api.instance().registries().wireless() .getWirelessTerminalHandler(term); if (wTermHandler != null) { networkEncodable = wTermHandler; diff --git a/src/main/java/appeng/container/implementations/StorageBusContainer.java b/src/main/java/appeng/container/implementations/StorageBusContainer.java index b5e0fb3a9..2d5dd3ecc 100644 --- a/src/main/java/appeng/container/implementations/StorageBusContainer.java +++ b/src/main/java/appeng/container/implementations/StorageBusContainer.java @@ -27,7 +27,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.FuzzyMode; import appeng.api.config.SecurityPermissions; @@ -43,6 +42,7 @@ import appeng.container.guisync.GuiSync; import appeng.container.slot.FakeTypeOnlySlot; import appeng.container.slot.OptionalTypeOnlyFakeSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.parts.misc.StorageBusPart; import appeng.util.Platform; import appeng.util.helpers.ItemHandlerUtil; @@ -155,7 +155,7 @@ public class StorageBusContainer extends UpgradeableContainer { Iterator i = new NullIterator<>(); if (cellInv != null) { final IItemList list = cellInv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); i = list.iterator(); } diff --git a/src/main/java/appeng/container/slot/CraftingTermSlot.java b/src/main/java/appeng/container/slot/CraftingTermSlot.java index 410c5cfa9..7623ac419 100644 --- a/src/main/java/appeng/container/slot/CraftingTermSlot.java +++ b/src/main/java/appeng/container/slot/CraftingTermSlot.java @@ -33,7 +33,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionSource; @@ -44,6 +43,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.container.ContainerNull; import appeng.container.implementations.CraftingTermContainer; +import appeng.core.Api; import appeng.helpers.IContainerCraftingPacket; import appeng.helpers.InventoryAction; import appeng.items.storage.ViewCellItem; @@ -100,7 +100,7 @@ public class CraftingTermSlot extends AppEngCraftingSlot { } final IMEMonitor inv = this.storage - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final int howManyPerCraft = this.getStack().getCount(); int maxTimesToCraft = 0; diff --git a/src/main/java/appeng/container/slot/PatternTermSlot.java b/src/main/java/appeng/container/slot/PatternTermSlot.java index 49c1cf72d..e77341f59 100644 --- a/src/main/java/appeng/container/slot/PatternTermSlot.java +++ b/src/main/java/appeng/container/slot/PatternTermSlot.java @@ -22,11 +22,11 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionSource; import appeng.api.storage.IStorageMonitorable; import appeng.api.storage.channels.IItemStorageChannel; +import appeng.core.Api; import appeng.core.sync.BasePacket; import appeng.core.sync.packets.PatternSlotPacket; import appeng.helpers.IContainerCraftingPacket; @@ -48,7 +48,7 @@ public class PatternTermSlot extends CraftingTermSlot { public BasePacket getRequest(final boolean shift) { return new PatternSlotPacket(this.getPattern(), - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(this.getStack()), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(this.getStack()), shift); } diff --git a/src/main/java/appeng/container/slot/RestrictedInputSlot.java b/src/main/java/appeng/container/slot/RestrictedInputSlot.java index c76e30392..152c9eb92 100644 --- a/src/main/java/appeng/container/slot/RestrictedInputSlot.java +++ b/src/main/java/appeng/container/slot/RestrictedInputSlot.java @@ -33,7 +33,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItems; import appeng.api.definitions.IMaterials; @@ -45,6 +44,7 @@ import appeng.api.implementations.items.IStorageComponent; import appeng.api.implementations.items.IUpgradeModule; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.cells.ICellWorkbenchItem; +import appeng.core.Api; import appeng.items.misc.EncodedPatternItem; import appeng.recipes.handlers.GrinderRecipes; import appeng.tile.misc.InscriberRecipes; @@ -123,7 +123,7 @@ public class RestrictedInputSlot extends AppEngSlot { return false; } - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IMaterials materials = definitions.materials(); final IItems items = definitions.items(); @@ -195,14 +195,14 @@ public class RestrictedInputSlot extends AppEngSlot { return i.getItem() instanceof ISpatialStorageCell && ((ISpatialStorageCell) i.getItem()).isSpatialStorage(i); case STORAGE_CELLS: - return AEApi.instance().registries().cell().isCellHandled(i); + return Api.instance().registries().cell().isCellHandled(i); case WORKBENCH_CELL: return i.getItem() instanceof ICellWorkbenchItem && ((ICellWorkbenchItem) i.getItem()).isEditable(i); case STORAGE_COMPONENT: return i.getItem() instanceof IStorageComponent && ((IStorageComponent) i.getItem()).isStorageComponent(i); case TRASH: - if (AEApi.instance().registries().cell().isCellHandled(i)) { + if (Api.instance().registries().cell().isCellHandled(i)) { return false; } @@ -210,7 +210,7 @@ public class RestrictedInputSlot extends AppEngSlot { && ((IStorageComponent) i.getItem()).isStorageComponent(i)); case ENCODABLE_ITEM: return i.getItem() instanceof INetworkEncodable - || AEApi.instance().registries().wireless().isWirelessTerminal(i); + || Api.instance().registries().wireless().isWirelessTerminal(i); case BIOMETRIC_CARD: return i.getItem() instanceof IBiometricCard; case UPGRADES: diff --git a/src/main/java/appeng/core/AEItemGroup.java b/src/main/java/appeng/core/AEItemGroup.java index d76e2fdcc..b03991f04 100644 --- a/src/main/java/appeng/core/AEItemGroup.java +++ b/src/main/java/appeng/core/AEItemGroup.java @@ -7,7 +7,6 @@ import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; -import appeng.api.AEApi; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; @@ -22,7 +21,7 @@ public class AEItemGroup extends ItemGroup { @Override public ItemStack createIcon() { - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IBlocks blocks = definitions.blocks(); return blocks.controller().stack(1); } diff --git a/src/main/java/appeng/core/Api.java b/src/main/java/appeng/core/Api.java index fa4240502..b26d959af 100644 --- a/src/main/java/appeng/core/Api.java +++ b/src/main/java/appeng/core/Api.java @@ -18,6 +18,7 @@ package appeng.core; +import appeng.api.AEAddon; import appeng.api.IAppEngApi; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridHelper; @@ -31,8 +32,26 @@ import appeng.core.features.registries.PartModels; import appeng.core.features.registries.RegistryContainer; public final class Api implements IAppEngApi { + + /** + * While permitting public access, directly using {@link Api#instance()} is not + * recommended except in very special cases. + */ public static final Api INSTANCE = new Api(); + /** + * Use primarily to access the API. + * + * Using {@link IAppEngApi} intentionally to avoid using functionality not + * exposed by accident. + * + * In some cases we might have to access the API before it is announced via + * {@link AEAddon}, otherwise we could just inject it into AE2 itself. + */ + public static IAppEngApi instance() { + return INSTANCE; + } + private final ApiPart partHelper; // private MovableTileRegistry MovableRegistry = new MovableTileRegistry(); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 3e3568085..80238ec6c 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -31,7 +31,6 @@ import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.particles.ParticleType; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.GenerationStage; @@ -43,7 +42,11 @@ import net.minecraft.world.gen.placement.IPlacementConfig; import net.minecraft.world.gen.placement.Placement; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.*; +import net.minecraftforge.client.event.ColorHandlerEvent; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.ModDimension; import net.minecraftforge.common.extensions.IForgeContainerType; @@ -57,7 +60,6 @@ import net.minecraftforge.fml.network.IContainerFactory; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.IForgeRegistry; -import appeng.api.AEApi; import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IItems; @@ -75,9 +77,53 @@ import appeng.api.networking.security.ISecurityGrid; import appeng.api.networking.spatial.ISpatialCache; import appeng.api.networking.storage.IStorageGrid; import appeng.api.networking.ticking.ITickManager; -import appeng.bootstrap.components.*; -import appeng.client.gui.implementations.*; -import appeng.client.render.effects.*; +import appeng.bootstrap.components.IBlockRegistrationComponent; +import appeng.bootstrap.components.IEntityRegistrationComponent; +import appeng.bootstrap.components.IItemColorRegistrationComponent; +import appeng.bootstrap.components.IItemRegistrationComponent; +import appeng.bootstrap.components.IModelBakeComponent; +import appeng.bootstrap.components.ITileEntityRegistrationComponent; +import appeng.client.gui.implementations.CellWorkbenchScreen; +import appeng.client.gui.implementations.ChestScreen; +import appeng.client.gui.implementations.CondenserScreen; +import appeng.client.gui.implementations.CraftAmountScreen; +import appeng.client.gui.implementations.CraftConfirmScreen; +import appeng.client.gui.implementations.CraftingCPUScreen; +import appeng.client.gui.implementations.CraftingStatusScreen; +import appeng.client.gui.implementations.CraftingTermScreen; +import appeng.client.gui.implementations.DriveScreen; +import appeng.client.gui.implementations.FormationPlaneScreen; +import appeng.client.gui.implementations.GrinderScreen; +import appeng.client.gui.implementations.IOPortScreen; +import appeng.client.gui.implementations.InscriberScreen; +import appeng.client.gui.implementations.InterfaceScreen; +import appeng.client.gui.implementations.InterfaceTerminalScreen; +import appeng.client.gui.implementations.LevelEmitterScreen; +import appeng.client.gui.implementations.MEMonitorableScreen; +import appeng.client.gui.implementations.MEPortableCellScreen; +import appeng.client.gui.implementations.MolecularAssemblerScreen; +import appeng.client.gui.implementations.NetworkStatusScreen; +import appeng.client.gui.implementations.NetworkToolScreen; +import appeng.client.gui.implementations.PatternTermScreen; +import appeng.client.gui.implementations.PriorityScreen; +import appeng.client.gui.implementations.QNBScreen; +import appeng.client.gui.implementations.QuartzKnifeScreen; +import appeng.client.gui.implementations.SecurityStationScreen; +import appeng.client.gui.implementations.SkyChestScreen; +import appeng.client.gui.implementations.SpatialIOPortScreen; +import appeng.client.gui.implementations.StorageBusScreen; +import appeng.client.gui.implementations.UpgradeableScreen; +import appeng.client.gui.implementations.VibrationChamberScreen; +import appeng.client.gui.implementations.WirelessScreen; +import appeng.client.gui.implementations.WirelessTermScreen; +import appeng.client.render.effects.ChargedOreFX; +import appeng.client.render.effects.CraftingFx; +import appeng.client.render.effects.EnergyFx; +import appeng.client.render.effects.LightningArcFX; +import appeng.client.render.effects.LightningFX; +import appeng.client.render.effects.MatterCannonFX; +import appeng.client.render.effects.ParticleTypes; +import appeng.client.render.effects.VibrantFX; import appeng.client.render.model.BiometricCardModel; import appeng.client.render.model.DriveModel; import appeng.client.render.model.MemoryCardModel; @@ -86,7 +132,39 @@ import appeng.client.render.tesr.InscriberTESR; import appeng.client.render.tesr.SkyChestTESR; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpener; -import appeng.container.implementations.*; +import appeng.container.implementations.CellWorkbenchContainer; +import appeng.container.implementations.ChestContainer; +import appeng.container.implementations.CondenserContainer; +import appeng.container.implementations.CraftAmountContainer; +import appeng.container.implementations.CraftConfirmContainer; +import appeng.container.implementations.CraftingCPUContainer; +import appeng.container.implementations.CraftingStatusContainer; +import appeng.container.implementations.CraftingTermContainer; +import appeng.container.implementations.DriveContainer; +import appeng.container.implementations.FormationPlaneContainer; +import appeng.container.implementations.GrinderContainer; +import appeng.container.implementations.IOPortContainer; +import appeng.container.implementations.InscriberContainer; +import appeng.container.implementations.InterfaceContainer; +import appeng.container.implementations.InterfaceTerminalContainer; +import appeng.container.implementations.LevelEmitterContainer; +import appeng.container.implementations.MEMonitorableContainer; +import appeng.container.implementations.MEPortableCellContainer; +import appeng.container.implementations.MolecularAssemblerContainer; +import appeng.container.implementations.NetworkStatusContainer; +import appeng.container.implementations.NetworkToolContainer; +import appeng.container.implementations.PatternTermContainer; +import appeng.container.implementations.PriorityContainer; +import appeng.container.implementations.QNBContainer; +import appeng.container.implementations.QuartzKnifeContainer; +import appeng.container.implementations.SecurityStationContainer; +import appeng.container.implementations.SkyChestContainer; +import appeng.container.implementations.SpatialIOPortContainer; +import appeng.container.implementations.StorageBusContainer; +import appeng.container.implementations.UpgradeableContainer; +import appeng.container.implementations.VibrationChamberContainer; +import appeng.container.implementations.WirelessContainer; +import appeng.container.implementations.WirelessTermContainer; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.PartModels; import appeng.core.features.registries.cell.BasicCellHandler; @@ -95,11 +173,28 @@ import appeng.core.features.registries.cell.CreativeCellHandler; import appeng.core.localization.GuiText; import appeng.core.stats.AdvancementTriggers; import appeng.core.stats.AeStats; -import appeng.fluids.client.gui.*; -import appeng.fluids.container.*; +import appeng.fluids.client.gui.FluidFormationPlaneScreen; +import appeng.fluids.client.gui.FluidIOScreen; +import appeng.fluids.client.gui.FluidInterfaceScreen; +import appeng.fluids.client.gui.FluidLevelEmitterScreen; +import appeng.fluids.client.gui.FluidStorageBusScreen; +import appeng.fluids.client.gui.FluidTerminalScreen; +import appeng.fluids.container.FluidFormationPlaneContainer; +import appeng.fluids.container.FluidIOContainer; +import appeng.fluids.container.FluidInterfaceContainer; +import appeng.fluids.container.FluidLevelEmitterContainer; +import appeng.fluids.container.FluidStorageBusContainer; +import appeng.fluids.container.FluidTerminalContainer; import appeng.fluids.registries.BasicFluidCellGuiHandler; import appeng.items.parts.FacadeItem; -import appeng.me.cache.*; +import appeng.me.cache.CraftingGridCache; +import appeng.me.cache.EnergyGridCache; +import appeng.me.cache.GridStorageCache; +import appeng.me.cache.P2PCache; +import appeng.me.cache.PathGridCache; +import appeng.me.cache.SecurityCache; +import appeng.me.cache.SpatialPylonCache; +import appeng.me.cache.TickManagerCache; import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; import appeng.recipes.handlers.GrinderRecipe; @@ -374,7 +469,7 @@ final class Registration { // FIXME LATER public static void postInit() { - final IRegistryContainer registries = AEApi.instance().registries(); + final IRegistryContainer registries = Api.instance().registries(); // TODO: Do not use the internal API ApiDefinitions definitions = Api.INSTANCE.definitions(); final IParts parts = definitions.parts(); @@ -573,7 +668,7 @@ final class Registration { return; } - BlockState quartzOre = AEApi.instance().definitions().blocks().quartzOre().block().getDefaultState(); + BlockState quartzOre = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); b.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE .withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, @@ -583,7 +678,7 @@ final class Registration { if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) { - BlockState chargedQuartzOre = AEApi.instance().definitions().blocks().quartzOreCharged().block() + BlockState chargedQuartzOre = Api.instance().definitions().blocks().quartzOreCharged().block() .getDefaultState(); b.addFeature(GenerationStage.Decoration.UNDERGROUND_DECORATION, ChargedQuartzOreFeature.INSTANCE diff --git a/src/main/java/appeng/core/api/definitions/ApiParts.java b/src/main/java/appeng/core/api/definitions/ApiParts.java index d09dabc84..f22e847ba 100644 --- a/src/main/java/appeng/core/api/definitions/ApiParts.java +++ b/src/main/java/appeng/core/api/definitions/ApiParts.java @@ -33,16 +33,50 @@ import appeng.core.features.ActivityState; import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ItemStackSrc; import appeng.core.features.registries.PartModels; -import appeng.fluids.parts.*; +import appeng.fluids.parts.FluidAnnihilationPlanePart; +import appeng.fluids.parts.FluidExportBusPart; +import appeng.fluids.parts.FluidFormationPlanePart; +import appeng.fluids.parts.FluidImportBusPart; +import appeng.fluids.parts.FluidInterfacePart; +import appeng.fluids.parts.FluidLevelEmitterPart; +import appeng.fluids.parts.FluidStorageBusPart; +import appeng.fluids.parts.FluidTerminalPart; import appeng.items.parts.ColoredPartItem; import appeng.items.parts.PartItem; import appeng.items.parts.PartItemRendering; import appeng.items.parts.PartModelsHelper; -import appeng.parts.automation.*; -import appeng.parts.misc.*; -import appeng.parts.networking.*; -import appeng.parts.p2p.*; -import appeng.parts.reporting.*; +import appeng.parts.automation.AnnihilationPlanePart; +import appeng.parts.automation.ExportBusPart; +import appeng.parts.automation.FormationPlanePart; +import appeng.parts.automation.IdentityAnnihilationPlanePart; +import appeng.parts.automation.ImportBusPart; +import appeng.parts.automation.LevelEmitterPart; +import appeng.parts.misc.CableAnchorPart; +import appeng.parts.misc.InterfacePart; +import appeng.parts.misc.InvertedToggleBusPart; +import appeng.parts.misc.StorageBusPart; +import appeng.parts.misc.ToggleBusPart; +import appeng.parts.networking.CoveredCablePart; +import appeng.parts.networking.CoveredDenseCablePart; +import appeng.parts.networking.GlassCablePart; +import appeng.parts.networking.QuartzFiberPart; +import appeng.parts.networking.SmartCablePart; +import appeng.parts.networking.SmartDenseCablePart; +import appeng.parts.p2p.FEP2PTunnelPart; +import appeng.parts.p2p.FluidP2PTunnelPart; +import appeng.parts.p2p.ItemP2PTunnelPart; +import appeng.parts.p2p.LightP2PTunnelPart; +import appeng.parts.p2p.MEP2PTunnelPart; +import appeng.parts.p2p.RedstoneP2PTunnelPart; +import appeng.parts.reporting.ConversionMonitorPart; +import appeng.parts.reporting.CraftingTerminalPart; +import appeng.parts.reporting.DarkPanelPart; +import appeng.parts.reporting.InterfaceTerminalPart; +import appeng.parts.reporting.PanelPart; +import appeng.parts.reporting.PatternTerminalPart; +import appeng.parts.reporting.SemiDarkPanelPart; +import appeng.parts.reporting.StorageMonitorPart; +import appeng.parts.reporting.TerminalPart; /** * Internal implementation for the API parts diff --git a/src/main/java/appeng/core/features/registries/GridCacheRegistry.java b/src/main/java/appeng/core/features/registries/GridCacheRegistry.java index 520d06839..ead509589 100644 --- a/src/main/java/appeng/core/features/registries/GridCacheRegistry.java +++ b/src/main/java/appeng/core/features/registries/GridCacheRegistry.java @@ -29,7 +29,6 @@ import appeng.api.networking.IGrid; import appeng.api.networking.IGridCache; import appeng.api.networking.IGridCacheFactory; import appeng.api.networking.IGridCacheRegistry; -import appeng.core.AELog; public final class GridCacheRegistry implements IGridCacheRegistry { diff --git a/src/main/java/appeng/core/features/registries/P2PTunnelRegistry.java b/src/main/java/appeng/core/features/registries/P2PTunnelRegistry.java index e97c429ac..e7a41de08 100644 --- a/src/main/java/appeng/core/features/registries/P2PTunnelRegistry.java +++ b/src/main/java/appeng/core/features/registries/P2PTunnelRegistry.java @@ -35,7 +35,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; import appeng.api.config.TunnelType; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IDefinitions; @@ -44,6 +43,7 @@ import appeng.api.definitions.IParts; import appeng.api.features.IP2PTunnelRegistry; import appeng.api.util.AEColor; import appeng.capabilities.Capabilities; +import appeng.core.Api; public final class P2PTunnelRegistry implements IP2PTunnelRegistry { private static final int INITIAL_CAPACITY = 40; @@ -54,7 +54,7 @@ public final class P2PTunnelRegistry implements IP2PTunnelRegistry { public void configure() { - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IBlocks blocks = definitions.blocks(); final IParts parts = definitions.parts(); diff --git a/src/main/java/appeng/core/features/registries/WirelessRegistry.java b/src/main/java/appeng/core/features/registries/WirelessRegistry.java index c4725b487..7ca6f2692 100644 --- a/src/main/java/appeng/core/features/registries/WirelessRegistry.java +++ b/src/main/java/appeng/core/features/registries/WirelessRegistry.java @@ -26,13 +26,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.world.IBlockReader; -import appeng.api.AEApi; import appeng.api.features.ILocatable; import appeng.api.features.IWirelessTermHandler; import appeng.api.features.IWirelessTermRegistry; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.WirelessTermContainer; +import appeng.core.Api; import appeng.core.localization.PlayerMessages; import appeng.util.Platform; @@ -89,7 +89,7 @@ public final class WirelessRegistry implements IWirelessTermRegistry { } final long parsedKey = Long.parseLong(unparsedKey); - final ILocatable securityStation = AEApi.instance().registries().locatable().getLocatableBy(parsedKey); + final ILocatable securityStation = Api.instance().registries().locatable().getLocatableBy(parsedKey); if (securityStation == null) { player.sendMessage(PlayerMessages.StationCanNotBeLocated.get()); return; diff --git a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java index 4b03b2c7b..dc6b70611 100644 --- a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java +++ b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java @@ -22,7 +22,6 @@ import java.util.HashSet; import net.minecraft.util.ResourceLocation; import net.minecraft.world.IWorld; -import net.minecraft.world.World; import net.minecraft.world.dimension.Dimension; import appeng.api.features.IWorldGen; diff --git a/src/main/java/appeng/core/features/registries/cell/BasicItemCellGuiHandler.java b/src/main/java/appeng/core/features/registries/cell/BasicItemCellGuiHandler.java index 94210396a..ed60efa73 100644 --- a/src/main/java/appeng/core/features/registries/cell/BasicItemCellGuiHandler.java +++ b/src/main/java/appeng/core/features/registries/cell/BasicItemCellGuiHandler.java @@ -5,7 +5,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import appeng.api.AEApi; import appeng.api.implementations.tiles.IChestOrDrive; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.IStorageChannel; @@ -16,11 +15,12 @@ import appeng.api.storage.data.IAEStack; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.MEMonitorableContainer; +import appeng.core.Api; public class BasicItemCellGuiHandler implements ICellGuiHandler { @Override public > boolean isHandlerFor(final IStorageChannel channel) { - return channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/core/features/registries/cell/CreativeCellHandler.java b/src/main/java/appeng/core/features/registries/cell/CreativeCellHandler.java index 4afa69047..50cbbe15e 100644 --- a/src/main/java/appeng/core/features/registries/cell/CreativeCellHandler.java +++ b/src/main/java/appeng/core/features/registries/cell/CreativeCellHandler.java @@ -20,13 +20,13 @@ package appeng.core.features.registries.cell; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.storage.IStorageChannel; import appeng.api.storage.cells.CellState; import appeng.api.storage.cells.ICellHandler; import appeng.api.storage.cells.ICellInventoryHandler; import appeng.api.storage.cells.ISaveProvider; import appeng.api.storage.channels.IItemStorageChannel; +import appeng.core.Api; import appeng.items.storage.CreativeStorageCellItem; import appeng.me.storage.CreativeCellInventory; @@ -40,7 +40,7 @@ public final class CreativeCellHandler implements ICellHandler { @Override public ICellInventoryHandler getCellInventory(final ItemStack is, final ISaveProvider container, final IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) && !is.isEmpty() + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class) && !is.isEmpty() && is.getItem() instanceof CreativeStorageCellItem) { return CreativeCellInventory.getCell(is); } diff --git a/src/main/java/appeng/core/sync/BasePacketHandler.java b/src/main/java/appeng/core/sync/BasePacketHandler.java index fac85e3e5..82c39a3a0 100644 --- a/src/main/java/appeng/core/sync/BasePacketHandler.java +++ b/src/main/java/appeng/core/sync/BasePacketHandler.java @@ -24,7 +24,32 @@ import java.util.function.Function; import net.minecraft.network.PacketBuffer; -import appeng.core.sync.packets.*; +import appeng.core.sync.packets.AssemblerAnimationPacket; +import appeng.core.sync.packets.BlockTransitionEffectPacket; +import appeng.core.sync.packets.ClickPacket; +import appeng.core.sync.packets.CompassRequestPacket; +import appeng.core.sync.packets.CompassResponsePacket; +import appeng.core.sync.packets.CompressedNBTPacket; +import appeng.core.sync.packets.ConfigButtonPacket; +import appeng.core.sync.packets.ConfigValuePacket; +import appeng.core.sync.packets.CraftRequestPacket; +import appeng.core.sync.packets.FluidSlotPacket; +import appeng.core.sync.packets.InventoryActionPacket; +import appeng.core.sync.packets.ItemTransitionEffectPacket; +import appeng.core.sync.packets.JEIRecipePacket; +import appeng.core.sync.packets.LightningPacket; +import appeng.core.sync.packets.MEFluidInventoryUpdatePacket; +import appeng.core.sync.packets.MEInventoryUpdatePacket; +import appeng.core.sync.packets.MatterCannonPacket; +import appeng.core.sync.packets.MockExplosionPacket; +import appeng.core.sync.packets.PaintedEntityPacket; +import appeng.core.sync.packets.PartPlacementPacket; +import appeng.core.sync.packets.PatternSlotPacket; +import appeng.core.sync.packets.ProgressBarPacket; +import appeng.core.sync.packets.SwapSlotsPacket; +import appeng.core.sync.packets.SwitchGuisPacket; +import appeng.core.sync.packets.TargetFluidStackPacket; +import appeng.core.sync.packets.TargetItemStackPacket; public class BasePacketHandler { private static final Map, PacketTypes> REVERSE_LOOKUP = new HashMap<>(); diff --git a/src/main/java/appeng/core/sync/packets/ClickPacket.java b/src/main/java/appeng/core/sync/packets/ClickPacket.java index 1e3fa6d9f..0842a60c7 100644 --- a/src/main/java/appeng/core/sync/packets/ClickPacket.java +++ b/src/main/java/appeng/core/sync/packets/ClickPacket.java @@ -31,7 +31,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; -import appeng.api.AEApi; import appeng.api.definitions.IComparableDefinition; import appeng.api.definitions.IItems; import appeng.api.implementations.items.IMemoryCard; @@ -40,6 +39,7 @@ import appeng.block.networking.CableBusBlock; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.NetworkToolContainer; +import appeng.core.Api; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.items.tools.NetworkToolItem; @@ -123,7 +123,7 @@ public class ClickPacket extends BasePacket { final BlockPos pos = new BlockPos(this.x, this.y, this.z); final ItemStack is = player.getHeldItem(hand); - final IItems items = AEApi.instance().definitions().items(); + final IItems items = Api.instance().definitions().items(); final IComparableDefinition maybeMemoryCard = items.memoryCard(); final IComparableDefinition maybeColorApplicator = items.colorApplicator(); diff --git a/src/main/java/appeng/core/sync/packets/JEIRecipePacket.java b/src/main/java/appeng/core/sync/packets/JEIRecipePacket.java index f4fae638b..c98c64b21 100644 --- a/src/main/java/appeng/core/sync/packets/JEIRecipePacket.java +++ b/src/main/java/appeng/core/sync/packets/JEIRecipePacket.java @@ -29,7 +29,6 @@ import net.minecraft.nbt.ListNBT; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; @@ -41,6 +40,7 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.helpers.IContainerCraftingPacket; @@ -113,7 +113,7 @@ public class JEIRecipePacket extends BasePacket { if (inv != null && this.recipe != null && security != null) { final IMEMonitor storage = inv - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IPartitionList filter = ViewCellItem.createFilter(cct.getViewCells()); for (int x = 0; x < craftMatrix.getSlots(); x++) { diff --git a/src/main/java/appeng/core/sync/packets/PatternSlotPacket.java b/src/main/java/appeng/core/sync/packets/PatternSlotPacket.java index 056b7f78f..d782db008 100644 --- a/src/main/java/appeng/core/sync/packets/PatternSlotPacket.java +++ b/src/main/java/appeng/core/sync/packets/PatternSlotPacket.java @@ -25,10 +25,10 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.container.implementations.PatternTermContainer; +import appeng.core.Api; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.util.item.AEItemStack; @@ -76,7 +76,7 @@ public class PatternSlotPacket extends BasePacket { this.writeItem(slotItem, data); for (int x = 0; x < 9; x++) { - this.pattern[x] = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + this.pattern[x] = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(pat.getStackInSlot(x)); this.writeItem(this.pattern[x], data); } diff --git a/src/main/java/appeng/crafting/CraftingJob.java b/src/main/java/appeng/crafting/CraftingJob.java index a7fcb7594..e6e8880cb 100644 --- a/src/main/java/appeng/crafting/CraftingJob.java +++ b/src/main/java/appeng/crafting/CraftingJob.java @@ -27,7 +27,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; @@ -44,6 +43,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.api.util.DimensionalCoord; import appeng.core.AELog; +import appeng.core.Api; import appeng.hooks.TickHandler; public class CraftingJob implements Runnable, ICraftingJob { @@ -52,9 +52,9 @@ public class CraftingJob implements Runnable, ICraftingJob { private final MECraftingInventory original; private final World world; - private final IItemList crafting = AEApi.instance().storage() + private final IItemList crafting = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); - private final IItemList missing = AEApi.instance().storage() + private final IItemList missing = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); private final HashMap opsAndMultiplier = new HashMap<>(); private final Object monitor = new Object(); @@ -85,7 +85,7 @@ public class CraftingJob implements Runnable, ICraftingJob { final ICraftingGrid cc = grid.getCache(ICraftingGrid.class); final IStorageGrid sg = grid.getCache(IStorageGrid.class); this.original = new MECraftingInventory( - sg.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)), actionSrc, + sg.getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)), actionSrc, false, false, false); this.setTree(this.getCraftingTree(cc, what)); diff --git a/src/main/java/appeng/crafting/CraftingTreeNode.java b/src/main/java/appeng/crafting/CraftingTreeNode.java index 03c22dfa7..67b5382d1 100644 --- a/src/main/java/appeng/crafting/CraftingTreeNode.java +++ b/src/main/java/appeng/crafting/CraftingTreeNode.java @@ -26,7 +26,6 @@ import com.google.common.collect.Lists; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.networking.crafting.ICraftingGrid; @@ -35,6 +34,7 @@ import appeng.api.networking.security.IActionSource; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.me.cluster.implementations.CraftingCPUCluster; public class CraftingTreeNode { @@ -42,7 +42,7 @@ public class CraftingTreeNode { // what slot! private final int slot; private final CraftingJob job; - private final IItemList used = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private final IItemList used = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); // parent node. private final CraftingTreeProcess parent; diff --git a/src/main/java/appeng/crafting/CraftingTreeProcess.java b/src/main/java/appeng/crafting/CraftingTreeProcess.java index 4033f009c..31019c314 100644 --- a/src/main/java/appeng/crafting/CraftingTreeProcess.java +++ b/src/main/java/appeng/crafting/CraftingTreeProcess.java @@ -28,7 +28,6 @@ import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.fml.hooks.BasicEventHooks; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.crafting.ICraftingGrid; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -37,6 +36,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.container.ContainerNull; +import appeng.core.Api; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.util.Platform; @@ -180,7 +180,7 @@ public class CraftingTreeProcess { ItemStack is = ic.getStackInSlot(x); is = Platform.getContainerItem(is); - final IAEItemStack o = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IAEItemStack o = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(is); if (o != null) { this.bytes++; @@ -195,7 +195,7 @@ public class CraftingTreeProcess { if (this.containerItems) { final ItemStack is = Platform.getContainerItem(stack.createItemStack()); - final IAEItemStack o = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IAEItemStack o = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(is); if (o != null) { this.bytes++; diff --git a/src/main/java/appeng/crafting/MECraftingInventory.java b/src/main/java/appeng/crafting/MECraftingInventory.java index 87fe9db16..75ac570f0 100644 --- a/src/main/java/appeng/crafting/MECraftingInventory.java +++ b/src/main/java/appeng/crafting/MECraftingInventory.java @@ -18,7 +18,6 @@ package appeng.crafting; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; import appeng.api.storage.IMEInventory; @@ -27,6 +26,7 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.util.inv.ItemListIgnoreCrafting; public class MECraftingInventory implements IMEInventory { @@ -47,7 +47,7 @@ public class MECraftingInventory implements IMEInventory { public MECraftingInventory() { this.localCache = new ItemListIgnoreCrafting<>( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); this.extractedCache = null; this.injectedCache = null; this.missingCache = null; @@ -65,25 +65,25 @@ public class MECraftingInventory implements IMEInventory { this.logMissing = parent.logMissing; if (this.logMissing) { - this.missingCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.missingCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.missingCache = null; } if (this.logExtracted) { - this.extractedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.extractedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.extractedCache = null; } if (this.logInjections) { - this.injectedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.injectedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.injectedCache = null; } this.localCache = this.target.getAvailableItems(new ItemListIgnoreCrafting<>( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList())); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList())); this.par = parent; } @@ -96,25 +96,25 @@ public class MECraftingInventory implements IMEInventory { this.logMissing = logMissing; if (logMissing) { - this.missingCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.missingCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.missingCache = null; } if (logExtracted) { - this.extractedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.extractedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.extractedCache = null; } if (logInjections) { - this.injectedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.injectedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.injectedCache = null; } this.localCache = new ItemListIgnoreCrafting<>( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); for (final IAEItemStack is : target.getStorageList()) { this.localCache.add(target.extractItems(is, Actionable.SIMULATE, src)); } @@ -130,25 +130,25 @@ public class MECraftingInventory implements IMEInventory { this.logMissing = logMissing; if (logMissing) { - this.missingCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.missingCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.missingCache = null; } if (logExtracted) { - this.extractedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.extractedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.extractedCache = null; } if (logInjections) { - this.injectedCache = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + this.injectedCache = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); } else { this.injectedCache = null; } - this.localCache = target.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + this.localCache = target + .getAvailableItems(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); this.par = null; } @@ -214,7 +214,7 @@ public class MECraftingInventory implements IMEInventory { @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } public IItemList getItemList() { @@ -222,9 +222,9 @@ public class MECraftingInventory implements IMEInventory { } public boolean commit(final IActionSource src) { - final IItemList added = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IItemList added = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); - final IItemList pulled = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IItemList pulled = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); boolean failed = false; diff --git a/src/main/java/appeng/entity/ChargedQuartzEntity.java b/src/main/java/appeng/entity/ChargedQuartzEntity.java index 0581023f9..75cccd1e5 100644 --- a/src/main/java/appeng/entity/ChargedQuartzEntity.java +++ b/src/main/java/appeng/entity/ChargedQuartzEntity.java @@ -32,11 +32,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IMaterials; import appeng.api.features.AEFeature; import appeng.client.EffectType; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.util.Platform; @@ -92,7 +92,7 @@ public final class ChargedQuartzEntity extends AEBaseItemEntity { private boolean transform() { final ItemStack item = this.getItem(); - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); if (materials.certusQuartzCrystalCharged().isSameAs(item)) { final AxisAlignedBB region = new AxisAlignedBB(this.getPosX() - 1, this.getPosY() - 1, this.getPosZ() - 1, diff --git a/src/main/java/appeng/entity/SingularityEntity.java b/src/main/java/appeng/entity/SingularityEntity.java index cbb4cbd80..0e11c14b5 100644 --- a/src/main/java/appeng/entity/SingularityEntity.java +++ b/src/main/java/appeng/entity/SingularityEntity.java @@ -30,10 +30,10 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IMaterials; import appeng.api.features.AEFeature; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.util.Platform; public final class SingularityEntity extends AEBaseItemEntity { @@ -71,7 +71,7 @@ public final class SingularityEntity extends AEBaseItemEntity { final ItemStack item = this.getItem(); - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); if (materials.singularity().isSameAs(item)) { final AxisAlignedBB region = new AxisAlignedBB(this.getPosX() - 4, this.getPosY() - 4, this.getPosZ() - 4, diff --git a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java index 55ad38ed2..23fbe2c62 100644 --- a/src/main/java/appeng/entity/TinyTNTPrimedEntity.java +++ b/src/main/java/appeng/entity/TinyTNTPrimedEntity.java @@ -45,9 +45,9 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; -import appeng.api.AEApi; import appeng.api.features.AEFeature; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.sync.packets.MockExplosionPacket; import appeng.util.Platform; @@ -102,7 +102,7 @@ public final class TinyTNTPrimedEntity extends TNTEntity implements IEntityAddit if (this.isInWater() && Platform.isServer()) // put out the fuse. { - AEApi.instance().definitions().blocks().tinyTNT().maybeStack(1).ifPresent(tntStack -> { + Api.instance().definitions().blocks().tinyTNT().maybeStack(1).ifPresent(tntStack -> { final ItemEntity item = new ItemEntity(this.world, this.getPosX(), this.getPosY(), this.getPosZ(), tntStack); diff --git a/src/main/java/appeng/facade/FacadeContainer.java b/src/main/java/appeng/facade/FacadeContainer.java index 283ac5118..24e8051bc 100644 --- a/src/main/java/appeng/facade/FacadeContainer.java +++ b/src/main/java/appeng/facade/FacadeContainer.java @@ -25,11 +25,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; -import appeng.api.AEApi; import appeng.api.parts.IFacadeContainer; import appeng.api.parts.IFacadePart; import appeng.api.parts.IPartHost; import appeng.api.util.AEPartLocation; +import appeng.core.Api; import appeng.items.parts.FacadeItem; import appeng.parts.CableBusStorage; @@ -109,7 +109,7 @@ public class FacadeContainer implements IFacadeContainer { if ((facadeSides & ix) == ix) { final int id = Math.abs(out.readInt()); - Optional maybeFacadeItem = AEApi.instance().definitions().items().facade() + Optional maybeFacadeItem = Api.instance().definitions().items().facade() .maybeItem(); if (maybeFacadeItem.isPresent()) { final FacadeItem ifa = (FacadeItem) maybeFacadeItem.get(); diff --git a/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java b/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java index 605b2704f..655d13633 100644 --- a/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java +++ b/src/main/java/appeng/fluids/container/FluidStorageBusContainer.java @@ -26,7 +26,6 @@ import net.minecraft.inventory.container.ContainerType; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.FuzzyMode; import appeng.api.config.SecurityPermissions; @@ -41,6 +40,7 @@ import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; import appeng.container.implementations.ContainerHelper; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.fluids.parts.FluidStorageBusPart; import appeng.fluids.util.IAEFluidTank; import appeng.util.Platform; @@ -162,7 +162,7 @@ public class FluidStorageBusContainer extends FluidConfigurableContainer { Iterator i = new NullIterator<>(); if (cellInv != null) { final IItemList list = cellInv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IFluidStorageChannel.class).createList()); i = list.iterator(); } diff --git a/src/main/java/appeng/fluids/container/FluidTerminalContainer.java b/src/main/java/appeng/fluids/container/FluidTerminalContainer.java index d4eebaed4..6cd449a40 100644 --- a/src/main/java/appeng/fluids/container/FluidTerminalContainer.java +++ b/src/main/java/appeng/fluids/container/FluidTerminalContainer.java @@ -36,7 +36,6 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.SecurityPermissions; @@ -66,6 +65,7 @@ import appeng.container.ContainerLocator; import appeng.container.guisync.GuiSync; import appeng.container.implementations.ContainerHelper; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.MEFluidInventoryUpdatePacket; @@ -100,7 +100,7 @@ public class FluidTerminalContainer extends AEBaseContainer private final IConfigManager clientCM; private final IMEMonitor monitor; - private final IItemList fluids = AEApi.instance().storage() + private final IItemList fluids = Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class).createList(); @GuiSync(99) public boolean hasPower = false; @@ -122,7 +122,7 @@ public class FluidTerminalContainer extends AEBaseContainer if (Platform.isServer()) { this.serverCM = terminal.getConfigManager(); this.monitor = terminal - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); if (this.monitor != null) { this.monitor.addListener(this, null); @@ -248,7 +248,7 @@ public class FluidTerminalContainer extends AEBaseContainer public void detectAndSendChanges() { if (Platform.isServer()) { if (this.monitor != this.terminal - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class))) { + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class))) { this.setValidContainer(false); } diff --git a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java index 2c4b5ad1e..ae8b30903 100644 --- a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java +++ b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java @@ -30,7 +30,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Settings; import appeng.api.config.Upgrades; @@ -58,6 +57,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; import appeng.capabilities.Capabilities; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.fluids.util.AEFluidInventory; import appeng.fluids.util.IAEFluidInventory; @@ -91,10 +91,9 @@ public class DualityFluidInterface private int priority; private final MEMonitorPassThrough items = new MEMonitorPassThrough<>( - new NullInventory(), AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + new NullInventory(), Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); private final MEMonitorPassThrough fluids = new MEMonitorPassThrough<>( - new NullInventory(), - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + new NullInventory(), Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); public DualityFluidInterface(final AENetworkProxy networkProxy, final IFluidInterfaceHost ih) { this.gridProxy = networkProxy; @@ -125,13 +124,13 @@ public class DualityFluidInterface @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { if (this.hasConfig()) { return null; } return (IMEMonitor) this.items; - } else if (channel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { + } else if (channel == Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { if (this.hasConfig()) { return (IMEMonitor) new InterfaceInventory(this); } @@ -185,9 +184,9 @@ public class DualityFluidInterface public void gridChanged() { try { this.items.setInternal(this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); this.fluids.setInternal(this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class))); } catch (final GridAccessException gae) { this.items.setInternal(new NullInventory()); this.fluids.setInternal(new NullInventory()); @@ -311,7 +310,7 @@ public class DualityFluidInterface boolean changed = false; try { final IMEInventory dest = this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); final IEnergySource src = this.gridProxy.getEnergy(); if (work.getStackSize() > 0) { diff --git a/src/main/java/appeng/fluids/helper/FluidCellConfig.java b/src/main/java/appeng/fluids/helper/FluidCellConfig.java index 3a6b97d94..392b29af3 100644 --- a/src/main/java/appeng/fluids/helper/FluidCellConfig.java +++ b/src/main/java/appeng/fluids/helper/FluidCellConfig.java @@ -26,7 +26,7 @@ import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; -import appeng.api.AEApi; +import appeng.core.Api; import appeng.fluids.items.FluidDummyItem; import appeng.items.contents.CellConfig; @@ -47,14 +47,13 @@ public class FluidCellConfig extends CellConfig { super.insertItem(slot, stack, simulate); } LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); - if (!fluidOpt.isPresent() - || !AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { + if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return stack; } FluidStack fluid = fluidOpt.orElse(null); fluid.setAmount(FluidAttributes.BUCKET_VOLUME); - ItemStack is = AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); + ItemStack is = Api.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); FluidDummyItem item = (FluidDummyItem) is.getItem(); item.setFluidStack(is, fluid); return super.insertItem(slot, is, simulate); @@ -66,14 +65,13 @@ public class FluidCellConfig extends CellConfig { super.setStackInSlot(slot, stack); } LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); - if (!fluidOpt.isPresent() - || !AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { + if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return; } FluidStack fluid = fluidOpt.orElse(null); fluid.setAmount(FluidAttributes.BUCKET_VOLUME); - ItemStack is = AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); + ItemStack is = Api.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); FluidDummyItem item = (FluidDummyItem) is.getItem(); item.setFluidStack(is, fluid); super.setStackInSlot(slot, is); @@ -85,14 +83,13 @@ public class FluidCellConfig extends CellConfig { super.isItemValid(slot, stack); } LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); - if (!fluidOpt.isPresent() - || !AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { + if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return false; } FluidStack fluid = fluidOpt.orElse(null); fluid.setAmount(FluidAttributes.BUCKET_VOLUME); - ItemStack is = AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); + ItemStack is = Api.instance().definitions().items().dummyFluidItem().maybeStack(1).get(); FluidDummyItem item = (FluidDummyItem) is.getItem(); item.setFluidStack(is, fluid); return super.isItemValid(slot, is); diff --git a/src/main/java/appeng/fluids/items/BasicFluidStorageCell.java b/src/main/java/appeng/fluids/items/BasicFluidStorageCell.java index 52f4de6a8..fd0d4fd9a 100644 --- a/src/main/java/appeng/fluids/items/BasicFluidStorageCell.java +++ b/src/main/java/appeng/fluids/items/BasicFluidStorageCell.java @@ -22,10 +22,10 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.core.Api; import appeng.fluids.helper.FluidCellConfig; import appeng.items.materials.MaterialType; import appeng.items.storage.AbstractStorageCell; @@ -79,7 +79,7 @@ public final class BasicFluidStorageCell extends AbstractStorageCell getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override @@ -94,7 +94,7 @@ public final class BasicFluidStorageCell extends AbstractStorageCell { + Api.instance().definitions().materials().emptyStorageCell().maybeStack(1).ifPresent(is -> { final ItemStack extraA = ia.addItems(is); if (!extraA.isEmpty()) { player.dropItem(extraA, false); diff --git a/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java b/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java index b75099c4d..bce367828 100644 --- a/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java +++ b/src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java @@ -23,7 +23,6 @@ import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.networking.IGridNode; @@ -45,6 +44,7 @@ import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.settings.TickRates; import appeng.core.sync.packets.BlockTransitionEffectPacket; @@ -280,7 +280,7 @@ public class FluidAnnihilationPlanePart extends BasicStatePart implements IGridT try { final IStorageGrid storage = this.getProxy().getStorage(); final IMEInventory inv = storage - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); if (modulate) { final IEnergyGrid energy = this.getProxy().getEnergy(); diff --git a/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java b/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java index 427385657..fdc17efea 100644 --- a/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java +++ b/src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java @@ -27,7 +27,6 @@ import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.templates.FluidTank; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.IncludeExclude; @@ -46,6 +45,7 @@ import appeng.api.storage.data.IItemList; import appeng.api.util.AEPartLocation; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.fluids.container.FluidFormationPlaneContainer; import appeng.fluids.util.AEFluidInventory; import appeng.fluids.util.IAEFluidInventory; @@ -69,7 +69,7 @@ public class FluidFormationPlanePart extends AbstractFormationPlanePart myHandler = new MEInventoryHandler<>(this, - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); private final AEFluidInventory config = new AEFluidInventory(this, 63); public FluidFormationPlanePart(final ItemStack is) { @@ -84,7 +84,7 @@ public class FluidFormationPlanePart extends AbstractFormationPlanePart 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.myHandler.setPriority(this.getPriority()); - final IItemList priorityList = AEApi.instance().storage() + final IItemList priorityList = Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class).createList(); final int slotsToUse = 18 + this.getInstalledUpgrades(Upgrades.CAPACITY) * 9; @@ -183,13 +183,13 @@ public class FluidFormationPlanePart extends AbstractFormationPlanePart getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override public List getCellArray(final IStorageChannel channel) { if (this.getProxy().isActive() - && channel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { + && channel == Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { final List handler = new ArrayList<>(1); handler.add(this.myHandler); return handler; @@ -214,7 +214,7 @@ public class FluidFormationPlanePart extends AbstractFormationPlanePart, IBaseMo @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override diff --git a/src/main/java/appeng/fluids/parts/FluidInterfacePart.java b/src/main/java/appeng/fluids/parts/FluidInterfacePart.java index 7889520f6..414a3e0a6 100644 --- a/src/main/java/appeng/fluids/parts/FluidInterfacePart.java +++ b/src/main/java/appeng/fluids/parts/FluidInterfacePart.java @@ -33,7 +33,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -52,6 +51,7 @@ import appeng.api.util.AECableType; import appeng.api.util.IConfigManager; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.core.AppEng; import appeng.fluids.container.FluidInterfaceContainer; import appeng.fluids.helper.DualityFluidInterface; @@ -206,7 +206,7 @@ public class FluidInterfacePart extends BasicStatePart @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().parts().fluidIface().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().parts().fluidIface().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/fluids/parts/FluidLevelEmitterPart.java b/src/main/java/appeng/fluids/parts/FluidLevelEmitterPart.java index 63b0a13b6..ea04aae42 100644 --- a/src/main/java/appeng/fluids/parts/FluidLevelEmitterPart.java +++ b/src/main/java/appeng/fluids/parts/FluidLevelEmitterPart.java @@ -14,7 +14,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -38,6 +37,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.IConfigManager; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.core.AppEng; import appeng.fluids.container.FluidLevelEmitterContainer; import appeng.fluids.util.AEFluidInventory; @@ -112,7 +112,7 @@ public class FluidLevelEmitterPart extends UpgradeablePart @Override public void onStackChange(IItemList o, IAEStack fullStack, IAEStack diffStack, IActionSource src, IStorageChannel chan) { - if (chan == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class) + if (chan == Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) && fullStack.equals(this.config.getFluidInSlot(0))) { this.lastReportedValue = fullStack.getStackSize(); this.updateState(); @@ -167,7 +167,7 @@ public class FluidLevelEmitterPart extends UpgradeablePart @Override public void onListUpdate() { try { - final IStorageChannel channel = AEApi.instance().storage() + final IStorageChannel channel = Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class); final IMEMonitor inventory = this.getProxy().getStorage().getInventory(channel); @@ -189,7 +189,7 @@ public class FluidLevelEmitterPart extends UpgradeablePart } private void configureWatchers() { - final IFluidStorageChannel channel = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + final IFluidStorageChannel channel = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); if (this.stackWatcher != null) { this.stackWatcher.reset(); diff --git a/src/main/java/appeng/fluids/parts/FluidStorageBusPart.java b/src/main/java/appeng/fluids/parts/FluidStorageBusPart.java index 23a7841f9..dff3945c0 100644 --- a/src/main/java/appeng/fluids/parts/FluidStorageBusPart.java +++ b/src/main/java/appeng/fluids/parts/FluidStorageBusPart.java @@ -37,7 +37,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.FuzzyMode; import appeng.api.config.IncludeExclude; @@ -66,6 +65,7 @@ import appeng.api.util.AEPartLocation; import appeng.capabilities.Capabilities; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.settings.TickRates; import appeng.fluids.container.FluidStorageBusContainer; @@ -127,7 +127,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart if (accessor != null) { IStorageMonitorable inventory = accessor.getInventory(this.source); if (inventory != null) { - return inventory.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + return inventory.getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); } // So this could / can be a design decision. If the tile does support our custom @@ -169,7 +169,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart this.resetCacheLogic = 0; final IMEInventory in = this.getInternalHandler(); - IItemList before = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class) + IItemList before = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) .createList(); if (in != null) { before = in.getAvailableItems(before); @@ -183,7 +183,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart final IMEInventory out = this.getInternalHandler(); if (in != out) { - IItemList after = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class) + IItemList after = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) .createList(); if (out != null) { after = out.getAvailableItems(after); @@ -250,7 +250,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart try { if (this.getProxy().isActive()) { this.getProxy().getStorage().postAlterationOfStoredItems( - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class), change, this.source); + Api.instance().storage().getStorageChannel(IFluidStorageChannel.class), change, this.source); } } catch (final GridAccessException e) { // :( @@ -287,14 +287,14 @@ public class FluidStorageBusPart extends SharedStorageBusPart this.checkInterfaceVsStorageBus(target, this.getSide().getOpposite()); this.handler = new MEInventoryHandler<>(inv, - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); this.handler.setBaseAccess((AccessRestriction) this.getConfigManager().getSetting(Settings.ACCESS)); this.handler.setWhitelist(this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.handler.setPriority(this.getPriority()); - final IItemList priorityList = AEApi.instance().storage() + final IItemList priorityList = Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class).createList(); final int slotsToUse = 18 + this.getInstalledUpgrades(Upgrades.CAPACITY) * 9; @@ -413,7 +413,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart @Override public IStorageChannel getStorageChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } public IAEFluidTank getConfig() { @@ -434,7 +434,7 @@ public class FluidStorageBusPart extends SharedStorageBusPart @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().parts().fluidStorageBus().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().parts().fluidStorageBus().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java b/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java index b88649d01..94b10776d 100644 --- a/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java +++ b/src/main/java/appeng/fluids/parts/SharedFluidBusPart.java @@ -30,7 +30,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.RedstoneMode; import appeng.api.config.Upgrades; import appeng.api.networking.ticking.IGridTickable; @@ -40,6 +39,7 @@ import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.util.AECableType; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.fluids.container.FluidIOContainer; import appeng.fluids.util.AEFluidInventory; import appeng.fluids.util.IAEFluidTank; @@ -154,7 +154,7 @@ public abstract class SharedFluidBusPart extends UpgradeablePart implements IGri } protected IFluidStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override diff --git a/src/main/java/appeng/fluids/registries/BasicFluidCellGuiHandler.java b/src/main/java/appeng/fluids/registries/BasicFluidCellGuiHandler.java index 0e1a6b25b..ac8a69698 100644 --- a/src/main/java/appeng/fluids/registries/BasicFluidCellGuiHandler.java +++ b/src/main/java/appeng/fluids/registries/BasicFluidCellGuiHandler.java @@ -22,7 +22,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import appeng.api.AEApi; import appeng.api.implementations.tiles.IChestOrDrive; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.IStorageChannel; @@ -32,13 +31,14 @@ import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEStack; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; +import appeng.core.Api; import appeng.fluids.container.FluidTerminalContainer; public class BasicFluidCellGuiHandler implements ICellGuiHandler { @Override public > boolean isHandlerFor(final IStorageChannel channel) { - return channel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return channel == Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override diff --git a/src/main/java/appeng/fluids/tile/FluidInterfaceTileEntity.java b/src/main/java/appeng/fluids/tile/FluidInterfaceTileEntity.java index 9ff0640b7..95af9e7af 100644 --- a/src/main/java/appeng/fluids/tile/FluidInterfaceTileEntity.java +++ b/src/main/java/appeng/fluids/tile/FluidInterfaceTileEntity.java @@ -32,7 +32,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -45,6 +44,7 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; +import appeng.core.Api; import appeng.fluids.container.FluidInterfaceContainer; import appeng.fluids.helper.DualityFluidInterface; import appeng.fluids.helper.IFluidInterfaceHost; @@ -158,7 +158,7 @@ public class FluidInterfaceTileEntity extends AENetworkTileEntity @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().blocks().fluidIface().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().blocks().fluidIface().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/fluids/util/AEFluidStack.java b/src/main/java/appeng/fluids/util/AEFluidStack.java index 00433bd84..c07acd070 100644 --- a/src/main/java/appeng/fluids/util/AEFluidStack.java +++ b/src/main/java/appeng/fluids/util/AEFluidStack.java @@ -33,11 +33,11 @@ import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.core.Api; import appeng.fluids.items.FluidDummyItem; import appeng.util.Platform; import appeng.util.item.AEStack; @@ -154,7 +154,7 @@ public final class AEFluidStack extends AEStack implements IAEFlu @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override @@ -218,7 +218,7 @@ public final class AEFluidStack extends AEStack implements IAEFlu @Override public ItemStack asItemStackRepresentation() { - ItemStack is = AEApi.instance().definitions().items().dummyFluidItem().maybeStack(1).orElse(ItemStack.EMPTY); + ItemStack is = Api.instance().definitions().items().dummyFluidItem().maybeStack(1).orElse(ItemStack.EMPTY); if (!is.isEmpty()) { FluidDummyItem item = (FluidDummyItem) is.getItem(); item.setFluidStack(is, this.getFluidStack()); diff --git a/src/main/java/appeng/forge/data/providers/IAE2DataProvider.java b/src/main/java/appeng/forge/data/providers/IAE2DataProvider.java index 3548de4b6..e1b5ac5ae 100644 --- a/src/main/java/appeng/forge/data/providers/IAE2DataProvider.java +++ b/src/main/java/appeng/forge/data/providers/IAE2DataProvider.java @@ -2,13 +2,13 @@ package appeng.forge.data.providers; import net.minecraft.data.IDataProvider; -import appeng.api.AEApi; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IItems; import appeng.api.definitions.IMaterials; +import appeng.core.Api; public interface IAE2DataProvider extends IDataProvider { - IBlocks BLOCKS = AEApi.instance().definitions().blocks(); - IItems ITEMS = AEApi.instance().definitions().items(); - IMaterials MATERIALS = AEApi.instance().definitions().materials(); + IBlocks BLOCKS = Api.instance().definitions().blocks(); + IItems ITEMS = Api.instance().definitions().items(); + IMaterials MATERIALS = Api.instance().definitions().materials(); } diff --git a/src/main/java/appeng/forge/data/providers/recipes/SlabStairRecipes.java b/src/main/java/appeng/forge/data/providers/recipes/SlabStairRecipes.java index 1077b6311..d2be6168d 100644 --- a/src/main/java/appeng/forge/data/providers/recipes/SlabStairRecipes.java +++ b/src/main/java/appeng/forge/data/providers/recipes/SlabStairRecipes.java @@ -12,7 +12,6 @@ import net.minecraft.data.ShapedRecipeBuilder; import net.minecraft.data.SingleItemRecipeBuilder; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.crafting.ConditionalRecipe; import appeng.api.definitions.IBlockDefinition; import appeng.core.AppEng; diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index bdfd3a176..97a7bb8a4 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -53,7 +53,6 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.RangedWrapper; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Settings; import appeng.api.config.Upgrades; @@ -91,6 +90,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; import appeng.capabilities.Capabilities; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; @@ -131,10 +131,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn private final AppEngInternalInventory storage = new AppEngInternalInventory(this, NUMBER_OF_STORAGE_SLOTS); private final AppEngInternalInventory patterns = new AppEngInternalInventory(this, NUMBER_OF_PATTERN_SLOTS); private final MEMonitorPassThrough items = new MEMonitorPassThrough<>( - new NullInventory(), AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + new NullInventory(), Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); private final MEMonitorPassThrough fluids = new MEMonitorPassThrough<>( - new NullInventory(), - AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)); + new NullInventory(), Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)); private final UpgradeInventory upgrades; private boolean hasConfig = false; private int priority; @@ -360,7 +359,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn final ItemStack stored = this.storage.getStackInSlot(slot); if (req == null && !stored.isEmpty()) { - final IAEItemStack work = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IAEItemStack work = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(stored); this.requireWork[slot] = work.setStackSize(-work.getStackSize()); return; @@ -379,7 +378,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn } else // Stored != null; dispose! { - final IAEItemStack work = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IAEItemStack work = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(stored); this.requireWork[slot] = work.setStackSize(-work.getStackSize()); return; @@ -433,7 +432,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn @Override public boolean canInsert(final ItemStack stack) { final IAEItemStack out = this.destination.injectItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(stack), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(stack), Actionable.SIMULATE, null); if (out == null) { return true; @@ -456,9 +455,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn public void gridChanged() { try { this.items.setInternal(this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); this.fluids.setInternal(this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IFluidStorageChannel.class))); } catch (final GridAccessException gae) { this.items.setInternal(new NullInventory()); this.fluids.setInternal(new NullInventory()); @@ -563,7 +562,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn boolean changed = false; try { this.destination = this.gridProxy.getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IEnergySource src = this.gridProxy.getEnergy(); if (this.craftingTracker.isBusy(x)) { @@ -663,13 +662,13 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { if (this.hasConfig()) { return (IMEMonitor) new InterfaceInventory(this); } return (IMEMonitor) this.items; - } else if (channel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { + } else if (channel == Api.instance().storage().getStorageChannel(IFluidStorageChannel.class)) { if (this.hasConfig()) { return null; } @@ -737,7 +736,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { return (IMEMonitor) new InterfaceInventory(di); } return null; diff --git a/src/main/java/appeng/helpers/MultiCraftingTracker.java b/src/main/java/appeng/helpers/MultiCraftingTracker.java index e8edf1ae9..b388cdef2 100644 --- a/src/main/java/appeng/helpers/MultiCraftingTracker.java +++ b/src/main/java/appeng/helpers/MultiCraftingTracker.java @@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableSet; import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.networking.IGrid; import appeng.api.networking.crafting.ICraftingGrid; import appeng.api.networking.crafting.ICraftingJob; @@ -34,6 +33,7 @@ import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingRequester; import appeng.api.networking.security.IActionSource; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.util.InventoryAdaptor; public class MultiCraftingTracker { @@ -54,7 +54,7 @@ public class MultiCraftingTracker { final CompoundNBT link = extra.getCompound("links-" + x); if (link != null && !link.isEmpty()) { - this.setLink(x, AEApi.instance().storage().loadCraftingLink(link, this.owner)); + this.setLink(x, Api.instance().storage().loadCraftingLink(link, this.owner)); } } } diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/PatternHelper.java index 383ba4355..0664ec83e 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/PatternHelper.java @@ -34,11 +34,11 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.container.ContainerNull; +import appeng.core.Api; import appeng.util.Platform; import appeng.util.item.AEItemStack; @@ -92,7 +92,7 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable { } private List getViableStorageComponents(CondenserOutput condenserOutput) { - IMaterials materials = AEApi.instance().definitions().materials(); + IMaterials materials = Api.instance().definitions().materials(); List viableComponents = new ArrayList<>(); materials.cell1kPart().maybeStack(1) .ifPresent(itemStack -> this.addViableComponent(condenserOutput, viableComponents, itemStack)); diff --git a/src/main/java/appeng/integration/modules/jei/JEIPlugin.java b/src/main/java/appeng/integration/modules/jei/JEIPlugin.java index 71e6282cf..d7365ce86 100644 --- a/src/main/java/appeng/integration/modules/jei/JEIPlugin.java +++ b/src/main/java/appeng/integration/modules/jei/JEIPlugin.java @@ -42,7 +42,6 @@ import mezz.jei.api.registration.IRecipeTransferRegistration; import mezz.jei.api.registration.ISubtypeRegistration; import mezz.jei.api.runtime.IJeiRuntime; -import appeng.api.AEApi; import appeng.api.config.CondenserOutput; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; @@ -70,7 +69,7 @@ public class JEIPlugin implements IModPlugin { @Override public void registerItemSubtypes(ISubtypeRegistration subtypeRegistry) { - final Optional maybeFacade = AEApi.instance().definitions().items().facade().maybeItem(); + final Optional maybeFacade = Api.instance().definitions().items().facade().maybeItem(); maybeFacade.ifPresent(subtypeRegistry::useNbtForSubtypes); } @@ -93,7 +92,7 @@ public class JEIPlugin implements IModPlugin { @Override public void registerRecipes(IRecipeRegistration registration) { - IDefinitions definitions = AEApi.instance().definitions(); + IDefinitions definitions = Api.instance().definitions(); RecipeManager recipeManager = Minecraft.getInstance().world.getRecipeManager(); registration.addRecipes(recipeManager.getRecipes(GrinderRecipe.TYPE).values(), GrinderRecipeCategory.UID); @@ -106,7 +105,7 @@ public class JEIPlugin implements IModPlugin { @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - IDefinitions definitions = AEApi.instance().definitions(); + IDefinitions definitions = Api.instance().definitions(); ItemStack grindstone = definitions.blocks().grindstone().stack(1); registration.addRecipeCatalyst(grindstone, GrinderRecipeCategory.UID); @@ -165,7 +164,7 @@ public class JEIPlugin implements IModPlugin { @Override public void registerAdvanced(IAdvancedRegistration registration) { - IDefinitions definitions = AEApi.instance().definitions(); + IDefinitions definitions = Api.instance().definitions(); if (AEConfig.instance().isFeatureEnabled(AEFeature.ENABLE_FACADE_CRAFTING)) { FacadeItem itemFacade = (FacadeItem) definitions.items().facade().item(); diff --git a/src/main/java/appeng/items/contents/PortableCellViewer.java b/src/main/java/appeng/items/contents/PortableCellViewer.java index 2d23feae6..59b88f306 100644 --- a/src/main/java/appeng/items/contents/PortableCellViewer.java +++ b/src/main/java/appeng/items/contents/PortableCellViewer.java @@ -21,7 +21,6 @@ package appeng.items.contents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.Settings; @@ -37,6 +36,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.util.IConfigManager; import appeng.container.interfaces.IInventorySlotAware; +import appeng.core.Api; import appeng.me.helpers.MEMonitorHandler; import appeng.util.ConfigManager; @@ -47,8 +47,8 @@ public class PortableCellViewer extends MEMonitorHandler implement private final int inventorySlot; public PortableCellViewer(final ItemStack is, final int slot) { - super(AEApi.instance().registries().cell().getCellInventory(is, null, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + super(Api.instance().registries().cell().getCellInventory(is, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); this.ips = (IAEItemPowerStorage) is.getItem(); this.target = is; this.inventorySlot = slot; @@ -77,7 +77,7 @@ public class PortableCellViewer extends MEMonitorHandler implement @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { return (IMEMonitor) this; } return null; diff --git a/src/main/java/appeng/items/misc/EncodedPatternItem.java b/src/main/java/appeng/items/misc/EncodedPatternItem.java index e1963d7e6..41dd4b3df 100644 --- a/src/main/java/appeng/items/misc/EncodedPatternItem.java +++ b/src/main/java/appeng/items/misc/EncodedPatternItem.java @@ -37,10 +37,10 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.AEApi; import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.localization.GuiText; import appeng.helpers.InvalidPatternHelper; @@ -76,7 +76,7 @@ public class EncodedPatternItem extends AEBaseItem implements ICraftingPatternIt final PlayerInventory inv = player.inventory; - ItemStack is = AEApi.instance().definitions().materials().blankPattern().maybeStack(stack.getCount()) + ItemStack is = Api.instance().definitions().materials().blankPattern().maybeStack(stack.getCount()) .orElse(ItemStack.EMPTY); if (!is.isEmpty()) { for (int s = 0; s < player.inventory.getSizeInventory(); s++) { diff --git a/src/main/java/appeng/items/parts/FacadeItem.java b/src/main/java/appeng/items/parts/FacadeItem.java index d696748e5..d69441ca5 100644 --- a/src/main/java/appeng/items/parts/FacadeItem.java +++ b/src/main/java/appeng/items/parts/FacadeItem.java @@ -24,7 +24,12 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tags.BlockTags; import net.minecraft.tags.Tag; @@ -37,12 +42,12 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.world.EmptyBlockReader; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; import appeng.api.exceptions.MissingDefinitionException; import appeng.api.features.AEFeature; import appeng.api.parts.IAlphaPassItem; import appeng.api.util.AEPartLocation; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.facade.FacadePart; import appeng.facade.IFacadeItem; @@ -63,7 +68,7 @@ public class FacadeItem extends AEBaseItem implements IFacadeItem, IAlphaPassIte @Override public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { - return AEApi.instance().partHelper().placeBus(stack, context.getPos(), context.getFace(), context.getPlayer(), + return Api.instance().partHelper().placeBus(stack, context.getPos(), context.getFace(), context.getPlayer(), context.getHand(), context.getWorld()); } @@ -171,7 +176,7 @@ public class FacadeItem extends AEBaseItem implements IFacadeItem, IAlphaPassIte } public ItemStack createFromID(final int id) { - ItemStack facadeStack = AEApi.instance().definitions().items().facade().maybeStack(1).orElseThrow( + ItemStack facadeStack = Api.instance().definitions().items().facade().maybeStack(1).orElseThrow( () -> new MissingDefinitionException("Tried to create a facade, while facades are being deactivated.")); // Convert back to a registry name... diff --git a/src/main/java/appeng/items/parts/PartItem.java b/src/main/java/appeng/items/parts/PartItem.java index 0e33ebb7d..1ef762a40 100644 --- a/src/main/java/appeng/items/parts/PartItem.java +++ b/src/main/java/appeng/items/parts/PartItem.java @@ -25,9 +25,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.util.ActionResultType; -import appeng.api.AEApi; import appeng.api.parts.IPart; import appeng.api.parts.IPartItem; +import appeng.core.Api; import appeng.items.AEBaseItem; public class PartItem extends AEBaseItem implements IPartItem { @@ -47,7 +47,7 @@ public class PartItem extends AEBaseItem implements IPartItem> extends AEBaseI @Override public void addInformation(final ItemStack stack, final World world, final List lines, final ITooltipFlag advancedTooltips) { - AEApi.instance().client().addCellInformation( - AEApi.instance().registries().cell().getCellInventory(stack, null, this.getChannel()), lines); + Api.instance().client().addCellInformation( + Api.instance().registries().cell().getCellInventory(stack, null, this.getChannel()), lines); } @Override @@ -145,7 +143,7 @@ public abstract class AbstractStorageCell> extends AEBaseI } final PlayerInventory playerInventory = player.inventory; - final IMEInventoryHandler inv = AEApi.instance().registries().cell().getCellInventory(stack, null, + final IMEInventoryHandler inv = Api.instance().registries().cell().getCellInventory(stack, null, this.getChannel()); if (inv != null && playerInventory.getCurrentItem() == stack) { final InventoryAdaptor ia = InventoryAdaptor.getAdaptor(player); @@ -193,7 +191,7 @@ public abstract class AbstractStorageCell> extends AEBaseI @Override public ItemStack getContainerItem(final ItemStack itemStack) { - return AEApi.instance().definitions().materials().emptyStorageCell().maybeStack(1) + return Api.instance().definitions().materials().emptyStorageCell().maybeStack(1) .orElseThrow(() -> new MissingDefinitionException( "Tried to use empty storage cells while basic storage cells are defined.")); } diff --git a/src/main/java/appeng/items/storage/BasicStorageCellItem.java b/src/main/java/appeng/items/storage/BasicStorageCellItem.java index 1cae5a15f..92ce4662a 100644 --- a/src/main/java/appeng/items/storage/BasicStorageCellItem.java +++ b/src/main/java/appeng/items/storage/BasicStorageCellItem.java @@ -21,10 +21,10 @@ package appeng.items.storage; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.items.materials.MaterialType; import appeng.util.InventoryAdaptor; @@ -71,12 +71,12 @@ public final class BasicStorageCellItem extends AbstractStorageCell getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override protected void dropEmptyStorageCellCase(final InventoryAdaptor ia, final PlayerEntity player) { - AEApi.instance().definitions().materials().emptyStorageCell().maybeStack(1).ifPresent(is -> { + Api.instance().definitions().materials().emptyStorageCell().maybeStack(1).ifPresent(is -> { final ItemStack extraA = ia.addItems(is); if (!extraA.isEmpty()) { player.dropItem(extraA, false); diff --git a/src/main/java/appeng/items/storage/CreativeStorageCellItem.java b/src/main/java/appeng/items/storage/CreativeStorageCellItem.java index c14d74bad..54e834f2e 100644 --- a/src/main/java/appeng/items/storage/CreativeStorageCellItem.java +++ b/src/main/java/appeng/items/storage/CreativeStorageCellItem.java @@ -28,12 +28,12 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.cells.ICellInventoryHandler; import appeng.api.storage.cells.ICellWorkbenchItem; import appeng.api.storage.channels.IItemStorageChannel; +import appeng.core.Api; import appeng.items.AEBaseItem; import appeng.items.contents.CellConfig; @@ -72,8 +72,8 @@ public class CreativeStorageCellItem extends AEBaseItem implements ICellWorkbenc @Override public void addInformation(final ItemStack stack, final World world, final List lines, final ITooltipFlag advancedTooltips) { - final IMEInventoryHandler inventory = AEApi.instance().registries().cell().getCellInventory(stack, null, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final IMEInventoryHandler inventory = Api.instance().registries().cell().getCellInventory(stack, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (inventory instanceof ICellInventoryHandler) { final CellConfig cc = new CellConfig(stack); diff --git a/src/main/java/appeng/items/storage/ViewCellItem.java b/src/main/java/appeng/items/storage/ViewCellItem.java index 2439b87ca..3f9e8a037 100644 --- a/src/main/java/appeng/items/storage/ViewCellItem.java +++ b/src/main/java/appeng/items/storage/ViewCellItem.java @@ -21,7 +21,6 @@ package appeng.items.storage; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.config.Upgrades; import appeng.api.implementations.items.IUpgradeModule; @@ -29,6 +28,7 @@ import appeng.api.storage.cells.ICellWorkbenchItem; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.items.AEBaseItem; import appeng.items.contents.CellConfig; import appeng.items.contents.CellUpgrades; @@ -55,7 +55,7 @@ public class ViewCellItem extends AEBaseItem implements ICellWorkbenchItem { } if ((currentViewCell.getItem() instanceof ViewCellItem)) { - final IItemList priorityList = AEApi.instance().storage() + final IItemList priorityList = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); final ICellWorkbenchItem vc = (ICellWorkbenchItem) currentViewCell.getItem(); diff --git a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java index 7380ce220..3b26b952d 100644 --- a/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java +++ b/src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java @@ -18,7 +18,10 @@ package appeng.items.tools.powered; -import java.util.*; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import javax.annotation.Nullable; @@ -49,7 +52,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.implementations.items.IStorageCell; @@ -65,6 +67,7 @@ import appeng.api.util.DimensionalCoord; import appeng.block.networking.CableBusBlock; import appeng.block.paint.PaintSplotchesBlock; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.localization.GuiText; import appeng.helpers.IMouseWheelItem; @@ -128,8 +131,8 @@ public class ColorApplicatorItem extends AEBasePoweredItem ItemStack paintBall = this.getColor(is); - final IMEInventory inv = AEApi.instance().registries().cell().getCellInventory(is, null, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final IMEInventory inv = Api.instance().registries().cell().getCellInventory(is, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (inv != null) { final IAEItemStack option = inv.extractItems(AEItemStack.fromItemStack(paintBall), Actionable.SIMULATE, new BaseActionSource()); @@ -249,11 +252,11 @@ public class ColorApplicatorItem extends AEBasePoweredItem private ItemStack findNextColor(final ItemStack is, final ItemStack anchor, final int scrollOffset) { ItemStack newColor = ItemStack.EMPTY; - final IMEInventory inv = AEApi.instance().registries().cell().getCellInventory(is, null, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final IMEInventory inv = Api.instance().registries().cell().getCellInventory(is, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (inv != null) { final IItemList itemList = inv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); if (anchor.isEmpty()) { final IAEItemStack firstItem = itemList.getFirstItem(); if (firstItem != null) { @@ -359,10 +362,10 @@ public class ColorApplicatorItem extends AEBasePoweredItem final ITooltipFlag advancedTooltips) { super.addInformation(stack, world, lines, advancedTooltips); - final ICellInventoryHandler cdi = AEApi.instance().registries().cell().getCellInventory(stack, - null, AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final ICellInventoryHandler cdi = Api.instance().registries().cell().getCellInventory(stack, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); - AEApi.instance().client().addCellInformation(cdi, lines); + Api.instance().client().addCellInformation(cdi, lines); } @Override @@ -405,7 +408,7 @@ public class ColorApplicatorItem extends AEBasePoweredItem @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java b/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java index 2eb1c251e..7d5a7e3c2 100644 --- a/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java +++ b/src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java @@ -18,7 +18,12 @@ package appeng.items.tools.powered; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -30,12 +35,21 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.Items; import net.minecraft.item.crafting.FurnaceRecipe; import net.minecraft.item.crafting.IRecipeType; import net.minecraft.particles.ParticleTypes; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; diff --git a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java index 187cb4bb6..364d83fa4 100644 --- a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java +++ b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java @@ -51,7 +51,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.config.Upgrades; @@ -66,6 +65,7 @@ import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.core.AEConfig; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.localization.PlayerMessages; import appeng.core.sync.network.NetworkHandler; @@ -98,10 +98,10 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< final ITooltipFlag advancedTooltips) { super.addInformation(stack, world, lines, advancedTooltips); - final ICellInventoryHandler cdi = AEApi.instance().registries().cell().getCellInventory(stack, - null, AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final ICellInventoryHandler cdi = Api.instance().registries().cell().getCellInventory(stack, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); - AEApi.instance().client().addCellInformation(cdi, lines); + Api.instance().client().addCellInformation(cdi, lines); } @Override @@ -114,11 +114,11 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< shots += cu.getInstalledUpgrades(Upgrades.SPEED); } - final ICellInventoryHandler inv = AEApi.instance().registries().cell().getCellInventory( - p.getHeldItem(hand), null, AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final ICellInventoryHandler inv = Api.instance().registries().cell().getCellInventory( + p.getHeldItem(hand), null, Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (inv != null) { final IItemList itemList = inv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); IAEItemStack req = itemList.getFirstItem(); if (req instanceof IAEItemStack) { shots = Math.min(shots, (int) req.getStackSize()); @@ -152,7 +152,7 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< final double d1 = rayFrom.y; final double d2 = rayFrom.z; - final float penetration = AEApi.instance().registries().matterCannon().getPenetration(ammo); // 196.96655f; + final float penetration = Api.instance().registries().matterCannon().getPenetration(ammo); // 196.96655f; if (penetration <= 0) { final ItemStack type = aeAmmo.asItemStackRepresentation(); if (type.getItem() instanceof PaintBallItem) { @@ -266,7 +266,7 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< final BlockState whatsThere = w.getBlockState(hitPos); if (whatsThere.getMaterial().isReplaceable() && w.isAirBlock(hitPos)) { - AEApi.instance().definitions().blocks().paint().maybeBlock().ifPresent(paintBlock -> { + Api.instance().definitions().blocks().paint().maybeBlock().ifPresent(paintBlock -> { w.setBlockState(hitPos, paintBlock.getDefaultState(), 3); }); } @@ -439,7 +439,7 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< @Override public boolean isBlackListed(final ItemStack cellItem, final IAEItemStack requestedAddition) { - final float pen = AEApi.instance().registries().matterCannon() + final float pen = Api.instance().registries().matterCannon() .getPenetration(requestedAddition.createItemStack()); if (pen > 0) { return false; @@ -469,6 +469,6 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } } diff --git a/src/main/java/appeng/items/tools/powered/PortableCellItem.java b/src/main/java/appeng/items/tools/powered/PortableCellItem.java index 3f0ce0360..6655822c0 100644 --- a/src/main/java/appeng/items/tools/powered/PortableCellItem.java +++ b/src/main/java/appeng/items/tools/powered/PortableCellItem.java @@ -19,7 +19,6 @@ package appeng.items.tools.powered; import java.util.List; -import java.util.Set; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.PlayerEntity; @@ -35,7 +34,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.implementations.guiobjects.IGuiItem; import appeng.api.implementations.guiobjects.IGuiItemObject; @@ -48,7 +46,7 @@ import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.MEPortableCellContainer; import appeng.core.AEConfig; -import appeng.core.localization.GuiText; +import appeng.core.Api; import appeng.items.contents.CellConfig; import appeng.items.contents.CellUpgrades; import appeng.items.contents.PortableCellViewer; @@ -71,10 +69,10 @@ public class PortableCellItem extends AEBasePoweredItem implements IStorageCell< final ITooltipFlag advancedTooltips) { super.addInformation(stack, world, lines, advancedTooltips); - final ICellInventoryHandler cdi = AEApi.instance().registries().cell().getCellInventory(stack, - null, AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final ICellInventoryHandler cdi = Api.instance().registries().cell().getCellInventory(stack, null, + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); - AEApi.instance().client().addCellInformation(cdi, lines); + Api.instance().client().addCellInformation(cdi, lines); } @Override @@ -114,7 +112,7 @@ public class PortableCellItem extends AEBasePoweredItem implements IStorageCell< @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java b/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java index 2c78defd0..c3d748d2d 100644 --- a/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java +++ b/src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java @@ -34,7 +34,6 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Settings; import appeng.api.config.SortDir; @@ -43,6 +42,7 @@ import appeng.api.config.ViewItems; import appeng.api.features.IWirelessTermHandler; import appeng.api.util.IConfigManager; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.localization.GuiText; import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.util.ConfigManager; @@ -55,7 +55,7 @@ public class WirelessTerminalItem extends AEBasePoweredItem implements IWireless @Override public ActionResult onItemRightClick(final World w, final PlayerEntity player, final Hand hand) { - AEApi.instance().registries().wireless().openWirelessTerminalGui(player.getHeldItem(hand), w, player, hand); + Api.instance().registries().wireless().openWirelessTerminalGui(player.getHeldItem(hand), w, player, hand); return new ActionResult<>(ActionResultType.SUCCESS, player.getHeldItem(hand)); } @@ -83,7 +83,7 @@ public class WirelessTerminalItem extends AEBasePoweredItem implements IWireless @Override public boolean canHandle(final ItemStack is) { - return AEApi.instance().definitions().items().wirelessTerminal().isSameAs(is); + return Api.instance().definitions().items().wirelessTerminal().isSameAs(is); } @Override diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index 40caef967..04d73e12f 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import appeng.api.AEApi; import appeng.api.networking.IGrid; import appeng.api.networking.IGridCache; import appeng.api.networking.IGridHost; @@ -35,6 +34,7 @@ import appeng.api.networking.IMachineSet; import appeng.api.networking.events.MENetworkEvent; import appeng.api.networking.events.MENetworkPostCacheConstruction; import appeng.api.util.IReadOnlyCollection; +import appeng.core.Api; import appeng.core.worlddata.WorldData; import appeng.hooks.TickHandler; import appeng.util.ReadOnlyCollection; @@ -50,7 +50,7 @@ public class Grid implements IGrid { public Grid(final GridNode center) { this.pivot = center; - final Map, IGridCache> myCaches = AEApi.instance().registries().gridCache() + final Map, IGridCache> myCaches = Api.instance().registries().gridCache() .createCacheInstance(this); this.caches = new HashMap<>(myCaches.size()); for (final Entry, IGridCache> c : myCaches.entrySet()) { diff --git a/src/main/java/appeng/me/cache/CraftingGridCache.java b/src/main/java/appeng/me/cache/CraftingGridCache.java index cd347b3bd..5452970ac 100644 --- a/src/main/java/appeng/me/cache/CraftingGridCache.java +++ b/src/main/java/appeng/me/cache/CraftingGridCache.java @@ -43,7 +43,6 @@ import com.google.common.collect.Multimap; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.networking.IGrid; @@ -76,6 +75,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.crafting.CraftingJob; import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLinkNexus; @@ -224,7 +224,7 @@ public class CraftingGridCache // update the stuff that was in the list... this.storageGrid.postAlterationOfStoredItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), oldItems.keySet(), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class), oldItems.keySet(), new BaseActionSource()); // re-create list.. @@ -257,7 +257,7 @@ public class CraftingGridCache } this.storageGrid.postAlterationOfStoredItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), this.craftableItems.keySet(), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class), this.craftableItems.keySet(), new BaseActionSource()); } @@ -322,7 +322,7 @@ public class CraftingGridCache public List getCellArray(final IStorageChannel channel) { final List list = new ArrayList<>(1); - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { list.add(this); } @@ -395,7 +395,7 @@ public class CraftingGridCache @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/me/cache/GridStorageCache.java b/src/main/java/appeng/me/cache/GridStorageCache.java index e143a0248..c1996d738 100644 --- a/src/main/java/appeng/me/cache/GridStorageCache.java +++ b/src/main/java/appeng/me/cache/GridStorageCache.java @@ -28,7 +28,6 @@ import java.util.Map; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; -import appeng.api.AEApi; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; @@ -49,6 +48,7 @@ import appeng.api.storage.cells.ICellProvider; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.me.helpers.BaseActionSource; import appeng.me.helpers.GenericInterestManager; import appeng.me.helpers.MachineSource; @@ -71,7 +71,7 @@ public class GridStorageCache implements IStorageGrid { this.storageNetworks = new IdentityHashMap<>(); this.storageMonitors = new IdentityHashMap<>(); - AEApi.instance().storage().storageChannels() + Api.instance().storage().storageChannels() .forEach(channel -> this.storageMonitors.put(channel, new NetworkMonitor<>(this, channel))); } diff --git a/src/main/java/appeng/me/cache/PathGridCache.java b/src/main/java/appeng/me/cache/PathGridCache.java index 14183479b..99d12ca62 100644 --- a/src/main/java/appeng/me/cache/PathGridCache.java +++ b/src/main/java/appeng/me/cache/PathGridCache.java @@ -28,7 +28,6 @@ import java.util.Set; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import appeng.api.AEApi; import appeng.api.features.AEFeature; import appeng.api.networking.GridFlags; import appeng.api.networking.IGrid; @@ -47,6 +46,7 @@ import appeng.api.networking.pathing.IPathingGrid; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.stats.IAdvancementTrigger; import appeng.me.GridConnection; @@ -287,7 +287,7 @@ public class PathGridCache implements IPathingGrid { final IAdvancementTrigger lastBracket = this.getAchievementBracket(this.lastChannels); if (currentBracket != lastBracket && currentBracket != null) { for (final IGridNode n : this.requireChannels) { - PlayerEntity player = AEApi.instance().registries().players().findPlayer(n.getPlayerID()); + PlayerEntity player = Api.instance().registries().players().findPlayer(n.getPlayerID()); if (player instanceof ServerPlayerEntity) { currentBracket.trigger((ServerPlayerEntity) player); } diff --git a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java index fb67e777d..69fa1561c 100644 --- a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java @@ -37,7 +37,6 @@ import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.fml.hooks.BasicEventHooks; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.config.PowerMultiplier; @@ -65,6 +64,7 @@ import appeng.api.storage.data.IItemList; import appeng.api.util.WorldCoord; import appeng.container.ContainerNull; import appeng.core.AELog; +import appeng.core.Api; import appeng.crafting.CraftBranchFailure; import appeng.crafting.CraftingJob; import appeng.crafting.CraftingLink; @@ -100,7 +100,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { private MECraftingInventory inventory = new MECraftingInventory(); private IAEItemStack finalOutput; private boolean waiting = false; - private IItemList waitingFor = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private IItemList waitingFor = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); private long availableStorage = 0; private MachineSource machineSrc = null; @@ -466,7 +466,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { } final IItemList list; - this.getListOfItem(list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(), + this.getListOfItem(list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(), CraftingItemList.ALL); for (final IAEItemStack is : list) { this.postChange(is, this.machineSrc); @@ -716,7 +716,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { final IStorageGrid sg = g.getCache(IStorageGrid.class); final IMEInventory ii = sg - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); for (IAEItemStack is : this.inventory.getItemList()) { is = this.inventory.extractItems(is.copy(), Actionable.MODULATE, this.machineSrc); @@ -754,7 +754,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { final IStorageGrid sg = g.getCache(IStorageGrid.class); final IMEInventory storage = sg - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final MECraftingInventory ci = new MECraftingInventory(storage, true, false, false); try { @@ -784,7 +784,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { this.submitLink(this.myLastLink); this.submitLink(whatLink); - final IItemList list = AEApi.instance().storage() + final IItemList list = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); this.getListOfItem(list, CraftingItemList.ALL); for (final IAEItemStack ge : list) { @@ -1094,7 +1094,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { } private IItemList readList(final ListNBT tag) { - final IItemList out = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IItemList out = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); if (tag == null) { @@ -1131,7 +1131,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { this.lastTime = System.nanoTime(); this.elapsedTime = 0; - final IItemList list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IItemList list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); this.getListOfItem(list, CraftingItemList.ACTIVE); diff --git a/src/main/java/appeng/me/cluster/implementations/QuantumCalculator.java b/src/main/java/appeng/me/cluster/implementations/QuantumCalculator.java index 66a34aa44..6a2b33c80 100644 --- a/src/main/java/appeng/me/cluster/implementations/QuantumCalculator.java +++ b/src/main/java/appeng/me/cluster/implementations/QuantumCalculator.java @@ -23,10 +23,10 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlocks; import appeng.api.util.WorldCoord; +import appeng.core.Api; import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAEMultiBlock; import appeng.me.cluster.MBCalculator; @@ -77,7 +77,7 @@ public class QuantumCalculator extends MBCalculator { } num++; - final IBlocks blocks = AEApi.instance().definitions().blocks(); + final IBlocks blocks = Api.instance().definitions().blocks(); if (num == 5) { if (!this.isBlockAtLocation(w, p, blocks.quantumLink())) { return false; diff --git a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java index 59ca9a572..47d7473dd 100644 --- a/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/QuantumCluster.java @@ -28,7 +28,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import appeng.api.AEApi; import appeng.api.events.LocatableEventAnnounce; import appeng.api.events.LocatableEventAnnounce.LocatableEvent; import appeng.api.exceptions.FailedConnectionException; @@ -38,6 +37,7 @@ import appeng.api.networking.IGridNode; import appeng.api.util.AEPartLocation; import appeng.api.util.WorldCoord; import appeng.core.AELog; +import appeng.core.Api; import appeng.me.cache.helpers.ConnectionWrapper; import appeng.me.cluster.IAECluster; import appeng.tile.qnb.QuantumBridgeTileEntity; @@ -99,7 +99,7 @@ public class QuantumCluster implements ILocatable, IAECluster { } final ILocatable myOtherSide = this.otherSide == 0 ? null - : AEApi.instance().registries().locatable().getLocatableBy(this.otherSide); + : Api.instance().registries().locatable().getLocatableBy(this.otherSide); boolean shutdown = false; @@ -134,7 +134,7 @@ public class QuantumCluster implements ILocatable, IAECluster { } sideA.connection = sideB.connection = new ConnectionWrapper( - AEApi.instance().grid().createGridConnection(sideA.getNode(), sideB.getNode())); + Api.instance().grid().createGridConnection(sideA.getNode(), sideB.getNode())); } catch (final FailedConnectionException e) { // :( AELog.debug(e); @@ -156,7 +156,7 @@ public class QuantumCluster implements ILocatable, IAECluster { } private boolean canUseNode(final long qe) { - final QuantumCluster qc = (QuantumCluster) AEApi.instance().registries().locatable().getLocatableBy(qe); + final QuantumCluster qc = (QuantumCluster) Api.instance().registries().locatable().getLocatableBy(qe); if (qc != null) { final World theWorld = qc.center.getWorld(); if (!qc.isDestroyed) { diff --git a/src/main/java/appeng/me/helpers/AENetworkProxy.java b/src/main/java/appeng/me/helpers/AENetworkProxy.java index 1545bb1f9..bc8dad360 100644 --- a/src/main/java/appeng/me/helpers/AENetworkProxy.java +++ b/src/main/java/appeng/me/helpers/AENetworkProxy.java @@ -28,7 +28,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.Direction; -import appeng.api.AEApi; import appeng.api.networking.GridFlags; import appeng.api.networking.GridNotification; import appeng.api.networking.IGrid; @@ -45,6 +44,7 @@ import appeng.api.networking.ticking.ITickManager; import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.api.util.IOrientable; +import appeng.core.Api; import appeng.core.worlddata.WorldData; import appeng.hooks.TickHandler; import appeng.me.GridAccessException; @@ -129,7 +129,7 @@ public class AENetworkProxy implements IGridBlock { public IGridNode getNode() { if (this.node == null && Platform.isServer() && this.isReady) { - this.node = AEApi.instance().grid().createGridNode(this); + this.node = Api.instance().grid().createGridNode(this); this.readFromNBT(this.data); this.node.updateState(); } diff --git a/src/main/java/appeng/me/storage/CreativeCellInventory.java b/src/main/java/appeng/me/storage/CreativeCellInventory.java index 741e24366..ac554d3f3 100644 --- a/src/main/java/appeng/me/storage/CreativeCellInventory.java +++ b/src/main/java/appeng/me/storage/CreativeCellInventory.java @@ -20,7 +20,6 @@ package appeng.me.storage; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; @@ -30,12 +29,13 @@ import appeng.api.storage.cells.ICellInventoryHandler; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.items.contents.CellConfig; import appeng.util.item.AEItemStack; public class CreativeCellInventory implements IMEInventoryHandler { - private final IItemList itemListCache = AEApi.instance().storage() + private final IItemList itemListCache = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); protected CreativeCellInventory(final ItemStack o) { @@ -51,7 +51,7 @@ public class CreativeCellInventory implements IMEInventoryHandler public static ICellInventoryHandler getCell(final ItemStack o) { return new BasicCellInventoryHandler(new CreativeCellInventory(o), - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); } @Override @@ -84,7 +84,7 @@ public class CreativeCellInventory implements IMEInventoryHandler @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java b/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java index b578426da..04572c2ca 100644 --- a/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java +++ b/src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java @@ -30,7 +30,6 @@ import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.StorageFilter; @@ -42,11 +41,12 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; public class MEMonitorIFluidHandler implements IMEMonitor, ITickingMonitor { private final IFluidHandler handler; - private final IItemList list = AEApi.instance().storage() - .getStorageChannel(IFluidStorageChannel.class).createList(); + private final IItemList list = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) + .createList(); private final HashMap, Object> listeners = new HashMap<>(); private final NavigableMap memory; private IActionSource mySource; @@ -107,7 +107,7 @@ public class MEMonitorIFluidHandler implements IMEMonitor, ITicki @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); + return Api.instance().storage().getStorageChannel(IFluidStorageChannel.class); } @Override @@ -158,8 +158,9 @@ public class MEMonitorIFluidHandler implements IMEMonitor, ITicki IAEFluidStack stack = null; if (!newIS.isEmpty()) { - stack = (old == null || old.aeStack == null ? AEApi.instance().storage() - .getStorageChannel(IFluidStorageChannel.class).createStack(newIS) : old.aeStack.copy()); + stack = (old == null || old.aeStack == null + ? Api.instance().storage().getStorageChannel(IFluidStorageChannel.class).createStack(newIS) + : old.aeStack.copy()); } if (stack != null) { stack.setStackSize(newSize); @@ -297,7 +298,7 @@ public class MEMonitorIFluidHandler implements IMEMonitor, ITicki this.aeStack = null; } else { this.fluidStack = is.copy(); - this.aeStack = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class).createStack(is); + this.aeStack = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class).createStack(is); } } } diff --git a/src/main/java/appeng/me/storage/MEMonitorIInventory.java b/src/main/java/appeng/me/storage/MEMonitorIInventory.java index e98f28a97..ed72ad647 100644 --- a/src/main/java/appeng/me/storage/MEMonitorIInventory.java +++ b/src/main/java/appeng/me/storage/MEMonitorIInventory.java @@ -28,7 +28,6 @@ import java.util.concurrent.ConcurrentSkipListMap; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.StorageFilter; @@ -40,6 +39,7 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.util.InventoryAdaptor; import appeng.util.Platform; import appeng.util.inv.ItemSlot; @@ -47,7 +47,7 @@ import appeng.util.inv.ItemSlot; public class MEMonitorIInventory implements IMEMonitor, ITickingMonitor { private final InventoryAdaptor adaptor; - private final IItemList list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + private final IItemList list = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); private final HashMap, Object> listeners = new HashMap<>(); private final NavigableMap memory; @@ -120,7 +120,7 @@ public class MEMonitorIInventory implements IMEMonitor, ITickingMo @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override @@ -160,7 +160,7 @@ public class MEMonitorIInventory implements IMEMonitor, ITickingMo final int diff = newSize - (oldIS.isEmpty() ? 0 : oldIS.getCount()); final IAEItemStack stack = (old == null || old.aeStack == null - ? AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(newIS) + ? Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(newIS) : old.aeStack.copy()); if (stack != null) { stack.setStackSize(newSize); @@ -302,7 +302,7 @@ public class MEMonitorIInventory implements IMEMonitor, ITickingMo this.aeStack = null; } else { this.itemStack = is.copy(); - this.aeStack = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(is); + this.aeStack = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(is); } } } diff --git a/src/main/java/appeng/me/storage/NullInventory.java b/src/main/java/appeng/me/storage/NullInventory.java index 4010f04f1..121a5eedf 100644 --- a/src/main/java/appeng/me/storage/NullInventory.java +++ b/src/main/java/appeng/me/storage/NullInventory.java @@ -18,7 +18,6 @@ package appeng.me.storage; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; @@ -27,6 +26,7 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; public class NullInventory> implements IMEInventoryHandler { @@ -47,7 +47,7 @@ public class NullInventory> implements IMEInventoryHandler @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/me/storage/SecurityStationInventory.java b/src/main/java/appeng/me/storage/SecurityStationInventory.java index e5a46faee..a21188fba 100644 --- a/src/main/java/appeng/me/storage/SecurityStationInventory.java +++ b/src/main/java/appeng/me/storage/SecurityStationInventory.java @@ -20,7 +20,6 @@ package appeng.me.storage; import com.mojang.authlib.GameProfile; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; @@ -31,12 +30,13 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.me.GridAccessException; import appeng.tile.misc.SecurityStationTileEntity; public class SecurityStationInventory implements IMEInventoryHandler { - private final IItemList storedItems = AEApi.instance().storage() + private final IItemList storedItems = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); private final SecurityStationTileEntity securityTile; @@ -47,7 +47,7 @@ public class SecurityStationInventory implements IMEInventoryHandler iface = definitions.blocks().iface().maybeStack(1); if (iface.isPresent()) { diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 31c231699..6713cd821 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -19,7 +19,11 @@ package appeng.parts; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Random; +import java.util.Set; import javax.annotation.Nullable; @@ -43,13 +47,20 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; -import appeng.api.AEApi; import appeng.api.config.YesNo; import appeng.api.exceptions.FailedConnectionException; import appeng.api.implementations.parts.ICablePart; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; -import appeng.api.parts.*; +import appeng.api.parts.IFacadeContainer; +import appeng.api.parts.IFacadePart; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartCollisionHelper; +import appeng.api.parts.IPartHost; +import appeng.api.parts.IPartItem; +import appeng.api.parts.LayerFlags; +import appeng.api.parts.PartItemStack; +import appeng.api.parts.SelectedPart; import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; @@ -58,6 +69,7 @@ import appeng.client.render.cablebus.CableBusRenderState; import appeng.client.render.cablebus.CableCoreType; import appeng.client.render.cablebus.FacadeRenderState; import appeng.core.AELog; +import appeng.core.Api; import appeng.facade.FacadeContainer; import appeng.helpers.AEMultiTile; import appeng.me.GridConnection; @@ -359,7 +371,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I } } - if (AEApi.instance().partHelper().getCableRenderMode().opaqueFacades) { + if (Api.instance().partHelper().getCableRenderMode().opaqueFacades) { final IFacadeContainer fc = this.getFacadeContainer(); for (final AEPartLocation side : AEPartLocation.SIDE_LOCATIONS) { final IFacadePart p = fc.getFacade(side); @@ -524,7 +536,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I final IGridNode cn = center.getGridNode(); if (cn != null) { try { - AEApi.instance().grid().createGridConnection(cn, sn); + Api.instance().grid().createGridConnection(cn, sn); } catch (final FailedConnectionException e) { // ekk AELog.debug(e); @@ -1074,7 +1086,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I part.getBoxes(bch); } - if (AEApi.instance().partHelper().getCableRenderMode().opaqueFacades || forCollision) { + if (Api.instance().partHelper().getCableRenderMode().opaqueFacades || forCollision) { if (s != AEPartLocation.INTERNAL) { final IFacadePart fp = fc.getFacade(s); if (fp != null) { diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index 5c0ea7edc..37ebd69ca 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -20,7 +20,6 @@ package appeng.parts; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -49,7 +48,6 @@ import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import appeng.api.AEApi; import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IItems; import appeng.api.parts.IFacadePart; @@ -59,6 +57,7 @@ import appeng.api.parts.PartItemStack; import appeng.api.parts.SelectedPart; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ClickPacket; @@ -204,7 +203,7 @@ public class PartPlacement { BlockPos te_pos = pos; - final IBlockDefinition multiPart = AEApi.instance().definitions().blocks().multiPart(); + final IBlockDefinition multiPart = Api.instance().definitions().blocks().multiPart(); if (host == null && pass == PlaceType.PLACE_ITEM) { Direction offset = null; @@ -378,7 +377,7 @@ public class PartPlacement { } } else { final ItemStack held = event.getPlayer().getHeldItem(event.getHand()); - final IItems items = AEApi.instance().definitions().items(); + final IItems items = Api.instance().definitions().items(); boolean supportedItem = items.memoryCard().isSameAs(held); supportedItem |= items.colorApplicator().isSameAs(held); diff --git a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java index 6f43ed5d6..0923fe811 100644 --- a/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java +++ b/src/main/java/appeng/parts/automation/AnnihilationPlanePart.java @@ -46,7 +46,6 @@ import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.common.ToolType; import net.minecraftforge.common.util.FakePlayerFactory; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.networking.IGridNode; @@ -67,6 +66,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.settings.TickRates; import appeng.core.sync.packets.BlockTransitionEffectPacket; @@ -324,7 +324,7 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab final IStorageGrid storage = this.getProxy().getStorage(); final IEnergyGrid energy = this.getProxy().getEnergy(); final IAEItemStack overflow = Platform.poweredInsert(energy, - storage.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)), + storage.getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)), itemToStore, this.mySrc); this.isAccepting = overflow == null; @@ -540,7 +540,7 @@ public class AnnihilationPlanePart extends BasicStatePart implements IGridTickab for (final ItemStack itemStack : itemStacks) { final IAEItemStack itemToTest = AEItemStack.fromItemStack(itemStack); final IAEItemStack overflow = storage - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) .injectItems(itemToTest, Actionable.SIMULATE, this.mySrc); if (overflow == null || itemToTest.getStackSize() > overflow.getStackSize()) { canStore = true; diff --git a/src/main/java/appeng/parts/automation/BlockUpgradeInventory.java b/src/main/java/appeng/parts/automation/BlockUpgradeInventory.java index d7e662ad2..71e887d95 100644 --- a/src/main/java/appeng/parts/automation/BlockUpgradeInventory.java +++ b/src/main/java/appeng/parts/automation/BlockUpgradeInventory.java @@ -19,9 +19,6 @@ package appeng.parts.automation; import net.minecraft.block.Block; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import appeng.api.config.Upgrades; import appeng.util.inv.IAEAppEngInventory; diff --git a/src/main/java/appeng/parts/automation/DefinitionUpgradeInventory.java b/src/main/java/appeng/parts/automation/DefinitionUpgradeInventory.java index 3b6ad729e..4ac3d2d75 100644 --- a/src/main/java/appeng/parts/automation/DefinitionUpgradeInventory.java +++ b/src/main/java/appeng/parts/automation/DefinitionUpgradeInventory.java @@ -18,8 +18,6 @@ package appeng.parts.automation; -import net.minecraft.item.ItemStack; - import appeng.api.config.Upgrades; import appeng.api.definitions.IItemDefinition; import appeng.util.inv.IAEAppEngInventory; diff --git a/src/main/java/appeng/parts/automation/ExportBusPart.java b/src/main/java/appeng/parts/automation/ExportBusPart.java index 22e17bee7..bb8af3630 100644 --- a/src/main/java/appeng/parts/automation/ExportBusPart.java +++ b/src/main/java/appeng/parts/automation/ExportBusPart.java @@ -28,7 +28,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.config.PowerMultiplier; @@ -56,6 +55,7 @@ import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.UpgradeableContainer; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.settings.TickRates; import appeng.helpers.MultiCraftingTracker; @@ -127,7 +127,7 @@ public class ExportBusPart extends SharedItemBusPart implements ICraftingRequest try { final InventoryAdaptor destination = this.getHandler(); final IMEMonitor inv = this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IEnergyGrid energy = this.getProxy().getEnergy(); final ICraftingGrid cg = this.getProxy().getCrafting(); final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting(Settings.FUZZY_MODE); diff --git a/src/main/java/appeng/parts/automation/FormationPlanePart.java b/src/main/java/appeng/parts/automation/FormationPlanePart.java index e766c192a..fbdb3e294 100644 --- a/src/main/java/appeng/parts/automation/FormationPlanePart.java +++ b/src/main/java/appeng/parts/automation/FormationPlanePart.java @@ -52,7 +52,6 @@ import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.common.IPlantable; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; @@ -77,6 +76,7 @@ import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.FormationPlaneContainer; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.items.parts.PartModels; import appeng.me.GridAccessException; import appeng.me.storage.MEInventoryHandler; @@ -96,7 +96,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart } private final MEInventoryHandler myHandler = new MEInventoryHandler<>(this, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); private final AppEngInternalAEInventory Config = new AppEngInternalAEInventory(this, 63); public FormationPlanePart(final ItemStack is) { @@ -114,7 +114,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.myHandler.setPriority(this.getPriority()); - final IItemList priorityList = AEApi.instance().storage() + final IItemList priorityList = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); final int slotsToUse = 18 + this.getInstalledUpgrades(Upgrades.CAPACITY) * 9; @@ -193,7 +193,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart @Override public List getCellArray(final IStorageChannel channel) { if (this.getProxy().isActive() - && channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + && channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { final List handler = new ArrayList<>(1); handler.add(this.myHandler); return handler; @@ -333,7 +333,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override @@ -349,7 +349,7 @@ public class FormationPlanePart extends AbstractFormationPlanePart @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().parts().formationPlane().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().parts().formationPlane().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/parts/automation/ImportBusPart.java b/src/main/java/appeng/parts/automation/ImportBusPart.java index 680974dfc..3ba35cb2f 100644 --- a/src/main/java/appeng/parts/automation/ImportBusPart.java +++ b/src/main/java/appeng/parts/automation/ImportBusPart.java @@ -25,7 +25,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.config.RedstoneMode; @@ -46,6 +45,7 @@ import appeng.api.util.AECableType; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.UpgradeableContainer; +import appeng.core.Api; import appeng.core.AppEng; import appeng.core.settings.TickRates; import appeng.helpers.Reflected; @@ -92,10 +92,10 @@ public class ImportBusPart extends SharedItemBusPart implements IInventoryDestin try { final IMEMonitor inv = this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IAEItemStack out = inv.injectItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(stack), + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(stack), Actionable.SIMULATE, this.source); if (out == null) { return true; @@ -152,7 +152,7 @@ public class ImportBusPart extends SharedItemBusPart implements IInventoryDestin this.itemsToSend = this.calculateItemsToSend(); final IMEMonitor inv = this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); final IEnergyGrid energy = this.getProxy().getEnergy(); boolean Configured = false; @@ -199,7 +199,7 @@ public class ImportBusPart extends SharedItemBusPart implements IInventoryDestin } if (!newItems.isEmpty()) { - final IAEItemStack aeStack = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + final IAEItemStack aeStack = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(newItems); final IAEItemStack failed = Platform.poweredInsert(energy, inv, aeStack, this.source); diff --git a/src/main/java/appeng/parts/automation/LevelEmitterPart.java b/src/main/java/appeng/parts/automation/LevelEmitterPart.java index be5262c64..146b69404 100644 --- a/src/main/java/appeng/parts/automation/LevelEmitterPart.java +++ b/src/main/java/appeng/parts/automation/LevelEmitterPart.java @@ -34,7 +34,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.config.LevelType; import appeng.api.config.RedstoneMode; @@ -73,6 +72,7 @@ import appeng.api.util.IConfigManager; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.LevelEmitterContainer; +import appeng.core.Api; import appeng.core.AppEng; import appeng.helpers.Reflected; import appeng.items.parts.PartModels; @@ -252,7 +252,7 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH // no more item stuff.. this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) .removeListener(this); } catch (final GridAccessException e) { // :P @@ -264,11 +264,11 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH try { if (this.getInstalledUpgrades(Upgrades.FUZZY) > 0 || myStack == null) { this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) .addListener(this, this.getProxy().getGrid()); } else { this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) .removeListener(this); if (this.myWatcher != null) { @@ -277,7 +277,7 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH } this.updateReportingValue(this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); } catch (final GridAccessException e) { // >.> } @@ -319,7 +319,7 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH @Override public void onStackChange(final IItemList o, final IAEStack fullStack, final IAEStack diffStack, final IActionSource src, final IStorageChannel chan) { - if (chan == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + if (chan == Api.instance().storage().getStorageChannel(IItemStorageChannel.class) && fullStack.equals(this.config.getAEStackInSlot(0)) && this.getInstalledUpgrades(Upgrades.FUZZY) == 0) { this.lastReportedValue = fullStack.getStackSize(); @@ -358,7 +358,7 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH public void onListUpdate() { try { this.updateReportingValue(this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); } catch (final GridAccessException e) { // ;P } diff --git a/src/main/java/appeng/parts/misc/InterfacePart.java b/src/main/java/appeng/parts/misc/InterfacePart.java index 2d5dbaaef..f95c69e43 100644 --- a/src/main/java/appeng/parts/misc/InterfacePart.java +++ b/src/main/java/appeng/parts/misc/InterfacePart.java @@ -37,7 +37,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; @@ -62,6 +61,7 @@ import appeng.api.util.IConfigManager; import appeng.container.ContainerLocator; import appeng.container.ContainerOpener; import appeng.container.implementations.InterfaceContainer; +import appeng.core.Api; import appeng.core.AppEng; import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; @@ -270,7 +270,7 @@ public class InterfacePart extends BasicStatePart implements IGridTickable, ISto @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().parts().iface().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().parts().iface().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java index ea53d52f5..fbc9f7abf 100644 --- a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java +++ b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java @@ -28,7 +28,6 @@ import java.util.Map; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; import appeng.api.networking.storage.IBaseMonitor; @@ -39,6 +38,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.core.AELog; +import appeng.core.Api; import appeng.me.GridAccessException; import appeng.me.helpers.IGridProxyable; import appeng.me.storage.ITickingMonitor; @@ -191,7 +191,7 @@ class ItemHandlerAdapter implements IMEInventory, IBaseMonitor in = this.getInternalHandler(); - IItemList before = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + IItemList before = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); if (in != null) { before = in.getAvailableItems(before); @@ -320,7 +320,7 @@ public class StorageBusPart extends UpgradeablePart final IMEInventory out = this.getInternalHandler(); if (in != out) { - IItemList after = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + IItemList after = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createList(); if (out != null) { after = out.getAvailableItems(after); @@ -341,7 +341,7 @@ public class StorageBusPart extends UpgradeablePart IStorageMonitorableAccessor accessor = accessorOpt.orElse(null); IStorageMonitorable inventory = accessor.getInventory(this.mySrc); if (inventory != null) { - return inventory.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + return inventory.getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); } // So this could / can be a design decision. If the tile does support our custom @@ -427,14 +427,14 @@ public class StorageBusPart extends UpgradeablePart this.checkInterfaceVsStorageBus(target, this.getSide().getOpposite()); this.handler = new MEInventoryHandler(inv, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); this.handler.setBaseAccess((AccessRestriction) this.getConfigManager().getSetting(Settings.ACCESS)); this.handler.setWhitelist(this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.handler.setPriority(this.priority); - final IItemList priorityList = AEApi.instance().storage() + final IItemList priorityList = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); final int slotsToUse = 18 + this.getInstalledUpgrades(Upgrades.CAPACITY) * 9; @@ -507,7 +507,7 @@ public class StorageBusPart extends UpgradeablePart @Override public List getCellArray(final IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { final IMEInventoryHandler out = this.getProxy().isActive() ? this.getInternalHandler() : null; if (out != null) { return Collections.singletonList(out); @@ -559,7 +559,7 @@ public class StorageBusPart extends UpgradeablePart @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().parts().storageBus().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().parts().storageBus().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/parts/misc/ToggleBusPart.java b/src/main/java/appeng/parts/misc/ToggleBusPart.java index 5bb363b1a..435b5ed0e 100644 --- a/src/main/java/appeng/parts/misc/ToggleBusPart.java +++ b/src/main/java/appeng/parts/misc/ToggleBusPart.java @@ -29,7 +29,6 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; -import appeng.api.AEApi; import appeng.api.exceptions.FailedConnectionException; import appeng.api.networking.IGridConnection; import appeng.api.networking.IGridNode; @@ -39,6 +38,7 @@ import appeng.api.parts.IPartModel; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.AppEng; import appeng.helpers.Reflected; import appeng.items.parts.PartModels; @@ -168,7 +168,7 @@ public class ToggleBusPart extends BasicStatePart { if (this.getProxy().getNode() != null && this.getOuterProxy().getNode() != null) { if (intention) { try { - this.connection = AEApi.instance().grid().createGridConnection(this.getProxy().getNode(), + this.connection = Api.instance().grid().createGridConnection(this.getProxy().getNode(), this.getOuterProxy().getNode()); } catch (final FailedConnectionException e) { // :( diff --git a/src/main/java/appeng/parts/networking/CablePart.java b/src/main/java/appeng/parts/networking/CablePart.java index d977cddc4..87e662426 100644 --- a/src/main/java/appeng/parts/networking/CablePart.java +++ b/src/main/java/appeng/parts/networking/CablePart.java @@ -27,7 +27,6 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; import net.minecraft.util.Direction; -import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.definitions.IParts; import appeng.api.implementations.parts.ICablePart; @@ -43,6 +42,7 @@ import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.api.util.IReadOnlyCollection; +import appeng.core.Api; import appeng.items.parts.ColoredPartItem; import appeng.me.GridAccessException; import appeng.parts.AEBasePart; @@ -96,7 +96,7 @@ public class CablePart extends AEBasePart implements ICablePart { if (this.getCableColor() != newColor) { ItemStack newPart = null; - final IParts parts = AEApi.instance().definitions().parts(); + final IParts parts = Api.instance().definitions().parts(); if (this.getCableConnectionType() == AECableType.GLASS) { newPart = parts.cableGlass().stack(newColor, 1); diff --git a/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java index abe9d20d6..ca2c2f47b 100644 --- a/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/MEP2PTunnelPart.java @@ -29,7 +29,6 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Hand; -import appeng.api.AEApi; import appeng.api.exceptions.FailedConnectionException; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridNode; @@ -41,6 +40,7 @@ import appeng.api.parts.IPartModel; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.hooks.TickHandler; import appeng.items.parts.PartModels; @@ -193,7 +193,7 @@ public class MEP2PTunnelPart extends P2PTunnelPart implements I for (final MEP2PTunnelPart me : newSides) { try { - connections.getConnections().put(me.getGridNode(), new TunnelConnection(me, AEApi.instance() + connections.getConnections().put(me.getGridNode(), new TunnelConnection(me, Api.instance() .grid().createGridConnection(this.outerProxy.getNode(), me.outerProxy.getNode()))); } catch (final FailedConnectionException e) { final TileEntity start = this.getTile(); diff --git a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java index a0ce7c22e..d403abe38 100644 --- a/src/main/java/appeng/parts/p2p/P2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/P2PTunnelPart.java @@ -31,7 +31,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.Vec3d; import net.minecraftforge.client.model.data.IModelData; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.PowerUnits; @@ -48,6 +47,7 @@ import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.client.render.cablebus.P2PTunnelFrequencyModelData; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.me.GridAccessException; import appeng.me.cache.P2PCache; import appeng.me.cache.helpers.TunnelCollection; @@ -110,7 +110,7 @@ public abstract class P2PTunnelPart extends BasicStateP return super.getItemStack(type); } - final Optional maybeMEStack = AEApi.instance().definitions().parts().p2PTunnelME().maybeStack(1); + final Optional maybeMEStack = Api.instance().definitions().parts().p2PTunnelME().maybeStack(1); if (maybeMEStack.isPresent()) { return maybeMEStack.get(); } @@ -168,7 +168,7 @@ public abstract class P2PTunnelPart extends BasicStateP final ItemStack is = player.getHeldItem(hand); - final TunnelType tt = AEApi.instance().registries().p2pTunnel().getTunnelTypeByItem(is); + final TunnelType tt = Api.instance().registries().p2pTunnel().getTunnelTypeByItem(is); if (!is.isEmpty() && is.getItem() instanceof IMemoryCard) { final IMemoryCard mc = (IMemoryCard) is.getItem(); final CompoundNBT data = mc.getData(is); @@ -208,7 +208,7 @@ public abstract class P2PTunnelPart extends BasicStateP { final ItemStack newType; - final IParts parts = AEApi.instance().definitions().parts(); + final IParts parts = Api.instance().definitions().parts(); switch (tt) { case LIGHT: diff --git a/src/main/java/appeng/parts/reporting/AbstractMonitorPart.java b/src/main/java/appeng/parts/reporting/AbstractMonitorPart.java index 2f38ee34b..a52d2fffe 100644 --- a/src/main/java/appeng/parts/reporting/AbstractMonitorPart.java +++ b/src/main/java/appeng/parts/reporting/AbstractMonitorPart.java @@ -34,7 +34,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.api.AEApi; import appeng.api.implementations.parts.IStorageMonitorPart; import appeng.api.networking.security.IActionSource; import appeng.api.networking.storage.IStackWatcher; @@ -47,6 +46,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; import appeng.client.render.TesrRenderHelper; +import appeng.core.Api; import appeng.core.localization.PlayerMessages; import appeng.helpers.Reflected; import appeng.me.GridAccessException; @@ -199,7 +199,7 @@ public abstract class AbstractMonitorPart extends AbstractDisplayPart } this.updateReportingValue(this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class))); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class))); } } catch (final GridAccessException e) { // >.> diff --git a/src/main/java/appeng/parts/reporting/ConversionMonitorPart.java b/src/main/java/appeng/parts/reporting/ConversionMonitorPart.java index 5c6c6ff1a..8dad73da9 100644 --- a/src/main/java/appeng/parts/reporting/ConversionMonitorPart.java +++ b/src/main/java/appeng/parts/reporting/ConversionMonitorPart.java @@ -30,12 +30,12 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; -import appeng.api.AEApi; import appeng.api.networking.energy.IEnergySource; import appeng.api.parts.IPartModel; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.core.AppEng; import appeng.helpers.Reflected; import appeng.items.parts.PartModels; @@ -152,7 +152,7 @@ public class ConversionMonitorPart extends AbstractMonitorPart { try { final IEnergySource energy = this.getProxy().getEnergy(); final IMEMonitor cell = this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (allItems) { if (this.getDisplayed() != null) { @@ -194,7 +194,7 @@ public class ConversionMonitorPart extends AbstractMonitorPart { final IEnergySource energy = this.getProxy().getEnergy(); final IMEMonitor cell = this.getProxy().getStorage() - .getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + .getInventory(Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); input.setStackSize(count); diff --git a/src/main/java/appeng/recipes/game/DisassembleRecipe.java b/src/main/java/appeng/recipes/game/DisassembleRecipe.java index 34996f9e6..3fa64a730 100644 --- a/src/main/java/appeng/recipes/game/DisassembleRecipe.java +++ b/src/main/java/appeng/recipes/game/DisassembleRecipe.java @@ -33,7 +33,6 @@ import net.minecraft.item.crafting.SpecialRecipeSerializer; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItemDefinition; @@ -43,6 +42,7 @@ import appeng.api.storage.IMEInventory; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.core.AppEng; public final class DisassembleRecipe extends SpecialRecipe { @@ -61,7 +61,7 @@ public final class DisassembleRecipe extends SpecialRecipe { public DisassembleRecipe(ResourceLocation id) { super(id); - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); final IBlocks blocks = definitions.blocks(); final IItems items = definitions.items(); final IMaterials mats = definitions.materials(); @@ -105,11 +105,11 @@ public final class DisassembleRecipe extends SpecialRecipe { if (maybeCellOutput.isPresent()) { ItemStack storageCellStack = maybeCellOutput.get(); // make sure the storage cell stackInSlot empty... - final IMEInventory cellInv = AEApi.instance().registries().cell().getCellInventory( - stackInSlot, null, AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); + final IMEInventory cellInv = Api.instance().registries().cell().getCellInventory( + stackInSlot, null, Api.instance().storage().getStorageChannel(IItemStorageChannel.class)); if (cellInv != null) { final IItemList list = cellInv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); if (!list.isEmpty()) { return ItemStack.EMPTY; } diff --git a/src/main/java/appeng/recipes/game/FacadeRecipe.java b/src/main/java/appeng/recipes/game/FacadeRecipe.java index f3bdef4b7..666e93912 100644 --- a/src/main/java/appeng/recipes/game/FacadeRecipe.java +++ b/src/main/java/appeng/recipes/game/FacadeRecipe.java @@ -29,9 +29,9 @@ import net.minecraft.item.crafting.SpecialRecipeSerializer; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IComparableDefinition; import appeng.api.definitions.IDefinitions; +import appeng.core.Api; import appeng.core.AppEng; import appeng.items.parts.FacadeItem; @@ -44,7 +44,7 @@ public final class FacadeRecipe extends SpecialRecipe { public FacadeRecipe(ResourceLocation id, FacadeItem facade) { super(id); this.facade = facade; - final IDefinitions definitions = AEApi.instance().definitions(); + final IDefinitions definitions = Api.instance().definitions(); this.anchor = definitions.parts().cableAnchor(); } diff --git a/src/main/java/appeng/services/CompassService.java b/src/main/java/appeng/services/CompassService.java index c246abf6b..80d772eaa 100644 --- a/src/main/java/appeng/services/CompassService.java +++ b/src/main/java/appeng/services/CompassService.java @@ -39,8 +39,8 @@ import net.minecraft.world.server.ServerWorld; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import appeng.api.AEApi; import appeng.api.util.DimensionalCoord; +import appeng.core.Api; import appeng.services.compass.CompassReader; import appeng.services.compass.ICompassCallback; import appeng.util.Platform; @@ -118,7 +118,7 @@ public final class CompassService { DimensionType dim = w.getDimension().getType(); - Block skyStoneBlock = AEApi.instance().definitions().blocks().skyStoneBlock().block(); + Block skyStoneBlock = Api.instance().definitions().blocks().skyStoneBlock().block(); BlockPos.Mutable pos = new BlockPos.Mutable(); for (int i = 0; i < CHUNK_SIZE; i++) { pos.setX(i); diff --git a/src/main/java/appeng/spatial/CachedPlane.java b/src/main/java/appeng/spatial/CachedPlane.java index 6d13e86c7..2d7478c6b 100644 --- a/src/main/java/appeng/spatial/CachedPlane.java +++ b/src/main/java/appeng/spatial/CachedPlane.java @@ -38,14 +38,13 @@ import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.server.ServerChunkProvider; import net.minecraft.world.server.ServerTickList; -import appeng.api.AEApi; import appeng.api.movable.IMovableHandler; import appeng.api.movable.IMovableRegistry; import appeng.api.util.AEPartLocation; import appeng.api.util.WorldCoord; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.worlddata.WorldData; -import appeng.util.Platform; public class CachedPlane { private final int x_size; @@ -61,7 +60,7 @@ public class CachedPlane { private final List tiles = new ArrayList<>(); private final List> ticks = new ArrayList<>(); private final World world; - private final IMovableRegistry reg = AEApi.instance().registries().movable(); + private final IMovableRegistry reg = Api.instance().registries().movable(); private final List updates = new ArrayList<>(); private int verticalBits; private final BlockState matrixBlockState; @@ -69,7 +68,7 @@ public class CachedPlane { public CachedPlane(final World w, final int minX, final int minY, final int minZ, final int maxX, final int maxY, final int maxZ) { - Block matrixFrameBlock = AEApi.instance().definitions().blocks().matrixFrame().maybeBlock().orElse(null); + Block matrixFrameBlock = Api.instance().definitions().blocks().matrixFrame().maybeBlock().orElse(null); if (matrixFrameBlock != null) { this.matrixBlockState = matrixFrameBlock.getDefaultState(); } else { @@ -112,7 +111,7 @@ public class CachedPlane { } } - final IMovableRegistry mr = AEApi.instance().registries().movable(); + final IMovableRegistry mr = Api.instance().registries().movable(); for (int cx = 0; cx < this.cx_size; cx++) { for (int cz = 0; cz < this.cz_size; cz++) { @@ -180,12 +179,12 @@ public class CachedPlane { } private IMovableHandler getHandler(final TileEntity te) { - final IMovableRegistry mr = AEApi.instance().registries().movable(); + final IMovableRegistry mr = Api.instance().registries().movable(); return mr.getHandler(te); } void swap(final CachedPlane dst) { - final IMovableRegistry mr = AEApi.instance().registries().movable(); + final IMovableRegistry mr = Api.instance().registries().movable(); if (dst.x_size == this.x_size && dst.y_size == this.y_size && dst.z_size == this.z_size) { AELog.info("Block Copy Scale: " + this.x_size + ", " + this.y_size + ", " + this.z_size); diff --git a/src/main/java/appeng/spatial/StorageChunkGenerator.java b/src/main/java/appeng/spatial/StorageChunkGenerator.java index 44f324d0b..c46869337 100644 --- a/src/main/java/appeng/spatial/StorageChunkGenerator.java +++ b/src/main/java/appeng/spatial/StorageChunkGenerator.java @@ -31,7 +31,7 @@ import net.minecraft.world.gen.GenerationSettings; import net.minecraft.world.gen.Heightmap; import net.minecraft.world.gen.WorldGenRegion; -import appeng.api.AEApi; +import appeng.core.Api; public class StorageChunkGenerator extends ChunkGenerator { @@ -39,7 +39,7 @@ public class StorageChunkGenerator extends ChunkGenerator { public StorageChunkGenerator(final World world) { super(world, createBiomeProvider(), createSettings()); - this.defaultBlockState = AEApi.instance().definitions().blocks().matrixFrame().block().getDefaultState(); + this.defaultBlockState = Api.instance().definitions().blocks().matrixFrame().block().getDefaultState(); } private static BiomeProvider createBiomeProvider() { diff --git a/src/main/java/appeng/spatial/StorageHelper.java b/src/main/java/appeng/spatial/StorageHelper.java index 8cec8478a..329ae680b 100644 --- a/src/main/java/appeng/spatial/StorageHelper.java +++ b/src/main/java/appeng/spatial/StorageHelper.java @@ -35,10 +35,9 @@ import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.ITeleporter; -import appeng.api.AEApi; import appeng.api.util.WorldCoord; +import appeng.core.Api; import appeng.core.AppEng; -import appeng.util.Platform; public class StorageHelper { @@ -139,7 +138,7 @@ public class StorageHelper { public void swapRegions(final World srcWorld, final int srcX, final int srcY, final int srcZ, final World dstWorld, final int dstX, final int dstY, final int dstZ, final int scaleX, final int scaleY, final int scaleZ) { - AEApi.instance().definitions().blocks().matrixFrame().maybeBlock() + Api.instance().definitions().blocks().matrixFrame().maybeBlock() .ifPresent(matrixFrameBlock -> this.transverseEdges(dstX - 1, dstY - 1, dstZ - 1, dstX + scaleX + 1, dstY + scaleY + 1, dstZ + scaleZ + 1, new WrapInMatrixFrame(matrixFrameBlock.getDefaultState(), dstWorld))); diff --git a/src/main/java/appeng/tile/crafting/CraftingMonitorTileEntity.java b/src/main/java/appeng/tile/crafting/CraftingMonitorTileEntity.java index 743a30ebe..c1619bd3e 100644 --- a/src/main/java/appeng/tile/crafting/CraftingMonitorTileEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingMonitorTileEntity.java @@ -33,10 +33,10 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.IModelData; -import appeng.api.AEApi; import appeng.api.implementations.tiles.IColorableTile; import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AEColor; +import appeng.core.Api; import appeng.util.item.AEItemStack; public class CraftingMonitorTileEntity extends CraftingTileEntity implements IColorableTile { @@ -161,7 +161,7 @@ public class CraftingMonitorTileEntity extends CraftingTileEntity implements ICo @Override protected ItemStack getItemFromTile(final Object obj) { - final Optional is = AEApi.instance().definitions().blocks().craftingMonitor().maybeStack(1); + final Optional is = Api.instance().definitions().blocks().craftingMonitor().maybeStack(1); return is.orElseGet(() -> super.getItemFromTile(obj)); } diff --git a/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java b/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java index 937f822b9..92d20b2d5 100644 --- a/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingStorageTileEntity.java @@ -23,9 +23,9 @@ import java.util.Optional; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityType; -import appeng.api.AEApi; import appeng.api.definitions.IBlocks; import appeng.block.crafting.AbstractCraftingUnitBlock; +import appeng.core.Api; public class CraftingStorageTileEntity extends CraftingTileEntity { private static final int KILO_SCALAR = 1024; @@ -36,7 +36,7 @@ public class CraftingStorageTileEntity extends CraftingTileEntity { @Override protected ItemStack getItemFromTile(final Object obj) { - final IBlocks blocks = AEApi.instance().definitions().blocks(); + final IBlocks blocks = Api.instance().definitions().blocks(); final int storage = ((CraftingTileEntity) obj).getStorageBytes() / KILO_SCALAR; Optional is; diff --git a/src/main/java/appeng/tile/crafting/CraftingTileEntity.java b/src/main/java/appeng/tile/crafting/CraftingTileEntity.java index 1b48cf870..47c153550 100644 --- a/src/main/java/appeng/tile/crafting/CraftingTileEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingTileEntity.java @@ -37,7 +37,6 @@ import net.minecraft.world.IBlockReader; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.common.util.Constants; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.implementations.IPowerChannelState; import appeng.api.networking.GridFlags; @@ -52,6 +51,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.WorldCoord; import appeng.block.crafting.AbstractCraftingUnitBlock; import appeng.block.crafting.AbstractCraftingUnitBlock.CraftingUnitType; +import appeng.core.Api; import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAEMultiBlock; import appeng.me.cluster.implementations.CraftingCPUCalculator; @@ -84,9 +84,9 @@ public class CraftingTileEntity extends AENetworkTileEntity implements IAEMultiB Optional is; if (((CraftingTileEntity) obj).isAccelerator()) { - is = AEApi.instance().definitions().blocks().craftingAccelerator().maybeStack(1); + is = Api.instance().definitions().blocks().craftingAccelerator().maybeStack(1); } else { - is = AEApi.instance().definitions().blocks().craftingUnit().maybeStack(1); + is = Api.instance().definitions().blocks().craftingUnit().maybeStack(1); } return is.orElseGet(() -> super.getItemFromTile(obj)); @@ -278,7 +278,7 @@ public class CraftingTileEntity extends AENetworkTileEntity implements IAEMultiB } for (IAEItemStack ais : inv.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList())) { + Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList())) { ais = ais.copy(); ais.setStackSize(ais.getDefinition().getMaxStackSize()); while (true) { diff --git a/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java b/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java index b26c87db0..96bfd73f8 100644 --- a/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java +++ b/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java @@ -38,7 +38,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.hooks.BasicEventHooks; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.RedstoneMode; @@ -61,6 +60,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; import appeng.container.ContainerNull; +import appeng.core.Api; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.TargetPoint; import appeng.core.sync.packets.AssemblerAnimationPacket; @@ -107,7 +107,7 @@ public class MolecularAssemblerTileEntity extends AENetworkInvTileEntity public MolecularAssemblerTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - final ITileDefinition assembler = AEApi.instance().definitions().blocks().molecularAssembler(); + final ITileDefinition assembler = Api.instance().definitions().blocks().molecularAssembler(); this.settings = new ConfigManager(this); this.settings.registerSetting(Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE); diff --git a/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java b/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java index e2529307a..41d4edf8c 100644 --- a/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java +++ b/src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java @@ -27,10 +27,10 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; -import appeng.api.AEApi; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.core.AELog; +import appeng.core.Api; import appeng.util.Platform; import appeng.util.inv.IAEAppEngInventory; import appeng.util.inv.InvOperation; @@ -145,7 +145,7 @@ public class AppEngInternalAEInventory implements IItemHandlerModifiable, Iterab if (!simulate) { if (existing.isEmpty()) { - this.inv[slot] = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + this.inv[slot] = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(reachedLimit ? ItemHandlerHelper.copyStackWithSize(stack, limit) : stack); } else { existing.grow(reachedLimit ? limit : stack.getCount()); @@ -182,7 +182,7 @@ public class AppEngInternalAEInventory implements IItemHandlerModifiable, Iterab @Override public void setStackInSlot(final int slot, final ItemStack newItemStack) { ItemStack oldStack = this.getStackInSlot(slot).copy(); - this.inv[slot] = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class) + this.inv[slot] = Api.instance().storage().getStorageChannel(IItemStorageChannel.class) .createStack(newItemStack); if (this.te != null && Platform.isServer()) { diff --git a/src/main/java/appeng/tile/misc/ChargerTileEntity.java b/src/main/java/appeng/tile/misc/ChargerTileEntity.java index 257dccba0..f68301dbf 100644 --- a/src/main/java/appeng/tile/misc/ChargerTileEntity.java +++ b/src/main/java/appeng/tile/misc/ChargerTileEntity.java @@ -30,7 +30,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.PowerUnits; @@ -46,6 +45,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.me.GridAccessException; import appeng.tile.grid.AENetworkPowerTileEntity; @@ -115,7 +115,7 @@ public class ChargerTileEntity extends AENetworkPowerTileEntity implements ICran final ItemStack myItem = this.inv.getStackInSlot(0); if (this.getInternalCurrentPower() > POWER_THRESHOLD) { - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); if (materials.certusQuartzCrystal().isSameAs(myItem)) { this.extractAEPower(this.getInternalMaxPower(), Actionable.MODULATE, PowerMultiplier.CONFIG); @@ -157,7 +157,7 @@ public class ChargerTileEntity extends AENetworkPowerTileEntity implements ICran if (myItem.isEmpty()) { ItemStack held = player.inventory.getCurrentItem(); - if (AEApi.instance().definitions().materials().certusQuartzCrystal().isSameAs(held) + if (Api.instance().definitions().materials().certusQuartzCrystal().isSameAs(held) || Platform.isChargeable(held)) { held = player.inventory.decrStackSize(player.inventory.currentItem, 1); this.inv.setStackInSlot(0, held); @@ -185,13 +185,13 @@ public class ChargerTileEntity extends AENetworkPowerTileEntity implements ICran boolean changed = false; if (!myItem.isEmpty()) { - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); if (Platform.isChargeable(myItem)) { final IAEItemPowerStorage ps = (IAEItemPowerStorage) myItem.getItem(); if (ps.getAEMaxPower(myItem) > ps.getAECurrentPower(myItem)) { - final double chargeRate = AEApi.instance().registries().charger().getChargeRate(myItem.getItem()); + final double chargeRate = Api.instance().registries().charger().getChargeRate(myItem.getItem()); double extractedAmount = this.extractAEPower(chargeRate, Actionable.MODULATE, PowerMultiplier.CONFIG); @@ -254,7 +254,7 @@ public class ChargerTileEntity extends AENetworkPowerTileEntity implements ICran private class ChargerInvFilter implements IAEItemFilter { @Override public boolean allowInsert(IItemHandler inv, final int i, final ItemStack itemstack) { - final IItemDefinition cert = AEApi.instance().definitions().materials().certusQuartzCrystal(); + final IItemDefinition cert = Api.instance().definitions().materials().certusQuartzCrystal(); return Platform.isChargeable(itemstack) || cert.isSameAs(itemstack); } @@ -270,7 +270,7 @@ public class ChargerTileEntity extends AENetworkPowerTileEntity implements ICran } } - return AEApi.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs(extractedItem); + return Api.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs(extractedItem); } } } diff --git a/src/main/java/appeng/tile/misc/CondenserItemInventory.java b/src/main/java/appeng/tile/misc/CondenserItemInventory.java index 82ec28c34..532422b44 100644 --- a/src/main/java/appeng/tile/misc/CondenserItemInventory.java +++ b/src/main/java/appeng/tile/misc/CondenserItemInventory.java @@ -24,7 +24,6 @@ import java.util.Map.Entry; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; @@ -35,6 +34,7 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.me.helpers.BaseActionSource; import appeng.me.storage.ITickingMonitor; import appeng.util.item.AEItemStack; @@ -92,7 +92,7 @@ class CondenserItemInventory implements IMEMonitor, ITickingMonito @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/tile/misc/CondenserTileEntity.java b/src/main/java/appeng/tile/misc/CondenserTileEntity.java index 054c52500..962c688ba 100644 --- a/src/main/java/appeng/tile/misc/CondenserTileEntity.java +++ b/src/main/java/appeng/tile/misc/CondenserTileEntity.java @@ -35,7 +35,6 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.CondenserOutput; import appeng.api.config.Settings; import appeng.api.definitions.IMaterials; @@ -52,6 +51,7 @@ import appeng.api.storage.data.IAEStack; import appeng.api.util.IConfigManager; import appeng.api.util.IConfigurableObject; import appeng.capabilities.Capabilities; +import appeng.core.Api; import appeng.tile.AEBaseInvTileEntity; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.ConfigManager; @@ -147,7 +147,7 @@ public class CondenserTileEntity extends AEBaseInvTileEntity implements IConfigM } private ItemStack getOutput() { - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); switch ((CondenserOutput) this.cm.getSetting(Settings.CONDENSER_OUTPUT)) { case MATTER_BALLS: @@ -281,7 +281,7 @@ public class CondenserTileEntity extends AEBaseInvTileEntity implements IConfigM @Override public int fill(FluidStack resource, FluidAction action) { if (action == FluidAction.EXECUTE) { - final IStorageChannel chan = AEApi.instance().storage() + final IStorageChannel chan = Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class); CondenserTileEntity.this .addPower((resource.isEmpty() ? 0.0 : (double) resource.getAmount()) / chan.transferFactor()); @@ -345,7 +345,7 @@ public class CondenserTileEntity extends AEBaseInvTileEntity implements IConfigM @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { return (IMEMonitor) this.itemInventory; } else { return new CondenserVoidInventory<>(CondenserTileEntity.this, channel); diff --git a/src/main/java/appeng/tile/misc/InscriberRecipes.java b/src/main/java/appeng/tile/misc/InscriberRecipes.java index a3a4cac3d..05fe005b8 100644 --- a/src/main/java/appeng/tile/misc/InscriberRecipes.java +++ b/src/main/java/appeng/tile/misc/InscriberRecipes.java @@ -15,9 +15,9 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; -import appeng.api.AEApi; import appeng.api.definitions.IComparableDefinition; import appeng.api.features.InscriberProcessType; +import appeng.core.Api; import appeng.core.AppEng; import appeng.items.materials.MaterialItem; import appeng.recipes.handlers.InscriberRecipe; @@ -47,7 +47,7 @@ public final class InscriberRecipes { public static InscriberRecipe findRecipe(World world, ItemStack input, ItemStack plateA, ItemStack plateB, boolean supportNamePress) { if (supportNamePress) { - IComparableDefinition namePress = AEApi.instance().definitions().materials().namePress(); + IComparableDefinition namePress = Api.instance().definitions().materials().namePress(); boolean isNameA = namePress.isSameAs(plateA); boolean isNameB = namePress.isSameAs(plateB); diff --git a/src/main/java/appeng/tile/misc/InscriberTileEntity.java b/src/main/java/appeng/tile/misc/InscriberTileEntity.java index 5d5ed177a..f3a50190f 100644 --- a/src/main/java/appeng/tile/misc/InscriberTileEntity.java +++ b/src/main/java/appeng/tile/misc/InscriberTileEntity.java @@ -35,7 +35,6 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.Settings; @@ -52,6 +51,7 @@ import appeng.api.networking.ticking.TickingRequest; import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.IConfigManager; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.me.GridAccessException; import appeng.parts.automation.DefinitionUpgradeInventory; @@ -106,7 +106,7 @@ public class InscriberTileEntity extends AENetworkPowerTileEntity this.getProxy().setIdlePowerUsage(0); this.settings = new ConfigManager(this); - final ITileDefinition inscriberDefinition = AEApi.instance().definitions().blocks().inscriber(); + final ITileDefinition inscriberDefinition = Api.instance().definitions().blocks().inscriber(); this.upgrades = new DefinitionUpgradeInventory(inscriberDefinition, this, this.getUpgradeSlots()); this.sideItemHandler.setMaxStackSize(1, 64); @@ -431,7 +431,7 @@ public class InscriberTileEntity extends AENetworkPowerTileEntity } if (inv == InscriberTileEntity.this.topItemHandler || inv == InscriberTileEntity.this.bottomItemHandler) { - if (AEApi.instance().definitions().materials().namePress().isSameAs(stack)) { + if (Api.instance().definitions().materials().namePress().isSameAs(stack)) { return true; } return InscriberRecipes.isValidOptionalIngredient(getWorld(), stack); diff --git a/src/main/java/appeng/tile/misc/InterfaceTileEntity.java b/src/main/java/appeng/tile/misc/InterfaceTileEntity.java index a1d3761b5..a17d770c8 100644 --- a/src/main/java/appeng/tile/misc/InterfaceTileEntity.java +++ b/src/main/java/appeng/tile/misc/InterfaceTileEntity.java @@ -40,7 +40,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; @@ -59,6 +58,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; import appeng.container.implementations.InterfaceContainer; +import appeng.core.Api; import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; @@ -306,7 +306,7 @@ public class InterfaceTileEntity extends AENetworkInvTileEntity @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().blocks().iface().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().blocks().iface().maybeStack(1).orElse(ItemStack.EMPTY); } @Override diff --git a/src/main/java/appeng/tile/misc/SecurityStationTileEntity.java b/src/main/java/appeng/tile/misc/SecurityStationTileEntity.java index 83c756b9e..3de02b073 100644 --- a/src/main/java/appeng/tile/misc/SecurityStationTileEntity.java +++ b/src/main/java/appeng/tile/misc/SecurityStationTileEntity.java @@ -36,7 +36,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.config.Settings; import appeng.api.config.SortDir; @@ -66,6 +65,7 @@ import appeng.api.util.AEColor; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; +import appeng.core.Api; import appeng.helpers.PlayerSecurityWrapper; import appeng.me.GridAccessException; import appeng.me.helpers.MEMonitorHandler; @@ -253,7 +253,7 @@ public class SecurityStationTileEntity extends AENetworkTileEntity implements IT @Override public > IMEMonitor getInventory(IStorageChannel channel) { - if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) { + if (channel == Api.instance().storage().getStorageChannel(IItemStorageChannel.class)) { return (IMEMonitor) this.securityMonitor; } return null; @@ -286,7 +286,7 @@ public class SecurityStationTileEntity extends AENetworkTileEntity implements IT @Override public void readPermissions(final Map> playerPerms) { - final IPlayerRegistry pr = AEApi.instance().registries().players(); + final IPlayerRegistry pr = Api.instance().registries().players(); // read permissions for (final IAEItemStack ais : this.inventory.getStoredItems()) { diff --git a/src/main/java/appeng/tile/networking/WirelessTileEntity.java b/src/main/java/appeng/tile/networking/WirelessTileEntity.java index 8253e732b..230eb0734 100644 --- a/src/main/java/appeng/tile/networking/WirelessTileEntity.java +++ b/src/main/java/appeng/tile/networking/WirelessTileEntity.java @@ -27,7 +27,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.implementations.IPowerChannelState; import appeng.api.implementations.tiles.IWirelessAccessPoint; import appeng.api.networking.GridFlags; @@ -39,6 +38,7 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.me.GridAccessException; import appeng.tile.grid.AENetworkInvTileEntity; import appeng.tile.inventory.AppEngInternalInventory; @@ -56,7 +56,7 @@ public class WirelessTileEntity extends AENetworkInvTileEntity implements IWirel public WirelessTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - this.inv.setFilter(new AEItemDefinitionFilter(AEApi.instance().definitions().materials().wirelessBooster())); + this.inv.setFilter(new AEItemDefinitionFilter(Api.instance().definitions().materials().wirelessBooster())); this.getProxy().setFlags(GridFlags.REQUIRE_CHANNEL); this.getProxy().setValidSides(EnumSet.noneOf(Direction.class)); } diff --git a/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java b/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java index 8d7e4bde0..f625a6bfd 100644 --- a/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java +++ b/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java @@ -38,7 +38,6 @@ import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.EmptyHandler; -import appeng.api.AEApi; import appeng.api.definitions.IBlockDefinition; import appeng.api.networking.GridFlags; import appeng.api.networking.events.MENetworkEventSubscribe; @@ -47,6 +46,7 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.block.qnb.QnbFormedState; +import appeng.core.Api; import appeng.me.GridAccessException; import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAEMultiBlock; @@ -134,7 +134,7 @@ public class QuantumBridgeTileEntity extends AENetworkInvTileEntity implements I } private boolean isCenter() { - return AEApi.instance().definitions().blocks().quantumLink().maybeBlock() + return Api.instance().definitions().blocks().quantumLink().maybeBlock() .map(link -> this.getBlockState().getBlock() == link).orElse(false); } @@ -153,7 +153,7 @@ public class QuantumBridgeTileEntity extends AENetworkInvTileEntity implements I public void onReady() { super.onReady(); - final IBlockDefinition quantumRing = AEApi.instance().definitions().blocks().quantumRing(); + final IBlockDefinition quantumRing = Api.instance().definitions().blocks().quantumRing(); final Optional maybeLinkBlock = quantumRing.maybeBlock(); final Optional maybeLinkStack = quantumRing.maybeStack(1); diff --git a/src/main/java/appeng/tile/storage/ChestTileEntity.java b/src/main/java/appeng/tile/storage/ChestTileEntity.java index 7e521b998..5245d0ec8 100644 --- a/src/main/java/appeng/tile/storage/ChestTileEntity.java +++ b/src/main/java/appeng/tile/storage/ChestTileEntity.java @@ -43,7 +43,6 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; @@ -90,6 +89,7 @@ import appeng.api.util.AEColor; import appeng.api.util.IConfigManager; import appeng.capabilities.Capabilities; import appeng.container.implementations.MEMonitorableContainer; +import appeng.core.Api; import appeng.fluids.container.FluidTerminalContainer; import appeng.fluids.util.AEFluidStack; import appeng.helpers.IPriorityHost; @@ -209,11 +209,11 @@ public class ChestTileEntity extends AENetworkPowerTileEntity final ItemStack is = this.getCell(); if (!is.isEmpty()) { this.isCached = true; - ICellHandler cellHandler = AEApi.instance().registries().cell().getHandler(is); + ICellHandler cellHandler = Api.instance().registries().cell().getHandler(is); if (cellHandler != null) { double power = 1.0; - for (IStorageChannel channel : AEApi.instance().storage().storageChannels()) { + for (IStorageChannel channel : Api.instance().storage().storageChannels()) { final ICellInventoryHandler newCell = cellHandler.getCellInventory(is, this, channel); if (newCell != null) { @@ -226,7 +226,7 @@ public class ChestTileEntity extends AENetworkPowerTileEntity this.getProxy().setIdlePowerUsage(power); this.accessor = new Accessor(); - if (this.cellHandler != null && this.cellHandler.getChannel() == AEApi.instance().storage() + if (this.cellHandler != null && this.cellHandler.getChannel() == Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class)) { this.fluidHandler = new FluidHandler(); } @@ -258,7 +258,7 @@ public class ChestTileEntity extends AENetworkPowerTileEntity this.updateHandler(); final ItemStack cell = this.getCell(); - final ICellHandler ch = AEApi.instance().registries().cell().getHandler(cell); + final ICellHandler ch = Api.instance().registries().cell().getHandler(cell); if (this.cellHandler != null && ch != null) { return ch.getStatusForCell(cell, this.cellHandler.getInternalHandler()); @@ -465,7 +465,7 @@ public class ChestTileEntity extends AENetworkPowerTileEntity if (!ItemHandlerUtil.isEmpty(this.inputInventory)) { this.updateHandler(); - if (this.cellHandler != null && this.cellHandler.getChannel() == AEApi.instance().storage() + if (this.cellHandler != null && this.cellHandler.getChannel() == Api.instance().storage() .getStorageChannel(IItemStorageChannel.class)) { final IAEItemStack returns = Platform.poweredInsert(this, this.cellHandler, AEItemStack.fromItemStack(this.inputInventory.getStackInSlot(0)), this.mySrc); @@ -535,10 +535,10 @@ public class ChestTileEntity extends AENetworkPowerTileEntity public boolean openGui(final PlayerEntity p) { this.updateHandler(); if (this.cellHandler != null) { - final ICellHandler ch = AEApi.instance().registries().cell().getHandler(this.getCell()); + final ICellHandler ch = Api.instance().registries().cell().getHandler(this.getCell()); if (ch != null) { - final ICellGuiHandler chg = AEApi.instance().registries().cell() + final ICellGuiHandler chg = Api.instance().registries().cell() .getGuiHandler(this.cellHandler.getChannel(), this.getCell()); if (chg != null) { chg.openChestGui(p, this, ch, this.cellHandler, this.getCell(), this.cellHandler.getChannel()); @@ -704,7 +704,7 @@ public class ChestTileEntity extends AENetworkPowerTileEntity private class FluidHandler implements IFluidHandler, IFluidTank { private boolean canAcceptLiquids() { - return ChestTileEntity.this.cellHandler != null && ChestTileEntity.this.cellHandler.getChannel() == AEApi + return ChestTileEntity.this.cellHandler != null && ChestTileEntity.this.cellHandler.getChannel() == Api .instance().storage().getStorageChannel(IFluidStorageChannel.class); } @@ -790,8 +790,8 @@ public class ChestTileEntity extends AENetworkPowerTileEntity public boolean allowInsert(IItemHandler inv, int slot, ItemStack stack) { if (ChestTileEntity.this.isPowered()) { ChestTileEntity.this.updateHandler(); - return ChestTileEntity.this.cellHandler != null && ChestTileEntity.this.cellHandler - .getChannel() == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return ChestTileEntity.this.cellHandler != null && ChestTileEntity.this.cellHandler.getChannel() == Api + .instance().storage().getStorageChannel(IItemStorageChannel.class); } return false; } @@ -806,25 +806,25 @@ public class ChestTileEntity extends AENetworkPowerTileEntity @Override public boolean allowInsert(IItemHandler inv, int slot, ItemStack stack) { - return AEApi.instance().registries().cell().getHandler(stack) != null; + return Api.instance().registries().cell().getHandler(stack) != null; } } @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().blocks().chest().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().blocks().chest().maybeStack(1).orElse(ItemStack.EMPTY); } @Override public ContainerType getContainerType() { this.updateHandler(); if (this.cellHandler != null) { - if (this.cellHandler.getChannel() == AEApi.instance().storage() + if (this.cellHandler.getChannel() == Api.instance().storage() .getStorageChannel(IItemStorageChannel.class)) { return MEMonitorableContainer.TYPE; } - if (this.cellHandler.getChannel() == AEApi.instance().storage() + if (this.cellHandler.getChannel() == Api.instance().storage() .getStorageChannel(IFluidStorageChannel.class)) { return FluidTerminalContainer.TYPE; } diff --git a/src/main/java/appeng/tile/storage/DriveTileEntity.java b/src/main/java/appeng/tile/storage/DriveTileEntity.java index bfb169725..ed89864a3 100644 --- a/src/main/java/appeng/tile/storage/DriveTileEntity.java +++ b/src/main/java/appeng/tile/storage/DriveTileEntity.java @@ -42,7 +42,6 @@ import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; import appeng.api.implementations.tiles.IChestOrDrive; import appeng.api.networking.GridFlags; import appeng.api.networking.events.MENetworkCellArrayUpdate; @@ -65,6 +64,7 @@ import appeng.api.util.DimensionalCoord; import appeng.block.storage.DriveSlotsState; import appeng.client.render.model.DriveModelData; import appeng.container.implementations.DriveContainer; +import appeng.core.Api; import appeng.helpers.IPriorityHost; import appeng.me.GridAccessException; import appeng.me.helpers.MachineSource; @@ -347,7 +347,7 @@ public class DriveTileEntity extends AENetworkInvTileEntity implements IChestOrD private void updateState() { if (!this.isCached) { - final Collection>> storageChannels = AEApi.instance().storage() + final Collection>> storageChannels = Api.instance().storage() .storageChannels(); storageChannels.forEach(channel -> this.inventoryHandlers.put(channel, new ArrayList<>(10))); @@ -359,7 +359,7 @@ public class DriveTileEntity extends AENetworkInvTileEntity implements IChestOrD this.handlersBySlot[x] = null; if (!is.isEmpty()) { - this.handlersBySlot[x] = AEApi.instance().registries().cell().getHandler(is); + this.handlersBySlot[x] = Api.instance().registries().cell().getHandler(is); if (this.handlersBySlot[x] != null) { for (IStorageChannel> channel : storageChannels) { @@ -444,14 +444,14 @@ public class DriveTileEntity extends AENetworkInvTileEntity implements IChestOrD @Override public boolean allowInsert(IItemHandler inv, int slot, ItemStack stack) { - return !stack.isEmpty() && AEApi.instance().registries().cell().isCellHandled(stack); + return !stack.isEmpty() && Api.instance().registries().cell().isCellHandled(stack); } } @Override public ItemStack getItemStackRepresentation() { - return AEApi.instance().definitions().blocks().drive().maybeStack(1).orElse(ItemStack.EMPTY); + return Api.instance().definitions().blocks().drive().maybeStack(1).orElse(ItemStack.EMPTY); } @Nonnull diff --git a/src/main/java/appeng/tile/storage/IOPortTileEntity.java b/src/main/java/appeng/tile/storage/IOPortTileEntity.java index 339420d8f..70b30f1b4 100644 --- a/src/main/java/appeng/tile/storage/IOPortTileEntity.java +++ b/src/main/java/appeng/tile/storage/IOPortTileEntity.java @@ -31,7 +31,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FullnessMode; import appeng.api.config.OperationMode; @@ -56,6 +55,7 @@ import appeng.api.util.AECableType; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; +import appeng.core.Api; import appeng.core.settings.TickRates; import appeng.me.GridAccessException; import appeng.me.helpers.MachineSource; @@ -106,7 +106,7 @@ public class IOPortTileEntity extends AENetworkInvTileEntity this.mySrc = new MachineSource(this); this.lastRedstoneState = YesNo.UNDECIDED; - final Block ioPortBlock = AEApi.instance().definitions().blocks().iOPort().maybeBlock().get(); + final Block ioPortBlock = Api.instance().definitions().blocks().iOPort().maybeBlock().get(); this.upgrades = new BlockUpgradeInventory(ioPortBlock, this, NUMBER_OF_UPGRADE_SLOTS); } @@ -265,7 +265,7 @@ public class IOPortTileEntity extends AENetworkInvTileEntity if (!is.isEmpty()) { boolean shouldMove = true; - for (IStorageChannel> c : AEApi.instance().storage().storageChannels()) { + for (IStorageChannel> c : Api.instance().storage().storageChannels()) { if (itemsToMove > 0) { final IMEMonitor> network = this.getProxy().getStorage() .getInventory(c); @@ -316,8 +316,8 @@ public class IOPortTileEntity extends AENetworkInvTileEntity this.currentCell = is; this.cachedInventories = new IdentityHashMap<>(); - for (IStorageChannel> c : AEApi.instance().storage().storageChannels()) { - this.cachedInventories.put(c, AEApi.instance().registries().cell().getCellInventory(is, null, c)); + for (IStorageChannel> c : Api.instance().storage().storageChannels()) { + this.cachedInventories.put(c, Api.instance().registries().cell().getCellInventory(is, null, c)); } } diff --git a/src/main/java/appeng/util/Platform.java b/src/main/java/appeng/util/Platform.java index 4e4fffa71..578f5cf93 100644 --- a/src/main/java/appeng/util/Platform.java +++ b/src/main/java/appeng/util/Platform.java @@ -34,7 +34,6 @@ import com.google.common.collect.Iterables; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; @@ -70,7 +69,6 @@ import net.minecraftforge.fml.common.thread.SidedThreadGroups; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; @@ -103,6 +101,7 @@ import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.core.AEConfig; import appeng.core.AELog; +import appeng.core.Api; import appeng.core.stats.AeStats; import appeng.fluids.util.AEFluidStack; import appeng.hooks.TickHandler; @@ -873,11 +872,11 @@ public class Platform { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void postChanges(final IStorageGrid gs, final ItemStack removed, final ItemStack added, final IActionSource src) { - for (final IStorageChannel chan : AEApi.instance().storage().storageChannels()) { + for (final IStorageChannel chan : Api.instance().storage().storageChannels()) { final IItemList myChanges = chan.createList(); if (!removed.isEmpty()) { - final IMEInventory myInv = AEApi.instance().registries().cell().getCellInventory(removed, null, chan); + final IMEInventory myInv = Api.instance().registries().cell().getCellInventory(removed, null, chan); if (myInv != null) { myInv.getAvailableItems(myChanges); for (final IAEStack is : myChanges) { @@ -886,7 +885,7 @@ public class Platform { } } if (!added.isEmpty()) { - final IMEInventory myInv = AEApi.instance().registries().cell().getCellInventory(added, null, chan); + final IMEInventory myInv = Api.instance().registries().cell().getCellInventory(added, null, chan); if (myInv != null) { myInv.getAvailableItems(myChanges); } @@ -1136,8 +1135,7 @@ public class Platform { } if (type == AEFeature.CERTUS_QUARTZ_TOOLS) { - final IItemDefinition certusQuartzCrystal = AEApi.instance().definitions().materials() - .certusQuartzCrystal(); + final IItemDefinition certusQuartzCrystal = Api.instance().definitions().materials().certusQuartzCrystal(); return certusQuartzCrystal.isSameAs(b); } @@ -1156,7 +1154,7 @@ public class Platform { } public static boolean isRecipePrioritized(final ItemStack what) { - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); boolean isPurified = materials.purifiedCertusQuartzCrystal().isSameAs(what); isPurified |= materials.purifiedFluixCrystal().isSameAs(what); diff --git a/src/main/java/appeng/util/inv/IMEAdaptor.java b/src/main/java/appeng/util/inv/IMEAdaptor.java index e6e4163a2..806b967a0 100644 --- a/src/main/java/appeng/util/inv/IMEAdaptor.java +++ b/src/main/java/appeng/util/inv/IMEAdaptor.java @@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableList; import net.minecraft.item.ItemStack; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.networking.security.IActionSource; @@ -32,6 +31,7 @@ import appeng.api.storage.IMEInventory; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.Api; import appeng.util.InventoryAdaptor; import appeng.util.item.AEItemStack; @@ -57,8 +57,8 @@ public class IMEAdaptor extends InventoryAdaptor { } private IItemList getList() { - return this.target.getAvailableItems( - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); + return this.target + .getAvailableItems(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); } @Override diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index 369c66248..e427cac7b 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -33,11 +33,11 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.core.Api; import appeng.util.Platform; public final class AEItemStack extends AEStack implements IAEItemStack { @@ -154,7 +154,7 @@ public final class AEItemStack extends AEStack implements IAEItemS @Override public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); + return Api.instance().storage().getStorageChannel(IItemStorageChannel.class); } @Override diff --git a/src/main/java/appeng/util/item/AEItemStackRegistry.java b/src/main/java/appeng/util/item/AEItemStackRegistry.java index 929962da1..0fce27e36 100644 --- a/src/main/java/appeng/util/item/AEItemStackRegistry.java +++ b/src/main/java/appeng/util/item/AEItemStackRegistry.java @@ -30,8 +30,6 @@ import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; -import appeng.util.Platform; - public final class AEItemStackRegistry { private static final WeakHashMap> REGISTRY = new WeakHashMap<>(); diff --git a/src/main/java/appeng/util/item/ItemModList.java b/src/main/java/appeng/util/item/ItemModList.java index 96d985e02..885cbd521 100644 --- a/src/main/java/appeng/util/item/ItemModList.java +++ b/src/main/java/appeng/util/item/ItemModList.java @@ -20,16 +20,16 @@ package appeng.util.item; import java.util.Collection; -import appeng.api.AEApi; import appeng.api.config.FuzzyMode; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemContainer; +import appeng.core.Api; public class ItemModList implements IItemContainer { private final IItemContainer backingStore; - private final IItemContainer overrides = AEApi.instance().storage() + private final IItemContainer overrides = Api.instance().storage() .getStorageChannel(IItemStorageChannel.class).createList(); public ItemModList(final IItemContainer backend) { diff --git a/src/main/java/appeng/worldgen/meteorite/MeteoritePlacer.java b/src/main/java/appeng/worldgen/meteorite/MeteoritePlacer.java index 78bd20d26..f2de57628 100644 --- a/src/main/java/appeng/worldgen/meteorite/MeteoritePlacer.java +++ b/src/main/java/appeng/worldgen/meteorite/MeteoritePlacer.java @@ -35,12 +35,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.world.IWorld; -import appeng.api.AEApi; import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IMaterials; import appeng.api.features.AEFeature; import appeng.core.AEConfig; +import appeng.core.Api; import appeng.core.worlddata.WorldData; import appeng.util.InventoryAdaptor; import appeng.util.Platform; @@ -89,7 +89,7 @@ public final class MeteoritePlacer { this.squaredMeteoriteSize = this.meteoriteSize * this.meteoriteSize; this.crater = this.realCrater * this.realCrater; - final IBlocks blocks = AEApi.instance().definitions().blocks(); + final IBlocks blocks = Api.instance().definitions().blocks(); this.skyChestDefinition = blocks.skyStoneChest(); this.skyStone = blocks.skyStoneBlock().block().getDefaultState(); @@ -230,7 +230,7 @@ public final class MeteoritePlacer { } ItemStack toAdd = ItemStack.EMPTY; - final IMaterials materials = AEApi.instance().definitions().materials(); + final IMaterials materials = Api.instance().definitions().materials(); switch (r % 4) { case 0: diff --git a/src/main/java/team/chisel/ctm/api/IFacade.java b/src/main/java/team/chisel/ctm/api/IFacade.java index 6b31f30d1..710a3a250 100644 --- a/src/main/java/team/chisel/ctm/api/IFacade.java +++ b/src/main/java/team/chisel/ctm/api/IFacade.java @@ -1,14 +1,14 @@ package team.chisel.ctm.api; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import net.minecraft.block.BlockState; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - /** * To be implemented on blocks that "hide" another block inside, so connected textures can still be accomplished. */ From 06735f5c39711fcf07a2d769b080d5638a349325 Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 11 Jul 2020 23:07:20 +0200 Subject: [PATCH 19/29] Rewrite drive model to support custom cell models (#4459) * Rewrite driver model to support custom cell models Each cell can now register a mapping Item -> ResourceLocation for a custom cell model. Fallback will always be a 1k item cell. --- src/api/java/appeng/api/IAppEngApi.java | 13 +- .../appeng/api/client/ICellModelRegistry.java | 88 +++++++++++++ .../api/{util => client}/IClientHelper.java | 9 +- .../block/storage/DriveSlotCellType.java | 45 ------- .../client/render/model/DriveBakedModel.java | 27 ++-- .../client/render/model/DriveModel.java | 39 +++--- src/main/java/appeng/core/Api.java | 4 +- src/main/java/appeng/core/Registration.java | 4 +- .../java/appeng/core/api/ApiClientHelper.java | 18 ++- .../core/api/client/ApiCellModelRegistry.java | 119 ++++++++++++++++++ .../block/drive/cells/16k_fluid_cell.json | 6 + .../block/drive/cells/16k_item_cell.json | 6 + .../block/drive/cells/1k_fluid_cell.json | 6 + .../1k_item_cell.json} | 2 +- .../block/drive/cells/4k_fluid_cell.json | 6 + .../4k_item_cell.json} | 2 +- .../block/drive/cells/64k_fluid_cell.json | 6 + .../block/drive/cells/64k_item_cell.json | 6 + .../block/drive/cells/creative_cell.json | 6 + .../models/block/drive/drive_cell.json | 2 +- .../16k_fluid_cell.png} | Bin 139 -> 139 bytes .../16k_item_cell.png} | Bin 139 -> 139 bytes .../block/drive/cells/1k_fluid_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/1k_item_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/4k_fluid_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/4k_item_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/64k_fluid_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/64k_item_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/creative_cell.png | Bin 0 -> 139 bytes .../block/drive/cells/default_cell.png | Bin 0 -> 139 bytes 30 files changed, 319 insertions(+), 95 deletions(-) create mode 100644 src/api/java/appeng/api/client/ICellModelRegistry.java rename src/api/java/appeng/api/{util => client}/IClientHelper.java (90%) delete mode 100644 src/main/java/appeng/block/storage/DriveSlotCellType.java create mode 100644 src/main/java/appeng/core/api/client/ApiCellModelRegistry.java create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_fluid_cell.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_item_cell.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_fluid_cell.json rename src/main/resources/assets/appliedenergistics2/models/block/drive/{drive_cell_fluids.json => cells/1k_item_cell.json} (55%) create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_fluid_cell.json rename src/main/resources/assets/appliedenergistics2/models/block/drive/{drive_cell_items.json => cells/4k_item_cell.json} (55%) create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_fluid_cell.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_item_cell.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/cells/creative_cell.json rename src/main/resources/assets/appliedenergistics2/textures/block/drive/{item_cell.png => cells/16k_fluid_cell.png} (53%) rename src/main/resources/assets/appliedenergistics2/textures/block/drive/{fluid_cell.png => cells/16k_item_cell.png} (53%) create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/1k_fluid_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/1k_item_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/4k_fluid_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/4k_item_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_fluid_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_item_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/creative_cell.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/default_cell.png diff --git a/src/api/java/appeng/api/IAppEngApi.java b/src/api/java/appeng/api/IAppEngApi.java index 357ac1204..59b06c871 100644 --- a/src/api/java/appeng/api/IAppEngApi.java +++ b/src/api/java/appeng/api/IAppEngApi.java @@ -23,15 +23,21 @@ package appeng.api; +import appeng.api.client.IClientHelper; import appeng.api.definitions.IDefinitions; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridHelper; import appeng.api.networking.IGridNode; import appeng.api.parts.IPartHelper; import appeng.api.storage.IStorageHelper; -import appeng.api.util.IClientHelper; public interface IAppEngApi { + + /** + * @return An accessible list of all AE definitions + */ + IDefinitions definitions(); + /** * @return Registry Container for the numerous registries in AE2. */ @@ -52,11 +58,6 @@ public interface IAppEngApi { */ IPartHelper partHelper(); - /** - * @return An accessible list of all AE definitions - */ - IDefinitions definitions(); - /** * @return Utility methods primarily useful for client side stuff */ diff --git a/src/api/java/appeng/api/client/ICellModelRegistry.java b/src/api/java/appeng/api/client/ICellModelRegistry.java new file mode 100644 index 000000000..0fbab4332 --- /dev/null +++ b/src/api/java/appeng/api/client/ICellModelRegistry.java @@ -0,0 +1,88 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2020 TeamAppliedEnergistics + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package appeng.api.client; + +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.client.renderer.model.ModelBakery; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; + +/** + * A registry for 3D models used to render storage cells in the world, when they + * are inserted into a drive or similar machines. + */ +public interface ICellModelRegistry { + + /** + * Register a new model for a storage cell item. + * + *

+ * You are responsible for ensuring that the given model is actually loaded by + * the game. See + * {@see net.minecraftforge.client.model.ModelLoader#addSpecialModel}. + * + * This method only maps an {@link Item} to a {@link ResourceLocation} which can + * be looked up from the {@link ModelBakery}. No validation about missing models + * will be done. + * + * Will throw an exception in case a model is already registered for an item. + * + * For examples look at our cell part models within the drive model directory. + * + * @param item The cell item + * @param model The {@link ResourceLocation} representing the model. + * @return + */ + void registerModel(@Nonnull Item item, @Nonnull ResourceLocation model); + + /** + * The {@link ResourceLocation} of the model used to render the given storage + * cell {@link Item} when inserted into a drive or similar. + * + * @param item + * @return null, if no model is registered. + */ + @Nullable + ResourceLocation model(@Nonnull Item item); + + /** + * An unmodifiable map of all registered mappings. + * + * @return + */ + @Nonnull + Map models(); + + /** + * Returns the default model, which can be used when no explicit model is + * registered. + */ + @Nonnull + ResourceLocation getDefaultModel(); + +} diff --git a/src/api/java/appeng/api/util/IClientHelper.java b/src/api/java/appeng/api/client/IClientHelper.java similarity index 90% rename from src/api/java/appeng/api/util/IClientHelper.java rename to src/api/java/appeng/api/client/IClientHelper.java index 00d51ae46..df12ca411 100644 --- a/src/api/java/appeng/api/util/IClientHelper.java +++ b/src/api/java/appeng/api/client/IClientHelper.java @@ -21,7 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package appeng.api.util; +package appeng.api.client; import java.util.List; @@ -39,4 +39,11 @@ public interface IClientHelper { */ > void addCellInformation(ICellInventoryHandler handler, List lines); + /** + * A helper to work with clientside related tasks for cells. + * + * @return + */ + ICellModelRegistry cells(); + } diff --git a/src/main/java/appeng/block/storage/DriveSlotCellType.java b/src/main/java/appeng/block/storage/DriveSlotCellType.java deleted file mode 100644 index c808d614d..000000000 --- a/src/main/java/appeng/block/storage/DriveSlotCellType.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.block.storage; - -import net.minecraft.util.IStringSerializable; - -/** - * Describes the type of cell present in a slot. - */ -public enum DriveSlotCellType implements IStringSerializable { - - EMPTY("empty"), - - ITEM("item"), - - FLUID("fluid"); - - private final String name; - - DriveSlotCellType(String name) { - this.name = name; - } - - @Override - public String getName() { - return this.name; - } - -} diff --git a/src/main/java/appeng/client/render/model/DriveBakedModel.java b/src/main/java/appeng/client/render/model/DriveBakedModel.java index f5070eff0..1f9823a89 100644 --- a/src/main/java/appeng/client/render/model/DriveBakedModel.java +++ b/src/main/java/appeng/client/render/model/DriveBakedModel.java @@ -31,22 +31,22 @@ import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; -import appeng.api.definitions.IItems; -import appeng.block.storage.DriveSlotCellType; import appeng.block.storage.DriveSlotsState; import appeng.client.render.DelegateBakedModel; -import appeng.core.Api; public class DriveBakedModel extends DelegateBakedModel { - private final Map bakedCells; + private final Map bakedCells; + private final IBakedModel defaultCell; - public DriveBakedModel(IBakedModel bakedBase, Map bakedCells) { + public DriveBakedModel(IBakedModel bakedBase, Map cellModels, IBakedModel defaultCell) { super(bakedBase); - this.bakedCells = bakedCells; + this.bakedCells = cellModels; + this.defaultCell = defaultCell; } @Nonnull @@ -92,23 +92,18 @@ public class DriveBakedModel extends DelegateBakedModel { public boolean isAmbientOcclusion() { // We have faces inside the chassis that are facing east, but should not receive // ambient occlusion from the east-side, but sadly this cannot be fine-tuned on - // a - // face-by-face basis. + // a face-by-face basis. return false; } // Determine which drive chassis to show based on the used cell private IBakedModel getCellChassisModel(Item cell) { - IItems items = Api.INSTANCE.definitions().items(); if (cell == null) { - return bakedCells.get(DriveSlotCellType.EMPTY); - } else if (items.fluidCell1k().item() == cell || items.fluidCell4k().item() == cell - || items.fluidCell16k().item() == cell || items.fluidCell64k().item() == cell) { - return bakedCells.get(DriveSlotCellType.FLUID); - } else { - // Fall back to an item model - return bakedCells.get(DriveSlotCellType.ITEM); + return bakedCells.get(Items.AIR); } + final IBakedModel model = bakedCells.get(cell); + + return model != null ? model : defaultCell; } private static void addModel(@Nullable BlockState state, @Nonnull Random rand, @Nonnull IModelData extraData, diff --git a/src/main/java/appeng/client/render/model/DriveModel.java b/src/main/java/appeng/client/render/model/DriveModel.java index e5cf9100f..2988e9890 100644 --- a/src/main/java/appeng/client/render/model/DriveModel.java +++ b/src/main/java/appeng/client/render/model/DriveModel.java @@ -20,13 +20,12 @@ package appeng.client.render.model; import java.util.Collection; import java.util.Collections; -import java.util.EnumMap; +import java.util.IdentityHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.function.Function; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.model.IBakedModel; @@ -36,39 +35,41 @@ import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.Material; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.IModelConfiguration; import net.minecraftforge.client.model.geometry.IModelGeometry; -import appeng.block.storage.DriveSlotCellType; +import appeng.api.client.ICellModelRegistry; +import appeng.core.Api; public class DriveModel implements IModelGeometry { private static final ResourceLocation MODEL_BASE = new ResourceLocation( "appliedenergistics2:block/drive/drive_base"); - - private static final Map MODELS_CELLS = ImmutableMap.of( - DriveSlotCellType.EMPTY, new ResourceLocation("appliedenergistics2:block/drive/drive_cell_empty"), - DriveSlotCellType.ITEM, new ResourceLocation("appliedenergistics2:block/drive/drive_cell_items"), - DriveSlotCellType.FLUID, new ResourceLocation("appliedenergistics2:block/drive/drive_cell_fluids")); - - public static final Set DEPENDENCIES = ImmutableSet.builder() - .addAll(MODELS_CELLS.values()).add(MODEL_BASE).build(); + private static final ResourceLocation MODEL_CELL_EMPTY = new ResourceLocation( + "appliedenergistics2:block/drive/drive_cell_empty"); @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation) { - EnumMap cellModels = new EnumMap<>(DriveSlotCellType.class); + final ICellModelRegistry cellRegistry = Api.instance().client().cells(); + final Map cellModels = new IdentityHashMap<>(); - // Load the base model and the model for each cell state. - for (DriveSlotCellType cellType : MODELS_CELLS.keySet()) { - IBakedModel cellModel = bakery.getBakedModel(MODELS_CELLS.get(cellType), modelTransform, spriteGetter); - cellModels.put(cellType, cellModel); + // Load the base model and the model for each cell model. + for (Entry entry : cellRegistry.models().entrySet()) { + IBakedModel cellModel = bakery.getBakedModel(entry.getValue(), modelTransform, spriteGetter); + cellModels.put(entry.getKey(), cellModel); } - IBakedModel baseModel = bakery.getBakedModel(MODEL_BASE, modelTransform, spriteGetter); - return new DriveBakedModel(baseModel, cellModels); + final IBakedModel baseModel = bakery.getBakedModel(MODEL_BASE, modelTransform, spriteGetter); + final IBakedModel defaultCell = bakery.getBakedModel(cellRegistry.getDefaultModel(), modelTransform, + spriteGetter); + cellModels.put(Items.AIR, bakery.getBakedModel(MODEL_CELL_EMPTY, modelTransform, spriteGetter)); + + return new DriveBakedModel(baseModel, cellModels, defaultCell); } @Override diff --git a/src/main/java/appeng/core/Api.java b/src/main/java/appeng/core/Api.java index b26d959af..b61134ab0 100644 --- a/src/main/java/appeng/core/Api.java +++ b/src/main/java/appeng/core/Api.java @@ -20,10 +20,10 @@ package appeng.core; import appeng.api.AEAddon; import appeng.api.IAppEngApi; +import appeng.api.client.IClientHelper; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridHelper; import appeng.api.storage.IStorageHelper; -import appeng.api.util.IClientHelper; import appeng.core.api.ApiClientHelper; import appeng.core.api.ApiGrid; import appeng.core.api.ApiPart; @@ -67,7 +67,7 @@ public final class Api implements IAppEngApi { this.registryContainer = new RegistryContainer(); this.partHelper = new ApiPart(); this.definitions = new ApiDefinitions((PartModels) this.registryContainer.partModels()); - this.client = new ApiClientHelper(); + this.client = new ApiClientHelper(this.definitions); } public PartModels getPartModels() { diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 80238ec6c..34321d1a6 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -125,7 +125,6 @@ import appeng.client.render.effects.MatterCannonFX; import appeng.client.render.effects.ParticleTypes; import appeng.client.render.effects.VibrantFX; import appeng.client.render.model.BiometricCardModel; -import appeng.client.render.model.DriveModel; import appeng.client.render.model.MemoryCardModel; import appeng.client.render.model.SkyCompassModel; import appeng.client.render.tesr.InscriberTESR; @@ -165,6 +164,7 @@ import appeng.container.implementations.UpgradeableContainer; import appeng.container.implementations.VibrationChamberContainer; import appeng.container.implementations.WirelessContainer; import appeng.container.implementations.WirelessTermContainer; +import appeng.core.api.client.ApiCellModelRegistry; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.PartModels; import appeng.core.features.registries.cell.BasicCellHandler; @@ -256,7 +256,7 @@ final class Registration { SkyCompassModel.DEPENDENCIES.forEach(ModelLoader::addSpecialModel); ModelLoader.addSpecialModel(BiometricCardModel.MODEL_BASE); ModelLoader.addSpecialModel(MemoryCardModel.MODEL_BASE); - DriveModel.DEPENDENCIES.forEach(ModelLoader::addSpecialModel); + ApiCellModelRegistry.registerModels(); ModelLoader.addSpecialModel(MolecularAssemblerRenderer.LIGHTS_MODEL); PartModels partModels = (PartModels) Api.INSTANCE.registries().partModels(); diff --git a/src/main/java/appeng/core/api/ApiClientHelper.java b/src/main/java/appeng/core/api/ApiClientHelper.java index 235962e29..67482ecb1 100644 --- a/src/main/java/appeng/core/api/ApiClientHelper.java +++ b/src/main/java/appeng/core/api/ApiClientHelper.java @@ -1,5 +1,6 @@ /* * This file is part of Applied Energistics 2. + * * Copyright (c) 2013 - 2020, AlgorithmX2, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify @@ -23,14 +24,24 @@ import java.util.List; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import appeng.api.client.ICellModelRegistry; +import appeng.api.client.IClientHelper; import appeng.api.config.IncludeExclude; import appeng.api.storage.cells.ICellInventory; import appeng.api.storage.cells.ICellInventoryHandler; import appeng.api.storage.data.IAEStack; -import appeng.api.util.IClientHelper; +import appeng.core.ApiDefinitions; +import appeng.core.api.client.ApiCellModelRegistry; import appeng.core.localization.GuiText; public class ApiClientHelper implements IClientHelper { + + private final ICellModelRegistry cells; + + public ApiClientHelper(ApiDefinitions definitions) { + this.cells = new ApiCellModelRegistry(definitions); + } + @Override public > void addCellInformation(ICellInventoryHandler handler, List lines) { @@ -65,4 +76,9 @@ public class ApiClientHelper implements IClientHelper { } + @Override + public ICellModelRegistry cells() { + return this.cells; + } + } \ No newline at end of file diff --git a/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java new file mode 100644 index 000000000..837b61970 --- /dev/null +++ b/src/main/java/appeng/core/api/client/ApiCellModelRegistry.java @@ -0,0 +1,119 @@ +/* + * This file is part of Applied Energistics 2. + * + * Copyright (c) 2020, TeamAppliedEnergistics, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core.api.client; + +import java.util.Arrays; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.google.common.base.Preconditions; + +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.ModelLoader; + +import appeng.api.client.ICellModelRegistry; +import appeng.core.ApiDefinitions; + +public class ApiCellModelRegistry implements ICellModelRegistry { + + private static final ResourceLocation MODEL_BASE = new ResourceLocation( + "appliedenergistics2:block/drive/drive_base"); + private static final ResourceLocation MODEL_CELL_EMPTY = new ResourceLocation( + "appliedenergistics2:block/drive/drive_cell_empty"); + private static final ResourceLocation MODEL_CELL_DEFAULT = new ResourceLocation( + "appliedenergistics2:block/drive/drive_cell"); + private static final ResourceLocation MODEL_CELL_ITEMS_1K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/1k_item_cell"); + private static final ResourceLocation MODEL_CELL_ITEMS_4K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/4k_item_cell"); + private static final ResourceLocation MODEL_CELL_ITEMS_16K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/16k_item_cell"); + private static final ResourceLocation MODEL_CELL_ITEMS_64K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/64k_item_cell"); + private static final ResourceLocation MODEL_CELL_FLUIDS_1K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/1k_fluid_cell"); + private static final ResourceLocation MODEL_CELL_FLUIDS_4K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/4k_fluid_cell"); + private static final ResourceLocation MODEL_CELL_FLUIDS_16K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/16k_fluid_cell"); + private static final ResourceLocation MODEL_CELL_FLUIDS_64K = new ResourceLocation( + "appliedenergistics2:block/drive/cells/64k_fluid_cell"); + private static final ResourceLocation MODEL_CELL_CREATIVE = new ResourceLocation( + "appliedenergistics2:block/drive/cells/creative_cell"); + + private static final ResourceLocation[] MODELS = { MODEL_BASE, MODEL_CELL_EMPTY, MODEL_CELL_DEFAULT, + MODEL_CELL_ITEMS_1K, MODEL_CELL_ITEMS_4K, MODEL_CELL_ITEMS_16K, MODEL_CELL_ITEMS_64K, MODEL_CELL_FLUIDS_1K, + MODEL_CELL_FLUIDS_4K, MODEL_CELL_FLUIDS_16K, MODEL_CELL_FLUIDS_64K, MODEL_CELL_CREATIVE }; + + public static void registerModels() { + Arrays.stream(MODELS).forEach(ModelLoader::addSpecialModel); + } + + private final Map registry; + + public ApiCellModelRegistry(ApiDefinitions definitions) { + this.registry = new IdentityHashMap<>(); + this.registry.put(definitions.items().cell1k().item(), MODEL_CELL_ITEMS_1K); + this.registry.put(definitions.items().cell4k().item(), MODEL_CELL_ITEMS_4K); + this.registry.put(definitions.items().cell16k().item(), MODEL_CELL_ITEMS_16K); + this.registry.put(definitions.items().cell64k().item(), MODEL_CELL_ITEMS_64K); + this.registry.put(definitions.items().fluidCell1k().item(), MODEL_CELL_FLUIDS_1K); + this.registry.put(definitions.items().fluidCell4k().item(), MODEL_CELL_FLUIDS_4K); + this.registry.put(definitions.items().fluidCell16k().item(), MODEL_CELL_FLUIDS_16K); + this.registry.put(definitions.items().fluidCell64k().item(), MODEL_CELL_FLUIDS_64K); + this.registry.put(definitions.items().fluidCell64k().item(), MODEL_CELL_FLUIDS_64K); + this.registry.put(definitions.items().cellCreative().item(), MODEL_CELL_CREATIVE); + } + + @Override + public void registerModel(Item item, ResourceLocation model) { + Preconditions.checkNotNull(item); + Preconditions.checkNotNull(model); + Preconditions.checkArgument(!this.registry.containsKey(item), "Cannot register an item twice."); + + this.registry.put(item, model); + } + + @Override + @Nullable + public ResourceLocation model(@Nonnull Item item) { + Preconditions.checkNotNull(item); + + return this.registry.get(item); + } + + @Override + @Nonnull + public Map models() { + return Collections.unmodifiableMap(this.registry); + } + + @Override + @Nonnull + public ResourceLocation getDefaultModel() { + return MODEL_CELL_DEFAULT; + } + +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_fluid_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_fluid_cell.json new file mode 100644 index 000000000..590869d5f --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_fluid_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/16k_fluid_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_item_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_item_cell.json new file mode 100644 index 000000000..92a0b85a7 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/16k_item_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/16k_item_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_fluid_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_fluid_cell.json new file mode 100644 index 000000000..a6e124c7a --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_fluid_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/1k_fluid_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_item_cell.json similarity index 55% rename from src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json rename to src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_item_cell.json index c1e46c708..335e0cc59 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/1k_item_cell.json @@ -1,6 +1,6 @@ { "parent": "appliedenergistics2:block/drive/drive_cell", "textures": { - "cell": "appliedenergistics2:block/drive/fluid_cell" + "cell": "appliedenergistics2:block/drive/cells/1k_item_cell" } } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_fluid_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_fluid_cell.json new file mode 100644 index 000000000..bf12ce6bf --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_fluid_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/4k_fluid_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_item_cell.json similarity index 55% rename from src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json rename to src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_item_cell.json index 5fcaa819c..518338801 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/4k_item_cell.json @@ -1,6 +1,6 @@ { "parent": "appliedenergistics2:block/drive/drive_cell", "textures": { - "cell": "appliedenergistics2:block/drive/item_cell" + "cell": "appliedenergistics2:block/drive/cells/4k_item_cell" } } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_fluid_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_fluid_cell.json new file mode 100644 index 000000000..190c69796 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_fluid_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/64k_fluid_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_item_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_item_cell.json new file mode 100644 index 000000000..64bfb14cc --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/64k_item_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/64k_item_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/creative_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/creative_cell.json new file mode 100644 index 000000000..a289cd039 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/cells/creative_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "appliedenergistics2:block/drive/drive_cell", + "textures": { + "cell": "appliedenergistics2:block/drive/cells/creative_cell" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json index fdeb22556..147637da8 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json @@ -1,6 +1,6 @@ { "textures": { - "cell": "appliedenergistics2:block/drive/item_cell" + "cell": "appliedenergistics2:block/drive/cells/default_cell" }, "elements": [ { diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive/item_cell.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/16k_fluid_cell.png similarity index 53% rename from src/main/resources/assets/appliedenergistics2/textures/block/drive/item_cell.png rename to src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/16k_fluid_cell.png index 4c90c29d39cb5b48362d313dabc1d3948fb10d19..fa2693a048cc9b2c1371ae358a8bbee31e1129e1 100644 GIT binary patch delta 52 zcmeBX>}H%0r~4+lyr)s*0L#)&w#8B%j3B(_+JOTM3}JpuN+R(u@)#Hx7(8A5T-G@y GGywqrtP&&u delta 52 zcmeBX>}H%0ryH{|iIrKifzwNv*UeOb8H6*|Ha0RcnEzsu__6%AD+2=qgQu&X%Q~lo FCIEa&4;KIc diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive/fluid_cell.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/16k_item_cell.png similarity index 53% rename from src/main/resources/assets/appliedenergistics2/textures/block/drive/fluid_cell.png rename to src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/16k_item_cell.png index d3abeda66b1a8e4156f0ee9fc4b86fc77e86f9ce..e4679422b2f739fa62007b756cfce55b20eefa55 100644 GIT binary patch delta 52 zcmeBX>}H%0ryH{&fst9WfzwNv*UeOb8H6*|Ha0RcyqnF$z`r{)jDdlH!PC{xWt~$( F698;P4f+58 delta 52 zcmeBX>}H%0r@Lm>&WVj82UwPNvMrYCUk44ofy`glX=O&z`&C3 z=k44ofy`glX=O&z`&C3 z=k44ofy`glX=O&z`&C3 z=k44ofy`glX=O&z`&C3 z=mdKI;Vst06Xd(@c;k- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_fluid_cell.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_fluid_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4c7e2cc92574dfa99369724430b869637f90a5 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL7>k44ofy`glX=O&z`&C3 z=W@jajpS(@U7w k%~XIHgfrGQHZn4>R5L}Ni)ajIU|?YIboFyt=akR{07lmx%K!iX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_item_cell.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/64k_item_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..816f526a2f4f4bf2075114966f2ac7eafd71ef16 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL7>k44ofy`glX=O&z`&C3 z=mdKI;Vst0Af)dsQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/creative_cell.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive/cells/creative_cell.png new file mode 100644 index 0000000000000000000000000000000000000000..85fe9b851ef671d875d3629ffc6784e6e7c626d9 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL7>k44ofy`glX=O&z`&C3 z=k44ofy`glX=O&z`&C3 z= Date: Sun, 12 Jul 2020 16:21:30 +0200 Subject: [PATCH 20/29] Refactored crafting patterns (#4458) * Deduplicate crafting patterns internals This should save a bit memory for duplicate patterns as well as speed up loading new patterns on reloading chunks. * Encode recipe id in pattern * Use the recipe id directly for looking it up * Slightly refactored how patterns encode whether they are crafting patterns or not. * Renamed PatternHelper. * Added APIs to encode patterns. (#4463) * Removed ICraftingPatternItem. * Renamed isCrafting to isCraftable Co-authored-by: shartte --- src/api/java/appeng/api/IAppEngApi.java | 6 + .../appeng/api/crafting/ICraftingHelper.java | 108 +++++++++++ .../implementations/ICraftingPatternItem.java | 46 ----- .../crafting/ICraftingPatternDetails.java | 15 +- .../crafting/ICraftingProviderHelper.java | 4 + .../MolecularAssemblerContainer.java | 4 +- .../implementations/PatternTermContainer.java | 62 ++----- .../container/slot/RestrictedInputSlot.java | 36 +--- src/main/java/appeng/core/Api.java | 9 + .../java/appeng/core/api/ApiCrafting.java | 167 ++++++++++++++++++ .../core/sync/packets/CraftRequestPacket.java | 2 +- ...elper.java => CraftingPatternDetails.java} | 93 +++++----- .../java/appeng/helpers/DualityInterface.java | 21 +-- .../appeng/items/misc/EncodedPatternItem.java | 148 ++++++++++++++-- .../appeng/me/cache/CraftingGridCache.java | 4 + .../implementations/CraftingCPUCluster.java | 8 +- .../parts/reporting/PatternTerminalPart.java | 29 ++- .../MolecularAssemblerTileEntity.java | 6 +- .../java/team/chisel/ctm/api/IFacade.java | 26 +-- 19 files changed, 551 insertions(+), 243 deletions(-) create mode 100644 src/api/java/appeng/api/crafting/ICraftingHelper.java delete mode 100644 src/api/java/appeng/api/implementations/ICraftingPatternItem.java create mode 100644 src/main/java/appeng/core/api/ApiCrafting.java rename src/main/java/appeng/helpers/{PatternHelper.java => CraftingPatternDetails.java} (79%) diff --git a/src/api/java/appeng/api/IAppEngApi.java b/src/api/java/appeng/api/IAppEngApi.java index 59b06c871..6a3391f8c 100644 --- a/src/api/java/appeng/api/IAppEngApi.java +++ b/src/api/java/appeng/api/IAppEngApi.java @@ -24,6 +24,7 @@ package appeng.api; import appeng.api.client.IClientHelper; +import appeng.api.crafting.ICraftingHelper; import appeng.api.definitions.IDefinitions; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridHelper; @@ -48,6 +49,11 @@ public interface IAppEngApi { */ IStorageHelper storage(); + /** + * @return A helper for working with crafting related tasks. + */ + ICraftingHelper crafting(); + /** * @return A helper to create {@link IGridNode} and other grid related objects. */ diff --git a/src/api/java/appeng/api/crafting/ICraftingHelper.java b/src/api/java/appeng/api/crafting/ICraftingHelper.java new file mode 100644 index 000000000..909f26353 --- /dev/null +++ b/src/api/java/appeng/api/crafting/ICraftingHelper.java @@ -0,0 +1,108 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2020 TeamAppliedEnergistics + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package appeng.api.crafting; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.world.World; + +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.storage.data.IAEItemStack; + +public interface ICraftingHelper { + + /** + * Checks that the given item stack is an encoded pattern. + */ + boolean isEncodedPattern(@Nullable IAEItemStack item); + + /** + * Checks that the given item stack is an encoded pattern. + */ + boolean isEncodedPattern(ItemStack item); + + /** + * Encodes a processing pattern which represents the ability to convert the + * given inputs into the given outputs using some process external to the ME + * system. + * + * @param stack If null, a new item will be created to hold the encoded pattern. + * Otherwise the given item must already contains an encoded + * pattern that will be overwritten. + * @return A new encoded pattern, or the given stack with the pattern encoded in + * it. + */ + ItemStack encodeProcessingPattern(@Nullable ItemStack stack, ItemStack[] in, ItemStack[] out); + + /** + * Encodes a crafting pattern which represents a Vanilla crafting recipe. + * + * @param stack If null, a new item will be created to hold the + * encoded pattern. Otherwise the given item must + * already contains an encoded pattern that will be + * overwritten. + * @param recipe The Vanilla crafting recipe to be encoded. + * @param in The items in the crafting grid, which are used to + * determine what items are supplied from the ME system + * to craft using this pattern. + * @param out What is to be expected as the result of this crafting + * operation by the ME system. + * @param allowSubstitutes Controls whether the ME system will allow the use of + * equivalent items to craft this recipe. + */ + ItemStack encodeCraftingPattern(@Nullable ItemStack stack, ICraftingRecipe recipe, ItemStack[] in, ItemStack out, + boolean allowSubstitutes); + + /** + * Same as {@link #decodePattern(ItemStack, World, boolean)} with no auto + * recovery of changed recipe ids. + */ + @Nullable + default ICraftingPatternDetails decodePattern(@Nonnull ItemStack itemStack, @Nonnull World world) { + return decodePattern(itemStack, world, false); + } + + /** + * Decodes an encoded crafting pattern and returns the pattern details. + *

+ * The item backing the {@link ItemStack} needs to be an item returned by the + * encode methods of this class. + * + * @param itemStack pattern + * @param world world used to access the + * {@link net.minecraft.item.crafting.RecipeManager}. + * @param autoRecovery If true, the method will try to recover from changed + * recipe ids by searching the entire recipe manager for a + * recipe matching the inputs. If this is successful, the + * given item stack will be changed to reflect the new + * recipe id. + * @return The pattern details if the pattern could be decoded. Otherwise null. + */ + @Nullable + ICraftingPatternDetails decodePattern(@Nonnull ItemStack itemStack, @Nonnull World world, boolean autoRecovery); + +} diff --git a/src/api/java/appeng/api/implementations/ICraftingPatternItem.java b/src/api/java/appeng/api/implementations/ICraftingPatternItem.java deleted file mode 100644 index 5b93bd7f6..000000000 --- a/src/api/java/appeng/api/implementations/ICraftingPatternItem.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2013 AlgorithmX2 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package appeng.api.implementations; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import appeng.api.networking.crafting.ICraftingPatternDetails; - -/** - * Implemented on {@link Item} - */ -public interface ICraftingPatternItem { - - /** - * Access Details about a pattern - * - * @param is pattern - * @param w crafting world - * - * @return details of pattern - */ - ICraftingPatternDetails getPatternForItem(ItemStack is, World w); -} diff --git a/src/api/java/appeng/api/networking/crafting/ICraftingPatternDetails.java b/src/api/java/appeng/api/networking/crafting/ICraftingPatternDetails.java index 795c5830b..f2ac98821 100644 --- a/src/api/java/appeng/api/networking/crafting/ICraftingPatternDetails.java +++ b/src/api/java/appeng/api/networking/crafting/ICraftingPatternDetails.java @@ -27,18 +27,19 @@ import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import appeng.api.implementations.ICraftingPatternItem; import appeng.api.storage.data.IAEItemStack; /** - * do not implement provided by {@link ICraftingPatternItem} - * - * caching this INSTANCE will increase performance of validation and checks. + * Describes a crafting or processing pattern decoded by + * {@link appeng.api.crafting.ICraftingHelper}. + *

+ * Do not cache instances of this class unless you handle recipe reloads on the + * server and client correctly. */ public interface ICraftingPatternDetails { /** - * @return source item. + * @return encodes this crafting pattern into a new item stack. */ ItemStack getPattern(); @@ -52,7 +53,9 @@ public interface ICraftingPatternDetails { boolean isValidItemForSlot(int slotIndex, ItemStack itemStack, World world); /** - * @return if this pattern is a crafting pattern ( work bench ) + * @return if this pattern is for a Vanilla + * {@link net.minecraft.item.crafting.IRecipeType#CRAFTING crafting + * recipe}. */ boolean isCraftable(); diff --git a/src/api/java/appeng/api/networking/crafting/ICraftingProviderHelper.java b/src/api/java/appeng/api/networking/crafting/ICraftingProviderHelper.java index 00efcc1ca..1c7e6c4cc 100644 --- a/src/api/java/appeng/api/networking/crafting/ICraftingProviderHelper.java +++ b/src/api/java/appeng/api/networking/crafting/ICraftingProviderHelper.java @@ -23,6 +23,7 @@ package appeng.api.networking.crafting; +import appeng.api.crafting.ICraftingHelper; import appeng.api.storage.data.IAEItemStack; /** @@ -33,6 +34,9 @@ public interface ICraftingProviderHelper { /** * Add new Pattern to AE's crafting cache. + * + * This will only accept instances created by + * {@link ICraftingHelper#decodePattern(net.minecraft.item.ItemStack, net.minecraft.world.World)} */ void addCraftingOption(ICraftingMedium medium, ICraftingPatternDetails api); diff --git a/src/main/java/appeng/container/implementations/MolecularAssemblerContainer.java b/src/main/java/appeng/container/implementations/MolecularAssemblerContainer.java index 341602fbe..542a32cfd 100644 --- a/src/main/java/appeng/container/implementations/MolecularAssemblerContainer.java +++ b/src/main/java/appeng/container/implementations/MolecularAssemblerContainer.java @@ -38,6 +38,7 @@ import appeng.container.slot.AppEngSlot; import appeng.container.slot.MolecularAssemblerPatternSlot; import appeng.container.slot.OutputSlot; import appeng.container.slot.RestrictedInputSlot; +import appeng.core.Api; import appeng.items.misc.EncodedPatternItem; import appeng.tile.crafting.MolecularAssemblerTileEntity; import appeng.util.Platform; @@ -79,8 +80,7 @@ public class MolecularAssemblerContainer extends UpgradeableContainer implements if (is.getItem() instanceof EncodedPatternItem) { final World w = this.getTileEntity().getWorld(); - final EncodedPatternItem iep = (EncodedPatternItem) is.getItem(); - final ICraftingPatternDetails ph = iep.getPatternForItem(is, w); + final ICraftingPatternDetails ph = Api.instance().crafting().decodePattern(is, w); if (ph.isCraftable()) { return ph.isValidItemForSlot(slotIndex, i, w); } diff --git a/src/main/java/appeng/container/implementations/PatternTermContainer.java b/src/main/java/appeng/container/implementations/PatternTermContainer.java index 7ca82cc5a..22fd63e5b 100644 --- a/src/main/java/appeng/container/implementations/PatternTermContainer.java +++ b/src/main/java/appeng/container/implementations/PatternTermContainer.java @@ -20,7 +20,6 @@ package appeng.container.implementations; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -32,11 +31,9 @@ import net.minecraft.inventory.container.CraftingResultSlot; import net.minecraft.inventory.container.IContainerListener; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.ListNBT; import net.minecraft.network.PacketBuffer; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; @@ -44,6 +41,7 @@ import net.minecraftforge.items.wrapper.PlayerInvWrapper; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; +import appeng.api.crafting.ICraftingHelper; import appeng.api.definitions.IDefinitions; import appeng.api.storage.IMEMonitor; import appeng.api.storage.ITerminalHost; @@ -98,8 +96,9 @@ public class PatternTermContainer extends MEMonitorableContainer private final PatternTermSlot craftSlot; private final RestrictedInputSlot patternSlotIN; private final RestrictedInputSlot patternSlotOUT; + private final ICraftingHelper craftingHelper = Api.INSTANCE.crafting(); - private IRecipe currentRecipe; + private ICraftingRecipe currentRecipe; @GuiSync(97) public boolean craftingMode = true; @GuiSync(96) @@ -206,17 +205,17 @@ public class PatternTermContainer extends MEMonitorableContainer final ItemStack[] out = this.getOutputs(); // if there is no input, this would be silly. - if (in == null || out == null) { + if (in == null || out == null || isCraftingMode() && currentRecipe == null) { return; } // first check the output slots, should either be null, or a pattern - if (!output.isEmpty() && !this.isPattern(output)) { + if (!output.isEmpty() && !craftingHelper.isEncodedPattern(output)) { return; } // if nothing is there we should snag a new pattern. else if (output.isEmpty()) { output = this.patternSlotIN.getStack(); - if (output.isEmpty() || !this.isPattern(output)) { + if (output.isEmpty() || !isPattern(output)) { return; // no blanks. } @@ -226,34 +225,17 @@ public class PatternTermContainer extends MEMonitorableContainer this.patternSlotIN.putStack(ItemStack.EMPTY); } - // add a new encoded pattern. - Optional maybePattern = Api.instance().definitions().items().encodedPattern().maybeStack(1); - if (maybePattern.isPresent()) { - output = maybePattern.get(); - this.patternSlotOUT.putStack(output); - } + // let the crafting helper create a new encoded pattern + output = null; } - // encode the slot. - final CompoundNBT encodedValue = new CompoundNBT(); - - final ListNBT tagIn = new ListNBT(); - final ListNBT tagOut = new ListNBT(); - - for (final ItemStack i : in) { - tagIn.add(this.createItemTag(i)); + if (this.isCraftingMode()) { + output = craftingHelper.encodeCraftingPattern(output, this.currentRecipe, in, out[0], isSubstitute()); + } else { + output = craftingHelper.encodeProcessingPattern(output, in, out); } + this.patternSlotOUT.putStack(output); - for (final ItemStack i : out) { - tagOut.add(this.createItemTag(i)); - } - - encodedValue.put("in", tagIn); - encodedValue.put("out", tagOut); - encodedValue.putBoolean("crafting", this.isCraftingMode()); - encodedValue.putBoolean("substitute", this.isSubstitute()); - - output.setTag(encodedValue); } private ItemStack[] getInputs() { @@ -308,21 +290,7 @@ public class PatternTermContainer extends MEMonitorableContainer } final IDefinitions definitions = Api.instance().definitions(); - - boolean isPattern = definitions.items().encodedPattern().isSameAs(output); - isPattern |= definitions.materials().blankPattern().isSameAs(output); - - return isPattern; - } - - private INBT createItemTag(final ItemStack i) { - final CompoundNBT c = new CompoundNBT(); - - if (!i.isEmpty()) { - i.write(c); - } - - return c; + return definitions.materials().blankPattern().isSameAs(output); } @Override diff --git a/src/main/java/appeng/container/slot/RestrictedInputSlot.java b/src/main/java/appeng/container/slot/RestrictedInputSlot.java index 152c9eb92..d6913fc45 100644 --- a/src/main/java/appeng/container/slot/RestrictedInputSlot.java +++ b/src/main/java/appeng/container/slot/RestrictedInputSlot.java @@ -33,11 +33,11 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.items.IItemHandler; +import appeng.api.crafting.ICraftingHelper; import appeng.api.definitions.IDefinitions; import appeng.api.definitions.IItems; import appeng.api.definitions.IMaterials; import appeng.api.features.INetworkEncodable; -import appeng.api.implementations.ICraftingPatternItem; import appeng.api.implementations.items.IBiometricCard; import appeng.api.implementations.items.ISpatialStorageCell; import appeng.api.implementations.items.IStorageComponent; @@ -88,10 +88,7 @@ public class RestrictedInputSlot extends AppEngSlot { public boolean isValid(final ItemStack is, final World theWorld) { if (this.which == PlacableItemType.VALID_ENCODED_PATTERN_W_OUTPUT) { - final ICraftingPatternDetails ap = is.getItem() instanceof ICraftingPatternItem - ? ((ICraftingPatternItem) is.getItem()).getPatternForItem(is, theWorld) - : null; - return ap != null; + return Api.instance().crafting().decodePattern(is, theWorld) != null; } return true; } @@ -126,39 +123,24 @@ public class RestrictedInputSlot extends AppEngSlot { final IDefinitions definitions = Api.instance().definitions(); final IMaterials materials = definitions.materials(); final IItems items = definitions.items(); + final ICraftingHelper crafting = Api.instance().crafting(); switch (this.which) { case ENCODED_CRAFTING_PATTERN: - if (i.getItem() instanceof ICraftingPatternItem) { - final ICraftingPatternItem b = (ICraftingPatternItem) i.getItem(); - final ICraftingPatternDetails de = b.getPatternForItem(i, this.p.player.world); - if (de != null) { - return de.isCraftable(); - } + final ICraftingPatternDetails de = crafting.decodePattern(i, this.p.player.world); + if (de != null) { + return de.isCraftable(); } return false; case VALID_ENCODED_PATTERN_W_OUTPUT: case ENCODED_PATTERN_W_OUTPUT: - case ENCODED_PATTERN: { - if (i.getItem() instanceof ICraftingPatternItem) { - return true; - } - // ICraftingPatternDetails pattern = i.getItem() instanceof ICraftingPatternItem - // ? - // ((ICraftingPatternItem) - // i.getItem()).getPatternForItem( i ) : null; - return false;// pattern != null; - } + case ENCODED_PATTERN: + return crafting.isEncodedPattern(i); case BLANK_PATTERN: return materials.blankPattern().isSameAs(i); case PATTERN: - - if (i.getItem() instanceof ICraftingPatternItem) { - return true; - } - - return materials.blankPattern().isSameAs(i); + return materials.blankPattern().isSameAs(i) || crafting.isEncodedPattern(i); case INSCRIBER_PLATE: if (materials.namePress().isSameAs(i)) { diff --git a/src/main/java/appeng/core/Api.java b/src/main/java/appeng/core/Api.java index b61134ab0..f052afd07 100644 --- a/src/main/java/appeng/core/Api.java +++ b/src/main/java/appeng/core/Api.java @@ -21,10 +21,12 @@ package appeng.core; import appeng.api.AEAddon; import appeng.api.IAppEngApi; import appeng.api.client.IClientHelper; +import appeng.api.crafting.ICraftingHelper; import appeng.api.features.IRegistryContainer; import appeng.api.networking.IGridHelper; import appeng.api.storage.IStorageHelper; import appeng.core.api.ApiClientHelper; +import appeng.core.api.ApiCrafting; import appeng.core.api.ApiGrid; import appeng.core.api.ApiPart; import appeng.core.api.ApiStorage; @@ -59,6 +61,7 @@ public final class Api implements IAppEngApi { private final IStorageHelper storageHelper; private final IGridHelper networkHelper; private final ApiDefinitions definitions; + private final ICraftingHelper craftingHelper; private final IClientHelper client; private Api() { @@ -67,6 +70,7 @@ public final class Api implements IAppEngApi { this.registryContainer = new RegistryContainer(); this.partHelper = new ApiPart(); this.definitions = new ApiDefinitions((PartModels) this.registryContainer.partModels()); + this.craftingHelper = new ApiCrafting(this.definitions); this.client = new ApiClientHelper(this.definitions); } @@ -84,6 +88,11 @@ public final class Api implements IAppEngApi { return this.storageHelper; } + @Override + public ICraftingHelper crafting() { + return this.craftingHelper; + } + @Override public IGridHelper grid() { return this.networkHelper; diff --git a/src/main/java/appeng/core/api/ApiCrafting.java b/src/main/java/appeng/core/api/ApiCrafting.java new file mode 100644 index 000000000..e4f710bc2 --- /dev/null +++ b/src/main/java/appeng/core/api/ApiCrafting.java @@ -0,0 +1,167 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2020, TeamAppliedEnergistics, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core.api; + +import java.util.List; + +import javax.annotation.Nullable; + +import com.google.common.base.Preconditions; + +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.RecipeManager; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import appeng.api.crafting.ICraftingHelper; +import appeng.api.definitions.IItemDefinition; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.storage.channels.IItemStorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.container.ContainerNull; +import appeng.core.AELog; +import appeng.core.Api; +import appeng.core.ApiDefinitions; +import appeng.helpers.CraftingPatternDetails; +import appeng.items.misc.EncodedPatternItem; + +public class ApiCrafting implements ICraftingHelper { + + private final IItemDefinition encodedPattern; + + public ApiCrafting(ApiDefinitions definitions) { + this.encodedPattern = definitions.items().encodedPattern(); + } + + @Override + public boolean isEncodedPattern(@Nullable IAEItemStack item) { + return item != null && item.getItem() instanceof EncodedPatternItem; + } + + @Override + public boolean isEncodedPattern(ItemStack item) { + return !item.isEmpty() && item.getItem() instanceof EncodedPatternItem; + } + + @Override + public ItemStack encodeCraftingPattern(@Nullable ItemStack stack, ICraftingRecipe recipe, ItemStack[] in, + ItemStack out, boolean allowSubstitutes) { + if (stack == null) { + stack = encodedPattern.stack(1); + } else { + Preconditions.checkArgument(isEncodedPattern(stack)); + } + + EncodedPatternItem.encodeCraftingPattern(stack, in, new ItemStack[] { out }, recipe.getId(), allowSubstitutes); + return stack; + } + + @Override + public ItemStack encodeProcessingPattern(@Nullable ItemStack stack, ItemStack[] in, ItemStack[] out) { + if (stack == null) { + stack = encodedPattern.stack(1); + } else { + Preconditions.checkArgument(isEncodedPattern(stack)); + } + + EncodedPatternItem.encodeProcessingPattern(stack, in, out); + return stack; + } + + @Override + public ICraftingPatternDetails decodePattern(final ItemStack is, final World world, boolean autoRecovery) { + if (is == null || world == null) { + return null; + } + + EncodedPatternItem patternItem = getPatternItem(is); + if (patternItem == null || !patternItem.isEncodedPattern(is)) { + return null; + } + + // The recipe ids encoded in a pattern can go stale. This code attempts to find + // the new id + // based on the stored inputs/outputs if that happens. + ResourceLocation recipeId = patternItem.getCraftingRecipeId(is); + if (recipeId != null) { + IRecipe recipe = world.getRecipeManager().getRecipes(IRecipeType.CRAFTING).get(recipeId); + if (!(recipe instanceof ICraftingRecipe)) { + if (!autoRecovery || !attemptRecovery(patternItem, is, world)) { + return null; + } + } + } + + // We use the shared itemstack for an identity lookup. + IAEItemStack ais = Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(is); + + return new CraftingPatternDetails(ais, world); + } + + private boolean attemptRecovery(EncodedPatternItem patternItem, ItemStack itemStack, World world) { + + RecipeManager recipeManager = world.getRecipeManager(); + + List ingredients = patternItem.getIngredients(itemStack); + List products = patternItem.getProducts(itemStack); + if (ingredients.size() < 9 || products.size() < 1) { + return false; + } + + ResourceLocation currentRecipeId = patternItem.getCraftingRecipeId(itemStack); + + // Fill a crafting inventory with the ingredients to find a suitable recipe + CraftingInventory testInventory = new CraftingInventory(new ContainerNull(), 3, 3); + for (int x = 0; x < 9; x++) { + final IAEItemStack ais = ingredients.get(x); + final ItemStack gs = ais != null ? ais.createItemStack() : ItemStack.EMPTY; + testInventory.setInventorySlotContents(x, gs); + } + + ICraftingRecipe potentialRecipe = recipeManager.getRecipe(IRecipeType.CRAFTING, testInventory, world) + .orElse(null); + + if (potentialRecipe != null) { + // Check that it matches the expected output + if (products.get(0).isSameType(potentialRecipe.getCraftingResult(testInventory))) { + // Yay we found a match, reencode the pattern + AELog.debug("Re-Encoding pattern from %s -> %s", currentRecipeId, potentialRecipe.getId()); + ItemStack[] in = ingredients.stream().map(ais -> ais != null ? ais.createItemStack() : ItemStack.EMPTY) + .toArray(ItemStack[]::new); + ItemStack out = products.get(0).createItemStack(); + encodeCraftingPattern(itemStack, potentialRecipe, in, out, patternItem.allowsSubstitution(itemStack)); + } + } + + AELog.debug("Failed to recover encoded crafting pattern for recipe %s", currentRecipeId); + return false; + } + + private static EncodedPatternItem getPatternItem(ItemStack itemStack) { + if (itemStack.getItem() instanceof EncodedPatternItem) { + return (EncodedPatternItem) itemStack.getItem(); + } + return null; + } + +} diff --git a/src/main/java/appeng/core/sync/packets/CraftRequestPacket.java b/src/main/java/appeng/core/sync/packets/CraftRequestPacket.java index 56bf5bce3..713fdadec 100644 --- a/src/main/java/appeng/core/sync/packets/CraftRequestPacket.java +++ b/src/main/java/appeng/core/sync/packets/CraftRequestPacket.java @@ -101,7 +101,7 @@ public class CraftRequestPacket extends BasePacket { if (futureJob != null) { futureJob.cancel(true); } - AELog.debug(e); + AELog.info(e); } } } diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/CraftingPatternDetails.java similarity index 79% rename from src/main/java/appeng/helpers/PatternHelper.java rename to src/main/java/appeng/helpers/CraftingPatternDetails.java index 0664ec83e..b92dcad17 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/CraftingPatternDetails.java @@ -25,13 +25,15 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.base.Preconditions; + import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -39,12 +41,11 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.container.ContainerNull; import appeng.core.Api; +import appeng.items.misc.EncodedPatternItem; import appeng.util.Platform; -import appeng.util.item.AEItemStack; -public class PatternHelper implements ICraftingPatternDetails, Comparable { +public class CraftingPatternDetails implements ICraftingPatternDetails, Comparable { - private final ItemStack patternItem; private final CraftingInventory crafting = new CraftingInventory(new ContainerNull(), 3, 3); private final CraftingInventory testFrame = new CraftingInventory(new ContainerNull(), 3, 3); private final ItemStack correctOutput; @@ -53,79 +54,73 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable failCache = new HashSet<>(); private final Set passCache = new HashSet<>(); private final IAEItemStack pattern; private int priority = 0; - public PatternHelper(final ItemStack is, final World w) { - final CompoundNBT encodedValue = is.getTag(); + public CraftingPatternDetails(final IAEItemStack is, final World w) { + Preconditions.checkArgument(is.getItem() instanceof EncodedPatternItem, + "itemStack is not a ICraftingPatternItem"); - if (encodedValue == null) { - throw new IllegalArgumentException("No pattern here!"); - } + final EncodedPatternItem templateItem = (EncodedPatternItem) is.getItem(); + final ItemStack itemStack = is.createItemStack(); - final ListNBT inTag = encodedValue.getList("in", 10); - final ListNBT outTag = encodedValue.getList("out", 10); - this.isCrafting = encodedValue.getBoolean("crafting"); + final List ingredients = templateItem.getIngredients(itemStack); + final List products = templateItem.getProducts(itemStack); + final ResourceLocation recipeId = templateItem.getCraftingRecipeId(itemStack); - this.canSubstitute = this.isCrafting && encodedValue.getBoolean("substitute"); - this.patternItem = is; - this.pattern = AEItemStack.fromItemStack(is); + this.pattern = is.copy(); + this.isCraftable = recipeId != null; + this.canSubstitute = templateItem.allowsSubstitution(itemStack); final List in = new ArrayList<>(); final List out = new ArrayList<>(); - for (int x = 0; x < inTag.size(); x++) { - CompoundNBT ingredient = inTag.getCompound(x); - final ItemStack gs = ItemStack.read(ingredient); - - if (!ingredient.isEmpty() && gs.isEmpty()) { - throw new IllegalArgumentException("No pattern here!"); - } + for (int x = 0; x < 9; x++) { + final IAEItemStack ais = ingredients.get(x); + final ItemStack gs = ais != null ? ais.createItemStack() : ItemStack.EMPTY; this.crafting.setInventorySlotContents(x, gs); - if (!gs.isEmpty() && (!this.isCrafting || !gs.hasTag())) { + if (!gs.isEmpty() && (!this.isCraftable) || !gs.hasTag()) { this.markItemAs(x, gs, TestStatus.ACCEPT); } - in.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(gs)); + in.add(ais != null ? ais.copy() : null); this.testFrame.setInventorySlotContents(x, gs); } - if (this.isCrafting) { - this.standardRecipe = w.getRecipeManager().getRecipe(IRecipeType.CRAFTING, this.crafting, w).orElse(null); + if (this.isCraftable) { + IRecipe recipe = w.getRecipeManager().getRecipes(IRecipeType.CRAFTING).get(recipeId); - if (this.standardRecipe != null) { - this.correctOutput = this.standardRecipe.getCraftingResult(this.crafting); - out.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class) - .createStack(this.correctOutput)); - } else { - throw new IllegalStateException("No pattern here!"); + if (recipe == null || recipe.getType() != IRecipeType.CRAFTING) { + throw new IllegalStateException("recipe id is not a crafting recipe"); } + + this.standardRecipe = (ICraftingRecipe) recipe; + this.correctOutput = this.standardRecipe.getCraftingResult(this.crafting); + + out.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class) + .createStack(this.correctOutput)); } else { this.standardRecipe = null; this.correctOutput = ItemStack.EMPTY; - for (int x = 0; x < outTag.size(); x++) { - CompoundNBT resultItemTag = outTag.getCompound(x); - final ItemStack gs = ItemStack.read(resultItemTag); - - if (!resultItemTag.isEmpty() && gs.isEmpty()) { - throw new IllegalArgumentException("No pattern here!"); - } + for (int x = 0; x < 3; x++) { + final IAEItemStack ais = products.get(x); + final ItemStack gs = ais.createItemStack(); if (!gs.isEmpty()) { - out.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(gs)); + out.add(ais.copy()); } } } - this.outputs = out.toArray(new IAEItemStack[0]); this.inputs = in.toArray(new IAEItemStack[0]); + this.outputs = out.toArray(new IAEItemStack[0]); final Map tmpOutputs = new HashMap<>(); @@ -190,12 +185,12 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable(); - } - - this.craftingList.add(details); + if (details != null) { + if (this.craftingList == null) { + this.craftingList = new ArrayList<>(); } + + this.craftingList.add(details); } } diff --git a/src/main/java/appeng/items/misc/EncodedPatternItem.java b/src/main/java/appeng/items/misc/EncodedPatternItem.java index 41dd4b3df..9009a35ff 100644 --- a/src/main/java/appeng/items/misc/EncodedPatternItem.java +++ b/src/main/java/appeng/items/misc/EncodedPatternItem.java @@ -18,37 +18,50 @@ package appeng.items.misc; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.WeakHashMap; +import com.google.common.base.Preconditions; + import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.Constants; -import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.core.Api; import appeng.core.AppEng; import appeng.core.localization.GuiText; import appeng.helpers.InvalidPatternHelper; -import appeng.helpers.PatternHelper; import appeng.items.AEBaseItem; import appeng.util.Platform; -public class EncodedPatternItem extends AEBaseItem implements ICraftingPatternItem { +public class EncodedPatternItem extends AEBaseItem { + + public static final String NBT_INGREDIENTS = "in"; + public static final String NBT_PRODUCTS = "out"; + public static final String NBT_SUBSITUTE = "substitute"; + public static final String NBT_RECIPE_ID = "recipe"; + // rather simple client side caching. private static final Map SIMPLE_CACHE = new WeakHashMap<>(); @@ -95,7 +108,7 @@ public class EncodedPatternItem extends AEBaseItem implements ICraftingPatternIt @OnlyIn(Dist.CLIENT) public void addInformation(final ItemStack stack, final World world, final List lines, final ITooltipFlag advancedTooltips) { - final ICraftingPatternDetails details = this.getPatternForItem(stack, world); + final ICraftingPatternDetails details = Api.instance().crafting().decodePattern(stack, world); if (details == null) { if (!stack.hasTag()) { @@ -181,15 +194,6 @@ public class EncodedPatternItem extends AEBaseItem implements ICraftingPatternIt } } - @Override - public ICraftingPatternDetails getPatternForItem(final ItemStack is, final World w) { - try { - return new PatternHelper(is, w); - } catch (final Throwable t) { - return null; - } - } - public ItemStack getOutput(final ItemStack item) { ItemStack out = SIMPLE_CACHE.get(item); @@ -202,11 +206,127 @@ public class EncodedPatternItem extends AEBaseItem implements ICraftingPatternIt return ItemStack.EMPTY; } - final ICraftingPatternDetails details = this.getPatternForItem(item, w); + final ICraftingPatternDetails details = Api.instance().crafting().decodePattern(item, w); out = details != null ? details.getOutputs()[0].createItemStack() : ItemStack.EMPTY; SIMPLE_CACHE.put(item, out); return out; } + + public boolean isEncodedPattern(ItemStack itemStack) { + return itemStack != null && !itemStack.isEmpty() && itemStack.getItem() == this && itemStack.getTag() != null + && itemStack.getTag().contains(NBT_INGREDIENTS, Constants.NBT.TAG_LIST) + && itemStack.getTag().contains(NBT_PRODUCTS, Constants.NBT.TAG_LIST); + } + + public ResourceLocation getCraftingRecipeId(ItemStack itemStack) { + Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", + itemStack); + final CompoundNBT tag = itemStack.getTag(); + Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); + + return new ResourceLocation(tag.getString(NBT_RECIPE_ID)); + } + + public List getIngredients(ItemStack itemStack) { + Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", + itemStack); + final CompoundNBT tag = itemStack.getTag(); + Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); + + final ListNBT inTag = tag.getList(NBT_INGREDIENTS, 10); + Preconditions.checkArgument(inTag.size() < 10, "Cannot use more than 9 ingredients"); + + final List in = new ArrayList<>(inTag.size()); + for (int x = 0; x < inTag.size(); x++) { + CompoundNBT ingredient = inTag.getCompound(x); + final ItemStack gs = ItemStack.read(ingredient); + + Preconditions.checkArgument(!(!ingredient.isEmpty() && gs.isEmpty()), "invalid itemStack in slot", x); + + in.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(gs)); + } + + return in; + } + + public List getProducts(ItemStack itemStack) { + Preconditions.checkArgument(itemStack.getItem() == this, "Given item stack %s is not an encoded pattern.", + itemStack); + final CompoundNBT tag = itemStack.getTag(); + Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); + + final ListNBT outTag = tag.getList(NBT_PRODUCTS, 10); + Preconditions.checkArgument(outTag.size() < 4, "Cannot use more than 3 ingredients"); + + final List out = new ArrayList<>(outTag.size()); + for (int x = 0; x < outTag.size(); x++) { + CompoundNBT ingredient = outTag.getCompound(x); + final ItemStack gs = ItemStack.read(ingredient); + + Preconditions.checkArgument(!(!ingredient.isEmpty() && gs.isEmpty()), "invalid itemStack in slot", x); + + out.add(Api.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(gs)); + } + + return out; + + } + + public boolean allowsSubstitution(ItemStack itemStack) { + final CompoundNBT tag = itemStack.getTag(); + + Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag"); + + return getCraftingRecipeId(itemStack) == null && tag.getBoolean(NBT_SUBSITUTE); + } + + /** + * Use the public API instead {@link appeng.core.api.ApiCrafting} + */ + public static void encodeCraftingPattern(ItemStack stack, ItemStack[] in, ItemStack[] out, + ResourceLocation recipeId, boolean allowSubstitutes) { + CompoundNBT encodedValue = encodeInputsAndOutputs(in, out); + encodedValue.putString(EncodedPatternItem.NBT_RECIPE_ID, recipeId.toString()); + encodedValue.putBoolean(EncodedPatternItem.NBT_SUBSITUTE, allowSubstitutes); + stack.setTag(encodedValue); + } + + /** + * Use the public API instead {@link appeng.core.api.ApiCrafting} + */ + public static void encodeProcessingPattern(ItemStack stack, ItemStack[] in, ItemStack[] out) { + stack.setTag(encodeInputsAndOutputs(in, out)); + } + + private static CompoundNBT encodeInputsAndOutputs(ItemStack[] in, ItemStack[] out) { + final CompoundNBT encodedValue = new CompoundNBT(); + + final ListNBT tagIn = new ListNBT(); + final ListNBT tagOut = new ListNBT(); + + for (final ItemStack i : in) { + tagIn.add(createItemTag(i)); + } + + for (final ItemStack i : out) { + tagOut.add(createItemTag(i)); + } + + encodedValue.put(EncodedPatternItem.NBT_INGREDIENTS, tagIn); + encodedValue.put(EncodedPatternItem.NBT_PRODUCTS, tagOut); + return encodedValue; + } + + private static INBT createItemTag(final ItemStack i) { + final CompoundNBT c = new CompoundNBT(); + + if (!i.isEmpty()) { + i.write(c); + } + + return c; + } + } diff --git a/src/main/java/appeng/me/cache/CraftingGridCache.java b/src/main/java/appeng/me/cache/CraftingGridCache.java index 5452970ac..26cac7e84 100644 --- a/src/main/java/appeng/me/cache/CraftingGridCache.java +++ b/src/main/java/appeng/me/cache/CraftingGridCache.java @@ -35,6 +35,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; +import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; @@ -80,6 +81,7 @@ import appeng.crafting.CraftingJob; import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLinkNexus; import appeng.crafting.CraftingWatcher; +import appeng.helpers.CraftingPatternDetails; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.me.helpers.BaseActionSource; import appeng.me.helpers.GenericInterestManager; @@ -303,6 +305,8 @@ public class CraftingGridCache @Override public void addCraftingOption(final ICraftingMedium medium, final ICraftingPatternDetails api) { + Preconditions.checkArgument(api.getClass() == CraftingPatternDetails.class, + "Only supports internal ICraftingPatternDetails for now"); List details = this.craftingMethods.get(api); if (details == null) { details = new ArrayList<>(); diff --git a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java index 69fa1561c..5fb4428d9 100644 --- a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java @@ -40,7 +40,7 @@ import net.minecraftforge.fml.hooks.BasicEventHooks; import appeng.api.config.Actionable; import appeng.api.config.FuzzyMode; import appeng.api.config.PowerMultiplier; -import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.crafting.ICraftingHelper; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; @@ -1056,9 +1056,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU { for (int x = 0; x < list.size(); x++) { final CompoundNBT item = list.getCompound(x); final IAEItemStack pattern = AEItemStack.fromNBT(item); - if (pattern != null && pattern.getItem() instanceof ICraftingPatternItem) { - final ICraftingPatternItem cpi = (ICraftingPatternItem) pattern.getItem(); - final ICraftingPatternDetails details = cpi.getPatternForItem(pattern.createItemStack(), + ICraftingHelper craftingHelper = Api.instance().crafting(); + if (craftingHelper.isEncodedPattern(pattern)) { + final ICraftingPatternDetails details = craftingHelper.decodePattern(pattern.createItemStack(), this.getWorld()); if (details != null) { final TaskProgress tp = new TaskProgress(); diff --git a/src/main/java/appeng/parts/reporting/PatternTerminalPart.java b/src/main/java/appeng/parts/reporting/PatternTerminalPart.java index 89ab7a99d..4576b158d 100644 --- a/src/main/java/appeng/parts/reporting/PatternTerminalPart.java +++ b/src/main/java/appeng/parts/reporting/PatternTerminalPart.java @@ -28,12 +28,12 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.items.IItemHandler; import appeng.api.config.SecurityPermissions; -import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.parts.IPartModel; import appeng.api.storage.data.IAEItemStack; import appeng.container.implementations.MEMonitorableContainer; import appeng.container.implementations.PatternTermContainer; +import appeng.core.Api; import appeng.core.AppEng; import appeng.helpers.Reflected; import appeng.items.parts.PartModels; @@ -107,23 +107,20 @@ public class PatternTerminalPart extends AbstractTerminalPart { final ItemStack removedStack, final ItemStack newStack) { if (inv == this.pattern && slot == 1) { final ItemStack is = this.pattern.getStackInSlot(1); - if (!is.isEmpty() && is.getItem() instanceof ICraftingPatternItem) { - final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem(); - final ICraftingPatternDetails details = pattern.getPatternForItem(is, - this.getHost().getTile().getWorld()); - if (details != null) { - this.setCraftingRecipe(details.isCraftable()); - this.setSubstitution(details.canSubstitute()); + final ICraftingPatternDetails details = Api.instance().crafting().decodePattern(is, + this.getHost().getTile().getWorld()); + if (details != null) { + this.setCraftingRecipe(details.isCraftable()); + this.setSubstitution(details.canSubstitute()); - for (int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++) { - final IAEItemStack item = details.getInputs()[x]; - this.crafting.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack()); - } + for (int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++) { + final IAEItemStack item = details.getInputs()[x]; + this.crafting.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack()); + } - for (int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++) { - final IAEItemStack item = details.getOutputs()[x]; - this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack()); - } + for (int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++) { + final IAEItemStack item = details.getOutputs()[x]; + this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack()); } } } else if (inv == this.crafting) { diff --git a/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java b/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java index 96bfd73f8..be9211259 100644 --- a/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java +++ b/src/main/java/appeng/tile/crafting/MolecularAssemblerTileEntity.java @@ -226,8 +226,7 @@ public class MolecularAssemblerTileEntity extends AENetworkInvTileEntity if (!myPat.isEmpty() && myPat.getItem() instanceof EncodedPatternItem) { final World w = this.getWorld(); - final EncodedPatternItem iep = (EncodedPatternItem) myPat.getItem(); - final ICraftingPatternDetails ph = iep.getPatternForItem(myPat, w); + final ICraftingPatternDetails ph = Api.instance().crafting().decodePattern(myPat, w); if (ph != null && ph.isCraftable()) { this.forcePlan = true; this.myPlan = ph; @@ -253,8 +252,7 @@ public class MolecularAssemblerTileEntity extends AENetworkInvTileEntity if (!is.isEmpty() && is.getItem() instanceof EncodedPatternItem) { if (!ItemStack.areItemsEqual(is, this.myPattern)) { final World w = this.getWorld(); - final EncodedPatternItem iep = (EncodedPatternItem) is.getItem(); - final ICraftingPatternDetails ph = iep.getPatternForItem(is, w); + final ICraftingPatternDetails ph = Api.instance().crafting().decodePattern(is, w); if (ph != null && ph.isCraftable()) { this.progress = 0; diff --git a/src/main/java/team/chisel/ctm/api/IFacade.java b/src/main/java/team/chisel/ctm/api/IFacade.java index 710a3a250..9d17bd055 100644 --- a/src/main/java/team/chisel/ctm/api/IFacade.java +++ b/src/main/java/team/chisel/ctm/api/IFacade.java @@ -10,12 +10,14 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; /** - * To be implemented on blocks that "hide" another block inside, so connected textures can still be accomplished. + * To be implemented on blocks that "hide" another block inside, so connected + * textures can still be accomplished. */ public interface IFacade { /** - * @deprecated Use {@link #getFacade(IBlockReader, BlockPos, Direction, BlockPos)} + * @deprecated Use + * {@link #getFacade(IBlockReader, BlockPos, Direction, BlockPos)} */ @Nonnull @Deprecated @@ -24,20 +26,18 @@ public interface IFacade { /** * Gets the blockstate this facade appears as. * - * @param world - * {@link World} - * @param pos - * The Blocks position - * @param side - * The side being rendered, NOT the side being connected from. - *

- * This value can be null if no side is specified. Please handle this appropriately. - * @param connection - * The position of the block being connected to. + * @param world {@link World} + * @param pos The Blocks position + * @param side The side being rendered, NOT the side being connected from. + *

+ * This value can be null if no side is specified. Please + * handle this appropriately. + * @param connection The position of the block being connected to. * @return The blockstate which your block appears as. */ @Nonnull - default BlockState getFacade(@Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nullable Direction side, @Nonnull BlockPos connection) { + default BlockState getFacade(@Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nullable Direction side, + @Nonnull BlockPos connection) { return getFacade(world, pos, side); } From 188f105730e5cdcd20448fa89bb25cc3af64c2d0 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 12 Jul 2020 17:20:42 +0200 Subject: [PATCH 21/29] Fix the alive check for the matter cannon. --- .../items/tools/powered/MatterCannonItem.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java index 364d83fa4..6bcee53bb 100644 --- a/src/main/java/appeng/items/tools/powered/MatterCannonItem.java +++ b/src/main/java/appeng/items/tools/powered/MatterCannonItem.java @@ -188,26 +188,24 @@ public class MatterCannonItem extends AEBasePoweredItem implements IStorageCell< for (int l = 0; l < list.size(); ++l) { final Entity entity1 = (Entity) list.get(l); - if (!entity1.isAlive() && entity1 != p && !(entity1 instanceof ItemEntity)) { - if (entity1.isAlive()) { - // prevent killing / flying of mounts. - if (entity1.isRidingOrBeingRiddenBy(p)) { - continue; - } + if (entity1.isAlive() && entity1 != p && !(entity1 instanceof ItemEntity)) { + // prevent killing / flying of mounts. + if (entity1.isRidingOrBeingRiddenBy(p)) { + continue; + } - final float f1 = 0.3F; + final float f1 = 0.3F; - final AxisAlignedBB boundingBox = entity1.getBoundingBox().grow(f1, f1, f1); - final Vec3d intersection = boundingBox.rayTrace(Vec3d, Vec3d1).orElse(null); + final AxisAlignedBB boundingBox = entity1.getBoundingBox().grow(f1, f1, f1); + final Vec3d intersection = boundingBox.rayTrace(Vec3d, Vec3d1).orElse(null); - if (intersection != null) { - final double nd = Vec3d.squareDistanceTo(intersection); + if (intersection != null) { + final double nd = Vec3d.squareDistanceTo(intersection); - if (nd < closest) { - entity = entity1; - entityIntersection = intersection; - closest = nd; - } + if (nd < closest) { + entity = entity1; + entityIntersection = intersection; + closest = nd; } } } From 4953509255a4ad8a8f399190543a1adefdcc2623 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 13 Jul 2020 17:45:40 +0200 Subject: [PATCH 22/29] P2P Fluid Tunnel Fix --- src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java b/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java index 82ac67fb1..57eb6f5c0 100644 --- a/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java +++ b/src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java @@ -158,7 +158,7 @@ public class FluidP2PTunnelPart extends P2PTunnelPart implem return 0; } - if (action == FluidAction.EXECUTE) { + if (action != FluidAction.EXECUTE) { if (stack.pop() != this) { throw new IllegalStateException("Invalid Recursion detected."); } From 38f6bf16f2c84efdd1a931151a88f549ab5c75a3 Mon Sep 17 00:00:00 2001 From: yueh Date: Wed, 15 Jul 2020 23:25:35 +0200 Subject: [PATCH 23/29] Updated dependencies (#4466) Changed forge to 31.2.31 and also marked it as required version. Changed JEI to 6.0.2.12 for dev usage. --- gradle.properties | 6 +++--- src/main/resources/META-INF/mods.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 37d06fd65..a60f97115 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,13 +10,13 @@ artifact_basename=appliedenergistics2 ######################################################### minecraft_release=1.15 minecraft_version=1.15.2 -mcp_mappings=20200701-1.15.1 -forge_version=31.2.20 +mcp_mappings=20200715-1.15.1 +forge_version=31.2.31 ######################################################### # Provided APIs # ######################################################### -jei_version=6.0.0.4 +jei_version=6.0.2.12 top_version=2.0.4-5 hwyla_version=1.10.8-B72_1.15.2 ctm_version=MC1.15.2-1.1.0.9 diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 27d6b05db..96143ca28 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -16,7 +16,7 @@ description="A Mod about Matter, Energy and using them to conquer the world.." [[dependencies.appliedenergistics2]] modId="forge" mandatory=true - versionRange="[31.0.0,)" + versionRange="[31.2.31,32.0.0)" ordering="NONE" side="BOTH" From 5c290789e0bb76dc446931a6eaa7be14face5c46 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 17 Jul 2020 12:45:17 +0200 Subject: [PATCH 24/29] Fixes #4467: Private methods also need to be annotated with @OnlyIn(Dist.CLIENT) if they use client-side classes. --- .../appeng/core/sync/packets/BlockTransitionEffectPacket.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java b/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java index a75dbc5f0..ada4f9409 100644 --- a/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java +++ b/src/main/java/appeng/core/sync/packets/BlockTransitionEffectPacket.java @@ -103,6 +103,7 @@ public class BlockTransitionEffectPacket extends BasePacket { playBreakOrPickupSound(); } + @OnlyIn(Dist.CLIENT) private void spawnParticles() { EnergyParticleData data = new EnergyParticleData(false, direction); @@ -121,6 +122,7 @@ public class BlockTransitionEffectPacket extends BasePacket { } } + @OnlyIn(Dist.CLIENT) private void playBreakOrPickupSound() { SoundEvent soundEvent; From 1ac6d5d9672c0db249753bb11766ef857ece8f97 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 17 Jul 2020 15:27:03 +0200 Subject: [PATCH 25/29] Fixes creation of entangled singularities. --- .../java/appeng/entity/SingularityEntity.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/appeng/entity/SingularityEntity.java b/src/main/java/appeng/entity/SingularityEntity.java index 0e11c14b5..3e04617a2 100644 --- a/src/main/java/appeng/entity/SingularityEntity.java +++ b/src/main/java/appeng/entity/SingularityEntity.java @@ -27,6 +27,7 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.DamageSource; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.World; @@ -38,6 +39,8 @@ import appeng.util.Platform; public final class SingularityEntity extends AEBaseItemEntity { + private static final ResourceLocation TAG_ENDER_PEARL = new ResourceLocation("forge:ender_pearls"); + public static EntityType TYPE; private static int randTickSeed = 0; @@ -84,6 +87,18 @@ public final class SingularityEntity extends AEBaseItemEntity { if (!other.isEmpty()) { boolean matches = false; + if (materials.enderDust().isSameAs(other)) { + matches = true; + } + + // check... other name. + if( !matches ) + { + if (other.getItem().getTags().contains(TAG_ENDER_PEARL)) { + matches = true; + } + } + if (matches) { while (item.getCount() > 0 && other.getCount() > 0) { other.grow(-1); From b8722dbbc03ba904cd968444f0bf8dd896159914 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 17 Jul 2020 19:51:59 +0200 Subject: [PATCH 26/29] Do not rely on exceptions for control flow, when the cell has no fuzzy mode. --- src/main/java/appeng/items/storage/AbstractStorageCell.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/appeng/items/storage/AbstractStorageCell.java b/src/main/java/appeng/items/storage/AbstractStorageCell.java index aef9eef4e..c7f41022b 100644 --- a/src/main/java/appeng/items/storage/AbstractStorageCell.java +++ b/src/main/java/appeng/items/storage/AbstractStorageCell.java @@ -118,6 +118,9 @@ public abstract class AbstractStorageCell> extends AEBaseI @Override public FuzzyMode getFuzzyMode(final ItemStack is) { final String fz = is.getOrCreateTag().getString("FuzzyMode"); + if (fz.isEmpty()) { + return FuzzyMode.IGNORE_ALL; + } try { return FuzzyMode.valueOf(fz); } catch (final Throwable t) { From 08abd4a77086cf6041f37c1a5c8bbea6a8b4c424 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 17 Jul 2020 20:26:17 +0200 Subject: [PATCH 27/29] Fixed formatting. --- src/main/java/appeng/entity/SingularityEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/appeng/entity/SingularityEntity.java b/src/main/java/appeng/entity/SingularityEntity.java index 3e04617a2..5cdad00fd 100644 --- a/src/main/java/appeng/entity/SingularityEntity.java +++ b/src/main/java/appeng/entity/SingularityEntity.java @@ -92,8 +92,7 @@ public final class SingularityEntity extends AEBaseItemEntity { } // check... other name. - if( !matches ) - { + if (!matches) { if (other.getItem().getTags().contains(TAG_ENDER_PEARL)) { matches = true; } From 8142eb90a692d0da69b0001e3f82d5de89c628fa Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 17 Jul 2020 20:37:07 +0200 Subject: [PATCH 28/29] Added new Cell Rendering to ME Chest (#4464) Moved cell models to origin 0,0,0. Implemented a TER to render cell models/LED in the ME chest as they are rendered in the drive. --- .../java/appeng/block/storage/ChestBlock.java | 11 +- .../client/render/model/DriveBakedModel.java | 23 ++- .../client/render/tesr/CellLedRenderer.java | 106 ++++++++++++ .../render/tesr/ChestTileEntityRenderer.java | 154 ++++++++++++++++++ .../tesr/DriveLedTileEntityRenderer.java | 97 +---------- .../core/api/definitions/ApiBlocks.java | 10 +- .../appeng/tile/storage/ChestTileEntity.java | 46 +++--- .../blockstates/chest.json | 52 +----- .../models/block/chest/base.json | 109 ++++++++++++- .../models/block/chest/cell_state_empty.json | 16 -- .../models/block/chest/cell_state_full.json | 31 ---- .../block/chest/cell_state_not_empty.json | 31 ---- .../block/chest/cell_state_offline.json | 16 -- .../models/block/chest/cell_state_online.json | 31 ---- .../block/chest/cell_state_types_full.json | 31 ---- .../models/block/drive/drive_cell.json | 5 +- .../block/drive/drive_cell_led_base.json | 55 ------- .../textures/block/chest/front.png | Bin 375 -> 315 bytes 18 files changed, 427 insertions(+), 397 deletions(-) create mode 100644 src/main/java/appeng/client/render/tesr/CellLedRenderer.java create mode 100644 src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_empty.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_full.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_not_empty.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_offline.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_online.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_types_full.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json diff --git a/src/main/java/appeng/block/storage/ChestBlock.java b/src/main/java/appeng/block/storage/ChestBlock.java index 91e6b117f..2f8efe227 100644 --- a/src/main/java/appeng/block/storage/ChestBlock.java +++ b/src/main/java/appeng/block/storage/ChestBlock.java @@ -25,7 +25,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.state.EnumProperty; +import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; @@ -42,18 +42,17 @@ import appeng.tile.storage.ChestTileEntity; public class ChestBlock extends AEBaseTileBlock { - private final static EnumProperty SLOT_STATE = EnumProperty.create("slot_state", - DriveSlotState.class); + private final static BooleanProperty LIGHTS_ON = BooleanProperty.create("lights_on"); public ChestBlock() { super(defaultProps(Material.IRON)); - this.setDefaultState(this.getDefaultState().with(SLOT_STATE, DriveSlotState.EMPTY)); + this.setDefaultState(this.getDefaultState().with(LIGHTS_ON, false)); } @Override protected void fillStateContainer(StateContainer.Builder builder) { super.fillStateContainer(builder); - builder.add(SLOT_STATE); + builder.add(LIGHTS_ON); } @Override @@ -68,7 +67,7 @@ public class ChestBlock extends AEBaseTileBlock { slotState = DriveSlotState.OFFLINE; } - return currentState.with(SLOT_STATE, slotState); + return currentState.with(LIGHTS_ON, slotState != DriveSlotState.EMPTY && slotState != DriveSlotState.OFFLINE); } @Override diff --git a/src/main/java/appeng/client/render/model/DriveBakedModel.java b/src/main/java/appeng/client/render/model/DriveBakedModel.java index 1f9823a89..14e71715d 100644 --- a/src/main/java/appeng/client/render/model/DriveBakedModel.java +++ b/src/main/java/appeng/client/render/model/DriveBakedModel.java @@ -28,6 +28,7 @@ import javax.annotation.Nullable; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.item.Item; @@ -49,6 +50,19 @@ public class DriveBakedModel extends DelegateBakedModel { this.defaultCell = defaultCell; } + /** + * Calculates the origin of a drive slot for positioning a cell model into it. + */ + public static void getSlotOrigin(int row, int col, Vector3f translation) { + // Position this drive model copy at the correct slot. The transform is based on + // the cell-model being in slot 0,0,0 while the upper left slot's origin is at + // 9,13,1 + float xOffset = (9 - col * 8) / 16.0f; + float yOffset = (13 - row * 3) / 16.0f; + float zOffset = 1 / 16.0f; + translation.set(xOffset, yOffset, zOffset); + } + @Nonnull @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @@ -63,17 +77,14 @@ public class DriveBakedModel extends DelegateBakedModel { DriveSlotsState slotsState = driveModelData.getSlotsState(); + Vector3f slotTranslation = new Vector3f(); if (slotsState != null) { for (int row = 0; row < 5; row++) { for (int col = 0; col < 2; col++) { Matrix4f transform = new Matrix4f(); - // Position this drive model copy at the correct slot. The transform is based on - // the - // cell-model being in slot 0,0 at the top left of the drive. - float xOffset = -col * 8 / 16.0f; - float yOffset = -row * 3 / 16.0f; - transform.setTranslation(xOffset, yOffset, 0); + getSlotOrigin(row, col, slotTranslation); + transform.setTranslation(slotTranslation.getX(), slotTranslation.getY(), slotTranslation.getZ()); int slot = row * 2 + col; diff --git a/src/main/java/appeng/client/render/tesr/CellLedRenderer.java b/src/main/java/appeng/client/render/tesr/CellLedRenderer.java new file mode 100644 index 000000000..ab47d6332 --- /dev/null +++ b/src/main/java/appeng/client/render/tesr/CellLedRenderer.java @@ -0,0 +1,106 @@ +package appeng.client.render.tesr; + +import java.util.EnumMap; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; + +import appeng.api.implementations.tiles.IChestOrDrive; +import appeng.block.storage.DriveSlotState; + +/** + * Utility class to render LEDs for storage cells from a Tile Entity Renderer. + */ +class CellLedRenderer { + + private static final EnumMap STATE_COLORS; + + // Color used for the cell indicator for blinking during recent activity + private static final Vector3f BLINK_COLOR = new Vector3f(1, 0.5f, 0.5f); + + static { + STATE_COLORS = new EnumMap<>(DriveSlotState.class); + STATE_COLORS.put(DriveSlotState.OFFLINE, new Vector3f(0, 0, 0)); + STATE_COLORS.put(DriveSlotState.ONLINE, new Vector3f(0, 1, 0)); + STATE_COLORS.put(DriveSlotState.NOT_EMPTY, new Vector3f(0f, 0.667f, 1)); + STATE_COLORS.put(DriveSlotState.TYPES_FULL, new Vector3f(1, 0.667f, 0)); + STATE_COLORS.put(DriveSlotState.FULL, new Vector3f(1, 0, 0)); + } + + // The positions are based on the upper left slot in a drive + private static final float L = 5 / 16.f; // left (x-axis) + private static final float R = 4 / 16.f; // right (x-axis) + private static final float T = 1 / 16.f; // top (y-axis) + private static final float B = -0.001f / 16.f; // bottom (y-axis) + private static final float FR = -0.001f / 16.f; // front (z-axis) + private static final float BA = 0.499f / 16.f; // back (z-axis) + + // Vertex data for the LED cuboid (has no back) + // Directions are when looking from the front onto the LED + private static final float[] LED_QUADS = { + // Front Face + R, T, FR, L, T, FR, L, B, FR, R, B, FR, + // Left Face + L, T, FR, L, T, BA, L, B, BA, L, B, FR, + // Right Face + R, T, BA, R, T, FR, R, B, FR, R, B, BA, + // Top Face + R, T, BA, L, T, BA, L, T, FR, R, T, FR, + // Bottom Face + R, B, FR, L, B, FR, L, B, BA, R, B, BA, }; + + public static final RenderType RENDER_LAYER = RenderType.makeType("ae_drive_leds", + DefaultVertexFormats.POSITION_COLOR, 7, 32565, false, true, RenderType.State.getBuilder().build(false)); + + public static void renderLed(IChestOrDrive drive, int slot, IVertexBuilder buffer, MatrixStack ms, + float partialTicks) { + + Vector3f color = getColorForSlot(drive, slot, partialTicks); + if (color == null) { + return; + } + + for (int i = 0; i < LED_QUADS.length; i += 3) { + float x = LED_QUADS[i]; + float y = LED_QUADS[i + 1]; + float z = LED_QUADS[i + 2]; + buffer.pos(ms.getLast().getMatrix(), x, y, z).color(color.getX(), color.getY(), color.getZ(), 1.f) + .endVertex(); + } + } + + private static Vector3f getColorForSlot(IChestOrDrive drive, int slot, float partialTicks) { + DriveSlotState state = DriveSlotState.fromCellStatus(drive.getCellStatus(slot)); + if (state == DriveSlotState.EMPTY) { + return null; + } + + if (!drive.isPowered()) { + return STATE_COLORS.get(DriveSlotState.OFFLINE); + } + + Vector3f col = STATE_COLORS.get(state); + if (drive.isCellBlinking(slot)) { + // 200 ms interval (100ms to get to red, then 100ms back) + long t = System.currentTimeMillis() % 200; + float f = (t - 100) / 200.0f + 0.5f; + f = easeInOutCubic(f); + col = col.copy(); + col.lerp(BLINK_COLOR, f); + } + + return col; + } + + private static float easeInOutCubic(float x) { + return x < 0.5f ? 4 * x * x * x : 1 - (float) Math.pow(-2 * x + 2, 3) / 2; + } + + private CellLedRenderer() { + } + +} diff --git a/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java new file mode 100644 index 000000000..667fe91ac --- /dev/null +++ b/src/main/java/appeng/client/render/tesr/ChestTileEntityRenderer.java @@ -0,0 +1,154 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.client.render.tesr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockModelRenderer; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelManager; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.client.model.data.IModelData; + +import appeng.api.client.ICellModelRegistry; +import appeng.block.storage.DriveSlotsState; +import appeng.client.render.DelegateBakedModel; +import appeng.client.render.FacingToRotation; +import appeng.core.Api; +import appeng.tile.storage.ChestTileEntity; + +/** + * The tile entity renderer for ME chests takes care of rendering the right + * model for the inserted cell, as well as the LED. + */ +public class ChestTileEntityRenderer extends TileEntityRenderer { + + private final ICellModelRegistry cellModelRegistry = Api.instance().client().cells(); + + private final ModelManager modelManager; + + private final BlockModelRenderer blockRenderer; + + public ChestTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { + super(rendererDispatcherIn); + Minecraft client = Minecraft.getInstance(); + modelManager = client.getModelManager(); + blockRenderer = client.getBlockRendererDispatcher().getBlockModelRenderer(); + } + + @Override + public void render(ChestTileEntity chest, float partialTicks, MatrixStack matrices, IRenderTypeBuffer buffers, + int combinedLight, int combinedOverlay) { + + World world = chest.getWorld(); + if (world == null) { + return; + } + + DriveSlotsState driveSlotState = DriveSlotsState.fromChestOrDrive(chest); + + Item cellItem = driveSlotState.getCell(0); + if (cellItem == null || cellItem == Items.AIR) { + return; // No cell inserted into chest + } + + ResourceLocation cellModelLocation = cellModelRegistry.model(cellItem); + if (cellModelLocation == null) { + cellModelLocation = cellModelRegistry.getDefaultModel(); + } + + IBakedModel model = modelManager.getModel(cellModelLocation); + + matrices.push(); + matrices.translate(0.5, 0.5, 0.5); + FacingToRotation rotation = FacingToRotation.get(chest.getForward(), chest.getUp()); + rotation.push(matrices); + matrices.translate(-0.5, -0.5, -0.5); + + // The models are created for the top-left slot of the drive model, + // we need to move them into place for the slot on the ME chest + matrices.translate(5 / 16.0, 4 / 16.0, 0); + + // Render the cell model as-if it was a block model + IVertexBuilder buffer = buffers.getBuffer(RenderType.getCutout()); + // We "fake" the position here to make it use the light-value in front of the + // drive + FaceRotatingModel rotatedModel = new FaceRotatingModel(model, rotation); + blockRenderer.renderModel(world, rotatedModel, chest.getBlockState(), chest.getPos(), matrices, buffer, false, + new Random(), 0L, combinedOverlay, EmptyModelData.INSTANCE); + + IVertexBuilder ledBuffer = buffers.getBuffer(CellLedRenderer.RENDER_LAYER); + CellLedRenderer.renderLed(chest, 0, ledBuffer, matrices, partialTicks); + + matrices.pop(); + } + + /** + * The actual vertex data will be transformed using the matrix stack, but the + * faces will not be correctly rotated so the incorrect lighting data would be + * used to apply diffuse lighting and the lightmap texture. + */ + private static class FaceRotatingModel extends DelegateBakedModel { + private final FacingToRotation r; + + protected FaceRotatingModel(IBakedModel base, FacingToRotation r) { + super(base); + this.r = r; + } + + @Nonnull + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, + @Nonnull IModelData extraData) { + if (side != null) { + side = r.rotate(side); // This fixes the incorrect lightmap position + } + List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData)); + + for (int i = 0; i < quads.size(); i++) { + BakedQuad quad = quads.get(i); + quads.set(i, new BakedQuad(quad.getVertexData(), quad.getTintIndex(), r.rotate(quad.getFace()), + quad.func_187508_a(), quad.shouldApplyDiffuseLighting())); + } + + return quads; + } + } + +} diff --git a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java index d410bd913..a583247fa 100644 --- a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java +++ b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java @@ -1,21 +1,17 @@ package appeng.client.render.tesr; -import java.util.EnumMap; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import appeng.block.storage.DriveSlotState; import appeng.client.render.FacingToRotation; +import appeng.client.render.model.DriveBakedModel; import appeng.tile.storage.DriveTileEntity; /** @@ -24,44 +20,6 @@ import appeng.tile.storage.DriveTileEntity; @OnlyIn(Dist.CLIENT) public class DriveLedTileEntityRenderer extends TileEntityRenderer { - private static final EnumMap STATE_COLORS; - - // Color used for the cell indicator for blinking during recent activity - private static final Vector3f BLINK_COLOR = new Vector3f(1, 0.5f, 0.5f); - - static { - STATE_COLORS = new EnumMap<>(DriveSlotState.class); - STATE_COLORS.put(DriveSlotState.OFFLINE, new Vector3f(0, 0, 0)); - STATE_COLORS.put(DriveSlotState.ONLINE, new Vector3f(0, 1, 0)); - STATE_COLORS.put(DriveSlotState.NOT_EMPTY, new Vector3f(0f, 0.667f, 1)); - STATE_COLORS.put(DriveSlotState.TYPES_FULL, new Vector3f(1, 0.667f, 0)); - STATE_COLORS.put(DriveSlotState.FULL, new Vector3f(1, 0, 0)); - } - - private static final float L = 14 / 16.f; // left (x-axis) - private static final float R = 13 / 16.f; // right (x-axis) - private static final float T = 14 / 16.f; // top (x-axis) - private static final float B = 12.999f / 16.f; // bottom (x-axis) - private static final float FR = 0.999f / 16.f; // front (z-axis) - private static final float BA = 1.499f / 16.f; // back (z-axis) - - // Vertex data for the LED cuboid (has no back) - // Directions are when looking from the front onto the LED - private static final float[] LED_QUADS = { - // Front Face - R, T, FR, L, T, FR, L, B, FR, R, B, FR, - // Left Face - L, T, FR, L, T, BA, L, B, BA, L, B, FR, - // Right Face - R, T, BA, R, T, FR, R, B, FR, R, B, BA, - // Top Face - R, T, BA, L, T, BA, L, T, FR, R, T, FR, - // Bottom Face - R, B, FR, L, B, FR, L, B, BA, R, B, BA, }; - - private static final RenderType STATE = RenderType.makeType("ae_drive_leds", DefaultVertexFormats.POSITION_COLOR, 7, - 32565, false, true, RenderType.State.getBuilder().build(false)); - public DriveLedTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { super(rendererDispatcherIn); } @@ -79,32 +37,18 @@ public class DriveLedTileEntityRenderer extends TileEntityRenderer() { + @Override + @OnlyIn(Dist.CLIENT) + public void customize(TileEntityRendering rendering) { + rendering.tileEntityRenderer(ChestTileEntityRenderer::new); + } + }).build()) .rendering(new ChestRendering()).build(); this.iface = registry.block("interface", InterfaceBlock::new).features(AEFeature.INTERFACE) .tileEntity( diff --git a/src/main/java/appeng/tile/storage/ChestTileEntity.java b/src/main/java/appeng/tile/storage/ChestTileEntity.java index 5245d0ec8..4ccae94cf 100644 --- a/src/main/java/appeng/tile/storage/ChestTileEntity.java +++ b/src/main/java/appeng/tile/storage/ChestTileEntity.java @@ -29,6 +29,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.ITickableTileEntity; @@ -42,44 +43,24 @@ import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.registries.ForgeRegistries; -import appeng.api.config.AccessRestriction; -import appeng.api.config.Actionable; -import appeng.api.config.PowerMultiplier; -import appeng.api.config.SecurityPermissions; -import appeng.api.config.Settings; -import appeng.api.config.SortDir; -import appeng.api.config.SortOrder; -import appeng.api.config.ViewItems; +import appeng.api.config.*; import appeng.api.implementations.tiles.IColorableTile; import appeng.api.implementations.tiles.IMEChest; import appeng.api.networking.GridFlags; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergyGrid; -import appeng.api.networking.events.MENetworkCellArrayUpdate; -import appeng.api.networking.events.MENetworkChannelsChanged; -import appeng.api.networking.events.MENetworkEventSubscribe; -import appeng.api.networking.events.MENetworkPowerStatusChange; -import appeng.api.networking.events.MENetworkPowerStorage; +import appeng.api.networking.events.*; import appeng.api.networking.events.MENetworkPowerStorage.PowerEventType; import appeng.api.networking.security.IActionHost; import appeng.api.networking.security.IActionSource; import appeng.api.networking.security.ISecurityGrid; import appeng.api.networking.storage.IBaseMonitor; import appeng.api.networking.storage.IStorageGrid; -import appeng.api.storage.IMEInventoryHandler; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.IMEMonitorHandlerReceiver; -import appeng.api.storage.IStorageChannel; -import appeng.api.storage.IStorageMonitorable; -import appeng.api.storage.IStorageMonitorableAccessor; -import appeng.api.storage.ITerminalHost; -import appeng.api.storage.cells.CellState; -import appeng.api.storage.cells.ICellGuiHandler; -import appeng.api.storage.cells.ICellHandler; -import appeng.api.storage.cells.ICellInventory; -import appeng.api.storage.cells.ICellInventoryHandler; +import appeng.api.storage.*; +import appeng.api.storage.cells.*; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEFluidStack; @@ -133,6 +114,10 @@ public class ChestTileEntity extends AENetworkPowerTileEntity private ChestMonitorHandler cellHandler; private Accessor accessor; private IFluidHandler fluidHandler; + // This is only used on the client to display the right cell model without + // synchronizing the entire + // cell's inventory when a chest comes into view. + private Item cellItem = Items.AIR; public ChestTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); @@ -273,6 +258,10 @@ public class ChestTileEntity extends AENetworkPowerTileEntity if (slot != 0) { return null; } + // Client-side we'll need to actually use the synced state + if (world == null || world.isRemote) { + return cellItem; + } ItemStack cell = getCell(); return cell.isEmpty() ? null : cell.getItem(); } @@ -364,6 +353,12 @@ public class ChestTileEntity extends AENetworkPowerTileEntity data.writeByte(this.state); data.writeByte(this.paintedColor.ordinal()); + + // Note that we trust that the change detection in recalculateDisplay will trip + // when it changes from + // empty->non-empty, so when the cell is changed, it should re-send the state + // because of that + data.writeRegistryIdUnsafe(ForgeRegistries.ITEMS, getCell().getItem().getRegistryName()); } @Override @@ -375,6 +370,7 @@ public class ChestTileEntity extends AENetworkPowerTileEntity this.state = data.readByte(); final AEColor oldPaintedColor = this.paintedColor; this.paintedColor = AEColor.values()[data.readByte()]; + this.cellItem = data.readRegistryIdUnsafe(ForgeRegistries.ITEMS); this.lastStateChange = this.world.getGameTime(); diff --git a/src/main/resources/assets/appliedenergistics2/blockstates/chest.json b/src/main/resources/assets/appliedenergistics2/blockstates/chest.json index b5a8459ea..d0cfbf744 100644 --- a/src/main/resources/assets/appliedenergistics2/blockstates/chest.json +++ b/src/main/resources/assets/appliedenergistics2/blockstates/chest.json @@ -7,7 +7,7 @@ }, { "when": { - "slot_state": "empty|offline" + "lights_on": false }, "apply": { "model": "appliedenergistics2:block/chest/lights_off" @@ -15,59 +15,11 @@ }, { "when": { - "slot_state": "online|not_empty|types_full|full" + "lights_on": true }, "apply": { "model": "appliedenergistics2:block/chest/lights_on" } - }, - { - "when": { - "slot_state": "empty" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_empty" - } - }, - { - "when": { - "slot_state": "offline" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_offline" - } - }, - { - "when": { - "slot_state": "online" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_online" - } - }, - { - "when": { - "slot_state": "not_empty" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_not_empty" - } - }, - { - "when": { - "slot_state": "types_full" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_types_full" - } - }, - { - "when": { - "slot_state": "full" - }, - "apply": { - "model": "appliedenergistics2:block/chest/cell_state_full" - } } ] } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/base.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/base.json index 88dc5b2a4..5af101397 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/base.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/chest/base.json @@ -1,12 +1,109 @@ { - "parent": "block/cube", + "credit": "Made with Blockbench", "textures": { - "particle": "appliedenergistics2:block/chest/side", + "4": "appliedenergistics2:block/drive/drive_inside", "up": "appliedenergistics2:block/chest/top", "down": "appliedenergistics2:block/chest/bottom", "north": "appliedenergistics2:block/chest/front", - "east": "appliedenergistics2:block/chest/side", - "south": "appliedenergistics2:block/chest/side", - "west": "appliedenergistics2:block/chest/side" - } + "particle": "appliedenergistics2:block/chest/side", + "east": "appliedenergistics2:block/chest/side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#north" }, + "east": { "uv": [0, 0, 16, 16], "texture": "#east" }, + "south": { "uv": [0, 0, 16, 16], "texture": "#east" }, + "west": { "uv": [0, 0, 16, 16], "texture": "#east" }, + "up": { "uv": [0, 0, 16, 16], "texture": "#up" }, + "down": { "uv": [0, 0, 16, 16], "texture": "#down" } + } + }, + { + "name": "inside_back", + "from": [5, 4, 7], + "to": [11, 7, 10], + "rotation": { "angle": 0, "axis": "y", "origin": [19, 11, 8] }, + "faces": { + "north": { "uv": [4, 1, 16, 14], "texture": "#4" } + } + }, + { + "name": "inside_left", + "from": [11, 1, 1], + "to": [14, 12, 11], + "rotation": { "angle": 0, "axis": "y", "origin": [18, 11, 3] }, + "faces": { + "north": { "uv": [2, 5, 2, 5], "texture": "#4" }, + "west": { "uv": [5, 1, 14, 12], "texture": "#4" } + } + }, + { + "name": "inside_top", + "from": [5, 6, 1], + "to": [11, 9, 11], + "rotation": { "angle": 0, "axis": "y", "origin": [15, 16, 3] }, + "faces": { + "north": { "uv": [2, 7, 2, 7], "texture": "#4" }, + "down": { "uv": [6, 4, 6, 4], "texture": "#4" } + } + }, + { + "name": "inside_bottom", + "from": [5, 1, 1], + "to": [11, 4, 11], + "rotation": { "angle": 0, "axis": "y", "origin": [15, 11, 3] }, + "faces": { + "north": { "uv": [2, 7, 2, 7], "texture": "#4" }, + "up": { "uv": [6, 3, 6, 3], "texture": "#4" } + } + }, + { + "name": "inside_border_bottom", + "from": [4, 0, 0], + "to": [12, 3, 9], + "rotation": { "angle": 0, "axis": "y", "origin": [15, 10, 1] }, + "faces": { + "up": { "uv": [0, 4, 9, 13], "rotation": 90, "texture": "#4" } + } + }, + { + "name": "inside_border_top", + "from": [5, 7, 0], + "to": [12, 10, 9], + "rotation": { "angle": 0, "axis": "y", "origin": [15, 17, 1] }, + "faces": { + "down": { "uv": [0, 4, 9, 13], "rotation": 270, "texture": "#4" } + } + }, + { + "name": "inside_border_left", + "from": [11, 3, 0], + "to": [12, 8, 1], + "rotation": { "angle": 0, "axis": "y", "origin": [15, 13, 1] }, + "faces": { + "west": { "uv": [0, 8, 1, 13], "texture": "#4" } + } + }, + { + "name": "inside_border_right", + "from": [4, 3, 0], + "to": [5, 8, 1], + "rotation": { "angle": 0, "axis": "y", "origin": [8, 13, 1] }, + "faces": { + "east": { "uv": [0, 6, 1, 11], "rotation": 180, "texture": "#4" } + } + }, + { + "name": "inside_right", + "from": [2, 1, 1], + "to": [5, 12, 11], + "rotation": { "angle": 0, "axis": "y", "origin": [9, 11, 3] }, + "faces": { + "east": { "uv": [5, 2, 14, 13], "texture": "#4" } + } + } + ] } diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_empty.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_empty.json deleted file mode 100644 index 72239d88d..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_empty.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "textures": { - "state": "appliedenergistics2:block/chest/cell_state_empty" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state" - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_full.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_full.json deleted file mode 100644 index a5517ce02..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_full.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "backdrop": "appliedenergistics2:block/chest/cell_state_backdrop", - "state": "appliedenergistics2:block/chest/cell_state_full" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#backdrop" - } - } - }, - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state", - "uvlightmap": { - "block": 0.007, - "sky": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_not_empty.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_not_empty.json deleted file mode 100644 index cb3dcba8f..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_not_empty.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "backdrop": "appliedenergistics2:block/chest/cell_state_backdrop", - "state": "appliedenergistics2:block/chest/cell_state_not_empty" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#backdrop" - } - } - }, - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state", - "uvlightmap": { - "block": 0.007, - "sky": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_offline.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_offline.json deleted file mode 100644 index 800895391..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_offline.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "textures": { - "state": "appliedenergistics2:block/chest/cell_state_offline" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state" - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_online.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_online.json deleted file mode 100644 index 5589251f0..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_online.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "backdrop": "appliedenergistics2:block/chest/cell_state_backdrop", - "state": "appliedenergistics2:block/chest/cell_state_online" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#backdrop" - } - } - }, - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state", - "uvlightmap": { - "block": 0.007, - "sky": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_types_full.json b/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_types_full.json deleted file mode 100644 index fd0dd2185..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/chest/cell_state_types_full.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "backdrop": "appliedenergistics2:block/chest/cell_state_backdrop", - "state": "appliedenergistics2:block/chest/cell_state_types_full" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#backdrop" - } - } - }, - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { - "texture": "#state", - "uvlightmap": { - "block": 0.007, - "sky": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json index 147637da8..297a751d4 100644 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell.json @@ -1,12 +1,13 @@ { + "ambientocclusion": false, "textures": { "cell": "appliedenergistics2:block/drive/cells/default_cell" }, "elements": [ { "name": "Cell Backdrop", - "from": [9, 13, 1], - "to": [15, 15, 3], + "from": [0, 0, 0], + "to": [6, 2, 2], "rotation": { "angle": 0, "axis": "y", "origin": [9, 8, 8] }, "faces": { "north": { diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json deleted file mode 100644 index c3efcc340..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "front": "appliedenergistics2:block/drive/drive/cell_state_offline" - }, - "elements": [ - { - "name": "Cell Light", - "from": [9.0, 13.0, 0.0], - "to": [14.0, 15.0, 1.0], - "faces": { - "north": { - "texture": "#front", - "uv": [0, 0, 16, 16], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - }, - "up": { - "texture": "#front", - "uv": [0, 0, 16, 16], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - }, - "down": { - "texture": "#front", - "uv": [0, 0, 16, 16], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - }, - "west": { - "texture": "#front", - "uv": [0, 0, 16, 16], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - }, - "east": { - "texture": "#front", - "uv": [0, 0, 16, 16], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/chest/front.png b/src/main/resources/assets/appliedenergistics2/textures/block/chest/front.png index 4e4e034e91ce4da6ec71acac5fd054d4bae3aab0..81fecf6e8aee291d2ee25b1e0d89b46af29992ff 100644 GIT binary patch delta 270 zcmey)w3}&y%EScG`nR4gjv*GO=T0*8W_A>4-9PiL$v*~GQ5}~J!a1x*ovP~>%x&F& z{F<473fq+#Iqx2wi#T$m+w$n`@V7jh`zzn~#>}7p%O-u=i&ln)-JcV;t-5VcB`M6P zw=PfP;NQEtS!q+8SVKa)IbB3{+E{omzpVR eEQvg-zR@ezv|V9-0s{jBgQu&X3(GpEgeCwMGJW^} delta 328 zcmdnZ^qpyfiX}_Bqpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48Ir{7#dzMFq9fF zFuY1&V6d9Oz#v{QXIG%jL`8{usS?+SlHmNblJdl&REB`W%)AmkKi3e2GGjecJwrqH z&raqH3=GFTT^vI!{FhGhl z)91sFw_aXQH|JsHX&wpXtAD?U_7_^JIWT!?>TkQ{q{9^iljybz*ePO_~rHy*W`&;F2>{V$9 z-Z1&c@@4fKelewSmtBfvSbo6LJYjO$%?rnPlEnC`PBzXhX?%Aur}5go#(B5OzTdmK j{qb3^??-i7%!4Oy4Eig`)xyBQz~JfX=fbkiDWM4fd?$it From e8b57c6dc5bfa83a7279ee9c443379a1610793ae Mon Sep 17 00:00:00 2001 From: shartte Date: Fri, 17 Jul 2020 22:35:49 +0200 Subject: [PATCH 29/29] Multiblocks sometimes can't be broken because during removal, (#4469) they update their own block-state to display the disconnected state, effectively reversing their own removal. This occurs because the cached block state in the tile entity base class is outdated and doesn't reflect the removal. --- src/main/java/appeng/tile/crafting/CraftingTileEntity.java | 5 +++++ src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/appeng/tile/crafting/CraftingTileEntity.java b/src/main/java/appeng/tile/crafting/CraftingTileEntity.java index 47c153550..69f90421c 100644 --- a/src/main/java/appeng/tile/crafting/CraftingTileEntity.java +++ b/src/main/java/appeng/tile/crafting/CraftingTileEntity.java @@ -246,6 +246,11 @@ public class CraftingTileEntity extends AENetworkTileEntity implements IAEMultiB } public void breakCluster() { + // Since breaking the cluster will most likely also update the TE's state, + // it's essential that we're not working with outdated block-state information, + // since this particular TE's block might already have been removed (state=air) + updateContainingBlockInfo(); + if (this.cluster != null) { this.cluster.cancel(); final IMEInventory inv = this.cluster.getInventory(); diff --git a/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java b/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java index f625a6bfd..c79320a59 100644 --- a/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java +++ b/src/main/java/appeng/tile/qnb/QuantumBridgeTileEntity.java @@ -289,6 +289,11 @@ public class QuantumBridgeTileEntity extends AENetworkInvTileEntity implements I } public void breakCluster() { + // Since breaking the cluster will most likely also update the TE's state, + // it's essential that we're not working with outdated block-state information, + // since this particular TE's block might already have been removed (state=air) + updateContainingBlockInfo(); + if (this.cluster != null) { this.cluster.destroy(); }