Skip to content

Commit db7c20a

Browse files
committed
Add retrogen and fix converter
1 parent 6886a65 commit db7c20a

File tree

5 files changed

+174
-6
lines changed

5 files changed

+174
-6
lines changed

src/main/java/mmd/orespawn/EventHandler.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,84 @@
11
package mmd.orespawn;
22

3+
import mmd.orespawn.world.OreSpawnData;
4+
import mmd.orespawn.world.OreSpawnWorldGenerator;
5+
import net.minecraft.nbt.NBTTagList;
6+
import net.minecraft.nbt.NBTTagString;
7+
import net.minecraft.world.WorldServer;
8+
import net.minecraft.world.chunk.Chunk;
9+
import net.minecraft.world.chunk.IChunkGenerator;
10+
import net.minecraft.world.gen.ChunkProviderServer;
311
import net.minecraftforge.event.terraingen.OreGenEvent;
12+
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
13+
import net.minecraftforge.event.world.ChunkDataEvent;
414
import net.minecraftforge.fml.common.eventhandler.Event;
515
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
616

17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Random;
21+
722
public enum EventHandler {
823
INSTANCE;
924

25+
@SubscribeEvent
26+
public void onChunkLoad(ChunkDataEvent.Load event) {
27+
if (OreSpawn.DO_RETRO_GENERATION) {
28+
WorldServer world = (WorldServer) event.getWorld();
29+
Chunk chunk = event.getChunk();
30+
31+
this.generateChunk(world, chunk);
32+
}
33+
}
34+
35+
@SubscribeEvent
36+
public void onPopulateChunk(PopulateChunkEvent event) {
37+
if (OreSpawn.DO_RETRO_GENERATION) {
38+
WorldServer world = (WorldServer) event.getWorld();
39+
Chunk chunk = world.getChunkFromChunkCoords(event.getChunkX(), event.getChunkZ());
40+
41+
this.generateChunk(world, chunk);
42+
}
43+
}
44+
45+
public void generateChunk(WorldServer world, Chunk chunk) {
46+
OreSpawnData data = OreSpawnData.getData(world);
47+
NBTTagList dataList = data.chunkData.get(chunk.getChunkCoordIntPair());
48+
List<String> generatedIDs = new ArrayList<>();
49+
50+
if (dataList == null) {
51+
dataList = new NBTTagList();
52+
}
53+
54+
for (int i = 0; i < dataList.tagCount(); i++) {
55+
generatedIDs.add(dataList.getStringTagAt(i));
56+
}
57+
58+
for (Map.Entry<String, List<OreSpawnWorldGenerator>> entry : OreSpawn.API.getWorldGenerators().entrySet()) {
59+
if (!generatedIDs.contains(entry.getKey())) {
60+
long worldSeed = world.getSeed();
61+
Random random = new Random(worldSeed);
62+
long xSeed = random.nextLong() >> 2 + 1L;
63+
long zSeed = random.nextLong() >> 2 + 1L;
64+
long chunkSeed = (xSeed * chunk.xPosition + zSeed * chunk.zPosition) ^ worldSeed;
65+
66+
ChunkProviderServer chunkProvider = world.getChunkProvider();
67+
IChunkGenerator chunkGenerator = chunkProvider.chunkGenerator;
68+
69+
for (OreSpawnWorldGenerator generator : entry.getValue()) {
70+
random.setSeed(chunkSeed);
71+
generator.generate(random, chunk.xPosition, chunk.zPosition, world, chunkGenerator, chunkProvider);
72+
}
73+
74+
dataList.appendTag(new NBTTagString(entry.getKey()));
75+
}
76+
}
77+
78+
data.chunkData.put(chunk.getChunkCoordIntPair(), dataList);
79+
data.markDirty();
80+
}
81+
1082
@SubscribeEvent
1183
public void onGenerateMinable(OreGenEvent.GenerateMinable event) {
1284
event.setResult(Event.Result.DENY);

src/main/java/mmd/orespawn/OreSpawn.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import mmd.orespawn.json.OreSpawnReader;
99
import mmd.orespawn.json.OreSpawnWriter;
1010
import net.minecraftforge.common.MinecraftForge;
11+
import net.minecraftforge.common.config.Configuration;
1112
import net.minecraftforge.fml.common.Mod;
1213
import net.minecraftforge.fml.common.event.FMLInterModComms;
1314
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
@@ -22,17 +23,24 @@ public class OreSpawn {
2223
public static final Logger LOGGER = LogManager.getLogger("OreSpawn");
2324
public static final OreSpawnImpl API = new OreSpawnImpl();
2425

26+
public static boolean DO_RETRO_GENERATION = true;
27+
2528
@Mod.EventHandler
2629
public void onPreInit(FMLPreInitializationEvent event) {
30+
Configuration config = new Configuration(event.getSuggestedConfigurationFile());
31+
OreSpawn.DO_RETRO_GENERATION = config.getBoolean("retrogen", Configuration.CATEGORY_GENERAL, true, "Generate ores in pre-existing chunks");
32+
config.save();
33+
34+
MinecraftForge.EVENT_BUS.register(EventHandler.INSTANCE);
2735
MinecraftForge.ORE_GEN_BUS.register(EventHandler.INSTANCE);
2836
OreSpawnReader.INSTANCE.readSpawnEntries();
29-
OreSpawnReader.INSTANCE.convertOldSpawnEntries();
3037

3138
FMLInterModComms.sendFunctionMessage("orespawn", "api", "mmd.orespawn.VanillaOreSpawn");
3239
}
3340

3441
@Mod.EventHandler
3542
public void onPostInit(FMLPostInitializationEvent event) {
43+
OreSpawnReader.INSTANCE.convertOldSpawnEntries();
3644
OreSpawnWriter.INSTANCE.writeSpawnEntries();
3745
}
3846

src/main/java/mmd/orespawn/impl/OreSpawnImpl.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99
import mmd.orespawn.world.OreSpawnWorldGenerator;
1010
import net.minecraftforge.fml.common.registry.GameRegistry;
1111

12-
import java.util.HashMap;
13-
import java.util.Map;
14-
import java.util.Random;
12+
import java.util.*;
1513

1614
public class OreSpawnImpl implements OreSpawnAPI {
1715
private final Map<String, SpawnLogic> spawnLogic = new HashMap<>();
16+
private final Map<String, List<OreSpawnWorldGenerator>> worldGenerators = new HashMap<>();
1817

1918
@Override
2019
public SpawnLogic createSpawnLogic() {
@@ -36,12 +35,22 @@ public void registerSpawnLogic(String id, SpawnLogic spawnLogic) {
3635

3736
Random random = new Random();
3837

38+
List<OreSpawnWorldGenerator> list = new ArrayList<>();
3939
for (Map.Entry<Integer, DimensionLogic> dimension : spawnLogic.getAllDimensions().entrySet()) {
4040
for (SpawnEntry entry : dimension.getValue().getEntries()) {
41-
GameRegistry.registerWorldGenerator(new OreSpawnWorldGenerator(entry, dimension.getKey(), random.nextLong()), 100);
41+
OreSpawnWorldGenerator generator = new OreSpawnWorldGenerator(entry, dimension.getKey(), random.nextLong());
42+
list.add(generator);
43+
if (!OreSpawn.DO_RETRO_GENERATION) {
44+
GameRegistry.registerWorldGenerator(generator, 100);
45+
}
4246
}
4347
}
48+
this.worldGenerators.put(id, list);
4449

4550
OreSpawn.LOGGER.info("Registered spawn logic for mod " + id);
4651
}
52+
53+
public Map<String, List<OreSpawnWorldGenerator>> getWorldGenerators() {
54+
return ImmutableMap.copyOf(this.worldGenerators);
55+
}
4756
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package mmd.orespawn.world;
2+
3+
import net.minecraft.nbt.NBTTagCompound;
4+
import net.minecraft.nbt.NBTTagList;
5+
import net.minecraft.util.math.ChunkPos;
6+
import net.minecraft.world.World;
7+
import net.minecraft.world.WorldSavedData;
8+
import net.minecraft.world.storage.MapStorage;
9+
import net.minecraftforge.common.util.Constants;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
public class OreSpawnData extends WorldSavedData {
15+
public final Map<ChunkPos, NBTTagList> chunkData = new HashMap<>();
16+
17+
public OreSpawnData(String tag) {
18+
super(tag);
19+
}
20+
21+
@Override
22+
public void readFromNBT(NBTTagCompound compound) {
23+
this.chunkData.clear();
24+
25+
NBTTagList list = compound.getTagList("List", Constants.NBT.TAG_COMPOUND);
26+
27+
for (int i = 0; i < list.tagCount(); i++) {
28+
NBTTagCompound data = list.getCompoundTagAt(i);
29+
30+
int chunkX = data.getInteger("ChunkX");
31+
int chunkZ = data.getInteger("ChunkZ");
32+
NBTTagList generatedIDs = data.getTagList("GeneratedIDs", Constants.NBT.TAG_STRING);
33+
34+
this.chunkData.put(new ChunkPos(chunkX, chunkZ), generatedIDs);
35+
}
36+
}
37+
38+
@Override
39+
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
40+
NBTTagList list = new NBTTagList();
41+
42+
for (Map.Entry<ChunkPos, NBTTagList> entry : this.chunkData.entrySet()) {
43+
NBTTagCompound data = new NBTTagCompound();
44+
45+
data.setInteger("ChunkX", entry.getKey().chunkXPos);
46+
data.setInteger("ChunkZ", entry.getKey().chunkZPos);
47+
data.setTag("GeneratedIDs", entry.getValue());
48+
49+
list.appendTag(data);
50+
}
51+
52+
compound.setTag("List", list);
53+
54+
return compound;
55+
}
56+
57+
public static OreSpawnData getData(World world) {
58+
String tag = "orespawn";
59+
60+
MapStorage storage = world.getPerWorldStorage();
61+
OreSpawnData data = (OreSpawnData) storage.getOrLoadData(OreSpawnData.class, tag);
62+
63+
if (data == null) {
64+
data = new OreSpawnData(tag);
65+
storage.setData(tag, data);
66+
}
67+
68+
return data;
69+
}
70+
}

src/main/java/mmd/orespawn/world/OreSpawnWorldGenerator.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,16 @@ public void generate(Random random, int chunkX, int chunkZ, World world, IChunkG
9191

9292
if (this.spawnEntry.getBiomes().length != 0) {
9393
Biome biome = world.getBiome(pos);
94-
if (!Arrays.stream(this.spawnEntry.getBiomes()).map(Biome::getRegistryName).collect(Collectors.toList()).contains(biome.getRegistryName())) {
94+
boolean flag = false;
95+
96+
for (Biome b : this.spawnEntry.getBiomes()) {
97+
if (b == biome) {
98+
flag = true;
99+
break;
100+
}
101+
}
102+
103+
if (!flag) {
95104
return;
96105
}
97106
}

0 commit comments

Comments
 (0)