Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package co.neeve.nae2.common.parts.implementations;

import appeng.api.parts.IPartCollisionHelper;
import appeng.api.parts.IPartModel;
import appeng.api.util.AECableType;
import appeng.api.util.AEPartLocation;
import appeng.items.parts.PartModels;
import appeng.parts.PartBasicState;
import appeng.parts.PartModel;
import appeng.util.Platform;
import co.neeve.nae2.Tags;
import gregtech.api.capability.IGhostSlotConfigurable;
import gregtech.api.metatileentity.MetaTileEntityHolder;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import org.jetbrains.annotations.NotNull;

import static appeng.parts.automation.PartLevelEmitter.*;

public class PartPCCNotifier extends PartBasicState {
@PartModels
public static final ResourceLocation MODEL_BASE_OFF = new ResourceLocation(Tags.MODID,
"part/pcc_notifier_base_off");
@PartModels
public static final ResourceLocation MODEL_BASE_ON = new ResourceLocation(Tags.MODID,
"part/pcc_notifier_base_on");
@PartModels

public static final PartModel MODEL_OFF_OFF = new PartModel(MODEL_BASE_OFF, MODEL_STATUS_OFF);
public static final PartModel MODEL_OFF_ON = new PartModel(MODEL_BASE_OFF, MODEL_STATUS_ON);
public static final PartModel MODEL_OFF_HAS_CHANNEL = new PartModel(MODEL_BASE_OFF, MODEL_STATUS_HAS_CHANNEL);
public static final PartModel MODEL_ON_OFF = new PartModel(MODEL_BASE_ON, MODEL_STATUS_OFF);
public static final PartModel MODEL_ON_ON = new PartModel(MODEL_BASE_ON, MODEL_STATUS_ON);
public static final PartModel MODEL_ON_HAS_CHANNEL = new PartModel(MODEL_BASE_ON, MODEL_STATUS_HAS_CHANNEL);

public PartPCCNotifier(ItemStack is) {
super(is);
this.getProxy().setIdlePowerUsage(1);
}

@Override
@NotNull
public AECableType getCableConnectionType(final AEPartLocation dir) {
return AECableType.SMART;
}

@Override
public void getBoxes(final IPartCollisionHelper bch) {
bch.addBox(7, 7, 11, 9, 9, 16);
}

public void notifyMachine(int configNo) {
var side = this.getSide();
var blockPos = this.getTile().getPos();
var tile = this.getTile()
.getWorld().getTileEntity(blockPos.offset(side.getFacing()));

if (tile instanceof MetaTileEntityHolder mteHolder) {
var mte = mteHolder.getMetaTileEntity();
if (mte instanceof IGhostSlotConfigurable slotConfigurable) {
slotConfigurable.setGhostCircuitConfig(configNo);
}
}
}

protected boolean isOn() {
if (Platform.isClient()) {
return (this.getClientFlags() & POWERED_FLAG) == POWERED_FLAG;
}

return this.getProxy().isActive();
}

@NotNull
@Override
public IPartModel getStaticModels() {
if (this.isActive() && this.isPowered()) {
return this.isOn() ? MODEL_ON_HAS_CHANNEL : MODEL_OFF_HAS_CHANNEL;
} else if (this.isPowered()) {
return this.isOn() ? MODEL_ON_ON : MODEL_OFF_ON;
} else {
return this.isOn() ? MODEL_ON_OFF : MODEL_OFF_OFF;
}
}

@Override
public float getCableConnectionLength(AECableType cable) {
return 16;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
import co.neeve.nae2.Tags;
import co.neeve.nae2.common.features.Features;
import co.neeve.nae2.common.features.IFeature;
import co.neeve.nae2.common.features.subfeatures.UpgradeFeatures;
import co.neeve.nae2.common.items.NAEBaseItemPart;
import co.neeve.nae2.common.parts.implementations.PartBeamFormer;
import co.neeve.nae2.common.parts.implementations.PartExposer;
import co.neeve.nae2.common.parts.implementations.PartPCCNotifier;
import co.neeve.nae2.common.parts.p2p.PartP2PInterface;
import co.neeve.nae2.common.parts.p2p.iface.InterfaceTunnelGridCache;
import co.neeve.nae2.common.registration.registry.Registry;
Expand All @@ -22,6 +24,10 @@
import co.neeve.nae2.common.registration.registry.interfaces.IDefinition;
import co.neeve.nae2.common.registration.registry.rendering.ItemPartRendering;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import gregtech.api.GTValues;
import gregtech.api.recipes.ingredients.GTRecipeItemInput;
import gregtech.common.items.MetaItems;
import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
Expand All @@ -37,14 +43,21 @@
import java.lang.reflect.Constructor;
import java.util.*;

import static gregtech.api.recipes.RecipeMaps.ASSEMBLER_RECIPES;

public class Parts implements Definitions<DamagedItemDefinition> {
private final Object2ObjectOpenHashMap<String, DamagedItemDefinition> byId = new Object2ObjectOpenHashMap<>();
private final NAEBaseItemPart itemPart;
private final DamagedItemDefinition beamFormer;
private final DamagedItemDefinition p2pTunnelInterface;
private final DamagedItemDefinition exposer;
private final DamagedItemDefinition pccnotifier;

public Parts(Registry registry) {
var definitions = Api.INSTANCE.definitions();
var parts = definitions.parts();
var blocks = definitions.blocks();

this.itemPart = new NAEBaseItemPart();
registry.item("part", () -> this.itemPart)
.rendering(new ItemPartRendering(this.itemPart))
Expand All @@ -58,6 +71,7 @@ public Parts(Registry registry) {

this.beamFormer = this.createPart(this.itemPart, PartType.BEAM_FORMER);
this.p2pTunnelInterface = this.createPart(this.itemPart, PartType.P2P_TUNNEL_INTERFACE);

this.p2pTunnelInterface.maybeStack(1)
.ifPresent((tunnelStack) -> registry.addBootstrapComponent((IInitComponent) (r) -> {
AEApi.instance().registries().gridCache()
Expand All @@ -66,16 +80,36 @@ public Parts(Registry registry) {
var tunnelType = AEApi.instance().registries().p2pTunnel()
.registerTunnelType("NAE2_IFACE_P2P", tunnelStack);

var definitions = Api.INSTANCE.definitions();

definitions.blocks().iface().maybeStack(1)
blocks.iface().maybeStack(1)
.ifPresent((stack) -> registerTunnelConversion(tunnelType, stack));

definitions.parts().iface().maybeStack(1)
parts.iface().maybeStack(1)
.ifPresent((stack) -> registerTunnelConversion(tunnelType, stack));
}));

this.exposer = this.createPart(this.itemPart, PartType.EXPOSER);
this.pccnotifier = this.createPart(this.itemPart, PartType.PCC_NOTIFIER);
this.pccnotifier.maybeStack(1).ifPresent((notifier) ->
registry.addBootstrapComponent((IInitComponent) (r) ->
ASSEMBLER_RECIPES.addRecipe(
ASSEMBLER_RECIPES.recipeBuilder()
.EUt(GTValues.VA[GTValues.LV])
.duration(100)
.input(new GTRecipeItemInput(
Lists.newArrayList(
parts.levelEmitter(),
parts.fluidLevelEmitter()
)
.stream()
.map(opt -> opt.maybeStack(1))
.filter(Optional::isPresent)
.map(Optional::get)
.toArray(ItemStack[]::new)
))
.input(MetaItems.SENSOR_LV)
.outputs(notifier)
.build())));
}

private static void registerTunnelConversion(TunnelType tunnelType, ItemStack stack) {
Expand Down Expand Up @@ -112,6 +146,10 @@ public Optional<DamagedItemDefinition> getById(String id) {
return Optional.ofNullable(this.byId.getOrDefault(id, null));
}

public DamagedItemDefinition pccNotifier() {
return this.pccnotifier;
}

public enum PartType implements IDefinition {
BEAM_FORMER("beam_former", PartBeamFormer.class, Features.BEAM_FORMERS),
P2P_TUNNEL_INTERFACE("p2p_tunnel_interface",
Expand All @@ -127,6 +165,13 @@ public void addCheckedInformation(ItemStack stack, World world, List<String> lin
ITooltipFlag advancedTooltips) {
lines.add(I18n.format("nae2.exposer.tooltip"));
}
},
PCC_NOTIFIER("pcc_notifier", PartPCCNotifier.class, UpgradeFeatures.GREGTECH_CIRCUIT) {
@Override
public void addCheckedInformation(ItemStack stack, World world, List<String> lines,
ITooltipFlag advancedTooltips) {
lines.add(I18n.format("item.nae2.part.pcc_notifier.desc"));
}
};

private static Int2ObjectLinkedOpenHashMap<PartType> cachedValues;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package co.neeve.nae2.mixin.upgrades.gregcircuit;

import appeng.api.networking.IGridHost;
import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.util.AEPartLocation;
import appeng.helpers.DualityInterface;
import appeng.parts.automation.UpgradeInventory;
import appeng.util.inv.InvOperation;
import co.neeve.nae2.common.crafting.patterntransform.PatternTransform;
import co.neeve.nae2.common.crafting.patterntransform.transformers.GregTechCircuitPatternTransformer;
import co.neeve.nae2.common.interfaces.IExtendedUpgradeInventory;
import co.neeve.nae2.common.parts.implementations.PartPCCNotifier;
import co.neeve.nae2.common.registration.definitions.Upgrades;
import com.llamalad7.mixinextras.sugar.Local;
import gregtech.api.capability.IGhostSlotConfigurable;
import gregtech.api.metatileentity.MetaTileEntityHolder;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.items.IItemHandler;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -31,7 +35,6 @@
public abstract class MixinDualityInterface {
@Unique
private WeakHashMap<ICraftingPatternDetails, Integer> nae2$cachedCircuitValues = null;

@Shadow
@Final
private UpgradeInventory upgrades;
Expand All @@ -51,22 +54,34 @@ public abstract class MixinDualityInterface {
)
private void injectCircuitChange(ICraftingPatternDetails patternDetails, InventoryCrafting table,
CallbackInfoReturnable<Boolean> cir,
@Local(name = "te") TileEntity tileEntity) {
@Local(name = "te") TileEntity tileEntity,
@Local(name = "s") EnumFacing s) {
if (this.upgrades instanceof IExtendedUpgradeInventory upgradeInventory
&& upgradeInventory.getInstalledUpgrades(Upgrades.UpgradeType.GREGTECH_CIRCUIT) > 0) {

if (this.nae2$cachedCircuitValues == null) {
this.nae2$cachedCircuitValues = new WeakHashMap<>();
}
int configNo = this.nae2$cachedCircuitValues.computeIfAbsent(patternDetails, d ->
GregTechCircuitPatternTransformer.getCircuitValueFromDetails(d).orElse(0));

// I'm sorry, Seni.
if (tileEntity instanceof MetaTileEntityHolder metaTileEntityHolder) {
var mte = metaTileEntityHolder.getMetaTileEntity();

if (mte instanceof IGhostSlotConfigurable slotConfigurable && slotConfigurable.hasGhostCircuitInventory()) {
if (this.nae2$cachedCircuitValues == null) {
this.nae2$cachedCircuitValues = new WeakHashMap<>();
}
slotConfigurable.setGhostCircuitConfig(configNo);
}
} else if (tileEntity instanceof IGridHost host) {
var gridNode = host.getGridNode(AEPartLocation.fromFacing(s.getOpposite()));
if (gridNode == null) {
gridNode = host.getGridNode(AEPartLocation.INTERNAL);
}

slotConfigurable.setGhostCircuitConfig(
this.nae2$cachedCircuitValues.computeIfAbsent(patternDetails, d ->
GregTechCircuitPatternTransformer.getCircuitValueFromDetails(d).orElse(0)));
if (gridNode != null) {
var notifiers = gridNode.getGrid().getMachines(PartPCCNotifier.class);
for (var notifier : notifiers) {
((PartPCCNotifier) notifier.getMachine()).notifyMachine(configNo);
}
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/assets/nae2/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ item.nae2.material.cell_part_gas_16384k.name=§a16384k§r ME Gas Storage Compone
# Parts
item.nae2.part.beam_former.name=ME Beam Former
item.nae2.part.exposer.name=ME Storage Exposer
item.nae2.part.pcc_notifier.name=ME Programmed Circuit Card Notifier
item.nae2.part.pcc_notifier.desc=Changes the ghost circuit in the machine/bus it's pointed at, but only whenever an §aME Interface§7 with a §aProgrammed Circuit Card§7 pushes a pattern into the network it's in.\n\nAutomate your multiblocks.


# Upgrades
item.nae2.upgrade.hyper_acceleration.name=Hyper-Acceleration Card
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "nae2:item/part/pcc_notifier"
}
}
76 changes: 76 additions & 0 deletions src/main/resources/assets/nae2/models/part/pcc_notifier.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{
"parent": "appliedenergistics2:item/part/part",
"textures": {
"emitter": "nae2:items/part/level_emitter_on"
},
"elements": [
{
"from": [
7,
6,
7
],
"to": [
9,
10,
9
],
"faces": {
"north": {
"texture": "#emitter",
"uv": [
7,
7,
9,
11
]
},
"south": {
"texture": "#emitter",
"uv": [
7,
7,
9,
11
]
},
"east": {
"texture": "#emitter",
"uv": [
7,
7,
9,
11
]
},
"west": {
"texture": "#emitter",
"uv": [
7,
7,
9,
11
]
},
"up": {
"texture": "#emitter",
"uv": [
7,
7,
9,
9
]
},
"down": {
"texture": "#emitter",
"uv": [
7,
9,
9,
11
]
}
}
}
]
}
Loading