diff --git a/gradle.properties b/gradle.properties index b317ece..7a8e110 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,7 @@ developmentEnvironmentUserName = Developer # Enables using modern java syntax (up to version 17) via Jabel, while still targeting JVM 8. # See https://github.com/bsideup/jabel for details on how this works. -enableModernJavaSyntax = false +enableModernJavaSyntax = true # Enables injecting missing generics into the decompiled source code for a better coding experience # Turns most publicly visible List, Map, etc. into proper List, Map types diff --git a/src/main/java/reobf/proghatches/ae/cpu/TileCPU.java b/src/main/java/reobf/proghatches/ae/cpu/TileCPU.java index 859e40b..1fb5455 100644 --- a/src/main/java/reobf/proghatches/ae/cpu/TileCPU.java +++ b/src/main/java/reobf/proghatches/ae/cpu/TileCPU.java @@ -315,7 +315,7 @@ private static IStructureDefinition STRUCTURE_DEFINITION(){ 'b', ofChain( lazy( - t -> Util.hint( + (TileCPU t) -> Util.hint( GTStructureUtility.buildHatchAdder() .atLeast(Energy, Maintenance, HatchElement.InputBus, HatchElement.OutputBus) .casingIndex(CASING_INDEX) diff --git a/src/main/java/reobf/proghatches/item/ItemProgrammingToolkit.java b/src/main/java/reobf/proghatches/item/ItemProgrammingToolkit.java index 6366331..63d2da0 100644 --- a/src/main/java/reobf/proghatches/item/ItemProgrammingToolkit.java +++ b/src/main/java/reobf/proghatches/item/ItemProgrammingToolkit.java @@ -4,6 +4,10 @@ import java.util.Optional; import java.util.function.Supplier; +import appeng.items.misc.ItemEncodedPattern; +import appeng.parts.misc.PartInterface; +import appeng.tile.misc.TileInterface; +import appeng.tile.networking.TileCableBus; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; @@ -13,11 +17,16 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + import com.google.common.collect.ImmutableList; import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; @@ -62,6 +71,7 @@ public void registerIcons(IIconRegister register) { icons[0] = register.registerIcon("proghatches:toolkit0"); icons[1] = register.registerIcon("proghatches:toolkit1"); icons[2] = register.registerIcon("proghatches:toolkit2"); + icons[3] = register.registerIcon("proghatches:toolkit3"); // super.registerIcons(register); } @@ -133,7 +143,10 @@ public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p case 2: { p_77624_3_.add(LangManager.translateToLocal("item.prog_toolkit.name.tooltip.mode.2")); } - + case 3: { + p_77624_3_.add(LangManager.translateToLocal("item.prog_toolkit.name.tooltip.mode.3.1")); + p_77624_3_.add(LangManager.translateToLocal("item.prog_toolkit.name.tooltip.mode.3.2")); + } } int i = 0; @@ -157,7 +170,7 @@ public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p } - public static int maxModes = 3; + public static int maxModes = 4; @Override public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer player) { @@ -173,6 +186,85 @@ public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPl return super.onItemRightClick(itemStackIn, worldIn, player); } + @Override + public boolean onItemUse(final ItemStack itemStack, final EntityPlayer player, final World world, final int x, final int y, + final int z, final int side, final float hx, final float hy, final float hz) + { + if(world.isRemote) return true; + int itemMode=itemStack.getItemDamage(); + if(itemMode==3) { + TileEntity te = world.getTileEntity(x, y, z); + if (te == null) return false; + + IInventory patterns = null; + if (te instanceof TileInterface) { + patterns = ((TileInterface) te).getPatterns(); + } else if (te instanceof TileCableBus tileCableBus) { + Object part = tileCableBus.getCableBus().getPart(ForgeDirection.getOrientation(side)); + if (!(part instanceof PartInterface)) { + part = tileCableBus.getCableBus().getPart(findClosestSide(hx, hy, hz)); + } + if (part instanceof PartInterface partInterface) { + patterns = partInterface.getPatterns(); + } + } + + if (patterns == null) return false; + + int count = 0; + for (int i = 0; i < patterns.getSizeInventory(); i++) { + ItemStack item = patterns.getStackInSlot(i); + if (item == null || !(item.getItem() instanceof ItemEncodedPattern)) continue; + + NBTTagCompound tag = item.getTagCompound(); + if (tag == null) continue; + + NBTTagList inTag = tag.getTagList("in", 10); + NBTTagList newInTag = new NBTTagList(); + boolean changed = false; + + for (int k = 0; k < inTag.tagCount(); k++) { + NBTTagCompound t = inTag.getCompoundTagAt(k); + ItemStack is = ItemStack.loadItemStackFromNBT(t); + if (is != null && is.getItem() instanceof ItemProgrammingCircuit) { + changed = true; + } else { + newInTag.appendTag(t); + } + } + + if (changed) { + tag.setTag("in", newInTag); + item.setTagCompound(tag); + patterns.setInventorySlotContents(i, item); + count++; + } + } + if (count > 0) { + player.addChatMessage(new net.minecraft.util.ChatComponentTranslation("item.prog_toolkit.chat.pattern_cleaned", count)); + } + return true; + } + return false; + } + + private ForgeDirection findClosestSide(float hx, float hy, float hz) { + float[] dists = new float[6]; + dists[0] = hy; // DOWN + dists[1] = 1.0f - hy; // UP + dists[2] = hz; // NORTH + dists[3] = 1.0f - hz; // SOUTH + dists[4] = hx; // WEST + dists[5] = 1.0f - hx; // EAST + + int min = 0; + for (int i = 1; i < 6; i++) { + if (dists[i] < dists[min]) { + min = i; + } + } + return ForgeDirection.getOrientation(min); + } @Override public ModularWindow createWindow(UIBuildContext buildContext, ItemStack heldStack) { diff --git a/src/main/resources/assets/proghatches/lang/en_US.lang b/src/main/resources/assets/proghatches/lang/en_US.lang index 10ee668..294fce0 100644 --- a/src/main/resources/assets/proghatches/lang/en_US.lang +++ b/src/main/resources/assets/proghatches/lang/en_US.lang @@ -21,6 +21,10 @@ item.prog_toolkit.name.tooltip.3=to corresponding §fProgramming Circuit item.prog_toolkit.name.tooltip.4=SHIFT+RMB to switch between modes item.prog_toolkit.name.tooltip.mode.0=Disabled item.prog_toolkit.name.tooltip.mode.1=Normal Mode +item.prog_toolkit.name.tooltip.mode.2=Add empty progcircuit if no NC inputs +item.prog_toolkit.name.tooltip.mode.3.1=Clear Mode +item.prog_toolkit.name.tooltip.mode.3.2=Right click a interface to clear all pattern's progcircuit +item.prog_toolkit.chat.pattern_cleaned=Successfully cleaned %s pattern's progcircuit programmable_hatches.cover.smart.io.true=Internal to Adjacent programmable_hatches.cover.smart.io.false=Adjacent to Internal programmable_hatches.cover.smart.mode.0=map o->i @@ -59,7 +63,6 @@ programmable_hatches.cover.smart.dyn.shift.1.1=§7may access wireless redstone s programmable_hatches.cover.smart.dyn.shift.1.2=§7Minimum tick interval: 5 tick programmable_hatches.cover.smart.dyn.shift.1=3 programmable_hatches.cover.smart.info.print.dyn=No mapping table available in dynamic mode. -item.prog_toolkit.name.tooltip.mode.2=Add empty progcircuit if no NC inputs programmable_hatches.cover.wireless.invert.true=Use inverted Redstone programmable_hatches.cover.wireless.safe.true=Safe Mode on programmable_hatches.cover.wireless.crashed.true=Disabled diff --git a/src/main/resources/assets/proghatches/lang/zh_CN.lang b/src/main/resources/assets/proghatches/lang/zh_CN.lang index a90cf7b..6754da3 100644 --- a/src/main/resources/assets/proghatches/lang/zh_CN.lang +++ b/src/main/resources/assets/proghatches/lang/zh_CN.lang @@ -20,6 +20,10 @@ item.prog_toolkit.name.tooltip.3=自动转换为对应的§f编程器电路 item.prog_toolkit.name.tooltip.4=shift右键切换模式 item.prog_toolkit.name.tooltip.mode.0=禁用 item.prog_toolkit.name.tooltip.mode.1=常规模式 +item.prog_toolkit.name.tooltip.mode.2=无NC物品时添加空编程器电路 +item.prog_toolkit.name.tooltip.mode.3.1=清除模式 +item.prog_toolkit.name.tooltip.mode.3.2=右键一个接口以清理接口中所有样板的编程器电路 +item.prog_toolkit.chat.pattern_cleaned=已清除 %s 样板中的编程器电路 programmable_hatches.cover.smart.io.true=内部 向 外部 programmable_hatches.cover.smart.io.false=外部 向 内部 programmable_hatches.cover.smart.mode.0=映射 o->i @@ -58,7 +62,6 @@ programmable_hatches.cover.smart.dyn.shift.1.1=§7允许获取无线红石等信 programmable_hatches.cover.smart.dyn.shift.1.2=§7最小工作间隔: 5 tick programmable_hatches.cover.smart.dyn.shift.1=3 programmable_hatches.cover.smart.info.print.dyn=动态模式不生成映射表 -item.prog_toolkit.name.tooltip.mode.2=无NC物品时添加空编程器电路 programmable_hatches.cover.wireless.invert.true=反转信号 programmable_hatches.cover.wireless.safe.true=安全模式启用 programmable_hatches.cover.wireless.crashed.true=禁用 diff --git a/src/main/resources/assets/proghatches/textures/items/toolkit3.png b/src/main/resources/assets/proghatches/textures/items/toolkit3.png new file mode 100644 index 0000000..1f629ce Binary files /dev/null and b/src/main/resources/assets/proghatches/textures/items/toolkit3.png differ