From b86801dd143a40a6d3ac5831630bf0b4df03f78c Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 19 Apr 2023 11:07:47 +0200 Subject: [PATCH] access transformer, creeper fun --- build.gradle | 7 + .../java/com/hbm/entity/EntityMappings.java | 2 +- .../hbm/entity/mob/EntityCreeperNuclear.java | 133 +++++++ .../com/hbm/entity/mob/EntityCyberCrab.java | 2 +- .../hbm/entity/mob/EntityNuclearCreeper.java | 349 ------------------ .../hbm/entity/mob/EntityTaintedCreeper.java | 268 ++------------ .../mob/ai/EntityAINuclearCreeperSwell.java | 71 ---- .../mob/ai/EntityAITaintedCreeperSwell.java | 71 ---- .../hbm/entity/projectile/EntityBullet.java | 6 +- src/main/java/com/hbm/main/ClientProxy.java | 2 +- .../java/com/hbm/main/ModEventHandler.java | 4 +- .../entity/mob/RenderNuclearCreeper.java | 255 +++++-------- .../tileentity/machine/TileEntityTesla.java | 5 - .../java/com/hbm/util/ContaminationUtil.java | 4 +- src/main/resources/META-INF/HBM_at.cfg | 3 + .../hbm/textures/entity/creeper_base.png | Bin 0 -> 2964 bytes .../hbm/textures/entity/creeper_mustard.png | Bin 0 -> 3104 bytes .../hbm/textures/entity/creeper_phosgene.png | Bin 0 -> 3864 bytes 18 files changed, 296 insertions(+), 886 deletions(-) create mode 100644 src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java delete mode 100644 src/main/java/com/hbm/entity/mob/EntityNuclearCreeper.java delete mode 100644 src/main/java/com/hbm/entity/mob/ai/EntityAINuclearCreeperSwell.java delete mode 100644 src/main/java/com/hbm/entity/mob/ai/EntityAITaintedCreeperSwell.java create mode 100644 src/main/resources/META-INF/HBM_at.cfg create mode 100644 src/main/resources/assets/hbm/textures/entity/creeper_base.png create mode 100644 src/main/resources/assets/hbm/textures/entity/creeper_mustard.png create mode 100644 src/main/resources/assets/hbm/textures/entity/creeper_phosgene.png diff --git a/build.gradle b/build.gradle index bd386126f..2817f3c3c 100644 --- a/build.gradle +++ b/build.gradle @@ -102,6 +102,13 @@ processResources { } } +// add AT to meta-inf +jar { + manifest { + attributes 'FMLAT': 'HBM_at.cfg' + } +} + task version { doFirst { println project.version diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index fc9352d8e..468b4a9bc 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -204,7 +204,7 @@ public class EntityMappings { addEntity(EntitySawblade.class, "entity_stray_saw", 1000); addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); - addMob(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); + addMob(EntityCreeperNuclear.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); addMob(EntityTaintedCreeper.class, "entity_mob_tainted_creeper", 0x813b9b, 0xd71fdd); addMob(EntityHunterChopper.class, "entity_mob_hunter_chopper", 0x000020, 0x2D2D72); addMob(EntityCyberCrab.class, "entity_cyber_crab", 0xAAAAAA, 0x444444); diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java new file mode 100644 index 000000000..23e8719f5 --- /dev/null +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java @@ -0,0 +1,133 @@ +package com.hbm.entity.mob; + +import java.util.List; + +import com.hbm.entity.logic.EntityNukeExplosionMK5; +import com.hbm.explosion.ExplosionNukeGeneric; +import com.hbm.explosion.ExplosionNukeSmall; +import com.hbm.items.ModItems; +import com.hbm.items.ItemAmmoEnums.AmmoFatman; +import com.hbm.lib.ModDamageSource; +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.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityCreeperNuclear extends EntityCreeper { + + public EntityCreeperNuclear(World world) { + super(world); + this.fuseTime = 75; + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(50.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + + if(source == ModDamageSource.radiation || source == ModDamageSource.mudPoisoning) { + this.heal(amount); + return false; + } + + return super.attackEntityFrom(source, amount); + } + + @Override + protected Item getDropItem() { + return Item.getItemFromBlock(Blocks.tnt); + } + + @Override + protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) { + + super.dropFewItems(p_70628_1_, p_70628_2_); + + if(rand.nextInt(3) == 0) + this.dropItem(ModItems.coin_creeper, 1); + } + + @Override + public void onDeath(DamageSource p_70645_1_) { + super.onDeath(p_70645_1_); + + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(50, 50, 50)); + + for(EntityPlayer player : players) { + player.triggerAchievement(MainRegistry.bossCreeper); + } + + if(p_70645_1_.getEntity() instanceof EntitySkeleton || (p_70645_1_.isProjectile() && p_70645_1_.getEntity() instanceof EntityArrow && ((EntityArrow) (p_70645_1_.getEntity())).shootingEntity == null)) { + this.entityDropItem(ModItems.ammo_nuke.stackFromEnum(AmmoFatman.STOCK), 1); + } + } + + @Override + public void onUpdate() { + + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(5, 5, 5)); + + for(Entity e : list) { + if(e instanceof EntityLivingBase) { + ContaminationUtil.contaminate((EntityLivingBase) e, HazardType.RADIATION, ContaminationType.CREATIVE, 0.25F); + } + } + + super.onUpdate(); + + if(this.getHealth() < this.getMaxHealth() && this.ticksExisted % 10 == 0) { + this.heal(1.0F); + } + } + + @Override + public void func_146077_cc() { + if(!this.worldObj.isRemote) { + boolean flag = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); + + if(this.getPowered()) { + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "muke"); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); + worldObj.playSoundEffect(posX, posY + 0.5, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); + + if(flag) { + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, 50, posX, posY, posZ).mute()); + } else { + ExplosionNukeGeneric.dealDamage(worldObj, posX, posY + 0.5, posZ, 100); + } + } else { + + if(flag) { + ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_MEDIUM); + } else { + ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_SAFE); + } + } + + this.setDead(); + } + } +} diff --git a/src/main/java/com/hbm/entity/mob/EntityCyberCrab.java b/src/main/java/com/hbm/entity/mob/EntityCyberCrab.java index 4d6da1f3e..7af12022a 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCyberCrab.java +++ b/src/main/java/com/hbm/entity/mob/EntityCyberCrab.java @@ -27,7 +27,7 @@ public class EntityCyberCrab extends EntityMob implements IRangedAttackMob, IRad private static final IEntitySelector selector = new IEntitySelector() { public boolean isEntityApplicable(Entity p_82704_1_) { - return !(p_82704_1_ instanceof EntityCyberCrab || p_82704_1_ instanceof EntityCreeper || p_82704_1_ instanceof EntityNuclearCreeper); + return !(p_82704_1_ instanceof EntityCyberCrab || p_82704_1_ instanceof EntityCreeper); } }; diff --git a/src/main/java/com/hbm/entity/mob/EntityNuclearCreeper.java b/src/main/java/com/hbm/entity/mob/EntityNuclearCreeper.java deleted file mode 100644 index fa5f8b85b..000000000 --- a/src/main/java/com/hbm/entity/mob/EntityNuclearCreeper.java +++ /dev/null @@ -1,349 +0,0 @@ -package com.hbm.entity.mob; - -import java.util.List; - -import com.hbm.entity.logic.EntityNukeExplosionMK5; -import com.hbm.entity.mob.ai.EntityAINuclearCreeperSwell; -import com.hbm.explosion.ExplosionNukeGeneric; -import com.hbm.explosion.ExplosionNukeSmall; -import com.hbm.items.ModItems; -import com.hbm.items.ItemAmmoEnums.AmmoFatman; -import com.hbm.lib.ModDamageSource; -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 cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.passive.EntityOcelot; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public class EntityNuclearCreeper extends EntityMob { - - private int lastActiveTime; - private int timeSinceIgnited; - private int fuseTime = 75; - - public EntityNuclearCreeper(World p_i1733_1_) { - super(p_i1733_1_); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAINuclearCreeperSwell(this)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, 1.0D, false)); - this.tasks.addTask(4, new EntityAIWander(this, 0.8D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityOcelot.class, 0, true)); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(50.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - - if(source == ModDamageSource.radiation || source == ModDamageSource.mudPoisoning) { - this.heal(amount); - return false; - } - - return super.attackEntityFrom(source, amount); - } - - @Override - public boolean isAIEnabled() { - return true; - } - - @Override - public int getMaxSafePointTries() { - return this.getAttackTarget() == null ? 3 : 3 + (int) (this.getHealth() - 1.0F); - } - - @Override - protected void fall(float p_70069_1_) { - super.fall(p_70069_1_); - this.timeSinceIgnited = (int) (this.timeSinceIgnited + p_70069_1_ * 1.5F); - - if(this.timeSinceIgnited > this.fuseTime - 5) { - this.timeSinceIgnited = this.fuseTime - 5; - } - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(16, Byte.valueOf((byte) -1)); - this.dataWatcher.addObject(17, Byte.valueOf((byte) 0)); - this.dataWatcher.addObject(18, Byte.valueOf((byte) 0)); - } - - @Override - public void writeEntityToNBT(NBTTagCompound p_70014_1_) { - super.writeEntityToNBT(p_70014_1_); - - if(this.dataWatcher.getWatchableObjectByte(17) == 1) { - p_70014_1_.setBoolean("powered", true); - } - - p_70014_1_.setShort("Fuse", (short) this.fuseTime); - p_70014_1_.setBoolean("ignited", this.func_146078_ca()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound p_70037_1_) { - super.readEntityFromNBT(p_70037_1_); - this.dataWatcher.updateObject(17, Byte.valueOf((byte) (p_70037_1_.getBoolean("powered") ? 1 : 0))); - - if(p_70037_1_.hasKey("Fuse", 99)) { - this.fuseTime = p_70037_1_.getShort("Fuse"); - } - - if(p_70037_1_.getBoolean("ignited")) { - this.func_146079_cb(); - } - } - - @Override - public void onUpdate() { - if(this.isDead) { - this.isDead = false; - this.heal(10.0F); - } - - if(this.isEntityAlive()) { - this.lastActiveTime = this.timeSinceIgnited; - - if(this.func_146078_ca()) { - this.setCreeperState(1); - } - - int i = this.getCreeperState(); - - if(i > 0 && this.timeSinceIgnited == 0) { - this.playSound("creeper.primed", 1.0F * 30 / 75, 0.5F); - } - - this.timeSinceIgnited += i; - - if(this.timeSinceIgnited < 0) { - this.timeSinceIgnited = 0; - } - - if(this.timeSinceIgnited >= this.fuseTime) { - this.timeSinceIgnited = this.fuseTime; - this.func_146077_cc(); - } - } - - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox(posX - 5, posY - 5, posZ - 5, posX + 5, posY + 5, posZ + 5)); - - for(Entity e : list) - if(e instanceof EntityLivingBase) { - ContaminationUtil.contaminate((EntityLivingBase) e, HazardType.RADIATION, ContaminationType.CREATIVE, 0.25F); - } - - super.onUpdate(); - - if(this.getHealth() < this.getMaxHealth() && this.ticksExisted % 10 == 0) { - this.heal(1.0F); - } - } - - @Override - protected String getHurtSound() { - return "mob.creeper.say"; - } - - @Override - protected String getDeathSound() { - return "mob.creeper.death"; - } - - @Override - public void onDeath(DamageSource p_70645_1_) { - super.onDeath(p_70645_1_); - - List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(50, 50, 50)); - - for(EntityPlayer player : players) { - player.triggerAchievement(MainRegistry.bossCreeper); - } - - if(p_70645_1_.getEntity() instanceof EntitySkeleton || (p_70645_1_.isProjectile() && p_70645_1_.getEntity() instanceof EntityArrow && ((EntityArrow) (p_70645_1_.getEntity())).shootingEntity == null)) { - int i = rand.nextInt(11); - int j = rand.nextInt(3); - if(i == 0) - this.dropItem(ModItems.nugget_u235, j); - if(i == 1) - this.dropItem(ModItems.nugget_pu238, j); - if(i == 2) - this.dropItem(ModItems.nugget_pu239, j); - if(i == 3) - this.dropItem(ModItems.nugget_neptunium, j); - if(i == 4) - this.dropItem(ModItems.man_core, 1); - if(i == 5) { - this.dropItem(ModItems.sulfur, j * 2); - this.dropItem(ModItems.niter, j * 2); - } - if(i == 6) - this.dropItem(ModItems.syringe_awesome, 1); - if(i == 7) - this.dropItem(ModItems.fusion_core, 1); - if(i == 8) - this.dropItem(ModItems.syringe_metal_stimpak, 1); - if(i == 9) { - switch(rand.nextInt(4)) { - case 0: - this.dropItem(ModItems.t45_helmet, 1); - break; - case 1: - this.dropItem(ModItems.t45_plate, 1); - break; - case 2: - this.dropItem(ModItems.t45_legs, 1); - break; - case 3: - this.dropItem(ModItems.t45_boots, 1); - break; - } - this.dropItem(ModItems.fusion_core, 1); - } - if(i == 10) - this.entityDropItem(ModItems.ammo_nuke.stackFromEnum(AmmoFatman.HIGH), 1); - } - } - - @Override - public boolean attackEntityAsMob(Entity p_70652_1_) { - return true; - } - - public boolean getPowered() { - return this.dataWatcher.getWatchableObjectByte(17) == 1; - } - - @SideOnly(Side.CLIENT) - public float getCreeperFlashIntensity(float p_70831_1_) { - return (this.lastActiveTime + (this.timeSinceIgnited - this.lastActiveTime) * p_70831_1_) / (this.fuseTime - 2); - } - - @Override - protected Item getDropItem() { - return Item.getItemFromBlock(Blocks.tnt); - } - - @Override - protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) { - - super.dropFewItems(p_70628_1_, p_70628_2_); - - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.coin_creeper, 1); - } - - public int getCreeperState() { - return this.dataWatcher.getWatchableObjectByte(16); - } - - public void setCreeperState(int p_70829_1_) { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) p_70829_1_)); - } - - @Override - public void onStruckByLightning(EntityLightningBolt p_70077_1_) { - super.onStruckByLightning(p_70077_1_); - this.dataWatcher.updateObject(17, Byte.valueOf((byte) 1)); - } - - @Override - protected boolean interact(EntityPlayer p_70085_1_) { - ItemStack itemstack = p_70085_1_.inventory.getCurrentItem(); - - if(itemstack != null && itemstack.getItem() == Items.flint_and_steel) { - this.worldObj.playSoundEffect(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D, "fire.ignite", 1.0F, this.rand.nextFloat() * 0.4F + 0.8F); - p_70085_1_.swingItem(); - - if(!this.worldObj.isRemote) { - this.func_146079_cb(); - itemstack.damageItem(1, p_70085_1_); - return true; - } - } - - return super.interact(p_70085_1_); - } - - private void func_146077_cc() { - if(!this.worldObj.isRemote) { - boolean flag = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); - - if(this.getPowered()) { - - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "muke"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); - worldObj.playSoundEffect(posX, posY + 0.5, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); - - if(flag) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, 50, posX, posY, posZ).mute()); - } else { - ExplosionNukeGeneric.dealDamage(worldObj, posX, posY + 0.5, posZ, 100); - } - } else { - - if(flag) { - ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_MEDIUM); - } else { - ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_SAFE); - } - } - - this.setDead(); - } - } - - public boolean func_146078_ca() { - return this.dataWatcher.getWatchableObjectByte(18) != 0; - } - - public void func_146079_cb() { - this.dataWatcher.updateObject(18, Byte.valueOf((byte) 1)); - } - - public void setPowered(int power) { - this.dataWatcher.updateObject(17, power); - } -} diff --git a/src/main/java/com/hbm/entity/mob/EntityTaintedCreeper.java b/src/main/java/com/hbm/entity/mob/EntityTaintedCreeper.java index 12db53858..0190e025d 100644 --- a/src/main/java/com/hbm/entity/mob/EntityTaintedCreeper.java +++ b/src/main/java/com/hbm/entity/mob/EntityTaintedCreeper.java @@ -2,51 +2,19 @@ package com.hbm.entity.mob; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; -import com.hbm.entity.mob.ai.EntityAITaintedCreeperSwell; import api.hbm.entity.IRadiationImmune; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; -import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityOcelot; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public class EntityTaintedCreeper extends EntityMob implements IRadiationImmune { +public class EntityTaintedCreeper extends EntityCreeper implements IRadiationImmune { - private int lastActiveTime; - private int timeSinceIgnited; - private int fuseTime = 30; - private int explosionRadius = 20; - - public EntityTaintedCreeper(World p_i1733_1_) { - super(p_i1733_1_); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAITaintedCreeperSwell(this)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, 1.0D, false)); - this.tasks.addTask(4, new EntityAIWander(this, 0.8D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityOcelot.class, 0, true)); + public EntityTaintedCreeper(World world) { + super(world); } @Override @@ -56,203 +24,61 @@ public class EntityTaintedCreeper extends EntityMob implements IRadiationImmune this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35D); } - @Override - public boolean isAIEnabled() { - return true; - } - - @Override - public int getMaxSafePointTries() { - return this.getAttackTarget() == null ? 3 : 3 + (int) (this.getHealth() - 1.0F); - } - - @Override - protected void fall(float p_70069_1_) { - super.fall(p_70069_1_); - this.timeSinceIgnited = (int) (this.timeSinceIgnited + p_70069_1_ * 1.5F); - - if(this.timeSinceIgnited > this.fuseTime - 5) { - this.timeSinceIgnited = this.fuseTime - 5; - } - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataWatcher.addObject(16, Byte.valueOf((byte) -1)); - this.dataWatcher.addObject(17, Byte.valueOf((byte) 0)); - this.dataWatcher.addObject(18, Byte.valueOf((byte) 0)); - } - - @Override - public void writeEntityToNBT(NBTTagCompound p_70014_1_) { - super.writeEntityToNBT(p_70014_1_); - - if(this.dataWatcher.getWatchableObjectByte(17) == 1) { - p_70014_1_.setBoolean("powered", true); - } - - p_70014_1_.setShort("Fuse", (short) this.fuseTime); - p_70014_1_.setByte("ExplosionRadius", (byte) this.explosionRadius); - p_70014_1_.setBoolean("ignited", this.func_146078_ca()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound p_70037_1_) { - super.readEntityFromNBT(p_70037_1_); - this.dataWatcher.updateObject(17, Byte.valueOf((byte) (p_70037_1_.getBoolean("powered") ? 1 : 0))); - - if(p_70037_1_.hasKey("Fuse", 99)) { - this.fuseTime = p_70037_1_.getShort("Fuse"); - } - - if(p_70037_1_.hasKey("ExplosionRadius", 99)) { - this.explosionRadius = p_70037_1_.getByte("ExplosionRadius"); - } - - if(p_70037_1_.getBoolean("ignited")) { - this.func_146079_cb(); - } - } - @Override public void onUpdate() { - if(this.isEntityAlive()) { - this.lastActiveTime = this.timeSinceIgnited; - - if(this.func_146078_ca()) { - this.setCreeperState(1); - } - - int i = this.getCreeperState(); - - if(i > 0 && this.timeSinceIgnited == 0) { - this.playSound("creeper.primed", 1.0F * 30 / 75, 0.5F); - } - - this.timeSinceIgnited += i; - - if(this.timeSinceIgnited < 0) { - this.timeSinceIgnited = 0; - } - - if(this.timeSinceIgnited >= this.fuseTime) { - this.timeSinceIgnited = this.fuseTime; - this.func_146077_cc(); - } - } - super.onUpdate(); + + if(this.isEntityAlive()) { - if(this.getHealth() < this.getMaxHealth() && this.ticksExisted % 10 == 0) { - this.heal(1.0F); + if(this.getHealth() < this.getMaxHealth() && this.ticksExisted % 10 == 0) { + this.heal(1.0F); + } } } - @Override - protected String getHurtSound() { - return "mob.creeper.say"; - } - - @Override - protected String getDeathSound() { - return "mob.creeper.death"; - } - - @Override - public void onDeath(DamageSource p_70645_1_) { - super.onDeath(p_70645_1_); - } - - @Override - public boolean attackEntityAsMob(Entity p_70652_1_) { - return true; - } - - public boolean getPowered() { - return this.dataWatcher.getWatchableObjectByte(17) == 1; - } - - @SideOnly(Side.CLIENT) - public float getCreeperFlashIntensity(float p_70831_1_) { - return (this.lastActiveTime + (this.timeSinceIgnited - this.lastActiveTime) * p_70831_1_) / (this.fuseTime - 2); - } - @Override protected Item getDropItem() { return Item.getItemFromBlock(Blocks.tnt); } - public int getCreeperState() { - return this.dataWatcher.getWatchableObjectByte(16); - } - - public void setCreeperState(int p_70829_1_) { - this.dataWatcher.updateObject(16, Byte.valueOf((byte) p_70829_1_)); - } - @Override - public void onStruckByLightning(EntityLightningBolt p_70077_1_) { - super.onStruckByLightning(p_70077_1_); - this.dataWatcher.updateObject(17, Byte.valueOf((byte) 1)); - } - - @Override - protected boolean interact(EntityPlayer p_70085_1_) { - ItemStack itemstack = p_70085_1_.inventory.getCurrentItem(); - - if(itemstack != null && itemstack.getItem() == Items.flint_and_steel) { - this.worldObj.playSoundEffect(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D, "fire.ignite", 1.0F, this.rand.nextFloat() * 0.4F + 0.8F); - p_70085_1_.swingItem(); - - if(!this.worldObj.isRemote) { - this.func_146079_cb(); - itemstack.damageItem(1, p_70085_1_); - return true; - } - } - - return super.interact(p_70085_1_); - } - - private void func_146077_cc() { + public void func_146077_cc() { if(!this.worldObj.isRemote) { - this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); - - if(this.getPowered()) { - this.explosionRadius *= 3; - } + boolean griefing = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); worldObj.newExplosion(this, posX, posY, posZ, 5.0F, false, false); - if(this.getPowered()) { - - for(int i = 0; i < 255; i++) { - int a = rand.nextInt(15) + (int) posX - 7; - int b = rand.nextInt(15) + (int) posY - 7; - int c = rand.nextInt(15) + (int) posZ - 7; - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { - - if(!GeneralConfig.enableHardcoreTaint) - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 5, 2); - else - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3), 2); + if(griefing) { + if(this.getPowered()) { + + for(int i = 0; i < 255; i++) { + int a = rand.nextInt(15) + (int) posX - 7; + int b = rand.nextInt(15) + (int) posY - 7; + int c = rand.nextInt(15) + (int) posZ - 7; + + if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { + if(!GeneralConfig.enableHardcoreTaint) { + worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 5, 2); + } else { + worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3), 2); + } + } } - } - - } else { - - for(int i = 0; i < 85; i++) { - int a = rand.nextInt(7) + (int) posX - 3; - int b = rand.nextInt(7) + (int) posY - 3; - int c = rand.nextInt(7) + (int) posZ - 3; - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { - - if(!GeneralConfig.enableHardcoreTaint) - - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(6) + 10, 2); - else - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); + + } else { + + for(int i = 0; i < 85; i++) { + int a = rand.nextInt(7) + (int) posX - 3; + int b = rand.nextInt(7) + (int) posY - 3; + int c = rand.nextInt(7) + (int) posZ - 3; + + if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { + if(!GeneralConfig.enableHardcoreTaint) { + worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(6) + 10, 2); + } else { + worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); + } + } } } } @@ -271,16 +97,4 @@ public class EntityTaintedCreeper extends EntityMob implements IRadiationImmune boolean b = (b0.renderAsNormalBlock() && b0.getMaterial().isOpaque()) || (b1.renderAsNormalBlock() && b1.getMaterial().isOpaque()) || (b2.renderAsNormalBlock() && b2.getMaterial().isOpaque()) || (b3.renderAsNormalBlock() && b3.getMaterial().isOpaque()) || (b4.renderAsNormalBlock() && b4.getMaterial().isOpaque()) || (b5.renderAsNormalBlock() && b5.getMaterial().isOpaque()); return b; } - - public boolean func_146078_ca() { - return this.dataWatcher.getWatchableObjectByte(18) != 0; - } - - public void func_146079_cb() { - this.dataWatcher.updateObject(18, Byte.valueOf((byte) 1)); - } - - public void setPowered(int power) { - this.dataWatcher.updateObject(17, power); - } } diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAINuclearCreeperSwell.java b/src/main/java/com/hbm/entity/mob/ai/EntityAINuclearCreeperSwell.java deleted file mode 100644 index 665d9dd88..000000000 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAINuclearCreeperSwell.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.hbm.entity.mob.ai; - -import com.hbm.entity.mob.EntityNuclearCreeper; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; - -public class EntityAINuclearCreeperSwell extends EntityAIBase { - /** The creeper that is swelling. */ - EntityNuclearCreeper swellingCreeper; - /** The creeper's attack target. This is used for the changing of the creeper's state. */ - EntityLivingBase creeperAttackTarget; - public EntityAINuclearCreeperSwell(EntityNuclearCreeper p_i1655_1_) - { - this.swellingCreeper = p_i1655_1_; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() - { - EntityLivingBase entitylivingbase = this.swellingCreeper.getAttackTarget(); - return this.swellingCreeper.getCreeperState() > 0 || entitylivingbase != null && this.swellingCreeper.getDistanceSqToEntity(entitylivingbase) < 9.0D; - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.swellingCreeper.getNavigator().clearPathEntity(); - this.creeperAttackTarget = this.swellingCreeper.getAttackTarget(); - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.creeperAttackTarget = null; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - if (this.creeperAttackTarget == null) - { - this.swellingCreeper.setCreeperState(-1); - } - else if (this.swellingCreeper.getDistanceSqToEntity(this.creeperAttackTarget) > 49.0D) - { - this.swellingCreeper.setCreeperState(-1); - } - else if (!this.swellingCreeper.getEntitySenses().canSee(this.creeperAttackTarget)) - { - this.swellingCreeper.setCreeperState(-1); - } - else - { - this.swellingCreeper.setCreeperState(1); - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAITaintedCreeperSwell.java b/src/main/java/com/hbm/entity/mob/ai/EntityAITaintedCreeperSwell.java deleted file mode 100644 index 44c749cbe..000000000 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAITaintedCreeperSwell.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.hbm.entity.mob.ai; - -import com.hbm.entity.mob.EntityTaintedCreeper; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; - -public class EntityAITaintedCreeperSwell extends EntityAIBase { - /** The creeper that is swelling. */ - EntityTaintedCreeper swellingCreeper; - /** The creeper's attack target. This is used for the changing of the creeper's state. */ - EntityLivingBase creeperAttackTarget; - public EntityAITaintedCreeperSwell(EntityTaintedCreeper p_i1655_1_) - { - this.swellingCreeper = p_i1655_1_; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() - { - EntityLivingBase entitylivingbase = this.swellingCreeper.getAttackTarget(); - return this.swellingCreeper.getCreeperState() > 0 || entitylivingbase != null && this.swellingCreeper.getDistanceSqToEntity(entitylivingbase) < 9.0D; - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.swellingCreeper.getNavigator().clearPathEntity(); - this.creeperAttackTarget = this.swellingCreeper.getAttackTarget(); - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.creeperAttackTarget = null; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - if (this.creeperAttackTarget == null) - { - this.swellingCreeper.setCreeperState(-1); - } - else if (this.swellingCreeper.getDistanceSqToEntity(this.creeperAttackTarget) > 49.0D) - { - this.swellingCreeper.setCreeperState(-1); - } - else if (!this.swellingCreeper.getEntitySenses().canSee(this.creeperAttackTarget)) - { - this.swellingCreeper.setCreeperState(-1); - } - else - { - this.swellingCreeper.setCreeperState(1); - } - } -} diff --git a/src/main/java/com/hbm/entity/projectile/EntityBullet.java b/src/main/java/com/hbm/entity/projectile/EntityBullet.java index e4e4a19cc..3bbf98b02 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBullet.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBullet.java @@ -32,7 +32,7 @@ import net.minecraft.world.World; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.RedBarrel; import com.hbm.entity.grenade.EntityGrenadeTau; -import com.hbm.entity.mob.EntityNuclearCreeper; +import com.hbm.entity.mob.EntityCreeperNuclear; import com.hbm.entity.particle.EntityBSmokeFX; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; @@ -494,7 +494,7 @@ public class EntityBullet extends Entity implements IProjectile { if (entitylivingbase instanceof EntityPlayer && ArmorUtil.checkForHazmat((EntityPlayer) entitylivingbase)) { } else if (entitylivingbase instanceof EntityCreeper) { - EntityNuclearCreeper creep = new EntityNuclearCreeper(this.worldObj); + EntityCreeperNuclear creep = new EntityCreeperNuclear(this.worldObj); creep.setLocationAndAngles(entitylivingbase.posX, entitylivingbase.posY, entitylivingbase.posZ, entitylivingbase.rotationYaw, entitylivingbase.rotationPitch); if (!entitylivingbase.isDead) @@ -509,7 +509,7 @@ public class EntityBullet extends Entity implements IProjectile { if (!this.worldObj.isRemote) this.worldObj.spawnEntityInWorld(creep); } else if (entitylivingbase instanceof EntityLivingBase - && !(entitylivingbase instanceof EntityNuclearCreeper) + && !(entitylivingbase instanceof EntityCreeperNuclear) && !(entitylivingbase instanceof EntityMooshroom) && !(entitylivingbase instanceof EntityZombie)) { entitylivingbase.addPotionEffect(new PotionEffect(Potion.poison.getId(), 2 * 60 * 20, 2)); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 3360a132b..ba93c94a2 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -682,7 +682,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityMovingPackage.class, new RenderMovingPackage()); RenderingRegistry.registerEntityRenderingHandler(EntityTNTPrimedBase.class, new RenderTNTPrimedBase()); //mobs - RenderingRegistry.registerEntityRenderingHandler(EntityNuclearCreeper.class, new RenderNuclearCreeper()); + RenderingRegistry.registerEntityRenderingHandler(EntityCreeperNuclear.class, new RenderNuclearCreeper()); RenderingRegistry.registerEntityRenderingHandler(EntityTaintedCreeper.class, new RenderTaintedCreeper()); RenderingRegistry.registerEntityRenderingHandler(EntityHunterChopper.class, new RenderHunterChopper()); RenderingRegistry.registerEntityRenderingHandler(EntityCyberCrab.class, new RenderCyberCrab()); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 74e150a55..1b8ab3236 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -22,7 +22,7 @@ import com.hbm.entity.missile.EntityMissileBaseAdvanced; import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.entity.mob.EntityCyberCrab; import com.hbm.entity.mob.EntityDuck; -import com.hbm.entity.mob.EntityNuclearCreeper; +import com.hbm.entity.mob.EntityCreeperNuclear; import com.hbm.entity.mob.EntityQuackos; import com.hbm.entity.mob.EntityTaintedCreeper; import com.hbm.entity.projectile.EntityBulletBase; @@ -577,7 +577,7 @@ public class ModEventHandler { if(entity instanceof EntityCreeper && eRad >= 200 && entity.getHealth() > 0) { if(event.world.rand.nextInt(3) == 0 ) { - EntityNuclearCreeper creep = new EntityNuclearCreeper(event.world); + EntityCreeperNuclear creep = new EntityCreeperNuclear(event.world); creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); if(!entity.isDead) diff --git a/src/main/java/com/hbm/render/entity/mob/RenderNuclearCreeper.java b/src/main/java/com/hbm/render/entity/mob/RenderNuclearCreeper.java index 54bba99bb..4ddce6f9b 100644 --- a/src/main/java/com/hbm/render/entity/mob/RenderNuclearCreeper.java +++ b/src/main/java/com/hbm/render/entity/mob/RenderNuclearCreeper.java @@ -2,7 +2,7 @@ package com.hbm.render.entity.mob; import org.lwjgl.opengl.GL11; -import com.hbm.entity.mob.EntityNuclearCreeper; +import com.hbm.entity.mob.EntityCreeperNuclear; import com.hbm.lib.RefStrings; import net.minecraft.client.model.ModelBase; @@ -13,177 +13,126 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; -public class RenderNuclearCreeper extends RenderLiving -{ - private static final ResourceLocation armoredCreeperTextures = new ResourceLocation(RefStrings.MODID + ":" + "textures/entity/creeper_armor.png"); - private static final ResourceLocation creeperTextures = new ResourceLocation(RefStrings.MODID + ":" + "textures/entity/creeper.png"); - /** The creeper model. */ - private ModelBase creeperModel = new ModelCreeper(2.0F); +public class RenderNuclearCreeper extends RenderLiving { + + private static final ResourceLocation armoredCreeperTextures = new ResourceLocation(RefStrings.MODID + ":" + "textures/entity/creeper_armor.png"); + private static final ResourceLocation creeperTextures = new ResourceLocation(RefStrings.MODID + ":" + "textures/entity/creeper.png"); + private ModelBase creeperModel = new ModelCreeper(2.0F); - public RenderNuclearCreeper() - { - super(new ModelCreeper(), 0.5F); - } + public RenderNuclearCreeper() { + super(new ModelCreeper(), 0.5F); + } - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityNuclearCreeper p_77041_1_, float p_77041_2_) - { - float f1 = p_77041_1_.getCreeperFlashIntensity(p_77041_2_); - float f2 = 1.0F + MathHelper.sin(f1 * 100.0F) * f1 * 0.01F; + protected void preRenderCallback(EntityCreeperNuclear p_77041_1_, float p_77041_2_) { + float f1 = p_77041_1_.getCreeperFlashIntensity(p_77041_2_); + float f2 = 1.0F + MathHelper.sin(f1 * 100.0F) * f1 * 0.01F; - if (f1 < 0.0F) - { - f1 = 0.0F; - } + if(f1 < 0.0F) { + f1 = 0.0F; + } - if (f1 > 1.0F) - { - f1 = 1.0F; - } + if(f1 > 1.0F) { + f1 = 1.0F; + } - f1 *= f1; - f1 *= f1; - float f3 = (1.0F + f1 * 0.4F) * f2; - float f4 = (1.0F + f1 * 0.1F) / f2; - GL11.glScalef(f3, f4, f3); - } + f1 *= f1; + f1 *= f1; + float f3 = (1.0F + f1 * 0.4F) * f2; + float f4 = (1.0F + f1 * 0.1F) / f2; + GL11.glScalef(f3, f4, f3); + } - /** - * Returns an ARGB int color back. Args: entityLiving, lightBrightness, partialTickTime - */ - protected int getColorMultiplier(EntityNuclearCreeper p_77030_1_, float p_77030_2_, float p_77030_3_) - { - float f2 = p_77030_1_.getCreeperFlashIntensity(p_77030_3_); + protected int getColorMultiplier(EntityCreeperNuclear p_77030_1_, float p_77030_2_, float p_77030_3_) { + float f2 = p_77030_1_.getCreeperFlashIntensity(p_77030_3_); - if ((int)(f2 * 10.0F) % 2 == 0) - { - return 0; - } - else - { - int i = (int)(f2 * 0.2F * 255.0F); + if((int) (f2 * 10.0F) % 2 == 0) { + return 0; + } else { + int i = (int) (f2 * 0.2F * 255.0F); - if (i < 0) - { - i = 0; - } + if(i < 0) { + i = 0; + } - if (i > 255) - { - i = 255; - } + if(i > 255) { + i = 255; + } - short short1 = 255; - short short2 = 255; - short short3 = 255; - return i << 24 | short1 << 16 | short2 << 8 | short3; - } - } + short short1 = 255; + short short2 = 255; + short short3 = 255; + return i << 24 | short1 << 16 | short2 << 8 | short3; + } + } - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityNuclearCreeper p_77032_1_, int p_77032_2_, float p_77032_3_) - { - if (p_77032_1_.getPowered()) - { - if (p_77032_1_.isInvisible()) - { - GL11.glDepthMask(false); - } - else - { - GL11.glDepthMask(true); - } + protected int shouldRenderPass(EntityCreeperNuclear p_77032_1_, int p_77032_2_, float p_77032_3_) { + if(p_77032_1_.getPowered()) { + if(p_77032_1_.isInvisible()) { + GL11.glDepthMask(false); + } else { + GL11.glDepthMask(true); + } - if (p_77032_2_ == 1) - { - float f1 = p_77032_1_.ticksExisted + p_77032_3_; - this.bindTexture(armoredCreeperTextures); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - float f2 = f1 * 0.01F; - float f3 = f1 * 0.01F; - GL11.glTranslatef(f2, f3, 0.0F); - this.setRenderPassModel(this.creeperModel); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_BLEND); - float f4 = 0.5F; - GL11.glColor4f(f4, f4, f4, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - return 1; - } + if(p_77032_2_ == 1) { + float f1 = p_77032_1_.ticksExisted + p_77032_3_; + this.bindTexture(armoredCreeperTextures); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + float f2 = f1 * 0.01F; + float f3 = f1 * 0.01F; + GL11.glTranslatef(f2, f3, 0.0F); + this.setRenderPassModel(this.creeperModel); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_BLEND); + float f4 = 0.5F; + GL11.glColor4f(f4, f4, f4, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + return 1; + } - if (p_77032_2_ == 2) - { - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glLoadIdentity(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - } - } + if(p_77032_2_ == 2) { + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glLoadIdentity(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + } + } - return -1; - } + return -1; + } - protected int inheritRenderPass(EntityNuclearCreeper p_77035_1_, int p_77035_2_, float p_77035_3_) - { - return -1; - } + protected int inheritRenderPass(EntityCreeperNuclear p_77035_1_, int p_77035_2_, float p_77035_3_) { + return -1; + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityNuclearCreeper p_110775_1_) - { - return creeperTextures; - } + protected ResourceLocation getEntityTexture(EntityCreeperNuclear p_110775_1_) { + return creeperTextures; + } - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - @Override - protected void preRenderCallback(EntityLivingBase p_77041_1_, float p_77041_2_) - { - this.preRenderCallback((EntityNuclearCreeper)p_77041_1_, p_77041_2_); - } + @Override + protected void preRenderCallback(EntityLivingBase p_77041_1_, float p_77041_2_) { + this.preRenderCallback((EntityCreeperNuclear) p_77041_1_, p_77041_2_); + } - /** - * Returns an ARGB int color back. Args: entityLiving, lightBrightness, partialTickTime - */ - @Override - protected int getColorMultiplier(EntityLivingBase p_77030_1_, float p_77030_2_, float p_77030_3_) - { - return this.getColorMultiplier((EntityNuclearCreeper)p_77030_1_, p_77030_2_, p_77030_3_); - } + @Override + protected int getColorMultiplier(EntityLivingBase p_77030_1_, float p_77030_2_, float p_77030_3_) { + return this.getColorMultiplier((EntityCreeperNuclear) p_77030_1_, p_77030_2_, p_77030_3_); + } - /** - * Queries whether should render the specified pass or not. - */ - @Override - protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) - { - return this.shouldRenderPass((EntityNuclearCreeper)p_77032_1_, p_77032_2_, p_77032_3_); - } + @Override + protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) { + return this.shouldRenderPass((EntityCreeperNuclear) p_77032_1_, p_77032_2_, p_77032_3_); + } - @Override - protected int inheritRenderPass(EntityLivingBase p_77035_1_, int p_77035_2_, float p_77035_3_) - { - return this.inheritRenderPass((EntityNuclearCreeper)p_77035_1_, p_77035_2_, p_77035_3_); - } + @Override + protected int inheritRenderPass(EntityLivingBase p_77035_1_, int p_77035_2_, float p_77035_3_) { + return this.inheritRenderPass((EntityCreeperNuclear) p_77035_1_, p_77035_2_, p_77035_3_); + } - /** - * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. - */ - @Override - protected ResourceLocation getEntityTexture(Entity p_110775_1_) - { - return this.getEntityTexture((EntityNuclearCreeper)p_110775_1_); - } + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityCreeperNuclear) p_110775_1_); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java index c40358133..fcab378f7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java @@ -5,7 +5,6 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.entity.mob.EntityCyberCrab; -import com.hbm.entity.mob.EntityNuclearCreeper; import com.hbm.entity.mob.EntityTaintCrab; import com.hbm.entity.mob.EntityTeslaCrab; import com.hbm.lib.Library; @@ -134,10 +133,6 @@ public class TileEntityTesla extends TileEntityMachineBase implements IEnergyUse ((EntityCreeper)e).getDataWatcher().updateObject(17, Byte.valueOf((byte)1)); } - if(e instanceof EntityNuclearCreeper) { - ((EntityNuclearCreeper)e).getDataWatcher().updateObject(17, Byte.valueOf((byte)1)); - } - double offset = 0; if(source != null && e instanceof EntityPlayer && worldObj.isRemote) diff --git a/src/main/java/com/hbm/util/ContaminationUtil.java b/src/main/java/com/hbm/util/ContaminationUtil.java index 612d8b23b..c09b3ba4a 100644 --- a/src/main/java/com/hbm/util/ContaminationUtil.java +++ b/src/main/java/com/hbm/util/ContaminationUtil.java @@ -3,7 +3,7 @@ package com.hbm.util; import java.util.HashSet; import com.hbm.entity.mob.EntityDuck; -import com.hbm.entity.mob.EntityNuclearCreeper; +import com.hbm.entity.mob.EntityCreeperNuclear; import com.hbm.entity.mob.EntityQuackos; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.HazmatRegistry; @@ -65,7 +65,7 @@ public class ContaminationUtil { return true; if(immuneEntities.isEmpty()) { - immuneEntities.add(EntityNuclearCreeper.class); + immuneEntities.add(EntityCreeperNuclear.class); immuneEntities.add(EntityMooshroom.class); immuneEntities.add(EntityZombie.class); immuneEntities.add(EntitySkeleton.class); diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg new file mode 100644 index 000000000..93dfb3d3a --- /dev/null +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -0,0 +1,3 @@ +# EntityCreeper +public net.minecraft.entity.monster.EntityCreeper field_82225_f # fuseTime +public net.minecraft.entity.monster.EntityCreeper func_146077_cc()V # explode diff --git a/src/main/resources/assets/hbm/textures/entity/creeper_base.png b/src/main/resources/assets/hbm/textures/entity/creeper_base.png new file mode 100644 index 0000000000000000000000000000000000000000..abdb54008f1ebf4407886d16f3b05a1fe61bb5d8 GIT binary patch literal 2964 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 KMNUMnLSTXdH;0-4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/entity/creeper_mustard.png b/src/main/resources/assets/hbm/textures/entity/creeper_mustard.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2016173365f35794459815bb3abde1d956914f GIT binary patch literal 3104 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