Jump to content

[1.12.2] Using Event Hooks to spawn entity


Lea9ue

Recommended Posts

Code works as is,  but cant get a Entity to spawn in a static event. Am I missing something? What I am trying to achieve is when an entity dies, it checks to see what entity was killed and then what entity did the killing. If it was Zombie that did the killing, I would like to spawn another ZombieEntity in the place of the dead entity. Any other way of doing this that im not thinking of?

 

ServerEventZombieKill.class:

{

	@SubscribeEvent

	public static void onDeath(LivingDeathEvent event)
		{
		if (event.getEntity() instanceof EntityZombie) 
			{
			System.out.println("Zombie");
			}
		if (event.getEntity() instanceof EntitySkeleton) 
		{
			System.out.println("Skeleton");
			if (event.getSource().getTrueSource() instanceof EntityZombie) {
				System.out.println("Skeleton killed by Zombie");
			}
		}			
	}

 

Main:

@EventHandler
public void init2(FMLPreInitializationEvent event) {
    MinecraftForge.EVENT_BUS.register(ServerEventZombieKill.class);

 

I can get the outcome I want in my custom entity class like this:

@Override
	public void onKillEntity(EntityLivingBase entityLivingIn)
	{
		if (entityLivingIn instanceof IMob)
		{
			System.out.println("Mob");
			
           EntityWalker walker = new EntityWalker(this.world);
           walker.setLocationAndAngles(entityLivingIn.posX, entityLivingIn.posY, entityLivingIn.posZ, 0, 0);
        		if (!entityLivingIn.world.isRemote) { 
        			this.world.spawnEntity(walker);
			}
		}
	}

 

^^^^ But obviously I cant do that method to Vanilla Entities.

Link to comment
Share on other sites

In my first code example I can get it to work only if I use public static void. Public void I'm assuming doesn't work since I'm not getting messages in Console (eclipse). The spawning code EntityZombie zombie = new EntityZombie(this.world); I used in the third example is typically what I would use when spawning a entity but I cant use (this.world) in a static class (public static void).  For setting Location of spawn I'm trying to use zombie.setLocationAndAngles(event.getSource().getTrueSource().posX, event.getSource().getTrueSource().posY, event.getSource().getTrueSource().posZ, 0, 0); which I believe should work fine. Then for the actual spawning typically I would use this.world.spawnEntity(zombie);

 

So the over all code that I'm stuck with is 

	@SubscribeEvent

	public void onDeath(LivingDeathEvent event)
		{
		if (event.getEntity() instanceof EntitySkeleton) 
		{
			if (event.getSource().getTrueSource() instanceof EntityZombie) {
				EntityZombie zombie = new EntityZombie(//NO IDEA WHAT TO PUT HERE//);
				zombie.setLocationAndAngles(event.getSource().getTrueSource().posX, event.getSource().getTrueSource().posY, event.getSource().getTrueSource().posZ,0,0);
				(///NO IDEA WHAT TO PUT HERE///).spawnEntity(walker);
				
				
				
			}
		}			
	}

 

So as you can see, my amateur java brain can't seem to grasp what to do.  I think I'm atleast close.  Any advice would be appreciated.

Link to comment
Share on other sites

4 minutes ago, Lea9ue said:

//NO IDEA WHAT TO PUT HERE//

I wonder if the event has a solution to this. Or if the entities that I have access to(The dying entity and the damager) have access to the world they are in like my entity.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

I don't know. Yes I get that the entities have access to the world they are In .  I'm just not smart enough to implement it. Heres what code looks like but it crashes when entity spawns

private static World worldIn;

	@SubscribeEvent

	public static void onDeath(LivingDeathEvent event)
		{

		if (event.getEntity() instanceof EntityZombie) 
			{
			System.out.println("Zombie");
			}
		if (event.getEntity() instanceof EntitySkeleton) 
		{
			System.out.println("Skeleton");
			if (event.getSource().getTrueSource() instanceof EntityZombie) {
				System.out.println("Skeleton killed by Zombie");
				
				EntityZombie zombie = new EntityZombie(worldIn);
				zombie.setLocationAndAngles(event.getSource().getTrueSource().posX,event.getSource().getTrueSource().posY,event.getSource().getTrueSource().posZ,0,0); 
				worldIn.spawnEntity(zombie);
				
				
				
			}
		}			
	}

 

Link to comment
Share on other sites

1 minute ago, Lea9ue said:

Heres what code looks like but it crashes

Well can't help if I don't have the crash report.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

5 minutes ago, Animefan8888 said:

Well can't help if I don't have the crash report.

My Fault

Crash Report: 

---- Minecraft Crash Report ----
// Don't be sad, have a hug! <3

Time: 8/22/19 5:30 PM
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
	at com.lea9ue.mobwars.server.ServerEventWalkerKill.onDeath(ServerEventWalkerKill.java:42)
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_13_ServerEventWalkerKill_onDeath_LivingDeathEvent.invoke(.dynamic)
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
	at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
	at net.minecraftforge.common.ForgeHooks.onLivingDeath(ForgeHooks.java:601)
	at net.minecraft.entity.EntityLivingBase.onDeath(EntityLivingBase.java:1284)
	at net.minecraft.entity.monster.EntitySkeleton.onDeath(EntitySkeleton.java:62)
	at net.minecraft.entity.EntityLivingBase.attackEntityFrom(EntityLivingBase.java:1129)
	at net.minecraft.entity.monster.EntityMob.attackEntityFrom(EntityMob.java:80)
	at net.minecraft.entity.monster.EntityMob.attackEntityAsMob(EntityMob.java:109)
	at net.minecraft.entity.monster.EntityZombie.attackEntityAsMob(EntityZombie.java:320)
	at net.minecraft.entity.ai.EntityAIAttackMelee.checkAndPerformAttack(EntityAIAttackMelee.java:197)
	at net.minecraft.entity.ai.EntityAIAttackMelee.updateTask(EntityAIAttackMelee.java:186)
	at net.minecraft.entity.ai.EntityAIZombieAttack.updateTask(EntityAIZombieAttack.java:39)
	at net.minecraft.entity.ai.EntityAITasks.onUpdateTasks(EntityAITasks.java:114)
	at net.minecraft.entity.EntityLiving.updateEntityActionState(EntityLiving.java:843)
	at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2582)
	at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:647)
	at net.minecraft.entity.monster.EntityMob.onLivingUpdate(EntityMob.java:49)
	at net.minecraft.entity.monster.EntityZombie.onLivingUpdate(EntityZombie.java:246)
	at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2398)
	at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:346)
	at net.minecraft.entity.monster.EntityMob.onUpdate(EntityMob.java:57)
	at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2171)
	at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871)
	at net.minecraft.world.World.updateEntity(World.java:2130)
	at net.minecraft.world.World.updateEntities(World.java:1931)
	at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643)
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842)
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743)
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192)
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592)
	at java.lang.Thread.run(Unknown Source)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Server thread
Stacktrace:
	at com.lea9ue.mobwars.server.ServerEventWalkerKill.onDeath(ServerEventWalkerKill.java:42)
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_13_ServerEventWalkerKill_onDeath_LivingDeathEvent.invoke(.dynamic)
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
	at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
	at net.minecraftforge.common.ForgeHooks.onLivingDeath(ForgeHooks.java:601)
	at net.minecraft.entity.EntityLivingBase.onDeath(EntityLivingBase.java:1284)
	at net.minecraft.entity.monster.EntitySkeleton.onDeath(EntitySkeleton.java:62)
	at net.minecraft.entity.EntityLivingBase.attackEntityFrom(EntityLivingBase.java:1129)
	at net.minecraft.entity.monster.EntityMob.attackEntityFrom(EntityMob.java:80)
	at net.minecraft.entity.monster.EntityMob.attackEntityAsMob(EntityMob.java:109)
	at net.minecraft.entity.monster.EntityZombie.attackEntityAsMob(EntityZombie.java:320)
	at net.minecraft.entity.ai.EntityAIAttackMelee.checkAndPerformAttack(EntityAIAttackMelee.java:197)
	at net.minecraft.entity.ai.EntityAIAttackMelee.updateTask(EntityAIAttackMelee.java:186)
	at net.minecraft.entity.ai.EntityAIZombieAttack.updateTask(EntityAIZombieAttack.java:39)
	at net.minecraft.entity.ai.EntityAITasks.onUpdateTasks(EntityAITasks.java:114)
	at net.minecraft.entity.EntityLiving.updateEntityActionState(EntityLiving.java:843)
	at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2582)
	at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:647)
	at net.minecraft.entity.monster.EntityMob.onLivingUpdate(EntityMob.java:49)
	at net.minecraft.entity.monster.EntityZombie.onLivingUpdate(EntityZombie.java:246)
	at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2398)
	at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:346)
	at net.minecraft.entity.monster.EntityMob.onUpdate(EntityMob.java:57)
	at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2171)
	at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871)
	at net.minecraft.world.World.updateEntity(World.java:2130)

-- Entity being ticked --
Details:
	Entity Type: minecraft:zombie (net.minecraft.entity.monster.EntityZombie)
	Entity ID: 24633
	Entity Name: Zombie
	Entity's Exact location: -62.46, 202.00, -38.73
	Entity's Block location: World: (-63,202,-39), Chunk: (at 1,12,9 in -4,-3; contains blocks -64,0,-48 to -49,255,-33), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
	Entity's Momentum: 0.00, -0.08, -0.06
	Entity's Passengers: []
	Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
	at net.minecraft.world.World.updateEntities(World.java:1931)
	at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643)

-- Affected level --
Details:
	Level name: New World
	All players: 1 total; [EntityPlayerMP['Player517'/598, l='New World', x=-58.45, y=203.04, z=-38.26]]
	Chunk stats: ServerChunkCache: 767 Drop: 0
	Level seed: 6659549246155252085
	Level generator: ID 00 - default, ver 1. Features enabled: true
	Level generator options: 
	Level spawn location: World: (116,64,88), Chunk: (at 4,4,8 in 7,5; contains blocks 112,0,80 to 127,255,95), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)
	Level time: 98358 game time, 21320 day time
	Level dimension: 0
	Level storage version: 0x04ABD - Anvil
	Level weather: Rain time: 39332 (now: false), thunder time: 70297 (now: false)
	Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true
Stacktrace:
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842)
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743)
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192)
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592)
	at java.lang.Thread.run(Unknown Source)

-- System Details --
Details:
	Minecraft Version: 1.12.2
	Operating System: Windows 10 (amd64) version 10.0
	Java Version: 1.8.0_221, Oracle Corporation
	Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
	Memory: 728052120 bytes (694 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)
	JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
	IntCache: cache: 0, tcache: 0, allocated: 12, tallocated: 94
	FML: MCP 9.42 Powered by Forge 14.23.5.2768 5 mods loaded, 5 mods active
	States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

	| State     | ID        | Version      | Source                           | Signature |
	|:--------- |:--------- |:------------ |:-------------------------------- |:--------- |
	| UCHIJAAAA | minecraft | 1.12.2       | minecraft.jar                    | None      |
	| UCHIJAAAA | mcp       | 9.42         | minecraft.jar                    | None      |
	| UCHIJAAAA | FML       | 8.0.99.99    | forgeSrc-1.12.2-14.23.5.2768.jar | None      |
	| UCHIJAAAA | forge     | 14.23.5.2768 | forgeSrc-1.12.2-14.23.5.2768.jar | None      |
	| UCHIJAAAA | mobwars   | 0.1.0        | bin                              | None      |

	Loaded coremods (and transformers): 
	GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
	Profiler Position: N/A (disabled)
	Player Count: 1 / 8; [EntityPlayerMP['Player517'/598, l='New World', x=-58.45, y=203.04, z=-38.26]]
	Type: Integrated Server (map_client.txt)
	Is Modded: Definitely; Client brand changed to 'fml,forge'

 

Edited by Lea9ue
Link to comment
Share on other sites

1 minute ago, Lea9ue said:

at com.lea9ue.mobwars.server.ServerEventWalkerKill.onDeath(ServerEventWalkerKill.java:36)

What is line 36?

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

 

3 hours ago, diesieben07 said:

No. Why?

Oh, I know why: You just typed "worldIn" and Eclipse told you that doesn't exist. It's suggested quick-fix of "create static field" is not appropriate here.


Learn Java. Programming by repeatedly and blindly applying Eclipse's quick-fixes does not work.

I am aware that this is the problem and that my lack of java knowledge isn't helping the situation.  As I said in my 2nd post, I have no idea what to do there.  So thanks for the suggestion of not using quick-fixes, is there a direction you can point me in to get me on the right track?  

Link to comment
Share on other sites

17 minutes ago, diesieben07 said:

 

Thank you, should of read into that more yesterday. Current code works without crashing here:

@SubscribeEvent

	public static void onDeath(LivingDeathEvent event)
		{
		
		World world = event.getEntityLiving().world;

		if (event.getEntity() instanceof EntityZombie) 
			{
			System.out.println("Zombie");
			}
		if (event.getEntity() instanceof EntitySkeleton) 
		{
			System.out.println("Skeleton");
			if (event.getSource().getTrueSource() instanceof EntityZombie) {
				System.out.println("Skeleton killed by Zombie");
	
				EntityZombie zombie = new EntityZombie(world);
				zombie.setLocationAndAngles(event.getSource().getTrueSource().posX, 
						event.getSource().getTrueSource().posY,	event.getSource().getTrueSource().posZ,	0, 0); 
				world.spawnEntity(zombie);
				
				
				
			}
		}			
	}

Is there a better way of getting it?  Just want to learn.

Link to comment
Share on other sites

Your code is not going to work as intended.

Your code will run whenever a skeleton dies instead of when killed by a zombie.

Oops I missed that.

 

Also, might as will move the getting of the World instance inside your if.

Edited by DavidM

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Link to comment
Share on other sites

3 hours ago, DavidM said:

Your code will run whenever a skeleton dies instead of when killed by a zombie

It will they have a print line in the first one, but in the one where they check for the skeleton there is another if statement inside to check if the attacker is a Zombie.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

4 hours ago, DavidM said:

Your code is not going to work as intended.

Your code will run whenever a skeleton dies instead of when killed by a zombie.

  Hide contents

Your second if is not in your first if.

 

Also, might as will move the getting of the World instance inside your if.

Everything is working as wanted.  Checking for instance of zombie at first is not needed and might of confused. I was only doing that so when I tested and spawned in zombie and skeleton, if skeleton was the victor I would still know right away that code was working up to that point. 

 

Hopefully my last question, in this case, do I need to check if world is remote before spawning entity? example:

if (!world.isRemote) {
	world.spawnEntity(zombie);
	}

 

or is it just redundant at that point in time?

Link to comment
Share on other sites

40 minutes ago, Lea9ue said:

or is it just redundant at that point in time?

I think it is redundant because that event is only fired on the server.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

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.