Posted June 12, 201510 yr hey guys, im trying to make a ranged mob that throws my custom entity throwable, or a rangedmob, I've Looked at skeleton and witch code. but so far it hasn't helped much except how to make an attack timer. I was wondering if someone could point me at a tutorial, or show me how to do this. thanks Im serious don't look at it!!
June 12, 201510 yr If you looked at Skeleton, surely you saw that it implements IRangedAttackMob and is given an EntityAIArrowAttack AI while holding a bow (added via #setCombatTask) That's pretty much all you should need, as the rest is effectively copy / paste / change the entity spawned in the ranged attack method. http://i.imgur.com/NdrFdld.png[/img]
June 12, 201510 yr Author ok, but so I set up a customEntity attack from the IrangedMob. Problem is it crashes on the return this.getDataWatcher().getWatchableObjectByte(21) == 1; line when the entity tries to throw a entity. heres code and crash report. package com.OlympiansMod.entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IRangedAttackMob; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIArrowAttack; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.monster.EntityWitch; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityPotion; import net.minecraft.potion.Potion; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class Zeus extends EntityMob implements IRangedAttackMob{ public Zeus(World world) { super(world); { this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(2, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(3, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); } } public boolean isAIEnabled(){ return true; } public void setAggressive(boolean par2) { this.getDataWatcher().updateObject(21, Byte.valueOf((byte)(par2 ? 1 : 0))); } public boolean getAggressive() { return this.getDataWatcher().getWatchableObjectByte(21) == 1; } protected void applyEntityAttributes(){ super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(26.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); } @Override public void attackEntityWithRangedAttack(EntityLivingBase entity, float par1) { if (!this.getAggressive()) { EntityMasterBolt Bolt = new EntityMasterBolt(this.worldObj, this); entity.rotationPitch -= -20.0F; double d0 = entity.posX + entity.motionX - this.posX; double d1 = entity.posY + (double)entity.getEyeHeight() - 1.100000023841858D - this.posY; double d2 = entity.posZ + entity.motionZ - this.posZ; float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); Bolt.setThrowableHeading(d0, d1 + (double)(f1 * 0.2F), d2, 0.75F, 8.0F); this.worldObj.spawnEntityInWorld(entity); } } } Crash log [server thread/INFO]: Changing view distance to 2, from 10 [20:08:57] [Netty Client IO #0/INFO] [FML]: Server protocol version 1 [20:08:57] [Netty IO #1/INFO] [FML]: Client protocol version 1 [20:08:57] [Netty IO #1/INFO] [FML]: Client attempting to join with 4 mods : [email protected],[email protected],[email protected],[email protected] [20:08:57] [Netty IO #1/INFO] [FML]: Attempting connection with missing mods [] at CLIENT [20:08:57] [Netty Client IO #0/INFO] [FML]: Attempting connection with missing mods [] at SERVER [20:08:57] [server thread/INFO] [FML]: [server thread] Server side modded connection established [20:08:57] [server thread/INFO]: Player779[local:E:ad06bb67] logged in with entity id 209 at (-253.5, 68.0, 251.5) [20:08:57] [server thread/INFO]: Player779 joined the game [20:08:57] [Client thread/INFO] [FML]: [Client thread] Client side modded connection established [20:09:07] [server thread/WARN]: Can't keep up! Did the system time change, or is the server overloaded? Running 9568ms behind, skipping 191 tick(s) [20:09:32] [server thread/INFO]: Player779 has just earned the achievement [Taking Inventory] [20:09:32] [Client thread/INFO]: [CHAT] Player779 has just earned the achievement [Taking Inventory] [20:11:49] [server thread/INFO]: [Player779: Set own game mode to Survival Mode] [20:11:49] [Client thread/INFO]: [CHAT] Your game mode has been updated [20:11:52] [server thread/ERROR]: Encountered an unexpected exception net.minecraft.util.ReportedException: Ticking entity at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:709) ~[MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) ~[MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException at net.minecraft.entity.DataWatcher.getWatchableObjectByte(DataWatcher.java:85) ~[DataWatcher.class:?] at com.OlympiansMod.entity.Zeus.getAggressive(Zeus.java:51) ~[Zeus.class:?] at com.OlympiansMod.entity.Zeus.attackEntityWithRangedAttack(Zeus.java:65) ~[Zeus.class:?] at net.minecraft.entity.ai.EntityAIArrowAttack.updateTask(EntityAIArrowAttack.java:140) ~[EntityAIArrowAttack.class:?] at net.minecraft.entity.ai.EntityAITasks.onUpdateTasks(EntityAITasks.java:125) ~[EntityAITasks.class:?] at net.minecraft.entity.EntityLiving.updateAITasks(EntityLiving.java:613) ~[EntityLiving.class:?] at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:1981) ~[EntityLivingBase.class:?] at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431) ~[EntityLiving.class:?] at net.minecraft.entity.monster.EntityMob.onLivingUpdate(EntityMob.java:39) ~[EntityMob.class:?] at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1814) ~[EntityLivingBase.class:?] at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250) ~[EntityLiving.class:?] at net.minecraft.entity.monster.EntityMob.onUpdate(EntityMob.java:47) ~[EntityMob.class:?] at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298) ~[World.class:?] at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684) ~[WorldServer.class:?] at net.minecraft.world.World.updateEntity(World.java:2258) ~[World.class:?] at net.minecraft.world.World.updateEntities(World.java:2108) ~[World.class:?] at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515) ~[WorldServer.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703) ~[MinecraftServer.class:?] ... 4 more [20:11:52] [server thread/ERROR]: This crash report has been saved to: C:\Users\Boone.mcfuzz\Desktop\Olympians Mod\eclipse\.\crash-reports\crash-2015-06-11_20.11.52-server.txt [20:11:52] [server thread/INFO]: Stopping server [20:11:52] [server thread/INFO]: Saving players [20:11:53] [Client thread/INFO] [sTDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:388]: ---- Minecraft Crash Report ---- // On the bright side, I bought you a teddy bear! Time: 6/11/15 8:11 PM Description: Ticking entity java.lang.NullPointerException: Ticking entity at net.minecraft.entity.DataWatcher.getWatchableObjectByte(DataWatcher.java:85) at com.OlympiansMod.entity.Zeus.getAggressive(Zeus.java:51) at com.OlympiansMod.entity.Zeus.attackEntityWithRangedAttack(Zeus.java:65) at net.minecraft.entity.ai.EntityAIArrowAttack.updateTask(EntityAIArrowAttack.java:140) at net.minecraft.entity.ai.EntityAITasks.onUpdateTasks(EntityAITasks.java:125) at net.minecraft.entity.EntityLiving.updateAITasks(EntityLiving.java:613) at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:1981) at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431) at net.minecraft.entity.monster.EntityMob.onLivingUpdate(EntityMob.java:39) at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1814) at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250) at net.minecraft.entity.monster.EntityMob.onUpdate(EntityMob.java:47) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684) at net.minecraft.world.World.updateEntity(World.java:2258) at net.minecraft.world.World.updateEntities(World.java:2108) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Stacktrace: at net.minecraft.entity.DataWatcher.getWatchableObjectByte(DataWatcher.java:85) at com.OlympiansMod.entity.Zeus.getAggressive(Zeus.java:51) at com.OlympiansMod.entity.Zeus.attackEntityWithRangedAttack(Zeus.java:65) at net.minecraft.entity.ai.EntityAIArrowAttack.updateTask(EntityAIArrowAttack.java:140) at net.minecraft.entity.ai.EntityAITasks.onUpdateTasks(EntityAITasks.java:125) at net.minecraft.entity.EntityLiving.updateAITasks(EntityLiving.java:613) at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:1981) at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431) at net.minecraft.entity.monster.EntityMob.onLivingUpdate(EntityMob.java:39) at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1814) at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250) at net.minecraft.entity.monster.EntityMob.onUpdate(EntityMob.java:47) at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298) at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684) at net.minecraft.world.World.updateEntity(World.java:2258) -- Entity being ticked -- Details: Entity Type: theolympiansmod.Zeus (com.OlympiansMod.entity.Zeus) Entity ID: 22278 Entity Name: entity.theolympiansmod.Zeus.name Entity's Exact location: -163.45, 68.00, 252.09 Entity's Block location: World: (-164,68,252), Chunk: (at 12,4,12 in -11,15; contains blocks -176,0,240 to -161,255,255), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Entity's Momentum: 0.00, -0.08, 0.00 Stacktrace: at net.minecraft.world.World.updateEntities(World.java:2108) at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515) -- Affected level -- Details: Level name: Mod test All players: 1 total; [EntityPlayerMP['Player779'/209, l='Mod test', x=-159.29, y=68.00, z=255.73]] Chunk stats: ServerChunkCache: 367 Drop: 0 Level seed: -6227433594372353832 Level generator: ID 00 - default, ver 1. Features enabled: true Level generator options: Level spawn location: World: (-248,64,256), Chunk: (at 8,4,0 in -16,16; contains blocks -256,0,256 to -241,255,271), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511) Level time: 3383 game time, 3383 day time Level dimension: 0 Level storage version: 0x04ABD - Anvil Level weather: Rain time: 65327 (now: false), thunder time: 103128 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true Stacktrace: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) -- System Details -- Details: Minecraft Version: 1.7.10 Operating System: Windows 8.1 (amd64) version 6.3 Java Version: 1.8.0_45, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 636600240 bytes (607 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used IntCache: cache: 0, tcache: 0, allocated: 13, tallocated: 95 FML: MCP v9.05 FML v7.10.85.1230 Minecraft Forge 10.13.2.1230 4 mods loaded, 4 mods active mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML{7.10.85.1230} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.2.1230.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge{10.13.2.1230} [Minecraft Forge] (forgeSrc-1.7.10-10.13.2.1230.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available theolympiansmod{0.1} [The Olympians Mod] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Profiler Position: N/A (disabled) Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used Player Count: 1 / 8; [EntityPlayerMP['Player779'/209, l='Mod test', x=-159.29, y=68.00, z=255.73]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' [20:11:53] [Client thread/INFO] [sTDOUT]: [net.minecraft.client.Minecraft:displayCrashReport:393]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2015-06-11_20.11.52-server.txt [20:11:53] [Client thread/INFO] [FML]: Waiting for the server to terminate/save. [20:11:53] [server thread/INFO]: Saving worlds [20:11:53] [server thread/INFO]: Saving chunks for level 'Mod test'/Overworld [20:11:53] [server thread/INFO]: Saving chunks for level 'Mod test'/Nether [20:11:53] [server thread/INFO]: Saving chunks for level 'Mod test'/The End [20:11:53] [server thread/INFO] [FML]: Unloading dimension 0 [20:11:53] [server thread/INFO] [FML]: Unloading dimension -1 [20:11:53] [server thread/INFO] [FML]: Unloading dimension 1 [20:11:53] [server thread/INFO] [FML]: Applying holder lookups [20:11:53] [server thread/INFO] [FML]: Holder lookups applied [20:11:53] [server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STOPPING and forced into state SERVER_STOPPED. Errors may have been discarded. [20:11:53] [Client thread/INFO] [FML]: Server terminated. AL lib: (EE) alc_cleanup: 1 device not closed Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release Im serious don't look at it!!
June 12, 201510 yr You have to add the index (21) to data watcher before you can use it, otherwise it doesn't exist: @Override protected void entityInit() { super.entityInit(); dataWatcher.addObject(21, (byte) 0); } http://i.imgur.com/NdrFdld.png[/img]
June 12, 201510 yr Author it doesn't crash but know when he tries to attack he just stands there looking at you like he wants to throw lightning at u but he cant. how can I fix this. Im serious don't look at it!!
June 12, 201510 yr Author package com.OlympiansMod.entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IRangedAttackMob; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIArrowAttack; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.monster.EntityWitch; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityPotion; import net.minecraft.potion.Potion; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class Zeus extends EntityMob implements IRangedAttackMob{ public Zeus(World world) { super(world); { this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(2, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(3, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); } } public boolean isAIEnabled(){ return true; } @Override protected void entityInit() { super.entityInit(); dataWatcher.addObject(21, (byte) 0); } public void setAggressive(boolean par2) { this.getDataWatcher().updateObject(21, Byte.valueOf((byte)(par2 ? 1 : 0))); } public boolean getAggressive() { return this.getDataWatcher().getWatchableObjectByte(21) == 1; } protected void applyEntityAttributes(){ super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(26.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); } @Override public void attackEntityWithRangedAttack(EntityLivingBase entity, float par1) { if (!this.getAggressive()) { EntityMasterBolt Bolt = new EntityMasterBolt(this.worldObj, this); entity.rotationPitch -= -20.0F; double d0 = entity.posX + entity.motionX - this.posX; double d1 = entity.posY + (double)entity.getEyeHeight() - 1.100000023841858D - this.posY; double d2 = entity.posZ + entity.motionZ - this.posZ; float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2); Bolt.setThrowableHeading(d0, d1 + (double)(f1 * 0.2F), d2, 0.75F, 8.0F); this.worldObj.spawnEntityInWorld(entity); } } } Im serious don't look at it!!
June 12, 201510 yr Come on Boonie, READ the vanilla code! Attack with ranged is only ever called if you add the AI to do so, like I mentioned earlier Skeletons do this in setCombatTask(), but you will just move that to your constructor. http://i.imgur.com/NdrFdld.png[/img]
June 12, 201510 yr Author lol I thought I just had to add an arrow attack ai. okay I fixed it. but im still confused on the attack time and how I set one. or how I make him attack faster. Im serious don't look at it!!
June 12, 201510 yr Author Like if I wanted the Mob to rapidly Shoot three entitys, and then pause for a moment. Im serious don't look at it!!
June 12, 201510 yr Author stupid question? because I haven't figured it out yet. Im serious don't look at it!!
June 16, 201510 yr stupid question? because I haven't figured it out yet. It's not a stupid question, but it's one that you should easily be able to figure out with basic Java knowledge and basic understanding of Minecraft: 1. Your entity class ultimately inherits from Entity (duh) 2. All entities have a method (several, actually) that is called automatically every tick: #onUpdate, #onLivingUpdate, etc. 3. All classes can contain per-instance class fields With that knowledge right there, you have what you need to create a timer - literally a decrementing or incrementing integer and one or two conditional statements. If you're having trouble with something that basic (which you are), then I highly encourage you to take a break from modding just for a bit and actually study Java. http://i.imgur.com/NdrFdld.png[/img]
June 16, 201510 yr Author ok, yes. but why does it even work without a timer. I mean it should be spaming the entity everywere without a timer so where is it getting its default timer. from IRangedMob, or what? Im serious don't look at it!!
June 18, 201510 yr The attack timing is handled in the AI class(es). Look there, and if you need to change it, you probably have to create your own AI class. IRangedMob is just an interface to allow the AI to call the ranged attack method on many different types of mobs without having to check 'is this one a skeleton? okay, it can attack. how about this one, is it a YourModArcher?' etc. Very basic design principle. http://i.imgur.com/NdrFdld.png[/img]
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.