Jump to content

Recommended Posts

Posted

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!!

Posted

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!!

Posted
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!!

Posted

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.

Posted

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.

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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