THE SUPER DUPER COOL BUT TOTALLY NOT STABLE THING THATS NOT READY YET...

This commit is contained in:
Daniel Mills 2021-07-14 04:51:50 -04:00
parent 6ca6fc6989
commit ec47ca1983
14 changed files with 423 additions and 9 deletions

View File

@ -5,7 +5,7 @@ plugins {
}
group 'com.volmit.iris'
version '1.4.15'
version '1.5-TOTALLY-UNSTABLE'
def apiVersion = '1.17'
def name = 'Iris'
def main = 'com.volmit.iris.Iris'

View File

@ -10,7 +10,9 @@ import com.volmit.iris.manager.link.MultiverseCoreLink;
import com.volmit.iris.manager.link.MythicMobsLink;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.object.IrisCompat;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.scaffold.IrisWorlds;
import com.volmit.iris.scaffold.data.DataProvider;
import com.volmit.iris.scaffold.engine.EngineCompositeGenerator;
import com.volmit.iris.util.*;
import io.papermc.lib.PaperLib;
@ -61,6 +63,66 @@ public class Iris extends VolmitPlugin implements Listener {
INMS.get();
IO.delete(new File("iris"));
lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4;
installDataPacks();
}
private void installDataPacks() {
Iris.info("Checking Data Packs...");
boolean reboot = false;
File packs = new File("plugins/Iris/packs");
File dpacks = null;
look: for(File i : new File(".").listFiles())
{
if(i.isDirectory())
{
for(File j : i.listFiles())
{
if(j.isDirectory() && j.getName().equals("datapacks"))
{
dpacks = j;
break look;
}
}
}
}
if(dpacks == null)
{
Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?");
return;
}
if(packs.exists())
{
for(File i : packs.listFiles())
{
if(i.isDirectory())
{
Iris.verbose("Checking Pack: " + i.getPath());
IrisDataManager data = new IrisDataManager(i);
File dims = new File(i, "dimensions");
if(dims.exists())
{
for(File j : dims.listFiles())
{
if(j.getName().endsWith(".json"))
{
IrisDimension dim = data.getDimensionLoader().load(j.getName().split("\\Q.\\E")[0]);
Iris.verbose(" Checking Dimension " + dim.getLoadFile().getPath());
if(dim.installDataPack(() -> data, dpacks))
{
reboot = true;
}
}
}
}
}
}
}
Iris.info("Data Packs Setup!");
}
public static int getThreadCount() {
@ -377,6 +439,7 @@ public class Iris extends VolmitPlugin implements Listener {
Iris.info("Server type & version: " + Bukkit.getVersion());
Iris.info("Bukkit version: " + Bukkit.getBukkitVersion());
Iris.info("Java version: " + getJavaVersion());
Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes());
for (int i = 0; i < info.length; i++) {
splash[i] += info[i];
}

View File

@ -1,8 +1,11 @@
package com.volmit.iris.generator.actuator;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.scaffold.engine.EngineAssignedActuator;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.scaffold.hunk.view.BiomeGridHunkView;
import com.volmit.iris.scaffold.parallel.BurstExecutor;
import com.volmit.iris.scaffold.parallel.MultiBurst;
import com.volmit.iris.util.PrecisionStopwatch;
@ -26,9 +29,36 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
int zzf = zf;
burst.queue(() -> {
Biome v = getComplex().getTrueBiomeStream().get(modX(xxf + x), modZ(zzf + z)).getSkyBiome(RNG.r, x, 0, z);
for (int i = 0; i < h.getHeight(); i++) {
h.set(xxf, i, zzf, v);
IrisBiome ib = getComplex().getTrueBiomeStream().get(modX(xxf + x), modZ(zzf + z));
if(ib.isCustom())
{
try
{
Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey()+":"+ib.getCustom().getId());
((BiomeGridHunkView)h).forceBiomeBaseInto(x, 0, z, biomeBase);
for (int i = 0; i < h.getHeight(); i++) {
((BiomeGridHunkView)h).forceBiomeBaseInto(xxf, i, zzf, biomeBase);
}
}
catch(Throwable e)
{
e.printStackTrace();
Biome v = ib.getSkyBiome(RNG.r, x, 0, z);
for (int i = 0; i < h.getHeight(); i++) {
h.set(xxf, i, zzf, v);
}
}
}
else
{
Biome v = ib.getSkyBiome(RNG.r, x, 0, z);
for (int i = 0; i < h.getHeight(); i++) {
h.set(xxf, i, zzf, v);
}
}
});
}

View File

@ -4,6 +4,7 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator;
public interface INMSBinding {
Object getBiomeBaseFromId(int id);
@ -29,4 +30,8 @@ public interface INMSBinding {
default World createWorld(WorldCreator c) {
return c.createWorld();
}
int countCustomBiomes();
void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk);
}

View File

@ -1,5 +1,6 @@
package com.volmit.iris.nms.v17_1;
import com.volmit.iris.Iris;
import com.volmit.iris.nms.INMSBinding;
import com.volmit.iris.util.KMap;
import net.minecraft.core.IRegistry;
@ -7,18 +8,54 @@ import net.minecraft.core.IRegistryWritable;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.BiomeBase;
import net.minecraft.world.level.chunk.BiomeStorage;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
import org.bukkit.generator.ChunkGenerator;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.concurrent.atomic.AtomicInteger;
public class NMSBinding17_1 implements INMSBinding {
private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
private Field biomeStorageCache = null;
private Object getBiomeStorage(ChunkGenerator.BiomeGrid g)
{
try {
return getFieldForBiomeStorage(g).get(g);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
private Field getFieldForBiomeStorage(Object storage) {
Field f = biomeStorageCache;
if (f != null)
{
return f;
}
try {
f = storage.getClass().getDeclaredField("biome");
f.setAccessible(true);
return f;
} catch (Throwable e) {
e.printStackTrace();
Iris.error(storage.getClass().getCanonicalName());
}
biomeStorageCache = f;
return null;
}
private IRegistryWritable<BiomeBase> getCustomBiomeRegistry() {
return ((CraftServer) Bukkit.getServer()).getHandle().getServer().getCustomRegistry().b(IRegistry.aO);
@ -148,6 +185,34 @@ public class NMSBinding17_1 implements INMSBinding {
return biome.ordinal();
}
@Override
public int countCustomBiomes() {
AtomicInteger a = new AtomicInteger(0);
getCustomBiomeRegistry().d().stream().forEach((i) -> {
MinecraftKey k = i.getKey().a();
if(k.getNamespace().equals("minecraft"))
{
return;
}
a.incrementAndGet();
Iris.verbose("Custom Biome: " + k.toString());
});
return a.get();
}
@Override
public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) {
try {
BiomeStorage s = (BiomeStorage) getFieldForBiomeStorage(chunk).get(chunk);
s.setBiome(x,y,z, (BiomeBase) somethingVeryDirty);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public boolean isBukkit() {
return false;

View File

@ -4,6 +4,7 @@ import com.volmit.iris.nms.INMSBinding;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator;
public class NMSBinding1X implements INMSBinding {
@Override
@ -54,4 +55,14 @@ public class NMSBinding1X implements INMSBinding {
public int getBiomeId(Biome biome) {
return biome.ordinal();
}
@Override
public int countCustomBiomes() {
return 0;
}
@Override
public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) {
}
}

View File

@ -31,11 +31,9 @@ public class IrisBiome extends IrisRegistrant implements IRare {
@Desc("This is the human readable name for this biome. This can and should be different than the file name. This is not used for loading biomes in other objects.")
private String name = "A Biome";
/* Needs to be implemented but it's not
@DontObfuscate
@Desc("The palette of blocks for 'water' in this biome (overwrites dimension)")
private IrisMaterialPalette fluidPalette = new IrisMaterialPalette().qclear().qadd("void_air");
*/
@DontObfuscate
@Desc("If the biome type custom is defined, specify this")
private IrisBiomeCustom custom;
@DontObfuscate
@Desc("Entity spawns to override or add to this biome. Anytime an entity spawns, it has a chance to be replaced as one of these overrides.")
@ -201,6 +199,11 @@ public class IrisBiome extends IrisRegistrant implements IRare {
return vanillaDerivative == null ? derivative : vanillaDerivative;
}
public boolean isCustom()
{
return getCustom() != null;
}
public double getGenLinkMax(String loadKey) {
Integer v = genCacheMax.aquire(() ->
{

View File

@ -0,0 +1,113 @@
package com.volmit.iris.object;
import com.volmit.iris.Iris;
import com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.awt.*;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Desc("A custom biome, generated through a datapack")
@Data
public class IrisBiomeCustom {
@DontObfuscate
@Required
@Desc("The resource key of this biome. Just a simple id such as 'plains' or something.")
private String id = "";
@MinNumber(-3)
@MaxNumber(3)
@DontObfuscate
@Desc("The biome's temperature")
private double temperature = 0.8;
@MinNumber(-3)
@MaxNumber(3)
@DontObfuscate
@Desc("The biome's downfall amount (snow / rain), see preci")
private double humidity = 0.4;
@DontObfuscate
@Desc("The biome's downfall type")
private IrisBiomeCustomPrecipType downfallType = IrisBiomeCustomPrecipType.rain;
@DontObfuscate
@Desc("The biome's category type")
private IrisBiomeCustomCategory category = IrisBiomeCustomCategory.plains;
@DontObfuscate
@Desc("The color of the sky, top half of sky. (hex format)")
private String skyColor = "#79a8e1";
@DontObfuscate
@Desc("The color of the fog, bottom half of sky. (hex format)")
private String fogColor = "#c0d8e1";
@DontObfuscate
@Desc("The color of the water (hex format). Leave blank / don't define to not change")
private String waterColor = "#3f76e4";
@DontObfuscate
@Desc("The color of water fog (hex format). Leave blank / don't define to not change")
private String waterFogColor = "#050533";
@DontObfuscate
@Desc("The color of the grass (hex format). Leave blank / don't define to not change")
private String grassColor = "";
@DontObfuscate
@Desc("The color of foliage (hex format). Leave blank / don't define to not change")
private String foliageColor = "";
public String generateJson()
{
JSONObject effects = new JSONObject();
effects.put("sky_color", parseColor(getSkyColor()));
effects.put("fog_color", parseColor(getFogColor()));
effects.put("water_color", parseColor(getWaterColor()));
effects.put("water_fog_color", parseColor(getWaterFogColor()));
if(getGrassColor() != null)
{
effects.put("grass_color", parseColor(getGrassColor()));
}
if(getFoliageColor() != null)
{
effects.put("foliage_color", parseColor(getFoliageColor()));
}
JSONObject j = new JSONObject();
j.put("surface_builder", "minecraft:grass");
j.put("depth", 0.125);
j.put("scale", 0.05);
j.put("temperature", getTemperature());
j.put("downfall", getHumidity());
j.put("precipitation", getDownfallType().toString().toLowerCase());
j.put("category", getCategory().toString().toLowerCase());
j.put("effects", effects);
j.put("starts", new JSONArray());
j.put("spawners", new JSONObject());
j.put("spawn_costs", new JSONObject());
j.put("carvers", new JSONObject());
j.put("features", new JSONArray());
return j.toString(4);
}
private int parseColor(String c) {
String v = (c.startsWith("#") ? c : "#" + c).trim();
try {
return Color.decode(v).getRGB();
} catch (Throwable e) {
Iris.error("Error Parsing '''color''', (" + c+ ")");
}
return 0;
}
}

View File

@ -0,0 +1,22 @@
package com.volmit.iris.object;
public enum IrisBiomeCustomCategory
{
beach,
desert,
extreme_hills,
forest,
icy,
jungle,
mesa,
mushroom,
nether,
none,
ocean,
plains,
river,
savanna,
swamp,
taiga,
the_end
}

View File

@ -0,0 +1,19 @@
package com.volmit.iris.object;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
public enum IrisBiomeCustomPrecipType
{
@Desc("No downfall")
@DontObfuscate
none,
@Desc("Rain downfall")
@DontObfuscate
rain,
@Desc("Snow downfall")
@DontObfuscate
snow
}

View File

@ -1,5 +1,6 @@
package com.volmit.iris.object;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.noise.CNG;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.scaffold.cache.AtomicCache;
@ -10,10 +11,14 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.block.data.BlockData;
import java.io.File;
import java.io.IOException;
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@ -452,4 +457,50 @@ public class IrisDimension extends IrisRegistrant {
return landBiomeStyle;
}
public boolean installDataPack(DataProvider data, File datapacks)
{
boolean write = false;
boolean changed = false;
for(IrisBiome i : getAllBiomes(data))
{
if(i.isCustom())
{
write = true;
File output = new File(datapacks, "iris/data/" + getLoadKey() + "/worldgen/biome/" + i.getCustom().getId() + ".json");
if(!output.exists())
{
changed = true;
}
Iris.verbose(" Installing Data Pack Biome: " + output.getPath());
output.getParentFile().mkdirs();
try {
IO.writeAll(output, i.getCustom().generateJson());
} catch (IOException e) {
e.printStackTrace();
}
}
}
if(write)
{
File mcm = new File(datapacks, "iris/pack.mcmeta");
try {
IO.writeAll(mcm, "{\n" +
" \"pack\": {\n" +
" \"description\": \"Iris Data Pack. This pack contains all installed Iris Packs' resources.\",\n" +
" \"pack_format\": 7\n" +
" }\n" +
"}\n");
} catch (IOException e) {
e.printStackTrace();
}
Iris.verbose(" Installing Data Pack MCMeta: " + mcm.getPath());
}
return changed;
}
}

View File

@ -1,7 +1,12 @@
package com.volmit.iris.scaffold.hunk.view;
import com.volmit.iris.nms.INMS;
import com.volmit.iris.scaffold.hunk.Hunk;
import com.volmit.iris.util.LinkedTerrainChunk;
import com.volmit.iris.util.TerrainChunk;
import net.minecraft.world.level.chunk.BiomeStorage;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
public class BiomeGridHunkView implements Hunk<Biome> {
@ -36,4 +41,13 @@ public class BiomeGridHunkView implements Hunk<Biome> {
public Biome getRaw(int x, int y, int z) {
return chunk.getBiome(x, y, z);
}
public void forceBiomeBaseInto(int x, int y, int z, Object somethingVeryDirty) {
if(chunk instanceof LinkedTerrainChunk)
{
INMS.get().forceBiomeInto(x,y,z,somethingVeryDirty,((LinkedTerrainChunk) chunk).getRawBiome());
return;
}
INMS.get().forceBiomeInto(x,y,z,somethingVeryDirty,chunk);
}
}

View File

@ -85,6 +85,11 @@ public class LinkedTerrainChunk implements TerrainChunk {
biome3D.setBiome(x, 0, z, bio);
}
public BiomeGrid getRawBiome()
{
return storage;
}
@Override
public void setBiome(int x, int y, int z, Biome bio) {
if (storage != null) {

View File

@ -0,0 +1,13 @@
package com.volmit.iris.util;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME)
@Target({PARAMETER, TYPE, FIELD})
public @interface RegistryListBiomeDownfallType {
}