From 52825d9d9ea9a19c11f9d8169d5c3e07a8cab103 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 21 Jan 2024 20:16:10 +0100 Subject: [PATCH] the foxes have taken over, torex tweaks --- changelog | 11 +++ gradle.properties | 2 +- src/main/java/com/hbm/blocks/ModBlocks.java | 2 - .../java/com/hbm/blocks/fluid/RadBlock.java | 10 ++ .../hbm/blocks/generic/BlockDoorGeneric.java | 21 ++++- .../blocks/generic/BlockGlyphidSpawner.java | 5 +- .../com/hbm/blocks/generic/BlockKeyhole.java | 2 + .../hbm/entity/effect/EntityNukeTorex.java | 88 +++++++++--------- .../java/com/hbm/hazard/HazardRegistry.java | 3 + src/main/java/com/hbm/items/ModItems.java | 6 ++ .../java/com/hbm/items/armor/ItemModCard.java | 48 ++++++++++ .../hbm/items/armor/ItemModNightVision.java | 44 ++++----- .../java/com/hbm/items/tool/ItemLock.java | 46 +++------ .../java/com/hbm/items/tool/ItemWandD.java | 18 +++- .../com/hbm/items/weapon/ItemGunBase.java | 11 +++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../hbm/render/entity/effect/RenderTorex.java | 7 +- .../java/com/hbm/tileentity/DoorDecl.java | 5 + .../hbm/tileentity/TileEntityDoorGeneric.java | 2 + .../machine/TileEntityLockableBase.java | 1 + src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/blocks/rad_lava_flowing.png | Bin 10650 -> 9055 bytes .../hbm/textures/blocks/rad_lava_still.png | Bin 10616 -> 8678 bytes .../assets/hbm/textures/items/card_aos.png | Bin 0 -> 157 bytes .../assets/hbm/textures/items/card_qos.png | Bin 0 -> 178 bytes 26 files changed, 223 insertions(+), 115 deletions(-) create mode 100644 src/main/java/com/hbm/items/armor/ItemModCard.java create mode 100644 src/main/resources/assets/hbm/textures/items/card_aos.png create mode 100644 src/main/resources/assets/hbm/textures/items/card_qos.png diff --git a/changelog b/changelog index 74a6aa77b..df4205477 100644 --- a/changelog +++ b/changelog @@ -3,6 +3,7 @@ * The final missing door from 1.12, remade from scratch * Comes with a brand-new model that fits perfectly over 3x3 missile launch tubes * Has a 5x5 frame + * Can be opened and closed with a detonator * Molysite * Found in basalt from volcanos * Can be combination-smelted into iron and chlorine @@ -21,6 +22,15 @@ * Removed the "nerve agent" hazard class because no gas used it * Fissures now continuously spawn volcanic lava, making basalt renewable without having an entire volcano * Volcanic lava now turns diamond ore into gem-rich basalt +* Mushroom clouds have been tweaked + * Their scale no longer scales linearly, but rather with a square root function, this prevents tsar clouds from being so huge that the top fails to render due to clipping through the skybox + * Their default scale is now somewhat larger + * The flash scale has been increased + * Their general scaling is now consistent, larger clouds will no longer be chubby with a comically small ring + * Shockwave particles now have momentum, making them sweep over the landscape, as well as being 1.5x denser and slightly larger + * Effect shamelessly stolen from NTM-EE + * Outer condensation rings' spawning is no longer fixed, the time now scales with the size + * The inner condensation ring's spawn time is also now based on scale, which means larger clouds will no longer end up with comically thin rings due to not spawning enough cloudlets ## Fixed * Fixed sellafite emerald ore being oredicted as emerald dust @@ -38,3 +48,4 @@ * Fixed fallout layers being able to generate below roofs * Fixed exposure chamber not saving anything to NBT besides slots * Fixed crash caused by wearing the full PaA set and then putting on an HEV helmet (why would anyone ever do this??) +* Fixed large doors only being lockable by clicking on the core block diff --git a/gradle.properties b/gradle.properties index 963b4f95a..dfdd7bdff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4845 +mod_build_number=4851 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c22a7589b..fec0b2fc0 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1235,10 +1235,8 @@ public class ModBlocks { public static Block volcanic_lava_block; public static Fluid volcanic_lava_fluid; - public static final Material fluidvolcanic = (new MaterialLiquid(MapColor.redColor)); public static Block rad_lava_block; public static Fluid rad_lava_fluid; - public static final Material fluidradlava = (new MaterialLiquid(MapColor.redColor)); public static Block sulfuric_acid_block; public static Fluid sulfuric_acid_fluid; diff --git a/src/main/java/com/hbm/blocks/fluid/RadBlock.java b/src/main/java/com/hbm/blocks/fluid/RadBlock.java index 8828bd954..7ab22af70 100644 --- a/src/main/java/com/hbm/blocks/fluid/RadBlock.java +++ b/src/main/java/com/hbm/blocks/fluid/RadBlock.java @@ -4,12 +4,17 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.ContaminationUtil.ContaminationType; +import com.hbm.util.ContaminationUtil.HazardType; 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.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; import net.minecraft.util.IIcon; import net.minecraft.world.World; @@ -37,6 +42,11 @@ public class RadBlock extends VolcanicBlock { return (side == 0 || side == 1) ? stillIconRad : flowingIconRad; } + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + if(entity instanceof EntityLivingBase) ContaminationUtil.contaminate((EntityLivingBase) entity, HazardType.RADIATION, ContaminationType.CREATIVE, 5F); + } + @Override public void onSolidify(World world, int x, int y, int z, int lavaCount, int basaltCount, Random rand) { int r = rand.nextInt(400); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 841d834f9..fbe36d426 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -3,7 +3,9 @@ package com.hbm.blocks.generic; import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.interfaces.IBomb; import com.hbm.items.special.ItemDoorSkin; +import com.hbm.items.tool.ItemLock; import com.hbm.tileentity.DoorDecl; import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -20,7 +22,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockDoorGeneric extends BlockDummyable { +public class BlockDoorGeneric extends BlockDummyable implements IBomb { public DoorDecl type; @@ -45,6 +47,22 @@ public class BlockDoorGeneric extends BlockDummyable { public int getOffset(){ return type.getBlockOffset(); } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + int[] pos1 = findCore(world, x, y, z); + if(pos1 == null) return BombReturnCode.ERROR_INCOMPATIBLE; + TileEntityDoorGeneric door = (TileEntityDoorGeneric) world.getTileEntity(pos1[0], pos1[1], pos1[2]); + if(door != null) { + DoorDecl decl = door.getDoorType(); + if(!decl.remoteControllable()) return BombReturnCode.ERROR_INCOMPATIBLE; + if(door.tryToggle(null)) { + return BombReturnCode.TRIGGERED; + } + } + + return BombReturnCode.ERROR_INCOMPATIBLE; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer playerIn, int side, float hitX, float hitY, float hitZ){ @@ -148,5 +166,4 @@ public class BlockDoorGeneric extends BlockDummyable { } return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); } - } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java index e4d07db08..eb211f871 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java @@ -100,7 +100,8 @@ public class BlockGlyphidSpawner extends BlockContainer implements IBlockMulti { if(!worldObj.isRemote && this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL) { if(initialSpawn || worldObj.getTotalWorldTime() % MobConfig.swarmCooldown == 0) { - + + initialSpawn = false; int count = 0; for(Object e : worldObj.loadedEntityList) { @@ -126,8 +127,6 @@ public class BlockGlyphidSpawner extends BlockContainer implements IBlockMulti { if(this.getBlockMetadata() == 1) scout.getDataWatcher().updateObject(EntityGlyphid.DW_SUBTYPE, (byte) EntityGlyphid.TYPE_INFECTED); trySpawnEntity(scout); } - - initialSpawn = false; } } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java b/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java index f1c96e0b7..7c195a114 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java +++ b/src/main/java/com/hbm/blocks/generic/BlockKeyhole.java @@ -232,6 +232,8 @@ public class BlockKeyhole extends BlockStone { pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.wd40), 10)); pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.scrumpy), 10)); pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.wild_p), 5)); + pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.card_aos), 5)); + pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.card_qos), 5)); pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.starmetal_sword), 5)); pedestalItems.add(new WeightedRandomObject(new ItemStack(ModItems.radaway_flush), 5)); diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 8959e0685..628416174 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -2,6 +2,7 @@ package com.hbm.entity.effect; import java.util.ArrayList; +import com.hbm.util.BobMathUtil; import com.hbm.util.TrackerUtil; import cpw.mods.fml.relauncher.Side; @@ -53,7 +54,7 @@ public class EntityNukeTorex extends Entity { @Override public void onUpdate() { - double s = this.getScale(); + double s = 1.5; //this.getScale(); double cs = 1.5; int maxAge = this.getMaxAge(); @@ -84,61 +85,61 @@ public class EntityNukeTorex extends Entity { double x = posX + rand.nextGaussian() * range; double z = posZ + rand.nextGaussian() * range; Cloudlet cloud = new Cloudlet(x, lastSpawnY, z, (float)(rand.nextDouble() * 2D * Math.PI), 0, lifetime); - cloud.setScale(1F + this.ticksExisted * 0.005F * (float) s, 5F * (float) cs); + cloud.setScale(1F + this.ticksExisted * 0.005F * (float) cs, 5F * (float) cs); cloudlets.add(cloud); } // spawn shock clouds - if(ticksExisted < 100) { + if(ticksExisted < 150) { int cloudCount = ticksExisted * 5; int shockLife = Math.max(300 - ticksExisted * 20, 50); for(int i = 0; i < cloudCount; i++) { - Vec3 vec = Vec3.createVectorHelper((ticksExisted * 2 + rand.nextDouble()) * 2, 0, 0); + Vec3 vec = Vec3.createVectorHelper((ticksExisted * 1.5 + rand.nextDouble()) * 1.5, 0, 0); float rot = (float) (Math.PI * 2 * rand.nextDouble()); vec.rotateAroundY(rot); - this.cloudlets.add(new Cloudlet(vec.xCoord + posX, worldObj.getHeightValue((int) (vec.xCoord + posX) + 1, (int) (vec.zCoord + posZ)), vec.zCoord + posZ, rot, 0, shockLife) - .setScale(5F, 2F) - .setMotion(0)); + this.cloudlets.add(new Cloudlet(vec.xCoord + posX, worldObj.getHeightValue((int) (vec.xCoord + posX) + 1, (int) (vec.zCoord + posZ)), vec.zCoord + posZ, rot, 0, shockLife, TorexType.SHOCK) + .setScale(7F, 2F) + .setMotion(ticksExisted > 15 ? 0.75 : 0)); } } // spawn ring clouds - if(ticksExisted < 200) { + if(ticksExisted < 130 * s) { lifetime *= s; for(int i = 0; i < 2; i++) { Cloudlet cloud = new Cloudlet(posX, posY + coreHeight, posZ, (float)(rand.nextDouble() * 2D * Math.PI), 0, lifetime, TorexType.RING); - cloud.setScale(1F + this.ticksExisted * 0.0025F * (float) (cs * s), 3F * (float) (cs * s)); + cloud.setScale(1F + this.ticksExisted * 0.0025F * (float) (cs * cs), 3F * (float) (cs * cs)); cloudlets.add(cloud); } } // spawn condensation clouds - if(ticksExisted > 200 && ticksExisted < 600) { + if(ticksExisted > 130 * s && ticksExisted < 600 * s) { for(int i = 0; i < 20; i++) { for(int j = 0; j < 4; j++) { float angle = (float) (Math.PI * 2 * rand.nextDouble()); - Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * 3, 0, 0); + Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (3 + rand.nextDouble()), 0, 0); vec.rotateAroundZ((float) (Math.PI / 45 * j)); vec.rotateAroundY(angle); Cloudlet cloud = new Cloudlet(posX + vec.xCoord, posY + coreHeight - 5 + j * s, posZ + vec.zCoord, angle, 0, (int) ((20 + ticksExisted / 10) * (1 + rand.nextDouble() * 0.1)), TorexType.CONDENSATION); - cloud.setScale(0.125F * (float) (cs * s), 3F * (float) (cs * s)); + cloud.setScale(0.125F * (float) (cs), 3F * (float) (cs)); cloudlets.add(cloud); } } } - if(ticksExisted > 300 && ticksExisted < 600) { + if(ticksExisted > 200 * s && ticksExisted < 600 * s) { for(int i = 0; i < 20; i++) { for(int j = 0; j < 4; j++) { float angle = (float) (Math.PI * 2 * rand.nextDouble()); - Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * 2, 0, 0); + Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (3 + rand.nextDouble() * 0.5), 0, 0); vec.rotateAroundZ((float) (Math.PI / 45 * j)); vec.rotateAroundY(angle); - Cloudlet cloud = new Cloudlet(posX + vec.xCoord, posY + coreHeight + 25 + j * s, posZ + vec.zCoord, angle, 0, (int) ((20 + ticksExisted / 10) * (1 + rand.nextDouble() * 0.1)), TorexType.CONDENSATION); - cloud.setScale(0.125F * (float) (cs * s), 3F * (float) (cs * s)); + Cloudlet cloud = new Cloudlet(posX + vec.xCoord, posY + coreHeight + 25 + j * cs, posZ + vec.zCoord, angle, 0, (int) ((20 + ticksExisted / 10) * (1 + rand.nextDouble() * 0.1)), TorexType.CONDENSATION); + cloud.setScale(0.125F * (float) (cs), 3F * (float) (cs)); cloudlets.add(cloud); } } @@ -147,12 +148,12 @@ public class EntityNukeTorex extends Entity { for(Cloudlet cloud : cloudlets) { cloud.update(); } - coreHeight += 0.15/* * s*/; - torusWidth += 0.05/* * s*/; + coreHeight += 0.15 / s; + torusWidth += 0.05 / s; rollerSize = torusWidth * 0.35; convectionHeight = coreHeight + rollerSize; - int maxHeat = (int) (50 * s); + int maxHeat = (int) (50 * cs); heat = maxHeat - Math.pow((maxHeat * this.ticksExisted) / maxAge, 1); cloudlets.removeIf(x -> x.isDead); @@ -298,6 +299,14 @@ public class EntityNukeTorex extends Entity { this.motionX = convection.xCoord * factor + lift.xCoord * (1D - factor); this.motionY = convection.yCoord * factor + lift.yCoord * (1D - factor); this.motionZ = convection.zCoord * factor + lift.zCoord * (1D - factor); + } else if(this.type == TorexType.SHOCK) { + + double factor = MathHelper.clamp_double((this.posY - EntityNukeTorex.this.posY) / EntityNukeTorex.this.coreHeight, 0, 1); + Vec3 motion = Vec3.createVectorHelper(1, 0, 0); + motion.rotateAroundY(this.angle); + this.motionX = motion.xCoord * factor; + this.motionY = motion.yCoord * factor; + this.motionZ = motion.zCoord * factor; } else if(this.type == TorexType.RING) { Vec3 motion = getRingMotion(simPosX, simPosZ); this.motionX = motion.xCoord; @@ -321,30 +330,14 @@ public class EntityNukeTorex extends Entity { private Vec3 getCondensationMotion() { Vec3 delta = Vec3.createVectorHelper(posX - EntityNukeTorex.this.posX, 0, posZ - EntityNukeTorex.this.posZ); - double speed = 0.00002 * EntityNukeTorex.this.getScale() * EntityNukeTorex.this.ticksExisted; + double speed = 0.00002 * EntityNukeTorex.this.ticksExisted; delta.xCoord *= speed; - //delta.yCoord *= speed * 0.75 * EntityNukeTorex.this.getScale(); delta.zCoord *= speed; return delta; } private Vec3 getRingMotion(double simPosX, double simPosZ) { - /*Vec3 targetPos = Vec3.createVectorHelper( - (EntityNukeTorex.this.posX + torusWidth * 1), - (EntityNukeTorex.this.posY + coreHeight * 0.5), - EntityNukeTorex.this.posZ); - - Vec3 delta = Vec3.createVectorHelper(targetPos.xCoord - simPosX, targetPos.yCoord - this.posY, targetPos.zCoord - simPosZ); - - double speed = 0.125D; - delta.xCoord *= speed; - delta.yCoord *= speed; - delta.zCoord *= speed; - - delta.rotateAroundY(this.angle); - return delta;*/ - if(simPosX > EntityNukeTorex.this.posX + torusWidth * 2) return Vec3.createVectorHelper(0, 0, 0); @@ -392,9 +385,6 @@ public class EntityNukeTorex extends Entity { /* simulated on a 2D-plane along the X/Y axis */ private Vec3 getConvectionMotion(double simPosX, double simPosZ) { - if(simPosX > EntityNukeTorex.this.posX + torusWidth * 2) - return Vec3.createVectorHelper(0, 0, 0); - /* the position of the torus' outer ring center */ Vec3 torusPos = Vec3.createVectorHelper( (EntityNukeTorex.this.posX + torusWidth), @@ -480,10 +470,19 @@ public class EntityNukeTorex extends Entity { } public Vec3 getInterpPos(float interp) { - return Vec3.createVectorHelper( + float scale = (float) EntityNukeTorex.this.getScale(); + Vec3 base = Vec3.createVectorHelper( prevPosX + (posX - prevPosX) * interp, prevPosY + (posY - prevPosY) * interp, prevPosZ + (posZ - prevPosZ) * interp); + + if(this.type != TorexType.SHOCK) { //no rescale for the shockwave as this messes with the positions + base.xCoord = ((base.xCoord) - EntityNukeTorex.this.posX) * scale + EntityNukeTorex.this.posX; + base.yCoord = ((base.yCoord) - EntityNukeTorex.this.posY) * scale + EntityNukeTorex.this.posY; + base.zCoord = ((base.zCoord) - EntityNukeTorex.this.posZ) * scale + EntityNukeTorex.this.posZ; + } + + return base; } public Vec3 getInterpColor(float interp) { @@ -514,7 +513,9 @@ public class EntityNukeTorex extends Entity { private float growingScale = 5F; public float getScale() { - return startingScale + ((float)age / (float)cloudletLife) * growingScale; + float base = startingScale + ((float)age / (float)cloudletLife) * growingScale; + if(this.type != TorexType.SHOCK) base *= (float) EntityNukeTorex.this.getScale(); + return base; } public Cloudlet setScale(float start, float grow) { @@ -533,6 +534,7 @@ public class EntityNukeTorex extends Entity { public static enum TorexType { STANDARD, + SHOCK, RING, CONDENSATION } @@ -548,14 +550,14 @@ public class EntityNukeTorex extends Entity { } public static void statFac(World world, double x, double y, double z, float scale) { - EntityNukeTorex torex = new EntityNukeTorex(world).setScale(MathHelper.clamp_float(scale * 0.01F, 0.5F, 5F)); + EntityNukeTorex torex = new EntityNukeTorex(world).setScale(MathHelper.clamp_float((float) BobMathUtil.squirt(scale * 0.01) * 1.5F, 0.5F, 5F)); torex.setPosition(x, y, z); world.spawnEntityInWorld(torex); TrackerUtil.setTrackingRange(world, torex, 1000); } public static void statFacBale(World world, double x, double y, double z, float scale) { - EntityNukeTorex torex = new EntityNukeTorex(world).setScale(MathHelper.clamp_float(scale * 0.01F, 0.5F, 5F)).setType(1); + EntityNukeTorex torex = new EntityNukeTorex(world).setScale(MathHelper.clamp_float((float) BobMathUtil.squirt(scale * 0.01) * 1.5F, 0.5F, 5F)).setType(1); torex.setPosition(x, y, z); world.spawnEntityInWorld(torex); TrackerUtil.setTrackingRange(world, torex, 1000); diff --git a/src/main/java/com/hbm/hazard/HazardRegistry.java b/src/main/java/com/hbm/hazard/HazardRegistry.java index 4b0476d24..4a3516112 100644 --- a/src/main/java/com/hbm/hazard/HazardRegistry.java +++ b/src/main/java/com/hbm/hazard/HazardRegistry.java @@ -223,6 +223,9 @@ public class HazardRegistry { HazardSystem.register(new ItemStack(ModBlocks.sellafield, 1, 3), makeData(RADIATION, 4F)); HazardSystem.register(new ItemStack(ModBlocks.sellafield, 1, 4), makeData(RADIATION, 5F)); HazardSystem.register(new ItemStack(ModBlocks.sellafield, 1, 5), makeData(RADIATION, 10F)); + + HazardSystem.register(new ItemStack(ModBlocks.ore_sellafield_radgem), makeData(RADIATION, 25F)); + HazardSystem.register(new ItemStack(ModItems.gem_rad), makeData(RADIATION, 25F)); registerOtherFuel(rod_zirnox, EnumZirnoxType.NATURAL_URANIUM_FUEL.ordinal(), u * rod_dual, wst * rod_dual * 11.5F, false); registerOtherFuel(rod_zirnox, EnumZirnoxType.URANIUM_FUEL.ordinal(), uf * rod_dual, wst * rod_dual * 10F, false); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 506af64a9..0e09d243c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2207,6 +2207,8 @@ public class ModItems { public static Item defuser_gold; public static Item ballistic_gauntlet; public static Item night_vision; + public static Item card_aos; + public static Item card_qos; public static Item hazmat_helmet; public static Item hazmat_plate; @@ -3452,6 +3454,8 @@ public class ModItems { defuser_gold = new ItemModDefuser().setUnlocalizedName("defuser_gold").setTextureName(RefStrings.MODID + ":defuser_gold"); ballistic_gauntlet = new ItemModTwoKick().setUnlocalizedName("ballistic_gauntlet").setTextureName(RefStrings.MODID + ":ballistic_gauntlet"); night_vision = new ItemModNightVision().setUnlocalizedName("night_vision").setTextureName(RefStrings.MODID + ":night_vision"); + card_aos = new ItemModCard().setUnlocalizedName(null).setTextureName(RefStrings.MODID + ":card_aos"); + card_qos = new ItemModCard().setUnlocalizedName(null).setTextureName(RefStrings.MODID + ":card_qos"); cap_nuka = new Item().setUnlocalizedName("cap_nuka").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":cap_nuka"); cap_quantum = new Item().setUnlocalizedName("cap_quantum").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":cap_quantum"); @@ -7726,6 +7730,8 @@ public class ModItems { GameRegistry.registerItem(defuser_gold, defuser_gold.getUnlocalizedName()); GameRegistry.registerItem(ballistic_gauntlet, ballistic_gauntlet.getUnlocalizedName()); GameRegistry.registerItem(night_vision, night_vision.getUnlocalizedName()); + GameRegistry.registerItem(card_aos, card_aos.getUnlocalizedName()); + GameRegistry.registerItem(card_qos, card_qos.getUnlocalizedName()); //Chaos GameRegistry.registerItem(chocolate_milk, chocolate_milk.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ItemModCard.java b/src/main/java/com/hbm/items/armor/ItemModCard.java new file mode 100644 index 000000000..aee3e2152 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ItemModCard.java @@ -0,0 +1,48 @@ +package com.hbm.items.armor; + +import java.util.List; + +import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.ArmorModHandler; +import com.hbm.items.ModItems; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +public class ItemModCard extends ItemArmorMod { + + public ItemModCard() { + super(ArmorModHandler.helmet_only, true, false, false, false); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + if(this == ModItems.card_aos) { + list.add(EnumChatFormatting.RED + "Top of the line!"); + list.add(EnumChatFormatting.RED + "Guns now have a 33% chance to not consume ammo."); + } + if(this == ModItems.card_qos) { + list.add(EnumChatFormatting.RED + "Power!"); + list.add(EnumChatFormatting.RED + "Adds a 33% chance to tank damage with no cap."); + } + list.add(""); + super.addInformation(itemstack, player, list, bool); + } + + @Override + public void addDesc(List list, ItemStack stack, ItemStack armor) { + list.add(EnumChatFormatting.YELLOW + I18n.format("item.night_vision.description.in_armor", stack.getDisplayName())); + } + + @Override + public void modDamage(LivingHurtEvent event, ItemStack armor) { + if(this == ModItems.card_qos && event.entityLiving.getRNG().nextInt(3) == 0 && event.entityLiving instanceof EntityPlayer) { + HbmPlayerProps.plink((EntityPlayer) event.entityLiving, "random.break", 0.5F, 1.0F + event.entityLiving.getRNG().nextFloat() * 0.5F); + event.ammount = 0; + event.setCanceled(true); + } + } +} diff --git a/src/main/java/com/hbm/items/armor/ItemModNightVision.java b/src/main/java/com/hbm/items/armor/ItemModNightVision.java index 6df89d2a6..96af954c3 100644 --- a/src/main/java/com/hbm/items/armor/ItemModNightVision.java +++ b/src/main/java/com/hbm/items/armor/ItemModNightVision.java @@ -12,30 +12,30 @@ import net.minecraft.util.EnumChatFormatting; import java.util.List; public class ItemModNightVision extends ItemArmorMod { - public ItemModNightVision() { - super(ArmorModHandler.helmet_only, true, false, false, false); - } + public ItemModNightVision() { + super(ArmorModHandler.helmet_only, true, false, false, false); + } - @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add(EnumChatFormatting.AQUA + I18n.format("item.night_vision.description.item")); - list.add(""); - super.addInformation(itemstack, player, list, bool); - } + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.AQUA + I18n.format("item.night_vision.description.item")); + list.add(""); + super.addInformation(itemstack, player, list, bool); + } - @Override - public void addDesc(List list, ItemStack stack, ItemStack armor) { - list.add(EnumChatFormatting.YELLOW + I18n.format("item.night_vision.description.in_armor", stack.getDisplayName())); - } + @Override + public void addDesc(List list, ItemStack stack, ItemStack armor) { + list.add(EnumChatFormatting.YELLOW + I18n.format("item.night_vision.description.in_armor", stack.getDisplayName())); + } - @Override - public void modUpdate(EntityLivingBase entity, ItemStack armor) { - if(!entity.worldObj.isRemote && entity instanceof EntityPlayer && armor.getItem() instanceof ArmorFSBPowered && ArmorFSBPowered.hasFSBArmor((EntityPlayer)entity)) { - entity.addPotionEffect(new PotionEffect(Potion.nightVision.id, 15 * 20, 0)); + @Override + public void modUpdate(EntityLivingBase entity, ItemStack armor) { + if(!entity.worldObj.isRemote && entity instanceof EntityPlayer && armor.getItem() instanceof ArmorFSBPowered && ArmorFSBPowered.hasFSBArmor((EntityPlayer) entity)) { + entity.addPotionEffect(new PotionEffect(Potion.nightVision.id, 15 * 20, 0)); - if(entity.getRNG().nextInt(50) == 0) { - armor.damageItem(1, entity); - } - } - } + if(entity.getRNG().nextInt(50) == 0) { + armor.damageItem(1, entity); + } + } + } } diff --git a/src/main/java/com/hbm/items/tool/ItemLock.java b/src/main/java/com/hbm/items/tool/ItemLock.java index 0672f90a7..083d6b13a 100644 --- a/src/main/java/com/hbm/items/tool/ItemLock.java +++ b/src/main/java/com/hbm/items/tool/ItemLock.java @@ -1,7 +1,7 @@ package com.hbm.items.tool; -import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.machine.TileEntityLockableBase; +import com.hbm.util.CompatExternal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -17,51 +17,29 @@ public class ItemLock extends ItemKeyPin { } @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) - { + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { + if(this.getPins(stack) != 0) { - TileEntity te = world.getTileEntity(x, y, z); - + TileEntity te = CompatExternal.getCoreFromPos(world, x, y, z); + if(te != null && te instanceof TileEntityLockableBase) { - TileEntityLockableBase tile = (TileEntityLockableBase)te; - + TileEntityLockableBase tile = (TileEntityLockableBase) te; + if(tile.isLocked()) return false; - + tile.setPins(this.getPins(stack)); tile.lock(); tile.setMod(lockMod); - world.playSoundAtEntity(player, "hbm:block.lockHang", 1.0F, 1.0F); + world.playSoundAtEntity(player, "hbm:block.lockHang", 1.0F, 1.0F); stack.stackSize--; - + return true; } - - if(te != null && te instanceof TileEntityDummy) { - - TileEntityDummy dummy = (TileEntityDummy)te; - TileEntity target = world.getTileEntity(dummy.targetX, dummy.targetY, dummy.targetZ); - - if(target != null && target instanceof TileEntityLockableBase) { - TileEntityLockableBase tile = (TileEntityLockableBase)target; - - if(tile.isLocked()) - return false; - - tile.setPins(this.getPins(stack)); - tile.lock(); - tile.setMod(lockMod); - - world.playSoundAtEntity(player, "hbm:block.lockHang", 1.0F, 1.0F); - stack.stackSize--; - - return true; - } - } } - + return false; - } + } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 01eecea43..8d642887d 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.lib.Library; +import com.hbm.util.BobMathUtil; import com.hbm.util.TrackerUtil; import com.hbm.world.WorldUtil; import com.hbm.world.biome.BiomeGenCraterBase; @@ -11,6 +12,7 @@ import com.hbm.world.biome.BiomeGenCraterBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -64,11 +66,17 @@ public class ItemWandD extends Item { tom.destructionRange = 600; world.spawnEntityInWorld(tom);*/ - EntityNukeTorex torex = new EntityNukeTorex(world); - torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); - torex.setScale(1.5F); - world.spawnEntityInWorld(torex); - TrackerUtil.setTrackingRange(world, torex, 1000); + List del = world.getEntitiesWithinAABB(EntityNukeTorex.class, AxisAlignedBB.getBoundingBox(pos.blockX, pos.blockY + 1, pos.blockZ, pos.blockX, pos.blockY + 1, pos.blockZ).expand(50, 50, 50)); + + if(!del.isEmpty()) { + for(EntityNukeTorex torex : del) torex.setDead(); + } else { + EntityNukeTorex torex = new EntityNukeTorex(world); + torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); + torex.setScale((float) BobMathUtil.squirt( 1.5 ) * 1.5F); + world.spawnEntityInWorld(torex); + TrackerUtil.setTrackingRange(world, torex, 1000); + } /*EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/ItemGunBase.java index 58671762f..640c35e93 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBase.java @@ -6,6 +6,7 @@ import org.lwjgl.input.Mouse; import com.hbm.config.GeneralConfig; import com.hbm.entity.projectile.EntityBulletBaseNT; +import com.hbm.handler.ArmorModHandler; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.CasingEjector; @@ -580,6 +581,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu if(hasInfinity(stack, config)) return; if(isTrenchMaster(player) && player.getRNG().nextInt(3) == 0) return; + if(hasAoS(player) && player.getRNG().nextInt(3) == 0) return; if(config.reloadType != GunConfiguration.RELOAD_NONE) { setMag(stack, getMag(stack) - 1); @@ -831,4 +833,13 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu public static boolean isTrenchMaster(EntityPlayer player) { return player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() == ModItems.trenchmaster_plate && ArmorFSB.hasFSBArmor(player); } + + public static boolean hasAoS(EntityPlayer player) { + if(player.inventory.armorInventory[3] != null) { + ItemStack[] mods = ArmorModHandler.pryMods(player.inventory.armorInventory[3]); + ItemStack helmet = mods[ArmorModHandler.helmet_only]; + return helmet != null && helmet.getItem() == ModItems.card_aos; + } + return false; + } } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index df5d5a653..49b97021c 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4845)"; + public static final String VERSION = "1.0.27 BETA (4851)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java index 10094d1ad..809f403f4 100644 --- a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java +++ b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java @@ -77,7 +77,10 @@ public class RenderTorex extends Render { for(Cloudlet cloudlet : cloudlets) { Vec3 vec = cloudlet.getInterpPos(interp); - tessellateCloudlet(tess, vec.xCoord - cloud.posX, vec.yCoord - cloud.posY, vec.zCoord - cloud.posZ, cloudlet, interp); + double x = vec.xCoord - cloud.posX; + double y = vec.yCoord - cloud.posY; + double z = vec.zCoord - cloud.posZ; + tessellateCloudlet(tess, x, y, z, cloudlet, interp); } tess.draw(); @@ -114,7 +117,7 @@ public class RenderTorex extends Render { float x = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); float y = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); float z = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); - tessellateFlash(tess, x, y + cloud.coreHeight, z, (float) (10 * cloud.rollerSize), alpha, interp); + tessellateFlash(tess, x, y + cloud.coreHeight, z, (float) (25 * cloud.rollerSize), alpha, interp); } tess.draw(); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index c0fcadc02..584f23d2c 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -870,6 +870,7 @@ public abstract class DoorDecl { @Override public String getCloseSoundStart() { return null; }; @Override public String getCloseSoundEnd() { return "hbm:door.wgh_big_stop"; }; @Override public float getSoundVolume() { return 2; } + @Override public boolean remoteControllable() { return true; } @Override @SideOnly(Side.CLIENT) @@ -1012,6 +1013,10 @@ public abstract class DoorDecl { return 0; } + public boolean remoteControllable() { + return false; + } + public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks); } diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 68e49db3f..526b9ce5c 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -175,6 +175,8 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn public boolean tryToggle(EntityPlayer player){ + if(this.isLocked() && player == null) return false; + if(state == 0 && redstonePower > 0){ //Redstone "power locks" doors, just like minecraft iron doors return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java index 7e32bc7b7..5e65220a5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityLockableBase.java @@ -68,6 +68,7 @@ public abstract class TileEntityLockableBase extends TileEntity { if(!isLocked) { return true; } else { + if(player == null) return false; ItemStack stack = player.getHeldItem(); if(stack != null && stack.getItem() instanceof ItemKey && diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a3c117d78..80f97bbc0 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1413,6 +1413,8 @@ item.cape_nostalgia.name=DrNostalgias Cape item.cape_radiation.name=Cape (Radioaktiv) item.cape_schrabidium.name=Cape (Schrabidisch) item.cape_vertice.name=Lord Vertices Cape +item.card_aos.name=Pik-Ass +item.card_qos.name=Pik-Königin item.cart.crate.name=Stahlkistenlore item.cart.destroyer.name=Schuttzerstörende Lore item.cart.empty.name=Lore diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 5c5bf6d10..7572149a1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2109,6 +2109,8 @@ item.cape_nostalgia.name=DrNostalgia's Cape item.cape_radiation.name=Cape (Radiation) item.cape_schrabidium.name=Cape (Schrabidic) item.cape_vertice.name=Lord Vertice's Cape +item.card_aos.name=Ace of Spades +item.card_qos.name=Queen of Spades item.cart.crate.name=Crate Cart item.cart.destroyer.name=Scrap Destroying Cart item.cart.empty.name=Minecart diff --git a/src/main/resources/assets/hbm/textures/blocks/rad_lava_flowing.png b/src/main/resources/assets/hbm/textures/blocks/rad_lava_flowing.png index be3c5aa62943dc5a63024a62e8c0b1b4b120b99a..022cf119b66b108489fe1b8c63b99d7870bbcc8f 100644 GIT binary patch literal 9055 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 F{vQQew~_z= literal 10650 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 SZ2)0Q45+-CT&0X@;Qs;*0z|z4 diff --git a/src/main/resources/assets/hbm/textures/blocks/rad_lava_still.png b/src/main/resources/assets/hbm/textures/blocks/rad_lava_still.png index 4784bb63244a3d7efebe69715df8e5f37081b0f2..41cb6cd137444d6ab4a299a23d69db0c00d15730 100644 GIT binary patch literal 8678 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 Ar2qf` diff --git a/src/main/resources/assets/hbm/textures/items/card_aos.png b/src/main/resources/assets/hbm/textures/items/card_aos.png new file mode 100644 index 0000000000000000000000000000000000000000..ac561fc531107030a4c40444af03d2ea7d5636be GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u0R?H{{R2qeE0k%Ad9gi z$S;_|;n|HeAjiqm#WAEJF4=)iiHC=$XC{zH+AJd>u{q2)K_FUcYl~ubYKWTivr8+c w@&sK@^G!^M-YTTAJBN#z*?AeWi#QVlgIY76GS`3KZy;MdUHx3vIVCg!0LY0dga7~l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/card_qos.png b/src/main/resources/assets/hbm/textures/items/card_qos.png new file mode 100644 index 0000000000000000000000000000000000000000..bb254cd8b2a02b8b183dfcb6e146bdf747aeed4e GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW1=2vE$WZ^Ef#LrahX4Qn z>-5(r0)-e$g8YIR9G=}s19JR4T^vIy;&RU(iy%l{nm+(#7D;dnK T>GLUOD#&V2S3j3^P6