
FuzzyAcornIndustries
Members-
Posts
49 -
Joined
-
Last visited
-
Days Won
1
Everything posted by FuzzyAcornIndustries
-
Thanks! So with your suggestion I came up with this and it seems to work as desired: @Override //Depreciated public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entity, boolean p_185477_7_) { if(!(entity instanceof TamablePokemon) && !(entity instanceof EntityPlayer)) { AxisAlignedBB axisalignedbb = state.getBoundingBox(worldIn, pos).offset(pos); if (entityBox.intersectsWith(axisalignedbb)) { collidingBoxes.add(axisalignedbb); } } } Should I be at all concerned that this Method is marked as Depreciated? Like, it getting removed in a future update?
-
I am trying to figure out how to make a block where some mobs can pass through it where others cannot. Unless someone knows of a better way, I am guessing I have to handle this somehow with this method: public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entity) { if(entity instanceof EntityMob) { // do something here } } I don't have a very good understanding of EnumFacing if that has to be used and would have to need some explanation on how to use it here. I would also like to make this block so all mobs (not just a select few) cannot see through it. It seems if a block is passable in any way, a mob can see through it. Can I prevent them from seeing through a passable block?
-
I have a hostile mob that is set to attack Zombies if the player is not around. This mob also spawns in the Nether and thus also attacks Zombie Pigmen. (I know this problem stems from Zombie Pigmen inheritance from the Zombie class) What might be a suggested way to prevent my mob from being automatically hostile Zombie Pigmen?
-
I tried this but it doesn't seem to work: Set<Biome> biomes; Iterator<Biome> biomeIterator; biomes = BiomeDictionary.getBiomes(Type.SANDY); biomeIterator = biomes.iterator(); while(biomeIterator.hasNext()) { Biome currentBiome = biomeIterator.next(); currentBiome.getSpawnableList(EnumCreatureType.MONSTER).add(new SpawnListEntry(EntityZerglingNincada.class, 590, 3, 6)); currentBiome.getSpawnableList(EnumCreatureType.MONSTER).add(new SpawnListEntry(EntityRaptorZerglingNincada.class, 555, 3, 5)); currentBiome.getSpawnableList(EnumCreatureType.MONSTER).add(new SpawnListEntry(EntityCracklingNincada.class, 30, 3, 5)); } I then tested biomes.isEmpty() and it returned True. Is this the wrong way to approach the Biome set like this?
-
I have over 10 mobs I'd like to spawn in various places. I see tags like "Wasteland," "Hot," "Sandy," and "Snowy" among other types I would like to use. And if possible, be able to set up checks to make sure mobs don't spawn in unintended places such as a "Snowy" and "Forest" mob not to spawn in Ice Plains or Roofed Forests for example. Setting spawn frequency would be great too.
-
[1.11] Custom Bow Texturing/Visual Effect
FuzzyAcornIndustries replied to FuzzyAcornIndustries's topic in Modder Support
Thank you very much! That fixed the textureless part of my problem here. -
I am creating a custom bow called the Bow of Kindred with a unique texture feature/effect: a custom position and to make it glow. Texture positioning When not drawn, the player runs around the world with the bow in hand like a regular bow. But when the bow is drawn, it switches from a vertical position to a horizontal position. This screenshot shows it looking properly in Minecraft 1.7.10: So far my attempts as trying to figure out this how this works for the weird .json junk haven't been successful. With what I have, when the bow is pulled, the textureless purple box appears. Below is what I have coded so far. bow_of_kindred.json bow_of_kindred_pulling_0.json The relevant error message I get on loading the game: What can I do to fix the texturless box appearing when the bow is pulled? Glow Effect: I have absolutely no idea where to even start looking to make the bow texture glow like in the screenshot above with the .json junk. If someone might have some ideas on where to go with that, that would be great. In 1.7.10, the bow rendering was based on clever use of the Spider/Enderman render code.
-
I am actually working on mob model animation to give the illusion of my mobs' parts obeying physics better (such as a mob with a long tail turning around). Eventually I'll move on to jumps and falling. I played around for a while and decided the variable, renderYawOffset, seemed to work best for my needs. The biggest challenge I had to face was what you mentioned with the rotation amount rollback but I did overcome that after a few hours. All the math I have handled in the client side version of the Entity class which the model class just calls over the results so as to ensure it is unique to that mob. It works great. Thanks, your suggestions gave me a good idea of where to even start trying this. You say you do this in your mod's animations? Which mod is that?
-
I wanted to see if there was a simple or easy way to detect how fast a mob is turning left or right and have the value sent or used in its respected model class(es) before attempting to write something on my own. I do not necessarily need actual code but it something is open source to look at, great! If not, some general ideas such as what functions or classes to use or write would be helpful too. If I would have to do the detection in the server side Entity class and send it to the client side Model class. If that is true, I might ask for the least resource intensive way to send that information there.
-
Actually, looking at it again, it might not have to do with the bow class. With EnderIO installed, something goes wrong with this line: if (player.capabilities.isCreativeMode || this.getDamage(bow) < this.getMaxDamage() || player.inventory.hasItem(PokemonMDItem.huntersCharge)) If I am in creative mode, this seems to go through and the bow acts as should normally. Something happens with: this.getDamage(bow) < this.getMaxDamage() That last Or statement doesn't matter unless the bow's durability (ammo) runs out. Again, when EnderIO is not installed, I don't have problems. The bow performs as expected.
-
I recently finished a lovely new bow (extends ItemBow) for my modification. Works wonderful thanks to special coding taken from Battlegear and Zelda Sword Skills. I went to try and use this new bow with my personal "mod pack" map only to find it does not work at all in survival. Apparently, one of the mods I have installed, EnderIO, does something to the ItemBow class that leaves my custom bow, with its custom way to handle ammo based on item damage, unable to work. What can I do about this as I imagine this wouldn't be the only mod this custom bow would have problems with? I've tried creating my own bow and arrow classes rather than extending ItemBow or EntityArrow but then I run into significant rendering bugs.
-
Nice! It works lovely. I think there is a version difference with what you gave me. Mine ended up as: @Override public void writeSpawnData(ByteBuf buffer) { buffer.writeInt(this.shootingEntity != null ? this.shootingEntity.getEntityId() : -1); } @Override public void readSpawnData(ByteBuf buffer) { // Replicate EntityArrow's special spawn packet handling from NetClientHandler#handleVehicleSpawn: Entity shooter = worldObj.getEntityByID(buffer.readInt()); if (shooter instanceof EntityLivingBase) { this.shootingEntity = (EntityLivingBase) shooter; } } Thanks coolAlias, you are the best! And if someone else is reading this page to add your own custom arrow, don't copy my code from the my previous post. It has several issues I am now finding since my last post. I'll see to fixing them.
-
Thanks coolAlias! Not ideal but it is good enough for my needs. And your Zelda Sword Skills on Github helped me get this far! I think I got everything working but I have an odd problem. The new arrows seem to behave correctly but look rather strange. If I just log in, and shoot a few rounds, everything looks fine like this: http://img11.deviantart.net/2dab/i/2016/178/8/f/bowtrouble1_by_fuzzyacornindustries-da7wca2.jpg[/img] But if move, such as to pick up the arrows and return to the same spot to shoot some rounds, this happens: http://img05.deviantart.net/21a7/i/2016/178/6/d/bowtrouble2_by_fuzzyacornindustries-da7wcw3.jpg[/img] I am guessing this is a client side issue? I cannot tell for sure. Below is what I have done to get this to work. The new arrow class, pretty much a copy paste as is with a new main constructor and two line changes in the onUpdate() function. One at the beginning to skip the EntityArrow onUpdate() function and this line: if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5) && !(entity1 instanceof TamablePokemon)) The whole class: public class PokemonMDArrow extends EntityArrow implements IProjectile { private int field_145791_d = -1; private int field_145792_e = -1; private int field_145789_f = -1; private Block field_145790_g; private int inData; private boolean inGround; /** 1 if the player can pick up the arrow */ public int canBePickedUp; /** Seems to be some sort of timer for animating an arrow. */ public int arrowShake; /** The owner of this arrow. */ public Entity shootingEntity; private int ticksInGround; private int ticksInAir; private double damage = 2.0D; /** The amount of knockback an arrow applies when it hits a mob. */ private int knockbackStrength; public PokemonMDArrow(World p_i1753_1_) { super(p_i1753_1_); this.renderDistanceWeight = 10.0D; this.setSize(0.5F, 0.5F); } public PokemonMDArrow(World world, Entity entityLivingBasePar, double posX, double posY, double posZ, double motionX, double motionY, double motionZ, float rotationYaw, float rotationPitch) { super(world); this.renderDistanceWeight = 10.0D; this.shootingEntity = entityLivingBasePar; this.canBePickedUp = 1; this.setSize(0.5F, 0.5F); this.setLocationAndAngles(this.shootingEntity.posX, this.shootingEntity.posY + (double)this.shootingEntity.getEyeHeight(), this.shootingEntity.posZ, this.shootingEntity.rotationYaw, this.shootingEntity.rotationPitch); this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.posY -= 0.10000000149011612D; this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F); this.setPosition(this.posX, this.posY, this.posZ); this.yOffset = 0.0F; this.posX = posX; this.posY = posY; this.posZ = posZ; this.motionX = motionX; this.motionY = motionY; this.motionZ = motionZ; this.prevRotationYaw = this.rotationYaw = rotationYaw; this.prevRotationPitch = this.rotationPitch = rotationPitch; } protected void entityInit() { this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); } /** * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. */ public void setThrowableHeading(double p_70186_1_, double p_70186_3_, double p_70186_5_, float p_70186_7_, float p_70186_8_) { float f2 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_3_ * p_70186_3_ + p_70186_5_ * p_70186_5_); p_70186_1_ /= (double)f2; p_70186_3_ /= (double)f2; p_70186_5_ /= (double)f2; p_70186_1_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; p_70186_3_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; p_70186_5_ += this.rand.nextGaussian() * (double)(this.rand.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double)p_70186_8_; p_70186_1_ *= (double)p_70186_7_; p_70186_3_ *= (double)p_70186_7_; p_70186_5_ *= (double)p_70186_7_; this.motionX = p_70186_1_; this.motionY = p_70186_3_; this.motionZ = p_70186_5_; float f3 = MathHelper.sqrt_double(p_70186_1_ * p_70186_1_ + p_70186_5_ * p_70186_5_); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70186_1_, p_70186_5_) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70186_3_, (double)f3) * 180.0D / Math.PI); this.ticksInGround = 0; } /** * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, * posY, posZ, yaw, pitch */ @SideOnly(Side.CLIENT) public void setPositionAndRotation2(double p_70056_1_, double p_70056_3_, double p_70056_5_, float p_70056_7_, float p_70056_8_, int p_70056_9_) { this.setPosition(p_70056_1_, p_70056_3_, p_70056_5_); this.setRotation(p_70056_7_, p_70056_8_); } /** * Sets the velocity to the args. Args: x, y, z */ @SideOnly(Side.CLIENT) public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { this.motionX = p_70016_1_; this.motionY = p_70016_3_; this.motionZ = p_70016_5_; if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(p_70016_1_ * p_70016_1_ + p_70016_5_ * p_70016_5_); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(p_70016_1_, p_70016_5_) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(p_70016_3_, (double)f) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch; this.prevRotationYaw = this.rotationYaw; this.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); this.ticksInGround = 0; } } /** * Called to update the entity's position/logic. */ @Override public void onUpdate() { this.onEntityUpdate(); if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); } Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); if (block.getMaterial() != Material.air) { block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) { this.inGround = true; } } if (this.arrowShake > 0) { --this.arrowShake; } if (this.inGround) { int j = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); if (block == this.field_145790_g && j == this.inData) { ++this.ticksInGround; if (this.ticksInGround == 1200) { this.setDead(); } } else { this.inGround = false; this.motionX *= (double)(this.rand.nextFloat() * 0.2F); this.motionY *= (double)(this.rand.nextFloat() * 0.2F); this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); this.ticksInGround = 0; this.ticksInAir = 0; } } else { ++this.ticksInAir; Vec3 vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); Vec3 vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(vec31, vec3, false, true, false); vec31 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); vec3 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); if (movingobjectposition != null) { vec3 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); } Entity entity = null; List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); double d0 = 0.0D; int i; float f1; for (i = 0; i < list.size(); ++i) { Entity entity1 = (Entity)list.get(i); if (entity1.canBeCollidedWith() && (entity1 != this.shootingEntity || this.ticksInAir >= 5) && !(entity1 instanceof TamablePokemon)) { f1 = 0.3F; AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand((double)f1, (double)f1, (double)f1); MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(vec31, vec3); if (movingobjectposition1 != null) { double d1 = vec31.distanceTo(movingobjectposition1.hitVec); if (d1 < d0 || d0 == 0.0D) { entity = entity1; d0 = d1; } } } } if (entity != null) { movingobjectposition = new MovingObjectPosition(entity); } if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) { movingobjectposition = null; } } float f2; float f4; if (movingobjectposition != null) { if (movingobjectposition.entityHit != null) { f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); int k = MathHelper.ceiling_double_int((double)f2 * this.damage); if (this.getIsCritical()) { k += this.rand.nextInt(k / 2 + 2); } DamageSource damagesource = null; if (this.shootingEntity == null) { damagesource = DamageSource.causeArrowDamage(this, this); } else { damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); } if (this.isBurning() && !(movingobjectposition.entityHit instanceof EntityEnderman)) { movingobjectposition.entityHit.setFire(5); } if (movingobjectposition.entityHit.attackEntityFrom(damagesource, (float)k)) { if (movingobjectposition.entityHit instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase)movingobjectposition.entityHit; if (!this.worldObj.isRemote) { entitylivingbase.setArrowCountInEntity(entitylivingbase.getArrowCountInEntity() + 1); } if (this.knockbackStrength > 0) { f4 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); if (f4 > 0.0F) { movingobjectposition.entityHit.addVelocity(this.motionX * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4, 0.1D, this.motionZ * (double)this.knockbackStrength * 0.6000000238418579D / (double)f4); } } if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) { EnchantmentHelper.func_151384_a(entitylivingbase, this.shootingEntity); EnchantmentHelper.func_151385_b((EntityLivingBase)this.shootingEntity, entitylivingbase); } if (this.shootingEntity != null && movingobjectposition.entityHit != this.shootingEntity && movingobjectposition.entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) { ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F)); } } this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { this.setDead(); } } else { this.motionX *= -0.10000000149011612D; this.motionY *= -0.10000000149011612D; this.motionZ *= -0.10000000149011612D; this.rotationYaw += 180.0F; this.prevRotationYaw += 180.0F; this.ticksInAir = 0; } } else { this.field_145791_d = movingobjectposition.blockX; this.field_145792_e = movingobjectposition.blockY; this.field_145789_f = movingobjectposition.blockZ; this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); this.motionX = (double)((float)(movingobjectposition.hitVec.xCoord - this.posX)); this.motionY = (double)((float)(movingobjectposition.hitVec.yCoord - this.posY)); this.motionZ = (double)((float)(movingobjectposition.hitVec.zCoord - this.posZ)); f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); this.posX -= this.motionX / (double)f2 * 0.05000000074505806D; this.posY -= this.motionY / (double)f2 * 0.05000000074505806D; this.posZ -= this.motionZ / (double)f2 * 0.05000000074505806D; this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); this.inGround = true; this.arrowShake = 7; this.setIsCritical(false); if (this.field_145790_g.getMaterial() != Material.air) { this.field_145790_g.onEntityCollidedWithBlock(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f, this); } } } if (this.getIsCritical()) { for (i = 0; i < 4; ++i) { this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ); } } this.posX += this.motionX; this.posY += this.motionY; this.posZ += this.motionZ; f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f2) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { ; } while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { this.prevRotationPitch += 360.0F; } while (this.rotationYaw - this.prevRotationYaw < -180.0F) { this.prevRotationYaw -= 360.0F; } while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { this.prevRotationYaw += 360.0F; } this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; float f3 = 0.99F; f1 = 0.05F; if (this.isInWater()) { for (int l = 0; l < 4; ++l) { f4 = 0.25F; this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ); } f3 = 0.8F; } if (this.isWet()) { this.extinguish(); } this.motionX *= (double)f3; this.motionY *= (double)f3; this.motionZ *= (double)f3; this.motionY -= (double)f1; this.setPosition(this.posX, this.posY, this.posZ); this.func_145775_I(); } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound p_70014_1_) { p_70014_1_.setShort("xTile", (short)this.field_145791_d); p_70014_1_.setShort("yTile", (short)this.field_145792_e); p_70014_1_.setShort("zTile", (short)this.field_145789_f); p_70014_1_.setShort("life", (short)this.ticksInGround); p_70014_1_.setByte("inTile", (byte)Block.getIdFromBlock(this.field_145790_g)); p_70014_1_.setByte("inData", (byte)this.inData); p_70014_1_.setByte("shake", (byte)this.arrowShake); p_70014_1_.setByte("inGround", (byte)(this.inGround ? 1 : 0)); p_70014_1_.setByte("pickup", (byte)this.canBePickedUp); p_70014_1_.setDouble("damage", this.damage); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound p_70037_1_) { this.field_145791_d = p_70037_1_.getShort("xTile"); this.field_145792_e = p_70037_1_.getShort("yTile"); this.field_145789_f = p_70037_1_.getShort("zTile"); this.ticksInGround = p_70037_1_.getShort("life"); this.field_145790_g = Block.getBlockById(p_70037_1_.getByte("inTile") & 255); this.inData = p_70037_1_.getByte("inData") & 255; this.arrowShake = p_70037_1_.getByte("shake") & 255; this.inGround = p_70037_1_.getByte("inGround") == 1; if (p_70037_1_.hasKey("damage", 99)) { this.damage = p_70037_1_.getDouble("damage"); } if (p_70037_1_.hasKey("pickup", 99)) { this.canBePickedUp = p_70037_1_.getByte("pickup"); } else if (p_70037_1_.hasKey("player", 99)) { this.canBePickedUp = p_70037_1_.getBoolean("player") ? 1 : 0; } } /** * Called by a player entity when they collide with an entity */ public void onCollideWithPlayer(EntityPlayer p_70100_1_) { if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) { boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && p_70100_1_.capabilities.isCreativeMode; if (this.canBePickedUp == 1 && !p_70100_1_.inventory.addItemStackToInventory(new ItemStack(Items.arrow, 1))) { flag = false; } if (flag) { this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); p_70100_1_.onItemPickup(this, 1); this.setDead(); } } } /** * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to * prevent them from trampling crops */ protected boolean canTriggerWalking() { return false; } @SideOnly(Side.CLIENT) public float getShadowSize() { return 0.0F; } public void setDamage(double p_70239_1_) { this.damage = p_70239_1_; } public double getDamage() { return this.damage; } /** * Sets the amount of knockback the arrow applies when it hits a mob. */ public void setKnockbackStrength(int p_70240_1_) { this.knockbackStrength = p_70240_1_; } /** * If returns false, the item will not inflict any damage against entities. */ public boolean canAttackWithItem() { return false; } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public void setIsCritical(boolean p_70243_1_) { byte b0 = this.dataWatcher.getWatchableObjectByte(16); if (p_70243_1_) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -2))); } } /** * Whether the arrow has a stream of critical hit particles flying behind it. */ public boolean getIsCritical() { byte b0 = this.dataWatcher.getWatchableObjectByte(16); return (b0 & 1) != 0; } } The onEntityJoinWorld() in my event handle: @SubscribeEvent public void onEntityJoinWorld(EntityJoinWorldEvent event) { if (event.entity.getClass() != PokemonMDArrow.class && event.entity.getClass() == EntityArrow.class) { if (!event.entity.worldObj.isRemote) { if(((EntityArrow)event.entity).shootingEntity instanceof EntityPlayer) { PokemonMDArrow pokmeonMDArrow = new PokemonMDArrow(((EntityArrow)event.entity).worldObj, ((EntityArrow)event.entity).shootingEntity, ((EntityArrow)event.entity).posX, ((EntityArrow)event.entity).posY, ((EntityArrow)event.entity).posZ, ((EntityArrow)event.entity).motionX, ((EntityArrow)event.entity).motionY, ((EntityArrow)event.entity).motionZ, ((EntityArrow)event.entity).rotationYaw, ((EntityArrow)event.entity).rotationPitch); pokmeonMDArrow.worldObj.spawnEntityInWorld(pokmeonMDArrow); } } event.entity.setDead(); } } The Render class, a copy paste with just a change to the Entity class accepted: @SideOnly(Side.CLIENT) public class RenderPokemonMDArrow extends Render { private static final ResourceLocation arrowTextures = new ResourceLocation("textures/entity/arrow.png"); /** * 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 func_76986_a(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(PokemonMDArrow p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { this.bindEntityTexture(p_76986_1_); GL11.glPushMatrix(); GL11.glTranslatef((float)p_76986_2_, (float)p_76986_4_, (float)p_76986_6_); GL11.glRotatef(p_76986_1_.prevRotationYaw + (p_76986_1_.rotationYaw - p_76986_1_.prevRotationYaw) * p_76986_9_ - 90.0F, 0.0F, 1.0F, 0.0F); GL11.glRotatef(p_76986_1_.prevRotationPitch + (p_76986_1_.rotationPitch - p_76986_1_.prevRotationPitch) * p_76986_9_, 0.0F, 0.0F, 1.0F); Tessellator tessellator = Tessellator.instance; byte b0 = 0; float f2 = 0.0F; float f3 = 0.5F; float f4 = (float)(0 + b0 * 10) / 32.0F; float f5 = (float)(5 + b0 * 10) / 32.0F; float f6 = 0.0F; float f7 = 0.15625F; float f8 = (float)(5 + b0 * 10) / 32.0F; float f9 = (float)(10 + b0 * 10) / 32.0F; float f10 = 0.05625F; GL11.glEnable(GL12.GL_RESCALE_NORMAL); float f11 = (float)p_76986_1_.arrowShake - p_76986_9_; if (f11 > 0.0F) { float f12 = -MathHelper.sin(f11 * 3.0F) * f11; GL11.glRotatef(f12, 0.0F, 0.0F, 1.0F); } GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F); GL11.glScalef(f10, f10, f10); GL11.glTranslatef(-4.0F, 0.0F, 0.0F); GL11.glNormal3f(f10, 0.0F, 0.0F); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f8); tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f8); tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f9); tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f9); tessellator.draw(); GL11.glNormal3f(-f10, 0.0F, 0.0F); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)f6, (double)f8); tessellator.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)f7, (double)f8); tessellator.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)f7, (double)f9); tessellator.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)f6, (double)f9); tessellator.draw(); for (int i = 0; i < 4; ++i) { GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); GL11.glNormal3f(0.0F, 0.0F, f10); tessellator.startDrawingQuads(); tessellator.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)f2, (double)f4); tessellator.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)f3, (double)f4); tessellator.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)f3, (double)f5); tessellator.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)f2, (double)f5); tessellator.draw(); } GL11.glDisable(GL12.GL_RESCALE_NORMAL); GL11.glPopMatrix(); } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(PokemonMDArrow p_110775_1_) { return arrowTextures; } /** * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. */ protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return this.getEntityTexture((PokemonMDArrow)p_110775_1_); } /** * 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 func_76986_a(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { this.doRender((PokemonMDArrow)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); } } If anything else needs to be shown, just let me know. (yes, I would normally clean up the unnamed variable names. I wait until
-
My modification specializes in tamable mobs. One feature I am fixing is turning off friendly fire; in this case with arrows. I have successfully turned off damage inflicted by players using arrows but as a side effect, arrows bounce off these tamable mobs. This can lead to player shooting themselves or accidentally shooting other tamable mobs instead. How might I make arrows simply pass through these tamables and not cause damage? If it matters, below is what I currently use to nullify friendly fire in the tamable's entity class: @Override public boolean attackEntityFrom(DamageSource damageSource, float damageAmount) { if (this.isEntityInvulnerable()) { return false; } else { if (damageSource instanceof EntityDamageSource && this.isTamed() && this.getOwner() == damageSource.getEntity()) { if(this.getOwner() instanceof EntityPlayer) { EntityPlayer entityPlayer = (EntityPlayer)this.getOwner(); if(!entityPlayer.capabilities.isCreativeMode) { if (damageSource.getSourceOfDamage() instanceof EntityArrow) { // I realize setting this to true keeps arrows from bouncing off // but that deletes arrows. I want them to pass through. return false; } return true; } } } return super.attackEntityFrom(damageSource, damageAmount); } } Maybe if possible, see if whatever solution this might be could be applied to any player shot projectiles such as from other mods. If not, no big loss.
-
A custom mob, called Swordie Mienshao, I am making renders as just a box. I am not sure why despite trying to follow what other mods/posts do. I am modding for 1.8.9-11.15.1.1722 I'll try and supply everything I thought was relevant: Main Class: @Mod(modid = ModStrings.MODID, name = ModStrings.name, version = ModStrings.version) public class PokemonMD { @SidedProxy(clientSide = ModStrings.CLIENT_PROXY_CLASS, serverSide = ModStrings.SERVER_PROXY_CLASS) public static CommonProxy proxy; public static SimpleNetworkWrapper network; @Instance(value = ModStrings.MODID) public static PokemonMD instance; public static final int packetIDActionAnimation = 0; public static final String[] fTimer; static { fTimer = new String[] {"timer"}; } public enum GUI_ENUM { VERDANT_PURIFIER, VESPENE_CONDENSER } @EventHandler public void preInit(FMLPreInitializationEvent event) { PokemonMDCreativeTabs.initializeTabs(); PokemonMDBlocks.init(); PokemonMDBlocks.register(); PokemonMDItems.init(); PokemonMDItems.register(); proxy.registerTileEntities(); RecipesCrafting.mainRegistry(); PokemonMDEntities.registerEntityMob(); } @EventHandler public void init(FMLInitializationEvent event) { proxy.registerRenders(); } @EventHandler public void postInt(FMLPostInitializationEvent event) { proxy.initTimer(); PokemonMDEntities.addSpawnLocations(); } public static boolean isClient() { return FMLCommonHandler.instance().getSide().isClient(); } public static boolean isEffectiveClient() { return FMLCommonHandler.instance().getEffectiveSide().isClient(); } public static void sendAnimationPacket(IAnimatedEntity entity, int animationID) { if(isEffectiveClient()) return; entity.setAnimationID(animationID); network.sendToAll(new PacketAnimation((byte)animationID, ((Entity)entity).getEntityId())); } } "ModStrings.class" public class ModStrings { public static final String MODID = "pokemonmd"; public static final String name = "PokemonMD: Undaunted Heroes"; public static final String version = "1.8.9 - developer ver 0.0"; public static final String CLIENT_PROXY_CLASS = "com.fuzzyacornindustries.pokemonmd.proxy.ClientProxy"; public static final String SERVER_PROXY_CLASS = "com.fuzzyacornindustries.pokemonmd.proxy.CommonProxy"; } Client Proxy: public class ClientProxy extends CommonProxy { private Timer mcTimer; @Override public void registerRenders() { PokemonMDBlocks.registerRenders(); PokemonMDItems.registerRenders(); RenderingRegistry.registerEntityRenderingHandler(EntitySwordieMienshao.class, new IRenderFactory<EntitySwordieMienshao>() { @Override public Render<? super EntitySwordieMienshao> createRenderFor(RenderManager manager) { return new RenderSwordieMienshao(manager, new ModelSwordieMienshao(), 0.2F); } }); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityVerdantPurifier.class, new RendererVerdantPurifier()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityVespeneCondenser.class, new RendererVespeneCondenser()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityXelNagaDynamo.class, new RendererXelNagaDynamo()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityXelNagaPylon.class, new RendererXelNagaPylon()); } public void initTimer() { mcTimer = ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), PokemonMD.fTimer); } public float getPartialTick() { return mcTimer.renderPartialTicks; } @Override public World getWorldClient() { return FMLClientHandler.instance().getWorldClient(); } } Render Class: @SideOnly(Side.CLIENT) public class RenderSwordieMienshao extends RenderLiving<EntitySwordieMienshao> { private static final ResourceLocation mainTexture = new ResourceLocation(ModStrings.MODID + ":" +"textures/mobs/swordiemienshao.png"); public RenderSwordieMienshao(RenderManager renderManagerIn, ModelBase modelBaseIn, float shadowSizeIn) { super(renderManagerIn, modelBaseIn, shadowSizeIn); } @Override protected ResourceLocation getEntityTexture(EntitySwordieMienshao entity) { return mainTexture; } } Entity "registration" class public class PokemonMDEntities { public static void registerEntityMob() { createEntity(EntitySwordieMienshao.class, EntitySwordieMienshao.getMobName(), LibraryEntityID.SWORDIE_MIENSHAO, 0x2b2e3f, 0x096859); } public static void addSpawnLocations() { EntityRegistry.addSpawn(EntitySwordieMienshao.class, 100, 1, 1, EnumCreatureType.MONSTER, BiomeGenBase.coldTaiga, BiomeGenBase.coldTaigaHills, BiomeGenBase.extremeHills, BiomeGenBase.extremeHillsEdge, BiomeGenBase.extremeHillsPlus, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.iceMountains, BiomeGenBase.icePlains, BiomeGenBase.megaTaiga, BiomeGenBase.megaTaigaHills, BiomeGenBase.stoneBeach, BiomeGenBase.taiga, BiomeGenBase.taigaHills ); } public static void createEntity(Class entityClass, String entityName, int entityID, int parPrimaryColor, int parSecondaryColor) { int trackingRange = 64; int updateFrequency = 1; boolean sendsVelocityUpdates = true; EntityRegistry.registerModEntity(entityClass, entityName, entityID, PokemonMD.instance, trackingRange, updateFrequency, sendsVelocityUpdates); EntityRegistry.registerEgg(entityClass, parPrimaryColor, parSecondaryColor); } } You may notice there are some TileEntity blocks in the proxy. They render and animate just fine. If changes were supposed to be made to the Model class when updating from 1.7.10 to 1.8.9, I am not aware of any. It's just a copy paste of the older version.
-
Alright, so check stuff in my server proxy? I did have this function there: public EntityPlayerMP getPlayerEntityFromContext(MessageContext ctx) { return (EntityPlayerMP) (ctx.side.isClient() ? Minecraft.getMinecraft().thePlayer : ctx.getServerHandler().playerEntity); } A section of dead code on the server proxy I forgot to remove after I couldn't get a Jabelar tutorial to work on extending item reach. I removed it, exported the mod, and tried to start a server and it at least started up this time. I'll send a copy to my Beta tester to make sure there are not any unexpected consequences. Thanks so much for helping me figure out where to look! That helped immensely.
-
It was recently brought to my attention that my modification, PokemonMD: Undaunted Heroes, does not run on Multiplayer. The crash log: http://pastebin.com/N1Ug9UTT Apparently, somewhere in my mod I'm trying to call a client side class/function on the server that does exist. I have no idea how to find out where this happening with the literal hundreds of classes my mod has. What should I do? Is there a way to get it to tell me what class/function is trying to be called where?