diff --git a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index d501ab80a..39c575c32 100644 --- a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -18,10 +18,12 @@ package com.volmit.iris.core.nms; +import com.volmit.iris.util.nbt.tag.CompoundTag; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.block.Biome; +import org.bukkit.entity.Entity; import org.bukkit.generator.ChunkGenerator; public interface INMSBinding { diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 8ce46e91a..bf41850d0 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -31,6 +31,7 @@ import com.volmit.iris.engine.object.engine.IrisEngineData; import com.volmit.iris.engine.object.objects.IrisObjectPlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.C; @@ -59,6 +60,9 @@ public class IrisEngine extends BlockPopulator implements Engine { @Getter private final EngineTarget target; + @Getter + private final IrisContext context; + @Getter private final EngineFramework framework; @@ -115,6 +119,8 @@ public class IrisEngine extends BlockPopulator implements Engine { art = J.ar(effects::tickRandomPlayer, 0); J.a(this::computeBiomeMaxes); Iris.callEvent(new IrisEngineHotloadEvent(this)); + context = new IrisContext(this); + context.touch(); } @Override @@ -202,6 +208,7 @@ public class IrisEngine extends BlockPopulator implements Engine { @ChunkCoordinates @Override public void generate(int x, int z, Hunk vblocks, Hunk vbiomes, boolean multicore) { + context.touch(); getEngineData().getStatistics().generatedChunk(); try { PrecisionStopwatch p = PrecisionStopwatch.start(); diff --git a/src/main/java/com/volmit/iris/engine/framework/Engine.java b/src/main/java/com/volmit/iris/engine/framework/Engine.java index 31e830a78..6a5d7b2d2 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -35,6 +35,7 @@ import com.volmit.iris.engine.object.meta.InventorySlotType; import com.volmit.iris.engine.object.regional.IrisRegion; import com.volmit.iris.engine.parallax.ParallaxAccess; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.documentation.BlockCoordinates; @@ -62,6 +63,8 @@ import java.util.UUID; public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootProvider, BlockUpdater, Renderer, Hotloadable { void close(); + IrisContext getContext(); + double getMaxBiomeObjectDensity(); double getMaxBiomeDecoratorDensity(); diff --git a/src/main/java/com/volmit/iris/util/context/IrisContext.java b/src/main/java/com/volmit/iris/util/context/IrisContext.java new file mode 100644 index 000000000..ffedb1281 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/context/IrisContext.java @@ -0,0 +1,75 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.context; + +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.IrisComplex; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.scheduling.ChronoLatch; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class IrisContext { + private static ChronoLatch cl = new ChronoLatch(60000); + private static KMap context = new KMap<>(); + + public static IrisContext get() + { + return context.get(Thread.currentThread()); + } + + public static void touch(IrisContext c) + { + synchronized (context) + { + context.put(Thread.currentThread(), c); + + if(cl.flip()) + { + for(Thread i : context.k()) + { + if(!i.isAlive()) + { + context.remove(i); + } + } + } + } + } + + private final Engine engine; + + public void touch() + { + IrisContext.touch(this); + } + + public IrisData getData() + { + return engine.getData(); + } + + public IrisComplex getComplex() + { + return engine.getFramework().getComplex(); + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java index e1f89b934..253e79cdb 100644 --- a/src/main/java/com/volmit/iris/util/matter/MatterSlice.java +++ b/src/main/java/com/volmit/iris/util/matter/MatterSlice.java @@ -24,6 +24,7 @@ import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.storage.MappedHunk; import org.bukkit.World; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; import org.objectweb.asm.ClassWriter; import java.io.DataInputStream; @@ -51,6 +52,9 @@ public interface MatterSlice extends Hunk { }else if(w instanceof BlockData) { c = BlockData.class; + }else if(w instanceof Entity) + { + c = Entity.class; } return c; diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BiomeMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/BiomeMatter.java new file mode 100644 index 000000000..7f6062084 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/slices/BiomeMatter.java @@ -0,0 +1,39 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.core.project.loader.IrisRegistrant; +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.util.context.IrisContext; +import com.volmit.iris.util.matter.Sliced; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +@Sliced +public class BiomeMatter extends RegistryMatter { + public BiomeMatter() { + this(1, 1, 1); + } + + public BiomeMatter(int width, int height, int depth) { + super(width, height, depth, IrisBiome.class); + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/slices/RegionMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/RegionMatter.java new file mode 100644 index 000000000..48dc17041 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/slices/RegionMatter.java @@ -0,0 +1,33 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.core.project.loader.IrisRegistrant; +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.util.matter.Sliced; + +@Sliced +public class RegionMatter extends RegistryMatter { + public RegionMatter() { + this(1, 1, 1); + } + public RegionMatter(int width, int height, int depth) { + super(width, height, depth, IrisRegistrant.class); + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java new file mode 100644 index 000000000..efd703fe3 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/slices/RegistryMatter.java @@ -0,0 +1,45 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.core.project.loader.IrisRegistrant; +import com.volmit.iris.util.context.IrisContext; +import com.volmit.iris.util.nbt.io.NBTUtil; +import com.volmit.iris.util.nbt.tag.Tag; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class RegistryMatter extends RawMatter { + public RegistryMatter(int width, int height, int depth, Class c) { + super(width, height, depth, c); + } + + @Override + public void writeNode(T b, DataOutputStream dos) throws IOException { + dos.writeUTF(b.getLoadKey()); + } + + @Override + public T readNode(DataInputStream din) throws IOException { + IrisContext context = IrisContext.get(); + return (T) context.getData().getLoaders().get(getType()).load(din.readUTF()); + } +} diff --git a/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java new file mode 100644 index 000000000..b1bcf22a3 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/slices/SpawnerMatter.java @@ -0,0 +1,33 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.engine.object.spawners.IrisSpawner; +import com.volmit.iris.util.matter.Sliced; + +@Sliced +public class SpawnerMatter extends RegistryMatter { + public SpawnerMatter() { + this(1, 1, 1); + } + public SpawnerMatter(int width, int height, int depth) { + super(width, height, depth, IrisSpawner.class); + } +}