From 1b820de08a05070909a267e17f033fcf58ac8710 Mon Sep 17 00:00:00 2001 From: NotAPenguin Date: Mon, 2 Sep 2024 23:17:17 +0200 Subject: The Great Renaming (#3014) * move kekztech to a single root dir * move detrav to a single root dir * move gtnh-lanthanides to a single root dir * move tectech and delete some gross reflection in gt++ * remove more reflection inside gt5u * delete more reflection in gt++ * fix imports * move bartworks and bwcrossmod * fix proxies * move galactigreg and ggfab * move gtneioreplugin * try to fix gt++ bee loader * apply the rename rules to BW * apply rename rules to bwcrossmod * apply rename rules to detrav scanner mod * apply rename rules to galacticgreg * apply rename rules to ggfab * apply rename rules to goodgenerator * apply rename rules to gtnh-lanthanides * apply rename rules to gt++ * apply rename rules to kekztech * apply rename rules to kubatech * apply rename rules to tectech * apply rename rules to gt apply the rename rules to gt * fix tt import * fix mui hopefully * fix coremod except intergalactic * rename assline recipe class * fix a class name i stumbled on * rename StructureUtility to GTStructureUtility to prevent conflict with structurelib * temporary rename of GTTooltipDataCache to old name * fix gt client/server proxy names --- .../common/items/behaviors/BehaviourCoverTool.java | 193 ++++++++++++++ .../common/items/behaviors/BehaviourCrowbar.java | 61 +++++ .../common/items/behaviors/BehaviourDataOrb.java | 105 ++++++++ .../common/items/behaviors/BehaviourDataStick.java | 52 ++++ .../common/items/behaviors/BehaviourHoe.java | 72 ++++++ .../common/items/behaviors/BehaviourLighter.java | 139 +++++++++++ .../common/items/behaviors/BehaviourNone.java | 90 +++++++ .../items/behaviors/BehaviourPlungerEssentia.java | 54 ++++ .../items/behaviors/BehaviourPlungerFluid.java | 75 ++++++ .../items/behaviors/BehaviourPlungerItem.java | 88 +++++++ .../items/behaviors/BehaviourPrintedPages.java | 39 +++ .../items/behaviors/BehaviourProspecting.java | 158 ++++++++++++ .../common/items/behaviors/BehaviourScanner.java | 65 +++++ .../common/items/behaviors/BehaviourScoop.java | 62 +++++ .../items/behaviors/BehaviourScrewdriver.java | 52 ++++ .../common/items/behaviors/BehaviourSense.java | 56 +++++ .../common/items/behaviors/BehaviourSensorKit.java | 56 +++++ .../items/behaviors/BehaviourSoftHammer.java | 123 +++++++++ .../common/items/behaviors/BehaviourSonictron.java | 135 ++++++++++ .../items/behaviors/BehaviourSprayColor.java | 218 ++++++++++++++++ .../behaviors/BehaviourSprayColorRemover.java | 48 ++++ .../items/behaviors/BehaviourSwitchMetadata.java | 67 +++++ .../items/behaviors/BehaviourSwitchMode.java | 53 ++++ .../common/items/behaviors/BehaviourWrench.java | 278 +++++++++++++++++++++ .../items/behaviors/BehaviourWrittenBook.java | 40 +++ .../items/behaviors/Behaviour_Cover_Tool.java | 193 -------------- .../common/items/behaviors/Behaviour_Crowbar.java | 61 ----- .../common/items/behaviors/Behaviour_DataOrb.java | 105 -------- .../items/behaviors/Behaviour_DataStick.java | 52 ---- .../common/items/behaviors/Behaviour_Hoe.java | 72 ------ .../common/items/behaviors/Behaviour_Lighter.java | 140 ----------- .../common/items/behaviors/Behaviour_None.java | 90 ------- .../behaviors/Behaviour_Plunger_Essentia.java | 54 ---- .../items/behaviors/Behaviour_Plunger_Fluid.java | 75 ------ .../items/behaviors/Behaviour_Plunger_Item.java | 88 ------- .../items/behaviors/Behaviour_PrintedPages.java | 39 --- .../items/behaviors/Behaviour_Prospecting.java | 159 ------------ .../common/items/behaviors/Behaviour_Scanner.java | 65 ----- .../common/items/behaviors/Behaviour_Scoop.java | 63 ----- .../items/behaviors/Behaviour_Screwdriver.java | 52 ---- .../common/items/behaviors/Behaviour_Sense.java | 56 ----- .../items/behaviors/Behaviour_SensorKit.java | 56 ----- .../items/behaviors/Behaviour_SoftHammer.java | 131 ---------- .../items/behaviors/Behaviour_Sonictron.java | 135 ---------- .../items/behaviors/Behaviour_Spray_Color.java | 218 ---------------- .../behaviors/Behaviour_Spray_Color_Remover.java | 48 ---- .../items/behaviors/Behaviour_Switch_Metadata.java | 67 ----- .../items/behaviors/Behaviour_Switch_Mode.java | 53 ---- .../common/items/behaviors/Behaviour_Wrench.java | 278 --------------------- .../items/behaviors/Behaviour_WrittenBook.java | 40 --- 50 files changed, 2379 insertions(+), 2390 deletions(-) create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourNone.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourScrewdriver.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSense.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSensorKit.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSoftHammer.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSonictron.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSprayColor.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSprayColorRemover.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMetadata.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourSwitchMode.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourWrench.java create mode 100644 src/main/java/gregtech/common/items/behaviors/BehaviourWrittenBook.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Cover_Tool.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Crowbar.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_DataOrb.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_DataStick.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Hoe.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Lighter.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_None.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Essentia.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Fluid.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Plunger_Item.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_PrintedPages.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Prospecting.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Scanner.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Scoop.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Screwdriver.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Sense.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_SensorKit.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_SoftHammer.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Sonictron.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Spray_Color_Remover.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Metadata.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Switch_Mode.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_Wrench.java delete mode 100644 src/main/java/gregtech/common/items/behaviors/Behaviour_WrittenBook.java (limited to 'src/main/java/gregtech/common/items/behaviors') diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java b/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java new file mode 100644 index 0000000000..b39135fed2 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java @@ -0,0 +1,193 @@ +package gregtech.common.items.behaviors; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.CoverBehaviorBase; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ISerializableObject; + +public class BehaviourCoverTool extends BehaviourNone { + + public static final IItemBehaviour INSTANCE = new BehaviourCoverTool(); + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.cover_copy_paste", "Can copy/paste cover data."); + + private ISerializableObject mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + private int mCoverType; + private int mTickRateAddition = 0; + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + final NBTTagCompound tNBT = aStack.getTagCompound(); + final TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + final boolean isCopyMode = aPlayer.isSneaking(); + initDataFromNBT(tNBT); + if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 100.0D))) { + if (isCopyMode) { + ArrayList tList = new ArrayList<>(); + doCopy(tTileEntity, aWorld, aX, aY, aZ, side, hitX, hitY, hitZ, tList); + aItem.discharge(aStack, 100.0D, Integer.MAX_VALUE, true, false, false); + writeListToNBT(tList, tNBT, aPlayer); + saveDataToNBT(tNBT); + } else { + doPaste(tTileEntity, side, hitX, hitY, hitZ, aPlayer); + aItem.discharge(aStack, 25.0D, Integer.MAX_VALUE, true, false, false); + } + } + GTUtility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); + return aPlayer instanceof EntityPlayerMP; + } + + private void initDataFromNBT(NBTTagCompound aNBT) { + if (aNBT != null) { + mCoverType = aNBT.getInteger("mCoverType"); + CoverBehaviorBase tBehavior = GregTechAPI.getCoverBehaviorNew(mCoverType); + NBTBase tData = aNBT.getTag("mCoverData"); + if (tData != null) mStoredData = tBehavior.createDataObject(tData); + else mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mTickRateAddition = aNBT.hasKey("mTickRateAddition") ? aNBT.getInteger("mTickRateAddition") : 0; + } + } + + private void saveDataToNBT(NBTTagCompound aNBT) { + aNBT.setInteger("mCoverType", mCoverType); + if (mStoredData == null) mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + aNBT.setTag("mCoverData", mStoredData.saveDataToNBT()); + aNBT.setInteger("mTickRateAddition", mTickRateAddition); + } + + @SuppressWarnings("rawtypes") + private void writeListToNBT(List aList, NBTTagCompound aNBT, EntityPlayer aPlayer) { + if (aList != null && aNBT != null) { + int tSize = aList.size(); + aNBT.setInteger("dataLinesCount", tSize); + for (int i = 0; i < tSize; i++) { + aNBT.setString("dataLines" + i, (String) aList.get(i)); + GTUtility.sendChatToPlayer(aPlayer, (String) aList.get(i)); + } + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void doCopy(TileEntity aTileEntity, World aWorld, int aX, int aY, int aZ, ForgeDirection side, float hitX, + float hitY, float hitZ, List aList) { + aList.add( + "----- X: " + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aX) + + EnumChatFormatting.RESET + + " Y: " + + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aY) + + EnumChatFormatting.RESET + + " Z: " + + EnumChatFormatting.AQUA + + GTUtility.formatNumbers(aZ) + + EnumChatFormatting.RESET + + " D: " + + EnumChatFormatting.AQUA + + aWorld.provider.dimensionId + + EnumChatFormatting.RESET + + " -----"); + if (aTileEntity instanceof ICoverable tCoverable) { + final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side + : tCoverable.getCoverItemAtSide(GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null + ? GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ) + : ForgeDirection.UNKNOWN; + if (tSide != ForgeDirection.UNKNOWN) { + if (tCoverable.getCoverBehaviorAtSideNew(tSide) + .allowsCopyPasteTool()) { + mStoredData = tCoverable.getComplexCoverDataAtSide(tSide); + mCoverType = tCoverable.getCoverIDAtSide(tSide); + mTickRateAddition = tCoverable.getCoverInfoAtSide(tSide) + .getTickRateAddition(); + + aList.add("Block Side: " + EnumChatFormatting.AQUA + tSide.name() + EnumChatFormatting.RESET); + aList.add( + "Cover Type: " + EnumChatFormatting.GREEN + + tCoverable.getCoverItemAtSide(tSide) + .getDisplayName() + + EnumChatFormatting.RESET); + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("Copy unavailable for this cover type"); + } + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("No Cover Found"); + } + } else { + mStoredData = GregTechAPI.sNoBehavior.createDataObject(); + mCoverType = 0; + mTickRateAddition = 0; + aList.add("No Cover Found"); + } + } + + private void doPaste(TileEntity aTileEntity, ForgeDirection side, float hitX, float hitY, float hitZ, + EntityPlayer aPlayer) { + if (aTileEntity instanceof ICoverable tCoverable) { + if (mCoverType == 0 || mStoredData == null) { + GTUtility.sendChatToPlayer(aPlayer, "Please Copy a Valid Cover First."); + return; + } + final ForgeDirection tSide = tCoverable.getCoverItemAtSide(side) != null ? side + : tCoverable.getCoverItemAtSide(GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ)) != null + ? GTUtility.determineWrenchingSide(side, hitX, hitY, hitZ) + : ForgeDirection.UNKNOWN; + if (tSide != ForgeDirection.UNKNOWN) { + int tCoverID = tCoverable.getCoverIDAtSide(tSide); + if (tCoverID == mCoverType) { + tCoverable.setCoverDataAtSide(tSide, mStoredData); + tCoverable.getCoverInfoAtSide(tSide) + .setTickRateAddition(mTickRateAddition); + GTUtility.sendChatToPlayer(aPlayer, "Cover Data Pasted."); + } else { + GTUtility.sendChatToPlayer(aPlayer, "Not Matched Cover."); + } + } else { + GTUtility.sendChatToPlayer(aPlayer, "No Cover Found."); + } + } + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + try { + final NBTTagCompound tNBT = aStack.getTagCompound(); + final int tSize = tNBT.getInteger("dataLinesCount"); + if (tSize < 1) throw new Exception(); + aList.add(EnumChatFormatting.BLUE + "Stored Cover Data:"); + for (int i = 0; i < tSize; i++) { + aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); + } + } catch (Exception e) { + aList.add(this.mTooltip); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java b/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java new file mode 100644 index 0000000000..76c215bfd0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourCrowbar.java @@ -0,0 +1,61 @@ +package gregtech.common.items.behaviors; + +import static gregtech.api.enums.Mods.Railcraft; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTUtility; + +public class BehaviourCrowbar extends BehaviourNone { + + private final int mVanillaCosts; + private final int mEUCosts; + + public BehaviourCrowbar(int aVanillaCosts, int aEUCosts) { + this.mVanillaCosts = aVanillaCosts; + this.mEUCosts = aEUCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + if (GTModHandler.getModItem(Railcraft.ID, "fluid.creosote.bucket", 1L) != null) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + if (aBlock == Blocks.rail) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, (aMeta + 1) % 10, 0); + aWorld.isRemote = false; + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + if ((aBlock == Blocks.detector_rail) || (aBlock == Blocks.activator_rail) || (aBlock == Blocks.golden_rail)) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + aWorld.isRemote = true; + aWorld.setBlock(aX, aY, aZ, aBlock, aMeta / 8 * 8 + (aMeta % 8 + 1) % 6, 0); + aWorld.isRemote = false; + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_BREAK, 1.0F, -1.0F, aX, aY, aZ); + } + return true; + } + return false; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java b/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java new file mode 100644 index 0000000000..c5d045ecd0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourDataOrb.java @@ -0,0 +1,105 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourDataOrb extends BehaviourNone { + + public static void copyInventory(ItemStack[] aInventory, ItemStack[] aNewContent, int aIndexlength) { + for (int i = 0; i < aIndexlength; i++) { + if (aNewContent[i] == null) { + aInventory[i] = null; + } else { + aInventory[i] = GTUtility.copyOrNull(aNewContent[i]); + } + } + } + + public static String getDataName(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("mDataName"); + } + + public static String getDataTitle(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("mDataTitle"); + } + + public static NBTTagCompound setDataName(ItemStack aStack, String aDataName) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + tNBT.setString("mDataName", aDataName); + aStack.setTagCompound(tNBT); + return tNBT; + } + + public static NBTTagCompound setDataTitle(ItemStack aStack, String aDataTitle) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + tNBT.setString("mDataTitle", aDataTitle); + aStack.setTagCompound(tNBT); + return tNBT; + } + + public static ItemStack[] getNBTInventory(ItemStack aStack) { + ItemStack[] tInventory = new ItemStack[256]; + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return tInventory; + } + NBTTagList tNBT_ItemList = tNBT.getTagList("Inventory", 10); + for (int i = 0; i < tNBT_ItemList.tagCount(); i++) { + NBTTagCompound tag = tNBT_ItemList.getCompoundTagAt(i); + byte slot = tag.getByte("Slot"); + if (slot >= 0) { + tInventory[slot] = GTUtility.loadItem(tag); + } + } + return tInventory; + } + + public static NBTTagCompound setNBTInventory(ItemStack aStack, ItemStack[] aInventory) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + NBTTagList tNBT_ItemList = new NBTTagList(); + for (int i = 0; i < aInventory.length; i++) { + ItemStack stack = aInventory[i]; + if (stack != null) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + stack.writeToNBT(tag); + tNBT_ItemList.appendTag(tag); + } + } + tNBT.setTag("Inventory", tNBT_ItemList); + aStack.setTagCompound(tNBT); + return tNBT; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + if (!(getDataTitle(aStack).length() == 0)) { + aList.add(getDataTitle(aStack)); + aList.add(getDataName(aStack)); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java b/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java new file mode 100644 index 0000000000..63462b8d9b --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourDataStick.java @@ -0,0 +1,52 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourDataStick extends BehaviourNone { + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + String tString = GTUtility.ItemNBT.getBookTitle(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add(tString); + } + tString = GTUtility.ItemNBT.getBookAuthor(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add("by " + tString); + } + short tMapID = GTUtility.ItemNBT.getMapID(aStack); + if (tMapID >= 0) { + aList.add("Map ID: " + tMapID); + } + tString = GTUtility.ItemNBT.getPunchCardData(aStack); + if (GTUtility.isStringValid(tString)) { + aList.add("Punch Card Data"); + int i = 0; + int j = tString.length(); + for (; i < j; i += 64) { + aList.add(tString.substring(i, Math.min(i + 64, j))); + } + } + short sTier = GTUtility.ItemNBT.getNBT(aStack) + .getShort("rocket_tier"); + if (sTier > 0 && sTier < 100) { + aList.add("Rocket Schematic Tier: " + sTier); + } else if (sTier >= 100) { + switch (sTier) { + case 100 -> aList.add("Moonbuggy Schematic"); + case 101 -> aList.add("Cargo-Rocket Schematic"); + case 102 -> aList.add("Astro-Miner Schematic"); + } + } + long lastUpdate = GTUtility.ItemNBT.getNBT(aStack) + .getLong("lastUpdate"); + if (lastUpdate != 0) aList.add(String.format("Last update at: %tc", lastUpdate)); + + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java b/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java new file mode 100644 index 0000000000..ca9166b581 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourHoe.java @@ -0,0 +1,72 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.UseHoeEvent; + +import cpw.mods.fml.common.eventhandler.Event; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import gregtech.api.util.WorldSpawnedEventBuilder; + +public class BehaviourHoe extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager.addStringLocalization("gt.behaviour.hoe", "Can till Dirt"); + + public BehaviourHoe(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + if (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)) { + return false; + } + UseHoeEvent event = new UseHoeEvent(aPlayer, aStack, aWorld, aX, aY, aZ); + if (MinecraftForge.EVENT_BUS.post(event)) { + return false; + } + if (event.getResult() == Event.Result.ALLOW) { + if (!aPlayer.capabilities.isCreativeMode) { + ((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts); + } + return true; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if ((ordinalSide != 0) && (GTUtility.isBlockAir(aWorld, aX, aY + 1, aZ)) + && ((aBlock == Blocks.grass) || (aBlock == Blocks.dirt))) { + new WorldSpawnedEventBuilder.SoundEventBuilder() + .setVolume((Blocks.farmland.stepSound.getVolume() + 1.0F) / 2.0F) + .setPitch(Blocks.farmland.stepSound.getPitch() * 0.8F) + .setIdentifier(Blocks.farmland.stepSound.getStepResourcePath()) + .setPosition(aX + 0.5F, aY + 0.5F, aZ + 0.5F) + .setWorld(aWorld) + .run(); + if (aWorld.isRemote) { + return true; + } + aWorld.setBlock(aX, aY, aZ, Blocks.farmland); + if (!aPlayer.capabilities.isCreativeMode) { + ((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java b/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java new file mode 100644 index 0000000000..9c9c8ab9f0 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourLighter.java @@ -0,0 +1,139 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.math.MathHelper; +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourLighter extends BehaviourNone { + + private final ItemStack mEmptyLighter; + private final ItemStack mUsedLighter; + private final ItemStack mFullLighter; + private final long mFuelAmount; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.lighter.tooltip", "Can light things on Fire"); + private final String mTooltipUses = GTLanguageManager + .addStringLocalization("gt.behaviour.lighter.uses", "Remaining Uses:"); + private final String mTooltipUnstackable = GTLanguageManager + .addStringLocalization("gt.behaviour.unstackable", "Not usable when stacked!"); + + public BehaviourLighter(ItemStack aEmptyLighter, ItemStack aUsedLighter, ItemStack aFullLighter, long aFuelAmount) { + this.mFullLighter = aFullLighter; + this.mUsedLighter = aUsedLighter; + this.mEmptyLighter = aEmptyLighter; + this.mFuelAmount = aFuelAmount; + } + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + if ((aPlayer.worldObj.isRemote) || (aStack.stackSize != 1)) { + return false; + } + boolean rOutput = false; + if ((aEntity instanceof EntityCreeper)) { + prepare(aStack); + long tFuelAmount = GTUtility.ItemNBT.getLighterFuel(aStack); + if (GTUtility.areStacksEqual(aStack, this.mUsedLighter, true)) { + GTUtility.sendSoundToPlayers( + aPlayer.worldObj, + SoundResource.FIRE_IGNITE, + 1.0F, + 1.0F, + MathHelper.floor_double(aEntity.posX), + MathHelper.floor_double(aEntity.posY), + MathHelper.floor_double(aEntity.posZ)); + ((EntityCreeper) aEntity).func_146079_cb(); + if (!aPlayer.capabilities.isCreativeMode) { + tFuelAmount -= 1L; + } + rOutput = true; + } + GTUtility.ItemNBT.setLighterFuel(aStack, tFuelAmount); + if (tFuelAmount <= 0L) { + useUp(aStack); + } + } + return rOutput; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if ((aWorld.isRemote) || (aStack.stackSize != 1)) { + return false; + } + boolean rOutput = false; + + aX += side.offsetX; + aY += side.offsetY; + aZ += side.offsetZ; + if ((!GTUtility.isBlockAir(aWorld, aX, aY, aZ)) + || (!aPlayer.canPlayerEdit(aX, aY, aZ, side.ordinal(), aStack))) { + return false; + } + prepare(aStack); + long tFuelAmount = GTUtility.ItemNBT.getLighterFuel(aStack); + if (GTUtility.areStacksEqual(aStack, this.mUsedLighter, true)) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.FIRE_IGNITE, 1.0F, 1.0F, aX, aY, aZ); + aWorld.setBlock(aX, aY, aZ, Blocks.fire); + if (!aPlayer.capabilities.isCreativeMode) { + tFuelAmount -= 1L; + } + rOutput = true; + } + GTUtility.ItemNBT.setLighterFuel(aStack, tFuelAmount); + if (tFuelAmount <= 0L) { + useUp(aStack); + } + return rOutput; + } + + private void prepare(ItemStack aStack) { + if (GTUtility.areStacksEqual(aStack, this.mFullLighter, true)) { + aStack.func_150996_a(this.mUsedLighter.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mUsedLighter)); + GTUtility.ItemNBT.setLighterFuel(aStack, this.mFuelAmount); + } + } + + private void useUp(ItemStack aStack) { + if (this.mEmptyLighter == null) { + aStack.stackSize -= 1; + } else { + aStack.func_150996_a(this.mEmptyLighter.getItem()); + Items.feather.setDamage(aStack, Items.feather.getDamage(this.mEmptyLighter)); + } + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + NBTTagCompound tNBT = aStack.getTagCompound(); + long tFuelAmount = tNBT == null ? this.mFuelAmount + : GTUtility.areStacksEqual(aStack, this.mFullLighter, true) ? this.mFuelAmount + : tNBT.getLong("GT.LighterFuel"); + aList.add(this.mTooltipUses + " " + tFuelAmount); + aList.add(this.mTooltipUnstackable); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java b/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java new file mode 100644 index 0000000000..f8b5f74b72 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourNone.java @@ -0,0 +1,90 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; + +public class BehaviourNone implements IItemBehaviour { + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + return false; + } + + @Override + public boolean onItemUse(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, + int aZ, int ordinalSide, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + return false; + } + + @Override + public ItemStack onItemRightClick(MetaBaseItem aItem, ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + return aStack; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + return aList; + } + + @Override + public void onUpdate(MetaBaseItem aItem, ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, + boolean aIsInHand) {} + + @Override + public boolean isItemStackUsable(MetaBaseItem aItem, ItemStack aStack) { + return true; + } + + @Override + public boolean canDispense(MetaBaseItem aItem, IBlockSource aSource, ItemStack aStack) { + return false; + } + + @Override + public ItemStack onDispense(MetaBaseItem aItem, IBlockSource aSource, ItemStack aStack) { + EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); + IPosition iposition = BlockDispenser.func_149939_a(aSource); + ItemStack itemstack1 = aStack.splitStack(1); + BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); + return aStack; + } + + @Override + public boolean hasProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack) { + return false; + } + + @Override + public EntityArrow getProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, + double aX, double aY, double aZ) { + return null; + } + + @Override + public EntityArrow getProjectile(MetaBaseItem aItem, SubTag aProjectileType, ItemStack aStack, World aWorld, + EntityLivingBase aEntity, float aSpeed) { + return null; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java new file mode 100644 index 0000000000..910ea2d2d4 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerEssentia.java @@ -0,0 +1,54 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; +import thaumcraft.api.aspects.IEssentiaTransport; + +public class BehaviourPlungerEssentia extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.essentia", "Clears Essentia from Containers and Tubes"); + + public BehaviourPlungerEssentia(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (((aTileEntity instanceof IEssentiaTransport)) + && ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts)))) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { + ((IEssentiaTransport) aTileEntity).takeEssentia( + ((IEssentiaTransport) aTileEntity).getEssentiaType(tDirection), + ((IEssentiaTransport) aTileEntity).getEssentiaAmount(tDirection), + tDirection); + } + return true; + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java new file mode 100644 index 0000000000..b406b27b15 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerFluid.java @@ -0,0 +1,75 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.metatileentity.implementations.MTEBasicTank; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourPlungerFluid extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.fluid", "Clears 1000 Liters of Fluid from Tanks"); + + public BehaviourPlungerFluid(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if ((aTileEntity instanceof IFluidHandler)) { + for (ForgeDirection tDirection : ForgeDirection.VALID_DIRECTIONS) { + if (((IFluidHandler) aTileEntity).drain(tDirection, 1000, false) != null) { + if ((aPlayer.capabilities.isCreativeMode) + || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + ((IFluidHandler) aTileEntity).drain(tDirection, 1000, true); + GTUtility.sendSoundToPlayers( + aWorld, + SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, + 1.0F, + -1.0F, + aX, + aY, + aZ); + return true; + } + } + } + } + if (aTileEntity instanceof IGregTechTileEntity tTileEntity) { + IMetaTileEntity mTileEntity = tTileEntity.getMetaTileEntity(); + if (mTileEntity instanceof MTEBasicTank machine) { + if (machine.mFluid != null && machine.mFluid.amount > 0) + machine.mFluid.amount = machine.mFluid.amount - Math.min(machine.mFluid.amount, 1000); + GTUtility + .sendSoundToPlayers(aWorld, SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, 1.0F, -1.0F, aX, aY, aZ); + return true; + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java new file mode 100644 index 0000000000..c0db5c76b4 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPlungerItem.java @@ -0,0 +1,88 @@ +package gregtech.common.items.behaviors; + +import java.util.HashMap; +import java.util.List; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.metatileentity.IMetaTileEntityItemPipe; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourPlungerItem extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.plunger.item", "Clears Items from Pipes"); + + public BehaviourPlungerItem(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (aTileEntity instanceof IGregTechTileEntity gtTE) { + IMetaTileEntity tMetaTileEntity = gtTE.getMetaTileEntity(); + if ((tMetaTileEntity instanceof IMetaTileEntityItemPipe)) { + for (IMetaTileEntityItemPipe tTileEntity : GTUtility + .sortMapByValuesAcending( + IMetaTileEntityItemPipe.Util + .scanPipes((IMetaTileEntityItemPipe) tMetaTileEntity, new HashMap<>(), 0L, false, true)) + .keySet()) { + int i = 0; + for (int j = tTileEntity.getSizeInventory(); i < j; i++) { + if (tTileEntity.isValidSlot(i)) { + if ((tTileEntity.getStackInSlot(i) != null) && ((aPlayer.capabilities.isCreativeMode) + || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts)))) { + final ItemStack tStack = tTileEntity.decrStackSize(i, 64); + if (tStack != null) { + final EntityItem tEntity = new EntityItem( + aWorld, + gtTE.getOffsetX(side, 1) + 0.5D, + gtTE.getOffsetY(side, 1) + 0.5D, + gtTE.getOffsetZ(side, 1) + 0.5D, + tStack); + tEntity.motionX = 0.0D; + tEntity.motionY = 0.0D; + tEntity.motionZ = 0.0D; + aWorld.spawnEntityInWorld(tEntity); + GTUtility.sendSoundToPlayers( + aWorld, + SoundResource.IC2_TOOLS_RUBBER_TRAMPOLINE, + 1.0F, + -1.0F, + aX, + aY, + aZ); + } + return true; + } + } + } + } + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java b/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java new file mode 100644 index 0000000000..0716ffae7e --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourPrintedPages.java @@ -0,0 +1,39 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTUtility; + +public class BehaviourPrintedPages extends BehaviourNone { + + public static String getTitle(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("title"); + } + + public static String getAuthor(ItemStack aStack) { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) { + return ""; + } + return tNBT.getString("author"); + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + if (GTUtility.isStringValid(getTitle(aStack))) { + aList.add(getTitle(aStack)); + } + if (GTUtility.isStringValid(getAuthor(aStack))) { + aList.add("by " + getAuthor(aStack)); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java b/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java new file mode 100644 index 0000000000..98aed597f9 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourProspecting.java @@ -0,0 +1,158 @@ +package gregtech.common.items.behaviors; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidBlock; + +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.SoundResource; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.objects.ItemData; +import gregtech.api.objects.XSTR; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTModHandler; +import gregtech.api.util.GTOreDictUnificator; +import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockOresAbstract; +import gregtech.common.blocks.TileEntityOres; + +public class BehaviourProspecting extends BehaviourNone { + + private final int mVanillaCosts; + private final int mEUCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.prospecting", "Usable for Prospecting"); + + public BehaviourProspecting(int aVanillaCosts, int aEUCosts) { + this.mVanillaCosts = aVanillaCosts; + this.mEUCosts = aEUCosts; + } + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + if (aWorld.isRemote) { + return false; + } + Block aBlock = aWorld.getBlock(aX, aY, aZ); + if (aBlock == null) { + return false; + } + byte aMeta = (byte) aWorld.getBlockMetadata(aX, aY, aZ); + + ItemData tAssociation = GTOreDictUnificator.getAssociation(new ItemStack(aBlock, 1, aMeta)); + if (tAssociation != null && tAssociation.mPrefix != null + && tAssociation.mMaterial != null + && tAssociation.mPrefix.toString() + .startsWith("ore")) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("100", "This is ") + tAssociation.mMaterial.mMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); + return true; + } + + if (aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.netherrack) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.end_stone) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockStones) + || aBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, GregTechAPI.sBlockGranites) + || aBlock == GregTechAPI.sBlockOresUb1 + || aBlock == GregTechAPI.sBlockOresUb2 + || aBlock == GregTechAPI.sBlockOresUb3 + || aBlock == GregTechAPI.sBlockOres1) { + if (GTModHandler.damageOrDechargeItem(aStack, this.mVanillaCosts, this.mEUCosts, aPlayer)) { + GTUtility.sendSoundToPlayers(aWorld, SoundResource.RANDOM_ANVIL_USE, 1.0F, -1.0F, aX, aY, aZ); + int tMetaID; + int tQuality = aItem instanceof MetaGeneratedTool ? aItem.getHarvestLevel(aStack, "") : 0; + int tX = aX, tY = aY, tZ = aZ; + Block tBlock; + for (int i = 0, j = 6 + tQuality; i < j; i++) { + tX -= side.offsetX; + tY -= side.offsetY; + tZ -= side.offsetZ; + + tBlock = aWorld.getBlock(tX, tY, tZ); + if (tBlock == Blocks.lava || tBlock == Blocks.flowing_lava) { + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("102", "There is Lava behind this Rock.")); + break; + } + if (tBlock instanceof BlockLiquid || tBlock instanceof IFluidBlock) { + GTUtility + .sendChatToPlayer(aPlayer, GTUtility.trans("103", "There is a Liquid behind this Rock.")); + break; + } + if (tBlock == Blocks.monster_egg || !GTUtility.hasBlockHitBox(aWorld, tX, tY, tZ)) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("104", "There is an Air Pocket behind this Rock.")); + break; + } + if (tBlock != aBlock) { + if (i < 4) GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("105", "Material is changing behind this Rock.")); + break; + } + } + + final Random tRandom = new XSTR(aX ^ aY ^ aZ ^ side.ordinal()); + for (int i = 0, j = 9 + 2 * tQuality; i < j; i++) { + tX = aX - 4 - tQuality + tRandom.nextInt(j); + tY = aY - 4 - tQuality + tRandom.nextInt(j); + tZ = aZ - 4 - tQuality + tRandom.nextInt(j); + tBlock = aWorld.getBlock(tX, tY, tZ); + if (tBlock instanceof BlockOresAbstract) { + final TileEntity tTileEntity = aWorld.getTileEntity(tX, tY, tZ); + if (tTileEntity instanceof TileEntityOres) { + final Materials tMaterial = GregTechAPI.sGeneratedMaterials[((TileEntityOres) tTileEntity).mMetaData + % 1000]; + if (tMaterial != null && tMaterial != Materials._NULL) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("106", "Found traces of ") + tMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + return true; + } + } + } else { + tMetaID = aWorld.getBlockMetadata(tX, tY, tZ); + tAssociation = GTOreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID)); + if (tAssociation != null && tAssociation.mPrefix != null + && tAssociation.mMaterial != null + && tAssociation.mPrefix.toString() + .startsWith("ore")) { + GTUtility.sendChatToPlayer( + aPlayer, + GTUtility.trans("106", "Found traces of ") + + tAssociation.mMaterial.mMaterial.mDefaultLocalName + + GTUtility.trans("101", " Ore.")); + return true; + } + } + } + GTUtility.sendChatToPlayer(aPlayer, GTUtility.trans("107", "No Ores found.")); + return true; + } + } + return false; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + aList.add(this.mTooltip); + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java b/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java new file mode 100644 index 0000000000..75e702a3a7 --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourScanner.java @@ -0,0 +1,65 @@ +package gregtech.common.items.behaviors; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.enums.SoundResource; +import gregtech.api.interfaces.IItemBehaviour; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.util.GTLanguageManager; +import gregtech.api.util.GTUtility; + +public class BehaviourScanner extends BehaviourNone { + + public static final IItemBehaviour INSTANCE = new BehaviourScanner(); + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.scanning", "Can scan Blocks in World"); + + @Override + public boolean onItemUseFirst(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, + int aY, int aZ, ForgeDirection side, float hitX, float hitY, float hitZ) { + final NBTTagCompound tNBT = aStack.getTagCompound(); + if (((aPlayer instanceof EntityPlayerMP)) && (aItem.canUse(aStack, 20000.0D))) { + final ArrayList tList = new ArrayList<>(); + if (aItem.use( + aStack, + GTUtility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ), + aPlayer)) { + final int tList_sS = tList.size(); + tNBT.setInteger("dataLinesCount", tList_sS); + for (int i = 0; i < tList_sS; i++) { + tNBT.setString("dataLines" + i, tList.get(i)); + GTUtility.sendChatToPlayer(aPlayer, tList.get(i)); + } + } + return true; + } + GTUtility.doSoundAtClient(SoundResource.IC2_TOOLS_OD_SCANNER, 1, 1.0F, aX, aY, aZ); + // doGuiAtClient() + return aPlayer instanceof EntityPlayerMP; + } + + @Override + public List getAdditionalToolTips(MetaBaseItem aItem, List aList, ItemStack aStack) { + try { + NBTTagCompound tNBT = aStack.getTagCompound(); + int lines = tNBT.getInteger("dataLinesCount"); + if (lines < 1) throw new Exception(); + aList.add(EnumChatFormatting.BLUE + "Block scan data result:"); + for (int i = 0; i < lines; i++) { + aList.add(EnumChatFormatting.RESET + tNBT.getString("dataLines" + i)); + } + } catch (Exception e) { + aList.add(this.mTooltip); + } + return aList; + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java b/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java new file mode 100644 index 0000000000..9f727dd8cc --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/BehaviourScoop.java @@ -0,0 +1,62 @@ +package gregtech.common.items.behaviors; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import forestry.api.lepidopterology.EnumFlutterType; +import forestry.api.lepidopterology.IButterfly; +import forestry.api.lepidopterology.IEntityButterfly; +import gregtech.api.items.MetaBaseItem; +import gregtech.api.items.MetaGeneratedTool; +import gregtech.api.util.GTLanguageManager; + +public class BehaviourScoop extends BehaviourNone { + + private final int mCosts; + private final String mTooltip = GTLanguageManager + .addStringLocalization("gt.behaviour.scoop", "Catches Butterflies on Leftclick"); + + public BehaviourScoop(int aCosts) { + this.mCosts = aCosts; + } + + @Override + public boolean onLeftClickEntity(MetaBaseItem aItem, ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) { + if ((aEntity instanceof IEntityButterfly)) { + if (aPlayer.worldObj.isRemote) { + return true; + } + if ((aPlayer.capabilities.isCreativeMode) || (((MetaGeneratedTool) aItem).doDamage(aStack, this.mCosts))) { + IButterfly tButterfly = ((IEntityButterfly) aEntity).getButterfly(); + tButterfly.getGenome() + .getPrimary() + .getRoot() + .getBreedingTracker(aEntity.worldObj, aPlayer.getGameProfile()) + .registerCatch(tButterfly); + aPlayer.worldObj.spawnEntityInWorld( + new EntityItem( + aPlayer.worldObj, + aEntity.posX, +