From 81b12722f9f5a07f8267b6e30a975b95faa0030a Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 18 Nov 2023 23:29:49 +0100 Subject: [PATCH] missile rewrite, terrain scan radar --- .../api/hbm/entity/IRadarDetectableNT.java | 15 + .../java/com/hbm/blocks/bomb/LaunchPad.java | 5 + .../blocks/machine/MachineBigAssTank9000.java | 1 - .../com/hbm/blocks/machine/MachineOrbus.java | 1 - .../com/hbm/blocks/machine/MachineRadar.java | 49 ++- .../java/com/hbm/blocks/machine/NTMAnvil.java | 13 +- .../hbm/blocks/network/FluidDuctStandard.java | 2 - .../java/com/hbm/entity/EntityMappings.java | 5 + .../missile/EntityMissileAntiBallistic.java | 4 +- .../entity/missile/EntityMissileBHole.java | 59 ---- .../missile/EntityMissileBaseAdvanced.java | 289 ------------------ .../entity/missile/EntityMissileBaseNT.java | 270 ++++++++++++++++ .../missile/EntityMissileBunkerBuster.java | 55 ---- .../entity/missile/EntityMissileBurst.java | 50 --- .../missile/EntityMissileBusterStrong.java | 54 ---- .../entity/missile/EntityMissileCluster.java | 54 ---- .../missile/EntityMissileClusterStrong.java | 55 ---- .../entity/missile/EntityMissileDoomsday.java | 2 +- .../entity/missile/EntityMissileDrill.java | 58 ---- .../hbm/entity/missile/EntityMissileEMP.java | 59 ---- .../missile/EntityMissileEMPStrong.java | 54 ---- .../hbm/entity/missile/EntityMissileEndo.java | 51 ---- .../hbm/entity/missile/EntityMissileExo.java | 51 ---- .../entity/missile/EntityMissileGeneric.java | 190 ------------ .../missile/EntityMissileIncendiary.java | 47 --- .../EntityMissileIncendiaryStrong.java | 50 --- .../entity/missile/EntityMissileInferno.java | 51 ---- .../entity/missile/EntityMissileMicro.java | 52 ---- .../hbm/entity/missile/EntityMissileMirv.java | 53 ---- .../entity/missile/EntityMissileNuclear.java | 53 ---- .../hbm/entity/missile/EntityMissileRain.java | 55 ---- .../missile/EntityMissileSchrabidium.java | 62 ---- .../entity/missile/EntityMissileShuttle.java | 2 +- .../entity/missile/EntityMissileStrong.java | 48 --- .../entity/missile/EntityMissileTaint.java | 58 ---- .../entity/missile/EntityMissileTier0.java | 108 +++++++ .../entity/missile/EntityMissileTier1.java | 68 +++++ .../entity/missile/EntityMissileTier2.java | 88 ++++++ .../entity/missile/EntityMissileTier3.java | 125 ++++++++ .../entity/missile/EntityMissileTier4.java | 76 +++++ .../entity/missile/EntityMissileVolcano.java | 61 ---- .../entity/projectile/EntityThrowableNT.java | 6 +- .../hbm/inventory/gui/GUIMachineRadarNT.java | 164 +++++++++- .../com/hbm/items/armor/JetpackBooster.java | 1 - src/main/java/com/hbm/items/bomb/ItemN2.java | 7 +- .../java/com/hbm/items/tool/ItemWandD.java | 2 - .../com/hbm/items/tool/WeaponSpecial.java | 1 - src/main/java/com/hbm/main/ClientProxy.java | 7 +- .../java/com/hbm/main/ModEventHandler.java | 10 +- src/main/java/com/hbm/packet/BufPacket.java | 6 + .../entity/rocket/RenderMissileGeneric.java | 5 +- .../entity/rocket/RenderMissileHuge.java | 5 +- .../entity/rocket/RenderMissileNuclear.java | 2 +- .../entity/rocket/RenderMissileStrong.java | 6 +- .../entity/rocket/RenderMissileTaint.java | 5 +- .../entity/rocket/RenderMissileThermo.java | 3 +- .../hbm/render/tileentity/RenderRadar.java | 7 +- .../java/com/hbm/tileentity/TileMappings.java | 2 +- .../machine/TileEntityMachineRadarNT.java | 227 +++++++++++--- .../turret/TileEntityTurretBaseNT.java | 4 +- .../hbm/textures/gui/machine/gui_radar_nt.png | Bin 21661 -> 19931 bytes 61 files changed, 1171 insertions(+), 1802 deletions(-) delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBHole.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBaseAdvanced.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBunkerBuster.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBurst.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileBusterStrong.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileCluster.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileClusterStrong.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileDrill.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileEMP.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileEMPStrong.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileEndo.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileExo.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileGeneric.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileIncendiary.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileIncendiaryStrong.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileInferno.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileMicro.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileMirv.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileNuclear.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileRain.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileSchrabidium.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileStrong.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTaint.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTier0.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTier1.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTier2.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTier3.java create mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileTier4.java delete mode 100644 src/main/java/com/hbm/entity/missile/EntityMissileVolcano.java diff --git a/src/main/java/api/hbm/entity/IRadarDetectableNT.java b/src/main/java/api/hbm/entity/IRadarDetectableNT.java index 83c4bf503..19b3f85bf 100644 --- a/src/main/java/api/hbm/entity/IRadarDetectableNT.java +++ b/src/main/java/api/hbm/entity/IRadarDetectableNT.java @@ -19,4 +19,19 @@ public interface IRadarDetectableNT { public String getUnlocalizedName(); public int getBlipLevel(); public boolean canBeSeenBy(Object radar); + public boolean paramsApplicable(RadarScanParams params); + + public static class RadarScanParams { + public boolean scanMissiles = true; + public boolean scanShells = true; + public boolean scanPlayers = true; + public boolean smartMode = true; + + public RadarScanParams(boolean m, boolean s, boolean p, boolean smart) { + this.scanMissiles = m; + this.scanShells = s; + this.scanPlayers = p; + this.smartMode = smart; + } + } } diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java index 675fbfd38..79725a555 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java @@ -7,6 +7,11 @@ import org.apache.logging.log4j.Level; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; import com.hbm.entity.missile.*; +import com.hbm.entity.missile.EntityMissileTier0.*; +import com.hbm.entity.missile.EntityMissileTier1.*; +import com.hbm.entity.missile.EntityMissileTier2.*; +import com.hbm.entity.missile.EntityMissileTier3.*; +import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.interfaces.IBomb; import com.hbm.interfaces.Spaghetti; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java index e0a494ede..300f9b019 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java +++ b/src/main/java/com/hbm/blocks/machine/MachineBigAssTank9000.java @@ -14,7 +14,6 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.storage.TileEntityMachineBAT9000; -import com.hbm.tileentity.machine.storage.TileEntityMachineOrbus; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; diff --git a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java index 902c24672..445956358 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineOrbus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineOrbus.java @@ -12,7 +12,6 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityProxyCombo; -import com.hbm.tileentity.machine.storage.TileEntityMachineFluidTank; import com.hbm.tileentity.machine.storage.TileEntityMachineOrbus; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; diff --git a/src/main/java/com/hbm/blocks/machine/MachineRadar.java b/src/main/java/com/hbm/blocks/machine/MachineRadar.java index 9a7ccb8f6..beaf39189 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRadar.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRadar.java @@ -1,8 +1,7 @@ package com.hbm.blocks.machine; -import com.hbm.config.WeaponConfig; import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityMachineRadar; +import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.BlockContainer; @@ -10,6 +9,8 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -21,7 +22,7 @@ public class MachineRadar extends BlockContainer { @Override public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineRadar(); + return new TileEntityMachineRadarNT(); } @Override @@ -42,41 +43,35 @@ public class MachineRadar extends BlockContainer { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(y < WeaponConfig.radarAltitude) { + if(y < TileEntityMachineRadarNT.radarAltitude) { if(world.isRemote) - player.addChatMessage(new ChatComponentText("[Radar] Error: Radar altitude not sufficient.")); + player.addChatMessage(new ChatComponentText("[Radar] Error: Radar altitude not sufficient.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); return true; } - if(world.isRemote) - { + if(world.isRemote) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; - } else if(!player.isSneaking()) - { - TileEntityMachineRadar entity = (TileEntityMachineRadar) world.getTileEntity(x, y, z); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } + } else if(!player.isSneaking()) { return true; } else { return false; } } - public boolean canProvidePower() - { - return true; - } + @Override + public boolean canProvidePower() { + return true; + } - public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int m) - { - TileEntityMachineRadar entity = (TileEntityMachineRadar) world.getTileEntity(x, y, z); - return entity.getRedPower(); - } + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int m) { + TileEntityMachineRadarNT entity = (TileEntityMachineRadarNT) world.getTileEntity(x, y, z); + return entity.getRedPower(); + } - public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int m) - { - return isProvidingWeakPower(world, x, y, z, m); - } + @Override + public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int m) { + return isProvidingWeakPower(world, x, y, z, m); + } } diff --git a/src/main/java/com/hbm/blocks/machine/NTMAnvil.java b/src/main/java/com/hbm/blocks/machine/NTMAnvil.java index 5a73eb253..c71865430 100644 --- a/src/main/java/com/hbm/blocks/machine/NTMAnvil.java +++ b/src/main/java/com/hbm/blocks/machine/NTMAnvil.java @@ -197,17 +197,10 @@ public class NTMAnvil extends BlockFallingNT implements ITooltipProvider, IGUIPr @SideOnly(Side.CLIENT) public void overrideRenderer(EntityFallingBlockNT falling, RenderBlocks renderBlocks, Tessellator tessellator) { - World world = falling.worldObj; float rotation = 0; - - if(falling.getMeta() == 2) - rotation = 90F / 180F * (float) Math.PI; - - if(falling.getMeta() == 3) - rotation = 270F / 180F * (float) Math.PI; - - if(falling.getMeta() == 4) - rotation = 180F / 180F * (float)Math.PI; + if(falling.getMeta() == 2) rotation = 90F / 180F * (float) Math.PI; + if(falling.getMeta() == 3) rotation = 270F / 180F * (float) Math.PI; + if(falling.getMeta() == 4) rotation = 180F / 180F * (float)Math.PI; tessellator.addTranslation(0F, -0.5F, 0F); ObjUtil.renderPartWithIcon((WavefrontObject) ResourceManager.anvil, "Top", getIcon(1, 0), tessellator, rotation, true); diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java b/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java index 7a6ab966b..e58d7ab02 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctStandard.java @@ -5,7 +5,6 @@ import java.util.List; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ILookOverlay; -import com.hbm.blocks.ModBlocks; import com.hbm.blocks.test.TestPipe; import com.hbm.inventory.fluid.FluidType; import com.hbm.items.ModItems; @@ -16,7 +15,6 @@ import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index c0e61d016..cf6c7e0d1 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -9,6 +9,11 @@ import com.hbm.entity.grenade.*; import com.hbm.entity.item.*; import com.hbm.entity.logic.*; import com.hbm.entity.missile.*; +import com.hbm.entity.missile.EntityMissileTier0.*; +import com.hbm.entity.missile.EntityMissileTier1.*; +import com.hbm.entity.missile.EntityMissileTier2.*; +import com.hbm.entity.missile.EntityMissileTier3.*; +import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.entity.mob.*; import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.siege.*; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java index b350038be..5d6e40d2a 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileAntiBallistic.java @@ -58,7 +58,7 @@ public class EntityMissileAntiBallistic extends Entity implements IRadarDetectab List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, AxisAlignedBB.getBoundingBox(posX - 5, posY - 5, posZ - 5, posX + 5, posY + 5, posZ + 5)); for(Entity e : list) { - if(e instanceof EntityMissileBaseAdvanced || e instanceof EntityMissileCustom) { + if(e instanceof EntityMissileBaseNT || e instanceof EntityMissileCustom) { ExplosionLarge.explode(worldObj, posX, posY, posZ, 15F, true, false, true); this.setDead(); return; @@ -110,7 +110,7 @@ public class EntityMissileAntiBallistic extends Entity implements IRadarDetectab double closest = 1000D; for(Entity e : list) { - if(e instanceof EntityMissileBaseAdvanced || e instanceof EntityMissileCustom) { + if(e instanceof EntityMissileBaseNT || e instanceof EntityMissileCustom) { double dis = Math.sqrt(Math.pow(e.posX - posX, 2) + Math.pow(e.posY - posY, 2) + Math.pow(e.posZ - posZ, 2)); if(dis < closest) { diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBHole.java b/src/main/java/com/hbm/entity/missile/EntityMissileBHole.java deleted file mode 100644 index dcc595d05..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBHole.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.entity.effect.EntityBlackHole; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileBHole extends EntityMissileBaseAdvanced { - - public EntityMissileBHole(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileBHole(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - if (!this.worldObj.isRemote) - { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 1.5F, true); - - EntityBlackHole bl = new EntityBlackHole(this.worldObj, 1.5F); - bl.posX = this.posX; - bl.posY = this.posY; - bl.posZ = this.posZ; - this.worldObj.spawnEntityInWorld(bl); - } - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.wire_aluminium, 4)); - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); - list.add(new ItemStack(ModItems.ducttape, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.grenade_black_hole, 1); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER0; - } - -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseAdvanced.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseAdvanced.java deleted file mode 100644 index 69d128a51..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBaseAdvanced.java +++ /dev/null @@ -1,289 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.entity.logic.IChunkLoader; -import com.hbm.explosion.ExplosionLarge; -import com.hbm.main.MainRegistry; -import com.hbm.packet.AuxParticlePacket; -import com.hbm.packet.PacketDispatcher; - -import api.hbm.entity.IRadarDetectable; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.Ticket; -import net.minecraftforge.common.ForgeChunkManager.Type; - -public abstract class EntityMissileBaseAdvanced extends Entity implements IChunkLoader, IRadarDetectable { - - int startX; - int startZ; - int targetX; - int targetZ; - public int velocity; - double decelY; - double accelXZ; - boolean isCluster = false; - private Ticket loaderTicket; - public int health = 50; - - public EntityMissileBaseAdvanced(World p_i1582_1_) { - super(p_i1582_1_); - this.ignoreFrustumCheck = true; - startX = (int) posX; - startZ = (int) posZ; - targetX = (int) posX; - targetZ = (int) posZ; - } - - public boolean canBeCollidedWith() { - return true; - } - - public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { - if(this.isEntityInvulnerable()) { - return false; - } else { - if(!this.isDead && !this.worldObj.isRemote) { - health -= p_70097_2_; - - if(this.health <= 0) { - this.setDead(); - this.killMissile(); - } - } - - return true; - } - } - - private void killMissile() { - ExplosionLarge.explode(worldObj, posX, posY, posZ, 5, true, false, true); - ExplosionLarge.spawnShrapnelShower(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 15, 0.075); - ExplosionLarge.spawnMissileDebris(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 0.25, getDebris(), getDebrisRareDrop()); - } - - public EntityMissileBaseAdvanced(World world, float x, float y, float z, int a, int b) { - super(world); - this.ignoreFrustumCheck = true; - this.setLocationAndAngles(x, y, z, 0, 0); - startX = (int) x; - startZ = (int) z; - targetX = a; - targetZ = b; - this.motionY = 2; - - Vec3 vector = Vec3.createVectorHelper(targetX - startX, 0, targetZ - startZ); - accelXZ = decelY = 1 / vector.lengthVector(); - decelY *= 2; - - velocity = 1; - - this.setSize(1.5F, 1.5F); - } - - @Override - protected void entityInit() { - init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); - this.dataWatcher.addObject(8, Integer.valueOf(this.health)); - } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbt) { - motionX = nbt.getDouble("moX"); - motionY = nbt.getDouble("moY"); - motionZ = nbt.getDouble("moZ"); - posX = nbt.getDouble("poX"); - posY = nbt.getDouble("poY"); - posZ = nbt.getDouble("poZ"); - decelY = nbt.getDouble("decel"); - accelXZ = nbt.getDouble("accel"); - targetX = nbt.getInteger("tX"); - targetZ = nbt.getInteger("tZ"); - startX = nbt.getInteger("sX"); - startZ = nbt.getInteger("sZ"); - velocity = nbt.getInteger("veloc"); - } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbt) { - nbt.setDouble("moX", motionX); - nbt.setDouble("moY", motionY); - nbt.setDouble("moZ", motionZ); - nbt.setDouble("poX", posX); - nbt.setDouble("poY", posY); - nbt.setDouble("poZ", posZ); - nbt.setDouble("decel", decelY); - nbt.setDouble("accel", accelXZ); - nbt.setInteger("tX", targetX); - nbt.setInteger("tZ", targetZ); - nbt.setInteger("sX", startX); - nbt.setInteger("sZ", startZ); - nbt.setInteger("veloc", velocity); - } - - protected void rotation() { - float f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); - - for (this.rotationPitch = (float)(Math.atan2(this.motionY, f2) * 180.0D / Math.PI) - 90; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) - { - ; - } - - while (this.rotationPitch - this.prevRotationPitch >= 180.0F) - { - this.prevRotationPitch += 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw < -180.0F) - { - this.prevRotationYaw -= 360.0F; - } - - while (this.rotationYaw - this.prevRotationYaw >= 180.0F) - { - this.prevRotationYaw += 360.0F; - } - } - - @Override - public void onUpdate() { - - if(velocity < 1) - velocity = 1; - if(this.ticksExisted > 40) - velocity = 3; - else if(this.ticksExisted > 20) - velocity = 2; - - this.dataWatcher.updateObject(8, Integer.valueOf(this.health)); - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - //TODO: instead of crappy skipping, implement a hitscan - for(int i = 0; i < velocity; i++) { - //this.posX += this.motionX; - //this.posY += this.motionY; - //this.posZ += this.motionZ; - this.setLocationAndAngles(posX + this.motionX, posY + this.motionY, posZ + this.motionZ, 0, 0); - - this.rotation(); - - this.motionY -= decelY; - - Vec3 vector = Vec3.createVectorHelper(targetX - startX, 0, targetZ - startZ); - vector = vector.normalize(); - vector.xCoord *= accelXZ; - vector.zCoord *= accelXZ; - - if(motionY > 0) { - motionX += vector.xCoord; - motionZ += vector.zCoord; - } - - if(motionY < 0) { - motionX -= vector.xCoord; - motionZ -= vector.zCoord; - } - - if(!this.worldObj.isRemote) - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacket(posX, posY, posZ, 2), - new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 300)); - - if(this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.air && - this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.water && - this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.flowing_water) { - - if(!this.worldObj.isRemote) { - onImpact(); - } - this.killAndClear(); - return; - } - - loadNeighboringChunks((int) (posX / 16), (int) (posZ / 16)); - - if(motionY < -1 && this.isCluster && !worldObj.isRemote) { - cluster(); - this.setDead(); - return; - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public boolean isInRangeToRenderDist(double distance) { - return true; - } - - public abstract void onImpact(); - - public abstract List getDebris(); - - public abstract ItemStack getDebrisRareDrop(); - - public void cluster() { } - - public void init(Ticket ticket) { - if(!worldObj.isRemote) { - - if(ticket != null) { - - if(loaderTicket == null) { - - loaderTicket = ticket; - loaderTicket.bindEntity(this); - loaderTicket.getModData(); - } - - ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); - } - } - } - - List loadedChunks = new ArrayList(); - - public void loadNeighboringChunks(int newChunkX, int newChunkZ) { - if(!worldObj.isRemote && loaderTicket != null) { - - clearChunkLoader(); - - loadedChunks.clear(); - loadedChunks.add(new ChunkCoordIntPair(newChunkX, newChunkZ)); - loadedChunks.add(new ChunkCoordIntPair(newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D), newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D))); - - for(ChunkCoordIntPair chunk : loadedChunks) { - ForgeChunkManager.forceChunk(loaderTicket, chunk); - } - } - } - - public void killAndClear() { - this.setDead(); - this.clearChunkLoader(); - } - - public void clearChunkLoader() { - if(!worldObj.isRemote && loaderTicket != null) { - for(ChunkCoordIntPair chunk : loadedChunks) { - ForgeChunkManager.unforceChunk(loaderTicket, chunk); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java new file mode 100644 index 000000000..766950a91 --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java @@ -0,0 +1,270 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.entity.logic.IChunkLoader; +import com.hbm.entity.projectile.EntityThrowableInterp; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.main.MainRegistry; + +import api.hbm.entity.IRadarDetectable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; + +public abstract class EntityMissileBaseNT extends EntityThrowableInterp implements IChunkLoader, IRadarDetectable { + + public int startX; + public int startZ; + public int targetX; + public int targetZ; + public double velocity; + public double decelY; + public double accelXZ; + public boolean isCluster = false; + private Ticket loaderTicket; + public int health = 50; + + public EntityMissileBaseNT(World world) { + super(world); + this.ignoreFrustumCheck = true; + startX = (int) posX; + startZ = (int) posZ; + targetX = (int) posX; + targetZ = (int) posZ; + } + + public EntityMissileBaseNT(World world, float x, float y, float z, int a, int b) { + super(world); + this.ignoreFrustumCheck = true; + this.setLocationAndAngles(x, y, z, 0, 0); + startX = (int) x; + startZ = (int) z; + targetX = a; + targetZ = b; + this.motionY = 2; + + Vec3 vector = Vec3.createVectorHelper(targetX - startX, 0, targetZ - startZ); + accelXZ = decelY = 1 / vector.lengthVector(); + decelY *= 2; + velocity = 0; + + this.setSize(1.5F, 1.5F); + } + + @Override + protected void entityInit() { + init(ForgeChunkManager.requestTicket(MainRegistry.instance, worldObj, Type.ENTITY)); + this.dataWatcher.addObject(8, Integer.valueOf(this.health)); + } + + @Override + protected double motionMult() { + return velocity; + } + + @Override + public boolean doesImpactEntities() { + return false; + } + + @Override + public void onUpdate() { + super.onUpdate(); + + if(velocity < 4) velocity += 0.025; + + if(!worldObj.isRemote) { + + this.motionY -= decelY * velocity; + + Vec3 vector = Vec3.createVectorHelper(targetX - startX, 0, targetZ - startZ); + vector = vector.normalize(); + vector.xCoord *= accelXZ; + vector.zCoord *= accelXZ; + + if(motionY > 0) { + motionX += vector.xCoord * velocity; + motionZ += vector.zCoord * velocity; + } + + if(motionY < 0) { + motionX -= vector.xCoord * velocity; + motionZ -= vector.zCoord * velocity; + } + + if(motionY < -velocity && this.isCluster) { + cluster(); + this.setDead(); + return; + } + + loadNeighboringChunks((int) Math.floor(posX / 16), (int) Math.floor(posZ / 16)); + } else { + Vec3 vec = Vec3.createVectorHelper(motionX, motionY, motionZ).normalize(); + MainRegistry.proxy.particleControl(posX - vec.xCoord, posY - vec.yCoord, posZ - vec.zCoord, 2); + } + + float f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + for(this.rotationPitch = (float) (Math.atan2(this.motionY, f2) * 180.0D / Math.PI) - 90; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F); + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) this.prevRotationPitch += 360.0F; + while(this.rotationYaw - this.prevRotationYaw < -180.0F) this.prevRotationYaw -= 360.0F; + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) this.prevRotationYaw += 360.0F; + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + motionX = nbt.getDouble("moX"); + motionY = nbt.getDouble("moY"); + motionZ = nbt.getDouble("moZ"); + posX = nbt.getDouble("poX"); + posY = nbt.getDouble("poY"); + posZ = nbt.getDouble("poZ"); + decelY = nbt.getDouble("decel"); + accelXZ = nbt.getDouble("accel"); + targetX = nbt.getInteger("tX"); + targetZ = nbt.getInteger("tZ"); + startX = nbt.getInteger("sX"); + startZ = nbt.getInteger("sZ"); + velocity = nbt.getDouble("veloc"); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setDouble("moX", motionX); + nbt.setDouble("moY", motionY); + nbt.setDouble("moZ", motionZ); + nbt.setDouble("poX", posX); + nbt.setDouble("poY", posY); + nbt.setDouble("poZ", posZ); + nbt.setDouble("decel", decelY); + nbt.setDouble("accel", accelXZ); + nbt.setInteger("tX", targetX); + nbt.setInteger("tZ", targetZ); + nbt.setInteger("sX", startX); + nbt.setInteger("sZ", startZ); + nbt.setDouble("veloc", velocity); + } + + public boolean canBeCollidedWith() { + return true; + } + + public boolean attackEntityFrom(DamageSource source, float amount) { + if(this.isEntityInvulnerable()) { + return false; + } else { + if(!this.isDead && !this.worldObj.isRemote) { + health -= amount; + + if(this.health <= 0) { + this.killMissile(); + } + } + + return true; + } + } + + private void killMissile() { + ExplosionLarge.explode(worldObj, posX, posY, posZ, 5, true, false, true); + ExplosionLarge.spawnShrapnelShower(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 15, 0.075); + ExplosionLarge.spawnMissileDebris(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 0.25, getDebris(), getDebrisRareDrop()); + this.killAndClear(); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + this.onImpact(); + this.killAndClear(); + } + } + + public abstract void onImpact(); + public abstract List getDebris(); + public abstract ItemStack getDebrisRareDrop(); + public void cluster() { } + + @Override + public double getGravityVelocity() { + return 0.0D; + } + + @Override + protected float getAirDrag() { + return 1F; + } + + @Override + protected float getWaterDrag() { + return 1F; + } + + public void init(Ticket ticket) { + if(!worldObj.isRemote) { + + if(ticket != null) { + + if(loaderTicket == null) { + + loaderTicket = ticket; + loaderTicket.bindEntity(this); + loaderTicket.getModData(); + } + + ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); + } + } + } + + List loadedChunks = new ArrayList(); + + public void loadNeighboringChunks(int newChunkX, int newChunkZ) { + if(!worldObj.isRemote && loaderTicket != null) { + + clearChunkLoader(); + + loadedChunks.clear(); + loadedChunks.add(new ChunkCoordIntPair(newChunkX, newChunkZ)); + loadedChunks.add(new ChunkCoordIntPair(newChunkX + (int) Math.floor((this.posX + this.motionX * this.motionMult()) / 16D), newChunkZ + (int) Math.floor((this.posZ + this.motionZ * this.motionMult()) / 16D))); + + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.forceChunk(loaderTicket, chunk); + } + } + } + + public void killAndClear() { + this.setDead(); + this.clearChunkLoader(); + } + + public void clearChunkLoader() { + if(!worldObj.isRemote && loaderTicket != null) { + for(ChunkCoordIntPair chunk : loadedChunks) { + ForgeChunkManager.unforceChunk(loaderTicket, chunk); + } + } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBunkerBuster.java b/src/main/java/com/hbm/entity/missile/EntityMissileBunkerBuster.java deleted file mode 100644 index b23a22063..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBunkerBuster.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileBunkerBuster extends EntityMissileBaseAdvanced { - - public EntityMissileBunkerBuster(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileBunkerBuster(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - for(int i = 0; i < 15; i++) - { - this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 5F, true); - } - - ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 5); - ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 5); - ExplosionLarge.spawnRubble(worldObj, this.posX, this.posY, this.posZ, 5); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.thruster_small, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_buster_small); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER1; - } - -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBurst.java b/src/main/java/com/hbm/entity/missile/EntityMissileBurst.java deleted file mode 100644 index b9285eb32..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBurst.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileBurst extends EntityMissileBaseAdvanced { - - public EntityMissileBurst(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileBurst(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - for(int i = 0; i < 4; i++) - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 50.0F, true); - ExplosionLarge.explode(worldObj, posX, posY, posZ, 50.0F, true, true, true); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 16)); - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier3, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_generic_large); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBusterStrong.java b/src/main/java/com/hbm/entity/missile/EntityMissileBusterStrong.java deleted file mode 100644 index ac4e903b6..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBusterStrong.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileBusterStrong extends EntityMissileBaseAdvanced { - - public EntityMissileBusterStrong(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileBusterStrong(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - for(int i = 0; i < 20; i++) - { - this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 7.5F, true); - } - ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 8); - ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 8); - ExplosionLarge.spawnRubble(worldObj, this.posX, this.posY, this.posZ, 8); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 10)); - list.add(new ItemStack(ModItems.plate_titanium, 6)); - list.add(new ItemStack(ModItems.thruster_medium, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_buster_medium); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER2; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCluster.java b/src/main/java/com/hbm/entity/missile/EntityMissileCluster.java deleted file mode 100644 index 38ac71f9a..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCluster.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionChaos; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileCluster extends EntityMissileBaseAdvanced { - - public EntityMissileCluster(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileCluster(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - this.isCluster = true; - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 5F, true); - ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25, 100); - } - - @Override - public void cluster() { - this.onImpact(); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.thruster_small, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_cluster_small); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER1; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileClusterStrong.java b/src/main/java/com/hbm/entity/missile/EntityMissileClusterStrong.java deleted file mode 100644 index 81a3cab63..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileClusterStrong.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionChaos; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileClusterStrong extends EntityMissileBaseAdvanced { - - public EntityMissileClusterStrong(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileClusterStrong(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - this.isCluster = true; - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 15F, true); - ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 50, 100); - } - - @Override - public void cluster() { - this.onImpact(); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 10)); - list.add(new ItemStack(ModItems.plate_titanium, 6)); - list.add(new ItemStack(ModItems.thruster_medium, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_cluster_medium); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER2; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java index 7b1d42a36..e4f8609b4 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java @@ -7,7 +7,7 @@ import com.hbm.explosion.ExplosionLarge; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -public class EntityMissileDoomsday extends EntityMissileBaseAdvanced { +public class EntityMissileDoomsday extends EntityMissileBaseNT { public EntityMissileDoomsday(World p_i1582_1_) { super(p_i1582_1_); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileDrill.java b/src/main/java/com/hbm/entity/missile/EntityMissileDrill.java deleted file mode 100644 index 3c0ab3442..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileDrill.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.explosion.ExplosionNT; -import com.hbm.explosion.ExplosionNT.ExAttrib; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileDrill extends EntityMissileBaseAdvanced { - - public EntityMissileDrill(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileDrill(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - for(int i = 0; i < 30; i++) - { - ExplosionNT explosion = new ExplosionNT(worldObj, this, this.posX, this.posY - i, this.posZ, 10F); - explosion.addAllAttrib(ExAttrib.ERRODE); - explosion.explode(); //an explosion exploded! - } - ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 25); - ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 12); - ExplosionLarge.jolt(worldObj, this.posX, this.posY, this.posZ, 10, 50, 1); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 16)); - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier3, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_buster_large); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileEMP.java b/src/main/java/com/hbm/entity/missile/EntityMissileEMP.java deleted file mode 100644 index bd6ce0281..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileEMP.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.blocks.ModBlocks; -import com.hbm.entity.effect.EntityEMPBlast; -import com.hbm.explosion.ExplosionNukeGeneric; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileEMP extends EntityMissileBaseAdvanced { - - public EntityMissileEMP(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileEMP(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - if (!this.worldObj.isRemote) - { - ExplosionNukeGeneric.empBlast(worldObj, (int)posX, (int)posY, (int)posZ, 50); - EntityEMPBlast wave = new EntityEMPBlast(worldObj, 50); - wave.posX = posX; - wave.posY = posY; - wave.posZ = posZ; - worldObj.spawnEntityInWorld(wave); - } - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.wire_aluminium, 4)); - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); - list.add(new ItemStack(ModItems.ducttape, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModBlocks.emp_bomb, 1); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER0; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileEMPStrong.java b/src/main/java/com/hbm/entity/missile/EntityMissileEMPStrong.java deleted file mode 100644 index 4253cbaa6..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileEMPStrong.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.entity.logic.EntityEMP; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileEMPStrong extends EntityMissileBaseAdvanced { - - public EntityMissileEMPStrong(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileEMPStrong(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - - EntityEMP emp = new EntityEMP(worldObj); - emp.posX = posX; - emp.posY = posY; - emp.posZ = posZ; - - worldObj.spawnEntityInWorld(emp); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 10)); - list.add(new ItemStack(ModItems.plate_titanium, 6)); - list.add(new ItemStack(ModItems.thruster_medium, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_generic_medium); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER2; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileEndo.java b/src/main/java/com/hbm/entity/missile/EntityMissileEndo.java deleted file mode 100644 index e1205b606..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileEndo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionThermo; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileEndo extends EntityMissileBaseAdvanced { - - public EntityMissileEndo(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileEndo(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); - ExplosionThermo.freeze(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 30); - ExplosionThermo.freezer(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 40); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.plate_steel, 14)); - list.add(new ItemStack(ModItems.plate_aluminium, 8)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_thermo_exo); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileExo.java b/src/main/java/com/hbm/entity/missile/EntityMissileExo.java deleted file mode 100644 index 494bebb06..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileExo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionThermo; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileExo extends EntityMissileBaseAdvanced { - - public EntityMissileExo(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileExo(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); - ExplosionThermo.scorch(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 30); - ExplosionThermo.setEntitiesOnFire(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 40); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.plate_steel, 14)); - list.add(new ItemStack(ModItems.plate_aluminium, 8)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_thermo_exo); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileGeneric.java b/src/main/java/com/hbm/entity/missile/EntityMissileGeneric.java deleted file mode 100644 index b1ad0f37b..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileGeneric.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileGeneric extends EntityMissileBaseAdvanced { - - public EntityMissileGeneric(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.thruster_small, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_generic_small); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER1; - } - - /*public EntityMissileGeneric(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileGeneric(World p_i1582_1_, int x, int z, double a, double b, double c) { - super(p_i1582_1_, x, z, a, b, c); - } - - @Override - public void onUpdate() - { - - this.posX += this.motionX; - this.posY += this.motionY; - this.posZ += this.motionZ; - - this.rotation(); - - switch(phase) - { - case 0: - if(loc0 != null) - { - freePizzaGoddammit(loc0); - if(loc0.posX + 2 > this.posX && loc0.posX - 2 < this.posX && - loc0.posY + 2 > this.posY && loc0.posY - 2 < this.posY && - loc0.posZ + 2 > this.posZ && loc0.posZ - 2 < this.posZ) - { - this.phase = 1; - } - } - break; - case 1: - if(loc1 != null) - { - freePizzaGoddammit(loc1); - if(loc1.posX + 2 > this.posX && loc1.posX - 2 < this.posX && - loc1.posY + 2 > this.posY && loc1.posY - 2 < this.posY && - loc1.posZ + 2 > this.posZ && loc1.posZ - 2 < this.posZ) - { - this.phase = 2; - } - } - break; - case 2: - if(loc2 != null) - { - freePizzaGoddammit(loc2); - if(loc2.posX + 2 > this.posX && loc2.posX - 2 < this.posX && - loc2.posY + 2 > this.posY && loc2.posY - 2 < this.posY && - loc2.posZ + 2 > this.posZ && loc2.posZ - 2 < this.posZ) - { - this.phase = 3; - } - } - break; - case 3: - if(loc3 != null) - { - freePizzaGoddammit(loc3); - if(loc3.posX + 2 > this.posX && loc3.posX - 2 < this.posX && - loc3.posY + 2 > this.posY && loc3.posY - 2 < this.posY && - loc3.posZ + 2 > this.posZ && loc3.posZ - 2 < this.posZ) - { - this.phase = 4; - } - } - break; - case 4: - if(loc4 != null) - { - freePizzaGoddammit(loc4); - if(loc4.posX + 2 > this.posX && loc4.posX - 2 < this.posX && - loc4.posY + 2 > this.posY && loc4.posY - 2 < this.posY && - loc4.posZ + 2 > this.posZ && loc4.posZ - 2 < this.posZ) - { - this.phase = 5; - } - } - break; - case 5: - if(loc5 != null) - { - freePizzaGoddammit(loc5); - if(loc5.posX + 2 > this.posX && loc5.posX - 2 < this.posX && - loc5.posY + 2 > this.posY && loc5.posY - 2 < this.posY && - loc5.posZ + 2 > this.posZ && loc5.posZ - 2 < this.posZ) - { - this.phase = 6; - } - } - break; - case 6: - if(loc6 != null) - { - freePizzaGoddammit(loc6); - if(loc6.posX + 2 > this.posX && loc6.posX - 2 < this.posX && - loc6.posY + 2 > this.posY && loc6.posY - 2 < this.posY && - loc6.posZ + 2 > this.posZ && loc6.posZ - 2 < this.posZ) - { - this.phase = 7; - } - } - break; - case 7: - if(loc7 != null) - { - freePizzaGoddammit(loc7); - if(loc7.posX + 2 > this.posX && loc7.posX - 2 < this.posX && - loc7.posY + 2 > this.posY && loc7.posY - 2 < this.posY && - loc7.posZ + 2 > this.posZ && loc7.posZ - 2 < this.posZ) - { - this.phase = 8; - } - } - break; - case 8: - if(target != null) - { - freePizzaGoddammit(target); - if(target.posX + 2 > this.posX && target.posX - 2 < this.posX && - target.posY + 2 > this.posY && target.posY - 2 < this.posY && - target.posZ + 2 > this.posZ && target.posZ - 2 < this.posZ) - { - this.phase = -1; - } - } - break; - } - - this.worldObj.spawnEntityInWorld(new EntitySmokeFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0, 0.0, 0.0)); - - if(this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.air && this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.water && this.worldObj.getBlock((int)this.posX, (int)this.posY, (int)this.posZ) != Blocks.flowing_water) - { - if(!this.worldObj.isRemote) - { - ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); - } - this.setDead(); - } - }*/ - -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileIncendiary.java b/src/main/java/com/hbm/entity/missile/EntityMissileIncendiary.java deleted file mode 100644 index 709e2e1f3..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileIncendiary.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileIncendiary extends EntityMissileBaseAdvanced { - - public EntityMissileIncendiary(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileIncendiary(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 10.0F, true, true, true); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.thruster_small, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_incendiary_small); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER1; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileIncendiaryStrong.java b/src/main/java/com/hbm/entity/missile/EntityMissileIncendiaryStrong.java deleted file mode 100644 index 56e8b86d6..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileIncendiaryStrong.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionChaos; -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileIncendiaryStrong extends EntityMissileBaseAdvanced { - - public EntityMissileIncendiaryStrong(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileIncendiaryStrong(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 25.0F, true, true, true); - ExplosionChaos.flameDeath(this.worldObj, (int)((float)this.posX + 0.5F), (int)((float)this.posY + 0.5F), (int)((float)this.posZ + 0.5F), 25); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 10)); - list.add(new ItemStack(ModItems.plate_titanium, 6)); - list.add(new ItemStack(ModItems.thruster_medium, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_incendiary_medium); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER2; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileInferno.java b/src/main/java/com/hbm/entity/missile/EntityMissileInferno.java deleted file mode 100644 index 4109390b0..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileInferno.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionChaos; -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileInferno extends EntityMissileBaseAdvanced { - - public EntityMissileInferno(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileInferno(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 35.0F, true, true, true); - ExplosionChaos.burn(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 10); - ExplosionChaos.flameDeath(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 16)); - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier3, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_incendiary_large); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileMicro.java b/src/main/java/com/hbm/entity/missile/EntityMissileMicro.java deleted file mode 100644 index a85d7a980..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileMicro.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionNukeSmall; -import com.hbm.items.ItemAmmoEnums.AmmoFatman; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileMicro extends EntityMissileBaseAdvanced { - - public EntityMissileMicro(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileMicro(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - if(!this.worldObj.isRemote) { - ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); - } - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.wire_aluminium, 4)); - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); - list.add(new ItemStack(ModItems.ducttape, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return ModItems.ammo_nuke.stackFromEnum(AmmoFatman.HIGH); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER0; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileMirv.java b/src/main/java/com/hbm/entity/missile/EntityMissileMirv.java deleted file mode 100644 index e5dbe3db7..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileMirv.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.config.BombConfig; -import com.hbm.entity.effect.EntityNukeTorex; -import com.hbm.entity.logic.EntityNukeExplosionMK5; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileMirv extends EntityMissileBaseAdvanced { - - public EntityMissileMirv(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileMirv(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); - EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 16)); - list.add(new ItemStack(ModItems.plate_steel, 20)); - list.add(new ItemStack(ModItems.plate_aluminium, 12)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier5, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_mirv); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER4; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileNuclear.java b/src/main/java/com/hbm/entity/missile/EntityMissileNuclear.java deleted file mode 100644 index f7db04860..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileNuclear.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.config.BombConfig; -import com.hbm.entity.effect.EntityNukeTorex; -import com.hbm.entity.logic.EntityNukeExplosionMK5; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileNuclear extends EntityMissileBaseAdvanced { - - public EntityMissileNuclear(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileNuclear(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); - EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 16)); - list.add(new ItemStack(ModItems.plate_steel, 20)); - list.add(new ItemStack(ModItems.plate_aluminium, 12)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_nuclear); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER4; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileRain.java b/src/main/java/com/hbm/entity/missile/EntityMissileRain.java deleted file mode 100644 index 877fe54c4..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileRain.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionChaos; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileRain extends EntityMissileBaseAdvanced { - - public EntityMissileRain(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileRain(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - this.isCluster = true; - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 25F, true); - ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 100, 100); - } - - @Override - public void cluster() { - this.onImpact(); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 16)); - list.add(new ItemStack(ModItems.plate_titanium, 10)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier3, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_cluster_large); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER3; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileSchrabidium.java b/src/main/java/com/hbm/entity/missile/EntityMissileSchrabidium.java deleted file mode 100644 index c197026bc..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileSchrabidium.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.config.BombConfig; -import com.hbm.entity.effect.EntityCloudFleija; -import com.hbm.entity.logic.EntityNukeExplosionMK3; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileSchrabidium extends EntityMissileBaseAdvanced { - - public EntityMissileSchrabidium(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileSchrabidium(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - if(!this.worldObj.isRemote) { - EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, BombConfig.aSchrabRadius); - if(!ex.isDead) { - worldObj.spawnEntityInWorld(ex); - - EntityCloudFleija cloud = new EntityCloudFleija(this.worldObj, BombConfig.aSchrabRadius); - cloud.posX = this.posX; - cloud.posY = this.posY; - cloud.posZ = this.posZ; - this.worldObj.spawnEntityInWorld(cloud); - } - } - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.wire_aluminium, 4)); - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); - list.add(new ItemStack(ModItems.ducttape, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.powder_schrabidium, 1); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER0; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index c662a383d..42edb75dd 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class EntityMissileShuttle extends EntityMissileBaseAdvanced { +public class EntityMissileShuttle extends EntityMissileBaseNT { public EntityMissileShuttle(World p_i1582_1_) { super(p_i1582_1_); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileStrong.java b/src/main/java/com/hbm/entity/missile/EntityMissileStrong.java deleted file mode 100644 index 60d2486d2..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileStrong.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileStrong extends EntityMissileBaseAdvanced { - - public EntityMissileStrong(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileStrong(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - ExplosionLarge.explode(worldObj, posX, posY, posZ, 25.0F, true, true, true); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_steel, 10)); - list.add(new ItemStack(ModItems.plate_titanium, 6)); - list.add(new ItemStack(ModItems.thruster_medium, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_generic_medium); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER2; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTaint.java b/src/main/java/com/hbm/entity/missile/EntityMissileTaint.java deleted file mode 100644 index b536b4410..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTaint.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.bomb.BlockTaint; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileTaint extends EntityMissileBaseAdvanced { - - public EntityMissileTaint(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileTaint(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); - - for(int i = 0; i < 100; i++) { - int a = rand.nextInt(11) + (int)this.posX - 5; - int b = rand.nextInt(11) + (int)this.posY - 5; - int c = rand.nextInt(11) + (int)this.posZ - 5; - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && BlockTaint.hasPosNeightbour(worldObj, a, b, c)) - worldObj.setBlock(a, b, c, ModBlocks.taint); - } - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.wire_aluminium, 4)); - list.add(new ItemStack(ModItems.plate_titanium, 4)); - list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); - list.add(new ItemStack(ModItems.powder_magic, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.powder_spark_mix, 1); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER0; - } -} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java new file mode 100644 index 000000000..e3aee4b0b --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java @@ -0,0 +1,108 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.bomb.BlockTaint; +import com.hbm.config.BombConfig; +import com.hbm.entity.effect.EntityBlackHole; +import com.hbm.entity.effect.EntityCloudFleija; +import com.hbm.entity.effect.EntityEMPBlast; +import com.hbm.entity.logic.EntityNukeExplosionMK3; +import com.hbm.explosion.ExplosionNukeGeneric; +import com.hbm.explosion.ExplosionNukeSmall; +import com.hbm.items.ModItems; +import com.hbm.items.ItemAmmoEnums.AmmoFatman; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public abstract class EntityMissileTier0 extends EntityMissileBaseNT { + + public EntityMissileTier0(World world) { super(world); } + public EntityMissileTier0(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + + @Override + public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.wire_aluminium, 4)); + list.add(new ItemStack(ModItems.plate_titanium, 4)); + list.add(new ItemStack(ModItems.hull_small_aluminium, 2)); + list.add(new ItemStack(ModItems.ducttape, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); + return list; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.MISSILE_TIER0; + } + + public static class EntityMissileMicro extends EntityMissileTier0 { + public EntityMissileMicro(World world) { super(world); } + public EntityMissileMicro(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); } + @Override public ItemStack getDebrisRareDrop() { return ModItems.ammo_nuke.stackFromEnum(AmmoFatman.HIGH); } + } + + public static class EntityMissileSchrabidium extends EntityMissileTier0 { + public EntityMissileSchrabidium(World world) { super(world); } + public EntityMissileSchrabidium(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, BombConfig.aSchrabRadius); + if(!ex.isDead) { + worldObj.spawnEntityInWorld(ex); + EntityCloudFleija cloud = new EntityCloudFleija(this.worldObj, BombConfig.aSchrabRadius); + cloud.posX = this.posX; + cloud.posY = this.posY; + cloud.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(cloud); + } + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.powder_schrabidium, 1); } + } + + public static class EntityMissileBHole extends EntityMissileTier0 { + public EntityMissileBHole(World world) { super(world); } + public EntityMissileBHole(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 1.5F, true); + EntityBlackHole bl = new EntityBlackHole(this.worldObj, 1.5F); + bl.posX = this.posX; + bl.posY = this.posY; + bl.posZ = this.posZ; + this.worldObj.spawnEntityInWorld(bl); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.grenade_black_hole, 1); } + } + + public static class EntityMissileTaint extends EntityMissileTier0 { + public EntityMissileTaint(World world) { super(world); } + public EntityMissileTaint(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); + for(int i = 0; i < 100; i++) { + int a = rand.nextInt(11) + (int) this.posX - 5; + int b = rand.nextInt(11) + (int) this.posY - 5; + int c = rand.nextInt(11) + (int) this.posZ - 5; + if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && BlockTaint.hasPosNeightbour(worldObj, a, b, c)) worldObj.setBlock(a, b, c, ModBlocks.taint); + } + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.powder_spark_mix, 1); } + } + + public static class EntityMissileEMP extends EntityMissileTier0 { + public EntityMissileEMP(World world) { super(world); } + public EntityMissileEMP(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + ExplosionNukeGeneric.empBlast(worldObj, (int)posX, (int)posY, (int)posZ, 50); + EntityEMPBlast wave = new EntityEMPBlast(worldObj, 50); + wave.posX = posX; + wave.posY = posY; + wave.posZ = posZ; + worldObj.spawnEntityInWorld(wave); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModBlocks.emp_bomb, 1); } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java new file mode 100644 index 000000000..8fe5cae83 --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java @@ -0,0 +1,68 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.explosion.ExplosionChaos; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public abstract class EntityMissileTier1 extends EntityMissileBaseNT { + + public EntityMissileTier1(World world) { super(world); } + public EntityMissileTier1(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + + @Override + public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.plate_titanium, 4)); + list.add(new ItemStack(ModItems.thruster_small, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier1, 1)); + return list; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.MISSILE_TIER1; + } + + public static class EntityMissileGeneric extends EntityMissileTier1 { + public EntityMissileGeneric(World world) { super(world); } + public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_small); } + } + + public static class EntityMissileIncendiary extends EntityMissileTier1 { + public EntityMissileIncendiary(World world) { super(world); } + public EntityMissileIncendiary(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 10.0F, true, true, true); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_incendiary_small); } + } + + public static class EntityMissileCluster extends EntityMissileTier1 { + public EntityMissileCluster(World world) { super(world); } + public EntityMissileCluster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 5F, true); + ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25, 100); + } + @Override public void cluster() { this.onImpact(); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_small); } + } + + public static class EntityMissileBunkerBuster extends EntityMissileTier1 { + public EntityMissileBunkerBuster(World world) { super(world); } + public EntityMissileBunkerBuster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + for(int i = 0; i < 15; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 5F, true); + ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 5); + ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 5); + ExplosionLarge.spawnRubble(worldObj, this.posX, this.posY, this.posZ, 5); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_buster_small); } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java new file mode 100644 index 000000000..9296e0448 --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java @@ -0,0 +1,88 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.entity.logic.EntityEMP; +import com.hbm.explosion.ExplosionChaos; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public abstract class EntityMissileTier2 extends EntityMissileBaseNT { + + public EntityMissileTier2(World world) { super(world); } + public EntityMissileTier2(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + + @Override + public List getDebris() { + List list = new ArrayList(); + + list.add(new ItemStack(ModItems.plate_steel, 10)); + list.add(new ItemStack(ModItems.plate_titanium, 6)); + list.add(new ItemStack(ModItems.thruster_medium, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier2, 1)); + + return list; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.MISSILE_TIER2; + } + + public static class EntityMissileStrong extends EntityMissileTier2 { + public EntityMissileStrong(World world) { super(world); } + public EntityMissileStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { ExplosionLarge.explode(worldObj, posX, posY, posZ, 25.0F, true, true, true); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_medium); } + } + + public static class EntityMissileIncendiaryStrong extends EntityMissileTier2 { + public EntityMissileIncendiaryStrong(World world) { super(world); } + public EntityMissileIncendiaryStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 25.0F, true, true, true); + ExplosionChaos.flameDeath(this.worldObj, (int)((float)this.posX + 0.5F), (int)((float)this.posY + 0.5F), (int)((float)this.posZ + 0.5F), 25); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_incendiary_medium); } + } + + public static class EntityMissileClusterStrong extends EntityMissileTier2 { + public EntityMissileClusterStrong(World world) { super(world); } + public EntityMissileClusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 15F, true); + ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 50, 100); + } + @Override public void cluster() { this.onImpact(); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_medium); } + } + + public static class EntityMissileBusterStrong extends EntityMissileTier2 { + public EntityMissileBusterStrong(World world) { super(world); } + public EntityMissileBusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + for(int i = 0; i < 20; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 7.5F, true); + ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 8); + ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 8); + ExplosionLarge.spawnRubble(worldObj, this.posX, this.posY, this.posZ, 8); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_buster_medium); } + } + + public static class EntityMissileEMPStrong extends EntityMissileTier2 { + public EntityMissileEMPStrong(World world) { super(world); } + public EntityMissileEMPStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + EntityEMP emp = new EntityEMP(worldObj); + emp.posX = posX; + emp.posY = posY; + emp.posZ = posZ; + worldObj.spawnEntityInWorld(emp); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_medium); } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java new file mode 100644 index 000000000..11c527b0e --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java @@ -0,0 +1,125 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.explosion.ExplosionChaos; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.explosion.ExplosionNT; +import com.hbm.explosion.ExplosionThermo; +import com.hbm.explosion.ExplosionNT.ExAttrib; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public abstract class EntityMissileTier3 extends EntityMissileBaseNT { + + public EntityMissileTier3(World world) { super(world); } + public EntityMissileTier3(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + + @Override + public List getDebris() { + List list = new ArrayList(); + + list.add(new ItemStack(ModItems.plate_steel, 16)); + list.add(new ItemStack(ModItems.plate_titanium, 10)); + list.add(new ItemStack(ModItems.thruster_large, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier3, 1)); + + return list; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.MISSILE_TIER3; + } + + public static class EntityMissileBurst extends EntityMissileTier3 { + public EntityMissileBurst(World world) { super(world); } + public EntityMissileBurst(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + for(int i = 0; i < 4; i++) this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 50.0F, true); + ExplosionLarge.explode(worldObj, posX, posY, posZ, 50.0F, true, true, true); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_large); } + } + + public static class EntityMissileInferno extends EntityMissileTier3 { + public EntityMissileInferno(World world) { super(world); } + public EntityMissileInferno(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + ExplosionLarge.explodeFire(worldObj, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 35.0F, true, true, true); + ExplosionChaos.burn(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 10); + ExplosionChaos.flameDeath(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_incendiary_large); } + } + + public static class EntityMissileRain extends EntityMissileTier3 { + public EntityMissileRain(World world) { super(world); } + public EntityMissileRain(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 25F, true); + ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 100, 100); + } + @Override public void cluster() { this.onImpact(); } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_large); } + } + + public static class EntityMissileDrill extends EntityMissileTier3 { + public EntityMissileDrill(World world) { super(world); } + public EntityMissileDrill(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + for(int i = 0; i < 30; i++) { + ExplosionNT explosion = new ExplosionNT(worldObj, this, this.posX, this.posY - i, this.posZ, 10F); + explosion.addAllAttrib(ExAttrib.ERRODE); + explosion.explode(); //an explosion exploded! + } + ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 25); + ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 12); + ExplosionLarge.jolt(worldObj, this.posX, this.posY, this.posZ, 10, 50, 1); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_buster_large); } + } + + public static class EntityMissileEndo extends EntityMissileTier3 { + public EntityMissileEndo(World world) { super(world); } + public EntityMissileEndo(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); + ExplosionThermo.freeze(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 30); + ExplosionThermo.freezer(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 40); + } + @Override public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.plate_titanium, 10)); + list.add(new ItemStack(ModItems.plate_steel, 14)); + list.add(new ItemStack(ModItems.plate_aluminium, 8)); + list.add(new ItemStack(ModItems.thruster_large, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); + return list; + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_thermo_exo); } + } + + public static class EntityMissileExo extends EntityMissileTier3 { + public EntityMissileExo(World world) { super(world); } + public EntityMissileExo(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); + ExplosionThermo.scorch(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 30); + ExplosionThermo.setEntitiesOnFire(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 40); + } + @Override public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.plate_titanium, 10)); + list.add(new ItemStack(ModItems.plate_steel, 14)); + list.add(new ItemStack(ModItems.plate_aluminium, 8)); + list.add(new ItemStack(ModItems.thruster_large, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); + return list; + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_thermo_exo); } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java new file mode 100644 index 000000000..7e859c779 --- /dev/null +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -0,0 +1,76 @@ +package com.hbm.entity.missile; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.config.BombConfig; +import com.hbm.entity.effect.EntityNukeTorex; +import com.hbm.entity.logic.EntityNukeExplosionMK5; +import com.hbm.explosion.ExplosionLarge; +import com.hbm.items.ModItems; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public abstract class EntityMissileTier4 extends EntityMissileBaseNT { + + public EntityMissileTier4(World world) { super(world); } + public EntityMissileTier4(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + + @Override + public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.plate_titanium, 16)); + list.add(new ItemStack(ModItems.plate_steel, 20)); + list.add(new ItemStack(ModItems.plate_aluminium, 12)); + list.add(new ItemStack(ModItems.thruster_large, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); + return list; + } + + @Override + public RadarTargetType getTargetType() { + return RadarTargetType.MISSILE_TIER1; + } + + public static class EntityMissileNuclear extends EntityMissileTier4 { + public EntityMissileNuclear(World world) { super(world); } + public EntityMissileNuclear(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); + EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_nuclear); } + } + + public static class EntityMissileMirv extends EntityMissileTier4 { + public EntityMissileMirv(World world) { super(world); } + public EntityMissileMirv(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); + EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); + } + @Override public List getDebris() { + List list = new ArrayList(); + list.add(new ItemStack(ModItems.plate_titanium, 16)); + list.add(new ItemStack(ModItems.plate_steel, 20)); + list.add(new ItemStack(ModItems.plate_aluminium, 12)); + list.add(new ItemStack(ModItems.thruster_large, 1)); + list.add(new ItemStack(ModItems.circuit_targeting_tier5, 1)); + return list; + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_mirv); } + } + + public static class EntityMissileVolcano extends EntityMissileTier4 { + public EntityMissileVolcano(World world) { super(world); } + public EntityMissileVolcano(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } + @Override public void onImpact() { + ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); + for(int x = -1; x <= 1; x++) for(int y = -1; y <= 1; y++) for(int z = -1; z <= 1; z++) worldObj.setBlock((int)Math.floor(posX + x), (int)Math.floor(posY + y), (int)Math.floor(posZ + z), ModBlocks.volcanic_lava_block); + worldObj.setBlock((int)Math.floor(posX), (int)Math.floor(posY), (int)Math.floor(posZ), ModBlocks.volcano_core); + } + @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_volcano); } + } +} diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileVolcano.java b/src/main/java/com/hbm/entity/missile/EntityMissileVolcano.java deleted file mode 100644 index 4a8ccbebf..000000000 --- a/src/main/java/com/hbm/entity/missile/EntityMissileVolcano.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.hbm.entity.missile; - -import java.util.ArrayList; -import java.util.List; - -import com.hbm.blocks.ModBlocks; -import com.hbm.explosion.ExplosionLarge; -import com.hbm.items.ModItems; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityMissileVolcano extends EntityMissileBaseAdvanced { - - public EntityMissileVolcano(World p_i1582_1_) { - super(p_i1582_1_); - } - - public EntityMissileVolcano(World world, float x, float y, float z, int a, int b) { - super(world, x, y, z, a, b); - } - - @Override - public void onImpact() { - - ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); - - for(int x = -1; x <= 1; x++) { - for(int y = -1; y <= 1; y++) { - for(int z = -1; z <= 1; z++) { - worldObj.setBlock((int)Math.floor(posX + x), (int)Math.floor(posY + y), (int)Math.floor(posZ + z), ModBlocks.volcanic_lava_block); - } - } - } - - worldObj.setBlock((int)Math.floor(posX), (int)Math.floor(posY), (int)Math.floor(posZ), ModBlocks.volcano_core); - } - - @Override - public List getDebris() { - List list = new ArrayList(); - - list.add(new ItemStack(ModItems.plate_titanium, 16)); - list.add(new ItemStack(ModItems.plate_steel, 20)); - list.add(new ItemStack(ModItems.plate_aluminium, 12)); - list.add(new ItemStack(ModItems.thruster_large, 1)); - list.add(new ItemStack(ModItems.circuit_targeting_tier4, 1)); - - return list; - } - - @Override - public ItemStack getDebrisRareDrop() { - return new ItemStack(ModItems.warhead_volcano); - } - - @Override - public RadarTargetType getTargetType() { - return RadarTargetType.MISSILE_TIER4; - } -} diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java index c07a22bd8..40964b9d3 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -185,7 +185,7 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); } - if(!this.worldObj.isRemote) { + if(!this.worldObj.isRemote && this.doesImpactEntities()) { Entity hitEntity = null; List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX * motionMult(), this.motionY * motionMult(), this.motionZ * motionMult()).expand(1.0D, 1.0D, 1.0D)); @@ -282,6 +282,10 @@ public abstract class EntityThrowableNT extends Entity implements IProjectile { } } + public boolean doesImpactEntities() { + return true; + } + public boolean doesPenetrate() { return false; } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java index 3c91249bf..2be6a3266 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRadarNT.java @@ -5,12 +5,20 @@ import java.util.Arrays; import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; +import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; +import api.hbm.entity.RadarEntry; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; public class GUIMachineRadarNT extends GuiScreen { @@ -33,6 +41,27 @@ public class GUIMachineRadarNT extends GuiScreen { this.guiTop = (this.height - this.ySize) / 2; } + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + String cmd = null; + + if(checkClick(x, y, -10, 88, 8, 8)) cmd = "missiles"; + if(checkClick(x, y, -10, 98, 8, 8)) cmd = "shells"; + if(checkClick(x, y, -10, 108, 8, 8)) cmd = "players"; + if(checkClick(x, y, -10, 118, 8, 8)) cmd = "smart"; + if(checkClick(x, y, -10, 128, 8, 8)) cmd = "red"; + if(checkClick(x, y, -10, 138, 8, 8)) cmd = "map"; + + if(cmd != null) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean(cmd, true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, radar.xCoord, radar.yCoord, radar.zCoord)); + } + } + @Override public void drawScreen(int mouseX, int mouseY, float f) { this.drawDefaultBackground(); @@ -42,22 +71,143 @@ public class GUIMachineRadarNT extends GuiScreen { GL11.glEnable(GL11.GL_LIGHTING); } - private void drawGuiContainerForegroundLayer(int x, int y) { - if(checkClick(x, y, -10, 88, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectMissiles")), x, y); - if(checkClick(x, y, -10, 98, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectShells")), x, y); - if(checkClick(x, y, -10, 108, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectPlayers")), x, y); - if(checkClick(x, y, -10, 118, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.smartMode")), x, y); - if(checkClick(x, y, -10, 128, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.redMode")), x, y); - if(checkClick(x, y, -10, 138, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.showMap")), x, y); + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + if(checkClick(mouseX, mouseY, 8, 221, 200, 7)) this.func_146283_a(Arrays.asList(BobMathUtil.getShortNumber(radar.power) + "/" + BobMathUtil.getShortNumber(radar.maxPower) + "HE"), mouseX, mouseY); + + if(checkClick(mouseX, mouseY, -10, 88, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectMissiles")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 98, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectShells")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 108, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.detectPlayers")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 118, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.smartMode")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 128, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.redMode")), mouseX, mouseY); + if(checkClick(mouseX, mouseY, -10, 138, 8, 8)) this.func_146283_a(Arrays.asList(I18nUtil.resolveKeyArray("radar.showMap")), mouseX, mouseY); + + if(!radar.entries.isEmpty()) { + for(RadarEntry m : radar.entries) { + int x = guiLeft + (int)((m.posX - radar.xCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 108; + int z = guiTop + (int)((m.posZ - radar.zCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D)) + 117; + + if(mouseX + 5 > x && mouseX - 4 <= x && mouseY + 5 > z && mouseY - 4 <= z) { + + String[] text = new String[] { I18nUtil.resolveKey(m.unlocalizedName), m.posX + " / " + m.posZ, "Alt.: " + m.posY }; + this.func_146283_a(Arrays.asList(text), x, z); + return; + } + } + } } private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + drawTexturedModalRect(guiLeft - 14, guiTop + 84, 224, 0, 14, 66); + + if(radar.scanMissiles ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 88, 238, 4, 8, 8); + if(radar.scanShells ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 98, 238, 14, 8, 8); + if(radar.scanPlayers ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 108, 238, 24, 8, 8); + if(radar.smartMode ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 118, 238, 34, 8, 8); + if(radar.redMode ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 128, 238, 44, 8, 8); + if(radar.showMap ^ (radar.jammed && radar.getWorldObj().rand.nextBoolean())) drawTexturedModalRect(guiLeft - 10, guiTop + 138, 238, 54, 8, 8); + + if(radar.jammed) { + for(int i = 0; i < 5; i++) { + for(int j = 0; j < 5; j++) { + drawTexturedModalRect(guiLeft + 8 + i * 40, guiTop + 17 + j * 40, 216, 118 + radar.getWorldObj().rand.nextInt(81), 40, 40); + } + } + return; + } + + if(radar.showMap) { + Tessellator tess = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + tess.startDrawingQuads(); + for(int i = 0; i < 40_000; i++) { + int iX = i % 200; + int iZ = i / 200; + byte b = radar.map[i]; + if(b > 0) { + int color = ((b * 8) % 256) << 8; + tess.setColorOpaque_I(color); + tess.addVertex(guiLeft + 8 + iX, guiTop + 18 + iZ, this.zLevel); + tess.addVertex(guiLeft + 9 + iX, guiTop + 18 + iZ, this.zLevel); + tess.addVertex(guiLeft + 9 + iX, guiTop + 17 + iZ, this.zLevel); + tess.addVertex(guiLeft + 8 + iX, guiTop + 17 + iZ, this.zLevel); + } + } + tess.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + Vec3 tr = Vec3.createVectorHelper(100, 0, 0); + Vec3 tl = Vec3.createVectorHelper(100, 0, 0); + Vec3 bl = Vec3.createVectorHelper(0, -5, 0); + float rot = -(radar.getWorldObj().getTotalWorldTime() + f) / 20F % (float) (Math.PI * 2); + tr.rotateAroundZ(rot); + tl.rotateAroundZ(rot + 0.25F); + bl.rotateAroundZ(rot); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108, guiTop + 117, this.zLevel); + tess.setColorRGBA_I(0x00ff00, 255); tess.addVertex(guiLeft + 108 + tr.xCoord, guiTop + 117 + tr.yCoord, this.zLevel); + tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108 + tl.xCoord, guiTop + 117 + tl.yCoord, this.zLevel); + tess.setColorRGBA_I(0x00ff00, 0); tess.addVertex(guiLeft + 108 + bl.xCoord, guiTop + 117 + bl.yCoord, this.zLevel); + tess.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glShadeModel(GL11.GL_FLAT); + + if(!radar.entries.isEmpty()) { + for(RadarEntry m : radar.entries) { + double x = (m.posX - radar.xCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D) - 4D; + double z = (m.posZ - radar.zCoord) / ((double) TileEntityMachineRadarNT.radarRange * 2 + 1) * (200D - 8D) - 4D; + int t = m.blipLevel; + drawTexturedModalRectDouble(guiLeft + 108 + x, guiTop + 117 + z, 216, 8 * t, 8, 8); + } + } + } + + public void drawTexturedModalRectDouble(double x, double y, int sourceX, int sourceY, int sizeX, int sizeY) { + float f = 0.00390625F; + float f1 = 0.00390625F; + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(x, y + sizeY, this.zLevel, (sourceX + 0) * f, (sourceY + sizeY) * f1); + tessellator.addVertexWithUV(x + sizeX, y + sizeY, this.zLevel, (sourceX + sizeX) * f, (sourceY + sizeY) * f1); + tessellator.addVertexWithUV(x + sizeX, y, this.zLevel, (sourceX + sizeX) * f, (sourceY + 0) * f1); + tessellator.addVertexWithUV(x, y, this.zLevel, (sourceX + 0) * f, (sourceY + 0) * f1); + tessellator.draw(); } protected boolean checkClick(int x, int y, int left, int top, int sizeX, int sizeY) { return guiLeft + left <= x && guiLeft + left + sizeX > x && guiTop + top < y && guiTop + top + sizeY >= y; } + + @Override + protected void keyTyped(char c, int key) { + if(key == 1 || key == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.thePlayer.closeScreen(); + } + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + @Override + public void updateScreen() { + super.updateScreen(); + + if(!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead) { + this.mc.thePlayer.closeScreen(); + } + } } diff --git a/src/main/java/com/hbm/items/armor/JetpackBooster.java b/src/main/java/com/hbm/items/armor/JetpackBooster.java index a7a0084ec..1d2a49b15 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBooster.java +++ b/src/main/java/com/hbm/items/armor/JetpackBooster.java @@ -15,7 +15,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Vec3; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/items/bomb/ItemN2.java b/src/main/java/com/hbm/items/bomb/ItemN2.java index f1a5ce766..db242b7b1 100644 --- a/src/main/java/com/hbm/items/bomb/ItemN2.java +++ b/src/main/java/com/hbm/items/bomb/ItemN2.java @@ -6,15 +6,12 @@ import com.hbm.util.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; public class ItemN2 extends Item { @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - for(String s : I18nUtil.resolveKeyArray( "tile.nuke_n2.desc")) - list.add(s); + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + for(String s : I18nUtil.resolveKeyArray( "tile.nuke_n2.desc")) list.add(s); } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 2c76d2e96..3c1a0da33 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,10 +2,8 @@ package com.hbm.items.tool; import java.util.List; -import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.lib.Library; import com.hbm.saveddata.TomSaveData; -import com.hbm.util.TrackerUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/com/hbm/items/tool/WeaponSpecial.java b/src/main/java/com/hbm/items/tool/WeaponSpecial.java index ca10cc59a..f96ad6546 100644 --- a/src/main/java/com/hbm/items/tool/WeaponSpecial.java +++ b/src/main/java/com/hbm/items/tool/WeaponSpecial.java @@ -24,7 +24,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Vec3; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 4ccab463c..4774e9a31 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -57,6 +57,11 @@ import com.hbm.entity.grenade.*; import com.hbm.entity.item.*; import com.hbm.entity.logic.*; import com.hbm.entity.missile.*; +import com.hbm.entity.missile.EntityMissileTier0.*; +import com.hbm.entity.missile.EntityMissileTier1.*; +import com.hbm.entity.missile.EntityMissileTier2.*; +import com.hbm.entity.missile.EntityMissileTier3.*; +import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.entity.mob.*; import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.siege.*; @@ -236,7 +241,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePress.class, new RenderPress()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineEPress.class, new RenderEPress()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadGen.class, new RenderRadGen()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadar.class, new RenderRadar()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadarNT.class, new RenderRadar()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineSeleniumEngine.class, new RenderSelenium()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityReactorResearch.class, new RenderSmallReactor()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineShredderLarge.class, new RenderMachineShredder()); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index e88e39b82..4a1cda31b 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -20,8 +20,6 @@ import com.hbm.blocks.generic.BlockAshes; import com.hbm.config.GeneralConfig; import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; -import com.hbm.entity.missile.EntityMissileBaseAdvanced; -import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.entity.mob.EntityCyberCrab; import com.hbm.entity.mob.EntityDuck; import com.hbm.entity.mob.EntityCreeperNuclear; @@ -66,6 +64,7 @@ import com.hbm.packet.PermaSyncPacket; import com.hbm.packet.PlayerInformPacket; import com.hbm.potion.HbmPotion; import com.hbm.saveddata.AuxSavedData; +import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import com.hbm.tileentity.network.RTTYSystem; import com.hbm.tileentity.network.RequestNetwork; import com.hbm.util.AchievementHandler; @@ -1099,19 +1098,20 @@ public class ModEventHandler { if(event.phase == event.phase.START) { RTTYSystem.updateBroadcastQueue(); RequestNetwork.updateEntries(); + TileEntityMachineRadarNT.updateSystem(); } } @SubscribeEvent public void enteringChunk(EnteringChunk evt) { - if(evt.entity instanceof EntityMissileBaseAdvanced) { - ((EntityMissileBaseAdvanced) evt.entity).loadNeighboringChunks(evt.newChunkX, evt.newChunkZ); + /*if(evt.entity instanceof EntityMissileBaseNT) { + ((EntityMissileBaseNT) evt.entity).loadNeighboringChunks(evt.newChunkX, evt.newChunkZ); } if(evt.entity instanceof EntityMissileCustom) { ((EntityMissileCustom) evt.entity).loadNeighboringChunks(evt.newChunkX, evt.newChunkZ); - } + }*/ } @SubscribeEvent diff --git a/src/main/java/com/hbm/packet/BufPacket.java b/src/main/java/com/hbm/packet/BufPacket.java index b2a158ef8..7ff502c9d 100644 --- a/src/main/java/com/hbm/packet/BufPacket.java +++ b/src/main/java/com/hbm/packet/BufPacket.java @@ -28,11 +28,17 @@ public class BufPacket implements IMessage { @Override public void fromBytes(ByteBuf buf) { + this.x = buf.readInt(); + this.y = buf.readInt(); + this.z = buf.readInt(); this.buf = buf; } @Override public void toBytes(ByteBuf buf) { + buf.writeInt(x); + buf.writeInt(y); + buf.writeInt(z); this.rec.serialize(buf); } diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileGeneric.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileGeneric.java index 268cca1cf..88efff5e3 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileGeneric.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileGeneric.java @@ -3,10 +3,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; import com.hbm.entity.missile.EntityMissileAntiBallistic; -import com.hbm.entity.missile.EntityMissileBunkerBuster; -import com.hbm.entity.missile.EntityMissileCluster; -import com.hbm.entity.missile.EntityMissileGeneric; -import com.hbm.entity.missile.EntityMissileIncendiary; +import com.hbm.entity.missile.EntityMissileTier1.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileHuge.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileHuge.java index af95674e1..9c7a64938 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileHuge.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileHuge.java @@ -2,10 +2,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; -import com.hbm.entity.missile.EntityMissileBurst; -import com.hbm.entity.missile.EntityMissileDrill; -import com.hbm.entity.missile.EntityMissileInferno; -import com.hbm.entity.missile.EntityMissileRain; +import com.hbm.entity.missile.EntityMissileTier3.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java index 7719b2612..f69443b8f 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileNuclear.java @@ -2,7 +2,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; -import com.hbm.entity.missile.EntityMissileVolcano; +import com.hbm.entity.missile.EntityMissileTier4.EntityMissileVolcano; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileStrong.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileStrong.java index cbe85f692..23d3003ce 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileStrong.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileStrong.java @@ -2,11 +2,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; -import com.hbm.entity.missile.EntityMissileBusterStrong; -import com.hbm.entity.missile.EntityMissileClusterStrong; -import com.hbm.entity.missile.EntityMissileEMPStrong; -import com.hbm.entity.missile.EntityMissileIncendiaryStrong; -import com.hbm.entity.missile.EntityMissileStrong; +import com.hbm.entity.missile.EntityMissileTier2.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileTaint.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileTaint.java index 19c49616a..65643516f 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileTaint.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileTaint.java @@ -2,10 +2,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; -import com.hbm.entity.missile.EntityMissileBHole; -import com.hbm.entity.missile.EntityMissileEMP; -import com.hbm.entity.missile.EntityMissileSchrabidium; -import com.hbm.entity.missile.EntityMissileTaint; +import com.hbm.entity.missile.EntityMissileTier0.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/entity/rocket/RenderMissileThermo.java b/src/main/java/com/hbm/render/entity/rocket/RenderMissileThermo.java index 644dc3c81..c19a36c83 100644 --- a/src/main/java/com/hbm/render/entity/rocket/RenderMissileThermo.java +++ b/src/main/java/com/hbm/render/entity/rocket/RenderMissileThermo.java @@ -2,8 +2,7 @@ package com.hbm.render.entity.rocket; import org.lwjgl.opengl.GL11; -import com.hbm.entity.missile.EntityMissileEndo; -import com.hbm.entity.missile.EntityMissileExo; +import com.hbm.entity.missile.EntityMissileTier3.*; import com.hbm.main.ResourceManager; import net.minecraft.client.renderer.entity.Render; diff --git a/src/main/java/com/hbm/render/tileentity/RenderRadar.java b/src/main/java/com/hbm/render/tileentity/RenderRadar.java index 45cc19fd0..6910c9b6e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRadar.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRadar.java @@ -3,7 +3,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; -import com.hbm.tileentity.machine.TileEntityMachineRadar; +import com.hbm.tileentity.machine.TileEntityMachineRadarNT; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; @@ -21,8 +21,8 @@ public class RenderRadar extends TileEntitySpecialRenderer { bindTexture(ResourceManager.radar_base_tex); ResourceManager.radar.renderPart("Base"); - TileEntityMachineRadar radar = (TileEntityMachineRadar) tileEntity; - GL11.glRotatef(radar.prevRotation + (radar.rotation - radar.prevRotation) * f, 0F, 1F, 0F); + TileEntityMachineRadarNT radar = (TileEntityMachineRadarNT) tileEntity; + GL11.glRotatef(radar.prevRotation + (radar.rotation - radar.prevRotation) * f, 0F, -1F, 0F); GL11.glTranslated(-0.125D, 0, 0); bindTexture(ResourceManager.radar_dish_tex); @@ -30,5 +30,4 @@ public class RenderRadar extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } - } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 2cf953045..2094dcfcc 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -112,7 +112,7 @@ public class TileMappings { put(TileEntityMachineSPP.class, "tileentity_spp"); put(TileEntityMachineRadGen.class, "tileentity_radgen"); put(TileEntityMachineTransformer.class, "tileentity_transformer"); - put(TileEntityMachineRadar.class, "tileentity_radar"); + put(TileEntityMachineRadarNT.class, "tileentity_radar"); put(TileEntityBroadcaster.class, "tileentity_pink_cloud_broadcaster"); put(TileEntityMachineSeleniumEngine.class, "tileentity_selenium_engine"); put(TileEntityMachineSatLinker.class, "tileentity_satlinker"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index d5911b2a2..e90d861d0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -7,16 +7,21 @@ import java.util.function.Function; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.WeaponConfig; import com.hbm.extprop.HbmLivingProps; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.gui.GUIMachineRadarNT; import com.hbm.lib.Library; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import com.hbm.util.Tuple.Pair; +import com.hbm.util.Tuple.Triplet; +import api.hbm.energy.IEnergyUser; import api.hbm.entity.IRadarDetectable; import api.hbm.entity.IRadarDetectableNT; +import api.hbm.entity.IRadarDetectableNT.RadarScanParams; import api.hbm.entity.RadarEntry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,6 +32,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraft.world.WorldServer; @@ -35,7 +41,7 @@ import net.minecraft.world.WorldServer; * Now with SmЯt™ lag-free entity detection! (patent pending) * @author hbm */ -public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IGUIProvider, IConfigurableMachine { +public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IConfigurableMachine, IControlReceiver { public boolean scanMissiles = true; public boolean scanShells = true; @@ -50,12 +56,19 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public float rotation; public long power = 0; + + protected int pingTimer = 0; + protected int lastPower; + protected final static int maxTimer = 80; public static int maxPower = 100_000; public static int consumption = 500; public static int radarRange = 1_000; public static int radarBuffer = 30; public static int radarAltitude = 55; + public static int chunkLoadCap = 5; + + public byte[] map = new byte[40_000]; public List entries = new ArrayList(); @@ -71,6 +84,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I radarRange = IConfigurableMachine.grab(obj, "I:radarRange", radarRange); radarBuffer = IConfigurableMachine.grab(obj, "I:radarBuffer", radarBuffer); radarAltitude = IConfigurableMachine.grab(obj, "I:radarAltitude", radarAltitude); + chunkLoadCap = IConfigurableMachine.grab(obj, "I:chunkLoadCap", chunkLoadCap); } @Override @@ -80,6 +94,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I writer.name("I:radarRange").value(radarRange); writer.name("I:radarBuffer").value(radarBuffer); writer.name("I:radarAltitude").value(radarAltitude); + writer.name("I:chunkLoadCap").value(chunkLoadCap); } public TileEntityMachineRadarNT() { @@ -95,50 +110,60 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public void updateEntity() { if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0) this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); this.jammed = false; allocateTargets(); - this.networkPackNT(25); - } - } - - protected void allocateTargets() { - this.entries.clear(); - - if(this.yCoord < radarAltitude) return; - if(this.power <= consumption) return; - this.power -= consumption; - - int scan = this.scanRange(); - - for(Entity e : matchingEntities) { + if(this.lastPower != getRedPower()) worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); - if(e.dimension == worldObj.provider.dimensionId && Math.abs(e.posX - (xCoord + 0.5)) <= scan && Math.abs(e.posZ - (zCoord + 0.5)) <= scan && e.posY - yCoord < radarBuffer) { + if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) != ModBlocks.muffler) { - if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) { - this.jammed = true; - entries.clear(); - return; + pingTimer++; + + if(power > 0 && pingTimer >= maxTimer) { + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.sonarPing", 5.0F, 1.0F); + pingTimer = 0; } - - for(Function, RadarEntry> converter : converters) { + } + + if(this.showMap) { + int chunkLoadCap = 5; + int chunkLoads = 0; + for(int i = 0; i < 100; i++) { + int index = (int) (worldObj.getTotalWorldTime() % 400) * 100 + i; + int iX = (index % 200) * radarRange * 2 / 200; + int iZ = index / 200 * radarRange * 2 / 200; - RadarEntry entry = converter.apply(new Pair(e, this)); - if(entry != null) { - this.entries.add(entry); - break; + int x = xCoord - radarRange + iX; + int z = zCoord - radarRange + iZ; + + if(worldObj.getChunkProvider().chunkExists(x >> 4, z >> 4)) { + this.map[index] = (byte) worldObj.getHeightValue(x, z); + } else { + if(this.map[index] == 0 && chunkLoads < chunkLoadCap) { + worldObj.getChunkFromChunkCoords(x >> 4, z >> 4); + this.map[index] = (byte) worldObj.getHeightValue(x, z); + chunkLoads++; + } } } } + + this.networkPackNT(25); + } else { + prevRotation = rotation; + if(power > 0) rotation += 5F; + + if(rotation >= 360) { + rotation -= 360F; + prevRotation -= 360F; + } } } - protected int scanRange() { - return radarRange; - } - @Override public void serialize(ByteBuf buf) { buf.writeLong(this.power); @@ -151,6 +176,16 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I buf.writeBoolean(this.jammed); buf.writeInt(entries.size()); for(RadarEntry entry : entries) entry.toBytes(buf); + if(this.showMap) { + buf.writeBoolean(true); + short index = (short) (worldObj.getTotalWorldTime() % 400); + buf.writeShort(index); + for(int i = index * 100; i < (index + 1) * 100; i++) { + buf.writeByte(this.map[i]); + } + } else { + buf.writeBoolean(false); + } } @Override @@ -164,11 +199,124 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I this.showMap = buf.readBoolean(); this.jammed = buf.readBoolean(); int count = buf.readInt(); + this.entries.clear(); for(int i = 0; i < count; i++) { RadarEntry entry = new RadarEntry(); entry.fromBytes(buf); this.entries.add(entry); } + if(buf.readBoolean()) { + int index = buf.readShort(); + for(int i = index * 100; i < (index + 1) * 100; i++) { + this.map[i] = buf.readByte(); + } + } + } + + protected void allocateTargets() { + this.entries.clear(); + + if(this.yCoord < radarAltitude) return; + if(this.power <= consumption) return; + this.power -= consumption; + + int scan = this.scanRange(); + + RadarScanParams params = new RadarScanParams(this.scanMissiles, this.scanShells, this.scanPlayers, this.smartMode); + + for(Entity e : matchingEntities) { + + if(e.dimension == worldObj.provider.dimensionId && Math.abs(e.posX - (xCoord + 0.5)) <= scan && Math.abs(e.posZ - (zCoord + 0.5)) <= scan && e.posY - yCoord > radarBuffer) { + + if(e instanceof EntityLivingBase && HbmLivingProps.getDigamma((EntityLivingBase) e) > 0.001) { + this.jammed = true; + entries.clear(); + return; + } + + for(Function, RadarEntry> converter : converters) { + + RadarEntry entry = converter.apply(new Triplet(e, this, params)); + if(entry != null) { + this.entries.add(entry); + break; + } + } + } + } + } + + public int getRedPower() { + + if(!entries.isEmpty()) { + + /// PROXIMITY /// + if(redMode) { + + double maxRange = WeaponConfig.radarRange * Math.sqrt(2D); + int power = 0; + + for(int i = 0; i < entries.size(); i++) { + RadarEntry e = entries.get(i); + double dist = Math.sqrt(Math.pow(e.posX - xCoord, 2) + Math.pow(e.posZ - zCoord, 2)); + int p = 15 - (int)Math.floor(dist / maxRange * 15); + + if(p > power) power = p; + } + + return power; + + /// TIER /// + } else { + + int power = 0; + + for(int i = 0; i < entries.size(); i++) { + + if(entries.get(i).blipLevel + 1 > power) { + power = entries.get(i).blipLevel + 1; + } + } + + return power; + } + } + + return 0; + } + + protected int scanRange() { + return radarRange; + } + + @Override + public void setPower(long i) { + power = i; + } + + @Override + public long getPower() { + return power; + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("missiles")) this.scanMissiles = !this.scanMissiles; + if(data.hasKey("shells")) this.scanShells = !this.scanShells; + if(data.hasKey("players")) this.scanPlayers = !this.scanPlayers; + if(data.hasKey("smart")) this.smartMode = !this.smartMode; + if(data.hasKey("red")) this.redMode = !this.redMode; + if(data.hasKey("map")) this.showMap = !this.showMap; } AxisAlignedBB bb = null; @@ -192,8 +340,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I @Override @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { + public double getMaxRenderDistanceSquared() { return 65536.0D; } @@ -207,7 +354,7 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I /** List of lambdas that are supplied a Pair with the entity and radar in question to generate a RadarEntry The converters coming first have the highest priority */ - public static List, RadarEntry>> converters = new ArrayList(); + public static List, RadarEntry>> converters = new ArrayList(); public static List classes = new ArrayList(); public static List matchingEntities = new ArrayList(); @@ -241,21 +388,25 @@ public class TileEntityMachineRadarNT extends TileEntityMachineBase implements I public static void registerConverters() { //IRadarDetectableNT converters.add(x -> { - Entity e = x.getKey(); + Entity e = x.getX(); if(e instanceof IRadarDetectableNT) { IRadarDetectableNT detectable = (IRadarDetectableNT) e; - if(detectable.canBeSeenBy(x.getValue())) return new RadarEntry(detectable, e); + if(detectable.canBeSeenBy(x.getY()) && detectable.paramsApplicable(x.getZ())) return new RadarEntry(detectable, e); } return null; }); //IRadarDetectable, Legacy converters.add(x -> { - if(x.getKey() instanceof IRadarDetectable) return new RadarEntry((IRadarDetectable) x.getKey(), x.getKey()); + Entity e = x.getX(); + RadarScanParams params = x.getZ(); + if(e instanceof IRadarDetectable && params.scanMissiles) { + return new RadarEntry((IRadarDetectable) e, e); + } return null; }); //Players converters.add(x -> { - if(x.getKey() instanceof EntityPlayer) return new RadarEntry((EntityPlayer) x.getKey()); + if(x.getX() instanceof EntityPlayer && x.getZ().scanPlayers) return new RadarEntry((EntityPlayer) x.getX()); return null; }); } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 62580710e..fa55c200b 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -7,7 +7,7 @@ import java.util.function.BiFunction; import com.hbm.blocks.BlockDummyable; import com.hbm.entity.logic.EntityBomber; -import com.hbm.entity.missile.EntityMissileBaseAdvanced; +import com.hbm.entity.missile.EntityMissileBaseNT; import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.entity.missile.EntitySiegeDropship; import com.hbm.entity.projectile.EntityBulletBaseNT; @@ -642,7 +642,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple if(targetMachines) { - if(e instanceof EntityMissileBaseAdvanced) return true; + if(e instanceof EntityMissileBaseNT) return true; if(e instanceof EntityMissileCustom) return true; if(e instanceof EntityMinecart) return true; if(e instanceof EntityRailCarBase) return true; diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_nt.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_radar_nt.png index 690e1b5f5fa1706b4b2f8aa6a7daad7435912487..095c54c69a8aeca9352d8d94124f6ade7da290fe 100644 GIT binary patch literal 19931 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 F?0>iMUBUnW