Hbm-s-Nuclear-Tech-GIT/src/main/java/com/hbm/tileentity/deco/TileEntityTrappedBrick.java
2021-05-19 11:36:32 +02:00

183 lines
5.4 KiB
Java

package com.hbm.tileentity.deco;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.TrappedBrick.Trap;
import com.hbm.entity.projectile.EntityBulletBase;
import com.hbm.entity.projectile.EntityRubble;
import com.hbm.handler.BulletConfigSyncingUtil;
import com.hbm.items.ModItems;
import net.minecraft.entity.monster.EntityCaveSpider;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityTrappedBrick extends TileEntity {
AxisAlignedBB detector = null;
ForgeDirection dir = ForgeDirection.UNKNOWN;
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
if(detector == null) {
setDetector();
}
List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, detector);
if(!players.isEmpty())
trigger();
}
}
@SuppressWarnings("incomplete-switch")
private void trigger() {
Trap trap = Trap.get(this.getBlockMetadata());
switch(trap) {
case FALLING_ROCKS:
for(int x = 0; x < 3; x++) {
for(int z = 0; z < 3; z++) {
EntityRubble rubble = new EntityRubble(worldObj, xCoord - 0.5 + x, yCoord - 0.5, zCoord - 0.5 + z);
rubble.setMetaBasedOnBlock(ModBlocks.reinforced_stone, 0);
worldObj.spawnEntityInWorld(rubble);
}
}
break;
case ARROW:
EntityArrow arrow = new EntityArrow(worldObj);
arrow.setPosition(xCoord + 0.5 + dir.offsetX, yCoord + 0.5, zCoord + 0.5 + dir.offsetZ);
arrow.motionX = dir.offsetX;
arrow.motionZ = dir.offsetZ;
worldObj.spawnEntityInWorld(arrow);
break;
case FLAMING_ARROW:
EntityArrow farrow = new EntityArrow(worldObj);
farrow.setPosition(xCoord + 0.5 + dir.offsetX, yCoord + 0.5, zCoord + 0.5 + dir.offsetZ);
farrow.motionX = dir.offsetX;
farrow.motionZ = dir.offsetZ;
farrow.setFire(60);
worldObj.spawnEntityInWorld(farrow);
break;
case PILLAR:
for(int i = 0; i < 3; i++)
worldObj.setBlock(xCoord, yCoord - 1 - i, zCoord, ModBlocks.concrete_pillar);
break;
case POISON_DART:
EntityBulletBase dart = new EntityBulletBase(worldObj, BulletConfigSyncingUtil.G20_CAUSTIC);
dart.setPosition(xCoord + 0.5 + dir.offsetX, yCoord + 0.5, zCoord + 0.5 + dir.offsetZ);
dart.motionX = dir.offsetX;
dart.motionZ = dir.offsetZ;
worldObj.spawnEntityInWorld(dart);
break;
case ZOMBIE:
EntityZombie zombie = new EntityZombie(worldObj);
zombie.setPosition(xCoord + 0.5, yCoord + 1, zCoord + 0.5);
switch(worldObj.rand.nextInt(3)) {
case 0: zombie.setCurrentItemOrArmor(0, new ItemStack(ModItems.chernobylsign)); break;
case 1: zombie.setCurrentItemOrArmor(0, new ItemStack(ModItems.cobalt_sword)); break;
case 2: zombie.setCurrentItemOrArmor(0, new ItemStack(ModItems.cmb_hoe)); break;
}
zombie.setEquipmentDropChance(0, 1.0F);
worldObj.spawnEntityInWorld(zombie);
break;
case SPIDERS:
for(int i = 0; i < 3; i++) {
EntityCaveSpider spider = new EntityCaveSpider(worldObj);
spider.setPosition(xCoord + 0.5, yCoord - 1, zCoord + 0.5);
worldObj.spawnEntityInWorld(spider);
}
break;
}
worldObj.playSoundEffect(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, "random.click", 0.3F, 0.6F);
worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.brick_jungle);
}
@SuppressWarnings("incomplete-switch")
private void setDetector() {
Trap trap = Trap.get(this.getBlockMetadata());
switch(trap) {
case FALLING_ROCKS:
detector = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord - 3, zCoord - 1, xCoord + 2, yCoord, zCoord + 2);
return;
case PILLAR:
detector = AxisAlignedBB.getBoundingBox(xCoord + 0.2, yCoord - 3, zCoord + 0.2, xCoord + 0.8, yCoord, zCoord + 0.8);
return;
case ARROW:
case FLAMING_ARROW:
case POISON_DART:
setDetectorDirectional();
return;
case ZOMBIE:
detector = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord + 1, zCoord - 1, xCoord + 2, yCoord + 2, zCoord + 2);
return;
case SPIDERS:
detector = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord - 3, zCoord - 1, xCoord + 2, yCoord, zCoord + 2);
return;
}
detector = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
}
private void setDetectorDirectional() {
List<ForgeDirection> dirs = new ArrayList() {{
add(ForgeDirection.NORTH);
add(ForgeDirection.SOUTH);
add(ForgeDirection.EAST);
add(ForgeDirection.WEST);
}};
Collections.shuffle(dirs);
for(ForgeDirection dir : dirs) {
if(worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ) == Blocks.air) {
double minX = xCoord + 0.4;
double minY = yCoord + 0.4;
double minZ = zCoord + 0.4;
double maxX = xCoord + 0.6;
double maxY = yCoord + 0.6;
double maxZ = zCoord + 0.6;
if(dir.offsetX > 0)
maxX += 3;
else if(dir.offsetX < 0)
minX -= 3;
if(dir.offsetZ > 0)
maxZ += 3;
else if(dir.offsetZ < 0)
minZ -= 3;
detector = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ);
this.dir = dir;
return;
}
}
detector = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
}
}