Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ghost Circuits #1458

Merged
merged 12 commits into from
Mar 19, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package gregtech.api.gui.widgets;

import gregtech.api.recipes.ingredients.IntCircuitIngredient;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.items.IItemHandlerModifiable;


/**
* Used for setting a "ghost" IC for a machine
*/
public class FakeCircuitSlotWidget extends SlotWidget {

public FakeCircuitSlotWidget(IItemHandlerModifiable itemHandler, int slotIndex, int xPosition, int yPosition) {
super(itemHandler, slotIndex, xPosition, yPosition, false, false, false);
}

@Override
public boolean mouseClicked(int mouseX, int mouseY, int button) {
if (isMouseOverElement(mouseX, mouseY) && gui != null) {
if (button == 0 && slotReference.getStack().isEmpty()) {
slotReference.putStack(IntCircuitIngredient.getIntegratedCircuit(0));
writeClientAction(1, buf -> {});
}
else if (button == 1 && !slotReference.getStack().isEmpty()){
slotReference.putStack(ItemStack.EMPTY);
writeClientAction(2, buf -> {});
}
else {
gui.getModularUIGui().superMouseClicked(mouseX, mouseY, button);
}
return true;
}
return false;
}

@Override
public boolean mouseWheelMove(int mouseX, int mouseY, int wheelDelta) {
if (isMouseOverElement(mouseX, mouseY) && gui != null) {
if (!slotReference.getStack().isEmpty()) {
int dir = wheelDelta >= 0 ? 1 : -1;
int currentConfig = IntCircuitIngredient.getCircuitConfiguration(slotReference.getStack());
int newConfig = currentConfig + dir;

// return early if invalid
if (newConfig < 0 || newConfig > IntCircuitIngredient.CIRCUIT_MAX){
return true;
}

slotReference.putStack(IntCircuitIngredient.getIntegratedCircuit(newConfig));
writeClientAction(3, buf -> buf.writeInt(newConfig));
}
else {
super.mouseWheelMove(mouseX, mouseY, wheelDelta);
}
return true;
}
return false;
}

@Override
public boolean mouseDragged(int mouseX, int mouseY, int button, long timeDragged) { return false; }

@Override
public ItemStack slotClick(int dragType, ClickType clickTypeIn, EntityPlayer player) {
ItemStack stackHeld = player.inventory.getItemStack();

if (IntCircuitIngredient.isIntegratedCircuit(stackHeld)){
ItemStack ic = stackHeld.copy();
ic.setCount(1);
slotReference.putStack(ic);
return ic;
}

return ItemStack.EMPTY;
}

@Override
public boolean canMergeSlot(ItemStack stack) { return false; }

@Override
public void handleClientAction(int id, PacketBuffer buffer) {
if (id == 1) {
slotReference.putStack(IntCircuitIngredient.getIntegratedCircuit(0));
} else if (id == 2) {
slotReference.putStack(ItemStack.EMPTY);
} else if (id == 3) {
slotReference.putStack(IntCircuitIngredient.getIntegratedCircuit(buffer.readInt()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,13 @@ public void setAllowInputFromOutputSideFluids(boolean allowInputFromOutputSide)
}
}

public void setGhostCircuitConfig(int config) {
this.circuitInventory.setStackInSlot(0, IntCircuitIngredient.getIntegratedCircuit(config));
if (!getWorld().isRemote) {
markDirty();
}
}

@Override
public void setFrontFacing(EnumFacing frontFacing) {
super.setFrontFacing(frontFacing);
Expand Down Expand Up @@ -400,7 +407,6 @@ public boolean isAllowInputFromOutputSideFluids() {
public void clearMachineInventory(NonNullList<ItemStack> itemBuffer) {
super.clearMachineInventory(itemBuffer);
clearInventory(itemBuffer, chargerInventory);
clearInventory(itemBuffer, circuitInventory);
}

protected ModularUI.Builder createGuiTemplate(EntityPlayer player) {
Expand Down Expand Up @@ -443,7 +449,7 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) {

if (exportItems.getSlots() + exportFluids.getTanks() <= 9) {
ImageWidget logo = new ImageWidget(152, 63 + yOffset, 17, 17, GTValues.XMAS.get() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO).setIgnoreColor(true);
SlotWidget circuitSlot = new SlotWidget(circuitInventory, 0, 124, 62 + yOffset, true, true, false)
SlotWidget circuitSlot = new FakeCircuitSlotWidget(circuitInventory, 0, 124, 62 + yOffset)
.setBackgroundTexture(GuiTextures.SLOT, getCircuitSlotOverlay());
builder.widget(getCircuitSlotTooltip(circuitSlot)).widget(logo)
.widget(new ClickButtonWidget(115, 62 + yOffset, 9, 9, "", this::circuitConfigPlus)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@
import gregtech.api.items.gui.PlayerInventoryHolder;
import gregtech.api.items.metaitem.stats.IItemBehaviour;
import gregtech.api.items.metaitem.stats.ISubItemHandler;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.SimpleMachineMetaTileEntity;
import gregtech.api.recipes.ingredients.IntCircuitIngredient;
import gregtech.api.util.GTUtility;
import net.minecraft.client.resources.I18n;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

import java.util.List;
Expand All @@ -29,6 +30,17 @@ public void addInformation(ItemStack itemStack, List<String> lines) {
lines.add(I18n.format("metaitem.int_circuit.configuration", configuration));
}

@Override
public ActionResult<ItemStack> onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
MetaTileEntity mte = GTUtility.getMetaTileEntity(world, pos);
if (!(mte instanceof SimpleMachineMetaTileEntity)) {
return ActionResult.newResult(EnumActionResult.FAIL, player.getHeldItem(hand));
}
SimpleMachineMetaTileEntity smte = (SimpleMachineMetaTileEntity) mte;
smte.setGhostCircuitConfig(IntCircuitIngredient.getCircuitConfiguration(player.getHeldItem(hand)));
return ActionResult.newResult(EnumActionResult.SUCCESS, player.getHeldItem(hand));
}

@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
ItemStack heldItem = player.getHeldItem(hand);
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/assets/gregtech/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ metaitem.tool.datastick.tooltip=A Low Capacity Data Storage
metaitem.tool.dataorb.name=Data Orb
metaitem.tool.dataorb.tooltip=A High Capacity Data Storage
metaitem.circuit.integrated.name=Programmed Circuit
metaitem.circuit.integrated.tooltip=Use to open configuration GUI
metaitem.circuit.integrated.tooltip=Use to open configuration GUI/n/nShift-Right-Click on a machine/nwith a circuit slot to set it to/nthis circuit's value./n
metaitem.circuit.integrated.gui=Programmed Circuit Configuration
metaitem.circuit.integrated.jei_description=JEI is only showing recipes for the given configuration.\n\nYou can select a configuration in the Programmed Circuit configuration tab.

Expand Down Expand Up @@ -4802,7 +4802,7 @@ gregtech.gui.fluid_auto_output.tooltip.disabled=Fluid Auto-Output Disabled
gregtech.gui.item_auto_output.tooltip.enabled=Item Auto-Output Enabled
gregtech.gui.item_auto_output.tooltip.disabled=Item Auto-Output Disabled
gregtech.gui.charger_slot.tooltip=§fCharger Slot§r/n§7Draws power from %s batteries§r/n§7Charges %s tools and batteries
gregtech.gui.configurator_slot.tooltip=§fConfigurator Slot§r/n§7Place a §6Programmed Circuit§7 in this slot to/n§7change its configured value./n§7Hold §6Shift§7 when clicking buttons to change by §65./n§aA Programmed Circuit in this slot is also valid for recipe inputs.§r
gregtech.gui.configurator_slot.tooltip=§fProgrammed Circuit Slot§r/n/n§7Left-Click to add ghost programmed circuit/n§7Right-Click to remove ghost programmed circuit/n/n§7Left-Click with a §6Programmed Circuit§7 in hand to/n§7set this slot's config to its value./n/n§7Hold Shift when clicking buttons to change by 5.§r
gregtech.gui.fluid_lock.tooltip.enabled=Fluid Locking Enabled
gregtech.gui.fluid_lock.tooltip.disabled=Fluid Locking Disabled
gregtech.gui.fluid_voiding_partial.tooltip.enabled=Fluid Voiding (Above %d%%) Enabled
Expand Down