Jump to content

2 tileentities spawning on one block


Armanse

Recommended Posts

Hi, since i started codding i always got that bug no matter what i tried, it will stay continue to exist.

Let me explain, when i want to put a tileentity on the ground that i created it will always create 2 tileentities with the same values. I know that because i tried wrote a line that says: "init" whenever a tileentity spawns and it always says Init 2 times.

Furthermore sometimes when the tileentity destroys or place a block the block that has been placed or destroyed is sometimes a illusion (when i click on it i reverts back to what it was before) and i assume that those 2 problems are linked.

image.thumb.png.01f6c21f66764d0d2e0236cd76f2d6c1.png

Here is my code tell me if i did something wrong. Thank you in advance ! (the code is very long i tried to delete useless parts like particle effects and other things sry)

//Chest Variables
	protected NonNullList<ItemStack> ItemsList = NonNullList.withSize(1, ItemStack.EMPTY);
	int inventory_size = 1;
	int numPlayerUsing =0;
	private IItemHandlerModifiable items = createHandler();
	private LazyOptional<IItemHandlerModifiable> itemHandler = LazyOptional.of(() -> items);
	//Chest Variables
	
	//TileEntity variables
	boolean init = false;
	private int MagicFuel;
	Random random = new Random();
	int tick;
	PlayerEntity player;
	int EventLocker, BlockInfected;
	//TileEntity variables

	public Sterious_ChestTileEntity(TileEntityType<?> tileEntityTypeIn) {
		super(tileEntityTypeIn);
		// TODO Auto-generated constructor stub
	}
	
	public Sterious_ChestTileEntity() {
		this(TileEntityInit.STERIOUS_CHEST.get());
	}

	@Override
	public void tick() {
		if(!init) {
			init();
			player.sendMessage(new StringTextComponent("Init"), null); //HERE IS THE LINE THAT SAYS INIT WHEN THE TILEENTITY APPEARS IDK WHY IT SAYS IT TWICE
		} else {
			execute();
		}
		
	}
	
	private void init() {
		MagicFuel = 0;
		init = true;
		tick = 0;
		if(Minecraft.getInstance().isSingleplayer()) {
			player = Minecraft.getInstance().player;
		}
		EventLocker = 0;
		BlockInfected =0;
	}
	
	private void execute() { 
		if(!this.getStackInSlot(0).isEmpty()) {
			int value = random.nextInt(3);
			float seconds =5;
			ItemStack itemstack = this.getStackInSlot(0);
			//Events
			if(MagicFuel > 0) {
				//EVENTS MAGIC FUEL REQUIERED
				if(itemstack.getItem().equals(Items.DIAMOND)) {
					tick++;
					if(EventLocker == 0) {
						seconds = 5;
						if(tick%5 ==0 && tick != 0) {
							this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("block.dispenser.dispense")), SoundCategory.BLOCKS, 100f, 10f, false);
						}
					} else seconds = 0.2f;
					
					if(tick > 20*seconds) {
						if(EventLocker != 0) value = EventLocker;
						switch(value) {
						case 0:
							TntSpawning();
							break;
						case 1:
							netherInvasion();
							break;
						case 2:
							DiamondTower();
							break;
						}
						if(EventLocker == 0) {
							itemstack.setCount(itemstack.getCount()-1);
							MagicFuel--;
							for(float i=0; i<2; i=i+0.1f) {
								ringofParticle(1f, i-0.5f, ParticleTypes.PORTAL);
							}
							this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("entity.enderman.teleport")), SoundCategory.BLOCKS, 100f, 10f, false);
							this.world.removeBlock(this.pos, false);
							this.world.removeTileEntity(this.pos);
						}
						
						tick = 0;
					}
				}
				
				//EVENTS MAGIC FUEL REQUIERED
			}
			
			
			//Events
			
			//Recharge Magic point
			if(itemstack.getItem().equals(Items.GOLD_INGOT) && MagicFuel == 0) {
				tick++;
				if(tick%5 ==0 && tick != 0) {
					this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("block.dispenser.dispense")), SoundCategory.BLOCKS, 100f, 10f, false);
				}
				if(tick > 40) {
					MagicFuel++;
					this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("entity.player.levelup")), SoundCategory.BLOCKS, 100f, 0f, false);
					ringofParticle(1, 0.5f, ParticleTypes.HAPPY_VILLAGER);
					itemstack.setCount(itemstack.getCount()-1);
					tick=0;
				}
			}
			//Recharg Magic point
		} else {
			tick =0;
		}
	}
	
	
	
	//EVENTS
	private void DiamondTower() {
		this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("entity.firework_rocket.launch")), SoundCategory.BLOCKS, 100f, 10f, false);
		for(int i =0; i<20; i++) {
			Block.spawnDrops(Blocks.DIAMOND_ORE.getDefaultState(), this.world, this.pos.add(0, i+1, 0));
			ringofParticle(2, i, ParticleTypes.SOUL_FIRE_FLAME);
		}
	}
	
	
	private void TntSpawning() {
		this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("entity.ender_dragon.growl")), SoundCategory.BLOCKS, 100f, 0f, false);
		float radius;
		int value = random.nextInt(10);
		TNTEntity tnt = new TNTEntity(this.world, this.pos.getX(), this.pos.getY()+1, this.pos.getZ(), null);
		for(radius = value; radius>0; radius=radius-(value/2)) {
			for(float i=-radius; i<radius;i=i+1f) {
				this.world.addEntity(new TNTEntity(this.world, this.pos.getX()+i+0.5, this.pos.getY()+40, this.pos.getZ()+circleTop(i, radius)+0.5, null));
				this.world.addEntity(new TNTEntity(this.world, this.pos.getX()+i+0.5, this.pos.getY()+40, this.pos.getZ()+circleBot(i, radius)+0.5, null));
				ringofParticle(value, 1, ParticleTypes.FLAME);
			}
		}
		this.world.playSound(this.pos.getX(), this.pos.getY(), this.pos.getZ(), new SoundEvent(new ResourceLocation("block.dispenser.dispense")), SoundCategory.BLOCKS, 100f, 0f, false);
		player.sendStatusMessage(new StringTextComponent("RUN !"), true);
		
	}
	
	private void netherInvasion() {
		int SelectBlock;
		int x,y,z;
		this.EventLocker = 1;
		x= random.nextInt(20)-10;
		y= random.nextInt(10)-5;
		z= random.nextInt(20)-10;
		BlockPos posBlock = new BlockPos(this.pos.getX()+x,this.pos.getY()+y,this.pos.getZ()+z);
		if(this.world.getBlockState(posBlock) == Blocks.GRASS_BLOCK.getDefaultState()) {
			SelectBlock = random.nextInt(3);
			addInfected(posBlock);
			switch(SelectBlock) {
			case 0:
				this.world.setBlockState(posBlock, Blocks.NETHERRACK.getDefaultState());
				break;
			case 1:
				this.world.setBlockState(posBlock, Blocks.WARPED_NYLIUM.getDefaultState());
				break;
			default:
				this.world.setBlockState(posBlock, Blocks.CRIMSON_NYLIUM.getDefaultState());
				break;
			}
		}
		if(this.world.getBlockState(posBlock) == Blocks.STONE.getDefaultState()
				|| this.world.getBlockState(posBlock) == Blocks.COBBLESTONE.getDefaultState() 
				|| this.world.getBlockState(posBlock) == Blocks.DIORITE.getDefaultState() 
				|| this.world.getBlockState(posBlock) == Blocks.GRANITE.getDefaultState() 
				|| this.world.getBlockState(posBlock) == Blocks.ANDESITE.getDefaultState() || world.getBlockState(posBlock) == Blocks.DIRT.getDefaultState()) {
			addInfected(posBlock);
			this.world.setBlockState(posBlock, Blocks.LAVA.getDefaultState());
		}
		if(this.world.getBlockState(posBlock) == Blocks.IRON_ORE.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.GOLD_ORE.getDefaultState()) {
			SelectBlock = random.nextInt(10);
			if(SelectBlock == 0) {
				this.world.setBlockState(posBlock, Blocks.ANCIENT_DEBRIS.getDefaultState());
			} else this.world.setBlockState(posBlock, Blocks.LAVA.getDefaultState());
		}
		if(this.world.getBlockState(posBlock) == Blocks.WATER.getDefaultState()) {
			world.setBlockState(posBlock, Blocks.LAVA.getDefaultState());
			addInfected(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.GRAVEL.getDefaultState()) {
			this.world.setBlockState(posBlock, Blocks.LAVA.getDefaultState());
			addInfected(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.OAK_LOG.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.BIRCH_LOG.getDefaultState() 
				|| this.world.getBlockState(posBlock) == Blocks.DARK_OAK_LOG.getDefaultState() 
				|| this.world.getBlockState(posBlock) == Blocks.JUNGLE_LOG.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.SPRUCE_LOG.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.ACACIA_LOG.getDefaultState()) {
			SelectBlock = random.nextInt(2);
			addInfected(posBlock);
			switch(SelectBlock) {
			case 0:
				this.world.setBlockState(posBlock, Blocks.CRIMSON_STEM.getDefaultState());
				break;
			default:
				this.world.setBlockState(posBlock, Blocks.WARPED_STEM.getDefaultState());
				break;
			}
			
		}
		if(this.world.getBlockState(posBlock) == Blocks.POPPY.getDefaultState()) {
			spawnRoses(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.DANDELION.getDefaultState()) {
			this.world.setBlockState(posBlock, Blocks.WARPED_FUNGUS.getDefaultState());
		}
		if(this.world.getBlockState(posBlock) == Blocks.GRASS.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.DEAD_BUSH.getDefaultState()) {
			SelectBlock = random.nextInt(3);
			if(SelectBlock ==0) this.world.setBlockState(posBlock, Blocks.WARPED_ROOTS.getDefaultState());
			if(SelectBlock ==1) this.world.setBlockState(posBlock, Blocks.FIRE.getDefaultState());
			if(SelectBlock ==2) this.world.setBlockState(posBlock, Blocks.SOUL_FIRE.getDefaultState());
			addInfected(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.SAND.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.RED_SAND.getDefaultState()) {
			this.world.setBlockState(posBlock, Blocks.SOUL_SAND.getDefaultState());
			addInfected(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.SANDSTONE.getDefaultState() || this.world.getBlockState(posBlock) == Blocks.RED_SANDSTONE.getDefaultState()) {
			this.world.setBlockState(posBlock, Blocks.SOUL_SOIL.getDefaultState());
			addInfected(posBlock);
		}
		if(this.world.getBlockState(posBlock) == Blocks.CAMPFIRE.getDefaultState()) this.world.setBlockState(posBlock, Blocks.SOUL_CAMPFIRE.getDefaultState());
		
		if(this.BlockInfected>200) {
			this.EventLocker = 0;
			this.BlockInfected =0;
		}
		lightExplosionOfParticle(posBlock, ParticleTypes.LAVA);
		ringofParticle(1f, 0.5f, ParticleTypes.FLAME);
		ringofParticle(1f, 0.5f, ParticleTypes.SOUL_FIRE_FLAME);
	}
	
	private void spawnRoses(BlockPos posBlock) {
		int value = random.nextInt(3);
		if(value ==1) this.world.setBlockState(posBlock, Blocks.CRIMSON_FUNGUS.getDefaultState());
		if(value == 2) {
			this.world.setBlockState(posBlock, Blocks.WITHER_ROSE.getDefaultState());
			ringofParticle(0.5f, 1, ParticleTypes.FLAME);
			lightExplosionOfParticle(posBlock, ParticleTypes.LAVA);
		}
	}
	
	
	//READ AND WRITE FUNC
	
	@Override
	public void read(BlockState state, CompoundNBT nbt) {
		// TODO Auto-generated method stub
		super.read(state, nbt);
	}
	
	@Override
	public CompoundNBT write(CompoundNBT compound) {
		
		
		return super.write(compound);
	}

 

Edited by Armanse
Link to comment
Share on other sites

So i need to delete this in order to fix that bug is that right ? but how can i get the player then ?

19 hours ago, diesieben07 said:

You cannot do this.

Your init shows twice because your TE is initialized once on the server and once on the client.

Edited by Armanse
Link to comment
Share on other sites

the closest to the block if possible

9 minutes ago, diesieben07 said:

The concept of "the player" does not make sense on a server. There are many players. Which one do you want?

Edited by Armanse
Link to comment
Share on other sites

42 minutes ago, diesieben07 said:

The concept of "the player" does not make sense on a server. There are many players. Which one do you want?

Btw even thought i removed the player variable the bug is still there but it's less "powerful"/ buggy than before. Thank you for help btw

Is there anything else that makes the same problem in my code ?

Edited by Armanse
Link to comment
Share on other sites

 

6 minutes ago, diesieben07 said:

I have no idea what you mean by "less powerful" / "buggy".

Show updated code and elaborate.

What i mean by that is that the bug is happening less frequently but it is still happening. And if you want the updated code it's the same one but i removed the player variable. 

Edited by Armanse
Link to comment
Share on other sites

2 minutes ago, diesieben07 said:

You must place blocks only on the server.

Sorry i'm dum but wdym when you say server i know that there is a client side and a server side but i have no idea what those are. If u send me a link to a documentation it's ok but i would like a simple explanation.

Link to comment
Share on other sites

12 hours ago, diesieben07 said:

You must place blocks only on the server.

So as you said i did run the code on the server side however now none of the sounds and the particles are here, since they need to be on the client side. How can i fix that ? i want the particles to appear even thought it's in the server side ? If not possible i would like to at least sync the client side TileEntity to the server side TileEntity but i don't know how since they are not sharing the same variables.

Is it possible to send the particles and sounds to the client side while in the server side ?

Edited by Armanse
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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • 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;     }  
    • It is an issue with quark - update it to this build: https://www.curseforge.com/minecraft/mc-mods/quark/files/3642325
    • Remove Instant Massive Structures Mod from your server     Add new crash-reports with sites like https://paste.ee/  
    • Update your drivers: https://www.amd.com/en/support/graphics/amd-radeon-r9-series/amd-radeon-r9-200-series/amd-radeon-r9-280x
  • Topics

×
×
  • Create New...

Important Information

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