Jump to content

SilasOtoko

Members
  • Posts

    92
  • Joined

  • Last visited

Everything posted by SilasOtoko

  1. I'm working on an item that despawns a mob when you right click a specific mob with it. I've been trying to work backwards from making the entity spawn from an item, but I can't seem to make it work. I would post what code I have so far, but for some reason the website is not letting me post a code or spoiler. Basically I am trying to use the Method OnItemUse with a statement world.removeEntity();. I'll try to get my actual code on here another time. In the mean time, does anyone have an idea of what code would work to accomplish this?
  2. Interesting. Thanks for explaining that to me
  3. Ick...That sounds more complicated than what I was prepared for. I might just move on to something else. What are Reflections now that you mentioned it?
  4. Yeah I've got a custom enchantment made for it already, and I think I've found the code I need to make it work. It's the getCurrentPlayerStrvsBlock method in EntityPlayer, which mentions the isInsideofMaterial break speed and mentions the WaterWorker Enchantment. Not sure how to make it work inside of my enchantment class though.
  5. Well I was hoping to apply the enchantment directly to the pickaxe. I'm starting to think it might be easier or closer to what I am looking for if I just make the pickaxe more effective while underwater? Like maybe if I do a check for a player being underwater? I guess what I want is a pickaxe that does the opposite of what normally happens when a player is underwater, and increases the mining rate rather than decrease.
  6. Hey guys, I'm working on a pickaxe that basically has the enchantment of WaterWorker. Only problem is, WaterWorker was meant as a helmet enchantment. Does anyone know how I can make my Custom Pickaxe have WaterWorker on it?
  7. I'm working on a custom dragon, basically the enderdragon, but one that does not use the same Targeting system. The reason I want to change this is so that a player won't have a dragon that chases them to the ends of the earth and instead stays in one territory. I'm trying to figure out a way to do this without actually negating any of the animation such as flying and turning away upon being hit and so on. Eventually I think I may have to set the Entity up as a normal entity instead of extending the Dragon class so that I can have it using normal mob AI. Anyone have any input as to how to set this up? So far I have not been successful in having the dragon model appear when not extending the Dragon Class. So I guess my question is this: Does anyone have a good idea on how to change the targeting system for the dragon and how to implement it? or Limiting the dragon only to a certain territory/biome so that he gives up the chase after a certain amount of time? Also, does anyone know what part of the code allows the dragon to move through blocks?
  8. (slaps forehead) It didn't even cross my mind that I could extend the classes. Now with extending EntityDragon, I will only have to define the methods that I want to change right? I'm not quite sure how to extend from a class where everything is already defined. And yeah I'm using Eclipse.
  9. Anyone have any more insight on this? It seems the only thing that doesn't work is actually rendering the model itself. I've duplicated the mob just like I would any other mob, and registered it the same, so what am I missing? Here is the client proxy in case anyone wants to see the actual RenderRegister. Client Proxy RenderingRegistry.registerEntityRenderingHandler(EntityFireDragon.class, new RenderFireDragon(new ModelFireDragon(0.0F), 0.3F));
  10. Thanks MineMaarten I actually found an example online that uses a different method, although I'm not sure if it is better, here it is: WorldGenClass @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId){ //case -1: generateNether(world, random,chunkX*16,chunkZ16); case 0 : generateSurface(world, random, chunkX*16, chunkZ*16); } } private void generateSurface(World world, Random random, int BlockX, int BlockZ){ for(int i = 0; i < 2; i++){ int posX = BlockX + random.nextInt(16); int posZ = BlockZ + random.nextInt(16); int posY = 50 + random.nextInt(25); (new WorldGenCustomFlower(TutorialMod.GlowFlower.blockID)).generate(world, random, posX, posY, posZ); WorldFlowerGenClass public class WorldGenCustomFlower extends WorldGenerator { /** The ID of the plant block used in this plant generator. */ private int GlowFlowerBlockId; public WorldGenCustomFlower(int par1) { this.GlowFlowerBlockId = par1; } public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) { BiomeGenBase b = par1World.getBiomeGenForCoords(par3, par5); if(b.biomeName.equals("Plains") || b.biomeName.equals("Extreme Hills") || b.biomeName.equals("Forest")) { for (int l = 0; l < 2; ++l) { int i1 = par3 + par2Random.nextInt(1) - par2Random.nextInt(1); int j1 = par4 + par2Random.nextInt(1) - par2Random.nextInt(1); int k1 = par5 + par2Random.nextInt(1) - par2Random.nextInt(1); if (par1World.isAirBlock(i1, j1, k1) && TutorialMod.GlowFlower.canPlaceBlockAt(par1World, i1, j1, k1)) { int l1 = 1 + par2Random.nextInt(par2Random.nextInt(3) + 1); for (int i2 = 0; i2 < l1; ++i2) { if (TutorialMod.GlowFlower.canBlockStay(par1World, i1, j1 + i2, k1)) { par1World.setBlock(i1, j1 + i2, k1, TutorialMod.GlowFlower.blockID, 0, 1); } } } } } return true; } }
  11. GoToLink, if you want to give a quick rundown of how to generate blocks on the surface, I think many people would appreciate it. I don't think there are any good tutorials out there on the subject.
  12. Well I have custom Ores that generate, and custom trees, but not sure how to set up the generator for flowers instead of ores or trees? I guess the answer to your question is no, I don't know how to use setBlock to make blocks randomly generate.
  13. I have yet to find any kind of tutorial on how to get custom plants like custom flowers to generate in the world. Anyone have any insight into this?
  14. Do you mind explaining Breakpoints for me? I've never tried using them before.
  15. Hmm, I wonder if I need to register the DragonPart Entity as well as the DragonEntity, and what would that look like for me to register both?
  16. Yeeaaaahhh...I am basically duplicating, but I was trying to take out the bits of code that involved the healing towers and the whole boss fight thing. I suppose I should make sure I can render it from a basic duplication before trying to mess with it beyond that.
  17. Right, I have that in my client proxy. It works for regular mobs but not for my multi-part dragon.
  18. I'm working on what is basically a copy of the EnderDragon, except I will give it a new texture and have it spit out fire at the player, but I can't seem to get the dragon Model to render in the game. It exists in the game, and attacks the animals in the area, but it is invisible. I've successfully created other custom mobs that work fine, but I'm assuming the Dragon takes more work since it has so many parts to it. Any help in what is required to render a multi-part mob? Here is the Entity and Render code for the dragon, and don't judge on it, I haven't cleaned it up yet until I can get it to show up and then I can customize it more as well. Entity import java.util.Iterator; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockEndPortal; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.IEntityMultiPart; import net.minecraft.entity.boss.EntityDragonPart; import net.minecraft.entity.boss.IBossDisplayData; import net.minecraft.entity.item.EntityEnderCrystal; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.Explosion; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class EntityFireDragon extends EntityLiving implements IEntityMultiPart { public double targetX; public double targetY; public double targetZ; /** * Ring buffer array for the last 64 Y-positions and yaw rotations. Used to calculate offsets for the animations. */ public double[][] ringBuffer = new double[64][3]; /** * Index into the ring buffer. Incremented once per tick and restarts at 0 once it reaches the end of the buffer. */ public int ringBufferIndex = -1; /** An array containing all body parts of this dragon */ public EntityDragonPart[] dragonPartArray; /** The head bounding box of a dragon */ public EntityDragonPart dragonPartHead; /** The body bounding box of a dragon */ public EntityDragonPart dragonPartBody; public EntityDragonPart dragonPartTail1; public EntityDragonPart dragonPartTail2; public EntityDragonPart dragonPartTail3; public EntityDragonPart dragonPartWing1; public EntityDragonPart dragonPartWing2; /** Animation time at previous tick. */ public float prevAnimTime = 0.0F; /** * Animation time, used to control the speed of the animation cycles (wings flapping, jaw opening, etc.) */ public float animTime = 0.0F; /** Force selecting a new flight target at next tick if set to true. */ public boolean forceNewTarget = false; /** * Activated if the dragon is flying though obsidian, white stone or bedrock. Slows movement and animation speed. */ public boolean slowed = false; private Entity target; public int deathTicks = 0; public EntityFireDragon(World par1World) { super(par1World); this.dragonPartArray = new EntityDragonPart[] {this.dragonPartHead = new EntityDragonPart(this, "head", 6.0F, 6.0F), this.dragonPartBody = new EntityDragonPart(this, "body", 8.0F, 8.0F), this.dragonPartTail1 = new EntityDragonPart(this, "tail", 4.0F, 4.0F), this.dragonPartTail2 = new EntityDragonPart(this, "tail", 4.0F, 4.0F), this.dragonPartTail3 = new EntityDragonPart(this, "tail", 4.0F, 4.0F), this.dragonPartWing1 = new EntityDragonPart(this, "wing", 4.0F, 4.0F), this.dragonPartWing2 = new EntityDragonPart(this, "wing", 4.0F, 4.0F)}; this.setEntityHealth(this.getMaxHealth()); this.texture = "/mob/enderdragon/ender.png"; this.setSize(16.0F, 8.0F); this.noClip = true; this.isImmuneToFire = true; this.targetY = 100.0D; this.ignoreFrustumCheck = true; } public int getMaxHealth() { return 100; } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, new Integer(this.getMaxHealth())); } /** * Returns a double[3] array with movement offsets, used to calculate trailing tail/neck positions. [0] = yaw * offset, [1] = y offset, [2] = unused, always 0. Parameters: buffer index offset, partial ticks. */ public double[] getMovementOffsets(int par1, float par2) { if (this.health <= 0) { par2 = 0.0F; } par2 = 1.0F - par2; int j = this.ringBufferIndex - par1 * 1 & 63; int k = this.ringBufferIndex - par1 * 1 - 1 & 63; double[] adouble = new double[3]; double d0 = this.ringBuffer[j][0]; double d1 = MathHelper.wrapAngleTo180_double(this.ringBuffer[k][0] - d0); adouble[0] = d0 + d1 * (double)par2; d0 = this.ringBuffer[j][1]; d1 = this.ringBuffer[k][1] - d0; adouble[1] = d0 + d1 * (double)par2; adouble[2] = this.ringBuffer[j][2] + (this.ringBuffer[k][2] - this.ringBuffer[j][2]) * (double)par2; return adouble; } /** * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons * use this to react to sunlight and start to burn. */ public void onLivingUpdate() { float f; float f1; if (!this.worldObj.isRemote) { this.dataWatcher.updateObject(16, Integer.valueOf(this.health)); } else { f = MathHelper.cos(this.animTime * (float)Math.PI * 2.0F); f1 = MathHelper.cos(this.prevAnimTime * (float)Math.PI * 2.0F); if (f1 <= -0.3F && f >= -0.3F) { this.worldObj.playSound(this.posX, this.posY, this.posZ, "mob.enderdragon.wings", 5.0F, 0.8F + this.rand.nextFloat() * 0.3F, false); } } this.prevAnimTime = this.animTime; float f2; if (this.health <= 0) { f = (this.rand.nextFloat() - 0.5F) * 8.0F; f1 = (this.rand.nextFloat() - 0.5F) * 4.0F; f2 = (this.rand.nextFloat() - 0.5F) * 8.0F; this.worldObj.spawnParticle("largeexplode", this.posX + (double)f, this.posY + 2.0D + (double)f1, this.posZ + (double)f2, 0.0D, 0.0D, 0.0D); } else { f = 0.2F / (MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ) * 10.0F + 1.0F); f *= (float)Math.pow(2.0D, this.motionY); if (this.slowed) { this.animTime += f * 0.5F; } else { this.animTime += f; } this.rotationYaw = MathHelper.wrapAngleTo180_float(this.rotationYaw); if (this.ringBufferIndex < 0) { for (int i = 0; i < this.ringBuffer.length; ++i) { this.ringBuffer[i][0] = (double)this.rotationYaw; this.ringBuffer[i][1] = this.posY; } } if (++this.ringBufferIndex == this.ringBuffer.length) { this.ringBufferIndex = 0; } this.ringBuffer[this.ringBufferIndex][0] = (double)this.rotationYaw; this.ringBuffer[this.ringBufferIndex][1] = this.posY; double d0; double d1; double d2; double d3; float f3; if (this.worldObj.isRemote) { if (this.newPosRotationIncrements > 0) { d3 = this.posX + (this.newPosX - this.posX) / (double)this.newPosRotationIncrements; d0 = this.posY + (this.newPosY - this.posY) / (double)this.newPosRotationIncrements; d1 = this.posZ + (this.newPosZ - this.posZ) / (double)this.newPosRotationIncrements; d2 = MathHelper.wrapAngleTo180_double(this.newRotationYaw - (double)this.rotationYaw); this.rotationYaw = (float)((double)this.rotationYaw + d2 / (double)this.newPosRotationIncrements); this.rotationPitch = (float)((double)this.rotationPitch + (this.newRotationPitch - (double)this.rotationPitch) / (double)this.newPosRotationIncrements); --this.newPosRotationIncrements; this.setPosition(d3, d0, d1); this.setRotation(this.rotationYaw, this.rotationPitch); } } else { d3 = this.targetX - this.posX; d0 = this.targetY - this.posY; d1 = this.targetZ - this.posZ; d2 = d3 * d3 + d0 * d0 + d1 * d1; if (this.target != null) { this.targetX = this.target.posX; this.targetZ = this.target.posZ; double d4 = this.targetX - this.posX; double d5 = this.targetZ - this.posZ; double d6 = Math.sqrt(d4 * d4 + d5 * d5); double d7 = 0.4000000059604645D + d6 / 80.0D - 1.0D; if (d7 > 10.0D) { d7 = 10.0D; } this.targetY = this.target.boundingBox.minY + d7; } else { this.targetX += this.rand.nextGaussian() * 2.0D; this.targetZ += this.rand.nextGaussian() * 2.0D; } if (this.forceNewTarget || d2 < 100.0D || d2 > 22500.0D || this.isCollidedHorizontally || this.isCollidedVertically) { this.setNewTarget(); } d0 /= (double)MathHelper.sqrt_double(d3 * d3 + d1 * d1); f3 = 0.6F; if (d0 < (double)(-f3)) { d0 = (double)(-f3); } if (d0 > (double)f3) { d0 = (double)f3; } this.motionY += d0 * 0.10000000149011612D; this.rotationYaw = MathHelper.wrapAngleTo180_float(this.rotationYaw); double d8 = 180.0D - Math.atan2(d3, d1) * 180.0D / Math.PI; double d9 = MathHelper.wrapAngleTo180_double(d8 - (double)this.rotationYaw); if (d9 > 50.0D) { d9 = 50.0D; } if (d9 < -50.0D) { d9 = -50.0D; } Vec3 vec3 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.targetX - this.posX, this.targetY - this.posY, this.targetZ - this.posZ).normalize(); Vec3 vec31 = this.worldObj.getWorldVec3Pool().getVecFromPool((double)MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F), this.motionY, (double)(-MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F))).normalize(); float f4 = (float)(vec31.dotProduct(vec3) + 0.5D) / 1.5F; if (f4 < 0.0F) { f4 = 0.0F; } this.randomYawVelocity *= 0.8F; float f5 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ) * 1.0F + 1.0F; double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ) * 1.0D + 1.0D; if (d10 > 40.0D) { d10 = 40.0D; } this.randomYawVelocity = (float)((double)this.randomYawVelocity + d9 * (0.699999988079071D / d10 / (double)f5)); this.rotationYaw += this.randomYawVelocity * 0.1F; float f6 = (float)(2.0D / (d10 + 1.0D)); float f7 = 0.06F; this.moveFlying(0.0F, -1.0F, f7 * (f4 * f6 + (1.0F - f6))); if (this.slowed) { this.moveEntity(this.motionX * 0.800000011920929D, this.motionY * 0.800000011920929D, this.motionZ * 0.800000011920929D); } else { this.moveEntity(this.motionX, this.motionY, this.motionZ); } Vec3 vec32 = this.worldObj.getWorldVec3Pool().getVecFromPool(this.motionX, this.motionY, this.motionZ).normalize(); float f8 = (float)(vec32.dotProduct(vec31) + 1.0D) / 2.0F; f8 = 0.8F + 0.15F * f8; this.motionX *= (double)f8; this.motionZ *= (double)f8; this.motionY *= 0.9100000262260437D; } this.renderYawOffset = this.rotationYaw; this.dragonPartHead.width = this.dragonPartHead.height = 3.0F; this.dragonPartTail1.width = this.dragonPartTail1.height = 2.0F; this.dragonPartTail2.width = this.dragonPartTail2.height = 2.0F; this.dragonPartTail3.width = this.dragonPartTail3.height = 2.0F; this.dragonPartBody.height = 3.0F; this.dragonPartBody.width = 5.0F; this.dragonPartWing1.height = 2.0F; this.dragonPartWing1.width = 4.0F; this.dragonPartWing2.height = 3.0F; this.dragonPartWing2.width = 4.0F; f1 = (float)(this.getMovementOffsets(5, 1.0F)[1] - this.getMovementOffsets(10, 1.0F)[1]) * 10.0F / 180.0F * (float)Math.PI; f2 = MathHelper.cos(f1); float f9 = -MathHelper.sin(f1); float f10 = this.rotationYaw * (float)Math.PI / 180.0F; float f11 = MathHelper.sin(f10); float f12 = MathHelper.cos(f10); this.dragonPartBody.onUpdate(); this.dragonPartBody.setLocationAndAngles(this.posX + (double)(f11 * 0.5F), this.posY, this.posZ - (double)(f12 * 0.5F), 0.0F, 0.0F); this.dragonPartWing1.onUpdate(); this.dragonPartWing1.setLocationAndAngles(this.posX + (double)(f12 * 4.5F), this.posY + 2.0D, this.posZ + (double)(f11 * 4.5F), 0.0F, 0.0F); this.dragonPartWing2.onUpdate(); this.dragonPartWing2.setLocationAndAngles(this.posX - (double)(f12 * 4.5F), this.posY + 2.0D, this.posZ - (double)(f11 * 4.5F), 0.0F, 0.0F); if (!this.worldObj.isRemote && this.hurtTime == 0) { this.collideWithEntities(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.dragonPartWing1.boundingBox.expand(4.0D, 2.0D, 4.0D).offset(0.0D, -2.0D, 0.0D))); this.collideWithEntities(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.dragonPartWing2.boundingBox.expand(4.0D, 2.0D, 4.0D).offset(0.0D, -2.0D, 0.0D))); this.attackEntitiesInList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.dragonPartHead.boundingBox.expand(1.0D, 1.0D, 1.0D))); } double[] adouble = this.getMovementOffsets(5, 1.0F); double[] adouble1 = this.getMovementOffsets(0, 1.0F); f3 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F - this.randomYawVelocity * 0.01F); float f13 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F - this.randomYawVelocity * 0.01F); this.dragonPartHead.onUpdate(); this.dragonPartHead.setLocationAndAngles(this.posX + (double)(f3 * 5.5F * f2), this.posY + (adouble1[1] - adouble[1]) * 1.0D + (double)(f9 * 5.5F), this.posZ - (double)(f13 * 5.5F * f2), 0.0F, 0.0F); for (int j = 0; j < 3; ++j) { EntityDragonPart entitydragonpart = null; if (j == 0) { entitydragonpart = this.dragonPartTail1; } if (j == 1) { entitydragonpart = this.dragonPartTail2; } if (j == 2) { entitydragonpart = this.dragonPartTail3; } double[] adouble2 = this.getMovementOffsets(12 + j * 2, 1.0F); float f14 = this.rotationYaw * (float)Math.PI / 180.0F + this.simplifyAngle(adouble2[0] - adouble[0]) * (float)Math.PI / 180.0F * 1.0F; float f15 = MathHelper.sin(f14); float f16 = MathHelper.cos(f14); float f17 = 1.5F; float f18 = (float)(j + 1) * 2.0F; entitydragonpart.onUpdate(); entitydragonpart.setLocationAndAngles(this.posX - (double)((f11 * f17 + f15 * f18) * f2), this.posY + (adouble2[1] - adouble[1]) * 1.0D - (double)((f18 + f17) * f9) + 1.5D, this.posZ + (double)((f12 * f17 + f16 * f18) * f2), 0.0F, 0.0F); } } } /** * Pushes all entities inside the list away from the enderdragon. */ private void collideWithEntities(List par1List) { double d0 = (this.dragonPartBody.boundingBox.minX + this.dragonPartBody.boundingBox.maxX) / 2.0D; double d1 = (this.dragonPartBody.boundingBox.minZ + this.dragonPartBody.boundingBox.maxZ) / 2.0D; Iterator iterator = par1List.iterator(); while (iterator.hasNext()) { Entity entity = (Entity)iterator.next(); if (entity instanceof EntityLiving) { double d2 = entity.posX - d0; double d3 = entity.posZ - d1; double d4 = d2 * d2 + d3 * d3; entity.addVelocity(d2 / d4 * 4.0D, 0.20000000298023224D, d3 / d4 * 4.0D); } } } /** * Attacks all entities inside this list, dealing 5 hearts of damage. */ private void attackEntitiesInList(List par1List) { for (int i = 0; i < par1List.size(); ++i) { Entity entity = (Entity)par1List.get(i); if (entity instanceof EntityLiving) { entity.attackEntityFrom(DamageSource.causeMobDamage(this), 10); } } } /** * Sets a new target for the flight AI. It can be a random coordinate or a nearby player. */ private void setNewTarget() { this.forceNewTarget = false; if (this.rand.nextInt(2) == 0 && !this.worldObj.playerEntities.isEmpty()) { this.target = (Entity)this.worldObj.playerEntities.get(this.rand.nextInt(this.worldObj.playerEntities.size())); } else { boolean flag = false; do { this.targetX = 0.0D; this.targetY = (double)(70.0F + this.rand.nextFloat() * 50.0F); this.targetZ = 0.0D; this.targetX += (double)(this.rand.nextFloat() * 120.0F - 60.0F); this.targetZ += (double)(this.rand.nextFloat() * 120.0F - 60.0F); double d0 = this.posX - this.targetX; double d1 = this.posY - this.targetY; double d2 = this.posZ - this.targetZ; flag = d0 * d0 + d1 * d1 + d2 * d2 > 100.0D; } while (!flag); this.target = null; } } /** * Simplifies the value of a number by adding/subtracting 180 to the point that the number is between -180 and 180. */ private float simplifyAngle(double par1) { return (float)MathHelper.wrapAngleTo180_double(par1); } public boolean attackEntityFromPart(EntityDragonPart par1EntityDragonPart, DamageSource par2DamageSource, int par3) { if (par1EntityDragonPart != this.dragonPartHead) { par3 = par3 / 4 + 1; } float f = this.rotationYaw * (float)Math.PI / 180.0F; float f1 = MathHelper.sin(f); float f2 = MathHelper.cos(f); this.targetX = this.posX + (double)(f1 * 5.0F) + (double)((this.rand.nextFloat() - 0.5F) * 2.0F); this.targetY = this.posY + (double)(this.rand.nextFloat() * 3.0F) + 1.0D; this.targetZ = this.posZ - (double)(f2 * 5.0F) + (double)((this.rand.nextFloat() - 0.5F) * 2.0F); this.target = null; if (par2DamageSource.getEntity() instanceof EntityPlayer || par2DamageSource.isExplosion()) { this.func_82195_e(par2DamageSource, par3); } return true; } /** * Called when the entity is attacked. */ public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) { return false; } protected boolean func_82195_e(DamageSource par1DamageSource, int par2) { return super.attackEntityFrom(par1DamageSource, par2); } /** * handles entity death timer, experience orb and particle creation */ protected void onDeathUpdate() { ++this.deathTicks; if (this.deathTicks >= 180 && this.deathTicks <= 200) { float f = (this.rand.nextFloat() - 0.5F) * 8.0F; float f1 = (this.rand.nextFloat() - 0.5F) * 4.0F; float f2 = (this.rand.nextFloat() - 0.5F) * 8.0F; this.worldObj.spawnParticle("hugeexplosion", this.posX + (double)f, this.posY + 2.0D + (double)f1, this.posZ + (double)f2, 0.0D, 0.0D, 0.0D); } int i; int j; if (!this.worldObj.isRemote) { if (this.deathTicks > 150 && this.deathTicks % 5 == 0) { i = 1000; while (i > 0) { j = EntityXPOrb.getXPSplit(i); i -= j; this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, j)); } } if (this.deathTicks == 1) { this.worldObj.func_82739_e(1018, (int)this.posX, (int)this.posY, (int)this.posZ, 0); } } this.moveEntity(0.0D, 0.10000000149011612D, 0.0D); this.renderYawOffset = this.rotationYaw += 20.0F; if (this.deathTicks == 100 && !this.worldObj.isRemote) { i = 100; while (i > 0) { j = EntityXPOrb.getXPSplit(i); i -= j; this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, j)); } this.setDead(); } } /** * Makes the entity despawn if requirements are reached */ protected void despawnEntity() {} /** * Return the Entity parts making up this Entity (currently only for dragons) */ public Entity[] getParts() { return this.dragonPartArray; } /** * Returns true if other Entities should be prevented from moving through this Entity. */ public boolean canBeCollidedWith() { return true; } @SideOnly(Side.CLIENT) /** * Returns the health points of the dragon. */ public int getBossHealth() { return this.dataWatcher.getWatchableObjectInt(16); } public World func_82194_d() { return this.worldObj; } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return "mob.enderdragon.growl"; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.enderdragon.hit"; } /** * Returns the volume for the sounds this mob makes. */ protected float getSoundVolume() { return 3.0F; } } Render @SideOnly(Side.CLIENT) public class RenderFireDragon extends RenderLiving { /** * Reloads the dragon model if not equal to 4. Presumably a leftover debugging field. */ private static int updateModelState = 0; /** An instance of the dragon model in RenderDragon */ protected ModelFireDragon model; public RenderFireDragon(ModelFireDragon par1model, float f) { super(par1model, f); model = (ModelFireDragon)mainModel; this.setRenderPassModel(this.mainModel); } /** * Used to rotate the dragon as a whole in RenderDragon. It's called in the rotateCorpse method. */ protected void rotateDragonBody(EntityFireDragon par1EntityDragon, float par2, float par3, float par4) { float f3 = (float)par1EntityDragon.getMovementOffsets(7, par4)[0]; float f4 = (float)(par1EntityDragon.getMovementOffsets(5, par4)[1] - par1EntityDragon.getMovementOffsets(10, par4)[1]); GL11.glRotatef(-f3, 0.0F, 1.0F, 0.0F); GL11.glRotatef(f4 * 10.0F, 1.0F, 0.0F, 0.0F); GL11.glTranslatef(0.0F, 0.0F, 1.0F); if (par1EntityDragon.deathTime > 0) { float f5 = ((float)par1EntityDragon.deathTime + par4 - 1.0F) / 20.0F * 1.6F; f5 = MathHelper.sqrt_float(f5); if (f5 > 1.0F) { f5 = 1.0F; } GL11.glRotatef(f5 * this.getDeathMaxRotation(par1EntityDragon), 0.0F, 0.0F, 1.0F); } } /** * Renders the dragon model. Called by renderModel. */ protected void renderFireDragonModel(EntityFireDragon par1EntityDragon, float par2, float par3, float par4, float par5, float par6, float par7) { float f6 = (float)par1EntityDragon.deathTicks / 100.0F; GL11.glDepthFunc(GL11.GL_LEQUAL); GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glAlphaFunc(GL11.GL_GREATER, f6); this.loadTexture("/mob/enderdragon/shuffle.png"); this.mainModel.render(par1EntityDragon, par2, par3, par4, par5, par6, par7); GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); GL11.glDepthFunc(GL11.GL_EQUAL); this.loadTexture(par1EntityDragon.getTexture()); this.mainModel.render(par1EntityDragon, par2, par3, par4, par5, par6, par7); if (par1EntityDragon.hurtTime > 0) { GL11.glDepthFunc(GL11.GL_EQUAL); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 0.0F, 0.0F, 0.5F); this.mainModel.render(par1EntityDragon, par2, par3, par4, par5, par6, par7); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_BLEND); GL11.glDepthFunc(GL11.GL_LEQUAL); } } /** * Renders the dragon, along with its dying animation */ public void renderFireDragon(EntityFireDragon par1EntityDragon, double par2, double par4, double par6, float par8, float par9) { if (updateModelState != 4) { this.mainModel = new ModelFireDragon(0.0F); updateModelState = 4; } super.doRenderLiving(par1EntityDragon, par2, par4, par6, par8, par9); } /** * Renders the animation for when an enderdragon dies */ protected void renderDragonDying(EntityFireDragon par1EntityDragon, float par2) { super.renderEquippedItems(par1EntityDragon, par2); Tessellator tessellator = Tessellator.instance; if (par1EntityDragon.deathTicks > 0) { RenderHelper.disableStandardItemLighting(); float f1 = ((float)par1EntityDragon.deathTicks + par2) / 200.0F; float f2 = 0.0F; if (f1 > 0.8F) { f2 = (f1 - 0.8F) / 0.2F; } Random random = new Random(432L); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glShadeModel(GL11.GL_SMOOTH); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glDepthMask(false); GL11.glPushMatrix(); GL11.glTranslatef(0.0F, -1.0F, -2.0F); for (int i = 0; (float)i < (f1 + f1 * f1) / 2.0F * 60.0F; ++i) { GL11.glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F); GL11.glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F); GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(random.nextFloat() * 360.0F + f1 * 90.0F, 0.0F, 0.0F, 1.0F); tessellator.startDrawing(6); float f3 = random.nextFloat() * 20.0F + 5.0F + f2 * 10.0F; float f4 = random.nextFloat() * 2.0F + 1.0F + f2 * 2.0F; tessellator.setColorRGBA_I(16777215, (int)(255.0F * (1.0F - f2))); tessellator.addVertex(0.0D, 0.0D, 0.0D); tessellator.setColorRGBA_I(16711935, 0); tessellator.addVertex(-0.866D * (double)f4, (double)f3, (double)(-0.5F * f4)); tessellator.addVertex(0.866D * (double)f4, (double)f3, (double)(-0.5F * f4)); tessellator.addVertex(0.0D, (double)f3, (double)(1.0F * f4)); tessellator.addVertex(-0.866D * (double)f4, (double)f3, (double)(-0.5F * f4)); tessellator.draw(); } GL11.glPopMatrix(); GL11.glDepthMask(true); GL11.glDisable(GL11.GL_CULL_FACE); GL11.glDisable(GL11.GL_BLEND); GL11.glShadeModel(GL11.GL_FLAT); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_ALPHA_TEST); RenderHelper.enableStandardItemLighting(); } } /** * Renders the overlay for glowing eyes and the mouth. Called by shouldRenderPass. */ protected int renderGlow(EntityFireDragon par1EntityDragon, int par2, float par3) { if (par2 == 1) { GL11.glDepthFunc(GL11.GL_LEQUAL); } if (par2 != 0) { return -1; } else { this.loadTexture("/mob/enderdragon/ender_eyes.png"); float f1 = 1.0F; GL11.glEnable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); GL11.glDisable(GL11.GL_LIGHTING); GL11.glDepthFunc(GL11.GL_EQUAL); char c0 = 61680; int j = c0 % 65536; int k = c0 / 65536; OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j / 1.0F, (float)k / 1.0F); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glEnable(GL11.GL_LIGHTING); GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); return 1; } } /** * Queries whether should render the specified pass or not. */ protected int shouldRenderPass(EntityLiving par1EntityLiving, int par2, float par3) { return this.renderGlow((EntityFireDragon)par1EntityLiving, par2, par3); } protected void renderEquippedItems(EntityLiving par1EntityLiving, float par2) { this.renderDragonDying((EntityFireDragon)par1EntityLiving, par2); } protected void rotateCorpse(EntityLiving par1EntityLiving, float par2, float par3, float par4) { this.rotateDragonBody((EntityFireDragon)par1EntityLiving, par2, par3, par4); } /** * Renders the model in RenderLiving */ @Override protected void renderModel(EntityLiving par1EntityLiving, float par2, float par3, float par4, float par5, float par6, float par7) { this.renderFireDragonModel((EntityFireDragon)par1EntityLiving, par2, par3, par4, par5, par6, par7); } public void doRenderLiving(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9) { this.renderFireDragon((EntityFireDragon)par1EntityLiving, par2, par4, par6, par8, par9); } /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ @Override public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) { this.renderFireDragon((EntityFireDragon)par1Entity, par2, par4, par6, par8, par9); } }
  19. Wonderful! Thank you coolAlias! It works like a charm. Thanks for your patience as well
  20. Sorry I didn't realize what you were telling me before. Can you give me an example of how that code looks in the canAttackClass method?
  21. Hmm...so what I am hearing is that I may have to do a bit of original coding instead of basing it off of vanilla code? Ugh....I'm going to have to get better at java coding at some point I guess.
  22. .....EntityLiving Dangit. Haha. Alright so is there a better way? I feel a bit misled, because I assumed the Iron Golem code would work just fine, and for the most part it does, because it doesn't attack passive mobs, it doesn't attack the player unless attacked, it attacks zombies and such, and it even doesn't attack Iron Golems, but it still attacks the other custom mobs. I'm pretty sure my only problem lies with the Imob Selector, and needing to have my mob be identified as a passive mob by other mobs. Worst case scenario, if I can't get this figured out, my plan B was to have the custom mob just attack whatever attacked it first. I tried using the IsAngry code for it, but couldn't get it to work. I feel like I am missing some key bits of code buried in other areas.
  23. No it extends EntityMob. And it works as it should with all other mobs, except for another custom mob. So my only issue is, how can I register my custom mob as one of the mobs that is not seen as an enemy when using Imob Selector. And where is the base code for that located anyway?
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.