diff options
| author | ubq323 <ubq323@ubq323.website> | 2024-04-14 14:54:47 +0100 | 
|---|---|---|
| committer | ubq323 <ubq323@ubq323.website> | 2024-04-14 14:54:47 +0100 | 
| commit | 047718ad845ee5850fe70316d7c1ac9dec10b6dd (patch) | |
| tree | 321d4a27372b13cbfd3ee8a02394c13d182b03df | |
| parent | c7cc58468b5a5ff483da7fe8c765ccad199f13f1 (diff) | |
don't request a chunk more than once
| -rw-r--r-- | client/main.ha | 35 | 
1 files changed, 31 insertions, 4 deletions
| diff --git a/client/main.ha b/client/main.ha index 977827c..2a341c4 100644 --- a/client/main.ha +++ b/client/main.ha @@ -63,10 +63,12 @@ export fn main() void = {  	let n = 0;  	let lasttime = sdl2::SDL_GetTicks(); +	let requested_chunks: []pos = []; +  	// in WORLD coords  	let mouse_pos: pos = (0,0);  	let mouse_down = false; -	request_visible_chunks(pictures, conn, camera_pos); +	request_visible_chunks(pictures, conn, camera_pos, &requested_chunks);  	for (!quit) {  		const did_move = do_movement(&camera_pos); @@ -106,8 +108,7 @@ export fn main() void = {  		if (did_move) {  			packet_reader::send(conn, camera_pos: packet_reader::packet_position)!; -			request_visible_chunks(pictures, conn, camera_pos); - +			request_visible_chunks(pictures, conn, camera_pos, &requested_chunks);  		};  		const n = poll::poll(pollfd, poll::NONBLOCK)!; @@ -124,6 +125,17 @@ export fn main() void = {  					const pic = find_picture_for_chunkdata(camera_pos, packet.world_pos, pictures);  					pic.world_pos = packet.world_pos;  					pic.d[..len(packet.chunk_data)] = packet.chunk_data[..]; + +					for (let i = 0z; i < len(requested_chunks); i += 1) { +						const rc = requested_chunks[i]; +						if (rc.0 == packet.world_pos.0 && rc.1 == packet.world_pos.1) { +							delete(requested_chunks[i]); +							fmt::printfln("fulfilling chunk request {},{}", +								packet.world_pos.0, packet.world_pos.1)!; +							break; +						}; +					}; +  				};  			};  		}; @@ -231,12 +243,26 @@ fn find_chunk(pictures: []drawing::picture, world_pos: pos)  	return null;  }; -fn request_visible_chunks(pictures: []drawing::picture, conn: net::socket, camera_pos: pos) void = { +fn request_visible_chunks( +	pictures: []drawing::picture, +	conn: net::socket, +	camera_pos: pos, +	requested_chunks: *[]pos, +) void = {  	const x0 = CHUNKSIZE*floor_div(camera_pos.0,CHUNKSIZE);  	const y0 = CHUNKSIZE*floor_div(camera_pos.1,CHUNKSIZE);  	for (let dx = 0i32; dx < 3; dx += 1) for (let dy = 0i32; dy < 3; dy += 1) {  		let world_pos = (x0+CHUNKSIZE*dx, y0+CHUNKSIZE*dy): pos; + +		for (const rc .. requested_chunks) { +			if (rc.0 == world_pos.0 && rc.1 == world_pos.1) { +				fmt::printfln("not requesting {},{} again", rc.0, rc.1)!; +				return; +			}; +		}; + +  		if (!is_picture_visible(camera_pos, world_pos)) {  			// fmt::printfln("invisible {},{}", world_pos.0, world_pos.1)!;  			continue; @@ -249,6 +275,7 @@ fn request_visible_chunks(pictures: []drawing::picture, conn: net::socket, camer  		case null =>  			fmt::printfln("\trequesting {},{}", world_pos.0, world_pos.1)!;  			packet_reader::send(conn, world_pos: packet_reader::packet_reqchunk)!; +			append(requested_chunks, world_pos);  		};  	};  }; | 
