mffs/src/main/java/mffs/item/module/projector/ItemModuleStablize.java

152 lines
6.9 KiB
Java
Raw Normal View History

2022-10-28 16:20:12 +02:00
package mffs.item.module.projector;
import java.util.HashMap;
import java.util.Set;
2023-01-08 16:58:21 +01:00
import calclavia.lib.CalculationHelper;
2022-10-28 16:20:12 +02:00
import mffs.ModularForceFieldSystem;
import mffs.api.Blacklist;
import mffs.api.IProjector;
2023-01-08 16:58:21 +01:00
import mffs.base.PacketFxs;
2022-10-28 16:20:12 +02:00
import mffs.item.module.ItemModule;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidBlock;
import universalelectricity.core.vector.Vector3;
import universalelectricity.core.vector.VectorHelper;
public class ItemModuleStablize extends ItemModule {
private int blockCount;
public ItemModuleStablize() {
super("moduleStabilize");
this.blockCount = 0;
this.setMaxStackSize(1);
this.setCost(20.0f);
}
@Override
2023-01-08 16:58:21 +01:00
public boolean onProject(final IProjector projector, final Set<Vector3> fields) {
2022-10-28 16:20:12 +02:00
this.blockCount = 0;
return false;
}
@Override
public int onProject(final IProjector projector, final Vector3 position) {
int[] blockInfo = null;
if (projector.getTicks() % 40L == 0L) {
if (projector.getMode() instanceof ItemModeCustom) {
2023-01-08 16:58:21 +01:00
final HashMap<Vector3, int[]> fieldBlocks
= ((ItemModeCustom) projector.getMode())
.getFieldBlockMap(projector, projector.getModeStack());
final Vector3 fieldCenter
= new Vector3((TileEntity) projector).add(projector.getTranslation());
2022-10-28 16:20:12 +02:00
final Vector3 relativePosition = position.clone().subtract(fieldCenter);
2023-01-08 16:58:21 +01:00
CalculationHelper.rotateByAngle(
relativePosition,
-projector.getRotationYaw(),
-projector.getRotationPitch()
);
2022-10-28 16:20:12 +02:00
blockInfo = fieldBlocks.get(relativePosition.round());
}
for (int dir = 0; dir < 6; ++dir) {
final ForgeDirection direction = ForgeDirection.getOrientation(dir);
final TileEntity tileEntity = VectorHelper.getTileEntityFromSide(
2023-01-08 16:58:21 +01:00
((TileEntity) projector).getWorldObj(),
new Vector3((TileEntity) projector),
direction
);
2022-10-28 16:20:12 +02:00
if (tileEntity instanceof IInventory) {
final IInventory inventory = (IInventory) tileEntity;
for (int i = 0; i < inventory.getSizeInventory(); ++i) {
final ItemStack checkStack = inventory.getStackInSlot(i);
2023-01-08 16:58:21 +01:00
if (checkStack != null
&& checkStack.getItem() instanceof ItemBlock) {
2022-10-28 16:20:12 +02:00
if (blockInfo != null) {
2023-01-08 16:58:21 +01:00
if (Block.getBlockById(blockInfo[0])
!= Block.getBlockFromItem((ItemBlock
) checkStack.getItem())) {
2022-10-28 16:20:12 +02:00
continue;
}
}
try {
if (((TileEntity) projector)
.getWorldObj()
.canPlaceEntityOnSide(
2023-01-08 16:58:21 +01:00
Block.getBlockFromItem((ItemBlock
) checkStack.getItem()),
position.intX(),
position.intY(),
position.intZ(),
false,
0,
(Entity) null,
checkStack
)) {
2022-10-28 16:20:12 +02:00
final int metadata = (blockInfo != null)
2023-01-08 16:58:21 +01:00
? blockInfo[1]
: (checkStack.getHasSubtypes()
? checkStack.getItemDamage()
: 0);
2022-10-28 16:20:12 +02:00
final Block block = (blockInfo != null)
2023-01-08 16:58:21 +01:00
? Block.getBlockById(blockInfo[0])
: null;
if (Blacklist.stabilizationBlacklist.contains(block)
|| block instanceof IFluidBlock) {
2022-10-28 16:20:12 +02:00
return 1;
}
((ItemBlock) checkStack.getItem())
2023-01-08 16:58:21 +01:00
.placeBlockAt(
checkStack,
(EntityPlayer) null,
((TileEntity) projector).getWorldObj(),
position.intX(),
position.intY(),
position.intZ(),
0,
0.0f,
0.0f,
0.0f,
metadata
);
2022-10-28 16:20:12 +02:00
inventory.decrStackSize(i, 1);
NBTTagCompound fxsData = new NBTTagCompound();
position.writeToNBT(fxsData);
fxsData.setInteger("type", 1);
2023-01-08 16:58:21 +01:00
ModularForceFieldSystem.channel.sendToAll(
new PacketFxs(
new Vector3((TileEntity) projector), fxsData
)
);
2022-10-28 16:20:12 +02:00
2023-01-08 16:58:21 +01:00
if (this.blockCount++
>= projector.getModuleCount(
ModularForceFieldSystem.itemModuleSpeed,
new int[0]
) / 3) {
2022-10-28 16:20:12 +02:00
return 2;
}
return 1;
}
} catch (final Exception e) {
e.printStackTrace();
}
}
}
}
}
}
return 1;
}
}