place / break blocks

This commit is contained in:
onezplpl 2024-07-18 11:06:32 -04:00
parent fb639f96c3
commit 227d642be6
No known key found for this signature in database
GPG key ID: 7EC026A136F9EEC3
7 changed files with 191 additions and 55 deletions

76
gen.c
View file

@ -1,3 +1,4 @@
#include "gen.h"
#include "cubes.h"
#include "noise.h"
#include <stdio.h>
@ -8,6 +9,37 @@ struct chunk *chunks = NULL;
int lastI = 0;
int prevExists = 0;
void gen_save(struct chunk chunk) {
char fname[1024];
snprintf(fname, 1023, "./db/chunk_%i_%i_%i.dat", chunk.x, chunk.y, chunk.z);
if (chunk.exists == 0)
return;
FILE *fp = fopen(fname, "wb");
if (!fp) {
return;
}
fwrite(&chunk, sizeof(struct chunk), 1, fp);
fclose(fp);
return;
}
struct chunk gen_find(int x, int y, int z) {
struct chunk chunk;
for (int j = 0; j < CBUF_ALL; j++) {
int i = j;
chunk = chunks[i];
if ((chunk).x == x && (chunk).y == y && (chunk).z == z &&
(chunk).exists != 0) {
return chunk;
}
}
chunk = (gen_chunk(x, y, z, 0, 0));
return chunk;
}
struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
struct chunk *chunks2 = chunks; // &chunks[CBUF_ALL * ci];
@ -47,6 +79,10 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
}
}
if (chunk.exists == 1 && chunk.x != x && chunk.y != y && chunk.z != z) {
gen_save(chunk);
}
char fname[1024];
snprintf(fname, 1023, "./db/chunk_%i_%i_%i.dat", x, y, z);
@ -62,9 +98,8 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
chunk.exists = 1;
return chunk;
}
}
if (!fp) {
fp = fopen(fname, "wb");
} else if (fp) {
fclose(fp);
}
lastI = i;
@ -82,12 +117,7 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
chunks2[i] = chunk;
if (!fp) {
return chunk;
}
fwrite(&chunk, sizeof(struct chunk), 1, fp);
fclose(fp);
gen_save(chunk);
return chunk;
}
@ -98,21 +128,33 @@ void gen_init() {
}
}
void gen_free() { free(chunks); }
void gen_free() {
for (int i = 0; i < CHUNK_ALL; i++) {
gen_save(chunks[i]);
}
free(chunks);
}
int gen_cube(int x, int y, int z, struct chunk dat, int ci) {
int gen_cube(int x, int y, int z, struct chunk dat, int ci, int val) {
if (x < 0 || y < 0 || z < 0)
return 0;
if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) ||
if (val != -1) {
dat = gen_find((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), (z / CHUNK_LENGTH));
} else if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) ||
dat.y != (y / CHUNK_LENGTH) || dat.z != (z / CHUNK_LENGTH)) {
dat = gen_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH),
(z / CHUNK_LENGTH), ci, dat.exists);
dat = gen_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), (z / CHUNK_LENGTH),
ci, dat.exists);
prevExists = dat.exists;
}
int h = dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH +
(x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH];
int *h = &dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH +
(x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH];
return h;
if (val != -1) {
*h = val;
cubes_refresh(x / CHUNK_LENGTH, y / CHUNK_LENGTH, z / CHUNK_LENGTH, dat);
}
return *h;
}