Jump to content

[SOLVED] [1.15.1] Confused why entityDropItem fire multiple time


kwpugh

Recommended Posts

Hi All,

 

Looking for some help here.  I went back to my Udemy Java course and refreshed on the Lists and For each loops to check my thinking, but I am still perplexed.

 

The block does what I want it to do, EXCEPT that the entityDropItem fires any where from 9-12 times each time I spawn a Zombie to test the block.

 

Here is my code:

package com.kwpugh.gobber2.blocks;

import java.util.List;
import java.util.Random;

import javax.annotation.Nullable;

import com.kwpugh.gobber2.Gobber2;

import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FireBlock;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.boss.WitherEntity;
import net.minecraft.entity.boss.dragon.EnderDragonEntity;
import net.minecraft.entity.item.ArmorStandEntity;
import net.minecraft.entity.merchant.villager.VillagerEntity;
import net.minecraft.entity.merchant.villager.WanderingTraderEntity;
import net.minecraft.entity.monster.ElderGuardianEntity;
import net.minecraft.entity.monster.GuardianEntity;
import net.minecraft.entity.monster.SkeletonEntity;
import net.minecraft.entity.monster.SpellcastingIllagerEntity;
import net.minecraft.entity.monster.VexEntity;
import net.minecraft.entity.monster.VindicatorEntity;
import net.minecraft.entity.monster.ZombieEntity;
import net.minecraft.entity.monster.ZombiePigmanEntity;
import net.minecraft.entity.monster.ZombieVillagerEntity;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.passive.DolphinEntity;
import net.minecraft.entity.passive.IronGolemEntity;
import net.minecraft.entity.passive.WaterMobEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

public class BlockLooter extends Block
{

	public BlockLooter(Properties properties)
	{
		super(properties.func_226896_b_());
	}

	int minTickTime = 5;
	int maxTickTime = 20;

	//Start it up when placed
	@Override
	public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving)
	{
		world.getPendingBlockTicks().scheduleTick(pos, state.getBlock(), world.rand.nextInt(maxTickTime - minTickTime + 1));
	}
	  
	//Start it up if wlaked over
	public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn)
	{
		BlockState stateIn = worldIn.getBlockState(pos);
		worldIn.getPendingBlockTicks().scheduleTick(pos, stateIn.getBlock(), worldIn.rand.nextInt(maxTickTime - minTickTime + 1));   
	}

	//Start it up if right-clicked on
	@Override
	public ActionResultType func_225533_a_(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit)
	{
		worldIn.getPendingBlockTicks().scheduleTick(pos, state.getBlock(), worldIn.rand.nextInt(maxTickTime - minTickTime + 1));
		player.sendMessage(new StringTextComponent("The Looter is active in a range of 18 blocks"));
		return ActionResultType.SUCCESS;
	}
    
	@Override
	public BlockRenderType getRenderType(BlockState state)
	{
		return BlockRenderType.MODEL;
	}
    
	@Override
	public void func_225534_a_(BlockState state,ServerWorld world, BlockPos pos,  Random random)
	{
		if(!world.isRemote)
		{			   
			int radius = 18;
		   
			//Scan the radius for LivingEntity and store in list
			List<Entity> mobs = world.getEntitiesWithinAABB(LivingEntity.class, new AxisAlignedBB(pos.getX() - radius, pos.getY() - radius, pos.getZ() - radius, pos.getX() + radius, pos.getY() + radius, pos.getZ() + radius), e -> (e instanceof LivingEntity));
			for(Entity mob : mobs)
			{
				System.out.println(mob + "," + mobs); //debuging in console
				
				//If a player is within the list, kick start the block
				if(mob instanceof PlayerEntity)
				{
					world.getPendingBlockTicks().scheduleTick(pos, state.getBlock(), random.nextInt(minTickTime));
				
					BlockPos posUp = pos.up();		
					BlockState flaming = ((FireBlock)Blocks.FIRE).getStateForPlacement(world, posUp);
					world.setBlockState(posUp, flaming, 11);
				}
			   
				// These types of mobs are excluded 
				if(mob instanceof PlayerEntity ||
						mob instanceof ArmorStandEntity ||
						mob instanceof VillagerEntity || 
						mob instanceof WanderingTraderEntity ||
						mob instanceof AnimalEntity || 
						mob instanceof IronGolemEntity || 
						mob instanceof DolphinEntity ||
						mob instanceof WaterMobEntity ||
						mob instanceof GuardianEntity ||
						mob instanceof ElderGuardianEntity ||
						mob instanceof SpellcastingIllagerEntity ||
						mob instanceof VexEntity ||
						mob instanceof VindicatorEntity ||
						mob instanceof WitherEntity ||
						mob instanceof EnderDragonEntity)
				{
					continue;
				}
				
				if(mob instanceof ZombiePigmanEntity || mob instanceof ZombieEntity || mob instanceof ZombieVillagerEntity)
				{
					((MobEntity) mob).spawnExplosionParticle();
					((LivingEntity) mob).setHealth(0);
					mob.entityDropItem(Items.GOLD_NUGGET,1);
					Gobber2.logger.info("drop executed for " + mob + "," + " values of mobs " + mobs);		
				}
		   }
	   }
   }
    
	@OnlyIn(Dist.CLIENT)
	public void addInformation(ItemStack stack, @Nullable IBlockReader world, List<ITextComponent> tooltip, ITooltipFlag flag)
	{
		super.addInformation(stack, world, tooltip, flag);				
		tooltip.add(new StringTextComponent(TextFormatting.BLUE + "The Looter "));
		tooltip.add(new StringTextComponent(TextFormatting.GREEN + "Range: 18 blocks"));
	}
}

 

I have been going through this for hours, trying different things to no avail.   Help please.

 

Regards.

Link to comment
Share on other sites

1) Your "these mobs are excluded" block is irrelevant. You only care about players and zombies, which you have blocks for. Any entity that is not those things does nothing already, there's no reason to grab everything else (you're not grabbing mod added entities for instance!) and skipping them is pointless.

2) ZombiePigman extends Zombie, so that check is extraneous as well.

3) You're setting mob's health to zero, but the entity is not immediately made dead and removed for at least the next tick, but you aren't checking to make sure that the mob is still alive before doing your thing.

4) TranslationTextComponent (and applyTextStyle(...)) exists. Use it.

Edited by Draco18s

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

13 minutes ago, Draco18s said:

1) Your "these mobs are excluded" block is irrelevant. You only care about players and zombies, which you have blocks for. Any entity that is not those things does nothing already, there's no reason to grab everything else (you're not grabbing mod added entities for instance!) and skipping them is pointless.

2) ZombiePigman extends Zombie, so that check is extraneous as well.

3) You're setting mob's health to zero, but the entity is not immediately made dead and removed for at least the next tick, but you aren't checking to make sure that the mob is still alive before doing your thing.

4) TranslationTextComponent exists. Use it.

1) Good point, that is code that I will delete

2) ditto

3) I did not know it was not immediate.  In 1.12.2 I had used  ((EntityLivingBase) entity).setDead();  which had worked fine, but appears gone in 1.15.1.  Also, see code snippet for how I had tried to check if it was alive before doing the drop.   That did not work.

4.) I'll take a look at the TranslationTextComponent.

 

				if(mob instanceof ZombiePigmanEntity || mob instanceof ZombieEntity || mob instanceof ZombieVillagerEntity)
				{
					((MobEntity) mob).spawnExplosionParticle();
					((LivingEntity) mob).setHealth(0);
					if(!mob.isAlive())
					{
						mob.entityDropItem(Items.GOLD_NUGGET,1);
						Gobber2.logger.info("drop executed for " + mob + "," + " values of mobs " + mobs);	
					}
				
				}

 

Link to comment
Share on other sites

I was going back through the Entity.class to look for other options.   I found remove(boolean).

 

This code does what I need, but is it the intended usage of remove(boolean)?

				if(mob instanceof ZombieEntity || mob instanceof ZombieVillagerEntity)
				{
					((MobEntity) mob).spawnExplosionParticle();
					mob.remove(true);
					mob.entityDropItem(Items.GOLD_NUGGET,1);
				}

 

Link to comment
Share on other sites

36 minutes ago, kwpugh said:

((LivingEntity) mob).setHealth(0);

if(!mob.isAlive()) { ... }

isAlive is going to return false if the mob's health is zero...

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

  • kwpugh changed the title to [SOLVED] [1.15.1] Confused why entityDropItem fire multiple time

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • SLOT PULSA TANPA POTONGAN : SLOT PULSA 5000 VIA INDOSAT IM3 TANPA POTONGAN - SLOT PULSA XL TELKOMSEL TANPA POTONGAN  KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << KLIK DISINI DAFTAR DISINI SLOT VVIP << SITUS SLOT GACOR 88 MAXWIN X500 HARI INI TERBAIK DAN TERPERCAYA GAMPANG MENANG Dunia Game gacor terus bertambah besar seiring berjalannya waktu, dan sudah tentu dunia itu terus berkembang serta merta bersamaan dengan berkembangnya SLOT GACOR sebagai website number #1 yang pernah ada dan tidak pernah mengecewakan sekalipun. Dengan banyaknya member yang sudah mempercayakan untuk terus menghasilkan uang bersama dengan SLOT GACOR pastinya mereka sudah percaya untuk bermain Game online bersama dengan kami dengan banyaknya testimoni yang sudah membuktikan betapa seringnya member mendapatkan jackpot besar yang bisa mencapai ratusan juta rupiah. Best online Game website that give you more money everyday, itu lah slogan yang tepat untuk bermain bersama SLOT GACOR yang sudah pasti menang setiap harinya dan bisa menjadikan bandar ini sebagai patokan untuk mendapatkan penghasilan tambahan yang efisien dan juga sesuatu hal yang fix setiap hari nya. Kami juga mendapatkan julukan sebagai Number #1 website bocor yang berarti terus memberikan member uang asli dan jackpot setiap hari nya, tidak lupa bocor itu juga bisa diartikan dalam bentuk berbagi promosi untuk para official member yang terus setia bermain bersama dengan kami. Berbagai provider Game terus bertambah banyak setiap harinya dan terus melakukan support untuk membuat para official member terus bisa menang dan terus maxwin dalam bentuk apapun maka itu langsung untuk feel free to try yourself, play with SLOT GACOR now or never !
    • BRI4D adalah pilihan tepat bagi Anda yang menginginkan pengalaman bermain slot dengan RTP tinggi dan transaksi yang akurat melalui Bank BRI. Berikut adalah beberapa alasan mengapa Anda harus memilih BRI4D: Tingkat Pengembalian (RTP) Tertinggi Kami bangga menjadi salah satu agen situs slot dengan RTP tertinggi, mencapai 99%! Ini berarti Anda memiliki peluang lebih besar untuk meraih kemenangan dalam setiap putaran permainan. Transaksi Melalui Bank BRI yang Akurat Proses deposit dan penarikan dana di BRI4D cepat, mudah, dan akurat. Kami menyediakan layanan transaksi melalui Bank BRI untuk kenyamanan Anda. Dengan begitu, Anda dapat melakukan transaksi dengan lancar dan tanpa khawatir. Beragam Pilihan Permainan BRI4D menyajikan koleksi permainan slot yang beragam dan menarik dari berbagai provider terkemuka. Mulai dari tema klasik hingga yang paling modern, Anda akan menemukan banyak pilihan permainan yang sesuai dengan selera dan preferensi Anda.  
    • SPARTA88 adalah pilihan tepat bagi Anda yang menginginkan agen situs slot terbaik dengan RTP tinggi dan transaksi yang mudah melalui Bank BNI. Berikut adalah beberapa alasan mengapa Anda harus memilih SPARTA88: Tingkat Pengembalian (RTP) Tinggi Kami bangga menjadi salah satu agen situs slot dengan RTP tertinggi, mencapai 98%! Ini berarti Anda memiliki peluang lebih besar untuk meraih kemenangan dalam setiap putaran permainan. Beragam Pilihan Permainan SPARTA88 menyajikan koleksi permainan slot yang beragam dan menarik dari berbagai provider terkemuka. Mulai dari tema klasik hingga yang paling modern, Anda akan menemukan banyak pilihan permainan yang sesuai dengan selera dan preferensi Anda. Kemudahan Bertransaksi Melalui Bank BNI Proses deposit dan penarikan dana di SPARTA88 cepat, mudah, dan aman. Kami menyediakan layanan transaksi melalui Bank BNI untuk kenyamanan Anda. Dengan begitu, Anda dapat melakukan transaksi dengan lancar tanpa perlu khawatir.
    • Slot Bank ALADIN atau Daftar slot Bank ALADIN bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.
    • Slot Bank PAPUA atau Daftar slot Bank PAPUA bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.  
  • Topics

×
×
  • Create New...

Important Information

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