RBMK debris items, more gamerules, explosion effects, steel grates
@ -287,6 +287,7 @@ public class ModBlocks {
|
||||
public static Block steel_roof;
|
||||
public static Block steel_beam;
|
||||
public static Block steel_scaffold;
|
||||
public static Block steel_grate;
|
||||
|
||||
public static Block broadcaster_pc;
|
||||
public static Block geiger;
|
||||
@ -869,6 +870,7 @@ public class ModBlocks {
|
||||
public static final int guiID_rbmk_console = 17;
|
||||
public static Block pribris;
|
||||
public static Block pribris_burning;
|
||||
public static Block pribris_radiating;
|
||||
|
||||
public static Block book_guide;
|
||||
|
||||
@ -983,6 +985,19 @@ public class ModBlocks {
|
||||
|
||||
public static Material materialGas = new MaterialGas();
|
||||
|
||||
public static Block.SoundType soundTypeGrate = new ModSoundType("metalBlock", 0.5F, 1.0F) {
|
||||
|
||||
@Override
|
||||
public String func_150496_b() {
|
||||
return Block.soundTypeMetal.func_150496_b();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBreakSound() {
|
||||
return "dig.stone";
|
||||
}
|
||||
};
|
||||
|
||||
private static void initializeBlock() {
|
||||
|
||||
test_render = new TestRender(Material.rock).setBlockName("test_render").setCreativeTab(null);
|
||||
@ -1229,20 +1244,21 @@ public class ModBlocks {
|
||||
brick_dungeon_tile = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_tile").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_tile");
|
||||
brick_dungeon_circle = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_circle");
|
||||
|
||||
tape_recorder = new DecoTapeRecorder(Material.rock).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder");
|
||||
steel_poles = new DecoSteelPoles(Material.rock).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam");
|
||||
pole_top = new DecoPoleTop(Material.rock).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top");
|
||||
pole_satellite_receiver = new DecoPoleSatelliteReceiver(Material.rock).setBlockName("pole_satellite_receiver").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_satellite_receiver");
|
||||
steel_wall = new DecoBlock(Material.rock).setBlockName("steel_wall").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_wall");
|
||||
steel_corner = new DecoBlock(Material.rock).setBlockName("steel_corner").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_corner");
|
||||
steel_roof = new DecoBlock(Material.rock).setBlockName("steel_roof").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_roof");
|
||||
steel_beam = new DecoBlock(Material.rock).setBlockName("steel_beam").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam");
|
||||
steel_scaffold = new DecoBlock(Material.rock).setBlockName("steel_scaffold").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_steel");
|
||||
tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder");
|
||||
steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam");
|
||||
pole_top = new DecoPoleTop(Material.iron).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top");
|
||||
pole_satellite_receiver = new DecoPoleSatelliteReceiver(Material.iron).setBlockName("pole_satellite_receiver").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_satellite_receiver");
|
||||
steel_wall = new DecoBlock(Material.iron).setBlockName("steel_wall").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_wall");
|
||||
steel_corner = new DecoBlock(Material.iron).setBlockName("steel_corner").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_corner");
|
||||
steel_roof = new DecoBlock(Material.iron).setBlockName("steel_roof").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_roof");
|
||||
steel_beam = new DecoBlock(Material.iron).setBlockName("steel_beam").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam");
|
||||
steel_scaffold = new DecoBlock(Material.iron).setBlockName("steel_scaffold").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_steel");
|
||||
steel_grate = new BlockGrate(Material.iron).setBlockName("steel_grate").setStepSound(soundTypeGrate).setCreativeTab(MainRegistry.blockTab).setHardness(2.0F).setResistance(5.0F);
|
||||
|
||||
broadcaster_pc = new PinkCloudBroadcaster(Material.rock).setBlockName("broadcaster_pc").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":broadcaster_pc");
|
||||
geiger = new GeigerCounter(Material.rock).setBlockName("geiger").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":geiger");
|
||||
broadcaster_pc = new PinkCloudBroadcaster(Material.iron).setBlockName("broadcaster_pc").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":broadcaster_pc");
|
||||
geiger = new GeigerCounter(Material.iron).setBlockName("geiger").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":geiger");
|
||||
|
||||
fence_metal = new BlockMetalFence(Material.rock).setBlockName("fence_metal").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":fence_metal");
|
||||
fence_metal = new BlockMetalFence(Material.iron).setBlockName("fence_metal").setCreativeTab(MainRegistry.machineTab).setHardness(15.0F).setResistance(0.25F).setBlockTextureName(RefStrings.MODID + ":fence_metal");
|
||||
|
||||
sand_uranium = new BlockFalling(Material.sand).setBlockName("sand_uranium").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.machineTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_uranium");
|
||||
sand_polonium = new BlockFalling(Material.sand).setBlockName("sand_polonium").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.machineTab).setHardness(0.5F).setBlockTextureName(RefStrings.MODID + ":sand_polonium");
|
||||
@ -1600,6 +1616,7 @@ public class ModBlocks {
|
||||
rbmk_console = new RBMKConsole().setBlockName("rbmk_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_console");
|
||||
pribris = new RBMKDebris().setBlockName("pribris").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris");
|
||||
pribris_burning = new RBMKDebrisBurning().setBlockName("pribris_burning").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_burning");
|
||||
pribris_radiating = new RBMKDebrisRadiating().setBlockName("pribris_radiating").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_radiating");
|
||||
|
||||
book_guide = new Guide(Material.iron).setBlockName("book_guide").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.nukeTab);
|
||||
|
||||
@ -2056,6 +2073,7 @@ public class ModBlocks {
|
||||
GameRegistry.registerBlock(steel_roof, steel_roof.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(steel_beam, steel_beam.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(steel_scaffold, steel_scaffold.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(steel_grate, steel_grate.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(mush, mush.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(mush_block, mush_block.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(mush_block_stem, mush_block_stem.getUnlocalizedName());
|
||||
@ -2273,6 +2291,7 @@ public class ModBlocks {
|
||||
GameRegistry.registerBlock(rbmk_console, rbmk_console.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(pribris, pribris.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(pribris_burning, pribris_burning.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(pribris_radiating, pribris_radiating.getUnlocalizedName());
|
||||
|
||||
GameRegistry.registerBlock(red_cable, red_cable.getUnlocalizedName());
|
||||
GameRegistry.registerBlock(red_wire_coated, red_wire_coated.getUnlocalizedName());
|
||||
|
||||
19
src/main/java/com/hbm/blocks/ModSoundType.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.hbm.blocks;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
public class ModSoundType extends Block.SoundType {
|
||||
|
||||
public ModSoundType(String name, float volume, float pitch) {
|
||||
super(name, volume, pitch);
|
||||
}
|
||||
|
||||
public String getBreakSound() {
|
||||
return "hbm:" + super.getBreakSound();
|
||||
}
|
||||
|
||||
public String getStepResourcePath() {
|
||||
return "hbm:" + super.getStepResourcePath();
|
||||
}
|
||||
|
||||
}
|
||||
85
src/main/java/com/hbm/blocks/generic/BlockGrate.java
Normal file
@ -0,0 +1,85 @@
|
||||
package com.hbm.blocks.generic;
|
||||
|
||||
import com.hbm.lib.RefStrings;
|
||||
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
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.util.AxisAlignedBB;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
public class BlockGrate extends Block {
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon sideIcon;
|
||||
|
||||
public BlockGrate(Material material) {
|
||||
super(material);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerBlockIcons(IIconRegister iconRegister) {
|
||||
this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":grate_top");
|
||||
this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":grate_side");
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIcon(int side, int metadata) {
|
||||
return side == 1 ? this.blockIcon : (side == 0 ? this.blockIcon : this.sideIcon);
|
||||
}
|
||||
|
||||
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
|
||||
|
||||
@Override
|
||||
public int getRenderType() {
|
||||
return renderID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean renderAsNormalBlock() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
this.setBlockBounds(0F, meta * 0.125F, 0F, 1F, meta * 0.125F + 0.125F, 1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
this.setBlockBounds(0F, meta * 0.125F, 0F, 1F, meta * 0.125F + 0.125F, 1F);
|
||||
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
|
||||
return side == ForgeDirection.UP;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onBlockPlaced(World world, int x, int y, int z, int side, float hX, float hY, float hZ, int meta) {
|
||||
|
||||
if(side == 0)
|
||||
return 7;
|
||||
|
||||
if(side == 1)
|
||||
return 0;
|
||||
|
||||
return (int)Math.floor(hY * 8D);
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,9 @@
|
||||
package com.hbm.blocks.machine.rbmk;
|
||||
|
||||
import com.hbm.blocks.BlockDummyable;
|
||||
import com.hbm.handler.MultiblockHandlerXR;
|
||||
import com.hbm.main.MainRegistry;
|
||||
import com.hbm.tileentity.machine.rbmk.RBMKDials;
|
||||
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase;
|
||||
|
||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||
@ -10,8 +12,8 @@ import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
public abstract class RBMKBase extends BlockDummyable {
|
||||
|
||||
@ -70,6 +72,20 @@ public abstract class RBMKBase extends BlockDummyable {
|
||||
return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY + height, z + this.maxZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkRequirement(World world, int x, int y, int z, ForgeDirection dir, int o) {
|
||||
return MultiblockHandlerXR.checkSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, getDimensions(world), x, y, z, dir);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
|
||||
MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, getDimensions(world), this, dir);
|
||||
}
|
||||
|
||||
public int[] getDimensions(World world) {
|
||||
return new int[] {RBMKDials.getColumnHeight(world), 0, 0, 0, 0, 0};
|
||||
}
|
||||
|
||||
public static int renderIDRods = RenderingRegistry.getNextAvailableRenderId();
|
||||
public static int renderIDPassive = RenderingRegistry.getNextAvailableRenderId();
|
||||
public static int renderIDControl = RenderingRegistry.getNextAvailableRenderId();
|
||||
|
||||
@ -2,6 +2,7 @@ package com.hbm.blocks.machine.rbmk;
|
||||
|
||||
import com.hbm.blocks.ModBlocks;
|
||||
import com.hbm.tileentity.TileEntityProxyCombo;
|
||||
import com.hbm.tileentity.machine.rbmk.RBMKDials;
|
||||
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBoiler;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@ -36,6 +37,6 @@ public class RBMKBoiler extends RBMKBase {
|
||||
@Override
|
||||
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
|
||||
super.fillSpace(world, x, y, z, dir, o);
|
||||
this.makeExtra(world, x, y + 3, z);
|
||||
this.makeExtra(world, x, y + RBMKDials.getColumnHeight(world), z);
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@ public class RBMKDebrisBurning extends RBMKDebris {
|
||||
data.setInteger("maxAge", 300);
|
||||
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.25 + rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75));
|
||||
MainRegistry.proxy.effectNT(data);
|
||||
world.playSoundEffect(x + 0.5F, y + 0.5, z + 0.5, "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F);
|
||||
}
|
||||
|
||||
if(rand.nextInt(100) == 0) {
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
package com.hbm.blocks.machine.rbmk;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import com.hbm.blocks.ModBlocks;
|
||||
import com.hbm.main.MainRegistry;
|
||||
import com.hbm.packet.AuxParticlePacketNT;
|
||||
import com.hbm.packet.PacketDispatcher;
|
||||
import com.hbm.util.ContaminationUtil;
|
||||
import com.hbm.util.ContaminationUtil.ContaminationType;
|
||||
import com.hbm.util.ContaminationUtil.HazardType;
|
||||
|
||||
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class RBMKDebrisRadiating extends RBMKDebrisBurning {
|
||||
|
||||
@Override
|
||||
public int tickRate(World world) {
|
||||
|
||||
return 20 + world.rand.nextInt(20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, int x, int y, int z, Random rand) {
|
||||
|
||||
if(!world.isRemote) {
|
||||
|
||||
radiate(world, x, y, z);
|
||||
|
||||
if(rand.nextInt(5) == 0) {
|
||||
NBTTagCompound data = new NBTTagCompound();
|
||||
data.setString("type", "rbmkflame");
|
||||
data.setInteger("maxAge", 300);
|
||||
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + rand.nextDouble(), y + 1.75, z + rand.nextDouble()), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75));
|
||||
MainRegistry.proxy.effectNT(data);
|
||||
world.playSoundEffect(x + 0.5F, y + 0.5, z + 0.5, "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F);
|
||||
|
||||
}
|
||||
|
||||
if(rand.nextInt(1000) == 0) {
|
||||
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
if(meta < 15) {
|
||||
world.setBlockMetadataWithNotify(x, y, z, meta + 1, 2);
|
||||
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
|
||||
} else {
|
||||
world.setBlock(x, y, z, ModBlocks.pribris_burning);
|
||||
}
|
||||
|
||||
} else {
|
||||
world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void radiate(World world, int x, int y, int z) {
|
||||
|
||||
float rads = 1000000F;
|
||||
double range = 100D;
|
||||
|
||||
List<EntityLivingBase> entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5).expand(range, range, range));
|
||||
|
||||
for(EntityLivingBase e : entities) {
|
||||
|
||||
Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5));
|
||||
double len = vec.lengthVector();
|
||||
vec = vec.normalize();
|
||||
|
||||
float res = 0;
|
||||
|
||||
for(int i = 1; i < len; i++) {
|
||||
|
||||
int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i);
|
||||
int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i);
|
||||
int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i);
|
||||
|
||||
res += world.getBlock(ix, iy, iz).getExplosionResistance(null);
|
||||
}
|
||||
|
||||
if(res < 1)
|
||||
res = 1;
|
||||
|
||||
float eRads = rads;
|
||||
eRads /= (float)res;
|
||||
eRads /= (float)(len * len);
|
||||
|
||||
ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, eRads);
|
||||
|
||||
if(len < 5) {
|
||||
e.attackEntityFrom(DamageSource.inFire, 100);
|
||||
}
|
||||
|
||||
/*if(e instanceof EntityPlayer) {
|
||||
((EntityPlayer) e).addChatComponentMessage(new ChatComponentText("RAD/s: " + (int)eRads).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)));
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ package com.hbm.blocks.machine.rbmk;
|
||||
|
||||
import com.hbm.blocks.ModBlocks;
|
||||
import com.hbm.tileentity.TileEntityProxyInventory;
|
||||
import com.hbm.tileentity.machine.rbmk.RBMKDials;
|
||||
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKRod;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@ -36,6 +37,6 @@ public class RBMKRod extends RBMKBase {
|
||||
@Override
|
||||
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
|
||||
super.fillSpace(world, x, y, z, dir, o);
|
||||
this.makeExtra(world, x, y + 3, z);
|
||||
this.makeExtra(world, x, y + RBMKDials.getColumnHeight(world), z);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,13 +1,32 @@
|
||||
package com.hbm.entity.projectile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.hbm.items.ModItems;
|
||||
import com.hbm.potion.HbmPotion;
|
||||
import com.hbm.tileentity.machine.rbmk.RBMKDials;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraft.crash.CrashReport;
|
||||
import net.minecraft.crash.CrashReportCategory;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.util.ReportedException;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class EntityRBMKDebris extends Entity {
|
||||
|
||||
public float rot;
|
||||
public float lastRot;
|
||||
private boolean hasSizeSet = false;
|
||||
|
||||
public EntityRBMKDebris(World world) {
|
||||
super(world);
|
||||
@ -25,9 +44,48 @@ public class EntityRBMKDebris extends Entity {
|
||||
this.rot = this.lastRot = this.rand.nextFloat() * 360;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeCollidedWith() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean interactFirst(EntityPlayer player) {
|
||||
|
||||
if(!worldObj.isRemote) {
|
||||
|
||||
switch(this.getType()) {
|
||||
case BLANK: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.debris_metal))) this.setDead(); break;
|
||||
case ELEMENT: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.debris_metal))) this.setDead(); break;
|
||||
case FUEL: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.debris_fuel))) this.setDead(); break;
|
||||
case GRAPHITE: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.debris_graphite))) this.setDead(); break;
|
||||
case LID: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.rbmk_lid))) this.setDead(); break;
|
||||
case ROD: if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.debris_metal))) this.setDead(); break;
|
||||
}
|
||||
|
||||
player.inventoryContainer.detectAndSendChanges();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
|
||||
if(!hasSizeSet) {
|
||||
|
||||
switch(this.getType()) {
|
||||
case BLANK: this.setSize(0.5F, 0.5F); break;
|
||||
case ELEMENT: this.setSize(1F, 1F); break;
|
||||
case FUEL: this.setSize(0.25F, 0.25F); break;
|
||||
case GRAPHITE: this.setSize(0.25F, 0.25F); break;
|
||||
case LID: this.setSize(1F, 0.5F); break;
|
||||
case ROD: this.setSize(0.75F, 0.5F); break;
|
||||
}
|
||||
|
||||
hasSizeSet = true;
|
||||
}
|
||||
|
||||
this.prevPosX = this.posX;
|
||||
this.prevPosY = this.posY;
|
||||
this.prevPosZ = this.posZ;
|
||||
@ -52,8 +110,59 @@ public class EntityRBMKDebris extends Entity {
|
||||
}
|
||||
}
|
||||
|
||||
if(this.ticksExisted > 1000)
|
||||
this.setDead();
|
||||
if(!worldObj.isRemote) {
|
||||
if(this.getType() == DebrisType.LID && motionY > 0) {
|
||||
|
||||
Vec3 pos = Vec3.createVectorHelper(posX, posY, posZ);
|
||||
Vec3 next = Vec3.createVectorHelper(posX + motionX * 2, posY + motionY * 2, posZ + motionZ * 2);
|
||||
MovingObjectPosition mop = worldObj.func_147447_a(pos, next, false, false, false);
|
||||
|
||||
if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) {
|
||||
|
||||
int x = mop.blockX;
|
||||
int y = mop.blockY;
|
||||
int z = mop.blockZ;
|
||||
|
||||
for(int i = -1; i <= 1; i++) {
|
||||
for(int j = -1; j <= 1; j++) {
|
||||
for(int k = -1; k <= 1; k++) {
|
||||
|
||||
int rn = Math.abs(i) + Math.abs(j) + Math.abs(k);
|
||||
|
||||
if(rn <= 1 || rand.nextInt(rn) == 0)
|
||||
worldObj.setBlockToAir(x + i, y + j, z + k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.setDead();
|
||||
}
|
||||
}
|
||||
|
||||
if(this.getType() == DebrisType.FUEL) {
|
||||
List<EntityLivingBase> entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, this.boundingBox.expand(10, 10, 10));
|
||||
|
||||
for(EntityLivingBase e : entities) {
|
||||
e.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 60 * 20, 9));
|
||||
}
|
||||
}
|
||||
|
||||
if(!RBMKDials.getPermaScrap(worldObj) && this.ticksExisted > getLifetime() + this.getEntityId() % 50)
|
||||
this.setDead();
|
||||
}
|
||||
}
|
||||
|
||||
private int getLifetime() {
|
||||
|
||||
switch(this.getType()) {
|
||||
case BLANK: return 3 * 60 * 20;
|
||||
case ELEMENT: return 3 * 60 * 20;
|
||||
case FUEL: return 10 * 60 * 20;
|
||||
case GRAPHITE: return 15 * 60 * 20;
|
||||
case LID: return 30 * 20;
|
||||
case ROD: return 60 * 20;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void setType(DebrisType type) {
|
||||
@ -73,6 +182,182 @@ public class EntityRBMKDebris extends Entity {
|
||||
protected void writeEntityToNBT(NBTTagCompound nbt) {
|
||||
nbt.setInteger("debtype", this.dataWatcher.getWatchableObjectInt(20));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void moveEntity(double moX, double moY, double moZ) {
|
||||
|
||||
this.worldObj.theProfiler.startSection("move");
|
||||
this.ySize *= 0.4F;
|
||||
|
||||
if(this.isInWeb) {
|
||||
this.isInWeb = false;
|
||||
}
|
||||
|
||||
double initMoX = moX;
|
||||
double initMoY = moY;
|
||||
double initMoZ = moZ;
|
||||
AxisAlignedBB axisalignedbb = this.boundingBox.copy();
|
||||
|
||||
List list = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(moX, moY, moZ));
|
||||
|
||||
for(int i = 0; i < list.size(); ++i) {
|
||||
moY = ((AxisAlignedBB) list.get(i)).calculateYOffset(this.boundingBox, moY);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(0.0D, moY, 0.0D);
|
||||
|
||||
if(!this.field_70135_K && initMoY != moY) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
boolean isGoingDown = this.onGround || initMoY != moY && initMoY < 0.0D;
|
||||
int j;
|
||||
|
||||
for(j = 0; j < list.size(); ++j) {
|
||||
moX = ((AxisAlignedBB) list.get(j)).calculateXOffset(this.boundingBox, moX);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(moX, 0.0D, 0.0D);
|
||||
|
||||
if(!this.field_70135_K && initMoX != moX) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
for(j = 0; j < list.size(); ++j) {
|
||||
moZ = ((AxisAlignedBB) list.get(j)).calculateZOffset(this.boundingBox, moZ);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(0.0D, 0.0D, moZ);
|
||||
|
||||
if(!this.field_70135_K && initMoZ != moZ) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
double d10;
|
||||
double d11;
|
||||
int k;
|
||||
double d12;
|
||||
|
||||
if(this.stepHeight > 0.0F && isGoingDown && this.ySize < 0.05F && (initMoX != moX || initMoZ != moZ)) {
|
||||
d12 = moX;
|
||||
d10 = moY;
|
||||
d11 = moZ;
|
||||
moX = initMoX;
|
||||
moY = (double) this.stepHeight;
|
||||
moZ = initMoZ;
|
||||
AxisAlignedBB axisalignedbb1 = this.boundingBox.copy();
|
||||
this.boundingBox.setBB(axisalignedbb);
|
||||
list = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(initMoX, moY, initMoZ));
|
||||
|
||||
for(k = 0; k < list.size(); ++k) {
|
||||
moY = ((AxisAlignedBB) list.get(k)).calculateYOffset(this.boundingBox, moY);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(0.0D, moY, 0.0D);
|
||||
|
||||
if(!this.field_70135_K && initMoY != moY) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
for(k = 0; k < list.size(); ++k) {
|
||||
moX = ((AxisAlignedBB) list.get(k)).calculateXOffset(this.boundingBox, moX);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(moX, 0.0D, 0.0D);
|
||||
|
||||
if(!this.field_70135_K && initMoX != moX) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
for(k = 0; k < list.size(); ++k) {
|
||||
moZ = ((AxisAlignedBB) list.get(k)).calculateZOffset(this.boundingBox, moZ);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(0.0D, 0.0D, moZ);
|
||||
|
||||
if(!this.field_70135_K && initMoZ != moZ) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
}
|
||||
|
||||
if(!this.field_70135_K && initMoY != moY) {
|
||||
moZ = 0.0D;
|
||||
moY = 0.0D;
|
||||
moX = 0.0D;
|
||||
} else {
|
||||
moY = (double) (-this.stepHeight);
|
||||
|
||||
for(k = 0; k < list.size(); ++k) {
|
||||
moY = ((AxisAlignedBB) list.get(k)).calculateYOffset(this.boundingBox, moY);
|
||||
}
|
||||
|
||||
this.boundingBox.offset(0.0D, moY, 0.0D);
|
||||
}
|
||||
|
||||
if(d12 * d12 + d11 * d11 >= moX * moX + moZ * moZ) {
|
||||
moX = d12;
|
||||
moY = d10;
|
||||
moZ = d11;
|
||||
this.boundingBox.setBB(axisalignedbb1);
|
||||
}
|
||||
}
|
||||
|
||||
this.worldObj.theProfiler.endSection();
|
||||
this.worldObj.theProfiler.startSection("rest");
|
||||
this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D;
|
||||
this.posY = this.boundingBox.minY + (double) this.yOffset - (double) this.ySize;
|
||||
this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D;
|
||||
this.isCollidedHorizontally = initMoX != moX || initMoZ != moZ;
|
||||
this.isCollidedVertically = initMoY != moY;
|
||||
this.onGround = initMoY != moY && initMoY < 0.0D;
|
||||
this.isCollided = this.isCollidedHorizontally || this.isCollidedVertically;
|
||||
this.updateFallState(moY, this.onGround);
|
||||
|
||||
if(initMoX != moX) {
|
||||
//this.motionX = 0.0D;
|
||||
this.motionX *= -0.75D;
|
||||
|
||||
}
|
||||
|
||||
if(initMoY != moY) {
|
||||
this.motionY = 0.0D;
|
||||
}
|
||||
|
||||
if(initMoZ != moZ) {
|
||||
//this.motionZ = 0.0D;
|
||||
this.motionZ *= -0.75D;
|
||||
}
|
||||
|
||||
try {
|
||||
this.func_145775_I();
|
||||
} catch(Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Checking entity block collision");
|
||||
CrashReportCategory crashreportcategory = crashreport.makeCategory("Entity being checked for collision");
|
||||
this.addEntityCrashInfo(crashreportcategory);
|
||||
throw new ReportedException(crashreport);
|
||||
}
|
||||
|
||||
this.worldObj.theProfiler.endSection();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public boolean isInRangeToRenderDist(double dist) {
|
||||
|
||||
int range = 128;
|
||||
return dist < range * range;
|
||||
}
|
||||
|
||||
public static enum DebrisType {
|
||||
BLANK, //just a metal beam
|
||||
|
||||
@ -30,267 +30,242 @@ import net.minecraft.world.World;
|
||||
public class ExplosionNT extends Explosion {
|
||||
|
||||
public Set<ExAttrib> atttributes = new HashSet();
|
||||
|
||||
private Random explosionRNG = new Random();
|
||||
private World worldObj;
|
||||
protected int field_77289_h = 16;
|
||||
protected Map affectedEntities = new HashMap();
|
||||
|
||||
public static final List<ExAttrib> nukeAttribs = Arrays.asList(new ExAttrib[] {ExAttrib.FIRE, ExAttrib.NOPARTICLE, ExAttrib.NOSOUND, ExAttrib.NODROP, ExAttrib.NOHURT});
|
||||
|
||||
private Random explosionRNG = new Random();
|
||||
private World worldObj;
|
||||
protected int field_77289_h = 16;
|
||||
protected Map affectedEntities = new HashMap();
|
||||
|
||||
public static final List<ExAttrib> nukeAttribs = Arrays.asList(new ExAttrib[] { ExAttrib.FIRE, ExAttrib.NOPARTICLE, ExAttrib.NOSOUND, ExAttrib.NODROP, ExAttrib.NOHURT });
|
||||
|
||||
public ExplosionNT(World world, Entity exploder, double x, double y, double z, float strength) {
|
||||
super(world, exploder, x, y, z, strength);
|
||||
this.worldObj = world;
|
||||
}
|
||||
|
||||
|
||||
public ExplosionNT addAttrib(ExAttrib attrib) {
|
||||
atttributes.add(attrib);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public ExplosionNT addAllAttrib(List<ExAttrib> attrib) {
|
||||
atttributes.addAll(attrib);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public ExplosionNT overrideResolution(int res) {
|
||||
field_77289_h = res;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void explode() {
|
||||
doExplosionA();
|
||||
doExplosionB(false);
|
||||
}
|
||||
|
||||
public void doExplosionA()
|
||||
{
|
||||
float f = this.explosionSize;
|
||||
HashSet hashset = new HashSet();
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
double d5;
|
||||
double d6;
|
||||
double d7;
|
||||
|
||||
for (i = 0; i < this.field_77289_h; ++i)
|
||||
{
|
||||
for (j = 0; j < this.field_77289_h; ++j)
|
||||
{
|
||||
for (k = 0; k < this.field_77289_h; ++k)
|
||||
{
|
||||
if (i == 0 || i == this.field_77289_h - 1 || j == 0 || j == this.field_77289_h - 1 || k == 0 || k == this.field_77289_h - 1)
|
||||
{
|
||||
double d0 = (double)((float)i / ((float)this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d1 = (double)((float)j / ((float)this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d2 = (double)((float)k / ((float)this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
||||
d0 /= d3;
|
||||
d1 /= d3;
|
||||
d2 /= d3;
|
||||
float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F);
|
||||
d5 = this.explosionX;
|
||||
d6 = this.explosionY;
|
||||
d7 = this.explosionZ;
|
||||
public void explode() {
|
||||
doExplosionA();
|
||||
doExplosionB(false);
|
||||
}
|
||||
|
||||
for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F)
|
||||
{
|
||||
int j1 = MathHelper.floor_double(d5);
|
||||
int k1 = MathHelper.floor_double(d6);
|
||||
int l1 = MathHelper.floor_double(d7);
|
||||
Block block = this.worldObj.getBlock(j1, k1, l1);
|
||||
public void doExplosionA() {
|
||||
float f = this.explosionSize;
|
||||
HashSet hashset = new HashSet();
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
double d5;
|
||||
double d6;
|
||||
double d7;
|
||||
|
||||
if (block.getMaterial() != Material.air)
|
||||
{
|
||||
float f3 = this.exploder != null ? this.exploder.func_145772_a(this, this.worldObj, j1, k1, l1, block) : block.getExplosionResistance(this.exploder, worldObj, j1, k1, l1, explosionX, explosionY, explosionZ);
|
||||
f1 -= (f3 + 0.3F) * f2;
|
||||
}
|
||||
for(i = 0; i < this.field_77289_h; ++i) {
|
||||
for(j = 0; j < this.field_77289_h; ++j) {
|
||||
for(k = 0; k < this.field_77289_h; ++k) {
|
||||
if(i == 0 || i == this.field_77289_h - 1 || j == 0 || j == this.field_77289_h - 1 || k == 0 || k == this.field_77289_h - 1) {
|
||||
double d0 = (double) ((float) i / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d1 = (double) ((float) j / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d2 = (double) ((float) k / ((float) this.field_77289_h - 1.0F) * 2.0F - 1.0F);
|
||||
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
||||
d0 /= d3;
|
||||
d1 /= d3;
|
||||
d2 /= d3;
|
||||
float f1 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F);
|
||||
d5 = this.explosionX;
|
||||
d6 = this.explosionY;
|
||||
d7 = this.explosionZ;
|
||||
|
||||
if (f1 > 0.0F && (this.exploder == null || this.exploder.func_145774_a(this, this.worldObj, j1, k1, l1, block, f1)))
|
||||
{
|
||||
hashset.add(new ChunkPosition(j1, k1, l1));
|
||||
}
|
||||
for(float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) {
|
||||
int j1 = MathHelper.floor_double(d5);
|
||||
int k1 = MathHelper.floor_double(d6);
|
||||
int l1 = MathHelper.floor_double(d7);
|
||||
Block block = this.worldObj.getBlock(j1, k1, l1);
|
||||
|
||||
d5 += d0 * (double)f2;
|
||||
d6 += d1 * (double)f2;
|
||||
d7 += d2 * (double)f2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(block.getMaterial() != Material.air) {
|
||||
float f3 = this.exploder != null ? this.exploder.func_145772_a(this, this.worldObj, j1, k1, l1, block) : block.getExplosionResistance(this.exploder, worldObj, j1, k1, l1, explosionX, explosionY, explosionZ);
|
||||
f1 -= (f3 + 0.3F) * f2;
|
||||
}
|
||||
|
||||
this.affectedBlockPositions.addAll(hashset);
|
||||
|
||||
if(!has(ExAttrib.NOHURT)) {
|
||||
|
||||
this.explosionSize *= 2.0F;
|
||||
i = MathHelper.floor_double(this.explosionX - (double)this.explosionSize - 1.0D);
|
||||
j = MathHelper.floor_double(this.explosionX + (double)this.explosionSize + 1.0D);
|
||||
k = MathHelper.floor_double(this.explosionY - (double)this.explosionSize - 1.0D);
|
||||
int i2 = MathHelper.floor_double(this.explosionY + (double)this.explosionSize + 1.0D);
|
||||
int l = MathHelper.floor_double(this.explosionZ - (double)this.explosionSize - 1.0D);
|
||||
int j2 = MathHelper.floor_double(this.explosionZ + (double)this.explosionSize + 1.0D);
|
||||
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBox((double)i, (double)k, (double)l, (double)j, (double)i2, (double)j2));
|
||||
net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.worldObj, this, list, this.explosionSize);
|
||||
Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ);
|
||||
|
||||
for (int i1 = 0; i1 < list.size(); ++i1)
|
||||
{
|
||||
Entity entity = (Entity)list.get(i1);
|
||||
double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double)this.explosionSize;
|
||||
|
||||
if (d4 <= 1.0D)
|
||||
{
|
||||
d5 = entity.posX - this.explosionX;
|
||||
d6 = entity.posY + (double)entity.getEyeHeight() - this.explosionY;
|
||||
d7 = entity.posZ - this.explosionZ;
|
||||
double d9 = (double)MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7);
|
||||
|
||||
if (d9 != 0.0D)
|
||||
{
|
||||
d5 /= d9;
|
||||
d6 /= d9;
|
||||
d7 /= d9;
|
||||
double d10 = (double)this.worldObj.getBlockDensity(vec3, entity.boundingBox);
|
||||
double d11 = (1.0D - d4) * d10;
|
||||
entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float)((int)((d11 * d11 + d11) / 2.0D * 8.0D * (double)this.explosionSize + 1.0D)));
|
||||
double d8 = EnchantmentProtection.func_92092_a(entity, d11);
|
||||
entity.motionX += d5 * d8;
|
||||
entity.motionY += d6 * d8;
|
||||
entity.motionZ += d7 * d8;
|
||||
|
||||
if (entity instanceof EntityPlayer)
|
||||
{
|
||||
this.affectedEntities.put((EntityPlayer)entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.explosionSize = f;
|
||||
}
|
||||
}
|
||||
|
||||
public void doExplosionB(boolean p_77279_1_) {
|
||||
|
||||
if(!has(ExAttrib.NOSOUND))
|
||||
this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F);
|
||||
if(f1 > 0.0F && (this.exploder == null || this.exploder.func_145774_a(this, this.worldObj, j1, k1, l1, block, f1))) {
|
||||
hashset.add(new ChunkPosition(j1, k1, l1));
|
||||
}
|
||||
|
||||
if (!has(ExAttrib.NOPARTICLE)) {
|
||||
if (this.explosionSize >= 2.0F && this.isSmoking)
|
||||
{
|
||||
this.worldObj.spawnParticle("hugeexplosion", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.worldObj.spawnParticle("largeexplode", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
d5 += d0 * (double) f2;
|
||||
d6 += d1 * (double) f2;
|
||||
d7 += d2 * (double) f2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Iterator iterator;
|
||||
ChunkPosition chunkposition;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
Block block;
|
||||
this.affectedBlockPositions.addAll(hashset);
|
||||
|
||||
if (this.isSmoking)
|
||||
{
|
||||
iterator = this.affectedBlockPositions.iterator();
|
||||
if(!has(ExAttrib.NOHURT)) {
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
chunkposition = (ChunkPosition)iterator.next();
|
||||
i = chunkposition.chunkPosX;
|
||||
j = chunkposition.chunkPosY;
|
||||
k = chunkposition.chunkPosZ;
|
||||
block = this.worldObj.getBlock(i, j, k);
|
||||
this.explosionSize *= 2.0F;
|
||||
i = MathHelper.floor_double(this.explosionX - (double) this.explosionSize - 1.0D);
|
||||
j = MathHelper.floor_double(this.explosionX + (double) this.explosionSize + 1.0D);
|
||||
k = MathHelper.floor_double(this.explosionY - (double) this.explosionSize - 1.0D);
|
||||
int i2 = MathHelper.floor_double(this.explosionY + (double) this.explosionSize + 1.0D);
|
||||
int l = MathHelper.floor_double(this.explosionZ - (double) this.explosionSize - 1.0D);
|
||||
int j2 = MathHelper.floor_double(this.explosionZ + (double) this.explosionSize + 1.0D);
|
||||
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBox((double) i, (double) k, (double) l, (double) j, (double) i2, (double) j2));
|
||||
net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.worldObj, this, list, this.explosionSize);
|
||||
Vec3 vec3 = Vec3.createVectorHelper(this.explosionX, this.explosionY, this.explosionZ);
|
||||
|
||||
if (!has(ExAttrib.NOPARTICLE))
|
||||
{
|
||||
double d0 = (double)((float)i + this.worldObj.rand.nextFloat());
|
||||
double d1 = (double)((float)j + this.worldObj.rand.nextFloat());
|
||||
double d2 = (double)((float)k + this.worldObj.rand.nextFloat());
|
||||
double d3 = d0 - this.explosionX;
|
||||
double d4 = d1 - this.explosionY;
|
||||
double d5 = d2 - this.explosionZ;
|
||||
double d6 = (double)MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
|
||||
d3 /= d6;
|
||||
d4 /= d6;
|
||||
d5 /= d6;
|
||||
double d7 = 0.5D / (d6 / (double)this.explosionSize + 0.1D);
|
||||
d7 *= (double)(this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F);
|
||||
d3 *= d7;
|
||||
d4 *= d7;
|
||||
d5 *= d7;
|
||||
this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5);
|
||||
this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5);
|
||||
}
|
||||
for(int i1 = 0; i1 < list.size(); ++i1) {
|
||||
Entity entity = (Entity) list.get(i1);
|
||||
double d4 = entity.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double) this.explosionSize;
|
||||
|
||||
if (block.getMaterial() != Material.air)
|
||||
{
|
||||
if (block.canDropFromExplosion(this) && !has(ExAttrib.NODROP))
|
||||
{
|
||||
float chance = 1.0F;
|
||||
|
||||
if(!has(ExAttrib.ALLDROP))
|
||||
chance = 1.0F / this.explosionSize;
|
||||
|
||||
block.dropBlockAsItemWithChance(this.worldObj, i, j, k, this.worldObj.getBlockMetadata(i, j, k), chance, 0);
|
||||
}
|
||||
if(d4 <= 1.0D) {
|
||||
d5 = entity.posX - this.explosionX;
|
||||
d6 = entity.posY + (double) entity.getEyeHeight() - this.explosionY;
|
||||
d7 = entity.posZ - this.explosionZ;
|
||||
double d9 = (double) MathHelper.sqrt_double(d5 * d5 + d6 * d6 + d7 * d7);
|
||||
|
||||
block.onBlockExploded(this.worldObj, i, j, k, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(d9 != 0.0D) {
|
||||
d5 /= d9;
|
||||
d6 /= d9;
|
||||
d7 /= d9;
|
||||
double d10 = (double) this.worldObj.getBlockDensity(vec3, entity.boundingBox);
|
||||
double d11 = (1.0D - d4) * d10;
|
||||
entity.attackEntityFrom(DamageSource.setExplosionSource(this), (float) ((int) ((d11 * d11 + d11) / 2.0D * 8.0D * (double) this.explosionSize + 1.0D)));
|
||||
double d8 = EnchantmentProtection.func_92092_a(entity, d11);
|
||||
entity.motionX += d5 * d8;
|
||||
entity.motionY += d6 * d8;
|
||||
entity.motionZ += d7 * d8;
|
||||
|
||||
if(has(ExAttrib.FIRE) || has(ExAttrib.BALEFIRE) || has(ExAttrib.LAVA))
|
||||
{
|
||||
iterator = this.affectedBlockPositions.iterator();
|
||||
if(entity instanceof EntityPlayer) {
|
||||
this.affectedEntities.put((EntityPlayer) entity, Vec3.createVectorHelper(d5 * d11, d6 * d11, d7 * d11));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
chunkposition = (ChunkPosition)iterator.next();
|
||||
i = chunkposition.chunkPosX;
|
||||
j = chunkposition.chunkPosY;
|
||||
k = chunkposition.chunkPosZ;
|
||||
block = this.worldObj.getBlock(i, j, k);
|
||||
Block block1 = this.worldObj.getBlock(i, j - 1, k);
|
||||
this.explosionSize = f;
|
||||
}
|
||||
}
|
||||
|
||||
boolean shouldReplace = true;
|
||||
|
||||
if(!has(ExAttrib.ALLMOD))
|
||||
shouldReplace = this.explosionRNG.nextInt(3) == 0;
|
||||
|
||||
if (block.getMaterial() == Material.air && block1.func_149730_j() && shouldReplace)
|
||||
{
|
||||
if(has(ExAttrib.FIRE))
|
||||
this.worldObj.setBlock(i, j, k, Blocks.fire);
|
||||
else if(has(ExAttrib.BALEFIRE))
|
||||
this.worldObj.setBlock(i, j, k, ModBlocks.balefire);
|
||||
else if(has(ExAttrib.LAVA))
|
||||
this.worldObj.setBlock(i, j, k, Blocks.flowing_lava);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void doExplosionB(boolean p_77279_1_) {
|
||||
|
||||
public Map func_77277_b()
|
||||
{
|
||||
return this.affectedEntities;
|
||||
}
|
||||
|
||||
public EntityLivingBase getExplosivePlacedBy()
|
||||
{
|
||||
return this.exploder == null ? null : (this.exploder instanceof EntityTNTPrimed ? ((EntityTNTPrimed)this.exploder).getTntPlacedBy() : (this.exploder instanceof EntityLivingBase ? (EntityLivingBase)this.exploder : null));
|
||||
}
|
||||
|
||||
//unconventional name, sure, but it's short
|
||||
public boolean has(ExAttrib attrib) {
|
||||
return this.atttributes.contains(attrib);
|
||||
}
|
||||
if(!has(ExAttrib.NOSOUND))
|
||||
this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F);
|
||||
|
||||
if(!has(ExAttrib.NOPARTICLE)) {
|
||||
if(this.explosionSize >= 2.0F && this.isSmoking) {
|
||||
this.worldObj.spawnParticle("hugeexplosion", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
|
||||
} else {
|
||||
this.worldObj.spawnParticle("largeexplode", this.explosionX, this.explosionY, this.explosionZ, 1.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
Iterator iterator;
|
||||
ChunkPosition chunkposition;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
Block block;
|
||||
|
||||
if(this.isSmoking) {
|
||||
iterator = this.affectedBlockPositions.iterator();
|
||||
|
||||
while(iterator.hasNext()) {
|
||||
chunkposition = (ChunkPosition) iterator.next();
|
||||
i = chunkposition.chunkPosX;
|
||||
j = chunkposition.chunkPosY;
|
||||
k = chunkposition.chunkPosZ;
|
||||
block = this.worldObj.getBlock(i, j, k);
|
||||
|
||||
if(!has(ExAttrib.NOPARTICLE)) {
|
||||
double d0 = (double) ((float) i + this.worldObj.rand.nextFloat());
|
||||
double d1 = (double) ((float) j + this.worldObj.rand.nextFloat());
|
||||
double d2 = (double) ((float) k + this.worldObj.rand.nextFloat());
|
||||
double d3 = d0 - this.explosionX;
|
||||
double d4 = d1 - this.explosionY;
|
||||
double d5 = d2 - this.explosionZ;
|
||||
double d6 = (double) MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
|
||||
d3 /= d6;
|
||||
d4 /= d6;
|
||||
d5 /= d6;
|
||||
double d7 = 0.5D / (d6 / (double) this.explosionSize + 0.1D);
|
||||
d7 *= (double) (this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F);
|
||||
d3 *= d7;
|
||||
d4 *= d7;
|
||||
d5 *= d7;
|
||||
this.worldObj.spawnParticle("explode", (d0 + this.explosionX * 1.0D) / 2.0D, (d1 + this.explosionY * 1.0D) / 2.0D, (d2 + this.explosionZ * 1.0D) / 2.0D, d3, d4, d5);
|
||||
this.worldObj.spawnParticle("smoke", d0, d1, d2, d3, d4, d5);
|
||||
}
|
||||
|
||||
if(block.getMaterial() != Material.air) {
|
||||
if(block.canDropFromExplosion(this) && !has(ExAttrib.NODROP)) {
|
||||
float chance = 1.0F;
|
||||
|
||||
if(!has(ExAttrib.ALLDROP))
|
||||
chance = 1.0F / this.explosionSize;
|
||||
|
||||
block.dropBlockAsItemWithChance(this.worldObj, i, j, k, this.worldObj.getBlockMetadata(i, j, k), chance, 0);
|
||||
}
|
||||
|
||||
block.onBlockExploded(this.worldObj, i, j, k, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(has(ExAttrib.FIRE) || has(ExAttrib.BALEFIRE) || has(ExAttrib.LAVA)) {
|
||||
iterator = this.affectedBlockPositions.iterator();
|
||||
|
||||
while(iterator.hasNext()) {
|
||||
chunkposition = (ChunkPosition) iterator.next();
|
||||
i = chunkposition.chunkPosX;
|
||||
j = chunkposition.chunkPosY;
|
||||
k = chunkposition.chunkPosZ;
|
||||
block = this.worldObj.getBlock(i, j, k);
|
||||
Block block1 = this.worldObj.getBlock(i, j - 1, k);
|
||||
|
||||
boolean shouldReplace = true;
|
||||
|
||||
if(!has(ExAttrib.ALLMOD))
|
||||
shouldReplace = this.explosionRNG.nextInt(3) == 0;
|
||||
|
||||
if(block.getMaterial() == Material.air && block1.func_149730_j() && shouldReplace) {
|
||||
if(has(ExAttrib.FIRE))
|
||||
this.worldObj.setBlock(i, j, k, Blocks.fire);
|
||||
else if(has(ExAttrib.BALEFIRE))
|
||||
this.worldObj.setBlock(i, j, k, ModBlocks.balefire);
|
||||
else if(has(ExAttrib.LAVA))
|
||||
this.worldObj.setBlock(i, j, k, Blocks.flowing_lava);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Map func_77277_b() {
|
||||
return this.affectedEntities;
|
||||
}
|
||||
|
||||
public EntityLivingBase getExplosivePlacedBy() {
|
||||
return this.exploder == null ? null : (this.exploder instanceof EntityTNTPrimed ? ((EntityTNTPrimed) this.exploder).getTntPlacedBy() : (this.exploder instanceof EntityLivingBase ? (EntityLivingBase) this.exploder : null));
|
||||
}
|
||||
|
||||
// unconventional name, sure, but it's short
|
||||
public boolean has(ExAttrib attrib) {
|
||||
return this.atttributes.contains(attrib);
|
||||
}
|
||||
|
||||
//this solution is a bit hacky but in the end easier to work with
|
||||
public static enum ExAttrib {
|
||||
|
||||
@ -200,6 +200,7 @@ public class ShredderRecipes {
|
||||
ShredderRecipes.setRecipe(ModBlocks.crate_tungsten, new ItemStack(ModItems.powder_tungsten, 36));
|
||||
ShredderRecipes.setRecipe(Blocks.anvil, new ItemStack(ModItems.powder_iron, 31));
|
||||
ShredderRecipes.setRecipe(ModBlocks.chain, new ItemStack(ModItems.powder_steel_tiny, 1));
|
||||
ShredderRecipes.setRecipe(ModBlocks.steel_grate, new ItemStack(ModItems.powder_steel_tiny, 3));
|
||||
|
||||
ShredderRecipes.setRecipe(ModBlocks.turret_light, new ItemStack(ModItems.powder_steel, 16));
|
||||
ShredderRecipes.setRecipe(ModBlocks.turret_heavy, new ItemStack(ModItems.powder_steel, 16));
|
||||
|
||||
@ -958,6 +958,10 @@ public class ModItems {
|
||||
public static Item waste_mox_hot;
|
||||
public static Item waste_schrabidium_hot;
|
||||
|
||||
public static Item debris_graphite;
|
||||
public static Item debris_metal;
|
||||
public static Item debris_fuel;
|
||||
|
||||
public static Item containment_box;
|
||||
|
||||
public static Item recycled_ground;
|
||||
@ -3224,6 +3228,10 @@ public class ModItems {
|
||||
rod_dual_waste = new ItemHazard(30F).setUnlocalizedName("rod_dual_waste").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.rod_dual_empty).setTextureName(RefStrings.MODID + ":rod_dual_waste");
|
||||
rod_quad_waste = new ItemHazard(60F).setUnlocalizedName("rod_quad_waste").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.rod_quad_empty).setTextureName(RefStrings.MODID + ":rod_quad_waste");
|
||||
|
||||
debris_graphite = new ItemHazard().addRadiation(70F).toItem().setUnlocalizedName("debris_graphite").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":debris_graphite");
|
||||
debris_metal = new ItemHazard().addRadiation(5F).toItem().setUnlocalizedName("debris_metal").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":debris_metal");
|
||||
debris_fuel = new ItemHazard().addRadiation(1500F).addFire(15).toItem().setUnlocalizedName("debris_fuel").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":debris_fuel");
|
||||
|
||||
pellet_cluster = new ItemCustomLore().setUnlocalizedName("pellet_cluster").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellet_cluster");
|
||||
powder_fire = new ItemCustomLore().setUnlocalizedName("powder_fire").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_red_phosphorus");
|
||||
powder_ice = new ItemCustomLore().setUnlocalizedName("powder_ice").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_ice");
|
||||
@ -5836,6 +5844,10 @@ public class ModItems {
|
||||
GameRegistry.registerItem(rbmk_fuel_balefire, rbmk_fuel_balefire.getUnlocalizedName());
|
||||
GameRegistry.registerItem(rbmk_fuel_drx, rbmk_fuel_drx.getUnlocalizedName());
|
||||
|
||||
GameRegistry.registerItem(debris_graphite, debris_graphite.getUnlocalizedName());
|
||||
GameRegistry.registerItem(debris_metal, debris_metal.getUnlocalizedName());
|
||||
GameRegistry.registerItem(debris_fuel, debris_fuel.getUnlocalizedName());
|
||||
|
||||
GameRegistry.registerItem(scrap, scrap.getUnlocalizedName());
|
||||
GameRegistry.registerItem(waste_uranium_hot, waste_uranium_hot.getUnlocalizedName());
|
||||
GameRegistry.registerItem(waste_thorium_hot, waste_thorium_hot.getUnlocalizedName());
|
||||
|
||||
@ -6,6 +6,7 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import com.hbm.handler.ArmorModHandler;
|
||||
import com.hbm.potion.HbmPotion;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@ -44,7 +45,7 @@ public class ItemModMilk extends ItemArmorMod {
|
||||
|
||||
PotionEffect eff = (PotionEffect) iterator.next();
|
||||
|
||||
if(Potion.potionTypes[eff.getPotionID()].isBadEffect()) {
|
||||
if(HbmPotion.getIsBadEffect(Potion.potionTypes[eff.getPotionID()])) {
|
||||
ints.add(eff.getPotionID());
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,6 +158,17 @@ public class ItemRBMKRod extends ItemHazard {
|
||||
|
||||
double hullHeat = this.getHullHeat(stack);
|
||||
|
||||
//metldown! the hull melts so the entire structure stops making sense
|
||||
//hull and core heats are instantly equalized into 33% of their sum each,
|
||||
//the rest is sent to the component which is always fatal
|
||||
if(hullHeat > this.meltingPoint) {
|
||||
double coreHeat = this.getCoreHeat(stack);
|
||||
double avg = (heat + hullHeat + coreHeat) / 3D;
|
||||
this.setCoreHeat(stack, avg);
|
||||
this.setHullHeat(stack, avg);
|
||||
return avg;
|
||||
}
|
||||
|
||||
if(hullHeat <= heat)
|
||||
return 0;
|
||||
|
||||
|
||||
@ -541,6 +541,7 @@ public class ClientProxy extends ServerProxy {
|
||||
RenderingRegistry.registerBlockHandler(new RenderSpikeBlock());
|
||||
RenderingRegistry.registerBlockHandler(new RenderChain());
|
||||
RenderingRegistry.registerBlockHandler(new RenderMirror());
|
||||
RenderingRegistry.registerBlockHandler(new RenderGrate());
|
||||
|
||||
RenderingRegistry.registerBlockHandler(new RenderRBMKRod());
|
||||
RenderingRegistry.registerBlockHandler(new RenderRBMKReflector());
|
||||
|
||||
@ -380,6 +380,7 @@ public class CraftingManager {
|
||||
GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_scaffold), 8), new Object[] { "SSS", " S ", "SSS", 'S', "ingotSteel" }));
|
||||
GameRegistry.addRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_beam), 8), new Object[] { "S", "S", "S", 'S', ModBlocks.steel_scaffold });
|
||||
GameRegistry.addRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.chain), 8), new Object[] { "S", "S", "S", 'S', ModBlocks.steel_beam });
|
||||
GameRegistry.addRecipe(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam });
|
||||
|
||||
reg2();
|
||||
}
|
||||
|
||||
@ -91,6 +91,7 @@ public class ParticleRBMKFlame extends EntityFX {
|
||||
GL11.glPolygonOffset(0.0F, 0.0F);
|
||||
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
@ -156,24 +156,34 @@ public class HbmPotion extends Potion {
|
||||
public boolean isReady(int par1, int par2) {
|
||||
|
||||
if(this == taint) {
|
||||
|
||||
return par1 % 2 == 0;
|
||||
return par1 % 2 == 0;
|
||||
}
|
||||
|
||||
if(this == radiation || this == radaway || this == telekinesis || this == phosphorus) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if(this == bang) {
|
||||
|
||||
return par1 <= 10;
|
||||
}
|
||||
|
||||
if(this == lead) {
|
||||
|
||||
int k = 60;
|
||||
return k > 0 ? par1 % k == 0 : true;
|
||||
return k > 0 ? par1 % k == 0 : true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public static boolean getIsBadEffect(Potion potion) {
|
||||
|
||||
try {
|
||||
Field isBadEffect = ReflectionHelper.findField(Potion.class, "isBadEffect", "field_76418_K");
|
||||
boolean ret = isBadEffect.getBoolean(potion);
|
||||
return ret;
|
||||
|
||||
} catch (Exception x) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
39
src/main/java/com/hbm/render/block/RenderGrate.java
Normal file
@ -0,0 +1,39 @@
|
||||
package com.hbm.render.block;
|
||||
|
||||
import com.hbm.blocks.generic.BlockGrate;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
public class RenderGrate implements ISimpleBlockRenderingHandler {
|
||||
|
||||
@Override
|
||||
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { }
|
||||
|
||||
@Override
|
||||
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
|
||||
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
|
||||
tessellator.setColorOpaque_F(1, 1, 1);
|
||||
|
||||
renderer.setRenderBounds(0.0D, meta * 0.125D, 0D, 1D, meta * 0.125D + 0.125D, 1D);
|
||||
renderer.renderStandardBlock(block, x, y, z);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldRender3DInInventory(int modelId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderId() {
|
||||
return BlockGrate.renderID;
|
||||
}
|
||||
}
|
||||
@ -22,13 +22,25 @@ public class RenderRBMKControlRod extends TileEntitySpecialRenderer {
|
||||
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float i) {
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(x + 0.5, y + 3, z + 0.5);
|
||||
|
||||
TileEntityRBMKControl control = (TileEntityRBMKControl)te;
|
||||
|
||||
int offset = 1;
|
||||
|
||||
for(int o = 1; o < 16; o++) {
|
||||
|
||||
if(te.getWorldObj().getBlock(te.xCoord, te.yCoord + o, te.zCoord) == te.getBlockType()) {
|
||||
offset = o;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
GL11.glTranslated(x + 0.5, y + offset, z + 0.5);
|
||||
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glEnable(GL11.GL_CULL_FACE);
|
||||
|
||||
TileEntityRBMKControl control = (TileEntityRBMKControl)te;
|
||||
|
||||
bindTexture(texture);
|
||||
|
||||
double level = control.lastLevel + (control.level - control.lastLevel) * i;
|
||||
|
||||
@ -10,6 +10,8 @@ public class RBMKDials {
|
||||
public static final String KEY_COLUMN_HEAT_FLOW = "dialColumnHeatFlow";
|
||||
public static final String KEY_FUEL_DIFFUSION_MOD = "dialDiffusionMod";
|
||||
public static final String KEY_HEAT_PROVISION = "dialHeatProvision";
|
||||
public static final String KEY_COLUMN_HEIGHT = "dialColumnHeight";
|
||||
public static final String KEY_PERMANENT_SCRAP = "dialEnablePermaScrap";
|
||||
|
||||
public static void createDials(World world) {
|
||||
GameRules rules = world.getGameRules();
|
||||
@ -18,6 +20,8 @@ public class RBMKDials {
|
||||
rules.setOrCreateGameRule(KEY_COLUMN_HEAT_FLOW, "0.2");
|
||||
rules.setOrCreateGameRule(KEY_FUEL_DIFFUSION_MOD, "1.0");
|
||||
rules.setOrCreateGameRule(KEY_HEAT_PROVISION, "0.2");
|
||||
rules.setOrCreateGameRule(KEY_COLUMN_HEIGHT, "4");
|
||||
rules.setOrCreateGameRule(KEY_PERMANENT_SCRAP, "false");
|
||||
}
|
||||
|
||||
public static double getPassiveCooling(World world) {
|
||||
@ -39,6 +43,14 @@ public class RBMKDials {
|
||||
return MathHelper.clamp_double(shittyWorkaroundParseDouble(world.getGameRules().getGameRuleStringValue(KEY_HEAT_PROVISION), 0.2D), 0.0D, 1.0D);
|
||||
}
|
||||
|
||||
public static int getColumnHeight(World world) {
|
||||
return MathHelper.clamp_int(shittyWorkaroundParseInt(world.getGameRules().getGameRuleStringValue(KEY_COLUMN_HEIGHT), 4), 1, 16) - 1;
|
||||
}
|
||||
|
||||
public static boolean getPermaScrap(World world) {
|
||||
return world.getGameRules().getGameRuleBooleanValue(KEY_PERMANENT_SCRAP);
|
||||
}
|
||||
|
||||
//why make the double representation accessible in a game rule when you can just force me to add a second pointless parsing operation?
|
||||
public static double shittyWorkaroundParseDouble(String s, double def) {
|
||||
|
||||
@ -46,6 +58,14 @@ public class RBMKDials {
|
||||
return Double.parseDouble(s);
|
||||
} catch(Exception ex) { }
|
||||
|
||||
return def;
|
||||
}
|
||||
public static int shittyWorkaroundParseInt(String s, int def) {
|
||||
|
||||
try {
|
||||
return Integer.parseInt(s);
|
||||
} catch(Exception ex) { }
|
||||
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,13 +22,13 @@ import com.hbm.util.I18nUtil;
|
||||
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
@ -69,6 +69,10 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
|
||||
return true;
|
||||
}
|
||||
|
||||
public int trackingRange() {
|
||||
return 25;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntity() {
|
||||
|
||||
@ -82,10 +86,6 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
|
||||
}
|
||||
}
|
||||
|
||||
public int trackingRange() {
|
||||
return 25;
|
||||
}
|
||||
|
||||
public static final ForgeDirection[] heatDirs = new ForgeDirection[] {
|
||||
ForgeDirection.NORTH,
|
||||
ForgeDirection.EAST,
|
||||
@ -278,7 +278,14 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
|
||||
EntityRBMKDebris debris = new EntityRBMKDebris(worldObj, xCoord + 0.5D, yCoord + 4D, zCoord + 0.5D, type);
|
||||
debris.motionX = worldObj.rand.nextGaussian() * 0.25D;
|
||||
debris.motionZ = worldObj.rand.nextGaussian() * 0.25D;
|
||||
debris.motionY = 1D + worldObj.rand.nextDouble();
|
||||
debris.motionY = 0.25D + worldObj.rand.nextDouble() * 1.25D;
|
||||
|
||||
if(type == DebrisType.LID) {
|
||||
debris.motionX *= 0.5D;
|
||||
debris.motionY += 0.5D;
|
||||
debris.motionZ *= 0.5D;
|
||||
}
|
||||
|
||||
worldObj.spawnEntityInWorld(debris);
|
||||
}
|
||||
|
||||
@ -320,6 +327,25 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
|
||||
rbmk.onMelt(minDist + 1);
|
||||
}
|
||||
|
||||
for(TileEntityRBMKBase rbmk : columns) {
|
||||
|
||||
if(rbmk instanceof TileEntityRBMKRod && worldObj.getBlock(rbmk.xCoord, rbmk.yCoord, rbmk.zCoord) == ModBlocks.corium_block) {
|
||||
|
||||
for(int x = rbmk.xCoord - 1; x <= rbmk.xCoord + 1; x ++) {
|
||||
for(int y = rbmk.yCoord - 1; y <= rbmk.yCoord + 1; y ++) {
|
||||
for(int z = rbmk.zCoord - 1; z <= rbmk.zCoord + 1; z ++) {
|
||||
|
||||
Block b = worldObj.getBlock(x, y, z);
|
||||
|
||||
if(worldObj.rand.nextInt(3) == 0 && (b == ModBlocks.pribris || b == ModBlocks.pribris_burning)) {
|
||||
worldObj.setBlock(x, y, z, ModBlocks.pribris_radiating);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int smallDim = Math.min(maxX - minX, maxZ - minZ);
|
||||
int avgX = minX + (maxX - minX) / 2;
|
||||
int avgZ = minZ + (maxZ - minZ) / 2;
|
||||
@ -329,6 +355,8 @@ public abstract class TileEntityRBMKBase extends TileEntity implements INBTPacke
|
||||
data.setFloat("scale", smallDim);
|
||||
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, avgX + 0.5, yCoord + 1, avgZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,avgX + 0.5, yCoord + 1, avgZ + 0.5, 250));
|
||||
MainRegistry.proxy.effectNT(data);
|
||||
|
||||
worldObj.playSoundEffect(avgX + 0.5, yCoord + 1, avgZ + 0.5, "hbm:block.rbmk_explosion", 50.0F, 1.0F);
|
||||
}
|
||||
|
||||
private void getFF(int x, int y, int z) {
|
||||
|
||||
@ -54,6 +54,11 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM
|
||||
rod.updateHeat(worldObj, slots[0]);
|
||||
this.heat += rod.provideHeat(worldObj, slots[0], heat);
|
||||
|
||||
if(this.heat > this.maxHeat()) {
|
||||
this.meltdown();
|
||||
return;
|
||||
}
|
||||
|
||||
//for spreading, we want the buffered flux to be 0 because we want to know exactly how much gets reflected back
|
||||
this.fluxFast = 0;
|
||||
this.fluxSlow = 0;
|
||||
@ -181,11 +186,14 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM
|
||||
if(worldObj.rand.nextInt(3) == 0)
|
||||
reduce++;
|
||||
|
||||
boolean corium = slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod;
|
||||
slots[0] = null;
|
||||
|
||||
for(int i = 3; i >= 0; i--) {
|
||||
|
||||
if(i <= 4 - reduce) {
|
||||
|
||||
if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) {
|
||||
if(corium) {
|
||||
worldObj.setBlock(xCoord, yCoord + i, zCoord, ModBlocks.corium_block);
|
||||
|
||||
} else {
|
||||
@ -203,7 +211,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord + i, zCoord);
|
||||
}
|
||||
|
||||
if(slots[0] != null && slots[0].getItem() instanceof ItemRBMKRod) {
|
||||
if(corium) {
|
||||
int count = 1 + worldObj.rand.nextInt(3);
|
||||
|
||||
for(int i = 0; i < count; i++) {
|
||||
|
||||
@ -995,6 +995,9 @@ item.custom_nuke.name=AB - Nukleares Element
|
||||
item.custom_schrab.name=AB - Schrabidiumelement
|
||||
item.custom_tnt.name=AB - Sprengladung
|
||||
item.cyclotron_tower.name=Zyklotronenturm
|
||||
item.debris_fuel.name=RBMK-Kernbrennstoffbrocken
|
||||
item.debris_graphite.name=Heißer Graphitbrocken
|
||||
item.debris_metal.name=Gebrochene Metallleiste
|
||||
item.definitelyfood.name=GarantiertKeinDreck-Marken Feldration
|
||||
item.defuser.name=High-Tech Bombenentschärfungsgerät
|
||||
item.demon_core_closed.name=Bedeckter Dämonenkern
|
||||
@ -2818,6 +2821,8 @@ tile.plasma.name=Plasma
|
||||
tile.plasma_heater.name=Plasmaerhitzer
|
||||
tile.pole_satellite_receiver.name=Satellitenschüssel
|
||||
tile.pole_top.name=Antennenspitze
|
||||
tile.pribris.name=RBMK-Schutt
|
||||
tile.pribris_burning.name=Flammender RBMK-Schutt
|
||||
tile.radiobox.name=Rosenberg Ungeziefervernichter
|
||||
tile.radiorec.name=Kaputtes UKW Radio
|
||||
tile.rail_booster.name=Hochgeschwindigkeits-Boosterschienen
|
||||
@ -2877,6 +2882,7 @@ tile.soyuz_launcher.name=Soyuz-Startplatform
|
||||
tile.spikes.name=Stacheln
|
||||
tile.steel_beam.name=Stahlträger
|
||||
tile.steel_corner.name=Stahlwand (Ecke)
|
||||
tile.steel_grate.name=Stahlgitter
|
||||
tile.steel_poles.name=Stahlmasten
|
||||
tile.steel_roof.name=Flaches Stachldach
|
||||
tile.steel_scaffold.name=Stahlgerüst
|
||||
|
||||
@ -995,6 +995,9 @@ item.custom_nuke.name=Custom Nuke Nuclear Rod
|
||||
item.custom_schrab.name=Custom Nuke Schrabidium Rod
|
||||
item.custom_tnt.name=Custom Nuke Explosive Charge
|
||||
item.cyclotron_tower.name=Cyclotron Tower
|
||||
item.debris_fuel.name=RBMK Fuel Chunk
|
||||
item.debris_graphite.name=Hot Graphite Chunk
|
||||
item.debris_metal.name=Broken Metal Bar
|
||||
item.definitelyfood.name=TotallyNotDirt-Brand MRE
|
||||
item.defuser.name=High-Tech Bomb Defusing Device
|
||||
item.demon_core_closed.name=Closed Demon Core
|
||||
@ -2818,6 +2821,8 @@ tile.plasma.name=Plasma
|
||||
tile.plasma_heater.name=Plasma Heater
|
||||
tile.pole_satellite_receiver.name=Satellite Dish
|
||||
tile.pole_top.name=Antenna Top
|
||||
tile.pribris.name=RBMK Debris
|
||||
tile.pribris_burning.name=Flaming RBMK Debris
|
||||
tile.radiobox.name=Rosenberg Pest Control Box
|
||||
tile.radiorec.name=Broken FM Radio
|
||||
tile.rail_booster.name=High Speed Booster Rail
|
||||
@ -2877,6 +2882,7 @@ tile.soyuz_launcher.name=Soyuz Launch Platform
|
||||
tile.spikes.name=Spikes
|
||||
tile.steel_beam.name=Steel Beam
|
||||
tile.steel_corner.name=Steel Wall Corner
|
||||
tile.steel_grate.name=Steel Grate
|
||||
tile.steel_poles.name=Steel Pole
|
||||
tile.steel_roof.name=Flat Steel Roof
|
||||
tile.steel_scaffold.name=Steel Scaffold
|
||||
|
||||
@ -34,7 +34,8 @@
|
||||
"block.closeDoor": {"category": "block", "sounds": ["block/door_close_1", "block/door_close_2"]},
|
||||
"block.soyuzReady": {"category": "block", "sounds": [{"name": "block/soyuzReady", "stream": true}]},
|
||||
"block.screm": {"category": "block", "sounds": ["screm/scream1", "screm/scream01", "screm/scream2", "screm/scream02", "screm/scream3", "screm/scream03", "screm/scream4", "screm/scream04", "screm/scream5", "screm/scream05", "screm/scream6", "screm/scream06", "screm/scream7", "screm/scream07", "screm/scream08", "screm/scream09", "screm/scream10", "screm/scream11", "screm/scream12", "screm/scream13", "screm/scream14", "screm/scream15", "screm/scream16", "screm/scream17", "screm/scream18", "screm/scream19", "screm/scream20", "screm/scream21", "screm/scream22", "screm/scream23", "screm/scream24", "screm/scream25"]},
|
||||
|
||||
"block.rbmk_explosion": {"category": "block", "sounds": [{"name": "block/rbmk_explosion", "stream": false}]},
|
||||
|
||||
"item.techBleep": {"category": "player", "sounds": [{"name": "tool/techBleep", "stream": false}]},
|
||||
"item.techBoop": {"category": "player", "sounds": [{"name": "tool/techBoop", "stream": false}]},
|
||||
"item.geiger1": {"category": "player", "sounds": [{"name": "tool/geiger1", "stream": false}]},
|
||||
@ -181,6 +182,7 @@
|
||||
"step.iron_jump": {"category": "player", "sounds": [{"name": "footsteps/iron_jump", "stream": false}]},
|
||||
"step.iron_land": {"category": "player", "sounds": [{"name": "footsteps/iron_land", "stream": false}]},
|
||||
"step.iron": {"category": "player", "sounds": ["footsteps/iron1", "footsteps/iron2", "footsteps/iron3", "footsteps/iron4"]},
|
||||
"step.metalBlock": {"category": "block", "sounds": ["footsteps/metalStep1", "footsteps/metalStep2", "footsteps/metalStep3", "footsteps/metalStep4"]},
|
||||
|
||||
"potatos.random": {"category": "player", "sounds": ["potatos/randResponse0", "potatos/randResponse1", "potatos/randResponse2", "potatos/randResponse3", "potatos/randResponse4", "potatos/randResponse5", "potatos/randResponse6", "potatos/randResponse7"]},
|
||||
|
||||
|
||||
BIN
src/main/resources/assets/hbm/sounds/block/rbmk_explosion.ogg
Normal file
BIN
src/main/resources/assets/hbm/sounds/footsteps/metalStep1.ogg
Normal file
BIN
src/main/resources/assets/hbm/sounds/footsteps/metalStep2.ogg
Normal file
BIN
src/main/resources/assets/hbm/sounds/footsteps/metalStep3.ogg
Normal file
BIN
src/main/resources/assets/hbm/sounds/footsteps/metalStep4.ogg
Normal file
BIN
src/main/resources/assets/hbm/textures/blocks/grate_side.png
Normal file
|
After Width: | Height: | Size: 180 B |
BIN
src/main/resources/assets/hbm/textures/blocks/grate_top.png
Normal file
|
After Width: | Height: | Size: 451 B |
|
After Width: | Height: | Size: 681 B |
BIN
src/main/resources/assets/hbm/textures/items/debris_fuel.png
Normal file
|
After Width: | Height: | Size: 471 B |
BIN
src/main/resources/assets/hbm/textures/items/debris_fuel_alt.png
Normal file
|
After Width: | Height: | Size: 357 B |
|
After Width: | Height: | Size: 503 B |
BIN
src/main/resources/assets/hbm/textures/items/debris_metal.png
Normal file
|
After Width: | Height: | Size: 260 B |