Jump to content

[1.12.2]Multipart entity problem maybe about setDead


_HungTeen_

Recommended Posts

public class EntityConeHead extends MultiPartEntityPart{

	private EntityNormalZombie zombie;
	
	public EntityConeHead(EntityNormalZombie zombie, String partName, float width, float height) {
		super(zombie, partName, width, height);
		this.zombie=zombie;
		this.setExist();
	}

	@Override
	public boolean attackEntityFrom(DamageSource source, float amount) {
		//System.out.println(this.world.isRemote+" "+source.damageType+" "+amount);
		return super.attackEntityFrom(source, amount);
	}
	
	public void setExist()
	{
		if(this.parent instanceof EntityZombieBase) {
			if(((EntityZombieBase) this.parent).getIsInivs()) this.setInvisible(true);
			else this.setInvisible(false);
		}
		else {
			System.out.println("error parent!");
			return ;
		}
	}
	
	public EntityZombieBase getZombie()
	{
		return this.zombie;
	}
	
	public void setBreak()
	{
		this.setSize(0f, 0f);
		this.setInvisible(true);
	}
}
public class EntityConeHeadZombie extends EntityNormalZombie implements IEntityMultiPart{

	private final EntityConeHead cone;
	
	public EntityConeHeadZombie(World worldIn) {
		super(worldIn);
		cone=new EntityConeHead(this, "cone_head", 0.5f, 1f);
	}

	@Override
	protected void applyEntityAttributes()
    {
        super.applyEntityAttributes();
        this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(56.0D);
    }
	
	@Override
	public void onUpdate() {
		super.onUpdate();
		if(this.getHealth()<=20) {
			this.cone.setBreak();
		}
		else{
			this.cone.setLocationAndAngles(this.posX, this.posY+1.5, this.posZ, this.rotationYawHead, -this.rotationPitch);
		}
		this.world.updateEntityWithOptionalForce(this.cone, true);
	}
	
	@Override
	protected boolean canDespawn() {
		return false;
	}
	
	@Override
	public void setDead() {
		super.setDead();
		this.cone.setDead();
	}
	
	@Override
	public Entity[] getParts() {
		return new Entity[] {this.cone};
	}
	
	@Override
	public World getWorld() {
		return this.world;
	}

	@Override
	public boolean attackEntityFromPart(MultiPartEntityPart part, DamageSource source, float damage) {
		return this.attackEntityFrom(source, damage);
	}
	
	@Override
	public boolean isNonBoss() {
		return false;
	}
}

 

It's my first time to ask question at here.The problem is I am making a ConeHead Zombie by using multipartEntity ,When my peaShooter kill some ConeHead Zombie,there will exist some invisble object blocking my peaShooter's bullet.I know it may be the uncleared Cone,but I don't know how to deal with it.Pls help me ,thx !

Link to comment
Share on other sites

  • Guest locked this topic
Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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