Jump to content

Recommended Posts

Posted

I've made a custom dimension, but rather than using a chunk generator, my own is just a "copy" of the overworld and i want replace some blocks by other.

So i need to get a list of all block on the chunk and replacing them by the wanted block or remove them, but i don't know how to get a list of block in the chunk, maybe this way is just impossible ?

Posted

I'm doing something like this, doesn't test it yet but i think i'm on the right way :

package com.kporal.lau.events;

import java.util.Map;

import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.ChunkEvent.Load;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class OnChunkEvent {
	
	@SubscribeEvent
	public void EditChunk( Load e ) {
		
		Chunk c = e.getChunk();
		
		Map<BlockPos, TileEntity> map = c.getTileEntityMap();
		for( BlockPos p : map.keySet() ) {
		    
		    c.removeTileEntity( p );
		    
		}
	}
}

removeTileEntity may remove my desired block ? then i should replace a new block at the position, or i need to use setBlockState ?

Posted

Ok, my custom dimension is a mimic of the overworld, it work, i can teleport, spawn etc, but now, because i don't use a custom chunk generator i try to use the chunk Load event to replace undesired block by other, my actual code is more like :

package com.kporal.lau.events;

import java.util.Map;

import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.ChunkEvent.Load;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class OnChunkEvent {
	
	@SubscribeEvent
	public void EditChunk( Load e ) {
		
		Chunk c = e.getChunk();
		
		Map<BlockPos, TileEntity> map = c.getTileEntityMap();
		for( BlockPos p : map.keySet() ) {
		    
			if( c.getBlockState( p ).getBlock() == Blocks.DIRT ) {
				c.removeTileEntity( p );
				//c.addTileEntity( p, );
			}
		    
		}
	}
}

it's just an exemple for dirt block, but when i'm doing a better job here i'm gonna use some array, i hope to give you suffisant information ( sorry if my english is bad :/ )

Posted

my explanation isn't good, it's not a mimic, the "erzine" ( my custom one ) doens't mimic stuff from the overworld, it was just generated with the same seed, but totally separate dimension.

Posted

Actually my code is :

package com.kporal.lau.events;

import java.util.Map;

import com.kporal.lau.LAU;

import net.minecraft.block.Block;
import net.minecraft.block.BlockSand;
import net.minecraft.block.BlockStaticLiquid;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.ChunkEvent.Load;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class OnChunkEvent {
	
	//private final Block[] toNetherrack = { Blocks.SAND };
	//private final Blocks[] toLava = { Blocks.WATER };
	
	@SubscribeEvent
	public void EditChunk( Load e ) {
		
		World w = e.getWorld();
		
		if( !w.isRemote && w.provider.getDimension() == LAU.erzineId ) {
		
			Chunk c = e.getChunk();
			Map<BlockPos, TileEntity> map = c.getTileEntityMap();
			
			for( BlockPos p : map.keySet() ) {
				
				Block b = c.getBlockState( p ).getBlock();
				
			    /*if( ArrayUtils.contains( toNetherrack, c.getBlockState( p ).getBlock() )) {
			    	c.removeTileEntity( p );
			    }*/
				
				if( b instanceof BlockSand ) {
					// Convert to soulsand
					c.removeTileEntity( p );
					c.setBlockState( p, Blocks.SOUL_SAND.getDefaultState() );
				}
				if( b instanceof BlockStaticLiquid ) {
					// Convert to lava
					c.removeTileEntity( p );
					c.setBlockState( p, Blocks.LAVA.getDefaultState() );
				}
				
			}
		}
	}
}

But it doesn't work, i mean nothing happen, i register the event on the FMLInit

@EventHandler
public void Init( FMLInitializationEvent e ) {
	MinecraftForge.EVENT_BUS.register( new OnChunkEvent() );
}

But i have no error at all, so i know i'm wrong because nothing happen, but i don't know where i'm wrong

Posted

Ok so finally i check ... nothing so this is why nothing is replace ... theire is a way to get all chunk block directly ? or i need to use a for <<4 loop ?

Posted

Yes, i've made some test and i think i've found a way to ensure the game do not load heavily by using nbttag when a chunk is converted, may work but for now my "converter" work ( and like you said it's pretty laggy but not everywhere almost at the first generation ).

 

So i need to know if i can use nbttag into chunk, maybe not but in world should be better by saving something like that : chunk_0_-1_0 as id with isConverted to avoid a second convertion.

 

But in case of needed, i'm also gonna make an admin command to re convert a chunk !

 

And my last possibility but actually ... i think it don't work :/ ... changing the height of the map ... because i don't need 256 but ... should be better with 96 height trying to do it with :

 

ErzineProvider.class

package com.kporal.lau.dimensions;

import com.kporal.lau.LAU;

import net.minecraft.init.Biomes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.DimensionType;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeProviderSingle;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ErzineProvider extends WorldProvider {

	public World worldObj;
	
	public void registerWorldChunkManager() {
		this.biomeProvider = new BiomeProviderSingle( Biomes.VOID );
		this.setDimension( LAU.erzineId );
		this.setAllowedSpawnTypes( false, false );
		this.hasNoSky = false;
		this.doesWaterVaporize = true;
	}

	public Biome getBiomeGenForCoords( BlockPos pos ) { return Biomes.VOID; }

	@Override
	public boolean canRespawnHere() { return false; }

	@Override
	public boolean isSurfaceWorld() { return false; }

	@Override
	public DimensionType getDimensionType() { return LAU.ERZINE_DIMENSION; }
	
	@Override
	public float calculateCelestialAngle( long worldTime, float partialTicks ) { return 0.0F; }

	@Override
	@SideOnly( Side.CLIENT )
	public float[] calcSunriseSunsetColors( float celestialAngle, float partialTicks ) { return null; }
	
	@Override
	@SideOnly( Side.CLIENT )
	public Vec3d getFogColor( float p_76562_1_, float p_76562_2_ ) {
		return new Vec3d(0.20000000298023224D, 0.029999999329447746D, 0.029999999329447746D);
	}
	
	@Override
	@SideOnly( Side.CLIENT )
	public float getCloudHeight() { return 12.0F; }
	
	@SideOnly( Side.CLIENT )
    public boolean doesXZShowFog( int x, int z ) { return true; }
	
	@Override
	public int getHeight() { return 96; }

	@Override
    public int getActualHeight() { return 96; }

}

But ... because my "Erzine" dimension is a "copy" of the overworld it's doesn't work ( i need to check something ... ).

Posted

Ok it work really fine with nbt :)

package com.kporal.lau.events;

import com.kporal.lau.LAU;

import net.minecraft.block.Block;
import net.minecraft.block.BlockDirt;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.BlockLiquid;
import net.minecraft.block.BlockOre;
import net.minecraft.block.BlockSandStone;
import net.minecraft.block.BlockStone;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class OnChunkEvent {
	
	//private final Block[] toNetherrack = { Blocks.SAND };
	//private final Block[] toEndstone = { Blocks.END_STONE };
	//private final Block[] toDestroy = { Blocks.OAK_STAIRS };
	
	@SubscribeEvent
	public void EditChunk( ChunkEvent.Load e ) {
		
		World w = e.getWorld();
		
		if( !w.isRemote && w.provider.getDimension() == LAU.ERZINEID ) {
			
			NBTTagCompound nbt = w.getWorldInfo().getDimensionData( LAU.ERZINEID );
			Chunk c = e.getChunk();
			String chunkid = "erzineChunk:" + c.xPosition + "_" + c.zPosition;
			
			if( nbt.hasKey( chunkid ) ) { return; }
			
			int cx = c.xPosition << 4;
			int cy = w.getHeight();
			int cz = c.zPosition << 4;
			
			for( int x = cx - 16; x < cx; x++ ) {
				for( int y = 0; y < cy; y++ ) {
					for( int z = cz - 16; z < cz; z++ ) {
						
						BlockPos p = new BlockPos( x, y, z );
						Block b = c.getBlockState( p ).getBlock();
						
						if( b instanceof BlockFalling && b != Blocks.SOUL_SAND ) { c.setBlockState( p, Blocks.SOUL_SAND.getDefaultState() ); }
						if( b instanceof BlockLiquid && b != Blocks.LAVA ) { c.setBlockState( p, Blocks.LAVA.getDefaultState() ); }
						if(( b instanceof BlockOre || b instanceof BlockStone || b instanceof BlockSandStone ) && b != Blocks.END_STONE ) { c.setBlockState( p, Blocks.END_STONE.getDefaultState() ); }
						if( b instanceof BlockDirt && b != Blocks.NETHERRACK ) { c.setBlockState( p, Blocks.NETHERRACK.getDefaultState() ); }
						//w.destroyBlock( p, false );
						
					}
				}
			}
			
			nbt.setBoolean( chunkid, true );
			w.getWorldInfo().setDimensionData( LAU.ERZINEID, nbt );
		}
	}
}

And now i need to clean up entity spawn, and decorate event, if i'm right tree is on the decorate event ?

I also need to clear every structure ( with event too ... to prevent them to spawn )

Posted

Now i'm here :

 

ErzineConverter.class

  Reveal hidden contents

Yes i use DecorateBiomeEvent Pre and Decorate ( i've made this for testing purpose ) but, i'm in trouble, my main event for replacing block do not clear everything, sometime some flower, grass or tree is populated on my world and i don't know how to canceled that or maybe by doing a second loop ...

 

But first, my first problem here is at the bottom, LivingSpawn, i don't understand why this not work, i've made this to prevent creature to spawn but ... i also use this on my world provider : this.setAllowedSpawnTypes( false, false ); ...

 

And why some tree / flower / water keep on the world ... i'm trying a lot of thing but nothing seem to really clear the world

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

    • my game keeps crashing right before launching the game before full screen and keeps poping up this error message "error code 1 " The game crashed: rendering overlay Error: java.lang.IllegalAccessError: failed to access class com.mojang.blaze3d.platform.GlStateManager$TextureState from class net.coderbot.iris.gl.IrisRenderSystem$DSAARB (com.mojang.blaze3d.platform.GlStateManager$TextureState is in module minecraft@1.18.2 of loader 'TRANSFORMER' @d919544; net.coderbot.iris.gl.IrisRenderSystem$DSAARB is in module oculus@1.6.4 of loader 'TRANSFORMER' @d919544)
    • removing oculus or any of ETF or EMF or even embeddium doesn't change anything it just crashes again with error -1  https://gist.github.com/Tikalian-coconut/d49e8fb83bf57d5e04eb042522046786 this time i removed all 4 at same time and that gave it something is wrong with the game seriously..
    • crash report -> https://gist.github.com/Tikalian-coconut/18c41f97bdacef54725e5141f57697d7 from what i see it seems like Entity Texture Features doesn't like Oculus doing something or invert.. not sure it's why everything is all black textured but that causes a -1 error
    • well that's bad, cuz there's no crash report at all (the last crash report is from previous replies) it's probably another issue that doesn't fit in this bug report, the game works fine except that everything is black, no texture except the sky and skin, everything else is just black i've tried reloading the textures in game, see for drivers updates but it did nothing, seems like an issue with Embeddium or Oculus i think, but i know nothing compared to you i can still send the latest debug and latest.log files.. edit: it seems that when i re-add rechiseled (1.1.6-1.20.1) it crashes as error 1 (i can't remove it off from the modpack cuz that'll break all my builds on some maps) lemme start the game and get it to crash to get a crash report done)
    • If you've fallen victim to a crypto scam, you're not alone and thankfully, you're not without options. I highly recommend iBolt Cyber Hacker Company for anyone seeking professional and effective assistance in recovering scammed cryptocurrency. After extensive research and hearing from multiple satisfied clients, it's clear that iBolt stands out in a crowded and often unreliable market. Their team of experienced cyber experts and blockchain analysts uses advanced tracking techniques to follow stolen funds across the blockchain and engage with crypto exchanges when possible. They’re not just tech-savvy—they’re strategic and persistent. WHY CHOOSE iBOLT CYBER HACKER COMPANY? (1) Proven success in crypto asset recovery (2) Fast, professional, and discreet service (3) Skilled in blockchain forensics and cyber investigation (4) Committed to fighting online fraud and supporting victims Don’t give up. I strongly recommend reaching out to iBolt Cyber Hacker Company. ENQUIRIES: info @ iboltcyberhack . org/ www . iboltcyberhack. org/ +39. 351. 105. 3619.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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