Voxel terrain generation not working in negative chunks

Godot Version

4.6

Question

So, I’m trying to make a minecraft-like game but I’ve never really dabbled in voxel-based generation before, so I followed a tutorial series in order to get the generation working (https://www.youtube.com/watch?v=c3OfvX3LLjQ). The main problem I’m running into is that nothing works correctly in the negative chunks, since the tutorial was meant for finite worlds. I’ve managed to get block placing and breaking to work in the negative chunks using this script:

func SetBlockByWorldPosition(pos : Vector3i, block_type : Block.BlockType):
	var chunk_pos = WorldPosToChunkPos(pos)
	var local_pos = abs(pos - chunk_pos)
	var p1 = local_pos
	if pos.x < 0 or pos.z < 0:
		local_pos = Vector3i.ONE * chunk_size - local_pos - Vector3i.ONE
	if pos.x < 0 and pos.z < 0:
		chunk_pos = WorldPosToChunkPos(pos) + Vector3i(-1, 0, -1) * chunk_size
	if pos.x < 0 and not pos.z < 0:
		chunk_pos = WorldPosToChunkPos(pos) + Vector3i(-1, 0, 0) * chunk_size
		local_pos.z = chunk_size - local_pos.z - 1
	elif pos.z < 0 and not pos.x < 0:
		chunk_pos = WorldPosToChunkPos(pos) + Vector3i(0, 0, -1) * chunk_size
		local_pos.x = chunk_size - local_pos.x - 1
	local_pos.y = p1.y
	#print("local: " + str(local_pos))
	#print("chunk: " + str(chunk_pos))
	#print("pos: " + str(pos))
	
	if chunks.has(chunk_pos):
		chunks[chunk_pos].SetBlock(local_pos, block_type)
		chunks_tagged_for_regen.append(chunks[chunk_pos])
		
	var adjacent_chunks = BlockIsOnEdgeOfChunk(local_pos)
	for adjacent_chunk in adjacent_chunks:
		var adjacent_chunk_pos = chunk_pos + adjacent_chunk * chunk_size
		
		if chunks.has(adjacent_chunk_pos):
			chunks_tagged_for_regen.append(chunks[adjacent_chunk_pos])

But inside the negative chunks the chunk meshes don’t render properly, as they remove the faces that border chunks. It all works in the positive chunks however.

This image shows the Y border between to chunks. What I’m wondering is if anyone knows any common causes to problems like this. I’m not sure which part of my code would be best to show since there’s quite a bit of it, but this is the cube mesh generation code:

func gen_cube_mesh(pos : Vector3):
	var is_top_block = false
	if blocks[pos.x][pos.y][pos.z] != Block.BlockType.air:
		if block_is_air(pos + Vector3(0, 1, 0)):
			# TOP	
			vertices.append(pos + Vector3(-0.5, 0.5, -0.5))	
			vertices.append(pos + Vector3( 0.5, 0.5, -0.5))	
			vertices.append(pos + Vector3( 0.5, 0.5,  0.5))	
			vertices.append(pos + Vector3(-0.5, 0.5,  0.5))	
		
			add_tris()
			add_uvs(0,0)
			is_top_block = true
		
		if block_is_air(pos + Vector3(1, 0, 0)):
			# EAST	
			vertices.append(pos + Vector3( 0.5, 0.5, 0.5))	
			vertices.append(pos + Vector3( 0.5, 0.5, -0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5,-0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5,  0.5))	
		
			add_tris()
			if is_top_block:
				add_uvs(3,0)
			else:
				add_uvs(1,0)
		
		if block_is_air(pos + Vector3(0, 0, 1)):
			# SOUTH	
			vertices.append(pos + Vector3(-0.5, 0.5, 0.5))	
			vertices.append(pos + Vector3( 0.5, 0.5, 0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5,0.5))	
			vertices.append(pos + Vector3(-0.5, -0.5, 0.5))	
		
			add_tris()
			if is_top_block:
				add_uvs(0,1)
			else:
				add_uvs(1,0)
		
		if block_is_air(pos + Vector3(-1, 0, 0)):
			# WEST	
			vertices.append(pos + Vector3(-0.5, 0.5, -0.5))	
			vertices.append(pos + Vector3(-0.5, 0.5,  0.5))	
			vertices.append(pos + Vector3(-0.5, -0.5, 0.5))	
			vertices.append(pos + Vector3(-0.5, -0.5, -0.5))	
		
			add_tris()
			if is_top_block:
				add_uvs(1,1)
			else:
				add_uvs(1,0)
		
		if block_is_air(pos + Vector3(0, 0, -1)):
			# NORTH	
			vertices.append(pos + Vector3( 0.5,  0.5, -0.5))	
			vertices.append(pos + Vector3(-0.5,  0.5, -0.5))	
			vertices.append(pos + Vector3(-0.5, -0.5, -0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5, -0.5))	
		
			add_tris()
			if is_top_block:
				add_uvs(2,0)
			else:
				add_uvs(1,0)
		
		if block_is_air(pos + Vector3(0, -1, 0)):	
			# BOTTOM	
			vertices.append(pos + Vector3(-0.5, -0.5, 0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5, 0.5))	
			vertices.append(pos + Vector3( 0.5, -0.5, -0.5))	
			vertices.append(pos + Vector3(-0.5, -0.5, -0.5))	
		
			add_tris()
			add_uvs(1,0)

Any help would be greatly appreciated!