aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java')
-rw-r--r--src/main/java/gregtech/common/items/behaviors/BehaviourCoverTool.java193
1 files changed, 193 insertions, 0 deletions
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<MetaBaseItem> 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<String> 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<String> getAdditionalToolTips(MetaBaseItem aItem, List<String> 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;
+ }
+}