Posted September 1, 201411 yr hello guys, I have a problem with my mob again... I have added some lines of custom information. But they seems to disappear all if I enter the nether. I believe entering a new dimension means that a mob get removed and the games places a copy in the new dimension. But the custom data seems to get removed. Can anybody help me with this? here is the entity class: public class EntityUndeadMage extends EntityAnimal{ /** * The summoner is the player that has summoned this mob. * This mob is programmed to help the summoner. */ public EntityPlayer summoner; /** * The player name of the summoner. */ public String summonerName; public UUID summonerUUID; /** * The type of magic this mob uses. * 0 = healing * 1 = mixed * 2 = offensive */ public int mageType; double movementSpeed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getBaseValue(); /** * The current mana the mob has */ public int mobMana; /** * The time this mob can't cast spells. */ public int manaCooldown; public String summonerId; /** * returns true if the mob should follow the summoner. * returns false if the mob should keep on the place where it is. */ public boolean guardSummoner = true; /** * The way this mob choses his target. * 0 = defensive, it will only attack mobs that attack him, his partners or the summoner. * 1 = helper, it will attack all mobs that the summoner attacks too and the defensive targetting. * 2 = offensive, the mob will attack every monster it sees. */ public int fightType; /** * The last mob that attacked this mob. */ public Entity lastAttacker; public EntityLivingBase target; /** * A required constructor for a mob. * * Do not use this constructor to summon this mob. * Use the constructor world, summoner, mageType, x, y, z. * @param world */ public EntityUndeadMage(World world) { super(world); this.setSize(0.9F, 1.8F); } /** * * @param world - The world the mob has to spawn. * @param summoner - The player that summons this mob. * @param mageType - The type of magic this mob will use. 0 = positive 1 = mixed 2 = offensive * @param x - The X location the mob has to spawn. * @param y - The Y location the mob has to spawn. * @param z - The Z location the mob has to spawn. */ public EntityUndeadMage(World world, EntityPlayer summoner, int mageType, double x, double y, double z){ super(world); this.setSize(0.6F, 1.8F); setPosition(x, y, z); prevPosX = x; prevPosY = y; prevPosZ = z; this.summoner = summoner; this.mageType = mageType; } /** * Returns true if the newer Entity AI code should be run */ public boolean isAIEnabled() { return true; } /** * The base attributes of this mob. */ protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35); } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return null; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.zombie.hurt"; } /** * Returns the sound this mob makes on death. */ protected String getDeathSound() { return "mob.zombie.hurt"; } protected void func_145780_a(int x, int y, int z, Block block) { this.playSound("mob.zombie.step", 0.15F, 1.0F); } /** * Returns the volume for the sounds this mob makes. */ protected float getSoundVolume() { return 0.4F; } protected Item getDropItem() { return Items.bone; } /** * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param * par2 - Level of Looting used to kill this mob. */ protected void dropFewItems(boolean hitbyplayer, int lootinglevel) { int j = this.rand.nextInt(3) + this.rand.nextInt(1 + lootinglevel); int k; for (k = 0; k < j; ++k) { this.dropItem(Items.bone, 1); } j = this.rand.nextInt(3) + 1 + this.rand.nextInt(1 + lootinglevel); for (k = 0; k < j; ++k) { if (this.isBurning()) { this.dropItem(Items.skull, 1); } else { this.dropItem(Items.skull, 1); } } } /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ public EntityUndeadMage createChild(EntityAgeable ageable) { return new EntityUndeadMage(this.worldObj); } public void onUpdate(){ super.onUpdate(); updateMana(); getSummoner(); if(summoner != null){ useMagic(); this.faceEntity(summoner, 0, 0); if(guardSummoner){ followSummoner(); } } } public void getSummoner() { if(summonerUUID == null && summoner == null && !worldObj.isRemote){ if(!summonerId.isEmpty()){ summonerUUID = UUID.fromString(summonerId); System.out.println(summonerId); } } if(summonerUUID != null && summoner == null){ summoner = worldObj.func_152378_a(summonerUUID); } if(summonerUUID != null){ summonerId = summonerUUID.toString(); } if(summoner != null && summonerUUID == null){ summonerUUID = summoner.getUniqueID(); } super.setInPortal(); } public void useMagic() { if(mageType == 0){ useHealingMagic(); } if(mageType == 1){ useMixedMagic(); } if(mageType == 2){ useOffensiveMagic(); } } public void useOffensiveMagic() { } public void useMixedMagic() { System.out.println(this.target); List partners = worldObj.getEntitiesWithinAABB(EntityUndeadMage.class, AxisAlignedBB.getBoundingBox(summoner.posX - 20, summoner.posY - 20, summoner.posZ - 20, summoner.posX + 20, summoner.posY + 20, summoner.posZ + 20)); for (int j = 0; j < partners.size(); ++j){ EntityUndeadMage partner = (EntityUndeadMage) partners.get(j); if(partner.getLastAttacker() != null && fightType == 0){ this.target = partner.getLastAttacker(); if(!this.target.isPotionActive(2) && mobMana >= 200){ this.target.addPotionEffect(new PotionEffect(2, 100, 5)); mobMana -= 200; } } } if(this.target != null && fightType == 0){ if(!this.target.isPotionActive(2) && mobMana >= 200){ this.target.addPotionEffect(new PotionEffect(2, 100, 5)); mobMana -= 200; } } } public void useHealingMagic() { if(summoner.isBurning() && !summoner.isPotionActive(12) && mobMana >= 200){ summoner.addPotionEffect(new PotionEffect(12, 40)); mobMana -= 200; worldObj.spawnParticle("flame", posX, posY, posZ, 0D, 0D, 0D); } List partners = worldObj.getEntitiesWithinAABB(EntityUndeadMage.class, AxisAlignedBB.getBoundingBox(summoner.posX - 20, summoner.posY - 20, summoner.posZ - 20, summoner.posX + 20, summoner.posY + 20, summoner.posZ + 20)); for (int j = 0; j < partners.size(); ++j){ EntityUndeadMage partner = (EntityUndeadMage) partners.get(j); if(partner.summoner == summoner){ if(partner.isBurning() && !partner.isPotionActive(12)){ if(mobMana >= 200){ partner.addPotionEffect(new PotionEffect(12, 40)); mobMana -= 200; } } if(partner.getHealth() >= 11 && partner.getHealth() <= 19 && !partner.isPotionActive(10) && mobMana >= 20){ partner.addPotionEffect(new PotionEffect(10, 100)); mobMana -= 20; } if(partner.fallDistance >= 4 && mobMana >= 100){ partner.fallDistance = 0; mobMana -= 100; } if(partner.getHealth() <= 10 && partner.getHealth() >= 6 && mobMana >= 100 && !partner.isPotionActive(10)){ partner.addPotionEffect(new PotionEffect(10, 100, 1)); mobMana -= 100; } if(partner.getHealth() <= 10 && partner.getHealth() >= 6 && partner.isPotionActive(10) && mobMana >= 100){ partner.heal(1F); mobMana -= 100; } if(partner.getHealth() <= 5 && partner.getHealth() >= 1 && mobMana >= 500 && !partner.isPotionActive(10)){ partner.addPotionEffect(new PotionEffect(10, 100, 2)); mobMana -= 500; } if(partner.getHealth() <= 5 && partner.getHealth() >= 1 && mobMana >= 1000){ mobMana -= 1000; partner.heal(5F); } } } if(summoner.getHealth() >= 11 && summoner.getHealth() <= 19 && !summoner.isPotionActive(10) && mobMana >= 20){ summoner.addPotionEffect(new PotionEffect(10,100)); mobMana -= 20; } if(summoner.fallDistance >= 4 && mobMana >= 100){ summoner.fallDistance = 0; mobMana -= 100; } if(summoner.getHealth() <= 10 && summoner.getHealth() >= 6 && !summoner.isPotionActive(10) && mobMana >= 100){ summoner.addPotionEffect(new PotionEffect(10, 10, 1)); mobMana -= 100; } if(summoner.getHealth() <= 10 && summoner.getHealth() >= 6 && summoner.isPotionActive(10) && mobMana >= 100){ summoner.heal(1F); mobMana -= 100; } if(summoner.getHealth() <= 5 && summoner.getHealth() >= 1 && !summoner.isPotionActive(10) && mobMana >= 500){ summoner.addPotionEffect(new PotionEffect(10, 100, 2)); mobMana -= 500; } if(summoner.getHealth() <= 5 && summoner.getHealth() >= 1 && mobMana >= 1000){ mobMana -= 1000; summoner.heal(5F); } } public void updateMana() { if(mobMana <= 5000){ mobMana += 1; } if(mobMana >= 5001){ mobMana = 5000; } if(manaCooldown >= 1){ manaCooldown -= 1; } if(manaCooldown <= 0){ manaCooldown = 0; } } public void followSummoner() { if(summoner != null){ if(summoner.posX >= posX + 5){ moveEntity(movementSpeed , 0, 0); } else if(summoner.posX <= posX - 5){ moveEntity(-1 * movementSpeed, 0, 0); } if(summoner.posZ >= posZ + 5){ moveEntity(0, 0, movementSpeed); } else if(summoner.posZ <= posZ - 5){ moveEntity(0, 0, -1 * movementSpeed); } if(this.onGround && summoner.posY >= posY + 2){ moveEntity(0, 3.0, 0); } if(summoner.posX >= posX + 16 || summoner.posX <= posX - 16 ||summoner.posY >= posY + 16 || summoner.posY <= posY - 16 || summoner.posZ >= posZ + 16|| summoner.posZ <= posZ - 16){ if(summoner.onGround || summoner.handleWaterMovement()){ setPosition(summoner.posX, summoner.posY, summoner.posZ); } } if(summoner.posX >= posX + 100 || summoner.posX <= posX - 100 || summoner.posZ >= posZ + 100 || summoner.posZ <= posZ - 100){ setPosition(summoner.posX, summoner.posY, summoner.posZ); } if(summoner.worldObj != null && worldObj != summoner.worldObj){ worldObj = summoner.worldObj; } } } public void writeEntityToNBT(NBTTagCompound nbt){ super.writeEntityToNBT(nbt); if(summoner != null){ nbt.setString("summonerUUID", summonerId); } nbt.setInteger("mobMana", mobMana); nbt.setBoolean("guardSummoner", guardSummoner); nbt.setInteger("mageType", mageType); nbt.setInteger("fightType", fightType); } public void readEntityFromNBT(NBTTagCompound nbt){ super.readEntityFromNBT(nbt); mobMana = nbt.getInteger("mobMana"); summonerId = nbt.getString("summonerUUID"); guardSummoner = nbt.getBoolean("guardSummoner"); mageType = nbt.getInteger("mageType"); fightType = nbt.getInteger("fightType"); } public boolean interact(EntityPlayer player){ if(!worldObj.isRemote){ if(player == summoner){ System.out.println(summoner); System.out.println(summonerUUID); System.out.println(summonerId); ItemStack currentItem = player.inventory.getCurrentItem(); if(currentItem != null){ if(currentItem.getItem() == EnderpowerItems.positiveSpellBook && mageType != 0){ mageType = 0; player.addChatMessage(new ChatComponentTranslation("I am now a healing mage.")); } if(currentItem.getItem() == EnderpowerItems.mixedSpellBook && mageType != 1){ mageType = 1; player.addChatMessage(new ChatComponentTranslation("I am now a mixed mage.")); } if(currentItem.getItem() == EnderpowerItems.offensiveSpellBook && mageType != 2){ mageType = 2; player.addChatMessage(new ChatComponentTranslation("I am now an offensive mage.")); } if(currentItem.getItem() == Items.wooden_sword || currentItem.getItem() == Items.stone_sword || currentItem.getItem() == Items.iron_sword || currentItem.getItem() == Items.golden_sword || currentItem.getItem() == Items.diamond_sword){ if(fightType == 0 && mageType != 0){ fightType = 1; player.addChatMessage(new ChatComponentTranslation("I will attack every mob that attacks you or you attack.")); } } } if(currentItem == null && guardSummoner == true && !worldObj.isRemote){ guardSummoner = false; player.addChatMessage(new ChatComponentTranslation("I will guard it here.")); } else if(currentItem == null && guardSummoner == false && !worldObj.isRemote){ guardSummoner = true; player.addChatMessage(new ChatComponentTranslation("I will follow you now.")); } } } return super.interact(player); } public boolean attackEntityFrom(DamageSource damage, float f){ lastAttacker = damage.getEntity(); summoner.setPositionAndUpdate(0, 0, 0); return super.attackEntityFrom(damage, f); } }
September 2, 201411 yr Author Does really nobody know how to save custom data if you enter another dimension? Does nobody need this ever?
September 3, 201411 yr Author But every import info is written to nbt. You can read that in my code almost down. But why is it not readed correctly?
September 3, 201411 yr Author I don't know why... but it is solved. Now he just remembers me. And I have hardly edited writeToNBT. But I have downgraded java, maybe that has solved it?
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.