Beaklesspelican Posted March 30, 2014 Posted March 30, 2014 So, I've tried to make my mob tameable, able to sit/wait and so on. I've looked at the wolf and ocelot code, but I couldn't figure out how to make it tameable there (could've been looking at wrong place however...) but here's the code now... quite bad but yeah... it isn't that easy to make a mob. But it would be nice with some help. package com.holmisas.entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIFollowOwner; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAITempt; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityTameable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class EntityMiniDude extends EntityTameable { public EntityMiniDude(World par1World) { super(par1World); this.setSize(1.0F, 1.0F); this.tasks.addTask(0, new EntityAIWander(this, 1.0D)); this.tasks.addTask(1, new EntityAILookIdle(this)); this.tasks.addTask(2, new EntityAISwimming(this)); this.tasks.addTask(3, new EntityAITempt(this, 1.7D, Items.sugar, false)); this.tasks.addTask(4, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); } public boolean isAIEnabled(){ return true; } protected void applyEntityAttributes(){ super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); } /** * Random Drop Between 1 - 3 dropped at a time */ protected Item getDropItem(){ return Items.apple; } public int getMaxSpawnedInChunk(){ return 8; } @Override public EntityAgeable createChild(EntityAgeable var1) { return new EntityMiniDude(worldObj); } } Quote
SureenInk Posted March 31, 2014 Posted March 31, 2014 Keep in mind this is no way perfect...but here's what I did so far (it makes them tameable, but that's the extent of it. I haven't gotten anything else beyond sitting) Under your public EntityMiniDude code (where you have your AI programming), you want to add: this.setTamed(false); If you want it's HP to change when it's tamed, you need: protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); if (this.isTamed()) { this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(100.0D); //The value after it's tamed. } else { this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); //The value before it's tamed. } } It also seems like you need this, but I'm not 100% sure (seems like that previous code would handle this, but I dunno): public void setTamed(boolean par1) { super.setTamed(par1); if (par1) { this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(100.0D); } else { this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D); } } After that...this is where I got lost and can't figure out anything else...You need this set of code, but I have no idea how any of it works or what it does...maybe someone else could help? protected void updateAITick() { this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(18, new Float(this.getHealth())); this.dataWatcher.addObject(19, new Byte((byte)0)); this.dataWatcher.addObject(20, new Byte((byte)BlockColored.func_150032_b(1))); } The above code has something to do with it checking health and healing, but it doesn't seem to work besides preventing a crash with the following code (which, again, I don't understand): public boolean interact(EntityPlayer par1EntityPlayer) { ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); if (this.isTamed()) { if (itemstack != null) { if (itemstack.getItem() instanceof ItemFood) { ItemFood itemfood = (ItemFood)itemstack.getItem(); if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F) { if (!par1EntityPlayer.capabilities.isCreativeMode) { --itemstack.stackSize; } this.heal((float)itemfood.func_150905_g(itemstack)); if (itemstack.stackSize <= 0) { par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null); } return true; } } } if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack)) { this.aiSit.setSitting(!this.isSitting()); System.out.println("sit"); this.isJumping = false; this.setPathToEntity((PathEntity)null); this.setTarget((Entity)null); this.setAttackTarget((EntityLivingBase)null); } } else if (itemstack != null && itemstack.getItem() == Items.apple) { if (!par1EntityPlayer.capabilities.isCreativeMode) { --itemstack.stackSize; } if (itemstack.stackSize <= 0) { par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null); } if (!this.worldObj.isRemote) { if (this.rand.nextInt(3) == 0) { this.setTamed(true); this.setPathToEntity((PathEntity)null); this.setAttackTarget((EntityLivingBase)null); this.aiSit.setSitting(true); this.setHealth(100.0F); this.setOwner(par1EntityPlayer.getCommandSenderName()); this.playTameEffect(true); this.worldObj.setEntityState(this, (byte)7); } else { this.playTameEffect(false); this.worldObj.setEntityState(this, (byte)6); } } return true; } return super.interact(par1EntityPlayer); } Quote
Beaklesspelican Posted March 31, 2014 Author Posted March 31, 2014 Thanks! It works pretty well, the only problem is that when I right click a tamed minidude the game crash, and aslo when I start the game again it seems like the mob isn't tamed anymore otherwise it's good Quote
Zer0HD2 Posted May 25, 2014 Posted May 25, 2014 If you're starting the game through Eclipse, you will have a different player name, but the mob will still belong to the name you had when you tamed it. Quote
Recommended Posts
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.