@Override public void onUsingTick(ItemStack is, EntityPlayer ep, int count) { if (is.getItemDamage() > 0 && this.getWater(is) > 0) { double r = 1; double d = ReikaRandomHelper.getRandomPlusMinus(2.5, 2); Vec3 vec = ep.getLookVec(); double dx = ep.posX + vec.xCoord * d; double dy = ep.posY + ep.getEyeHeight() + vec.yCoord * d; double dz = ep.posZ + vec.zCoord * d; if (count % TICK_PER_KJ == 0) { AxisAlignedBB box = AxisAlignedBB.getBoundingBox(dx, dy, dz, dx, dy, dz).expand(r, r, r); List<EntityRadiation> li = ep.worldObj.getEntitiesWithinAABB(EntityRadiation.class, box); for (EntityRadiation e : li) { e.clean(); } } int n = ReikaRandomHelper.getRandomPlusMinus(8, 4); for (int i = 0; i < n; i++) { double v = ReikaRandomHelper.getRandomPlusMinus(0.1875, 0.0625); double vx = vec.xCoord * v; double vy = vec.yCoord * v; double vz = vec.zCoord * v; vx = ReikaRandomHelper.getRandomPlusMinus(vx, 0.001); vz = ReikaRandomHelper.getRandomPlusMinus(vz, 0.001); ReikaParticleHelper.RAIN.spawnAt(ep.worldObj, dx, dy, dz, vx, vy, vz); } } }
@SideOnly(Side.CLIENT) private void spawnParticle(World world, int x, int y, int z) { int p = Minecraft.getMinecraft().gameSettings.particleSetting; if (rand.nextInt(1 + p / 2) == 0) { double d = 1.25; double rx = ReikaRandomHelper.getRandomPlusMinus(x + 0.5, d); double ry = ReikaRandomHelper.getRandomPlusMinus(y + 0.5, d); double rz = ReikaRandomHelper.getRandomPlusMinus(z + 0.5, d); EntityFlareFX fx = new EntityFlareFX(color, world, rx, ry, rz); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } if (this.isEnhanced()) { int n = 2 + (int) Math.sin(Math.toRadians(this.getTicksExisted())); for (int i = 0; i < n; i++) { float s = (float) ReikaRandomHelper.getRandomPlusMinus(2D, 1); int l = 10 + rand.nextInt(50); EntityFloatingSeedsFX fx = new EntityFloatingSeedsFX( world, x + 0.5, y + 0.5, z + 0.5, rand.nextInt(360), ReikaRandomHelper.getRandomPlusMinus(0, 90)); fx.fadeColors(ReikaColorAPI.mixColors(color.getColor(), 0xffffff, 0.375F), color.getColor()) .setScale(s) .setLife(l) .setRapidExpand(); fx.freedom *= 3; fx.velocity *= 3; Minecraft.getMinecraft().effectRenderer.addEffect(fx); } } }
private void fightDecay(World world, int x, int y, int z) { if (MystObjects.decay != null) { int rx = ReikaRandomHelper.getRandomPlusMinus(x, 64); int rz = ReikaRandomHelper.getRandomPlusMinus(z, 64); ReikaChunkHelper.removeBlocksFromChunk(world, rx, rz, MystObjects.decay.blockID, -1); } }
private void denyEntity(Entity e) { e.motionY = 1.5; e.fallDistance = Math.max(e.fallDistance, 500); e.addVelocity( ReikaRandomHelper.getRandomPlusMinus(0, 0.25), 0, ReikaRandomHelper.getRandomPlusMinus(0, 0.25)); ChromaSounds.POWERDOWN.playSound(e); }
@SideOnly(Side.CLIENT) private void doFXClient() { for (int i = 0; i < 32; i++) { double x = ReikaRandomHelper.getRandomPlusMinus(xCoord + 0.5, 0.75); double y = ReikaRandomHelper.getRandomPlusMinus(yCoord + 0.5, 0.5); double z = ReikaRandomHelper.getRandomPlusMinus(zCoord + 0.5, 0.75); int l = ReikaRandomHelper.getRandomBetween(8, 30); EntityFX fx = new EntityBlurFX(worldObj, x, y, z).setColor(this.getRenderColor()).setLife(l); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } }
@SideOnly(Side.CLIENT) private void activeParticles() { CrystalElement e = CrystalElement.elements[ticks / 8 % 16]; double vx = ReikaRandomHelper.getRandomPlusMinus(0, 0.03125); double vz = ReikaRandomHelper.getRandomPlusMinus(0, 0.03125); float g = -(float) ReikaRandomHelper.getRandomPlusMinus(0.125, 0.0625); EntityBlurFX fx = new EntityBlurFX(worldObj, xCoord + 0.5, yCoord + 8.25, zCoord + 0.5, vx, 0, vz) .setGravity(g); Minecraft.getMinecraft().effectRenderer.addEffect(fx); // --------------------------- int dx = worldObj.rand.nextBoolean() ? 3 : -3; int dz = worldObj.rand.nextBoolean() ? 3 : -3; double x = xCoord + dx + worldObj.rand.nextDouble(); double y = yCoord + 5 + worldObj.rand.nextDouble(); double z = zCoord + dz + worldObj.rand.nextDouble(); double v = 0.0625; vx = x < xCoord ? v : -v; vz = z < zCoord ? v : -v; if (worldObj.rand.nextBoolean()) vx = 0; else vz = 0; EntityFX fx2 = new EntityCenterBlurFX(e, worldObj, x, y, z, vx, 0, vz).setScale(2).setNoSlowdown(); fx2.noClip = true; Minecraft.getMinecraft().effectRenderer.addEffect(fx2); // ---------------------------------- dx = worldObj.rand.nextBoolean() ? 7 : -7; dz = worldObj.rand.nextBoolean() ? 7 : -7; if (worldObj.rand.nextBoolean()) dx += Math.signum(dx) * -4; else dz += Math.signum(dz) * -4; x = xCoord + dx + worldObj.rand.nextDouble(); y = yCoord + 5 + worldObj.rand.nextDouble(); z = zCoord + dz + worldObj.rand.nextDouble(); v = 0.0625; vx = x < xCoord ? v : -v; vz = z < zCoord ? v : -v; if (worldObj.rand.nextBoolean()) vx = 0; else vz = 0; boolean longAxis = (Math.abs(dx) == 7 && vx != 0) || (Math.abs(dz) == 7 && vz != 0); int l = !longAxis ? 100 : 60; EntityRuneFX fx3 = new EntityRuneFX(worldObj, x, y, z, vx, 0, vz, e).setScale(2).setLife(l); fx3.noClip = true; Minecraft.getMinecraft().effectRenderer.addEffect(fx3); }
@SideOnly(Side.CLIENT) private void invalidatationParticles() { double d = 1.25; int n = 64 + rand.nextInt(64); for (int i = 0; i < n; i++) { double rx = ReikaRandomHelper.getRandomPlusMinus(xCoord + 0.5, d); double ry = ReikaRandomHelper.getRandomPlusMinus(yCoord + 0.5, d); double rz = ReikaRandomHelper.getRandomPlusMinus(zCoord + 0.5, d); double vx = rand.nextDouble() - 0.5; double vy = rand.nextDouble() - 0.5; double vz = rand.nextDouble() - 0.5; EntityRuneFX fx = new EntityRuneFX(worldObj, rx, ry, rz, vx, vy, vz, color); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } }
@SideOnly(Side.CLIENT) private void idleParticles() { double px = ReikaRandomHelper.getRandomPlusMinus(xCoord + 0.5, 1.5); double pz = ReikaRandomHelper.getRandomPlusMinus(zCoord + 0.5, 1.5); float g = -(float) ReikaRandomHelper.getRandomPlusMinus(0.125, 0.0625); int color = CrystalElement.getBlendedColor(ticks, 40); int l = ReikaRandomHelper.getRandomPlusMinus(80, 40); EntityBlurFX fx = new EntityBlurFX(worldObj, px, yCoord + 1.25, pz, 0, 0, 0) .setGravity(g) .setLife(l) .setColor(color); fx.noClip = true; Minecraft.getMinecraft().effectRenderer.addEffect(fx); }
private void pickNewTarget() { targetRadius = ReikaRandomHelper.getRandomPlusMinus( maxSize, maxSize / 16D); // rand.nextDouble()*maxSize; targetTheta = rand.nextDouble() * 360; targetPhi = rand.nextDouble() * 360; }
public RenderPageExtractor() { for (int i = 0; i < 12; i++) { double v = ReikaRandomHelper.getRandomBetween(0.03125 / 4, 0.03125 / 2); BasicVariablePoint point = new BasicVariablePoint(new DecimalPosition(0, 0, 0), 1, v); point.tolerance = 0.03125; points.add(point); } }
@SideOnly(Side.CLIENT) private static void doDeathParticles(World world, double dx, double dy, double dz, int color) { int n = 32; for (int i = 0; i < n; i++) { EntityCenterBlurFX fx = new EntityCenterBlurFX(world, dx, dy, dz).setColor(color).setScale(1.5F); fx.motionX = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); fx.motionY = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); fx.motionZ = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); EntityCenterBlurFX fx2 = new EntityCenterBlurFX(world, dx, dy, dz).setColor(0xffffff).setScale(0.5F); fx2.motionX = fx.motionX; fx2.motionY = fx.motionY; fx2.motionZ = fx.motionZ; Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect(fx2); } }
@Override protected void updateTemperature(World world, int x, int y, int z) { super.updateTemperature(world, x, y, z); int Tamb = ReikaBiomeHelper.getBiomeTemp(world, x, z); int dT = temperature - Tamb; if (dT != 0 && ReikaWorldHelper.checkForAdjBlock(world, x, y, z, 0) != null) temperature -= (1 + dT / 32); if (dT > 0) { for (int i = 2; i < 6; i++) { ForgeDirection dir = dirs[i]; int dx = x + dir.offsetX; int dy = y + dir.offsetY; int dz = z + dir.offsetZ; int id = world.getBlockId(dx, dy, dz); int meta = world.getBlockMetadata(dx, dy, dz); if (id == ReactorTiles.COOLANT.getBlockID() && meta == ReactorTiles.COOLANT.getBlockMetadata()) { TileEntityWaterCell te = (TileEntityWaterCell) world.getBlockTileEntity(dx, dy, dz); if (te.getLiquidState().isWater() && temperature >= 100 && ReikaRandomHelper.doWithChance(40)) { te.setLiquidState(LiquidStates.EMPTY); temperature -= 20; } } if (id == this.getTileEntityBlockID() && meta == ReactorTiles.TEList[this.getIndex()].getBlockMetadata()) { TileEntityNuclearCore te = (TileEntityNuclearCore) world.getBlockTileEntity(dx, dy, dz); int dTemp = temperature - te.temperature; if (dTemp > 0) { temperature -= dTemp / 16; te.temperature += dTemp / 16; } } } } if (hydrogen > 0) hydrogen--; if (temperature >= 500) { ReactorAchievements.HOTCORE.triggerAchievement(this.getPlacer()); } if (temperature > this.getMaxTemperature()) { this.onMeltdown(world, x, y, z); ReactorAchievements.MELTDOWN.triggerAchievement(this.getPlacer()); } if (temperature > HYDROGEN) { hydrogen += 1; if (hydrogen > 200) { this.onMeltdown(world, x, y, z); } } }
private void convertToRainbowForest(World world, int x, int y, int z) { int rx = ReikaRandomHelper.getRandomPlusMinus(x, 32); int rz = ReikaRandomHelper.getRandomPlusMinus(z, 32); if (world.checkChunksExist(rx, 0, rz, rx, 255, rz)) { int r = 3; for (int i = -r; i <= r; i++) { for (int k = -r; k <= r; k++) { int dx = rx + i; int dz = rz + k; BiomeGenBase biome = world.getBiomeGenForCoords(dx, dz); int id = biome.biomeID; if (id != DyeTrees.forest.biomeID) { ReikaWorldHelper.setBiomeForXZ(world, dx, dz, DyeTrees.forest); } } } } }
@Override public final void dropBlockAsItemWithChance( World world, int x, int y, int z, int metadata, float chance, int fortune) { if (!world.isRemote) { ArrayList<ItemStack> li = this.getBlockDropped(world, x, y, z, metadata, fortune); for (int i = 0; i < li.size(); i++) { if (chance >= 1 || ReikaRandomHelper.doWithChance(chance)) this.dropBlockAsItem_do(world, x, y, z, li.get(i)); } } }
private final ArrayList<ItemStack> getDyes(World world, int x, int y, int z, int fortune) { int drop = this.getDyeDropCount(fortune); ArrayList<ItemStack> li = new ArrayList(); for (int i = 0; i < drop; i++) { if (ReikaRandomHelper.doWithChance(DyeOptions.DYEFRAC.getValue())) { li.add(new ItemStack(Item.dyePowder.itemID, 1, rand.nextInt(16))); } else { li.add(new ItemStack(DyeItems.DYE.getShiftedItemID(), 1, rand.nextInt(16))); } } return li; }
private Coordinate getRandomPosition(World world, int x, int y, int z) { ForgeDirection dir = this.getFacing(); ForgeDirection left = ReikaDirectionHelper.getLeftBy90(dir); int r = rand.nextInt(16); int sp = ReikaRandomHelper.getRandomPlusMinus(0, r); // r/2 int dx = x + r * dir.offsetX + sp * left.offsetX; // ReikaRandomHelper.getRandomPlusMinus(x, r); int dz = z + r * dir.offsetZ + sp * left.offsetZ; // ReikaRandomHelper.getRandomPlusMinus(z, r); int dy = ReikaWorldHelper.findTopBlockBelowY( world, dx, y, dz); // Math.min(y, world.getTopSolidOrLiquidBlock(x, z)); return new Coordinate(dx, dy, dz); }
private int getSmeltNumber(int stage, OreType ore, ItemStack is) { if (bedrock && stage == 0) return 2; // ReikaJavaLibrary.pConsole(RotaryConfig.getDifficulty()); if (ore != null) { if (ore.getRarity() == OreRarity.RARE) { if (ReikaRandomHelper.doWithChance(oreCopyRare / 100D)) return 2; else return 1; } boolean nether = ore instanceof ModOreList && ((ModOreList) ore).isNetherOres(); if (is.getItemDamage() == 1 && (ore == ModOreList.FORCE || ore == ModOreList.MIMICHITE)) nether = true; if (ReikaItemHelper.matchStackWithBlock(is, MagicCropHandler.getInstance().netherOreID)) nether = true; if (nether) { // .isNetherOres() if (ReikaRandomHelper.doWithChance(oreCopyNether / 100D)) return 2; else return 1; } } return ReikaRandomHelper.doWithChance(oreCopy / 100D) ? 2 : 1; }
@SideOnly(Side.CLIENT) public void doWarningParticles(World world, int x, int y, int z) { int n = 2 + rand.nextInt(6); for (int i = 0; i < n; i++) { double rx = x + rand.nextDouble(); double ry = y + rand.nextDouble(); double rz = z + rand.nextDouble(); int l = 10 + rand.nextInt(20); float g = -(float) ReikaRandomHelper.getRandomPlusMinus(0.0625, 0.03125); EntityFX fx = new EntityCenterBlurFX(world, rx, ry, rz).setGravity(g).setLife(l); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } }
private void convertPureNodeMagic(World world, int x, int y, int z) { int rx = ReikaRandomHelper.getRandomPlusMinus(x, 64); int rz = ReikaRandomHelper.getRandomPlusMinus(z, 64); if (world.checkChunksExist(rx, 0, rz, rx, 255, rz)) { int r = 3; for (int i = -r; i <= r; i++) { for (int k = -r; k <= r; k++) { int dx = rx + i; int dz = rz + k; BiomeGenBase biome = world.getBiomeGenForCoords(dx, dz); int id = biome.biomeID; if (id == ThaumBlockHandler.getInstance().magicBiomeID) { BiomeGenBase natural = ReikaWorldHelper.getNaturalGennedBiomeAt(world, dx, dz); if (natural != null && DyeTrees.isRainbowForest(natural)) { ReikaWorldHelper.setBiomeForXZ(world, dx, dz, natural); } } } } } }
private void fightEerie(World world, int x, int y, int z) { int rx = ReikaRandomHelper.getRandomPlusMinus(x, 32); int rz = ReikaRandomHelper.getRandomPlusMinus(z, 32); if (world.checkChunksExist(rx, 0, rz, rx, 255, rz)) { int r = 3; for (int i = -r; i <= r; i++) { for (int k = -r; k <= r; k++) { int dx = rx + i; int dz = rz + k; BiomeGenBase biome = world.getBiomeGenForCoords(dx, dz); int id = biome.biomeID; if (id == ThaumBlockHandler.getInstance().eerieBiomeID) { BiomeGenBase natural = ReikaWorldHelper.getNaturalGennedBiomeAt(world, dx, dz); if (natural != null) { ReikaWorldHelper.setBiomeForXZ(world, dx, dz, natural); } } } } } }
@SideOnly(Side.CLIENT) private void lifeParticles() { int p = Minecraft.getMinecraft().gameSettings.particleSetting; if (rand.nextInt(1 + p * 2) == 0) { double d = 0.25; double px = ReikaRandomHelper.getRandomPlusMinus(posX, d); double py = ReikaRandomHelper.getRandomPlusMinus(posY, d); double pz = ReikaRandomHelper.getRandomPlusMinus(posZ, d); float g = (float) ReikaRandomHelper.getRandomPlusMinus(0.05, 0.025); if (rand.nextInt(4) == 0) g = -g; EntityLaserFX fx = new EntityLaserFX(color, worldObj, px, py, pz) .setColor(this.getRenderColor()) .setGravity(g); EntityLaserFX fx2 = new EntityLaserFX(color, worldObj, px, py, pz) .setColor(0xffffff) .setScale(0.42F) .setGravity(g); Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect(fx2); } }
public TieredOreRenderer() { for (int a = 0; a < 16; a++) { for (int i = 0; i < numSections + 1; i++) { for (int k = 0; k < numSections + 1; k++) { double dy = 1; double dr = 0.25; double di = Math.min(i, numSections - i) / (double) numSections; double dk = Math.min(k, numSections - k) / (double) numSections; double dp = 0.25; dy = 1 - dr * Math.pow(di, dp) * Math.pow(dk, dp); if (di > 0 && dk > 0) dy = ReikaRandomHelper.getRandomPlusMinus(dy, dr * 0.125); stoneOffsets[a][i * numSections + k] = dy; } } for (int i = 0; i < numSections + 1; i++) { for (int k = 0; k < numSections + 1; k++) { double dy = 1; double dr = 0.25; double di = Math.min(i, numSections - i) / (double) numSections; double dk = Math.min(k, numSections - k) / (double) numSections; double dp = 0.25; dy = 1 + dr * Math.pow(di, dp) * Math.pow(dk, dp) - 0.25; if (di > 0 && dk > 0) dy = ReikaRandomHelper.getRandomPlusMinus(dy, dr * 0.5); oreOffsets[a][i * numSections + k] = dy; } } } for (int a = 0; a < 16; a++) { for (int b = 0; b < 16; b++) { for (int c = 0; c < 16; c++) { offsetArray[a][b][c] = ReikaRandomHelper.getSafeRandomInt(16); } } } }
@Override public void onUpdate() { super.onUpdate(); if (ReikaMathLibrary.approxr(velocity.inclination, targetTheta, 2)) { targetTheta = rand.nextInt(360); } else { if (targetTheta > velocity.inclination) velocity.inclination++; else velocity.inclination--; } if (ReikaMathLibrary.approxr(velocity.rotation, targetPhi, 2)) { targetPhi = rand.nextInt(360); } else { if (targetPhi > velocity.rotation) velocity.rotation++; else velocity.rotation--; } if (ReikaMathLibrary.approxr(velocity.rotation, targetPhi, 0.05)) { targetVelocity = ReikaRandomHelper.getRandomPlusMinus(0.1, 0.1); } else { if (targetVelocity > velocity.magnitude) velocity.magnitude += 0.01D; else velocity.magnitude -= 0.01D; } velocityChanged = true; // ReikaJavaLibrary.pConsole(velocity.inclination+"/"+targetTheta+"; // "+velocity.rotation+"/"+targetPhi, Side.SERVER); double[] v = velocity.getCartesian(); motionX = v[0]; motionY = v[1]; motionZ = v[2]; if (targetColor != null) { colorTransitionFraction += 0.1F; if (colorTransitionFraction >= 1) { color = targetColor; targetColor = null; colorTransitionFraction = 0; } } dataWatcher.updateObject(30, this.calcRenderColor()); if (worldObj.isRemote) { this.lifeParticles(); } fallDistance = 0; }
private Collection<ItemStack> getDrops(World world, int x, int y, int z, Block b, int meta) { float f = this.getYield(b, meta); if (ReikaRandomHelper.doWithChance(f)) { Collection<ItemStack> ret = b.getDrops(world, x, y, z, meta, this.getEnchantment(Enchantment.fortune)); if (tree.getTreeType() == ModWoodList.SLIME) { Block log = tree.getTreeType().getLogID(); if (b == log) { ret.clear(); ret.add(new ItemStack(Items.slime_ball)); } } return ret; } else return new ArrayList(); }
@Override public final ArrayList<ItemStack> getBlockDropped( World world, int x, int y, int z, int meta, int fortune) { ArrayList<ItemStack> li = new ArrayList(); float saplingChance = 0.0125F; float appleChance = 0.1F; float goldAppleChance = 0.025F; float rareGoldAppleChance = 0.0025F; saplingChance *= (1 + fortune); appleChance *= (1 + fortune * 5); goldAppleChance *= (1 + fortune * 3); rareGoldAppleChance *= (1 + fortune * 3); if (ReikaRandomHelper.doWithChance(saplingChance)) li.add(new ItemStack(DyeBlocks.RAINBOWSAPLING.getBlockID(), 1, meta)); if (ReikaRandomHelper.doWithChance(appleChance)) li.add(new ItemStack(Item.appleRed, 1, 0)); if (ReikaRandomHelper.doWithChance(goldAppleChance)) li.add(new ItemStack(Item.appleGold, 1, 0)); if (ReikaRandomHelper.doWithChance(rareGoldAppleChance)) li.add(new ItemStack(Item.appleGold, 1, 1)); li.addAll(this.getDyes(world, x, y, z, fortune)); return li; }
@Override public void updateEntity(World world, int x, int y, int z, int meta) { if (!world.isRemote && this.isFissile() && rand.nextInt(20) == 0) world.spawnEntityInWorld(new EntityNeutron(world, x, y, z, this.getRandomDirection())); // ReikaInventoryHelper.clearInventory(this); // ReikaInventoryHelper.addToIInv(ReactorItems.FUEL.getStackOf(), this); this.feed(); tempTimer.update(); if (tempTimer.checkCap()) { this.updateTemperature(world, x, y, z); } // ReikaJavaLibrary.pConsole(temperature); if (temperature > CLADDING) { if (rand.nextInt(20) == 0) ReikaSoundHelper.playSoundAtBlock(world, x, y, z, "random.fizz"); ReikaParticleHelper.SMOKE.spawnAroundBlockWithOutset(world, x, y, z, 9, 0.0625); } else if (temperature > 500 && ReikaRandomHelper.doWithChance(20)) { if (rand.nextInt(20) == 0) ReikaSoundHelper.playSoundAtBlock(world, x, y, z, "random.fizz"); ReikaParticleHelper.SMOKE.spawnAroundBlockWithOutset(world, x, y, z, 4, 0.0625); } }
private int droppedXP() { int factor = ReactorOptions.RAINBOW.getState() ? 6 : 1; return ReikaRandomHelper.doWithChance(ReactorOres.FLUORITE.xpDropped * factor) ? 1 : 0; }
public class EntityBallLightning extends EntityLiving implements IEntityAdditionalSpawnData { private SphericalVector velocity; private double targetTheta = rand.nextInt(360); private double targetPhi = rand.nextInt(360); private double targetVelocity = ReikaRandomHelper.getRandomPlusMinus(0.1, 0.1); private CrystalElement color; private CrystalElement targetColor = null; private float colorTransitionFraction = 0; private boolean isPylonSpawn = false; private boolean doDrops = true; // private static int spawnedEntities; public EntityBallLightning(World world, CrystalElement color, double x, double y, double z) { super(world); this.color = color; this.setPosition(x, y, z); height = 0.25F; width = 0.25F; } public EntityBallLightning(World world) { super(world); } public EntityBallLightning setNoDrops() { doDrops = false; return this; } public EntityBallLightning setPylon() { isPylonSpawn = true; return this; } @Override protected boolean canTriggerWalking() { return false; } @Override public boolean canRenderOnFire() { return false; } @Override protected String func_146067_o(int p_146067_1_) { return ""; } @Override protected void fall(float p_70069_1_) {} @Override public boolean handleWaterMovement() { return false; } @Override protected void entityInit() { super.entityInit(); velocity = new SphericalVector(0.15, rand.nextInt(360), rand.nextInt(360)); if (color == null) color = CrystalElement.randomElement(); dataWatcher.addObject(30, 0); if (worldObj != null) ; // spawnedEntities++; } @Override public void onUpdate() { super.onUpdate(); if (ReikaMathLibrary.approxr(velocity.inclination, targetTheta, 2)) { targetTheta = rand.nextInt(360); } else { if (targetTheta > velocity.inclination) velocity.inclination++; else velocity.inclination--; } if (ReikaMathLibrary.approxr(velocity.rotation, targetPhi, 2)) { targetPhi = rand.nextInt(360); } else { if (targetPhi > velocity.rotation) velocity.rotation++; else velocity.rotation--; } if (ReikaMathLibrary.approxr(velocity.rotation, targetPhi, 0.05)) { targetVelocity = ReikaRandomHelper.getRandomPlusMinus(0.1, 0.1); } else { if (targetVelocity > velocity.magnitude) velocity.magnitude += 0.01D; else velocity.magnitude -= 0.01D; } velocityChanged = true; // ReikaJavaLibrary.pConsole(velocity.inclination+"/"+targetTheta+"; // "+velocity.rotation+"/"+targetPhi, Side.SERVER); double[] v = velocity.getCartesian(); motionX = v[0]; motionY = v[1]; motionZ = v[2]; if (targetColor != null) { colorTransitionFraction += 0.1F; if (colorTransitionFraction >= 1) { color = targetColor; targetColor = null; colorTransitionFraction = 0; } } dataWatcher.updateObject(30, this.calcRenderColor()); if (worldObj.isRemote) { this.lifeParticles(); } fallDistance = 0; } @SideOnly(Side.CLIENT) private void lifeParticles() { int p = Minecraft.getMinecraft().gameSettings.particleSetting; if (rand.nextInt(1 + p * 2) == 0) { double d = 0.25; double px = ReikaRandomHelper.getRandomPlusMinus(posX, d); double py = ReikaRandomHelper.getRandomPlusMinus(posY, d); double pz = ReikaRandomHelper.getRandomPlusMinus(posZ, d); float g = (float) ReikaRandomHelper.getRandomPlusMinus(0.05, 0.025); if (rand.nextInt(4) == 0) g = -g; EntityLaserFX fx = new EntityLaserFX(color, worldObj, px, py, pz) .setColor(this.getRenderColor()) .setGravity(g); EntityLaserFX fx2 = new EntityLaserFX(color, worldObj, px, py, pz) .setColor(0xffffff) .setScale(0.42F) .setGravity(g); Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect(fx2); } } @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); int c = nbt.getInteger("color"); color = c >= 0 ? CrystalElement.elements[c] : CrystalElement.randomElement(); isPylonSpawn = nbt.getBoolean("pylon"); doDrops = nbt.getBoolean("dodrops"); if (nbt.getBoolean("isdead")) this.setDead(); } @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); if (color != null) nbt.setInteger("color", color.ordinal()); nbt.setBoolean("dodrops", doDrops); nbt.setBoolean("pylon", isPylonSpawn); nbt.setBoolean("isdead", isDead); } private void die() { // particle effect if (worldObj.isRemote) { this.doDeathParticles(worldObj, posX, posY, posZ, this.getRenderColor()); } else { ReikaPacketHelper.sendDataPacket( ChromatiCraft.packetChannel, ChromaPackets.LIGHTNINGDIE.ordinal(), new PacketTarget.RadiusTarget(this, 32), this.calcRenderColor()); } this.setDead(); } @Override public void setDead() { super.setDead(); if (worldObj != null) ; // spawnedEntities--; } private void doBolt(EntityBallLightning other) { Vec3 vec = ReikaVectorHelper.getVec2Pt(posX, posY, posZ, other.posX, other.posY, other.posZ); // EntityGluon g = new EntityGluon(this, other); // worldObj.spawnEntityInWorld(g); targetColor = other.color; ReikaPacketHelper.sendDataPacket( ChromatiCraft.packetChannel, ChromaPackets.GLUON.ordinal(), new DimensionTarget(worldObj), this.getEntityId(), other.getEntityId()); double len = vec.lengthVector(); for (double i = 0; i < len; i += 0.0625) { double dx = posX - i * vec.xCoord / len; double dy = posY - i * vec.yCoord / len; double dz = posZ - i * vec.zCoord / len; if (worldObj.isRemote) this.gluonParticles(other, dx, dy, dz, (float) (i / len)); if (ChromaOptions.HOSTILEFOREST.getState()) { AxisAlignedBB box = AxisAlignedBB.getBoundingBox(dx, dy, dz, dx, dy, dz).expand(0.5, 0.5, 0.5); List<EntityLivingBase> elb = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, box); for (EntityLivingBase e : elb) { e.attackEntityFrom(DamageSource.generic, isPylonSpawn ? 4 : 1); } } } } @SideOnly(Side.CLIENT) public void doBoltClient(EntityBallLightning other) { targetColor = other.color; } @SideOnly(Side.CLIENT) private void gluonParticles( EntityBallLightning other, double dx, double dy, double dz, float frac) { int c = ReikaColorAPI.mixColors(other.getRenderColor(), this.getRenderColor(), frac); EntityBlurFX fx = new EntityBlurFX(worldObj, dx, dy, dz); fx.setLife(5).setColor(c); Minecraft.getMinecraft().effectRenderer.addEffect(fx); } private void onReceiveBolt(EntityBallLightning src) { targetColor = src.color; } @Override public AxisAlignedBB getCollisionBox(Entity entity) { if (entity instanceof EntityLivingBase && !(entity instanceof EntityBallLightning) && !worldObj.isRemote) { boolean flag = (entity instanceof EntityPlayer && ((EntityPlayer) entity).capabilities.isCreativeMode); if (!flag) { if (ChromaOptions.HOSTILEFOREST.getState()) { entity.attackEntityFrom(DamageSource.generic, 5); } if (entity instanceof EntityPlayer) ProgressStage.BALLLIGHTNING.stepPlayerTo((EntityPlayer) entity); this.die(); } } return null; // AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX, posY, posZ).expand(3, 3, // 3); } @Override public void onLivingUpdate() { super.onLivingUpdate(); if (!worldObj.isRemote && colorTransitionFraction == 0 && rand.nextInt(400) == 0) { EntityBallLightning e = ReikaEntityHelper.getNearestEntityOfSameType(this, 24); if (e != null && e.colorTransitionFraction == 0) { this.doBolt(e); e.onReceiveBolt(this); } } // if (ticksExisted%36 == 0) { // ChromaSounds.POWER.playSound(this, 0.1F, 2F); // } if (!worldObj.isRemote && rand.nextInt(1600) == 0) { if (!CrystalNetworker.instance .getNearbyPylons(worldObj, posX, posY, posZ, color, 24, false) .isEmpty()) { this.heal(this.getMaxHealth()); } } if (!worldObj.isRemote) { EntityPlayer ep = worldObj.getClosestPlayerToEntity(this, -1); if (posY >= 128) { this.die(); } else if (ep == null || worldObj.playerEntities.isEmpty()) { this.die(); } else if (ticksExisted >= 12000 || rand.nextInt(12000 - ticksExisted) == 0) { this.die(); } else if (worldObj.isRaining() && rand.nextInt(80) == 0) { this.die(); } else if (this.getDistanceSqToEntity(ep) >= 65536) { this.die(); } else if (this.getDistanceSqToEntity(ep) >= 1024 && rand.nextInt(200) == 0) { this.die(); } // else if (spawnedEntities > 200 && rand.nextInt(spawnedEntities-200) > 0) { // this.die(); // } else if (rand.nextInt(20) == 0) { AxisAlignedBB box = AxisAlignedBB.getBoundingBox(posX, 0, posZ, posX, 1024, posZ).expand(24, 0, 24); List<EntityBallLightning> li = worldObj.getEntitiesWithinAABB(this.getClass(), box); if (rand.nextInt(1 + li.size() / 16) > 0) this.die(); } } } @Override public boolean getCanSpawnHere() { return rand.nextInt(5) == 0 && worldObj.canBlockSeeTheSky( MathHelper.floor_double(posX), MathHelper.floor_double(posY) + 1, MathHelper.floor_double(posZ)); } @Override public int getMaxSpawnedInChunk() { return 4; } @Override public void playLivingSound() { ; // ChromaSounds.POWER.playSound(this, 1F, 2F); float p = CrystalMusicManager.instance.getRandomScaledDing(color); ChromaSounds.BALLLIGHTNING.playSound(this, 1, p); } @Override public final int getTalkInterval() { return 20; } @Override protected final void func_145780_a(int par1, int par2, int par3, Block par4) // play step sound {} @Override protected String getHurtSound() { return ""; } @Override protected String getDeathSound() { return ""; } @Override public void onDeath(DamageSource src) { ChromaSounds.DISCHARGE.playSound(this, 1F, 2F); if (!worldObj.isRemote) { Entity e = src.getEntity(); if (e instanceof EntityPlayer) { EntityPlayer ep = (EntityPlayer) e; if (doDrops && !ReikaPlayerAPI.isFakeOrNotInteractable(ep, posX, posY, posZ, 8)) { int looting = EnchantmentHelper.getLootingModifier((EntityPlayer) src.getEntity()); ReikaItemHelper.dropItem( this, ReikaItemHelper.getSizedItemStack( ChromaStacks.beaconDust, rand.nextInt(1 + looting * 2))); if (looting > 1) { if (color.isPrimary()) ReikaItemHelper.dropItem(this, ChromaStacks.purityDust); else ReikaItemHelper.dropItem(this, ChromaStacks.auraDust); } } ProgressStage.BALLLIGHTNING.stepPlayerTo(ep); } this.sendDeathParticles(); } } private void sendDeathParticles() { ReikaPacketHelper.sendPositionPacket( ChromatiCraft.packetChannel, ChromaPackets.LIGHTNINGDIE.ordinal(), this, this.calcRenderColor(), new DimensionTarget(worldObj)); } @SideOnly(Side.CLIENT) public static void receiveDeathParticles( World world, double dx, double dy, double dz, int color) { doDeathParticles(world, dx, dy, dz, color); } @SideOnly(Side.CLIENT) private static void doDeathParticles(World world, double dx, double dy, double dz, int color) { int n = 32; for (int i = 0; i < n; i++) { EntityCenterBlurFX fx = new EntityCenterBlurFX(world, dx, dy, dz).setColor(color).setScale(1.5F); fx.motionX = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); fx.motionY = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); fx.motionZ = ReikaRandomHelper.getRandomPlusMinus(0, 0.2); EntityCenterBlurFX fx2 = new EntityCenterBlurFX(world, dx, dy, dz).setColor(0xffffff).setScale(0.5F); fx2.motionX = fx.motionX; fx2.motionY = fx.motionY; fx2.motionZ = fx.motionZ; Minecraft.getMinecraft().effectRenderer.addEffect(fx); Minecraft.getMinecraft().effectRenderer.addEffect(fx2); } } @Override public void writeSpawnData(ByteBuf buf) { buf.writeInt(color != null ? color.ordinal() : -1); } @Override public void readSpawnData(ByteBuf buf) { int c = buf.readInt(); color = c >= 0 && c < 16 ? CrystalElement.elements[c] : CrystalElement.randomElement(); } /* public int getRenderColor() { return targetColor != null ? ReikaColorAPI.mixColors(targetColor.getColor(), color.getColor(), colorTransitionFraction) : color.getColor(); } */ private int calcRenderColor() { return targetColor != null ? ReikaColorAPI.mixColors(targetColor.getColor(), color.getColor(), colorTransitionFraction) : color.getColor(); } @SideOnly(Side.CLIENT) public int getRenderColor() { return dataWatcher.getWatchableObjectInt(30); } /* public int getRenderColor() { float frac = dataWatcher.getWatchableObjectFloat(31); int tgi = dataWatcher.getWatchableObjectInt(30); CrystalElement tg = tgi >= 0 ? CrystalElement.elements[tgi] : null; CrystalElement c = CrystalElement.elements[dataWatcher.getWatchableObjectInt(29)]; return tg != null ? ReikaColorAPI.mixColors(tg.getColor(), c.getColor(), frac) : c.getColor(); } */ @Override public boolean attackEntityFrom(DamageSource src, float dmg) { Entity e = src.getEntity(); if (e instanceof EntityPlayer) { if (!ReikaPlayerAPI.isFake((EntityPlayer) e)) { boolean flag = super.attackEntityFrom(src, dmg); if (flag && this.getHealth() <= 0) { this.die(); } return flag; } } return false; } public CrystalElement getElement() { return color; } @Override public boolean shouldRenderInPass(int pass) { return pass == 1; } @Override protected void dropFewItems(boolean recentHit, int looting) { if (recentHit) {} } }
static { for (int i = 0; i < CrystalElement.elements.length; i++) { map[i] = 5 + ReikaRandomHelper.getRandomPlusMinus(i * 22.5, 5); } ReikaArrayHelper.shuffleArray(map); }