Skip to content

Instantly share code, notes, and snippets.

@Deamon5550
Created November 11, 2015 04:48
Show Gist options
  • Save Deamon5550/f107f7cb3dae0ebb0a9a to your computer and use it in GitHub Desktop.
Save Deamon5550/f107f7cb3dae0ebb0a9a to your computer and use it in GitHub Desktop.
package com.thevoxelbox.biome;
import org.spongepowered.api.Game;
import org.spongepowered.api.data.DataContainer;
import org.spongepowered.api.data.MemoryDataContainer;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.game.state.GameInitializationEvent;
import org.spongepowered.api.event.game.state.GamePostInitializationEvent;
import org.spongepowered.api.event.world.LoadWorldEvent;
import org.spongepowered.api.plugin.Plugin;
import org.spongepowered.api.plugin.PluginContainer;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.WorldCreationSettings;
import org.spongepowered.api.world.biome.BiomeType;
import org.spongepowered.api.world.biome.BiomeTypes;
import org.spongepowered.api.world.extent.MutableBiomeArea;
import org.spongepowered.api.world.gen.BiomeGenerator;
import org.spongepowered.api.world.gen.WorldGenerator;
import org.spongepowered.api.world.gen.WorldGeneratorModifier;
import com.flowpowered.math.vector.Vector2i;
import com.google.inject.Inject;
@Plugin(id = "biome-plugin", name = "Biome Plugin")
public class BiomePlugin implements WorldGeneratorModifier {
public static BiomePlugin instance;
private BiomeType[] biomes;
@Inject private PluginContainer plugin;
public BiomePlugin() {
}
@Listener
public void onInitialize(GamePostInitializationEvent event) {
instance = this;
Game game = event.getGame();
game.getRegistry().registerWorldGeneratorModifier(this);
this.biomes = game.getRegistry().getAllOf(BiomeType.class).toArray(new BiomeType[0]);
// System.out.println("Found " + this.biomes.length + " biomes");
}
// @Listener
public void onWorldLoad(LoadWorldEvent event) {
World world = event.getTargetWorld();
System.out.println("World load: " + world.getName() + " " + world.getDimension().getType().getName());
System.out.println("Applying world gen modifier");
WorldGenerator gen = world.getWorldGenerator();
modifyWorldGenerator(world.getCreationSettings(), new MemoryDataContainer(), gen);
world.setWorldGenerator(gen);
}
@Override
public String getName() {
return plugin.getName();
}
@Override
public void modifyWorldGenerator(WorldCreationSettings world, DataContainer settings, WorldGenerator worldGenerator) {
worldGenerator.setBiomeGenerator(new TestBiomeGenerator(this.biomes));
}
@Override
public String getId() {
return plugin.getId();
}
}
package com.thevoxelbox.biome;
import org.spongepowered.api.world.biome.BiomeType;
import org.spongepowered.api.world.biome.BiomeTypes;
import org.spongepowered.api.world.extent.MutableBiomeArea;
import org.spongepowered.api.world.gen.BiomeGenerator;
import com.flowpowered.math.vector.Vector2i;
public class TestBiomeGenerator implements BiomeGenerator {
private static final int BIOME_SIZE = 2;
private final BiomeType[] biomes;
public TestBiomeGenerator(BiomeType[] b) {
this.biomes = new BiomeType[64];
for (int i = 0; i < 64; i++) {
if (i < b.length) {
// System.out.println(i + " " + b[i]);
this.biomes[i] = b[i];
} else {
this.biomes[i] = BiomeTypes.OCEAN;
}
}
}
@Override
public void generateBiomes(MutableBiomeArea buffer) {
Vector2i min = buffer.getBiomeMin().div(64);
int index = getIndex(min.getX(), min.getY());
flood(buffer, this.biomes[index]);
// System.err.println("Flooding " + min.getX() + " " + min.getY() + " with " + this.biomes[index].getName());
}
private int getIndex(int x, int y) {
x = (x / BIOME_SIZE) % 8;
y = (y / BIOME_SIZE) % 8;
if(x < 0) x += 8;
if(y < 0) y += 8;
return x + y * 8;
}
private void flood(MutableBiomeArea b, BiomeType type) {
for (int x = 0; x < b.getBiomeSize().getX(); x++) {
for (int y = 0; y < b.getBiomeSize().getY(); y++) {
b.setBiome(x + b.getBiomeMin().getX(), y + b.getBiomeMin().getY(), type);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment